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

Diff for /mandoc/read.c between version 1.129 and 1.139

version 1.129, 2015/03/02 14:50:17 version 1.139, 2015/04/19 14:25:41
Line 8 
Line 8 
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
  * copyright notice and this permission notice appear in all copies.   * copyright notice and this permission notice appear in all copies.
  *   *
  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Line 29 
Line 29 
 #include <ctype.h>  #include <ctype.h>
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
   #include <signal.h>
 #include <stdarg.h>  #include <stdarg.h>
 #include <stdint.h>  #include <stdint.h>
 #include <stdio.h>  #include <stdio.h>
Line 36 
Line 37 
 #include <string.h>  #include <string.h>
 #include <unistd.h>  #include <unistd.h>
   
 #include "mandoc.h"  
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
 #include "libmandoc.h"  #include "mandoc.h"
   #include "roff.h"
 #include "mdoc.h"  #include "mdoc.h"
 #include "man.h"  #include "man.h"
   #include "libmandoc.h"
   #include "roff_int.h"
   
 #define REPARSE_LIMIT   1000  #define REPARSE_LIMIT   1000
   
 struct  mparse {  struct  mparse {
         struct man       *pman; /* persistent man parser */          struct roff_man  *man; /* man parser */
         struct mdoc      *pmdoc; /* persistent mdoc parser */  
         struct man       *man; /* man parser */  
         struct mdoc      *mdoc; /* mdoc parser */  
         struct roff      *roff; /* roff parser (!NULL) */          struct roff      *roff; /* roff parser (!NULL) */
         const struct mchars *mchars; /* character table */          const struct mchars *mchars; /* character table */
         char             *sodest; /* filename pointed to by .so */          char             *sodest; /* filename pointed to by .so */
Line 290  choose_parser(struct mparse *curp)
Line 290  choose_parser(struct mparse *curp)
                 }                  }
         }          }
   
         if (format == MPARSE_MDOC) {          if (curp->man == NULL) {
                 if (NULL == curp->pmdoc)                  curp->man = roff_man_alloc(curp->roff, curp, curp->defos,
                         curp->pmdoc = mdoc_alloc(                      curp->options & MPARSE_QUICK ? 1 : 0);
                             curp->roff, curp, curp->defos,                  curp->man->macroset = MACROSET_MAN;
                             MPARSE_QUICK & curp->options ? 1 : 0);                  curp->man->first->tok = TOKEN_NONE;
                 assert(curp->pmdoc);  
                 curp->mdoc = curp->pmdoc;  
                 return;  
         }          }
   
         /* Fall back to man(7) as a last resort. */          if (format == MPARSE_MDOC) {
                   mdoc_hash_init();
         if (NULL == curp->pman)                  curp->man->macroset = MACROSET_MDOC;
                 curp->pman = man_alloc(                  curp->man->first->tok = TOKEN_NONE;
                     curp->roff, curp, curp->defos,          } else {
                     MPARSE_QUICK & curp->options ? 1 : 0);                  man_hash_init();
         assert(curp->pman);                  curp->man->macroset = MACROSET_MAN;
         curp->man = curp->pman;                  curp->man->first->tok = TOKEN_NONE;
           }
 }  }
   
 /*  /*
Line 573  rerun:
Line 571  rerun:
                  * parsers with each one.                   * parsers with each one.
                  */                   */
   
                 if ( ! (curp->man || curp->mdoc))                  if (curp->man == NULL ||
                       curp->man->macroset == MACROSET_NONE)
                         choose_parser(curp);                          choose_parser(curp);
   
                 /*                  /*
Line 585  rerun:
Line 584  rerun:
                  * Do the same for ROFF_EQN.                   * Do the same for ROFF_EQN.
                  */                   */
   
                 if (rr == ROFF_TBL) {                  if (rr == ROFF_TBL)
                         while ((span = roff_span(curp->roff)) != NULL)                          while ((span = roff_span(curp->roff)) != NULL)
                                 if (curp->man == NULL)                                  roff_addtbl(curp->man, span);
                                         mdoc_addspan(curp->mdoc, span);                  else if (rr == ROFF_EQN)
                                 else                          roff_addeqn(curp->man, roff_eqn(curp->roff));
                                         man_addspan(curp->man, span);                  else if ((curp->man->macroset == MACROSET_MDOC ?
                 } else if (rr == ROFF_EQN) {                      mdoc_parseln(curp->man, curp->line, ln.buf, of) :
                         if (curp->man == NULL)  
                                 mdoc_addeqn(curp->mdoc, roff_eqn(curp->roff));  
                         else  
                                 man_addeqn(curp->man, roff_eqn(curp->roff));  
                 } else if ((curp->man == NULL ?  
                     mdoc_parseln(curp->mdoc, 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 636  read_whole_file(struct mparse *curp, const char *file,
Line 629  read_whole_file(struct mparse *curp, const char *file,
          */           */
   
         if (S_ISREG(st.st_mode)) {          if (S_ISREG(st.st_mode)) {
                 if (st.st_size >= (1U << 31)) {                  if (st.st_size > 0x7fffffff) {
                         mandoc_msg(MANDOCERR_TOOLARGE, curp, 0, 0, NULL);                          mandoc_msg(MANDOCERR_TOOLARGE, curp, 0, 0, NULL);
                         return(0);                          return(0);
                 }                  }
Line 687  static void
Line 680  static void
 mparse_end(struct mparse *curp)  mparse_end(struct mparse *curp)
 {  {
   
         if (curp->mdoc == NULL &&          if (curp->man == NULL && curp->sodest == NULL)
             curp->man == NULL &&                  curp->man = roff_man_alloc(curp->roff, curp, curp->defos,
             curp->sodest == NULL) {                      curp->options & MPARSE_QUICK ? 1 : 0);
                 if (curp->options & MPARSE_MDOC)          if (curp->man->macroset == MACROSET_NONE)
                         curp->mdoc = curp->pmdoc;                  curp->man->macroset = MACROSET_MAN;
                 else {          if (curp->man->macroset == MACROSET_MDOC)
                         if (curp->pman == NULL)                  mdoc_endparse(curp->man);
                                 curp->pman = man_alloc(          else
                                     curp->roff, curp, curp->defos,  
                                     curp->options & MPARSE_QUICK ? 1 : 0);  
                         curp->man = curp->pman;  
                 }  
         }  
         if (curp->mdoc)  
                 mdoc_endparse(curp->mdoc);  
         if (curp->man)  
                 man_endparse(curp->man);                  man_endparse(curp->man);
         roff_endparse(curp->roff);          roff_endparse(curp->roff);
 }  }
Line 846  mparse_open(struct mparse *curp, int *fd, const char *
Line 831  mparse_open(struct mparse *curp, int *fd, const char *
                         perror("dup");                          perror("dup");
                         exit((int)MANDOCLEVEL_SYSERR);                          exit((int)MANDOCLEVEL_SYSERR);
                 }                  }
                   signal(SIGPIPE, SIG_DFL);
                 execlp("gunzip", "gunzip", "-c", file, NULL);                  execlp("gunzip", "gunzip", "-c", file, NULL);
                 perror("exec");                  perror("exec");
                 exit((int)MANDOCLEVEL_SYSERR);                  exit((int)MANDOCLEVEL_SYSERR);
Line 897  mparse_alloc(int options, enum mandoclevel wlevel, man
Line 883  mparse_alloc(int options, enum mandoclevel wlevel, man
   
         curp->mchars = mchars;          curp->mchars = mchars;
         curp->roff = roff_alloc(curp, curp->mchars, options);          curp->roff = roff_alloc(curp, curp->mchars, options);
         if (curp->options & MPARSE_MDOC)          curp->man = roff_man_alloc( curp->roff, curp, curp->defos,
                 curp->pmdoc = mdoc_alloc(                  curp->options & MPARSE_QUICK ? 1 : 0);
                     curp->roff, curp, curp->defos,          if (curp->options & MPARSE_MDOC) {
                     curp->options & MPARSE_QUICK ? 1 : 0);                  mdoc_hash_init();
         if (curp->options & MPARSE_MAN)                  curp->man->macroset = MACROSET_MDOC;
                 curp->pman = man_alloc(          } else if (curp->options & MPARSE_MAN) {
                     curp->roff, curp, curp->defos,                  man_hash_init();
                     curp->options & MPARSE_QUICK ? 1 : 0);                  curp->man->macroset = MACROSET_MAN;
           }
           curp->man->first->tok = TOKEN_NONE;
         return(curp);          return(curp);
 }  }
   
Line 915  mparse_reset(struct mparse *curp)
Line 902  mparse_reset(struct mparse *curp)
   
         roff_reset(curp->roff);          roff_reset(curp->roff);
   
         if (curp->mdoc)          if (curp->man != NULL)
                 mdoc_reset(curp->mdoc);                  roff_man_reset(curp->man);
         if (curp->man)  
                 man_reset(curp->man);  
         if (curp->secondary)          if (curp->secondary)
                 curp->secondary->sz = 0;                  curp->secondary->sz = 0;
   
         curp->file_status = MANDOCLEVEL_OK;          curp->file_status = MANDOCLEVEL_OK;
         curp->mdoc = NULL;  
         curp->man = NULL;  
   
         free(curp->sodest);          free(curp->sodest);
         curp->sodest = NULL;          curp->sodest = NULL;
Line 934  void
Line 917  void
 mparse_free(struct mparse *curp)  mparse_free(struct mparse *curp)
 {  {
   
         if (curp->pmdoc)          roff_man_free(curp->man);
                 mdoc_free(curp->pmdoc);  
         if (curp->pman)  
                 man_free(curp->pman);  
         if (curp->roff)          if (curp->roff)
                 roff_free(curp->roff);                  roff_free(curp->roff);
         if (curp->secondary)          if (curp->secondary)
Line 949  mparse_free(struct mparse *curp)
Line 929  mparse_free(struct mparse *curp)
 }  }
   
 void  void
 mparse_result(struct mparse *curp,  mparse_result(struct mparse *curp, struct roff_man **man,
         struct mdoc **mdoc, struct man **man, char **sodest)          char **sodest)
 {  {
   
         if (sodest && NULL != (*sodest = curp->sodest)) {          if (sodest && NULL != (*sodest = curp->sodest)) {
                 *mdoc = NULL;  
                 *man = NULL;                  *man = NULL;
                 return;                  return;
         }          }
         if (mdoc)  
                 *mdoc = curp->mdoc;  
         if (man)          if (man)
                 *man = curp->man;                  *man = curp->man;
 }  }

Legend:
Removed from v.1.129  
changed lines
  Added in v.1.139

CVSweb