]>
git.cameronkatri.com Git - mandoc.git/blob - xml.c
1 /* $Id: xml.c,v 1.20 2008/12/08 12:46:28 kristaps Exp $ */
3 * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
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
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.
23 #include "libmdocml.h"
28 static int xml_alloc(void **);
29 static void xml_free(void *);
30 static ssize_t
xml_endtag(struct md_mbuf
*, void *,
31 const struct md_args
*,
33 static ssize_t
xml_begintag(struct md_mbuf
*, void *,
34 const struct md_args
*,
36 const int *, const char **);
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);
43 static int xml_begin(struct md_mbuf
*,
44 const struct md_args
*,
46 const char *, const char *,
47 enum roffmsec
, const char *);
48 static int xml_end(struct md_mbuf
*,
49 const struct md_args
*);
50 static ssize_t
xml_printtagname(struct md_mbuf
*,
52 static ssize_t
xml_printtagargs(struct md_mbuf
*,
53 const int *, const char **);
57 xml_printtagargs(struct md_mbuf
*mbuf
, const int *argc
,
63 if (NULL
== argc
|| NULL
== argv
)
68 for (res
= 0, i
= 0; ROFF_ARGMAX
!= (c
= argc
[i
]); i
++) {
69 if ( ! ml_nputs(mbuf
, " ", 1, &res
))
72 if ( ! ml_puts(mbuf
, tokargnames
[c
], &res
))
74 if ( ! ml_nputs(mbuf
, "=\"", 2, &res
))
77 if ( ! ml_putstring(mbuf
, argv
[i
], &res
))
79 } else if ( ! ml_nputs(mbuf
, "true", 4, &res
))
81 if ( ! ml_nputs(mbuf
, "\"", 1, &res
))
90 xml_printtagname(struct md_mbuf
*mbuf
, enum md_ns ns
, int tok
)
97 if ( ! ml_nputs(mbuf
, "block:", 6, &res
))
101 if ( ! ml_nputs(mbuf
, "inline:", 7, &res
))
105 if ( ! ml_nputs(mbuf
, "body:", 5, &res
))
109 if ( ! ml_nputs(mbuf
, "head:", 5, &res
))
116 if ( ! ml_puts(mbuf
, toknames
[tok
], &res
))
118 return((ssize_t
)res
);
124 xml_begin(struct md_mbuf
*mbuf
, const struct md_args
*args
,
125 const struct tm
*tm
, const char *os
,
126 const char *title
, enum roffmsec section
,
130 if ( ! ml_puts(mbuf
, "<?xml version=\"1.0\" "
131 "encoding=\"UTF-8\"?>\n", NULL
))
133 return(ml_puts(mbuf
, "<mdoc xmlns:block=\"block\" "
134 "xmlns:body=\"body\" "
135 "xmlns:head=\"head\" "
136 "xmlns:inline=\"inline\">", NULL
));
142 xml_end(struct md_mbuf
*mbuf
, const struct md_args
*args
)
145 return(ml_puts(mbuf
, "</mdoc>", NULL
));
151 xml_beginstring(struct md_mbuf
*mbuf
,
152 const struct md_args
*args
,
153 const char *buf
, size_t sz
)
162 xml_endstring(struct md_mbuf
*mbuf
,
163 const struct md_args
*args
,
164 const char *buf
, size_t sz
)
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
)
179 if (-1 == (res
= xml_printtagname(mbuf
, ns
, tok
)))
181 if (-1 == (sz
= xml_printtagargs(mbuf
, argc
, argv
)))
189 xml_endtag(struct md_mbuf
*mbuf
, void *data
,
190 const struct md_args
*args
, enum md_ns ns
, int tok
)
193 return(xml_printtagname(mbuf
, ns
, tok
));
217 md_line_xml(void *data
, char *buf
)
220 return(mlg_line((struct md_mlg
*)data
, buf
));
225 md_exit_xml(void *data
, int flush
)
228 return(mlg_exit((struct md_mlg
*)data
, flush
));
233 md_init_xml(const struct md_args
*args
,
234 struct md_mbuf
*mbuf
, const struct md_rbuf
*rbuf
)
238 cbs
.ml_alloc
= xml_alloc
;
239 cbs
.ml_free
= xml_free
;
240 cbs
.ml_begintag
= xml_begintag
;
241 cbs
.ml_endtag
= xml_endtag
;
242 cbs
.ml_begin
= xml_begin
;
243 cbs
.ml_end
= xml_end
;
244 cbs
.ml_beginstring
= xml_beginstring
;
245 cbs
.ml_endstring
= xml_endstring
;
247 return(mlg_alloc(args
, rbuf
, mbuf
, &cbs
));