diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-11-30 12:59:20 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-11-30 12:59:20 +0000 |
commit | a955ef6146dcabdef4d8cb7da75c04f1744d0853 (patch) | |
tree | 6b2897ade8892c24ecfe1ddb55e1aff7f532bcbe /mdoc_action.c | |
parent | 5f6810639ce80dbb325aa84b14193a5b7dbecb34 (diff) | |
download | mandoc-a955ef6146dcabdef4d8cb7da75c04f1744d0853.tar.gz |
Moved all prologue actions from mdoc_action.c into mdoc_validate.c. The
file is now ready for removal.
Diffstat (limited to 'mdoc_action.c')
-rw-r--r-- | mdoc_action.c | 268 |
1 files changed, 5 insertions, 263 deletions
diff --git a/mdoc_action.c b/mdoc_action.c index f458217f..24d7586b 100644 --- a/mdoc_action.c +++ b/mdoc_action.c @@ -32,7 +32,6 @@ #include "libmdoc.h" #include "libmandoc.h" -#define DATESIZ 32 /* * FIXME: this file is deprecated. All future "actions" should be * pushed into mdoc_validate.c. @@ -46,20 +45,11 @@ struct actions { int (*post)(POST_ARGS); }; -static int concat(struct mdoc *, char *, - const struct mdoc_node *, size_t); - -static int post_dd(POST_ARGS); -static int post_dt(POST_ARGS); -static int post_os(POST_ARGS); -static int post_prol(POST_ARGS); -static int post_std(POST_ARGS); - static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Ap */ - { NULL, post_dd }, /* Dd */ - { NULL, post_dt }, /* Dt */ - { NULL, post_os }, /* Os */ + { NULL, NULL }, /* Dd */ + { NULL, NULL }, /* Dt */ + { NULL, NULL }, /* Os */ { NULL, NULL }, /* Sh */ { NULL, NULL }, /* Ss */ { NULL, NULL }, /* Pp */ @@ -78,7 +68,7 @@ static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Dv */ { NULL, NULL }, /* Er */ { NULL, NULL }, /* Ev */ - { NULL, post_std }, /* Ex */ + { NULL, NULL }, /* Ex */ { NULL, NULL }, /* Fa */ { NULL, NULL }, /* Fd */ { NULL, NULL }, /* Fl */ @@ -92,7 +82,7 @@ static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Op */ { NULL, NULL }, /* Ot */ { NULL, NULL }, /* Pa */ - { NULL, post_std }, /* Rv */ + { NULL, NULL }, /* Rv */ { NULL, NULL }, /* St */ { NULL, NULL }, /* Va */ { NULL, NULL }, /* Vt */ @@ -222,251 +212,3 @@ mdoc_action_post(struct mdoc *m) return((*mdoc_actions[m->last->tok].post)(m, m->last)); } - -/* - * Concatenate sibling nodes together. All siblings must be of type - * MDOC_TEXT or an assertion is raised. Concatenation is separated by a - * single whitespace. - */ -static int -concat(struct mdoc *m, char *p, const struct mdoc_node *n, size_t sz) -{ - - assert(sz); - p[0] = '\0'; - for ( ; n; n = n->next) { - assert(MDOC_TEXT == n->type); - /* - * XXX: yes, these can technically be resized, but it's - * highly unlikely that we're going to get here, so let - * it slip for now. - */ - if (strlcat(p, n->string, sz) >= sz) { - mdoc_nmsg(m, n, MANDOCERR_MEM); - return(0); - } - if (NULL == n->next) - continue; - if (strlcat(p, " ", sz) >= sz) { - mdoc_nmsg(m, n, MANDOCERR_MEM); - return(0); - } - } - - return(1); -} - - -/* - * Macros accepting `-std' as an argument have the name of the current - * document (`Nm') filled in as the argument if it's not provided. - */ -static int -post_std(POST_ARGS) -{ - struct mdoc_node *nn; - - if (n->child) - return(1); - if (NULL == m->meta.name) - return(1); - - nn = n; - m->next = MDOC_NEXT_CHILD; - - if ( ! mdoc_word_alloc(m, n->line, n->pos, m->meta.name)) - return(0); - m->last = nn; - return(1); -} - -/* - * Parse out the contents of `Dt'. See in-line documentation for how we - * handle the various fields of this macro. - */ -static int -post_dt(POST_ARGS) -{ - struct mdoc_node *nn; - const char *cp; - - if (m->meta.title) - free(m->meta.title); - if (m->meta.vol) - free(m->meta.vol); - if (m->meta.arch) - free(m->meta.arch); - - m->meta.title = m->meta.vol = m->meta.arch = NULL; - /* Handles: `.Dt' - * --> title = unknown, volume = local, msec = 0, arch = NULL - */ - - if (NULL == (nn = n->child)) { - /* XXX: make these macro values. */ - /* FIXME: warn about missing values. */ - m->meta.title = mandoc_strdup("UNKNOWN"); - m->meta.vol = mandoc_strdup("LOCAL"); - m->meta.msec = mandoc_strdup("1"); - return(post_prol(m, n)); - } - - /* Handles: `.Dt TITLE' - * --> title = TITLE, volume = local, msec = 0, arch = NULL - */ - - m->meta.title = mandoc_strdup - ('\0' == nn->string[0] ? "UNKNOWN" : nn->string); - - if (NULL == (nn = nn->next)) { - /* FIXME: warn about missing msec. */ - /* XXX: make this a macro value. */ - m->meta.vol = mandoc_strdup("LOCAL"); - m->meta.msec = mandoc_strdup("1"); - return(post_prol(m, n)); - } - - /* Handles: `.Dt TITLE SEC' - * --> title = TITLE, volume = SEC is msec ? - * format(msec) : SEC, - * msec = SEC is msec ? atoi(msec) : 0, - * arch = NULL - */ - - cp = mdoc_a2msec(nn->string); - if (cp) { - m->meta.vol = mandoc_strdup(cp); - m->meta.msec = mandoc_strdup(nn->string); - } else if (mdoc_nmsg(m, n, MANDOCERR_BADMSEC)) { - m->meta.vol = mandoc_strdup(nn->string); - m->meta.msec = mandoc_strdup(nn->string); - } else - return(0); - - if (NULL == (nn = nn->next)) - return(post_prol(m, n)); - - /* Handles: `.Dt TITLE SEC VOL' - * --> title = TITLE, volume = VOL is vol ? - * format(VOL) : - * VOL is arch ? format(arch) : - * VOL - */ - - cp = mdoc_a2vol(nn->string); - if (cp) { - free(m->meta.vol); - m->meta.vol = mandoc_strdup(cp); - } else { - /* FIXME: warn about bad arch. */ - cp = mdoc_a2arch(nn->string); - if (NULL == cp) { - free(m->meta.vol); - m->meta.vol = mandoc_strdup(nn->string); - } else - m->meta.arch = mandoc_strdup(cp); - } - - /* Ignore any subsequent parameters... */ - /* FIXME: warn about subsequent parameters. */ - - return(post_prol(m, n)); -} - - -/* - * Set the operating system by way of the `Os' macro. Note that if an - * argument isn't provided and -DOSNAME="\"foo\"" is provided during - * compilation, this value will be used instead of filling in "sysname - * release" from uname(). - */ -static int -post_os(POST_ARGS) -{ - char buf[BUFSIZ]; -#ifndef OSNAME - struct utsname utsname; -#endif - - if (m->meta.os) - free(m->meta.os); - - if ( ! concat(m, buf, n->child, BUFSIZ)) - return(0); - - /* XXX: yes, these can all be dynamically-adjusted buffers, but - * it's really not worth the extra hackery. - */ - - if ('\0' == buf[0]) { -#ifdef OSNAME - if (strlcat(buf, OSNAME, BUFSIZ) >= BUFSIZ) { - mdoc_nmsg(m, n, MANDOCERR_MEM); - return(0); - } -#else /*!OSNAME */ - if (-1 == uname(&utsname)) - return(mdoc_nmsg(m, n, MANDOCERR_UTSNAME)); - - if (strlcat(buf, utsname.sysname, BUFSIZ) >= BUFSIZ) { - mdoc_nmsg(m, n, MANDOCERR_MEM); - return(0); - } - if (strlcat(buf, " ", 64) >= BUFSIZ) { - mdoc_nmsg(m, n, MANDOCERR_MEM); - return(0); - } - if (strlcat(buf, utsname.release, BUFSIZ) >= BUFSIZ) { - mdoc_nmsg(m, n, MANDOCERR_MEM); - return(0); - } -#endif /*!OSNAME*/ - } - - m->meta.os = mandoc_strdup(buf); - return(post_prol(m, n)); -} - -/* - * Parse the date field in `Dd'. - */ -static int -post_dd(POST_ARGS) -{ - char buf[DATESIZ]; - - if (NULL == n->child) { - m->meta.date = time(NULL); - return(post_prol(m, n)); - } - - if ( ! concat(m, buf, n->child, DATESIZ)) - return(0); - - m->meta.date = mandoc_a2time - (MTIME_MDOCDATE | MTIME_CANONICAL, buf); - - if (0 == m->meta.date) { - if ( ! mdoc_nmsg(m, n, MANDOCERR_BADDATE)) - return(0); - m->meta.date = time(NULL); - } - - return(post_prol(m, n)); -} - - -/* - * Remove prologue macros from the document after they're processed. - * The final document uses mdoc_meta for these values and discards the - * originals. - */ -static int -post_prol(POST_ARGS) -{ - - mdoc_node_delete(m, n); - if (m->meta.title && m->meta.date && m->meta.os) - m->flags |= MDOC_PBODY; - return(1); -} |