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

Diff for /mandoc/roff.c between version 1.326 and 1.327

version 1.326, 2018/04/09 22:27:04 version 1.327, 2018/04/10 00:52:30
Line 73  struct roffkv {
Line 73  struct roffkv {
 struct  roffreg {  struct  roffreg {
         struct roffstr   key;          struct roffstr   key;
         int              val;          int              val;
           int              step;
         struct roffreg  *next;          struct roffreg  *next;
 };  };
   
Line 182  static void   roff_freestr(struct roffkv *);
Line 183  static void   roff_freestr(struct roffkv *);
 static  size_t           roff_getname(struct roff *, char **, int, int);  static  size_t           roff_getname(struct roff *, char **, int, int);
 static  int              roff_getnum(const char *, int *, int *, int);  static  int              roff_getnum(const char *, int *, int *, int);
 static  int              roff_getop(const char *, int *, char *);  static  int              roff_getop(const char *, int *, char *);
 static  int              roff_getregn(struct roff *, const char *, size_t);  static  int              roff_getregn(struct roff *,
                                   const char *, size_t, char);
 static  int              roff_getregro(const struct roff *,  static  int              roff_getregro(const struct roff *,
                                 const char *name);                                  const char *name);
 static  const char      *roff_getstrn(struct roff *,  static  const char      *roff_getstrn(struct roff *,
Line 207  static enum rofferr  roff_rm(ROFF_ARGS);
Line 209  static enum rofferr  roff_rm(ROFF_ARGS);
 static  enum rofferr     roff_rn(ROFF_ARGS);  static  enum rofferr     roff_rn(ROFF_ARGS);
 static  enum rofferr     roff_rr(ROFF_ARGS);  static  enum rofferr     roff_rr(ROFF_ARGS);
 static  void             roff_setregn(struct roff *, const char *,  static  void             roff_setregn(struct roff *, const char *,
                                 size_t, int, char);                                  size_t, int, char, int);
 static  void             roff_setstr(struct roff *,  static  void             roff_setstr(struct roff *,
                                 const char *, const char *, int);                                  const char *, const char *, int);
 static  void             roff_setstrn(struct roffkv **, const char *,  static  void             roff_setstrn(struct roffkv **, const char *,
Line 1136  roff_res(struct roff *r, struct buf *buf, int ln, int 
Line 1138  roff_res(struct roff *r, struct buf *buf, int ln, int 
         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 */          int              rcsid; /* kind of RCS id seen */
           char             sign;  /* increment number register */
         char             term;  /* character terminating the escape */          char             term;  /* character terminating the escape */
   
         /* Search forward for comments. */          /* Search forward for comments. */
Line 1246  roff_res(struct roff *r, struct buf *buf, int ln, int 
Line 1249  roff_res(struct roff *r, struct buf *buf, int ln, int 
                         term = cp[1];                          term = cp[1];
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case 'n':                  case 'n':
                           sign = cp[1];
                           if (sign == '+' || sign == '-')
                                   cp++;
                         res = ubuf;                          res = ubuf;
                         break;                          break;
                 default:                  default:
Line 1350  roff_res(struct roff *r, struct buf *buf, int ln, int 
Line 1356  roff_res(struct roff *r, struct buf *buf, int ln, int 
                 case 'n':                  case 'n':
                         if (arg_complete)                          if (arg_complete)
                                 (void)snprintf(ubuf, sizeof(ubuf), "%d",                                  (void)snprintf(ubuf, sizeof(ubuf), "%d",
                                     roff_getregn(r, stnam, naml));                                      roff_getregn(r, stnam, naml, sign));
                         else                          else
                                 ubuf[0] = '\0';                                  ubuf[0] = '\0';
                         break;                          break;
Line 2522  roff_evalnum(struct roff *r, int ln, const char *v,
Line 2528  roff_evalnum(struct roff *r, int ln, const char *v,
 void  void
 roff_setreg(struct roff *r, const char *name, int val, char sign)  roff_setreg(struct roff *r, const char *name, int val, char sign)
 {  {
         roff_setregn(r, name, strlen(name), val, sign);          roff_setregn(r, name, strlen(name), val, sign, INT_MIN);
 }  }
   
 static void  static void
 roff_setregn(struct roff *r, const char *name, size_t len,  roff_setregn(struct roff *r, const char *name, size_t len,
     int val, char sign)      int val, char sign, int step)
 {  {
         struct roffreg  *reg;          struct roffreg  *reg;
   
Line 2544  roff_setregn(struct roff *r, const char *name, size_t 
Line 2550  roff_setregn(struct roff *r, const char *name, size_t 
                 reg->key.p = mandoc_strndup(name, len);                  reg->key.p = mandoc_strndup(name, len);
                 reg->key.sz = len;                  reg->key.sz = len;
                 reg->val = 0;                  reg->val = 0;
                   reg->step = 0;
                 reg->next = r->regtab;                  reg->next = r->regtab;
                 r->regtab = reg;                  r->regtab = reg;
         }          }
Line 2554  roff_setregn(struct roff *r, const char *name, size_t 
Line 2561  roff_setregn(struct roff *r, const char *name, size_t 
                 reg->val -= val;                  reg->val -= val;
         else          else
                 reg->val = val;                  reg->val = val;
           if (step != INT_MIN)
                   reg->step = step;
 }  }
   
 /*  /*
Line 2589  roff_getregro(const struct roff *r, const char *name)
Line 2598  roff_getregro(const struct roff *r, const char *name)
 int  int
 roff_getreg(struct roff *r, const char *name)  roff_getreg(struct roff *r, const char *name)
 {  {
         return roff_getregn(r, name, strlen(name));          return roff_getregn(r, name, strlen(name), '\0');
 }  }
   
 static int  static int
 roff_getregn(struct roff *r, const char *name, size_t len)  roff_getregn(struct roff *r, const char *name, size_t len, char sign)
 {  {
         struct roffreg  *reg;          struct roffreg  *reg;
         int              val;          int              val;
Line 2604  roff_getregn(struct roff *r, const char *name, size_t 
Line 2613  roff_getregn(struct roff *r, const char *name, size_t 
                         return val;                          return val;
         }          }
   
         for (reg = r->regtab; reg; reg = reg->next)          for (reg = r->regtab; reg; reg = reg->next) {
                 if (len == reg->key.sz &&                  if (len == reg->key.sz &&
                     0 == strncmp(name, reg->key.p, len))                      0 == strncmp(name, reg->key.p, len)) {
                           switch (sign) {
                           case '+':
                                   reg->val += reg->step;
                                   break;
                           case '-':
                                   reg->val -= reg->step;
                                   break;
                           default:
                                   break;
                           }
                         return reg->val;                          return reg->val;
                   }
           }
   
         roff_setregn(r, name, len, 0, '\0');          roff_setregn(r, name, len, 0, '\0', INT_MIN);
         return 0;          return 0;
 }  }
   
Line 2649  roff_freereg(struct roffreg *reg)
Line 2670  roff_freereg(struct roffreg *reg)
 static enum rofferr  static enum rofferr
 roff_nr(ROFF_ARGS)  roff_nr(ROFF_ARGS)
 {  {
         char            *key, *val;          char            *key, *val, *step;
         size_t           keysz;          size_t           keysz;
         int              iv;          int              iv, is, len;
         char             sign;          char             sign;
   
         key = val = buf->buf + pos;          key = val = buf->buf + pos;
Line 2666  roff_nr(ROFF_ARGS)
Line 2687  roff_nr(ROFF_ARGS)
         if (sign == '+' || sign == '-')          if (sign == '+' || sign == '-')
                 val++;                  val++;
   
         if (roff_evalnum(r, ln, val, NULL, &iv, ROFFNUM_SCALE))          len = 0;
                 roff_setregn(r, key, keysz, iv, sign);          if (roff_evalnum(r, ln, val, &len, &iv, ROFFNUM_SCALE) == 0)
                   return ROFF_IGN;
   
           step = val + len;
           while (isspace((unsigned char)*step))
                   step++;
           if (roff_evalnum(r, ln, step, NULL, &is, 0) == 0)
                   is = INT_MIN;
   
           roff_setregn(r, key, keysz, iv, sign, is);
         return ROFF_IGN;          return ROFF_IGN;
 }  }
   

Legend:
Removed from v.1.326  
changed lines
  Added in v.1.327

CVSweb