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

Diff for /mandoc/Attic/macro.c between version 1.66 and 1.67

version 1.66, 2009/03/11 00:39:58 version 1.67, 2009/03/12 02:57:36
Line 32 
Line 32 
   
 /* FIXME: .Fl, .Ar, .Cd handling of `|'. */  /* FIXME: .Fl, .Ar, .Cd handling of `|'. */
   
 static int        macro_obsolete(MACRO_PROT_ARGS);  static  int       macro_obsolete(MACRO_PROT_ARGS);
 static int        macro_constant(MACRO_PROT_ARGS);  static  int       macro_constant(MACRO_PROT_ARGS);
 static int        macro_constant_scoped(MACRO_PROT_ARGS);  static  int       macro_constant_scoped(MACRO_PROT_ARGS);
 static int        macro_constant_delimited(MACRO_PROT_ARGS);  static  int       macro_constant_delimited(MACRO_PROT_ARGS);
 static int        macro_text(MACRO_PROT_ARGS);  static  int       macro_text(MACRO_PROT_ARGS);
 static int        macro_scoped(MACRO_PROT_ARGS);  static  int       macro_scoped(MACRO_PROT_ARGS);
 static int        macro_scoped_close(MACRO_PROT_ARGS);  static  int       macro_scoped_close(MACRO_PROT_ARGS);
 static int        macro_scoped_line(MACRO_PROT_ARGS);  static  int       macro_scoped_line(MACRO_PROT_ARGS);
   static  int       macro_phrase(struct mdoc *, int, char *);
   
 #define REWIND_REWIND   (1 << 0)  #define REWIND_REWIND   (1 << 0)
 #define REWIND_NOHALT   (1 << 1)  #define REWIND_NOHALT   (1 << 1)
Line 192  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
Line 193  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
 const   struct mdoc_macro * const mdoc_macros = __mdoc_macros;  const   struct mdoc_macro * const mdoc_macros = __mdoc_macros;
   
   
   /*
    * This is called at the end of parsing.  It must traverse up the tree,
    * closing out open [implicit] scopes.  Obviously, open explicit scopes
    * are errors.
    */
   int
   macro_end(struct mdoc *mdoc)
   {
           struct mdoc_node *n;
   
           assert(mdoc->first);
           assert(mdoc->last);
   
           /* Scan for open explicit scopes. */
   
           n = MDOC_VALID & mdoc->last->flags ?
                   mdoc->last->parent : mdoc->last;
   
           for ( ; n; n = n->parent) {
                   if (MDOC_BLOCK != n->type)
                           continue;
                   if ( ! (MDOC_EXPLICIT & mdoc_macros[n->tok].flags))
                           continue;
                   return(mdoc_nerr(mdoc, n,
                                   "macro scope still open on exit"));
           }
   
           return(rewind_last(mdoc, mdoc->first));
   }
   
   
 static int  static int
 perr(struct mdoc *mdoc, int line, int pos, int type)  perr(struct mdoc *mdoc, int line, int pos, int type)
 {  {
Line 890  macro_text(MACRO_PROT_ARGS)
Line 922  macro_text(MACRO_PROT_ARGS)
  *             TEXT (`Another.')   *             TEXT (`Another.')
  *   *
  * Note that the `.It' macro, possibly the most difficult (as it has   * Note that the `.It' macro, possibly the most difficult (as it has
  * embedded scope, etc.) is handled by this routine.   * embedded scope, etc.) is handled by this routine.  It handles
    * columnar output, where columns are "phrases" and denote multiple
    * block heads.
  */   */
 static int  static int
 macro_scoped(MACRO_PROT_ARGS)  macro_scoped(MACRO_PROT_ARGS)
 {  {
         int               c, lastarg;          int               c, lastarg, reopen;
         struct mdoc_arg  *arg;          struct mdoc_arg  *arg;
         char             *p;          char             *p;
   
Line 947  macro_scoped(MACRO_PROT_ARGS)
Line 981  macro_scoped(MACRO_PROT_ARGS)
   
         if ( ! mdoc_head_alloc(mdoc, line, ppos, tok))          if ( ! mdoc_head_alloc(mdoc, line, ppos, tok))
                 return(0);                  return(0);
   
           /* Indicate that columnar scope shouldn't be reopened. */
           reopen = 0;
         mdoc->next = MDOC_NEXT_CHILD;          mdoc->next = MDOC_NEXT_CHILD;
   
         for (;;) {          for (;;) {
Line 958  macro_scoped(MACRO_PROT_ARGS)
Line 995  macro_scoped(MACRO_PROT_ARGS)
                 if (ARGS_EOLN == c)                  if (ARGS_EOLN == c)
                         break;                          break;
                 if (ARGS_PHRASE == c) {                  if (ARGS_PHRASE == c) {
                           if (reopen && ! mdoc_head_alloc(mdoc, line, ppos, tok))
                                   return(0);
                           mdoc->next = MDOC_NEXT_CHILD;
   
                         /*                          /*
                         if ( ! mdoc_phrase(mdoc, line, lastarg, buf))                           * Phrases are self-contained macro phrases used
                            * in the columnar output of a macro. They need
                            * special handling.
                            */
                           if ( ! macro_phrase(mdoc, line, p))
                                 return(0);                                  return(0);
                         */                          if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
                                   return(0);
   
                           reopen = 1;
                         continue;                          continue;
                 }                  }
   
                 /* FIXME: if .It -column, the lookup must be for a  
                  * sub-line component.  BLAH. */  
   
                 if (-1 == (c = lookup(mdoc, line, lastarg, tok, p)))                  if (-1 == (c = lookup(mdoc, line, lastarg, tok, p)))
                         return(0);                          return(0);
   
Line 1409  macro_obsolete(MACRO_PROT_ARGS)
Line 1454  macro_obsolete(MACRO_PROT_ARGS)
 }  }
   
   
 /*  static int
  * This is called at the end of parsing.  It must traverse up the tree,  macro_phrase(struct mdoc *mdoc, int line, int ppos, char *buf)
  * closing out open [implicit] scopes.  Obviously, open explicit scopes  
  * are errors.  
  */  
 int  
 macro_end(struct mdoc *mdoc)  
 {  {
         struct mdoc_node *n;          int              i, la, c;
   
         assert(mdoc->first);          i = ppos;
         assert(mdoc->last);  
   
         /* Scan for open explicit scopes. */  again:
           la = i;
           while (buf[i] && ! isspace((unsigned char)buf[i]))
                   i++;
   
         n = MDOC_VALID & mdoc->last->flags ?          if (0 == buf[i])
                 mdoc->last->parent : mdoc->last;                  return(mdoc_word_alloc(mdoc, line, la, buf));
   
         for ( ; n; n = n->parent) {          buf[i] = 0;
                 if (MDOC_BLOCK != n->type)  
                         continue;  
                 if ( ! (MDOC_EXPLICIT & mdoc_macros[n->tok].flags))  
                         continue;  
                 return(mdoc_nerr(mdoc, n,  
                                 "macro scope still open on exit"));  
         }  
   
         return(rewind_last(mdoc, mdoc->first));          if (MDOC_MAX == (c = mdoc_tokhash_find(mdoc->htab, p))) {
                   if ( ! mdoc_word_alloc(mdoc, line,
           }
 }  }

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

CVSweb