class File { U8 *filename; U8 *data; U8 *idata; U8 *mode; U32 size; U32 pos; U32 initial_offset; }; U0 file_close(File *file) { if (!StrCmp("wb", file->mode)) { if(file->data) { FileWrite(file->filename, file->data, file->size); } } if(file->idata) { Free(file->idata); return; } if(file->data) { Free(file->data); } } U32 file_get_current_position(File *file) { if (file) return file->pos; return 0; } U32 file_get_filesize(File *file) { if (file) return file->size; return 0; } Bool file_open(U8 *filename, U8 *mode, File *file) { if (!StrCmp("rb", mode)) { if (!FileFind(filename)) { "Failed opening '%s'\n", filename; return FALSE; } file->filename = StrNew(filename); file->data = FileRead(filename, &file->size); file->idata = NULL; file->mode = StrNew(mode); file->pos = 0; file->initial_offset = 0; return TRUE; } // FIXME: add "wb" mode if (!StrCmp("wb", mode)) { file->filename = StrNew(filename); file->data = CAlloc(WB_SIZE); file->idata = NULL; file->mode = StrNew(mode); file->pos = 0; file->size = 0; file->initial_offset = 0; return TRUE; } return FALSE; } Bool file_open_at_offset(U8 *filename, U8 *mode, File *file, U32 offset, U32 size) { if (!file_open(filename, mode, file)) { "Failed opening '%s'\n", filename; return FALSE; } if(offset + size >= file->size) { "Failed opening '%s' offset + size >= actual_size\n", filename; file_close(file); return FALSE; } file->idata = file->data; file->data = file->idata + offset; file->size = size; file->pos = 0; //file->pos = offset; return TRUE; } U0 file_seek(File *file, U32 new_position) { if(file->data && new_position <= file->size) { file->pos = new_position; } return; } U32 file_read_to_buffer(File *file, U8 *buf, U32 num_bytes) { if(file->pos + num_bytes > file->size) num_bytes = file->size - file->pos; MemCpy(buf, file->data + file->pos, num_bytes); file->pos += num_bytes; return num_bytes; } U8 file_read1(File *file) { if(!file->data || file->pos >= file->size) return 0; U64 b0 = file->data[file->pos++]; return b0; } U16 file_read2(File *file) { if(!file->data || file->pos >= file->size) return 0; U64 b0 = file->data[file->pos++]; U64 b1 = file->data[file->pos++]; return (b0 + (b1<<8)); } U32 file_read4(File *file) { if(!file->data || file->pos >= file->size) return 0; U64 b0 = file->data[file->pos++]; U64 b1 = file->data[file->pos++]; U64 b2 = file->data[file->pos++]; U64 b3 = file->data[file->pos++]; return (b0 + (b1<<8) + (b2<<16) + (b3<<24)); } U0 file_write1(U8 byte, File *file) { file->data[file->pos++] = byte; if(file->pos > file->size) file->size = file->pos; } U0 file_write2(U16 word, File *file) { file->data[file->pos++] = word & 0xff; file->data[file->pos++] = (word >> 8) & 0xff; if(file->pos > file->size) file->size = file->pos; } U0 file_write4(U32 double_word, File *file) { file->data[file->pos++] = double_word & 0xff; file->data[file->pos++] = (double_word >> 8) & 0xff; file->data[file->pos++] = (double_word >> 16) & 0xff; file->data[file->pos++] = (double_word >> 24) & 0xff; if(file->pos > file->size) file->size = file->pos; }