[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.131 and 1.138

version 1.131, 2014/04/20 16:46:05 version 1.138, 2014/07/30 17:06:26
Line 48  static int  ctx_synopsis(MACRO_PROT_ARGS);
Line 48  static int  ctx_synopsis(MACRO_PROT_ARGS);
 static  int             in_line_eoln(MACRO_PROT_ARGS);  static  int             in_line_eoln(MACRO_PROT_ARGS);
 static  int             in_line_argn(MACRO_PROT_ARGS);  static  int             in_line_argn(MACRO_PROT_ARGS);
 static  int             in_line(MACRO_PROT_ARGS);  static  int             in_line(MACRO_PROT_ARGS);
 static  int             obsolete(MACRO_PROT_ARGS);  
 static  int             phrase_ta(MACRO_PROT_ARGS);  static  int             phrase_ta(MACRO_PROT_ARGS);
   
 static  int             dword(struct mdoc *, int, int, const char *,  static  int             dword(struct mdoc *, int, int, const char *,
Line 104  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
Line 103  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { blk_full, MDOC_JOIN }, /* Nd */          { blk_full, MDOC_JOIN }, /* Nd */
         { ctx_synopsis, MDOC_CALLABLE | MDOC_PARSED }, /* Nm */          { ctx_synopsis, MDOC_CALLABLE | MDOC_PARSED }, /* Nm */
         { blk_part_imp, MDOC_CALLABLE | MDOC_PARSED }, /* Op */          { blk_part_imp, MDOC_CALLABLE | MDOC_PARSED }, /* Op */
         { obsolete, 0 }, /* Ot */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ot */
         { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Pa */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Pa */
         { in_line_eoln, 0 }, /* Rv */          { in_line_eoln, 0 }, /* Rv */
         { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* St */          { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* St */
Line 191  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
Line 190  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { blk_exp_close, MDOC_EXPLICIT | MDOC_JOIN }, /* Ek */          { blk_exp_close, MDOC_EXPLICIT | MDOC_JOIN }, /* Ek */
         { in_line_eoln, 0 }, /* Bt */          { in_line_eoln, 0 }, /* Bt */
         { in_line_eoln, 0 }, /* Hf */          { in_line_eoln, 0 }, /* Hf */
         { obsolete, 0 }, /* Fr */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Fr */
         { in_line_eoln, 0 }, /* Ud */          { in_line_eoln, 0 }, /* Ud */
         { in_line, 0 }, /* Lb */          { in_line, 0 }, /* Lb */
         { in_line_eoln, 0 }, /* Lp */          { in_line_eoln, 0 }, /* Lp */
Line 203  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
Line 202  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { blk_exp_close, MDOC_CALLABLE | MDOC_PARSED |          { blk_exp_close, MDOC_CALLABLE | MDOC_PARSED |
                          MDOC_EXPLICIT | MDOC_JOIN }, /* Brc */                           MDOC_EXPLICIT | MDOC_JOIN }, /* Brc */
         { in_line_eoln, MDOC_JOIN }, /* %C */          { in_line_eoln, MDOC_JOIN }, /* %C */
         { obsolete, 0 }, /* Es */          { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Es */
         { obsolete, 0 }, /* En */          { blk_part_imp, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* En */
         { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Dx */          { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Dx */
         { in_line_eoln, MDOC_JOIN }, /* %Q */          { in_line_eoln, MDOC_JOIN }, /* %Q */
         { in_line_eoln, 0 }, /* br */          { in_line_eoln, 0 }, /* br */
Line 235  mdoc_macroend(struct mdoc *mdoc)
Line 234  mdoc_macroend(struct mdoc *mdoc)
         for ( ; n; n = n->parent)          for ( ; n; n = n->parent)
                 if (MDOC_BLOCK == n->type &&                  if (MDOC_BLOCK == n->type &&
                     MDOC_EXPLICIT & mdoc_macros[n->tok].flags)                      MDOC_EXPLICIT & mdoc_macros[n->tok].flags)
                         mdoc_nmsg(mdoc, n, MANDOCERR_SCOPEEXIT);                          mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse,
                               n->line, n->pos, mdoc_macronames[n->tok]);
   
         /* Rewind to the first. */          /* Rewind to the first. */
   
Line 424  rew_dohalt(enum mdoct tok, enum mdoc_type type,
Line 424  rew_dohalt(enum mdoct tok, enum mdoc_type type,
                         return(REWIND_NONE);                          return(REWIND_NONE);
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case MDOC_Sh:          case MDOC_Sh:
                   if (MDOC_ROOT == p->parent->type)
                           return(REWIND_THIS);
                 if (MDOC_Nd == p->tok || MDOC_Ss == p->tok ||                  if (MDOC_Nd == p->tok || MDOC_Ss == p->tok ||
                     MDOC_Sh == p->tok)                      MDOC_Sh == p->tok)
                         return(REWIND_MORE);                          return(REWIND_MORE);
Line 529  make_pending(struct mdoc_node *broken, enum mdoct tok,
Line 531  make_pending(struct mdoc_node *broken, enum mdoct tok,
                         taker->pending = broken->pending;                          taker->pending = broken->pending;
                 }                  }
                 broken->pending = breaker;                  broken->pending = breaker;
                 mandoc_vmsg(MANDOCERR_SCOPENEST, mdoc->parse, line, ppos,                  mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, line, ppos,
                     "%s breaks %s", mdoc_macronames[tok],                      "%s breaks %s", mdoc_macronames[tok],
                     mdoc_macronames[broken->tok]);                      mdoc_macronames[broken->tok]);
                 return(1);                  return(1);
Line 559  rew_sub(enum mdoc_type t, struct mdoc *mdoc,
Line 561  rew_sub(enum mdoc_type t, struct mdoc *mdoc,
                              ! (MDOC_EXPLICIT & mdoc_macros[tok].flags));                               ! (MDOC_EXPLICIT & mdoc_macros[tok].flags));
                         break;                          break;
                 case REWIND_FORCE:                  case REWIND_FORCE:
                         mandoc_vmsg(MANDOCERR_SCOPEBROKEN, mdoc->parse,                          mandoc_vmsg(MANDOCERR_BLK_BROKEN, mdoc->parse,
                             line, ppos, "%s breaks %s",                              line, ppos, "%s breaks %s",
                             mdoc_macronames[tok],                              mdoc_macronames[tok],
                             mdoc_macronames[n->tok]);                              mdoc_macronames[n->tok]);
Line 575  rew_sub(enum mdoc_type t, struct mdoc *mdoc,
Line 577  rew_sub(enum mdoc_type t, struct mdoc *mdoc,
                                 return(1);                                  return(1);
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case REWIND_ERROR:                  case REWIND_ERROR:
                         mdoc_pmsg(mdoc, line, ppos, MANDOCERR_NOSCOPE);                          mandoc_msg(MANDOCERR_BLK_NOTOPEN,
                               mdoc->parse, line, ppos,
                               mdoc_macronames[tok]);
                         return(1);                          return(1);
                 }                  }
                 break;                  break;
Line 770  blk_exp_close(MACRO_PROT_ARGS)
Line 774  blk_exp_close(MACRO_PROT_ARGS)
                         later = n;                          later = n;
         }          }
   
         if ( ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) {          if ( ! (MDOC_PARSED & mdoc_macros[tok].flags)) {
                 /* FIXME: do this in validate */                  if ('\0' != buf[*pos])
                 if (buf[*pos])                          mandoc_vmsg(MANDOCERR_ARG_SKIP,
                         mdoc_pmsg(mdoc, line, ppos, MANDOCERR_ARGSLOST);                              mdoc->parse, line, ppos,
                               "%s %s", mdoc_macronames[tok],
                               buf + *pos);
                 if ( ! rew_sub(MDOC_BODY, mdoc, tok, line, ppos))                  if ( ! rew_sub(MDOC_BODY, mdoc, tok, line, ppos))
                         return(0);                          return(0);
                 return(rew_sub(MDOC_BLOCK, mdoc, tok, line, ppos));                  return(rew_sub(MDOC_BLOCK, mdoc, tok, line, ppos));
Line 920  in_line(MACRO_PROT_ARGS)
Line 925  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);
                                 mdoc_pmsg(mdoc, line, ppos,                                  mandoc_msg(MANDOCERR_MACRO_EMPTY,
                                     MANDOCERR_MACROEMPTY);                                      mdoc->parse, line, ppos,
                                       mdoc_macronames[tok]);
                         }                          }
   
                         if ( ! mdoc_macro(mdoc, ntok, line, la, pos, buf))                          if ( ! mdoc_macro(mdoc, ntok, line, la, pos, buf))
Line 1006  in_line(MACRO_PROT_ARGS)
Line 1012  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);
                 mdoc_pmsg(mdoc, line, ppos, MANDOCERR_MACROEMPTY);                  mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
                       line, ppos, mdoc_macronames[tok]);
         }          }
   
         if ( ! nl)          if ( ! nl)
Line 1030  blk_full(MACRO_PROT_ARGS)
Line 1037  blk_full(MACRO_PROT_ARGS)
   
         nl = MDOC_NEWLINE & mdoc->flags;          nl = MDOC_NEWLINE & mdoc->flags;
   
           /* Skip items outside lists. */
   
           if (tok == MDOC_It) {
                   for (n = mdoc->last; n; n = n->parent)
                           if (n->tok == MDOC_Bl)
                                   break;
                   if (n == NULL) {
                           mandoc_vmsg(MANDOCERR_IT_STRAY, mdoc->parse,
                               line, ppos, "It %s", buf + *pos);
                           if ( ! mdoc_elem_alloc(mdoc, line, ppos,
                               MDOC_br, NULL))
                                   return(0);
                           return(rew_elem(mdoc, MDOC_br));
                   }
           }
   
         /* Close out prior implicit scope. */          /* Close out prior implicit scope. */
   
         if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)) {          if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)) {
Line 1355  blk_part_imp(MACRO_PROT_ARGS)
Line 1378  blk_part_imp(MACRO_PROT_ARGS)
                         return(1);                          return(1);
                 }                  }
         }          }
           assert(n == body);
   
         /*          if ( ! rew_sub(MDOC_BODY, mdoc, tok, line, ppos))
          * If we can't rewind to our body, then our scope has already  
          * been closed by another macro (like `Oc' closing `Op').  This  
          * is ugly behaviour nodding its head to OpenBSD's overwhelming  
          * crufty use of `Op' breakage.  
          */  
         if (n != body)  
                 mandoc_vmsg(MANDOCERR_SCOPENEST, mdoc->parse, line,  
                     ppos, "%s broken", mdoc_macronames[tok]);  
   
         if (n && ! rew_sub(MDOC_BODY, mdoc, tok, line, ppos))  
                 return(0);                  return(0);
   
         /* Standard appending of delimiters. */          /* Standard appending of delimiters. */
