📄 fmerge.c
字号:
if (stricmp(p_zar_head->fname, imgFileName)==0)
{
*pp_img_mem = (char*)p_zar_head + sizeof(HdZAR);
return FileSize;
}
else
{
p_zar_head =(HdZAR*)((char*)p_zar_head + sizeof(HdZAR) + FileSize);
if( (char*)p_zar_head > ( (char*)zar_mem + zar_mem_size))
break;
}
}/*end of while(TRUE)*/
/* if( zar_mem_size < sizeof(HdZAR) + 1 )
return ERROR;
else
p_zar_head = (HdZAR*)((char*)zar_mem + 1);
while (TRUE)
{
if (stricmp(p_zar_head->fname, imgFileName)==0)
{
*pp_img_mem = (char*)p_zar_head + sizeof(HdZAR);
return p_zar_head->flength;
}
else
{
p_zar_head =(HdZAR*)((char*)p_zar_head + sizeof(HdZAR) + p_zar_head->flength);
if( (char*)p_zar_head > ( (char*)zar_mem + zar_mem_size))
break;
}
}*/
return ERROR;
}
int fmerge(char *Fst_Arg, char *Snd_Arg, char *Third_Arg)
{
int ret = 0, i;
int argc=1, is_length=128;
char **argv;
argv=(char**)malloc(is_length*4);
if (argv==NULL)
{ printf("There is no enough memory for argv\n");
return 1;
}
argv[0]="\0";
argv[1]=Fst_Arg;
if(strcmp(argv[1],"-l")==0||strcmp(argv[1],"-L")==0||strcmp(argv[1],"-E")==0||strcmp(argv[1],"-Eu")==0)
argv[2]=Snd_Arg;
else
{
argv[2]=Third_Arg;
argv[3]=Snd_Arg;
}
for (i=1;i<4;i++)
{ if (argv[i]==NULL)
break;
argc++;
}
printf ("ZXR10 IMG files merger ......................\n");
if (argc <=2)
{
printf ("Usage: fmerger [-A|-a|-R|-r|-L|-l|-E|-e] filename1 filename2... merged-file\n");
printf ("-A,-a append file(s) to merged-file.\n");
printf ("-R,-r delete file(s) in merged-file.\n");
printf ("-L,-l list all files in merged-file.\n");
printf ("-E extract all files in the merged-file.\n");
printf ("-Eu extract all deflated files in the merged-file.\n");
printf ("-e extract specified files in merged-file.\n");
printf ("-eu extract specified deflated files in merged-file.\n");
free(argv);
return 0;
}
switch (argv[1][1])
{
case 'a':
case 'A':
ret=Append_IMGfile(argc, argv);
if (ret!=1)
printf("FAILED! Append a file into the destfile!\n");
else
printf("SUCCESS! Append a file into the destfile!\n");
break;
case 'r':
case 'R':
ret = Delete_IMGfile(argc, argv);
if (ret!=1)
printf("FAILED! Delete a file from the destfile!\n");
else
printf("SUCCESS! Delete a file from the destfile!\n");
break;
case 'l':
case 'L':
argc = 3;
ret = Display_IMGfiles(argc, argv);
if (ret!=1)
printf("FAILED! No files in the destfile!\n");
else
printf("SUCCESS! Display files in the destfile!\n");
break;
case 'E':/*Extract all the files in the ZAR file*/
argc=3;
if (strcmp(argv[1], "-Eu")==0||strcmp(argv[1],"-EU")==0)
ret = Extract_Inflate_Files(argc, argv);
else
ret = Extract_Files(argc, argv);
if (ret!=1)
printf("FAILED! No files in the destfile!\n");
else
printf("SUCCESS! Extract files in the destfile!\n");
break;
case 'e':/*Extract the specified file(s) from the ZAR file*/
if (strcmp(argv[1], "-eu")==0||strcmp(argv[1],"-eU")==0)
ret = Extract_Inflate_File(argc, argv);
else
ret = Extract_Some_Files(argc, argv);
if (ret!=1)
printf("FAILED! No files in the destfile!\n");
else
printf("SUCCESS! Extract files in the destfile!\n");
break;
default:
printf ("Wrong arguments!\n");
}
free(argv);
if (ret==1)
return 1;
else
return -1;
}
#if defined(MP)
long int GetFileLength(char *fileName, int mode)
{
if(mode == 3) /* zar file */
{
FILE *destFile = NULL;
HdZAR header;
destFile = fopen(RAMDISK_NAME""IMG_DIR_NAME"/"ZXR10_IMAGE_VERSION, "r");
if (destFile == NULL)
{
printf("Error in opening version file.\n");
return -1;
}
if(Fd_Position(destFile, fileName) != -1)
{
fread(header.fname, MAXFILE+MAXEXT, 1, destFile);
header.flength = Read_From_File(destFile);
header.srcflength = Read_From_File(destFile);
fclose(destFile);
return header.srcflength;
}
else
{
printf("cannot find this file!\n");
fclose(destFile);
return -1;
}
}
else if(mode == 1)
{
int fd;
struct stat pStat;
fd = open(fileName, O_RDONLY, 0777);
if (fd == -1)
{
printf("Error in opening file.\n");
return -1;
}
if(ERROR == fstat(fd, &pStat))
{
printf("Error in getting file stat.\n");
close(fd);
return -1;
}
else
{
close(fd);
return pStat.st_size;
}
}
else
printf("Error file mode.\n");
return -1;
}
int InflateFileToMem(char *filename, char *memAddr, int memSize)
{
int fd;
int result = 0;
int imgFileSize = -1;
char *pImgFile = NULL;
if(filename == NULL || memAddr == NULL || memSize <= 0)
{
printf ("error arguments!\n");
return -1;
}
if((fd = open (RAMDISK_NAME""IMG_DIR_NAME"/"ZXR10_IMAGE_VERSION, O_RDONLY, 0)) == ERROR)
{
printf ("Error in opening zar file.\n");
return -1;
}
if((imgFileSize = z_seek(fd, RAMDISK_NAME""IMG_DIR_NAME"/"ZXR10_IMAGE_VERSION, filename)) == ERROR)
{
close(fd);
return -1;
}
else
{
pImgFile = malloc(imgFileSize);
if(pImgFile == NULL)
{
printf ("no enough memory.\n");
close(fd);
return -1;
}
else
{
if(read(fd, pImgFile, imgFileSize) < 0)
{
printf ("read file error!\n");
free(pImgFile);
close(fd);
return -1;
}
}
}
result = inflate_mem(pImgFile, imgFileSize, memAddr, memSize);
if(result != ERROR)
printf ("inflate file %s to memory success!\n", filename);
else
printf ("inflate file %s to memory error!\n", filename);
free(pImgFile);
close(fd);
return result;
}
/*2003-6-25 14:57 added by pandeng */
UINT8 *extractFileToMem(char *filename,UINT32 *pFileSize) /*若返回值为0,解压失败*/
{
UINT8 *memAddr;
if(filename == NULL)
{
printf("\nfile name or pMemAddr error!!!\n");
return NULL;
}
*pFileSize = GetFileLength(filename,3);
if(*pFileSize == ERROR)
{
printf("\n^^^^^^^^^^^^^^^ Get %s length failed :( ^^^^^^^^^^^^^^^\n\n",filename);
return NULL;
}
memAddr = malloc(*pFileSize);
if (memAddr == NULL)
{
return NULL;
}
else
{
if(InflateFileToMem(filename,memAddr,*pFileSize)==ERROR)
{
free(memAddr);
*pFileSize = 0;
return NULL;
}
else
{
return memAddr;
}
}
}
#endif
/*
int fmerge(char * , ...);
int fmerge(char *Input_String, ...)
{
int ret, i;
va_list argp;
int argc=1, is_length=128;
char **argv,*para, para_1[10];
va_start(argp,Input_String);
strcpy(para_1,Input_String);
while (1)
{ para = va_arg(argp, char*);
argc++;
if (strcmp(para, "\0")==0)
break;
}
argv=(char**)malloc(is_length*argc);
argv[0]="\0";
argv[1]=para_1;
i=2;
va_start(argp,Input_String);
while (i<argc)
{ argv[i] = va_arg(argp, char*);
i++;
}
va_end(argp);
printf ("ZXR10 IMG files merger ......................\n");
if (argc <=2)
{
printf ("Usage: fmerger [-A|-a|-R|-r|-L|-l|-E|-e] filename1 filename2... merged-file\n");
printf ("-A,-a append file(s) to merged-file.\n");
printf ("-R,-r delete file(s) in merged-file.\n");
printf ("-L,-l list all files in merged-file.\n");
printf ("-E extract all files in the merged-file.\n");
printf ("-Eu extract all deflated files in the merged-file.\n");
printf ("-e extract specified files in merged-file.\n");
printf ("-eu extract specified deflated files in merged-file.\n");
free(argv);
return 0;
}
switch (argv[1][1])
{
case 'a':
case 'A':
ret=Append_IMGfile(argc, argv);
if (ret!=1)
printf("FAILED! Append a file into the destfile!\n");
else
printf("SUCCESS! Append a file into the destfile!\n");
break;
case 'r':
case 'R':
ret = Delete_IMGfile(argc, argv);
if (ret!=1)
printf("FAILED! Delete a file from the destfile!\n");
else
printf("SUCCESS! Delete a file from the destfile!\n");
break;
case 'l':
case 'L':
ret = Display_IMGfiles(argc, argv);
if (ret!=1)
printf("FAILED! No files in the destfile!\n");
else
printf("SUCCESS! Display files in the destfile!\n");
break;
case 'E':
ret = Extract_Files(argc, argv);
if (ret!=1)
printf("FAILED! No files in the destfile!\n");
else
printf("SUCCESS! Extract files in the destfile!\n");
break;
case 'e':
ret = Extract_Some_Files(argc, argv);
if (ret!=1)
printf("FAILED! No files in the destfile!\n");
else
printf("SUCCESS! Extract files in the destfile!\n");
break;
default:
printf ("Wrong arguments!\n");
}
free(argv);
if (ret==1)
return 0;
else
return 1;
}
*/
#else
int main(int argc, char** argv)
{
int ret=0;
int az = 0; /* fmerge -az */
printf ("ZXR10 IMG files merger ......................\n");
if (argc <=2)
{
printf ("Usage: fmerger [-A|-a|-AZ|-az|-R|-r|-L|-l|-E|-e] filename1 filename2... merged-file\n");
printf ("-A,-a append file(s) to merged-file.\n");
printf ("-AZ,-az append file to ZAR file,then add ZAR file to filemerged-file.\n");
printf ("-R,-r delete file(s) in merged-file.\n");
printf ("-L,-l list all files in merged-file.\n");
printf ("-E extract all files in the merged-file.\n");
printf ("-Eu extract all deflated files in the merged-file.\n");
printf ("-e extract specified files in merged-file.\n");
printf ("-eu extract specified deflated files in merged-file.\n");
return 0;
}
switch (argv[1][1])
{
case 'a':
case 'A':/*Append a new file to the ZAR file*/
ret=Append_IMGfile(argc, argv);
if (ret!=1)
printf("FAILED! Append a file into the destfile!\n");
else
printf("SUCCESS! Append a file into the destfile!\n");
break;
case 'r':
case 'R':/*Delete file(s) from the ZAR file*/
ret = Delete_IMGfile(argc, argv);
if (ret!=1)
printf("FAILED! Delete a file from the destfile!\n");
else
printf("SUCCESS! Delete a file from the destfile!\n");
break;
case 'l':
case 'L':/*Display the infomation of the files in the ZAR file*/
ret = Display_IMGfiles(argc, argv);
if (ret!=1)
printf("FAILED! No files in the destfile!\n");
else
printf("SUCCESS! Display files in the destfile!\n");
break;
case 'E':/*Extract all the files in the ZAR file*/
if (strcmp(argv[1], "-Eu")==0||strcmp(argv[1],"-EU")==0)
ret = Extract_Inflate_Files(argc, argv);
else
ret = Extract_Files(argc, argv);
if (ret!=1)
printf("FAILED! No files in the destfile!\n");
else
printf("SUCCESS! Extract files in the destfile!\n");
break;
case 'e':/*Extract the specified file(s) from the ZAR file*/
if (strcmp(argv[1], "-eu")==0||strcmp(argv[1],"-eU")==0)
ret = Extract_Inflate_File(argc, argv);
else
ret = Extract_Some_Files(argc, argv);
if (ret!=1)
printf("FAILED! No files in the destfile!\n");
else
printf("SUCCESS! Extract files in the destfile!\n");
break;
default:
printf ("Wrong arguments!\n");
}
if (ret == 1)
return 0;
else
return -1;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -