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

Diff for /mandoc/read.c between version 1.97 and 1.100

version 1.97, 2014/11/26 21:40:17 version 1.100, 2014/11/28 06:27:05
Line 202  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 202  static const char * const mandocerrs[MANDOCERR_MAX] = 
         /* related to request and macro arguments */          /* related to request and macro arguments */
         "escaped character not allowed in a name",          "escaped character not allowed in a name",
         "argument count wrong",          "argument count wrong",
           "NOT IMPLEMENTED: Bd -file",
         "missing list type, using -item",          "missing list type, using -item",
         "missing manual name, using \"\"",          "missing manual name, using \"\"",
         "uname(3) system call failed, using UNKNOWN",          "uname(3) system call failed, using UNKNOWN",
Line 214  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 215  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "generic fatal error",          "generic fatal error",
   
         "input too large",          "input too large",
         "NOT IMPLEMENTED: Bd -file",  
         "NOT IMPLEMENTED: .so with absolute path or \"..\"",          "NOT IMPLEMENTED: .so with absolute path or \"..\"",
         ".so request failed",          ".so request failed",
   
Line 317  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 317  mparse_buf_r(struct mparse *curp, struct buf blk, size
         struct buf       ln;          struct buf       ln;
         size_t           pos; /* byte number in the ln buffer */          size_t           pos; /* byte number in the ln buffer */
         enum rofferr     rr;          enum rofferr     rr;
         int              of, rc;          int              of;
         int              lnn; /* line number in the real file */          int              lnn; /* line number in the real file */
         unsigned char    c;          unsigned char    c;
   
Line 570  rerun:
Line 570  rerun:
                  * Do the same for ROFF_EQN.                   * Do the same for ROFF_EQN.
                  */                   */
   
                 rc = -1;                  if (rr == ROFF_TBL) {
                           while ((span = roff_span(curp->roff)) != NULL)
                                   if (curp->man == NULL)
                                           mdoc_addspan(curp->mdoc, span);
                                   else
                                           man_addspan(curp->man, span);
                   } else if (rr == ROFF_EQN) {
                           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)
                                   break;
   
                 if (ROFF_TBL == rr)  
                         while (NULL != (span = roff_span(curp->roff))) {  
                                 rc = curp->man ?  
                                     man_addspan(curp->man, span) :  
                                     mdoc_addspan(curp->mdoc, span);  
                                 if (0 == rc)  
                                         break;  
                         }  
                 else if (ROFF_EQN == rr)  
                         rc = curp->mdoc ?  
                             mdoc_addeqn(curp->mdoc,  
                                 roff_eqn(curp->roff)) :  
                             man_addeqn(curp->man,  
                                 roff_eqn(curp->roff));  
                 else if (curp->man || curp->mdoc)  
                         rc = curp->man ?  
                             man_parseln(curp->man,  
                                 curp->line, ln.buf, of) :  
                             mdoc_parseln(curp->mdoc,  
                                 curp->line, ln.buf, of);  
   
                 if (0 == rc) {  
                         assert(MANDOCLEVEL_FATAL <= curp->file_status);  
                         break;  
                 } else if (2 == rc)  
                         break;  
   
                 /* Temporary buffers typically are not full. */                  /* Temporary buffers typically are not full. */
   
                 if (0 == start && '\0' == blk.buf[i])                  if (0 == start && '\0' == blk.buf[i])
Line 780  mparse_readmem(struct mparse *curp, const void *buf, s
Line 767  mparse_readmem(struct mparse *curp, const void *buf, s
         return(curp->file_status);          return(curp->file_status);
 }  }
   
   /*
    * If a file descriptor is given, use it and assume it points
    * to the named file.  Otherwise, open the named file.
    * Read the whole file into memory and call the parsers.
    * Called recursively when an .so request is encountered.
    */
 enum mandoclevel  enum mandoclevel
 mparse_readfd(struct mparse *curp, int fd, const char *file)  mparse_readfd(struct mparse *curp, int fd, const char *file)
 {  {
         struct buf       blk;          struct buf       blk;
         int              with_mmap;          int              with_mmap;
         int              save_filenc;          int              save_filenc;
           pid_t            save_child;
   
         if (-1 == fd && -1 == (fd = open(file, O_RDONLY, 0))) {          save_child = curp->child;
                 curp->file_status = MANDOCLEVEL_SYSERR;          if (fd != -1)
                 if (curp->mmsg)                  curp->child = 0;
                         (*curp->mmsg)(MANDOCERR_SYSOPEN,          else if (mparse_open(curp, &fd, file) >= MANDOCLEVEL_SYSERR)
                             curp->file_status,                  goto out;
                             file, 0, 0, strerror(errno));  
                 return(curp->file_status);  
         }  
   
         /*  
          * Run for each opened file; may be called more than once for  
          * each full parse sequence if the opened file is nested (i.e.,  
          * from `so').  Simply sucks in the whole file and moves into  
          * the parse phase for the file.  
          */  
   
         if (read_whole_file(curp, file, fd, &blk, &with_mmap)) {          if (read_whole_file(curp, file, fd, &blk, &with_mmap)) {
                 save_filenc = curp->filenc;                  save_filenc = curp->filenc;
                 curp->filenc = curp->options &                  curp->filenc = curp->options &
Line 817  mparse_readfd(struct mparse *curp, int fd, const char 
Line 801  mparse_readfd(struct mparse *curp, int fd, const char 
                         free(blk.buf);                          free(blk.buf);
         }          }
   
         if (STDIN_FILENO != fd && -1 == close(fd))          if (fd != STDIN_FILENO && close(fd) == -1)
                 perror(file);                  perror(file);
   
           mparse_wait(curp);
   out:
           curp->child = save_child;
         return(curp->file_status);          return(curp->file_status);
 }  }
   
Line 827  enum mandoclevel
Line 814  enum mandoclevel
 mparse_open(struct mparse *curp, int *fd, const char *file)  mparse_open(struct mparse *curp, int *fd, const char *file)
 {  {
         int               pfd[2];          int               pfd[2];
           int               save_errno;
         char             *cp;          char             *cp;
         enum mandocerr    err;          enum mandocerr    err;
   
         pfd[1] = -1;          pfd[1] = -1;
         curp->file = file;          curp->file = file;
   
           /* Unless zipped, try to just open the file. */
   
         if ((cp = strrchr(file, '.')) == NULL ||          if ((cp = strrchr(file, '.')) == NULL ||
             strcmp(cp + 1, "gz")) {              strcmp(cp + 1, "gz")) {
                 curp->child = 0;                  curp->child = 0;
                 if ((*fd = open(file, O_RDONLY)) == -1) {                  if ((*fd = open(file, O_RDONLY)) != -1)
                         err = MANDOCERR_SYSOPEN;                          return(MANDOCLEVEL_OK);
                         goto out;  
                 }                  /* Open failed; try to append ".gz". */
                 return(MANDOCLEVEL_OK);  
                   mandoc_asprintf(&cp, "%s.gz", file);
                   file = cp;
           } else
                   cp = NULL;
   
           /* Before forking, make sure the file can be read. */
   
           save_errno = errno;
           if (access(file, R_OK) == -1) {
                   if (cp != NULL)
                           errno = save_errno;
                   err = MANDOCERR_SYSOPEN;
                   goto out;
         }          }
   
           /* Run gunzip(1). */
   
         if (pipe(pfd) == -1) {          if (pipe(pfd) == -1) {
                 err = MANDOCERR_SYSPIPE;                  err = MANDOCERR_SYSPIPE;
                 goto out;                  goto out;
Line 870  mparse_open(struct mparse *curp, int *fd, const char *
Line 876  mparse_open(struct mparse *curp, int *fd, const char *
         }          }
   
 out:  out:
           free(cp);
         *fd = -1;          *fd = -1;
         curp->child = 0;          curp->child = 0;
         curp->file_status = MANDOCLEVEL_SYSERR;          curp->file_status = MANDOCLEVEL_SYSERR;
         if (curp->mmsg)          if (curp->mmsg)
                 (*curp->mmsg)(err, curp->file_status, file,                  (*curp->mmsg)(err, curp->file_status, curp->file,
                     0, 0, strerror(errno));                      0, 0, strerror(errno));
         if (pfd[1] != -1)          if (pfd[1] != -1)
                 exit(1);                  exit(1);

Legend:
Removed from v.1.97  
changed lines
  Added in v.1.100

CVSweb