=================================================================== RCS file: /cvs/mandoc/Attic/macro.c,v retrieving revision 1.2 retrieving revision 1.5 diff -u -p -r1.2 -r1.5 --- mandoc/Attic/macro.c 2008/12/15 01:54:58 1.2 +++ mandoc/Attic/macro.c 2008/12/17 17:18:38 1.5 @@ -1,4 +1,4 @@ -/* $Id: macro.c,v 1.2 2008/12/15 01:54:58 kristaps Exp $ */ +/* $Id: macro.c,v 1.5 2008/12/17 17:18:38 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -20,60 +20,24 @@ #include #include #include +#include #include "private.h" -#define _C(p) ((const char **)p) +#define _CC(p) ((const char **)p) -static int isdelim(const char *); -static int args_next(struct mdoc *, int, int *, char *, char **); -static int append_text(struct mdoc *, int, int, int, char *[]); -static int append_scoped(struct mdoc *, int, int, int, char *[]); +static int xstrlcat(char *, const char *, size_t); +static int xstrlcpy(char *, const char *, size_t); +static int xstrcmp(const char *, const char *); +static int append_text(struct mdoc *, int, + int, int, char *[]); +static int append_scoped(struct mdoc *, int, + int, int, char *[]); +static int args_next(struct mdoc *, int, + int *, char *, char **); static int -isdelim(const char *p) -{ - - if (0 == *p) - return(0); - if (0 != *(p + 1)) - return(0); - - switch (*p) { - case('{'): - /* FALLTHROUGH */ - case('.'): - /* FALLTHROUGH */ - case(','): - /* FALLTHROUGH */ - case(';'): - /* FALLTHROUGH */ - case(':'): - /* FALLTHROUGH */ - case('?'): - /* FALLTHROUGH */ - case('!'): - /* FALLTHROUGH */ - case('('): - /* FALLTHROUGH */ - case(')'): - /* FALLTHROUGH */ - case('['): - /* FALLTHROUGH */ - case(']'): - /* FALLTHROUGH */ - case('}'): - return(1); - default: - break; - } - - return(0); -} - - -static int args_next(struct mdoc *mdoc, int tok, int *pos, char *buf, char **v) { @@ -118,26 +82,56 @@ args_next(struct mdoc *mdoc, int tok, static int -append_scoped(struct mdoc *mdoc, int tok, int pos, int sz, char *args[]) +append_scoped(struct mdoc *mdoc, int tok, + int pos, int sz, char *args[]) { + enum mdoc_sec sec; + if (0 == sz) + return(mdoc_err(mdoc, tok, pos, ERR_ARGS_GE1)); + + switch (tok) { + /* ======= ADD MORE MACRO CHECKS BELOW. ======= */ + case (MDOC_Sh): + sec = mdoc_atosec((size_t)sz, _CC(args)); + if (SEC_CUSTOM != sec && sec < mdoc->sec_lastn) + if ( ! mdoc_warn(mdoc, tok, pos, WARN_SEC_OO)) + return(0); + + if (SEC_BODY == mdoc->sec_last && SEC_NAME != sec) + return(mdoc_err(mdoc, tok, pos, ERR_SEC_NAME)); + + if (SEC_CUSTOM != sec) + mdoc->sec_lastn = sec; + mdoc->sec_last = sec; + break; + case (MDOC_Ss): + break; + /* ======= ADD MORE MACRO CHECKS ABOVE. ======= */ + default: + abort(); + /* NOTREACHED */ + } + + assert(sz >= 0); args[sz] = NULL; mdoc_block_alloc(mdoc, pos, tok, 0, NULL); - mdoc_head_alloc(mdoc, pos, tok, sz, _C(args)); + mdoc_head_alloc(mdoc, pos, tok, (size_t)sz, _CC(args)); mdoc_body_alloc(mdoc, pos, tok); return(1); } static int -append_text(struct mdoc *mdoc, int tok, int pos, int sz, char *args[]) +append_text(struct mdoc *mdoc, int tok, + int pos, int sz, char *args[]) { + assert(sz >= 0); args[sz] = NULL; switch (tok) { - /* ======= ADD MORE MACRO ARGUMENT-LIMITS BELOW. ======= */ - + /* ======= ADD MORE MACRO CHECKS BELOW. ======= */ case (MDOC_Ft): /* FALLTHROUGH */ case (MDOC_Li): @@ -147,19 +141,17 @@ append_text(struct mdoc *mdoc, int tok, int pos, int s case (MDOC_Pa): /* FALLTHROUGH */ case (MDOC_Tn): - if (0 == sz && ! mdoc_warn(mdoc, tok, pos, WARN_ARGS_GE1)) + if (0 < sz) + break; + if ( ! mdoc_warn(mdoc, tok, pos, WARN_ARGS_GE1)) return(0); - mdoc_elem_alloc(mdoc, pos, tok, 0, NULL, sz, _C(args)); - return(1); - + break; case (MDOC_Ar): /* FALLTHROUGH */ case (MDOC_Cm): /* FALLTHROUGH */ case (MDOC_Fl): - mdoc_elem_alloc(mdoc, pos, tok, 0, NULL, sz, _C(args)); - return(1); - + break; case (MDOC_Ad): /* FALLTHROUGH */ case (MDOC_Em): @@ -177,31 +169,34 @@ append_text(struct mdoc *mdoc, int tok, int pos, int s case (MDOC_Va): /* FALLTHROUGH */ case (MDOC_Vt): - if (0 == sz) - return(mdoc_err(mdoc, tok, pos, ERR_ARGS_GE1)); - mdoc_elem_alloc(mdoc, pos, tok, 0, NULL, sz, _C(args)); - return(1); - - /* ======= ADD MORE MACRO ARGUMENT-LIMITS ABOVE. ======= */ + if (0 < sz) + break; + return(mdoc_err(mdoc, tok, pos, ERR_ARGS_GE1)); + /* ======= ADD MORE MACRO CHECKS ABOVE. ======= */ default: - break; + abort(); + /* NOTREACHED */ } - abort(); - /* NOTREACHED */ + mdoc_elem_alloc(mdoc, pos, tok, 0, + NULL, (size_t)sz, _CC(args)); + return(1); } int -macro_text(struct mdoc *mdoc, int tok, int ppos, int *pos, char *buf) +macro_text(MACRO_PROT_ARGS) { - int lastarg, j, c, lasttok, lastpunct; + int lastarg, c, lasttok, lastpunct, j; char *args[MDOC_LINEARG_MAX], *p; lasttok = ppos; lastpunct = 0; j = 0; + if (SEC_PROLOGUE == mdoc->sec_lastn) + return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE)); + again: lastarg = *pos; @@ -225,7 +220,7 @@ again: /* Word found. */ - if ( ! isdelim(args[j])) { + if ( ! mdoc_isdelim(args[j])) { j++; goto again; } @@ -251,19 +246,132 @@ again: int -macro_scoped_implicit(struct mdoc *mdoc, - int tok, int ppos, int *pos, char *buf) +macro_prologue_dtitle(MACRO_PROT_ARGS) { - int j, c, lastarg, t; + int c, lastarg, j; char *args[MDOC_LINEARG_MAX]; - struct mdoc_node *n; - /* - * Look for an implicit parent. - */ + if (SEC_PROLOGUE != mdoc->sec_lastn) + return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE)); + if (0 == mdoc->meta.date) + return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO)); + if (mdoc->meta.title[0]) + return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP)); + j = -1; + +again: + lastarg = *pos; + c = args_next(mdoc, tok, pos, buf, &args[++j]); + + if (0 == c) { + mdoc->sec_lastn = mdoc->sec_last = SEC_BODY; /* FIXME */ + if (mdoc->meta.title) + return(1); + if ( ! mdoc_warn(mdoc, tok, ppos, WARN_ARGS_GE1)) + return(0); + (void)xstrlcpy(mdoc->meta.title, + "UNTITLED", META_TITLE_SZ); + return(1); + } else if (-1 == c) + return(0); + + if (MDOC_MAX != mdoc_find(mdoc, args[j]) && ! mdoc_warn + (mdoc, tok, lastarg, WARN_SYNTAX_MACLIKE)) + return(0); + + if (0 == j) { + if (xstrlcpy(mdoc->meta.title, args[0], META_TITLE_SZ)) + goto again; + return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGS)); + + } else if (1 == j) { + mdoc->meta.msec = mdoc_atomsec(args[1]); + if (MSEC_DEFAULT != mdoc->meta.msec) + goto again; + return(mdoc_err(mdoc, tok, -1, ERR_SYNTAX_ARGS)); + + } else if (2 == j) { + mdoc->meta.vol = mdoc_atovol(args[2]); + if (VOL_DEFAULT != mdoc->meta.vol) + goto again; + mdoc->meta.arch = mdoc_atoarch(args[2]); + if (ARCH_DEFAULT != mdoc->meta.arch) + goto again; + return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGS)); + } + + return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY)); +} + + +int +macro_prologue_ddate(MACRO_PROT_ARGS) +{ + int c, lastarg, j; + char *args[MDOC_LINEARG_MAX], date[64]; + + if (SEC_PROLOGUE != mdoc->sec_lastn) + return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE)); + if (mdoc->meta.title[0]) + return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO)); + if (mdoc->meta.date) + return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP)); + + j = -1; + date[0] = 0; + +again: + + lastarg = *pos; + c = args_next(mdoc, tok, pos, buf, &args[++j]); + if (0 == c) { + if (mdoc->meta.date) + return(1); + mdoc->meta.date = mdoc_atotime(date); + if (mdoc->meta.date) + return(1); + return(mdoc_err(mdoc, tok, ppos, ERR_SYNTAX_ARGS)); + } else if (-1 == c) + return(0); + + if (MDOC_MAX != mdoc_find(mdoc, args[j]) && ! mdoc_warn + (mdoc, tok, lastarg, WARN_SYNTAX_MACLIKE)) + return(0); + + if (0 == j) { + if (xstrcmp("$Mdocdate: December 17 2008 $", args[j])) { + mdoc->meta.date = time(NULL); + goto again; + } else if (xstrcmp("$Mdocdate:", args[j])) + goto again; + } else if (4 == j) + if ( ! xstrcmp("$", args[j])) + goto again; + + if ( ! xstrlcat(date, args[j], sizeof(date))) + return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGS)); + if ( ! xstrlcat(date, " ", sizeof(date))) + return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGS)); + + goto again; + /* NOTREACHED */ +} + + +int +macro_scoped_implicit(MACRO_PROT_ARGS) +{ + int t, c, lastarg, j; + char *args[MDOC_LINEARG_MAX]; + struct mdoc_node *n; + assert( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)); + if (SEC_PROLOGUE == mdoc->sec_lastn) + return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE)); + + /* LINTED */ for (n = mdoc->last; n; n = n->parent) { if (MDOC_BLOCK != n->type) continue; @@ -297,7 +405,7 @@ again: /* Command found. */ if (MDOC_MAX != (c = mdoc_find(mdoc, args[j]))) - if ( ! mdoc_warn(mdoc, tok, *pos, WARN_SYNTAX_MACLIKE)) + if ( ! mdoc_warn(mdoc, tok, lastarg, WARN_SYNTAX_MACLIKE)) return(0); /* Word found. */ @@ -306,4 +414,28 @@ again: goto again; /* NOTREACHED */ +} + + +static int +xstrcmp(const char *p1, const char *p2) +{ + + return(0 == strcmp(p1, p2)); +} + + +static int +xstrlcat(char *dst, const char *src, size_t sz) +{ + + return(strlcat(dst, src, sz) < sz); +} + + +static int +xstrlcpy(char *dst, const char *src, size_t sz) +{ + + return(strlcpy(dst, src, sz) < sz); }