Files
Meep-Eep f374ad00cc Compensate for the overflowed fields for resource sizes in the resource
packages that exist in the PC version of SC2, the Amiga version of SC1, and
in the PC version of The Horde.


git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2733 8092fc87-c524-0410-9efc-e669fe64eaf9
2007-04-15 17:20:05 +00:00

124 lines
3.2 KiB
C

/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdbool.h>
#include <stdint.h>
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
#define MAKE_WORD(x1, x2) (((x2) << 8) | (x1))
#define MAKE_DWORD(x1, x2, x3, x4) (((x4) << 24) | ((x3) << 16) | \
((x2) << 8) | (x1))
#define TYPE_BITS 8
#define INSTANCE_BITS 13
#define PACKAGE_BITS 11
#define GET_TYPE(res) \
((uint8)(res) & (uint8)((1 << TYPE_BITS) - 1))
#define GET_INSTANCE(res) \
((uint16)((res) >> TYPE_BITS) & ((1 << INSTANCE_BITS) - 1))
#define GET_PACKAGE(res) \
((uint16)((res) >> (TYPE_BITS + INSTANCE_BITS)) & \
((1 << PACKAGE_BITS) - 1))
#define MAKE_RESOURCE(p,t,i) \
(((uint32)(p) << (TYPE_BITS + INSTANCE_BITS)) | \
((uint32)(i) << TYPE_BITS) | \
((uint32)(t)))
typedef struct {
uint32 size; // only low 18 bits used, multiple of 4
uint32 offset;
uint16 file_index;
char *filename;
} packdef_instance;
typedef struct {
uint8 type;
uint16 first_instance; // only low 13 bits used
uint16 num_instances; // only low 11 bits used
packdef_instance *instances;
} packtype_desc;
typedef struct {
uint16 instance_count;
} type_desc;
typedef struct {
uint8 path_offset[2];
char filename[8];
char extension[3];
} file_info;
typedef struct {
uint16 index;
// Index of this package. Acquired by counting; not part of the
// package file.
uint8 num_types;
uint16 num_instances; // only low 13 bits used
uint16 file_index; // only low 11 bits used
uint8 flags;
uint32 data_loc; // only low 24 bits used
uint32 size;
// Size of the package; derived from the sizes of the resource
// instances in the package.
char *filename;
packtype_desc *type_list;
} package_desc;
typedef struct {
bool packaged;
uint32 packmem_list_offs;
uint32 path_list_offs;
uint32 file_list_offs;
uint16 num_packages;
uint16 num_types;
uint16 header_len;
package_desc *package_list;
type_desc *type_list;
#if 0
#ifndef PACKAGING
char index_file_name[36];
DWORD data_offs;
MEM_HANDLE hPredHeader, hSuccHeader;
#endif /* PACKAGING */
#endif
} index_header;
// Statistics for one file refered to from packages.
typedef struct {
size_t numPackages;
// Number of packages that refer to this file.
package_desc **packages;
// Array of packages that refer to this file.
// Sorted on their offset.
uint32 fileSize;
} FileStats;
// Statistics for all files refered to from resource instances.
typedef struct {
size_t indexUpper;
// 1 higher than the last valid index for fileStat.
FileStats *fileStats;
// array of pointers to FileStat structures
} FilesStats;