From 11d8191be872465a09f858df998bc090d5c03ba9 Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Fri, 13 Jan 2023 09:58:32 +0000
Subject: [PATCH] remove elemr and elemd

If we are using packrat, we can use objs = MANY_WS(obj) for the object
streams as well.
---
 pdf.c | 23 ++++++-----------------
 1 file changed, 6 insertions(+), 17 deletions(-)

diff --git a/pdf.c b/pdf.c
index 71b606e..5fea322 100644
--- a/pdf.c
+++ b/pdf.c
@@ -1079,7 +1079,7 @@ validate_dict_(HParseResult *p, void *u)
 	return true;
 }
 
-#define act_array_ h_act_flatten
+#define act_objs h_act_flatten
 
 HParsedToken *
 act_shortlength(const HParseResult *p, void *u)
@@ -2245,7 +2245,7 @@ HParser *p_ahexstream;
 HParser *p_rldstring;
 HParser *p_ws;
 HParser *p_wel;
-HParser *p_elemr;
+HParser *p_objs;
 HParser *p_npair;
 HParser *p_bytes;
 HParser *p_textstream;
@@ -2414,22 +2414,11 @@ init_parser(struct Env *aux)
 	h_bind_indirect(dict, dict_);
 
 	/* arrays */
-	H_RULE(elemd,	h_indirect());	/* elements following a delimiter */
-	H_RULE(elemr,	h_indirect());	/* elements following a regular char */
+	H_ARULE(objs,	MANY_WS(obj));
 	H_AVDRULE(array_begin, lbrack, aux); /* semantic action and validation implementing a limit on how deeply arrays can be nested */
 
 	H_AVDRULE(array_end, rbrack, aux); /* nesting limit and counter underflow check */
-	H_ARULE(array_,	h_middle(array_begin, MANY_WS(obj), array_end));
-	H_RULE(elemd_,	CHX(SEQ(ws, dobj, elemd),
-			    SEQ(ws, name, elemr),
-			    SEQ(ws, robj, elemr),
-			    ws));
-	H_RULE(elemr_,	CHX(SEQ(ws, dobj, elemd),
-			    SEQ(ws, name, elemr),
-			    SEQ(wel,ws, robj, elemr),
-			    ws));
-	h_bind_indirect(elemd, elemd_);
-	h_bind_indirect(elemr, elemr_);
+	H_RULE(array_,	h_middle(array_begin, MANY_WS(obj), array_end));
 	h_bind_indirect(array, array_);
 
 	/* streams */
@@ -2639,7 +2628,7 @@ init_parser(struct Env *aux)
 	p_ahexstream = ahexstream;
 	p_ws         = ws;
 	p_wel        = wel;
-	p_elemr      = h_action(elemr, h_act_flatten, NULL);
+	p_objs       = objs;
 	p_npair      = npair;
 	p_bytes      = bytes;
 	p_textstream = txtstream;
@@ -4746,7 +4735,7 @@ p_objstm__m(HAllocator *mm__, const Dict *dict)
 	HParser *wel_ws = h_sequence__m(mm__, p_wel, p_ws, NULL);
 	HParser *idx = p_sepBy_n__m(mm__, p_npair, wel_ws, N);
 
-	HParser *p_ostm = h_sequence__m(mm__, p_ws, idx, p_elemr, p_ws, NULL);
+	HParser *p_ostm = h_sequence__m(mm__, p_ws, idx, p_objs, p_ws, NULL);
 		// XXX plain indirect references not allowed in object streams
 		// ISO 32000-2:2020, 7.5.7 "Object streams":
 		// > An object in an object stream shall not consist solely of
-- 
GitLab