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

Diff for /mandoc/read.c between version 1.107 and 1.116

version 1.107, 2015/01/14 17:49:15 version 1.116, 2015/01/26 00:57:22
Line 80  static const enum mandocerr mandoclimits[MANDOCLEVEL_M
Line 80  static const enum mandocerr mandoclimits[MANDOCLEVEL_M
         MANDOCERR_WARNING,          MANDOCERR_WARNING,
         MANDOCERR_WARNING,          MANDOCERR_WARNING,
         MANDOCERR_ERROR,          MANDOCERR_ERROR,
         MANDOCERR_FATAL,          MANDOCERR_UNSUPP,
         MANDOCERR_MAX,          MANDOCERR_MAX,
         MANDOCERR_MAX          MANDOCERR_MAX
 };  };
Line 180  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 180  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "unexpected end of equation",          "unexpected end of equation",
   
         /* related to tables */          /* related to tables */
         "bad table syntax",          "non-alphabetic character in tbl options",
         "bad table option",          "skipping unknown tbl option",
         "bad table layout",          "missing tbl option argument",
           "wrong tbl option argument size",
         "no table layout cells specified",          "no table layout cells specified",
         "no table data cells specified",          "no table data cells specified",
         "ignore data in cell",          "ignore data in cell",
         "data block still open",          "data block still open",
         "ignoring extra data cells",          "ignoring extra data cells",
         "ignoring macro in table",  
   
         /* related to document structure and macros */          /* related to document structure and macros */
           NULL,
         "input stack limit exceeded, infinite loop?",          "input stack limit exceeded, infinite loop?",
         "skipping bad character",          "skipping bad character",
         "skipping unknown macro",          "skipping unknown macro",
           "skipping insecure request",
         "skipping item outside list",          "skipping item outside list",
         "skipping column outside column list",          "skipping column outside column list",
         "skipping end of block that is not open",          "skipping end of block that is not open",
           "fewer RS blocks open, skipping",
         "inserting missing end of block",          "inserting missing end of block",
         "appending missing end of block",          "appending missing end of block",
   
