version 1.66, 2010/05/15 05:11:50 |
version 1.69, 2010/05/15 16:18:23 |
Line 268 ffile(const char *file, struct curparse *curp) |
|
Line 268 ffile(const char *file, struct curparse *curp) |
|
|
|
|
|
static int |
static int |
|
resize_buf(struct buf *buf, size_t initial) |
|
{ |
|
void *tmp; |
|
size_t sz; |
|
|
|
if (buf->sz == 0) |
|
sz = initial; |
|
else |
|
sz = 2 * buf->sz; |
|
tmp = realloc(buf->buf, sz); |
|
if (NULL == tmp) { |
|
perror(NULL); |
|
return(0); |
|
} |
|
buf->buf = tmp; |
|
buf->sz = sz; |
|
return(1); |
|
} |
|
|
|
|
|
static int |
read_whole_file(struct curparse *curp, struct buf *fb, int *with_mmap) |
read_whole_file(struct curparse *curp, struct buf *fb, int *with_mmap) |
{ |
{ |
struct stat st; |
struct stat st; |
char *buf; |
size_t off; |
size_t sz, off; |
|
ssize_t ssz; |
ssize_t ssz; |
|
|
if (-1 == fstat(curp->fd, &st)) { |
if (-1 == fstat(curp->fd, &st)) { |
Line 319 read_whole_file(struct curparse *curp, struct buf *fb, |
|
Line 339 read_whole_file(struct curparse *curp, struct buf *fb, |
|
curp->file); |
curp->file); |
break; |
break; |
} |
} |
if (fb->sz == 0) |
if (! resize_buf(fb, 65536)) |
sz = 65536; |
|
else |
|
sz = 2 * fb->sz; |
|
buf = realloc(fb->buf, sz); |
|
if (NULL == buf) { |
|
perror(NULL); |
|
break; |
break; |
} |
|
fb->buf = buf; |
|
fb->sz = sz; |
|
} |
} |
ssz = read(curp->fd, fb->buf + off, fb->sz - off); |
ssz = read(curp->fd, fb->buf + off, fb->sz - off); |
if (ssz == 0) { |
if (ssz == 0) { |
Line 353 read_whole_file(struct curparse *curp, struct buf *fb, |
|
Line 364 read_whole_file(struct curparse *curp, struct buf *fb, |
|
static void |
static void |
fdesc(struct curparse *curp) |
fdesc(struct curparse *curp) |
{ |
{ |
size_t sz; |
|
struct buf ln, blk; |
struct buf ln, blk; |
int j, i, pos, lnn, comment, with_mmap; |
int j, i, pos, lnn, comment, with_mmap; |
struct man *man; |
struct man *man; |
struct mdoc *mdoc; |
struct mdoc *mdoc; |
|
|
sz = BUFSIZ; |
|
man = NULL; |
man = NULL; |
mdoc = NULL; |
mdoc = NULL; |
memset(&ln, 0, sizeof(struct buf)); |
memset(&ln, 0, sizeof(struct buf)); |
Line 376 fdesc(struct curparse *curp) |
|
Line 385 fdesc(struct curparse *curp) |
|
/* Fill buf with file blocksize. */ |
/* Fill buf with file blocksize. */ |
|
|
for (i = lnn = pos = comment = 0; i < (int)blk.sz; ++i) { |
for (i = lnn = pos = comment = 0; i < (int)blk.sz; ++i) { |
if (pos >= (int)ln.sz) { |
if (pos >= (int)ln.sz) { |
ln.sz += 256; /* Step-size. */ |
if (! resize_buf(&ln, 256)) |
ln.buf = realloc(ln.buf, ln.sz); |
goto bailout; |
if (NULL == ln.buf) { |
} |
perror(NULL); |
|
goto bailout; |
|
} |
|
} |
|
|
|
if ('\n' != blk.buf[i]) { |
if ('\n' != blk.buf[i]) { |
if (comment) |
if (comment) |
continue; |
continue; |
ln.buf[pos++] = blk.buf[i]; |
ln.buf[pos++] = blk.buf[i]; |
|
|
/* Handle in-line `\"' comments. */ |
/* Handle in-line `\"' comments. */ |
|
|
if (1 == pos || '\"' != ln.buf[pos - 1]) |
if (1 == pos || '\"' != ln.buf[pos - 1]) |
continue; |
continue; |
|
|
for (j = pos - 2; j >= 0; j--) |
for (j = pos - 2; j >= 0; j--) |
if ('\\' != ln.buf[j]) |
if ('\\' != ln.buf[j]) |
break; |
break; |
|
|
if ( ! ((pos - 2 - j) % 2)) |
if ( ! ((pos - 2 - j) % 2)) |
continue; |
|
|
|
comment = 1; |
|
pos -= 2; |
|
for (; pos > 0; --pos) { |
|
if (ln.buf[pos - 1] != ' ') |
|
break; |
|
if (pos > 2 && ln.buf[pos - 2] == '\\') |
|
break; |
|
} |
|
continue; |
continue; |
} |
|
|
|
/* Handle escaped `\\n' newlines. */ |
comment = 1; |
|
pos -= 2; |
|
for (; pos > 0; --pos) { |
|
if (ln.buf[pos - 1] != ' ') |
|
break; |
|
if (pos > 2 && ln.buf[pos - 2] == '\\') |
|
break; |
|
} |
|
continue; |
|
} |
|
|
if (pos > 0 && 0 == comment && |
/* Handle escaped `\\n' newlines. */ |
'\\' == ln.buf[pos - 1]) { |
|
for (j = pos - 1; j >= 0; j--) |
if (pos > 0 && 0 == comment && '\\' == ln.buf[pos - 1]) { |
if ('\\' != ln.buf[j]) |
for (j = pos - 1; j >= 0; j--) |
break; |
if ('\\' != ln.buf[j]) |
if ( ! ((pos - j) % 2)) { |
break; |
pos--; |
if ( ! ((pos - j) % 2)) { |
lnn++; |
pos--; |
continue; |
lnn++; |
} |
continue; |
} |
} |
|
} |
|
|
ln.buf[pos] = 0; |
ln.buf[pos] = 0; |
lnn++; |
lnn++; |
|
|
/* If unset, assign parser in pset(). */ |
/* If unset, assign parser in pset(). */ |
|
|
if ( ! (man || mdoc) && ! pset(ln.buf, |
if ( ! (man || mdoc) && ! pset(ln.buf, pos, curp, &man, &mdoc)) |
pos, curp, &man, &mdoc)) |
goto bailout; |
goto bailout; |
|
|
|
pos = comment = 0; |
pos = comment = 0; |
|
|
/* Pass down into parsers. */ |
/* Pass down into parsers. */ |
|
|
if (man && ! man_parseln(man, lnn, ln.buf)) |
if (man && ! man_parseln(man, lnn, ln.buf)) |
goto bailout; |
goto bailout; |
if (mdoc && ! mdoc_parseln(mdoc, lnn, ln.buf)) |
if (mdoc && ! mdoc_parseln(mdoc, lnn, ln.buf)) |
goto bailout; |
goto bailout; |
} |
} |
|
|
/* NOTE a parser may not have been assigned, yet. */ |
/* NOTE a parser may not have been assigned, yet. */ |
Line 481 fdesc(struct curparse *curp) |
|
Line 484 fdesc(struct curparse *curp) |
|
case (OUTT_LINT): |
case (OUTT_LINT): |
break; |
break; |
default: |
default: |
curp->outdata = ascii_alloc(); |
curp->outdata = ascii_alloc(80); |
curp->outman = terminal_man; |
curp->outman = terminal_man; |
curp->outmdoc = terminal_mdoc; |
curp->outmdoc = terminal_mdoc; |
curp->outfree = terminal_free; |
curp->outfree = terminal_free; |