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>
|
* 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_free(struct mparse *);
|
||||||
void mparse_keep(struct mparse *);
|
void mparse_keep(struct mparse *);
|
||||||
enum mandoclevel mparse_readfd(struct mparse *, int, const char *);
|
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_reset(struct mparse *);
|
||||||
void mparse_result(struct mparse *,
|
void mparse_result(struct mparse *,
|
||||||
struct mdoc **, struct man **);
|
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) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
|
||||||
* Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
|
* Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
|
||||||
|
@ -28,6 +28,7 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -37,6 +38,7 @@
|
||||||
#include "libmandoc.h"
|
#include "libmandoc.h"
|
||||||
#include "mdoc.h"
|
#include "mdoc.h"
|
||||||
#include "man.h"
|
#include "man.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
#ifndef MAP_FILE
|
#ifndef MAP_FILE
|
||||||
#define MAP_FILE 0
|
#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_buf_r(struct mparse *, struct buf, int);
|
||||||
static void mparse_readfd_r(struct mparse *, int, const char *, int);
|
static void mparse_readfd_r(struct mparse *, int, const char *, int);
|
||||||
static void pset(const char *, int, struct mparse *);
|
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 int read_whole_file(const char *, int, struct buf *, int *);
|
||||||
static void mparse_end(struct mparse *);
|
static void mparse_end(struct mparse *);
|
||||||
|
|
||||||
|
@ -547,38 +548,6 @@ rerun:
|
||||||
free(ln.buf);
|
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
|
static int
|
||||||
read_whole_file(const char *file, int fd, struct buf *fb, int *with_mmap)
|
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
|
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;
|
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)
|
||||||
if (-1 == (fd = open(file, O_RDONLY, 0))) {
|
if (-1 == (fd = open(file, O_RDONLY, 0))) {
|
||||||
perror(file);
|
perror(file);
|
||||||
curp->file_status = MANDOCLEVEL_SYSERR;
|
curp->file_status = MANDOCLEVEL_SYSERR;
|
||||||
return;
|
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;
|
if ( ! read_whole_file(file, fd, &blk, &with_mmap)) {
|
||||||
curp->file = file;
|
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)
|
#ifdef HAVE_MMAP
|
||||||
mparse_end(curp);
|
if (with_mmap)
|
||||||
|
munmap(blk.buf, blk.sz);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
free(blk.buf);
|
||||||
|
|
||||||
if (STDIN_FILENO != fd && -1 == close(fd))
|
if (STDIN_FILENO != fd && -1 == close(fd))
|
||||||
perror(file);
|
perror(file);
|
||||||
|
|
||||||
curp->file = svfile;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum mandoclevel
|
enum mandoclevel
|
||||||
|
|
Loading…
Reference in New Issue