version 1.69, 2010/05/15 16:18:23 |
version 1.70, 2010/05/15 16:20:12 |
|
|
fdesc(struct curparse *curp) |
fdesc(struct curparse *curp) |
{ |
{ |
struct buf ln, blk; |
struct buf ln, blk; |
int j, i, pos, lnn, comment, with_mmap; |
int i, pos, lnn, lnn_start, with_mmap; |
struct man *man; |
struct man *man; |
struct mdoc *mdoc; |
struct mdoc *mdoc; |
|
|
Line 374 fdesc(struct curparse *curp) |
|
Line 374 fdesc(struct curparse *curp) |
|
memset(&ln, 0, sizeof(struct buf)); |
memset(&ln, 0, sizeof(struct buf)); |
|
|
/* |
/* |
* Two buffers: ln and buf. buf is the input buffer optimised |
* Two buffers: ln and buf. buf is the input file and may be |
* here for each file's block size. ln is a line buffer. Both |
* memory mapped. ln is a line buffer and grows on-demand. |
* growable, hence passed in by ptr-ptr. |
|
*/ |
*/ |
|
|
if (!read_whole_file(curp, &blk, &with_mmap)) |
if (!read_whole_file(curp, &blk, &with_mmap)) |
return; |
return; |
|
|
/* Fill buf with file blocksize. */ |
for (i = 0, lnn = 1; i < (int)blk.sz;) { |
|
pos = 0; |
for (i = lnn = pos = comment = 0; i < (int)blk.sz; ++i) { |
lnn_start = lnn; |
if (pos >= (int)ln.sz) { |
while (i < (int)blk.sz) { |
if (! resize_buf(&ln, 256)) |
if ('\n' == blk.buf[i]) { |
goto bailout; |
++i; |
} |
++lnn; |
|
break; |
if ('\n' != blk.buf[i]) { |
} |
if (comment) |
/* Trailing backslash is like a plain character. */ |
|
if ('\\' != blk.buf[i] || i + 1 == (int)blk.sz) { |
|
if (pos >= (int)ln.sz) |
|
if (! resize_buf(&ln, 256)) |
|
goto bailout; |
|
ln.buf[pos++] = blk.buf[i++]; |
continue; |
continue; |
ln.buf[pos++] = blk.buf[i]; |
|
|
|
/* Handle in-line `\"' comments. */ |
|
|
|
if (1 == pos || '\"' != ln.buf[pos - 1]) |
|
continue; |
|
|
|
for (j = pos - 2; j >= 0; j--) |
|
if ('\\' != ln.buf[j]) |
|
break; |
|
|
|
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; |
/* Found an escape and at least one other character. */ |
} |
if ('\n' == blk.buf[i + 1]) { |
|
/* Escaped newlines are skipped over */ |
/* Handle escaped `\\n' newlines. */ |
i += 2; |
|
++lnn; |
if (pos > 0 && 0 == comment && '\\' == ln.buf[pos - 1]) { |
|
for (j = pos - 1; j >= 0; j--) |
|
if ('\\' != ln.buf[j]) |
|
break; |
|
if ( ! ((pos - j) % 2)) { |
|
pos--; |
|
lnn++; |
|
continue; |
continue; |
} |
} |
|
if ('"' == blk.buf[i + 1]) { |
|
i += 2; |
|
/* Comment, skip to end of line */ |
|
for (; i < (int)blk.sz; ++i) { |
|
if ('\n' == blk.buf[i]) { |
|
++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; |
|
} |
|
/* Some other escape sequence, copy and continue. */ |
|
if (pos + 1 >= (int)ln.sz) |
|
if (! resize_buf(&ln, 256)) |
|
goto bailout; |
|
|
|
ln.buf[pos++] = blk.buf[i++]; |
|
ln.buf[pos++] = blk.buf[i++]; |
} |
} |
|
|
|
if (pos >= (int)ln.sz) |
|
if (! resize_buf(&ln, 256)) |
|
goto bailout; |
ln.buf[pos] = 0; |
ln.buf[pos] = 0; |
lnn++; |
|
|
|
/* If unset, assign parser in pset(). */ |
/* If unset, assign parser in pset(). */ |
|
|
if ( ! (man || mdoc) && ! pset(ln.buf, pos, curp, &man, &mdoc)) |
if ( ! (man || mdoc) && ! pset(ln.buf, pos, curp, &man, &mdoc)) |
goto bailout; |
goto bailout; |
|
|
pos = comment = 0; |
|
|
|
/* Pass down into parsers. */ |
/* Pass down into parsers. */ |
|
|