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

Diff for /mandoc/mdoc.c between version 1.67 and 1.68

version 1.67, 2009/03/19 11:49:00 version 1.68, 2009/03/20 15:14:01
Line 29 
Line 29 
 /*  /*
  * Main caller in the libmdoc library.  This begins the parsing routine,   * Main caller in the libmdoc library.  This begins the parsing routine,
  * handles allocation of data, and so forth.  Most of the "work" is done   * handles allocation of data, and so forth.  Most of the "work" is done
  * in macro.c and validate.c.   * in macro.c, validate.c and action.c.
  */   */
   
 static  struct mdoc_node *mdoc_node_alloc(const struct mdoc *);  static  struct mdoc_node *mdoc_node_alloc(const struct mdoc *);
Line 94  const char * const *mdoc_macronames = __mdoc_macroname
Line 94  const char * const *mdoc_macronames = __mdoc_macroname
 const   char * const *mdoc_argnames = __mdoc_argnames;  const   char * const *mdoc_argnames = __mdoc_argnames;
   
   
   /*
    * Get the first (root) node of the parse tree.
    */
 const struct mdoc_node *  const struct mdoc_node *
 mdoc_node(const struct mdoc *mdoc)  mdoc_node(const struct mdoc *mdoc)
 {  {
   
           if (MDOC_HALT & mdoc->flags)
                   return(NULL);
           if (mdoc->first)
                   assert(MDOC_ROOT == mdoc->first->type);
         return(mdoc->first);          return(mdoc->first);
 }  }
   
Line 106  const struct mdoc_meta *
Line 113  const struct mdoc_meta *
 mdoc_meta(const struct mdoc *mdoc)  mdoc_meta(const struct mdoc *mdoc)
 {  {
   
           if (MDOC_HALT & mdoc->flags)
                   return(NULL);
         return(&mdoc->meta);          return(&mdoc->meta);
 }  }
   
   
   /*
    * Free up all resources contributed by a parse:  the node tree, meta-data and
    * so on.  Then reallocate the root node for another parse.
    */
 void  void
 mdoc_reset(struct mdoc *mdoc)  mdoc_reset(struct mdoc *mdoc)
 {  {
Line 138  mdoc_reset(struct mdoc *mdoc)
Line 151  mdoc_reset(struct mdoc *mdoc)
 }  }
   
   
   /*
    * Completely free up all resources.
    */
 void  void
 mdoc_free(struct mdoc *mdoc)  mdoc_free(struct mdoc *mdoc)
 {  {
   
         if (mdoc->first)          if (mdoc->first)
                 mdoc_node_freelist(mdoc->first);                  mdoc_node_freelist(mdoc->first);
         if (mdoc->htab)  
                 mdoc_tokhash_free(mdoc->htab);  
         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 157  mdoc_free(struct mdoc *mdoc)
Line 171  mdoc_free(struct mdoc *mdoc)
         if (mdoc->meta.vol)          if (mdoc->meta.vol)
                 free(mdoc->meta.vol);                  free(mdoc->meta.vol);
   
           if (mdoc->htab)
                   mdoc_tokhash_free(mdoc->htab);
   
         free(mdoc);          free(mdoc);
 }  }
   
Line 182  mdoc_alloc(void *data, int pflags, const struct mdoc_c
Line 199  mdoc_alloc(void *data, int pflags, const struct mdoc_c
 }  }
   
   
   /*
    * Climb back up the parse tree, validating open scopes.  Mostly calls
    * through to macro_end in macro.c.
    */
 int  int
 mdoc_endparse(struct mdoc *mdoc)  mdoc_endparse(struct mdoc *mdoc)
 {  {
Line 318  mdoc_node_append(struct mdoc *mdoc, struct mdoc_node *
Line 339  mdoc_node_append(struct mdoc *mdoc, struct mdoc_node *
   
         if ( ! mdoc_valid_pre(mdoc, p))          if ( ! mdoc_valid_pre(mdoc, p))
                 return(0);                  return(0);
           if ( ! mdoc_action_pre(mdoc, p))
                   return(0);
   
         switch (p->type) {          switch (p->type) {
         case (MDOC_HEAD):          case (MDOC_HEAD):
Line 512  mdoc_node_freelist(struct mdoc_node *p)
Line 535  mdoc_node_freelist(struct mdoc_node *p)
  * control character.   * control character.
  */   */
 static int  static int
 parsetext(struct mdoc *mdoc, int line, char *buf)  parsetext(struct mdoc *m, int line, char *buf)
 {  {
   
         if (SEC_PROLOGUE == mdoc->lastnamed)          if (SEC_PROLOGUE == m->lastnamed)
                 return(mdoc_perr(mdoc, line, 0,                  return(mdoc_perr(m, line, 0,
                         "text disallowed in prologue"));                          "text disallowed in prologue"));
   
         if ( ! mdoc_word_alloc(mdoc, line, 0, buf))          if (0 == buf[0] && ! (MDOC_LITERAL & m->flags))
                   return(mdoc_perr(m, line, 0,
                           "blank lines only in literal context"));
   
           if ( ! mdoc_word_alloc(m, line, 0, buf))
                 return(0);                  return(0);
   
         mdoc->next = MDOC_NEXT_SIBLING;          m->next = MDOC_NEXT_SIBLING;
         return(1);          return(1);
 }  }
   
Line 600  parsemacro(struct mdoc *m, int ln, char *buf)
Line 627  parsemacro(struct mdoc *m, int ln, char *buf)
   
         if ( ! mdoc_macro(m, c, ln, 1, &i, buf))          if ( ! mdoc_macro(m, c, ln, 1, &i, buf))
                 goto err;                  goto err;
   
           /*
            * If we're in literal mode, then add a newline to the end of
            * macro lines.  Our frontends will interpret this correctly
            * (it's documented in mdoc.3).
            */
   
         return(1);          return(1);
   

Legend:
Removed from v.1.67  
changed lines
  Added in v.1.68

CVSweb