File: cfilearchive.h

package info (click to toggle)
freespace2 24.2.0%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 43,716 kB
  • sloc: cpp: 595,001; ansic: 21,741; python: 1,174; sh: 457; makefile: 248; xml: 181
file content (72 lines) | stat: -rw-r--r-- 2,289 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * Copyright (C) Volition, Inc. 1999.  All rights reserved.
 *
 * All source code herein is the property of Volition, Inc. You may not sell 
 * or otherwise commercially exploit the source or things you created based on the 
 * source.
 *
*/ 

#ifndef _CFILEARCHIVE_H
#define _CFILEARCHIVE_H

#ifndef _CFILE_INTERNAL 
#pragma message("This file should only be included internally in CFILE!!")
#endif

#include "globalincs/pstypes.h"

// The following Cfile_block data is private to cfile.cpp
// DO NOT MOVE the Cfile_block* information to cfile.h / do not extern this data
//
#define CFILE_BLOCK_UNUSED		0
#define CFILE_BLOCK_USED		1

struct COMPRESSION_INFO {
	int header = 0;
	size_t compressed_size = 0;
	int block_size = 0;
	int num_offsets = 0;
	int* offsets = nullptr;
	char* decoder_buffer = nullptr;
	int last_decoded_block_pos = 0;
	int last_decoded_block_bytes = 0;
};

struct CFILE {
	int type = CFILE_BLOCK_UNUSED;                // CFILE_BLOCK_UNUSED, CFILE_BLOCK_USED
	int dir_type;        // directory location
	FILE* fp;                // File pointer if opening an individual file
	const void* data;            // Pointer for memory-mapped file access.  NULL if not mem-mapped.
	bool mem_mapped; // Flag for memory mapped files (if data is not null and this is false it means that it's an embedded file)
#ifdef _WIN32
	HANDLE	hInFile;			// Handle from CreateFile()
	HANDLE	hMapFile;		// Handle from CreateFileMapping()
#else
	size_t data_length;    // length of data for mmap
#endif
	size_t lib_offset;
	size_t raw_position;
	size_t size;                // for packed files

	size_t max_read_len;    // max read offset, for special error handling

	SCP_string original_filename;
	const char* source_file;
	int line_num;
	COMPRESSION_INFO compression_info;
};

#define MAX_CFILE_BLOCKS	64
extern std::array<CFILE, MAX_CFILE_BLOCKS> Cfile_block_list;

// Called once to setup the low-level reading code.
void cf_init_lowlevel_read_code(CFILE* cfile, size_t lib_offset, size_t size, size_t pos);

// This checks if the file is compressed or not, and creates the proper compression info if so.
void cf_check_compression(CFILE* cfile);

// Used to clear compression info data and free dynamic memory used by compression
void cf_clear_compression_info(CFILE* cfile);

#endif