git clone https://orangeshoelaces.net/git/tttm.git
Author: Vasily Kolobkov on 05/15/2016
Committer: Vasily Kolobkov on 05/15/2016
Pull off parsing given at least one storage medium
errors.h | 3 +-
laxsrc.c | 2 +-
parser.c | 25 +++++---
parser.h | 2 +-
pshades.c | 9 +--
5 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/errors.h b/errors.h
index 03a3233..b6a0823 100644
--- a/errors.h
+++ b/errors.h
@@ -4,9 +4,10 @@ enum {
TE_EOF,
TE_IO,
TE_TIMEOUT,
- TE_BUFOFLOW,
+ TE_BBOFLOW,
TE_PARSE,
+ TE_BUFOFLOW,
TE_CACHEIO,
TE_CACHEOFLOW,
TE_PTOFLOW,
diff --git a/laxsrc.c b/laxsrc.c
index f680844..09eaef3 100644
--- a/laxsrc.c
+++ b/laxsrc.c
@@ -96,6 +96,6 @@ laxsrc_putback(struct laxsrc *s, char *chunk, size_t len)
exit:
return e;
eoflow:
- e = TE_BUFOFLOW;
+ e = TE_BBOFLOW;
goto exit;
}
diff --git a/parser.c b/parser.c
index d8cfd3c..7b8a854 100644
--- a/parser.c
+++ b/parser.c
@@ -155,13 +155,13 @@ struct parctx {
typedef int parfn(struct parctx *);
-int par_readln(struct laxsrc *, int, char *, size_t, union parnode *, size_t);
+int par_readln(struct laxsrc *, char *, size_t, int, union parnode *, size_t);
static int cmpchr(const void *, const void *);
static int contains(const char *, size_t, char);
-static void par_init(struct parctx *, struct laxsrc *, int,
- char *, size_t, union parnode *, size_t);
+static void par_init(struct parctx *, struct laxsrc *,
+ char *, size_t, int, union parnode *, size_t);
static int par_procure(struct parctx *, size_t, size_t);
static int par_movewnd(struct parctx *, size_t);
static int par_primecache(struct parctx *);
@@ -315,13 +315,13 @@ static int p_opar(struct parctx *);
static int p_sp(struct parctx *);
int
-par_readln(struct laxsrc *in, int cache, char *buf, size_t buflen,
+par_readln(struct laxsrc *in, char *buf, size_t buflen, int cache,
union parnode *pt, size_t ptlen)
{
int e;
struct parctx p;
- par_init(&p, in, cache, buf, buflen, pt, ptlen);
+ par_init(&p, in, buf, buflen, cache, pt, ptlen);
p_respln(&p);
e = par_backup(&p);
return e ? e : p.e;
@@ -340,8 +340,8 @@ contains(const char *s, size_t slen, char c)
}
void
-par_init(struct parctx *p, struct laxsrc *in, int cache,
- char *buf, size_t buflen, union parnode *pt, size_t ptlen)
+par_init(struct parctx *p, struct laxsrc *in, char *buf, size_t buflen,
+ int cache, union parnode *pt, size_t ptlen)
{
bzero(p, sizeof(*p));
p->cur.pt = pt;
@@ -401,6 +401,9 @@ par_movewnd(struct parctx *p, size_t off)
goto finwnd;
}
+ if (p->cache == -1)
+ goto ebufoflow;
+
if (p->strstor == SS_MEM) {
if ((e = par_primecache(p)))
goto exit;
@@ -424,6 +427,9 @@ par_movewnd(struct parctx *p, size_t off)
p->wndoff = off;
exit:
return e;
+ ebufoflow:
+ e = TE_BUFOFLOW;
+ goto exit;
evm:
e = TE_VM;
goto exit;
@@ -444,6 +450,10 @@ par_primecache(struct parctx *p)
if ((e = par_prycache(p, p->buflen)))
goto exit;
+ p->strstor = SS_CACHE;
+ if (p->buflen == 0)
+ goto exit;
+
ci = mmap(0, p->buflen, PROT_WRITE, MAP_PRIVATE, p->cache, p->corig);
if (ci == MAP_FAILED)
goto evm;
@@ -452,7 +462,6 @@ par_primecache(struct parctx *p)
if (munmap(ci, p->buflen) == -1)
goto evm;
- p->strstor = SS_CACHE;
exit:
return e;
eio:
diff --git a/parser.h b/parser.h
index ace2893..c649e16 100644
--- a/parser.h
+++ b/parser.h
@@ -132,4 +132,4 @@ union parnode {
struct laxsrc;
-int par_readln(struct laxsrc *, int, char *, size_t, union parnode *, size_t);
+int par_readln(struct laxsrc *, char *, size_t, int, union parnode *, size_t);
diff --git a/pshades.c b/pshades.c
index d301775..8b98251 100644
--- a/pshades.c
+++ b/pshades.c
@@ -15,8 +15,9 @@ char *errors[] = {
[TE_EOF] = "unexpected eof",
[TE_IO] = "source i/o",
[TE_TIMEOUT] = "source read timed out",
- [TE_BUFOFLOW] = "source back buffer overflown",
+ [TE_BBOFLOW] = "source back buffer overflown",
[TE_PARSE] = "input not recognized",
+ [TE_BUFOFLOW] = "response buffer overflown",
[TE_CACHEIO] = "cache i/o",
[TE_CACHEOFLOW] = "cache overflown",
[TE_PTOFLOW] = "cannot fit parse tree within supplied space",
@@ -62,15 +63,11 @@ main(int argc, char **argv)
{
int e;
struct laxsrc in;
- int cache;
char ln[1024];
union parnode pt[1024];
laxsrc_init(&in, STDIN_FILENO);
- if ((cache = open("cache", O_RDWR | O_CREAT)) == -1)
- err(1, "can't open cache");
-
- if ((e = par_readln(&in, cache, ln, LEN(ln), pt, LEN(pt))))
+ if ((e = par_readln(&in, ln, LEN(ln), -1, pt, LEN(pt))))
errx(1, "error parsing input: %s", errors[e]);
ptprint(pt, ln, 0);