=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.33 retrieving revision 1.36 diff -u -p -r1.33 -r1.36 --- mandoc/roff.c 2008/12/02 13:20:24 1.33 +++ mandoc/roff.c 2008/12/04 11:25:29 1.36 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.33 2008/12/02 13:20:24 kristaps Exp $ */ +/* $Id: roff.c,v 1.36 2008/12/04 11:25:29 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -40,6 +40,7 @@ /* TODO: (warn) NAME section has particular order. */ /* TODO: unify empty-content tags a la
. */ /* TODO: macros with a set number of arguments? */ +/* TODO: validate Dt macro arguments. */ #define ROFF_MAXARG 32 @@ -134,9 +135,9 @@ static int roffcall(struct rofftree *, int, char ** static int roffparse(struct rofftree *, char *); static int textparse(const struct rofftree *, char *); -#ifdef __linux__ -static size_t strlcat(char *, const char *, size_t); -static size_t strlcpy(char *, const char *, size_t); +#ifdef __linux__ +extern size_t strlcat(char *, const char *, size_t); +extern size_t strlcpy(char *, const char *, size_t); extern int vsnprintf(char *, size_t, const char *, va_list); extern char *strptime(const char *, const char *, @@ -965,7 +966,7 @@ roff_Dd(ROFFCALL_ARGS) argv++; - if (0 == strcmp(*argv, "$Mdocdate: December 2 2008 $")) { + if (0 == strcmp(*argv, "$Mdocdate: December 4 2008 $")) { t = time(NULL); if (NULL == localtime_r(&t, &tree->tm)) err(1, "localtime_r"); @@ -1210,7 +1211,9 @@ roff_Os(ROFFCALL_ARGS) assert(NULL == tree->last); - return((*tree->cb.roffhead)(tree->arg)); + return((*tree->cb.roffhead)(tree->arg, &tree->tm, + tree->os, tree->title, tree->section, + tree->volume)); } @@ -1227,6 +1230,8 @@ roff_layout(ROFFCALL_ARGS) return(0); } else if (ROFF_EXIT == type) { roffnode_free(tree); + if ( ! (*tree->cb.roffblkbodyout)(tree->arg, tok)) + return(0); return((*tree->cb.roffblkout)(tree->arg, tok)); } @@ -1248,8 +1253,10 @@ roff_layout(ROFFCALL_ARGS) if ( ! (*tree->cb.roffblkin)(tree->arg, tok, argcp, argvp)) return(0); if (NULL == *argv) - return(1); - if ( ! (*tree->cb.roffin)(tree->arg, tok, argcp, argvp)) + return((*tree->cb.roffblkbodyin) + (tree->arg, tok, argcp, argvp)); + + if ( ! (*tree->cb.roffblkheadin)(tree->arg, tok, argcp, argvp)) return(0); /* @@ -1264,7 +1271,10 @@ roff_layout(ROFFCALL_ARGS) return(0); i = 1; } - return((*tree->cb.roffout)(tree->arg, tok)); + if ( ! (*tree->cb.roffblkheadout)(tree->arg, tok)) + return(0); + return((*tree->cb.roffblkbodyin) + (tree->arg, tok, argcp, argvp)); } /* @@ -1293,8 +1303,12 @@ roff_layout(ROFFCALL_ARGS) * macro. */ - if (NULL == *argv) - return((*tree->cb.roffout)(tree->arg, tok)); + if (NULL == *argv) { + if ( ! (*tree->cb.roffblkheadout)(tree->arg, tok)) + return(0); + return((*tree->cb.roffblkbodyin) + (tree->arg, tok, argcp, argvp)); + } /* * Expensive. Scan to the end of line then work backwards until @@ -1304,7 +1318,10 @@ roff_layout(ROFFCALL_ARGS) if ( ! roffpurgepunct(tree, argv)) return(0); - return((*tree->cb.roffout)(tree->arg, tok)); + if ( ! (*tree->cb.roffblkheadout)(tree->arg, tok)) + return(0); + return((*tree->cb.roffblkbodyin) + (tree->arg, tok, argcp, argvp)); } @@ -1445,80 +1462,3 @@ roff_err(const struct rofftree *tree, const char *pos, ROFF_ERROR, tree->cur, pos, buf); } - -#ifdef __linux -/* $OpenBSD: roff.c,v 1.33 2008/12/02 13:20:24 kristaps Exp $ */ - -/* - * Copyright (c) 1998 Todd C. Miller - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ -static size_t -strlcat(char *dst, const char *src, size_t siz) -{ - char *d = dst; - const char *s = src; - size_t n = siz; - size_t dlen; - - /* Find the end of dst and adjust bytes left but don't go past - * end */ - while (n-- != 0 && *d != '\0') - d++; - dlen = d - dst; - n = siz - dlen; - - if (n == 0) - return(dlen + strlen(s)); - while (*s != '\0') { - if (n != 1) { - *d++ = *s; - n--; - } - s++; - } - *d = '\0'; - - return(dlen + (s - src)); /* count does not include NUL */ -} - - -static size_t -strlcpy(char *dst, const char *src, size_t siz) -{ - char *d = dst; - const char *s = src; - size_t n = siz; - - /* Copy as many bytes as will fit */ - if (n != 0) { - while (--n != 0) { - if ((*d++ = *s++) == '\0') - break; - } - } - - /* Not enough room in dst, add NUL and traverse rest of src */ - if (n == 0) { - if (siz != 0) - *d = '\0'; /* NUL-terminate dst */ - while (*s++) - ; - } - - return(s - src - 1); /* count does not include NUL */ -} -#endif /*__linux__*/