version 1.284, 2015/04/02 21:36:50 |
version 1.286, 2015/04/18 16:06:41 |
|
|
|
|
/* FIXME: .Bl -diag can't have non-text children in HEAD. */ |
/* FIXME: .Bl -diag can't have non-text children in HEAD. */ |
|
|
#define PRE_ARGS struct mdoc *mdoc, struct mdoc_node *n |
#define PRE_ARGS struct roff_man *mdoc, struct roff_node *n |
#define POST_ARGS struct mdoc *mdoc |
#define POST_ARGS struct roff_man *mdoc |
|
|
enum check_ineq { |
enum check_ineq { |
CHECK_LT, |
CHECK_LT, |
|
|
v_post post; |
v_post post; |
}; |
}; |
|
|
static void check_text(struct mdoc *, int, int, char *); |
static void check_text(struct roff_man *, int, int, char *); |
static void check_argv(struct mdoc *, |
static void check_argv(struct roff_man *, |
struct mdoc_node *, struct mdoc_argv *); |
struct roff_node *, struct mdoc_argv *); |
static void check_args(struct mdoc *, struct mdoc_node *); |
static void check_args(struct roff_man *, struct roff_node *); |
static int child_an(const struct mdoc_node *); |
static int child_an(const struct roff_node *); |
static enum mdoc_sec a2sec(const char *); |
static enum roff_sec a2sec(const char *); |
static size_t macro2len(enum mdoct); |
static size_t macro2len(int); |
static void rewrite_macro2len(char **); |
static void rewrite_macro2len(char **); |
|
|
static void post_an(POST_ARGS); |
static void post_an(POST_ARGS); |
Line 248 static const struct valids mdoc_valids[MDOC_MAX] = { |
|
Line 248 static const struct valids mdoc_valids[MDOC_MAX] = { |
|
|
|
#define RSORD_MAX 14 /* Number of `Rs' blocks. */ |
#define RSORD_MAX 14 /* Number of `Rs' blocks. */ |
|
|
static const enum mdoct rsord[RSORD_MAX] = { |
static const int rsord[RSORD_MAX] = { |
MDOC__A, |
MDOC__A, |
MDOC__T, |
MDOC__T, |
MDOC__B, |
MDOC__B, |
Line 293 static const char * const secnames[SEC__MAX] = { |
|
Line 293 static const char * const secnames[SEC__MAX] = { |
|
|
|
|
|
void |
void |
mdoc_valid_pre(struct mdoc *mdoc, struct mdoc_node *n) |
mdoc_valid_pre(struct roff_man *mdoc, struct roff_node *n) |
{ |
{ |
v_pre p; |
v_pre p; |
|
|
Line 319 mdoc_valid_pre(struct mdoc *mdoc, struct mdoc_node *n) |
|
Line 319 mdoc_valid_pre(struct mdoc *mdoc, struct mdoc_node *n) |
|
} |
} |
|
|
void |
void |
mdoc_valid_post(struct mdoc *mdoc) |
mdoc_valid_post(struct roff_man *mdoc) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
v_post p; |
v_post p; |
|
|
n = mdoc->last; |
n = mdoc->last; |
Line 362 mdoc_valid_post(struct mdoc *mdoc) |
|
Line 362 mdoc_valid_post(struct mdoc *mdoc) |
|
} |
} |
|
|
static void |
static void |
check_args(struct mdoc *mdoc, struct mdoc_node *n) |
check_args(struct roff_man *mdoc, struct roff_node *n) |
{ |
{ |
int i; |
int i; |
|
|
Line 375 check_args(struct mdoc *mdoc, struct mdoc_node *n) |
|
Line 375 check_args(struct mdoc *mdoc, struct mdoc_node *n) |
|
} |
} |
|
|
static void |
static void |
check_argv(struct mdoc *mdoc, struct mdoc_node *n, struct mdoc_argv *v) |
check_argv(struct roff_man *mdoc, struct roff_node *n, struct mdoc_argv *v) |
{ |
{ |
int i; |
int i; |
|
|
Line 384 check_argv(struct mdoc *mdoc, struct mdoc_node *n, str |
|
Line 384 check_argv(struct mdoc *mdoc, struct mdoc_node *n, str |
|
} |
} |
|
|
static void |
static void |
check_text(struct mdoc *mdoc, int ln, int pos, char *p) |
check_text(struct roff_man *mdoc, int ln, int pos, char *p) |
{ |
{ |
char *cp; |
char *cp; |
|
|
Line 399 check_text(struct mdoc *mdoc, int ln, int pos, char *p |
|
Line 399 check_text(struct mdoc *mdoc, int ln, int pos, char *p |
|
static void |
static void |
pre_display(PRE_ARGS) |
pre_display(PRE_ARGS) |
{ |
{ |
struct mdoc_node *node; |
struct roff_node *node; |
|
|
if (n->type != ROFFT_BLOCK) |
if (n->type != ROFFT_BLOCK) |
return; |
return; |
Line 769 pre_dd(PRE_ARGS) |
|
Line 769 pre_dd(PRE_ARGS) |
|
static void |
static void |
post_bf(POST_ARGS) |
post_bf(POST_ARGS) |
{ |
{ |
struct mdoc_node *np, *nch; |
struct roff_node *np, *nch; |
enum mdocargt arg; |
enum mdocargt arg; |
|
|
/* |
/* |
Line 831 post_bf(POST_ARGS) |
|
Line 831 post_bf(POST_ARGS) |
|
static void |
static void |
post_lb(POST_ARGS) |
post_lb(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
const char *stdlibname; |
const char *stdlibname; |
char *libname; |
char *libname; |
|
|
Line 851 post_lb(POST_ARGS) |
|
Line 851 post_lb(POST_ARGS) |
|
static void |
static void |
post_eoln(POST_ARGS) |
post_eoln(POST_ARGS) |
{ |
{ |
const struct mdoc_node *n; |
const struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
if (n->child) |
if (n->child) |
Line 864 post_eoln(POST_ARGS) |
|
Line 864 post_eoln(POST_ARGS) |
|
static void |
static void |
post_fname(POST_ARGS) |
post_fname(POST_ARGS) |
{ |
{ |
const struct mdoc_node *n; |
const struct roff_node *n; |
const char *cp; |
const char *cp; |
size_t pos; |
size_t pos; |
|
|
Line 887 post_fn(POST_ARGS) |
|
Line 887 post_fn(POST_ARGS) |
|
static void |
static void |
post_fo(POST_ARGS) |
post_fo(POST_ARGS) |
{ |
{ |
const struct mdoc_node *n; |
const struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
Line 913 post_fo(POST_ARGS) |
|
Line 913 post_fo(POST_ARGS) |
|
static void |
static void |
post_fa(POST_ARGS) |
post_fa(POST_ARGS) |
{ |
{ |
const struct mdoc_node *n; |
const struct roff_node *n; |
const char *cp; |
const char *cp; |
|
|
for (n = mdoc->last->child; n != NULL; n = n->next) { |
for (n = mdoc->last->child; n != NULL; n = n->next) { |
Line 934 post_fa(POST_ARGS) |
|
Line 934 post_fa(POST_ARGS) |
|
static void |
static void |
post_vt(POST_ARGS) |
post_vt(POST_ARGS) |
{ |
{ |
const struct mdoc_node *n; |
const struct roff_node *n; |
|
|
/* |
/* |
* The Vt macro comes in both ELEM and BLOCK form, both of which |
* The Vt macro comes in both ELEM and BLOCK form, both of which |
Line 956 post_vt(POST_ARGS) |
|
Line 956 post_vt(POST_ARGS) |
|
static void |
static void |
post_nm(POST_ARGS) |
post_nm(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
Line 978 post_nm(POST_ARGS) |
|
Line 978 post_nm(POST_ARGS) |
|
static void |
static void |
post_nd(POST_ARGS) |
post_nd(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
Line 995 post_nd(POST_ARGS) |
|
Line 995 post_nd(POST_ARGS) |
|
static void |
static void |
post_d1(POST_ARGS) |
post_d1(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
Line 1012 post_d1(POST_ARGS) |
|
Line 1012 post_d1(POST_ARGS) |
|
static void |
static void |
post_literal(POST_ARGS) |
post_literal(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
Line 1034 post_literal(POST_ARGS) |
|
Line 1034 post_literal(POST_ARGS) |
|
static void |
static void |
post_defaults(POST_ARGS) |
post_defaults(POST_ARGS) |
{ |
{ |
struct mdoc_node *nn; |
struct roff_node *nn; |
|
|
/* |
/* |
* The `Ar' defaults to "file ..." if no value is provided as an |
* The `Ar' defaults to "file ..." if no value is provided as an |
Line 1046 post_defaults(POST_ARGS) |
|
Line 1046 post_defaults(POST_ARGS) |
|
return; |
return; |
|
|
nn = mdoc->last; |
nn = mdoc->last; |
mdoc->next = MDOC_NEXT_CHILD; |
mdoc->next = ROFF_NEXT_CHILD; |
|
|
switch (nn->tok) { |
switch (nn->tok) { |
case MDOC_Ar: |
case MDOC_Ar: |
Line 1068 post_defaults(POST_ARGS) |
|
Line 1068 post_defaults(POST_ARGS) |
|
static void |
static void |
post_at(POST_ARGS) |
post_at(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
const char *std_att; |
const char *std_att; |
char *att; |
char *att; |
|
|
n = mdoc->last; |
n = mdoc->last; |
if (n->child == NULL) { |
if (n->child == NULL) { |
mdoc->next = MDOC_NEXT_CHILD; |
mdoc->next = ROFF_NEXT_CHILD; |
mdoc_word_alloc(mdoc, n->line, n->pos, "AT&T UNIX"); |
mdoc_word_alloc(mdoc, n->line, n->pos, "AT&T UNIX"); |
mdoc->last = n; |
mdoc->last = n; |
return; |
return; |
Line 1102 post_at(POST_ARGS) |
|
Line 1102 post_at(POST_ARGS) |
|
static void |
static void |
post_an(POST_ARGS) |
post_an(POST_ARGS) |
{ |
{ |
struct mdoc_node *np, *nch; |
struct roff_node *np, *nch; |
|
|
np = mdoc->last; |
np = mdoc->last; |
nch = np->child; |
nch = np->child; |
Line 1133 post_es(POST_ARGS) |
|
Line 1133 post_es(POST_ARGS) |
|
static void |
static void |
post_it(POST_ARGS) |
post_it(POST_ARGS) |
{ |
{ |
|
struct roff_node *nbl, *nit, *nch; |
int i, cols; |
int i, cols; |
enum mdoc_list lt; |
enum mdoc_list lt; |
struct mdoc_node *nbl, *nit, *nch; |
|
|
|
nit = mdoc->last; |
nit = mdoc->last; |
if (nit->type != ROFFT_BLOCK) |
if (nit->type != ROFFT_BLOCK) |
Line 1201 post_it(POST_ARGS) |
|
Line 1201 post_it(POST_ARGS) |
|
static void |
static void |
post_bl_block(POST_ARGS) |
post_bl_block(POST_ARGS) |
{ |
{ |
struct mdoc_node *n, *ni, *nc; |
struct roff_node *n, *ni, *nc; |
|
|
/* |
/* |
* These are fairly complicated, so we've broken them into two |
* These are fairly complicated, so we've broken them into two |
|
|
rewrite_macro2len(char **arg) |
rewrite_macro2len(char **arg) |
{ |
{ |
size_t width; |
size_t width; |
enum mdoct tok; |
int tok; |
|
|
if (*arg == NULL) |
if (*arg == NULL) |
return; |
return; |
Line 1280 rewrite_macro2len(char **arg) |
|
Line 1280 rewrite_macro2len(char **arg) |
|
static void |
static void |
post_bl_block_tag(POST_ARGS) |
post_bl_block_tag(POST_ARGS) |
{ |
{ |
struct mdoc_node *n, *nn; |
struct roff_node *n, *nn; |
size_t sz, ssz; |
size_t sz, ssz; |
int i; |
int i; |
char buf[24]; |
char buf[24]; |
Line 1345 post_bl_block_tag(POST_ARGS) |
|
Line 1345 post_bl_block_tag(POST_ARGS) |
|
static void |
static void |
post_bl_head(POST_ARGS) |
post_bl_head(POST_ARGS) |
{ |
{ |
struct mdoc_node *nbl, *nh, *nch, *nnext; |
struct roff_node *nbl, *nh, *nch, *nnext; |
struct mdoc_argv *argv; |
struct mdoc_argv *argv; |
int i, j; |
int i, j; |
|
|
Line 1407 post_bl_head(POST_ARGS) |
|
Line 1407 post_bl_head(POST_ARGS) |
|
static void |
static void |
post_bl(POST_ARGS) |
post_bl(POST_ARGS) |
{ |
{ |
struct mdoc_node *nparent, *nprev; /* of the Bl block */ |
struct roff_node *nparent, *nprev; /* of the Bl block */ |
struct mdoc_node *nblock, *nbody; /* of the Bl */ |
struct roff_node *nblock, *nbody; /* of the Bl */ |
struct mdoc_node *nchild, *nnext; /* of the Bl body */ |
struct roff_node *nchild, *nnext; /* of the Bl body */ |
|
|
nbody = mdoc->last; |
nbody = mdoc->last; |
switch (nbody->type) { |
switch (nbody->type) { |
Line 1490 post_bl(POST_ARGS) |
|
Line 1490 post_bl(POST_ARGS) |
|
static void |
static void |
post_bk(POST_ARGS) |
post_bk(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
Line 1502 post_bk(POST_ARGS) |
|
Line 1502 post_bk(POST_ARGS) |
|
} |
} |
|
|
static void |
static void |
post_sm(struct mdoc *mdoc) |
post_sm(struct roff_man *mdoc) |
{ |
{ |
struct mdoc_node *nch; |
struct roff_node *nch; |
|
|
nch = mdoc->last->child; |
nch = mdoc->last->child; |
|
|
Line 1534 post_sm(struct mdoc *mdoc) |
|
Line 1534 post_sm(struct mdoc *mdoc) |
|
static void |
static void |
post_root(POST_ARGS) |
post_root(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
|
|
/* Add missing prologue data. */ |
/* Add missing prologue data. */ |
|
|
Line 1574 post_root(POST_ARGS) |
|
Line 1574 post_root(POST_ARGS) |
|
static void |
static void |
post_st(POST_ARGS) |
post_st(POST_ARGS) |
{ |
{ |
struct mdoc_node *n, *nch; |
struct roff_node *n, *nch; |
const char *p; |
const char *p; |
|
|
n = mdoc->last; |
n = mdoc->last; |
Line 1595 post_st(POST_ARGS) |
|
Line 1595 post_st(POST_ARGS) |
|
static void |
static void |
post_rs(POST_ARGS) |
post_rs(POST_ARGS) |
{ |
{ |
struct mdoc_node *np, *nch, *next, *prev; |
struct roff_node *np, *nch, *next, *prev; |
int i, j; |
int i, j; |
|
|
np = mdoc->last; |
np = mdoc->last; |
Line 1689 post_rs(POST_ARGS) |
|
Line 1689 post_rs(POST_ARGS) |
|
static void |
static void |
post_hyph(POST_ARGS) |
post_hyph(POST_ARGS) |
{ |
{ |
struct mdoc_node *nch; |
struct roff_node *nch; |
char *cp; |
char *cp; |
|
|
for (nch = mdoc->last->child; nch != NULL; nch = nch->next) { |
for (nch = mdoc->last->child; nch != NULL; nch = nch->next) { |
Line 1748 post_sh(POST_ARGS) |
|
Line 1748 post_sh(POST_ARGS) |
|
static void |
static void |
post_sh_name(POST_ARGS) |
post_sh_name(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
int hasnm, hasnd; |
int hasnm, hasnd; |
|
|
hasnm = hasnd = 0; |
hasnm = hasnd = 0; |
Line 1786 post_sh_name(POST_ARGS) |
|
Line 1786 post_sh_name(POST_ARGS) |
|
static void |
static void |
post_sh_see_also(POST_ARGS) |
post_sh_see_also(POST_ARGS) |
{ |
{ |
const struct mdoc_node *n; |
const struct roff_node *n; |
const char *name, *sec; |
const char *name, *sec; |
const char *lastname, *lastsec, *lastpunct; |
const char *lastname, *lastsec, *lastpunct; |
int cmp; |
int cmp; |
Line 1846 post_sh_see_also(POST_ARGS) |
|
Line 1846 post_sh_see_also(POST_ARGS) |
|
} |
} |
|
|
static int |
static int |
child_an(const struct mdoc_node *n) |
child_an(const struct roff_node *n) |
{ |
{ |
|
|
for (n = n->child; n != NULL; n = n->next) |
for (n = n->child; n != NULL; n = n->next) |
Line 1867 post_sh_authors(POST_ARGS) |
|
Line 1867 post_sh_authors(POST_ARGS) |
|
static void |
static void |
post_sh_head(POST_ARGS) |
post_sh_head(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
const char *goodsec; |
const char *goodsec; |
char *secname; |
char *secname; |
enum mdoc_sec sec; |
enum roff_sec sec; |
|
|
/* |
/* |
* Process a new section. Sections are either "named" or |
* Process a new section. Sections are either "named" or |
Line 1987 post_sh_head(POST_ARGS) |
|
Line 1987 post_sh_head(POST_ARGS) |
|
static void |
static void |
post_ignpar(POST_ARGS) |
post_ignpar(POST_ARGS) |
{ |
{ |
struct mdoc_node *np; |
struct roff_node *np; |
|
|
switch (mdoc->last->type) { |
switch (mdoc->last->type) { |
case ROFFT_HEAD: |
case ROFFT_HEAD: |
Line 2053 pre_par(PRE_ARGS) |
|
Line 2053 pre_par(PRE_ARGS) |
|
static void |
static void |
post_par(POST_ARGS) |
post_par(POST_ARGS) |
{ |
{ |
struct mdoc_node *np; |
struct roff_node *np; |
|
|
np = mdoc->last; |
np = mdoc->last; |
|
|
Line 2116 pre_literal(PRE_ARGS) |
|
Line 2116 pre_literal(PRE_ARGS) |
|
static void |
static void |
post_dd(POST_ARGS) |
post_dd(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
char *datestr; |
char *datestr; |
|
|
if (mdoc->meta.date) |
if (mdoc->meta.date) |
|
|
static void |
static void |
post_dt(POST_ARGS) |
post_dt(POST_ARGS) |
{ |
{ |
struct mdoc_node *nn, *n; |
struct roff_node *nn, *n; |
const char *cp; |
const char *cp; |
char *p; |
char *p; |
|
|
|
|
static void |
static void |
post_bx(POST_ARGS) |
post_bx(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
|
|
/* |
/* |
* Make `Bx's second argument always start with an uppercase |
* Make `Bx's second argument always start with an uppercase |
Line 2250 post_os(POST_ARGS) |
|
Line 2250 post_os(POST_ARGS) |
|
struct utsname utsname; |
struct utsname utsname; |
static char *defbuf; |
static char *defbuf; |
#endif |
#endif |
struct mdoc_node *n; |
struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
|
|
static void |
static void |
post_ex(POST_ARGS) |
post_ex(POST_ARGS) |
{ |
{ |
struct mdoc_node *n; |
struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
Line 2313 post_ex(POST_ARGS) |
|
Line 2313 post_ex(POST_ARGS) |
|
return; |
return; |
} |
} |
|
|
mdoc->next = MDOC_NEXT_CHILD; |
mdoc->next = ROFF_NEXT_CHILD; |
mdoc_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name); |
mdoc_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name); |
mdoc->last = n; |
mdoc->last = n; |
} |
} |
|
|
static enum mdoc_sec |
static enum roff_sec |
a2sec(const char *p) |
a2sec(const char *p) |
{ |
{ |
int i; |
int i; |
|
|
for (i = 0; i < (int)SEC__MAX; i++) |
for (i = 0; i < (int)SEC__MAX; i++) |
if (secnames[i] && 0 == strcmp(p, secnames[i])) |
if (secnames[i] && 0 == strcmp(p, secnames[i])) |
return((enum mdoc_sec)i); |
return((enum roff_sec)i); |
|
|
return(SEC_CUSTOM); |
return(SEC_CUSTOM); |
} |
} |
|
|
static size_t |
static size_t |
macro2len(enum mdoct macro) |
macro2len(int macro) |
{ |
{ |
|
|
switch (macro) { |
switch (macro) { |