[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.274

version 1.271, 2015/05/31 23:13:22 version 1.274, 2015/08/29 21:37:20
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 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.274

CVSweb