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

version 1.224, 2017/05/30 16:22:03 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 201  const struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_
Line 201  const struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_
         { 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 */
 };  };
 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 221  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 244  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 = roffhash_find(mdoc->mdocmac, p, 0);                  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;
                         mandoc_msg(MANDOCERR_MACRO_CALL,                          mandoc_msg(MANDOCERR_MACRO_CALL,
                             mdoc->parse, line, ppos, p);                              mdoc->parse, line, ppos, p);
Line 409  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 518  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 688  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 717  blk_exp_close(MACRO_PROT_ARGS)
Line 723  blk_exp_close(MACRO_PROT_ARGS)
   
                 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 831  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;
Line 875  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 944  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 969  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 1339  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 1372  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 (mdoc_macros[tok].flags & MDOC_IGNDELIM ||                  if (mdoc_macro(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 1389  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.224  
changed lines
  Added in v.1.225

CVSweb