[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.218 and 1.219

version 1.218, 2017/04/17 12:53:29 version 1.219, 2017/04/24 23:06:18
Line 46  static void  phrase_ta(MACRO_PROT_ARGS);
Line 46  static void  phrase_ta(MACRO_PROT_ARGS);
 static  void            append_delims(struct roff_man *, int, int *, char *);  static  void            append_delims(struct roff_man *, int, int *, char *);
 static  void            dword(struct roff_man *, 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 roff_man *, int, int, int,  static  int             find_pending(struct roff_man *, enum roff_tok,
                                 struct roff_node *);                                  int, int, struct roff_node *);
 static  int             lookup(struct roff_man *, 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  void            break_intermediate(struct roff_node *,  static  void            break_intermediate(struct roff_node *,
                             struct roff_node *);                                  struct roff_node *);
 static  int             parse_rest(struct roff_man *, int, int, int *, char *);  static  int             parse_rest(struct roff_man *, enum roff_tok,
 static  int             rew_alt(int);                                  int, int *, char *);
 static  void            rew_elem(struct roff_man *, int);  static  enum roff_tok   rew_alt(enum roff_tok);
   static  void            rew_elem(struct roff_man *, enum roff_tok);
 static  void            rew_last(struct roff_man *, const struct roff_node *);  static  void            rew_last(struct roff_man *, const struct roff_node *);
 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] = {  const   struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_Dd] = {
         { in_line_argn, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ap */  
         { 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] = {
Line 76  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { 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, 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 202  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
Line 203  const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
         { phrase_ta, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ta */          { phrase_ta, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ta */
         { in_line_eoln, MDOC_PROLOGUE }, /* ll */          { in_line_eoln, MDOC_PROLOGUE }, /* ll */
 };  };
   const   struct mdoc_macro *const mdoc_macros = __mdoc_macros - MDOC_Dd;
   
 const   struct mdoc_macro * const mdoc_macros = __mdoc_macros;  
   
   
 /*  /*
  * 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 225  mdoc_endparse(struct roff_man *mdoc)
Line 225  mdoc_endparse(struct roff_man *mdoc)
                 if (n->type == ROFFT_BLOCK &&                  if (n->type == ROFFT_BLOCK &&
                     mdoc_macros[n->tok].flags & MDOC_EXPLICIT)                      mdoc_macros[n->tok].flags & MDOC_EXPLICIT)
                         mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse,                          mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse,
                             n->line, n->pos, mdoc_macronames[n->tok]);                              n->line, n->pos, roff_name[n->tok]);
   
         /* Rewind to the first. */          /* Rewind to the first. */
   
Line 240  mdoc_endparse(struct roff_man *mdoc)
Line 240  mdoc_endparse(struct roff_man *mdoc)
 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;          enum roff_tok    res;
   
         if (mdoc->flags & MDOC_PHRASEQF) {          if (mdoc->flags & MDOC_PHRASEQF) {
                 mdoc->flags &= ~MDOC_PHRASEQF;                  mdoc->flags &= ~MDOC_PHRASEQF;
Line 324  rew_pending(struct roff_man *mdoc, const struct roff_n
Line 324  rew_pending(struct roff_man *mdoc, const struct roff_n
  * For a block closing macro, return the corresponding opening one.   * For a block closing macro, return the corresponding opening one.
  * Otherwise, return the macro itself.   * Otherwise, return the macro itself.
  */   */
 static int  static enum roff_tok
 rew_alt(int tok)  rew_alt(enum roff_tok tok)
 {  {
         switch (tok) {          switch (tok) {
         case MDOC_Ac:          case MDOC_Ac:
Line 366  rew_alt(int tok)
Line 366  rew_alt(int tok)
 }  }
   
 static void  static void
 rew_elem(struct roff_man *mdoc, int tok)  rew_elem(struct roff_man *mdoc, enum roff_tok tok)
 {  {
         struct roff_node *n;          struct roff_node *n;
   
Line 398  break_intermediate(struct roff_node *n, struct roff_no
Line 398  break_intermediate(struct roff_node *n, struct roff_no
  * 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 roff_man *mdoc, int tok, int line, int ppos,  find_pending(struct roff_man *mdoc, enum roff_tok tok, int line, int ppos,
         struct roff_node *target)          struct roff_node *target)
 {  {
         struct roff_node        *n;          struct roff_node        *n;
Line 420  find_pending(struct roff_man *mdoc, int tok, int line,
Line 420  find_pending(struct roff_man *mdoc, int tok, int line,
                         else if ( ! (target->flags & NODE_ENDED)) {                          else if ( ! (target->flags & NODE_ENDED)) {
                                 mandoc_vmsg(MANDOCERR_BLK_NEST,                                  mandoc_vmsg(MANDOCERR_BLK_NEST,
                                     mdoc->parse, line, ppos,                                      mdoc->parse, line, ppos,
                                     "%s breaks %s", mdoc_macronames[tok],                                      "%s breaks %s", roff_name[tok],
                                     mdoc_macronames[n->tok]);                                      roff_name[n->tok]);
                                 mdoc_endbody_alloc(mdoc, line, ppos,                                  mdoc_endbody_alloc(mdoc, line, ppos,
                                     tok, target);                                      tok, target);
                         }                          }
Line 524  macro_or_word(MACRO_PROT_ARGS, int parsed)
Line 524  macro_or_word(MACRO_PROT_ARGS, int parsed)
                     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 (tok != TOKEN_NONE &&
                       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 == TOKEN_NONE)                  if (tok == TOKEN_NONE)
Line 548  blk_exp_close(MACRO_PROT_ARGS)
Line 549  blk_exp_close(MACRO_PROT_ARGS)
   
         int              j, lastarg, maxargs, nl, pending;          int              j, lastarg, maxargs, nl, pending;
         enum margserr    ac;          enum margserr    ac;
         int              atok, ntok;          enum roff_tok    atok, ntok;
         char            *p;          char            *p;
   
         nl = MDOC_NEWLINE & mdoc->flags;          nl = MDOC_NEWLINE & mdoc->flags;
Line 633  blk_exp_close(MACRO_PROT_ARGS)
Line 634  blk_exp_close(MACRO_PROT_ARGS)
   
                         mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse,                          mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse,
                             line, ppos, "%s breaks %s",                              line, ppos, "%s breaks %s",
                             mdoc_macronames[atok],                              roff_name[atok], roff_name[later->tok]);
                             mdoc_macronames[later->tok]);  
   
                         endbody = mdoc_endbody_alloc(mdoc, line, ppos,                          endbody = mdoc_endbody_alloc(mdoc, line, ppos,
                             atok, body);                              atok, body);
Line 676  blk_exp_close(MACRO_PROT_ARGS)
Line 676  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, roff_name[tok]);
                 if (maxargs && endbody == NULL) {                  if (maxargs && endbody == NULL) {
                         /*                          /*
                          * Stray .Ec without previous .Eo:                           * Stray .Ec without previous .Eo:
Line 695  blk_exp_close(MACRO_PROT_ARGS)
Line 695  blk_exp_close(MACRO_PROT_ARGS)
                 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,
                             "%s %s", mdoc_macronames[tok],                              "%s %s", roff_name[tok],
                             buf + *pos);                              buf + *pos);
                 if (endbody == NULL && n != NULL)                  if (endbody == NULL && n != NULL)
                         rew_pending(mdoc, n);                          rew_pending(mdoc, n);
Line 752  static void
Line 752  static void
 in_line(MACRO_PROT_ARGS)  in_line(MACRO_PROT_ARGS)
 {  {
         int              la, scope, cnt, firstarg, mayopen, nc, nl;          int              la, scope, cnt, firstarg, mayopen, nc, nl;
         int              ntok;          enum roff_tok    ntok;
         enum margserr    ac;          enum margserr    ac;
         enum mdelim      d;          enum mdelim      d;
         struct mdoc_arg *arg;          struct mdoc_arg *arg;
Line 833  in_line(MACRO_PROT_ARGS)
Line 833  in_line(MACRO_PROT_ARGS)
                                 mdoc_argv_free(arg);                                  mdoc_argv_free(arg);
                                 mandoc_msg(MANDOCERR_MACRO_EMPTY,                                  mandoc_msg(MANDOCERR_MACRO_EMPTY,
                                     mdoc->parse, line, ppos,                                      mdoc->parse, line, ppos,
                                     mdoc_macronames[tok]);                                      roff_name[tok]);
                         }                          }
                         mdoc_macro(mdoc, ntok, line, la, pos, buf);                          mdoc_macro(mdoc, ntok, line, la, pos, buf);
                         if (nl)                          if (nl)
Line 881  in_line(MACRO_PROT_ARGS)
Line 881  in_line(MACRO_PROT_ARGS)
                 }                  }
   
                 dword(mdoc, line, la, p, d,                  dword(mdoc, line, la, p, d,
                     MDOC_JOIN & mdoc_macros[tok].flags);                      mdoc_macros[tok].flags & MDOC_JOIN);
   
                 /*                  /*
                  * If the first argument is a closing delimiter,                   * If the first argument is a closing delimiter,
Line 921  in_line(MACRO_PROT_ARGS)
Line 921  in_line(MACRO_PROT_ARGS)
                 } else {                  } else {
                         mdoc_argv_free(arg);                          mdoc_argv_free(arg);
                         mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,                          mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
                             line, ppos, mdoc_macronames[tok]);                              line, ppos, roff_name[tok]);
                 }                  }
         }          }
         if (nl)          if (nl)
Line 946  blk_full(MACRO_PROT_ARGS)
Line 946  blk_full(MACRO_PROT_ARGS)
   
         if (buf[*pos] == '\0' && (tok == MDOC_Sh || tok == MDOC_Ss)) {          if (buf[*pos] == '\0' && (tok == MDOC_Sh || tok == MDOC_Ss)) {
                 mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,                  mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
                     line, ppos, mdoc_macronames[tok]);                      line, ppos, roff_name[tok]);
                 return;                  return;
         }          }
   
Line 969  blk_full(MACRO_PROT_ARGS)
Line 969  blk_full(MACRO_PROT_ARGS)
                                         mandoc_vmsg(MANDOCERR_BLK_BROKEN,                                          mandoc_vmsg(MANDOCERR_BLK_BROKEN,
                                             mdoc->parse, line, ppos,                                              mdoc->parse, line, ppos,
                                             "It breaks %s",                                              "It breaks %s",
                                             mdoc_macronames[blk->tok]);                                              roff_name[blk->tok]);
                                         rew_pending(mdoc, blk);                                          rew_pending(mdoc, blk);
                                 }                                  }
                                 break;                                  break;
Line 981  blk_full(MACRO_PROT_ARGS)
Line 981  blk_full(MACRO_PROT_ARGS)
                                 case MDOC_Ss:                                  case MDOC_Ss:
                                         mandoc_vmsg(MANDOCERR_BLK_BROKEN,                                          mandoc_vmsg(MANDOCERR_BLK_BROKEN,
                                             mdoc->parse, line, ppos,                                              mdoc->parse, line, ppos,
                                             "%s breaks %s",                                              "%s breaks %s", roff_name[tok],
                                             mdoc_macronames[tok],                                              roff_name[n->tok]);
                                             mdoc_macronames[n->tok]);  
                                         rew_pending(mdoc, n);                                          rew_pending(mdoc, n);
                                         n = mdoc->last;                                          n = mdoc->last;
                                         continue;                                          continue;
Line 1009  blk_full(MACRO_PROT_ARGS)
Line 1008  blk_full(MACRO_PROT_ARGS)
                         if (blk != NULL) {                          if (blk != NULL) {
                                 mandoc_vmsg(MANDOCERR_BLK_BROKEN,                                  mandoc_vmsg(MANDOCERR_BLK_BROKEN,
                                     mdoc->parse, line, ppos,                                      mdoc->parse, line, ppos,
                                     "It breaks %s",                                      "It breaks %s", roff_name[blk->tok]);
                                     mdoc_macronames[blk->tok]);  
                                 rew_pending(mdoc, blk);                                  rew_pending(mdoc, blk);
                                 blk = NULL;                                  blk = NULL;
                         }                          }
Line 1103  blk_full(MACRO_PROT_ARGS)
Line 1101  blk_full(MACRO_PROT_ARGS)
                 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",
                             mdoc_macronames[tok], buf + la);                              roff_name[tok], buf + la);
                         break;                          break;
                 }                  }
                 if (tok == MDOC_Rs) {                  if (tok == MDOC_Rs) {
Line 1311  in_line_argn(MACRO_PROT_ARGS)
Line 1309  in_line_argn(MACRO_PROT_ARGS)
         struct mdoc_arg *arg;          struct mdoc_arg *arg;
         char            *p;          char            *p;
         enum margserr    ac;          enum margserr    ac;
         int              ntok;          enum roff_tok    ntok;
         int              state; /* arg#; -1: not yet open; -2: closed */          int              state; /* arg#; -1: not yet open; -2: closed */
         int              la, maxargs, nl;          int              la, maxargs, nl;
   
Line 1401  in_line_argn(MACRO_PROT_ARGS)
Line 1399  in_line_argn(MACRO_PROT_ARGS)
                 }                  }
   
                 dword(mdoc, line, la, p, DELIM_MAX,                  dword(mdoc, line, la, p, DELIM_MAX,
                     MDOC_JOIN & mdoc_macros[tok].flags);                      mdoc_macros[tok].flags & MDOC_JOIN);
         }          }
   
         if (state == -1) {          if (state == -1) {
                 mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,                  mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
                     line, ppos, mdoc_macronames[tok]);                      line, ppos, roff_name[tok]);
                 return;                  return;
         }          }
   
Line 1434  in_line_eoln(MACRO_PROT_ARGS)
Line 1432  in_line_eoln(MACRO_PROT_ARGS)
         }          }
   
         if (buf[*pos] == '\0' &&          if (buf[*pos] == '\0' &&
             (tok == MDOC_Fd || mdoc_macronames[tok][0] == '%')) {              (tok == MDOC_Fd || *roff_name[tok] == '%')) {
                 mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,                  mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
                     line, ppos, mdoc_macronames[tok]);                      line, ppos, roff_name[tok]);
                 return;                  return;
         }          }
   
Line 1453  in_line_eoln(MACRO_PROT_ARGS)
Line 1451  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 roff_man *mdoc, int tok, int line, int *pos, char *buf)  parse_rest(struct roff_man *mdoc, enum roff_tok tok,
       int line, int *pos, char *buf)
 {  {
         int              la;          int              la;
   

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

CVSweb