]> git.cameronkatri.com Git - mandoc.git/commitdiff
*** empty log message ***
authorKristaps Dzonsons <kristaps@bsd.lv>
Fri, 5 Dec 2008 19:45:15 +0000 (19:45 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Fri, 5 Dec 2008 19:45:15 +0000 (19:45 +0000)
Makefile
html.c
ml.c
ml.h
mlg.c
xml.c

index 5d62ced9dc961c640decb523747c05c5215f6628..c7ffba40f4d64fbb6b32ab0db32b1779d9a442c4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -37,8 +37,14 @@ lint: llib-lmdocml.ln
 dist: mdocml.tgz
 
 regress: mdocml
-       @for f in $(FAIL); do ./mdocml $$f 1>/dev/null 2>/dev/null || continue ; done
-       @for f in $(SUCCEED); do ./mdocml $$f 1>/dev/null || exit 1 ; done
+       @for f in $(FAIL); do \
+               echo "./mdocml $$f" ; \
+               ./mdocml $$f 1>/dev/null 2>/dev/null || continue ; \
+       done
+       @for f in $(SUCCEED); do \
+               echo "./mdocml $$f" ; \
+               ./mdocml $$f 1>/dev/null || exit 1 ; \
+       done
 
 mdocml: mdocml.o libmdocml.a
        $(CC) $(CFLAGS) -o $@ mdocml.o libmdocml.a
diff --git a/html.c b/html.c
index 049817a38701ccb77c2334a41a5e72800482f3ce..d234031fa6fe01d7df6d2f6272fc57c797c2eccd 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/* $Id: html.c,v 1.8 2008/12/05 17:43:14 kristaps Exp $ */
+/* $Id: html.c,v 1.9 2008/12/05 19:45:15 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -33,7 +33,6 @@
 
 
 /* TODO: allow head/tail-less invocations (just "div" start). */
-/* FIXME: free htmlq. */
 
 struct htmlnode {
        int              tok;
@@ -49,11 +48,10 @@ struct      htmlq {
 };
 
 
-static void            htmlnode_free(struct htmlnode *);
-static void            htmlnode_free(struct htmlnode *);
-
 static int             html_loadcss(struct md_mbuf *, const char *);
 
+static int             html_alloc(void **);
+static void            html_free(void *);
 static ssize_t         html_endtag(struct md_mbuf *, void *,
                                const struct md_args *, 
                                enum md_ns, int);
@@ -210,13 +208,8 @@ html_begin(struct md_mbuf *mbuf, const struct md_args *args,
 static int 
 html_end(struct md_mbuf *mbuf, const struct md_args *args)
 {
-       size_t           res;
-
-       res = 0;
-       if ( ! ml_puts(mbuf, "</div></body>\n</html>", &res))
-               return(0);
 
-       return(1);
+       return(ml_puts(mbuf, "</div></body>\n</html>", NULL));
 }
 
 
@@ -230,8 +223,6 @@ html_blockbodytagname(struct md_mbuf *mbuf,
 }
 
 
-
-
 /* ARGSUSED */
 static int
 html_blockheadtagname(struct md_mbuf *mbuf, 
@@ -252,11 +243,11 @@ html_blocktagname(struct md_mbuf *mbuf,
 }
 
 
+/* ARGSUSED */
 static int
 html_printargs(struct md_mbuf *mbuf, int tok, const char *ns,
                const int *argc, const char **argv, size_t *res)
 {
-       int              i, c;
 
        if ( ! ml_puts(mbuf, " class=\"", res))
                return(0);
@@ -266,35 +257,7 @@ html_printargs(struct md_mbuf *mbuf, int tok, const char *ns,
                return(0);
        if ( ! ml_puts(mbuf, toknames[tok], res))
                return(0);
-       if ( ! ml_puts(mbuf, "\"", res))
-               return(0);
-
-       if (NULL == argv || NULL == argc)
-               return(1);
-       assert(argv && argc);
-       
-       /* FIXME: ignores values. */
-
-       for (i = 0; ROFF_ARGMAX != (c = argc[i]); i++) {
-               if (argv[i])
-                       continue;
-               if ( ! ml_puts(mbuf, " class=\"", res))
-                       return(0);
-               if ( ! ml_puts(mbuf, ns, res))
-                       return(0);
-               if ( ! ml_puts(mbuf, "-", res))
-                       return(0);
-               if ( ! ml_puts(mbuf, toknames[tok], res))
-                       return(0);
-               if ( ! ml_puts(mbuf, "-", res))
-                       return(0);
-               if ( ! ml_puts(mbuf, tokargnames[c], res))
-                       return(0);
-               if ( ! ml_puts(mbuf, "\"", res))
-                       return(0);
-       }
-
-       return(1);
+       return(ml_puts(mbuf, "\"", res));
 }
 
 
@@ -352,9 +315,10 @@ html_inlinetagname(struct md_mbuf *mbuf,
        case (ROFF_Pp):
                return(ml_puts(mbuf, "div", res));
        default:
-               return(ml_puts(mbuf, "span", res));
+               break;
        }
-       return(1);
+
+       return(ml_puts(mbuf, "span", res));
 }
 
 
@@ -455,12 +419,42 @@ html_endtag(struct md_mbuf *mbuf, void *data,
        node = q->last;
        q->last = node->parent;
 
-       htmlnode_free(node);
+       free(node);
 
        return((ssize_t)res);
 }
 
 
+static int
+html_alloc(void **p)
+{
+
+       if (NULL == (*p = calloc(1, sizeof(struct htmlq)))) {
+               warn("calloc");
+               return(0);
+       }
+       return(1);
+}
+
+
+static void
+html_free(void *p)
+{
+       struct htmlq    *q;
+       struct htmlnode *n;
+
+       assert(p);
+       q = (struct htmlq *)p;
+
+       while ((n = q->last)) {
+               q->last = n->parent;
+               free(n);
+       }
+
+       free(q);
+}
+
+
 int
 md_line_html(void *data, char *buf)
 {
@@ -481,14 +475,15 @@ void *
 md_init_html(const struct md_args *args,
                struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
 {
-       struct htmlq    *q;
+       struct ml_cbs    cbs;
 
-       if (NULL == (q = calloc(1, sizeof(struct htmlq)))) {
-               warn("calloc");
-               return(NULL);
-       }
+       cbs.ml_alloc = html_alloc;
+       cbs.ml_free = html_free;
+       cbs.ml_begintag = html_begintag;
+       cbs.ml_endtag = html_endtag;
+       cbs.ml_begin = html_begin;
+       cbs.ml_end = html_end;
 
-       return(mlg_alloc(args, q, rbuf, mbuf, html_begintag, 
-                               html_endtag, html_begin, html_end));
+       return(mlg_alloc(args, rbuf, mbuf, &cbs));
 }
 
diff --git a/ml.c b/ml.c
index cc49d263e9432eb082edfd323e1a3f7b953c1014..0884eb06f17266a8a0be52b5c60c4bdcfcaad24b 100644 (file)
--- a/ml.c
+++ b/ml.c
@@ -1,4 +1,4 @@
-/* $Id: ml.c,v 1.6 2008/12/05 11:28:17 kristaps Exp $ */
+/* $Id: ml.c,v 1.7 2008/12/05 19:45:15 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -51,10 +51,8 @@ ml_nputstring(struct md_mbuf *p,
 
                /* Escaped value. */
                case ('\\'):
-                       if (-1 == (v = rofftok_scan(buf, &i))) {
-                               /* TODO: error. */
+                       if (-1 == (v = rofftok_scan(buf, &i)))
                                return(0);
-                       }
 
                        switch (v) {
                        case (ROFFTok_Sp_A):
@@ -178,8 +176,7 @@ ml_nputstring(struct md_mbuf *p,
                                ssz = 0;
                                break;
                        default:
-                               /* TODO: print error. */
-                               return(-1);
+                               return(0);
                        }
                        break;
 
@@ -230,7 +227,8 @@ ml_nputs(struct md_mbuf *p, const char *buf, size_t sz, size_t *pos)
        if ( ! md_buf_puts(p, buf, sz))
                return(0);
 
-       *pos += sz;
+       if (pos)
+               *pos += sz;
        return(1);
 }
 
@@ -245,7 +243,9 @@ ml_puts(struct md_mbuf *p, const char *buf, size_t *pos)
 
        if ( ! md_buf_puts(p, buf, sz))
                return(0);
-       *pos += sz;
+
+       if (pos)
+               *pos += sz;
        return(1);
 }
 
diff --git a/ml.h b/ml.h
index 1994ec327a0449078a6797a785c8f5ab9510eaa8..c375a6715173aaa80343760f420ccc3c41f7e3d4 100644 (file)
--- a/ml.h
+++ b/ml.h
@@ -1,4 +1,4 @@
-/* $Id: ml.h,v 1.6 2008/12/05 17:43:14 kristaps Exp $ */
+/* $Id: ml.h,v 1.7 2008/12/05 19:45:15 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -29,16 +29,24 @@ enum        md_ns {
        MD_NS_DEFAULT,
 };
 
-typedef        int     (*ml_begin)(struct md_mbuf *, const struct md_args *,
-                       const struct tm *, const char *, const char *,
+struct ml_cbs {
+       int     (*ml_begin)(struct md_mbuf *, 
+                       const struct md_args *,
+                       const struct tm *, 
+                       const char *, const char *,
                        const char *, const char *);
-typedef        int     (*ml_end)(struct md_mbuf *, 
+       int     (*ml_end)(struct md_mbuf *, 
                        const struct md_args *);
-typedef        ssize_t (*ml_endtag)(struct md_mbuf *, void *,
-                       const struct md_args *, enum md_ns, int);
-typedef        ssize_t (*ml_begintag)(struct md_mbuf *, void *,
-                       const struct md_args *, enum md_ns, int, 
+       ssize_t (*ml_endtag)(struct md_mbuf *, 
+                       void *, const struct md_args *, 
+                       enum md_ns, int);
+       ssize_t (*ml_begintag)(struct md_mbuf *, 
+                       void *, const struct md_args *, 
+                       enum md_ns, int, 
                        const int *, const char **);
+       int     (*ml_alloc)(void **);
+       void    (*ml_free)(void *);
+};
 
 __BEGIN_DECLS
 
@@ -52,9 +60,9 @@ int             ml_puts(struct md_mbuf *, const char *, size_t *);
 int              ml_putchars(struct md_mbuf *, 
                        char, size_t, size_t *);
 
-struct md_mlg   *mlg_alloc(const struct md_args *, void *,
+struct md_mlg   *mlg_alloc(const struct md_args *, 
                        const struct md_rbuf *, struct md_mbuf *,
-                       ml_begintag, ml_endtag, ml_begin, ml_end);
+                       const struct ml_cbs *);
 int              mlg_exit(struct md_mlg *, int);
 int              mlg_line(struct md_mlg *, char *);
 
diff --git a/mlg.c b/mlg.c
index 148888e39a1032780d8d26bb2fdfed9e40cdd3b8..059542c6e4b62fbe9f87c11cb6aa23ed4b03ad42 100644 (file)
--- a/mlg.c
+++ b/mlg.c
@@ -1,4 +1,4 @@
-/* $Id: mlg.c,v 1.10 2008/12/05 17:43:14 kristaps Exp $ */
+/* $Id: mlg.c,v 1.11 2008/12/05 19:45:15 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -51,10 +51,7 @@ struct       md_mlg {
        size_t            pos;
        enum md_tok       last;
        void             *arg;
-       ml_begintag       begintag;
-       ml_endtag         endtag;
-       ml_begin          begin;
-       ml_end            end;
+       struct ml_cbs     cbs;
        int               flags;
 #define        ML_OVERRIDE_ONE  (1 << 0)
 #define        ML_OVERRIDE_ALL  (1 << 1)
@@ -145,7 +142,7 @@ mlg_begintag(struct md_mlg *p, enum md_ns ns, int tok,
        if ( ! ml_nputs(p->mbuf, "<", 1, &p->pos))
                return(0);
 
-       res = (*p->begintag)(p->mbuf, p->data, p->args, ns, tok,
+       res = (*p->cbs.ml_begintag)(p->mbuf, p->data, p->args, ns, tok,
                        argc, (const char **)argv);
        if (-1 == res)
                return(0);
@@ -194,7 +191,7 @@ mlg_endtag(struct md_mlg *p, enum md_ns ns, int tok)
        if ( ! ml_nputs(p->mbuf, "</", 2, &p->pos))
                return(0);
 
-       res = (*p->endtag)(p->mbuf, p->data, p->args, ns, tok);
+       res = (*p->cbs.ml_endtag)(p->mbuf, p->data, p->args, ns, tok);
        if (-1 == res)
                return(0);
 
@@ -234,12 +231,9 @@ mlg_indent(struct md_mlg *p)
 static int
 mlg_newline(struct md_mlg *p)
 {
-       size_t           dummy;
 
-       if ( ! ml_nputs(p->mbuf, "\n", 1, &dummy))
-               return(0);
        p->pos = 0;
-       return(1);
+       return(ml_nputs(p->mbuf, "\n", 1, NULL));
 }
 
 
@@ -329,16 +323,18 @@ mlg_exit(struct md_mlg *p, int flush)
 
        c = roff_free(p->tree, flush);
        free(p);
+
+       (*p->cbs.ml_free)(p->data);
+
        return(c);
 }
 
 
 struct md_mlg *
-mlg_alloc(const struct md_args *args, void *data,
+mlg_alloc(const struct md_args *args, 
                const struct md_rbuf *rbuf,
                struct md_mbuf *mbuf, 
-               ml_begintag begintag, ml_endtag endtag,
-               ml_begin begin, ml_end end)
+               const struct ml_cbs *cbs)
 {
        struct roffcb    cb;
        struct md_mlg   *p;
@@ -363,18 +359,17 @@ mlg_alloc(const struct md_args *args, void *data,
        p->args = args;
        p->mbuf = mbuf;
        p->rbuf = rbuf;
-       p->begintag = begintag;
-       p->endtag = endtag;
-       p->begin = begin;
-       p->end = end;
-       p->data = data;
 
-       if (NULL == (p->tree = roff_alloc(&cb, p))) {
+       (void)memcpy(&p->cbs, cbs, sizeof(struct ml_cbs));
+
+       if (NULL == (p->tree = roff_alloc(&cb, p))) 
                free(p);
-               return(NULL);
-       }
+       else if ( ! (*p->cbs.ml_alloc)(&p->data))
+               free(p);
+       else
+               return(p);
 
-       return(p);
+       return(NULL);
 }
 
 
@@ -388,7 +383,8 @@ mlg_roffhead(void *arg, const struct tm *tm, const char *os,
        p = (struct md_mlg *)arg;
 
        mlg_mode(p, MD_BLK_IN);
-       if ( ! (*p->begin)(p->mbuf, p->args, tm, os, title, sec, vol))
+
+       if ( ! (*p->cbs.ml_begin)(p->mbuf, p->args, tm, os, title, sec, vol))
                return(0);
 
        p->indent++;
@@ -404,12 +400,14 @@ mlg_rofftail(void *arg)
        assert(arg);
        p = (struct md_mlg *)arg;
 
-       if (0 != p->pos && ! mlg_newline(p))
+       if (0 != p->pos)
+               if ( ! mlg_newline(p))
+                       return(0);
+
+       if ( ! (*p->cbs.ml_end)(p->mbuf, p->args))
                return(0);
 
        mlg_mode(p, MD_BLK_OUT);
-       if ( ! (*p->end)(p->mbuf, p->args))
-               return(0);
 
        return(mlg_newline(p));
 }
@@ -557,6 +555,7 @@ mlg_roffdata(void *arg, int space, const char *start, char *buf)
                return(0);
 
        mlg_mode(p, MD_TEXT);
+
        return(1);
 }
 
diff --git a/xml.c b/xml.c
index 5ff28cb7f4cf73d76d76d21df6dad4f4bf38869f..607a87cb2f0d2053d87569a7a2c35a50542cd422 100644 (file)
--- a/xml.c
+++ b/xml.c
@@ -1,4 +1,4 @@
-/* $Id: xml.c,v 1.15 2008/12/05 17:43:14 kristaps Exp $ */
+/* $Id: xml.c,v 1.16 2008/12/05 19:45:15 kristaps Exp $ */
 /*
  * 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.
  */
+#include <assert.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -24,6 +25,8 @@
 #include "ml.h"
 
 
+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);
@@ -38,60 +41,59 @@ static      int             xml_begin(struct md_mbuf *,
                                const char *, 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 **);
 
 
-/* ARGSUSED */
-static int 
-xml_begin(struct md_mbuf *mbuf, const struct md_args *args,
-               const struct tm *tm, const char *os, 
-               const char *title, const char *section, 
-               const char *vol)
+static ssize_t 
+xml_printtagargs(struct md_mbuf *mbuf, const int *argc,
+               const char **argv)
 {
+       int              i, c;
        size_t           res;
 
-       if ( ! ml_puts(mbuf, "<?xml version=\"1.0\" "
-                               "encoding=\"UTF-8\"?>\n", &res))
-               return(0);
-       if ( ! ml_puts(mbuf, "<mdoc xmlns:block=\"block\" "
-                               "xmlns:special=\"special\" "
-                               "xmlns:inline=\"inline\">", &res))
+       if (NULL == argc || NULL == argv)
                return(0);
+       assert(argc && argv);
 
-       return(1);
-}
-
-
-/* ARGSUSED */
-static int 
-xml_end(struct md_mbuf *mbuf, const struct md_args *args)
-{
-       size_t           res;
+       for (res = 0, i = 0; ROFF_ARGMAX != (c = argc[i]); i++) {
+               if ( ! ml_nputs(mbuf, " ", 1, &res))
+                       return(-1);
 
-       res = 0;
-       if ( ! ml_puts(mbuf, "</mdoc>", &res))
-               return(0);
+               if ( ! ml_puts(mbuf, tokargnames[c], &res))
+                       return(-1);
+               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);
 }
 
 
-/* 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)
+xml_printtagname(struct md_mbuf *mbuf, enum md_ns ns, int tok)
 {
        size_t           res;
 
-       /* FIXME: doesn't print arguments! */
-
        res = 0;
-
        switch (ns) {
        case (MD_NS_BLOCK):
                if ( ! ml_nputs(mbuf, "block:", 6, &res))
                        return(-1);
                break;
+       case (MD_NS_INLINE):
+               if ( ! ml_nputs(mbuf, "inline:", 7, &res))
+                       return(-1);
+               break;
        case (MD_NS_BODY):
                if ( ! ml_nputs(mbuf, "body:", 5, &res))
                        return(-1);
@@ -100,55 +102,83 @@ xml_begintag(struct md_mbuf *mbuf, void *data,
                if ( ! ml_nputs(mbuf, "head:", 5, &res))
                        return(-1);
                break;
-       case (MD_NS_INLINE):
-               if ( ! ml_nputs(mbuf, "inline:", 7, &res))
-                       return(-1);
-               break;
        default:
                break;
        }
 
        if ( ! ml_puts(mbuf, toknames[tok], &res))
                return(-1);
-
        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, const char *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:special=\"special\" "
+                               "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_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)
 {
-       size_t           res;
 
-       res = 0;
+       return(xml_printtagname(mbuf, ns, tok));
+}
 
-       switch (ns) {
-       case (MD_NS_BLOCK):
-               if ( ! ml_nputs(mbuf, "block:", 6, &res))
-                       return(-1);
-               break;
-       case (MD_NS_INLINE):
-               if ( ! ml_nputs(mbuf, "inline:", 7, &res))
-                       return(-1);
-               break;
-       case (MD_NS_BODY):
-               if ( ! ml_nputs(mbuf, "body:", 5, &res))
-                       return(-1);
-               break;
-       case (MD_NS_HEAD):
-               if ( ! ml_nputs(mbuf, "head:", 5, &res))
-                       return(-1);
-               break;
-       default:
-               break;
-       }
 
-       if ( ! ml_puts(mbuf, toknames[tok], &res))
-               return(-1);
+/* ARGSUSED */
+int
+xml_alloc(void **p)
+{
 
-       return((ssize_t)res);
+       return(1);
+}
+
+
+/* ARGSUSED */
+void
+xml_free(void *p)
+{
+
+       /* Do nothing. */
 }
 
 
@@ -172,8 +202,15 @@ void *
 md_init_xml(const struct md_args *args,
                struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
 {
+       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;
 
-       return(mlg_alloc(args, NULL, rbuf, mbuf, xml_begintag, 
-                               xml_endtag, xml_begin, xml_end));
+       return(mlg_alloc(args, rbuf, mbuf, &cbs));
 }