Line 1376  blk_part_imp(MACRO_PROT_ARGS)
Line 1390  blk_part_imp(MACRO_PROT_ARGS)
   
         /* Rewind scope, if applicable. */          /* Rewind scope, if applicable. */
   
         if (n && ! rew_sub(MDOC_BLOCK, mdoc, tok, line, ppos))          if ( ! rew_sub(MDOC_BLOCK, mdoc, tok, line, ppos))
                 return(0);                  return(0);
   
         /* Move trailing .Ns out of scope. */          /* Move trailing .Ns out of scope. */
Line 1528  in_line_argn(MACRO_PROT_ARGS)
Line 1542  in_line_argn(MACRO_PROT_ARGS)
                 break;                  break;
         case MDOC_Bx:          case MDOC_Bx:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
           case MDOC_Es:
                   /* FALLTHROUGH */
         case MDOC_Xr:          case MDOC_Xr:
                 maxargs = 2;                  maxargs = 2;
                 break;                  break;
Line 1572  in_line_argn(MACRO_PROT_ARGS)
Line 1588  in_line_argn(MACRO_PROT_ARGS)
                                 return(0);                                  return(0);
                         continue;                          continue;
                 } else if (0 == j)                  } else if (0 == j)
                        if ( ! mdoc_elem_alloc(mdoc, line, la, tok, arg))                         if ( ! mdoc_elem_alloc(mdoc, line, ppos, tok, arg))
                                return(0);                                 return(0);
   
                 if (j == maxargs && ! flushed) {                  if (j == maxargs && ! flushed) {
Line 1608  in_line_argn(MACRO_PROT_ARGS)
Line 1624  in_line_argn(MACRO_PROT_ARGS)
                 j++;                  j++;
         }          }
   
         if (0 == j && ! mdoc_elem_alloc(mdoc, line, la, tok, arg))          if (0 == j && ! mdoc_elem_alloc(mdoc, line, ppos, tok, arg))
                return(0);                 return(0);
   
         /* Close out in a consistent state. */          /* Close out in a consistent state. */
