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