diff --git a/pdf.c b/pdf.c index 06f920b78eae2008fe387998601a4605d6c13596..e053d8586cdaa851b821b2c7d23c18cbf78cb488 100644 --- a/pdf.c +++ b/pdf.c @@ -456,7 +456,17 @@ act_dict_(const HParseResult *p, void *env) #define act_array_ h_act_flatten HParsedToken * -act_longlength(const HParseResult *p, void *env) +act_shortlength(const HParseResult *p, void *u) +{ + uint8_t length = H_CAST_UINT(p->ast); + /* Length can range from 0-127, corresponding to the range 1-128, inclusive */ + uint8_t finallength = length+1; + + return H_MAKE_UINT(finallength); +} + +HParsedToken * +act_longlength(const HParseResult *p, void *u) { uint8_t length = H_CAST_UINT(p->ast); uint8_t finallength = 257-length; @@ -465,7 +475,7 @@ act_longlength(const HParseResult *p, void *env) } HParsedToken * -act_longrun(const HParseResult *p, void *env) +act_longrun(const HParseResult *p, void *u) { HCountedArray *seq = H_CAST_SEQ(p->ast); HParsedToken **elements = h_seq_elements(p->ast); @@ -482,6 +492,25 @@ act_longrun(const HParseResult *p, void *env) return res; } +HParsedToken * +act_rldstring(const HParseResult *p, void *u) +{ + HCountedArray *seq = H_CAST_SEQ(p->ast); + const HCountedArray *flattened_seq = h_seq_flatten(p->arena, p->ast); + uint8_t bytes_required; + uint8_t *result_bytes; + + bytes_required = flattened_seq->used - 1; + result_bytes = h_arena_malloc(p->arena, sizeof(uint8_t) * bytes_required); + + for (size_t i = 0; i < flattened_seq->used-1; ++i) + { + result_bytes[i] = H_CAST_UINT(flattened_seq->elements[i]); + } + + return H_MAKE_BYTES(result_bytes, bytes_required); +} + /* * input grammar */ @@ -503,7 +532,7 @@ init_runlengthdecode_parser(struct Env *aux) { H_RULE(rldeod, h_ch(0x80)); H_ARULE(longlength, h_ch_range(0x81, 0xFF)); - H_RULE(shortlength, h_ch_range(0x1, 0x7F)); + H_ARULE(shortlength, h_ch_range(0x0, 0x7F)); H_RULE(shortdata, h_uint8()); H_RULE(longdata, h_uint8()); @@ -511,7 +540,7 @@ init_runlengthdecode_parser(struct Env *aux) H_RULE(shortrun, h_length_value(shortlength, shortdata)); H_ARULE(longrun, SEQ(longlength, longdata)); - H_RULE(rldstring, SEQ(CHX(shortrun, longrun), IGN(rldeod))); + H_ARULE(rldstring, SEQ(h_many(CHX(shortrun, longrun)), IGN(rldeod))); p_rldstring = rldstring; }