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

Diff for /mandoc/Attic/mmain.c between version 1.7 and 1.8

version 1.7, 2009/03/08 18:02:36 version 1.8, 2009/03/08 18:50:40
Line 30 
Line 30 
   
 #include "mmain.h"  #include "mmain.h"
   
 #define MD_LINE_SZ      (256)           /* Max input line size. */  #define MD_LINE_SZ      (256)           /* Input line step-size. */
   
 struct  mmain {  struct  mmain {
         int               warn;         /* Warning flags. */          int               warn;         /* Warning flags. */
Line 269  optswarn(struct mmain *p, char *arg)
Line 269  optswarn(struct mmain *p, char *arg)
 static int  static int
 parse(struct mmain *p)  parse(struct mmain *p)
 {  {
         ssize_t          sz, i;          ssize_t          sz;
         size_t           pos;          int              i, pos, len, lnn;
         char             line[MD_LINE_SZ];          char            *line;
         int              lnn;  
   
         /*          for (line = NULL, lnn = 1, len = pos = 0; ; ) {
          * This is a little more complicated than fgets.  TODO: have  
          * some benchmarks that show it's faster (note that I want to  
          * check many, many manuals simultaneously, so speed is  
          * important).  Fill a buffer (sized to the block size) with a  
          * single read, then parse \n-terminated lines into a line  
          * buffer, which is passed to the parser.  Hard-code the line  
          * buffer to a particular size -- a reasonable assumption.  
          */  
   
         for (lnn = 1, pos = 0; ; ) {  
                 if (-1 == (sz = read(p->fdin, p->buf, p->bufsz))) {                  if (-1 == (sz = read(p->fdin, p->buf, p->bufsz))) {
                         warn("%s", p->in);                          warn("%s", p->in);
                         return(0);                          return(0);
                 } else if (0 == sz)                  } else if (0 == sz)
                         break;                          break;
   
                 for (i = 0; i < sz; i++) {                  for (i = 0; i < (int)sz; i++) {
                           if (pos >= len) {
                                   len += MD_LINE_SZ;
                                   line = realloc(line, len);
                                   if (NULL == line)
                                           err(1, "realloc");
                           }
   
                         if ('\n' != p->buf[i]) {                          if ('\n' != p->buf[i]) {
                                 if (pos < sizeof(line)) {                                  line[pos++] = p->buf[i];
                                         line[(int)pos++] = p->buf[(int)i];                                  continue;
                                         continue;  
                                 }  
                                 warnx("%s: line %d too long", p->in, lnn);  
                                 return(0);  
                         }                          }
   
                         line[(int)pos] = 0;                          line[pos] = 0;
                         if ( ! mdoc_parseln(p->mdoc, lnn, line))                          if ( ! mdoc_parseln(p->mdoc, lnn, line))
                                 return(0);                                  return(0);
   
Line 310  parse(struct mmain *p)
Line 302  parse(struct mmain *p)
                 }                  }
         }          }
   
           if (line)
                   free(line);
         return(mdoc_endparse(p->mdoc));          return(mdoc_endparse(p->mdoc));
 }  }
   

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.8

CVSweb