]> git.cameronkatri.com Git - mandoc.git/blobdiff - xml.c
Added warnings for using macros in the wrong sections.
[mandoc.git] / xml.c
diff --git a/xml.c b/xml.c
index be33f86a9a97978f714f38f83fd95a7f8c329d4e..6d7da207e231043522481021aebb157b79937e5c 100644 (file)
--- a/xml.c
+++ b/xml.c
@@ -1,4 +1,4 @@
-/* $Id: xml.c,v 1.10 2008/12/03 14:39:59 kristaps Exp $ */
+/* $Id: xml.c,v 1.20 2008/12/08 12:46:28 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -16,6 +16,7 @@
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  * PERFORMANCE OF THIS SOFTWARE.
  */
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  * PERFORMANCE OF THIS SOFTWARE.
  */
+#include <assert.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include <stdlib.h>
 #include <string.h>
 
 #include "ml.h"
 
 
 #include "ml.h"
 
 
-static ssize_t         xml_endtag(struct md_mbuf *, 
+static int             xml_alloc(void **);
+static void            xml_free(void *);
+static ssize_t         xml_endtag(struct md_mbuf *, void *,
                                const struct md_args *, 
                                enum md_ns, int);
                                const struct md_args *, 
                                enum md_ns, int);
-static ssize_t         xml_begintag(struct md_mbuf *, 
+static ssize_t         xml_begintag(struct md_mbuf *, void *,
                                const struct md_args *, 
                                enum md_ns, int, 
                                const int *, const char **);
                                const struct md_args *, 
                                enum md_ns, int, 
                                const int *, const char **);
+static ssize_t         xml_beginstring(struct md_mbuf *, 
+                               const struct md_args *, 
+                               const char *, size_t);
+static ssize_t         xml_endstring(struct md_mbuf *, 
+                               const struct md_args *, 
+                               const char *, size_t);
+static int             xml_begin(struct md_mbuf *,
+                               const struct md_args *, 
+                               const struct tm *, 
+                               const char *, const char *, 
+                               enum roffmsec, const char *);
+static int             xml_end(struct md_mbuf *, 
+                               const struct md_args *);
+static ssize_t         xml_printtagname(struct md_mbuf *, 
+                               enum md_ns, int);
+static ssize_t         xml_printtagargs(struct md_mbuf *, 
+                               const int *, const char **);
+
 
 static ssize_t 
 
 static ssize_t 
-xml_begintag(struct md_mbuf *mbuf, const struct md_args *args, 
-               enum md_ns ns, int tok, 
-               const int *argc, const char **argv)
+xml_printtagargs(struct md_mbuf *mbuf, const int *argc,
+               const char **argv)
 {
 {
+       int              i, c;
        size_t           res;
 
        size_t           res;
 
-       res = 0;
+       if (NULL == argc || NULL == argv)
+               return(0);
+       assert(argc && argv);
 
 
-       switch (ns) {
-       case (MD_NS_BLOCK):
-               if ( ! ml_nputs(mbuf, "block:", 6, &res))
+       /* LINTED */
+       for (res = 0, i = 0; ROFF_ARGMAX != (c = argc[i]); i++) {
+               if ( ! ml_nputs(mbuf, " ", 1, &res))
                        return(-1);
                        return(-1);
-               break;
-       case (MD_NS_INLINE):
-               if ( ! ml_nputs(mbuf, "inline:", 7, &res))
+
+               if ( ! ml_puts(mbuf, tokargnames[c], &res))
                        return(-1);
                        return(-1);
-               break;
-       default:
-               if ( ! ml_nputs(mbuf, "mbuf", 4, &res))
+               if ( ! ml_nputs(mbuf, "=\"", 2, &res))
+                       return(-1);
+               if (argv[i]) {
+                       if ( ! ml_putstring(mbuf, argv[i], &res))
+                               return(-1);
+               } else if ( ! ml_nputs(mbuf, "true", 4, &res))
+                       return(-1);
+               if ( ! ml_nputs(mbuf, "\"", 1, &res))
                        return(-1);
                        return(-1);
-               return((ssize_t)res);
        }
 
        }
 
-       if ( ! ml_nputs(mbuf, toknames[tok], 
-                               strlen(toknames[tok]), &res))
-               return(-1);
-
        return((ssize_t)res);
 }
 
 
 static ssize_t 
        return((ssize_t)res);
 }
 
 
 static ssize_t 
