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

📄 macbin3.c

📁 压缩解压,是unzip540的升级,这个外国网站摘来的源码,是evb编写.
💻 C
📖 第 1 页 / 共 2 页
字号:
                HLock(data);                err = FSWrite(dfRefNum,&inOutCount,*data);                HUnlock(data);                FSClose(dfRefNum);                }            }        DisposeHandle(data);        }    return err;}static Handle EncodeMacbinary(FSSpec *file){    Handle result = nil;    FInfo   fndrInfo;    FXInfo  fndrXInfo;    OSErr   err;    CInfoPBRec  pb;    short   dfRefNum, rfRefNum;    long    ioCount;    char    buffer[128];    char    header[128];    char    comment[256];    long    resourceForkLength, dataForkLength, commentLength;    memset(&header, 0, sizeof(header));    err = FSpGetFInfo(file, &fndrInfo);    memset(&pb, 0, sizeof(CInfoPBRec));    pb.hFileInfo.ioNamePtr = file->name;    pb.hFileInfo.ioVRefNum = file->vRefNum;    pb.hFileInfo.ioFDirIndex = 0;           //query a file    pb.hFileInfo.ioDirID = file->parID;    err = PBGetCatInfo(&pb,false);    fndrXInfo = pb.hFileInfo.ioFlXFndrInfo;    BYTE_AT_OFFSET(header, kFileNameLengthOffset) = file->name[0];    BlockMoveData( &(file->name[1]),                   PTR_AT_OFFSET(header,                   kFileNameOffset),                   file->name[0]);    LONG_AT_OFFSET(header, kFileTypeOffset)    = fndrInfo.fdType;    LONG_AT_OFFSET(header, kFileCreatorOffset) = fndrInfo.fdCreator;    BYTE_AT_OFFSET(header, kFinderFlagsHiOffset) =                                          (fndrInfo.fdFlags & 0xFF00) >> 8;    BYTE_AT_OFFSET(header, kFinderFlagsLowOffset) =                                          (fndrInfo.fdFlags & 0x00FF);    WORD_AT_OFFSET(header, kFileVPositionOffset) = fndrInfo.fdLocation.v;    WORD_AT_OFFSET(header, kFileHPositionOffset) = fndrInfo.fdLocation.h;    WORD_AT_OFFSET(header, kFileFolderIDOffset)  = fndrInfo.fdFldr;    LONG_AT_OFFSET(header, kFileCreationDateOffset) = pb.hFileInfo.ioFlCrDat;    LONG_AT_OFFSET(header, kFileModificationDateOffset) =                                                      pb.hFileInfo.ioFlMdDat;    LONG_AT_OFFSET(header, kMacbinarySigOffset)        = 'mBIN';    BYTE_AT_OFFSET(header, kFilenameScriptOffset)      = fndrXInfo.fdScript;    BYTE_AT_OFFSET(header, kExtendedFinderFlagsOffset) = fndrXInfo.fdXFlags;    LONG_AT_OFFSET(header, kTotalFileLengthOffset) = 0;    WORD_AT_OFFSET(header, kSecondaryHeaderLengthOffset) = 0;    WORD_AT_OFFSET(header, kCurrentVersionOffset) = 130;    WORD_AT_OFFSET(header, kMinimumVersionOffset) = 129;    err = FSpOpenDF(file,fsRdPerm,&dfRefNum);    if(err == noErr)        {        err = GetEOF(dfRefNum,&dataForkLength);        LONG_AT_OFFSET(header, kDataForkLengthOffset) = dataForkLength;        }    else        {        dfRefNum = 0;        }    err = FSpOpenRF(file,fsRdPerm,&rfRefNum);    if(err == noErr)        {        err = GetEOF(rfRefNum,&resourceForkLength);        LONG_AT_OFFSET(header, kResourceForkLengthOffset) = resourceForkLength;        }    else        {        rfRefNum = 0;        }    memset(comment, 0, 256);    if(GetDesktopComment(file, comment, &commentLength) != noErr)        commentLength = 0;    WORD_AT_OFFSET(header, kGetInfoCommentLengthOffset) = commentLength;    WORD_AT_OFFSET(header, kCRCOffset) =                                     crc32( 0, (unsigned char*) &header, 124);    result = TempNewHandle(0, &err);    if(result)        {        err = PtrAndHand(&header,result,128);        if(dfRefNum && dataForkLength)            {            err = noErr;            while(dataForkLength > 0 && err == noErr)                {                ioCount = 128;                err = FSRead(dfRefNum,&ioCount,&buffer);                if(err == noErr || err == eofErr)                    err = PtrAndHand(&buffer,result,128);                dataForkLength -= ioCount;                }            }        if(rfRefNum && resourceForkLength)            {            err = noErr;            while(resourceForkLength > 0 && err == noErr)                {                ioCount = 128;                err = FSRead(rfRefNum,&ioCount,&buffer);                if(err == noErr || err == eofErr)                    err = PtrAndHand(&buffer,result,128);                resourceForkLength -= ioCount;                }            }        if(commentLength)            {            PtrAndHand(&comment,result,commentLength);            }        }    if(rfRefNum)        FSClose(rfRefNum);    if(dfRefNum)        FSClose(dfRefNum);    return result;}#endif /* INCLUDE_ENCODE_MACBINARY */#ifdef INCLUDE_DECODE_MACBINARYstatic OSErr    SetDesktopComment(FSSpec *file, char*comment, long length){    DTPBRec     pb;    OSErr       err;    pb.ioCompletion = nil;    pb.ioNamePtr = NULL;    pb.ioVRefNum = file->vRefNum;    err = PBDTGetPath(&pb);    if(err == noErr)        {        pb.ioNamePtr    = file->name;        pb.ioDTBuffer   = comment;        pb.ioDirID      = file->parID;        pb.ioDTReqCount = length;        err = PBDTSetComment(&pb, false);        }    return err;}OSErr   DecodeMacBinaryFile(FSSpec *source){    Handle  data = nil;    OSErr   err;    short   dfRefNum = 0;    long    size;    FSSpec  McBin_source;    memcpy(McBin_source.name,source->name,source->name[0]+1);    McBin_source.vRefNum = source->vRefNum;    McBin_source.parID   = source->parID;    err = FSpOpenDF(source, fsRdPerm, &dfRefNum);    if(!err)        {        err = GetEOF(dfRefNum, &size);        data = TempNewHandle(size, &err);        if(data)            {            HLock(data);            err = FSRead(dfRefNum,&size,*data);            HUnlock(data);            }        FSClose(dfRefNum);        }    if(data && err == noErr)        {        err =  DecodeMacBinary(data, source);        DisposeHandle(data);        }#ifdef DELETE_MACBINARY_SOURCE    if (err == noErr)        err = FSpDelete(&McBin_source);#endif    return err;}static OSErr   DecodeMacBinary(Handle data, FSSpec *destination){    Handle result = nil;    FInfo   fndrInfo;    OSErr   err;    CInfoPBRec  pb;    short   dfRefNum, rfRefNum;    long    ioCount;    char    header[128];    char    comment[256];    long    resourceForkLength, dataForkLength, commentLength;    Boolean isMacBinaryFile = false;    short   headerEnd = 128;    long    rfOffset;    long maxDataLen;    memset(&pb, 0, sizeof(CInfoPBRec));    pb.hFileInfo.ioNamePtr   = destination->name;    pb.hFileInfo.ioVRefNum   = destination->vRefNum;    pb.hFileInfo.ioFDirIndex = 0;           /*  query a file */    pb.hFileInfo.ioDirID     = destination->parID;    err = PBGetCatInfo(&pb,false);    maxDataLen = pb.hFileInfo.ioFlLgLen;    HLock(data);    memcpy(header, *data, 128);     /* already checked with FSpIsMacBinary()    */    isMacBinaryFile = HeaderIsMacBinary(header, nil, maxDataLen);;    if(!isMacBinaryFile)        return paramErr;    if(WORD_AT_OFFSET(header, kSecondaryHeaderLengthOffset))        {        headerEnd = WORD_AT_OFFSET(header, kSecondaryHeaderLengthOffset);        headerEnd = (headerEnd + 127) & ~127L;        }    resourceForkLength = LONG_AT_OFFSET(header, kResourceForkLengthOffset);    dataForkLength     = LONG_AT_OFFSET(header, kDataForkLengthOffset);    commentLength      = WORD_AT_OFFSET(header, kGetInfoCommentLengthOffset);    memcpy( destination->name,            PTR_AT_OFFSET(header,            kFileNameLengthOffset),            BYTE_AT_OFFSET(header,            kFileNameLengthOffset));    fndrInfo.fdType    = LONG_AT_OFFSET(header, kFileTypeOffset);    fndrInfo.fdCreator = LONG_AT_OFFSET(header, kFileCreatorOffset);    fndrInfo.fdFlags = BYTE_AT_OFFSET(header, kFinderFlagsHiOffset);    fndrInfo.fdFlags << 8;    fndrInfo.fdFlags |= BYTE_AT_OFFSET(header, kFinderFlagsLowOffset);    fndrInfo.fdLocation.v = WORD_AT_OFFSET(header, kFileVPositionOffset);    fndrInfo.fdLocation.h = WORD_AT_OFFSET(header, kFileHPositionOffset);    fndrInfo.fdFldr       = WORD_AT_OFFSET(header, kFileFolderIDOffset);/*    index = 1;    checkFile = *destination;    while(FSpExists(&checkFile))        {        checkFile = *destination;        if(index < 10)            checkFile.name[++checkFile.name[0]] = '0' + index;        else            checkFile.name[++checkFile.name[0]] = ('a' - 10) + index;        index++;        }    *destination = checkFile;*/    err = FSpCreate(destination,                    fndrInfo.fdCreator,                    fndrInfo.fdType,                    smSystemScript);    dfRefNum = 0;    if(err == noErr)        {        err = FSpOpenDF(destination, fsRdWrPerm, &dfRefNum);        }    if(err == noErr && dfRefNum)        {        ioCount = dataForkLength;        err = FSWrite(dfRefNum,&ioCount,*data + headerEnd);        FSClose(dfRefNum);        }    rfRefNum = 0;    if(err == noErr)        {        err = FSpOpenRF(destination, fsRdWrPerm, &rfRefNum);        }    rfOffset = headerEnd + dataForkLength;    rfOffset = (rfOffset + 127) & ~127L;    if(err == noErr && rfRefNum)        {        ioCount = resourceForkLength;        err = FSWrite(rfRefNum,&ioCount,*data + rfOffset);        FSClose(rfRefNum);        }    rfOffset += resourceForkLength;    rfOffset = (rfOffset + 127) & ~127L;    if(err == noErr)       {        FSpSetFInfo(destination,&fndrInfo);        memset(&pb, 0, sizeof(CInfoPBRec));        pb.hFileInfo.ioNamePtr   = destination->name;        pb.hFileInfo.ioVRefNum   = destination->vRefNum;        pb.hFileInfo.ioFDirIndex = 0;           /*  query a file */        pb.hFileInfo.ioDirID     = destination->parID;        err = PBGetCatInfo(&pb,false);        if(err == noErr)            {            pb.hFileInfo.ioDirID   = destination->parID;            pb.hFileInfo.ioFlCrDat =                          LONG_AT_OFFSET(header, kFileCreationDateOffset);            pb.hFileInfo.ioFlMdDat =                          LONG_AT_OFFSET(header, kFileModificationDateOffset);            pb.hFileInfo.ioFlXFndrInfo.fdXFlags =                          BYTE_AT_OFFSET(header, kExtendedFinderFlagsOffset);            pb.hFileInfo.ioFlXFndrInfo.fdScript =                          BYTE_AT_OFFSET(header, kFilenameScriptOffset);            err = PBSetCatInfo(&pb, false);            }        if(commentLength)            {            memcpy(comment,*data + rfOffset, commentLength);            SetDesktopComment(destination, comment, commentLength);            }        }    HUnlock(data);    return err;}#endif /*  INCLUDE_DECODE_MACBINARY  */

⌨️ 快捷键说明

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