Annotation of mandoc/xml.c, Revision 1.13
1.13 ! kristaps 1: /* $Id: xml.c,v 1.12 2008/12/03 21:27:56 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.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
80: xml_begintag(struct md_mbuf *mbuf, const struct md_args *args,
81: enum md_ns ns, int tok,
82: const int *argc, const char **argv)
1.8 kristaps 83: {
1.10 kristaps 84: size_t res;
1.8 kristaps 85:
1.10 kristaps 86: res = 0;
1.6 kristaps 87:
88: switch (ns) {
1.9 kristaps 89: case (MD_NS_BLOCK):
1.10 kristaps 90: if ( ! ml_nputs(mbuf, "block:", 6, &res))
91: return(-1);
1.9 kristaps 92: break;
1.11 kristaps 93: case (MD_NS_BODY):
94: if ( ! ml_nputs(mbuf, "body:", 5, &res))
95: return(-1);
96: break;
97: case (MD_NS_HEAD):
98: if ( ! ml_nputs(mbuf, "head:", 5, &res))
99: return(-1);
100: break;
1.9 kristaps 101: case (MD_NS_INLINE):
1.10 kristaps 102: if ( ! ml_nputs(mbuf, "inline:", 7, &res))
103: return(-1);
1.9 kristaps 104: break;
105: default:
1.11 kristaps 106: break;
1.6 kristaps 107: }
108:
1.12 kristaps 109: if ( ! ml_puts(mbuf, toknames[tok], &res))
1.10 kristaps 110: return(-1);
1.6 kristaps 111:
1.10 kristaps 112: return((ssize_t)res);
1.6 kristaps 113: }
114:
115:
1.12 kristaps 116: /* ARGSUSED */
1.10 kristaps 117: static ssize_t
118: xml_endtag(struct md_mbuf *mbuf, const struct md_args *args,
119: enum md_ns ns, int tok)
1.6 kristaps 120: {
1.9 kristaps 121: size_t res;
1.6 kristaps 122:
1.10 kristaps 123: res = 0;
124:
1.6 kristaps 125: switch (ns) {
1.9 kristaps 126: case (MD_NS_BLOCK):
1.10 kristaps 127: if ( ! ml_nputs(mbuf, "block:", 6, &res))
128: return(-1);
1.9 kristaps 129: break;
130: case (MD_NS_INLINE):
1.10 kristaps 131: if ( ! ml_nputs(mbuf, "inline:", 7, &res))
132: return(-1);
1.9 kristaps 133: break;
1.11 kristaps 134: case (MD_NS_BODY):
135: if ( ! ml_nputs(mbuf, "body:", 5, &res))
136: return(-1);
137: break;
138: case (MD_NS_HEAD):
139: if ( ! ml_nputs(mbuf, "head:", 5, &res))
140: return(-1);
141: break;
1.9 kristaps 142: default:
1.11 kristaps 143: break;
1.6 kristaps 144: }
145:
1.12 kristaps 146: if ( ! ml_puts(mbuf, toknames[tok], &res))
1.10 kristaps 147: return(-1);
1.1 kristaps 148:
1.10 kristaps 149: return((ssize_t)res);
1.1 kristaps 150: }
151:
152:
153: int
1.10 kristaps 154: md_line_xml(void *data, char *buf)
1.1 kristaps 155: {
156:
1.10 kristaps 157: return(mlg_line((struct md_mlg *)data, buf));
1.1 kristaps 158: }
159:
160:
161: int
162: md_exit_xml(void *data, int flush)
163: {
164:
1.10 kristaps 165: return(mlg_exit((struct md_mlg *)data, flush));
1.1 kristaps 166: }
167:
168:
169: void *
170: md_init_xml(const struct md_args *args,
171: struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
172: {
1.9 kristaps 173:
1.11 kristaps 174: return(mlg_alloc(args, rbuf, mbuf, xml_begintag,
175: xml_endtag, xml_begin, xml_end));
1.9 kristaps 176: }
177:
CVSweb