📄 unpak.cpp
字号:
/*
unpak.c Copyright (C) 1998-2000 Vitaly Ovtchinnikov
and Damir Sagidullin
*/
#include <windows.h>
//#include "console.h"
#include "unpak.h"
//------------------- DEFINITIONS & CONSTANTS -------------------//
//-------------------------- VARIABLES --------------------------//
//-------------------------- FUNCTIONS --------------------------//
int PackFileOpen (packfile_t *pf, const char *zname)
{
int x, max;
unz_file_info file_info;
strcat (pf->pak_name, zname);
pf->uf = unzOpen (pf->pak_name);
if (!pf->uf)
{
MessageBox(NULL, "Can't open file \"%s\"", "Error", NULL);
return 0;
}
unzGetGlobalInfo (pf->uf, &pf->gi);
pf->fi = (fileinfo_t *)malloc (sizeof(fileinfo_t)*pf->gi.number_entry);
if (!pf->fi)
{
MessageBox(NULL, "Not enought memory to load pak file \"%s\"", "Error", NULL);
unzClose (pf->uf);
return 0;
}
max = pf->gi.number_entry;
for (x=0; x<max; x++)
{
unzGetCurrentFileInfo (pf->uf,&file_info, pf->fi[x].name,sizeof(pf->fi[x].name),NULL,0,NULL,0);
pf->fi[x].attr = file_info.external_fa;
pf->fi[x].offset = file_info.offset;
pf->fi[x].size = file_info.uncompressed_size;
pf->fi[x].c_offset = file_info.c_offset;
unzGoToNextFile (pf->uf);
}
return 1;
}
void PackFileClose (packfile_t *pf)
{
if (pf->fi)
{
free (pf->fi);
pf->fi = NULL;
}
if (pf->uf)
{
unzClose (pf->uf);
pf->uf = NULL;
}
}
int PackFileGet (packfile_t *pf, char *fname, char **buf)
{
int num;
DWORD err;
for (num = 0; num<(int)pf->gi.number_entry; num++)
{
if (!stricmp(fname, pf->fi[num].name)) break;
}
if (num >= (int)pf->gi.number_entry)
{
MessageBox(NULL, "File \"%s:%s\" not found", "Error", NULL);
return 0;
}
*buf = (char *)malloc (pf->fi[num].size);
unzLocateFileMy (pf->uf, num, pf->fi[num].c_offset);
unzOpenCurrentFile (pf->uf);
err = unzReadCurrentFile (pf->uf,*buf,pf->fi[num].size);
unzCloseCurrentFile (pf->uf);
if (err!=pf->fi[num].size)
{
MessageBox(NULL, "Can't extract file \"%s:%s\"", "Error", NULL);
free (*buf);
*buf = NULL;
return 0;
}
return pf->fi[num].size;
}
int PackFileGetFilesNumber (packfile_t *pf)
{
return pf->gi.number_entry;
}
char *PackFileGetFileName (packfile_t *pf, int num)
{
if (num >= (int)pf->gi.number_entry) return NULL;
return pf->fi[num].name;
}
int MyPackFileGet (packfile_t *pf, char *fname, unsigned char **buf)
{
int num;
DWORD err;
for (num = 0; num<(int)pf->gi.number_entry; num++)
{
if (!stricmp(fname, pf->fi[num].name)) break;
}
if (num >= (int)pf->gi.number_entry)
{
MessageBox(NULL, "Can not find file in zip archive", "Error", NULL);
return 0;
}
unzLocateFileMy (pf->uf, num, pf->fi[num].c_offset);
unzOpenCurrentFile (pf->uf);
err = unzReadCurrentFile (pf->uf,*buf,pf->fi[num].size);
unzCloseCurrentFile (pf->uf);
if (err!=pf->fi[num].size)
{
MessageBox(NULL, "Can't extract file \"%s:%s\"", "Error", NULL);
free (*buf);
*buf = NULL;
return 0;
}
return pf->fi[num].size;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -