#include #include /* cc ulzdec.c -o ulzdec && ./ulzdec compressed.bin */ static int error(const char *name, const char *msg) { fprintf(stderr, "%s: %s\n", name, msg); return 0; } char *mem, *ptr; void decode_ulz(FILE *src) { char c, *copy; short i, length; while((c = getc(src)) != EOF) { if(c & 0x80) { /* DICT */ if(c & 0x40) length = (c & 0x3f) << 8 | getc(src); else length = c & 0x3f; copy = ptr - (getc(src) + 1); for(i = 0; i < length + 4; i++) *(ptr++) = *(copy++); } else /* LIT */ for(i = 0; i < c + 1; i++) *(ptr++) = getc(src); } } int main(int argc, char *argv[]) { char *res; FILE *src; if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v') return !fprintf(stdout, "Ulzdec - ULZ Decoder, 15 Nov 2023.\n"); if(argc != 2) return error("usage", "ulzdec [-v] compressed.bin"); if(!(src = fopen(argv[1], "rb"))) return !error("Invalid input", argv[1]); mem = malloc(0x10000); ptr = mem; decode_ulz(src); *(ptr) = 0; printf("%s\n", mem); return 0; }