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

Diff for /mandoc/roff.c between version 1.143 and 1.151

version 1.143, 2011/06/30 08:05:13 version 1.151, 2011/07/25 15:37:00
Line 71  enum roffrule {
Line 71  enum roffrule {
         ROFFRULE_DENY          ROFFRULE_DENY
 };  };
   
   /*
    * A single register entity.  If "set" is zero, the value of the
    * register should be the default one, which is per-register.
    * Registers are assumed to be unsigned ints for now.
    */
   struct  reg {
           int               set; /* whether set or not */
           unsigned int      u; /* unsigned integer */
   };
   
 struct  roffstr {  struct  roffstr {
         char            *name; /* key of symbol */          char            *name; /* key of symbol */
         char            *string; /* current value */          char            *string; /* current value */
Line 82  struct roff {
Line 92  struct roff {
         struct roffnode *last; /* leaf of stack */          struct roffnode *last; /* leaf of stack */
         enum roffrule    rstack[RSTACK_MAX]; /* stack of !`ie' rules */          enum roffrule    rstack[RSTACK_MAX]; /* stack of !`ie' rules */
         int              rstackpos; /* position in rstack */          int              rstackpos; /* position in rstack */
         struct regset   *regs; /* read/writable registers */          struct reg       regs[REG__MAX];
         struct roffstr  *first_string; /* user-defined strings & macros */          struct roffstr  *first_string; /* user-defined strings & macros */
         const char      *current_string; /* value of last called user macro */          const char      *current_string; /* value of last called user macro */
         struct tbl_node *first_tbl; /* first table parsed */          struct tbl_node *first_tbl; /* first table parsed */
Line 351  roff_reset(struct roff *r)
Line 361  roff_reset(struct roff *r)
   
         roff_free1(r);          roff_free1(r);
   
           memset(&r->regs, 0, sizeof(struct reg) * REG__MAX);
   
         for (i = 0; i < PREDEFS_MAX; i++)          for (i = 0; i < PREDEFS_MAX; i++)
                 roff_setstr(r, predefs[i].name, predefs[i].str, 0);                  roff_setstr(r, predefs[i].name, predefs[i].str, 0);
 }  }
Line 366  roff_free(struct roff *r)
Line 378  roff_free(struct roff *r)
   
   
 struct roff *  struct roff *
 roff_alloc(struct regset *regs, struct mparse *parse)  roff_alloc(struct mparse *parse)
 {  {
         struct roff     *r;          struct roff     *r;
         int              i;          int              i;
   
         r = mandoc_calloc(1, sizeof(struct roff));          r = mandoc_calloc(1, sizeof(struct roff));
         r->regs = regs;  
         r->parse = parse;          r->parse = parse;
         r->rstackpos = -1;          r->rstackpos = -1;
   
Line 519  roff_parseln(struct roff *r, int ln, char **bufp, 
Line 530  roff_parseln(struct roff *r, int ln, char **bufp, 
                 if (ROFF_CONT != e)                  if (ROFF_CONT != e)
                         return(e);                          return(e);
                 if (r->eqn)                  if (r->eqn)
                         return(eqn_read(&r->eqn, ln, *bufp, pos));                          return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
                 if (r->tbl)                  if (r->tbl)
                         return(tbl_read(r->tbl, ln, *bufp, pos));                          return(tbl_read(r->tbl, ln, *bufp, pos));
                 return(ROFF_CONT);                  return(ROFF_CONT);
         } else if ( ! ctl) {          } else if ( ! ctl) {
                 if (r->eqn)                  if (r->eqn)
                         return(eqn_read(&r->eqn, ln, *bufp, pos));                          return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
                 if (r->tbl)                  if (r->tbl)
                         return(tbl_read(r->tbl, ln, *bufp, pos));                          return(tbl_read(r->tbl, ln, *bufp, pos));
                 return(ROFF_CONT);                  return(ROFF_CONT);
         } else if (r->eqn)          } else if (r->eqn)
                 return(eqn_read(&r->eqn, ln, *bufp, ppos));                  return(eqn_read(&r->eqn, ln, *bufp, ppos, 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,
Line 572  roff_endparse(struct roff *r)
Line 583  roff_endparse(struct roff *r)
   
         if (r->eqn) {          if (r->eqn) {
                 mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse,                  mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse,
                                 r->eqn->eqn.line, r->eqn->eqn.pos, NULL);                                  r->eqn->eqn.ln, r->eqn->eqn.pos, NULL);
                 eqn_end(r->eqn);                  eqn_end(&r->eqn);
                 r->eqn = NULL;  
         }          }
   
         if (r->tbl) {          if (r->tbl) {
                 mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse,                  mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse,
                                 r->tbl->line, r->tbl->pos, NULL);                                  r->tbl->line, r->tbl->pos, NULL);
                 tbl_end(r->tbl);                  tbl_end(&r->tbl);
                 r->tbl = NULL;  
         }          }
 }  }
   
