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

Diff for /mandoc/read.c between version 1.3 and 1.14

version 1.3, 2011/03/20 16:02:05 version 1.14, 2011/04/30 10:18:24
Line 15 
Line 15 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
   #ifdef HAVE_CONFIG_H
   #include "config.h"
   #endif
   
 #include <sys/stat.h>  #include <sys/stat.h>
 #include <sys/mman.h>  #include <sys/mman.h>
   
Line 31 
Line 35 
 #include "libmandoc.h"  #include "libmandoc.h"
 #include "mdoc.h"  #include "mdoc.h"
 #include "man.h"  #include "man.h"
 #include "roff.h"  
   
 #ifndef MAP_FILE  #ifndef MAP_FILE
 #define MAP_FILE        0  #define MAP_FILE        0
Line 58  struct mparse {
Line 61  struct mparse {
         int               reparse_count; /* finite interp. stack */          int               reparse_count; /* finite interp. stack */
         mandocmsg         mmsg; /* warning/error message handler */          mandocmsg         mmsg; /* warning/error message handler */
         void             *arg; /* argument to mmsg */          void             *arg; /* argument to mmsg */
         mevt_open         evt_open; /* file-open event */  
         mevt_close        evt_close; /* file-close event */  
         const char       *file;          const char       *file;
 };  };
   
