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:
parent
e320fd11fe
commit
1fff0d9a0c
|
@ -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 **);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue