1 #define _CRT_SECURE_NO_DEPRECATE
2 #define _CRT_SECURE_NO_WARNINGS
7 #include "libmpq/mpq.h"
16 typedef unsigned int uint32
;
23 MPQArchive(const char* filename
);
26 uint32
HashString(const char* Input
, uint32 Offset
) {
27 uint32 seed1
= 0x7fed7fed;
28 uint32 seed2
= 0xeeeeeeee;
30 for (uint32 i
= 0; i
< strlen(Input
); i
++) {
31 uint32 val
= toupper(Input
[i
]);
32 seed1
= mpq_a
.buf
[Offset
+ val
] ^ (seed1
+ seed2
);
33 seed2
= val
+ seed1
+ seed2
+ (seed2
<< 5) + 3;
38 mpq_hash
GetHashEntry(const char* Filename
) {
39 uint32 index
= HashString(Filename
, 0);
40 index
&= mpq_a
.header
->hashtablesize
- 1;
41 uint32 name1
= HashString(Filename
, 0x100);
42 uint32 name2
= HashString(Filename
, 0x200);
44 for(uint32 i
= index
; i
< mpq_a
.header
->hashtablesize
; ++i
) {
45 mpq_hash hash
= mpq_a
.hashtable
[i
];
46 if (hash
.name1
== name1
&& hash
.name2
== name2
) return hash
;
50 nullhash
.blockindex
= 0xFFFFFFFF;
54 vector
<string
> GetFileList() {
55 vector
<string
> filelist
;
57 mpq_hash hash
= GetHashEntry("(listfile)");
58 uint32 blockindex
= hash
.blockindex
;
60 if ((blockindex
== 0xFFFFFFFF) || (blockindex
== 0))
63 uint32 size
= libmpq_file_info(&mpq_a
, LIBMPQ_FILE_UNCOMPRESSED_SIZE
, blockindex
);
64 char *buffer
= new char[size
];
66 libmpq_file_getdata(&mpq_a
, hash
, blockindex
, (unsigned char*)buffer
);
71 token
= strtok( buffer
, seps
);
73 while ((token
!= NULL
) && (counter
< size
)) {
74 //cout << token << endl;
75 token
[strlen(token
) - 1] = 0;
77 filelist
.push_back(s
);
78 counter
+= strlen(token
) + 2;
79 token
= strtok(NULL
, seps
);
86 typedef std::deque
<MPQArchive
*> ArchiveSet
;
96 MPQFile(const MPQFile
&f
) {}
97 void operator=(const MPQFile
&f
) {}
100 MPQFile(const char* filename
); // filenames are not case sensitive
101 ~MPQFile() { close(); }
102 size_t read(void* dest
, size_t bytes
);
103 size_t getSize() { return size
; }
104 size_t getPos() { return pointer
; }
105 char* getBuffer() { return buffer
; }
106 char* getPointer() { return buffer
+ pointer
; }
107 bool isEof() { return eof
; }
108 void seek(int offset
);
109 void seekRelative(int offset
);
113 inline void flipcc(char *fcc
)