version 1.54, 2009/09/21 20:28:43 |
version 1.55, 2009/09/21 20:57:57 |
|
|
const struct mdoc_node *, |
const struct mdoc_node *, |
const struct mdoc_node *); |
const struct mdoc_node *); |
static void print_node(DECL_ARGS); |
static void print_node(DECL_ARGS); |
static void print_head(struct termp *, |
static void print_head(DECL_ARGS); |
const struct mdoc_meta *); |
|
static void print_body(DECL_ARGS); |
static void print_body(DECL_ARGS); |
static void print_foot(struct termp *, |
static void print_foot(DECL_ARGS); |
const struct mdoc_meta *); |
|
|
|
|
|
int |
void |
mdoc_run(struct termp *p, const struct mdoc *m) |
mdoc_run(struct termp *p, const struct mdoc *mdoc) |
{ |
{ |
/* |
const struct mdoc_node *n; |
* Main output function. When this is called, assume that the |
const struct mdoc_meta *m; |
* tree is properly formed. |
|
*/ |
n = mdoc_node(mdoc); |
print_head(p, mdoc_meta(m)); |
m = mdoc_meta(mdoc); |
assert(mdoc_node(m)); |
|
assert(MDOC_ROOT == mdoc_node(m)->type); |
print_head(p, NULL, m, n); |
if (mdoc_node(m)->child) |
if (n->child) |
print_body(p, NULL, mdoc_meta(m), mdoc_node(m)->child); |
print_body(p, NULL, m, n->child); |
print_foot(p, mdoc_meta(m)); |
print_foot(p, NULL, m, n); |
return(1); |
|
} |
} |
|
|
|
|
|
|
} |
} |
|
|
|
|
|
/* ARGSUSED */ |
static void |
static void |
print_foot(struct termp *p, const struct mdoc_meta *meta) |
print_foot(DECL_ARGS) |
{ |
{ |
struct tm *tm; |
struct tm *tm; |
char *buf, *os; |
char *buf, *os; |
|
|
*/ |
*/ |
|
|
if (NULL == (buf = malloc(p->rmargin))) |
if (NULL == (buf = malloc(p->rmargin))) |
err(1, "malloc"); |
err(EXIT_FAILURE, "malloc"); |
if (NULL == (os = malloc(p->rmargin))) |
if (NULL == (os = malloc(p->rmargin))) |
err(1, "malloc"); |
err(EXIT_FAILURE, "malloc"); |
|
|
tm = localtime(&meta->date); |
tm = localtime(&meta->date); |
|
|
if (0 == strftime(buf, p->rmargin, "%B %e, %Y", tm)) |
if (0 == strftime(buf, p->rmargin, "%B %e, %Y", tm)) |
err(1, "strftime"); |
err(EXIT_FAILURE, "strftime"); |
|
|
(void)strlcpy(os, meta->os, p->rmargin); |
(void)strlcpy(os, meta->os, p->rmargin); |
|
|
|
|
} |
} |
|
|
|
|
|
/* FIXME: put in utility library. */ |
|
/* ARGSUSED */ |
static void |
static void |
print_head(struct termp *p, const struct mdoc_meta *meta) |
print_head(DECL_ARGS) |
{ |
{ |
char *buf, *title; |
char *buf, *title; |
|
|
|
|
p->offset = 0; |
p->offset = 0; |
|
|
if (NULL == (buf = malloc(p->rmargin))) |
if (NULL == (buf = malloc(p->rmargin))) |
err(1, "malloc"); |
err(EXIT_FAILURE, "malloc"); |
if (NULL == (title = malloc(p->rmargin))) |
if (NULL == (title = malloc(p->rmargin))) |
err(1, "malloc"); |
err(EXIT_FAILURE, "malloc"); |
|
|
/* |
/* |
* The header is strange. It has three components, which are |
* The header is strange. It has three components, which are |
|
|
(void)strlcat(buf, ")", p->rmargin); |
(void)strlcat(buf, ")", p->rmargin); |
} |
} |
|
|
(void)snprintf(title, p->rmargin, "%s(%d)", |
snprintf(title, p->rmargin, "%s(%d)", meta->title, meta->msec); |
meta->title, meta->msec); |
|
|
|
p->offset = 0; |
p->offset = 0; |
p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2; |
p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2; |
|
|
} |
} |
|
|
|
|
|
/* FIXME: put in utility file for front-ends. */ |
static size_t |
static size_t |
arg_width(const struct mdoc_argv *arg, int pos) |
arg_width(const struct mdoc_argv *arg, int pos) |
{ |
{ |
|
|
} |
} |
|
|
|
|
|
/* FIXME: put in utility file for front-ends. */ |
static int |
static int |
arg_listtype(const struct mdoc_node *n) |
arg_listtype(const struct mdoc_node *n) |
{ |
{ |
|
|
} |
} |
|
|
|
|
|
/* FIXME: put in utility file for front-ends. */ |
static size_t |
static size_t |
arg_offset(const struct mdoc_argv *arg) |
arg_offset(const struct mdoc_argv *arg) |
{ |
{ |
|
|
* the 0 will be adjusted to default 10 or, if in the |
* the 0 will be adjusted to default 10 or, if in the |
* last column case, set to stretch to the margin). |
* last column case, set to stretch to the margin). |
*/ |
*/ |
for (i = 0, n = node->prev; n && n && |
for (i = 0, n = node->prev; n && |
i < (int)bl->args[vals[2]].argv->sz; |
i < (int)bl->args[vals[2]].argv->sz; |
n = n->prev, i++) |
n = n->prev, i++) |
offset += arg_width |
offset += arg_width |