Commit Diff


commit - d48e4545cb239c4e5af8d288009ef1bddaa44c8c
commit + 4e73234b1dbaf15f9776d9c17cfdb6b343108c75
blob - f765a58bd799b1610ccf215270064da34f0ce493
blob + a950840b7e4e7a30bb6e1e47ad890cc0e897ec42
--- content.c
+++ content.c
@@ -103,13 +103,17 @@ act_op(const HParseResult *p, void *u)
 	/* 
 	 * AST cases with and without operands:
 	 * p = ((object ...) keyword)
-	 * p = keyword
+	 * p = (keyword)
 	 */
-	if (p->ast->token_type == TT_SEQUENCE) {
+	assert(p->ast != NULL);
+	assert(p->ast->token_type == TT_SEQUENCE);
+	assert(h_seq_len(p->ast) > 0);
+	if (h_seq_len(p->ast) > 1) {
+		assert(h_seq_len(p->ast) == 2);		/* ((obj ...) kw) */
 		operator = H_FIELD_BYTES(1);
 		operands = H_FIELD_SEQ(0);
 	} else
-		operator = H_CAST_BYTES(p->ast);
+		operator = H_FIELD_BYTES(0);
 
 	co->opname = bstrdup(p->arena, operator);
 	if (operands != NULL) {
@@ -290,106 +294,108 @@ init_content_parser(void)
 	H_RULE(prop,	CHX(nam, dic));	/* property list */
 	H_RULE(arr_d,	h_middle(lbrack, h_many(nnn), rbrack));
 	H_RULE(arr_TJ,	h_middle(lbrack, h_many(CHX(str, num)), rbrack));
+	H_RULE(eps,	h_epsilon_p());
 
 /* short-hand for defining the operator rules below */
-#define OP(X, P) H_RULE(op_ ## X, h_action((P), act_op, (void *)OP_ ## X))
+#define OP(SYM, PA, PN) \
+    H_RULE(op_ ## SYM, h_action(SEQ(PA, PN), act_op, (void *)OP_ ## SYM))
 
 	/* compatibility operators (table 33) */
-	OP(BX,		KW("BX"));
-	OP(EX,		KW("EX"));
+	OP(BX,		eps, KWD("BX"));
+	OP(EX,		eps, KWD("EX"));
 
 	/* path construction operators (table 58) */
-	OP(c,		SEQ(num, num, num, num, num, num, KW("c")));
-	OP(h,		KW("h"));
-	OP(l,		SEQ(num, num, KW("l")));
-	OP(m,		SEQ(num, num, KW("m")));
-	OP(re,		SEQ(num, num, num, num, KW("re")));
-	OP(v,		SEQ(num, num, num, num, KW("v")));
-	OP(y,		SEQ(num, num, num, num, KW("y")));
+	OP(c,		SEQ(num, num, num, num, num, num), KWD("c"));
+	OP(h,		eps, KWD("h"));
+	OP(l,		SEQ(num, num), KWD("l"));
+	OP(m,		SEQ(num, num), KWD("m"));
+	OP(re,		SEQ(num, num, num, num), KWD("re"));
+	OP(v,		SEQ(num, num, num, num), KWD("v"));
+	OP(y,		SEQ(num, num, num, num), KWD("y"));
 
 	/* path-painting operators (table 59) */
-	OP(b,		KW("b"));
-	OP(B,		KW("B"));
-	OP(bstar,	KW("b*"));
-	OP(Bstar,	KW("B*"));
-	OP(f,		CHX(KW("f"), KW("F")));
-	OP(fstar,	KW("f*"));
-	OP(n,		KW("n"));
-	OP(s,		KW("s"));
-	OP(S,		KW("S"));
+	OP(b,		eps, KWD("b"));
+	OP(B,		eps, KWD("B"));
+	OP(bstar,	eps, KWD("b*"));
+	OP(Bstar,	eps, KWD("B*"));
+	OP(f,		eps, CHX(KWD("f"), KWD("F")));
+	OP(fstar,	eps, KWD("f*"));
+	OP(n,		eps, KWD("n"));
+	OP(s,		eps, KWD("s"));
+	OP(S,		eps, KWD("S"));
 
 	/* clipping path operators (table 60) */
-	OP(W,		KW("W"));
-	OP(Wstar,	KW("W*"));
+	OP(W,		eps, KWD("W"));
+	OP(Wstar,	eps, KWD("W*"));
 
 	/* marked-content operators (table 352) */
-	OP(BDC,		SEQ(nam, prop, KW("BDC")));
-	OP(BMC,		SEQ(nam, KW("BMC")));
-	OP(EMC,		KW("EMC"));
-	OP(DP,		SEQ(nam, prop, KW("DP")));
-	OP(MP,		SEQ(nam, KW("MP")));
+	OP(BDC,		SEQ(nam, prop), KWD("BDC"));
+	OP(BMC,		SEQ(nam), KWD("BMC"));
+	OP(EMC,		eps, KWD("EMC"));
+	OP(DP,		SEQ(nam, prop), KWD("DP"));
+	OP(MP,		SEQ(nam), KWD("MP"));
 
 	/* color operators (table 73) */
-	OP(CS,		SEQ(nam, KW("CS")));
-	OP(cs,		SEQ(nam, KW("cs")));
-	OP(SC,		SEQ(h_many1(num), KW("SC")));
-	OP(sc,		SEQ(h_many1(num), KW("sc")));
-	OP(SCN,		SEQ(h_many(num), OPT(nam), KW("SCN")));
-	OP(scn,		SEQ(h_many(num), OPT(nam), KW("scn")));
-	OP(G,		SEQ(num, KW("G")));
-	OP(g,		SEQ(num, KW("g")));
-	OP(RG,		SEQ(num, num, num, KW("RG")));
-	OP(rg,		SEQ(num, num, num, KW("rg")));
-	OP(K,		SEQ(num, num, num, num, KW("K")));
-	OP(k,		SEQ(num, num, num, num, KW("k")));
+	OP(CS,		SEQ(nam), KWD("CS"));
+	OP(cs,		SEQ(nam), KWD("cs"));
+	OP(SC,		h_many1(num), KWD("SC"));
+	OP(sc,		h_many1(num), KWD("sc"));
+	OP(SCN,		SEQ(h_many(num), OPT(nam)), KWD("SCN"));
+	OP(scn,		SEQ(h_many(num), OPT(nam)), KWD("scn"));
+	OP(G,		SEQ(num), KWD("G"));
+	OP(g,		SEQ(num), KWD("g"));
+	OP(RG,		SEQ(num, num, num), KWD("RG"));
+	OP(rg,		SEQ(num, num, num), KWD("rg"));
+	OP(K,		SEQ(num, num, num, num), KWD("K"));
+	OP(k,		SEQ(num, num, num, num), KWD("k"));
 
 	/* graphics state operators (table 56) */
-	OP(cm,		SEQ(num, num, num, num, num, num, KW("cm")));
-	OP(d,		SEQ(arr_d, num, KW("d")));
-	OP(gs,		SEQ(nam, KW("gs")));
-	OP(i,		SEQ(nnn, KW("i")));
-	OP(j,		SEQ(nat, KW("j")));
-	OP(J,		SEQ(nat, KW("J")));
-	OP(M,		SEQ(nat, KW("M")));
-	OP(q,		KW("q"));
-	OP(Q,		KW("Q"));
-	OP(ri,		SEQ(nam, KW("ri")));
-	OP(w,		SEQ(num, KW("w")));
+	OP(cm,		SEQ(num, num, num, num, num, num), KWD("cm"));
+	OP(d,		SEQ(arr_d, num), KWD("d"));
+	OP(gs,		SEQ(nam), KWD("gs"));
+	OP(i,		SEQ(nnn), KWD("i"));
+	OP(j,		SEQ(nat), KWD("j"));
+	OP(J,		SEQ(nat), KWD("J"));
+	OP(M,		SEQ(nat), KWD("M"));
+	OP(q,		eps, KWD("q"));
+	OP(Q,		eps, KWD("Q"));
+	OP(ri,		SEQ(nam), KWD("ri"));
+	OP(w,		SEQ(num), KWD("w"));
 
 	/* inline image operators (table 90) */
-	OP(BI,		KW("BI"));
-	OP(ID,		KW("ID"));
-	OP(EI,		KW("EI"));
+	OP(BI,		eps, KWD("BI"));
+	OP(ID,		eps, KWD("ID"));
+	OP(EI,		eps, KWD("EI"));
 
 	/* Type 3 font operators (table 111) */
-	OP(d0,		SEQ(num, num, KW("d0")));
-	OP(d1,		SEQ(num, num, num, num, num, num, KW("d1")));
+	OP(d0,		SEQ(num, num), KWD("d0"));
+	OP(d1,		SEQ(num, num, num, num, num, num), KWD("d1"));
 
 	/* XObject operator (table 86) */
-	OP(Do,		SEQ(nam, KW("Do")));
+	OP(Do,		SEQ(nam), KWD("Do"));
 
 	/* shading operator (table 76) */
-	OP(sh,		SEQ(nam, KW("sh")));
+	OP(sh,		SEQ(nam), KWD("sh"));
 
 	/* text operators (tables 103, 106, 107) */
-	OP(BT,		KW("BT"));
-	OP(ET,		KW("ET"));
-	OP(Tc,		SEQ(num, KW("Tc")));
-	OP(Td,		SEQ(num, num, KW("Td")));
-	OP(TD,		SEQ(num, num, KW("TD")));
-	OP(Tf,		SEQ(nam, num, KW("Tf")));
-	OP(Tj,		SEQ(str, KW("Tj")));
-	OP(TJ,		SEQ(arr_TJ, KW("TJ")));
-	OP(TL,		SEQ(num, KW("TL")));
-	OP(Tm,		SEQ(num, num, num, num, num, num, KW("Tm")));
-	OP(Tr,		SEQ(nat, KW("Tr")));
+	OP(BT,		eps, KWD("BT"));
+	OP(ET,		eps, KWD("ET"));
+	OP(Tc,		SEQ(num), KWD("Tc"));
+	OP(Td,		SEQ(num, num), KWD("Td"));
+	OP(TD,		SEQ(num, num), KWD("TD"));
+	OP(Tf,		SEQ(nam, num), KWD("Tf"));
+	OP(Tj,		SEQ(str), KWD("Tj"));
+	OP(TJ,		SEQ(arr_TJ), KWD("TJ"));
+	OP(TL,		SEQ(num), KWD("TL"));
+	OP(Tm,		SEQ(num, num, num, num, num, num), KWD("Tm"));
+	OP(Tr,		SEQ(nat), KWD("Tr"));
 	    /* NB spec says "integer" arg for Tr but only defines modes >= 0 */
-	OP(Ts,		SEQ(num, KW("Ts")));
-	OP(Tw,		SEQ(num, KW("Tw")));
-	OP(Tz,		SEQ(num, KW("Tz")));
-	OP(Tstar,	KW("T*"));
-	OP(dquote,	SEQ(num, num, str, KW("\"")));
-	OP(squote,	SEQ(str, KW("'")));
+	OP(Ts,		SEQ(num), KWD("Ts"));
+	OP(Tw,		SEQ(num), KWD("Tw"));
+	OP(Tz,		SEQ(num), KWD("Tz"));
+	OP(Tstar,	eps, KWD("T*"));
+	OP(dquote,	SEQ(num, num, str), KWD("\""));
+	OP(squote,	SEQ(str), KWD("'"));
 
 #undef OP
 
blob - b4a049a29f1161ec5e2ed0cf4d4051f57b36af63
blob + 0cd14d2d12a260708f251872adcb168a040b53c1
--- pdf.h
+++ pdf.h
@@ -22,7 +22,8 @@ extern HParser *p_nat, *p_numbnn, *p_numb;
 
 /* tokenization */
 #define TOK(X)		h_middle(p_ws, X, h_not(p_rchar))
-#define KW(S)		IGN(TOK(LIT(S)))
+#define KWD(S)		TOK(LIT(S))
+#define KW(S)		IGN(KWD(S))
 
 /* continuations for h_bind() */
 HParser *kstream(HAllocator *, const HParsedToken *, void *);