[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.188 and 1.205

version 1.188, 2015/04/05 23:04:41 version 1.205, 2015/10/17 00:21:07
Line 30 
Line 30 
 #include "roff.h"  #include "roff.h"
 #include "mdoc.h"  #include "mdoc.h"
 #include "libmandoc.h"  #include "libmandoc.h"
   #include "roff_int.h"
 #include "libmdoc.h"  #include "libmdoc.h"
   
 static  void            blk_full(MACRO_PROT_ARGS);  static  void            blk_full(MACRO_PROT_ARGS);
Line 42  static void  in_line_argn(MACRO_PROT_ARGS);
Line 43  static void  in_line_argn(MACRO_PROT_ARGS);
 static  void            in_line(MACRO_PROT_ARGS);  static  void            in_line(MACRO_PROT_ARGS);
 static  void            phrase_ta(MACRO_PROT_ARGS);  static  void            phrase_ta(MACRO_PROT_ARGS);
   
 static  void            append_delims(struct mdoc *, int, int *, char *);  static  void            append_delims(struct roff_man *, int, int *, char *);
 static  void            dword(struct mdoc *, int, int, const char *,  static  void            dword(struct roff_man *, int, int, const char *,
                                 enum mdelim, int);                                  enum mdelim, int);
 static  int             find_pending(struct mdoc *, int, int, int,  static  int             find_pending(struct roff_man *, int, int, int,
                                 struct roff_node *);                                  struct roff_node *);
 static  int             lookup(struct mdoc *, int, int, int, const char *);  static  int             lookup(struct roff_man *, int, int, int, const char *);
 static  int             macro_or_word(MACRO_PROT_ARGS, int);  static  int             macro_or_word(MACRO_PROT_ARGS, int);
 static  int             parse_rest(struct mdoc *, int, int, int *, char *);  static  int             parse_rest(struct roff_man *, int, int, int *, char *);
 static  int             rew_alt(int);  static  int             rew_alt(int);
 static  void            rew_elem(struct mdoc *, int);  static  void            rew_elem(struct roff_man *, int);
 static  void            rew_last(struct mdoc *, const struct roff_node *);  static  void            rew_last(struct roff_man *, const struct roff_node *);
 static  void            rew_pending(struct mdoc *, const struct roff_node *);  static  void            rew_pending(struct roff_man *,
                                   const struct roff_node *);
   
 const   struct mdoc_macro __mdoc_macros[MDOC_MAX] = {  const   struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { in_line_argn, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ap */          { in_line_argn, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ap */
Line 208  const struct mdoc_macro * const mdoc_macros = __mdoc_m
Line 210  const struct mdoc_macro * const mdoc_macros = __mdoc_m
  * are errors.   * are errors.
  */   */
 void  void
 mdoc_macroend(struct mdoc *mdoc)  mdoc_endparse(struct roff_man *mdoc)
 {  {
         struct roff_node *n;          struct roff_node *n;
   
Line 230  mdoc_macroend(struct mdoc *mdoc)
Line 232  mdoc_macroend(struct mdoc *mdoc)
   
 /*  /*
  * Look up the macro at *p called by "from",   * Look up the macro at *p called by "from",
  * or as a line macro if from == MDOC_MAX.   * or as a line macro if from == TOKEN_NONE.
  */   */
 static int  static int
 lookup(struct mdoc *mdoc, int from, int line, int ppos, const char *p)  lookup(struct roff_man *mdoc, int from, int line, int ppos, const char *p)
 {  {
         int      res;          int      res;
   
         if (from == MDOC_MAX || mdoc_macros[from].flags & MDOC_PARSED) {          if (mdoc->flags & MDOC_PHRASEQF) {
                   mdoc->flags &= ~MDOC_PHRASEQF;
                   return TOKEN_NONE;
           }
           if (from == TOKEN_NONE || mdoc_macros[from].flags & MDOC_PARSED) {
                 res = mdoc_hash_find(p);                  res = mdoc_hash_find(p);
                 if (res != MDOC_MAX) {                  if (res != TOKEN_NONE) {
                         if (mdoc_macros[res].flags & MDOC_CALLABLE)                          if (mdoc_macros[res].flags & MDOC_CALLABLE)
                                 return(res);                                  return res;
                         if (res != MDOC_br && res != MDOC_sp && res != MDOC_ll)                          if (res != MDOC_br && res != MDOC_sp && res != MDOC_ll)
                                 mandoc_msg(MANDOCERR_MACRO_CALL,                                  mandoc_msg(MANDOCERR_MACRO_CALL,
                                     mdoc->parse, line, ppos, p);                                      mdoc->parse, line, ppos, p);
                 }                  }
         }          }
         return(MDOC_MAX);          return TOKEN_NONE;
 }  }
   
 /*  /*
  * Rewind up to and including a specific node.   * Rewind up to and including a specific node.
  */   */
 static void  static void
 rew_last(struct mdoc *mdoc, const struct roff_node *to)  rew_last(struct roff_man *mdoc, const struct roff_node *to)
 {  {
         struct roff_node *n, *np;          struct roff_node        *np;
   
         if (to->flags & MDOC_VALID)          if (to->flags & MDOC_VALID)
                 return;                  return;
   
         mdoc->next = MDOC_NEXT_SIBLING;  
         while (mdoc->last != to) {          while (mdoc->last != to) {
                 /*                  /*
                  * Save the parent here, because we may delete the                   * Save the parent here, because we may delete the
Line 271  rew_last(struct mdoc *mdoc, const struct roff_node *to
Line 276  rew_last(struct mdoc *mdoc, const struct roff_node *to
                  */                   */
                 np = mdoc->last->parent;                  np = mdoc->last->parent;
                 mdoc_valid_post(mdoc);                  mdoc_valid_post(mdoc);
                 n = mdoc->last;  
                 mdoc->last = np;                  mdoc->last = np;
                 assert(mdoc->last);                  assert(mdoc->last);
                 mdoc->last->last = n;  
         }          }
           mdoc->next = ROFF_NEXT_SIBLING;
         mdoc_valid_post(mdoc);          mdoc_valid_post(mdoc);
 }  }
   
Line 283  rew_last(struct mdoc *mdoc, const struct roff_node *to
Line 287  rew_last(struct mdoc *mdoc, const struct roff_node *to
  * Rewind up to a specific block, including all blocks that broke it.   * Rewind up to a specific block, including all blocks that broke it.
  */   */
 static void  static void
 rew_pending(struct mdoc *mdoc, const struct roff_node *n)  rew_pending(struct roff_man *mdoc, const struct roff_node *n)
 {  {
   
         for (;;) {          for (;;) {
                 rew_last(mdoc, n);                  rew_last(mdoc, n);
   
                 switch (n->type) {                  if (mdoc->last == n) {
                 case ROFFT_HEAD:                          switch (n->type) {
                         mdoc_body_alloc(mdoc, n->line, n->pos, n->tok);                          case ROFFT_HEAD:
                         return;                                  roff_body_alloc(mdoc, n->line, n->pos,
                 case ROFFT_BLOCK:                                      n->tok);
                         break;                                  return;
                 default:                          case ROFFT_BLOCK:
                         return;                                  break;
                 }                          default:
                                   return;
                           }
                           if ( ! (n->flags & MDOC_BROKEN))
                                   return;
                   } else
                           n = mdoc->last;
   
                 if ( ! (n->flags & MDOC_BROKEN))  
                         return;  
   
                 for (;;) {                  for (;;) {
                         if ((n = n->parent) == NULL)                          if ((n = n->parent) == NULL)
                                 return;                                  return;
Line 326  rew_alt(int tok)
Line 333  rew_alt(int tok)
 {  {
         switch (tok) {          switch (tok) {
         case MDOC_Ac:          case MDOC_Ac:
                 return(MDOC_Ao);                  return MDOC_Ao;
         case MDOC_Bc:          case MDOC_Bc:
                 return(MDOC_Bo);                  return MDOC_Bo;
         case MDOC_Brc:          case MDOC_Brc:
                 return(MDOC_Bro);                  return MDOC_Bro;
         case MDOC_Dc:          case MDOC_Dc:
                 return(MDOC_Do);                  return MDOC_Do;
         case MDOC_Ec:          case MDOC_Ec:
                 return(MDOC_Eo);                  return MDOC_Eo;
         case MDOC_Ed:          case MDOC_Ed:
                 return(MDOC_Bd);                  return MDOC_Bd;
         case MDOC_Ef:          case MDOC_Ef:
                 return(MDOC_Bf);                  return MDOC_Bf;
         case MDOC_Ek:          case MDOC_Ek:
                 return(MDOC_Bk);                  return MDOC_Bk;
         case MDOC_El:          case MDOC_El:
                 return(MDOC_Bl);                  return MDOC_Bl;
         case MDOC_Fc:          case MDOC_Fc:
                 return(MDOC_Fo);                  return MDOC_Fo;
         case MDOC_Oc:          case MDOC_Oc:
                 return(MDOC_Oo);                  return MDOC_Oo;
         case MDOC_Pc:          case MDOC_Pc:
                 return(MDOC_Po);                  return MDOC_Po;
         case MDOC_Qc:          case MDOC_Qc:
                 return(MDOC_Qo);                  return MDOC_Qo;
         case MDOC_Re:          case MDOC_Re:
                 return(MDOC_Rs);                  return MDOC_Rs;
         case MDOC_Sc:          case MDOC_Sc:
                 return(MDOC_So);                  return MDOC_So;
         case MDOC_Xc:          case MDOC_Xc:
                 return(MDOC_Xo);                  return MDOC_Xo;
         default:          default:
                 return(tok);                  return tok;
         }          }
         /* NOTREACHED */  
 }  }
   
 static void  static void
 rew_elem(struct mdoc *mdoc, int tok)  rew_elem(struct roff_man *mdoc, int tok)
 {  {
         struct roff_node *n;          struct roff_node *n;
   
Line 382  rew_elem(struct mdoc *mdoc, int tok)
Line 388  rew_elem(struct mdoc *mdoc, int tok)
  * the rew_pending() call closing out the sub-block.   * the rew_pending() call closing out the sub-block.
  */   */
 static int  static int
 find_pending(struct mdoc *mdoc, int tok, int line, int ppos,  find_pending(struct roff_man *mdoc, int tok, int line, int ppos,
         struct roff_node *target)          struct roff_node *target)
 {  {
         struct roff_node        *n;          struct roff_node        *n;
Line 411  find_pending(struct mdoc *mdoc, int tok, int line, int
Line 417  find_pending(struct mdoc *mdoc, int tok, int line, int
                         }                          }
                 }                  }
         }          }
         return(irc);          return irc;
 }  }
   
 /*  /*
Line 419  find_pending(struct mdoc *mdoc, int tok, int line, int
Line 425  find_pending(struct mdoc *mdoc, int tok, int line, int
  * Punctuation consists of those tokens found in mdoc_isdelim().   * Punctuation consists of those tokens found in mdoc_isdelim().
  */   */
 static void  static void
 dword(struct mdoc *mdoc, int line, int col, const char *p,  dword(struct roff_man *mdoc, int line, int col, const char *p,
                 enum mdelim d, int may_append)                  enum mdelim d, int may_append)
 {  {
   
Line 430  dword(struct mdoc *mdoc, int line, int col, const char
Line 436  dword(struct mdoc *mdoc, int line, int col, const char
             ! (mdoc->flags & (MDOC_SYNOPSIS | MDOC_KEEP | MDOC_SMOFF)) &&              ! (mdoc->flags & (MDOC_SYNOPSIS | MDOC_KEEP | MDOC_SMOFF)) &&
             d == DELIM_NONE && mdoc->last->type == ROFFT_TEXT &&              d == DELIM_NONE && mdoc->last->type == ROFFT_TEXT &&
             mdoc_isdelim(mdoc->last->string) == DELIM_NONE) {              mdoc_isdelim(mdoc->last->string) == DELIM_NONE) {
                 mdoc_word_append(mdoc, p);                  roff_word_append(mdoc, p);
                 return;                  return;
         }          }
   
         mdoc_word_alloc(mdoc, line, col, p);          roff_word_alloc(mdoc, line, col, p);
   
         /*          /*
          * If the word consists of a bare delimiter,           * If the word consists of a bare delimiter,
Line 453  dword(struct mdoc *mdoc, int line, int col, const char
Line 459  dword(struct mdoc *mdoc, int line, int col, const char
 }  }
   
 static void  static void
 append_delims(struct mdoc *mdoc, int line, int *pos, char *buf)  append_delims(struct roff_man *mdoc, int line, int *pos, char *buf)
 {  {
         char            *p;          char            *p;
         int              la;          int              la;
Line 463  append_delims(struct mdoc *mdoc, int line, int *pos, c
Line 469  append_delims(struct mdoc *mdoc, int line, int *pos, c
   
         for (;;) {          for (;;) {
                 la = *pos;                  la = *pos;
                 if (mdoc_args(mdoc, line, pos, buf, MDOC_MAX, &p) == ARGS_EOLN)                  if (mdoc_args(mdoc, line, pos, buf, TOKEN_NONE, &p) ==
                       ARGS_EOLN)
                         break;                          break;
                 dword(mdoc, line, la, p, DELIM_MAX, 1);                  dword(mdoc, line, la, p, DELIM_MAX, 1);
   
Line 496  macro_or_word(MACRO_PROT_ARGS, int parsed)
Line 503  macro_or_word(MACRO_PROT_ARGS, int parsed)
         int              ntok;          int              ntok;
   
         p = buf + ppos;          p = buf + ppos;
         ntok = MDOC_MAX;          ntok = TOKEN_NONE;
         if (*p == '"')          if (*p == '"')
                 p++;                  p++;
         else if (parsed && ! (mdoc->flags & MDOC_PHRASELIT))          else if (parsed && ! (mdoc->flags & MDOC_PHRASELIT))
                 ntok = lookup(mdoc, tok, line, ppos, p);                  ntok = lookup(mdoc, tok, line, ppos, p);
   
         if (ntok == MDOC_MAX) {          if (ntok == TOKEN_NONE) {
                 dword(mdoc, line, ppos, p, DELIM_MAX, tok == MDOC_MAX ||                  dword(mdoc, line, ppos, p, DELIM_MAX, tok == TOKEN_NONE ||
                     mdoc_macros[tok].flags & MDOC_JOIN);                      mdoc_macros[tok].flags & MDOC_JOIN);
                 return(0);                  return 0;
         } else {          } else {
                 if (mdoc_macros[tok].fp == in_line_eoln)                  if (mdoc_macros[tok].fp == in_line_eoln)
                         rew_elem(mdoc, tok);                          rew_elem(mdoc, tok);
                 mdoc_macro(mdoc, ntok, line, ppos, pos, buf);                  mdoc_macro(mdoc, ntok, line, ppos, pos, buf);
                 if (tok == MDOC_MAX)                  if (tok == TOKEN_NONE)
                         append_delims(mdoc, line, pos, buf);                          append_delims(mdoc, line, pos, buf);
                 return(1);                  return 1;
         }          }
 }  }
   
Line 617  blk_exp_close(MACRO_PROT_ARGS)
Line 624  blk_exp_close(MACRO_PROT_ARGS)
                          */                           */
   
                         if (maxargs)                          if (maxargs)
                                 mdoc->next = MDOC_NEXT_CHILD;                                  mdoc->next = ROFF_NEXT_CHILD;
                         break;                          break;
                 }                  }
   
Line 638  blk_exp_close(MACRO_PROT_ARGS)
Line 645  blk_exp_close(MACRO_PROT_ARGS)
         if (body == NULL) {          if (body == NULL) {
                 mandoc_msg(MANDOCERR_BLK_NOTOPEN, mdoc->parse,                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, mdoc->parse,
                     line, ppos, mdoc_macronames[tok]);                      line, ppos, mdoc_macronames[tok]);
                   if (later != NULL)
                           later->flags &= ~MDOC_BROKEN;
                 if (maxargs && endbody == NULL) {                  if (maxargs && endbody == NULL) {
                         /*                          /*
                          * Stray .Ec without previous .Eo:                           * Stray .Ec without previous .Eo:
                          * Break the output line, keep the arguments.                           * Break the output line, keep the arguments.
                          */                           */
                         mdoc_elem_alloc(mdoc, line, ppos, MDOC_br, NULL);                          roff_elem_alloc(mdoc, line, ppos, MDOC_br);
                         rew_elem(mdoc, MDOC_br);                          rew_elem(mdoc, MDOC_br);
                 }                  }
         } else if (endbody == NULL) {          } else if (endbody == NULL) {
Line 665  blk_exp_close(MACRO_PROT_ARGS)
Line 674  blk_exp_close(MACRO_PROT_ARGS)
   
         if (endbody != NULL)          if (endbody != NULL)
                 n = endbody;                  n = endbody;
   
           ntok = TOKEN_NONE;
         for (j = 0; ; j++) {          for (j = 0; ; j++) {
                 lastarg = *pos;                  lastarg = *pos;
   
Line 675  blk_exp_close(MACRO_PROT_ARGS)
Line 686  blk_exp_close(MACRO_PROT_ARGS)
                 if (ac == ARGS_PUNCT || ac == ARGS_EOLN)                  if (ac == ARGS_PUNCT || ac == ARGS_EOLN)
                         break;                          break;
   
                 ntok = ac == ARGS_QWORD ? MDOC_MAX :                  ntok = ac == ARGS_QWORD ? TOKEN_NONE :
                     lookup(mdoc, tok, line, lastarg, p);                      lookup(mdoc, tok, line, lastarg, p);
   
                 if (ntok == MDOC_MAX) {                  if (ntok == TOKEN_NONE) {
                         dword(mdoc, line, lastarg, p, DELIM_MAX,                          dword(mdoc, line, lastarg, p, DELIM_MAX,
                             MDOC_JOIN & mdoc_macros[tok].flags);                              MDOC_JOIN & mdoc_macros[tok].flags);
                         continue;                          continue;
Line 692  blk_exp_close(MACRO_PROT_ARGS)
Line 703  blk_exp_close(MACRO_PROT_ARGS)
         }          }
   
         if (n != NULL) {          if (n != NULL) {
                 if (n != mdoc->last && n->flags & MDOC_BROKEN) {                  if (ntok != TOKEN_NONE && n->flags & MDOC_BROKEN) {
                         target = n;                          target = n;
                         do                          do
                                 target = target->parent;                                  target = target->parent;
Line 727  in_line(MACRO_PROT_ARGS)
Line 738  in_line(MACRO_PROT_ARGS)
   
         switch (tok) {          switch (tok) {
         case MDOC_An:          case MDOC_An:
                 /* FALLTHROUGH */  
         case MDOC_Ar:          case MDOC_Ar:
                 /* FALLTHROUGH */  
         case MDOC_Fl:          case MDOC_Fl:
                 /* FALLTHROUGH */  
         case MDOC_Mt:          case MDOC_Mt:
                 /* FALLTHROUGH */  
         case MDOC_Nm:          case MDOC_Nm:
                 /* FALLTHROUGH */  
         case MDOC_Pa:          case MDOC_Pa:
                 nc = 1;                  nc = 1;
                 break;                  break;
Line 779  in_line(MACRO_PROT_ARGS)
Line 785  in_line(MACRO_PROT_ARGS)
                 }                  }
   
                 ntok = (ac == ARGS_QWORD || (tok == MDOC_Fn && !cnt)) ?                  ntok = (ac == ARGS_QWORD || (tok == MDOC_Fn && !cnt)) ?
                     MDOC_MAX : lookup(mdoc, tok, line, la, p);                      TOKEN_NONE : lookup(mdoc, tok, line, la, p);
   
                 /*                  /*
                  * In this case, we've located a submacro and must                   * In this case, we've located a submacro and must
Line 788  in_line(MACRO_PROT_ARGS)
Line 794  in_line(MACRO_PROT_ARGS)
                  * or raise a warning.                   * or raise a warning.
                  */                   */
   
                 if (ntok != MDOC_MAX) {                  if (ntok != TOKEN_NONE) {
                         if (scope)                          if (scope)
                                 rew_elem(mdoc, tok);                                  rew_elem(mdoc, tok);
                         if (nc && ! cnt) {                          if (nc && ! cnt) {
Line 939  blk_full(MACRO_PROT_ARGS)
Line 945  blk_full(MACRO_PROT_ARGS)
                         if (mdoc_macros[n->tok].flags & MDOC_EXPLICIT) {                          if (mdoc_macros[n->tok].flags & MDOC_EXPLICIT) {
                                 switch (tok) {                                  switch (tok) {
                                 case MDOC_Sh:                                  case MDOC_Sh:
                                         /* FALLTHROUGH */  
                                 case MDOC_Ss:                                  case MDOC_Ss:
                                         mandoc_vmsg(MANDOCERR_BLK_BROKEN,                                          mandoc_vmsg(MANDOCERR_BLK_BROKEN,
                                             mdoc->parse, line, ppos,                                              mdoc->parse, line, ppos,
Line 987  blk_full(MACRO_PROT_ARGS)
Line 992  blk_full(MACRO_PROT_ARGS)
                 if (tok == MDOC_It && (n == NULL || n->tok != MDOC_Bl)) {                  if (tok == MDOC_It && (n == NULL || n->tok != MDOC_Bl)) {
                         mandoc_vmsg(MANDOCERR_IT_STRAY, mdoc->parse,                          mandoc_vmsg(MANDOCERR_IT_STRAY, mdoc->parse,
                             line, ppos, "It %s", buf + *pos);                              line, ppos, "It %s", buf + *pos);
                         mdoc_elem_alloc(mdoc, line, ppos, MDOC_br, NULL);                          roff_elem_alloc(mdoc, line, ppos, MDOC_br);
                         rew_elem(mdoc, MDOC_br);                          rew_elem(mdoc, MDOC_br);
                         return;                          return;
                 }                  }
Line 1021  blk_full(MACRO_PROT_ARGS)
Line 1026  blk_full(MACRO_PROT_ARGS)
          */           */
   
         if (tok == MDOC_Nd) {          if (tok == MDOC_Nd) {
                 head = mdoc_head_alloc(mdoc, line, ppos, tok);                  head = roff_head_alloc(mdoc, line, ppos, tok);
                 rew_last(mdoc, head);                  rew_last(mdoc, head);
                 body = mdoc_body_alloc(mdoc, line, ppos, tok);                  body = roff_body_alloc(mdoc, line, ppos, tok);
         }          }
   
         if (tok == MDOC_Bk)          if (tok == MDOC_Bk)
                 mdoc->flags |= MDOC_KEEP;                  mdoc->flags |= MDOC_KEEP;
   
         ac = ARGS_PEND;          ac = ARGS_EOLN;
         for (;;) {          for (;;) {
   
                   /*
                    * If we are right after a tab character,
                    * do not parse the first word for macros.
                    */
   
                   if (mdoc->flags & MDOC_PHRASEQN) {
                           mdoc->flags &= ~MDOC_PHRASEQN;
                           mdoc->flags |= MDOC_PHRASEQF;
                   }
   
                 la = *pos;                  la = *pos;
                 lac = ac;                  lac = ac;
                 ac = mdoc_args(mdoc, line, pos, buf, tok, &p);                  ac = mdoc_args(mdoc, line, pos, buf, tok, &p);
                 if (ac == ARGS_EOLN) {                  if (ac == ARGS_EOLN) {
                         if (lac != ARGS_PPHRASE && lac != ARGS_PHRASE)                          if (lac != ARGS_PHRASE ||
                               ! (mdoc->flags & MDOC_PHRASEQF))
                                 break;                                  break;
   
                         /*                          /*
                          * This is necessary: if the last token on a                           * This line ends in a tab; start the next
                          * line is a `Ta' or tab, then we'll get                           * column now, with a leading blank.
                          * ARGS_EOLN, so we must be smart enough to  
                          * reopen our scope if the last parse was a  
                          * phrase or partial phrase.  
                          */                           */
   
                         if (body != NULL)                          if (body != NULL)
                                 rew_last(mdoc, body);                                  rew_last(mdoc, body);
                         body = mdoc_body_alloc(mdoc, line, ppos, tok);                          body = roff_body_alloc(mdoc, line, ppos, tok);
                           roff_word_alloc(mdoc, line, ppos, "\\&");
                         break;                          break;
                 }                  }
   
                 if (tok == MDOC_Bd || tok == MDOC_Bk) {                  if (tok == MDOC_Bd || tok == MDOC_Bk) {
                         mandoc_vmsg(MANDOCERR_ARG_EXCESS,                          mandoc_vmsg(MANDOCERR_ARG_EXCESS,
                             mdoc->parse, line, la, "%s ... %s",                              mdoc->parse, line, la, "%s ... %s",
Line 1069  blk_full(MACRO_PROT_ARGS)
Line 1087  blk_full(MACRO_PROT_ARGS)
                  */                   */
   
                 if (head == NULL &&                  if (head == NULL &&
                     ac != ARGS_PEND &&  
                     ac != ARGS_PHRASE &&                      ac != ARGS_PHRASE &&
                     ac != ARGS_PPHRASE &&  
                     ac != ARGS_QWORD &&                      ac != ARGS_QWORD &&
                     mdoc_isdelim(p) == DELIM_OPEN) {                      mdoc_isdelim(p) == DELIM_OPEN) {
                         dword(mdoc, line, la, p, DELIM_OPEN, 0);                          dword(mdoc, line, la, p, DELIM_OPEN, 0);
Line 1081  blk_full(MACRO_PROT_ARGS)
Line 1097  blk_full(MACRO_PROT_ARGS)
                 /* Open a head if one hasn't been opened. */                  /* Open a head if one hasn't been opened. */
   
                 if (head == NULL)                  if (head == NULL)
                         head = mdoc_head_alloc(mdoc, line, ppos, tok);                          head = roff_head_alloc(mdoc, line, ppos, tok);
   
                 if (ac == ARGS_PHRASE ||                  if (ac == ARGS_PHRASE) {
                     ac == ARGS_PEND ||  
                     ac == ARGS_PPHRASE) {  
   
                         /*                          /*
                          * If we haven't opened a body yet, rewind the                           * If we haven't opened a body yet, rewind the
Line 1093  blk_full(MACRO_PROT_ARGS)
Line 1107  blk_full(MACRO_PROT_ARGS)
                          */                           */
   
                         rew_last(mdoc, body == NULL ? head : body);                          rew_last(mdoc, body == NULL ? head : body);
                         body = mdoc_body_alloc(mdoc, line, ppos, tok);                          body = roff_body_alloc(mdoc, line, ppos, tok);
   
                         /*                          /* Process to the tab or to the end of the line. */
                          * Process phrases: set whether we're in a  
                          * partial-phrase (this effects line handling)  
                          * then call down into the phrase parser.  
                          */  
   
                         if (ac == ARGS_PPHRASE)                          mdoc->flags |= MDOC_PHRASE;
                                 mdoc->flags |= MDOC_PPHRASE;                          parse_rest(mdoc, TOKEN_NONE, line, &la, buf);
                         if (ac == ARGS_PEND && lac == ARGS_PPHRASE)                          mdoc->flags &= ~MDOC_PHRASE;
                                 mdoc->flags |= MDOC_PPHRASE;  
                         parse_rest(mdoc, MDOC_MAX, line, &la, buf);                          /* There may have been `Ta' macros. */
                         mdoc->flags &= ~MDOC_PPHRASE;  
                           while (body->next != NULL)
                                   body = body->next;
                         continue;                          continue;
                 }                  }
   
Line 1117  blk_full(MACRO_PROT_ARGS)
Line 1129  blk_full(MACRO_PROT_ARGS)
         if (blk->flags & MDOC_VALID)          if (blk->flags & MDOC_VALID)
                 return;                  return;
         if (head == NULL)          if (head == NULL)
                 head = mdoc_head_alloc(mdoc, line, ppos, tok);                  head = roff_head_alloc(mdoc, line, ppos, tok);
         if (nl && tok != MDOC_Bd && tok != MDOC_Bl && tok != MDOC_Rs)          if (nl && tok != MDOC_Bd && tok != MDOC_Bl && tok != MDOC_Rs)
                 append_delims(mdoc, line, pos, buf);                  append_delims(mdoc, line, pos, buf);
         if (body != NULL)          if (body != NULL)
Line 1128  blk_full(MACRO_PROT_ARGS)
Line 1140  blk_full(MACRO_PROT_ARGS)
         /* Close out scopes to remain in a consistent state. */          /* Close out scopes to remain in a consistent state. */
   
         rew_last(mdoc, head);          rew_last(mdoc, head);
         body = mdoc_body_alloc(mdoc, line, ppos, tok);          body = roff_body_alloc(mdoc, line, ppos, tok);
 out:  out:
         if (mdoc->flags & MDOC_FREECOL) {          if (mdoc->flags & MDOC_FREECOL) {
                 rew_last(mdoc, body);                  rew_last(mdoc, body);
Line 1159  blk_part_imp(MACRO_PROT_ARGS)
Line 1171  blk_part_imp(MACRO_PROT_ARGS)
          */           */
   
         blk = mdoc_block_alloc(mdoc, line, ppos, tok, NULL);          blk = mdoc_block_alloc(mdoc, line, ppos, tok, NULL);
         rew_last(mdoc, mdoc_head_alloc(mdoc, line, ppos, tok));          rew_last(mdoc, roff_head_alloc(mdoc, line, ppos, tok));
   
         /*          /*
          * Open the body scope "on-demand", that is, after we've           * Open the body scope "on-demand", that is, after we've
Line 1180  blk_part_imp(MACRO_PROT_ARGS)
Line 1192  blk_part_imp(MACRO_PROT_ARGS)
                 }                  }
   
                 if (body == NULL)                  if (body == NULL)
                         body = mdoc_body_alloc(mdoc, line, ppos, tok);                          body = roff_body_alloc(mdoc, line, ppos, tok);
   
                 if (macro_or_word(mdoc, tok, line, la, pos, buf, 1))                  if (macro_or_word(mdoc, tok, line, la, pos, buf, 1))
                         break;                          break;
         }          }
         if (body == NULL)          if (body == NULL)
                 body = mdoc_body_alloc(mdoc, line, ppos, tok);                  body = roff_body_alloc(mdoc, line, ppos, tok);
   
         if (find_pending(mdoc, tok, line, ppos, body))          if (find_pending(mdoc, tok, line, ppos, body))
                 return;                  return;
Line 1220  blk_part_exp(MACRO_PROT_ARGS)
Line 1232  blk_part_exp(MACRO_PROT_ARGS)
          * case of `Eo'); and a body that may be empty.           * case of `Eo'); and a body that may be empty.
          */           */
   
         mdoc_block_alloc(mdoc, line, ppos, tok, NULL);          roff_block_alloc(mdoc, line, ppos, tok);
         head = NULL;          head = NULL;
         for (;;) {          for (;;) {
                 la = *pos;                  la = *pos;
Line 1237  blk_part_exp(MACRO_PROT_ARGS)
Line 1249  blk_part_exp(MACRO_PROT_ARGS)
                 }                  }
   
                 if (head == NULL) {                  if (head == NULL) {
                         head = mdoc_head_alloc(mdoc, line, ppos, tok);                          head = roff_head_alloc(mdoc, line, ppos, tok);
                         if (tok == MDOC_Eo)  /* Not parsed. */                          if (tok == MDOC_Eo)  /* Not parsed. */
                                 dword(mdoc, line, la, p, DELIM_MAX, 0);                                  dword(mdoc, line, la, p, DELIM_MAX, 0);
                         rew_last(mdoc, head);                          rew_last(mdoc, head);
                         mdoc_body_alloc(mdoc, line, ppos, tok);                          roff_body_alloc(mdoc, line, ppos, tok);
                         if (tok == MDOC_Eo)                          if (tok == MDOC_Eo)
                                 continue;                                  continue;
                 }                  }
Line 1253  blk_part_exp(MACRO_PROT_ARGS)
Line 1265  blk_part_exp(MACRO_PROT_ARGS)
         /* Clean-up to leave in a consistent state. */          /* Clean-up to leave in a consistent state. */
   
         if (head == NULL) {          if (head == NULL) {
                 rew_last(mdoc, mdoc_head_alloc(mdoc, line, ppos, tok));                  rew_last(mdoc, roff_head_alloc(mdoc, line, ppos, tok));
                 mdoc_body_alloc(mdoc, line, ppos, tok);                  roff_body_alloc(mdoc, line, ppos, tok);
         }          }
         if (nl)          if (nl)
                 append_delims(mdoc, line, pos, buf);                  append_delims(mdoc, line, pos, buf);
Line 1282  in_line_argn(MACRO_PROT_ARGS)
Line 1294  in_line_argn(MACRO_PROT_ARGS)
   
         switch (tok) {          switch (tok) {
         case MDOC_Ap:          case MDOC_Ap:
                 /* FALLTHROUGH */  
         case MDOC_Ns:          case MDOC_Ns:
                 /* FALLTHROUGH */  
         case MDOC_Ux:          case MDOC_Ux:
                 maxargs = 0;                  maxargs = 0;
                 break;                  break;
         case MDOC_Bx:          case MDOC_Bx:
                 /* FALLTHROUGH */  
         case MDOC_Es:          case MDOC_Es:
                 /* FALLTHROUGH */  
         case MDOC_Xr:          case MDOC_Xr:
                 maxargs = 2;                  maxargs = 2;
                 break;                  break;
Line 1335  in_line_argn(MACRO_PROT_ARGS)
Line 1343  in_line_argn(MACRO_PROT_ARGS)
                 }                  }
   
                 ntok = (ac == ARGS_QWORD || (tok == MDOC_Pf && state == 0)) ?                  ntok = (ac == ARGS_QWORD || (tok == MDOC_Pf && state == 0)) ?
                     MDOC_MAX : lookup(mdoc, tok, line, la, p);                      TOKEN_NONE : lookup(mdoc, tok, line, la, p);
   
                 if (ntok != MDOC_MAX) {                  if (ntok != TOKEN_NONE) {
                         if (state >= 0) {                          if (state >= 0) {
                                 rew_elem(mdoc, tok);                                  rew_elem(mdoc, tok);
                                 state = -2;                                  state = -2;
Line 1386  in_line_eoln(MACRO_PROT_ARGS)
Line 1394  in_line_eoln(MACRO_PROT_ARGS)
         if ((tok == MDOC_Pp || tok == MDOC_Lp) &&          if ((tok == MDOC_Pp || tok == MDOC_Lp) &&
             ! (mdoc->flags & MDOC_SYNOPSIS)) {              ! (mdoc->flags & MDOC_SYNOPSIS)) {
                 n = mdoc->last;                  n = mdoc->last;
                 if (mdoc->next == MDOC_NEXT_SIBLING)                  if (mdoc->next == ROFF_NEXT_SIBLING)
                         n = n->parent;                          n = n->parent;
                 if (n->tok == MDOC_Nm)                  if (n->tok == MDOC_Nm)
                         rew_last(mdoc, mdoc->last->parent);                          rew_last(mdoc, n->parent);
         }          }
   
         if (buf[*pos] == '\0' &&          if (buf[*pos] == '\0' &&
Line 1412  in_line_eoln(MACRO_PROT_ARGS)
Line 1420  in_line_eoln(MACRO_PROT_ARGS)
  * or until the next macro, call that macro, and return 1.   * or until the next macro, call that macro, and return 1.
  */   */
 static int  static int
 parse_rest(struct mdoc *mdoc, int tok, int line, int *pos, char *buf)  parse_rest(struct roff_man *mdoc, int tok, int line, int *pos, char *buf)
 {  {
         int              la;          int              la;
   
         for (;;) {          for (;;) {
                 la = *pos;                  la = *pos;
                 if (mdoc_args(mdoc, line, pos, buf, tok, NULL) == ARGS_EOLN)                  if (mdoc_args(mdoc, line, pos, buf, tok, NULL) == ARGS_EOLN)
                         return(0);                          return 0;
                 if (macro_or_word(mdoc, tok, line, la, pos, buf, 1))                  if (macro_or_word(mdoc, tok, line, la, pos, buf, 1))
                         return(1);                          return 1;
         }          }
 }  }
   
Line 1470  phrase_ta(MACRO_PROT_ARGS)
Line 1478  phrase_ta(MACRO_PROT_ARGS)
         /* Advance to the next column. */          /* Advance to the next column. */
   
         rew_last(mdoc, body);          rew_last(mdoc, body);
         mdoc_body_alloc(mdoc, line, ppos, MDOC_It);          roff_body_alloc(mdoc, line, ppos, MDOC_It);
         parse_rest(mdoc, MDOC_MAX, line, pos, buf);          parse_rest(mdoc, TOKEN_NONE, line, pos, buf);
 }  }

Legend:
Removed from v.1.188  
changed lines
  Added in v.1.205

CVSweb