summaryrefslogtreecommitdiffstats
path: root/read.c
diff options
context:
space:
mode:
authorJoerg Sonnenberger <joerg@netbsd.org>2012-02-16 20:51:31 +0000
committerJoerg Sonnenberger <joerg@netbsd.org>2012-02-16 20:51:31 +0000
commit752172f6f0d6720937996a5ef0e29990327e56fb (patch)
tree91ef5e785a18c96ebec030ce7e59a1c00a9e783a /read.c
parent8872acfd3bb11e0bdbd221a6616c7c74b549b313 (diff)
downloadmandoc-752172f6f0d6720937996a5ef0e29990327e56fb.tar.gz
Add mparse_readmem, which allows application to run the parser directly
from memory, e.g. after de-compressing a document.
Diffstat (limited to 'read.c')
-rw-r--r--read.c94
1 files changed, 53 insertions, 41 deletions
diff --git a/read.c b/read.c
index be788c2b..e96621bf 100644
--- a/read.c
+++ b/read.c
@@ -28,6 +28,7 @@
#include <ctype.h>
#include <fcntl.h>
#include <stdarg.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -37,6 +38,7 @@
#include "libmandoc.h"
#include "mdoc.h"
#include "man.h"
+#include "main.h"
#ifndef MAP_FILE
#define MAP_FILE 0
@@ -70,7 +72,6 @@ static void resize_buf(struct buf *, size_t);
static void mparse_buf_r(struct mparse *, struct buf, int);
static void mparse_readfd_r(struct mparse *, int, const char *, int);
static void pset(const char *, int, struct mparse *);
-static void pdesc(struct mparse *, const char *, int);
static int read_whole_file(const char *, int, struct buf *, int *);
static void mparse_end(struct mparse *);
@@ -547,38 +548,6 @@ rerun:
free(ln.buf);
}
-static void
-pdesc(struct mparse *curp, const char *file, int fd)
-{
- struct buf blk;
- int with_mmap;
-
- /*
- * Run for each opened file; may be called more than once for
- * each full parse sequence if the opened file is nested (i.e.,
- * from `so'). Simply sucks in the whole file and moves into
- * the parse phase for the file.
- */
-
- if ( ! read_whole_file(file, fd, &blk, &with_mmap)) {
- curp->file_status = MANDOCLEVEL_SYSERR;
- return;
- }
-
- /* Line number is per-file. */
-
- curp->line = 1;
-
- mparse_buf_r(curp, blk, 1);
-
-#ifdef HAVE_MMAP
- if (with_mmap)
- munmap(blk.buf, blk.sz);
- else
-#endif
- free(blk.buf);
-}
-
static int
read_whole_file(const char *file, int fd, struct buf *fb, int *with_mmap)
{
@@ -674,29 +643,72 @@ mparse_end(struct mparse *curp)
}
static void
-mparse_readfd_r(struct mparse *curp, int fd, const char *file, int re)
+mparse_parse_buffer(struct mparse *curp, struct buf blk, const char *file,
+ int re)
{
const char *svfile;
+ /* Line number is per-file. */
+ svfile = curp->file;
+ curp->file = file;
+ curp->line = 1;
+
+ mparse_buf_r(curp, blk, 1);
+
+ if (0 == re && MANDOCLEVEL_FATAL > curp->file_status)
+ mparse_end(curp);
+
+ curp->file = svfile;
+}
+
+enum mandoclevel
+mparse_readmem(struct mparse *curp, const void *buf, size_t len,
+ const char *file)
+{
+ struct buf blk;
+
+ blk.buf = UNCONST(buf);
+ blk.sz = len;
+
+ mparse_parse_buffer(curp, blk, file, 0);
+ return(curp->file_status);
+}
+
+static void
+mparse_readfd_r(struct mparse *curp, int fd, const char *file, int re)
+{
+ struct buf blk;
+ int with_mmap;
+
if (-1 == fd)
if (-1 == (fd = open(file, O_RDONLY, 0))) {
perror(file);
curp->file_status = MANDOCLEVEL_SYSERR;
return;
}
+ /*
+ * Run for each opened file; may be called more than once for
+ * each full parse sequence if the opened file is nested (i.e.,
+ * from `so'). Simply sucks in the whole file and moves into
+ * the parse phase for the file.
+ */
- svfile = curp->file;
- curp->file = file;
+ if ( ! read_whole_file(file, fd, &blk, &with_mmap)) {
+ curp->file_status = MANDOCLEVEL_SYSERR;
+ return;
+ }
- pdesc(curp, file, fd);
+ mparse_parse_buffer(curp, blk, file, re);
- if (0 == re && MANDOCLEVEL_FATAL > curp->file_status)
- mparse_end(curp);
+#ifdef HAVE_MMAP
+ if (with_mmap)
+ munmap(blk.buf, blk.sz);
+ else
+#endif
+ free(blk.buf);
if (STDIN_FILENO != fd && -1 == close(fd))
perror(file);
-
- curp->file = svfile;
}
enum mandoclevel