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

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

version 1.271, 2015/05/31 23:13:22 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 411  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 *,  static  int              roff_hasregn(const struct roff *,
Line 1020  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 1482  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 1495  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 1523  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 2057  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 2265  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 2573  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 2601  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 2620  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 2640  roff_hasregn(const struct roff *r, const char *name, s
Line 2646  roff_hasregn(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(1);                          return(1);
         }          }
Line 3074  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 3082  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 3102  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 3112  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 3157  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.271  
changed lines
  Added in v.1.276

CVSweb