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

Diff for /mandoc/roff.c between version 1.220 and 1.226

version 1.220, 2014/07/07 11:35:06 version 1.226, 2014/08/19 16:52:32
Line 15 
Line 15 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
 #ifdef HAVE_CONFIG_H  
 #include "config.h"  #include "config.h"
 #endif  
   
   #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
 #include <stdio.h>  #include <stdio.h>
Line 27 
Line 27 
   
 #include "mandoc.h"  #include "mandoc.h"
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
 #include "libroff.h"  
 #include "libmandoc.h"  #include "libmandoc.h"
   #include "libroff.h"
   
 /* Maximum number of nested if-else conditionals. */  /* Maximum number of nested if-else conditionals. */
 #define RSTACK_MAX      128  #define RSTACK_MAX      128
Line 106  struct roffreg {
Line 106  struct roffreg {
   
 struct  roff {  struct  roff {
         struct mparse   *parse; /* parse point */          struct mparse   *parse; /* parse point */
         int              options; /* parse options */  
         struct roffnode *last; /* leaf of stack */          struct roffnode *last; /* leaf of stack */
         int              rstack[RSTACK_MAX]; /* stack of !`ie' rules */          int             *rstack; /* stack of inverted `ie' values */
         char             control; /* control character */  
         int              rstackpos; /* position in rstack */  
         struct roffreg  *regtab; /* number registers */          struct roffreg  *regtab; /* number registers */
         struct roffkv   *strtab; /* user-defined strings & macros */          struct roffkv   *strtab; /* user-defined strings & macros */
         struct roffkv   *xmbtab; /* multi-byte trans table (`tr') */          struct roffkv   *xmbtab; /* multi-byte trans table (`tr') */
Line 122  struct roff {
Line 119  struct roff {
         struct eqn_node *last_eqn; /* last equation parsed */          struct eqn_node *last_eqn; /* last equation parsed */
         struct eqn_node *first_eqn; /* first equation parsed */          struct eqn_node *first_eqn; /* first equation parsed */
         struct eqn_node *eqn; /* current equation being parsed */          struct eqn_node *eqn; /* current equation being parsed */
           int              options; /* parse options */
           int              rstacksz; /* current size limit of rstack */
           int              rstackpos; /* position in rstack */
           char             control; /* control character */
 };  };
   
 struct  roffnode {  struct  roffnode {
Line 420  roff_free1(struct roff *r)
Line 421  roff_free1(struct roff *r)
                 r->first_tbl = tbl->next;                  r->first_tbl = tbl->next;
                 tbl_free(tbl);                  tbl_free(tbl);
         }          }
   
         r->first_tbl = r->last_tbl = r->tbl = NULL;          r->first_tbl = r->last_tbl = r->tbl = NULL;
   
         while (NULL != (e = r->first_eqn)) {          while (NULL != (e = r->first_eqn)) {
                 r->first_eqn = e->next;                  r->first_eqn = e->next;
                 eqn_free(e);                  eqn_free(e);
         }          }
   
         r->first_eqn = r->last_eqn = r->eqn = NULL;          r->first_eqn = r->last_eqn = r->eqn = NULL;
   
         while (r->last)          while (r->last)
                 roffnode_pop(r);                  roffnode_pop(r);
   
         roff_freestr(r->strtab);          free (r->rstack);
         roff_freestr(r->xmbtab);          r->rstack = NULL;
           r->rstacksz = 0;
           r->rstackpos = -1;
   
         r->strtab = r->xmbtab = NULL;  
   
         roff_freereg(r->regtab);          roff_freereg(r->regtab);
   
         r->regtab = NULL;          r->regtab = NULL;
   
           roff_freestr(r->strtab);
           roff_freestr(r->xmbtab);
           r->strtab = r->xmbtab = NULL;
   
         if (r->xtab)          if (r->xtab)
                 for (i = 0; i < 128; i++)                  for (i = 0; i < 128; i++)
                         free(r->xtab[i].p);                          free(r->xtab[i].p);
   
         free(r->xtab);          free(r->xtab);
         r->xtab = NULL;          r->xtab = NULL;
 }  }
Line 786  roff_endparse(struct roff *r)
Line 787  roff_endparse(struct roff *r)
 {  {
   
         if (r->last)          if (r->last)
                 mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse,                  mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
                     r->last->line, r->last->col, NULL);                      r->last->line, r->last->col,
                       roffs[r->last->tok].name);
   
         if (r->eqn) {          if (r->eqn) {
                 mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse,                  mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
                     r->eqn->eqn.ln, r->eqn->eqn.pos, NULL);                      r->eqn->eqn.ln, r->eqn->eqn.pos, "EQ");
                 eqn_end(&r->eqn);                  eqn_end(&r->eqn);
         }          }
   
         if (r->tbl) {          if (r->tbl) {
                 mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse,                  mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
                     r->tbl->line, r->tbl->pos, NULL);                      r->tbl->line, r->tbl->pos, "TS");
                 tbl_end(&r->tbl);                  tbl_end(&r->tbl);
         }          }
 }  }
Line 841  roff_cblock(ROFF_ARGS)
Line 843  roff_cblock(ROFF_ARGS)
          */           */
   
         if (NULL == r->last) {          if (NULL == r->last) {
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
                       ln, ppos, "..");
                 return(ROFF_IGN);                  return(ROFF_IGN);
         }          }
   
