[BACK]Return to node.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / docbook2mdoc

Diff for /docbook2mdoc/node.c between version 1.6 and 1.10

version 1.6, 2019/04/09 01:39:09 version 1.10, 2019/04/12 16:40:53
Line 15 
Line 15 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
   #include <assert.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
   
Line 24 
Line 25 
  * The implementation of the DocBook syntax tree.   * The implementation of the DocBook syntax tree.
  */   */
   
   struct  nodeprop {
           const char      *name;
           enum nodeclass   class;
   };
   
   static  const struct nodeprop properties[] = {
           { "affiliation",        CLASS_TRANS },
           { "appendix",           CLASS_BLOCK },
           { "application",        CLASS_LINE },
           { "arg",                CLASS_ENCL },
           { "author",             CLASS_LINE },
           { "authorgroup",        CLASS_BLOCK },
           { "blockquote",         CLASS_BLOCK },
           { "bookinfo",           CLASS_BLOCK },
           { "caution",            CLASS_BLOCK },
           { "citerefentry",       CLASS_LINE },
           { "citetitle",          CLASS_LINE },
           { "cmdsynopsis",        CLASS_TRANS },
           { "colspec",            CLASS_VOID },
           { "command",            CLASS_LINE },
           { "constant",           CLASS_LINE },
           { "contrib",            CLASS_TRANS },
           { "copyright",          CLASS_TRANS },
           { "date",               CLASS_TRANS },
           { "!DOCTYPE",           CLASS_VOID },
           { "editor",             CLASS_LINE },
           { "email",              CLASS_ENCL },
           { "emphasis",           CLASS_LINE },
           { "!ENTITY",            CLASS_VOID },
           { "entry",              CLASS_ENCL },
           { "envar",              CLASS_LINE },
           { "errorname",          CLASS_LINE },
           { "fieldsynopsis",      CLASS_TRANS },
           { "filename",           CLASS_LINE },
           { "firstterm",          CLASS_LINE },
           { "footnote",           CLASS_TRANS },
           { "funcdef",            CLASS_BLOCK },
           { "funcprototype",      CLASS_BLOCK },
           { "funcsynopsis",       CLASS_TRANS },
           { "funcsynopsisinfo",   CLASS_LINE },
           { "function",           CLASS_LINE },
           { "glossterm",          CLASS_LINE },
           { "group",              CLASS_ENCL },
           { "holder",             CLASS_TRANS },
           { "xi:include",         CLASS_VOID },
           { "index",              CLASS_TRANS },
           { "info",               CLASS_TRANS },
           { "informalequation",   CLASS_BLOCK },
           { "inlineequation",     CLASS_BLOCK },
           { "itemizedlist",       CLASS_BLOCK },
           { "keysym",             CLASS_LINE },
           { "legalnotice",        CLASS_BLOCK },
           { "link",               CLASS_ENCL },
           { "listitem",           CLASS_TRANS },
           { "literal",            CLASS_ENCL },
           { "literallayout",      CLASS_BLOCK },
           { "manvolnum",          CLASS_TRANS },
           { "markup",             CLASS_LINE },
           { "member",             CLASS_LINE },
           { "mml:math",           CLASS_LINE },
           { "mml:mfenced",        CLASS_LINE },
           { "mml:mfrac",          CLASS_LINE },
           { "mml:mi",             CLASS_LINE },
           { "mml:mn",             CLASS_LINE },
           { "mml:mo",             CLASS_LINE },
           { "mml:mrow",           CLASS_LINE },
           { "mml:msub",           CLASS_LINE },
           { "mml:msup",           CLASS_LINE },
           { "modifier",           CLASS_LINE },
           { "note",               CLASS_BLOCK },
           { "option",             CLASS_LINE },
           { "orderedlist",        CLASS_BLOCK },
           { "orgname",            CLASS_TRANS },
           { "para",               CLASS_BLOCK },
           { "paramdef",           CLASS_LINE },
           { "parameter",          CLASS_LINE },
           { "personname",         CLASS_TRANS },
           { "preface",            CLASS_BLOCK },
           { "programlisting",     CLASS_BLOCK },
           { "prompt",             CLASS_TRANS },
           { "quote",              CLASS_ENCL },
           { "refclass",           CLASS_TRANS },
           { "refdescriptor",      CLASS_TRANS },
           { "refentry",           CLASS_TRANS },
           { "refentryinfo",       CLASS_VOID },
           { "refentrytitle",      CLASS_TRANS },
           { "refmeta",            CLASS_TRANS },
           { "refmetainfo",        CLASS_TRANS },
           { "refmiscinfo",        CLASS_TRANS },
           { "refname",            CLASS_LINE },
           { "refnamediv",         CLASS_BLOCK },
           { "refpurpose",         CLASS_LINE },
           { "refsynopsisdiv",     CLASS_BLOCK },
           { "releaseinfo",        CLASS_TRANS },
           { "replaceable",        CLASS_LINE },
           { "row",                CLASS_BLOCK },
           { "sbr",                CLASS_BLOCK },
           { "screen",             CLASS_BLOCK },
           { "section",            CLASS_BLOCK },
           { "simplelist",         CLASS_TRANS },
           { "spanspec",           CLASS_TRANS },
           { "subtitle",           CLASS_TRANS },
           { "synopsis",           CLASS_BLOCK },
           { "table",              CLASS_TRANS },
           { "tbody",              CLASS_TRANS },
           { "term",               CLASS_LINE },
           { "tfoot",              CLASS_TRANS },
           { "tgroup",             CLASS_BLOCK },
           { "thead",              CLASS_TRANS },
           { "tip",                CLASS_BLOCK },
           { "title",              CLASS_BLOCK },
           { "type",               CLASS_LINE },
           { "variablelist",       CLASS_BLOCK },
           { "varlistentry",       CLASS_BLOCK },
           { "varname",            CLASS_LINE },
           { "warning",            CLASS_BLOCK },
           { "wordasword",         CLASS_TRANS },
           { "year",               CLASS_TRANS },
           { "[UNKNOWN]",          CLASS_VOID },
           { "[TEXT]",             CLASS_TEXT },
           { "[ESCAPE]",           CLASS_TEXT }
   };
   
 static  const char *const attrkeys[ATTRKEY__MAX] = {  static  const char *const attrkeys[ATTRKEY__MAX] = {
         "choice",          "choice",
         "class",          "class",
Line 74  attrval_parse(const char *name)
Line 198  attrval_parse(const char *name)
         return val;          return val;
 }  }
   
   enum nodeid
   pnode_parse(const char *name)
   {
           enum nodeid      node;
   
           for (node = 0; node < NODE_UNKNOWN; node++)
                   if (strcmp(name, properties[node].name) == 0)
                           break;
           return node;
   }
   
   const char *
   pnode_name(enum nodeid node)
   {
           assert(node < NODE_IGNORE);
           return properties[node].name;
   }
   
   enum nodeclass
   pnode_class(enum nodeid node)
   {
           assert(node < NODE_IGNORE);
           return properties[node].class;
   }
   
   struct pnode *
   pnode_alloc(struct pnode *np)
   {
           struct pnode    *n;
   
           if ((n = calloc(1, sizeof(*n))) != NULL) {
                   TAILQ_INIT(&n->childq);
                   TAILQ_INIT(&n->attrq);
                   if ((n->parent = np) != NULL)
                           TAILQ_INSERT_TAIL(&np->childq, n, child);
           }
           return n;
   }
   
 /*  /*
  * Recursively free a node (NULL is ok).   * Recursively free a node (NULL is ok).
  */   */
 static void  static void
 pnode_free(struct pnode *pn)  pnode_free(struct pnode *n)
 {  {
         struct pnode    *pch;          struct pnode    *nc;
         struct pattr    *ap;          struct pattr    *a;
   
         if (pn == NULL)          if (n == NULL)
                 return;                  return;
   
         while ((pch = TAILQ_FIRST(&pn->childq)) != NULL) {          while ((nc = TAILQ_FIRST(&n->childq)) != NULL) {
                 TAILQ_REMOVE(&pn->childq, pch, child);                  TAILQ_REMOVE(&n->childq, nc, child);
                 pnode_free(pch);                  pnode_free(nc);
         }          }
         while ((ap = TAILQ_FIRST(&pn->attrq)) != NULL) {          while ((a = TAILQ_FIRST(&n->attrq)) != NULL) {
                 TAILQ_REMOVE(&pn->attrq, ap, child);                  TAILQ_REMOVE(&n->attrq, a, child);
                 free(ap->rawval);                  free(a->rawval);
                 free(ap);                  free(a);
         }          }
         free(pn->real);          free(n->b);
         free(pn);          free(n);
 }  }
   
 /*  /*
  * Unlink a node from its parent and pnode_free() it.   * Unlink a node from its parent and pnode_free() it.
  */   */
 void  void
 pnode_unlink(struct pnode *pn)  pnode_unlink(struct pnode *n)
 {  {
         if (pn == NULL)          if (n == NULL)
                 return;                  return;
         if (pn->parent != NULL)          if (n->parent != NULL)
                 TAILQ_REMOVE(&pn->parent->childq, pn, child);                  TAILQ_REMOVE(&n->parent->childq, n, child);
         pnode_free(pn);          pnode_free(n);
 }  }
   
 /*  /*
  * Unlink all children of a node and pnode_free() them.   * Unlink all children of a node and pnode_free() them.
  */   */
 void  void
 pnode_unlinksub(struct pnode *pn)  pnode_unlinksub(struct pnode *n)
 {  {
         while (TAILQ_EMPTY(&pn->childq) == 0)          while (TAILQ_EMPTY(&n->childq) == 0)
                 pnode_unlink(TAILQ_FIRST(&pn->childq));                  pnode_unlink(TAILQ_FIRST(&n->childq));
 }  }
   
 /*  /*
Line 127  pnode_unlinksub(struct pnode *pn)
Line 290  pnode_unlinksub(struct pnode *pn)
  * Return ATTRVAL__MAX if the node has no such attribute.   * Return ATTRVAL__MAX if the node has no such attribute.
  */   */
 enum attrval  enum attrval
 pnode_getattr(struct pnode *pn, enum attrkey key)  pnode_getattr(struct pnode *n, enum attrkey key)
 {  {
         struct pattr    *ap;          struct pattr    *a;
   
         if (pn == NULL)          if (n == NULL)
                 return ATTRVAL__MAX;                  return ATTRVAL__MAX;
         TAILQ_FOREACH(ap, &pn->attrq, child)          TAILQ_FOREACH(a, &n->attrq, child)
                 if (ap->key == key)                  if (a->key == key)
                         return ap->val;                          return a->val;
         return ATTRVAL__MAX;          return ATTRVAL__MAX;
 }  }
   
