[BACK]Return to man_macro.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/man_macro.c between version 1.93 and 1.100

version 1.93, 2015/01/24 01:58:33 version 1.100, 2015/03/20 14:47:52
Line 55  const struct man_macro __man_macros[MAN_MAX] = {
Line 55  const struct man_macro __man_macros[MAN_MAX] = {
         { in_line_eoln, MAN_BSCOPE }, /* TH */          { in_line_eoln, MAN_BSCOPE }, /* TH */
         { blk_imp, MAN_BSCOPE | MAN_SCOPED }, /* SH */          { blk_imp, MAN_BSCOPE | MAN_SCOPED }, /* SH */
         { blk_imp, MAN_BSCOPE | MAN_SCOPED }, /* SS */          { blk_imp, MAN_BSCOPE | MAN_SCOPED }, /* SS */
         { blk_imp, MAN_BSCOPE | MAN_SCOPED | MAN_FSCOPED }, /* TP */          { blk_imp, MAN_BSCOPE | MAN_SCOPED }, /* TP */
         { blk_imp, MAN_BSCOPE }, /* LP */          { blk_imp, MAN_BSCOPE }, /* LP */
         { blk_imp, MAN_BSCOPE }, /* PP */          { blk_imp, MAN_BSCOPE }, /* PP */
         { blk_imp, MAN_BSCOPE }, /* P */          { blk_imp, MAN_BSCOPE }, /* P */
Line 72  const struct man_macro __man_macros[MAN_MAX] = {
Line 72  const struct man_macro __man_macros[MAN_MAX] = {
         { in_line_eoln, MAN_SCOPED | MAN_JOIN }, /* I */          { in_line_eoln, MAN_SCOPED | MAN_JOIN }, /* I */
         { in_line_eoln, 0 }, /* IR */          { in_line_eoln, 0 }, /* IR */
         { in_line_eoln, 0 }, /* RI */          { in_line_eoln, 0 }, /* RI */
         { in_line_eoln, MAN_NSCOPED }, /* na */  
         { in_line_eoln, MAN_NSCOPED }, /* sp */          { in_line_eoln, MAN_NSCOPED }, /* sp */
         { in_line_eoln, MAN_BSCOPE }, /* nf */          { in_line_eoln, MAN_BSCOPE }, /* nf */
         { in_line_eoln, MAN_BSCOPE }, /* fi */          { in_line_eoln, MAN_BSCOPE }, /* fi */
         { blk_close, MAN_BSCOPE }, /* RE */          { blk_close, MAN_BSCOPE }, /* RE */
         { blk_exp, MAN_BSCOPE | MAN_EXPLICIT }, /* RS */          { blk_exp, MAN_BSCOPE }, /* RS */
         { in_line_eoln, 0 }, /* DT */          { in_line_eoln, 0 }, /* DT */
         { in_line_eoln, 0 }, /* UC */          { in_line_eoln, 0 }, /* UC */
         { in_line_eoln, 0 }, /* PD */          { in_line_eoln, MAN_NSCOPED }, /* PD */
         { in_line_eoln, 0 }, /* AT */          { in_line_eoln, 0 }, /* AT */
         { in_line_eoln, 0 }, /* in */          { in_line_eoln, 0 }, /* in */
         { in_line_eoln, 0 }, /* ft */          { in_line_eoln, 0 }, /* ft */
         { in_line_eoln, 0 }, /* OP */          { in_line_eoln, 0 }, /* OP */
         { in_line_eoln, MAN_BSCOPE }, /* EX */          { in_line_eoln, MAN_BSCOPE }, /* EX */
         { in_line_eoln, MAN_BSCOPE }, /* EE */          { in_line_eoln, MAN_BSCOPE }, /* EE */
         { blk_exp, MAN_BSCOPE | MAN_EXPLICIT }, /* UR */          { blk_exp, MAN_BSCOPE }, /* UR */
         { blk_close, MAN_BSCOPE }, /* UE */          { blk_close, MAN_BSCOPE }, /* UE */
         { in_line_eoln, 0 }, /* ll */          { in_line_eoln, 0 }, /* ll */
 };  };
Line 126  man_unscope(struct man *man, const struct man_node *to
Line 125  man_unscope(struct man *man, const struct man_node *to
                                 continue;                                  continue;
                         }                          }
                         if (n->type == MAN_BLOCK &&                          if (n->type == MAN_BLOCK &&
                             man_macros[n->tok].flags & MAN_EXPLICIT)                              man_macros[n->tok].fp == blk_exp)
                                 mandoc_msg(MANDOCERR_BLK_NOEND,                                  mandoc_msg(MANDOCERR_BLK_NOEND,
                                     man->parse, n->line, n->pos,                                      man->parse, n->line, n->pos,
                                     man_macronames[n->tok]);                                      man_macronames[n->tok]);
Line 191  rew_dohalt(enum mant tok, enum man_type type, const st
Line 190  rew_dohalt(enum mant tok, enum man_type type, const st
   
         /* First: rewind to ourselves. */          /* First: rewind to ourselves. */
         if (type == n->type && tok == n->tok) {          if (type == n->type && tok == n->tok) {
                 if (MAN_EXPLICIT & man_macros[n->tok].flags)                  if (man_macros[n->tok].fp == blk_exp)
                         return(REW_HALT);                          return(REW_HALT);
                 else                  else
                         return(REW_REWIND);                          return(REW_REWIND);
Line 320  blk_close(MACRO_PROT_ARGS)
Line 319  blk_close(MACRO_PROT_ARGS)
                 mandoc_msg(MANDOCERR_BLK_NOTOPEN, man->parse,                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, man->parse,
                     line, ppos, man_macronames[tok]);                      line, ppos, man_macronames[tok]);
                 rew_scope(MAN_BLOCK, man, MAN_PP);                  rew_scope(MAN_BLOCK, man, MAN_PP);
         } else          } else {
                   line = man->last->line;
                   ppos = man->last->pos;
                   ntok = man->last->tok;
                 man_unscope(man, nn);                  man_unscope(man, nn);
   
                   /* Move a trailing paragraph behind the block. */
   
                   if (ntok == MAN_LP || ntok == MAN_PP || ntok == MAN_P) {
                           *pos = strlen(buf);
                           blk_imp(man, ntok, line, ppos, pos, buf);
                   }
           }
 }  }
   
 void  void
 blk_exp(MACRO_PROT_ARGS)  blk_exp(MACRO_PROT_ARGS)
 {  {
         struct man_node *n;          struct man_node *head;
         int              la;  
         char            *p;          char            *p;
           int              la;
   
         rew_scope(MAN_BLOCK, man, tok);          rew_scope(MAN_BLOCK, man, tok);
         man_block_alloc(man, line, ppos, tok);          man_block_alloc(man, line, ppos, tok);
         man_head_alloc(man, line, ppos, tok);          man_head_alloc(man, line, ppos, tok);
           head = man->last;
   
         for (;;) {          la = *pos;
                 la = *pos;          if (man_args(man, line, pos, buf, &p))
                 if ( ! man_args(man, line, pos, buf, &p))  
                         break;  
                 man_word_alloc(man, line, la, p);                  man_word_alloc(man, line, la, p);
         }  
   
         assert(man);          if (buf[*pos] != '\0')
         assert(tok != MAN_MAX);                  mandoc_vmsg(MANDOCERR_ARG_EXCESS,
                       man->parse, line, *pos, "%s ... %s",
                       man_macronames[tok], buf + *pos);
   
         for (n = man->last; n; n = n->parent)          man_unscope(man, head);
                 if (n->tok == tok) {  
                         assert(n->type == MAN_HEAD);  
                         man_unscope(man, n);  
                         break;  
                 }  
   
         man_body_alloc(man, line, ppos, tok);          man_body_alloc(man, line, ppos, tok);
 }  }
   
Line 383  blk_imp(MACRO_PROT_ARGS)
Line 387  blk_imp(MACRO_PROT_ARGS)
                 man_word_alloc(man, line, la, p);                  man_word_alloc(man, line, la, p);
         }          }
   
         /* Close out head and open body (unless MAN_SCOPE). */          /*
            * For macros having optional next-line scope,
            * keep the head open if there were no arguments.
            * For `TP', always keep the head open.
            */
   
         if (man_macros[tok].flags & MAN_SCOPED) {          if (man_macros[tok].flags & MAN_SCOPED &&
                 /* If we're forcing scope (`TP'), keep it open. */              (tok == MAN_TP || n == man->last)) {
                 if (man_macros[tok].flags & MAN_FSCOPED) {                  man->flags |= MAN_BLINE;
                         man->flags |= MAN_BLINE;                  return;
                         return;  
                 } else if (n == man->last) {  
                         man->flags |= MAN_BLINE;  
                         return;  
                 }  
         }          }
   
           /* Close out the head and open the body. */
   
         rew_scope(MAN_HEAD, man, tok);          rew_scope(MAN_HEAD, man, tok);
         man_body_alloc(man, line, ppos, tok);          man_body_alloc(man, line, ppos, tok);
 }  }
Line 410  in_line_eoln(MACRO_PROT_ARGS)
Line 416  in_line_eoln(MACRO_PROT_ARGS)
         n = man->last;          n = man->last;
   
         for (;;) {          for (;;) {
                   if (buf[*pos] != '\0' && (tok == MAN_br ||
                       tok == MAN_fi || tok == MAN_nf)) {
                           mandoc_vmsg(MANDOCERR_ARG_SKIP,
                               man->parse, line, *pos, "%s %s",
                               man_macronames[tok], buf + *pos);
                           break;
                   }
                   if (buf[*pos] != '\0' && man->last != n &&
                       (tok == MAN_PD || tok == MAN_ft || tok == MAN_sp)) {
                           mandoc_vmsg(MANDOCERR_ARG_EXCESS,
                               man->parse, line, *pos, "%s ... %s",
                               man_macronames[tok], buf + *pos);
                           break;
                   }
                 la = *pos;                  la = *pos;
                 if ( ! man_args(man, line, pos, buf, &p))                  if ( ! man_args(man, line, pos, buf, &p))
                         break;                          break;

Legend:
Removed from v.1.93  
changed lines
  Added in v.1.100

CVSweb