From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from krisdoz.my.domain (kristaps@localhost [127.0.0.1]) by krisdoz.my.domain (8.14.3/8.14.3) with ESMTP id o5DL2ndD011967 for ; Sun, 13 Jun 2010 17:02:50 -0400 (EDT) Received: (from kristaps@localhost) by krisdoz.my.domain (8.14.3/8.14.3/Submit) id o5DL2n6N013595; Sun, 13 Jun 2010 17:02:49 -0400 (EDT) Date: Sun, 13 Jun 2010 17:02:49 -0400 (EDT) Message-Id: <201006132102.o5DL2n6N013595@krisdoz.my.domain> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: kristaps@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: Allow -width for lists to be cached in mdoc_bl. X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 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