Merge mandoc.h r1.99 and read.c 1.28 from upstream:

Add mparse_readmem, which allows application to run the parser directly
from memory, e.g. after de-compressing a document.
This commit is contained in:
joerg 2012-02-16 20:58:23 +00:00
parent e320fd11fe
commit 1fff0d9a0c
2 changed files with 57 additions and 43 deletions

View File

@ -1,4 +1,4 @@
/* $Vendor-Id: mandoc.h,v 1.98 2011/11/08 00:15:23 kristaps Exp $ */
/* $Vendor-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 **);

View File

@ -1,4 +1,4 @@
/* $Vendor-Id: read.c,v 1.27 2012/02/05 16:46:15 joerg Exp $ */
/* $Vendor-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