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

Diff for /mandoc/roff.c between version 1.319 and 1.323

version 1.319, 2017/07/08 14:51:04 version 1.323, 2017/07/14 16:49:39
Line 153  static void   roffnode_cleanscope(struct roff *);
Line 153  static void   roffnode_cleanscope(struct roff *);
 static  void             roffnode_pop(struct roff *);  static  void             roffnode_pop(struct roff *);
 static  void             roffnode_push(struct roff *, enum roff_tok,  static  void             roffnode_push(struct roff *, enum roff_tok,
                                 const char *, int, int);                                  const char *, int, int);
   static  void             roff_addtbl(struct roff_man *, struct tbl_node *);
 static  enum rofferr     roff_als(ROFF_ARGS);  static  enum rofferr     roff_als(ROFF_ARGS);
 static  enum rofferr     roff_block(ROFF_ARGS);  static  enum rofferr     roff_block(ROFF_ARGS);
 static  enum rofferr     roff_block_text(ROFF_ARGS);  static  enum rofferr     roff_block_text(ROFF_ARGS);
Line 979  roff_body_alloc(struct roff_man *man, int line, int po
Line 980  roff_body_alloc(struct roff_man *man, int line, int po
         return n;          return n;
 }  }
   
 void  static void
 roff_addtbl(struct roff_man *man, const struct tbl_span *tbl)  roff_addtbl(struct roff_man *man, struct tbl_node *tbl)
 {  {
         struct roff_node        *n;          struct roff_node        *n;
           const struct tbl_span   *span;
   
         if (man->macroset == MACROSET_MAN)          if (man->macroset == MACROSET_MAN)
                 man_breakscope(man, ROFF_TS);                  man_breakscope(man, ROFF_TS);
         n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE);          while ((span = tbl_span(tbl)) != NULL) {
         n->span = tbl;                  n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE);
         roff_node_append(man, n);                  n->span = span;
         n->flags |= NODE_VALID | NODE_ENDED;                  roff_node_append(man, n);
         man->next = ROFF_NEXT_SIBLING;                  n->flags |= NODE_VALID | NODE_ENDED;
                   man->next = ROFF_NEXT_SIBLING;
           }
 }  }
   
 void  void
