ref: a9feb43f707673f7139317fac35e843d3bab7983
dir: /f_asciihex.c/
#include <u.h>
#include <libc.h>
#include "pdf.h"
/* 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,
};