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

Diff for /mandoc/roff.c between version 1.336 and 1.337

version 1.336, 2018/08/19 17:46:14 version 1.337, 2018/08/20 17:25:09
Line 107  struct roff {
Line 107  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 */
         char             escape; /* escape character */          char             escape; /* escape character */
 };  };
Line 2663  roff_getregro(const struct roff *r, const char *name)
Line 2662  roff_getregro(const struct roff *r, const char *name)
   
         switch (*name) {          switch (*name) {
         case '$':  /* Number of arguments of the last macro evaluated. */          case '$':  /* Number of arguments of the last macro evaluated. */
                 return r->argc;                  return 0;
         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 3381  roff_userdef(ROFF_ARGS)
Line 3380  roff_userdef(ROFF_ARGS)
 {  {
         const char       *arg[16], *ap;          const char       *arg[16], *ap;
         char             *cp, *n1, *n2;          char             *cp, *n1, *n2;
         int               expand_count, i, ib, ie;          int               argc, expand_count, i, ib, ie;
         size_t            asz, rsz;          size_t            asz, esz, rsz;
   
         /*          /*
          * Collect pointers to macro argument strings           * Collect pointers to macro argument strings
          * and NUL-terminate them.           * and NUL-terminate them.
          */           */
   
         r->argc = 0;          argc = 0;
         cp = buf->buf + pos;          cp = buf->buf + pos;
         for (i = 0; i < 16; i++) {          for (i = 0; i < 16; i++) {
                 if (*cp == '\0')                  if (*cp == '\0')
                         arg[i] = "";                          arg[i] = "";
                 else {                  else {
                         arg[i] = mandoc_getarg(r->parse, &cp, ln, &pos);                          arg[i] = mandoc_getarg(r->parse, &cp, ln, &pos);
                         r->argc = i + 1;                          argc = i + 1;
                 }                  }
         }          }
   
Line 3418  roff_userdef(ROFF_ARGS)
Line 3417  roff_userdef(ROFF_ARGS)
                         continue;                          continue;
                 if (*cp == '*') {  /* \\$* inserts all arguments */                  if (*cp == '*') {  /* \\$* inserts all arguments */
                         ib = 0;                          ib = 0;
                         ie = r->argc - 1;                          ie = argc - 1;
                 } else {  /* \\$1 .. \\$9 insert one argument */                  } else {  /* \\$1 .. \\$9 insert one argument */
                         ib = ie = *cp - '1';                          ib = ie = *cp - '1';
                         if (ib < 0 || ib > 8)                          if (ib < 0 || ib > 8)
Line 3504  roff_userdef(ROFF_ARGS)
Line 3503  roff_userdef(ROFF_ARGS)
                         if (i < ie)                          if (i < ie)
                                 *n2++ = ' ';                                  *n2++ = ' ';
                 }                  }
           }
   
           /*
            * Expand the number of arguments, if it is used.
            * This never makes the expanded macro longer.
            */
   
           for (cp = n1; *cp != '\0'; cp++) {
                   if (cp[0] != '\\')
                           continue;
                   if (cp[1] == '\\') {
                           cp++;
                           continue;
                   }
                   if (strncmp(cp + 1, "n(.$", 4) == 0)
                           esz = 5;
                   else if (strncmp(cp + 1, "n[.$]", 5) == 0)
                           esz = 6;
                   else
                           continue;
                   asz = snprintf(cp, esz, "%d", argc);
                   assert(asz < esz);
                   rsz = buf->sz - (cp - n1) - esz;
                   memmove(cp + asz, cp + esz, rsz);
                   buf->sz -= esz - asz;
                   n2 = mandoc_realloc(n1, buf->sz);
                   cp = n2 + (cp - n1) + asz;
                   n1 = n2;
         }          }
   
         /*          /*

Legend:
Removed from v.1.336  
changed lines
  Added in v.1.337

CVSweb