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

Diff for /mandoc/read.c between version 1.34 and 1.36

version 1.34, 2012/11/19 22:30:58 version 1.36, 2013/06/01 22:57:35
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 71  struct mparse {
Line 71  struct mparse {
   
 static  void      resize_buf(struct buf *, size_t);  static  void      resize_buf(struct buf *, size_t);
 static  void      mparse_buf_r(struct mparse *, struct buf, int);  static  void      mparse_buf_r(struct mparse *, struct buf, int);
 static  void      mparse_readfd_r(struct mparse *, int, const char *, int);  
 static  void      pset(const char *, int, struct mparse *);  static  void      pset(const char *, int, struct mparse *);
 static  int       read_whole_file(const char *, int, struct buf *, int *);  static  int       read_whole_file(const char *, int, struct buf *, int *);
 static  void      mparse_end(struct mparse *);  static  void      mparse_end(struct mparse *);
Line 328  mparse_buf_r(struct mparse *curp, struct buf blk, int 
Line 327  mparse_buf_r(struct mparse *curp, struct buf blk, int 
                                 break;                                  break;
                         }                          }
   
                           /*
                            * Make sure we have space for at least
                            * one backslash and one other character
                            * and the trailing NUL byte.
                            */
   
                           if (pos + 2 >= (int)ln.sz)
                                   resize_buf(&ln, 256);
   
                         /*                          /*
                          * Warn about bogus characters.  If you're using                           * Warn about bogus characters.  If you're using
                          * non-ASCII encoding, you're screwing your                           * non-ASCII encoding, you're screwing your
Line 344  mparse_buf_r(struct mparse *curp, struct buf blk, int 
Line 352  mparse_buf_r(struct mparse *curp, struct buf blk, int 
                                 mandoc_msg(MANDOCERR_BADCHAR, curp,                                  mandoc_msg(MANDOCERR_BADCHAR, curp,
                                                 curp->line, pos, NULL);                                                  curp->line, pos, NULL);
                                 i++;                                  i++;
                                 if (pos >= (int)ln.sz)  
                                         resize_buf(&ln, 256);  
                                 ln.buf[pos++] = '?';                                  ln.buf[pos++] = '?';
                                 continue;                                  continue;
                         }                          }
Line 353  mparse_buf_r(struct mparse *curp, struct buf blk, int 
Line 359  mparse_buf_r(struct mparse *curp, struct buf blk, int 
                         /* Trailing backslash = a plain char. */                          /* Trailing backslash = a plain char. */
   
                         if ('\\' != blk.buf[i] || i + 1 == (int)blk.sz) {                          if ('\\' != blk.buf[i] || i + 1 == (int)blk.sz) {
                                 if (pos >= (int)ln.sz)  
                                         resize_buf(&ln, 256);  
                                 ln.buf[pos++] = blk.buf[i++];                                  ln.buf[pos++] = blk.buf[i++];
                                 continue;                                  continue;
                         }                          }
Line 396  mparse_buf_r(struct mparse *curp, struct buf blk, int 
Line 400  mparse_buf_r(struct mparse *curp, struct buf blk, int 
                                 break;                                  break;
                         }                          }
   
                         /* Some other escape sequence, copy & cont. */                          /* Catch escaped bogus characters. */
   
                         if (pos + 1 >= (int)ln.sz)                          c = (unsigned char) blk.buf[i+1];
                                 resize_buf(&ln, 256);  
   
                           if ( ! (isascii(c) &&
                                           (isgraph(c) || isblank(c)))) {
                                   mandoc_msg(MANDOCERR_BADCHAR, curp,
                                                   curp->line, pos, NULL);
                                   i += 2;
                                   ln.buf[pos++] = '?';
                                   continue;
                           }
   
                           /* Some other escape sequence, copy & cont. */
   
                         ln.buf[pos++] = blk.buf[i++];                          ln.buf[pos++] = blk.buf[i++];
                         ln.buf[pos++] = blk.buf[i++];                          ln.buf[pos++] = blk.buf[i++];
                 }                  }
Line 475  rerun:
Line 489  rerun:
                          */                           */
                         if (curp->secondary)                          if (curp->secondary)
                                 curp->secondary->sz -= pos + 1;                                  curp->secondary->sz -= pos + 1;
                         mparse_readfd_r(curp, -1, ln.buf + of, 1);                          mparse_readfd(curp, -1, ln.buf + of);
                         if (MANDOCLEVEL_FATAL <= curp->file_status)                          if (MANDOCLEVEL_FATAL <= curp->file_status)
                                 break;                                  break;
                         pos = 0;                          pos = 0;
