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

Diff for /mandoc/read.c between version 1.159 and 1.168

version 1.159, 2017/02/03 17:56:59 version 1.168, 2017/06/01 15:25:39
Line 30 
Line 30 
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <stdarg.h>  #include <stdarg.h>
 #include <stdint.h>  
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
Line 48 
Line 47 
 #define REPARSE_LIMIT   1000  #define REPARSE_LIMIT   1000
   
 struct  mparse {  struct  mparse {
         struct roff_man  *man; /* man parser */  
         struct roff      *roff; /* roff parser (!NULL) */          struct roff      *roff; /* roff parser (!NULL) */
           struct roff_man  *man; /* man parser */
         char             *sodest; /* filename pointed to by .so */          char             *sodest; /* filename pointed to by .so */
         const char       *file; /* filename of current input file */          const char       *file; /* filename of current input file */
         struct buf       *primary; /* buffer currently being parsed */          struct buf       *primary; /* buffer currently being parsed */
Line 67  struct mparse {
Line 66  struct mparse {
   
 static  void      choose_parser(struct mparse *);  static  void      choose_parser(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, size_t, int);  static  int       mparse_buf_r(struct mparse *, struct buf, size_t, int);
 static  int       read_whole_file(struct mparse *, const char *, int,  static  int       read_whole_file(struct mparse *, const char *, int,
                                 struct buf *, int *);                                  struct buf *, int *);
 static  void      mparse_end(struct mparse *);  static  void      mparse_end(struct mparse *);
Line 76  static void   mparse_parse_buffer(struct mparse *, str
Line 75  static void   mparse_parse_buffer(struct mparse *, str
   
 static  const enum mandocerr    mandoclimits[MANDOCLEVEL_MAX] = {  static  const enum mandocerr    mandoclimits[MANDOCLEVEL_MAX] = {
         MANDOCERR_OK,          MANDOCERR_OK,
           MANDOCERR_STYLE,
         MANDOCERR_WARNING,          MANDOCERR_WARNING,
         MANDOCERR_WARNING,  
         MANDOCERR_ERROR,          MANDOCERR_ERROR,
         MANDOCERR_UNSUPP,          MANDOCERR_UNSUPP,
         MANDOCERR_MAX,          MANDOCERR_MAX,
Line 87  static const enum mandocerr mandoclimits[MANDOCLEVEL_M
Line 86  static const enum mandocerr mandoclimits[MANDOCLEVEL_M
 static  const char * const      mandocerrs[MANDOCERR_MAX] = {  static  const char * const      mandocerrs[MANDOCERR_MAX] = {
         "ok",          "ok",
   
           "generic style suggestion",
   
           "useless macro",
           "consider using OS macro",
           "description line ends with a full stop",
   
         "generic warning",          "generic warning",
   
         /* related to the prologue */          /* related to the prologue */
Line 114  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 119  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "bad NAME section content",          "bad NAME section content",
         "missing comma before name",          "missing comma before name",
         "missing description line, using \"\"",          "missing description line, using \"\"",
           "description line outside NAME section",
         "sections out of conventional order",          "sections out of conventional order",
         "duplicate section title",          "duplicate section title",
         "unexpected section",          "unexpected section",
Line 241  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 247  static const char * const mandocerrs[MANDOCERR_MAX] = 
   
 static  const char * const      mandoclevels[MANDOCLEVEL_MAX] = {  static  const char * const      mandoclevels[MANDOCLEVEL_MAX] = {
         "SUCCESS",          "SUCCESS",
         "RESERVED",          "STYLE",
         "WARNING",          "WARNING",
         "ERROR",          "ERROR",
         "UNSUPP",          "UNSUPP",
Line 293  choose_parser(struct mparse *curp)
Line 299  choose_parser(struct mparse *curp)
         }          }
   
         if (format == MPARSE_MDOC) {          if (format == MPARSE_MDOC) {
                 mdoc_hash_init();  
                 curp->man->macroset = MACROSET_MDOC;                  curp->man->macroset = MACROSET_MDOC;
                 curp->man->first->tok = TOKEN_NONE;                  if (curp->man->mdocmac == NULL)
                           curp->man->mdocmac = roffhash_alloc(MDOC_Dd, MDOC_MAX);
         } else {          } else {
                 man_hash_init();  
                 curp->man->macroset = MACROSET_MAN;                  curp->man->macroset = MACROSET_MAN;
                 curp->man->first->tok = TOKEN_NONE;                  if (curp->man->manmac == NULL)
                           curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX);
         }          }
           curp->man->first->tok = TOKEN_NONE;
 }  }
   
 /*  /*
Line 310  choose_parser(struct mparse *curp)
Line 317  choose_parser(struct mparse *curp)
  * macros, inline equations, and input line traps)   * macros, inline equations, and input line traps)
  * and indirectly (for .so file inclusion).   * and indirectly (for .so file inclusion).
  */   */
 static void  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;          const struct tbl_span   *span;
Line 511  rerun:
Line 518  rerun:
   
                 switch (rr) {                  switch (rr) {
                 case ROFF_REPARSE:                  case ROFF_REPARSE:
                         if (REPARSE_LIMIT >= ++curp->reparse_count)                          if (++curp->reparse_count > REPARSE_LIMIT)
                                 mparse_buf_r(curp, ln, of, 0);  
                         else  
                                 mandoc_msg(MANDOCERR_ROFFLOOP, curp,                                  mandoc_msg(MANDOCERR_ROFFLOOP, curp,
                                     curp->line, pos, NULL);                                      curp->line, pos, NULL);
                         pos = 0;                          else if (mparse_buf_r(curp, ln, of, 0) == 1 ||
                         continue;                              start == 1) {
                                   pos = 0;
                                   continue;
                           }
                           free(ln.buf);
                           return 0;
                 case ROFF_APPEND:                  case ROFF_APPEND:
                         pos = strlen(ln.buf);                          pos = strlen(ln.buf);
                         continue;                          continue;
Line 531  rerun:
Line 541  rerun:
                             (i >= blk.sz || blk.buf[i] == '\0')) {                              (i >= blk.sz || blk.buf[i] == '\0')) {
                                 curp->sodest = mandoc_strdup(ln.buf + of);                                  curp->sodest = mandoc_strdup(ln.buf + of);
                                 free(ln.buf);                                  free(ln.buf);
                                 return;                                  return 1;
                         }                          }
                         /*                          /*
                          * We remove `so' clauses from our lookaside                           * We remove `so' clauses from our lookaside
Line 597  rerun:
Line 607  rerun:
         }          }
   
         free(ln.buf);          free(ln.buf);
           return 1;
 }  }
   
 static int  static int
 read_whole_file(struct mparse *curp, const char *file, int fd,  read_whole_file(struct mparse *curp, const char *file, int fd,
                 struct buf *fb, int *with_mmap)                  struct buf *fb, int *with_mmap)
 {  {
           struct stat      st;
         gzFile           gz;          gzFile           gz;
         size_t           off;          size_t           off;
         ssize_t          ssz;          ssize_t          ssz;
   
         struct stat      st;  
   
         if (fstat(fd, &st) == -1)          if (fstat(fd, &st) == -1)
                 err((int)MANDOCLEVEL_SYSERR, "%s", file);                  err((int)MANDOCLEVEL_SYSERR, "%s", file);
   
Line 815  mparse_alloc(int options, enum mandoclevel wlevel, man
Line 825  mparse_alloc(int options, enum mandoclevel wlevel, man
         curp->man = roff_man_alloc( curp->roff, curp, curp->defos,          curp->man = roff_man_alloc( curp->roff, curp, curp->defos,
                 curp->options & MPARSE_QUICK ? 1 : 0);                  curp->options & MPARSE_QUICK ? 1 : 0);
         if (curp->options & MPARSE_MDOC) {          if (curp->options & MPARSE_MDOC) {
                 mdoc_hash_init();  
                 curp->man->macroset = MACROSET_MDOC;                  curp->man->macroset = MACROSET_MDOC;
                   if (curp->man->mdocmac == NULL)
                           curp->man->mdocmac = roffhash_alloc(MDOC_Dd, MDOC_MAX);
         } else if (curp->options & MPARSE_MAN) {          } else if (curp->options & MPARSE_MAN) {
                 man_hash_init();  
                 curp->man->macroset = MACROSET_MAN;                  curp->man->macroset = MACROSET_MAN;
                   if (curp->man->manmac == NULL)
                           curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX);
         }          }
         curp->man->first->tok = TOKEN_NONE;          curp->man->first->tok = TOKEN_NONE;
         return curp;          return curp;
Line 830  mparse_reset(struct mparse *curp)
Line 842  mparse_reset(struct mparse *curp)
 {  {
         roff_reset(curp->roff);          roff_reset(curp->roff);
         roff_man_reset(curp->man);          roff_man_reset(curp->man);
   
           free(curp->sodest);
           curp->sodest = NULL;
   
         if (curp->secondary)          if (curp->secondary)
                 curp->secondary->sz = 0;                  curp->secondary->sz = 0;
   
         curp->file_status = MANDOCLEVEL_OK;          curp->file_status = MANDOCLEVEL_OK;
   
         free(curp->sodest);  
         curp->sodest = NULL;  
         curp->gzip = 0;          curp->gzip = 0;
 }  }
   
Line 844  void
Line 857  void
 mparse_free(struct mparse *curp)  mparse_free(struct mparse *curp)
 {  {
   
           roffhash_free(curp->man->mdocmac);
           roffhash_free(curp->man->manmac);
         roff_man_free(curp->man);          roff_man_free(curp->man);
         if (curp->roff)          roff_free(curp->roff);
                 roff_free(curp->roff);  
         if (curp->secondary)          if (curp->secondary)
                 free(curp->secondary->buf);                  free(curp->secondary->buf);
   

Legend:
Removed from v.1.159  
changed lines
  Added in v.1.168

CVSweb