[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.219 and 1.225

version 1.219, 2017/04/24 23:06:18 version 1.225, 2018/08/17 20:33:37
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2017 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2010, 2012-2018 Ingo Schwarze <schwarze@openbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 60  static void  rew_last(struct roff_man *, const struct 
Line 60  static void  rew_last(struct roff_man *, const struct 
 static  void            rew_pending(struct roff_man *,  static  void            rew_pending(struct roff_man *,
                                 const struct roff_node *);                                  const struct roff_node *);
   
 const   struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_Dd] = {  static const struct mdoc_macro mdoc_macros[MDOC_MAX - MDOC_Dd] = {
         { in_line_eoln, MDOC_PROLOGUE }, /* Dd */          { in_line_eoln, MDOC_PROLOGUE }, /* Dd */
         { in_line_eoln, MDOC_PROLOGUE }, /* Dt */          { in_line_eoln, MDOC_PROLOGUE }, /* Dt */
         { in_line_eoln, MDOC_PROLOGUE }, /* Os */          { in_line_eoln, MDOC_PROLOGUE }, /* Os */
Line 76  const struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_
Line 76  const struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_
         { blk_full, MDOC_PARSED | MDOC_JOIN }, /* It */          { blk_full, MDOC_PARSED | MDOC_JOIN }, /* It */
         { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ad */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ad */
         { in_line, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* An */          { in_line, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* An */
         { in_line_argn, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ap */          { in_line_argn, MDOC_CALLABLE | MDOC_PARSED |
                           MDOC_IGNDELIM | MDOC_JOIN }, /* Ap */
         { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ar */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ar */
         { in_line, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Cd */          { in_line, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Cd */
         { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Cm */          { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Cm */
Line 197  const struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_
Line 198  const struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_
         { blk_part_imp, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* 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 }, /* sp */  
         { in_line_eoln, 0 }, /* %U */          { in_line_eoln, 0 }, /* %U */
         { phrase_ta, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ta */          { phrase_ta, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ta */
         { in_line_eoln, MDOC_PROLOGUE }, /* ll */  
 };  };
 const   struct mdoc_macro *const mdoc_macros = __mdoc_macros - MDOC_Dd;  
   
   
   const struct mdoc_macro *
   mdoc_macro(enum roff_tok tok)
   {
           assert(tok >= MDOC_Dd && tok < MDOC_MAX);
           return mdoc_macros + (tok - MDOC_Dd);
   }
   
 /*  /*
  * This is called at the end of parsing.  It must traverse up the tree,   * This is called at the end of parsing.  It must traverse up the tree,
  * closing out open [implicit] scopes.  Obviously, open explicit scopes   * closing out open [implicit] scopes.  Obviously, open explicit scopes
Line 223  mdoc_endparse(struct roff_man *mdoc)
Line 227  mdoc_endparse(struct roff_man *mdoc)
   
         for ( ; n; n = n->parent)          for ( ; n; n = n->parent)
                 if (n->type == ROFFT_BLOCK &&                  if (n->type == ROFFT_BLOCK &&
                     mdoc_macros[n->tok].flags & MDOC_EXPLICIT)                      mdoc_macro(n->tok)->flags & MDOC_EXPLICIT)
                         mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse,                          mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse,
                             n->line, n->pos, roff_name[n->tok]);                              n->line, n->pos, roff_name[n->tok]);
   
Line 246  lookup(struct roff_man *mdoc, int from, int line, int 
Line 250  lookup(struct roff_man *mdoc, int from, int line, int 
                 mdoc->flags &= ~MDOC_PHRASEQF;                  mdoc->flags &= ~MDOC_PHRASEQF;
                 return TOKEN_NONE;                  return TOKEN_NONE;
         }          }
         if (from == TOKEN_NONE || mdoc_macros[from].flags & MDOC_PARSED) {          if (from == TOKEN_NONE || mdoc_macro(from)->flags & MDOC_PARSED) {
                 res = mdoc_hash_find(p);                  res = roffhash_find(mdoc->mdocmac, p, 0);
                 if (res != TOKEN_NONE) {                  if (res != TOKEN_NONE) {
                         if (mdoc_macros[res].flags & MDOC_CALLABLE)                          if (mdoc_macro(res)->flags & MDOC_CALLABLE)
                                 return res;                                  return res;
                         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 TOKEN_NONE;          return TOKEN_NONE;
Line 412  find_pending(struct roff_man *mdoc, enum roff_tok tok,
Line 415  find_pending(struct roff_man *mdoc, enum roff_tok tok,
                 if (n->flags & NODE_ENDED)                  if (n->flags & NODE_ENDED)
                         continue;                          continue;
                 if (n->type == ROFFT_BLOCK &&                  if (n->type == ROFFT_BLOCK &&
                     mdoc_macros[n->tok].flags & MDOC_EXPLICIT) {                      mdoc_macro(n->tok)->flags & MDOC_EXPLICIT) {
                         irc = 1;                          irc = 1;
                         break_intermediate(mdoc->last, target);                          break_intermediate(mdoc->last, target);
                         if (target->type == ROFFT_HEAD)                          if (target->type == ROFFT_HEAD)
Line 521  macro_or_word(MACRO_PROT_ARGS, int parsed)
Line 524  macro_or_word(MACRO_PROT_ARGS, int parsed)
   
         if (ntok == TOKEN_NONE) {          if (ntok == TOKEN_NONE) {
                 dword(mdoc, line, ppos, p, DELIM_MAX, tok == TOKEN_NONE ||                  dword(mdoc, line, ppos, p, DELIM_MAX, tok == TOKEN_NONE ||
                     mdoc_macros[tok].flags & MDOC_JOIN);                      mdoc_macro(tok)->flags & MDOC_JOIN);
                 return 0;                  return 0;
         } else {          } else {
                 if (tok != TOKEN_NONE &&                  if (tok != TOKEN_NONE &&
                     mdoc_macros[tok].fp == in_line_eoln)                      mdoc_macro(tok)->fp == in_line_eoln)
                         rew_elem(mdoc, tok);                          rew_elem(mdoc, tok);
                 mdoc_macro(mdoc, ntok, line, ppos, pos, buf);                  (*mdoc_macro(ntok)->fp)(mdoc, ntok, line, ppos, pos, buf);
                 if (tok == TOKEN_NONE)                  if (tok == TOKEN_NONE)
                         append_delims(mdoc, line, pos, buf);                          append_delims(mdoc, line, pos, buf);
                 return 1;                  return 1;
Line 682  blk_exp_close(MACRO_PROT_ARGS)
Line 685  blk_exp_close(MACRO_PROT_ARGS)
                          * Stray .Ec without previous .Eo:                           * Stray .Ec without previous .Eo:
                          * Break the output line, keep the arguments.                           * Break the output line, keep the arguments.
                          */                           */
                         roff_elem_alloc(mdoc, line, ppos, MDOC_br);                          roff_elem_alloc(mdoc, line, ppos, ROFF_br);
                         rew_elem(mdoc, MDOC_br);                          rew_elem(mdoc, ROFF_br);
                 }                  }
         } else if (endbody == NULL) {          } else if (endbody == NULL) {
                 rew_last(mdoc, body);                  rew_last(mdoc, body);
Line 691  blk_exp_close(MACRO_PROT_ARGS)
Line 694  blk_exp_close(MACRO_PROT_ARGS)
                         mdoc_tail_alloc(mdoc, line, ppos, atok);                          mdoc_tail_alloc(mdoc, line, ppos, atok);
         }          }
   
         if ( ! (mdoc_macros[tok].flags & MDOC_PARSED)) {          if ((mdoc_macro(tok)->flags & MDOC_PARSED) == 0) {
                 if (buf[*pos] != '\0')                  if (buf[*pos] != '\0')
                         mandoc_vmsg(MANDOCERR_ARG_SKIP,                          mandoc_vmsg(MANDOCERR_ARG_SKIP,
                             mdoc->parse, line, ppos,                              mdoc->parse, line, ppos,
Line 716  blk_exp_close(MACRO_PROT_ARGS)
Line 719  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 ? TOKEN_NONE :                  ntok = lookup(mdoc, tok, line, lastarg, p);
                     lookup(mdoc, tok, line, lastarg, p);  
   
                 if (ntok == TOKEN_NONE) {                  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_macro(tok)->flags & MDOC_JOIN);
                         continue;                          continue;
                 }                  }
   
                 if (n != NULL)                  if (n != NULL)
                         rew_last(mdoc, n);                          rew_last(mdoc, n);
                 mdoc->flags &= ~MDOC_NEWLINE;                  mdoc->flags &= ~MDOC_NEWLINE;
                 mdoc_macro(mdoc, ntok, line, lastarg, pos, buf);                  (*mdoc_macro(ntok)->fp)(mdoc, ntok, line, lastarg, pos, buf);
                 break;                  break;
         }          }
   
Line 813  in_line(MACRO_PROT_ARGS)
Line 815  in_line(MACRO_PROT_ARGS)
                         break;                          break;
                 }                  }
   
                 ntok = (ac == ARGS_QWORD || (tok == MDOC_Fn && !cnt)) ?                  ntok = (tok == MDOC_Fn && !cnt) ?
                     TOKEN_NONE : lookup(mdoc, tok, line, la, p);                      TOKEN_NONE : lookup(mdoc, tok, line, la, p);
   
                 /*                  /*
Line 835  in_line(MACRO_PROT_ARGS)
Line 837  in_line(MACRO_PROT_ARGS)
                                     mdoc->parse, line, ppos,                                      mdoc->parse, line, ppos,
                                     roff_name[tok]);                                      roff_name[tok]);
                         }                          }
                         mdoc_macro(mdoc, ntok, line, la, pos, buf);                          (*mdoc_macro(ntok)->fp)(mdoc, ntok,
                               line, la, pos, buf);
                         if (nl)                          if (nl)
                                 append_delims(mdoc, line, pos, buf);                                  append_delims(mdoc, line, pos, buf);
                         return;                          return;
                 }                  }
   
                 /*                  /*
                  * Non-quote-enclosed punctuation.  Set up our scope, if                   * Handle punctuation.  Set up our scope, if a word;
                  * a word; rewind the scope, if a delimiter; then append                   * rewind the scope, if a delimiter; then append the word.
                  * the word.  
                  */                   */
   
                 d = ac == ARGS_QWORD ? DELIM_NONE : mdoc_isdelim(p);                  if ((d = mdoc_isdelim(p)) != DELIM_NONE) {
   
                 if (DELIM_NONE != d) {  
                         /*                          /*
                          * If we encounter closing punctuation, no word                           * If we encounter closing punctuation, no word
                          * has been emitted, no scope is open, and we're                           * has been emitted, no scope is open, and we're
Line 869  in_line(MACRO_PROT_ARGS)
Line 869  in_line(MACRO_PROT_ARGS)
                          * Close out our scope, if one is open, before                           * Close out our scope, if one is open, before
                          * any punctuation.                           * any punctuation.
                          */                           */
                         if (scope)                          if (scope && tok != MDOC_Lk) {
                                 rew_elem(mdoc, tok);                                  rew_elem(mdoc, tok);
                         scope = 0;                                  scope = 0;
                         if (tok == MDOC_Fn)                                  if (tok == MDOC_Fn)
                                 mayopen = 0;                                          mayopen = 0;
                           }
                 } else if (mayopen && !scope) {                  } else if (mayopen && !scope) {
                         mdoc_elem_alloc(mdoc, line, ppos, tok, arg);                          mdoc_elem_alloc(mdoc, line, ppos, tok, arg);
                         scope = 1;                          scope = 1;
Line 881  in_line(MACRO_PROT_ARGS)
Line 882  in_line(MACRO_PROT_ARGS)
                 }                  }
   
                 dword(mdoc, line, la, p, d,                  dword(mdoc, line, la, p, d,
                     mdoc_macros[tok].flags & MDOC_JOIN);                      mdoc_macro(tok)->flags & MDOC_JOIN);
   
                 /*                  /*
                  * If the first argument is a closing delimiter,                   * If the first argument is a closing delimiter,
Line 950  blk_full(MACRO_PROT_ARGS)
Line 951  blk_full(MACRO_PROT_ARGS)
                 return;                  return;
         }          }
   
         if ( ! (mdoc_macros[tok].flags & MDOC_EXPLICIT)) {          if ((mdoc_macro(tok)->flags & MDOC_EXPLICIT) == 0) {
   
                 /* Here, tok is one of Sh Ss Nm Nd It. */                  /* Here, tok is one of Sh Ss Nm Nd It. */
   
Line 975  blk_full(MACRO_PROT_ARGS)
Line 976  blk_full(MACRO_PROT_ARGS)
                                 break;                                  break;
                         }                          }
   
                         if (mdoc_macros[n->tok].flags & MDOC_EXPLICIT) {                          if (mdoc_macro(n->tok)->flags & MDOC_EXPLICIT) {
                                 switch (tok) {                                  switch (tok) {
                                 case MDOC_Sh:                                  case MDOC_Sh:
                                 case MDOC_Ss:                                  case MDOC_Ss:
Line 1023  blk_full(MACRO_PROT_ARGS)
Line 1024  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);
                         roff_elem_alloc(mdoc, line, ppos, MDOC_br);                          roff_elem_alloc(mdoc, line, ppos, ROFF_br);
                         rew_elem(mdoc, MDOC_br);                          rew_elem(mdoc, ROFF_br);
                         return;                          return;
                 }                  }
         }          }
Line 1119  blk_full(MACRO_PROT_ARGS)
Line 1120  blk_full(MACRO_PROT_ARGS)
   
                 if (head == NULL &&                  if (head == NULL &&
                     ac != ARGS_PHRASE &&                      ac != ARGS_PHRASE &&
                     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);
                         continue;                          continue;
Line 1216  blk_part_imp(MACRO_PROT_ARGS)
Line 1216  blk_part_imp(MACRO_PROT_ARGS)
                 if (ac == ARGS_EOLN || ac == ARGS_PUNCT)                  if (ac == ARGS_EOLN || ac == ARGS_PUNCT)
                         break;                          break;
   
                 if (body == NULL && ac != ARGS_QWORD &&                  if (body == NULL && 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);
                         continue;                          continue;
                 }                  }
Line 1273  blk_part_exp(MACRO_PROT_ARGS)
Line 1272  blk_part_exp(MACRO_PROT_ARGS)
   
                 /* Flush out leading punctuation. */                  /* Flush out leading punctuation. */
   
                 if (head == NULL && ac != ARGS_QWORD &&                  if (head == NULL && 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);
                         continue;                          continue;
                 }                  }
Line 1348  in_line_argn(MACRO_PROT_ARGS)
Line 1346  in_line_argn(MACRO_PROT_ARGS)
                 ac = mdoc_args(mdoc, line, pos, buf, tok, &p);                  ac = mdoc_args(mdoc, line, pos, buf, tok, &p);
   
                 if (ac == ARGS_WORD && state == -1 &&                  if (ac == ARGS_WORD && state == -1 &&
                     ! (mdoc_macros[tok].flags & MDOC_IGNDELIM) &&                      (mdoc_macro(tok)->flags & MDOC_IGNDELIM) == 0 &&
                     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);
                         continue;                          continue;
Line 1373  in_line_argn(MACRO_PROT_ARGS)
Line 1371  in_line_argn(MACRO_PROT_ARGS)
                         state = -2;                          state = -2;
                 }                  }
   
                 ntok = (ac == ARGS_QWORD || (tok == MDOC_Pf && state == 0)) ?                  ntok = (tok == MDOC_Pf && state == 0) ?
                     TOKEN_NONE : lookup(mdoc, tok, line, la, p);                      TOKEN_NONE : lookup(mdoc, tok, line, la, p);
   
                 if (ntok != TOKEN_NONE) {                  if (ntok != TOKEN_NONE) {
Line 1381  in_line_argn(MACRO_PROT_ARGS)
Line 1379  in_line_argn(MACRO_PROT_ARGS)
                                 rew_elem(mdoc, tok);                                  rew_elem(mdoc, tok);
                                 state = -2;                                  state = -2;
                         }                          }
                         mdoc_macro(mdoc, ntok, line, la, pos, buf);                          (*mdoc_macro(ntok)->fp)(mdoc, ntok,
                               line, la, pos, buf);
                         break;                          break;
                 }                  }
   
                 if (ac == ARGS_QWORD ||                  if (mdoc_macro(tok)->flags & MDOC_IGNDELIM ||
                     mdoc_macros[tok].flags & MDOC_IGNDELIM ||  
                     mdoc_isdelim(p) == DELIM_NONE) {                      mdoc_isdelim(p) == DELIM_NONE) {
                         if (state == -1) {                          if (state == -1) {
                                 mdoc_elem_alloc(mdoc, line, ppos, tok, arg);                                  mdoc_elem_alloc(mdoc, line, ppos, tok, arg);
Line 1399  in_line_argn(MACRO_PROT_ARGS)
Line 1397  in_line_argn(MACRO_PROT_ARGS)
                 }                  }
   
                 dword(mdoc, line, la, p, DELIM_MAX,                  dword(mdoc, line, la, p, DELIM_MAX,
                     mdoc_macros[tok].flags & MDOC_JOIN);                      mdoc_macro(tok)->flags & MDOC_JOIN);
         }          }
   
         if (state == -1) {          if (state == -1) {

Legend:
Removed from v.1.219  
changed lines
  Added in v.1.225

CVSweb