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

Diff for /mandoc/roff.c between version 1.270 and 1.276

version 1.270, 2015/05/01 16:02:47 version 1.276, 2015/09/26 00:54:04
Line 335  struct roff {
Line 335  struct roff {
         int              rstacksz; /* current size limit of rstack */          int              rstacksz; /* current size limit of rstack */
         int              rstackpos; /* position in rstack */          int              rstackpos; /* position in rstack */
         int              format; /* current file in mdoc or man format */          int              format; /* current file in mdoc or man format */
           int              argc; /* number of args of the last macro */
         char             control; /* control character */          char             control; /* control character */
 };  };
   
Line 397  static enum rofferr  roff_cond_text(ROFF_ARGS);
Line 398  static enum rofferr  roff_cond_text(ROFF_ARGS);
 static  enum rofferr     roff_cond_sub(ROFF_ARGS);  static  enum rofferr     roff_cond_sub(ROFF_ARGS);
 static  enum rofferr     roff_ds(ROFF_ARGS);  static  enum rofferr     roff_ds(ROFF_ARGS);
 static  enum rofferr     roff_eqndelim(struct roff *, struct buf *, int);  static  enum rofferr     roff_eqndelim(struct roff *, struct buf *, int);
 static  int              roff_evalcond(struct roff *r, int,  static  int              roff_evalcond(struct roff *r, int, char *, int *);
                                 const char *, int *);  
 static  int              roff_evalnum(struct roff *, int,  static  int              roff_evalnum(struct roff *, int,
                                 const char *, int *, int *, int);                                  const char *, int *, int *, int);
 static  int              roff_evalpar(struct roff *, int,  static  int              roff_evalpar(struct roff *, int,
Line 412  static int   roff_getnum(const char *, int *, int *, i
Line 412  static int   roff_getnum(const char *, int *, int *, i
 static  int              roff_getop(const char *, int *, char *);  static  int              roff_getop(const char *, int *, char *);
 static  int              roff_getregn(const struct roff *,  static  int              roff_getregn(const struct roff *,
                                 const char *, size_t);                                  const char *, size_t);
 static  int              roff_getregro(const char *name);  static  int              roff_getregro(const struct roff *,
                                   const char *name);
 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 *,
                                   const char *, size_t);
 static  enum rofferr     roff_insec(ROFF_ARGS);  static  enum rofferr     roff_insec(ROFF_ARGS);
 static  enum rofferr     roff_it(ROFF_ARGS);  static  enum rofferr     roff_it(ROFF_ARGS);
 static  enum rofferr     roff_line_ignore(ROFF_ARGS);  static  enum rofferr     roff_line_ignore(ROFF_ARGS);
Line 1019  roff_node_append(struct roff_man *man, struct roff_nod
Line 1022  roff_node_append(struct roff_man *man, struct roff_nod
                 break;                  break;
         default:          default:
                 abort();                  abort();
                 /* NOTREACHED */  
         }          }
         n->parent->nchild++;          n->parent->nchild++;
         n->parent->last = n;          n->parent->last = n;
Line 1481  roff_res(struct roff *r, struct buf *buf, int ln, int 
Line 1483  roff_res(struct roff *r, struct buf *buf, int ln, int 
 }  }
   
 /*  /*
  * Process text streams:   * Process text streams.
  * Convert all breakable hyphens into ASCII_HYPH.  
  * Decrement and spring input line trap.  
  */   */
 static enum rofferr  static enum rofferr
 roff_parsetext(struct buf *buf, int pos, int *offs)  roff_parsetext(struct buf *buf, int pos, int *offs)
Line 1494  roff_parsetext(struct buf *buf, int pos, int *offs)
Line 1494  roff_parsetext(struct buf *buf, int pos, int *offs)
         int              isz;          int              isz;
         enum mandoc_esc  esc;          enum mandoc_esc  esc;
   
           /* Spring the input line trap. */
   
           if (roffit_lines == 1) {
                   isz = mandoc_asprintf(&p, "%s\n.%s", buf->buf, roffit_macro);
                   free(buf->buf);
                   buf->buf = p;
                   buf->sz = isz + 1;
                   *offs = 0;
                   free(roffit_macro);
                   roffit_lines = 0;
                   return(ROFF_REPARSE);
           } else if (roffit_lines > 1)
                   --roffit_lines;
   
           /* Convert all breakable hyphens into ASCII_HYPH. */
   
         start = p = buf->buf + pos;          start = p = buf->buf + pos;
   
         while (*p != '\0') {          while (*p != '\0') {
Line 1522  roff_parsetext(struct buf *buf, int pos, int *offs)
Line 1538  roff_parsetext(struct buf *buf, int pos, int *offs)
                         *p = ASCII_HYPH;                          *p = ASCII_HYPH;
                 p++;                  p++;
         }          }
   
         /* Spring the input line trap. */  
         if (roffit_lines == 1) {  
                 isz = mandoc_asprintf(&p, "%s\n.%s", buf->buf, roffit_macro);  
                 free(buf->buf);  
                 buf->buf = p;  
                 buf->sz = isz + 1;  
                 *offs = 0;  
                 free(roffit_macro);  
                 roffit_lines = 0;  
                 return(ROFF_REPARSE);  
         } else if (roffit_lines > 1)  
                 --roffit_lines;  
         return(ROFF_CONT);          return(ROFF_CONT);
 }  }
   
Line 2056  roff_getnum(const char *v, int *pos, int *res, int fla
Line 2059  roff_getnum(const char *v, int *pos, int *res, int fla
                 scaled = *res * 240 / 2.54;                  scaled = *res * 240 / 2.54;
                 break;                  break;
         case 'v':          case 'v':
                 /* FALLTROUGH */                  /* FALLTHROUGH */
         case 'P':          case 'P':
                 scaled = *res * 40;                  scaled = *res * 40;
                 break;                  break;
         case 'm':          case 'm':
                 /* FALLTROUGH */                  /* FALLTHROUGH */
         case 'n':          case 'n':
                 scaled = *res * 24;                  scaled = *res * 24;
                 break;                  break;
Line 2134  out:
Line 2137  out:
  * or string condition.   * or string condition.
  */   */
 static int  static int
 roff_evalcond(struct roff *r, int ln, const char *v, int *pos)  roff_evalcond(struct roff *r, int ln, char *v, int *pos)
 {  {
           char    *cp, *name;
           size_t   sz;
         int      number, savepos, wanttrue;          int      number, savepos, wanttrue;
   
         if ('!' == v[*pos]) {          if ('!' == v[*pos]) {
Line 2158  roff_evalcond(struct roff *r, int ln, const char *v, i
Line 2163  roff_evalcond(struct roff *r, int ln, const char *v, i
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case 'e':          case 'e':
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case 'r':  
                 /* FALLTHROUGH */  
         case 't':          case 't':
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case 'v':          case 'v':
                 (*pos)++;                  (*pos)++;
                 return(!wanttrue);                  return(!wanttrue);
           case 'r':
                   cp = name = v + ++*pos;
                   sz = roff_getname(r, &cp, ln, *pos);
                   *pos = cp - v;
                   return((sz && roff_hasregn(r, name, sz)) == wanttrue);
         default:          default:
                 break;                  break;
         }          }
Line 2259  roff_cond(ROFF_ARGS)
Line 2267  roff_cond(ROFF_ARGS)
         if (buf->buf[pos] == '\\' && buf->buf[pos + 1] == '{') {          if (buf->buf[pos] == '\\' && buf->buf[pos + 1] == '{') {
                 r->last->endspan = -1;                  r->last->endspan = -1;
                 pos += 2;                  pos += 2;
                   while (buf->buf[pos] == ' ')
                           pos++;
                 goto out;                  goto out;
         }          }
   
Line 2567  roff_setreg(struct roff *r, const char *name, int val,
Line 2577  roff_setreg(struct roff *r, const char *name, int val,
  * were to turn up, another special value would have to be chosen.   * were to turn up, another special value would have to be chosen.
  */   */
 static int  static int
 roff_getregro(const char *name)  roff_getregro(const struct roff *r, const char *name)
 {  {
   
         switch (*name) {          switch (*name) {
           case '$':  /* Number of arguments of the last macro evaluated. */
                   return(r->argc);
         case 'A':  /* ASCII approximation mode is always off. */          case 'A':  /* ASCII approximation mode is always off. */
                 return(0);                  return(0);
         case 'g':  /* Groff compatibility mode is always on. */          case 'g':  /* Groff compatibility mode is always on. */
Line 2595  roff_getreg(const struct roff *r, const char *name)
Line 2607  roff_getreg(const struct roff *r, const char *name)
         int              val;          int              val;
   
         if ('.' == name[0] && '\0' != name[1] && '\0' == name[2]) {          if ('.' == name[0] && '\0' != name[1] && '\0' == name[2]) {
                 val = roff_getregro(name + 1);                  val = roff_getregro(r, name + 1);
                 if (-1 != val)                  if (-1 != val)
                         return (val);                          return (val);
         }          }
Line 2614  roff_getregn(const struct roff *r, const char *name, s
Line 2626  roff_getregn(const struct roff *r, const char *name, s
         int              val;          int              val;
   
         if ('.' == name[0] && 2 == len) {          if ('.' == name[0] && 2 == len) {
                 val = roff_getregro(name + 1);                  val = roff_getregro(r, name + 1);
                 if (-1 != val)                  if (-1 != val)
                         return (val);                          return (val);
         }          }
Line 2627  roff_getregn(const struct roff *r, const char *name, s
Line 2639  roff_getregn(const struct roff *r, const char *name, s
         return(0);          return(0);
 }  }
   
   static int
   roff_hasregn(const struct roff *r, const char *name, size_t len)
   {
           struct roffreg  *reg;
           int              val;
   
           if ('.' == name[0] && 2 == len) {
                   val = roff_getregro(r, name + 1);
                   if (-1 != val)
                           return(1);
           }
   
           for (reg = r->regtab; reg; reg = reg->next)
                   if (len == reg->key.sz &&
                       0 == strncmp(name, reg->key.p, len))
                           return(1);
   
           return(0);
   }
   
 static void  static void
 roff_freereg(struct roffreg *reg)  roff_freereg(struct roffreg *reg)
 {  {
Line 3048  roff_userdef(ROFF_ARGS)
Line 3080  roff_userdef(ROFF_ARGS)
 {  {
         const char       *arg[9], *ap;          const char       *arg[9], *ap;
         char             *cp, *n1, *n2;          char             *cp, *n1, *n2;
         int               i;          int               i, ib, ie;
         size_t            asz, rsz;          size_t            asz, rsz;
   
         /*          /*
Line 3056  roff_userdef(ROFF_ARGS)
Line 3088  roff_userdef(ROFF_ARGS)
          * and NUL-terminate them.           * and NUL-terminate them.
          */           */
   
           r->argc = 0;
         cp = buf->buf + pos;          cp = buf->buf + pos;
         for (i = 0; i < 9; i++)          for (i = 0; i < 9; i++) {
                 arg[i] = *cp == '\0' ? "" :                  if (*cp == '\0')
                     mandoc_getarg(r->parse, &cp, ln, &pos);                          arg[i] = "";
                   else {
                           arg[i] = mandoc_getarg(r->parse, &cp, ln, &pos);
                           r->argc = i + 1;
                   }
           }
   
         /*          /*
          * Expand macro arguments.           * Expand macro arguments.
Line 3076  roff_userdef(ROFF_ARGS)
Line 3114  roff_userdef(ROFF_ARGS)
                         continue;                          continue;
                 if (*cp++ != '$')                  if (*cp++ != '$')
                         continue;                          continue;
                 i = *cp - '1';                  if (*cp == '*') {  /* \\$* inserts all arguments */
                 if (0 > i || 8 < i)                          ib = 0;
                         continue;                          ie = r->argc - 1;
                   } else {  /* \\$1 .. \\$9 insert one argument */
                           ib = ie = *cp - '1';
                           if (ib < 0 || ib > 8)
                                   continue;
                   }
                 cp -= 2;                  cp -= 2;
   
                 /*                  /*
Line 3086  roff_userdef(ROFF_ARGS)
Line 3129  roff_userdef(ROFF_ARGS)
                  * taking escaping of quotes into account.                   * taking escaping of quotes into account.
                  */                   */
   
                 asz = 0;                  asz = ie > ib ? ie - ib : 0;  /* for blanks */
                 for (ap = arg[i]; *ap != '\0'; ap++) {                  for (i = ib; i <= ie; i++) {
                         asz++;                          for (ap = arg[i]; *ap != '\0'; ap++) {
                         if (*ap == '"')                                  asz++;
                                 asz += 3;                                  if (*ap == '"')
                                           asz += 3;
                           }
                 }                  }
                 if (asz != 3) {                  if (asz != 3) {
   
Line 3131  roff_userdef(ROFF_ARGS)
Line 3176  roff_userdef(ROFF_ARGS)
                 /* Copy the expanded argument, escaping quotes. */                  /* Copy the expanded argument, escaping quotes. */
   
                 n2 = cp;                  n2 = cp;
                 for (ap = arg[i]; *ap != '\0'; ap++) {                  for (i = ib; i <= ie; i++) {
                         if (*ap == '"') {                          for (ap = arg[i]; *ap != '\0'; ap++) {
                                 memcpy(n2, "\\(dq", 4);                                  if (*ap == '"') {
                                 n2 += 4;                                          memcpy(n2, "\\(dq", 4);
                         } else                                          n2 += 4;
                                 *n2++ = *ap;                                  } else
                                           *n2++ = *ap;
                           }
                           if (i < ie)
                                   *n2++ = ' ';
                 }                  }
         }          }
   

Legend:
Removed from v.1.270  
changed lines
  Added in v.1.276

CVSweb