tech@mandoc.bsd.lv
 help / color / mirror / Atom feed
* Support parsing directly from memory
@ 2012-02-15 14:24 Joerg Sonnenberger
  0 siblings, 0 replies; only message in thread
From: Joerg Sonnenberger @ 2012-02-15 14:24 UTC (permalink / raw)
  To: tech

[-- Attachment #1: Type: text/plain, Size: 216 bytes --]

Hi all,
the attached code slighty refactors read.c and adds a new frontend to
allow parsing directly from memory. This is useful if the document is
stored elsewhere or has to be de-compressed first. Comments?

Joerg

[-- Attachment #2: readmem.diff --]
[-- Type: text/x-diff, Size: 4296 bytes --]

Index: mandoc.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/external/bsd/mdocml/dist/mandoc.h,v
retrieving revision 1.1.1.9
diff -u -p -r1.1.1.9 mandoc.h
--- mandoc.h	30 Jan 2012 16:44:19 -0000	1.1.1.9
+++ mandoc.h	15 Feb 2012 13:54:00 -0000
@@ -418,6 +418,8 @@ struct mparse	 *mparse_alloc(enum mparse
 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 **);
Index: read.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/external/bsd/mdocml/dist/read.c,v
retrieving revision 1.5
diff -u -p -r1.5 read.c
--- read.c	6 Feb 2012 10:42:44 -0000	1.5
+++ read.c	15 Feb 2012 13:55:55 -0000
@@ -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 *, s
 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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2012-02-15 14:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-15 14:24 Support parsing directly from memory Joerg Sonnenberger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).