[BACK]Return to roff.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / mandoc

Diff for /src/usr.bin/mandoc/roff.c between version 1.177 and 1.178

version 1.177, 2017/06/06 15:00:56 version 1.178, 2017/06/07 00:50:30
Line 81 
Line 81 
         struct ohash    *reqtab; /* request lookup table */          struct ohash    *reqtab; /* request lookup table */
         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   *rentab; /* renamed strings & macros */
         struct roffkv   *xmbtab; /* multi-byte trans table (`tr') */          struct roffkv   *xmbtab; /* multi-byte trans table (`tr') */
         struct roffstr  *xtab; /* single-byte trans table (`tr') */          struct roffstr  *xtab; /* single-byte trans table (`tr') */
         const char      *current_string; /* value of last called user macro */          const char      *current_string; /* value of last called user macro */
Line 173 
Line 174 
                                 const char *, size_t);                                  const char *, size_t);
 static  int              roff_getregro(const struct roff *,  static  int              roff_getregro(const struct roff *,
                                 const char *name);                                  const char *name);
   static  const char      *roff_getrenn(const struct roff *,
                                   const char *, size_t);
 static  const char      *roff_getstrn(const struct roff *,  static  const char      *roff_getstrn(const struct roff *,
                                 const char *, size_t);                                  const char *, size_t);
 static  int              roff_hasregn(const struct roff *,  static  int              roff_hasregn(const struct roff *,
Line 189 
Line 192 
                                 int, int);                                  int, int);
 static  enum rofferr     roff_parsetext(struct roff *, struct buf *,  static  enum rofferr     roff_parsetext(struct roff *, struct buf *,
                                 int, int *);                                  int, int *);
   static  enum rofferr     roff_renamed(ROFF_ARGS);
 static  enum rofferr     roff_res(struct roff *, struct buf *, int, int);  static  enum rofferr     roff_res(struct roff *, struct buf *, int, int);
 static  enum rofferr     roff_rm(ROFF_ARGS);  static  enum rofferr     roff_rm(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_setstr(struct roff *,  static  void             roff_setstr(struct roff *,
                                 const char *, const char *, int);                                  const char *, const char *, int);
Line 276 
Line 281 
         "warnscale",    "watch",        "watchlength",  "watchn",          "warnscale",    "watch",        "watchlength",  "watchn",
         "wh",           "while",        "write",        "writec",          "wh",           "while",        "write",        "writec",
         "writem",       "xflag",        ".",            NULL,          "writem",       "xflag",        ".",            NULL,
         "text",          NULL,           "text",
         "Dd",           "Dt",           "Os",           "Sh",          "Dd",           "Dt",           "Os",           "Sh",
         "Ss",           "Pp",           "D1",           "Dl",          "Ss",           "Pp",           "D1",           "Dl",
         "Bd",           "Ed",           "Bl",           "El",          "Bd",           "Ed",           "Bl",           "El",
Line 506 
Line 511 
         { roff_line_ignore, NULL, NULL, 0 },  /* rhang */          { roff_line_ignore, NULL, NULL, 0 },  /* rhang */
         { roff_line_ignore, NULL, NULL, 0 },  /* rj */          { roff_line_ignore, NULL, NULL, 0 },  /* rj */
         { roff_rm, NULL, NULL, 0 },  /* rm */          { roff_rm, NULL, NULL, 0 },  /* rm */
         { roff_unsupp, NULL, NULL, 0 },  /* rn */          { roff_rn, NULL, NULL, 0 },  /* rn */
         { roff_unsupp, NULL, NULL, 0 },  /* rnn */          { roff_unsupp, NULL, NULL, 0 },  /* rnn */
         { roff_rr, NULL, NULL, 0 },  /* rr */          { roff_rr, NULL, NULL, 0 },  /* rr */
         { roff_line_ignore, NULL, NULL, 0 },  /* rs */          { roff_line_ignore, NULL, NULL, 0 },  /* rs */
Line 562 
Line 567 
         { roff_insec, NULL, NULL, 0 },  /* writem */          { roff_insec, NULL, NULL, 0 },  /* writem */
         { roff_line_ignore, NULL, NULL, 0 },  /* xflag */          { roff_line_ignore, NULL, NULL, 0 },  /* xflag */
         { roff_cblock, NULL, NULL, 0 },  /* . */          { roff_cblock, NULL, NULL, 0 },  /* . */
           { roff_renamed, NULL, NULL, 0 },
         { roff_userdef, NULL, NULL, 0 }          { roff_userdef, NULL, NULL, 0 }
 };  };
   
Line 741 
Line 747 
         r->regtab = NULL;          r->regtab = NULL;
   
         roff_freestr(r->strtab);          roff_freestr(r->strtab);
           roff_freestr(r->rentab);
         roff_freestr(r->xmbtab);          roff_freestr(r->xmbtab);
         r->strtab = r->xmbtab = NULL;          r->strtab = r->rentab = r->xmbtab = NULL;
   
         if (r->xtab)          if (r->xtab)
                 for (i = 0; i < 128; i++)                  for (i = 0; i < 128; i++)
