From 3c487c5cd69c53d6fea948643c0a76df03516605 Mon Sep 17 00:00:00 2001 From: Aki Date: Fri, 1 Apr 2022 21:23:39 +0200 Subject: Moved Stars45 to StarsEx --- StarsEx/Archive.h | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 StarsEx/Archive.h (limited to 'StarsEx/Archive.h') 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 -- cgit v1.1