Line 1715  ctx_synopsis(MACRO_PROT_ARGS)
Line 1731  ctx_synopsis(MACRO_PROT_ARGS)
         return(blk_part_imp(mdoc, tok, line, ppos, pos, buf));          return(blk_part_imp(mdoc, tok, line, ppos, pos, buf));
 }  }
   
 static int  
 obsolete(MACRO_PROT_ARGS)  
 {  
   
         mdoc_pmsg(mdoc, line, ppos, MANDOCERR_MACROOBS);  
         return(1);  
 }  
   
 /*  /*
  * Phrases occur within `Bl -column' entries, separated by `Ta' or tabs.   * Phrases occur within `Bl -column' entries, separated by `Ta' or tabs.
  * They're unusual because they're basically free-form text until a   * They're unusual because they're basically free-form text until a
Line 1776  phrase_ta(MACRO_PROT_ARGS)
Line 1784  phrase_ta(MACRO_PROT_ARGS)
         while (NULL != n && MDOC_Bl != n->tok)          while (NULL != n && MDOC_Bl != n->tok)
                 n = n->parent;                  n = n->parent;
         if (NULL == n || LIST_column != n->norm->Bl.type) {          if (NULL == n || LIST_column != n->norm->Bl.type) {
                 mdoc_pmsg(mdoc, line, ppos, MANDOCERR_STRAYTA);                  mandoc_msg(MANDOCERR_TA_STRAY, mdoc->parse,
                       line, ppos, NULL);
                 return(1);                  return(1);
         }          }
   

Legend:
Removed from v.1.131  
changed lines
  Added in v.1.138

CVSweb