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

Diff for /mandoc/roff.c between version 1.364 and 1.371

version 1.364, 2019/04/21 22:48:58 version 1.371, 2020/02/27 21:43:44
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2010-2015, 2017-2020 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 355  const char *__roff_name[MAN_MAX + 1] = {
Line 355  const char *__roff_name[MAN_MAX + 1] = {
         "Lk",           "Mt",           "Brq",          "Bro",          "Lk",           "Mt",           "Brq",          "Bro",
         "Brc",          "%C",           "Es",           "En",          "Brc",          "%C",           "Es",           "En",
         "Dx",           "%Q",           "%U",           "Ta",          "Dx",           "%Q",           "%U",           "Ta",
         NULL,          "Tg",           NULL,
         "TH",           "SH",           "SS",           "TP",          "TH",           "SH",           "SS",           "TP",
         "TQ",          "TQ",
         "LP",           "PP",           "P",            "IP",          "LP",           "PP",           "P",            "IP",
Line 771  void
Line 771  void
 roff_reset(struct roff *r)  roff_reset(struct roff *r)
 {  {
         roff_free1(r);          roff_free1(r);
           r->options |= MPARSE_COMMENT;
         r->format = r->options & (MPARSE_MDOC | MPARSE_MAN);          r->format = r->options & (MPARSE_MDOC | MPARSE_MAN);
         r->control = '\0';          r->control = '\0';
         r->escape = '\\';          r->escape = '\\';
Line 783  roff_reset(struct roff *r)
Line 784  roff_reset(struct roff *r)
 void  void
 roff_free(struct roff *r)  roff_free(struct roff *r)
 {  {
         int              i;          int              i;
   
         roff_free1(r);          roff_free1(r);
         for (i = 0; i < r->mstacksz; i++)          for (i = 0; i < r->mstacksz; i++)
Line 800  roff_alloc(int options)
Line 801  roff_alloc(int options)
   
         r = mandoc_calloc(1, sizeof(struct roff));          r = mandoc_calloc(1, sizeof(struct roff));
         r->reqtab = roffhash_alloc(0, ROFF_RENAMED);          r->reqtab = roffhash_alloc(0, ROFF_RENAMED);
         r->options = options;          r->options = options | MPARSE_COMMENT;
         r->format = options & (MPARSE_MDOC | MPARSE_MAN);          r->format = options & (MPARSE_MDOC | MPARSE_MAN);
         r->mstackpos = -1;          r->mstackpos = -1;
         r->rstackpos = -1;          r->rstackpos = -1;
Line 1113  roff_node_delete(struct roff_man *man, struct roff_nod
Line 1114  roff_node_delete(struct roff_man *man, struct roff_nod
         roff_node_free(n);          roff_node_free(n);
 }  }
   
   int
   roff_node_transparent(struct roff_node *n)
   {
           if (n == NULL)
                   return 0;
           if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT)
                   return 1;
           switch (n->tok) {
           case ROFF_ft:
           case ROFF_ll:
           case ROFF_mc:
           case ROFF_po:
           case ROFF_ta:
           case MDOC_Db:
           case MDOC_Es:
           case MDOC_Sm:
           case MDOC_Tg:
           case MAN_DT:
           case MAN_UC:
           case MAN_PD:
           case MAN_AT:
                   return 1;
           default:
                   return 0;
           }
   }
   
   struct roff_node *
   roff_node_child(struct roff_node *n)
   {
           for (n = n->child; roff_node_transparent(n); n = n->next)
                   continue;
           return n;
   }
   
   struct roff_node *
   roff_node_prev(struct roff_node *n)
   {
           do {
                   n = n->prev;
           } while (roff_node_transparent(n));
           return n;
   }
   
   struct roff_node *
   roff_node_next(struct roff_node *n)
   {
           do {
                   n = n->next;
           } while (roff_node_transparent(n));
           return n;
   }
   
 void  void
 deroff(char **dest, const struct roff_node *n)  deroff(char **dest, const struct roff_node *n)
 {  {
         char    *cp;          char    *cp;
         size_t   sz;          size_t   sz;
   
         if (n->type != ROFFT_TEXT) {          if (n->string == NULL) {
                 for (n = n->child; n != NULL; n = n->next)                  for (n = n->child; n != NULL; n = n->next)
                         deroff(dest, n);                          deroff(dest, n);
                 return;                  return;
Line 1246  roff_expand(struct roff *r, struct buf *buf, int ln, i
Line 1300  roff_expand(struct roff *r, struct buf *buf, int ln, i
                  * in the syntax tree.                   * in the syntax tree.
                  */                   */
   
                 if (newesc != ASCII_ESC && r->format == 0) {                  if (newesc != ASCII_ESC && r->options & MPARSE_COMMENT) {
                         while (*ep == ' ' || *ep == '\t')                          while (*ep == ' ' || *ep == '\t')
                                 ep--;                                  ep--;
                         ep[1] = '\0';                          ep[1] = '\0';
Line 1590  char *
Line 1644  char *
 roff_getarg(struct roff *r, char **cpp, int ln, int *pos)  roff_getarg(struct roff *r, char **cpp, int ln, int *pos)
 {  {
         struct buf       buf;          struct buf       buf;
         char            *cp, *start;          char            *cp, *start;
         int              newesc, pairs, quoted, white;          int              newesc, pairs, quoted, white;
   
         /* Quoting can only start with a new word. */          /* Quoting can only start with a new word. */
Line 1815  roff_parseln(struct roff *r, int ln, struct buf *buf, 
Line 1869  roff_parseln(struct roff *r, int ln, struct buf *buf, 
                 roff_addtbl(r->man, ln, r->tbl);                  roff_addtbl(r->man, ln, r->tbl);
                 return e;                  return e;
         }          }
         if ( ! ctl)          if ( ! ctl) {
                   r->options &= ~MPARSE_COMMENT;
                 return roff_parsetext(r, buf, pos, offs) | e;                  return roff_parsetext(r, buf, pos, offs) | e;
           }
   
         /* Skip empty request lines. */          /* Skip empty request lines. */
   
Line 1839  roff_parseln(struct roff *r, int ln, struct buf *buf, 
Line 1895  roff_parseln(struct roff *r, int ln, struct buf *buf, 
   
         /* No scope is open.  This is a new request or macro. */          /* No scope is open.  This is a new request or macro. */
   
           r->options &= ~MPARSE_COMMENT;
         spos = pos;          spos = pos;
         t = roff_parse(r, buf->buf, &pos, ln, ppos);          t = roff_parse(r, buf->buf, &pos, ln, ppos);
   
Line 2290  roff_cond_sub(ROFF_ARGS)
Line 2347  roff_cond_sub(ROFF_ARGS)
                 }                  }
         }          }
   
           t = roff_parse(r, buf->buf, &pos, ln, ppos);
   
           /* For now, let high level macros abort .ce mode. */
   
           if (roffce_node != NULL &&
               (t == TOKEN_NONE || t == ROFF_Dd || t == ROFF_EQ ||
                t == ROFF_TH || t == ROFF_TS)) {
                   r->man->last = roffce_node;
                   r->man->next = ROFF_NEXT_SIBLING;
                   roffce_lines = 0;
                   roffce_node = NULL;
           }
   
         /*          /*
          * Fully handle known macros when they are structurally           * Fully handle known macros when they are structurally
          * required or when the conditional evaluated to true.           * required or when the conditional evaluated to true.
          */           */
   
         t = roff_parse(r, buf->buf, &pos, ln, ppos);  
         if (t == ROFF_break) {          if (t == ROFF_break) {
                 if (irc & ROFF_LOOPMASK)                  if (irc & ROFF_LOOPMASK)
                         irc = ROFF_IGN | ROFF_LOOPEXIT;                          irc = ROFF_IGN | ROFF_LOOPEXIT;
Line 3841  roff_userdef(ROFF_ARGS)
Line 3910  roff_userdef(ROFF_ARGS)
         char             *arg, *ap, *dst, *src;          char             *arg, *ap, *dst, *src;
         size_t            sz;          size_t            sz;
   
           /* If the macro is empty, ignore it altogether. */
   
           if (*r->current_string == '\0')
                   return ROFF_IGN;
   
         /* Initialize a new macro stack context. */          /* Initialize a new macro stack context. */
   
         if (++r->mstackpos == r->mstacksz) {          if (++r->mstackpos == r->mstacksz) {
Line 3888  roff_userdef(ROFF_ARGS)
Line 3962  roff_userdef(ROFF_ARGS)
         buf->sz = strlen(buf->buf) + 1;          buf->sz = strlen(buf->buf) + 1;
         *offs = 0;          *offs = 0;
   
         return buf->sz > 1 && buf->buf[buf->sz - 2] == '\n' ?          return buf->buf[buf->sz - 2] == '\n' ?
             ROFF_REPARSE | ROFF_USERCALL : ROFF_IGN | ROFF_APPEND;              ROFF_REPARSE | ROFF_USERCALL : ROFF_IGN | ROFF_APPEND;
 }  }
   

Legend:
Removed from v.1.364  
changed lines
  Added in v.1.371

CVSweb