]> git.cameronkatri.com Git - mandoc.git/blobdiff - libmdocml.c
Split roff engine into roff.c.
[mandoc.git] / libmdocml.c
index 2bd5dfa77ba2f28f5dbc647baa82049b75d7350c..42e795841084f0e2aad0a419a751dba3007d2f5f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: libmdocml.c,v 1.6 2008/11/23 22:30:53 kristaps Exp $ */
+/* $Id: libmdocml.c,v 1.9 2008/11/24 14:24:55 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 #include "libmdocml.h"
 #include "private.h"
 
-#define        BUFFER_LINE      BUFSIZ
+#define        BUFFER_LINE      BUFSIZ /* Default line-buffer size. */
 
 static int      md_run_enter(const struct md_args *, 
                        struct md_mbuf *, struct md_rbuf *, void *);
 static int      md_run_leave(const struct md_args *, struct md_mbuf *,
                        struct md_rbuf *, int, void *);
+
 static ssize_t  md_buf_fill(struct md_rbuf *);
 static int      md_buf_flush(struct md_mbuf *);
 
@@ -135,13 +136,13 @@ md_run_leave(const struct md_args *args, struct md_mbuf *mbuf,
        /* Run exiters. */
        switch (args->type) {
        case (MD_HTML4_STRICT):
-               if ( ! md_exit_html4_strict(args, mbuf, rbuf, c, data))
-                       return(-1);
-               break;
-       case (MD_DUMMY):
+               if ( ! md_exit_html4_strict(data, -1 == c ? 0 : 1))
+                       c = -1;
                break;
        default:
-               abort();
+               if ( ! md_exit_dummy(data, -1 == c ? 0 : 1))
+                       c = -1;
+               break;
        }
 
        /* Make final flush of buffer. */
@@ -170,46 +171,43 @@ md_run_enter(const struct md_args *args, struct md_mbuf *mbuf,
        case (MD_HTML4_STRICT):
                fp = md_line_html4_strict;
                break;
-       case (MD_DUMMY):
+       default:
                fp = md_line_dummy;
                break;
-       default:
-               abort();
        }
 
-       /* LINTED */
-       for (pos = 0; ; ) {
-               if (-1 == (sz = md_buf_fill(rbuf)))
-                       return(md_run_leave(args, mbuf, rbuf, -1, p));
-               else if (0 == sz)
-                       break;
-
-               for (i = 0; i < sz; i++) {
-                       if ('\n' == rbuf->buf[i]) {
-                               if ( ! (*fp)(args, mbuf, rbuf, line, pos, p))
-                                       return(md_run_leave(args, mbuf, rbuf,
-                                                               -1, p));
-                               rbuf->line++;
-                               pos = 0;
-                               continue;
-                       }
+       pos = 0;
 
+again:
+       if (-1 == (sz = md_buf_fill(rbuf))) {
+               return(md_run_leave(args, mbuf, rbuf, -1, p));
+       } else if (0 == sz && 0 != pos) {
+               warnx("%s: no newline at end of file", rbuf->name);
+               return(md_run_leave(args, mbuf, rbuf, -1, p));
+       } else if (0 == sz)
+               return(md_run_leave(args, mbuf, rbuf, 0, p));
+
+       for (i = 0; i < sz; i++) {
+               if ('\n' != rbuf->buf[i]) {
                        if (pos < BUFFER_LINE) {
                                /* LINTED */
                                line[pos++] = rbuf->buf[i];
                                continue;
                        }
-
                        warnx("%s: line %zu too long",
                                        rbuf->name, rbuf->line);
                        return(md_run_leave(args, mbuf, rbuf, -1, p));
                }
-       }
 
-       if (0 != pos && ! (*fp)(args, mbuf, rbuf, line, pos, p))
-               return(md_run_leave(args, mbuf, rbuf, -1, p));
+               line[pos] = 0;
+               if ( ! (*fp)(p, line, pos))
+                       return(md_run_leave(args, mbuf, rbuf, -1, p));
+               rbuf->line++;
+               pos = 0;
+       }
 
-       return(md_run_leave(args, mbuf, rbuf, 0, p));
+       goto again;
+       /* NOTREACHED */
 }
 
 
@@ -230,18 +228,17 @@ md_run(const struct md_args *args,
 
        mbuf.pos = 0;
        rbuf.line = 1;
-       data = NULL;
 
        /* Run initialisers. */
        switch (args->type) {
        case (MD_HTML4_STRICT):
-               if ( ! md_init_html4_strict(args, &mbuf, &rbuf, &data))
-                       return(-1);
-               break;
-       case (MD_DUMMY):
+               data = md_init_html4_strict
+                       (args, &mbuf, &rbuf);
                break;
        default:
-               abort();
+               data = md_init_dummy
+                       (args, &mbuf, &rbuf);
+               break;
        }
 
        /* Go into mainline. */