summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-08-10 10:09:51 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-08-10 10:09:51 +0000
commit66aea3d3165da466055fb119f0473eff16715bf9 (patch)
tree7662186923d3a3a3d83d376a8ff7f6b89e386f29
parent35e1c3f65d10cfd5d3827b03c62fee935b498f08 (diff)
downloadmandoc-66aea3d3165da466055fb119f0473eff16715bf9.tar.gz
mandoc-66aea3d3165da466055fb119f0473eff16715bf9.tar.zst
mandoc-66aea3d3165da466055fb119f0473eff16715bf9.zip
Moved indentation size into *term.c files.
Improved handling of libman `IP' macro (still needs work).
-rw-r--r--man_term.c110
-rw-r--r--mdoc_term.c5
-rw-r--r--term.h7
3 files changed, 95 insertions, 27 deletions
diff --git a/man_term.c b/man_term.c
index 8223e9be..1fed4f0d 100644
--- a/man_term.c
+++ b/man_term.c
@@ -1,4 +1,4 @@
-/* $Id: man_term.c,v 1.17 2009/07/24 20:22:24 kristaps Exp $ */
+/* $Id: man_term.c,v 1.18 2009/08/10 10:09:51 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -15,6 +15,7 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <assert.h>
+#include <ctype.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
@@ -23,6 +24,9 @@
#include "term.h"
#include "man.h"
+#define INDENT 7
+#define HALFINDENT 3
+
#ifdef __linux__
extern size_t strlcpy(char *, const char *, size_t);
extern size_t strlcat(char *, const char *, size_t);
@@ -90,6 +94,9 @@ static void print_body(DECL_ARGS);
static void print_node(DECL_ARGS);
static void print_foot(struct termp *,
const struct man_meta *);
+static void fmt_block_vspace(struct termp *,
+ const struct man_node *);
+static int arg_width(const struct man_node *);
int
@@ -108,6 +115,51 @@ man_run(struct termp *p, const struct man *m)
}
+static void
+fmt_block_vspace(struct termp *p, const struct man_node *n)
+{
+ term_newln(p);
+
+ if (NULL == n->prev)
+ return;
+
+ if (MAN_SS == n->prev->tok)
+ return;
+ if (MAN_SH == n->prev->tok)
+ return;
+
+ term_vspace(p);
+}
+
+
+static int
+arg_width(const struct man_node *n)
+{
+ int i, len;
+ const char *p;
+
+ assert(MAN_TEXT == n->type);
+ assert(n->string);
+
+ p = n->string;
+
+ if (0 == (len = (int)strlen(p)))
+ return(-1);
+
+ for (i = 0; i < len; i++)
+ if ( ! isdigit((u_char)p[i]))
+ break;
+
+ if (i == len - 1) {
+ if ('n' == p[len - 1] || 'm' == p[len - 1])
+ return(atoi(p));
+ } else if (i == len)
+ return(atoi(p));
+
+ return(-1);
+}
+
+
/* ARGSUSED */
static int
pre_I(DECL_ARGS)
@@ -278,7 +330,9 @@ pre_PP(DECL_ARGS)
{
term_vspace(p);
+ term_vspace(p);
p->offset = INDENT;
+ p->flags |= TERMP_NOSPACE;
return(0);
}
@@ -287,32 +341,48 @@ pre_PP(DECL_ARGS)
static int
pre_IP(DECL_ARGS)
{
-#if 0
const struct man_node *nn;
- size_t offs;
-#endif
+ size_t offs, sv;
+ int ival;
- term_vspace(p);
+ fmt_block_vspace(p, n);
+
+ p->flags |= TERMP_NOSPACE;
+
+ sv = p->offset;
p->offset = INDENT;
-#if 0
- if (NULL == (nn = n->child))
+ if (NULL == n->child)
return(1);
- if (MAN_TEXT != nn->type)
- errx(1, "expected text line argument");
- if (nn->next) {
- if (MAN_TEXT != nn->next->type)
- errx(1, "expected text line argument");
- offs = (size_t)atoi(nn->next->string);
- } else
- offs = strlen(nn->string);
+ p->flags |= TERMP_NOBREAK;
+
+ offs = sv;
+
+ /*
+ * If the last token is number-looking (3m, 3n, 3) then
+ * interpret it as the width specifier, else we stick with the
+ * prior saved offset. XXX - obviously not documented.
+ */
+ for (nn = n->child; nn; nn = nn->next) {
+ if (NULL == nn->next) {
+ ival = arg_width(nn);
+ if (ival >= 0) {
+ offs = (size_t)ival;
+ break;
+ }
+ }
+ print_node(p, nn, m);
+ }
- p->flags |= TERMP_NOSPACE;
- /* FIXME */
- if ((p->offset += offs) > p->rmargin)
- errx(1, "line too long");
-#endif
+ p->rmargin = p->offset + offs;
+
+ term_flushln(p);
+
+ p->offset = offs;
+ p->rmargin = p->maxrmargin;
+
+ p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
return(0);
}
diff --git a/mdoc_term.c b/mdoc_term.c
index a274079e..52d770b8 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_term.c,v 1.65 2009/07/29 09:02:41 kristaps Exp $ */
+/* $Id: mdoc_term.c,v 1.66 2009/08/10 10:09:51 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -26,6 +26,9 @@
#include "term.h"
#include "mdoc.h"
+#define INDENT 5
+#define HALFINDENT 3
+
/* FIXME: macro arguments can be escaped. */
#define TTYPE_PROG 0
diff --git a/term.h b/term.h
index 9b3a33b8..6cc77dae 100644
--- a/term.h
+++ b/term.h
@@ -1,4 +1,4 @@
-/* $Id: term.h,v 1.43 2009/07/27 12:02:49 kristaps Exp $ */
+/* $Id: term.h,v 1.44 2009/08/10 10:09:51 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -17,11 +17,6 @@
#ifndef TERM_H
#define TERM_H
-/* FIXME - clean up tabs. */
-
-#define INDENT 5
-#define HALFINDENT 3
-
__BEGIN_DECLS
enum termenc {