#include #include #include #include #include "rwbase.h" #include "rwplugin.h" using namespace std; namespace Rw { int Version = 0x36003; int Build = 0xFFFF; int32 Stream::writeI8(int8 val) { return write(&val, sizeof(int8)); } int32 Stream::writeU8(uint8 val) { return write(&val, sizeof(uint8)); } int32 Stream::writeI16(int16 val) { return write(&val, sizeof(int16)); } int32 Stream::writeU16(uint16 val) { return write(&val, sizeof(uint16)); } int32 Stream::writeI32(int32 val) { return write(&val, sizeof(int32)); } int32 Stream::writeU32(uint32 val) { return write(&val, sizeof(uint32)); } int32 Stream::writeF32(float32 val) { return write(&val, sizeof(float32)); } int8 Stream::readI8(void) { int8 tmp; read(&tmp, sizeof(int8)); return tmp; } uint8 Stream::readU8(void) { uint8 tmp; read(&tmp, sizeof(uint8)); return tmp; } int16 Stream::readI16(void) { int16 tmp; read(&tmp, sizeof(int16)); return tmp; } uint16 Stream::readU16(void) { uint16 tmp; read(&tmp, sizeof(uint16)); return tmp; } int32 Stream::readI32(void) { int32 tmp; read(&tmp, sizeof(int32)); return tmp; } uint32 Stream::readU32(void) { uint32 tmp; read(&tmp, sizeof(uint32)); return tmp; } float32 Stream::readF32(void) { float32 tmp; read(&tmp, sizeof(float32)); return tmp; } StreamFile* StreamFile::open(const char *path, const char *mode) { this->file = fopen(path, mode); return this->file ? this : NULL; } void StreamFile::close(void) { fclose(this->file); } uint32 StreamFile::write(const void *data, uint32 length) { return fwrite(data, length, 1, this->file); } uint32 StreamFile::read(void *data, uint32 length) { printf("read %d bytes @ %x\n", length, this->tell()); return fread(data, length, 1, this->file); } void StreamFile::seek(int32 offset, int32 whence) { fseek(this->file, offset, whence); } uint32 StreamFile::tell(void) { return ftell(this->file); } bool StreamFile::eof(void) { return feof(this->file); } bool WriteChunkHeader(Stream *s, int32 type, int32 size) { struct { int32 type, size; uint32 id; } buf = { type, size, LibraryIDPack(Version, Build) }; s->write(&buf, 12); return true; } bool ReadChunkHeaderInfo(Stream *s, ChunkHeaderInfo *header) { struct { int32 type, size; uint32 id; } buf; s->read(&buf, 12); if(s->eof()) return false; assert(header != NULL); header->type = buf.type; header->length = buf.size; header->version = LibraryIDUnpackVersion(buf.id); header->build = LibraryIDUnpackBuild(buf.id); return true; } bool FindChunk(Stream *s, uint32 type, uint32 *length, uint32 *version) { ChunkHeaderInfo header; while(ReadChunkHeaderInfo(s, &header)){ if(header.type == ID_NAOBJECT) return false; if(header.type == type){ if(length) *length = header.length; if(version) *version = header.version; return true; } s->seek(header.length); } return false; } int32 findPointer(void *p, void **list, int32 num) { int i; for(i = 0; i < num; i++) if(list[i] == p) goto found; return -1; found: return i; } }