From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mo-p00-ob.rzone.de (mo-p00-ob.rzone.de [81.169.146.160]) by krisdoz.my.domain (8.14.5/8.14.5) with ESMTP id q1FEObkJ017791 for ; Wed, 15 Feb 2012 09:24:38 -0500 (EST) X-RZG-AUTH: :JiIXek6mfvEEUpFQdo7Fj1/zg48CFjWjQv0cW+St/nW/avgusCdvwXOZ/NA7x/bslxlDPy6G726REW7piU2JIqNTwRM= X-RZG-CLASS-ID: mo00 Received: from britannica.bec.de ([2001:6f8:13f0:0:5e26:aff:fe1e:99a9]) by smtp.strato.de (klopstock mo55) (RZmta 27.6 AUTH) with (DHE-RSA-AES128-SHA encrypted) ESMTPA id y04bebo1FDFmwU for ; Wed, 15 Feb 2012 15:24:26 +0100 (MET) Received: by britannica.bec.de (sSMTP sendmail emulation); Wed, 15 Feb 2012 15:24:24 +0100 Date: Wed, 15 Feb 2012 15:24:24 +0100 From: Joerg Sonnenberger To: tech@mdocml.bsd.lv Subject: Support parsing directly from memory Message-ID: <20120215142422.GA3664@britannica.bec.de> Mail-Followup-To: tech@mdocml.bsd.lv X-Mailinglist: mdocml-tech Reply-To: tech@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="ikeVEW9yuYc//A+q" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) --ikeVEW9yuYc//A+q Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 --ikeVEW9yuYc//A+q Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="readmem.diff" 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 #include #include +#include #include #include #include @@ -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 --ikeVEW9yuYc//A+q-- -- To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv