shithub: pdffs

ref: b3610440c27ad0b930290179daf1f18d5a675686
dir: /f_flate.c/

View raw version
#include <u.h>
#include <libc.h>
#include <flate.h>
#include "pdf.h"

/* 7.4.4 FlateDecode filter */

static int
bw(void *aux, void *d, int n)
{
	return bufput(aux, d, n);
}

static int
bget(void *aux)
{
	uchar c;

	return bufget(aux, &c, 1) == 1 ? c : -1;
}

static int
flreadall(void *aux, Buffer *bi, Buffer *bo)
{
	int r;

	do{
		r = inflatezlib(bo, bw, bi, bget);
	}while(r == FlateOk && !bufeof(bi));

	if(r != FlateOk && bufleft(bo) < 1){
		werrstr("%s", flateerr(r));
		return -1;
	}

	return unpredict(aux, bo);
}

Filter filterFlate = {
	.name = "FlateDecode",
	.readall = flreadall,
	.open = flopenpredict,
	.close = flclosepredict,
};