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

Diff for /mandoc/roff.c between version 1.153 and 1.154

version 1.153, 2011/07/26 14:24:06 version 1.154, 2011/07/27 07:09:41
Line 159  static const char *roff_getstrn(const struct roff *, 
Line 159  static const char *roff_getstrn(const struct roff *, 
                                 const char *, size_t);                                  const char *, size_t);
 static  enum rofferr     roff_line_ignore(ROFF_ARGS);  static  enum rofferr     roff_line_ignore(ROFF_ARGS);
 static  enum rofferr     roff_nr(ROFF_ARGS);  static  enum rofferr     roff_nr(ROFF_ARGS);
 static  int              roff_res(struct roff *,  static  void             roff_res(struct roff *,
                                 char **, size_t *, int, int);                                  char **, size_t *, int, int);
 static  enum rofferr     roff_rm(ROFF_ARGS);  static  enum rofferr     roff_rm(ROFF_ARGS);
 static  void             roff_setstr(struct roff *,  static  void             roff_setstr(struct roff *,
Line 400  roff_alloc(struct mparse *parse)
Line 400  roff_alloc(struct mparse *parse)
  * `\*', e.g., `\*(ab').  These must be handled before the actual line   * `\*', e.g., `\*(ab').  These must be handled before the actual line
  * is processed.   * is processed.
  * This also checks the syntax of regular escapes.   * This also checks the syntax of regular escapes.
 */   */
 static int  static void
 roff_res(struct roff *r, char **bufp, size_t *szp, int ln, int pos)  roff_res(struct roff *r, char **bufp, size_t *szp, int ln, int pos)
 {  {
         enum mandoc_esc  esc;          enum mandoc_esc  esc;
Line 413  roff_res(struct roff *r, char **bufp, size_t *szp, int
Line 413  roff_res(struct roff *r, char **bufp, size_t *szp, int
         size_t           nsz;          size_t           nsz;
         char            *n;          char            *n;
   
         /* Search for a leading backslash and save a pointer to it. */  again:
   
         cp = *bufp + pos;          cp = *bufp + pos;
         while (NULL != (cp = strchr(cp, '\\'))) {          while (NULL != (cp = strchr(cp, '\\'))) {
                 stesc = cp++;                  stesc = cp++;
Line 426  roff_res(struct roff *r, char **bufp, size_t *szp, int
Line 425  roff_res(struct roff *r, char **bufp, size_t *szp, int
                  */                   */
   
                 if ('\0' == *cp)                  if ('\0' == *cp)
                         return(1);                          return;
   
                 if ('*' != *cp) {                  if ('*' != *cp) {
                         res = cp;                          res = cp;
Line 437  roff_res(struct roff *r, char **bufp, size_t *szp, int
Line 436  roff_res(struct roff *r, char **bufp, size_t *szp, int
                         mandoc_msg                          mandoc_msg
                                 (MANDOCERR_BADESCAPE, r->parse,                                  (MANDOCERR_BADESCAPE, r->parse,
                                  ln, (int)(stesc - *bufp), NULL);                                   ln, (int)(stesc - *bufp), NULL);
                         continue;                          return;
                 }                  }
   
                 cp++;                  cp++;
Line 450  roff_res(struct roff *r, char **bufp, size_t *szp, int
Line 449  roff_res(struct roff *r, char **bufp, size_t *szp, int
   
                 switch (*cp) {                  switch (*cp) {
                 case ('\0'):                  case ('\0'):
                         return(1);                          return;
                 case ('('):                  case ('('):
                         cp++;                          cp++;
                         maxl = 2;                          maxl = 2;
Line 473  roff_res(struct roff *r, char **bufp, size_t *szp, int
Line 472  roff_res(struct roff *r, char **bufp, size_t *szp, int
                                         (MANDOCERR_BADESCAPE,                                          (MANDOCERR_BADESCAPE,
                                          r->parse, ln,                                           r->parse, ln,
                                          (int)(stesc - *bufp), NULL);                                           (int)(stesc - *bufp), NULL);
                                 return(1);                                  return;
                         }                          }
                         if (0 == maxl && ']' == *cp)                          if (0 == maxl && ']' == *cp)
                                 break;                                  break;
Line 495  roff_res(struct roff *r, char **bufp, size_t *szp, int
Line 494  roff_res(struct roff *r, char **bufp, size_t *szp, int
   
                 /* Replace the escape sequence by the string. */                  /* Replace the escape sequence by the string. */
   
                   pos += (stesc - *bufp);
   
                 nsz = *szp + strlen(res) + 1;                  nsz = *szp + strlen(res) + 1;
                 n = mandoc_malloc(nsz);                  n = mandoc_malloc(nsz);
   
Line 506  roff_res(struct roff *r, char **bufp, size_t *szp, int
Line 507  roff_res(struct roff *r, char **bufp, size_t *szp, int
   
                 *bufp = n;                  *bufp = n;
                 *szp = nsz;                  *szp = nsz;
                 return(0);                  goto again;
         }          }
   }
   
         return(1);  /*
    * Process text streams: convert all breakable hyphens into ASCII_HYPH.
    */
   static enum rofferr
   roff_parsetext(char *p)
   {
           size_t           sz;
           const char      *start;
           enum mandoc_esc  esc;
   
           start = p;
   
           while ('\0' != *p) {
                   sz = strcspn(p, "-\\");
                   p += sz;
   
                   if ('\\' == *p) {
                           /* Skip over escapes. */
                           p++;
                           esc = mandoc_escape
                                   ((const char **)&p, NULL, NULL);
                           if (ESCAPE_ERROR == esc)
                                   break;
                   } else if ('-' == *p) {
                           if (mandoc_hyph(start, p))
                                   *p = ASCII_HYPH;
                           p++;
                   }
           }
   
           return(ROFF_CONT);
 }  }
   
 enum rofferr  enum rofferr
Line 525  roff_parseln(struct roff *r, int ln, char **bufp, 
Line 557  roff_parseln(struct roff *r, int ln, char **bufp, 
          * words to fill in.           * words to fill in.
          */           */
   
         if ( ! roff_res(r, bufp, szp, ln, pos))          roff_res(r, bufp, szp, ln, pos);
                 return(ROFF_REPARSE);  
   
         ppos = pos;          ppos = pos;
         ctl = mandoc_getcontrol(*bufp, &pos);          ctl = mandoc_getcontrol(*bufp, &pos);
Line 551  roff_parseln(struct roff *r, int ln, char **bufp, 
Line 582  roff_parseln(struct roff *r, int ln, char **bufp, 
                         return(eqn_read(&r->eqn, ln, *bufp, pos, offs));                          return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
                 if (r->tbl)                  if (r->tbl)
                         return(tbl_read(r->tbl, ln, *bufp, pos));                          return(tbl_read(r->tbl, ln, *bufp, pos));
                 return(ROFF_CONT);                  return(roff_parsetext(*bufp + pos));
         } else if ( ! ctl) {          } else if ( ! ctl) {
                 if (r->eqn)                  if (r->eqn)
                         return(eqn_read(&r->eqn, ln, *bufp, pos, offs));                          return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
                 if (r->tbl)                  if (r->tbl)
                         return(tbl_read(r->tbl, ln, *bufp, pos));                          return(tbl_read(r->tbl, ln, *bufp, pos));
                 return(ROFF_CONT);                  return(roff_parsetext(*bufp + pos));
         } else if (r->eqn)          } else if (r->eqn)
                 return(eqn_read(&r->eqn, ln, *bufp, ppos, offs));                  return(eqn_read(&r->eqn, ln, *bufp, ppos, offs));
   

Legend:
Removed from v.1.153  
changed lines
  Added in v.1.154

CVSweb