Line 81  static const enum mandocerr mandoclimits[MANDOCLEVEL_M
Line 82  static const enum mandocerr mandoclimits[MANDOCLEVEL_M
         MANDOCERR_MAX          MANDOCERR_MAX
 };  };
   
   static  const char * const      mandocerrs[MANDOCERR_MAX] = {
           "ok",
   
           "generic warning",
   
           /* related to the prologue */
           "no title in document",
           "document title should be all caps",
           "unknown manual section",
           "date missing, using today's date",
           "cannot parse date, using it verbatim",
           "prologue macros out of order",
           "duplicate prologue macro",
           "macro not allowed in prologue",
           "macro not allowed in body",
   
           /* related to document structure */
           ".so is fragile, better use ln(1)",
           "NAME section must come first",
           "bad NAME section contents",
           "manual name not yet set",
           "sections out of conventional order",
           "duplicate section name",
           "section not in conventional manual section",
   
           /* related to macros and nesting */
           "skipping obsolete macro",
           "skipping paragraph macro",
           "skipping no-space macro",
           "blocks badly nested",
           "child violates parent syntax",
           "nested displays are not portable",
           "already in literal mode",
           "line scope broken",
   
           /* related to missing macro arguments */
           "skipping empty macro",
           "argument count wrong",
           "missing display type",
           "list type must come first",
           "tag lists require a width argument",
           "missing font type",
           "skipping end of block that is not open",
   
           /* related to bad macro arguments */
           "skipping argument",
           "duplicate argument",
           "duplicate display type",
           "duplicate list type",
           "unknown AT&T UNIX version",
           "bad Boolean value",
           "unknown font",
           "unknown standard specifier",
           "bad width argument",
   
           /* related to plain text */
           "blank line in non-literal context",
           "tab in non-literal context",
           "end of line whitespace",
           "bad comment style",
           "bad escape sequence",
           "unterminated quoted string",
   
           "generic error",
   
           /* related to tables */
           "bad table syntax",
           "bad table option",
           "bad table layout",
           "no table layout cells specified",
           "no table data cells specified",
           "ignore data in cell",
           "data block still open",
           "ignoring extra data cells",
   
           "input stack limit exceeded, infinite loop?",
           "skipping bad character",
           "escaped character not allowed in a name",
           "skipping text before the first section header",
           "skipping unknown macro",
           "NOT IMPLEMENTED, please use groff: skipping request",
           "argument count wrong",
           "skipping end of block that is not open",
           "missing end of block",
           "scope open on exit",
           "uname(3) system call failed",
           "macro requires line argument(s)",
           "macro requires body argument(s)",
           "macro requires argument(s)",
           "missing list type",
           "line argument(s) will be lost",
           "body argument(s) will be lost",
   
           "generic fatal error",
   
           "not a manual",
           "column syntax is inconsistent",
           "NOT IMPLEMENTED: .Bd -file",
           "line scope broken, syntax violated",
           "argument count wrong, violates syntax",
           "child violates parent syntax",
           "argument count wrong, violates syntax",
           "NOT IMPLEMENTED: .so with absolute path or \"..\"",
           "no document body",
           "no document prologue",
           "static buffer exhausted",
   };
   
   static  const char * const      mandoclevels[MANDOCLEVEL_MAX] = {
           "SUCCESS",
           "RESERVED",
           "WARNING",
           "ERROR",
           "FATAL",
           "BADARG",
           "SYSERR"
   };
   
 static void  static void
 resize_buf(struct buf *buf, size_t initial)  resize_buf(struct buf *buf, size_t initial)
 {  {
Line 235  mparse_buf_r(struct mparse *curp, struct buf blk, int 
Line 354  mparse_buf_r(struct mparse *curp, struct buf blk, int 
                                 continue;                                  continue;
                         }                          }
   
                         if ('"' == blk.buf[i + 1]) {                          if ('"' == blk.buf[i + 1] || '#' == blk.buf[i + 1]) {
                                 i += 2;                                  i += 2;
                                 /* Comment, skip to end of line */                                  /* Comment, skip to end of line */
                                 for (; i < (int)blk.sz; ++i) {                                  for (; i < (int)blk.sz; ++i) {
Line 326  rerun:
Line 445  rerun:
   
                 /*                  /*
                  * If input parsers have not been allocated, do so now.                   * If input parsers have not been allocated, do so now.
                  * We keep these instanced betwen 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
                  * parsers with each one.                   * parsers with each one.
                  */                   */
Line 499  mparse_end(struct mparse *curp)
Line 618  mparse_end(struct mparse *curp)
                 return;                  return;
         }          }
   
 #if 0  
         /* FIXME: NOTE a parser may not have been assigned, yet. */  
   
         if ( ! (curp->man || curp->mdoc)) {          if ( ! (curp->man || curp->mdoc)) {
                 /* FIXME: make into an mandoc.h error. */                  mandoc_msg(MANDOCERR_NOTMANUAL, curp, 1, 0, NULL);
                 fprintf(stderr, "%s: Not a manual\n", curp->file);  
                 curp->file_status = MANDOCLEVEL_FATAL;                  curp->file_status = MANDOCLEVEL_FATAL;
                 goto cleanup;                  return;
         }          }
 #endif  
   
         roff_endparse(curp->roff);          roff_endparse(curp->roff);
 }  }
Line 518  mparse_readfd_r(struct mparse *curp, int fd, const cha
Line 632  mparse_readfd_r(struct mparse *curp, int fd, const cha
 {  {
         const char      *svfile;          const char      *svfile;
   
         if ( ! (*curp->evt_open)(curp->arg, file)) {  
                 curp->file_status = MANDOCLEVEL_SYSERR;  
                 return;  
         }  
   
         if (-1 == fd)          if (-1 == fd)
                 if (-1 == (fd = open(file, O_RDONLY, 0))) {                  if (-1 == (fd = open(file, O_RDONLY, 0))) {
                         perror(file);                          perror(file);
Line 541  mparse_readfd_r(struct mparse *curp, int fd, const cha
Line 650  mparse_readfd_r(struct mparse *curp, int fd, const cha
         if (STDIN_FILENO != fd && -1 == close(fd))          if (STDIN_FILENO != fd && -1 == close(fd))
                 perror(file);                  perror(file);
   
         (*curp->evt_close)(curp->arg, file);  
         curp->file = svfile;          curp->file = svfile;
 }  }
   
Line 554  mparse_readfd(struct mparse *curp, int fd, const char 
Line 662  mparse_readfd(struct mparse *curp, int fd, const char 
 }  }
   
 struct mparse *  struct mparse *
 mparse_alloc(enum mparset inttype, mevt_open eopen,  mparse_alloc(enum mparset inttype, enum mandoclevel wlevel, mandocmsg mmsg, void *arg)
                 mevt_close eclose, enum mandoclevel wlevel, mandocmsg mmsg, void *arg)  
 {  {
         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->wlevel = wlevel;          curp->wlevel = wlevel;
         curp->mmsg = mmsg;          curp->mmsg = mmsg;
         curp->arg = arg;          curp->arg = arg;
         curp->inttype = inttype;          curp->inttype = inttype;
         curp->evt_open = eopen;  
         curp->evt_close = eclose;  
   
         curp->roff = roff_alloc(&curp->regs, curp);          curp->roff = roff_alloc(&curp->regs, curp);
         return(curp);          return(curp);
Line 608  void
Line 715  void
 mparse_result(struct mparse *curp, struct mdoc **mdoc, struct man **man)  mparse_result(struct mparse *curp, struct mdoc **mdoc, struct man **man)
 {  {
   
         *mdoc = curp->mdoc;          if (mdoc)
         *man = curp->man;                  *mdoc = curp->mdoc;
           if (man)
                   *man = curp->man;
 }  }
   
 void  void
Line 639  mandoc_msg(enum mandocerr er, struct mparse *m, 
Line 748  mandoc_msg(enum mandocerr er, struct mparse *m, 
         if (level < m->wlevel)          if (level < m->wlevel)
                 return;                  return;
   
         (*m->mmsg)(er, level, m->file, ln, col, msg);          if (m->mmsg)
                   (*m->mmsg)(er, level, m->file, ln, col, msg);
   
         if (m->file_status < level)          if (m->file_status < level)
                 m->file_status = level;                  m->file_status = level;
   }
   
   const char *
   mparse_strerror(enum mandocerr er)
   {
   
           return(mandocerrs[er]);
   }
   
   const char *
   mparse_strlevel(enum mandoclevel lvl)
   {
           return(mandoclevels[lvl]);
 }  }

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.14

CVSweb