version 1.29, 2008/12/01 16:14:34 |
version 1.30, 2008/12/01 21:25:48 |
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
* PERFORMANCE OF THIS SOFTWARE. |
* PERFORMANCE OF THIS SOFTWARE. |
*/ |
*/ |
|
#include <sys/param.h> |
|
|
#include <assert.h> |
#include <assert.h> |
#include <ctype.h> |
#include <ctype.h> |
#include <err.h> |
#include <err.h> |
Line 90 struct rofftree { |
|
Line 92 struct rofftree { |
|
struct roffnode *last; /* Last parsed node. */ |
struct roffnode *last; /* Last parsed node. */ |
char *cur; |
char *cur; |
|
|
time_t date; /* `Dd' results. */ |
struct tm tm; /* `Dd' results. */ |
char os[64]; /* `Os' results. */ |
char os[64]; /* `Os' results. */ |
char title[64]; /* `Dt' results. */ |
char title[64]; /* `Dt' results. */ |
char section[64]; /* `Dt' results. */ |
char section[64]; /* `Dt' results. */ |
Line 397 roff_free(struct rofftree *tree, int flush) |
|
Line 399 roff_free(struct rofftree *tree, int flush) |
|
goto end; |
goto end; |
} |
} |
|
|
|
if ( ! (*tree->cb.rofftail)(tree->arg)) |
|
goto end; |
|
|
error = 0; |
error = 0; |
|
|
end: |
end: |
|
|
textparse(const struct rofftree *tree, char *buf) |
textparse(const struct rofftree *tree, char *buf) |
{ |
{ |
|
|
|
if ( ! (ROFF_BODY & tree->state)) { |
|
roff_err(tree, buf, "data not in body"); |
|
return(0); |
|
} |
return((*tree->cb.roffdata)(tree->arg, 1, buf)); |
return((*tree->cb.roffdata)(tree->arg, 1, buf)); |
} |
} |
|
|
Line 897 roffparseopts(struct rofftree *tree, int tok, |
|
Line 906 roffparseopts(struct rofftree *tree, int tok, |
|
static int |
static int |
roff_Dd(ROFFCALL_ARGS) |
roff_Dd(ROFFCALL_ARGS) |
{ |
{ |
|
time_t t; |
|
char *p, buf[32]; |
|
|
if (ROFF_BODY & tree->state) { |
if (ROFF_BODY & tree->state) { |
assert( ! (ROFF_PRELUDE & tree->state)); |
assert( ! (ROFF_PRELUDE & tree->state)); |
Line 915 roff_Dd(ROFFCALL_ARGS) |
|
Line 926 roff_Dd(ROFFCALL_ARGS) |
|
return(0); |
return(0); |
} |
} |
|
|
/* TODO: parse date. */ |
|
|
|
assert(NULL == tree->last); |
assert(NULL == tree->last); |
tree->state |= ROFF_PRELUDE_Dd; |
|
|
|
|
argv++; |
|
|
|
if (0 == strcmp(*argv, "$Mdocdate$")) { |
|
t = time(NULL); |
|
if (NULL == localtime_r(&t, &tree->tm)) |
|
err(1, "localtime_r"); |
|
tree->state |= ROFF_PRELUDE_Dd; |
|
return(1); |
|
} |
|
|
|
/* Build this from Mdocdate or raw date. */ |
|
|
|
buf[0] = 0; |
|
p = *argv; |
|
|
|
if (0 != strcmp(*argv, "$Mdocdate:")) { |
|
while (*argv) { |
|
if (strlcat(buf, *argv++, sizeof(buf)) |
|
< sizeof(buf)) |
|
continue; |
|
roff_err(tree, p, "bad `Dd' date"); |
|
return(0); |
|
} |
|
if (strptime(buf, "%b%d,%Y", &tree->tm)) { |
|
tree->state |= ROFF_PRELUDE_Dd; |
|
return(1); |
|
} |
|
roff_err(tree, *argv, "bad `Dd' date"); |
|
return(0); |
|
} |
|
|
|
argv++; |
|
while (*argv && **argv != '$') { |
|
if (strlcat(buf, *argv++, sizeof(buf)) |
|
>= sizeof(buf)) { |
|
roff_err(tree, p, "bad `Dd' Mdocdate"); |
|
return(0); |
|
} |
|
if (strlcat(buf, " ", sizeof(buf)) |
|
>= sizeof(buf)) { |
|
roff_err(tree, p, "bad `Dd' Mdocdate"); |
|
return(0); |
|
} |
|
} |
|
if (NULL == *argv) { |
|
roff_err(tree, p, "bad `Dd' Mdocdate"); |
|
return(0); |
|
} |
|
|
|
if (NULL == strptime(buf, "%b %d %Y", &tree->tm)) { |
|
roff_err(tree, *argv, "bad `Dd' Mdocdate"); |
|
return(0); |
|
} |
|
|
|
tree->state |= ROFF_PRELUDE_Dd; |
return(1); |
return(1); |
} |
} |
|
|
Line 946 roff_Dt(ROFFCALL_ARGS) |
|
Line 1009 roff_Dt(ROFFCALL_ARGS) |
|
return(0); |
return(0); |
} |
} |
|
|
/* TODO: parse date. */ |
argv++; |
|
if (NULL == *argv) { |
|
roff_err(tree, *argv, "`Dt' needs document title"); |
|
return(0); |
|
} else if (strlcpy(tree->title, *argv, sizeof(tree->title)) |
|
>= sizeof(tree->title)) { |
|
roff_err(tree, *argv, "`Dt' document title too long"); |
|
return(0); |
|
} |
|
|
|
argv++; |
|
if (NULL == *argv) { |
|
roff_err(tree, *argv, "`Dt' needs section"); |
|
return(0); |
|
} else if (strlcpy(tree->section, *argv, sizeof(tree->section)) |
|
>= sizeof(tree->section)) { |
|
roff_err(tree, *argv, "`Dt' section too long"); |
|
return(0); |
|
} |
|
|
|
argv++; |
|
if (NULL == *argv) { |
|
tree->volume[0] = 0; |
|
} else if (strlcpy(tree->volume, *argv, sizeof(tree->volume)) |
|
>= sizeof(tree->volume)) { |
|
roff_err(tree, *argv, "`Dt' volume too long"); |
|
return(0); |
|
} |
|
|
assert(NULL == tree->last); |
assert(NULL == tree->last); |
tree->state |= ROFF_PRELUDE_Dt; |
tree->state |= ROFF_PRELUDE_Dt; |
|
|
Line 959 roff_Dt(ROFFCALL_ARGS) |
|
Line 1049 roff_Dt(ROFFCALL_ARGS) |
|
static int |
static int |
roff_Os(ROFFCALL_ARGS) |
roff_Os(ROFFCALL_ARGS) |
{ |
{ |
|
char *p; |
|
|
if (ROFF_EXIT == type) { |
if (ROFF_BODY & tree->state) { |
return((*tree->cb.rofftail)(tree->arg)); |
|
} else if (ROFF_BODY & tree->state) { |
|
assert( ! (ROFF_PRELUDE & tree->state)); |
assert( ! (ROFF_PRELUDE & tree->state)); |
assert(ROFF_PRELUDE_Os & tree->state); |
assert(ROFF_PRELUDE_Os & tree->state); |
return(roff_text(tok, tree, argv, type)); |
return(roff_text(tok, tree, argv, type)); |
Line 975 roff_Os(ROFFCALL_ARGS) |
|
Line 1064 roff_Os(ROFFCALL_ARGS) |
|
return(0); |
return(0); |
} |
} |
|
|
/* TODO: extract OS. */ |
tree->os[0] = 0; |
|
|
|
p = *++argv; |
|
|
|
while (*argv) { |
|
if (strlcat(tree->os, *argv++, sizeof(tree->os)) |
|
< sizeof(tree->os)) |
|
continue; |
|
roff_err(tree, p, "`Os' value too long"); |
|
return(0); |
|
} |
|
|
|
if (0 == tree->os[0]) |
|
if (strlcpy(tree->os, "LOCAL", sizeof(tree->os)) |
|
>= sizeof(tree->os)) { |
|
roff_err(tree, p, "`Os' value too long"); |
|
return(0); |
|
} |
|
|
tree->state |= ROFF_PRELUDE_Os; |
tree->state |= ROFF_PRELUDE_Os; |
tree->state &= ~ROFF_PRELUDE; |
tree->state &= ~ROFF_PRELUDE; |
tree->state |= ROFF_BODY; |
tree->state |= ROFF_BODY; |
Line 1093 roff_layout(ROFFCALL_ARGS) |
|
Line 1199 roff_layout(ROFFCALL_ARGS) |
|
while (i >= 0 && roffispunct(argv[i])) |
while (i >= 0 && roffispunct(argv[i])) |
i--; |
i--; |
|
|
assert(0 != i); |
|
i++; |
i++; |
|
|
/* LINTED */ |
/* LINTED */ |
Line 1224 roff_text(ROFFCALL_ARGS) |
|
Line 1329 roff_text(ROFFCALL_ARGS) |
|
|
|
while (i >= 0 && roffispunct(argv[i])) |
while (i >= 0 && roffispunct(argv[i])) |
i--; |
i--; |
|
|
assert(0 != i); |
|
i++; |
i++; |
|
|
/* LINTED */ |
/* LINTED */ |