Line 144  pnode_getattr(struct pnode *pn, enum attrkey key)
Line 307  pnode_getattr(struct pnode *pn, enum attrkey key)
  * Return defval if the node has no such attribute.   * Return defval if the node has no such attribute.
  */   */
 const char *  const char *
 pnode_getattr_raw(struct pnode *pn, enum attrkey key, const char *defval)  pnode_getattr_raw(struct pnode *n, enum attrkey key, const char *defval)
 {  {
         struct pattr    *ap;          struct pattr    *a;
   
         if (pn == NULL)          if (n == NULL)
                 return defval;                  return defval;
         TAILQ_FOREACH(ap, &pn->attrq, child)          TAILQ_FOREACH(a, &n->attrq, child)
                 if (ap->key == key)                  if (a->key == key)
                         return ap->val != ATTRVAL__MAX ? attrvals[ap->val] :                          return a->val != ATTRVAL__MAX ? attrvals[a->val] :
                             ap->rawval != NULL ? ap->rawval : defval;                              a->rawval != NULL ? a->rawval : defval;
         return defval;          return defval;
 }  }
   
Line 161  pnode_getattr_raw(struct pnode *pn, enum attrkey key, 
Line 324  pnode_getattr_raw(struct pnode *pn, enum attrkey key, 
  * Recursively search and return the first instance of "node".   * Recursively search and return the first instance of "node".
  */   */
 struct pnode *  struct pnode *
 pnode_findfirst(struct pnode *pn, enum nodeid node)  pnode_findfirst(struct pnode *n, enum nodeid node)
 {  {
         struct pnode    *pch, *res;          struct pnode    *nc, *res;
   
         if (pn->node == node)          if (n->node == node)
                 return pn;                  return n;
         TAILQ_FOREACH(pch, &pn->childq, child)          TAILQ_FOREACH(nc, &n->childq, child)
                 if ((res = pnode_findfirst(pch, node)) != NULL)                  if ((res = pnode_findfirst(nc, node)) != NULL)
                         return res;                          return res;
         return NULL;          return NULL;
 }  }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.10

CVSweb