summaryrefslogtreecommitdiffstats
path: root/mdoc_term.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdoc_term.c')
-rw-r--r--mdoc_term.c162
1 files changed, 30 insertions, 132 deletions
diff --git a/mdoc_term.c b/mdoc_term.c
index 7140dc81..942c5fc4 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -305,8 +305,8 @@ static const struct termact termacts[MDOC_MAX] = {
};
#ifdef __linux__
-extern size_t strlcpy(char *, const char *, size_t);
-extern size_t strlcat(char *, const char *, size_t);
+extern size_t strlcpy(char *, const char *, size_t);
+extern size_t strlcat(char *, const char *, size_t);
#endif
static int arg_hasattr(int, const struct mdoc_node *);
@@ -325,12 +325,15 @@ static void print_head(struct termp *,
static void print_body(DECL_ARGS);
static void print_foot(struct termp *,
const struct mdoc_meta *);
-static void sanity(const struct mdoc_node *);
int
mdoc_run(struct termp *p, const struct mdoc *m)
{
+ /*
+ * Main output function. When this is called, assume that the
+ * tree is properly formed.
+ */
print_head(p, mdoc_meta(m));
print_body(p, NULL, mdoc_meta(m), mdoc_node(m));
@@ -356,10 +359,6 @@ print_node(DECL_ARGS)
int dochild;
struct termpair npair;
- /* Some quick sanity-checking. */
-
- sanity(node);
-
/* Pre-processing. */
dochild = 1;
@@ -401,6 +400,14 @@ print_foot(struct termp *p, const struct mdoc_meta *meta)
struct tm *tm;
char *buf, *os;
+ /*
+ * Output the footer in new-groff style, that is, three columns
+ * with the middle being the manual date and flanking columns
+ * being the operating system:
+ *
+ * SYSTEM DATE SYSTEM
+ */
+
if (NULL == (buf = malloc(p->rmargin)))
err(1, "malloc");
if (NULL == (os = malloc(p->rmargin)))
@@ -417,30 +424,34 @@ print_foot(struct termp *p, const struct mdoc_meta *meta)
(void)strlcpy(os, meta->os, p->rmargin);
- /*
- * This is /slightly/ different from regular groff output
- * because we don't have page numbers. Print the following:
- *
- * OS MDOCDATE
- */
-
term_vspace(p);
- p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
- p->rmargin = p->maxrmargin - strlen(buf);
p->offset = 0;
+ p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2;
+ p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
term_word(p, os);
term_flushln(p);
+ p->offset = p->rmargin;
+ p->rmargin = p->maxrmargin - strlen(os);
p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
+
+ term_word(p, buf);
+ term_flushln(p);
+
p->offset = p->rmargin;
p->rmargin = p->maxrmargin;
p->flags &= ~TERMP_NOBREAK;
+ p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
- term_word(p, buf);
+ term_word(p, os);
term_flushln(p);
+ p->offset = 0;
+ p->rmargin = p->maxrmargin;
+ p->flags = 0;
+
free(buf);
free(os);
}
@@ -491,9 +502,9 @@ print_head(struct termp *p, const struct mdoc_meta *meta)
term_word(p, title);
term_flushln(p);
- p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
p->offset = p->rmargin;
p->rmargin = p->maxrmargin - strlen(title);
+ p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
term_word(p, buf);
term_flushln(p);
@@ -506,8 +517,8 @@ print_head(struct termp *p, const struct mdoc_meta *meta)
term_word(p, title);
term_flushln(p);
- p->rmargin = p->maxrmargin;
p->offset = 0;
+ p->rmargin = p->maxrmargin;
p->flags &= ~TERMP_NOSPACE;
free(title);
@@ -515,119 +526,6 @@ print_head(struct termp *p, const struct mdoc_meta *meta)
}
-static void
-sanity(const struct mdoc_node *n)
-{
- char *p;
-
- p = "regular form violated";
-
- switch (n->type) {
- case (MDOC_TEXT):
- if (n->child)
- errx(1, p);
- if (NULL == n->parent)
- errx(1, p);
- if (NULL == n->string)
- errx(1, p);
- switch (n->parent->type) {
- case (MDOC_TEXT):
- /* FALLTHROUGH */
- case (MDOC_ROOT):
- errx(1, p);
- /* NOTREACHED */
- default:
- break;
- }
- break;
- case (MDOC_ELEM):
- if (NULL == n->parent)
- errx(1, p);
- switch (n->parent->type) {
- case (MDOC_TAIL):
- /* FALLTHROUGH */
- case (MDOC_BODY):
- /* FALLTHROUGH */
- case (MDOC_HEAD):
- break;
- default:
- errx(1, p);
- /* NOTREACHED */
- }
- if (n->child) switch (n->child->type) {
- case (MDOC_TEXT):
- break;
- default:
- errx(1, p);
- /* NOTREACHED */
- }
- break;
- case (MDOC_HEAD):
- /* FALLTHROUGH */
- case (MDOC_BODY):
- /* FALLTHROUGH */
- case (MDOC_TAIL):
- if (NULL == n->parent)
- errx(1, p);
- if (MDOC_BLOCK != n->parent->type)
- errx(1, p);
- if (n->child) switch (n->child->type) {
- case (MDOC_BLOCK):
- /* FALLTHROUGH */
- case (MDOC_ELEM):
- /* FALLTHROUGH */
- case (MDOC_TEXT):
- break;
- default:
- errx(1, p);
- /* NOTREACHED */
- }
- break;
- case (MDOC_BLOCK):
- if (NULL == n->parent)
- errx(1, p);
- if (NULL == n->child)
- errx(1, p);
- switch (n->parent->type) {
- case (MDOC_ROOT):
- /* FALLTHROUGH */
- case (MDOC_HEAD):
- /* FALLTHROUGH */
- case (MDOC_BODY):
- /* FALLTHROUGH */
- case (MDOC_TAIL):
- break;
- default:
- errx(1, p);
- /* NOTREACHED */
- }
- switch (n->child->type) {
- case (MDOC_ROOT):
- /* FALLTHROUGH */
- case (MDOC_ELEM):
- errx(1, p);
- /* NOTREACHED */
- default:
- break;
- }
- break;
- case (MDOC_ROOT):
- if (n->parent)
- errx(1, p);
- if (NULL == n->child)
- errx(1, p);
- switch (n->child->type) {
- case (MDOC_BLOCK):
- break;
- default:
- errx(1, p);
- /* NOTREACHED */
- }
- break;
- }
-}
-
-
static size_t
arg_width(const struct mdoc_argv *arg, int pos)
{