[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.189 and 1.192

version 1.189, 2015/04/18 16:06:40 version 1.192, 2015/04/19 14:25:41
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 231  mdoc_macroend(struct roff_man *mdoc)
Line 232  mdoc_macroend(struct roff_man *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 roff_man *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 (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)
Line 248  lookup(struct roff_man *mdoc, int from, int line, int 
Line 249  lookup(struct roff_man *mdoc, int from, int line, int 
                                     mdoc->parse, line, ppos, p);                                      mdoc->parse, line, ppos, p);
                 }                  }
         }          }
         return(MDOC_MAX);          return(TOKEN_NONE);
 }  }
   
 /*  /*
Line 292  rew_pending(struct roff_man *mdoc, const struct roff_n
Line 293  rew_pending(struct roff_man *mdoc, const struct roff_n
   
                 switch (n->type) {                  switch (n->type) {
                 case ROFFT_HEAD:                  case ROFFT_HEAD:
                         mdoc_body_alloc(mdoc, n->line, n->pos, n->tok);                          roff_body_alloc(mdoc, n->line, n->pos, n->tok);
                         return;                          return;
                 case ROFFT_BLOCK:                  case ROFFT_BLOCK:
                         break;                          break;
Line 431  dword(struct roff_man *mdoc, int line, int col, const 
Line 432  dword(struct roff_man *mdoc, int line, int col, const 
             ! (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 464  append_delims(struct roff_man *mdoc, int line, int *po
Line 465  append_delims(struct roff_man *mdoc, int line, int *po
   
         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 497  macro_or_word(MACRO_PROT_ARGS, int parsed)
Line 499  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 676  blk_exp_close(MACRO_PROT_ARGS)
Line 678  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 780  in_line(MACRO_PROT_ARGS)
Line 782  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 789  in_line(MACRO_PROT_ARGS)
Line 791  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 1022  blk_full(MACRO_PROT_ARGS)
Line 1024  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)
Line 1047  blk_full(MACRO_PROT_ARGS)
Line 1049  blk_full(MACRO_PROT_ARGS)
                          */                           */
                         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);
                         break;                          break;
                 }                  }
                 if (tok == MDOC_Bd || tok == MDOC_Bk) {                  if (tok == MDOC_Bd || tok == MDOC_Bk) {
Line 1082  blk_full(MACRO_PROT_ARGS)
Line 1084  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_PEND ||
Line 1094  blk_full(MACRO_PROT_ARGS)
Line 1096  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 phrases: set whether we're in a                           * Process phrases: set whether we're in a
Line 1106  blk_full(MACRO_PROT_ARGS)
Line 1108  blk_full(MACRO_PROT_ARGS)
                                 mdoc->flags |= MDOC_PPHRASE;                                  mdoc->flags |= MDOC_PPHRASE;
                         if (ac == ARGS_PEND && lac == ARGS_PPHRASE)                          if (ac == ARGS_PEND && lac == ARGS_PPHRASE)
                                 mdoc->flags |= MDOC_PPHRASE;                                  mdoc->flags |= MDOC_PPHRASE;
                         parse_rest(mdoc, MDOC_MAX, line, &la, buf);                          parse_rest(mdoc, TOKEN_NONE, line, &la, buf);
                         mdoc->flags &= ~MDOC_PPHRASE;                          mdoc->flags &= ~MDOC_PPHRASE;
                         continue;                          continue;
                 }                  }
Line 1118  blk_full(MACRO_PROT_ARGS)
Line 1120  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 1129  blk_full(MACRO_PROT_ARGS)
Line 1131  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 1160  blk_part_imp(MACRO_PROT_ARGS)
Line 1162  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 1181  blk_part_imp(MACRO_PROT_ARGS)
Line 1183  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 1238  blk_part_exp(MACRO_PROT_ARGS)
Line 1240  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 1254  blk_part_exp(MACRO_PROT_ARGS)
Line 1256  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 1336  in_line_argn(MACRO_PROT_ARGS)
Line 1338  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 1471  phrase_ta(MACRO_PROT_ARGS)
Line 1473  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.189  
changed lines
  Added in v.1.192

CVSweb