Line 209  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 212  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "uname(3) system call failed, using UNKNOWN",          "uname(3) system call failed, using UNKNOWN",
         "unknown standard specifier",          "unknown standard specifier",
         "skipping request without numeric argument",          "skipping request without numeric argument",
           "NOT IMPLEMENTED: .so with absolute path or \"..\"",
           ".so request failed",
         "skipping all arguments",          "skipping all arguments",
         "skipping excess arguments",          "skipping excess arguments",
         "divide by zero",          "divide by zero",
   
         "generic fatal error",          "unsupported feature",
   
         "input too large",          "input too large",
         "NOT IMPLEMENTED: .so with absolute path or \"..\"",          "unsupported control character",
         ".so request failed",          "unsupported roff request",
           "unsupported table layout",
         /* system errors */          "ignoring macro in table",
         "gunzip failed with code",  
         NULL,  
         "gunzip died from signal",  
 };  };
   
 static  const char * const      mandoclevels[MANDOCLEVEL_MAX] = {  static  const char * const      mandoclevels[MANDOCLEVEL_MAX] = {
Line 230  static const char * const mandoclevels[MANDOCLEVEL_MAX
Line 231  static const char * const mandoclevels[MANDOCLEVEL_MAX
         "RESERVED",          "RESERVED",
         "WARNING",          "WARNING",
         "ERROR",          "ERROR",
         "FATAL",          "UNSUPP",
         "BADARG",          "BADARG",
         "SYSERR"          "SYSERR"
 };  };
Line 310  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 311  mparse_buf_r(struct mparse *curp, struct buf blk, size
 {  {
         const struct tbl_span   *span;          const struct tbl_span   *span;
         struct buf       ln;          struct buf       ln;
           const char      *save_file;
           char            *cp;
         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;          int              of;
         int              lnn; /* line number in the real file */          int              lnn; /* line number in the real file */
           int              fd;
           pid_t            save_child;
         unsigned char    c;          unsigned char    c;
   
         memset(&ln, 0, sizeof(ln));          memset(&ln, 0, sizeof(ln));
Line 368  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 373  mparse_buf_r(struct mparse *curp, struct buf blk, size
                         if (c & 0x80) {                          if (c & 0x80) {
                                 if ( ! (curp->filenc && preconv_encode(                                  if ( ! (curp->filenc && preconv_encode(
                                     &blk, &i, &ln, &pos, &curp->filenc))) {                                      &blk, &i, &ln, &pos, &curp->filenc))) {
                                         mandoc_vmsg(MANDOCERR_BADCHAR,                                          mandoc_vmsg(MANDOCERR_CHAR_BAD, curp,
                                             curp, curp->line, pos,                                              curp->line, pos, "0x%x", c);
                                             "0x%x", c);  
                                         ln.buf[pos++] = '?';                                          ln.buf[pos++] = '?';
                                         i++;                                          i++;
                                 }                                  }
Line 382  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 386  mparse_buf_r(struct mparse *curp, struct buf blk, size
                          */                           */
   
                         if (c == 0x7f || (c < 0x20 && c != 0x09)) {                          if (c == 0x7f || (c < 0x20 && c != 0x09)) {
                                 mandoc_vmsg(MANDOCERR_BADCHAR, curp,                                  mandoc_vmsg(c == 0x00 || c == 0x04 ||
                                     curp->line, pos, "0x%x", c);                                      c > 0x0a ? MANDOCERR_CHAR_BAD :
                                       MANDOCERR_CHAR_UNSUPP,
                                       curp, curp->line, pos, "0x%x", c);
                                 i++;                                  i++;
                                 ln.buf[pos++] = '?';                                  ln.buf[pos++] = '?';
                                 continue;                                  continue;
Line 439  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 445  mparse_buf_r(struct mparse *curp, struct buf blk, size
   
                         if ( ! (isascii(c) &&                          if ( ! (isascii(c) &&
                             (isgraph(c) || isblank(c)))) {                              (isgraph(c) || isblank(c)))) {
                                 mandoc_vmsg(MANDOCERR_BADCHAR, curp,                                  mandoc_vmsg(MANDOCERR_CHAR_BAD, curp,
                                     curp->line, pos, "0x%x", c);                                      curp->line, pos, "0x%x", c);
                                 i += 2;                                  i += 2;
                                 ln.buf[pos++] = '?';                                  ln.buf[pos++] = '?';
Line 508  rerun:
Line 514  rerun:
                 case ROFF_IGN:                  case ROFF_IGN:
                         pos = 0;                          pos = 0;
                         continue;                          continue;
                 case ROFF_ERR:  
                         assert(MANDOCLEVEL_FATAL <= curp->file_status);  
                         break;  
                 case ROFF_SO:                  case ROFF_SO:
                         if ( ! (curp->options & MPARSE_SO) &&                          if ( ! (curp->options & MPARSE_SO) &&
                             (i >= blk.sz || blk.buf[i] == '\0')) {                              (i >= blk.sz || blk.buf[i] == '\0')) {
Line 525  rerun:
Line 528  rerun:
                          */                           */
                         if (curp->secondary)                          if (curp->secondary)
                                 curp->secondary->sz -= pos + 1;                                  curp->secondary->sz -= pos + 1;
                         mparse_readfd(curp, -1, ln.buf + of);                          save_file = curp->file;
                         if (MANDOCLEVEL_FATAL <= curp->file_status) {                          save_child = curp->child;
                           if (mparse_open(curp, &fd, ln.buf + of) ==
                               MANDOCLEVEL_OK) {
                                   mparse_readfd(curp, fd, ln.buf + of);
                                   curp->file = save_file;
                           } else {
                                   curp->file = save_file;
                                 mandoc_vmsg(MANDOCERR_SO_FAIL,                                  mandoc_vmsg(MANDOCERR_SO_FAIL,
                                     curp, curp->line, pos,                                      curp, curp->line, pos,
                                     ".so %s", ln.buf + of);                                      ".so %s", ln.buf + of);
                                 break;                                  ln.sz = mandoc_asprintf(&cp,
                                       ".sp\nSee the file %s.\n.sp",
                                       ln.buf + of);
                                   free(ln.buf);
                                   ln.buf = cp;
                                   of = 0;
                                   mparse_buf_r(curp, ln, of, 0);
                         }                          }
                           curp->child = save_child;
                         pos = 0;                          pos = 0;
                         continue;                          continue;
                 default:                  default:
Line 539  rerun:
Line 555  rerun:
                 }                  }
   
                 /*                  /*
                  * If we encounter errors in the recursive parse, make  
                  * sure we don't continue parsing.  
                  */  
   
                 if (MANDOCLEVEL_FATAL <= curp->file_status)  
                         break;  
   
                 /*  
                  * If input parsers have not been allocated, do so now.                   * If input parsers have not been allocated, do so now.
                  * We keep these instanced between parsers, but set them                   * We keep these instanced between parsers, but set them
                  * locally per parse routine since we can use different                   * locally per parse routine since we can use different
Line 617  read_whole_file(struct mparse *curp, const char *file,
Line 625  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 >= (1U << 31)) {
                         curp->file_status = MANDOCLEVEL_FATAL;                          mandoc_msg(MANDOCERR_TOOLARGE, curp, 0, 0, NULL);
                         if (curp->mmsg)  
                                 (*curp->mmsg)(MANDOCERR_TOOLARGE,  
                                     curp->file_status, file, 0, 0, NULL);  
                         return(0);                          return(0);
                 }                  }
                 *with_mmap = 1;                  *with_mmap = 1;
Line 643  read_whole_file(struct mparse *curp, const char *file,
Line 648  read_whole_file(struct mparse *curp, const char *file,
         for (;;) {          for (;;) {
                 if (off == fb->sz) {                  if (off == fb->sz) {
                         if (fb->sz == (1U << 31)) {                          if (fb->sz == (1U << 31)) {
                                 curp->file_status = MANDOCLEVEL_FATAL;                                  mandoc_msg(MANDOCERR_TOOLARGE, curp,
                                 if (curp->mmsg)                                      0, 0, NULL);
                                         (*curp->mmsg)(MANDOCERR_TOOLARGE,  
                                             curp->file_status,  
                                             file, 0, 0, NULL);  
                                 break;                                  break;
                         }                          }
                         resize_buf(fb, 65536);                          resize_buf(fb, 65536);
Line 673  static void
Line 675  static void
 mparse_end(struct mparse *curp)  mparse_end(struct mparse *curp)
 {  {
   
         if (MANDOCLEVEL_FATAL <= curp->file_status)  
                 return;  
   
         if (curp->mdoc == NULL &&          if (curp->mdoc == NULL &&
             curp->man == NULL &&              curp->man == NULL &&
             curp->sodest == NULL) {              curp->sodest == NULL) {
Line 689  mparse_end(struct mparse *curp)
Line 688  mparse_end(struct mparse *curp)
                         curp->man = curp->pman;                          curp->man = curp->pman;
                 }                  }
         }          }
           if (curp->mdoc)
         if (curp->mdoc && ! mdoc_endparse(curp->mdoc)) {                  mdoc_endparse(curp->mdoc);
                 assert(MANDOCLEVEL_FATAL <= curp->file_status);          if (curp->man)
                 return;                  man_endparse(curp->man);
         }  
   
         if (curp->man && ! man_endparse(curp->man)) {  
                 assert(MANDOCLEVEL_FATAL <= curp->file_status);  
                 return;  
         }  
   
         roff_endparse(curp->roff);          roff_endparse(curp->roff);
 }  }
   
Line 736  mparse_parse_buffer(struct mparse *curp, struct buf bl
Line 728  mparse_parse_buffer(struct mparse *curp, struct buf bl
   
         mparse_buf_r(curp, blk, offset, 1);          mparse_buf_r(curp, blk, offset, 1);
   
         if (0 == --recursion_depth && MANDOCLEVEL_FATAL > curp->file_status)          if (--recursion_depth == 0)
                 mparse_end(curp);                  mparse_end(curp);
   
         curp->primary = svprimary;          curp->primary = svprimary;
Line 757  mparse_readmem(struct mparse *curp, void *buf, size_t 
Line 749  mparse_readmem(struct mparse *curp, void *buf, size_t 
 }  }
   
 /*  /*
  * 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.   * Read the whole file into memory and call the parsers.
  * Called recursively when an .so request is encountered.   * Called recursively when an .so request is encountered.
  */   */
Line 768  mparse_readfd(struct mparse *curp, int fd, const char 
Line 758  mparse_readfd(struct mparse *curp, int fd, const char 
         struct buf       blk;          struct buf       blk;
         int              with_mmap;          int              with_mmap;
         int              save_filenc;          int              save_filenc;
         pid_t            save_child;  
   
         save_child = curp->child;  
         if (fd != -1)  
                 curp->child = 0;  
         else if (mparse_open(curp, &fd, file) >= MANDOCLEVEL_SYSERR)  
                 goto out;  
   
         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 794  mparse_readfd(struct mparse *curp, int fd, const char 
Line 777  mparse_readfd(struct mparse *curp, int fd, const char 
                 perror(file);                  perror(file);
   
         mparse_wait(curp);          mparse_wait(curp);
 out:  
         curp->child = save_child;  
         return(curp->file_status);          return(curp->file_status);
 }  }
   
Line 805  mparse_open(struct mparse *curp, int *fd, const char *
Line 786  mparse_open(struct mparse *curp, int *fd, const char *
         int               pfd[2];          int               pfd[2];
         int               save_errno;          int               save_errno;
         char             *cp;          char             *cp;
         enum mandocerr    err;  
   
         pfd[1] = -1;  
         curp->file = file;          curp->file = file;
   
         /* Unless zipped, try to just open the file. */          /* Unless zipped, try to just open the file. */
Line 831  mparse_open(struct mparse *curp, int *fd, const char *
Line 810  mparse_open(struct mparse *curp, int *fd, const char *
         if (access(file, R_OK) == -1) {          if (access(file, R_OK) == -1) {
                 if (cp != NULL)                  if (cp != NULL)
                         errno = save_errno;                          errno = save_errno;
                 err = MANDOCERR_SYSOPEN;                  free(cp);
                 goto out;                  *fd = -1;
                   curp->child = 0;
                   mandoc_msg(MANDOCERR_FILE, curp, 0, 0, strerror(errno));
                   return(MANDOCLEVEL_ERROR);
         }          }
   
         /* Run gunzip(1). */          /* Run gunzip(1). */
Line 860  mparse_open(struct mparse *curp, int *fd, const char *
Line 842  mparse_open(struct mparse *curp, int *fd, const char *
                 *fd = pfd[0];                  *fd = pfd[0];
                 return(MANDOCLEVEL_OK);                  return(MANDOCLEVEL_OK);
         }          }
   
 out:  
         free(cp);  
         *fd = -1;  
         curp->child = 0;  
         curp->file_status = MANDOCLEVEL_SYSERR;  
         if (curp->mmsg)  
                 (*curp->mmsg)(err, curp->file_status, curp->file,  
                     0, 0, strerror(errno));  
         if (pfd[1] != -1)  
                 exit(1);  
         return(curp->file_status);  
 }  }
   
 enum mandoclevel  enum mandoclevel
Line 887  mparse_wait(struct mparse *curp)
Line 857  mparse_wait(struct mparse *curp)
                 exit((int)MANDOCLEVEL_SYSERR);                  exit((int)MANDOCLEVEL_SYSERR);
         }          }
         if (WIFSIGNALED(status)) {          if (WIFSIGNALED(status)) {
                 mandoc_vmsg(MANDOCERR_SYSSIG, curp, 0, 0,                  mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0,
                     "%d", WTERMSIG(status));                      "gunzip died from signal %d", WTERMSIG(status));
                 curp->file_status = MANDOCLEVEL_SYSERR;                  return(MANDOCLEVEL_ERROR);
                 return(curp->file_status);  
         }          }
         if (WEXITSTATUS(status)) {          if (WEXITSTATUS(status)) {
                 mandoc_vmsg(MANDOCERR_SYSEXIT, curp, 0, 0,                  mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0,
                     "%d", WEXITSTATUS(status));                      "gunzip failed with code %d", WEXITSTATUS(status));
                 curp->file_status = MANDOCLEVEL_SYSERR;                  return(MANDOCLEVEL_ERROR);
                 return(curp->file_status);  
         }          }
         return(MANDOCLEVEL_OK);          return(MANDOCLEVEL_OK);
 }  }
Line 907  mparse_alloc(int options, enum mandoclevel wlevel, man
Line 875  mparse_alloc(int options, enum mandoclevel wlevel, man
 {  {
         struct mparse   *curp;          struct mparse   *curp;
   
         assert(wlevel <= MANDOCLEVEL_FATAL);  
   
         curp = mandoc_calloc(1, sizeof(struct mparse));          curp = mandoc_calloc(1, sizeof(struct mparse));
   
         curp->options = options;          curp->options = options;
Line 1005  mandoc_msg(enum mandocerr er, struct mparse *m,
Line 971  mandoc_msg(enum mandocerr er, struct mparse *m,
 {  {
         enum mandoclevel level;          enum mandoclevel level;
   
         level = MANDOCLEVEL_FATAL;          level = MANDOCLEVEL_UNSUPP;
         while (er < mandoclimits[level])          while (er < mandoclimits[level])
                 level--;                  level--;
   
         if (level < m->wlevel)          if (level < m->wlevel && er != MANDOCERR_FILE)
                 return;                  return;
   
         if (m->mmsg)          if (m->mmsg)

Legend:
Removed from v.1.107  
changed lines
  Added in v.1.116

CVSweb