-xml_endtag(struct md_mbuf *mbuf, const struct md_args *args, 
-               enum md_ns ns, int tok)
+xml_printtagname(struct md_mbuf *mbuf, enum md_ns ns, int tok)
 {
        size_t           res;
 
        res = 0;
 {
        size_t           res;
 
        res = 0;
-
        switch (ns) {
        case (MD_NS_BLOCK):
                if ( ! ml_nputs(mbuf, "block:", 6, &res))
        switch (ns) {
        case (MD_NS_BLOCK):
                if ( ! ml_nputs(mbuf, "block:", 6, &res))
@@ -81,20 +101,118 @@ xml_endtag(struct md_mbuf *mbuf, const struct md_args *args,
                if ( ! ml_nputs(mbuf, "inline:", 7, &res))
                        return(-1);
                break;
                if ( ! ml_nputs(mbuf, "inline:", 7, &res))
                        return(-1);
                break;
-       default:
-               if ( ! ml_nputs(mbuf, "mbuf", 4, &res))
+       case (MD_NS_BODY):
+               if ( ! ml_nputs(mbuf, "body:", 5, &res))
                        return(-1);
                        return(-1);
-               return((ssize_t)res);
+               break;
+       case (MD_NS_HEAD):
+               if ( ! ml_nputs(mbuf, "head:", 5, &res))
+                       return(-1);
+               break;
+       default:
+               break;
        }
 
        }
 
-       if ( ! ml_nputs(mbuf, toknames[tok], 
-                               strlen(toknames[tok]), &res))
+       if ( ! ml_puts(mbuf, toknames[tok], &res))
                return(-1);
                return(-1);
-
        return((ssize_t)res);
 }
 
 
        return((ssize_t)res);
 }
 
 
+/* ARGSUSED */
+static int 
+xml_begin(struct md_mbuf *mbuf, const struct md_args *args,
+               const struct tm *tm, const char *os, 
+               const char *title, enum roffmsec section, 
+               const char *vol)
+{
+
+       if ( ! ml_puts(mbuf, "<?xml version=\"1.0\" "
+                               "encoding=\"UTF-8\"?>\n", NULL))
+               return(0);
+       return(ml_puts(mbuf, "<mdoc xmlns:block=\"block\" "
+                               "xmlns:body=\"body\" "
+                               "xmlns:head=\"head\" "
+                               "xmlns:inline=\"inline\">", NULL));
+}
+
+
+/* ARGSUSED */
+static int 
+xml_end(struct md_mbuf *mbuf, const struct md_args *args)
+{
+
+       return(ml_puts(mbuf, "</mdoc>", NULL));
+}
+
+
+/* ARGSUSED */
+static ssize_t 
+xml_beginstring(struct md_mbuf *mbuf, 
+               const struct md_args *args, 
+               const char *buf, size_t sz)
+{
+
+       return(0);
+}
+
+
+/* ARGSUSED */
+static ssize_t 
+xml_endstring(struct md_mbuf *mbuf, 
+               const struct md_args *args, 
+               const char *buf, size_t sz)
+{
+
+       return(0);
+}
+
+
+/* ARGSUSED */
+static ssize_t 
+xml_begintag(struct md_mbuf *mbuf, void *data,
+               const struct md_args *args, enum md_ns ns, 
+               int tok, const int *argc, const char **argv)
+{
+       ssize_t          res, sz;
+
+       if (-1 == (res = xml_printtagname(mbuf, ns, tok)))
+               return(-1);
+       if (-1 == (sz = xml_printtagargs(mbuf, argc, argv)))
+               return(-1);
+       return(res + sz);
+}
+
+
+/* ARGSUSED */
+static ssize_t 
+xml_endtag(struct md_mbuf *mbuf, void *data,
+               const struct md_args *args, enum md_ns ns, int tok)
+{
+
+       return(xml_printtagname(mbuf, ns, tok));
+}
+
+
+/* ARGSUSED */
+int
+xml_alloc(void **p)
+{
+
+       *p = NULL;
+       return(1);
+}
+
+
+/* ARGSUSED */
+void
+xml_free(void *p)
+{
+
+       /* Do nothing. */
+}
+
+
 int
 md_line_xml(void *data, char *buf)
 {
 int
 md_line_xml(void *data, char *buf)
 {
@@ -115,7 +233,17 @@ void *
 md_init_xml(const struct md_args *args,
                struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
 {
 md_init_xml(const struct md_args *args,
                struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
 {
-
-       return(mlg_alloc(args, rbuf, mbuf, xml_begintag, xml_endtag));
+       struct ml_cbs    cbs;
+
+       cbs.ml_alloc = xml_alloc;
+       cbs.ml_free = xml_free;
+       cbs.ml_begintag = xml_begintag;
+       cbs.ml_endtag = xml_endtag;
+       cbs.ml_begin = xml_begin;
+       cbs.ml_end = xml_end;
+       cbs.ml_beginstring = xml_beginstring;
+       cbs.ml_endstring = xml_endstring;
+
+       return(mlg_alloc(args, rbuf, mbuf, &cbs));
 }
 
 }