Line 859  roff_cblock(ROFF_ARGS)
Line 862  roff_cblock(ROFF_ARGS)
         case ROFF_ig:          case ROFF_ig:
                 break;                  break;
         default:          default:
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
                       ln, ppos, "..");
                 return(ROFF_IGN);                  return(ROFF_IGN);
         }          }
   
Line 889  roff_ccond(struct roff *r, int ln, int ppos)
Line 893  roff_ccond(struct roff *r, int ln, int ppos)
 {  {
   
         if (NULL == r->last) {          if (NULL == r->last) {
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
                       ln, ppos, "\\}");
                 return;                  return;
         }          }
   
Line 901  roff_ccond(struct roff *r, int ln, int ppos)
Line 906  roff_ccond(struct roff *r, int ln, int ppos)
         case ROFF_if:          case ROFF_if:
                 break;                  break;
         default:          default:
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
                       ln, ppos, "\\}");
                 return;                  return;
         }          }
   
         if (r->last->endspan > -1) {          if (r->last->endspan > -1) {
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
                       ln, ppos, "\\}");
                 return;                  return;
         }          }
   
Line 1277  roff_cond(ROFF_ARGS)
Line 1284  roff_cond(ROFF_ARGS)
          */           */
   
         if (ROFF_ie == tok) {          if (ROFF_ie == tok) {
                 if (r->rstackpos == RSTACK_MAX - 1) {                  if (r->rstackpos + 1 == r->rstacksz) {
                         mandoc_msg(MANDOCERR_MEM,                          r->rstacksz += 16;
                             r->parse, ln, ppos, NULL);                          r->rstack = mandoc_reallocarray(r->rstack,
                         return(ROFF_ERR);                              r->rstacksz, sizeof(int));
                 }                  }
                 r->rstack[++r->rstackpos] = !r->last->rule;                  r->rstack[++r->rstackpos] = !r->last->rule;
         }          }
Line 1752  roff_it(ROFF_ARGS)
Line 1759  roff_it(ROFF_ARGS)
         len = strcspn(cp, " \t");          len = strcspn(cp, " \t");
         cp[len] = '\0';          cp[len] = '\0';
         if ((iv = mandoc_strntoi(cp, len, 10)) <= 0) {          if ((iv = mandoc_strntoi(cp, len, 10)) <= 0) {
                 mandoc_msg(MANDOCERR_NUMERIC, r->parse,                  mandoc_msg(MANDOCERR_IT_NONUM, r->parse,
                     ln, ppos, *bufp + 1);                      ln, ppos, *bufp + 1);
                 return(ROFF_IGN);                  return(ROFF_IGN);
         }          }
Line 1793  roff_TE(ROFF_ARGS)
Line 1800  roff_TE(ROFF_ARGS)
 {  {
   
         if (NULL == r->tbl)          if (NULL == r->tbl)
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
                       ln, ppos, "TE");
         else          else
                 tbl_end(&r->tbl);                  tbl_end(&r->tbl);
   
Line 1805  roff_T_(ROFF_ARGS)
Line 1813  roff_T_(ROFF_ARGS)
 {  {
   
         if (NULL == r->tbl)          if (NULL == r->tbl)
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
                       ln, ppos, "T&");
         else          else
                 tbl_restart(ppos, ln, r->tbl);                  tbl_restart(ppos, ln, r->tbl);
   
Line 1856  static enum rofferr
Line 1865  static enum rofferr
 roff_EN(ROFF_ARGS)  roff_EN(ROFF_ARGS)
 {  {
   
         mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);          mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse, ln, ppos, "EN");
         return(ROFF_IGN);          return(ROFF_IGN);
 }  }
   
Line 1866  roff_TS(ROFF_ARGS)
Line 1875  roff_TS(ROFF_ARGS)
         struct tbl_node *tbl;          struct tbl_node *tbl;
   
         if (r->tbl) {          if (r->tbl) {
                 mandoc_msg(MANDOCERR_SCOPEBROKEN, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_BLK_BROKEN, r->parse,
                       ln, ppos, "TS breaks TS");
                 tbl_end(&r->tbl);                  tbl_end(&r->tbl);
         }          }
   
Line 1965  roff_so(ROFF_ARGS)
Line 1975  roff_so(ROFF_ARGS)
         char *name;          char *name;
   
         name = *bufp + pos;          name = *bufp + pos;
         mandoc_vmsg(MANDOCERR_SO, r->parse, ln, ppos, ".so %s", name);          mandoc_vmsg(MANDOCERR_SO, r->parse, ln, ppos, "so %s", name);
   
         /*          /*
          * Handle `so'.  Be EXTREMELY careful, as we shouldn't be           * Handle `so'.  Be EXTREMELY careful, as we shouldn't be
Line 2057  roff_getname(struct roff *r, char **cpp, int ln, int p
Line 2067  roff_getname(struct roff *r, char **cpp, int ln, int p
                 cp++;                  cp++;
                 if ('\\' == *cp)                  if ('\\' == *cp)
                         continue;                          continue;
                 mandoc_msg(MANDOCERR_NAMESC, r->parse, ln, pos, NULL);                  mandoc_vmsg(MANDOCERR_NAMESC, r->parse, ln, pos,
                       "%.*s", (int)(cp - name + 1), name);
                 mandoc_escape((const char **)&cp, NULL, NULL);                  mandoc_escape((const char **)&cp, NULL, NULL);
                 break;                  break;
         }          }

Legend:
Removed from v.1.220  
changed lines
  Added in v.1.226

CVSweb