Line 1612 
Line 1619 
         mac = cp;          mac = cp;
         maclen = roff_getname(r, &cp, ln, ppos);          maclen = roff_getname(r, &cp, ln, ppos);
   
         t = (r->current_string = roff_getstrn(r, mac, maclen))          t = (r->current_string = roff_getstrn(r, mac, maclen)) ?
             ? ROFF_USERDEF : roffhash_find(r->reqtab, mac, maclen);              ROFF_USERDEF :
               (r->current_string = roff_getrenn(r, mac, maclen)) ?
               ROFF_RENAMED : roffhash_find(r->reqtab, mac, maclen);
   
         if (t != TOKEN_NONE)          if (t != TOKEN_NONE)
                 *pos = cp - buf;                  *pos = cp - buf;
Line 3056 
Line 3065 
 }  }
   
 static enum rofferr  static enum rofferr
   roff_rn(ROFF_ARGS)
   {
           const char      *value;
           char            *oldn, *newn, *end;
           size_t           oldsz, newsz;
   
           oldn = newn = buf->buf + pos;
           if (*oldn == '\0')
                   return ROFF_IGN;
   
           oldsz = roff_getname(r, &newn, ln, pos);
           if (oldn[oldsz] == '\\' || *newn == '\0')
                   return ROFF_IGN;
   
           end = newn;
           newsz = roff_getname(r, &end, ln, newn - buf->buf);
           if (newsz == 0)
                   return ROFF_IGN;
   
           /*
            * Rename a user-defined macro bearing the old name,
            * overriding an existing renamed high-level macro
            * bearing the new name, if that exists.
            */
   
           if ((value = roff_getstrn(r, oldn, oldsz)) != NULL) {
                   roff_setstrn(&r->strtab, newn, newsz, value, strlen(value), 0);
                   roff_setstrn(&r->strtab, oldn, oldsz, NULL, 0, 0);
                   roff_setstrn(&r->rentab, newn, newsz, NULL, 0, 0);
                   return ROFF_IGN;
           }
   
           /*
            * Rename a high-level macro bearing the old name,
            * either renaming it a second time if it was already
            * renamed before, or renaming it for the first time.
            * In both cases, override an existing user-defined
            * macro bearing the new name, if that exists.
            */
   
           if ((value = roff_getrenn(r, oldn, oldsz)) != NULL) {
                   roff_setstrn(&r->rentab, newn, newsz, value, strlen(value), 0);
                   roff_setstrn(&r->rentab, oldn, oldsz, NULL, 0, 0);
           } else
                   roff_setstrn(&r->rentab, newn, newsz, oldn, oldsz, 0);
           roff_setstrn(&r->strtab, newn, newsz, NULL, 0, 0);
           return ROFF_IGN;
   }
   
   static enum rofferr
 roff_so(ROFF_ARGS)  roff_so(ROFF_ARGS)
 {  {
         char *name, *cp;          char *name, *cp;
Line 3229 
Line 3288 
            ROFF_REPARSE : ROFF_APPEND;             ROFF_REPARSE : ROFF_APPEND;
 }  }
   
   /*
    * Calling a high-level macro that was renamed with .rn.
    * r->current_string has already been set up by roff_parse().
    */
   static enum rofferr
   roff_renamed(ROFF_ARGS)
   {
           char    *nbuf;
   
           buf->sz = mandoc_asprintf(&nbuf, ".%s %s", r->current_string,
               buf->buf + pos) + 1;
           free(buf->buf);
           buf->buf = nbuf;
           return ROFF_CONT;
   }
   
 static size_t  static size_t
 roff_getname(struct roff *r, char **cpp, int ln, int pos)  roff_getname(struct roff *r, char **cpp, int ln, int pos)
 {  {
Line 3370 
Line 3445 
                 if (0 == strncmp(name, predefs[i].name, len) &&                  if (0 == strncmp(name, predefs[i].name, len) &&
                                 '\0' == predefs[i].name[(int)len])                                  '\0' == predefs[i].name[(int)len])
                         return predefs[i].str;                          return predefs[i].str;
   
           return NULL;
   }
   
   /*
    * Check whether *name is the renamed name of a high-level macro.
    * Return the standard name, or NULL if it is not.
    */
   static const char *
   roff_getrenn(const struct roff *r, const char *name, size_t len)
   {
           const struct roffkv *n;
   
           for (n = r->rentab; n; n = n->next)
                   if (0 == strncmp(name, n->key.p, len) &&
                       '\0' == n->key.p[(int)len])
                           return n->val.p;
   
         return NULL;          return NULL;
 }  }

Legend:
Removed from v.1.177  
changed lines
  Added in v.1.178