Annotation of mandoc/xml.c, Revision 1.25
1.25 ! kristaps 1: /* $Id: xml.c,v 1.24 2008/12/10 12:05:33 kristaps Exp $ */
1.1 kristaps 2: /*
3: * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the
7: * above copyright notice and this permission notice appear in all
8: * copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11: * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12: * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13: * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14: * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15: * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16: * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17: * PERFORMANCE OF THIS SOFTWARE.
18: */
1.16 kristaps 19: #include <assert.h>
1.1 kristaps 20: #include <stdlib.h>
21: #include <string.h>
22:
23: #include "private.h"
1.10 kristaps 24: #include "ml.h"
1.9 kristaps 25:
1.6 kristaps 26:
1.16 kristaps 27: static int xml_alloc(void **);
28: static void xml_free(void *);
1.25 ! kristaps 29: static ssize_t xml_beginstring(struct ml_args *,
1.18 kristaps 30: const char *, size_t);
1.25 ! kristaps 31: static ssize_t xml_endstring(struct ml_args *,
1.18 kristaps 32: const char *, size_t);
1.25 ! kristaps 33: static int xml_begin(struct ml_args *, const struct tm *,
1.13 kristaps 34: const char *, const char *,
1.23 kristaps 35: enum roffmsec, enum roffvol);
1.25 ! kristaps 36: static int xml_end(struct ml_args *, const struct tm *,
1.24 kristaps 37: const char *, const char *,
38: enum roffmsec, enum roffvol);
1.25 ! kristaps 39: static ssize_t xml_printtagname(struct ml_args *,
1.16 kristaps 40: enum md_ns, int);
1.25 ! kristaps 41: static ssize_t xml_printtagargs(struct ml_args *,
! 42: const int *, const char **);
! 43: static ssize_t xml_endtag(struct ml_args *, enum md_ns, int);
! 44: static ssize_t xml_begintag(struct ml_args *, enum md_ns, int,
1.16 kristaps 45: const int *, const char **);
1.11 kristaps 46:
47:
1.16 kristaps 48: static ssize_t
1.25 ! kristaps 49: xml_printtagargs(struct ml_args *p, const int *argc, const char **argv)
1.11 kristaps 50: {
1.16 kristaps 51: int i, c;
1.11 kristaps 52: size_t res;
53:
1.16 kristaps 54: if (NULL == argc || NULL == argv)
1.11 kristaps 55: return(0);
1.16 kristaps 56: assert(argc && argv);
1.11 kristaps 57:
1.17 kristaps 58: /* LINTED */
1.16 kristaps 59: for (res = 0, i = 0; ROFF_ARGMAX != (c = argc[i]); i++) {
1.25 ! kristaps 60: if ( ! ml_nputs(p->mbuf, " ", 1, &res))
1.16 kristaps 61: return(-1);
1.11 kristaps 62:
1.22 kristaps 63: /* FIXME: should puke on some, no? */
64:
1.25 ! kristaps 65: if ( ! ml_puts(p->mbuf, tokargnames[c], &res))
1.16 kristaps 66: return(-1);
1.25 ! kristaps 67: if ( ! ml_nputs(p->mbuf, "=\"", 2, &res))
1.16 kristaps 68: return(-1);
69: if (argv[i]) {
1.25 ! kristaps 70: if ( ! ml_putstring(p->mbuf, argv[i], &res))
1.16 kristaps 71: return(-1);
1.25 ! kristaps 72: } else if ( ! ml_nputs(p->mbuf, "true", 4, &res))
1.16 kristaps 73: return(-1);
1.25 ! kristaps 74: if ( ! ml_nputs(p->mbuf, "\"", 1, &res))
1.16 kristaps 75: return(-1);
76: }
1.11 kristaps 77:
1.16 kristaps 78: return((ssize_t)res);
1.11 kristaps 79: }
80:
1.10 kristaps 81:
82: static ssize_t
1.25 ! kristaps 83: xml_printtagname(struct ml_args *p, enum md_ns ns, int tok)
1.8 kristaps 84: {
1.10 kristaps 85: size_t res;
1.8 kristaps 86:
1.10 kristaps 87: res = 0;
1.6 kristaps 88: switch (ns) {
1.9 kristaps 89: case (MD_NS_BLOCK):
1.25 ! kristaps 90: if ( ! ml_nputs(p->mbuf, "block:", 6, &res))
1.10 kristaps 91: return(-1);
1.9 kristaps 92: break;
1.16 kristaps 93: case (MD_NS_INLINE):
1.25 ! kristaps 94: if ( ! ml_nputs(p->mbuf, "inline:", 7, &res))
1.16 kristaps 95: return(-1);
96: break;
1.11 kristaps 97: case (MD_NS_BODY):
1.25 ! kristaps 98: if ( ! ml_nputs(p->mbuf, "body:", 5, &res))
1.11 kristaps 99: return(-1);
100: break;
101: case (MD_NS_HEAD):
1.25 ! kristaps 102: if ( ! ml_nputs(p->mbuf, "head:", 5, &res))
1.11 kristaps 103: return(-1);
104: break;
1.9 kristaps 105: default:
1.11 kristaps 106: break;
1.6 kristaps 107: }
108:
1.25 ! kristaps 109: if ( ! ml_puts(p->mbuf, toknames[tok], &res))
1.10 kristaps 110: return(-1);
1.16 kristaps 111: return((ssize_t)res);
112: }
113:
114:
115: /* ARGSUSED */
116: static int
1.25 ! kristaps 117: xml_begin(struct ml_args *p, const struct tm *tm, const char *os,
1.23 kristaps 118: const char *title, enum roffmsec sec, enum roffvol vol)
1.16 kristaps 119: {
1.6 kristaps 120:
1.25 ! kristaps 121: if ( ! ml_puts(p->mbuf, "<?xml version=\"1.0\" "
1.16 kristaps 122: "encoding=\"UTF-8\"?>\n", NULL))
123: return(0);
1.25 ! kristaps 124: return(ml_puts(p->mbuf, "<mdoc xmlns:block=\"block\" "
1.19 kristaps 125: "xmlns:body=\"body\" "
126: "xmlns:head=\"head\" "
1.16 kristaps 127: "xmlns:inline=\"inline\">", NULL));
128: }
129:
130:
131: /* ARGSUSED */
132: static int
1.25 ! kristaps 133: xml_end(struct ml_args *p, const struct tm *tm, const char *os,
1.24 kristaps 134: const char *title, enum roffmsec sec, enum roffvol vol)
1.16 kristaps 135: {
136:
1.25 ! kristaps 137: return(ml_puts(p->mbuf, "</mdoc>", NULL));
1.16 kristaps 138: }
139:
140:
141: /* ARGSUSED */
142: static ssize_t
1.25 ! kristaps 143: xml_beginstring(struct ml_args *p, const char *buf, size_t sz)
1.18 kristaps 144: {
145:
146: return(0);
147: }
148:
149:
150: /* ARGSUSED */
151: static ssize_t
1.25 ! kristaps 152: xml_endstring(struct ml_args *p, const char *buf, size_t sz)
1.18 kristaps 153: {
154:
155: return(0);
156: }
157:
158:
159: /* ARGSUSED */
160: static ssize_t
1.25 ! kristaps 161: xml_begintag(struct ml_args *p, enum md_ns ns,
1.16 kristaps 162: int tok, const int *argc, const char **argv)
163: {
164: ssize_t res, sz;
165:
1.25 ! kristaps 166: if (-1 == (res = xml_printtagname(p, ns, tok)))
1.16 kristaps 167: return(-1);
1.25 ! kristaps 168: if (-1 == (sz = xml_printtagargs(p, argc, argv)))
1.16 kristaps 169: return(-1);
170: return(res + sz);
1.6 kristaps 171: }
172:
173:
1.12 kristaps 174: /* ARGSUSED */
1.10 kristaps 175: static ssize_t
1.25 ! kristaps 176: xml_endtag(struct ml_args *p, enum md_ns ns, int tok)
1.6 kristaps 177: {
178:
1.25 ! kristaps 179: return(xml_printtagname(p, ns, tok));
1.16 kristaps 180: }
181:
182:
183: /* ARGSUSED */
184: int
185: xml_alloc(void **p)
186: {
187:
1.20 kristaps 188: *p = NULL;
1.16 kristaps 189: return(1);
190: }
1.10 kristaps 191:
1.6 kristaps 192:
1.16 kristaps 193: /* ARGSUSED */
194: void
195: xml_free(void *p)
196: {
1.1 kristaps 197:
1.16 kristaps 198: /* Do nothing. */
1.1 kristaps 199: }
200:
201:
202: int
1.10 kristaps 203: md_line_xml(void *data, char *buf)
1.1 kristaps 204: {
205:
1.10 kristaps 206: return(mlg_line((struct md_mlg *)data, buf));
1.1 kristaps 207: }
208:
209:
210: int
211: md_exit_xml(void *data, int flush)
212: {
213:
1.10 kristaps 214: return(mlg_exit((struct md_mlg *)data, flush));
1.1 kristaps 215: }
216:
217:
218: void *
219: md_init_xml(const struct md_args *args,
220: struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
221: {
1.16 kristaps 222: struct ml_cbs cbs;
223:
224: cbs.ml_alloc = xml_alloc;
225: cbs.ml_free = xml_free;
226: cbs.ml_begintag = xml_begintag;
227: cbs.ml_endtag = xml_endtag;
228: cbs.ml_begin = xml_begin;
229: cbs.ml_end = xml_end;
1.18 kristaps 230: cbs.ml_beginstring = xml_beginstring;
231: cbs.ml_endstring = xml_endstring;
1.9 kristaps 232:
1.16 kristaps 233: return(mlg_alloc(args, rbuf, mbuf, &cbs));
1.9 kristaps 234: }
235:
CVSweb