Line 596  roff_parse(struct roff *r, const char *buf, int *pos)
Line 605  roff_parse(struct roff *r, const char *buf, int *pos)
         size_t           maclen;          size_t           maclen;
         enum rofft       t;          enum rofft       t;
   
         if ('\0' == buf[*pos] || '"' == buf[*pos])          if ('\0' == buf[*pos] || '"' == buf[*pos] ||
                           '\t' == buf[*pos] || ' ' == buf[*pos])
                 return(ROFF_MAX);                  return(ROFF_MAX);
   
           /*
            * We stop the macro parse at an escape, tab, space, or nil.
            * However, `\}' is also a valid macro, so make sure we don't
            * clobber it by seeing the `\' as the end of token.
            */
   
         mac = buf + *pos;          mac = buf + *pos;
         maclen = strcspn(mac, " \\\t\0");          maclen = strcspn(mac + 1, " \\\t\0") + 1;
   
         t = (r->current_string = roff_getstrn(r, mac, maclen))          t = (r->current_string = roff_getstrn(r, mac, maclen))
             ? ROFF_USERDEF : roff_hash_find(mac, maclen);              ? ROFF_USERDEF : roff_hash_find(mac, maclen);
Line 882  roff_cond_sub(ROFF_ARGS)
Line 898  roff_cond_sub(ROFF_ARGS)
                         ep++;                          ep++;
                         if ('}' != *ep)                          if ('}' != *ep)
                                 continue;                                  continue;
                         *ep = '&';  
                           /*
                            * Make the \} go away.
                            * This is a little haphazard, as it's not quite
                            * clear how nroff does this.
                            * If we're at the end of line, then just chop
                            * off the \} and resize the buffer.
                            * If we aren't, then conver it to spaces.
                            */
   
                           if ('\0' == *(ep + 1)) {
                                   *--ep = '\0';
                                   *szp -= 2;
                           } else
                                   *(ep - 1) = *ep = ' ';
   
                         roff_ccond(r, ROFF_ccond, bufp, szp,                          roff_ccond(r, ROFF_ccond, bufp, szp,
                                         ln, pos, pos + 2, offs);                                          ln, pos, pos + 2, offs);
                         break;                          break;
Line 1082  roff_ds(ROFF_ARGS)
Line 1113  roff_ds(ROFF_ARGS)
         return(ROFF_IGN);          return(ROFF_IGN);
 }  }
   
   int
   roff_regisset(const struct roff *r, enum regs reg)
   {
   
           return(r->regs[(int)reg].set);
   }
   
   unsigned int
   roff_regget(const struct roff *r, enum regs reg)
   {
   
           return(r->regs[(int)reg].u);
   }
   
   void
   roff_regunset(struct roff *r, enum regs reg)
   {
   
           r->regs[(int)reg].set = 0;
   }
   
 /* ARGSUSED */  /* ARGSUSED */
 static enum rofferr  static enum rofferr
 roff_nr(ROFF_ARGS)  roff_nr(ROFF_ARGS)
