diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 1995-01-18 14:04:40 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 1995-01-18 14:04:40 (GMT) |
commit | 84fa5ecffffe23b6f39caf6f9cd43cdd1da33695 (patch) | |
tree | 402a1f31496b9ffcddcdeec91569b4064b7b045a | |
parent | d50e4e1c544aae822fe50d1a4f953f6329dfc827 (diff) | |
download | cpython-84fa5ecffffe23b6f39caf6f9cd43cdd1da33695.zip cpython-84fa5ecffffe23b6f39caf6f9cd43cdd1da33695.tar.gz cpython-84fa5ecffffe23b6f39caf6f9cd43cdd1da33695.tar.bz2 |
Initial version of FSSpec and Alias code. Non-functional as of now.
-rw-r--r-- | Mac/Compat/nfullpath.c | 76 | ||||
-rw-r--r-- | Mac/Compat/nfullpath.h | 1 | ||||
-rw-r--r-- | Mac/Modules/macfsmodule.c | 184 |
3 files changed, 261 insertions, 0 deletions
diff --git a/Mac/Compat/nfullpath.c b/Mac/Compat/nfullpath.c new file mode 100644 index 0000000..6e7e1b6 --- /dev/null +++ b/Mac/Compat/nfullpath.c @@ -0,0 +1,76 @@ +/* GET FULL PATHNAME OF A FILE. +** Original by Guido, modified by Jack to handle FSSpecs +** (and only tested under MetroWerks, so far) +*/ + +#if defined(MPW) || defined(__MWERKS__) +#include <Files.h> +#endif +#ifdef THINK_C_PRE_5_0 +#include <HFS.h> +#endif + +#include "nfullpath.h" + +/* Mac file system parameters */ +#define MAXPATH 256 /* Max path name length+1 */ +#define SEP ':' /* Separator in path names */ +#define ROOTID 2 /* DirID of a volume's root directory */ + +/* Macro to find out whether we can do HFS-only calls: */ +#define FSFCBLen (* (short *) 0x3f6) +#define hfsrunning() (FSFCBLen > 0) + +int +nfullpath(fsp, retbuf) + FSSpec *fsp; + char *retbuf; +{ + union { + HFileInfo f; + DirInfo d; + WDPBRec w; + VolumeParam v; + } pb; + static char cwd[2*MAXPATH]; + unsigned char namebuf[MAXPATH]; + short err; + int dir; + long dirid; + char *next= cwd + sizeof cwd - 1; + int len; + + + if (!hfsrunning()) + return -1; + + dir = fsp->vRefNum; + dirid = fsp->parID; + /* Stuff the filename into the buffer */ + len = fsp->name[0]; + *next = '\0'; + next -= len+1; + memcpy(next, &fsp->name[1], len); + + for (;;) { + pb.d.ioNamePtr= namebuf; + pb.d.ioVRefNum= dir; + pb.d.ioFDirIndex= -1; + pb.d.ioDrDirID= dirid; + err= PBGetCatInfo((CInfoPBPtr)&pb.d, 0); + if (err != noErr) { + return err; + } + *--next= SEP; + len= namebuf[0]; + if ( len + strlen(next) >= MAXPATH ) + return -1; + next -= len; + memcpy(next, (char *)namebuf+1, len); + if (pb.d.ioDrDirID == ROOTID) + break; + dirid= pb.d.ioDrParID; + } + strcpy(retbuf, next); + return 0; +} diff --git a/Mac/Compat/nfullpath.h b/Mac/Compat/nfullpath.h new file mode 100644 index 0000000..770777d --- /dev/null +++ b/Mac/Compat/nfullpath.h @@ -0,0 +1 @@ +int nfullpath(FSSpec *, char *); /* Generate full path from fsspec */
\ No newline at end of file diff --git a/Mac/Modules/macfsmodule.c b/Mac/Modules/macfsmodule.c new file mode 100644 index 0000000..b0a3797 --- /dev/null +++ b/Mac/Modules/macfsmodule.c @@ -0,0 +1,184 @@ +/*********************************************************** +Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum, +Amsterdam, The Netherlands. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +#include "allobjects.h" +#include "modsupport.h" /* For getargs() etc. */ +#include "macglue.h" + +#include <Files.h> +#include <StandardFile.h> +#include <Aliases.h> + +#include "nfullpath.h" + +static object *ErrorObject; + +/* ----------------------------------------------------- */ + +static object * +mfs_NewAlias(self, args) + object *self; /* Not used */ + object *args; +{ + FSSpec src, dst, *dstptr; + + src.name[0] = 0; + if (!newgetargs(args, "O&|O&", GetFSSpec, &dst, GetFSSpec, &src)) + return NULL; + + /* XXXX */ + + INCREF(None); + return None; +} + +static object * +mfs_ResolveAlias(self, args) + object *self; /* Not used */ + object *args; +{ + + if (!newgetargs(args, "")) + return NULL; + INCREF(None); + return None; +} + +static object * +mfs_ResolveAliasFile(self, args) + object *self; /* Not used */ + object *args; +{ + + if (!newgetargs(args, "")) + return NULL; + INCREF(None); + return None; +} + +static object * +mfs_StandardPutFile(self, args) + object *self; /* Not used */ + object *args; +{ + Str255 prompt, dft; + StandardFileReply reply; + + dft[0] = 0; + if (!newgetargs(args, "O&|O&", GetStr255, &prompt, GetStr255, &dft) ) + return NULL; + StandardPutFile(prompt, dft, &reply); + return mkvalue("(iO)", reply.sfGood, PyMac_BuildFSSpec(&reply.sfFile)); +} + +static object * +mfs_StandardGetFile(self, args) + object *self; /* Not used */ + object *args; +{ + char *list[4]; + SFTypeList typelist; + short numtypes; + StandardFileReply reply; + + list[0] = list[1] = list[2] = list[3] = 0; + numtypes = 0; + /* XXXX I don't understand newgetargs, why doesn't |s|s|s|s work? */ + if (!newgetargs(args, "|s", &list[0] /*, &list[1], &list[2], &list[3]*/) ) + return NULL; + while ( list[numtypes] && numtypes < 4 ) { + memcpy((char *)&typelist[numtypes], list[numtypes], 4); + numtypes++; + } + StandardGetFile((FileFilterUPP)0, numtypes, typelist, &reply); + return mkvalue("(iO)", reply.sfGood, PyMac_BuildFSSpec(&reply.sfFile)); +} + +static object * +mfs_FSSpecNormalize(self, args) + object *self; /* Not used */ + object *args; +{ + FSSpec fss; + + if (!newgetargs(args, "O&", GetFSSpec, &fss)) + return NULL; + return PyMac_BuildFSSpec(&fss); +} + +static object * +mfs_FSSpecPath(self, args) + object *self; /* Not used */ + object *args; +{ + FSSpec fss; + char strbuf[257]; + OSErr err; + + if (!newgetargs(args, "O&", GetFSSpec, &fss)) + return NULL; + err = nfullpath(&fss, strbuf); + if ( err ) { + PyErr_Mac(ErrorObject, err); + return NULL; + } + return newstringobject(strbuf); +} + +/* List of methods defined in the module */ + +static struct methodlist mfs_methods[] = { + {"NewAlias", mfs_NewAlias, 1}, + {"ResolveAlias", mfs_ResolveAlias, 1}, + {"ResolveAliasFile",mfs_ResolveAliasFile, 1}, + {"StandardPutFile", mfs_StandardPutFile, 1}, + {"StandardGetFile", mfs_StandardGetFile, 1}, + {"FSSpecNormalize", mfs_FSSpecNormalize, 1}, + {"FSSpecPath", mfs_FSSpecPath, 1}, + + {NULL, NULL} /* sentinel */ +}; + + +/* Initialization function for the module (*must* be called initmacfs) */ + +void +initmacfs() +{ + object *m, *d; + + /* Create the module and add the functions */ + m = initmodule("macfs", mfs_methods); + + /* Add some symbolic constants to the module */ + d = getmoduledict(m); + ErrorObject = newstringobject("macfs.error"); + dictinsert(d, "error", ErrorObject); + + /* XXXX Add constants here */ + + /* Check for errors */ + if (err_occurred()) + fatal("can't initialize module macfs"); +} |