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

📄 macopen.c

📁 给出了 zip 压缩算法的完整实现过程。
💻 C
字号:
/*  Copyright (c) 1990-2005 Info-ZIP.  All rights reserved.  See the accompanying file LICENSE, version 2004-May-22 or later  (the contents of which are also included in zip.h) for terms of use.  If, for some reason, both of these files are missing, the Info-ZIP license  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html*//*** macopen.c; stuff only required for the Mac port ***/#include "zip.h"#include <string.h>#include <fcntl.h>#include <unix.h>#include <sound.h>#include "helpers.h"#include "pathname.h"#include "macopen.h"#include "macstuff.h"#ifdef MACZIP#include "macglob.h"extern char *zipfile;   /* filename of the Zipfile */extern char *tempzip;   /* Temporary zip file name */extern MacZipGlobals    MacZip;/* don't include "osdep.h" otherwise we will trap into endless loop */#undef open#undef fopenFILE *MacFopen(const char *path, const char *mode){static char TruncPath[NAME_MAX];OSErr   err = 0;AssertStr(path,path)            /* open zipfile or tempzip */if (strcmp(zipfile,path) == 0)    {    GetCompletePath(MacZip.ZipFullPath,path,&MacZip.ZipFileSpec,&err);    err = PrintUserHFSerr((err != -43) && (err != 0), err, path);    printerr("GetCompletePath:",err,err,__LINE__,__FILE__,path);    if (CheckMountedVolumes(MacZip.ZipFullPath) > 1)        DoWarnUserDupVol(MacZip.ZipFullPath);    /* tempfile should appear in the same directory of the zipfile       -> save path of zipfile */    TruncFilename(TruncPath, MacZip.ZipFullPath);    return fopen(MacZip.ZipFullPath, mode);    }if (strcmp(tempzip,path) == 0)    {  /* add path of zipfile */    sstrcat(TruncPath,tempzip);    GetCompletePath(MacZip.TempZipFullPath,TruncPath,&MacZip.TempZipFileSpec,&err);    err = PrintUserHFSerr((err != -43) && (err != 0), err, path);    printerr("GetCompletePath:",err,err,__LINE__,__FILE__,path);    return fopen(MacZip.TempZipFullPath, mode);    }printerr("MacFopen:",err,err,__LINE__,__FILE__,path);return NULL;}int MacOpen(const char *path,int oflag, ...){char RealFname[NAME_MAX];AssertStr(path,path)RfDfFilen2Real(RealFname,path, MacZip.MacZipMode, MacZip.DataForkOnly, &MacZip.CurrentFork);/* convert to real fname and init global var  MacZip.CurrentFork  !!  */switch (MacZip.CurrentFork)    {    case DataFork:        {        return my_open(RealFname, oflag);        break;        }    case ResourceFork:        {        return my_open( RealFname, oflag | O_RSRC);        break;        }    default:  /* for now (Zip ver 2.3b) MacOpen should never reach this point */        {     /* however, this may change in the future ... */        printerr("open: no resource / datafork ",-1,-1,__LINE__,__FILE__,path);        return -1;        }    }}#ifdef muell /* file to delete */int destroy(char *path){static char lastpath[NAME_MAX];char    currpath[NAME_MAX];static Boolean FirstCall = true;long rc;AssertStr(path,path)RfDfFilen2Real(currpath, path, MacZip.MacZipMode, MacZip.DataForkOnly, &MacZip.CurrentFork);if (FirstCall == true)    {    FirstCall = false;    rc = remove(currpath);    }else if (strcmp(currpath,lastpath) == 0) return 0; /* ignore, file is already deleted */        else rc = remove(currpath); /* we are removeing all the files only by their        pathname this is dangerous on a mac but there is no other way without         a complete rewrite of the port  */strcpy(lastpath,currpath);return rc;}#endif/* this function replaces the function "replace()" defined in fileio.c */int replace(char *new_f, char *temp_f)  /* destination and source file names */{OSErr   err = 0;char    newfname[NAME_MAX];AssertStr(new_f,new_f)AssertStr(temp_f,temp_f)UserStop();GetFilename(newfname, new_f);/* check zipfile name and tempfile name *//* we are using this function only for replacing the tempfile with the zipfile */if ((strcmp(zipfile,new_f) == 0) || (strcmp(tempzip,temp_f) == 0))    {    remove(MacZip.ZipFullPath);    /* rename the temp file to the zip file */    err = rename(MacZip.TempZipFullPath,MacZip.ZipFullPath);    printerr("rename:",err,err,__LINE__,__FILE__,MacZip.TempZipFullPath);if (err != 0) return ZE_CREAT;    else return ZE_OK;    }else return ZE_CREAT;} /* file to delete */ /* we are removeing all the files only by their    pathname this is dangerous on a mac but there is no    other way without a complete rewrite of the port  */int destroy(char *path){static char lastpath[NAME_MAX];static FSSpec  trashfolder;static Boolean FirstCall = true;static char Num = 0;static Boolean  Immediate_File_Deletion = false;char    currpath[NAME_MAX], *envptr;FSSpec  fileToDelete;OSErr   err;/* init this function */if ((path == NULL) ||    (strlen(path) == 0))    {    FirstCall = true;    Num = 0;    return -1;    }UserStop();RfDfFilen2Real(currpath, path, MacZip.MacZipMode,                MacZip.DataForkOnly, &MacZip.CurrentFork);GetCompletePath(currpath,currpath,&fileToDelete, &err);if (FirstCall == true)    {    FirstCall = false;    sstrcpy(lastpath,currpath);    err = FSpFindFolder(fileToDelete.vRefNum, kTrashFolderType,                      kDontCreateFolder,&trashfolder);    printerr("FSpFindFolder:",err,err,__LINE__,__FILE__,path);    envptr = getenv("Immediate_File_Deletion");    if (!(envptr == (char *)NULL || *envptr == '\0'))        {        if (stricmp(envptr,"yes") == 0)            Immediate_File_Deletion = true;        else            Immediate_File_Deletion = false;        }    if (Immediate_File_Deletion)        {        err = FSpDelete(&fileToDelete);        return err;        }    err = CatMove (fileToDelete.vRefNum, fileToDelete.parID,                   fileToDelete.name, trashfolder.parID, trashfolder.name);    return err;    }if (strcmp(currpath,lastpath) == 0)    {    return 0; /* ignore, file is already deleted */    }else    {    if (Immediate_File_Deletion)        {        err = FSpDelete(&fileToDelete);        sstrcpy(lastpath,path);        return err;        }    err = CatMove (fileToDelete.vRefNum, fileToDelete.parID,                   fileToDelete.name, trashfolder.parID, trashfolder.name);    /* -48 = file is already existing so we have to rename it before       moving the file */    if (err == -48)        {        Num++;        if (fileToDelete.name[0] >= 28) /* cut filename if to long */            fileToDelete.name[0] = 28;        P2CStr(fileToDelete.name);        sprintf(currpath,"%s~%d",(char *)fileToDelete.name,Num);        C2PStr(currpath);        C2PStr((char *)fileToDelete.name);        err = HRename (fileToDelete.vRefNum, fileToDelete.parID,                       fileToDelete.name, (unsigned char *) currpath);        err = CatMove (fileToDelete.vRefNum, fileToDelete.parID,                       (unsigned char *) currpath, trashfolder.parID,                       trashfolder.name);        }    }sstrcpy(lastpath,currpath);return err;}#endif  /* #ifdef MACZIP *//* *  int open(const char *path, int oflag) * *      Opens a file stream. */int my_open(char *path, int oflag){    FSSpec          spec;    char            permission;    HParamBlockRec  hpb;    OSErr           err, errno;    Boolean targetIsFolder, wasAliased;    AssertStr(path,path)    /* Setup permission */    if ((oflag & 0x03) == O_RDWR)        permission = fsRdWrPerm;    else        permission = (oflag & O_RDONLY) ? fsRdPerm : 0 + (oflag & O_WRONLY) ? fsWrPerm : 0;        FSpLocationFromFullPath(strlen(path),path, &spec);        if ((oflag & (O_ALIAS | O_NRESOLVE)) == 0)            ResolveAliasFile(&spec, true, &targetIsFolder, &wasAliased);        hpb.fileParam.ioNamePtr = spec.name;        hpb.fileParam.ioVRefNum = spec.vRefNum;        hpb.fileParam.ioDirID = spec.parID;        hpb.ioParam.ioPermssn = permission;        if (oflag & O_RSRC)         /* open the resource fork of the file */            err = PBHOpenRFSync(&hpb);        else                        /* open the data fork of the file */            err = PBHOpenDFSync(&hpb);    if ((err == fnfErr) && (oflag & O_CREAT)) {        hpb.fileParam.ioFlVersNum = 0;        err = PBHCreateSync(&hpb);        if (err == noErr) {            /* Set the finder info */            unsigned long secs;            unsigned long isbinary = oflag & O_BINARY;            hpb.fileParam.ioFlFndrInfo.fdType = '\?\?\?\?';            hpb.fileParam.ioFlFndrInfo.fdCreator = '\?\?\?\?';            hpb.fileParam.ioFlFndrInfo.fdFlags = 0;            if (oflag & O_ALIAS)        /* set the alias bit */                hpb.fileParam.ioFlFndrInfo.fdFlags = kIsAlias;            else                                        /* clear all flags */                hpb.fileParam.ioFlFndrInfo.fdFlags = 0;            GetDateTime(&secs);            hpb.fileParam.ioFlCrDat = hpb.fileParam.ioFlMdDat = secs;            PBHSetFInfoSync(&hpb);        }        if (err && (err != dupFNErr)) {            errno = err; return -1;        }            if (oflag & O_RSRC)         /* open the resource fork of the file */                err = PBHOpenRFSync(&hpb);            else                        /* open the data fork of the file */                err = PBHOpenDFSync(&hpb);    }    if (err && (err != dupFNErr) && (err != opWrErr)) {        errno = err; return -1;    }    if (oflag & O_TRUNC) {        IOParam pb;        pb.ioRefNum = hpb.ioParam.ioRefNum;        pb.ioMisc = 0L;        err = PBSetEOFSync((ParmBlkPtr)&pb);        if (err != noErr) {            errno = err; return -1;        }    }    if (oflag & O_APPEND) lseek(hpb.ioParam.ioRefNum,0,SEEK_END);    return (hpb.ioParam.ioRefNum);}

⌨️ 快捷键说明

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