summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Mac/Compat/nfullpath.c76
-rw-r--r--Mac/Compat/nfullpath.h1
-rw-r--r--Mac/Modules/macfsmodule.c184
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");
+}