/* $Id: node.h,v 1.1 2019/03/26 18:32:07 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include /* * The interface of the DocBook syntax tree. */ /* * All node types used for formatting purposes. * More DocBook XML elements are recognized, but remapped or discarded. */ enum nodeid { NODE_NONE = 0, /* Must come first. */ /* Alpha-ordered hereafter. */ NODE_ACRONYM, NODE_AFFILIATION, NODE_ANCHOR, NODE_APPLICATION, NODE_ARG, NODE_AUTHOR, NODE_AUTHORGROUP, NODE_BLOCKQUOTE, NODE_BOOK, NODE_BOOKINFO, NODE_CAUTION, NODE_CITEREFENTRY, NODE_CITETITLE, NODE_CMDSYNOPSIS, NODE_CODE, NODE_COLSPEC, NODE_COMMAND, NODE_CONSTANT, NODE_COPYRIGHT, NODE_DATE, NODE_EDITOR, NODE_EMAIL, NODE_EMPHASIS, NODE_ENTRY, NODE_ENVAR, NODE_FIELDSYNOPSIS, NODE_FILENAME, NODE_FIRSTNAME, NODE_FIRSTTERM, NODE_FOOTNOTE, NODE_FUNCDEF, NODE_FUNCPROTOTYPE, NODE_FUNCSYNOPSIS, NODE_FUNCSYNOPSISINFO, NODE_FUNCTION, NODE_GLOSSTERM, NODE_GROUP, NODE_HOLDER, NODE_INDEX, NODE_INDEXTERM, NODE_INFO, NODE_INFORMALEQUATION, NODE_INFORMALTABLE, NODE_INLINEEQUATION, NODE_ITEMIZEDLIST, NODE_KEYSYM, NODE_LEGALNOTICE, NODE_LINK, NODE_LISTITEM, NODE_LITERAL, NODE_LITERALLAYOUT, NODE_MANVOLNUM, NODE_MEMBER, NODE_MML_MATH, NODE_MML_MFENCED, NODE_MML_MFRAC, NODE_MML_MI, NODE_MML_MN, NODE_MML_MO, NODE_MML_MROW, NODE_MML_MSUB, NODE_MML_MSUP, NODE_MODIFIER, NODE_NOTE, NODE_OPTION, NODE_ORDEREDLIST, NODE_ORGNAME, NODE_OTHERNAME, NODE_PARA, NODE_PARAMDEF, NODE_PARAMETER, NODE_PERSONNAME, NODE_PHRASE, NODE_PREFACE, NODE_PRIMARY, NODE_PROGRAMLISTING, NODE_PROMPT, NODE_QUOTE, NODE_REFCLASS, NODE_REFDESCRIPTOR, NODE_REFENTRY, NODE_REFENTRYINFO, NODE_REFENTRYTITLE, NODE_REFMETA, NODE_REFMETAINFO, NODE_REFMISCINFO, NODE_REFNAME, NODE_REFNAMEDIV, NODE_REFPURPOSE, NODE_REFSYNOPSISDIV, NODE_RELEASEINFO, NODE_REPLACEABLE, NODE_ROW, NODE_SBR, NODE_SCREEN, NODE_SECONDARY, NODE_SECTION, NODE_SGMLTAG, NODE_SIMPLELIST, NODE_SPANSPEC, NODE_STRUCTNAME, NODE_SUBTITLE, NODE_SURNAME, NODE_SYNOPSIS, NODE_TABLE, NODE_TBODY, NODE_TERM, NODE_TEXT, NODE_TFOOT, NODE_TGROUP, NODE_THEAD, NODE_TIP, NODE_TITLE, NODE_TRADEMARK, NODE_TYPE, NODE_ULINK, NODE_USERINPUT, NODE_VARIABLELIST, NODE_VARLISTENTRY, NODE_VARNAME, NODE_WARNING, NODE_WORDASWORD, NODE_YEAR, NODE__MAX }; /* * All recognised attribute keys. * Other attributes are discarded. */ enum attrkey { /* Alpha-order... */ ATTRKEY_CHOICE = 0, ATTRKEY_CLASS, ATTRKEY_CLOSE, ATTRKEY_ID, ATTRKEY_LINKEND, ATTRKEY_OPEN, ATTRKEY_REP, ATTRKEY__MAX }; /* * All explicitly recognised attribute values. * If an attribute has ATTRVAL__MAX, it is treated as free-form. */ enum attrval { /* Alpha-order... */ ATTRVAL_MONOSPACED, ATTRVAL_NOREPEAT, ATTRVAL_OPT, ATTRVAL_PLAIN, ATTRVAL_REPEAT, ATTRVAL_REQ, ATTRVAL__MAX }; TAILQ_HEAD(pnodeq, pnode); TAILQ_HEAD(pattrq, pattr); /* * One DocBook XML element attribute. */ struct pattr { enum attrkey key; enum attrval val; char *rawval; TAILQ_ENTRY(pattr) child; }; /* * One DocBook XML element. */ struct pnode { enum nodeid node; /* Node type. */ char *b; /* String value. */ char *real; /* Storage for "b". */ size_t bsz; /* strlen(b) */ struct pnode *parent; /* Parent node or NULL. */ struct pnodeq childq; /* Queue of children. */ struct pattrq attrq; /* Attributes of the node. */ TAILQ_ENTRY(pnode) child; }; /* * The parse result for one complete DocBook XML document. */ struct ptree { struct pnode *root; /* The document element. */ int flags; #define TREE_FAIL (1 << 0) /* A fatal parse error occurred. */ #define TREE_EQN (1 << 1) /* The document needs inline eqn(7). */ }; enum attrkey attrkey_parse(const char *); enum attrval attrval_parse(const char *); void pnode_unlink(struct pnode *); void pnode_unlinksub(struct pnode *); enum attrval pnode_getattr(struct pnode *, enum attrkey); const char *pnode_getattr_raw(struct pnode *, enum attrkey, const char *); struct pnode *pnode_findfirst(struct pnode *, enum nodeid);