Line 649  mparse_end(struct mparse *curp)
Line 663  mparse_end(struct mparse *curp)
 }  }
   
 static void  static void
 mparse_parse_buffer(struct mparse *curp, struct buf blk, const char *file,  mparse_parse_buffer(struct mparse *curp, struct buf blk, const char *file)
                 int re)  
 {  {
         const char      *svfile;          const char      *svfile;
           static int       recursion_depth;
   
           if (64 < recursion_depth) {
                   mandoc_msg(MANDOCERR_ROFFLOOP, curp, curp->line, 0, NULL);
                   return;
           }
   
         /* Line number is per-file. */          /* Line number is per-file. */
         svfile = curp->file;          svfile = curp->file;
         curp->file = file;          curp->file = file;
         curp->line = 1;          curp->line = 1;
           recursion_depth++;
   
         mparse_buf_r(curp, blk, 1);          mparse_buf_r(curp, blk, 1);
   
         if (0 == re && MANDOCLEVEL_FATAL > curp->file_status)          if (0 == --recursion_depth && MANDOCLEVEL_FATAL > curp->file_status)
                 mparse_end(curp);                  mparse_end(curp);
   
         curp->file = svfile;          curp->file = svfile;
Line 676  mparse_readmem(struct mparse *curp, const void *buf, s
Line 696  mparse_readmem(struct mparse *curp, const void *buf, s
         blk.buf = UNCONST(buf);          blk.buf = UNCONST(buf);
         blk.sz = len;          blk.sz = len;
   
         mparse_parse_buffer(curp, blk, file, 0);          mparse_parse_buffer(curp, blk, file);
         return(curp->file_status);          return(curp->file_status);
 }  }
   
 static void  enum mandoclevel
 mparse_readfd_r(struct mparse *curp, int fd, const char *file, int re)  mparse_readfd(struct mparse *curp, int fd, const char *file)
 {  {
         struct buf       blk;          struct buf       blk;
         int              with_mmap;          int              with_mmap;
Line 690  mparse_readfd_r(struct mparse *curp, int fd, const cha
Line 710  mparse_readfd_r(struct mparse *curp, int fd, const cha
                 if (-1 == (fd = open(file, O_RDONLY, 0))) {                  if (-1 == (fd = open(file, O_RDONLY, 0))) {
                         perror(file);                          perror(file);
                         curp->file_status = MANDOCLEVEL_SYSERR;                          curp->file_status = MANDOCLEVEL_SYSERR;
                         return;                          goto out;
                 }                  }
         /*          /*
          * Run for each opened file; may be called more than once for           * Run for each opened file; may be called more than once for
Line 701  mparse_readfd_r(struct mparse *curp, int fd, const cha
Line 721  mparse_readfd_r(struct mparse *curp, int fd, const cha
   
         if ( ! read_whole_file(file, fd, &blk, &with_mmap)) {          if ( ! read_whole_file(file, fd, &blk, &with_mmap)) {
                 curp->file_status = MANDOCLEVEL_SYSERR;                  curp->file_status = MANDOCLEVEL_SYSERR;
                 return;                  goto out;
         }          }
   
         mparse_parse_buffer(curp, blk, file, re);          mparse_parse_buffer(curp, blk, file);
   
 #ifdef  HAVE_MMAP  #ifdef  HAVE_MMAP
         if (with_mmap)          if (with_mmap)
Line 715  mparse_readfd_r(struct mparse *curp, int fd, const cha
Line 735  mparse_readfd_r(struct mparse *curp, int fd, const cha
   
         if (STDIN_FILENO != fd && -1 == close(fd))          if (STDIN_FILENO != fd && -1 == close(fd))
                 perror(file);                  perror(file);
 }  out:
   
 enum mandoclevel  
 mparse_readfd(struct mparse *curp, int fd, const char *file)  
 {  
   
         mparse_readfd_r(curp, fd, file, 0);  
         return(curp->file_status);          return(curp->file_status);
 }  }
   

Legend:
Removed from v.1.34  
changed lines
  Added in v.1.36

CVSweb