commit - d48e4545cb239c4e5af8d288009ef1bddaa44c8c
commit + 4e73234b1dbaf15f9776d9c17cfdb6b343108c75
blob - f765a58bd799b1610ccf215270064da34f0ce493
blob + a950840b7e4e7a30bb6e1e47ad890cc0e897ec42
--- content.c
+++ content.c
/*
* 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) {
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
/* 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 *);