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