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

📄 fmerge.c

📁 该代码包为INTEL IXP2400单板的BSP,同时经过修改,可以对MSN和ixf1104做自定义配置
💻 C
📖 第 1 页 / 共 3 页
字号:
         the name of each argument:   FileName;
  Return: Success:1, Failure: 0
*/
int Delete_IMGfile(int Num_Files, char **FileName)
{   FILE            *destFile;
    int         ret_value=0, flag=0;
    int         i,j;
    long            lthDestFile, offset, offset_rec;
    struct  stat        File_Statbuf;
    char            *imgFileName;
    HdZAR           header;
    int         chi;
    char            *rw_buf;

    /*Open the destination file to append a new Img file. The destination
      file was opened use Read_Only to determin whether the file has existed.*/
    destFile = fopen(FileName[Num_Files-1], "r+b");

    /*Create the file if it is not existed*/
    if (destFile == NULL)
    {   printf("Cannot open the destfile: --%s-- \n", FileName[Num_Files-1]);
        return ret_value;
    }

    lthDestFile=checkDestFile(destFile,&File_Statbuf);/*Check the destination file if it is the specified format*/

    if (lthDestFile ==0)
    {   fclose(destFile);
        return 0;
    }
    if ((rw_buf=(char *)malloc(RW_BYTES*sizeof(char)))==NULL)
    {   printf("Delete Files: Not enough memory!\n");
        fclose(destFile);
        return ret_value;
    }

    for (i=2; i<Num_Files-1; i++)
    {   imgFileName = FileName[i];
        flag = Fd_Position(destFile, FileName[i]);
        if (flag ==1)
                {   fread (&header.fname,1,MAXFILE+MAXEXT,destFile);
                    header.flength = Read_From_File(destFile);
                    header.srcflength = Read_From_File(destFile);
/*                    header.creatTime=Read_From_File(destFile);*/
                    header.modifyTime=Read_From_File(destFile);
            offset= header.flength;
            offset_rec=ftell(destFile)-sizeof(HdZAR);
            fseek(destFile,offset,SEEK_CUR);
            ret_value = 1;
            chi=fgetc(destFile);
            while (chi!=EOF)
            {   fseek(destFile, -1, SEEK_CUR);
                fread (&header.fname,1, MAXFILE+MAXEXT, destFile);
                header.flength = Read_From_File(destFile);
                header.srcflength = Read_From_File(destFile);
/*                  header.creatTime=Read_From_File(destFile);*/
                header.modifyTime=Read_From_File(destFile);
                fseek(destFile, 0-sizeof(HdZAR)-offset-sizeof(HdZAR), SEEK_CUR);
                fwrite(header.fname, 1, MAXFILE+MAXEXT, destFile);
                Put_To_File(header.flength,destFile);
                Put_To_File(header.srcflength,destFile);
/*                Put_To_File(header.creatTime,destFile);*/
                Put_To_File(header.modifyTime,destFile);
                offset_rec=offset_rec+sizeof(HdZAR);
                for (j=0;j< header.flength/RW_BYTES;j++)
                {   fseek(destFile, offset+sizeof(HdZAR), SEEK_CUR);
                    fread(rw_buf,1,RW_BYTES,destFile);
                    fseek(destFile, -RW_BYTES-(long)sizeof(HdZAR)-offset, SEEK_CUR);
                    fwrite(rw_buf, 1, RW_BYTES, destFile);
                    offset_rec=offset_rec+RW_BYTES;
                }
                if (header.flength%RW_BYTES!=0)
                {   fseek(destFile, offset+sizeof(HdZAR), SEEK_CUR);
                    fread(rw_buf,1,header.flength%RW_BYTES,destFile);
                    fseek(destFile, -(header.flength%RW_BYTES)-(long)sizeof(HdZAR)-offset, SEEK_CUR);
                    fwrite(rw_buf, 1, header.flength%RW_BYTES, destFile);
                    offset_rec=offset_rec+header.flength%RW_BYTES;
                }
                fseek(destFile, offset+sizeof(HdZAR), SEEK_CUR);
                chi=fgetc(destFile);
            }/*end of while (chi!=EOF)*/
            fflush(destFile);
            #ifdef VxWorks
            ftruncate(fileno(destFile), offset_rec);
            #else
            chsize(fileno(destFile), offset_rec);
            #endif
            fclose(destFile);
            destFile = fopen(FileName[Num_Files-1], "rb+");
            fseek(destFile,1L,SEEK_SET);
            printf("File  -%s-  has been deleted from the destination file %s\n", imgFileName, FileName[Num_Files-1]);
        }/*end of if (flag == 1)*/
        else
            printf("file %s cannot find in the destFile %s\n", imgFileName, FileName[Num_Files-1]);
    }
    free(rw_buf);
    fclose(destFile);
    return ret_value;
}

