[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.22 and 1.23

version 1.22, 2010/12/07 00:08:52 version 1.23, 2010/12/09 20:56:30
Line 337 
Line 337 
 static int  static int
 roff_res(struct roff *r, char **bufp, size_t *szp, int pos)  roff_res(struct roff *r, char **bufp, size_t *szp, int pos)
 {  {
         const char      *cp, *cpp, *st, *res;          const char      *stesc; /* start of an escape sequence ('\\') */
           const char      *stnam; /* start of the name, after "[(*" */
           const char      *cp;    /* end of the name, e.g. before ']' */
           const char      *res;   /* the string to be substituted */
         int              i, maxl;          int              i, maxl;
         size_t           nsz;          size_t           nsz;
         char            *n;          char            *n;
   
         /* LINTED */          /* String escape sequences have at least three characters. */
         for (cp = &(*bufp)[pos]; (cpp = strstr(cp, "\\*")); cp++) {  
                 cp = cpp + 2;          for (cp = *bufp + pos; cp[0] && cp[1] && cp[2]; cp++) {
                 switch (*cp) {  
                   /*
                    * The first character must be a backslash.
                    * Save a pointer to it.
                    */
   
                   if ('\\' != *cp)
                           continue;
                   stesc = cp;
   
                   /*
                    * The second character must be an asterisk.
                    * If it isn't, skip it anyway:  It is escaped,
                    * so it can't start another escape sequence.
                    */
   
                   if ('*' != *(++cp))
                           continue;
   
                   /*
                    * The third character decides the length
                    * of the name of the string.
                    * Save a pointer to the name.
                    */
   
                   switch (*(++cp)) {
                 case ('('):                  case ('('):
                         cp++;                          cp++;
                         maxl = 2;                          maxl = 2;
Line 358 
Line 386 
                         maxl = 1;                          maxl = 1;
                         break;                          break;
                 }                  }
                   stnam = cp;
   
                 st = cp;                  /* Advance to the end of the name. */
   
                 for (i = 0; 0 == maxl || i < maxl; i++, cp++) {                  for (i = 0; 0 == maxl || i < maxl; i++, cp++) {
                         if ('\0' == *cp)                          if ('\0' == *cp)
Line 368 
Line 397 
                                 break;                                  break;
                 }                  }
   
                 res = roff_getstrn(r, st, (size_t)i);                  /*
                    * Retrieve the replacement string; if it is
                    * undefined, resume searching for escapes.
                    */
   
                   res = roff_getstrn(r, stnam, (size_t)i);
   
                 if (NULL == res) {                  if (NULL == res) {
                         cp -= maxl ? 1 : 0;                          cp -= maxl ? 1 : 0;
                         continue;                          continue;
                 }                  }
   
                   /* Replace the escape sequence by the string. */
   
                 nsz = *szp + strlen(res) + 1;                  nsz = *szp + strlen(res) + 1;
                 n = mandoc_malloc(nsz);                  n = mandoc_malloc(nsz);
   
                 *n = '\0';                  strlcpy(n, *bufp, (size_t)(stesc - *bufp + 1));
   
                 strlcat(n, *bufp, (size_t)(cpp - *bufp + 1));  
                 strlcat(n, res, nsz);                  strlcat(n, res, nsz);
                 strlcat(n, cp + (maxl ? 0 : 1), nsz);                  strlcat(n, cp + (maxl ? 0 : 1), nsz);
   
Line 544 
Line 578 
         case (ROFF_am1):          case (ROFF_am1):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (ROFF_de):          case (ROFF_de):
                   /* ROFF_de1 is remapped to ROFF_de in roff_block(). */
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (ROFF_dei):          case (ROFF_dei):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */

Legend:
Removed from v.1.22  
changed lines
  Added in v.1.23