#include #include #include #include int fileOffset = 0; int gIndent = 0; char indentBuf[256]; int lastIndent = 0; void error(char *s, ...) { va_list ap; va_start(ap, s); vprintf(s, ap); va_end(ap); putchar('\n'); exit(-1); } void warning(char *s, ...) { va_list ap; va_start(ap, s); vprintf(s, ap); va_end(ap); putchar('\n'); } char *indent() { int i; if(gIndent>63) error("indent level > 63!"); if(lastIndent != gIndent) { for(i=0; i<3*gIndent; ++i) indentBuf[i] = ' '; indentBuf[i] = '\0'; lastIndent = gIndent; } return indentBuf; } int buffer; int bufbits = 0; /* # of bits in buffer */ void byteAlign() { if(bufbits > 0) { bufbits = 0; buffer = 0; } } int readBits(FILE *f, int number) { int ret = buffer; if(number == bufbits) { bufbits = 0; buffer = 0; return ret; } if(number > bufbits) { number -= bufbits; while(number>8) { ret <<= 8; ret += fgetc(f); ++fileOffset; number -= 8; } ++fileOffset; buffer = fgetc(f); if(number>0) { ret <<= number; bufbits = 8-number; ret += buffer >> (8-number); buffer &= (1<> (bufbits-number); bufbits -= number; buffer &= (1<= buflen-2) { buf = (char *)realloc(buf, sizeof(char)*(buflen+256)); buflen += 256; p = buf+len; } switch(c) { case '\n': *(p++) = '\\'; *(p++) = 'n'; ++len; break; case '\t': *(p++) = '\\'; *(p++) = 't'; ++len; break; case '\r': *(p++) = '\\'; *(p++) = 'r'; ++len; break; default: *(p++) = c; } ++len; } *p = 0; return buf; } void dumpBytes(FILE *f, int length) { int j=0, i, k, l=0; unsigned char buf[16]; if(length<=0) return; putchar('\n'); for(;; ++l) { printf("%03x0: ", l); for(i=0; i<16; ++i) { if(i==8) putchar(' '); printf("%02x ", buf[i] = readUInt8(f)); ++j; if(j==length) break; } if(j==length) { for(k=i+1; k<16; ++k) printf(" "); if(k==8) putchar(' '); ++i; } printf(" "); for(k=0; k 31) && (buf[k] < 128)) putchar(buf[k]); else putchar('.'); } putchar('\n'); if(j==length) break; } putchar('\n'); putchar('\n'); } void dumpBuffer(unsigned char *buf, int length) { int j=0, i, k, l=0; if(length<=0) return; putchar('\n'); for(;; ++l) { printf("%03x0: ", l); for(i=0; i<16; ++i) { if(i==8) putchar(' '); printf("%02x ", buf[16*l+i]); ++j; if(j==length) break; } if(j==length) { for(k=i+1; k<16; ++k) printf(" "); if(k==8) putchar(' '); ++i; } printf(" "); for(k=0; k 31) && (buf[16*l+k] < 128)) putchar(buf[16*l+k]); else putchar('.'); } putchar('\n'); if(j==length) break; } putchar('\n'); putchar('\n'); }