version 1.69, 2009/09/15 08:16:20 |
version 1.72, 2009/09/20 11:05:22 |
|
|
#include "term.h" |
#include "term.h" |
#include "mdoc.h" |
#include "mdoc.h" |
|
|
|
/* FIXME: check HANG lists: they seem to be broken... : |
|
* .Bl -hang -width Ds |
|
* .It a |
|
* b |
|
* .It Fl f Ns Ar option... |
|
* Override default compiler behaviour. See |
|
* .Sx Compiler Options |
|
* for details. |
|
* Override default compiler behaviour. See |
|
* .Sx Compiler Options |
|
* for details. |
|
* Override default compiler behaviour. See |
|
* .Sx Compiler Options |
|
* for details. |
|
* Override default compiler behaviour. See |
|
* .Sx Compiler Options |
|
* for details. |
|
* . |
|
* .It a sasd fasd as afsd sfad sfds sadfs sd sfd ssfad asfd |
|
* Override default compiler behaviour. See |
|
* .Sx Compiler Options |
|
* for details. |
|
* Override default compiler behaviour. See |
|
* .Sx Compiler Options |
|
* for details. |
|
* Override default compiler behaviour. See |
|
* .Sx Compiler Options |
|
* for details. |
|
* Override default compiler behaviour. See |
|
* .Sx Compiler Options |
|
* for details. |
|
* .El |
|
* |
|
*/ |
|
|
#define INDENT 5 |
#define INDENT 5 |
#define HALFINDENT 3 |
#define HALFINDENT 3 |
|
|
Line 113 static int termp_ud_pre(DECL_ARGS); |
|
Line 148 static int termp_ud_pre(DECL_ARGS); |
|
static int termp_xr_pre(DECL_ARGS); |
static int termp_xr_pre(DECL_ARGS); |
static int termp_xx_pre(DECL_ARGS); |
static int termp_xx_pre(DECL_ARGS); |
|
|
static const struct termact termacts[MDOC_MAX] = { |
static const struct termact termacts[MDOC_MAX] = { |
{ termp_ap_pre, NULL }, /* Ap */ |
{ termp_ap_pre, NULL }, /* Ap */ |
{ NULL, NULL }, /* Dd */ |
{ NULL, NULL }, /* Dd */ |
{ NULL, NULL }, /* Dt */ |
{ NULL, NULL }, /* Dt */ |
Line 153 static const struct termact termacts[MDOC_MAX] = { |
|
Line 188 static const struct termact termacts[MDOC_MAX] = { |
|
{ termp_rv_pre, NULL }, /* Rv */ |
{ termp_rv_pre, NULL }, /* Rv */ |
{ NULL, NULL }, /* St */ |
{ NULL, NULL }, /* St */ |
{ termp_under_pre, NULL }, /* Va */ |
{ termp_under_pre, NULL }, /* Va */ |
{ termp_under_pre, termp_vt_post }, /* Vt */ /* FIXME: type name */ |
{ termp_under_pre, termp_vt_post }, /* Vt */ |
{ termp_xr_pre, NULL }, /* Xr */ |
{ termp_xr_pre, NULL }, /* Xr */ |
{ NULL, termp____post }, /* %A */ |
{ NULL, termp____post }, /* %A */ |
{ NULL, termp____post }, /* %B */ |
{ NULL, termp____post }, /* %B */ |
Line 252 static void fmt_block_vspace(struct termp *, |
|
Line 287 static void fmt_block_vspace(struct termp *, |
|
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); |
|
} |
} |
|
|
|
|
Line 281 print_body(DECL_ARGS) |
|
Line 313 print_body(DECL_ARGS) |
|
{ |
{ |
|
|
print_node(p, pair, meta, node); |
print_node(p, pair, meta, node); |
if ( ! node->next) |
if (node->next) |
return; |
print_body(p, pair, meta, node->next); |
print_body(p, pair, meta, node->next); |
|
} |
} |
|
|
|
|
|
/* ARGSUSED */ |
static void |
static void |
print_node(DECL_ARGS) |
print_node(DECL_ARGS) |
{ |
{ |
int dochild, bold, under; |
int chld, bold, under; |
struct termpair npair; |
struct termpair npair; |
size_t offset, rmargin; |
size_t offset, rmargin; |
|
|
dochild = 1; |
chld = 1; |
offset = p->offset; |
offset = p->offset; |
rmargin = p->rmargin; |
rmargin = p->rmargin; |
bold = p->bold; |
bold = p->bold; |
under = p->under; |
under = p->under; |
|
|
|
bzero(&npair, sizeof(struct termpair)); |
npair.ppair = pair; |
npair.ppair = pair; |
npair.flag = 0; |
|
npair.count = 0; |
|
|
|
/* |
|
* Note on termpair. This allows a pre function to set a termp |
|
* flag that is automatically unset after the body, but before |
|
* the post function. Thus, if a pre uses a termpair flag, it |
|
* must be reapplied in the post for use. |
|
*/ |
|
|
|
if (MDOC_TEXT != node->type) { |
if (MDOC_TEXT != node->type) { |
if (termacts[node->tok].pre) |
if (termacts[node->tok].pre) |
if ( ! (*termacts[node->tok].pre)(p, &npair, meta, node)) |
chld = (*termacts[node->tok].pre) |
dochild = 0; |
(p, &npair, meta, node); |
} else /* MDOC_TEXT == node->type */ |
} else |
term_word(p, node->string); |
term_word(p, node->string); |
|
|
/* Children. */ |
if (chld && node->child) |
|
|
if (dochild && node->child) |
|
print_body(p, &npair, meta, node->child); |
print_body(p, &npair, meta, node->child); |
|
|
|
/* |
|
* XXX - if bold/under were to span scopes, this wouldn't be |
|
* possible, but because decoration is always in-scope, we can |
|
* get away with this. |
|
*/ |
|
|
p->bold = bold; |
p->bold = bold; |
p->under = under; |
p->under = under; |
|
|
/* Post-processing. */ |
|
|
|
if (MDOC_TEXT != node->type) |
if (MDOC_TEXT != node->type) |
if (termacts[node->tok].post) |
if (termacts[node->tok].post) |
(*termacts[node->tok].post)(p, &npair, meta, node); |
(*termacts[node->tok].post) |
|
(p, &npair, meta, node); |
|
|
p->offset = offset; |
p->offset = offset; |
p->rmargin = rmargin; |
p->rmargin = rmargin; |
} |
} |
|
|
|
|
|
/* 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; |
Line 352 print_foot(struct termp *p, const struct mdoc_meta *me |
|
Line 380 print_foot(struct termp *p, const struct mdoc_meta *me |
|
*/ |
*/ |
|
|
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); |
|
|
Line 396 print_foot(struct termp *p, const struct mdoc_meta *me |
|
Line 424 print_foot(struct termp *p, const struct mdoc_meta *me |
|
} |
} |
|
|
|
|
|
/* 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; |
|
|
Line 405 print_head(struct termp *p, const struct mdoc_meta *me |
|
Line 434 print_head(struct termp *p, const struct mdoc_meta *me |
|
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 |
Line 431 print_head(struct termp *p, const struct mdoc_meta *me |
|
Line 460 print_head(struct termp *p, const struct mdoc_meta *me |
|
(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; |
Line 465 print_head(struct termp *p, const struct mdoc_meta *me |
|
Line 493 print_head(struct termp *p, const struct mdoc_meta *me |
|
} |
} |
|
|
|
|
|
/* 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) |
{ |
{ |
Line 532 arg_listtype(const struct mdoc_node *n) |
|
Line 561 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) |
{ |
{ |