Annotation of mandoc/xml.c, Revision 1.12
1.12 ! kristaps 1: /* $Id: xml.c,v 1.11 2008/12/03 19:21:58 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: */
19: #include <stdlib.h>
20: #include <string.h>
21:
22: #include "libmdocml.h"
23: #include "private.h"
1.10 kristaps 24: #include "ml.h"
1.9 kristaps 25:
1.6 kristaps 26:
1.10 kristaps 27: static ssize_t xml_endtag(struct md_mbuf *,
28: const struct md_args *,
29: enum md_ns, int);
30: static ssize_t xml_begintag(struct md_mbuf *,
31: const struct md_args *,
32: enum md_ns, int,
33: const int *, const char **);
1.11 kristaps 34: static int xml_begin(struct md_mbuf *,
35: const struct md_args *);
36: static int xml_end(struct md_mbuf *,
37: const struct md_args *);
38:
39:
1.12 ! kristaps 40: /* ARGSUSED */
1.11 kristaps 41: static int
42: xml_begin(struct md_mbuf *mbuf, const struct md_args *args)
43: {
44: size_t res;
45:
46: if ( ! ml_puts(mbuf, "<?xml version=\"1.0\" "
47: "encoding=\"UTF-8\"?>\n", &res))
48: return(0);
49: if ( ! ml_puts(mbuf, "<mdoc xmlns:block=\"block\" "
50: "xmlns:special=\"special\" "
51: "xmlns:inline=\"inline\">", &res))
52: return(0);
53:
54: return(1);
55: }
56:
57:
1.12 ! kristaps 58: /* ARGSUSED */
1.11 kristaps 59: static int
60: xml_end(struct md_mbuf *mbuf, const struct md_args *args)
61: {
62: size_t res;
63:
64: res = 0;
65: if ( ! ml_puts(mbuf, "</mdoc>", &res))
66: return(0);
67:
68: return(1);
69: }
70:
1.10 kristaps 71:
1.12 ! kristaps 72: /* ARGSUSED */
1.10 kristaps 73: static ssize_t
74: xml_begintag(struct md_mbuf *mbuf, const struct md_args *args,
75: enum md_ns ns, int tok,
76: const int *argc, const char **argv)
1.8 kristaps 77: {
1.10 kristaps 78: size_t res;
1.8 kristaps 79:
1.10 kristaps 80: res = 0;
1.6 kristaps 81:
82: switch (ns) {
1.9 kristaps 83: case (MD_NS_BLOCK):
1.10 kristaps 84: if ( ! ml_nputs(mbuf, "block:", 6, &res))
85: return(-1);
1.9 kristaps 86: break;
1.11 kristaps 87: case (MD_NS_BODY):
88: if ( ! ml_nputs(mbuf, "body:", 5, &res))
89: return(-1);
90: break;
91: case (MD_NS_HEAD):
92: if ( ! ml_nputs(mbuf, "head:", 5, &res))
93: return(-1);
94: break;
1.9 kristaps 95: case (MD_NS_INLINE):
1.10 kristaps 96: if ( ! ml_nputs(mbuf, "inline:", 7, &res))
97: return(-1);
1.9 kristaps 98: break;
99: default:
1.11 kristaps 100: break;
1.6 kristaps 101: }
102:
1.12 ! kristaps 103: if ( ! ml_puts(mbuf, toknames[tok], &res))
1.10 kristaps 104: return(-1);
1.6 kristaps 105:
1.10 kristaps 106: return((ssize_t)res);
1.6 kristaps 107: }
108:
109:
1.12 ! kristaps 110: /* ARGSUSED */
1.10 kristaps 111: static ssize_t
112: xml_endtag(struct md_mbuf *mbuf, const struct md_args *args,
113: enum md_ns ns, int tok)
1.6 kristaps 114: {
1.9 kristaps 115: size_t res;
1.6 kristaps 116:
1.10 kristaps 117: res = 0;
118:
1.6 kristaps 119: switch (ns) {
1.9 kristaps 120: case (MD_NS_BLOCK):
1.10 kristaps 121: if ( ! ml_nputs(mbuf, "block:", 6, &res))
122: return(-1);
1.9 kristaps 123: break;
124: case (MD_NS_INLINE):
1.10 kristaps 125: if ( ! ml_nputs(mbuf, "inline:", 7, &res))
126: return(-1);
1.9 kristaps 127: break;
1.11 kristaps 128: case (MD_NS_BODY):
129: if ( ! ml_nputs(mbuf, "body:", 5, &res))
130: return(-1);
131: break;
132: case (MD_NS_HEAD):
133: if ( ! ml_nputs(mbuf, "head:", 5, &res))
134: return(-1);
135: break;
1.9 kristaps 136: default:
1.11 kristaps 137: break;
1.6 kristaps 138: }
139:
1.12 ! kristaps 140: if ( ! ml_puts(mbuf, toknames[tok], &res))
1.10 kristaps 141: return(-1);
1.1 kristaps 142:
1.10 kristaps 143: return((ssize_t)res);
1.1 kristaps 144: }
145:
146:
147: int
1.10 kristaps 148: md_line_xml(void *data, char *buf)
1.1 kristaps 149: {
150:
1.10 kristaps 151: return(mlg_line((struct md_mlg *)data, buf));
1.1 kristaps 152: }
153:
154:
155: int
156: md_exit_xml(void *data, int flush)
157: {
158:
1.10 kristaps 159: return(mlg_exit((struct md_mlg *)data, flush));
1.1 kristaps 160: }
161:
162:
163: void *
164: md_init_xml(const struct md_args *args,
165: struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
166: {
1.9 kristaps 167:
1.11 kristaps 168: return(mlg_alloc(args, rbuf, mbuf, xml_begintag,
169: xml_endtag, xml_begin, xml_end));
1.9 kristaps 170: }
171:
CVSweb