version 1.39, 2009/10/18 13:34:16 |
version 1.45, 2009/10/26 04:09:45 |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
|
#include "out.h" |
#include "man.h" |
#include "man.h" |
#include "term.h" |
#include "term.h" |
#include "chars.h" |
#include "chars.h" |
|
|
#define INDENT 7 |
#define INDENT 7 |
#define HALFINDENT 3 |
#define HALFINDENT 3 |
|
|
|
/* FIXME: have PD set the default vspace width. */ |
|
|
struct mtermp { |
struct mtermp { |
int fl; |
int fl; |
#define MANT_LITERAL (1 << 0) |
#define MANT_LITERAL (1 << 0) |
Line 66 extern size_t strlcpy(char *, const char *, size_t) |
|
Line 69 extern size_t strlcpy(char *, const char *, size_t) |
|
extern size_t strlcat(char *, const char *, size_t); |
extern size_t strlcat(char *, const char *, size_t); |
#endif |
#endif |
|
|
static int arg2width(const struct man_node *); |
static int a2width(const struct man_node *); |
static int arg2height(const struct man_node *); |
static int a2height(const struct man_node *); |
|
|
static void print_head(struct termp *, |
static void print_man_head(struct termp *, |
const struct man_meta *); |
const struct man_meta *); |
static void print_body(DECL_ARGS); |
static void print_man_body(DECL_ARGS); |
static void print_node(DECL_ARGS); |
static void print_man_node(DECL_ARGS); |
static void print_foot(struct termp *, |
static void print_man_foot(struct termp *, |
const struct man_meta *); |
const struct man_meta *); |
static void print_bvspace(struct termp *, |
static void print_bvspace(struct termp *, |
const struct man_node *); |
const struct man_node *); |
Line 140 static const struct termact termacts[MAN_MAX] = { |
|
Line 143 static const struct termact termacts[MAN_MAX] = { |
|
{ pre_RS, post_RS }, /* RS */ |
{ pre_RS, post_RS }, /* RS */ |
{ pre_ign, NULL }, /* DT */ |
{ pre_ign, NULL }, /* DT */ |
{ pre_ign, NULL }, /* UC */ |
{ pre_ign, NULL }, /* UC */ |
|
{ pre_ign, NULL }, /* PD */ |
}; |
}; |
|
|
|
|
Line 167 terminal_man(void *arg, const struct man *man) |
|
Line 171 terminal_man(void *arg, const struct man *man) |
|
n = man_node(man); |
n = man_node(man); |
m = man_meta(man); |
m = man_meta(man); |
|
|
print_head(p, m); |
print_man_head(p, m); |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
|
|
mt.fl = 0; |
mt.fl = 0; |
Line 175 terminal_man(void *arg, const struct man *man) |
|
Line 179 terminal_man(void *arg, const struct man *man) |
|
mt.offset = INDENT; |
mt.offset = INDENT; |
|
|
if (n->child) |
if (n->child) |
print_body(p, &mt, n->child, m); |
print_man_body(p, &mt, n->child, m); |
print_foot(p, m); |
print_man_foot(p, m); |
} |
} |
|
|
|
|
static int |
static int |
arg2height(const struct man_node *n) |
a2height(const struct man_node *n) |
{ |
{ |
int r; |
struct roffsu su; |
|
|
assert(MAN_TEXT == n->type); |
assert(MAN_TEXT == n->type); |
assert(n->string); |
assert(n->string); |
|
if ( ! a2roffsu(n->string, &su, SCALE_VS)) |
|
SCALE_VS_INIT(&su, strlen(n->string)); |
|
|
if ((r = a2height(n->string)) < 0) |
return((int)term_vspan(&su)); |
return(1); |
|
|
|
return(r); |
|
} |
} |
|
|
|
|
static int |
static int |
arg2width(const struct man_node *n) |
a2width(const struct man_node *n) |
{ |
{ |
|
struct roffsu su; |
|
|
assert(MAN_TEXT == n->type); |
assert(MAN_TEXT == n->type); |
assert(n->string); |
assert(n->string); |
return(a2width(n->string)); |
if ( ! a2roffsu(n->string, &su, SCALE_BU)) |
|
return(-1); |
|
|
|
return((int)term_hspan(&su)); |
} |
} |
|
|
|
|
Line 303 pre_IR(DECL_ARGS) |
|
Line 310 pre_IR(DECL_ARGS) |
|
p->under++; |
p->under++; |
if (i > 0) |
if (i > 0) |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
print_node(p, mt, nn, m); |
print_man_node(p, mt, nn, m); |
if ( ! (i % 2)) |
if ( ! (i % 2)) |
p->under--; |
p->under--; |
} |
} |
Line 327 pre_RB(DECL_ARGS) |
|
Line 334 pre_RB(DECL_ARGS) |
|
if (i > 0) |
if (i > 0) |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
|
|
print_node(p, mt, nn, m); |
print_man_node(p, mt, nn, m); |
|
|
if (i % 2 && MAN_RB == n->tok) |
if (i % 2 && MAN_RB == n->tok) |
p->bold--; |
p->bold--; |
Line 350 pre_RI(DECL_ARGS) |
|
Line 357 pre_RI(DECL_ARGS) |
|
p->under++; |
p->under++; |
if (i > 0) |
if (i > 0) |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
print_node(p, mt, nn, m); |
print_man_node(p, mt, nn, m); |
if ( ! (i % 2)) |
if ( ! (i % 2)) |
p->under--; |
p->under--; |
} |
} |
Line 377 pre_BI(DECL_ARGS) |
|
Line 384 pre_BI(DECL_ARGS) |
|
|
|
if (i) |
if (i) |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
print_node(p, mt, nn, m); |
print_man_node(p, mt, nn, m); |
|
|
if (i % 2 && MAN_BI == n->tok) |
if (i % 2 && MAN_BI == n->tok) |
p->under--; |
p->under--; |
Line 417 pre_sp(DECL_ARGS) |
|
Line 424 pre_sp(DECL_ARGS) |
|
{ |
{ |
int i, len; |
int i, len; |
|
|
len = n->child ? arg2height(n->child) : 1; |
len = n->child ? a2height(n->child) : 1; |
|
|
if (0 == len) |
if (0 == len) |
term_newln(p); |
term_newln(p); |
Line 464 pre_HP(DECL_ARGS) |
|
Line 471 pre_HP(DECL_ARGS) |
|
/* Calculate offset. */ |
/* Calculate offset. */ |
|
|
if (NULL != (nn = n->parent->head->child)) |
if (NULL != (nn = n->parent->head->child)) |
if ((ival = arg2width(nn)) >= 0) |
if ((ival = a2width(nn)) >= 0) |
len = (size_t)ival; |
len = (size_t)ival; |
|
|
if (0 == len) |
if (0 == len) |
Line 554 pre_IP(DECL_ARGS) |
|
Line 561 pre_IP(DECL_ARGS) |
|
if (NULL != (nn = nn->next)) { |
if (NULL != (nn = nn->next)) { |
for ( ; nn->next; nn = nn->next) |
for ( ; nn->next; nn = nn->next) |
/* Do nothing. */ ; |
/* Do nothing. */ ; |
if ((ival = arg2width(nn)) >= 0) |
if ((ival = a2width(nn)) >= 0) |
len = (size_t)ival; |
len = (size_t)ival; |
} |
} |
|
|
Line 574 pre_IP(DECL_ARGS) |
|
Line 581 pre_IP(DECL_ARGS) |
|
|
|
/* Don't print the length value. */ |
/* Don't print the length value. */ |
for (nn = n->child; nn->next; nn = nn->next) |
for (nn = n->child; nn->next; nn = nn->next) |
print_node(p, mt, nn, m); |
print_man_node(p, mt, nn, m); |
return(0); |
return(0); |
case (MAN_BODY): |
case (MAN_BODY): |
p->offset = mt->offset + len; |
p->offset = mt->offset + len; |
Line 641 pre_TP(DECL_ARGS) |
|
Line 648 pre_TP(DECL_ARGS) |
|
|
|
if (NULL != (nn = n->parent->head->child)) |
if (NULL != (nn = n->parent->head->child)) |
if (NULL != nn->next) |
if (NULL != nn->next) |
if ((ival = arg2width(nn)) >= 0) |
if ((ival = a2width(nn)) >= 0) |
len = (size_t)ival; |
len = (size_t)ival; |
|
|
switch (n->type) { |
switch (n->type) { |
Line 656 pre_TP(DECL_ARGS) |
|
Line 663 pre_TP(DECL_ARGS) |
|
/* Don't print same-line elements. */ |
/* Don't print same-line elements. */ |
for (nn = n->child; nn; nn = nn->next) |
for (nn = n->child; nn; nn = nn->next) |
if (nn->line > n->line) |
if (nn->line > n->line) |
print_node(p, mt, nn, m); |
print_man_node(p, mt, nn, m); |
|
|
if (ival >= 0) |
if (ival >= 0) |
mt->lmargin = (size_t)ival; |
mt->lmargin = (size_t)ival; |
Line 819 pre_RS(DECL_ARGS) |
|
Line 826 pre_RS(DECL_ARGS) |
|
return(1); |
return(1); |
} |
} |
|
|
if ((ival = arg2width(nn)) < 0) |
if ((ival = a2width(nn)) < 0) |
return(1); |
return(1); |
|
|
mt->offset = INDENT + (size_t)ival; |
mt->offset = INDENT + (size_t)ival; |
Line 847 post_RS(DECL_ARGS) |
|
Line 854 post_RS(DECL_ARGS) |
|
|
|
|
|
static void |
static void |
print_node(DECL_ARGS) |
print_man_node(DECL_ARGS) |
{ |
{ |
int c, sz; |
int c, sz; |
|
|
Line 883 print_node(DECL_ARGS) |
|
Line 890 print_node(DECL_ARGS) |
|
} |
} |
|
|
if (c && n->child) |
if (c && n->child) |
print_body(p, mt, n->child, m); |
print_man_body(p, mt, n->child, m); |
|
|
if (MAN_TEXT != n->type) |
if (MAN_TEXT != n->type) |
if (termacts[n->tok].post) |
if (termacts[n->tok].post) |
Line 892 print_node(DECL_ARGS) |
|
Line 899 print_node(DECL_ARGS) |
|
|
|
|
|
static void |
static void |
print_body(DECL_ARGS) |
print_man_body(DECL_ARGS) |
{ |
{ |
|
|
print_node(p, mt, n, m); |
print_man_node(p, mt, n, m); |
if ( ! n->next) |
if ( ! n->next) |
return; |
return; |
print_body(p, mt, n->next, m); |
print_man_body(p, mt, n->next, m); |
} |
} |
|
|
|
|
static void |
static void |
print_foot(struct termp *p, const struct man_meta *meta) |
print_man_foot(struct termp *p, const struct man_meta *meta) |
{ |
{ |
struct tm *tm; |
char buf[DATESIZ]; |
char buf[BUFSIZ]; |
|
|
|
tm = localtime(&meta->date); |
time2a(meta->date, buf, DATESIZ); |
|
|
if (0 == strftime(buf, p->rmargin, "%B %d, %Y", tm)) |
|
(void)strlcpy(buf, "(invalid date)", BUFSIZ); |
|
|
|
term_vspace(p); |
term_vspace(p); |
|
|
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; |
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; |
Line 936 print_foot(struct termp *p, const struct man_meta *met |
|
Line 939 print_foot(struct termp *p, const struct man_meta *met |
|
|
|
|
|
static void |
static void |
print_head(struct termp *p, const struct man_meta *meta) |
print_man_head(struct termp *p, const struct man_meta *meta) |
{ |
{ |
char *buf, *title; |
char *buf, *title; |
|
|