version 1.34, 2008/12/02 18:26:57 |
version 1.36, 2008/12/04 11:25:29 |
|
|
/* TODO: (warn) NAME section has particular order. */ |
/* TODO: (warn) NAME section has particular order. */ |
/* TODO: unify empty-content tags a la <br />. */ |
/* TODO: unify empty-content tags a la <br />. */ |
/* TODO: macros with a set number of arguments? */ |
/* TODO: macros with a set number of arguments? */ |
|
/* TODO: validate Dt macro arguments. */ |
|
|
#define ROFF_MAXARG 32 |
#define ROFF_MAXARG 32 |
|
|
Line 134 static int roffcall(struct rofftree *, int, char ** |
|
Line 135 static int roffcall(struct rofftree *, int, char ** |
|
static int roffparse(struct rofftree *, char *); |
static int roffparse(struct rofftree *, char *); |
static int textparse(const struct rofftree *, char *); |
static int textparse(const struct rofftree *, char *); |
|
|
#ifdef __linux__ /* FIXME: remove */ |
#ifdef __linux__ |
static size_t strlcat(char *, const char *, size_t); |
extern size_t strlcat(char *, const char *, size_t); |
static size_t strlcpy(char *, const char *, size_t); |
extern size_t strlcpy(char *, const char *, size_t); |
extern int vsnprintf(char *, size_t, |
extern int vsnprintf(char *, size_t, |
const char *, va_list); |
const char *, va_list); |
extern char *strptime(const char *, const char *, |
extern char *strptime(const char *, const char *, |
Line 1210 roff_Os(ROFFCALL_ARGS) |
|
Line 1211 roff_Os(ROFFCALL_ARGS) |
|
|
|
assert(NULL == tree->last); |
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)); |
} |
} |
|
|
|
|
Line 1227 roff_layout(ROFFCALL_ARGS) |
|
Line 1230 roff_layout(ROFFCALL_ARGS) |
|
return(0); |
return(0); |
} else if (ROFF_EXIT == type) { |
} else if (ROFF_EXIT == type) { |
roffnode_free(tree); |
roffnode_free(tree); |
|
if ( ! (*tree->cb.roffblkbodyout)(tree->arg, tok)) |
|
return(0); |
return((*tree->cb.roffblkout)(tree->arg, tok)); |
return((*tree->cb.roffblkout)(tree->arg, tok)); |
} |
} |
|
|
Line 1248 roff_layout(ROFFCALL_ARGS) |
|
Line 1253 roff_layout(ROFFCALL_ARGS) |
|
if ( ! (*tree->cb.roffblkin)(tree->arg, tok, argcp, argvp)) |
if ( ! (*tree->cb.roffblkin)(tree->arg, tok, argcp, argvp)) |
return(0); |
return(0); |
if (NULL == *argv) |
if (NULL == *argv) |
return(1); |
return((*tree->cb.roffblkbodyin) |
if ( ! (*tree->cb.roffin)(tree->arg, tok, argcp, argvp)) |
(tree->arg, tok, argcp, argvp)); |
|
|
|
if ( ! (*tree->cb.roffblkheadin)(tree->arg, tok, argcp, argvp)) |
return(0); |
return(0); |
|
|
/* |
/* |
Line 1264 roff_layout(ROFFCALL_ARGS) |
|
Line 1271 roff_layout(ROFFCALL_ARGS) |
|
return(0); |
return(0); |
i = 1; |
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)); |
} |
} |
|
|
/* |
/* |
Line 1293 roff_layout(ROFFCALL_ARGS) |
|
Line 1303 roff_layout(ROFFCALL_ARGS) |
|
* macro. |
* macro. |
*/ |
*/ |
|
|
if (NULL == *argv) |
if (NULL == *argv) { |
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)); |
|
} |
|
|
/* |
/* |
* Expensive. Scan to the end of line then work backwards until |
* Expensive. Scan to the end of line then work backwards until |
Line 1304 roff_layout(ROFFCALL_ARGS) |
|
Line 1318 roff_layout(ROFFCALL_ARGS) |
|
if ( ! roffpurgepunct(tree, argv)) |
if ( ! roffpurgepunct(tree, argv)) |
return(0); |
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)); |
} |
} |
|
|
|
|
Line 1445 roff_err(const struct rofftree *tree, const char *pos, |
|
Line 1462 roff_err(const struct rofftree *tree, const char *pos, |
|
ROFF_ERROR, tree->cur, pos, buf); |
ROFF_ERROR, tree->cur, pos, buf); |
} |
} |
|
|
|
|
#ifdef __linux /* FIXME: remove. */ |
|
/* $OpenBSD$ */ |
|
|
|
/* |
|
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> |
|
* |
|
* 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__*/ |
|