bool write_line(cstring file, cstring line) { int fd = open_file_w(file); int success = write(fd, line, strlen(line)); close_file(fd); if (success == strlen(line)) { return true; } return false; }
// Write bool write_int(cstring file, u32 & num) { int fd = open_file_w(file); int success = write(fd, &num, sizeof(num)); close_file(fd); if (success > 0) { return true; } return false; }
int unpack(char archive[512]) { UInt32 i; CFileInStream archive_stream; CArchiveDatabaseEx db; SZ_RESULT res; ISzAlloc alloc_imp; ISzAlloc alloc_temp_imp; #ifdef DEBUG printf("extracting %s...\n", archive); #endif archive_stream.File = open_file_r(archive); if (archive_stream.File == 0) { print_error("can not open input file"); return 1; } archive_stream.InStream.Read = read_file_imp; archive_stream.InStream.Seek = seek_file_imp; alloc_imp.Alloc = SzAlloc; alloc_imp.Free = SzFree; alloc_temp_imp.Alloc = SzAllocTemp; alloc_temp_imp.Free = SzFreeTemp; CrcGenerateTable(); //SEEK OFFSET size_t offset; offset = seek_beginning_of_archive(&archive_stream); //INIT DB SzArDbExInit(&db); //SET THE OFFSET g_offset = offset; seek_file_imp(&archive_stream.InStream, 0); //seek to beginning of file including offset res = SzArchiveOpen(&archive_stream.InStream, &db, &alloc_imp, &alloc_temp_imp); #ifdef DEBUG printf("res = %i\n",res); #endif if (res == SZ_OK) { /* if you need cache, use these 3 variables. if you use external function, you can make these variable as static. */ UInt32 block_index = 0xFFFFFFFF; /* it can have any value before first call (if out_buffer = 0) */ Byte *out_buffer = 0; /* it must be 0 before first call for each new archive. */ size_t out_buffer_size = 0; /* it can have any value before first call (if out_buffer = 0) */ //~ for (i = db.Database.NumFolders-1; i >0; i--) //~ { //~ CFileItem *f = db.Database.Folders + i; //~ if (!f->IsDirectory){ //~ } else { //~ } //~ } for (i = db.Database.NumFiles-1; i >0; i--) { CFileItem *f = db.Database.Files + i; if (!f->IsDirectory){ continue; } #ifdef DEBUG printf("Creating directory %s", f->Name); #endif if (create_directory(f->Name) != 0) { print_error("can not create directory"); } #ifdef DEBUG printf("\n"); #endif } for (i = 0; i < db.Database.NumFiles; i++) { CFileItem *f = db.Database.Files + i; #ifdef DEBUG printf("Extracting %s\n %d %s", f->Name, i, f->IsDirectory); #endif if (f->IsDirectory){ continue; } size_t out_size_processed; #ifdef DEBUG printf("Extracting %s\n", f->Name); #endif res = SzExtract(&archive_stream.InStream, &db, i, &block_index, &out_buffer, &out_buffer_size, &offset, &out_size_processed, &alloc_imp, &alloc_temp_imp); if (res != SZ_OK) break; MY_FILE_HANDLE output_handle = open_file_w(f->Name); if (output_handle == 0) { print_error("can not open output file"); res = SZE_FAIL; break; } size_t processed_size; processed_size = write_file(output_handle, out_buffer + offset, out_size_processed); if (processed_size != out_size_processed) { print_error("can not write output file"); res = SZE_FAIL; break; } if (close_file(output_handle)) { print_error("can not close output file"); res = SZE_FAIL; break; } #ifdef DEBUG printf("\n"); #endif } alloc_imp.Free(out_buffer); } SzArDbExFree(&db, alloc_imp.Free); close_file(archive_stream.File); if (res == SZ_OK) { #ifdef DEBUG printf("\nEverything is Ok\n"); #endif return 0; } if (res == (SZ_RESULT)SZE_NOTIMPL) print_error("decoder doesn't support this archive"); else if (res == (SZ_RESULT)SZE_OUTOFMEMORY) print_error("can not allocate memory"); else if (res == (SZ_RESULT)SZE_CRC_ERROR) print_error("CRC error"); else print_error("Unknown error"); //TBD print res return 1; }