From 6ab309e20733773d0a5039051086a6d86db3b43b Mon Sep 17 00:00:00 2001 From: Alex Marshall Date: Thu, 5 Feb 2009 15:23:41 -0800 Subject: Updated BRLAN info, and made the C side a bit moar modular --- general.c | 11 +++++++++++ general.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 general.c create mode 100644 general.h diff --git a/general.c b/general.c new file mode 100644 index 0000000..b0c03cd --- /dev/null +++ b/general.c @@ -0,0 +1,11 @@ +/* + * general.c + * + * + * Created by Alex Marshall on 09/01/30. + * Copyright 2009 __MyCompanyName__. All rights reserved. + * + */ + +#include "general.h" + diff --git a/general.h b/general.h new file mode 100644 index 0000000..86370c1 --- /dev/null +++ b/general.h @@ -0,0 +1,52 @@ +/* + * general.h + * + * + * Created by Alex Marshall on 09/01/30. + * Copyright 2009 __MyCompanyName__. All rights reserved. + * + */ + +#define fatal(x) printf(x); exit(1) + +void LZ77Decompress(void *indata, size_t dlen, u8* ret) +{ + int inp = 0; + u8* data = (u8*)calloc(dlen + 16, 1); + memcpy(data, indata, dlen); + int i; + u8 bitmask; + ret = (u8*)calloc(dlen, 256); // HORRIBLY INEFFICIENT. + // FIGURE SOMETHING ELSE OUT + int retoff = 0; + + while(inp < dlen) { + bitmask = data[inp]; + inp++; + + for(i = 0; i < 8; i++) { + if(bitmask & 0x80) { + u8 rep = data[inp]; + u8 repLength = (rep >> 4) + 3; + inp++; + u16 repOff = data[inp] | ((rep & 0x0F) << 8); + inp++; + + if(repOff <= retoff) { + fatal("Offset too high!\nQuitting\n"); + } + + while(repLength > 0) { + ret[retoff] = ret[(retoff - repOff) - 1]; + repLength--; + retoff++; + } + }else{ + ret[retoff] = data[inp]; + retoff++; + inp++; + } + bitmask = bitmask << 1; + } + } +} -- cgit v1.3.1