diff options
author | Aki <please@ignore.pl> | 2022-04-01 21:23:39 +0200 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-04-01 21:23:39 +0200 |
commit | 3c487c5cd69c53d6fea948643c0a76df03516605 (patch) | |
tree | 72730c7b8b26a5ef8fc9a987ec4c16129efd5aac /StarsEx/Archive.h | |
parent | 8f353abd0bfe18baddd8a8250ab7c4f2d1c83a6e (diff) | |
download | starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.zip starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.gz starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.bz2 |
Moved Stars45 to StarsEx
Diffstat (limited to 'StarsEx/Archive.h')
-rw-r--r-- | StarsEx/Archive.h | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/StarsEx/Archive.h b/StarsEx/Archive.h new file mode 100644 index 0000000..ac22f28 --- /dev/null +++ b/StarsEx/Archive.h @@ -0,0 +1,89 @@ +/* Starshatter: The Open Source Project + Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors + Copyright (c) 1997-2006, Destroyer Studios LLC. + + AUTHOR: John DiCamillo + +*/ + +#ifndef Archive_h +#define Archive_h + +// +------------------------------------------------------------------+ + +#define VERSION 0x0010 +#define BLOCK_SIZE 1024 +#define FILE_BLOCK 1024 +#define NAMELEN 64 + +// +------------------------------------------------------------------+ + +struct DataHeader +{ + static const char* TYPENAME() { return "DataHeader"; } + + DWORD version; + DWORD nfiles; + DWORD dir_blocks; + DWORD dir_size_comp; + DWORD dir_offset; +}; + +struct DataEntry +{ + static const char* TYPENAME() { return "DataEntry"; } + + char name[NAMELEN]; + DWORD size_orig; + DWORD size_comp; + DWORD offset; +}; + +class DataArchive +{ +public: + static const char* TYPENAME() { return "DataArchive"; } + + // ctor: + DataArchive(const char* name = 0); + ~DataArchive(); + + // operations: + void LoadDatafile(const char* name); + void Insert(const char* name); + void Extract(const char* name); + void Remove(const char* name); + void List(); + + void WriteEntry(int index, BYTE* buf); + int FindEntry(const char* req_name); + int ExpandEntry(int index, BYTE*& buf, bool null_terminate=false); + BYTE* CompressEntry(int index); + int InsertEntry(const char* name); + void RemoveEntry(int index); + DWORD Blocks(DWORD raw_size); + DWORD DirBlocks(); + DWORD FileBlocks(int index); + int FindDataBlocks(int blocks_needed); + void CreateBlockMap(); + + DWORD NumFiles() { return header.nfiles; } + DataEntry* GetFile(int i) { if (i>=0 && i<(int)header.nfiles) return &directory[i]; return 0; } + + const char* Name() const { return datafile; } + +private: + // persistent data members: + DataHeader header; + DataEntry* directory; + BYTE* dirbuf; + + // transient members: + char datafile[NAMELEN]; + + DWORD* block_map; + DWORD nblocks; +}; + +#endif // Archive_h |