123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- /*
- bParse
- Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com
- This software is provided 'as-is', without any express or implied warranty.
- In no event will the authors be held liable for any damages arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it freely,
- subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
- #ifndef __BFILE_H__
- #define __BFILE_H__
- #include "b3Common.h"
- #include "b3Chunk.h"
- #include <stdio.h>
- namespace bParse
- {
- // ----------------------------------------------------- //
- enum bFileFlags
- {
- FD_INVALID = 0,
- FD_OK = 1,
- FD_VOID_IS_8 = 2,
- FD_ENDIAN_SWAP = 4,
- FD_FILE_64 = 8,
- FD_BITS_VARIES = 16,
- FD_VERSION_VARIES = 32,
- FD_DOUBLE_PRECISION = 64,
- FD_BROKEN_DNA = 128
- };
- enum bFileVerboseMode
- {
- FD_VERBOSE_EXPORT_XML = 1,
- FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS = 2,
- FD_VERBOSE_DUMP_CHUNKS = 4,
- FD_VERBOSE_DUMP_FILE_INFO = 8,
- };
- // ----------------------------------------------------- //
- class bFile
- {
- protected:
- char m_headerString[7];
- bool mOwnsBuffer;
- char *mFileBuffer;
- int mFileLen;
- int mVersion;
- bPtrMap mLibPointers;
- int mDataStart;
- bDNA *mFileDNA;
- bDNA *mMemoryDNA;
- b3AlignedObjectArray<char *> m_pointerFixupArray;
- b3AlignedObjectArray<char *> m_pointerPtrFixupArray;
- b3AlignedObjectArray<bChunkInd> m_chunks;
- b3HashMap<b3HashPtr, bChunkInd> m_chunkPtrPtrMap;
- //
- bPtrMap mDataPointers;
- int mFlags;
- // ////////////////////////////////////////////////////////////////////////////
- // buffer offset util
- int getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags);
- void safeSwapPtr(char *dst, const char *src);
- virtual void parseHeader();
- virtual void parseData() = 0;
- void resolvePointersMismatch();
- void resolvePointersChunk(const bChunkInd &dataChunk, int verboseMode);
- int resolvePointersStructRecursive(char *strcPtr, int old_dna, int verboseMode, int recursion);
- //void swapPtr(char *dst, char *src);
- void parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers);
- void getMatchingFileDNA(short *old, const char *lookupName, const char *lookupType, char *strcData, char *data, bool fixupPointers);
- char *getFileElement(short *firstStruct, char *lookupName, char *lookupType, char *data, short **foundPos);
- void swap(char *head, class bChunkInd &ch, bool ignoreEndianFlag);
- void swapData(char *data, short type, int arraySize, bool ignoreEndianFlag);
- void swapStruct(int dna_nr, char *data, bool ignoreEndianFlag);
- void swapLen(char *dataPtr);
- void swapDNA(char *ptr);
- char *readStruct(char *head, class bChunkInd &chunk);
- char *getAsString(int code);
- void parseInternal(int verboseMode, char *memDna, int memDnaLength);
- public:
- bFile(const char *filename, const char headerString[7]);
- //todo: make memoryBuffer const char
- //bFile( const char *memoryBuffer, int len);
- bFile(char *memoryBuffer, int len, const char headerString[7]);
- virtual ~bFile();
- bDNA *getFileDNA()
- {
- return mFileDNA;
- }
- virtual void addDataBlock(char *dataBlock) = 0;
- int getFlags() const
- {
- return mFlags;
- }
- bPtrMap &getLibPointers()
- {
- return mLibPointers;
- }
- void *findLibPointer(void *ptr);
- bool ok();
- virtual void parse(int verboseMode) = 0;
- virtual int write(const char *fileName, bool fixupPointers = false) = 0;
- virtual void writeChunks(FILE *fp, bool fixupPointers);
- virtual void writeDNA(FILE *fp) = 0;
- void updateOldPointers();
- void resolvePointers(int verboseMode);
- void dumpChunks(bDNA *dna);
- int getVersion() const
- {
- return mVersion;
- }
- //pre-swap the endianness, so that data loaded on a target with different endianness doesn't need to be swapped
- void preSwap();
- void writeFile(const char *fileName);
- };
- } // namespace bParse
- #endif //__BFILE_H__
|