version 1.158, 2017/01/28 23:30:08 |
version 1.163, 2017/03/07 20:00:08 |
|
|
#include <errno.h> |
#include <errno.h> |
#include <fcntl.h> |
#include <fcntl.h> |
#include <stdarg.h> |
#include <stdarg.h> |
#include <stdint.h> |
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
#define REPARSE_LIMIT 1000 |
#define REPARSE_LIMIT 1000 |
|
|
struct mparse { |
struct mparse { |
struct roff_man *man; /* man parser */ |
|
struct roff *roff; /* roff parser (!NULL) */ |
struct roff *roff; /* roff parser (!NULL) */ |
|
struct roff_man *man; /* man parser */ |
char *sodest; /* filename pointed to by .so */ |
char *sodest; /* filename pointed to by .so */ |
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 */ |
|
|
|
|
static void choose_parser(struct mparse *); |
static void choose_parser(struct mparse *); |
static void resize_buf(struct buf *, size_t); |
static void resize_buf(struct buf *, size_t); |
static void mparse_buf_r(struct mparse *, struct buf, size_t, int); |
static int mparse_buf_r(struct mparse *, struct buf, size_t, int); |
static int read_whole_file(struct mparse *, const char *, int, |
static int read_whole_file(struct mparse *, const char *, int, |
struct buf *, int *); |
struct buf *, int *); |
static void mparse_end(struct mparse *); |
static void mparse_end(struct mparse *); |
Line 114 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
Line 113 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
"bad NAME section content", |
"bad NAME section content", |
"missing comma before name", |
"missing comma before name", |
"missing description line, using \"\"", |
"missing description line, using \"\"", |
|
"description line outside NAME section", |
"sections out of conventional order", |
"sections out of conventional order", |
"duplicate section title", |
"duplicate section title", |
"unexpected section", |
"unexpected section", |
Line 310 choose_parser(struct mparse *curp) |
|
Line 310 choose_parser(struct mparse *curp) |
|
* macros, inline equations, and input line traps) |
* macros, inline equations, and input line traps) |
* and indirectly (for .so file inclusion). |
* and indirectly (for .so file inclusion). |
*/ |
*/ |
static void |
static int |
mparse_buf_r(struct mparse *curp, struct buf blk, size_t i, int start) |
mparse_buf_r(struct mparse *curp, struct buf blk, size_t i, int start) |
{ |
{ |
const struct tbl_span *span; |
const struct tbl_span *span; |
|
|
|
|
switch (rr) { |
switch (rr) { |
case ROFF_REPARSE: |
case ROFF_REPARSE: |
if (REPARSE_LIMIT >= ++curp->reparse_count) |
if (++curp->reparse_count > REPARSE_LIMIT) |
mparse_buf_r(curp, ln, of, 0); |
|
else |
|
mandoc_msg(MANDOCERR_ROFFLOOP, curp, |
mandoc_msg(MANDOCERR_ROFFLOOP, curp, |
curp->line, pos, NULL); |
curp->line, pos, NULL); |
pos = 0; |
else if (mparse_buf_r(curp, ln, of, 0) == 1 || |
continue; |
start == 1) { |
|
pos = 0; |
|
continue; |
|
} |
|
free(ln.buf); |
|
return 0; |
case ROFF_APPEND: |
case ROFF_APPEND: |
pos = strlen(ln.buf); |
pos = strlen(ln.buf); |
continue; |
continue; |
|
|
(i >= blk.sz || blk.buf[i] == '\0')) { |
(i >= blk.sz || blk.buf[i] == '\0')) { |
curp->sodest = mandoc_strdup(ln.buf + of); |
curp->sodest = mandoc_strdup(ln.buf + of); |
free(ln.buf); |
free(ln.buf); |
return; |
return 1; |
} |
} |
/* |
/* |
* We remove `so' clauses from our lookaside |
* We remove `so' clauses from our lookaside |
|
|
} |
} |
|
|
free(ln.buf); |
free(ln.buf); |
|
return 1; |
} |
} |
|
|
static int |
static int |
read_whole_file(struct mparse *curp, const char *file, int fd, |
read_whole_file(struct mparse *curp, const char *file, int fd, |
struct buf *fb, int *with_mmap) |
struct buf *fb, int *with_mmap) |
{ |
{ |
|
struct stat st; |
gzFile gz; |
gzFile gz; |
size_t off; |
size_t off; |
ssize_t ssz; |
ssize_t ssz; |
|
|
struct stat st; |
|
|
|
if (fstat(fd, &st) == -1) |
if (fstat(fd, &st) == -1) |
err((int)MANDOCLEVEL_SYSERR, "%s", file); |
err((int)MANDOCLEVEL_SYSERR, "%s", file); |
|
|
Line 830 mparse_reset(struct mparse *curp) |
|
Line 833 mparse_reset(struct mparse *curp) |
|
{ |
{ |
roff_reset(curp->roff); |
roff_reset(curp->roff); |
roff_man_reset(curp->man); |
roff_man_reset(curp->man); |
|
|
|
free(curp->sodest); |
|
curp->sodest = NULL; |
|
|
if (curp->secondary) |
if (curp->secondary) |
curp->secondary->sz = 0; |
curp->secondary->sz = 0; |
|
|
curp->file_status = MANDOCLEVEL_OK; |
curp->file_status = MANDOCLEVEL_OK; |
|
curp->gzip = 0; |
free(curp->sodest); |
|
curp->sodest = NULL; |
|
} |
} |
|
|
void |
void |
Line 844 mparse_free(struct mparse *curp) |
|
Line 849 mparse_free(struct mparse *curp) |
|
{ |
{ |
|
|
roff_man_free(curp->man); |
roff_man_free(curp->man); |
if (curp->roff) |
roff_free(curp->roff); |
roff_free(curp->roff); |
|
if (curp->secondary) |
if (curp->secondary) |
free(curp->secondary->buf); |
free(curp->secondary->buf); |
|
|