=================================================================== RCS file: /cvs/mandoc/Attic/mdoc_action.c,v retrieving revision 1.35 retrieving revision 1.44 diff -u -p -r1.35 -r1.44 --- mandoc/Attic/mdoc_action.c 2009/08/20 13:22:48 1.35 +++ mandoc/Attic/mdoc_action.c 2009/10/26 04:09:45 1.44 @@ -1,4 +1,4 @@ -/* $Id: mdoc_action.c,v 1.35 2009/08/20 13:22:48 kristaps Exp $ */ +/* $Id: mdoc_action.c,v 1.44 2009/10/26 04:09:45 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -14,13 +14,16 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifndef OSNAME #include +#endif #include #include #include #include #include +#include #include "libmdoc.h" @@ -32,6 +35,15 @@ struct actions { int (*post)(POST_ARGS); }; +static int concat(struct mdoc *, + const struct mdoc_node *, + char *, size_t); +static inline int order_rs(int); + +#ifdef __linux__ +extern size_t strlcat(char *, const char *, size_t); +#endif + static int post_ar(POST_ARGS); static int post_at(POST_ARGS); static int post_bl(POST_ARGS); @@ -45,15 +57,18 @@ static int post_lb(POST_ARGS); static int post_nm(POST_ARGS); static int post_os(POST_ARGS); static int post_prol(POST_ARGS); +static int post_rs(POST_ARGS); static int post_sh(POST_ARGS); static int post_st(POST_ARGS); static int post_std(POST_ARGS); static int post_tilde(POST_ARGS); static int pre_bd(PRE_ARGS); +static int pre_bl(PRE_ARGS); static int pre_dl(PRE_ARGS); +static int pre_offset(PRE_ARGS); -const struct actions mdoc_actions[MDOC_MAX] = { +static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Ap */ { NULL, post_dd }, /* Dd */ { NULL, post_dt }, /* Dt */ @@ -65,7 +80,7 @@ const struct actions mdoc_actions[MDOC_MAX] = { { pre_dl, post_display }, /* Dl */ { pre_bd, post_display }, /* Bd */ { NULL, NULL }, /* Ed */ - { NULL, post_bl }, /* Bl */ + { pre_bl, post_bl }, /* Bl */ { NULL, NULL }, /* El */ { NULL, NULL }, /* It */ { NULL, NULL }, /* Ad */ @@ -139,7 +154,7 @@ const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Qo */ { NULL, NULL }, /* Qq */ { NULL, NULL }, /* Re */ - { NULL, NULL }, /* Rs */ + { NULL, post_rs }, /* Rs */ { NULL, NULL }, /* Sc */ { NULL, NULL }, /* So */ { NULL, NULL }, /* Sq */ @@ -162,7 +177,7 @@ const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Ud */ { NULL, post_lb }, /* Lb */ { NULL, NULL }, /* Lp */ - { NULL, post_tilde }, /* Lk */ + { NULL, NULL }, /* Lk */ { NULL, NULL }, /* Mt */ { NULL, NULL }, /* Brq */ { NULL, NULL }, /* Bro */ @@ -174,14 +189,26 @@ const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* %Q */ { NULL, NULL }, /* br */ { NULL, NULL }, /* sp */ + { NULL, NULL }, /* %U */ }; -static int concat(struct mdoc *, const struct mdoc_node *, - char *, size_t); +#define RSORD_MAX 13 -#ifdef __linux__ -extern size_t strlcat(char *, const char *, size_t); -#endif +static const int rsord[RSORD_MAX] = { + MDOC__A, + MDOC__T, + MDOC__B, + MDOC__I, + MDOC__J, + MDOC__R, + MDOC__N, + MDOC__V, + MDOC__P, + MDOC__Q, + MDOC__D, + MDOC__O, + MDOC__C +}; int @@ -497,8 +524,16 @@ static int post_os(POST_ARGS) { char buf[64]; +#ifndef OSNAME struct utsname utsname; +#endif + /* + * Setting OSNAME to be the name of the target operating system, + * e.g., "OpenBSD 4.4", will result in the compile-time constant + * by supplied instead of the value in uname(). + */ + if (m->meta.os) free(m->meta.os); @@ -507,6 +542,10 @@ post_os(POST_ARGS) return(0); if (0 == buf[0]) { +#ifdef OSNAME + if (strlcat(buf, OSNAME, 64) >= 64) + return(mdoc_nerr(m, n, EUTSNAME)); +#else if (-1 == uname(&utsname)) return(mdoc_nerr(m, n, EUTSNAME)); if (strlcat(buf, utsname.sysname, 64) >= 64) @@ -515,6 +554,7 @@ post_os(POST_ARGS) return(mdoc_nerr(m, n, ETOOLONG)); if (strlcat(buf, utsname.release, 64) >= 64) return(mdoc_nerr(m, n, ETOOLONG)); +#endif } if (NULL == (m->meta.os = strdup(buf))) @@ -617,7 +657,7 @@ post_bl_width(POST_ARGS) if (0 == strcmp(p, "Ds")) width = 6; - else if (MDOC_MAX == (tok = mdoc_hash_find(m->htab, p))) + else if (MDOC_MAX == (tok = mdoc_hash_find(p))) return(1); else if (0 == (width = mdoc_macro2len(tok))) return(mdoc_nwarn(m, n, ENOWIDTH)); @@ -734,7 +774,6 @@ post_tilde(POST_ARGS) np = n; m->next = MDOC_NEXT_CHILD; - /* XXX: not documented for `Lk'. */ if ( ! mdoc_word_alloc(m, n->line, n->pos, "~")) return(0); m->last = np; @@ -825,29 +864,64 @@ pre_dl(PRE_ARGS) static int +pre_offset(PRE_ARGS) +{ + int i; + + /* + * Make sure that an empty offset produces an 8n length space as + * stipulated by mdoc.samples. + */ + + assert(n->args); + for (i = 0; i < (int)n->args->argc; i++) { + if (MDOC_Offset != n->args->argv[i].arg) + continue; + if (n->args->argv[i].sz) + break; + assert(1 == n->args->refcnt); + /* If no value set, length of . */ + n->args->argv[i].value = + calloc(1, sizeof(char *)); + if (NULL == n->args->argv[i].value) + return(mdoc_nerr(m, n, EMALLOC)); + n->args->argv[i].sz++; + n->args->argv[i].value[0] = strdup("8n"); + if (NULL == n->args->argv[i].value[0]) + return(mdoc_nerr(m, n, EMALLOC)); + break; + } + + return(1); +} + + +static int +pre_bl(PRE_ARGS) +{ + + return(MDOC_BLOCK == n->type ? pre_offset(m, n) : 1); +} + + +static int pre_bd(PRE_ARGS) { int i; + if (MDOC_BLOCK == n->type) + return(pre_offset(m, n)); if (MDOC_BODY != n->type) return(1); /* Enter literal context if `Bd -literal' or `-unfilled'. */ - /* - * TODO: `-offset' without an argument should be the width of - * the literal "". - */ - for (n = n->parent, i = 0; i < (int)n->args->argc; i++) if (MDOC_Literal == n->args->argv[i].arg) - break; + m->flags |= MDOC_LITERAL; else if (MDOC_Unfilled == n->args->argv[i].arg) - break; + m->flags |= MDOC_LITERAL; - if (i < (int)n->args->argc) - m->flags |= MDOC_LITERAL; - return(1); } @@ -862,3 +936,65 @@ post_display(POST_ARGS) } +static inline int +order_rs(int t) +{ + int i; + + for (i = 0; i < RSORD_MAX; i++) + if (rsord[i] == t) + return(i); + + abort(); + /* NOTREACHED */ +} + + +/* ARGSUSED */ +static int +post_rs(POST_ARGS) +{ + struct mdoc_node *nn, *next, *prev; + int o; + + if (MDOC_BLOCK != n->type) + return(1); + + assert(n->body->child); + for (next = NULL, nn = n->body->child->next; nn; nn = next) { + o = order_rs(nn->tok); + + /* Remove `nn' from the chain. */ + next = nn->next; + if (next) + next->prev = nn->prev; + + prev = nn->prev; + if (prev) + prev->next = nn->next; + + nn->prev = nn->next = NULL; + + /* + * Scan back until we reach a node that's ordered before + * us, then set ourselves as being the next. + */ + for ( ; prev; prev = prev->prev) + if (order_rs(prev->tok) <= o) + break; + + nn->prev = prev; + if (prev) { + if (prev->next) + prev->next->prev = nn; + nn->next = prev->next; + prev->next = nn; + continue; + } + + n->body->child->prev = nn; + nn->next = n->body->child; + n->body->child = nn; + } + return(1); +}