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

Diff for /docbook2mdoc/docbook2mdoc.c between version 1.7 and 1.8

version 1.7, 2014/03/28 10:37:50 version 1.8, 2014/03/28 12:11:18
Line 59  enum nodeid {
Line 59  enum nodeid {
         NODE_REFPURPOSE,          NODE_REFPURPOSE,
         NODE_REFSECT1,          NODE_REFSECT1,
         NODE_REFSYNOPSISDIV,          NODE_REFSYNOPSISDIV,
           NODE_STRUCTNAME,
         NODE_SYNOPSIS,          NODE_SYNOPSIS,
         NODE_TEXT,          NODE_TEXT,
         NODE_TITLE,          NODE_TITLE,
Line 74  struct parse {
Line 75  struct parse {
         int              stop; /* should we stop now? */          int              stop; /* should we stop now? */
         struct pnode    *root; /* root of parse tree */          struct pnode    *root; /* root of parse tree */
         struct pnode    *cur; /* current node in tree */          struct pnode    *cur; /* current node in tree */
         char            *b;          char            *b; /* nil-terminated buffer for pre-print */
         size_t           bsz;          size_t           bsz; /* current length of b */
         size_t           mbsz;          size_t           mbsz; /* max bsz allocation */
 };  };
   
 struct  node {  struct  node {
         const char      *name;          const char      *name; /* docbook element name */
         unsigned int     flags;          unsigned int     flags;
 #define NODE_IGNTEXT     1 /* ignore all contained text */  #define NODE_IGNTEXT     1 /* ignore all contained text */
 };  };
Line 125  static const struct node nodes[NODE__MAX] = {
Line 126  static const struct node nodes[NODE__MAX] = {
         { "refpurpose", 0 },          { "refpurpose", 0 },
         { "refsect1", 0 },          { "refsect1", 0 },
         { "refsynopsisdiv", NODE_IGNTEXT },          { "refsynopsisdiv", NODE_IGNTEXT },
           { "structname", 0 },
         { "synopsis", 0 },          { "synopsis", 0 },
         { NULL, 0 },          { NULL, 0 },
         { "title", 0 },          { "title", 0 },
Line 132  static const struct node nodes[NODE__MAX] = {
Line 134  static const struct node nodes[NODE__MAX] = {
   
 /*  /*
  * Look up whether "parent" is a valid parent for "node".   * Look up whether "parent" is a valid parent for "node".
    * This is sucked directly from the DocBook specification: look at the
    * "children" and "parent" sections of each node.
  */   */
 static int  static int
 isparent(enum nodeid node, enum nodeid parent)  isparent(enum nodeid node, enum nodeid parent)
Line 335  isparent(enum nodeid node, enum nodeid parent)
Line 339  isparent(enum nodeid node, enum nodeid parent)
                 return(parent == NODE_REFENTRY);                  return(parent == NODE_REFENTRY);
         case (NODE_REFSYNOPSISDIV):          case (NODE_REFSYNOPSISDIV):
                 return(parent == NODE_REFENTRY);                  return(parent == NODE_REFENTRY);
           case (NODE_STRUCTNAME):
                   switch (parent) {
                   case (NODE_CODE):
                   case (NODE_FUNCSYNOPSISINFO):
                   case (NODE_FUNCTION):
                   case (NODE_OPTION):
                   case (NODE_PARA):
                   case (NODE_PARAMETER):
                   case (NODE_PROGRAMLISTING):
                   case (NODE_REFDESCRIPTOR):
                   case (NODE_REFENTRYTITLE):
                   case (NODE_REFNAME):
                   case (NODE_REFPURPOSE):
                   case (NODE_SYNOPSIS):
                   case (NODE_TITLE):
                           return(1);
                   default:
                           break;
                   }
                   return(0);
         case (NODE_SYNOPSIS):          case (NODE_SYNOPSIS):
                 switch (parent) {                  switch (parent) {
                 case (NODE_REFSYNOPSISDIV):                  case (NODE_REFSYNOPSISDIV):
Line 363  isparent(enum nodeid node, enum nodeid parent)
Line 387  isparent(enum nodeid node, enum nodeid parent)
         return(0);          return(0);
 }  }
   
   /*
    * Process a stream of characters.
    * We store text as nodes in and of themselves.
    * If a text node is already open, append to it.
    * If it's not open, open one under the current context.
    */
 static void  static void
 xml_char(void *arg, const XML_Char *p, int sz)  xml_char(void *arg, const XML_Char *p, int sz)
 {  {
Line 423  xml_char(void *arg, const XML_Char *p, int sz)
Line 453  xml_char(void *arg, const XML_Char *p, int sz)
  * Begin an element.   * Begin an element.
  * First, look for the element.   * First, look for the element.
  * If we don't find it and we're not parsing, keep going.   * If we don't find it and we're not parsing, keep going.
  * If we don't find it (and we're parsing), puke and exit.   * If we don't find it and we're parsing, puke and exit.
  * If we find it but we're not parsing yet (i.e., it's not a refentry   * If we find it but we're not parsing yet (i.e., it's not a refentry
  * and thus out of context), keep going.   * and thus out of context), keep going.
  * If we're at the root and already have a tree, puke and exit.   * If we find it and we're at the root and already have a tree, puke and
    * exit (FIXME: I don't think this is right?).
    * If we find it but we're parsing a text node, close out the text node,
    * return to its parent, and keep going.
  * Make sure that the element is in the right context.   * Make sure that the element is in the right context.
  * Lastly, put the node onto our parse tree and continue.   * Lastly, put the node onto our parse tree and continue.
  */   */
Line 454  xml_elem_start(void *arg, const XML_Char *name, const 
Line 487  xml_elem_start(void *arg, const XML_Char *name, const 
                 else if (0 == strcmp(nodes[node].name, name))                  else if (0 == strcmp(nodes[node].name, name))
                         break;                          break;
   
           /* FIXME: do more with these error messages... */
         if (NODE__MAX == node && NODE_ROOT == ps->node) {          if (NODE__MAX == node && NODE_ROOT == ps->node) {
                 fprintf(stderr, "%s: ignoring node\n", name);                  fprintf(stderr, "%s: ignoring node\n", name);
                 return;                  return;
Line 493  xml_elem_start(void *arg, const XML_Char *name, const 
Line 527  xml_elem_start(void *arg, const XML_Char *name, const 
   
 /*  /*
  * Roll up the parse tree.   * Roll up the parse tree.
  * Does nothing else special.   * If we're at a text node, roll that one up first.
  * If we hit the root, then assign ourselves as the NODE_ROOT.   * If we hit the root, then assign ourselves as the NODE_ROOT.
  */   */
 static void  static void
Line 518  xml_elem_end(void *arg, const XML_Char *name)
Line 552  xml_elem_end(void *arg, const XML_Char *name)
                 ps->node = ps->cur->node;                  ps->node = ps->cur->node;
 }  }
   
   /*
    * Recursively free a node (NULL is ok).
    */
 static void  static void
 pnode_free(struct pnode *pn)  pnode_free(struct pnode *pn)
 {  {
Line 535  pnode_free(struct pnode *pn)
Line 572  pnode_free(struct pnode *pn)
         free(pn);          free(pn);
 }  }
   
   /*
    * Unlink a node from its parent and pnode_free() it.
    */
 static void  static void
 pnode_unlink(struct pnode *pn)  pnode_unlink(struct pnode *pn)
 {  {
Line 544  pnode_unlink(struct pnode *pn)
Line 584  pnode_unlink(struct pnode *pn)
         pnode_free(pn);          pnode_free(pn);
 }  }
   
   /*
    * Unlink all children of a node and pnode_free() them.
    */
 static void  static void
 pnode_unlinksub(struct pnode *pn)  pnode_unlinksub(struct pnode *pn)
 {  {
Line 552  pnode_unlinksub(struct pnode *pn)
Line 595  pnode_unlinksub(struct pnode *pn)
                 pnode_unlink(TAILQ_FIRST(&pn->childq));                  pnode_unlink(TAILQ_FIRST(&pn->childq));
 }  }
   
   /*
    * Reset the lookaside buffer.
    */
 static void  static void
 bufclear(struct parse *p)  bufclear(struct parse *p)
 {  {
Line 559  bufclear(struct parse *p)
Line 605  bufclear(struct parse *p)
         p->b[p->bsz = 0] = '\0';          p->b[p->bsz = 0] = '\0';
 }  }
   
   /*
    * Append NODE_TEXT contents to the current buffer, reallocating its
    * size if necessary.
    * The buffer is ALWAYS nil-terminated.
    */
 static void  static void
 bufappend(struct parse *p, struct pnode *pn)  bufappend(struct parse *p, struct pnode *pn)
 {  {
Line 576  bufappend(struct parse *p, struct pnode *pn)
Line 627  bufappend(struct parse *p, struct pnode *pn)
         p->b[p->bsz] = '\0';          p->b[p->bsz] = '\0';
 }  }
   
   /*
    * Recursively append all NODE_TEXT nodes to the buffer.
    * This descends into non-text nodes, but doesn't do anything beyond
    * them.
    * In other words, this is a recursive text grok.
    */
 static void  static void
 bufappend_r(struct parse *p, struct pnode *pn)  bufappend_r(struct parse *p, struct pnode *pn)
 {  {
Line 588  bufappend_r(struct parse *p, struct pnode *pn)
Line 645  bufappend_r(struct parse *p, struct pnode *pn)
 }  }
   
 /*  /*
  * Print text presumably on a macro line.   * Recursively print text presumably on a macro line.
  * Ignore any child macros.  
  * Convert all whitespace to regular spaces.   * Convert all whitespace to regular spaces.
  */   */
 static void  static void
Line 638  pnode_printmacroline(struct parse *p, struct pnode *pn
Line 694  pnode_printmacroline(struct parse *p, struct pnode *pn
         putchar('\n');          putchar('\n');
 }  }
   
   /*
    * Start the SYNOPSIS macro, unlinking its [superfluous] title.
    */
 static void  static void
 pnode_printrefsynopsisdiv(struct parse *p, struct pnode *pn)  pnode_printrefsynopsisdiv(struct parse *p, struct pnode *pn)
 {  {
Line 652  pnode_printrefsynopsisdiv(struct parse *p, struct pnod
Line 711  pnode_printrefsynopsisdiv(struct parse *p, struct pnod
         puts(".Sh SYNOPSIS");          puts(".Sh SYNOPSIS");
 }  }
   
   /*
    * Start a hopefully-named `Sh' section.
    */
 static void  static void
 pnode_printrefsect(struct parse *p, struct pnode *pn)  pnode_printrefsect(struct parse *p, struct pnode *pn)
 {  {
Line 670  pnode_printrefsect(struct parse *p, struct pnode *pn)
Line 732  pnode_printrefsect(struct parse *p, struct pnode *pn)
                 puts("UNKNOWN");                  puts("UNKNOWN");
 }  }
   
   /*
    * Start a reference, extracting the title and volume.
    */
 static void  static void
 pnode_printciterefentry(struct parse *p, struct pnode *pn)  pnode_printciterefentry(struct parse *p, struct pnode *pn)
 {  {
Line 942  pnode_print(struct parse *p, struct pnode *pn)
Line 1007  pnode_print(struct parse *p, struct pnode *pn)
         case (NODE_REFSECT1):          case (NODE_REFSECT1):
                 pnode_printrefsect(p, pn);                  pnode_printrefsect(p, pn);
                 break;                  break;
           case (NODE_STRUCTNAME):
                   fputs(".Vt ", stdout);
                   pnode_printmacroline(p, pn);
                   pnode_unlinksub(pn);
                   return;
         case (NODE_TEXT):          case (NODE_TEXT):
                 bufclear(p);                  bufclear(p);
                 bufappend(p, pn);                  bufappend(p, pn);

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.8

CVSweb