Line 1123  roff_res(struct roff *r, struct buf *buf, int ln, int 
Line 1127  roff_res(struct roff *r, struct buf *buf, int ln, int 
         size_t           maxl;  /* expected length of the escape name */          size_t           maxl;  /* expected length of the escape name */
         size_t           naml;  /* actual length of the escape name */          size_t           naml;  /* actual length of the escape name */
         enum mandoc_esc  esc;   /* type of the escape sequence */          enum mandoc_esc  esc;   /* type of the escape sequence */
         enum mandoc_os   os_e;  /* kind of RCS id seen */  
         int              inaml; /* length returned from mandoc_escape() */          int              inaml; /* length returned from mandoc_escape() */
         int              expand_count;  /* to avoid infinite loops */          int              expand_count;  /* to avoid infinite loops */
         int              npos;  /* position in numeric expression */          int              npos;  /* position in numeric expression */
         int              arg_complete; /* argument not interrupted by eol */          int              arg_complete; /* argument not interrupted by eol */
         int              done;  /* no more input available */          int              done;  /* no more input available */
         int              deftype; /* type of definition to paste */          int              deftype; /* type of definition to paste */
           int              rcsid; /* kind of RCS id seen */
         char             term;  /* character terminating the escape */          char             term;  /* character terminating the escape */
   
         /* Search forward for comments. */          /* Search forward for comments. */
Line 1145  roff_res(struct roff *r, struct buf *buf, int ln, int 
Line 1149  roff_res(struct roff *r, struct buf *buf, int ln, int 
   
                 /* Comment found, look for RCS id. */                  /* Comment found, look for RCS id. */
   
                   rcsid = 0;
                 if ((cp = strstr(stesc, "$" "OpenBSD")) != NULL) {                  if ((cp = strstr(stesc, "$" "OpenBSD")) != NULL) {
                         os_e = MANDOC_OS_OPENBSD;                          rcsid = 1 << MANDOC_OS_OPENBSD;
                         cp += 8;                          cp += 8;
                 } else if ((cp = strstr(stesc, "$" "NetBSD")) != NULL) {                  } else if ((cp = strstr(stesc, "$" "NetBSD")) != NULL) {
                         os_e = MANDOC_OS_NETBSD;                          rcsid = 1 << MANDOC_OS_NETBSD;
                         cp += 7;                          cp += 7;
                 }                  }
                 if (cp != NULL &&                  if (cp != NULL &&
                     isalnum((unsigned char)*cp) == 0 &&                      isalnum((unsigned char)*cp) == 0 &&
                     strchr(cp, '$') != NULL) {                      strchr(cp, '$') != NULL) {
                         if (r->man->meta.rcsids & (1 << os_e))                          if (r->man->meta.rcsids & rcsid)
                                 mandoc_msg(MANDOCERR_RCS_REP, r->parse,                                  mandoc_msg(MANDOCERR_RCS_REP, r->parse,
                                     ln, stesc + 1 - buf->buf, stesc + 1);                                      ln, stesc + 1 - buf->buf, stesc + 1);
                         r->man->meta.rcsids |= 1 << os_e;                          r->man->meta.rcsids |= rcsid;
                 }                  }
   
                 /* Handle trailing whitespace. */                  /* Handle trailing whitespace. */
Line 1501  roff_parseln(struct roff *r, int ln, struct buf *buf, 
Line 1506  roff_parseln(struct roff *r, int ln, struct buf *buf, 
                 eqn_read(r->eqn, buf->buf + ppos);                  eqn_read(r->eqn, buf->buf + ppos);
                 return ROFF_IGN;                  return ROFF_IGN;
         }          }
         if (r->tbl != NULL && ( ! ctl || buf->buf[pos] == '\0'))          if (r->tbl != NULL && (ctl == 0 || buf->buf[pos] == '\0')) {
                 return tbl_read(r->tbl, ln, buf->buf, ppos);                  tbl_read(r->tbl, ln, buf->buf, ppos);
                   roff_addtbl(r->man, r->tbl);
                   return ROFF_IGN;
           }
         if ( ! ctl)          if ( ! ctl)
                 return roff_parsetext(r, buf, pos, offs);                  return roff_parsetext(r, buf, pos, offs);
   
Line 1543  roff_parseln(struct roff *r, int ln, struct buf *buf, 
Line 1551  roff_parseln(struct roff *r, int ln, struct buf *buf, 
                         pos++;                          pos++;
                 while (buf->buf[pos] == ' ')                  while (buf->buf[pos] == ' ')
                         pos++;                          pos++;
                 return tbl_read(r->tbl, ln, buf->buf, pos);                  tbl_read(r->tbl, ln, buf->buf, pos);
                   roff_addtbl(r->man, r->tbl);
                   return ROFF_IGN;
         }          }
   
         /* For now, let high level macros abort .ce mode. */          /* For now, let high level macros abort .ce mode. */
Line 1572  roff_parseln(struct roff *r, int ln, struct buf *buf, 
Line 1582  roff_parseln(struct roff *r, int ln, struct buf *buf, 
 void  void
 roff_endparse(struct roff *r)  roff_endparse(struct roff *r)
 {  {
           if (r->last != NULL)
         if (r->last)  
                 mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,                  mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
                     r->last->line, r->last->col,                      r->last->line, r->last->col,
                     roff_name[r->last->tok]);                      roff_name[r->last->tok]);
   
         if (r->eqn) {          if (r->eqn != NULL) {
                 mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,                  mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
                     r->eqn->node->line, r->eqn->node->pos, "EQ");                      r->eqn->node->line, r->eqn->node->pos, "EQ");
                 eqn_parse(r->eqn);                  eqn_parse(r->eqn);
                 r->eqn = NULL;                  r->eqn = NULL;
         }          }
   
         if (r->tbl) {          if (r->tbl != NULL) {
                 mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,                  mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
                     r->tbl->line, r->tbl->pos, "TS");                      r->tbl->line, r->tbl->pos, "TS");
                 tbl_end(&r->tbl);                  tbl_end(r->tbl);
                   r->tbl = NULL;
         }          }
 }  }
   
