]>
git.cameronkatri.com Git - mandoc.git/blob - xml.c
1 /* $Id: xml.c,v 1.22 2008/12/10 00:53:40 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.
27 static int xml_alloc(void **);
28 static void xml_free(void *);
29 static ssize_t
xml_endtag(struct md_mbuf
*, void *,
30 const struct md_args
*,
32 static ssize_t
xml_begintag(struct md_mbuf
*, void *,
33 const struct md_args
*,
35 const int *, const char **);
36 static ssize_t
xml_beginstring(struct md_mbuf
*,
37 const struct md_args
*,
38 const char *, size_t);
39 static ssize_t
xml_endstring(struct md_mbuf
*,
40 const struct md_args
*,
41 const char *, size_t);
42 static int xml_begin(struct md_mbuf
*,
43 const struct md_args
*,
45 const char *, const char *,
46 enum roffmsec
, const char *);
47 static int xml_end(struct md_mbuf
*,
48 const struct md_args
*);
49 static ssize_t
xml_printtagname(struct md_mbuf
*,
51 static ssize_t
xml_printtagargs(struct md_mbuf
*,
52 const int *, const char **);
56 xml_printtagargs(struct md_mbuf
*mbuf
, const int *argc
,
62 if (NULL
== argc
|| NULL
== argv
)
67 for (res
= 0, i
= 0; ROFF_ARGMAX
!= (c
= argc
[i
]); i
++) {
68 if ( ! ml_nputs(mbuf
, " ", 1, &res
))
71 /* FIXME: should puke on some, no? */
73 if ( ! ml_puts(mbuf
, tokargnames
[c
], &res
))
75 if ( ! ml_nputs(mbuf
, "=\"", 2, &res
))
78 if ( ! ml_putstring(mbuf
, argv
[i
], &res
))
80 } else if ( ! ml_nputs(mbuf
, "true", 4, &res
))
82 if ( ! ml_nputs(mbuf
, "\"", 1, &res
))
91 xml_printtagname(struct md_mbuf
*mbuf
, enum md_ns ns
, int tok
)
98 if ( ! ml_nputs(mbuf
, "block:", 6, &res
))
102 if ( ! ml_nputs(mbuf
, "inline:", 7, &res
))
106 if ( ! ml_nputs(mbuf
, "body:", 5, &res
))
110 if ( ! ml_nputs(mbuf
, "head:", 5, &res
))
117 if ( ! ml_puts(mbuf
, toknames
[tok
], &res
))
119 return((ssize_t
)res
);
125 xml_begin(struct md_mbuf
*mbuf
, const struct md_args
*args
,
126 const struct tm
*tm
, const char *os
,
127 const char *title
, enum roffmsec section
,
131 if ( ! ml_puts(mbuf
, "<?xml version=\"1.0\" "
132 "encoding=\"UTF-8\"?>\n", NULL
))
134 return(ml_puts(mbuf
, "<mdoc xmlns:block=\"block\" "
135 "xmlns:body=\"body\" "
136 "xmlns:head=\"head\" "
137 "xmlns:inline=\"inline\">", NULL
));
143 xml_end(struct md_mbuf
*mbuf
, const struct md_args
*args
)
146 return(ml_puts(mbuf
, "</mdoc>", NULL
));
152 xml_beginstring(struct md_mbuf
*mbuf
,
153 const struct md_args
*args
,
154 const char *buf
, size_t sz
)
163 xml_endstring(struct md_mbuf
*mbuf
,
164 const struct md_args
*args
,
165 const char *buf
, size_t sz
)
174 xml_begintag(struct md_mbuf
*mbuf
, void *data
,
175 const struct md_args
*args
, enum md_ns ns
,
176 int tok
, const int *argc
, const char **argv
)
180 if (-1 == (res
= xml_printtagname(mbuf
, ns
, tok
)))
182 if (-1 == (sz
= xml_printtagargs(mbuf
, argc
, argv
)))
190 xml_endtag(struct md_mbuf
*mbuf
, void *data
,
191 const struct md_args
*args
, enum md_ns ns
, int tok
)
194 return(xml_printtagname(mbuf
, ns
, tok
));
218 md_line_xml(void *data
, char *buf
)
221 return(mlg_line((struct md_mlg
*)data
, buf
));
226 md_exit_xml(void *data
, int flush
)
229 return(mlg_exit((struct md_mlg
*)data
, flush
));
234 md_init_xml(const struct md_args
*args
,
235 struct md_mbuf
*mbuf
, const struct md_rbuf
*rbuf
)
239 cbs
.ml_alloc
= xml_alloc
;
240 cbs
.ml_free
= xml_free
;
241 cbs
.ml_begintag
= xml_begintag
;
242 cbs
.ml_endtag
= xml_endtag
;
243 cbs
.ml_begin
= xml_begin
;
244 cbs
.ml_end
= xml_end
;
245 cbs
.ml_beginstring
= xml_beginstring
;
246 cbs
.ml_endstring
= xml_endstring
;
248 return(mlg_alloc(args
, rbuf
, mbuf
, &cbs
));