version 1.7, 2009/03/08 18:02:36 |
version 1.8, 2009/03/08 18:50:40 |
|
|
|
|
#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)); |
} |
} |
|
|