/*Display the information of the Img file(s) in the destination file
  Input: The number of the arguments: Num_Files
         the name of each argument:   FileName;
  Return: Success:1, Failure: 0
*/
int Display_IMGfiles(int Num_Files, char **FileName)
{   FILE            *destFile;
    int         ret_value=0, chi, filenum=0, nCnt;
    long            lthDestFile;
    struct  stat        File_Statbuf;
    HdZAR           header;
    char            buf[25], tmp[512];
    struct tm       *tp;

    destFile = fopen(FileName[Num_Files-1], "rb");

    if (destFile==NULL)
    {   printf ("Error in opening dest file\n");
        return ret_value;
    }

    lthDestFile=checkDestFile(destFile,&File_Statbuf);

    if (lthDestFile ==0)
    {   fclose(destFile);
        return 0;
    }
    printf("--Last Modify Time-------File Size---------File Name--\n");
    for (;;)
    {   chi = fgetc(destFile);
        if (chi != EOF)
        {   fseek(destFile, -1, SEEK_CUR);
            fread (&header.fname,1, MAXFILE+MAXEXT, destFile);
            header.flength = Read_From_File(destFile);
            header.srcflength = Read_From_File(destFile);
/*            header.creatTime=Read_From_File(destFile);*/
            header.modifyTime=Read_From_File(destFile);
            tp=localtime(&header.modifyTime);
            strftime(buf, sizeof(buf), "%Y-%m-%d  %H:%M:%S",tp);
            printf ("%s    %10ld    %16s\n",buf,header.flength,header.fname);
            /*fseek(destFile,header.flength,SEEK_CUR);*/
                        for(nCnt=0;nCnt<header.flength/512;nCnt++)
                            fread(tmp, 1,512,destFile);
            if (header.flength%512!=0)
                fread(tmp,1,header.flength%512,destFile);
            filenum++;
            if (ftell(destFile)>= lthDestFile)
                break;
        }
        else
            break;
    }
    fclose(destFile);
    if (filenum==0)
        ret_value = 0;
    else
        ret_value=1;
    return ret_value;
}

/*Extract all the Img file(s) from the destination file
  Input: The number of the arguments: Num_Files
         the name of each argument:   FileName;
  Return: Success:1, Failure: 0
*/
int Extract_Files(int Num_Files, char **FileName)
{   HdZAR           header;
    int         ret_value=0, chi;
    long            lthDestFile;
    FILE            *destFile;
    char            curdir[MAXDIR], buf[25],*rw_buf;
    struct  stat        File_Statbuf;
    struct tm       *tp;

    getcwd(curdir, MAXDIR+MAXDRIVE);
    strcat(curdir,"\\");
    if ((destFile=fopen (FileName[Num_Files-1],"rb"))==NULL)
    {   printf ("Error in opening dest file\n");
        return ret_value;
    }
    lthDestFile=checkDestFile(destFile,&File_Statbuf);
    if (lthDestFile==0)
    {   fclose(destFile);
        return ret_value;
    }
    printf("Extracting Files ... ... ... ...\n");
    if ((rw_buf=(char *)malloc(RW_BYTES*sizeof(char)))==NULL)
    {   printf("Extract Files: Not enough memory!\n");
        fclose(destFile);
        return ret_value;
    }
    printf("--Last Modify Time-------File Size---------File Name--\n");

    fseek(destFile, 1, SEEK_SET);
    for (;;)
    {   char        path[MAXDRIVE+MAXDIR+MAXFILE+MAXEXT];
        FILE        *tmpImg;
        register long loop;
        struct utimbuf times;

        path[0]='\0';
        strcpy (path,curdir);
        chi = fgetc(destFile);
        if (chi != EOF)
        {   ret_value = 1;
            fseek(destFile, -1, SEEK_CUR);
            fread (&header.fname,1, MAXFILE+MAXEXT, destFile);
            header.flength = Read_From_File(destFile);
            header.srcflength = Read_From_File(destFile);
/*            header.creatTime=Read_From_File(destFile);*/
            header.modifyTime=Read_From_File(destFile);
            tp=localtime(&header.modifyTime);
            strftime(buf, sizeof(buf), "%Y-%m-%d  %H:%M:%S",tp);
            printf ("%s    %10ld    %16s\n",buf,header.flength,header.fname);
            strcat (path, header.fname);
            tmpImg=fopen (path,"wb");

            for (loop=0;loop< header.flength/RW_BYTES;loop++)
            {   fread(rw_buf,1,RW_BYTES,destFile);
                fwrite(rw_buf, 1, RW_BYTES, tmpImg);
            }
            if (header.flength%RW_BYTES!=0)
            {   fread(rw_buf,1,header.flength%RW_BYTES,destFile);
                fwrite(rw_buf, 1, header.flength%RW_BYTES, tmpImg);
            }
            fclose ( tmpImg);
            times.modtime = times.actime = header.modifyTime;
            utime(path,&times);
        }
        else
            break;
    }
    free(rw_buf);
    fclose(destFile);
    return ret_value;
}

