Sigrid Solveig Haflínudóttirugly unclean unfinished and raw0c124f713 years agoHistory
126 lines · 1.6 KB · C
RawDownload
#include "spotifs.h"#include <flate.h> enum {	Bufsz = 4096}; static int	Bufinflget(void *src);static int	Bufinflwr(void *dst, void *src, int size); Buf*Bufnew(void){	Buf *b; 	b = malloc(sizeof(*b));	if(b == nil)		abort();	b->allocated = Bufsz;	b->data = malloc(b->allocated);	if(b->data == nil)		abort();	b->size = 0;	return b;} voidBuffree(Buf *b){	if(b == nil)		return;	if(b->data != nil)		free(b->data);	free(b);} voidBufwrite(Buf *b, uchar *data, int size){	Bufgrow(b, size);	memcpy(&b->data[b->size], data, size);	b->size += size;} intBufread(Buf *b, int fd, int size){	int r; 	Bufgrow(b, size);	if((r = read(fd, &b->data[b->size], size)) > 0)		b->size += r;	return r;} voidBufu8(Buf *b, uchar u){	Bufwrite(b, &u, 1);} voidBufu16(Buf *b, ushort u){	uchar data[2]; 	data[0] = u>>8;	data[1] = u;	Bufwrite(b, data, 2);} voidBufu32(Buf *b, uint u){	uchar data[4]; 	data[0] = u>>24;	data[1] = u>>16;	data[2] = u>>8;	data[3] = u;	Bufwrite(b, data, 4);} intBufinflate(Buf *dst, Buf *src){	int r; 	/* skip the header */	src->i = 10; 	r = inflate(dst, Bufinflwr, src, Bufinflget);	if(r != 0)		werrstr("inflatezlib failed (%s)", flateerr(r)); 	return r;} voidBufgrow(Buf *b, int size){	if(b->allocated - b->size < size){		b->allocated += size+Bufsz - size%Bufsz;		b->data = realloc(b->data, b->allocated);		if(b->data == nil)			abort();	}} static intBufinflget(void *src){	Buf *b; 	b = src;	if(b->i >= b->size)		return -1;	return b->data[b->i++];} static intBufinflwr(void *dst, void *src, int size){	Bufwrite(dst, src, size);	return size;}