=================================================================== RCS file: /cvs/mandoc/Attic/xml.c,v retrieving revision 1.1 retrieving revision 1.3 diff -u -p -r1.1 -r1.3 --- mandoc/Attic/xml.c 2008/11/30 21:41:35 1.1 +++ mandoc/Attic/xml.c 2008/12/01 09:25:18 1.3 @@ -1,4 +1,4 @@ -/* $Id: xml.c,v 1.1 2008/11/30 21:41:35 kristaps Exp $ */ +/* $Id: xml.c,v 1.3 2008/12/01 09:25:18 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -40,7 +40,8 @@ enum md_tok { MD_BLKOUT, MD_IN, MD_OUT, - MD_TEXT + MD_TEXT, + MD_OVERRIDE }; struct md_xml { @@ -74,6 +75,9 @@ static int mbuf_putstring(struct md_xml *, const char *); static int mbuf_nputstring(struct md_xml *, const char *, size_t); +static int mbuf_puts(struct md_xml *, const char *); +static int mbuf_nputs(struct md_xml *, + const char *, size_t); static int @@ -87,13 +91,49 @@ mbuf_putstring(struct md_xml *p, const char *buf) static int mbuf_nputstring(struct md_xml *p, const char *buf, size_t sz) { + size_t i; + for (i = 0; i < sz; i++) { + switch (buf[i]) { + case ('&'): + if ( ! md_buf_puts(p->mbuf, "&", 5)) + return(0); + p->pos += 5; + break; + case ('"'): + if ( ! md_buf_puts(p->mbuf, """, 6)) + return(0); + p->pos += 6; + break; + default: + if ( ! md_buf_putchar(p->mbuf, buf[i])) + return(0); + p->pos++; + break; + } + } + return(1); +} + + +static int +mbuf_nputs(struct md_xml *p, const char *buf, size_t sz) +{ + p->pos += sz; return(md_buf_puts(p->mbuf, buf, sz)); } static int +mbuf_puts(struct md_xml *p, const char *buf) +{ + + return(mbuf_nputs(p, buf, strlen(buf))); +} + + +static int mbuf_indent(struct md_xml *p) { size_t i; @@ -169,7 +209,7 @@ mbuf_data(struct md_xml *p, int space, char *buf) if ( ! mbuf_indent(p)) return(0); } else if (space) { - if ( ! mbuf_nputstring(p, " ", 1)) + if ( ! mbuf_nputs(p, " ", 1)) return(0); } @@ -253,10 +293,12 @@ roffhead(void *arg) assert(arg); p = (struct md_xml *)arg; - if ( ! mbuf_putstring(p, "\n")) return(0); - if ( ! mbuf_nputstring(p, "", 12)) + if ( ! mbuf_puts(p, "")) return(0); p->indent++; @@ -276,7 +318,7 @@ rofftail(void *arg) if (0 != p->pos && ! mbuf_newline(p)) return(0); - if ( ! mbuf_nputstring(p, "", 13)) + if ( ! mbuf_puts(p, "")) return(0); p->last = MD_BLKOUT; @@ -288,8 +330,19 @@ rofftail(void *arg) static int roffspecial(void *arg, int tok) { + struct md_xml *p; - /* FIXME */ + assert(arg); + p = (struct md_xml *)arg; + + switch (tok) { + case (ROFF_Ns): + p->last = MD_OVERRIDE; + break; + default: + break; + } + return(1); } @@ -311,27 +364,29 @@ roffblkin(void *arg, int tok, int *argc, char **argv) } else if ( ! mbuf_indent(p)) return(0); - if ( ! mbuf_nputstring(p, "<", 1)) + if ( ! mbuf_nputs(p, "<", 1)) return(0); - if ( ! mbuf_nputstring(p, "block:", 6)) + if ( ! mbuf_nputs(p, "block:", 6)) return(0); - if ( ! mbuf_putstring(p, toknames[tok])) + if ( ! mbuf_puts(p, toknames[tok])) return(0); + /* FIXME: xml won't like standards args (e.g., p1003.1-90). */ + for (i = 0; ROFF_ARGMAX != argc[i]; i++) { - if ( ! mbuf_nputstring(p, " ", 1)) + if ( ! mbuf_nputs(p, " ", 1)) return(0); - if ( ! mbuf_putstring(p, tokargnames[argc[i]])) + if ( ! mbuf_puts(p, tokargnames[argc[i]])) return(0); - if ( ! mbuf_nputstring(p, "=\"", 2)) + if ( ! mbuf_nputs(p, "=\"", 2)) return(0); if ( ! mbuf_putstring(p, argv[i] ? argv[i] : "true")) return(0); - if ( ! mbuf_nputstring(p, "\"", 1)) + if ( ! mbuf_nputs(p, "\"", 1)) return(0); } - if ( ! mbuf_nputstring(p, ">", 1)) + if ( ! mbuf_nputs(p, ">", 1)) return(0); p->last = MD_BLKIN; @@ -358,13 +413,13 @@ roffblkout(void *arg, int tok) } else if ( ! mbuf_indent(p)) return(0); - if ( ! mbuf_nputstring(p, "", 1)) + if ( ! mbuf_nputs(p, ">", 1)) return(0); p->last = MD_BLKOUT; @@ -396,7 +451,7 @@ roffin(void *arg, int tok, int *argc, char **argv) case (MD_TEXT): /* FALLTHROUGH */ case (MD_OUT): - if ( ! mbuf_nputstring(p, " ", 1)) + if ( ! mbuf_nputs(p, " ", 1)) return(0); break; default: @@ -407,26 +462,26 @@ roffin(void *arg, int tok, int *argc, char **argv) p->last = MD_IN; - if ( ! mbuf_nputstring(p, "<", 1)) + if ( ! mbuf_nputs(p, "<", 1)) return(0); - if ( ! mbuf_nputstring(p, "inline:", 7)) + if ( ! mbuf_nputs(p, "inline:", 7)) return(0); - if ( ! mbuf_putstring(p, toknames[tok])) + if ( ! mbuf_puts(p, toknames[tok])) return(0); for (i = 0; ROFF_ARGMAX != argc[i]; i++) { - if ( ! mbuf_nputstring(p, " ", 1)) + if ( ! mbuf_nputs(p, " ", 1)) return(0); - if ( ! mbuf_putstring(p, tokargnames[argc[i]])) + if ( ! mbuf_puts(p, tokargnames[argc[i]])) return(0); - if ( ! mbuf_nputstring(p, "=\"", 2)) + if ( ! mbuf_nputs(p, "=\"", 2)) return(0); if ( ! mbuf_putstring(p, argv[i] ? argv[i] : "true")) return(0); - if ( ! mbuf_nputstring(p, "\"", 1)) + if ( ! mbuf_nputs(p, "\"", 1)) return(0); } - return(mbuf_nputstring(p, ">", 1)); + return(mbuf_nputs(p, ">", 1)); } @@ -438,18 +493,20 @@ roffout(void *arg, int tok) assert(arg); p = (struct md_xml *)arg; + /* Continue with a regular out token. */ + if (0 == p->pos && ! mbuf_indent(p)) return(0); p->last = MD_OUT; - if ( ! mbuf_nputstring(p, "", 1)); + return(mbuf_nputs(p, ">", 1)); }