mirror of
https://github.com/python/cpython.git
synced 2025-11-03 03:22:27 +00:00
Initial version of FSSpec and Alias code. Non-functional as of now.
This commit is contained in:
parent
d50e4e1c54
commit
84fa5ecfff
3 changed files with 261 additions and 0 deletions
76
Mac/Compat/nfullpath.c
Normal file
76
Mac/Compat/nfullpath.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
1
Mac/Compat/nfullpath.h
Normal file
1
Mac/Compat/nfullpath.h
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
int nfullpath(FSSpec *, char *); /* Generate full path from fsspec */
|
||||||
184
Mac/Modules/macfsmodule.c
Normal file
184
Mac/Modules/macfsmodule.c
Normal file
|
|
@ -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");
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue