M README.md => README.md +0 -1
@@ 13,7 13,6 @@ specific object (text, images, fonts, etc).
## TODO
-* ASCIIHexDecode filter
* CryptDecode filter
* does DCTDecode filter need to deal with ColorTransform?
* do we need predictor 5 ("optimum")?
M f_asciihex.c => f_asciihex.c +47 -0
@@ 4,6 4,53 @@
/* 7.4.2 ASCIIHexDecode filter */
+static int
+hexc(int c)
+{
+ if(c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+ if(c >= '0' && c <= '9')
+ return c - '0';
+ if(c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ return -1;
+}
+
+static int
+flreadall(void *aux, Buffer *bi, Buffer *bo)
+{
+ int i, insz, c, c2;
+ uchar *in, b;
+
+ USED(aux);
+
+ in = bufdata(bi, &insz);
+ for(i = 0; i < insz;){
+ if((c = hexc(in[i++])) < 0){
+ if(isws(in[i-1]))
+ continue;
+ if(in[i-1] == '>')
+ break;
+badchar:
+ werrstr("invalid char %02x", in[i-1]);
+ return -1;
+ }
+ c2 = 0;
+ if(i < insz && (c2 = hexc(in[i++])) < 0){
+ if(in[i-1] != '>')
+ c2 = 0;
+ else
+ goto badchar;
+ }
+ b = c<<4 | c2;
+ bufput(bo, &b, 1);
+ }
+ bi->off = bi->sz;
+
+ return 0;
+}
+
Filter filterASCIIHex = {
.name = "ASCIIHexDecode",
+ .readall = flreadall,
};