Skip to content

Commit 390c031

Browse files
author
Leonid Vlasov
committedMay 6, 2014
version 3.0
- Оптимизирована сборка .cf файла ключ -B[UILD]. В версии 2.0 сборка корневого контейнера происходила в оперативной памяти. При сборке больших конфигураций это могло приводить к ошибке "segmentation fault". В версии 3.0 сборка корневого контейнера происходит динамически с сохранением элементов контейнера непосредственно в файл по мере их создания.
1 parent 1b25a71 commit 390c031

16 files changed

+799
-27
lines changed
 

‎README.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
## Note
88

9-
V8Unpuck.exe - a small console program for rebuild/build configuration files [1C](http://1c.ru) as well as *.cf *.epf *.erf
9+
V8Unpuck.exe - a small console program for rebuild/build configuration files [1C](http://1c.ru) such as *.cf *.epf *.erf
1010

1111
## Plaform
1212

@@ -15,3 +15,9 @@ Windows
1515
## Environment
1616

1717
Project for [codelite IDE](http://www.codelite.org/)
18+
19+
## Version 3.0
20+
21+
- Оптимизирована сборка .cf файла ключ -B[UILD]. В версии 2.0 сборка корневого контейнера происходила в оперативной памяти.
22+
При сборке больших конфигураций это могло приводить к ошибке "segmentation fault". В версии 3.0 сборка корневого контейнера происходит
23+
динамически с сохранением элементов контейнера непосредственно в файл по мере их создания.

‎bin/v8unpack.exe

3 KB
Binary file not shown.

‎bin/zlib.dll ‎bin/zlib1.dll

File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
{1
2+
,
3+
{52
4+
,54316dde-22de-4a9b-98f6-065b92050691
5+
,fcfb7bea-d9ce-4524-9294-0b66b863e4ba
6+
,9081bd12-59f3-4eae-ad2c-735d98c37841
7+
,2870ed2a-510b-4f75-932f-e824abe692d7
8+
,afe386ea-5638-49a1-867b-b47f92d9df6a
9+
,e420bb84-b450-417f-8a3c-b530ab6078a0
10+
,8ee6705c-ce5e-46ef-a08c-cabc0488a654
11+
,99cfac7b-e4f9-45a9-a7f5-cec99f35c1a6
12+
,
13+
{0
14+
,
15+
{0
16+
,
17+
{0
18+
,0
19+
,1911b09e-875b-468b-be91-76fa020be4df}
20+
,"Справочник1"
21+
,
22+
{0}
23+
,""}
24+
}
25+
,2
26+
,1
27+
,
28+
{0
29+
,0}
30+
,1
31+
,1
32+
,1
33+
,0
34+
,9
35+
,1
36+
,25
37+
,1
38+
,00000000-0000-0000-0000-000000000000
39+
,00000000-0000-0000-0000-000000000000
40+
,00000000-0000-0000-0000-000000000000
41+
,00000000-0000-0000-0000-000000000000
42+
,00000000-0000-0000-0000-000000000000
43+
,00000000-0000-0000-0000-000000000000
44+
,00000000-0000-0000-0000-000000000000
45+
,00000000-0000-0000-0000-000000000000
46+
,00000000-0000-0000-0000-000000000000
47+
,00000000-0000-0000-0000-000000000000
48+
,1
49+
,
50+
{0
51+
,0}
52+
,0
53+
,401553cb-555e-43dc-b6a9-160cd496b80c
54+
,5d26b349-a171-4d4d-bfb8-b15e99c404ee
55+
,0
56+
,0
57+
,0
58+
,0
59+
,2
60+
,0
61+
,
62+
{1
63+
,
64+
{0
65+
,2
66+
,
67+
{"#"
68+
,60ea359f-3a6e-48bb-8e71-d2a457572918
69+
,
70+
{-3}
71+
}
72+
,
73+
{"#"
74+
,60ea359f-3a6e-48bb-8e71-d2a457572918
75+
,
76+
{-2}
77+
}
78+
}
79+
}
80+
,1
81+
,1
82+
,
83+
{0}
84+
,
85+
{0}
86+
,
87+
{0}
88+
,
89+
{0}
90+
,
91+
{0}
92+
,
93+
{0}
94+
,1
95+
,
96+
{0
97+
,
98+
{0}
99+
}
100+
,2
101+
,
102+
{1
103+
,
104+
{0
105+
,0}
106+
}
107+
,0
108+
,
109+
{1
110+
,2
111+
,0}
112+
,0}
113+
,5
114+
,
115+
{3daea016-69b7-4ed4-9453-127911372fe6
116+
,0}
117+
,
118+
{4fe87c89-9ad4-43f6-9fdb-9dc83b3879c6
119+
,0}
120+
,
121+
{932159f9-95b2-4e76-a8dd-8849fe5c5ded
122+
,0}
123+
,
124+
{cf4abea7-37b2-11d4-940f-008048da11f9
125+
,1
126+
,
127+
{
128+
{3
129+
,
130+
{27
131+
,
132+
{2
133+
,
134+
{0
135+
,
136+
{0
137+
,0
138+
,9224acd1-8b11-44ba-b542-c2df6a5f6097}
139+
,"Реквизит1"
140+
,
141+
{0}
142+
,""}
143+
,
144+
{"Pattern"
145+
,
146+
{"S"
147+
,10
148+
,1}
149+
}
150+
}
151+
,0
152+
,
153+
{0}
154+
,
155+
{0}
156+
,0
157+
,""
158+
,0
159+
,
160+
{"U"}
161+
,
162+
{"U"}
163+
,0
164+
,00000000-0000-0000-0000-000000000000
165+
,2
166+
,0
167+
,
168+
{5004
169+
,0}
170+
,
171+
{3
172+
,0
173+
,0}
174+
,
175+
{0
176+
,0}
177+
,0
178+
,
179+
{0}
180+
,
181+
{"S"
182+
,""}
183+
,0
184+
,0
185+
,0}
186+
,0
187+
,0
188+
,1}
189+
,0}
190+
}
191+
,
192+
{fdf816d2-1ead-11d5-b975-0050bae0a95d
193+
,0}
194+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{3
2+
,1
3+
,0
4+
,""
5+
,0}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Функция Ф()
2+
3+
КонецФункции
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,297 @@
1+
{2
2+
,
3+
{4297db56-69a9-4c9a-ae34-1d80aed44298}
4+
,6
5+
,
6+
{9cd510cd-abfc-11d4-9434-004095e12fc7
7+
,
8+
{1
9+
,
10+
{46
11+
,
12+
{0
13+
,
14+
{0
15+
,
16+
{0
17+
,0
18+
,4aa40abc-feca-43da-83f1-f1576bd7b937}
19+
,"Конфигурация_83"
20+
,
21+
{1
22+
,"ru"
23+
,"Конфигурация 83"}
24+
,""}
25+
}
26+
,""
27+
,1
28+
,
29+
{0}
30+
,
31+
{0}
32+
,
33+
{0}
34+
,
35+
{0}
36+
,
37+
{0}
38+
,00000000-0000-0000-0000-000000000000
39+
,dc262771-8ce3-4b06-bca0-b513fca769bf
40+
,00000000-0000-0000-0000-000000000000
41+
,00000000-0000-0000-0000-000000000000
42+
,0
43+
,""
44+
,""
45+
,""
46+
,1
47+
,
48+
{0
49+
,0}
50+
,1
51+
,
52+
{0
53+
,0}
54+
,1
55+
,00000000-0000-0000-0000-000000000000
56+
,00000000-0000-0000-0000-000000000000
57+
,00000000-0000-0000-0000-000000000000
58+
,00000000-0000-0000-0000-000000000000
59+
,80304
60+
,
61+
{0
62+
,0}
63+
,0
64+
,0
65+
,00000000-0000-0000-0000-000000000000
66+
,00000000-0000-0000-0000-000000000000
67+
,00000000-0000-0000-0000-000000000000
68+
,
69+
{1
70+
,
71+
{"#"
72+
,1708fdaa-cbce-4289-b373-07a5a74bee91
73+
,1}
74+
}
75+
,00000000-0000-0000-0000-000000000000
76+
,00000000-0000-0000-0000-000000000000
77+
,2
78+
,00000000-0000-0000-0000-000000000000
79+
,3
80+
,
81+
{0
82+
,0}
83+
}
84+
,22
85+
,
86+
{09736b02-9cac-4e3f-b4f7-d3e9576ab948
87+
,0}
88+
,
89+
{0c89c792-16c3-11d5-b96b-0050bae0a95d
90+
,0}
91+
,
92+
{0fe48980-252d-11d6-a3c7-0050bae0a776
93+
,0}
94+
,
95+
{11bdaf85-d5ad-4d91-bb24-aa0eee139052
96+
,0}
97+
,
98+
{15794563-ccec-41f6-a83c-ec5f7b9a5bc1
99+
,0}
100+
,
101+
{24c43748-c938-45d0-8d14-01424a72b11e
102+
,0}
103+
,
104+
{30d554db-541e-4f62-8970-a1c6dcfeb2bc
105+
,0}
106+
,
107+
{37f2fa9a-b276-11d4-9435-004095e12fc7
108+
,0}
109+
,
110+
{39bddf6a-0c3c-452b-921c-d99cfa1c2f1b
111+
,0}
112+
,
113+
{3e5404af-6ef8-4c73-ad11-91bd2dfac4c8
114+
,0}
115+
,
116+
{3e7bfcc0-067d-11d6-a3c7-0050bae0a776
117+
,0}
118+
,
119+
{46b4cd97-fd13-4eaa-aba2-3bddd7699218
120+
,0}
121+
,
122+
{4e828da6-0f44-4b5b-b1c0-a2b3cfe7bdcc
123+
,0}
124+
,
125+
{58848766-36ea-4076-8800-e91eb49590d7
126+
,0}
127+
,
128+
{7dcd43d9-aca5-4926-b549-1842e6a4e8cf
129+
,0}
130+
,
131+
{857c4a91-e5f4-4fac-86ec-787626f1c108
132+
,0}
133+
,
134+
{8657032e-7740-4e1d-a3ba-5dd6e8afb78f
135+
,0}
136+
,
137+
{9cd510ce-abfc-11d4-9434-004095e12fc7
138+
,1
139+
,dc262771-8ce3-4b06-bca0-b513fca769bf}
140+
,
141+
{af547940-3268-434f-a3e7-e47d6d2638c3
142+
,0}
143+
,
144+
{c045099e-13b9-4fb6-9d50-fca00202971e
145+
,0}
146+
,
147+
{cc9df798-7c94-4616-97d2-7aa0b7bc515e
148+
,0}
149+
,
150+
{d26096fb-7a5d-4df9-af63-47d04771fa9b
151+
,0}
152+
}
153+
}
154+
,
155+
{9fcd25a0-4822-11d4-9414-008048da11f9
156+
,
157+
{6
158+
,
159+
{1
160+
,
161+
{
162+
{0
163+
,0
164+
,868401ff-3854-4183-bb66-774bbd3f6ea4}
165+
,00000000-0000-0000-0000-000000000000}
166+
,15
167+
,
168+
{0195e80c-b157-11d4-9435-004095e12fc7
169+
,0}
170+
,
171+
{061d872a-5787-460e-95ac-ed74ea3a3e84
172+
,0}
173+
,
174+
{07ee8426-87f1-11d5-b99c-0050bae0a95d
175+
,0}
176+
,
177+
{13134201-f60b-11d5-a3c7-0050bae0a776
178+
,0}
179+
,
180+
{1c57eabe-7349-44b3-b1de-ebfeab67b47d
181+
,0}
182+
,
183+
{2f1a5187-fb0e-4b05-9489-dc5dd6412348
184+
,0}
185+
,
186+
{36a8e346-9aaa-4af9-bdbd-83be3c177977
187+
,0}
188+
,
189+
{4612bd75-71b7-4a5c-8cc5-2b0b65f9fa0d
190+
,0}
191+
,
192+
{631b75a0-29e2-11d6-a3c7-0050bae0a776
193+
,0}
194+
,
195+
{82a1b659-b220-4d94-a9bd-14d757b95a48
196+
,0}
197+
,
198+
{b64d9a40-1642-11d6-a3c7-0050bae0a776
199+
,0}
200+
,
201+
{bc587f20-35d9-11d6-a3c7-0050bae0a776
202+
,0}
203+
,
204+
{bf845118-327b-4682-b5c6-285d2a0eb296
205+
,0}
206+
,
207+
{cf4abea6-37b2-11d4-940f-008048da11f9
208+
,1
209+
,1911b09e-875b-468b-be91-76fa020be4df}
210+
,
211+
{f6a80749-5ad7-400b-8519-39dc5dff2542
212+
,0}
213+
}
214+
}
215+
}
216+
,
217+
{e3687481-0a87-462c-a166-9f34594f9bba
218+
,
219+
{1
220+
,
221+
{0
222+
,
223+
{0
224+
,0
225+
,61e120d1-604f-4f43-93e7-db520f3bcdee}
226+
}
227+
,2
228+
,
229+
{238e7e88-3c5f-48b2-8a3b-81ebbecb20ed
230+
,0}
231+
,
232+
{2deed9b8-0056-4ffe-a473-c20a6c32a0bc
233+
,0}
234+
}
235+
}
236+
,
237+
{9de14907-ec23-4a07-96f0-85521cb6b53b
238+
,
239+
{1
240+
,
241+
{
242+
{0
243+
,0
244+
,8fa9cb35-41c0-4e5a-8937-ec2bc09e8765}
245+
}
246+
,2
247+
,
248+
{30b100d6-b29f-47ac-aec7-cb8ca8a54767
249+
,0}
250+
,
251+
{f2de87a8-64e5-45eb-a22d-b3aedab050e7
252+
,0}
253+
}
254+
}
255+
,
256+
{51f2d5d8-ea4d-4064-8892-82951750031e
257+
,
258+
{1
259+
,
260+
{0
261+
,
262+
{0
263+
,0
264+
,1a8390d8-3dc0-404f-bd1f-13a7ee228d10}
265+
}
266+
,2
267+
,
268+
{3e63355c-1378-4953-be9b-1deb5fb6bec5
269+
,0}
270+
,
271+
{fcd3404e-1523-48ce-9bc0-ecdb822684a1
272+
,0}
273+
}
274+
}
275+
,
276+
{e68182ea-4237-4383-967f-90c1e3370bc7
277+
,
278+
{1
279+
,
280+
{
281+
{0
282+
,0
283+
,95eacd79-ea73-4a78-9590-1bb7ed7956ef}
284+
}
285+
,1
286+
,
287+
{5274d9fc-9c3a-4a71-8f5e-a0db8ab23de5
288+
,0}
289+
}
290+
}
291+
,
292+
{
293+
{0
294+
,""
295+
,""}
296+
}
297+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{1
2+
,
3+
{0
4+
,
5+
{0
6+
,
7+
{0
8+
,0
9+
,dc262771-8ce3-4b06-bca0-b513fca769bf}
10+
,"Русский"
11+
,
12+
{1
13+
,"ru"
14+
,"Русский"}
15+
,""}
16+
,"ru"}
17+
,0}

‎itest/83.cf.src/root

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{2
2+
,4297db56-69a9-4c9a-ae34-1d80aed44298
3+
,AgtU3AzezWgeJoum7DqMxmLeSdyrmPSUIIvjwMF1I8tvwJn8KR72d12Kff1ggw4z
4+
6XA/dApytrJwgVDfgRXhxw==}

‎itest/83.cf.src/version

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
{216
3+
,0}
4+
}

‎itest/83.cf.src/versions

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{1
2+
,8
3+
,""
4+
,247f3053-74f6-4338-8b31-c8ff18a70ebd
5+
,"versions"
6+
,c7695670-d535-47eb-aaa9-99dcf66e64f7
7+
,"root"
8+
,ae5e9bdc-5dc6-4c01-a675-fda90a92a25d
9+
,"dc262771-8ce3-4b06-bca0-b513fca769bf"
10+
,8017832c-6af7-41d5-a140-9a940a216acc
11+
,"1911b09e-875b-468b-be91-76fa020be4df.0"
12+
,ca30eccb-5b85-44e3-b303-b6eea66f90ec
13+
,"4297db56-69a9-4c9a-ae34-1d80aed44298"
14+
,d5ad6243-ad89-445c-9b18-c2f1d40a8297
15+
,"version"
16+
,c63568da-32dc-4548-b8af-f317fc5a7f45
17+
,"1911b09e-875b-468b-be91-76fa020be4df"
18+
,fe365aa9-3ad6-4495-b50c-4fa00196920c}

‎src/V8File.cpp

+200-3
Original file line numberDiff line numberDiff line change
@@ -1058,15 +1058,14 @@ int CV8File::LoadFileFromFolder(char* dirname)
10581058
if (find_data.name[0] == '.')
10591059
continue;
10601060

1061-
fprintf(stdout, "LoadFileFromFolder: %s\n", find_data.name);
1061+
// fprintf(stdout, "LoadFileFromFolder: %s\n", find_data.name);
10621062

10631063
pElems[ElemNum].HeaderSize = CV8Elem::stElemHeaderBegin::Size() + strlen(find_data.name) * 2 + 4; // последние четыре всегда нули?
10641064
pElems[ElemNum].pHeader = new BYTE[pElems[ElemNum].HeaderSize];
10651065

10661066
memset(pElems[ElemNum].pHeader, 0, pElems[ElemNum].HeaderSize);
10671067

10681068
SetElemName(pElems[ElemNum], find_data.name, strlen(find_data.name));
1069-
10701069
if (find_data.attrib & 0x10) // directory
10711070
{
10721071
pElems[ElemNum].IsV8File = true;
@@ -1186,6 +1185,205 @@ int CV8File::SaveFile(char *filename)
11861185

11871186
}
11881187

1188+
int CV8File::BuildCfFile(char *in_dirname, char *out_filename){
1189+
//filename can't be empty
1190+
if (!in_dirname){
1191+
fputs("Argument error - Set of `in_dirname' argument \n",stdout);
1192+
return SHOW_USAGE;
1193+
}
1194+
if (!out_filename){
1195+
fputs("Argument error - Set of `out_filename' argument \n",stdout);
1196+
return SHOW_USAGE;
1197+
}
1198+
//Read in_dirname
1199+
struct _finddata_t find_data;
1200+
long hFind;
1201+
char filename[MAX_PATH];
1202+
FILE* file_in;
1203+
sprintf(filename, "%s\\*", in_dirname);
1204+
1205+
hFind = _findfirst(filename, &find_data);
1206+
if (hFind == -1){
1207+
fprintf(stdout,"Error `%s' - path not found \n",in_dirname);
1208+
return SHOW_USAGE;
1209+
}
1210+
//Считаем количество элементов в корневом контейнере
1211+
ElemsNum = 0;
1212+
do{
1213+
if (find_data.name[0] == '.')
1214+
continue;
1215+
ElemsNum++;
1216+
}while(_findnext(hFind, &find_data) == 0);
1217+
_findclose(hFind);
1218+
if (ElemsNum == 0){
1219+
fprintf(stdout,"Build Error. Directory `%s' is empty",in_dirname);
1220+
return -1;
1221+
1222+
}
1223+
//Предварительные расчеты длины заголовка т таблицы содержимого TOC файла
1224+
FileHeader.next_page_addr = 0x7fffffff;
1225+
FileHeader.page_size = 0x200;
1226+
FileHeader.storage_ver = 0;
1227+
FileHeader.reserved = 0;
1228+
DWORD cur_block_addr = stFileHeader::Size() + stBlockHeader::Size();
1229+
stElemAddr *pTOC;
1230+
pTOC = new stElemAddr[ElemsNum];
1231+
if (sizeof(stElemAddr) * ElemsNum < 512)
1232+
cur_block_addr += 512; // 512 - стандартный размер страницы 0x200
1233+
else
1234+
cur_block_addr += stElemAddr::Size() * ElemsNum;
1235+
//Открываем выходной файл контейнер на запись
1236+
FILE* file_out;
1237+
file_out = fopen(out_filename, "wb");
1238+
if (!file_out)
1239+
{
1240+
fputs("SaveFile. Error in creating file!", stdout);
1241+
return -1;
1242+
}
1243+
//Резервируем место в начале файла под заголовок и TOC
1244+
for(int i=0; i < cur_block_addr; i++){
1245+
fwrite("\0", 1, 1, file_out);
1246+
}
1247+
//Обходим каталог и создаем элементы контейнера .cf
1248+
CV8Elem pElem;
1249+
hFind = _findfirst(filename, &find_data);
1250+
UINT ElemNum = 0;
1251+
1252+
if (hFind == -1){
1253+
fprintf(stdout,"Error `%s' - path not found \n",in_dirname);
1254+
return SHOW_USAGE;
1255+
}
1256+
1257+
char new_dirname[MAX_PATH];
1258+
UINT one_percent = ElemsNum / 50;
1259+
if (one_percent)
1260+
{
1261+
fputs("Progress (50 points): ", stdout);
1262+
}
1263+
1264+
do{
1265+
if (find_data.name[0] == '.')
1266+
continue;
1267+
//Progress bar ->
1268+
{
1269+
if (ElemNum && one_percent && ElemNum%one_percent == 0)
1270+
{
1271+
if (ElemNum % (one_percent*10) == 0)
1272+
fputs("|", stdout);
1273+
else
1274+
fputs(".", stdout);
1275+
}
1276+
}//<- Progress bar
1277+
//Считывем элемент
1278+
// fprintf(stdout, "trace: ReadElement %s\n", find_data.name);
1279+
pElem.HeaderSize = CV8Elem::stElemHeaderBegin::Size() + strlen(find_data.name) * 2 + 4; // последние четыре всегда нули?
1280+
pElem.pHeader = new BYTE[pElem.HeaderSize];
1281+
1282+
memset(pElem.pHeader, 0, pElem.HeaderSize);
1283+
1284+
SetElemName(pElem, find_data.name, strlen(find_data.name));
1285+
if (find_data.attrib & 0x10) // directory
1286+
{
1287+
pElem.IsV8File = true;
1288+
sprintf(new_dirname, "%s\\%s", in_dirname, find_data.name);
1289+
pElem.UnpackedData.LoadFileFromFolder(new_dirname);
1290+
1291+
}
1292+
else
1293+
{
1294+
pElem.IsV8File = false;
1295+
1296+
pElem.DataSize = find_data.size;
1297+
pElem.pData = new BYTE[pElem.DataSize];
1298+
1299+
sprintf(filename, "%s\\%s", in_dirname, find_data.name);
1300+
1301+
file_in = fopen(filename, "rb");
1302+
fread(pElem.pData, 1, pElem.DataSize, file_in);
1303+
fclose(file_in);
1304+
}
1305+
//Сжимаем данные
1306+
PackElem(pElem);
1307+
//Добавляем элемент в TOC
1308+
pTOC[ElemNum].elem_header_addr = cur_block_addr;
1309+
cur_block_addr += sizeof(stBlockHeader) + pElem.HeaderSize;
1310+
pTOC[ElemNum].elem_data_addr = cur_block_addr;
1311+
cur_block_addr += sizeof(stBlockHeader);
1312+
if (pElem.DataSize > 512)
1313+
cur_block_addr += pElem.DataSize;
1314+
else
1315+
cur_block_addr += 512;
1316+
pTOC[ElemNum].fffffff = 0x7fffffff;
1317+
//Записываем элемент в файл
1318+
SaveBlockData(file_out, pElem.pHeader, pElem.HeaderSize, pElem.HeaderSize);
1319+
SaveBlockData(file_out, pElem.pData, pElem.DataSize);
1320+
//Освобождаем память
1321+
delete[] pElem.pData;
1322+
pElem.pData = NULL;
1323+
delete[] pElem.pHeader;
1324+
pElem.pHeader = NULL;
1325+
pElem.IsV8File = false;
1326+
pElem.HeaderSize = 0;
1327+
pElem.DataSize = 0;
1328+
ElemNum++;
1329+
}while( _findnext(hFind, &find_data) == 0 );
1330+
_findclose(hFind);
1331+
//Записывем заголовок файла
1332+
rewind(file_out);
1333+
fwrite(&FileHeader, sizeof(stFileHeader), 1, file_out);
1334+
//Записываем блок TOC
1335+
SaveBlockData(file_out, (BYTE*) pTOC, stElemAddr::Size() * ElemsNum);
1336+
//Закрываем выходной файл контейнер на запись
1337+
fclose(file_out);
1338+
fputs("\nBuild OK!", stdout);
1339+
return 0;
1340+
}
1341+
1342+
int CV8File::PackElem(CV8Elem &pElem){
1343+
BYTE *DeflateBuffer = NULL;
1344+
ULONG DeflateSize = 0;
1345+
1346+
BYTE *DataBuffer = NULL;
1347+
ULONG DataBufferSize = 0;
1348+
1349+
int ret = 0;
1350+
if (!pElem.IsV8File)
1351+
{
1352+
ret = Deflate(pElem.pData, &DeflateBuffer, pElem.DataSize, &DeflateSize);
1353+
if (ret)
1354+
return ret;
1355+
1356+
delete[] pElem.pData;
1357+
pElem.pData = new BYTE[DeflateSize];
1358+
pElem.DataSize = DeflateSize;
1359+
memcpy(pElem.pData, DeflateBuffer, DeflateSize);
1360+
}
1361+
else
1362+
{
1363+
pElem.UnpackedData.GetData(&DataBuffer, &DataBufferSize);
1364+
1365+
ret = Deflate(DataBuffer, &DeflateBuffer, DataBufferSize, &DeflateSize);
1366+
if (ret)
1367+
return ret;
1368+
1369+
//pElem.UnpackedData = CV8File();
1370+
pElem.IsV8File = false;
1371+
1372+
pElem.pData = new BYTE[DeflateSize];
1373+
pElem.DataSize = DeflateSize;
1374+
memcpy(pElem.pData, DeflateBuffer, DeflateSize);
1375+
1376+
}
1377+
1378+
if (DeflateBuffer)
1379+
free(DeflateBuffer);
1380+
1381+
if (DataBuffer)
1382+
free(DataBuffer);
1383+
1384+
return 0;
1385+
}
1386+
11891387
int CV8File::Pack()
11901388
{
11911389
BYTE *DeflateBuffer = NULL;
@@ -1217,7 +1415,6 @@ int CV8File::Pack()
12171415

12181416
if (!pElems[ElemNum].IsV8File)
12191417
{
1220-
12211418
ret = Deflate(pElems[ElemNum].pData, &DeflateBuffer, pElems[ElemNum].DataSize, &DeflateSize);
12221419
if (ret)
12231420
return ret;

‎src/V8File.h

+7
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
#define V8UNPACK_DEFLATE_IN_FILE_NOT_FOUND (V8UNPACK_ERROR-1)
5858
#define V8UNPACK_DEFLATE_OUT_FILE_NOT_CREATED (V8UNPACK_ERROR-2)
5959

60+
#define SHOW_USAGE -22
6061

6162
class CV8Elem;
6263

@@ -73,8 +74,11 @@ class CV8File
7374
int LoadFileFromFolder(char* dirname);
7475
int GetElemName(CV8Elem &Elem, char* ElemName, UINT *ElemNameLen);
7576
int Parse(char *filename, char *dirname, int level = 0);
77+
7678
bool IsV8File(BYTE *pFileData, ULONG FileDataSize);
7779

80+
int BuildCfFile(char *dirname, char *filename);
81+
7882
struct stFileHeader
7983
{
8084
DWORD next_page_addr;
@@ -141,6 +145,9 @@ class CV8File
141145

142146
int SaveFileToFolder(char *dirname);
143147

148+
int PackElem(CV8Elem &pElem);
149+
150+
144151
CV8File();
145152
CV8File(BYTE *pFileData, bool boolUndeflate = true);
146153
virtual ~CV8File();

‎src/main.cpp

+37-20
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,32 @@
22
//
33

44
#include "V8File.h"
5+
#include "version.h"
56

67
using namespace std;
78

9+
void usage(){
10+
fputs("\n", stdout);
11+
fprintf(stdout,"V8Upack Version %s Copyright (c) %s\n",V8P_VERSION,V8P_RIGHT);
12+
fputs("\n", stdout);
13+
fputs("Unpack, pack, deflate and inflate 1C v8 file (*.cf)\n", stdout);
14+
fputs("\n", stdout);
15+
fputs("V8UNPACK\n", stdout);
16+
fputs(" -U[NPACK] in_filename.cf out_dirname\n", stdout);
17+
fputs(" -PA[CK] in_dirname out_filename.cf\n", stdout);
18+
fputs(" -I[NFLATE] in_filename.data out_filename\n", stdout);
19+
fputs(" -D[EFLATE] in_filename filename.data\n", stdout);
20+
fputs(" -E[XAMPLE]\n", stdout);
21+
fputs(" -BAT\n", stdout);
22+
fputs(" -P[ARSE] in_filename out_dirname\n", stdout);
23+
fputs(" -B[UILD] in_dirname out_filename\n", stdout);
24+
fputs(" -V[ERSION]\n", stdout);
25+
}
26+
27+
void version(){
28+
fprintf(stdout,"%s\n",V8P_VERSION);
29+
}
30+
831
int main(int argc, char* argv[])
932
{
1033

@@ -19,6 +42,15 @@ int main(int argc, char* argv[])
1942

2043
int ret = 0;
2144

45+
if(cur_mode == "-version" || cur_mode == "-v")
46+
{
47+
48+
version();
49+
50+
return 0;
51+
}
52+
53+
2254
if(cur_mode == "-inflate" || cur_mode == "-i" || cur_mode == "-und" || cur_mode == "-undeflate")
2355
{
2456

@@ -81,8 +113,9 @@ int main(int argc, char* argv[])
81113

82114
CV8File V8File;
83115

84-
ret = V8File.Build(argv[2], argv[3]);
85-
116+
ret = V8File.BuildCfFile(argv[2], argv[3]);
117+
if (ret == SHOW_USAGE)
118+
usage();
86119
return ret;
87120
}
88121

@@ -133,22 +166,6 @@ int main(int argc, char* argv[])
133166
return ret;
134167
}
135168

136-
137-
138-
fputs("\n", stdout);
139-
fputs("V8Upack Version 2.00 Copyright (c) 2008 Denis Demidov 2008-03-30\n", stdout);
140-
fputs("\n", stdout);
141-
fputs("Unpack, pack, deflate and inflate 1C v8 file (*.cf)\n", stdout);
142-
fputs("\n", stdout);
143-
fputs("V8UNPACK\n", stdout);
144-
fputs(" -U[NPACK] in_filename.cf out_dirname\n", stdout);
145-
fputs(" -PA[CK] in_dirname out_filename.cf\n", stdout);
146-
fputs(" -I[NFLATE] in_filename.data out_filename\n", stdout);
147-
fputs(" -D[EFLATE] in_filename filename.data\n", stdout);
148-
fputs(" -E[XAMPLE]\n", stdout);
149-
fputs(" -BAT\n", stdout);
150-
fputs(" -P[ARSE] in_filename out_dirname\n", stdout);
151-
fputs(" -B[UILD] in_dirname out_filename\n", stdout);
152-
153-
return 0;
169+
usage();
170+
return 1;
154171
}

‎src/version.h

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#define V8P_VERSION "3.0" //FIXME
2+
#define V8P_RIGHT "2008 Denis Demidov 2008-03-30"

‎v8unpack.project

+4-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<File Name="src/V8File.h"/>
3535
<File Name="src/zconf.h"/>
3636
<File Name="src/zlib.h"/>
37+
<File Name="src/version.h"/>
3738
</VirtualDirectory>
3839
<Settings Type="Executable">
3940
<GlobalSettings>
@@ -50,10 +51,10 @@
5051
<IncludePath Value="."/>
5152
</Compiler>
5253
<Linker Options="" Required="yes">
53-
<Library Value="bin/zlib.dll"/>
54+
<Library Value="bin/zlib1.dll"/>
5455
</Linker>
5556
<ResourceCompiler Options="" Required="no"/>
56-
<General OutputFile="$(IntermediateDirectory)/$(ProjectName)" IntermediateDirectory="./Debug" Command="./$(ProjectName)" CommandArguments="-B H:/1c_working.here/ru-mega_com-custommod-megacomaccounting/tmp/MegaComAccounting.unpuk.cf.src" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/>
57+
<General OutputFile="$(IntermediateDirectory)/$(ProjectName)" IntermediateDirectory="./Debug" Command="./$(ProjectName)" CommandArguments="-B ..\itest\83.cf.src .\83.out.cf" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/>
5758
<Environment EnvVarSetName="&lt;Use Defaults&gt;" DbgSetName="&lt;Use Defaults&gt;">
5859
<![CDATA[]]>
5960
</Environment>
@@ -91,7 +92,7 @@
9192
<Preprocessor Value="NDEBUG"/>
9293
</Compiler>
9394
<Linker Options="-s" Required="yes">
94-
<Library Value="bin/zlib.dll"/>
95+
<Library Value="bin/zlib1.dll"/>
9596
</Linker>
9697
<ResourceCompiler Options="" Required="no"/>
9798
<General OutputFile="$(IntermediateDirectory)/$(ProjectName)" IntermediateDirectory="./bin" Command="./$(ProjectName)" CommandArguments="" UseSeparateDebugArgs="no" DebugArguments="" WorkingDirectory="$(IntermediateDirectory)" PauseExecWhenProcTerminates="yes" IsGUIProgram="no" IsEnabled="yes"/>

0 commit comments

Comments
 (0)
Please sign in to comment.