version 1.30, 2008/12/01 21:25:48 |
version 1.31, 2008/12/02 00:10:37 |
Line 112 struct rofftree { |
|
Line 112 struct rofftree { |
|
static int roff_Dd(ROFFCALL_ARGS); |
static int roff_Dd(ROFFCALL_ARGS); |
static int roff_Dt(ROFFCALL_ARGS); |
static int roff_Dt(ROFFCALL_ARGS); |
static int roff_Os(ROFFCALL_ARGS); |
static int roff_Os(ROFFCALL_ARGS); |
|
static int roff_Ns(ROFFCALL_ARGS); |
|
|
static int roff_layout(ROFFCALL_ARGS); |
static int roff_layout(ROFFCALL_ARGS); |
static int roff_text(ROFFCALL_ARGS); |
static int roff_text(ROFFCALL_ARGS); |
Line 126 static void roff_warn(const struct rofftree *, |
|
Line 127 static void roff_warn(const struct rofftree *, |
|
static void roff_err(const struct rofftree *, |
static void roff_err(const struct rofftree *, |
const char *, char *, ...); |
const char *, char *, ...); |
|
|
|
static int roffpurgepunct(struct rofftree *, char **); |
static int roffscan(int, const int *); |
static int roffscan(int, const int *); |
static int rofffindtok(const char *); |
static int rofffindtok(const char *); |
static int rofffindarg(const char *); |
static int rofffindarg(const char *); |
Line 253 static const struct rofftok tokens[ROFF_MAX] = { |
|
Line 255 static const struct rofftok tokens[ROFF_MAX] = { |
|
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Fx */ |
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Fx */ |
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ms */ |
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ms */ |
{ NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* No */ |
{ NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* No */ |
{ NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ns */ |
{ roff_Ns, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ns */ |
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Nx */ |
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Nx */ |
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ox */ |
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ox */ |
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Pc */ |
{ roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Pc */ |
Line 878 roffnextopt(const struct rofftree *tree, int tok, |
|
Line 880 roffnextopt(const struct rofftree *tree, int tok, |
|
|
|
|
|
static int |
static int |
|
roffpurgepunct(struct rofftree *tree, char **argv) |
|
{ |
|
int i; |
|
|
|
i = 0; |
|
while (argv[i]) |
|
i++; |
|
assert(i > 0); |
|
if ( ! roffispunct(argv[--i])) |
|
return(1); |
|
while (i >= 0 && roffispunct(argv[i])) |
|
i--; |
|
i++; |
|
|
|
/* LINTED */ |
|
while (argv[i]) |
|
if ( ! (*tree->cb.roffdata)(tree->arg, 0, argv[i++])) |
|
return(0); |
|
return(1); |
|
} |
|
|
|
|
|
static int |
roffparseopts(struct rofftree *tree, int tok, |
roffparseopts(struct rofftree *tree, int tok, |
char ***args, int *argc, char **argv) |
char ***args, int *argc, char **argv) |
{ |
{ |
Line 1047 roff_Dt(ROFFCALL_ARGS) |
|
Line 1072 roff_Dt(ROFFCALL_ARGS) |
|
|
|
/* ARGSUSED */ |
/* ARGSUSED */ |
static int |
static int |
|
roff_Ns(ROFFCALL_ARGS) |
|
{ |
|
int j, c, first; |
|
|
|
first = (*argv == tree->cur); |
|
|
|
argv++; |
|
|
|
if (ROFF_MAX != (c = rofffindcallable(*argv))) { |
|
if (NULL == tokens[c].cb) { |
|
roff_err(tree, *argv, "unsupported macro `%s'", |
|
toknames[c]); |
|
return(0); |
|
} |
|
if ( ! (*tree->cb.roffspecial)(tree->arg, tok)) |
|
return(0); |
|
if ( ! (*tokens[c].cb)(c, tree, argv, ROFF_ENTER)) |
|
return(0); |
|
if ( ! first) |
|
return(1); |
|
return(roffpurgepunct(tree, argv)); |
|
} |
|
|
|
if ( ! (*tree->cb.roffdata)(tree->arg, 0, *argv++)) |
|
return(0); |
|
|
|
while (*argv) { |
|
if (ROFF_MAX == (c = rofffindcallable(*argv))) { |
|
if ( ! roffispunct(*argv)) { |
|
if ( ! (*tree->cb.roffdata) |
|
(tree->arg, 1, *argv++)) |
|
return(0); |
|
continue; |
|
} |
|
|
|
/* FIXME: this is identical to that of |
|
* roff_text. */ |
|
|
|
/* See if only punctuation remains. */ |
|
|
|
for (j = 0; argv[j]; j++) |
|
if ( ! roffispunct(argv[j])) |
|
break; |
|
|
|
if (argv[j]) { |
|
if ( ! (*tree->cb.roffdata) |
|
(tree->arg, 0, *argv++)) |
|
return(0); |
|
continue; |
|
} |
|
|
|
/* Only punctuation remains. */ |
|
|
|
break; |
|
} |
|
if (NULL == tokens[c].cb) { |
|
roff_err(tree, *argv, "unsupported macro `%s'", |
|
toknames[c]); |
|
return(0); |
|
} |
|
if ( ! (*tokens[c].cb)(c, tree, argv, ROFF_ENTER)) |
|
return(0); |
|
break; |
|
} |
|
|
|
if ( ! first) |
|
return(1); |
|
return(roffpurgepunct(tree, argv)); |
|
} |
|
|
|
|
|
/* ARGSUSED */ |
|
static int |
roff_Os(ROFFCALL_ARGS) |
roff_Os(ROFFCALL_ARGS) |
{ |
{ |
char *p; |
char *p; |
Line 1188 roff_layout(ROFFCALL_ARGS) |
|
Line 1286 roff_layout(ROFFCALL_ARGS) |
|
* a token isn't punctuation. |
* a token isn't punctuation. |
*/ |
*/ |
|
|
i = 0; |
if ( ! roffpurgepunct(tree, argv)) |
while (argv[i]) |
return(0); |
i++; |
|
|
|
assert(i > 0); |
|
if ( ! roffispunct(argv[--i])) |
|
return((*tree->cb.roffout)(tree->arg, tok)); |
|
|
|
while (i >= 0 && roffispunct(argv[i])) |
|
i--; |
|
|
|
i++; |
|
|
|
/* LINTED */ |
|
while (argv[i]) |
|
if ( ! (*tree->cb.roffdata)(tree->arg, 0, argv[i++])) |
|
return(0); |
|
|
|
return((*tree->cb.roffout)(tree->arg, tok)); |
return((*tree->cb.roffout)(tree->arg, tok)); |
} |
} |
|
|
Line 1314 roff_text(ROFFCALL_ARGS) |
|
Line 1397 roff_text(ROFFCALL_ARGS) |
|
if ( ! first) |
if ( ! first) |
return(1); |
return(1); |
|
|
/* |
return(roffpurgepunct(tree, argv)); |
* We're the line-dominant macro. Check if there's remaining |
|
* punctuation. If there is, then flush it out before exiting. |
|
*/ |
|
|
|
i = 0; |
|
while (argv[i]) |
|
i++; |
|
|
|
assert(i > 0); |
|
if ( ! roffispunct(argv[--i])) |
|
return(1); |
|
|
|
while (i >= 0 && roffispunct(argv[i])) |
|
i--; |
|
i++; |
|
|
|
/* LINTED */ |
|
while (argv[i]) |
|
if ( ! (*tree->cb.roffdata)(tree->arg, 0, argv[i++])) |
|
return(0); |
|
|
|
return(1); |
|
} |
} |
|
|
|
|