/* common.c - Don Yang (uguu.org) 09/12/01 */ #include #include #include"common.h" /* Ring buffer */ BYTE RingBuffer[BUFFER_SIZE]; int ProcOffset; /* Current processing position */ int HistoryOffset; /* Start of buffered output */ int InputOffset; /* End of buffered input */ int FileSize; /* Input file size */ int iChecksum, oChecksum; /* Automatic checksum */ /***************************************************************** GetByte */ DWORD GetByte(int absoffset, FILE *infile) { int byte; if( absoffset < ProcOffset ) { assert(ProcOffset - absoffset < HALF_BUFFER_SIZE); return (DWORD)RingBuffer[absoffset & BUFFER_MASK]; } assert(absoffset - ProcOffset < HALF_BUFFER_SIZE); if( absoffset >= FileSize ) return INPUT_EOF; while( absoffset >= InputOffset ) { if( (byte = fgetc(infile)) == EOF ) { FileSize = InputOffset++; break; } RingBuffer[(InputOffset++) & BUFFER_MASK] = (BYTE)byte; iChecksum ^= byte; } if( absoffset >= FileSize ) return INPUT_EOF; return (DWORD)RingBuffer[absoffset & BUFFER_MASK]; } /* GetByte() */ /***************************************************************** PutByte */ void PutByte(BYTE data, FILE *outfile) { (void)fputc((int)data, outfile); oChecksum ^= (int)data; } /* PutByte() */ /***************************************************************** PutWord */ void PutWord(WORD data, FILE *outfile) { (void)fputc((int)(data & 0xff), outfile); (void)fputc((int)(data >> 8), outfile); } /* PutWord() */