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

Diff for /mandoc/read.c between version 1.189 and 1.194

version 1.189, 2017/07/06 22:59:48 version 1.194, 2018/02/23 21:35:19
Line 24 
Line 24 
   
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
 #if HAVE_ERR  
 #include <err.h>  
 #endif  
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <stdarg.h>  #include <stdarg.h>
Line 42 
Line 39 
 #include "mdoc.h"  #include "mdoc.h"
 #include "man.h"  #include "man.h"
 #include "libmandoc.h"  #include "libmandoc.h"
 #include "roff_int.h"  
   
 #define REPARSE_LIMIT   1000  #define REPARSE_LIMIT   1000
   
Line 100  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 96  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "legacy man(7) date format",          "legacy man(7) date format",
         "lower case character in document title",          "lower case character in document title",
         "duplicate RCS id",          "duplicate RCS id",
         "typo in section name",          "possible typo in section name",
         "unterminated quoted argument",          "unterminated quoted argument",
         "useless macro",          "useless macro",
         "consider using OS macro",          "consider using OS macro",
Line 343  choose_parser(struct mparse *curp)
Line 339  choose_parser(struct mparse *curp)
 static int  static int
 mparse_buf_r(struct mparse *curp, struct buf blk, size_t i, int start)  mparse_buf_r(struct mparse *curp, struct buf blk, size_t i, int start)
 {  {
         const struct tbl_span   *span;  
         struct buf       ln;          struct buf       ln;
         const char      *save_file;          const char      *save_file;
         char            *cp;          char            *cp;
Line 534  rerun:
Line 529  rerun:
                 if (curp->man->macroset == MACROSET_NONE)                  if (curp->man->macroset == MACROSET_NONE)
                         choose_parser(curp);                          choose_parser(curp);
   
                 /*                  if ((curp->man->macroset == MACROSET_MDOC ?
                  * Lastly, push down into the parsers themselves.  
                  * If libroff returns ROFF_TBL, then add it to the  
                  * currently open parse.  Since we only get here if  
                  * there does exist data (see tbl_data.c), we're  
                  * guaranteed that something's been allocated.  
                  * Do the same for ROFF_EQN.  
                  */  
   
                 if (rr == ROFF_TBL)  
                         while ((span = roff_span(curp->roff)) != NULL)  
                                 roff_addtbl(curp->man, span);  
                 else if (rr == ROFF_EQN)  
                         roff_addeqn(curp->man, roff_eqn(curp->roff));  
                 else if ((curp->man->macroset == MACROSET_MDOC ?  
                     mdoc_parseln(curp->man, curp->line, ln.buf, of) :                      mdoc_parseln(curp->man, curp->line, ln.buf, of) :
                     man_parseln(curp->man, curp->line, ln.buf, of)) == 2)                      man_parseln(curp->man, curp->line, ln.buf, of)) == 2)
                                 break;                                  break;
Line 575  read_whole_file(struct mparse *curp, const char *file,
Line 556  read_whole_file(struct mparse *curp, const char *file,
         gzFile           gz;          gzFile           gz;
         size_t           off;          size_t           off;
         ssize_t          ssz;          ssize_t          ssz;
           int              gzerrnum, retval;
   
         if (fstat(fd, &st) == -1)          if (fstat(fd, &st) == -1) {
                 err((int)MANDOCLEVEL_SYSERR, "%s", file);                  mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0,
                       "fstat: %s", strerror(errno));
                   return 0;
           }
   
         /*          /*
          * If we're a regular file, try just reading in the whole entry           * If we're a regular file, try just reading in the whole entry
Line 599  read_whole_file(struct mparse *curp, const char *file,
Line 584  read_whole_file(struct mparse *curp, const char *file,
         }          }
   
         if (curp->gzip) {          if (curp->gzip) {
                 if ((gz = gzdopen(fd, "rb")) == NULL)                  /*
                         err((int)MANDOCLEVEL_SYSERR, "%s", file);                   * Duplicating the file descriptor is required
                    * because we will have to call gzclose(3)
                    * to free memory used internally by zlib,
                    * but that will also close the file descriptor,
                    * which this function must not do.
                    */
                   if ((fd = dup(fd)) == -1) {
                           mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0,
                               "dup: %s", strerror(errno));
                           return 0;
                   }
                   if ((gz = gzdopen(fd, "rb")) == NULL) {
                           mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0,
                               "gzdopen: %s", strerror(errno));
                           close(fd);
                           return 0;
                   }
         } else          } else
                 gz = NULL;                  gz = NULL;
   
Line 611  read_whole_file(struct mparse *curp, const char *file,
Line 612  read_whole_file(struct mparse *curp, const char *file,
   
         *with_mmap = 0;          *with_mmap = 0;
         off = 0;          off = 0;
           retval = 0;
         fb->sz = 0;          fb->sz = 0;
         fb->buf = NULL;          fb->buf = NULL;
         for (;;) {          for (;;) {
Line 627  read_whole_file(struct mparse *curp, const char *file,
Line 629  read_whole_file(struct mparse *curp, const char *file,
                     read(fd, fb->buf + (int)off, fb->sz - off);                      read(fd, fb->buf + (int)off, fb->sz - off);
                 if (ssz == 0) {                  if (ssz == 0) {
                         fb->sz = off;                          fb->sz = off;
                         return 1;                          retval = 1;
                           break;
                 }                  }
                 if (ssz == -1)                  if (ssz == -1) {
                         err((int)MANDOCLEVEL_SYSERR, "%s", file);                          if (curp->gzip)
                                   (void)gzerror(gz, &gzerrnum);
                           mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, "read: %s",
                               curp->gzip && gzerrnum != Z_ERRNO ?
                               zError(gzerrnum) : strerror(errno));
                           break;
                   }
                 off += (size_t)ssz;                  off += (size_t)ssz;
         }          }
   
         free(fb->buf);          if (curp->gzip && (gzerrnum = gzclose(gz)) != Z_OK)
         fb->buf = NULL;                  mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, "gzclose: %s",
         return 0;                      gzerrnum == Z_ERRNO ? strerror(errno) :
                       zError(gzerrnum));
           if (retval == 0) {
                   free(fb->buf);
                   fb->buf = NULL;
           }
           return retval;
 }  }
   
 static void  static void

Legend:
Removed from v.1.189  
changed lines
  Added in v.1.194

CVSweb