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

📄 macos.c

📁 压缩解压,是unzip540的升级,这个外国网站摘来的源码,是evb编写.
💻 C
📖 第 1 页 / 共 5 页
字号:
/***********************/long macwrite(short nFRefNum, char *pb, unsigned cb){    long    lcb = cb;    OSErr   err = 0;    FILE    *stream;    if ( (nFRefNum == 1) || (nFRefNum == 2) )        {        stream = (nFRefNum == 1 ? stdout : stderr);        pb[cb] = '\0';           /* terminate C-string */                                 /* assumes writable buffer (e.g., slide[]) */                                 /* with room for one more char at end of buf */        lcb = fprintf(stream, "%s", pb);        }    else        err = FSWrite( nFRefNum, &lcb, pb );    if (err != 0)        {        errno = ERANGE;        return -1;        }    return (long)lcb;}/***********************//* Function macclose() *//***********************/short macclose(short nFRefNum){OSErr err;err = FSClose( nFRefNum );printerr("macclose FSClose ",err,err, __LINE__,__FILE__,G.filename);return err;}/***********************//* Function maclseek() *//***********************/long maclseek(short nFRefNum, long lib, short nMode){    ParamBlockRec   pbr;    if (nMode == SEEK_SET)        nMode = fsFromStart;    else if (nMode == SEEK_CUR)        nMode = fsFromMark;    else if (nMode == SEEK_END)        nMode = fsFromLEOF;    pbr.ioParam.ioRefNum = nFRefNum;    pbr.ioParam.ioPosMode = nMode;    pbr.ioParam.ioPosOffset = lib;    (void)PBSetFPosSync(&pbr);    return pbr.ioParam.ioPosOffset;}static void BuildMacFilename(void){char CompletePath[NAME_MAX];char ArchiveDir[NAME_MAX];unsigned exdirlen = strlen(uO.exdir);short CurrentFork;OSErr err;GetExtraFieldData(&MacZipMode, &newExtraField);if (MacZipMode >= JohnnyLee_EF)    {    if (IgnoreEF_Macfilename)        {        strcpy(ArchiveDir, &G.filename[exdirlen+1]);        G.filename[exdirlen+1] = '\0';        RfDfFilen2Real(ArchiveDir, ArchiveDir, MacZipMode,                      (newExtraField.flags & EB_M3_FL_DATFRK), &CurrentFork);        strcat(G.filename, ArchiveDir);        }    else        {        /* use the filename of mac extra-field */        G.filename[exdirlen] = '\0';  /* cut resource-path */        strcat(G.filename,newExtraField.FullPath);        }    }GetCompletePath(CompletePath, G.filename, &CurrentFile, &err);printerr("GetCompletePath BuildMacFilename ", (err != -43) && (err != 0),             err, __LINE__, __FILE__, CompletePath);err = GetVolFileSystemID(C2PStr(CompletePath), CurrentFile.vRefNum,                         &fileSystemID);printerr("GetVolFileSystemID BuildMacFilename ", err, err, __LINE__, __FILE__,          CompletePath);if (MacZipMode == TomBrownZipIt1_EF)    {    memcpy(CurrentFile.name, newExtraField.filename, newExtraField.filename[0]+1);    CurrentFile.name[0] = CurrentFile.name[0] - 1;    }}/* The following functions are dealing with the extra-field handling, only. *//****************************//* Function SetFinderInfo() *//****************************/static OSErr SetFinderInfo(FSSpec *spec, MACINFO *mi){    OSErr err;    CInfoPBRec      fpb;    fpb.hFileInfo.ioNamePtr   = (StringPtr) &(spec->name);    fpb.hFileInfo.ioVRefNum   = spec->vRefNum;    fpb.hFileInfo.ioDirID     = spec->parID;    fpb.hFileInfo.ioFDirIndex = 0;    err = PBGetCatInfoSync(&fpb);    printerr("PBGetCatInfo SetFinderInfo ", err, err,             __LINE__, __FILE__, G.filename);    if  ((MacZipMode == JohnnyLee_EF) || (MacZipMode == NewZipMode_EF))    {        if (!UseUT_ExtraField)  {            fpb.hFileInfo.ioFlCrDat = mi->fpb.hFileInfo.ioFlCrDat;            fpb.hFileInfo.ioFlMdDat = mi->fpb.hFileInfo.ioFlMdDat;        }        fpb.hFileInfo.ioFlFndrInfo   = mi->fpb.hFileInfo.ioFlFndrInfo;    }    if (MacZipMode == NewZipMode_EF)    {        if (uO.E_flag) PrintMacExtraInfo(mi);        fpb.hFileInfo.ioFlXFndrInfo  = mi->fpb.hFileInfo.ioFlXFndrInfo;        fpb.hFileInfo.ioFVersNum  = mi->fpb.hFileInfo.ioFVersNum;        fpb.hFileInfo.ioACUser    = mi->fpb.hFileInfo.ioACUser;        if (!UseUT_ExtraField) {            fpb.hFileInfo.ioFlBkDat = mi->fpb.hFileInfo.ioFlBkDat;#ifdef USE_EF_UT_TIME            if (!(mi->flags & EB_M3_FL_NOUTC))                {#ifdef DEBUG_TIME            {            printf("\nSetFinderInfo:  Mac modif: %lu local -> UTOffset: "\                   "%d before AdjustForTZmoveMac\n",              fpb.hFileInfo.ioFlCrDat, mi->Cr_UTCoffs);            }#endif /* DEBUG_TIME */                fpb.hFileInfo.ioFlCrDat =                  AdjustForTZmoveMac(fpb.hFileInfo.ioFlCrDat, mi->Cr_UTCoffs);                fpb.hFileInfo.ioFlMdDat =                  AdjustForTZmoveMac(fpb.hFileInfo.ioFlMdDat, mi->Md_UTCoffs);                fpb.hFileInfo.ioFlBkDat =                  AdjustForTZmoveMac(fpb.hFileInfo.ioFlBkDat, mi->Bk_UTCoffs);#ifdef DEBUG_TIME            {            printf("SetFinderInfo:  Mac modif: %lu local -> UTOffset: "\                   "%d after AdjustForTZmoveMac\n",              fpb.hFileInfo.ioFlCrDat, mi->Cr_UTCoffs);            }#endif /* DEBUG_TIME */                }#endif /* USE_EF_UT_TIME */        }        if ((mi->FinderComment) &&           (fileSystemID == HFS_fileSystem)) {            C2PStr(mi->FinderComment);            err = FSpDTSetComment(spec, (unsigned char *) mi->FinderComment);            printerr("FSpDTSetComment:",err , err,                     __LINE__, __FILE__, mi->FullPath);        }    }    /* Restore ioDirID field in pb which was changed by PBGetCatInfo */    fpb.hFileInfo.ioDirID = spec->parID;    err = PBSetCatInfoSync(&fpb);    return err;} /* SetFinderInfo() *//*** Scan the extra fields in extra_field, and look for a MacOS EF; return a** pointer to that EF, or NULL if it's not there.*/static uch *scanMacOSexfield(uch *ef_ptr, unsigned ef_len,                             short *MacZipMode){    while (ef_ptr != NULL && ef_len >= EB_HEADSIZE) {        unsigned eb_id  = makeword(EB_ID  + ef_ptr);        unsigned eb_len = makeword(EB_LEN + ef_ptr);        if (eb_len > (ef_len - EB_HEADSIZE)) {            Trace((stderr,              "scanMacOSexfield: block length %u > rest ef_size %u\n", eb_len,              ef_len - EB_HEADSIZE));            break;        }        if (isMacOSexfield(eb_id, eb_len, MacZipMode)) {            return ef_ptr;        }        ef_ptr += (eb_len + EB_HEADSIZE);        ef_len -= (eb_len + EB_HEADSIZE);    }    return NULL;}static Boolean isMacOSexfield(unsigned id, unsigned size, short *MacZipMode){size = size;    switch (id)        {        case EF_ZIPIT:            {           /* we do not (yet) support ZipIt's format completely */            *MacZipMode = TomBrownZipIt1_EF;            IgnoreEF_Macfilename = true;            return true;            }        case EF_ZIPIT2:            {           /* we do not (yet) support ZipIt's format completely */            *MacZipMode = TomBrownZipIt2_EF;            IgnoreEF_Macfilename = true;            return true;            }        case EF_MAC3:            {           /* the new maczip format */            *MacZipMode = NewZipMode_EF;            IgnoreEF_Macfilename = false;            return true;            }        case EF_JLMAC:            {           /* Johnny Lee's old maczip format */            *MacZipMode = JohnnyLee_EF;            IgnoreEF_Macfilename = true;            return true;            }        default:            {           /* any other format */            *MacZipMode = UnKnown_EF;            IgnoreEF_Macfilename = true;            return false;            }        }    return false;}/*** Return a unsigned long from a four-byte sequence** in big endian format*/ulg makePPClong(ZCONST uch *sig){    return (((ulg)sig[0]) << 24)         + (((ulg)sig[1]) << 16)         + (((ulg)sig[2]) << 8)         +  ((ulg)sig[3]);}/*** Return a unsigned short from a two-byte sequence** in big endian format*/ush makePPCword(ZCONST uch *b){    return (ush)((b[0] << 8) | b[1]);}/*** Print mac extra-field***/static void PrintMacExtraInfo(MACINFO *mi){#define MY_FNDRINFO fpb.hFileInfo.ioFlFndrInfo    DateTimeRec  MacTime;    static ZCONST char space[] = "                                    ";    static ZCONST char line[]  = "------------------------------------"\                                 "------------------------------";    printf("\n\n%s", line);    printf("\nFullPath      = [%s]", mi->FullPath);    printf("\nFinderComment = [%s]", mi->FinderComment);    printf("\nText Encoding Base (Filename)       \"%s\" \n",        PrintTextEncoding(mi->fpb.hFileInfo.ioFlXFndrInfo.fdScript));    printf("\nExtraField Flags :                  %s  0x%x  %4d",             sBit2Str(mi->flags), mi->flags, mi->flags);    printf("\n%sExtra Field is %s", space,           (mi->flags & EB_M3_FL_UNCMPR ?            "Uncompressed" : "Compressed"));    printf("\n%sFile Dates are in %u Bit", space,           (mi->flags & EB_M3_FL_TIME64 ? 64 : 32));    printf("\n%sFile UTC time adjustments are %ssupported", space,           (mi->flags & EB_M3_FL_NOUTC ? "not " : ""));    printf("\n%sFile Name is %schanged", space,           (mi->flags & EB_M3_FL_NOCHANGE ? "not " : ""));    printf("\n%sFile is a %s\n", space,           (mi->flags & EB_M3_FL_DATFRK ?            "Datafork" : "Resourcefork"));    /* not all type / creator codes are printable */    if (isprint((char)(mi->MY_FNDRINFO.fdType >> 24)) &&        isprint((char)(mi->MY_FNDRINFO.fdType >> 16)) &&        isprint((char)(mi->MY_FNDRINFO.fdType >> 8)) &&        isprint((char)mi->MY_FNDRINFO.fdType))    {        printf("\nFile Type =                         [%c%c%c%c]  0x%lx",            (char)(mi->MY_FNDRINFO.fdType >> 24),            (char)(mi->MY_FNDRINFO.fdType >> 16),            (char)(mi->MY_FNDRINFO.fdType >> 8),            (char)(mi->MY_FNDRINFO.fdType),            mi->MY_FNDRINFO.fdType);    }    else    {        printf("\nFile Type =                                     0x%lx",            mi->MY_FNDRINFO.fdType);    }    if (isprint((char)(mi->MY_FNDRINFO.fdCreator >> 24)) &&        isprint((char)(mi->MY_FNDRINFO.fdCreator >> 16)) &&        isprint((char)(mi->MY_FNDRINFO.fdCreator >> 8)) &&        isprint((char)mi->MY_FNDRINFO.fdCreator))    {        printf("\nFile Creator =                      [%c%c%c%c]  0x%lx",            (char)(mi->MY_FNDRINFO.fdCreator >> 24),            (char)(mi->MY_FNDRINFO.fdCreator >> 16),            (char)(mi->MY_FNDRINFO.fdCreator >> 8),            (char)(mi->MY_FNDRINFO.fdCreator),            mi->MY_FNDRINFO.fdCreator);    }    else    {        printf("\nFile Creator =                                  0x%lx",            mi->MY_FNDRINFO.fdCreator);    }    printf("\n\nDates (local time of archiving location):");    SecondsToDate(mi->fpb.hFileInfo.ioFlCrDat, &MacTime);    printf("\n    Created  =                      %4d/%2d/%2d %2d:%2d:%2d  ",           MacTime.year, MacTime.month, MacTime.day,           MacTime.hour, MacTime.minute, MacTime.second);    SecondsToDate(mi->fpb.hFileInfo.ioFlMdDat, &MacTime);

⌨️ 快捷键说明

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