Line 2770  roff_Dd(ROFF_ARGS)
Line 2780  roff_Dd(ROFF_ARGS)
 static enum rofferr  static enum rofferr
 roff_TE(ROFF_ARGS)  roff_TE(ROFF_ARGS)
 {  {
           if (r->tbl == NULL) {
         if (NULL == r->tbl)  
                 mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
                     ln, ppos, "TE");                      ln, ppos, "TE");
         else if ( ! tbl_end(&r->tbl)) {                  return ROFF_IGN;
           }
           if (tbl_end(r->tbl) == 0) {
                   r->tbl = NULL;
                 free(buf->buf);                  free(buf->buf);
                 buf->buf = mandoc_strdup(".sp");                  buf->buf = mandoc_strdup(".sp");
                 buf->sz = 4;                  buf->sz = 4;
                 return ROFF_REPARSE;                  return ROFF_REPARSE;
         }          }
           r->tbl = NULL;
         return ROFF_IGN;          return ROFF_IGN;
 }  }
   
Line 2867  roff_EQ(ROFF_ARGS)
Line 2880  roff_EQ(ROFF_ARGS)
 {  {
         struct roff_node        *n;          struct roff_node        *n;
   
           if (r->man->macroset == MACROSET_MAN)
                   man_breakscope(r->man, ROFF_EQ);
         n = roff_node_alloc(r->man, ln, ppos, ROFFT_EQN, TOKEN_NONE);          n = roff_node_alloc(r->man, ln, ppos, ROFFT_EQN, TOKEN_NONE);
         if (ln > r->man->last->line)          if (ln > r->man->last->line)
                 n->flags |= NODE_LINE;                  n->flags |= NODE_LINE;
Line 2907  roff_EN(ROFF_ARGS)
Line 2922  roff_EN(ROFF_ARGS)
 static enum rofferr  static enum rofferr
 roff_TS(ROFF_ARGS)  roff_TS(ROFF_ARGS)
 {  {
         struct tbl_node *tbl;          if (r->tbl != NULL) {
   
         if (r->tbl) {  
                 mandoc_msg(MANDOCERR_BLK_BROKEN, r->parse,                  mandoc_msg(MANDOCERR_BLK_BROKEN, r->parse,
                     ln, ppos, "TS breaks TS");                      ln, ppos, "TS breaks TS");
                 tbl_end(&r->tbl);                  tbl_end(r->tbl);
         }          }
           r->tbl = tbl_alloc(ppos, ln, r->parse);
         tbl = tbl_alloc(ppos, ln, r->parse);  
   
         if (r->last_tbl)          if (r->last_tbl)
                 r->last_tbl->next = tbl;                  r->last_tbl->next = r->tbl;
         else          else
                 r->first_tbl = r->last_tbl = tbl;                  r->first_tbl = r->tbl;
           r->last_tbl = r->tbl;
         r->tbl = r->last_tbl = tbl;  
         return ROFF_IGN;          return ROFF_IGN;
 }  }
   
Line 2934  roff_onearg(ROFF_ARGS)
Line 2944  roff_onearg(ROFF_ARGS)
         int                      npos;          int                      npos;
   
         if (r->man->flags & (MAN_BLINE | MAN_ELINE) &&          if (r->man->flags & (MAN_BLINE | MAN_ELINE) &&
             (tok == ROFF_sp || tok == ROFF_ti))              (tok == ROFF_ce || tok == ROFF_rj || tok == ROFF_sp ||
                tok == ROFF_ti))
                 man_breakscope(r->man, tok);                  man_breakscope(r->man, tok);
   
         if (roffce_node != NULL && (tok == ROFF_ce || tok == ROFF_rj)) {          if (roffce_node != NULL && (tok == ROFF_ce || tok == ROFF_rj)) {
Line 3599  roff_freestr(struct roffkv *r)
Line 3610  roff_freestr(struct roffkv *r)
 }  }
   
 /* --- accessors and utility functions ------------------------------------ */  /* --- accessors and utility functions ------------------------------------ */
   
 const struct tbl_span *  
 roff_span(const struct roff *r)  
 {  
   
         return r->tbl ? tbl_span(r->tbl) : NULL;  
 }  
   
 /*  /*
  * Duplicate an input string, making the appropriate character   * Duplicate an input string, making the appropriate character

Legend:
Removed from v.1.319  
changed lines
  Added in v.1.323

CVSweb