=================================================================== RCS file: /cvs/mandoc/Attic/mdoc_action.c,v retrieving revision 1.24 retrieving revision 1.32 diff -u -p -r1.24 -r1.32 --- mandoc/Attic/mdoc_action.c 2009/07/07 11:47:17 1.24 +++ mandoc/Attic/mdoc_action.c 2009/07/24 13:18:15 1.32 @@ -1,4 +1,4 @@ -/* $Id: mdoc_action.c,v 1.24 2009/07/07 11:47:17 kristaps Exp $ */ +/* $Id: mdoc_action.c,v 1.32 2009/07/24 13:18:15 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -32,23 +32,23 @@ struct actions { int (*post)(POST_ARGS); }; -static int concat(struct mdoc *, const struct mdoc_node *, - char *, size_t); - static int post_ar(POST_ARGS); +static int post_at(POST_ARGS); static int post_bl(POST_ARGS); static int post_bl_head(POST_ARGS); -static int post_bl_width(POST_ARGS); static int post_bl_tagwidth(POST_ARGS); +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); -static int post_lk(POST_ARGS); +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_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_dl(PRE_ARGS); @@ -89,9 +89,9 @@ const struct actions mdoc_actions[MDOC_MAX] = { { NULL, post_nm }, /* Nm */ { NULL, NULL }, /* Op */ { NULL, NULL }, /* Ot */ - { NULL, NULL }, /* Pa */ + { NULL, post_tilde }, /* Pa */ { NULL, post_std }, /* Rv */ - { NULL, NULL }, /* St */ + { NULL, post_st }, /* St */ { NULL, NULL }, /* Va */ { NULL, NULL }, /* Vt */ { NULL, NULL }, /* Xr */ @@ -109,7 +109,7 @@ const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Ac */ { NULL, NULL }, /* Ao */ { NULL, NULL }, /* Aq */ - { NULL, NULL }, /* At */ + { NULL, post_at }, /* At */ { NULL, NULL }, /* Bc */ { NULL, NULL }, /* Bf */ { NULL, NULL }, /* Bo */ @@ -160,9 +160,9 @@ const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Hf */ { NULL, NULL }, /* Fr */ { NULL, NULL }, /* Ud */ - { NULL, NULL }, /* Lb */ + { NULL, post_lb }, /* Lb */ { NULL, NULL }, /* Lp */ - { NULL, post_lk }, /* Lk */ + { NULL, post_tilde }, /* Lk */ { NULL, NULL }, /* Mt */ { NULL, NULL }, /* Brq */ { NULL, NULL }, /* Bro */ @@ -172,11 +172,15 @@ const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* En */ { NULL, NULL }, /* Dx */ { NULL, NULL }, /* %Q */ + { NULL, NULL }, /* br */ + { NULL, NULL }, /* sp */ }; +static int concat(struct mdoc *, const struct mdoc_node *, + char *, size_t); #ifdef __linux__ -extern size_t strlcat(char *, const char *, size_t); +extern size_t strlcat(char *, const char *, size_t); #endif @@ -290,6 +294,81 @@ post_nm(POST_ARGS) static int +post_lb(POST_ARGS) +{ + const char *p; + char *buf; + size_t sz; + + assert(MDOC_TEXT == m->last->child->type); + p = mdoc_a2lib(m->last->child->string); + if (NULL == p) { + sz = strlen(m->last->child->string) + + 2 + strlen("\\(lqlibrary\\(rq"); + buf = malloc(sz); + if (NULL == buf) + return(mdoc_nerr(m, m->last, EMALLOC)); + (void)snprintf(buf, sz, "library \\(lq%s\\(rq", + m->last->child->string); + free(m->last->child->string); + m->last->child->string = buf; + return(1); + } + + free(m->last->child->string); + m->last->child->string = strdup(p); + if (NULL == m->last->child->string) + return(mdoc_nerr(m, m->last, EMALLOC)); + return(1); +} + + +static int +post_st(POST_ARGS) +{ + const char *p; + + assert(MDOC_TEXT == m->last->child->type); + p = mdoc_a2st(m->last->child->string); + assert(p); + free(m->last->child->string); + m->last->child->string = strdup(p); + if (NULL == m->last->child->string) + return(mdoc_nerr(m, m->last, EMALLOC)); + return(1); +} + + +static int +post_at(POST_ARGS) +{ + struct mdoc_node *n; + const char *p; + + if (m->last->child) { + assert(MDOC_TEXT == m->last->child->type); + p = mdoc_a2att(m->last->child->string); + assert(p); + free(m->last->child->string); + m->last->child->string = strdup(p); + if (NULL == m->last->child->string) + return(mdoc_nerr(m, m->last, EMALLOC)); + return(1); + } + + n = m->last; + m->next = MDOC_NEXT_CHILD; + + if ( ! mdoc_word_alloc(m, n->line, n->pos, "AT&T UNIX")) + return(0); + + m->last = n; + m->next = MDOC_NEXT_SIBLING; + return(1); +} + + +static int post_sh(POST_ARGS) { enum mdoc_sec sec; @@ -656,7 +735,7 @@ post_bl(POST_ARGS) static int -post_lk(POST_ARGS) +post_tilde(POST_ARGS) { struct mdoc_node *n; @@ -666,9 +745,8 @@ post_lk(POST_ARGS) n = m->last; m->next = MDOC_NEXT_CHILD; - /* XXX: this isn't documented anywhere! */ - if ( ! mdoc_word_alloc(m, m->last->line, - m->last->pos, "~")) + /* XXX: not documented for `Lk'. */ + if ( ! mdoc_word_alloc(m, m->last->line, m->last->pos, "~")) return(0); m->last = n; @@ -687,12 +765,10 @@ post_ar(POST_ARGS) n = m->last; m->next = MDOC_NEXT_CHILD; - if ( ! mdoc_word_alloc(m, m->last->line, - m->last->pos, "file")) + if ( ! mdoc_word_alloc(m, m->last->line, m->last->pos, "file")) return(0); m->next = MDOC_NEXT_SIBLING; - if ( ! mdoc_word_alloc(m, m->last->line, - m->last->pos, "...")) + if ( ! mdoc_word_alloc(m, m->last->line, m->last->pos, "...")) return(0); m->last = n; @@ -769,7 +845,12 @@ pre_bd(PRE_ARGS) if (MDOC_BODY != n->type) return(1); - /* Enter literal context if `Bd -literal' or * -unfilled'. */ + /* 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)