Line 1090  roff_nr(ROFF_ARGS)
Line 1141  roff_nr(ROFF_ARGS)
         const char      *key;          const char      *key;
         char            *val;          char            *val;
         int              iv;          int              iv;
         struct reg      *rg;  
   
         val = *bufp + pos;          val = *bufp + pos;
         key = roff_getname(r, &val, ln, pos);          key = roff_getname(r, &val, ln, pos);
         rg = r->regs->regs;  
   
         if (0 == strcmp(key, "nS")) {          if (0 == strcmp(key, "nS")) {
                 rg[(int)REG_nS].set = 1;                  r->regs[(int)REG_nS].set = 1;
                 if ((iv = mandoc_strntou(val, strlen(val), 10)) >= 0)                  if ((iv = mandoc_strntoi(val, strlen(val), 10)) >= 0)
                         rg[REG_nS].v.u = (unsigned)iv;                          r->regs[(int)REG_nS].u = (unsigned)iv;
                 else                  else
                         rg[(int)REG_nS].v.u = 0u;                          r->regs[(int)REG_nS].u = 0u;
         }          }
   
         return(ROFF_IGN);          return(ROFF_IGN);
Line 1131  roff_TE(ROFF_ARGS)
Line 1180  roff_TE(ROFF_ARGS)
         if (NULL == r->tbl)          if (NULL == r->tbl)
                 mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL);
         else          else
                 tbl_end(r->tbl);                  tbl_end(&r->tbl);
   
         r->tbl = NULL;  
         return(ROFF_IGN);          return(ROFF_IGN);
 }  }
   
Line 1150  roff_T_(ROFF_ARGS)
Line 1198  roff_T_(ROFF_ARGS)
         return(ROFF_IGN);          return(ROFF_IGN);
 }  }
   
 /* ARGSUSED */  int
 static enum rofferr  roff_closeeqn(struct roff *r)
 roff_EQ(ROFF_ARGS)  
 {  {
         struct eqn_node *e;  
   
           return(r->eqn && ROFF_EQN == eqn_end(&r->eqn) ? 1 : 0);
   }
   
   void
   roff_openeqn(struct roff *r, const char *name, int line,
                   int offs, const char *buf)
   {
           struct eqn_node *e;
           int              poff;
   
         assert(NULL == r->eqn);          assert(NULL == r->eqn);
         e = eqn_alloc(ppos, ln);          e = eqn_alloc(name, offs, line, r->parse);
   
         if (r->last_eqn)          if (r->last_eqn)
                 r->last_eqn->next = e;                  r->last_eqn->next = e;
Line 1165  roff_EQ(ROFF_ARGS)
Line 1221  roff_EQ(ROFF_ARGS)
                 r->first_eqn = r->last_eqn = e;                  r->first_eqn = r->last_eqn = e;
   
         r->eqn = r->last_eqn = e;          r->eqn = r->last_eqn = e;
   
           if (buf) {
                   poff = 0;
                   eqn_read(&r->eqn, line, buf, offs, &poff);
           }
   }
   
   /* ARGSUSED */
   static enum rofferr
   roff_EQ(ROFF_ARGS)
   {
   
           roff_openeqn(r, *bufp + pos, ln, ppos, NULL);
         return(ROFF_IGN);          return(ROFF_IGN);
 }  }
   
Line 1185  roff_TS(ROFF_ARGS)
Line 1254  roff_TS(ROFF_ARGS)
   
         if (r->tbl) {          if (r->tbl) {
                 mandoc_msg(MANDOCERR_SCOPEBROKEN, r->parse, ln, ppos, NULL);                  mandoc_msg(MANDOCERR_SCOPEBROKEN, r->parse, ln, ppos, NULL);
                 tbl_end(r->tbl);                  tbl_end(&r->tbl);
         }          }
   
         t = tbl_alloc(ppos, ln, r->parse);          t = tbl_alloc(ppos, ln, r->parse);
Line 1420  roff_eqn(const struct roff *r)
Line 1489  roff_eqn(const struct roff *r)
 {  {
   
         return(r->last_eqn ? &r->last_eqn->eqn : NULL);          return(r->last_eqn ? &r->last_eqn->eqn : NULL);
   }
   
   char
   roff_eqndelim(const struct roff *r)
   {
   
           return('\0');
 }  }

Legend:
Removed from v.1.143  
changed lines
  Added in v.1.151

CVSweb