commit 4e73234b1dbaf15f9776d9c17cfdb6b343108c75 from: Sven M. Hallberg date: Sun Jul 02 12:46:49 2023 UTC fix argument representation for act_op 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 *);