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

Diff for /mandoc/mdoc_macro.c between version 1.15 and 1.19

version 1.15, 2009/07/06 09:21:24 version 1.19, 2009/07/12 16:34:16
Line 22 
Line 22 
   
 #include "libmdoc.h"  #include "libmdoc.h"
   
 enum    mwarn {  
         WIGNE,  
         WIMPBRK,  
         WMACPARM,  
         WOBS  
 };  
   
 enum    merr {  
         EOPEN,  
         EQUOT,  
         ENOCTX,  
         ENOPARMS  
 };  
   
 #define REWIND_REWIND   (1 << 0)  #define REWIND_REWIND   (1 << 0)
 #define REWIND_NOHALT   (1 << 1)  #define REWIND_NOHALT   (1 << 1)
 #define REWIND_HALT     (1 << 2)  #define REWIND_HALT     (1 << 2)
Line 62  static int   rew_subblock(enum mdoc_type, 
Line 48  static int   rew_subblock(enum mdoc_type, 
 static  int       rew_last(struct mdoc *, struct mdoc_node *);  static  int       rew_last(struct mdoc *, struct mdoc_node *);
 static  int       append_delims(struct mdoc *, int, int *, char *);  static  int       append_delims(struct mdoc *, int, int *, char *);
 static  int       lookup(struct mdoc *, int, int, int, const char *);  static  int       lookup(struct mdoc *, int, int, int, const char *);
 static  int       pwarn(struct mdoc *, int, int, enum mwarn);  
 static  int       perr(struct mdoc *, int, int, enum merr);  
 static  int       swarn(struct mdoc *, enum mdoc_type, int, int,  static  int       swarn(struct mdoc *, enum mdoc_type, int, int,
                         const struct mdoc_node *);                          const struct mdoc_node *);
   
 #define nerr(m, n, t) perr((m), (n)->line, (n)->pos, (t))  
   
 /* Central table of library: who gets parsed how. */  /* Central table of library: who gets parsed how. */
   
 const   struct mdoc_macro __mdoc_macros[MDOC_MAX] = {  const   struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
Line 101  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
Line 83  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Fn */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Fn */
         { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ft */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ft */
         { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ic */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ic */
         { in_line_eoln, 0 }, /* In */  /* FIXME: historic usage! */          { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* In */
         { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Li */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Li */
         { in_line_eoln, 0 }, /* Nd */          { blk_full, 0 }, /* Nd */
         { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Nm */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Nm */
         { blk_part_imp, MDOC_CALLABLE | MDOC_PARSED }, /* Op */          { blk_part_imp, MDOC_CALLABLE | MDOC_PARSED }, /* Op */
         { obsolete, 0 }, /* Ot */          { obsolete, 0 }, /* Ot */
Line 196  const struct mdoc_macro * const mdoc_macros = __mdoc_m
Line 178  const struct mdoc_macro * const mdoc_macros = __mdoc_m
   
   
 static int  static int
 perr(struct mdoc *mdoc, int line, int pos, enum merr type)  
 {  
         char            *p;  
   
         p = NULL;  
         switch (type) {  
         case (EOPEN):  
                 p = "explicit scope still open on exit";  
                 break;  
         case (EQUOT):  
                 p = "unterminated quotation";  
                 break;  
         case (ENOCTX):  
                 p = "closure has no prior context";  
                 break;  
         case (ENOPARMS):  
                 p = "unexpect line arguments";  
                 break;  
         }  
         assert(p);  
         return(mdoc_perr(mdoc, line, pos, p));  
 }  
   
   
 static int  
 pwarn(struct mdoc *mdoc, int line, int pos, enum mwarn type)  
 {  
         char            *p;  
   
         p = NULL;  
         switch (type) {  
         case (WIGNE):  
                 p = "ignoring empty element";  
                 break;  
         case (WIMPBRK):  
                 p = "crufty end-of-line scope violation";  
                 break;  
         case (WMACPARM):  
                 p = "macro-like parameter";  
                 break;  
         case (WOBS):  
                 p = "macro marked obsolete";  
                 break;  
         }  
         assert(p);  
         return(mdoc_pwarn(mdoc, line, pos, p));  
 }  
   
   
 static int  
 swarn(struct mdoc *mdoc, enum mdoc_type type,  swarn(struct mdoc *mdoc, enum mdoc_type type,
                 int line, int pos, const struct mdoc_node *p)                  int line, int pos, const struct mdoc_node *p)
 {  {
Line 283  swarn(struct mdoc *mdoc, enum mdoc_type type, 
Line 215  swarn(struct mdoc *mdoc, enum mdoc_type type, 
         }          }
   
         if ( ! (MDOC_IGN_SCOPE & mdoc->pflags))          if ( ! (MDOC_IGN_SCOPE & mdoc->pflags))
                 return(mdoc_perr(mdoc, line, pos,                  return(mdoc_verr(mdoc, line, pos,
                                 "%s scope breaks %s scope of %s",                                  "%s scope breaks %s scope of %s",
                                 tt, t, n));                                  tt, t, n));
         return(mdoc_pwarn(mdoc, line, pos,          return(mdoc_vwarn(mdoc, line, pos,
                                 "%s scope breaks %s scope of %s",                                  "%s scope breaks %s scope of %s",
                                 tt, t, n));                                  tt, t, n));
 }  }
Line 312  mdoc_macroend(struct mdoc *mdoc)
Line 244  mdoc_macroend(struct mdoc *mdoc)
                         continue;                          continue;
                 if ( ! (MDOC_EXPLICIT & mdoc_macros[n->tok].flags))                  if ( ! (MDOC_EXPLICIT & mdoc_macros[n->tok].flags))
                         continue;                          continue;
                 return(nerr(mdoc, n, EOPEN));                  return(mdoc_nerr(mdoc, n, EOPEN));
         }          }
   
         return(rew_last(mdoc, mdoc->first));          return(rew_last(mdoc, mdoc->first));
Line 328  lookup(struct mdoc *mdoc, int line, int pos, int from,
Line 260  lookup(struct mdoc *mdoc, int line, int pos, int from,
                 return(res);                  return(res);
         if (MDOC_MAX == res)          if (MDOC_MAX == res)
                 return(res);                  return(res);
         if ( ! pwarn(mdoc, line, pos, WMACPARM))          if ( ! mdoc_pwarn(mdoc, line, pos, EMACPARM))
                 return(-1);                  return(-1);
         return(MDOC_MAX);          return(MDOC_MAX);
 }  }
Line 454  rew_dohalt(int tok, enum mdoc_type type, const struct 
Line 386  rew_dohalt(int tok, enum mdoc_type type, const struct 
                 if (type == p->type && tok == p->tok)                  if (type == p->type && tok == p->tok)
                         return(REWIND_REWIND);                          return(REWIND_REWIND);
                 break;                  break;
           case (MDOC_Nd):
                   /* FALLTHROUGH */
         case (MDOC_Ss):          case (MDOC_Ss):
                 assert(MDOC_TAIL != type);                  assert(MDOC_TAIL != type);
                 if (type == p->type && tok == p->tok)                  if (type == p->type && tok == p->tok)
Line 559  rew_dobreak(int tok, const struct mdoc_node *p)
Line 493  rew_dobreak(int tok, const struct mdoc_node *p)
         switch (tok) {          switch (tok) {
         case (MDOC_It):          case (MDOC_It):
                 return(MDOC_It == p->tok);                  return(MDOC_It == p->tok);
           case (MDOC_Nd):
                   return(MDOC_Nd == p->tok);
         case (MDOC_Ss):          case (MDOC_Ss):
                 return(MDOC_Ss == p->tok);                  return(MDOC_Ss == p->tok);
         case (MDOC_Sh):          case (MDOC_Sh):
                   if (MDOC_Nd == p->tok)
                           return(1);
                 if (MDOC_Ss == p->tok)                  if (MDOC_Ss == p->tok)
                         return(1);                          return(1);
                 return(MDOC_Sh == p->tok);                  return(MDOC_Sh == p->tok);
Line 637  rew_expblock(struct mdoc *mdoc, int tok, int line, int
Line 575  rew_expblock(struct mdoc *mdoc, int tok, int line, int
         for (n = mdoc->last; n; n = n->parent) {          for (n = mdoc->last; n; n = n->parent) {
                 c = rew_dohalt(tok, MDOC_BLOCK, n);                  c = rew_dohalt(tok, MDOC_BLOCK, n);
                 if (REWIND_HALT == c)                  if (REWIND_HALT == c)
                         return(perr(mdoc, line, ppos, ENOCTX));                          return(mdoc_perr(mdoc, line, ppos, ENOCTX));
                 if (REWIND_REWIND == c)                  if (REWIND_REWIND == c)
                         break;                          break;
                 else if (rew_dobreak(tok, n))                  else if (rew_dobreak(tok, n))
Line 728  blk_exp_close(MACRO_PROT_ARGS)
Line 666  blk_exp_close(MACRO_PROT_ARGS)
                                 return(0);                                  return(0);
                         return(rew_expblock(mdoc, tok, line, ppos));                          return(rew_expblock(mdoc, tok, line, ppos));
                 }                  }
                 return(perr(mdoc, line, ppos, ENOPARMS));                  return(mdoc_perr(mdoc, line, ppos, ENOLINE));
         }          }
   
         if ( ! rew_subblock(MDOC_BODY, mdoc, tok, line, ppos))          if ( ! rew_subblock(MDOC_BODY, mdoc, tok, line, ppos))
Line 871  in_line(MACRO_PROT_ARGS)
Line 809  in_line(MACRO_PROT_ARGS)
                                         return(0);                                          return(0);
                         } else if ( ! nc && 0 == cnt) {                          } else if ( ! nc && 0 == cnt) {
                                 mdoc_argv_free(arg);                                  mdoc_argv_free(arg);
                                 if ( ! pwarn(mdoc, line, ppos, WIGNE))                                  if ( ! mdoc_pwarn(mdoc, line, ppos, EIGNE))
                                         return(0);                                          return(0);
                         }                          }
                         c = mdoc_macro(mdoc, c, line, la, pos, buf);                          c = mdoc_macro(mdoc, c, line, la, pos, buf);
Line 927  in_line(MACRO_PROT_ARGS)
Line 865  in_line(MACRO_PROT_ARGS)
                         return(0);                          return(0);
         } else if ( ! nc && 0 == cnt) {          } else if ( ! nc && 0 == cnt) {
                 mdoc_argv_free(arg);                  mdoc_argv_free(arg);
                 if ( ! pwarn(mdoc, line, ppos, WIGNE))                  if ( ! mdoc_pwarn(mdoc, line, ppos, EIGNE))
                         return(0);                          return(0);
         }          }
   
Line 943  in_line(MACRO_PROT_ARGS)
Line 881  in_line(MACRO_PROT_ARGS)
 static int  static int
 blk_full(MACRO_PROT_ARGS)  blk_full(MACRO_PROT_ARGS)
 {  {
         int               c, lastarg, reopen;          int               c, lastarg, reopen, dohead;
         struct mdoc_arg  *arg;          struct mdoc_arg  *arg;
         char             *p;          char             *p;
   
           /*
            * Whether to process a block-head section.  If this is
            * non-zero, then a head will be opened for all line arguments.
            * If not, then the head will always be empty and only a body
            * will be opened, which will stay open at the eoln.
            */
   
           switch (tok) {
           case (MDOC_Nd):
                   dohead = 0;
                   break;
           default:
                   dohead = 1;
                   break;
           }
   
         if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)) {          if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)) {
                 if ( ! rew_subblock(MDOC_BODY, mdoc,                  if ( ! rew_subblock(MDOC_BODY, mdoc,
                                         tok, line, ppos))                                          tok, line, ppos))
Line 991  blk_full(MACRO_PROT_ARGS)
Line 945  blk_full(MACRO_PROT_ARGS)
   
         if ( ! mdoc_head_alloc(mdoc, line, ppos, tok))          if ( ! mdoc_head_alloc(mdoc, line, ppos, tok))
                 return(0);                  return(0);
   
           /* Immediately close out head and enter body, if applicable. */
   
           if (0 == dohead) {
                   if ( ! rew_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
                           return(0);
                   if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))
                           return(0);
           }
   
         mdoc->next = MDOC_NEXT_CHILD;          mdoc->next = MDOC_NEXT_CHILD;
   
         for (reopen = 0;; ) {          for (reopen = 0;; ) {
Line 1002  blk_full(MACRO_PROT_ARGS)
Line 966  blk_full(MACRO_PROT_ARGS)
                 if (ARGS_EOLN == c)                  if (ARGS_EOLN == c)
                         break;                          break;
                 if (ARGS_PHRASE == c) {                  if (ARGS_PHRASE == c) {
                           assert(dohead);
                         if (reopen && ! mdoc_head_alloc                          if (reopen && ! mdoc_head_alloc
                                         (mdoc, line, ppos, tok))                                          (mdoc, line, ppos, tok))
                                 return(0);                                  return(0);
Line 1038  blk_full(MACRO_PROT_ARGS)
Line 1003  blk_full(MACRO_PROT_ARGS)
   
         if (1 == ppos && ! append_delims(mdoc, line, pos, buf))          if (1 == ppos && ! append_delims(mdoc, line, pos, buf))
                 return(0);                  return(0);
   
           /* If the body's already open, then just return. */
           if (0 == dohead)
                   return(1);
   
         if ( ! rew_subblock(MDOC_HEAD, mdoc, tok, line, ppos))          if ( ! rew_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
                 return(0);                  return(0);
   
         if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))          if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))
                 return(0);                  return(0);
         mdoc->next = MDOC_NEXT_CHILD;          mdoc->next = MDOC_NEXT_CHILD;
Line 1111  blk_part_imp(MACRO_PROT_ARGS)
Line 1080  blk_part_imp(MACRO_PROT_ARGS)
                 if (body == n)                  if (body == n)
                         break;                          break;
   
         if (NULL == n && ! pwarn(mdoc, body->line, body->pos, WIMPBRK))          if (NULL == n && ! mdoc_nwarn(mdoc, body, EIMPBRK))
                         return(0);                          return(0);
   
         if (n && ! rew_last(mdoc, body))          if (n && ! rew_last(mdoc, body))
Line 1414  static int
Line 1383  static int
 obsolete(MACRO_PROT_ARGS)  obsolete(MACRO_PROT_ARGS)
 {  {
   
         return(pwarn(mdoc, line, ppos, WOBS));          return(mdoc_pwarn(mdoc, line, ppos, EOBS));
 }  }
   
   
Line 1450  phrase(struct mdoc *mdoc, int line, int ppos, char *bu
Line 1419  phrase(struct mdoc *mdoc, int line, int ppos, char *bu
                                 else if ('\\' != buf[i - 1])                                  else if ('\\' != buf[i - 1])
                                         break;                                          break;
                         if (0 == buf[i])                          if (0 == buf[i])
                                 return(perr(mdoc, line, la, EQUOT));                                  return(mdoc_perr(mdoc, line, la, EQUOTPHR));
                         quoted = 1;                          quoted = 1;
                 } else                  } else
                         for ( ; buf[i]; i++)                          for ( ; buf[i]; i++)

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.19

CVSweb