From: kristaps@mdocml.bsd.lv
To: source@mdocml.bsd.lv
Subject: mdocml: Allow -width for lists to be cached in mdoc_bl.
Date: Sun, 13 Jun 2010 17:02:49 -0400 (EDT) [thread overview]
Message-ID: <201006132102.o5DL2n6N013595@krisdoz.my.domain> (raw)
Log Message:
-----------
Allow -width for lists to be cached in mdoc_bl. This requires some
trickery because widths may be on-the-fly recalculated. I don't like
how these are split between mdoc_action.c and mdoc_validate.c, but for
the time being, it'll do.
Modified Files:
--------------
mdocml:
mdoc.h
mdoc_action.c
mdoc_term.c
mdoc_validate.c
Revision Data
-------------
Index: mdoc_validate.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v
retrieving revision 1.98
retrieving revision 1.99
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.98 -r1.99
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -532,8 +532,8 @@ pre_display(PRE_ARGS)
static int
pre_bl(PRE_ARGS)
{
- int i, width, comp, dup;
- const char *offs;
+ int i, comp, dup;
+ const char *offs, *width;
enum mdoc_list lt;
if (MDOC_BLOCK != n->type) {
@@ -553,13 +553,12 @@ pre_bl(PRE_ARGS)
*/
assert(LIST__NONE == n->data.Bl.type);
- width = -1;
/* LINTED */
for (i = 0; n->args && i < (int)n->args->argc; i++) {
lt = LIST__NONE;
dup = comp = 0;
- offs = NULL;
+ width = offs = NULL;
switch (n->args->argv[i].arg) {
/* Set list types. */
case (MDOC_Bullet):
@@ -601,15 +600,14 @@ pre_bl(PRE_ARGS)
comp = 1;
break;
case (MDOC_Width):
- if (width >= 0)
- dup++;
- width = i;
+ dup = (NULL != n->data.Bl.width);
+ width = n->args->argv[i].value[0];
break;
case (MDOC_Offset):
/* NB: this can be empty! */
if (n->args->argv[i].sz) {
offs = n->args->argv[i].value[0];
- dup = (NULL != n->data.Bd.offs);
+ dup = (NULL != n->data.Bl.offs);
break;
}
if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV))
@@ -626,6 +624,8 @@ pre_bl(PRE_ARGS)
n->data.Bl.comp = comp;
if (offs && ! dup)
n->data.Bl.offs = offs;
+ if (width && ! dup)
+ n->data.Bl.width = width;
/* Check: multiple list types. */
@@ -641,7 +641,9 @@ pre_bl(PRE_ARGS)
/* The list type should come first. */
if (n->data.Bl.type == LIST__NONE)
- if (width >= 0 || n->data.Bl.offs || n->data.Bl.comp)
+ if (n->data.Bl.width ||
+ n->data.Bl.offs ||
+ n->data.Bl.comp)
if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_LISTFIRST))
return(0);
@@ -664,7 +666,7 @@ pre_bl(PRE_ARGS)
switch (n->data.Bl.type) {
case (LIST_tag):
- if (width >= 0)
+ if (n->data.Bl.width)
break;
if (mdoc_nmsg(mdoc, n, MANDOCERR_NOWIDTHARG))
break;
@@ -678,7 +680,7 @@ pre_bl(PRE_ARGS)
case (LIST_inset):
/* FALLTHROUGH */
case (LIST_item):
- if (width < 0)
+ if (NULL == n->data.Bl.width)
break;
if (mdoc_nmsg(mdoc, n, MANDOCERR_WIDTHARG))
break;
Index: mdoc_action.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_action.c,v
retrieving revision 1.69
retrieving revision 1.70
diff -Lmdoc_action.c -Lmdoc_action.c -u -p -r1.69 -r1.70
--- mdoc_action.c
+++ mdoc_action.c
@@ -52,8 +52,7 @@ static int post_at(POST_ARGS);
static int post_bl(POST_ARGS);
static int post_bl_head(POST_ARGS);
static int post_bl_tagwidth(POST_ARGS);
-static int post_bl_width(struct mdoc *,
- struct mdoc_node *, int);
+static int post_bl_width(POST_ARGS);
static int post_dd(POST_ARGS);
static int post_display(POST_ARGS);
static int post_dt(POST_ARGS);
@@ -667,19 +666,21 @@ post_bl_tagwidth(POST_ARGS)
* We're guaranteed that a MDOC_Width doesn't already exist.
*/
- nn = n;
- assert(nn->args);
- i = (int)(nn->args->argc)++;
+ assert(n->args);
+ i = (int)(n->args->argc)++;
+
+ n->args->argv = mandoc_realloc(n->args->argv,
+ n->args->argc * sizeof(struct mdoc_argv));
- nn->args->argv = mandoc_realloc(nn->args->argv,
- nn->args->argc * sizeof(struct mdoc_argv));
+ n->args->argv[i].arg = MDOC_Width;
+ n->args->argv[i].line = n->line;
+ n->args->argv[i].pos = n->pos;
+ n->args->argv[i].sz = 1;
+ n->args->argv[i].value = mandoc_malloc(sizeof(char *));
+ n->args->argv[i].value[0] = mandoc_strdup(buf);
- nn->args->argv[i].arg = MDOC_Width;
- nn->args->argv[i].line = n->line;
- nn->args->argv[i].pos = n->pos;
- nn->args->argv[i].sz = 1;
- nn->args->argv[i].value = mandoc_malloc(sizeof(char *));
- nn->args->argv[i].value[0] = mandoc_strdup(buf);
+ /* Set our width! */
+ n->data.Bl.width = n->args->argv[i].value[0];
return(1);
}
@@ -690,33 +691,41 @@ post_bl_tagwidth(POST_ARGS)
* scaling width.
*/
static int
-post_bl_width(struct mdoc *m, struct mdoc_node *n, int pos)
+post_bl_width(POST_ARGS)
{
size_t width;
+ int i;
enum mdoct tok;
char buf[NUMSIZ];
- char *p;
-
- assert(n->args);
- p = n->args->argv[pos].value[0];
/*
* If the value to -width is a macro, then we re-write it to be
* the macro's width as set in share/tmac/mdoc/doc-common.
*/
- if (0 == strcmp(p, "Ds"))
+ if (0 == strcmp(n->data.Bl.width, "Ds"))
width = 6;
- else if (MDOC_MAX == (tok = mdoc_hash_find(p)))
+ else if (MDOC_MAX == (tok = mdoc_hash_find(n->data.Bl.width)))
return(1);
else if (0 == (width = mdoc_macro2len(tok)))
return(mdoc_nmsg(m, n, MANDOCERR_BADWIDTH));
/* The value already exists: free and reallocate it. */
+ assert(n->args);
+
+ for (i = 0; i < (int)n->args->argc; i++)
+ if (MDOC_Width == n->args->argv[i].arg)
+ break;
+
+ assert(i < (int)n->args->argc);
+
snprintf(buf, NUMSIZ, "%zun", width);
- free(n->args->argv[pos].value[0]);
- n->args->argv[pos].value[0] = mandoc_strdup(buf);
+ free(n->args->argv[i].value[0]);
+ n->args->argv[i].value[0] = mandoc_strdup(buf);
+
+ /* Set our width! */
+ n->data.Bl.width = n->args->argv[i].value[0];
return(1);
}
@@ -774,7 +783,8 @@ post_bl_head(POST_ARGS)
static int
post_bl(POST_ARGS)
{
- int i, r, len, width;
+ struct mdoc_node *nn;
+ const char *ww;
if (MDOC_HEAD == n->type)
return(post_bl_head(m, n));
@@ -789,25 +799,27 @@ post_bl(POST_ARGS)
* rewritten into real lengths).
*/
- len = (int)(n->args ? n->args->argc : 0);
-
- width = -1;
-
- for (r = i = 0; i < len; i++) {
- if (MDOC_Tag == n->args->argv[i].arg)
- r |= 1 << 0;
- if (MDOC_Width == n->args->argv[i].arg) {
- width = i;
- r |= 1 << 1;
- }
- }
+ ww = n->data.Bl.width;
- if (r & (1 << 0) && ! (r & (1 << 1))) {
+ if (LIST_tag == n->data.Bl.type && NULL == n->data.Bl.width) {
if ( ! post_bl_tagwidth(m, n))
return(0);
- } else if (r & (1 << 1))
- if ( ! post_bl_width(m, n, width))
+ } else if (NULL != n->data.Bl.width) {
+ if ( ! post_bl_width(m, n))
return(0);
+ } else
+ return(1);
+
+ assert(n->data.Bl.width);
+
+ /* If it has changed, propogate new width to children. */
+
+ if (ww == n->data.Bl.width)
+ return(1);
+
+ for (nn = n->child; nn; nn = nn->next)
+ if (MDOC_Bl == nn->tok)
+ nn->data.Bl.width = n->data.Bl.width;
return(1);
}
@@ -827,7 +839,6 @@ post_pa(POST_ARGS)
np = n;
m->next = MDOC_NEXT_CHILD;
- /* XXX: make into macro value. */
if ( ! mdoc_word_alloc(m, n->line, n->pos, "~"))
return(0);
m->last = np;
Index: mdoc_term.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_term.c,v
retrieving revision 1.152
retrieving revision 1.153
diff -Lmdoc_term.c -Lmdoc_term.c -u -p -r1.152 -r1.153
--- mdoc_term.c
+++ mdoc_term.c
@@ -731,6 +731,7 @@ termp_it_pre(DECL_ARGS)
* handling for column for how this changes.
*/
width = a2width(&bl->args->argv[vals[0]], 0) + 2;
+ assert(bl->data.Bl.width);
break;
}
Index: mdoc.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.h,v
retrieving revision 1.88
retrieving revision 1.89
diff -Lmdoc.h -Lmdoc.h -u -p -r1.88 -r1.89
--- mdoc.h
+++ mdoc.h
@@ -279,6 +279,7 @@ struct mdoc_bd {
};
struct mdoc_bl {
+ const char *width; /* -width */
const char *offs; /* -offset */
enum mdoc_list type; /* -tag, -enum, etc. */
int comp; /* -compact */
--
To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv
reply other threads:[~2010-06-13 21:02 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201006132102.o5DL2n6N013595@krisdoz.my.domain \
--to=kristaps@mdocml.bsd.lv \
--cc=source@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).