@@ -1058,15 +1058,14 @@ int CV8File::LoadFileFromFolder(char* dirname)
1058
1058
if (find_data.name [0 ] == ' .' )
1059
1059
continue ;
1060
1060
1061
- fprintf (stdout, " LoadFileFromFolder: %s\n " , find_data.name );
1061
+ // fprintf(stdout, "LoadFileFromFolder: %s\n", find_data.name);
1062
1062
1063
1063
pElems[ElemNum].HeaderSize = CV8Elem::stElemHeaderBegin::Size () + strlen (find_data.name ) * 2 + 4 ; // последние четыре всегда нули?
1064
1064
pElems[ElemNum].pHeader = new BYTE[pElems[ElemNum].HeaderSize ];
1065
1065
1066
1066
memset (pElems[ElemNum].pHeader , 0 , pElems[ElemNum].HeaderSize );
1067
1067
1068
1068
SetElemName (pElems[ElemNum], find_data.name , strlen (find_data.name ));
1069
-
1070
1069
if (find_data.attrib & 0x10 ) // directory
1071
1070
{
1072
1071
pElems[ElemNum].IsV8File = true ;
@@ -1186,6 +1185,205 @@ int CV8File::SaveFile(char *filename)
1186
1185
1187
1186
}
1188
1187
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 (" \n Build 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
+
1189
1387
int CV8File::Pack ()
1190
1388
{
1191
1389
BYTE *DeflateBuffer = NULL ;
@@ -1217,7 +1415,6 @@ int CV8File::Pack()
1217
1415
1218
1416
if (!pElems[ElemNum].IsV8File )
1219
1417
{
1220
-
1221
1418
ret = Deflate (pElems[ElemNum].pData , &DeflateBuffer, pElems[ElemNum].DataSize , &DeflateSize);
1222
1419
if (ret)
1223
1420
return ret;
0 commit comments