diff options
Diffstat (limited to 'ml.c')
-rw-r--r-- | ml.c | 162 |
1 files changed, 33 insertions, 129 deletions
@@ -21,164 +21,68 @@ #include "libmdocml.h" #include "private.h" +#include "ml.h" +#ifdef __linux__ +extern size_t strlcat(char *, const char *, size_t); +extern size_t strlcpy(char *, const char *, size_t); +#endif -#define MAXINDENT 8 -static ssize_t ml_puts(struct md_mbuf *, const char *); -static ssize_t ml_putchar(struct md_mbuf *, char); -static ssize_t ml_putstring(struct md_mbuf *, const char *); - - -static ssize_t -ml_puts(struct md_mbuf *p, const char *buf) -{ - - return(ml_nputs(p, buf, strlen(buf))); -} - - -static ssize_t -ml_putchar(struct md_mbuf *p, char buf) -{ - - return(ml_nputs(p, &buf, 1)); -} - - -static ssize_t -ml_putstring(struct md_mbuf *p, const char *buf) -{ - - return(ml_nputstring(p, buf, strlen(buf))); -} - - -ssize_t -ml_begintag(struct md_mbuf *p, const char *name, - int *argc, char **argv) -{ - int i; - ssize_t res, sz; - - res = 0; - - if (-1 == (sz = ml_nputs(p, "<", 1))) - return(-1); - res += sz; - - if (-1 == (sz = ml_puts(p, name))) - return(-1); - res += sz; - - for (i = 0; ROFF_ARGMAX != argc[i]; i++) { - if (-1 == (sz = ml_nputs(p, " ", 1))) - return(-1); - res += sz; - - if (-1 == (sz = ml_puts(p, tokargnames[argc[i]]))) - return(-1); - res += sz; - - if (-1 == (sz = ml_nputs(p, "=\"", 2))) - return(-1); - res += sz; - - if (-1 == (sz = ml_putstring(p, argv[i] ? - argv[i] : "true"))) - return(-1); - res += sz; - - if (-1 == (sz = ml_nputs(p, "\"", 1))) - return(-1); - res += sz; - } - - if (-1 == (sz = ml_nputs(p, ">", 1))) - return(-1); - - return(res + sz); -} - - -ssize_t -ml_endtag(struct md_mbuf *p, const char *tag) -{ - ssize_t res, sz; - - res = 0; - - if (-1 == (sz = ml_nputs(p, "</", 2))) - return(-1); - res += sz; - - if (-1 == (sz = ml_puts(p, tag))) - return(-1); - res += sz; - - if (-1 == (sz = ml_nputs(p, ">", 1))) - return(-1); - - return(res + sz); -} - - -ssize_t -ml_nputstring(struct md_mbuf *p, const char *buf, size_t bufsz) +int +ml_nputstring(struct md_mbuf *p, + const char *buf, size_t sz, size_t *pos) { int i; - ssize_t res, sz; - res = 0; - - for (i = 0; i < (int)bufsz; i++) { + for (i = 0; i < (int)sz; i++) { switch (buf[i]) { case ('&'): - if (-1 == (sz = ml_nputs(p, "&", 5))) - return(-1); + if ( ! ml_nputs(p, "&", 5, pos)) + return(0); break; case ('"'): - if (-1 == (sz = ml_nputs(p, """, 6))) - return(-1); + if ( ! ml_nputs(p, """, 6, pos)) + return(0); break; case ('<'): - if (-1 == (sz = ml_nputs(p, "<", 4))) - return(-1); + if ( ! ml_nputs(p, "<", 4, pos)) + return(0); break; case ('>'): - if (-1 == (sz = ml_nputs(p, ">", 4))) - return(-1); + if ( ! ml_nputs(p, ">", 4, pos)) + return(0); break; default: - if (-1 == (sz = ml_putchar(p, buf[i]))) - return(-1); + if ( ! ml_nputs(p, &buf[i], 1, pos)) + return(0); break; } - res += sz; } - return(res); + return(1); } -ssize_t -ml_nputs(struct md_mbuf *p, const char *buf, size_t sz) +int +ml_nputs(struct md_mbuf *p, const char *buf, size_t sz, size_t *pos) { - return(0 == md_buf_puts(p, buf, sz) ? -1 : (ssize_t)sz); + if ( ! md_buf_puts(p, buf, sz)) + return(0); + + *pos += sz; + return(1); } -ssize_t -ml_indent(struct md_mbuf *p, int indent) +int +ml_putchars(struct md_mbuf *p, char buf, size_t count, size_t *pos) { size_t i; - ssize_t res, sz; - res = sz 0; + for (i = 0; i < count; i++) + if ( ! ml_nputs(p, &buf, 1, pos)) + return(0); - /* LINTED */ - for (i = 0; i < MIN(indent, MAXINDENT); i++, res += sz) - if (-1 == (sz = ml_nputs(p, " ", 4))) - return(-1); - return(res); + return(1); } |