Initial version of FSSpec and Alias code. Non-functional as of now.
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");
+}