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

Diff for /mandoc/roff.c between version 1.345 and 1.346

version 1.345, 2018/12/12 21:54:35 version 1.346, 2018/12/13 02:06:07
Line 32 
Line 32 
 #include "mandoc_ohash.h"  #include "mandoc_ohash.h"
 #include "mandoc.h"  #include "mandoc.h"
 #include "roff.h"  #include "roff.h"
 #include "tbl.h"  
 #include "libmandoc.h"  #include "libmandoc.h"
 #include "roff_int.h"  #include "roff_int.h"
 #include "libroff.h"  #include "libroff.h"
   #include "tbl_parse.h"
   
 /* Maximum number of string expansions per line, to break infinite loops. */  /* Maximum number of string expansions per line, to break infinite loops. */
 #define EXPAND_LIMIT    1000  #define EXPAND_LIMIT    1000
Line 168  static int   roffnode_cleanscope(struct roff *);
Line 168  static int   roffnode_cleanscope(struct roff *);
 static  int              roffnode_pop(struct roff *);  static  int              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  void             roff_addtbl(struct roff_man *, int, struct tbl_node *);
 static  int              roff_als(ROFF_ARGS);  static  int              roff_als(ROFF_ARGS);
 static  int              roff_block(ROFF_ARGS);  static  int              roff_block(ROFF_ARGS);
 static  int              roff_block_text(ROFF_ARGS);  static  int              roff_block_text(ROFF_ARGS);
Line 718  roffnode_push(struct roff *r, enum roff_tok tok, const
Line 718  roffnode_push(struct roff *r, enum roff_tok tok, const
 static void  static void
 roff_free1(struct roff *r)  roff_free1(struct roff *r)
 {  {
         struct tbl_node *tbl;  
         int              i;          int              i;
   
         while (NULL != (tbl = r->first_tbl)) {          tbl_free(r->first_tbl);
                 r->first_tbl = tbl->next;  
                 tbl_free(tbl);  
         }  
         r->first_tbl = r->last_tbl = r->tbl = NULL;          r->first_tbl = r->last_tbl = r->tbl = NULL;
   
         if (r->last_eqn != NULL)          if (r->last_eqn != NULL)
Line 1014  roff_body_alloc(struct roff_man *man, int line, int po
Line 1010  roff_body_alloc(struct roff_man *man, int line, int po
 }  }
   
 static void  static void
 roff_addtbl(struct roff_man *man, struct tbl_node *tbl)  roff_addtbl(struct roff_man *man, int line, struct tbl_node *tbl)
 {  {
         struct roff_node        *n;          struct roff_node        *n;
         const struct tbl_span   *span;          struct tbl_span         *span;
   
         if (man->macroset == MACROSET_MAN)          if (man->macroset == MACROSET_MAN)
                 man_breakscope(man, ROFF_TS);                  man_breakscope(man, ROFF_TS);
         while ((span = tbl_span(tbl)) != NULL) {          while ((span = tbl_span(tbl)) != NULL) {
                 n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE);                  n = roff_node_alloc(man, line, 0, ROFFT_TBL, TOKEN_NONE);
                 n->span = span;                  n->span = span;
                 roff_node_append(man, n);                  roff_node_append(man, n);
                 n->flags |= NODE_VALID | NODE_ENDED;                  n->flags |= NODE_VALID | NODE_ENDED;
Line 1660  roff_parseln(struct roff *r, int ln, struct buf *buf, 
Line 1656  roff_parseln(struct roff *r, int ln, struct buf *buf, 
         }          }
         if (r->tbl != NULL && (ctl == 0 || buf->buf[pos] == '\0')) {          if (r->tbl != NULL && (ctl == 0 || buf->buf[pos] == '\0')) {
                 tbl_read(r->tbl, ln, buf->buf, ppos);                  tbl_read(r->tbl, ln, buf->buf, ppos);
                 roff_addtbl(r->man, r->tbl);                  roff_addtbl(r->man, ln, r->tbl);
                 return e;                  return e;
         }          }
         if ( ! ctl)          if ( ! ctl)
Line 1704  roff_parseln(struct roff *r, int ln, struct buf *buf, 
Line 1700  roff_parseln(struct roff *r, int ln, struct buf *buf, 
                 while (buf->buf[pos] == ' ')                  while (buf->buf[pos] == ' ')
                         pos++;                          pos++;
                 tbl_read(r->tbl, ln, buf->buf, pos);                  tbl_read(r->tbl, ln, buf->buf, pos);
                 roff_addtbl(r->man, r->tbl);                  roff_addtbl(r->man, ln, r->tbl);
                 return ROFF_IGN;                  return ROFF_IGN;
         }          }
   
Line 1767  roff_endparse(struct roff *r)
Line 1763  roff_endparse(struct roff *r)
         }          }
   
         if (r->tbl != NULL) {          if (r->tbl != NULL) {
                 mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,                  tbl_end(r->tbl, 1);
                     r->tbl->line, r->tbl->pos, "TS");  
                 tbl_end(r->tbl);  
                 r->tbl = NULL;                  r->tbl = NULL;
         }          }
 }  }
Line 3060  roff_TE(ROFF_ARGS)
Line 3054  roff_TE(ROFF_ARGS)
                     ln, ppos, "TE");                      ln, ppos, "TE");
                 return ROFF_IGN;                  return ROFF_IGN;
         }          }
         if (tbl_end(r->tbl) == 0) {          if (tbl_end(r->tbl, 0) == 0) {
                 r->tbl = NULL;                  r->tbl = NULL;
                 free(buf->buf);                  free(buf->buf);
                 buf->buf = mandoc_strdup(".sp");                  buf->buf = mandoc_strdup(".sp");
Line 3201  roff_TS(ROFF_ARGS)
Line 3195  roff_TS(ROFF_ARGS)
         if (r->tbl != NULL) {          if (r->tbl != NULL) {
                 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, 0);
         }          }
         r->tbl = tbl_alloc(ppos, ln, r->parse);          r->tbl = tbl_alloc(ppos, ln, r->parse, r->last_tbl);
         if (r->last_tbl)          if (r->last_tbl == NULL)
                 r->last_tbl->next = r->tbl;  
         else  
                 r->first_tbl = r->tbl;                  r->first_tbl = r->tbl;
         r->last_tbl = r->tbl;          r->last_tbl = r->tbl;
         return ROFF_IGN;          return ROFF_IGN;

Legend:
Removed from v.1.345  
changed lines
  Added in v.1.346

CVSweb