version 1.62, 2009/03/08 20:57:35 |
version 1.66, 2009/03/11 00:39:58 |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <string.h> |
#include <string.h> |
#ifdef __linux__ |
|
#include <time.h> |
|
#endif |
|
|
|
|
#include "private.h" |
|
|
/* |
/* |
* This has scanning/parsing routines, each of which extract a macro and |
* This has scanning/parsing routines, each of which extract a macro and |
* its arguments and parameters, then know how to progress to the next |
* its arguments and parameters, then know how to progress to the next |
* macro. |
* macro. |
*/ |
*/ |
|
|
#include "private.h" |
/* FIXME: .Fl, .Ar, .Cd handling of `|'. */ |
|
|
static int macro_obsolete(MACRO_PROT_ARGS); |
static int macro_obsolete(MACRO_PROT_ARGS); |
static int macro_constant(MACRO_PROT_ARGS); |
static int macro_constant(MACRO_PROT_ARGS); |
Line 183 const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { |
|
Line 182 const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { |
|
{ macro_constant, 0 }, /* Lb */ |
{ macro_constant, 0 }, /* Lb */ |
{ macro_constant_delimited, MDOC_CALLABLE | MDOC_PARSED }, /* Ap */ |
{ macro_constant_delimited, MDOC_CALLABLE | MDOC_PARSED }, /* Ap */ |
{ macro_text, 0 }, /* Lp */ |
{ macro_text, 0 }, /* Lp */ |
|
{ macro_text, MDOC_PARSED }, /* Lk */ |
|
{ macro_text, MDOC_PARSED }, /* Mt */ |
|
{ macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Brq */ |
|
{ macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Bro */ |
|
{ macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Brc */ |
}; |
}; |
|
|
const struct mdoc_macro * const mdoc_macros = __mdoc_macros; |
const struct mdoc_macro * const mdoc_macros = __mdoc_macros; |
Line 325 rewind_alt(int tok) |
|
Line 329 rewind_alt(int tok) |
|
return(MDOC_Ao); |
return(MDOC_Ao); |
case (MDOC_Bc): |
case (MDOC_Bc): |
return(MDOC_Bo); |
return(MDOC_Bo); |
|
case (MDOC_Brc): |
|
return(MDOC_Bro); |
case (MDOC_Dc): |
case (MDOC_Dc): |
return(MDOC_Do); |
return(MDOC_Do); |
case (MDOC_Ec): |
case (MDOC_Ec): |
Line 374 rewind_dohalt(int tok, enum mdoc_type type, const stru |
|
Line 380 rewind_dohalt(int tok, enum mdoc_type type, const stru |
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Bq): |
case (MDOC_Bq): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
|
case (MDOC_Brq): |
|
/* FALLTHROUGH */ |
case (MDOC_D1): |
case (MDOC_D1): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Dl): |
case (MDOC_Dl): |
Line 428 rewind_dohalt(int tok, enum mdoc_type type, const stru |
|
Line 436 rewind_dohalt(int tok, enum mdoc_type type, const stru |
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Bo): |
case (MDOC_Bo): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
|
case (MDOC_Bro): |
|
/* FALLTHROUGH */ |
case (MDOC_Do): |
case (MDOC_Do): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Eo): |
case (MDOC_Eo): |
Line 454 rewind_dohalt(int tok, enum mdoc_type type, const stru |
|
Line 464 rewind_dohalt(int tok, enum mdoc_type type, const stru |
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Bc): |
case (MDOC_Bc): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
|
case (MDOC_Brc): |
|
/* FALLTHROUGH */ |
case (MDOC_Dc): |
case (MDOC_Dc): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Ec): |
case (MDOC_Ec): |
Line 799 macro_text(MACRO_PROT_ARGS) |
|
Line 811 macro_text(MACRO_PROT_ARGS) |
|
for (;;) { |
for (;;) { |
la = *pos; |
la = *pos; |
w = mdoc_args(mdoc, line, pos, buf, tok, &p); |
w = mdoc_args(mdoc, line, pos, buf, tok, &p); |
assert(ARGS_PHRASE != c); |
assert(ARGS_PHRASE != w); |
|
|
if (ARGS_ERROR == w) |
if (ARGS_ERROR == w) |
return(0); |
return(0); |
Line 808 macro_text(MACRO_PROT_ARGS) |
|
Line 820 macro_text(MACRO_PROT_ARGS) |
|
if (ARGS_PUNCT == w) |
if (ARGS_PUNCT == w) |
break; |
break; |
|
|
|
/* Quoted words shouldn't be looked-up. */ |
|
|
c = ARGS_QWORD == w ? MDOC_MAX : |
c = ARGS_QWORD == w ? MDOC_MAX : |
lookup(mdoc, line, la, tok, p); |
lookup(mdoc, line, la, tok, p); |
|
|
|
/* MDOC_MAX (not a macro) or -1 (error). */ |
|
|
if (MDOC_MAX != c && -1 != c) { |
if (MDOC_MAX != c && -1 != c) { |
if (0 == lastpunct && ! rewind_elem(mdoc, tok)) |
if (0 == lastpunct && ! rewind_elem(mdoc, tok)) |
return(0); |
return(0); |
Line 823 macro_text(MACRO_PROT_ARGS) |
|
Line 839 macro_text(MACRO_PROT_ARGS) |
|
} else if (-1 == c) |
} else if (-1 == c) |
return(0); |
return(0); |
|
|
/* FIXME: .Fl and .Ar handling of `|'. */ |
/* Non-quote-enclosed punctuation. */ |
|
|
if (ARGS_QWORD != w && mdoc_isdelim(p)) { |
if (ARGS_QWORD != w && mdoc_isdelim(p)) { |
if (0 == lastpunct && ! rewind_elem(mdoc, tok)) |
if (0 == lastpunct && ! rewind_elem(mdoc, tok)) |