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

Diff for /mandoc/read.c between version 1.168 and 1.180

version 1.168, 2017/06/01 15:25:39 version 1.180, 2017/06/24 15:59:50
Line 53  struct mparse {
Line 53  struct mparse {
         const char       *file; /* filename of current input file */          const char       *file; /* filename of current input file */
         struct buf       *primary; /* buffer currently being parsed */          struct buf       *primary; /* buffer currently being parsed */
         struct buf       *secondary; /* preprocessed copy of input */          struct buf       *secondary; /* preprocessed copy of input */
         const char       *defos; /* default operating system */          const char       *os_s; /* default operating system */
         mandocmsg         mmsg; /* warning/error message handler */          mandocmsg         mmsg; /* warning/error message handler */
         enum mandoclevel  file_status; /* status of current parse */          enum mandoclevel  file_status; /* status of current parse */
         enum mandoclevel  wlevel; /* ignore messages below this */          enum mandocerr    mmin; /* ignore messages below this */
         int               options; /* parser options */          int               options; /* parser options */
         int               gzip; /* current input file is gzipped */          int               gzip; /* current input file is gzipped */
         int               filenc; /* encoding of the current file */          int               filenc; /* encoding of the current file */
Line 86  static const enum mandocerr mandoclimits[MANDOCLEVEL_M
Line 86  static const enum mandocerr mandoclimits[MANDOCLEVEL_M
 static  const char * const      mandocerrs[MANDOCERR_MAX] = {  static  const char * const      mandocerrs[MANDOCERR_MAX] = {
         "ok",          "ok",
   
           "base system convention",
   
           "Mdocdate found",
           "Mdocdate missing",
           "operating system explicitly specified",
           "RCS id missing",
   
         "generic style suggestion",          "generic style suggestion",
   
           "legacy man(7) date format",
           "duplicate RCS id",
         "useless macro",          "useless macro",
         "consider using OS macro",          "consider using OS macro",
           "errnos out of order",
           "duplicate errno",
         "description line ends with a full stop",          "description line ends with a full stop",
           "no blank before trailing delimiter",
           "function name without markup",
   
         "generic warning",          "generic warning",
   
Line 139  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 152  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "fill mode already enabled, skipping",          "fill mode already enabled, skipping",
         "fill mode already disabled, skipping",          "fill mode already disabled, skipping",
         "line scope broken",          "line scope broken",
           "skipping blank line in line scope",
   
         /* related to missing macro arguments */          /* related to missing macro arguments */
         "skipping empty request",          "skipping empty request",
Line 174  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 188  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "unknown AT&T UNIX version",          "unknown AT&T UNIX version",
         "comma in function argument",          "comma in function argument",
         "parenthesis in function name",          "parenthesis in function name",
           "unknown library name",
         "invalid content in Rs block",          "invalid content in Rs block",
         "invalid Boolean argument",          "invalid Boolean argument",
         "unknown font, skipping request",          "unknown font, skipping request",
Line 226  static const char * const mandocerrs[MANDOCERR_MAX] = 
Line 241  static const char * const mandocerrs[MANDOCERR_MAX] = 
         "NOT IMPLEMENTED: Bd -file",          "NOT IMPLEMENTED: Bd -file",
         "skipping display without arguments",          "skipping display without arguments",
         "missing list type, using -item",          "missing list type, using -item",
           "argument is not numeric, using 1",
         "missing manual name, using \"\"",          "missing manual name, using \"\"",
         "uname(3) system call failed, using UNKNOWN",          "uname(3) system call failed, using UNKNOWN",
         "unknown standard specifier",          "unknown standard specifier",
Line 325  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 341  mparse_buf_r(struct mparse *curp, struct buf blk, size
         const char      *save_file;          const char      *save_file;
         char            *cp;          char            *cp;
         size_t           pos; /* byte number in the ln buffer */          size_t           pos; /* byte number in the ln buffer */
         size_t           j;  /* auxiliary byte number in the blk 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 */
Line 407  mparse_buf_r(struct mparse *curp, struct buf blk, size
Line 422  mparse_buf_r(struct mparse *curp, struct buf blk, size
                                 continue;                                  continue;
                         }                          }
   
                         /* Trailing backslash = a plain char. */  
   
                         if (blk.buf[i] != '\\' || i + 1 == blk.sz) {  
                                 ln.buf[pos++] = blk.buf[i++];  
                                 continue;  
                         }  
   
                         /*  
                          * Found escape and at least one other character.  
                          * When it's a newline character, skip it.  
                          * When there is a carriage return in between,  
                          * skip that one as well.  
                          */  
   
                         if ('\r' == blk.buf[i + 1] && i + 2 < blk.sz &&  
                             '\n' == blk.buf[i + 2])  
                                 ++i;  
                         if ('\n' == blk.buf[i + 1]) {  
                                 i += 2;  
                                 ++lnn;  
                                 continue;  
                         }  
   
                         if ('"' == blk.buf[i + 1] || '#' == blk.buf[i + 1]) {  
                                 j = i;  
                                 i += 2;  
                                 /* Comment, skip to end of line */  
                                 for (; i < blk.sz; ++i) {  
                                         if (blk.buf[i] != '\n')  
                                                 continue;  
                                         if (blk.buf[i - 1] == ' ' ||  
                                             blk.buf[i - 1] == '\t')  
                                                 mandoc_msg(  
                                                     MANDOCERR_SPACE_EOL,  
                                                     curp, curp->line,  
                                                     pos + i-1 - j, NULL);  
                                         ++i;  
                                         ++lnn;  
                                         break;  
                                 }  
   
                                 /* Backout trailing whitespaces */  
                                 for (; pos > 0; --pos) {  
                                         if (ln.buf[pos - 1] != ' ')  
                                                 break;  
                                         if (pos > 2 && ln.buf[pos - 2] == '\\')  
                                                 break;  
                                 }  
                                 break;  
                         }  
   
                         /* Catch escaped bogus characters. */  
   
                         c = (unsigned char) blk.buf[i+1];  
   
                         if ( ! (isascii(c) &&  
                             (isgraph(c) || isblank(c)))) {  
                                 mandoc_vmsg(MANDOCERR_CHAR_BAD, curp,  
                                     curp->line, pos, "0x%x", c);  
                                 i += 2;  
                                 ln.buf[pos++] = '?';  
                                 continue;  
                         }  
   
                         /* Some other escape sequence, copy & cont. */  
   
                         ln.buf[pos++] = blk.buf[i++];                          ln.buf[pos++] = blk.buf[i++];
                         ln.buf[pos++] = blk.buf[i++];  
                 }                  }
   
                 if (pos >= ln.sz)                  if (pos + 1 >= ln.sz)
                         resize_buf(&ln, 256);                          resize_buf(&ln, 256);
   
                   if (i == blk.sz || blk.buf[i] == '\0')
                           ln.buf[pos++] = '\n';
                 ln.buf[pos] = '\0';                  ln.buf[pos] = '\0';
   
                 /*                  /*
Line 809  mparse_open(struct mparse *curp, const char *file)
Line 759  mparse_open(struct mparse *curp, const char *file)
 }  }
   
 struct mparse *  struct mparse *
 mparse_alloc(int options, enum mandoclevel wlevel, mandocmsg mmsg,  mparse_alloc(int options, enum mandocerr mmin, mandocmsg mmsg,
     const char *defos)      enum mandoc_os os_e, const char *os_s)
 {  {
         struct mparse   *curp;          struct mparse   *curp;
   
         curp = mandoc_calloc(1, sizeof(struct mparse));          curp = mandoc_calloc(1, sizeof(struct mparse));
   
         curp->options = options;          curp->options = options;
         curp->wlevel = wlevel;          curp->mmin = mmin;
         curp->mmsg = mmsg;          curp->mmsg = mmsg;
         curp->defos = defos;          curp->os_s = os_s;
   
         curp->roff = roff_alloc(curp, options);          curp->roff = roff_alloc(curp, options);
         curp->man = roff_man_alloc( curp->roff, curp, curp->defos,          curp->man = roff_man_alloc(curp->roff, curp, curp->os_s,
                 curp->options & MPARSE_QUICK ? 1 : 0);                  curp->options & MPARSE_QUICK ? 1 : 0);
         if (curp->options & MPARSE_MDOC) {          if (curp->options & MPARSE_MDOC) {
                 curp->man->macroset = MACROSET_MDOC;                  curp->man->macroset = MACROSET_MDOC;
Line 834  mparse_alloc(int options, enum mandoclevel wlevel, man
Line 784  mparse_alloc(int options, enum mandoclevel wlevel, man
                         curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX);                          curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX);
         }          }
         curp->man->first->tok = TOKEN_NONE;          curp->man->first->tok = TOKEN_NONE;
           curp->man->meta.os_e = os_e;
         return curp;          return curp;
 }  }
   
Line 909  mandoc_msg(enum mandocerr er, struct mparse *m,
Line 860  mandoc_msg(enum mandocerr er, struct mparse *m,
 {  {
         enum mandoclevel level;          enum mandoclevel level;
   
           if (er < m->mmin && er != MANDOCERR_FILE)
                   return;
   
         level = MANDOCLEVEL_UNSUPP;          level = MANDOCLEVEL_UNSUPP;
         while (er < mandoclimits[level])          while (er < mandoclimits[level])
                 level--;                  level--;
   
         if (level < m->wlevel && er != MANDOCERR_FILE)  
                 return;  
   
         if (m->mmsg)          if (m->mmsg)
                 (*m->mmsg)(er, level, m->file, ln, col, msg);                  (*m->mmsg)(er, level, m->file, ln, col, msg);

Legend:
Removed from v.1.168  
changed lines
  Added in v.1.180

CVSweb