Annotation of mandoc/xml.c, Revision 1.19
1.19 ! kristaps 1: /* $Id: xml.c,v 1.18 2008/12/07 21:30:49 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 *,
47: const char *, 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,
126: const char *title, const char *section,
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:
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