]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdocml.c
*** empty log message ***
[mandoc.git] / mdocml.c
index 7f9142113ccd8afc7cbbfb683c5da0c0919ce2a7..a22a1092667b2223d8a74859dc3c516082e14745 100644 (file)
--- a/mdocml.c
+++ b/mdocml.c
@@ -1,4 +1,4 @@
-/* $Id: mdocml.c,v 1.4 2008/11/22 18:34:06 kristaps Exp $ */
+/* $Id: mdocml.c,v 1.13 2008/11/27 17:27:50 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 
 #include "libmdocml.h"
 
-#define        BUFFER_IN_DEF   BUFSIZ
-#define        BUFFER_OUT_DEF  BUFSIZ
+#define        BUFFER_IN_DEF   BUFSIZ   /* See begin_bufs. */
+#define        BUFFER_OUT_DEF  BUFSIZ   /* See begin_bufs. */
 
-static void             usage(void);
-static int              begin_io(const char *, const char *);
-static int              leave_io(const struct md_mbuf *, 
-                               const struct md_rbuf *, int);
-static int              begin_bufs(struct md_mbuf *, struct md_rbuf *);
-static int              leave_bufs(const struct md_mbuf *, 
-                               const struct md_rbuf *, int);
+static void             usage(void);
+
+static int              begin_io(const struct md_args *, 
+                               char *, char *);
+static int              leave_io(const struct md_buf *, 
+                               const struct md_buf *, int);
+static int              begin_bufs(const struct md_args *,
+                               struct md_buf *, struct md_buf *);
+static int              leave_bufs(const struct md_buf *, 
+                               const struct md_buf *, int);
 
 int
 main(int argc, char *argv[])
 {
        int              c;
        char            *out, *in;
+       struct md_args   args;
 
        extern char     *optarg;
        extern int       optind;
 
        out = in = NULL;
+
+       (void)memset(&args, 0, sizeof(struct md_args));
        
-       while (-1 != (c = getopt(argc, argv, "o:")))
+       while (-1 != (c = getopt(argc, argv, "o:vW")))
                switch (c) {
                case ('o'):
                        out = optarg;
                        break;
+               case ('v'):
+                       args.verbosity++;
+                       break;
+               case ('W'):
+                       args.warnings |= MD_WARN_ALL;
+                       break;
                default:
                        usage();
                        return(1);
@@ -68,13 +80,19 @@ main(int argc, char *argv[])
        if (1 == argc)
                in = *argv++;
 
-       return(begin_io(out ? out : "-", in ? in : "-"));
+       args.type = MD_DUMMY;
+
+       return(begin_io(&args, out ? out : "-", in ? in : "-"));
 }
 
 
+/* 
+ * Close out file descriptors opened in begin_io.  If the descriptor
+ * refers to stdin/stdout, then do nothing.
+ */
 static int
-leave_io(const struct md_mbuf *out, 
-               const struct md_rbuf *in, int c)
+leave_io(const struct md_buf *out, 
+               const struct md_buf *in, int c)
 {
        assert(out);
        assert(in);
@@ -95,20 +113,25 @@ leave_io(const struct md_mbuf *out,
 }
 
 
+/*
+ * Open file descriptors or assign stdin/stdout, if dictated by the "-"
+ * token instead of a filename.
+ */
 static int
-begin_io(const char *out, const char *in)
+begin_io(const struct md_args *args, char *out, char *in)
 {
-       struct md_rbuf   fi;
-       struct md_mbuf   fo;
+       struct md_buf    fi;
+       struct md_buf    fo;
 
 #define        FI_FL   O_RDONLY
 #define        FO_FL   O_WRONLY|O_CREAT|O_TRUNC
 
+       assert(args);
        assert(out);
        assert(in);
 
-       bzero(&fi, sizeof(struct md_rbuf));
-       bzero(&fo, sizeof(struct md_mbuf));
+       bzero(&fi, sizeof(struct md_buf));
+       bzero(&fo, sizeof(struct md_buf));
 
        fi.fd = STDIN_FILENO;
        fo.fd = STDOUT_FILENO;
@@ -128,13 +151,16 @@ begin_io(const char *out, const char *in)
                        return(leave_io(&fo, &fi, 1));
                }
 
-       return(leave_io(&fo, &fi, begin_bufs(&fo, &fi)));
+       return(leave_io(&fo, &fi, begin_bufs(args, &fo, &fi)));
 }
 
 
+/*
+ * Free buffers allocated in begin_bufs.
+ */
 static int
-leave_bufs(const struct md_mbuf *out, 
-               const struct md_rbuf *in, int c)
+leave_bufs(const struct md_buf *out, 
+               const struct md_buf *in, int c)
 {
        assert(out);
        assert(in);
@@ -146,17 +172,27 @@ leave_bufs(const struct md_mbuf *out,
 }
 
 
+/*
+ * Allocate buffers to the maximum of either the input file's blocksize
+ * or BUFFER_IN_DEF/BUFFER_OUT_DEF, which should be around BUFSIZE.
+ */
 static int
-begin_bufs(struct md_mbuf *out, struct md_rbuf *in)
+begin_bufs(const struct md_args *args, 
+               struct md_buf *out, struct md_buf *in)
 {
        struct stat      stin, stout;
+       int              c;
 
+       assert(args);
        assert(in);
        assert(out);
 
        if (-1 == fstat(in->fd, &stin)) {
                warn("%s", in->name);
                return(1);
+       } else if (STDIN_FILENO != in->fd && 0 == stin.st_size) {
+               warnx("%s: empty file", in->name);
+               return(1);
        } else if (-1 == fstat(out->fd, &stout)) {
                warn("%s", out->name);
                return(1);
@@ -173,7 +209,8 @@ begin_bufs(struct md_mbuf *out, struct md_rbuf *in)
                return(leave_bufs(out, in, 1));
        }
 
-       return(leave_bufs(out, in, md_run(MD_DUMMY, out, in)));
+       c = md_run(args, out, in);
+       return(leave_bufs(out, in, -1 == c ? 1 : 0));
 }
 
 
@@ -182,5 +219,5 @@ usage(void)
 {
        extern char     *__progname;
 
-       (void)printf("usage: %s [-o outfile] [infile]\n", __progname);
+       (void)printf("usage: %s [-vW] [-o outfile] [infile]\n", __progname);
 }