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

Diff for /mandoc/man_macro.c between version 1.82 and 1.87

version 1.82, 2014/04/20 16:46:04 version 1.87, 2014/07/30 23:01:39
Line 49  static enum rew  rew_dohalt(enum mant, enum man_type,
Line 49  static enum rew  rew_dohalt(enum mant, enum man_type,
                                 const struct man_node *);                                  const struct man_node *);
 static  enum rew         rew_block(enum mant, enum man_type,  static  enum rew         rew_block(enum mant, enum man_type,
                                 const struct man_node *);                                  const struct man_node *);
 static  void             rew_warn(struct man *,  
                                 struct man_node *, enum mandocerr);  
   
 const   struct man_macro __man_macros[MAN_MAX] = {  const   struct man_macro __man_macros[MAN_MAX] = {
         { in_line_eoln, MAN_NSCOPED }, /* br */          { in_line_eoln, MAN_NSCOPED }, /* br */
Line 97  const struct man_macro __man_macros[MAN_MAX] = {
Line 95  const struct man_macro __man_macros[MAN_MAX] = {
 const   struct man_macro * const man_macros = __man_macros;  const   struct man_macro * const man_macros = __man_macros;
   
   
 /*  
  * Warn when "n" is an explicit non-roff macro.  
  */  
 static void  
 rew_warn(struct man *man, struct man_node *n, enum mandocerr er)  
 {  
   
         if (er == MANDOCERR_MAX || MAN_BLOCK != n->type)  
                 return;  
         if (MAN_VALID & n->flags)  
                 return;  
         if ( ! (MAN_EXPLICIT & man_macros[n->tok].flags))  
                 return;  
   
         assert(er < MANDOCERR_FATAL);  
         man_nmsg(man, n, er);  
 }  
   
 /*  
  * Rewind scope.  If a code "er" != MANDOCERR_MAX has been provided, it  
  * will be used if an explicit block scope is being closed out.  
  */  
 int  int
 man_unscope(struct man *man, const struct man_node *to,  man_unscope(struct man *man, const struct man_node *to)
                 enum mandocerr er)  
 {  {
         struct man_node *n;          struct man_node *n;
   
         assert(to);  
   
         man->next = MAN_NEXT_SIBLING;          man->next = MAN_NEXT_SIBLING;
           to = to->parent;
           n = man->last;
           while (n != to) {
   
         while (man->last != to) {                  /* Reached the end of the document? */
   
                   if (to == NULL && ! (n->flags & MAN_VALID)) {
                           if (man->flags & (MAN_BLINE | MAN_ELINE) &&
                               man_macros[n->tok].flags & MAN_SCOPED) {
                                   mandoc_vmsg(MANDOCERR_BLK_LINE,
                                       man->parse, n->line, n->pos,
                                       "EOF breaks %s",
                                       man_macronames[n->tok]);
                                   if (man->flags & MAN_ELINE)
                                           man->flags &= ~MAN_ELINE;
                                   else {
                                           assert(n->type == MAN_HEAD);
                                           n = n->parent;
                                           man->flags &= ~MAN_BLINE;
                                   }
                                   man->last = n;
                                   n = n->parent;
                                   man_node_delete(man, man->last);
                                   continue;
                           }
                           if (n->type == MAN_BLOCK &&
                               man_macros[n->tok].flags & MAN_EXPLICIT)
                                   mandoc_msg(MANDOCERR_BLK_NOEND,
                                       man->parse, n->line, n->pos,
                                       man_macronames[n->tok]);
                   }
   
                 /*                  /*
                  * Save the parent here, because we may delete the                   * We might delete the man->last node
                  * man->last node in the post-validation phase and reset                   * in the post-validation phase.
                  * it to man->last->parent, causing a step in the closing                   * Save a pointer to the parent such that
                  * out to be lost.                   * we know where to continue the iteration.
                  */                   */
                 n = man->last->parent;                  man->last = n;
                 rew_warn(man, man->last, er);                  n = n->parent;
                 if ( ! man_valid_post(man))                  if ( ! man_valid_post(man))
                         return(0);                          return(0);
                 man->last = n;  
                 assert(man->last);  
         }          }
   
         rew_warn(man, man->last, er);  
         if ( ! man_valid_post(man))  
                 return(0);  
   
         return(1);          return(1);
 }  }
   
Line 264  rew_scope(enum man_type type, struct man *man, enum ma
Line 260  rew_scope(enum man_type type, struct man *man, enum ma
          */           */
         assert(n);          assert(n);
   
         return(man_unscope(man, n, MANDOCERR_MAX));          return(man_unscope(man, n));
 }  }
   
   
Line 294  blk_close(MACRO_PROT_ARGS)
Line 290  blk_close(MACRO_PROT_ARGS)
                         break;                          break;
   
         if (NULL == nn) {          if (NULL == nn) {
                 man_pmsg(man, line, ppos, MANDOCERR_NOSCOPE);                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, man->parse,
                       line, ppos, man_macronames[tok]);
                 if ( ! rew_scope(MAN_BLOCK, man, MAN_PP))                  if ( ! rew_scope(MAN_BLOCK, man, MAN_PP))
                         return(0);                          return(0);
         } else          } else
                 man_unscope(man, nn, MANDOCERR_MAX);                  man_unscope(man, nn);
   
         return(1);          return(1);
 }  }
Line 335  blk_exp(MACRO_PROT_ARGS)
Line 332  blk_exp(MACRO_PROT_ARGS)
                 if (n->tok != tok)                  if (n->tok != tok)
                         continue;                          continue;
                 assert(MAN_HEAD == n->type);                  assert(MAN_HEAD == n->type);
                 man_unscope(man, n, MANDOCERR_MAX);                  man_unscope(man, n);
                 break;                  break;
         }          }
   
Line 440  in_line_eoln(MACRO_PROT_ARGS)
Line 437  in_line_eoln(MACRO_PROT_ARGS)
                 return(1);                  return(1);
         }          }
   
         /* Set ignorable context, if applicable. */  
   
         if (MAN_NSCOPED & man_macros[tok].flags) {  
                 assert( ! (MAN_SCOPED & man_macros[tok].flags));  
                 man->flags |= MAN_ILINE;  
         }  
   
         assert(MAN_ROOT != man->last->type);          assert(MAN_ROOT != man->last->type);
         man->next = MAN_NEXT_SIBLING;          man->next = MAN_NEXT_SIBLING;
   
Line 482  int
Line 472  int
 man_macroend(struct man *man)  man_macroend(struct man *man)
 {  {
   
         return(man_unscope(man, man->first, MANDOCERR_SCOPEEXIT));          return(man_unscope(man, man->first));
 }  }
   
 static int  static int

Legend:
Removed from v.1.82  
changed lines
  Added in v.1.87

CVSweb