]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Initial version of FSSpec and Alias code. Non-functional as of now.
authorJack Jansen <jack.jansen@cwi.nl>
Wed, 18 Jan 1995 14:04:40 +0000 (14:04 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Wed, 18 Jan 1995 14:04:40 +0000 (14:04 +0000)
Mac/Compat/nfullpath.c [new file with mode: 0644]
Mac/Compat/nfullpath.h [new file with mode: 0644]
Mac/Modules/macfsmodule.c [new file with mode: 0644]

diff --git a/Mac/Compat/nfullpath.c b/Mac/Compat/nfullpath.c
new file mode 100644 (file)
index 0000000..6e7e1b6
--- /dev/null
@@ -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 (file)
index 0000000..770777d
--- /dev/null
@@ -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 (file)
index 0000000..b0a3797
--- /dev/null
@@ -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");
+}