⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmerge.c

📁 该代码包为INTEL IXP2400单板的BSP,同时经过修改,可以对MSN和ixf1104做自定义配置
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -