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

Diff for /mandoc/read.c between version 1.145 and 1.154

version 1.145, 2015/10/30 19:04:16 version 1.154, 2016/12/07 22:59:29
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-2015 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2010-2016 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2010, 2012 Joerg Sonnenberger <joerg@netbsd.org>   * Copyright (c) 2010, 2012 Joerg Sonnenberger <joerg@netbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
Line 19 
Line 19 
 #include "config.h"  #include "config.h"
   
 #include <sys/types.h>  #include <sys/types.h>
 #if HAVE_MMAP  
 #include <sys/mman.h>  #include <sys/mman.h>
 #include <sys/stat.h>  #include <sys/stat.h>
 #endif  
   
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
   #if HAVE_ERR
 #include <err.h>  #include <err.h>
   #endif
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <stdarg.h>  #include <stdarg.h>
Line 141  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 141  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "empty argument, using 0n",          "empty argument, using 0n",
         "missing display type, using -ragged",          "missing display type, using -ragged",
         "list type is not the first argument",          "list type is not the first argument",
         "missing -width in -tag list, using 8n",          "missing -width in -tag list, using 6n",
         "missing utility name, using \"\"",          "missing utility name, using \"\"",
         "missing function name, using \"\"",          "missing function name, using \"\"",
         "empty head in list item",          "empty head in list item",
Line 289  choose_parser(struct mparse *curp)
Line 289  choose_parser(struct mparse *curp)
                 }                  }
         }          }
   
         if (curp->man == NULL) {  
                 curp->man = roff_man_alloc(curp->roff, curp, curp->defos,  
                     curp->options & MPARSE_QUICK ? 1 : 0);  
                 curp->man->macroset = MACROSET_MAN;  
                 curp->man->first->tok = TOKEN_NONE;  
         }  
   
         if (format == MPARSE_MDOC) {          if (format == MPARSE_MDOC) {
                 mdoc_hash_init();                  mdoc_hash_init();
                 curp->man->macroset = MACROSET_MDOC;                  curp->man->macroset = MACROSET_MDOC;
Line 322  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 315  mparse_buf_r(struct mparse *curp, struct buf blk, size
         const char      *save_file;          const char      *save_file;
         char            *cp;          char            *cp;
         size_t           pos; /* byte number in the ln buffer */          size_t           pos; /* byte number in the ln buffer */
           size_t           j;  /* auxiliary byte number in the blk buffer */
         enum rofferr     rr;          enum rofferr     rr;
         int              of;          int              of;
         int              lnn; /* line number in the real file */          int              lnn; /* line number in the real file */
Line 427  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 421  mparse_buf_r(struct mparse *curp, struct buf blk, size
                         }                          }
   
                         if ('"' == blk.buf[i + 1] || '#' == blk.buf[i + 1]) {                          if ('"' == blk.buf[i + 1] || '#' == blk.buf[i + 1]) {
                                   j = i;
                                 i += 2;                                  i += 2;
                                 /* Comment, skip to end of line */                                  /* Comment, skip to end of line */
                                 for (; i < blk.sz; ++i) {                                  for (; i < blk.sz; ++i) {
                                         if ('\n' == blk.buf[i]) {                                          if (blk.buf[i] != '\n')
                                                 ++i;                                                  continue;
                                                 ++lnn;                                          if (blk.buf[i - 1] == ' ' ||
                                                 break;                                              blk.buf[i - 1] == '\t')
                                         }                                                  mandoc_msg(
                                                       MANDOCERR_SPACE_EOL,
                                                       curp, curp->line,
                                                       pos + i-1 - j, NULL);
                                           ++i;
                                           ++lnn;
                                           break;
                                 }                                  }
   
                                 /* Backout trailing whitespaces */                                  /* Backout trailing whitespaces */
Line 537  rerun:
Line 538  rerun:
                         if (curp->secondary)                          if (curp->secondary)
                                 curp->secondary->sz -= pos + 1;                                  curp->secondary->sz -= pos + 1;
                         save_file = curp->file;                          save_file = curp->file;
                         if (mparse_open(curp, &fd, ln.buf + of) ==                          if ((fd = mparse_open(curp, ln.buf + of)) != -1) {
                             MANDOCLEVEL_OK) {  
                                 mparse_readfd(curp, fd, ln.buf + of);                                  mparse_readfd(curp, fd, ln.buf + of);
                                   close(fd);
                                 curp->file = save_file;                                  curp->file = save_file;
                         } else {                          } else {
                                 curp->file = save_file;                                  curp->file = save_file;
Line 560  rerun:
Line 561  rerun:
                         break;                          break;
                 }                  }
   
                 /*                  if (curp->man->macroset == MACROSET_NONE)
                  * If input parsers have not been allocated, do so now.  
                  * We keep these instanced between parsers, but set them  
                  * locally per parse routine since we can use different  
                  * parsers with each one.  
                  */  
   
                 if (curp->man == NULL ||  
                     curp->man->macroset == MACROSET_NONE)  
                         choose_parser(curp);                          choose_parser(curp);
   
                 /*                  /*
Line 611  read_whole_file(struct mparse *curp, const char *file,
Line 604  read_whole_file(struct mparse *curp, const char *file,
         size_t           off;          size_t           off;
         ssize_t          ssz;          ssize_t          ssz;
   
 #if HAVE_MMAP  
         struct stat      st;          struct stat      st;
   
         if (fstat(fd, &st) == -1)          if (fstat(fd, &st) == -1)
Line 635  read_whole_file(struct mparse *curp, const char *file,
Line 627  read_whole_file(struct mparse *curp, const char *file,
                 if (fb->buf != MAP_FAILED)                  if (fb->buf != MAP_FAILED)
                         return 1;                          return 1;
         }          }
 #endif  
   
         if (curp->gzip) {          if (curp->gzip) {
                 if ((gz = gzdopen(fd, "rb")) == NULL)                  if ((gz = gzdopen(fd, "rb")) == NULL)
Line 681  read_whole_file(struct mparse *curp, const char *file,
Line 672  read_whole_file(struct mparse *curp, const char *file,
 static void  static void
 mparse_end(struct mparse *curp)  mparse_end(struct mparse *curp)
 {  {
   
         if (curp->man == NULL && curp->sodest == NULL)  
                 curp->man = roff_man_alloc(curp->roff, curp, curp->defos,  
                     curp->options & MPARSE_QUICK ? 1 : 0);  
         if (curp->man->macroset == MACROSET_NONE)          if (curp->man->macroset == MACROSET_NONE)
                 curp->man->macroset = MACROSET_MAN;                  curp->man->macroset = MACROSET_MAN;
         if (curp->man->macroset == MACROSET_MDOC)          if (curp->man->macroset == MACROSET_MDOC)
Line 764  mparse_readfd(struct mparse *curp, int fd, const char 
Line 751  mparse_readfd(struct mparse *curp, int fd, const char 
                     (MPARSE_UTF8 | MPARSE_LATIN1);                      (MPARSE_UTF8 | MPARSE_LATIN1);
                 mparse_parse_buffer(curp, blk, file);                  mparse_parse_buffer(curp, blk, file);
                 curp->filenc = save_filenc;                  curp->filenc = save_filenc;
 #if HAVE_MMAP  
                 if (with_mmap)                  if (with_mmap)
                         munmap(blk.buf, blk.sz);                          munmap(blk.buf, blk.sz);
                 else                  else
 #endif  
                         free(blk.buf);                          free(blk.buf);
         }          }
   
         if (fd != STDIN_FILENO && close(fd) == -1)  
                 perror(file);  
   
         return curp->file_status;          return curp->file_status;
 }  }
   
 enum mandoclevel  int
 mparse_open(struct mparse *curp, int *fd, const char *file)  mparse_open(struct mparse *curp, const char *file)
 {  {
         char             *cp;          char             *cp;
           int               fd;
   
         curp->file = file;          curp->file = file;
         cp = strrchr(file, '.');          cp = strrchr(file, '.');
Line 789  mparse_open(struct mparse *curp, int *fd, const char *
Line 771  mparse_open(struct mparse *curp, int *fd, const char *
   
         /* First try to use the filename as it is. */          /* First try to use the filename as it is. */
   
         if ((*fd = open(file, O_RDONLY)) != -1)          if ((fd = open(file, O_RDONLY)) != -1)
                 return MANDOCLEVEL_OK;                  return fd;
   
         /*          /*
          * If that doesn't work and the filename doesn't           * If that doesn't work and the filename doesn't
Line 799  mparse_open(struct mparse *curp, int *fd, const char *
Line 781  mparse_open(struct mparse *curp, int *fd, const char *
   
         if ( ! curp->gzip) {          if ( ! curp->gzip) {
                 mandoc_asprintf(&cp, "%s.gz", file);                  mandoc_asprintf(&cp, "%s.gz", file);
                 *fd = open(file, O_RDONLY);                  fd = open(cp, O_RDONLY);
                 free(cp);                  free(cp);
                 if (*fd != -1) {                  if (fd != -1) {
                         curp->gzip = 1;                          curp->gzip = 1;
                         return MANDOCLEVEL_OK;                          return fd;
                 }                  }
         }          }
   
         /* Neither worked, give up. */          /* Neither worked, give up. */
   
         mandoc_msg(MANDOCERR_FILE, curp, 0, 0, strerror(errno));          mandoc_msg(MANDOCERR_FILE, curp, 0, 0, strerror(errno));
         return MANDOCLEVEL_ERROR;          return -1;
 }  }
   
 struct mparse *  struct mparse *
Line 843  mparse_alloc(int options, enum mandoclevel wlevel, man
Line 825  mparse_alloc(int options, enum mandoclevel wlevel, man
 void  void
 mparse_reset(struct mparse *curp)  mparse_reset(struct mparse *curp)
 {  {
   
         roff_reset(curp->roff);          roff_reset(curp->roff);
           roff_man_reset(curp->man);
         if (curp->man != NULL)  
                 roff_man_reset(curp->man);  
         if (curp->secondary)          if (curp->secondary)
                 curp->secondary->sz = 0;                  curp->secondary->sz = 0;
   

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

CVSweb