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

Diff for /mandoc/read.c between version 1.96 and 1.101

version 1.96, 2014/11/01 06:03:13 version 1.101, 2014/11/28 18:09:01
Line 64  struct mparse {
Line 64  struct mparse {
         int               filenc; /* encoding of the current file */          int               filenc; /* encoding of the current file */
         int               reparse_count; /* finite interp. stack */          int               reparse_count; /* finite interp. stack */
         int               line; /* line number in the file */          int               line; /* line number in the file */
           pid_t             child; /* the gunzip(1) process */
 };  };
   
 static  void      choose_parser(struct mparse *);  static  void      choose_parser(struct mparse *);
Line 96  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 97  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "lower case character in document title",          "lower case character in document title",
         "missing manual section, using \"\"",          "missing manual section, using \"\"",
         "unknown manual section",          "unknown manual section",
         "unknown manual volume or arch",  
         "missing date, using today's date",          "missing date, using today's date",
         "cannot parse date, using it verbatim",          "cannot parse date, using it verbatim",
         "missing Os macro, using \"\"",          "missing Os macro, using \"\"",
Line 201  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 201  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 213  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 214  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 316  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 316  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 569  rerun:
Line 569  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 779  mparse_readmem(struct mparse *curp, const void *buf, s
Line 766  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 816  mparse_readfd(struct mparse *curp, int fd, const char 
Line 800  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);
 }  }
   
 enum mandoclevel  enum mandoclevel
 mparse_open(struct mparse *curp, int *fd, const char *file,  mparse_open(struct mparse *curp, int *fd, const char *file)
         pid_t *child_pid)  
 {  {
         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")) {
                 *child_pid = 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;
         }          }
   
         switch (*child_pid = fork()) {          switch (curp->child = fork()) {
         case -1:          case -1:
                 err = MANDOCERR_SYSFORK;                  err = MANDOCERR_SYSFORK;
                 close(pfd[0]);                  close(pfd[0]);
Line 870  mparse_open(struct mparse *curp, int *fd, const char *
Line 875  mparse_open(struct mparse *curp, int *fd, const char *
         }          }
   
 out:  out:
           free(cp);
         *fd = -1;          *fd = -1;
         *child_pid = 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);
Line 882  out:
Line 888  out:
 }  }
   
 enum mandoclevel  enum mandoclevel
 mparse_wait(struct mparse *curp, pid_t child_pid)  mparse_wait(struct mparse *curp)
 {  {
         int       status;          int       status;
   
         if (waitpid(child_pid, &status, 0) == -1) {          if (curp->child == 0)
                   return(MANDOCLEVEL_OK);
   
           if (waitpid(curp->child, &status, 0) == -1) {
                 mandoc_msg(MANDOCERR_SYSWAIT, curp, 0, 0,                  mandoc_msg(MANDOCERR_SYSWAIT, curp, 0, 0,
                     strerror(errno));                      strerror(errno));
                 curp->file_status = MANDOCLEVEL_SYSERR;                  curp->file_status = MANDOCLEVEL_SYSERR;

Legend:
Removed from v.1.96  
changed lines
  Added in v.1.101

CVSweb