aboutsummaryrefslogtreecommitdiffstatshomepage
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
commitaea76a155da0e440cfa515021edaeb403116aa0b (patch)
tree31b7277e5c4cea7e951da147adba63ae2194a896
parentc52306308535a3ccd6b1bc672343ef135db23988 (diff)
downloadmandoc-aea76a155da0e440cfa515021edaeb403116aa0b.tar.gz
mandoc-aea76a155da0e440cfa515021edaeb403116aa0b.tar.zst
mandoc-aea76a155da0e440cfa515021edaeb403116aa0b.zip
Add mparse_readmem, which allows application to run the parser directly
from memory, e.g. after de-compressing a document.
-rw-r--r--mandoc.h4
-rw-r--r--read.c96
2 files changed, 57 insertions, 43 deletions
diff --git a/mandoc.h b/mandoc.h
index 9529b30b..a37effc5 100644
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/* $Id: mandoc.h,v 1.98 2011/11/08 00:15:23 kristaps Exp $ */
+/* $Id: mandoc.h,v 1.99 2012/02/16 20:51:31 joerg Exp $ */
/*
* Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -418,6 +418,8 @@ struct mparse *mparse_alloc(enum mparset,
void mparse_free(struct mparse *);
void mparse_keep(struct mparse *);
enum mandoclevel mparse_readfd(struct mparse *, int, const char *);
+enum mandoclevel mparse_readmem(struct mparse *, const void *, size_t,
+ const char *);
void mparse_reset(struct mparse *);
void mparse_result(struct mparse *,
struct mdoc **, struct man **);
diff --git a/read.c b/read.c
index 6dab8e0a..5b14e357 100644
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/* $Id: read.c,v 1.27 2012/02/05 16:46:15 joerg Exp $ */
+/* $Id: read.c,v 1.28 2012/02/16 20:51:31 joerg Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -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