unalz/main.cpp
2020-05-05 20:22:58 +02:00

324 lines
7.5 KiB
C++
Executable file

#ifdef _WIN32
# pragma warning( disable : 4786 ) // stl warning ¾ø¾Ö±â
#endif
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <string>
#include <vector>
#include <locale.h>
#include "UnAlz.h"
#include "UnAlzUtils.h"
#include <sys/timeb.h>
BOOL g_bPipeMode=FALSE;
void Copyright()
{
// printf("unalz v0.20 (2004/10/22) \n");
// printf("unalz v0.22 (2004/10/27) \n");
// printf("unalz v0.23 (2004/10/30) \n");
// printf("unalz v0.31 (2004/11/27) \n");
// printf("unalz v0.4 (2005/06/18) \n");
// printf("unalz v0.5 (2005/07/09) \n");
// printf("unalz v0.51 (2005/07/24) \n");
// printf("unalz v0.52 (2005/07/27) \n");
// printf("unalz v0.53 (2005/10/15) \n");
// printf("unalz v0.54 (2005/11/21) \n");
// printf("unalz v0.55 (2006/03/10) \n");
// printf("unalz v0.60 (2006/12/31) \n");
// printf("unalz v0.61 (2007/02/10) \n");
printf("unalz v0.62 (2008/04/04) \n");
printf("Copyright(C) 2004-2008 by kippler@gmail.com (http://www.kipple.pe.kr) \n");
}
void Usage()
{
Copyright();
printf("\n");
/*
#ifdef _UNALZ_ICONV
printf("USAGE : unalz [ -utf8 | -cp949 | -euc-kr ] sourcefile.alz [dest path] \n");
# ifdef _UNALZ_UTF8
printf(" -utf8 : convert filename's codepage to UTF-8 (default)\n");
printf(" -cp949 : convert filename's codepage to CP949\n");
printf(" -euc-kr: convert filename's codepage to EUC-KR\n");
# else
printf(" -utf8 : convert filename's codepage to UTF-8\n");
printf(" -cp949 : convert filename's codepage to CP949 (default)\n");
printf(" -euc-kr: convert filename's codepage to EUC-KR\n");
# endif // _UNALZ_UTF8
#else // no iconv
printf("USAGE : unalz sourcefile.alz [dest path] \n");
#endif // _UNALZ_ICONV
*/
printf("Usage : unalz [<switches>...] archive.alz [<file names to extract>...]\n");
printf("\n");
printf("<switches>\n");
#ifdef _UNALZ_ICONV
# ifdef _UNALZ_UTF8
printf(" -utf8 : convert filename's codepage to UTF-8 (default)\n");
printf(" -cp949 : convert filename's codepage to CP949\n");
printf(" -euc-kr : convert filename's codepage to EUC-KR\n");
# else
printf(" -utf8 : convert filename's codepage to UTF-8\n");
printf(" -cp949 : convert filename's codepage to CP949 (default)\n");
printf(" -euc-kr : convert filename's codepage to EUC-KR\n");
# endif // _UNALZ_UTF8
#endif // _UNALZ_ICONV
printf(" -l : list contents of archive\n");
printf(" -d directory : set output directory\n");
printf(" -p : extract files to pipe, no messages\n");
printf(" -pwd <pwd> : set password\n");
}
void UnAlzCallback(const char* szFileName, INT64 nCurrent, INT64 nRange, void* param, BOOL* bHalt)
{
if(g_bPipeMode) return; // slient
#define MSG_BUF_LEN 1024
// progress
static char szMessage[MSG_BUF_LEN]={0};
static INT64 nPrevPercent = -1;
INT64 percent;
// ÆÄÀϸí Ãâ·Â..
if(szFileName)
{
printf("\n");
#ifdef _WIN32
_snprintf(szMessage, MSG_BUF_LEN, "unalziiiing : %s (%I64dbytes) ", szFileName, nRange);
#else
snprintf(szMessage, MSG_BUF_LEN, "unalziiiing : %s (%lldbytes) ", szFileName, nRange);
#endif
printf("%s", szMessage);
fflush(stdout);
nPrevPercent = -1;
return;
}
percent = nCurrent*100/nRange;
if(nPrevPercent/10==percent/10) return; // ³Ê¹« ÀæÀº ¾÷µ¥ÀÌÆ® ¹æÁö..
nPrevPercent = percent;
printf(".");
fflush(stdout);
}
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "");
if(argc<2)
{
Usage();
return 0;
}
CUnAlz unalz;
char* source=NULL;
char* destpath=".";
char* destcodepage=NULL;
char* password=NULL;
int count;
BOOL listMode = FALSE;
vector<string> filelist;
/* old method
for (count=1 ; count < argc && argv[count][0] == '-'; ++count)
{
#ifdef _UNALZ_ICONV
// utf8 ¿É¼Ç ó¸®
if(strcmp(argv[count], "-utf8")==0)
{
destcodepage = "UTF-8"; // utf-8 support
}
else if(strcmp(argv[count], "-cp949")==0)
{
destcodepage = "CP949"; // cp949
}
else if(strcmp(argv[count], "-euc-kr")==0)
{
destcodepage = "EUC-KR"; // EUC-KR
}
else
#endif
if(strcmp(argv[count], "-l")==0 || strcmp(argv[count], "-list")==0)
{
listMode = TRUE;
}
}
#ifdef _UNALZ_ICONV
if(count>=argc) {Usage();return 0;} // ¿É¼Ç¸¸ ¾²¸é ¾î¼¶ó°í..
if(destcodepage) unalz.SetDestCodepage(destcodepage);
#endif
// ¼Ò½º ÆÄÀÏ
source=argv[count];
count++;
// ´ë»ó °æ·Î
if(count<argc)
{
destpath = argv[count];
count++;
}
*/
for (count=1 ; count < argc; count++)
{
#ifdef _UNALZ_ICONV
// utf8 ¿É¼Ç ó¸®
if(strcmp(argv[count], "-utf8")==0)
{
destcodepage = "UTF-8"; // utf-8 support
}
else if(strcmp(argv[count], "-cp949")==0)
{
destcodepage = "CP949"; // cp949
}
else if(strcmp(argv[count], "-euc-kr")==0)
{
destcodepage = "EUC-KR"; // EUC-KR
}
else
#endif
if(strcmp(argv[count], "-l")==0 || strcmp(argv[count], "-list")==0)
{
listMode = TRUE;
}
else if(strcmp(argv[count], "-p")==0)
{
g_bPipeMode = TRUE;
}
else if(strcmp(argv[count], "-d")==0) // dest dir
{
count++;
if(count>=argc) {Usage();return 0;} // dest dir ÀÌ Á¤»ó ÁöÁ¤µÇÁö ¾Ê¾Ò´Ù..
destpath = argv[count];
}
else if(strcmp(argv[count], "-pwd")==0) // pwd
{
count++;
if(count>=argc) {Usage();return 0;} // dest dir ÀÌ Á¤»ó ÁöÁ¤µÇÁö ¾Ê¾Ò´Ù..
password = argv[count];
}
else // ¿É¼ÇÀÌ ¾Æ´Ñ °æ¿ì
{
if(source==NULL) // ¼Ò½º ÆÄÀÏ °æ·Î
{
source=argv[count];
}
else // ¾ÐÃàÇ® ÆÄÀÏ
{
filelist.push_back(argv[count]);
}
}
}
if(source==NULL) {Usage();return 0;} // ¿É¼Ç¸¸ ¾²¸é ¾î¼¶ó°í..
#ifdef _UNALZ_ICONV
if(destcodepage) unalz.SetDestCodepage(destcodepage);
#endif
if(g_bPipeMode==FALSE)
Copyright(); // copyright Ç¥½Ã
// pipe mode setting
unalz.SetPipeMode(g_bPipeMode);
// ÆÄÀÏ ¿­±â
if(unalz.Open(source)==FALSE)
{
if(unalz.GetLastErr()==CUnAlz::ERR_CORRUPTED_FILE)
{
printf("It's corrupted file.\n"); // ±×³É °è¼Ó Ç®±â..
}
else
{
printf("file open error : %s\n", source);
printf("err code(%d) (%s)\n", unalz.GetLastErr(), unalz.GetLastErrStr());
return 0;
}
}
if (listMode)
{
return ListAlz(&unalz, source);
}
else
{
if(unalz.IsEncrypted())
{
if(password) // command line À¸·Î ¾ÏÈ£°¡ ÁöÁ¤µÇ¾úÀ» °æ¿ì.
{
unalz.SetPassword(password);
}
else
{
char temp[256];
char pwd[256];
printf("Enter Password : ");
fgets(temp,256,stdin);
sscanf(temp, "%s\n", pwd); // remove \n
unalz.SetPassword(pwd);
}
}
if(g_bPipeMode==FALSE)
printf("\nExtract %s to %s\n", source, destpath);
// callback ÇÔ¼ö ¼¼ÆÃ
unalz.SetCallback(UnAlzCallback, (void*)NULL);
if (filelist.empty()==false) // ÆÄÀÏ ÁöÁ¤Çϱâ.
{
vector<string>::iterator i;
for(i=filelist.begin();i<filelist.end();i++)
{
if(unalz.SetCurrentFile(i->c_str())==FALSE)
{
if(g_bPipeMode==FALSE)
printf("filename not matched : %s\n", i->c_str());
}
else
unalz.ExtractCurrentFile(destpath);
}
}
else // ¸ðµç ÆÄÀÏ ´ÙÇ®±â.
{
if(unalz.ExtractAll(destpath)==FALSE)
{
if(g_bPipeMode==FALSE)
{
printf("\n");
printf("extract %s to %s failed.\n", source, destpath);
printf("err code(%d) (%s)\n", unalz.GetLastErr(),
unalz.GetLastErrStr());
}
}
}
if(g_bPipeMode==FALSE)
printf("\ndone..\n");
}
return 0;
}