/*Extract the specified Img file(s) from the destination file
  Input: The number of the arguments: Num_Files
         the name of each argument:   FileName;
  Return: Success:1, Failure: 0
*/
int Extract_Some_Files(int Num_Files, char **FileName)
{   HdZAR           header;
    FILE            *pImgfile, *destFile;
    char                path[MAXDRIVE+MAXDIR+MAXFILE+MAXEXT];
    char            *imgFileName;
    register long       loop;
    long                lthDestFile;
    struct utimbuf      times;
    int         ret_value=0, i=0, chi, flag=0;
    char            curdir[MAXDIR], buf[25], *rw_buf, ch;
    struct  stat        File_Statbuf;
    struct tm       *tp;

    getcwd(curdir, MAXDIR+MAXDRIVE);
    strcat(curdir,"\\");

    if ((destFile=fopen (FileName[Num_Files-1],"rb"))==NULL)
    {   printf ("Error in opening dest file\n");
        return ret_value;
    }

    lthDestFile=checkDestFile(destFile,&File_Statbuf);

    if (lthDestFile ==0)
    {   fclose(destFile);
        return 0;
    }

    if ((rw_buf=(char *)malloc(RW_BYTES*sizeof(char)))==NULL)
    {   printf("Extract Some Files: Not enough memory!\n");
        fclose(destFile);
        return ret_value;
    }
    printf("Extracting Files ... ... ... ...\n");
    printf("--Last Modify Time-------File Size---------File Name--\n");
    fread(&ch, 1, 1, destFile);
    chi = fgetc(destFile);
    if (chi == EOF)
    {
        printf("No files in the destFile\n");
        free(rw_buf);/*rex 2002-11-22 11:47*/
        fclose(destFile);
        return ret_value;
    }

    for (i=2; i<Num_Files-1; i++)
     {  imgFileName = FileName[i];
        flag = Fd_Position(destFile, FileName[i]);
        if (flag==1)
        {   path[0]='\0';
            fread (&header.fname,1, MAXFILE+MAXEXT, destFile);
            header.flength = Read_From_File(destFile);
            header.srcflength = Read_From_File(destFile);
/*          header.creatTime=Read_From_File(destFile);*/
            header.modifyTime=Read_From_File(destFile);
            strcpy (path,curdir);
            strcat (path, header.fname);
            tp=localtime(&header.modifyTime);
            strftime(buf, sizeof(buf), "%Y-%m-%d  %H:%M:%S",tp);
            printf ("%s    %10ld    %16s\n",buf,header.flength,header.fname);
            pImgfile=fopen (path,"wb");
            for (loop=0;loop< header.flength/RW_BYTES;loop++)
            {   fread(rw_buf,1,RW_BYTES,destFile);
                fwrite(rw_buf, 1, RW_BYTES, pImgfile);
            }
            if (header.flength%RW_BYTES!=0)
            {   fread(rw_buf,1,header.flength%RW_BYTES,destFile);
                fwrite(rw_buf, 1, header.flength%RW_BYTES, pImgfile);
            }
            fclose ( pImgfile);
            times.modtime = times.actime = header.modifyTime;
            utime(path,&times);
            ret_value=1;
        }
        else
            printf("Warning: File %s was not found!\n", imgFileName);
    }/*end of for (i=2; i<Num_Files-1; i++)*/
    free(rw_buf);
    fclose(destFile);
    return ret_value;
}

#ifdef VxWorks
#if 0
/*
 wangjian change 2005-7-19 18:22, IP00030078 
 原有的方式下,z_seek的效率太低,用新的函数替代
*/

/* 以前调用:fp = fdopen(fd,"rb"),当fclose(fp)之后同时释放fd,引起错误。
   因此使用参数*zarName,使用fopen()打开文件操作 */
int z_seek(int fd, char *zarName, char *imgFileName)
{
    HdZAR   header;        /*合并后各IMG文件的文件头。*/
    FILE    *fp;
    struct  stat file_stat;
    char    ch;
    int     nCnt;

    fstat(fd,&file_stat);
    fp = fopen(zarName, "rb");

    if( file_stat.st_size <= 1)
    {
        fclose(fp);
        return ERROR;
    }
    else
        fread(&ch, 1,1,fp);

    while (TRUE)
    {
        if( fread ((char*)&header.fname,1, MAXFILE+MAXEXT,fp) != (MAXFILE+MAXEXT))
            break;

        header.flength = Read_From_File(fp);
        header.srcflength = Read_From_File(fp);
/*        header.creatTime=Read_From_File(fp);*/
        header.modifyTime=Read_From_File(fp);

        if (stricmp(header.fname, imgFileName)==0)
        {
            lseek(fd,ftell(fp),SEEK_SET);
            fclose(fp);
            return header.flength;
        }
        else
        {
            if( (ftell(fp)+header.flength) >= file_stat.st_size)
                break;
            else
            {
                for(nCnt=0;nCnt<header.flength;nCnt++)
                    fread(&ch, 1,1,fp);
/*               lseek(fd, header.flength, SEEK_CUR);*/
            }
        }
    }

/*  while (TRUE)
    {
        if( fread ((char*)&header,1, sizeof( HdZAR),fp) != sizeof( HdZAR))
            break;

        if (stricmp(header.fname, imgFileName)==0)
        {
            lseek(fd,ftell(fp),SEEK_SET);
            return header.flength;
        }
        else
        {
            if( (ftell(fp)+header.flength) >= file_stat.st_size)
                break;
            else
            {
                for(nCnt=0;nCnt<header.flength;nCnt++)
                    fread(&ch, 1,1,fp);
            }
        }
    }*/

    fclose(fp);
    return ERROR;
}
#endif

#if 1
/*
 wangjian add 2005-7-19 18:23,IP00030078,
 别工优化了这个函数的实现方法,可以大大提高z_seek的速度
*/
long read_file(int fd)
{
	unsigned char ch;
	long i;
    read(fd, &ch, 1);
	i = ch << 24;
    read(fd, &ch, 1);
	i |= ch << 16;
    read(fd, &ch, 1);
	i |= ch << 8;
    read(fd, &ch, 1);
	i |= ch;
	return i;
}

int z_seek(int fd, char *zarName, char *imgFileName)
{
    HdZAR   header;        /*合并后各IMG文件的文件头。*/
	lseek(fd, 1, SEEK_SET); /* skip 1 byte */
	while (TRUE) {
       if (read(fd, (char *)&header.fname, MAXFILE+MAXEXT) != MAXFILE+MAXEXT)
       {
            printf("z_seek:read error %i, fd=%i\n",errno, fd);
			break;
		}
		header.flength = read_file(fd);
		header.srcflength = read_file(fd);
		header.modifyTime = read_file(fd);
        if (stricmp(header.fname, imgFileName)==0)
  			return header.flength;
        else 
			lseek(fd, header.flength, SEEK_CUR);
    }	
	return ERROR;
}
#endif

int mem_seek(char* zar_mem,UINT zar_mem_size,char *imgFileName,char** pp_img_mem)
{
    HdZAR* p_zar_head;        /*合并后各IMG文件的文件头。*/
    long   FileSize = 0;
    union {
    char b[4];
      long l;
    } Temp_u;

    if( zar_mem_size < sizeof(HdZAR) + 1 )
        return ERROR;
    else
        p_zar_head = (HdZAR*)((char*)zar_mem + 1);


    while (TRUE)
    {
      Temp_u.l  = p_zar_head->flength;
      FileSize = (long)((Temp_u.b[0]<<24)&0xff000000);
      FileSize|= (long)((Temp_u.b[1]<<16)&0xff0000);
      FileSize|= (long)((Temp_u.b[2]<<8)&0xff00);
      FileSize|= (long)((Temp_u.b[3])&0xff);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -