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