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

Diff for /mandoc/mdoc.c between version 1.120 and 1.122

version 1.120, 2010/04/05 08:59:46 version 1.122, 2010/04/08 07:06:15
Line 141  const char *const __mdoc_argnames[MDOC_ARG_MAX] = {   
Line 141  const char *const __mdoc_argnames[MDOC_ARG_MAX] = {   
 const   char * const *mdoc_macronames = __mdoc_macronames;  const   char * const *mdoc_macronames = __mdoc_macronames;
 const   char * const *mdoc_argnames = __mdoc_argnames;  const   char * const *mdoc_argnames = __mdoc_argnames;
   
   static  void              mdoc_node_free(struct mdoc_node *);
   static  void              mdoc_node_unlink(struct mdoc *,
                                   struct mdoc_node *);
 static  void              mdoc_free1(struct mdoc *);  static  void              mdoc_free1(struct mdoc *);
 static  void              mdoc_alloc1(struct mdoc *);  static  void              mdoc_alloc1(struct mdoc *);
 static  struct mdoc_node *node_alloc(struct mdoc *, int, int,  static  struct mdoc_node *node_alloc(struct mdoc *, int, int,
Line 177  mdoc_free1(struct mdoc *mdoc)
Line 180  mdoc_free1(struct mdoc *mdoc)
 {  {
   
         if (mdoc->first)          if (mdoc->first)
                 mdoc_node_freelist(mdoc->first);                  mdoc_node_delete(mdoc, mdoc->first);
         if (mdoc->meta.title)          if (mdoc->meta.title)
                 free(mdoc->meta.title);                  free(mdoc->meta.title);
         if (mdoc->meta.os)          if (mdoc->meta.os)
Line 345  int
Line 348  int
 mdoc_macro(struct mdoc *m, enum mdoct tok,  mdoc_macro(struct mdoc *m, enum mdoct tok,
                 int ln, int pp, int *pos, char *buf)                  int ln, int pp, int *pos, char *buf)
 {  {
   
         assert(tok < MDOC_MAX);          assert(tok < MDOC_MAX);
         /*  
          * If we're in the prologue, deny "body" macros.  Similarly, if          /* If we're in the body, deny prologue calls. */
          * we're in the body, deny prologue calls.  
          */  
         if (MDOC_PROLOGUE & mdoc_macros[tok].flags &&          if (MDOC_PROLOGUE & mdoc_macros[tok].flags &&
                         MDOC_PBODY & m->flags) {                          MDOC_PBODY & m->flags)
                   return(mdoc_perr(m, ln, pp, EPROLBODY));
   
           /* If we're in the prologue, deny "body" macros.  */
   
           if ( ! (MDOC_PROLOGUE & mdoc_macros[tok].flags) &&
                           ! (MDOC_PBODY & m->flags)) {
                 if ( ! mdoc_pwarn(m, ln, pp, EBODYPROL))                  if ( ! mdoc_pwarn(m, ln, pp, EBODYPROL))
                         return(0);                          return(0);
                 /*  
                  * FIXME: do this in mdoc_action.c.  
                  */  
                 if (NULL == m->meta.title)                  if (NULL == m->meta.title)
                         m->meta.title = mandoc_strdup("unknown");                          m->meta.title = mandoc_strdup("unknown");
                 if (NULL == m->meta.vol)                  if (NULL == m->meta.vol)
Line 368  mdoc_macro(struct mdoc *m, enum mdoct tok, 
Line 372  mdoc_macro(struct mdoc *m, enum mdoct tok, 
                         m->meta.date = time(NULL);                          m->meta.date = time(NULL);
                 m->flags |= MDOC_PBODY;                  m->flags |= MDOC_PBODY;
         }          }
         if ( ! (MDOC_PROLOGUE & mdoc_macros[tok].flags) &&  
                         ! (MDOC_PBODY & m->flags))  
                 return(mdoc_perr(m, ln, pp, EBODYPROL));  
   
         return((*mdoc_macros[tok].fp)(m, tok, ln, pp, pos, buf));          return((*mdoc_macros[tok].fp)(m, tok, ln, pp, pos, buf));
 }  }
Line 565  void
Line 566  void
 mdoc_node_free(struct mdoc_node *p)  mdoc_node_free(struct mdoc_node *p)
 {  {
   
         if (p->parent)  
                 p->parent->nchild--;  
         if (p->string)          if (p->string)
                 free(p->string);                  free(p->string);
         if (p->args)          if (p->args)
Line 575  mdoc_node_free(struct mdoc_node *p)
Line 574  mdoc_node_free(struct mdoc_node *p)
 }  }
   
   
 void  static void
 mdoc_node_freelist(struct mdoc_node *p)  mdoc_node_unlink(struct mdoc *m, struct mdoc_node *n)
 {  {
   
         if (p->child)          /* Adjust siblings. */
                 mdoc_node_freelist(p->child);  
         if (p->next)  
                 mdoc_node_freelist(p->next);  
   
           if (n->prev)
                   n->prev->next = n->next;
           if (n->next)
                   n->next->prev = n->prev;
   
           /* Adjust parent. */
   
           if (n->parent) {
                   n->parent->nchild--;
                   if (n->parent->child == n)
                           n->parent->child = n->prev ? n->prev : n->next;
           }
   
           /* Adjust parse point, if applicable. */
   
           if (m && m->last == n) {
                   if (n->prev) {
                           m->last = n->prev;
                           m->next = MDOC_NEXT_SIBLING;
                   } else {
                           m->last = n->parent;
                           m->next = MDOC_NEXT_CHILD;
                   }
           }
   
           if (m && m->first == n)
                   m->first = NULL;
   }
   
   
   void
   mdoc_node_delete(struct mdoc *m, struct mdoc_node *p)
   {
   
           while (p->child) {
                   assert(p->nchild);
                   mdoc_node_delete(m, p->child);
           }
         assert(0 == p->nchild);          assert(0 == p->nchild);
   
           mdoc_node_unlink(m, p);
         mdoc_node_free(p);          mdoc_node_free(p);
 }  }
   

Legend:
Removed from v.1.120  
changed lines
  Added in v.1.122

CVSweb