summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-02-25 23:18:50 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-02-25 23:18:50 +0000
commit0aa4f25b79210adba71044d7536f78537c7b1bc9 (patch)
tree7764aa1c6a6fb2d02de72503c7ecab6bc45f2f81
parent5851ee4d2b64ce06c48c8cfb740d681250066ca5 (diff)
downloadmandoc-0aa4f25b79210adba71044d7536f78537c7b1bc9.tar.gz
mandoc-0aa4f25b79210adba71044d7536f78537c7b1bc9.tar.zst
mandoc-0aa4f25b79210adba71044d7536f78537c7b1bc9.zip
More list work.
-rw-r--r--mdocterm.c13
-rw-r--r--term.c218
-rw-r--r--term.h3
3 files changed, 144 insertions, 90 deletions
diff --git a/mdocterm.c b/mdocterm.c
index 9a344639..c0ac1f54 100644
--- a/mdocterm.c
+++ b/mdocterm.c
@@ -1,4 +1,4 @@
-/* $Id: mdocterm.c,v 1.13 2009/02/25 17:02:47 kristaps Exp $ */
+/* $Id: mdocterm.c,v 1.14 2009/02/25 23:18:50 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -91,7 +91,7 @@ main(int argc, char *argv[])
if (NULL == (termp.buf = malloc(termp.maxcols)))
err(1, "malloc");
- header(&termp, mdoc_meta(mdoc));
+ /*header(&termp, mdoc_meta(mdoc));*/
body(&termp, NULL, mdoc_meta(mdoc), mdoc_node(mdoc));
footer(&termp, mdoc_meta(mdoc));
@@ -168,7 +168,7 @@ flushln(struct termp *p)
* the line with TERMP_NOBREAK).
*/
- if (vis && vis + vsz >= maxvis) {
+ if (vis && vis + vsz > maxvis) {
/* FIXME */
if (p->flags & TERMP_NOBREAK)
errx(1, "word breaks right margin");
@@ -176,7 +176,7 @@ flushln(struct termp *p)
for (j = 0; j < p->offset; j++)
putchar(' ');
vis = 0;
- } else if (vis + vsz >= maxvis)
+ } else if (vis + vsz > maxvis)
/* FIXME */
errx(1, "word breaks right margin");
@@ -203,8 +203,9 @@ flushln(struct termp *p)
*/
if (p->flags & TERMP_NOBREAK) {
- for ( ; vis < maxvis; vis++)
- putchar(' ');
+ if ( ! (p->flags & TERMP_NORPAD))
+ for ( ; vis < maxvis; vis++)
+ putchar(' ');
} else
putchar('\n');
diff --git a/term.c b/term.c
index 8d4b3dbd..22471e92 100644
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/* $Id: term.c,v 1.22 2009/02/25 17:02:47 kristaps Exp $ */
+/* $Id: term.c,v 1.23 2009/02/25 23:18:50 kristaps Exp $ */
/*
* Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -17,6 +17,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
#include <assert.h>
+#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -350,8 +351,8 @@ termp_it_pre(DECL_ARGS)
{
const struct mdoc_node *n, *it;
const struct mdoc_block *bl;
- char buf[7];
- int i;
+ char buf[7], *tp;
+ int i, type;
size_t width, offset;
switch (node->type) {
@@ -378,79 +379,151 @@ termp_it_pre(DECL_ARGS)
return(1);
}
+ /* Get our list type. */
+
+ for (i = 0; i < (int)bl->argc; i++)
+ switch (bl->argv[i].arg) {
+ case (MDOC_Bullet):
+ /* FALLTHROUGH */
+ case (MDOC_Dash):
+ /* FALLTHROUGH */
+ case (MDOC_Enum):
+ /* FALLTHROUGH */
+ case (MDOC_Hyphen):
+ /* FALLTHROUGH */
+ case (MDOC_Item):
+ /* FALLTHROUGH */
+ case (MDOC_Tag):
+ /* FALLTHROUGH */
+ case (MDOC_Ohang):
+ type = bl->argv[i].arg;
+ i = (int)bl->argc;
+ break;
+ case (MDOC_Inset):
+ /* FALLTHROUGH */
+ case (MDOC_Hang):
+ /* FALLTHROUGH */
+ case (MDOC_Diag):
+ /* FALLTHROUGH */
+ case (MDOC_Column):
+ errx(1, "list type not supported");
+ /* NOTREACHED */
+ default:
+ break;
+ }
+
+ /* Save our existing (inherited) margin and offset. */
+
pair->offset = p->offset;
pair->rmargin = p->rmargin;
+ /* Get list width and offset. */
+
/* FIXME: auto-size. */
i = arg_getattr(MDOC_Width, bl->argc, bl->argv);
- width = i >= 0 ? arg_width(&bl->argv[i]) : 10;
+ width = i >= 0 ? arg_width(&bl->argv[i]) : 0;
i = arg_getattr(MDOC_Offset, bl->argc, bl->argv);
offset = i >= 0 ? arg_offset(&bl->argv[i]) : 0;
- assert(MDOC_HEAD == node->type ||
- MDOC_BODY == node->type);
+ /* Override the width. */
- if (arg_hasattr(MDOC_Tag, bl->argc, bl->argv)) {
- p->flags |= TERMP_NOSPACE;
- if (MDOC_BODY == node->type) {
- p->flags |= TERMP_NOLPAD;
- p->offset += width;
- } else {
- p->flags |= TERMP_NOBREAK;
- p->rmargin = p->offset + offset + width;
- }
-
- } else if (arg_hasattr(MDOC_Ohang, bl->argc, bl->argv)) {
- p->flags |= TERMP_NOSPACE;
+ switch (type) {
+ case (MDOC_Bullet):
+ /* FALLTHROUGH */
+ case (MDOC_Dash):
+ /* FALLTHROUGH */
+ case (MDOC_Enum):
+ /* FALLTHROUGH */
+ case (MDOC_Hyphen):
+ width = width > 6 ? width : 6;
+ break;
+ case (MDOC_Tag):
+ if (0 == width)
+ errx(1, "need non-zero -width");
+ break;
+ default:
+ break;
+ }
- } else if (arg_hasattr(MDOC_Diag, bl->argc, bl->argv)) {
- /* TODO. */
+ /* Word-wrap control. */
- } else if (arg_hasattr(MDOC_Hang, bl->argc, bl->argv)) {
- /* TODO. */
+ p->flags |= TERMP_NOSPACE;
- } else if (arg_hasattr(MDOC_Bullet, bl->argc, bl->argv)) {
- p->flags |= TERMP_NOSPACE;
- if (MDOC_BODY == node->type) {
- p->flags |= TERMP_NOLPAD;
- p->offset += 6;
- } else {
- word(p, "\\[bu]");
+ switch (type) {
+ case (MDOC_Bullet):
+ /* FALLTHROUGH */
+ case (MDOC_Dash):
+ /* FALLTHROUGH */
+ case (MDOC_Enum):
+ /* FALLTHROUGH */
+ case (MDOC_Hyphen):
+ /* FALLTHROUGH */
+ case (MDOC_Tag):
+ if (MDOC_HEAD == node->type)
p->flags |= TERMP_NOBREAK;
- p->rmargin = p->offset + offset + 6;
- }
-
- } else if (arg_hasattr(MDOC_Enum, bl->argc, bl->argv)) {
- p->flags |= TERMP_NOSPACE;
- if (MDOC_BODY == node->type) {
+ else if (MDOC_BODY == node->type)
p->flags |= TERMP_NOLPAD;
- p->offset += 6;
- } else {
+ break;
+ case (MDOC_Ohang):
+ break;
+ }
+
+ /*
+ * Get a token to use as the HEAD lead-in. If NULL, we use the
+ * HEAD child.
+ */
+
+ tp = NULL;
+ if (MDOC_HEAD == node->type) {
+ if (arg_hasattr(MDOC_Bullet, bl->argc, bl->argv))
+ tp = "\\[bu]";
+ if (arg_hasattr(MDOC_Dash, bl->argc, bl->argv))
+ tp = "\\-";
+ if (arg_hasattr(MDOC_Enum, bl->argc, bl->argv)) {
(pair->ppair->ppair->count)++;
(void)snprintf(buf, sizeof(buf), "%d.",
pair->ppair->ppair->count);
- word(p, buf);
- p->flags |= TERMP_NOBREAK;
- p->rmargin = p->offset + offset + 6;
+ tp = buf;
}
+ if (arg_hasattr(MDOC_Hyphen, bl->argc, bl->argv))
+ tp = "\\-";
+ if (arg_hasattr(MDOC_Item, bl->argc, bl->argv))
+ tp = "";
+ }
- } else if (arg_hasattr(MDOC_Dash, bl->argc, bl->argv) ||
- arg_hasattr(MDOC_Hyphen, bl->argc, bl->argv)) {
- p->flags |= TERMP_NOSPACE;
- if (MDOC_BODY == node->type) {
- p->flags |= TERMP_NOLPAD;
- p->offset += 6;
- return(1);
- } else {
- word(p, "\\-");
- p->flags |= TERMP_NOBREAK;
- p->rmargin = p->offset + offset + 6;
- }
- }
+ /* Margin control. */
p->offset += offset;
- return(1);
+
+ switch (type) {
+ case (MDOC_Bullet):
+ /* FALLTHROUGH */
+ case (MDOC_Dash):
+ /* FALLTHROUGH */
+ case (MDOC_Enum):
+ /* FALLTHROUGH */
+ case (MDOC_Hyphen):
+ /* FALLTHROUGH */
+ case (MDOC_Item):
+ /* FALLTHROUGH */
+ case (MDOC_Tag):
+ if (MDOC_HEAD == node->type)
+ p->rmargin = p->offset + width;
+ else if (MDOC_BODY == node->type)
+ p->offset += width;
+ break;
+ case (MDOC_Ohang):
+ break;
+ }
+
+ if (NULL == tp)
+ return(1);
+
+ /* XXX - ignoring children. */
+
+ word(p, tp);
+ return(0);
}
@@ -458,41 +531,20 @@ termp_it_pre(DECL_ARGS)
static void
termp_it_post(DECL_ARGS)
{
- const struct mdoc_node *n, *it;
- const struct mdoc_block *bl;
if (MDOC_BODY != node->type && MDOC_HEAD != node->type)
return;
- it = node->parent;
- n = it->parent->parent;
- bl = &n->data.block;
-
- if (arg_hasattr(MDOC_Tag, bl->argc, bl->argv) ||
- arg_hasattr(MDOC_Bullet, bl->argc, bl->argv) ||
- arg_hasattr(MDOC_Dash, bl->argc, bl->argv) ||
- arg_hasattr(MDOC_Enum, bl->argc, bl->argv) ||
- arg_hasattr(MDOC_Hyphen, bl->argc, bl->argv)) {
- flushln(p);
- if (MDOC_HEAD == node->type) {
- p->rmargin = pair->rmargin;
- p->flags &= ~TERMP_NOBREAK;
- } else
- p->flags &= ~TERMP_NOLPAD;
-
- } else if (arg_hasattr(MDOC_Ohang, bl->argc, bl->argv)) {
- flushln(p);
-
- } else if (arg_hasattr(MDOC_Inset, bl->argc, bl->argv)) {
- if (MDOC_BODY == node->type)
- flushln(p);
-
- } else if (arg_hasattr(MDOC_Item, bl->argc, bl->argv)) {
- if (MDOC_BODY == node->type)
- flushln(p);
- }
+ flushln(p);
p->offset = pair->offset;
+ p->rmargin = pair->rmargin;
+
+ if (MDOC_HEAD == node->type) {
+ p->flags &= ~TERMP_NOBREAK;
+ p->flags &= ~TERMP_NORPAD;
+ } else if (MDOC_BODY == node->type)
+ p->flags &= ~TERMP_NOLPAD;
}
diff --git a/term.h b/term.h
index fcf45e40..22fddd18 100644
--- a/term.h
+++ b/term.h
@@ -1,4 +1,4 @@
-/* $Id: term.h,v 1.10 2009/02/25 17:02:47 kristaps Exp $ */
+/* $Id: term.h,v 1.11 2009/02/25 23:18:50 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -38,6 +38,7 @@ struct termp {
#define TERMP_LITERAL (1 << 5) /* Literal words. */
#define TERMP_IGNDELIM (1 << 6) /* Delims like regulars. */
#define TERMP_NONOSPACE (1 << 7) /* No space (no autounset). */
+#define TERMP_NORPAD (1 << 8) /* No rightpad. */
char *buf;
};