📄 macmisc.c
字号:
/* $Id: macmisc.c,v 1.1.1.1 2003/06/02 15:55:41 pekangas Exp $ *//* * Copyright (c) 1999, 2003 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */#include <MacTypes.h>#include <Dialogs.h>#include <Files.h>#include <MacWindows.h>#include <Processes.h>#include <Quickdraw.h>#include <TextUtils.h>#include <stdarg.h>#include <stdio.h>#include "putty.h"#include "mac.h"#if TARGET_API_MAC_CARBON/* * This is used by (I think) CarbonStdCLib, but only exists in * CarbonLib 1.1 and later. Muppets. Happily, it's documented to be * a synonym for NULL. */#include <CFBase.h>const CFAllocatorRef kCFAllocatorDefault = NULL;#elseQDGlobals qd;#endif/* * Like FrontWindow(), but return NULL if we aren't the front process * (i.e. the front window isn't one of ours). */WindowPtr mac_frontwindow(void){ ProcessSerialNumber frontpsn; ProcessSerialNumber curpsn = { 0, kCurrentProcess }; Boolean result; GetFrontProcess(&frontpsn); if (SameProcess(&frontpsn, &curpsn, &result) == noErr && result) return FrontWindow(); return NULL;}void fatalbox(char *fmt, ...) { va_list ap; Str255 stuff; va_start(ap, fmt); /* We'd like stuff to be a Pascal string */ stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); va_end(ap); ParamText(stuff, NULL, NULL, NULL); StopAlert(128, NULL); cleanup_exit(1);}void modalfatalbox(char *fmt, ...) { va_list ap; Str255 stuff; va_start(ap, fmt); /* We'd like stuff to be a Pascal string */ stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); va_end(ap); ParamText(stuff, NULL, NULL, NULL); StopAlert(128, NULL); cleanup_exit(1);}Filename filename_from_str(const char *str){ Filename ret; Str255 tmp; /* XXX This fails for filenames over 255 characters long. */ c2pstrcpy(tmp, str); FSMakeFSSpec(0, 0, tmp, &ret.fss); return ret;}/* * Convert a filename to a string for display purposes. * See pp 2-44--2-46 of IM:Files * * XXX static storage considered harmful */const char *filename_to_str(const Filename *fn){ CInfoPBRec pb; Str255 dirname; OSErr err; static char *path = NULL; char *newpath; if (path != NULL) sfree(path); path = snewn(fn->fss.name[0], char); p2cstrcpy(path, fn->fss.name); pb.dirInfo.ioNamePtr = dirname; pb.dirInfo.ioVRefNum = fn->fss.vRefNum; pb.dirInfo.ioDrParID = fn->fss.parID; pb.dirInfo.ioFDirIndex = -1; do { pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID; err = PBGetCatInfoSync(&pb); /* XXX Assume not A/UX */ newpath = snewn(strlen(path) + dirname[0] + 2, char); p2cstrcpy(newpath, dirname); strcat(newpath, ":"); strcat(newpath, path); sfree(path); path = newpath; } while (pb.dirInfo.ioDrDirID != fsRtDirID); return path;}int filename_equal(Filename f1, Filename f2){ return f1.fss.vRefNum == f2.fss.vRefNum && f1.fss.parID == f2.fss.parID && f1.fss.name[0] == f2.fss.name[0] && memcmp(f1.fss.name + 1, f2.fss.name + 1, f1.fss.name[0]) == 0;}int filename_is_null(Filename fn){ return fn.fss.vRefNum == 0 && fn.fss.parID == 0 && fn.fss.name[0] == 0;}FILE *f_open(Filename fn, char const *mode){ short savevol; long savedir; char tmp[256]; FILE *ret; HGetVol(NULL, &savevol, &savedir); if (HSetVol(NULL, fn.fss.vRefNum, fn.fss.parID) == noErr) { p2cstrcpy(tmp, fn.fss.name); ret = fopen(tmp, mode); } else ret = NULL; HSetVol(NULL, savevol, savedir); return ret;}/* * Local Variables: * c-file-style: "simon" * End: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -