version 1.153, 2016/11/10 12:47:50 |
version 1.162, 2017/03/06 17:26:05 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2010-2016 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2010, 2012 Joerg Sonnenberger <joerg@netbsd.org> |
* Copyright (c) 2010, 2012 Joerg Sonnenberger <joerg@netbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
|
|
#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 */ |
Line 108 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
Line 107 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
"no document body", |
"no document body", |
"content before first section header", |
"content before first section header", |
"first section is not \"NAME\"", |
"first section is not \"NAME\"", |
"NAME section without name", |
"NAME section without Nm before Nd", |
"NAME section without description", |
"NAME section without description", |
"description not at the end of NAME", |
"description not at the end of NAME", |
"bad NAME section content", |
"bad NAME section content", |
|
"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 150 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
Line 151 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
"unknown font type, using \\fR", |
"unknown font type, using \\fR", |
"nothing follows prefix", |
"nothing follows prefix", |
"empty reference block", |
"empty reference block", |
|
"missing section argument", |
"missing -std argument, adding it", |
"missing -std argument, adding it", |
"missing option string, using \"\"", |
"missing option string, using \"\"", |
"missing resource identifier, using \"\"", |
"missing resource identifier, using \"\"", |
Line 175 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
Line 177 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
"blank line in fill mode, using .sp", |
"blank line in fill mode, using .sp", |
"tab in filled text", |
"tab in filled text", |
"whitespace at end of input line", |
"whitespace at end of input line", |
|
"new sentence, new line", |
"bad comment style", |
"bad comment style", |
"invalid escape sequence", |
"invalid escape sequence", |
"undefined string, using \"\"", |
"undefined string, using \"\"", |
Line 315 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
Line 318 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
const char *save_file; |
const char *save_file; |
char *cp; |
char *cp; |
size_t pos; /* byte number in the ln buffer */ |
size_t pos; /* byte number in the ln buffer */ |
|
size_t j; /* auxiliary byte number in the blk buffer */ |
enum rofferr rr; |
enum rofferr rr; |
int of; |
int of; |
int lnn; /* line number in the real file */ |
int lnn; /* line number in the real file */ |
Line 420 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
Line 424 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
} |
} |
|
|
if ('"' == blk.buf[i + 1] || '#' == blk.buf[i + 1]) { |
if ('"' == blk.buf[i + 1] || '#' == blk.buf[i + 1]) { |
|
j = i; |
i += 2; |
i += 2; |
/* Comment, skip to end of line */ |
/* Comment, skip to end of line */ |
for (; i < blk.sz; ++i) { |
for (; i < blk.sz; ++i) { |
Line 430 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
Line 435 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
mandoc_msg( |
mandoc_msg( |
MANDOCERR_SPACE_EOL, |
MANDOCERR_SPACE_EOL, |
curp, curp->line, |
curp, curp->line, |
pos, NULL); |
pos + i-1 - j, NULL); |
++i; |
++i; |
++lnn; |
++lnn; |
break; |
break; |
|
|
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 825 mparse_reset(struct mparse *curp) |
|
Line 829 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 839 mparse_free(struct mparse *curp) |
|
Line 845 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); |
|
|
Line 860 mparse_result(struct mparse *curp, struct roff_man **m |
|
Line 865 mparse_result(struct mparse *curp, struct roff_man **m |
|
} |
} |
if (man) |
if (man) |
*man = curp->man; |
*man = curp->man; |
|
} |
|
|
|
void |
|
mparse_updaterc(struct mparse *curp, enum mandoclevel *rc) |
|
{ |
|
if (curp->file_status > *rc) |
|
*rc = curp->file_status; |
} |
} |
|
|
void |
void |