-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathpceth2_arc.c
More file actions
106 lines (92 loc) · 2.15 KB
/
pceth2_arc.c
File metadata and controls
106 lines (92 loc) · 2.15 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
* pceth2 - アーカイブ関連
*
* (c)2005 てとら★ぽっと
*
* 2005/07/23 main.cから分離
* 2005/08/20 あらかじめ確保しておいたバッファに展開できるよう変更
*/
// 2005/07/23
// アーカイブとの折衝は全てこのソースに任せます。
#include "libfpk/libfpk.h"
HFPK hFpk; // ハンドル
/*
* ハンドルの初期化
*
* *fName アーカイブファイル名
*
* return TRUE / FALSE
*/
BOOL fpk_InitHandle(char *fName)
{
if ((hFpk = fpkOpenArchive(fName)) == NULL) {
return FALSE; // 失敗
}
return TRUE; // 成功
}
/*
* par形式のハンドルからエントリを開く
*
* *fName エントリのファイル名
* *len エントリのサイズを返すポインタ(NULLなら返さない)
* *pDst 出力先(NULLなら新しくヒープを確保して返す)
*
* return エントリのデータ(pceHeapAlloc()で確保)
*/
BYTE *fpk_getEntryData(char *fName, DWORD *len, BYTE *pDst)
{
BYTE *ret = NULL;
FPKENTRY fpkEntry;
if (fpkGetFileInfoS(hFpk, fName, &fpkEntry)) {
if (len != NULL) {
if (fpkEntry.szFileName[15] & 0x80) { // 圧縮エントリか?
//pceFileReadPos(&hFpk->pfa, (BYTE *)len, fpkEntry.dwOffset, 4);
//↓{{2005/06/12 Naoyuki Sawa}}
// yui: 2005.07.03 pceFileReadPos() から改名
fpkFileReadPos(hFpk, (BYTE *)len, fpkEntry.dwOffset, 4);
} else {
*len = fpkEntry.dwSize;
}
}
ret = fpkExtractToBuffer(hFpk, &fpkEntry, pDst);
}
return ret;
}
BOOL fpk_getFileInfoS(char *fName, FPKENTRY *fpkEntry)
{
return fpkGetFileInfoS(hFpk, fName, fpkEntry);
}
DWORD fpk_getEntryDataPos(const FPKENTRY *fpkEntry, BYTE *pDst, DWORD offset, DWORD size)
{
DWORD ret = 0;
if (offset < fpkEntry->dwSize) {
ret = (offset + size <= fpkEntry->dwSize)? size : (fpkEntry->dwSize - offset);
fpkFileReadPos(hFpk, pDst, fpkEntry->dwOffset + offset, ret);
}
return ret;
}
/*
* par形式のハンドルからエントリの一部分を開く
*
* *fName エントリのファイル名
* *pDst 出力先
* offset
* size
*
* return 読み込んだ長さ
*/
DWORD fpk_getEntryDataPosEx(char *fName, BYTE *pDst, DWORD offset, DWORD size)
{
FPKENTRY fpkEntry;
if (fpkGetFileInfoS(hFpk, fName, &fpkEntry)) {
return fpk_getEntryDataPos(&fpkEntry, pDst, offset, size);
}
return 0;
}
/*
* par形式のハンドルを解放する
*/
void fpk_ReleaseHandle(void)
{
fpkCloseArchive(hFpk);
}