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

Diff for /mandoc/roff.c between version 1.124 and 1.125

version 1.124, 2011/01/25 01:12:02 version 1.125, 2011/02/06 20:36:36
Line 64  enum rofft {
Line 64  enum rofft {
         ROFF_TS,          ROFF_TS,
         ROFF_TE,          ROFF_TE,
         ROFF_T_,          ROFF_T_,
           ROFF_EQ,
           ROFF_EN,
         ROFF_cblock,          ROFF_cblock,
         ROFF_ccond, /* FIXME: remove this. */          ROFF_ccond, /* FIXME: remove this. */
         ROFF_USERDEF,          ROFF_USERDEF,
Line 93  struct roff {
Line 95  struct roff {
         struct tbl_node *first_tbl; /* first table parsed */          struct tbl_node *first_tbl; /* first table parsed */
         struct tbl_node *last_tbl; /* last table parsed */          struct tbl_node *last_tbl; /* last table parsed */
         struct tbl_node *tbl; /* current table being parsed */          struct tbl_node *tbl; /* current table being parsed */
           struct eqn_node *last_eqn; /* last equation parsed */
           struct eqn_node *first_eqn; /* first equation parsed */
           struct eqn_node *eqn; /* current equation being parsed */
 };  };
   
 struct  roffnode {  struct  roffnode {
Line 151  static void   roff_setstr(struct roff *,
Line 156  static void   roff_setstr(struct roff *,
 static  enum rofferr     roff_so(ROFF_ARGS);  static  enum rofferr     roff_so(ROFF_ARGS);
 static  enum rofferr     roff_TE(ROFF_ARGS);  static  enum rofferr     roff_TE(ROFF_ARGS);
 static  enum rofferr     roff_TS(ROFF_ARGS);  static  enum rofferr     roff_TS(ROFF_ARGS);
   static  enum rofferr     roff_EQ(ROFF_ARGS);
   static  enum rofferr     roff_EN(ROFF_ARGS);
 static  enum rofferr     roff_T_(ROFF_ARGS);  static  enum rofferr     roff_T_(ROFF_ARGS);
 static  enum rofferr     roff_userdef(ROFF_ARGS);  static  enum rofferr     roff_userdef(ROFF_ARGS);
   
Line 189  static struct roffmac  roffs[ROFF_MAX] = {
Line 196  static struct roffmac  roffs[ROFF_MAX] = {
         { "TS", roff_TS, NULL, NULL, 0, NULL },          { "TS", roff_TS, NULL, NULL, 0, NULL },
         { "TE", roff_TE, NULL, NULL, 0, NULL },          { "TE", roff_TE, NULL, NULL, 0, NULL },
         { "T&", roff_T_, NULL, NULL, 0, NULL },          { "T&", roff_T_, NULL, NULL, 0, NULL },
           { "EQ", roff_EQ, NULL, NULL, 0, NULL },
           { "EN", roff_EN, NULL, NULL, 0, NULL },
         { ".", roff_cblock, NULL, NULL, 0, NULL },          { ".", roff_cblock, NULL, NULL, 0, NULL },
         { "\\}", roff_ccond, NULL, NULL, 0, NULL },          { "\\}", roff_ccond, NULL, NULL, 0, NULL },
         { NULL, roff_userdef, NULL, NULL, 0, NULL },          { NULL, roff_userdef, NULL, NULL, 0, NULL },
Line 311  static void
Line 320  static void
 roff_free1(struct roff *r)  roff_free1(struct roff *r)
 {  {
         struct tbl_node *t;          struct tbl_node *t;
           struct eqn_node *e;
   
         while (r->first_tbl) {          while (NULL != (t = r->first_tbl)) {
                 t = r->first_tbl;  
                 r->first_tbl = t->next;                  r->first_tbl = t->next;
                 tbl_free(t);                  tbl_free(t);
         }          }
   
         r->first_tbl = r->last_tbl = r->tbl = NULL;          r->first_tbl = r->last_tbl = r->tbl = NULL;
   
           while (NULL != (e = r->first_eqn)) {
                   r->first_eqn = e->next;
                   eqn_free(e);
           }
   
           r->first_eqn = r->last_eqn = r->eqn = NULL;
   
         while (r->last)          while (r->last)
                 roffnode_pop(r);                  roffnode_pop(r);
   
Line 477  roff_parseln(struct roff *r, int ln, char **bufp, 
Line 493  roff_parseln(struct roff *r, int ln, char **bufp, 
          * First, if a scope is open and we're not a macro, pass the           * First, if a scope is open and we're not a macro, pass the
          * text through the macro's filter.  If a scope isn't open and           * text through the macro's filter.  If a scope isn't open and
          * we're not a macro, just let it through.           * we're not a macro, just let it through.
            * Finally, if there's an equation scope open, divert it into it
            * no matter our state.
          */           */
   
         if (r->last && ! ROFF_CTL((*bufp)[pos])) {          if (r->last && ! ROFF_CTL((*bufp)[pos])) {
Line 485  roff_parseln(struct roff *r, int ln, char **bufp, 
Line 503  roff_parseln(struct roff *r, int ln, char **bufp, 
                 e = (*roffs[t].text)                  e = (*roffs[t].text)
                         (r, t, bufp, szp, ln, pos, pos, offs);                          (r, t, bufp, szp, ln, pos, pos, offs);
                 assert(ROFF_IGN == e || ROFF_CONT == e);                  assert(ROFF_IGN == e || ROFF_CONT == e);
                 if (ROFF_CONT == e && r->tbl)                  if (ROFF_CONT != e)
                           return(e);
                   if (r->eqn)
                           return(eqn_read(&r->eqn, ln, *bufp, *offs));
                   if (r->tbl)
                         return(tbl_read(r->tbl, ln, *bufp, *offs));                          return(tbl_read(r->tbl, ln, *bufp, *offs));
                 return(e);                  return(ROFF_CONT);
         } else if ( ! ROFF_CTL((*bufp)[pos])) {          } else if ( ! ROFF_CTL((*bufp)[pos])) {
                   if (r->eqn)
                           return(eqn_read(&r->eqn, ln, *bufp, *offs));
                 if (r->tbl)                  if (r->tbl)
                         return(tbl_read(r->tbl, ln, *bufp, *offs));                          return(tbl_read(r->tbl, ln, *bufp, *offs));
                 return(ROFF_CONT);                  return(ROFF_CONT);
         }          } else if (r->eqn)
                   return(eqn_read(&r->eqn, ln, *bufp, *offs));
   
         /*          /*
          * If a scope is open, go to the child handler for that macro,           * If a scope is open, go to the child handler for that macro,
          * as it may want to preprocess before doing anything with it.           * as it may want to preprocess before doing anything with it.
            * Don't do so if an equation is open.
          */           */
   
         if (r->last) {          if (r->last) {
Line 532  roff_endparse(struct roff *r)
Line 558  roff_endparse(struct roff *r)
                 (*r->msg)(MANDOCERR_SCOPEEXIT, r->data,                  (*r->msg)(MANDOCERR_SCOPEEXIT, r->data,
                                 r->last->line, r->last->col, NULL);                                  r->last->line, r->last->col, NULL);
   
           if (r->eqn) {
                   (*r->msg)(MANDOCERR_SCOPEEXIT, r->data,
                                   r->eqn->line, r->eqn->pos, NULL);
                   eqn_end(r->eqn);
                   r->eqn = NULL;
           }
   
         if (r->tbl) {          if (r->tbl) {
                 (*r->msg)(MANDOCERR_SCOPEEXIT, r->data,                  (*r->msg)(MANDOCERR_SCOPEEXIT, r->data,
                                 r->tbl->line, r->tbl->pos, NULL);                                  r->tbl->line, r->tbl->pos, NULL);
Line 1140  roff_T_(ROFF_ARGS)
Line 1173  roff_T_(ROFF_ARGS)
   
 /* ARGSUSED */  /* ARGSUSED */
 static enum rofferr  static enum rofferr
   roff_EQ(ROFF_ARGS)
   {
           struct eqn_node *e;
   
           assert(NULL == r->eqn);
           e = eqn_alloc(ppos, ln);
   
           if (r->last_eqn)
                   r->last_eqn->next = e;
           else
                   r->first_eqn = r->last_eqn = e;
   
           r->eqn = r->last_eqn = e;
           return(ROFF_IGN);
   }
   
   /* ARGSUSED */
   static enum rofferr
   roff_EN(ROFF_ARGS)
   {
   
           (*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL);
           return(ROFF_IGN);
   }
   
   /* ARGSUSED */
   static enum rofferr
 roff_TS(ROFF_ARGS)  roff_TS(ROFF_ARGS)
 {  {
         struct tbl_node *t;          struct tbl_node *t;
Line 1240  roff_userdef(ROFF_ARGS)
Line 1300  roff_userdef(ROFF_ARGS)
            ROFF_REPARSE : ROFF_APPEND);             ROFF_REPARSE : ROFF_APPEND);
 }  }
   
   
 static char *  static char *
 roff_getname(struct roff *r, char **cpp, int ln, int pos)  roff_getname(struct roff *r, char **cpp, int ln, int pos)
 {  {
Line 1274  roff_getname(struct roff *r, char **cpp, int ln, int p
Line 1333  roff_getname(struct roff *r, char **cpp, int ln, int p
         return(name);          return(name);
 }  }
   
   
 /*  /*
  * Store *string into the user-defined string called *name.   * Store *string into the user-defined string called *name.
  * In multiline mode, append to an existing entry and append '\n';   * In multiline mode, append to an existing entry and append '\n';
Line 1344  roff_setstr(struct roff *r, const char *name, const ch
Line 1402  roff_setstr(struct roff *r, const char *name, const ch
         *c = '\0';          *c = '\0';
 }  }
   
   
 static const char *  static const char *
 roff_getstrn(const struct roff *r, const char *name, size_t len)  roff_getstrn(const struct roff *r, const char *name, size_t len)
 {  {
Line 1357  roff_getstrn(const struct roff *r, const char *name, s
Line 1414  roff_getstrn(const struct roff *r, const char *name, s
         return(n ? n->string : NULL);          return(n ? n->string : NULL);
 }  }
   
   
 static void  static void
 roff_freestr(struct roff *r)  roff_freestr(struct roff *r)
 {  {
Line 1378  roff_span(const struct roff *r)
Line 1434  roff_span(const struct roff *r)
 {  {
   
         return(r->tbl ? tbl_span(r->tbl) : NULL);          return(r->tbl ? tbl_span(r->tbl) : NULL);
   }
   
   const struct eqn *
   roff_eqn(const struct roff *r)
   {
   
           return(r->last_eqn ? &r->last_eqn->eqn : NULL);
 }  }

Legend:
Removed from v.1.124  
changed lines
  Added in v.1.125

CVSweb