Annotation of mandoc/xml.c, Revision 1.24
1.24 ! kristaps 1: /* $Id: xml.c,v 1.23 2008/12/10 10:43:57 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.15 kristaps 29: static ssize_t xml_endtag(struct md_mbuf *, void *,
1.10 kristaps 30: const struct md_args *,
31: enum md_ns, int);
1.15 kristaps 32: static ssize_t xml_begintag(struct md_mbuf *, void *,
1.10 kristaps 33: const struct md_args *,
34: enum md_ns, int,
35: const int *, const char **);
1.18 kristaps 36: static ssize_t xml_beginstring(struct md_mbuf *,
37: const struct md_args *,
38: const char *, size_t);
39: static ssize_t xml_endstring(struct md_mbuf *,
40: const struct md_args *,
41: const char *, size_t);
1.13 kristaps 42: static int xml_begin(struct md_mbuf *,
43: const struct md_args *,
44: const struct tm *,
45: const char *, const char *,
1.23 kristaps 46: enum roffmsec, enum roffvol);
1.24 ! kristaps 47: static int xml_end(struct md_mbuf *,
! 48: const struct md_args *,
! 49: const struct tm *,
! 50: const char *, const char *,
! 51: enum roffmsec, enum roffvol);
1.16 kristaps 52: static ssize_t xml_printtagname(struct md_mbuf *,
53: enum md_ns, int);
54: static ssize_t xml_printtagargs(struct md_mbuf *,
55: const int *, const char **);
1.11 kristaps 56:
57:
1.16 kristaps 58: static ssize_t
59: xml_printtagargs(struct md_mbuf *mbuf, const int *argc,
60: const char **argv)
1.11 kristaps 61: {
1.16 kristaps 62: int i, c;
1.11 kristaps 63: size_t res;
64:
1.16 kristaps 65: if (NULL == argc || NULL == argv)
1.11 kristaps 66: return(0);
1.16 kristaps 67: assert(argc && argv);
1.11 kristaps 68:
1.17 kristaps 69: /* LINTED */
1.16 kristaps 70: for (res = 0, i = 0; ROFF_ARGMAX != (c = argc[i]); i++) {
71: if ( ! ml_nputs(mbuf, " ", 1, &res))
72: return(-1);
1.11 kristaps 73:
1.22 kristaps 74: /* FIXME: should puke on some, no? */
75:
1.16 kristaps 76: if ( ! ml_puts(mbuf, tokargnames[c], &res))
77: return(-1);
78: if ( ! ml_nputs(mbuf, "=\"", 2, &res))
79: return(-1);
80: if (argv[i]) {
81: if ( ! ml_putstring(mbuf, argv[i], &res))
82: return(-1);
83: } else if ( ! ml_nputs(mbuf, "true", 4, &res))
84: return(-1);
85: if ( ! ml_nputs(mbuf, "\"", 1, &res))
86: return(-1);
87: }
1.11 kristaps 88:
1.16 kristaps 89: return((ssize_t)res);
1.11 kristaps 90: }
91:
1.10 kristaps 92:
93: static ssize_t
1.16 kristaps 94: xml_printtagname(struct md_mbuf *mbuf, enum md_ns ns, int tok)
1.8 kristaps 95: {
1.10 kristaps 96: size_t res;
1.8 kristaps 97:
1.10 kristaps 98: res = 0;
1.6 kristaps 99: switch (ns) {
1.9 kristaps 100: case (MD_NS_BLOCK):
1.10 kristaps 101: if ( ! ml_nputs(mbuf, "block:", 6, &res))
102: return(-1);
1.9 kristaps 103: break;
1.16 kristaps 104: case (MD_NS_INLINE):
105: if ( ! ml_nputs(mbuf, "inline:", 7, &res))
106: return(-1);
107: break;
1.11 kristaps 108: case (MD_NS_BODY):
109: if ( ! ml_nputs(mbuf, "body:", 5, &res))
110: return(-1);
111: break;
112: case (MD_NS_HEAD):
113: if ( ! ml_nputs(mbuf, "head:", 5, &res))
114: return(-1);
115: break;
1.9 kristaps 116: default:
1.11 kristaps 117: break;
1.6 kristaps 118: }
119:
1.12 kristaps 120: if ( ! ml_puts(mbuf, toknames[tok], &res))
1.10 kristaps 121: return(-1);
1.16 kristaps 122: return((ssize_t)res);
123: }
124:
125:
126: /* ARGSUSED */
127: static int
128: xml_begin(struct md_mbuf *mbuf, const struct md_args *args,
129: const struct tm *tm, const char *os,
1.23 kristaps 130: const char *title, enum roffmsec sec, enum roffvol vol)
1.16 kristaps 131: {
1.6 kristaps 132:
1.16 kristaps 133: if ( ! ml_puts(mbuf, "<?xml version=\"1.0\" "
134: "encoding=\"UTF-8\"?>\n", NULL))
135: return(0);
136: return(ml_puts(mbuf, "<mdoc xmlns:block=\"block\" "
1.19 kristaps 137: "xmlns:body=\"body\" "
138: "xmlns:head=\"head\" "
1.16 kristaps 139: "xmlns:inline=\"inline\">", NULL));
140: }
141:
142:
143: /* ARGSUSED */
144: static int
1.24 ! kristaps 145: xml_end(struct md_mbuf *mbuf, const struct md_args *args,
! 146: const struct tm *tm, const char *os,
! 147: const char *title, enum roffmsec sec, enum roffvol vol)
1.16 kristaps 148: {
149:
150: return(ml_puts(mbuf, "</mdoc>", NULL));
151: }
152:
153:
154: /* ARGSUSED */
155: static ssize_t
1.18 kristaps 156: xml_beginstring(struct md_mbuf *mbuf,
157: const struct md_args *args,
158: const char *buf, size_t sz)
159: {
160:
161: return(0);
162: }
163:
164:
165: /* ARGSUSED */
166: static ssize_t
167: xml_endstring(struct md_mbuf *mbuf,
168: const struct md_args *args,
169: const char *buf, size_t sz)
170: {
171:
172: return(0);
173: }
174:
175:
176: /* ARGSUSED */
177: static ssize_t
1.16 kristaps 178: xml_begintag(struct md_mbuf *mbuf, void *data,
179: const struct md_args *args, enum md_ns ns,
180: int tok, const int *argc, const char **argv)
181: {
182: ssize_t res, sz;
183:
184: if (-1 == (res = xml_printtagname(mbuf, ns, tok)))
185: return(-1);
186: if (-1 == (sz = xml_printtagargs(mbuf, argc, argv)))
187: return(-1);
188: return(res + sz);
1.6 kristaps 189: }
190:
191:
1.12 kristaps 192: /* ARGSUSED */
1.10 kristaps 193: static ssize_t
1.15 kristaps 194: xml_endtag(struct md_mbuf *mbuf, void *data,
195: const struct md_args *args, enum md_ns ns, int tok)
1.6 kristaps 196: {
197:
1.16 kristaps 198: return(xml_printtagname(mbuf, ns, tok));
199: }
200:
201:
202: /* ARGSUSED */
203: int
204: xml_alloc(void **p)
205: {
206:
1.20 kristaps 207: *p = NULL;
1.16 kristaps 208: return(1);
209: }
1.10 kristaps 210:
1.6 kristaps 211:
1.16 kristaps 212: /* ARGSUSED */
213: void
214: xml_free(void *p)
215: {
1.1 kristaps 216:
1.16 kristaps 217: /* Do nothing. */
1.1 kristaps 218: }
219:
220:
221: int
1.10 kristaps 222: md_line_xml(void *data, char *buf)
1.1 kristaps 223: {
224:
1.10 kristaps 225: return(mlg_line((struct md_mlg *)data, buf));
1.1 kristaps 226: }
227:
228:
229: int
230: md_exit_xml(void *data, int flush)
231: {
232:
1.10 kristaps 233: return(mlg_exit((struct md_mlg *)data, flush));
1.1 kristaps 234: }
235:
236:
237: void *
238: md_init_xml(const struct md_args *args,
239: struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
240: {
1.16 kristaps 241: struct ml_cbs cbs;
242:
243: cbs.ml_alloc = xml_alloc;
244: cbs.ml_free = xml_free;
245: cbs.ml_begintag = xml_begintag;
246: cbs.ml_endtag = xml_endtag;
247: cbs.ml_begin = xml_begin;
248: cbs.ml_end = xml_end;
1.18 kristaps 249: cbs.ml_beginstring = xml_beginstring;
250: cbs.ml_endstring = xml_endstring;
1.9 kristaps 251:
1.16 kristaps 252: return(mlg_alloc(args, rbuf, mbuf, &cbs));
1.9 kristaps 253: }
254:
CVSweb