tttm

git clone https://orangeshoelaces.net/git/tttm.git

e4a3ccfd4afc781dd1d4373ed6cda08b9ed547f7

Author: Vasily Kolobkov on 05/15/2016

Committer: Vasily Kolobkov on 05/15/2016

Pull off parsing given at least one storage medium

Stats

errors.h  |  3 +-
laxsrc.c  |  2 +-
parser.c  | 25 +++++---
parser.h  |  2 +-
pshades.c |  9 +--
5 files changed, 24 insertions(+), 17 deletions(-)

Patch

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);