📄 macos.c
字号:
/***********************/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 + -