mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
Initial revision
This commit is contained in:
parent
718581a522
commit
ce9739ba76
5 changed files with 720 additions and 0 deletions
246
Mac/Modules/macmodule.c
Normal file
246
Mac/Modules/macmodule.c
Normal file
|
@ -0,0 +1,246 @@
|
|||
/***********************************************************
|
||||
Copyright 1991, 1992, 1993, 1004 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.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
/* Macintosh OS module implementation */
|
||||
|
||||
#include "allobjects.h"
|
||||
|
||||
#include "import.h"
|
||||
#include "modsupport.h"
|
||||
|
||||
#include "::unixemu:dir.h"
|
||||
#include "::unixemu:stat.h"
|
||||
|
||||
static object *MacError; /* Exception */
|
||||
|
||||
|
||||
static object *
|
||||
mac_chdir(self, args)
|
||||
object *self;
|
||||
object *args;
|
||||
{
|
||||
char *path;
|
||||
if (!getstrarg(args, &path))
|
||||
return NULL;
|
||||
if (chdir(path) != 0)
|
||||
return err_errno(MacError);
|
||||
INCREF(None);
|
||||
return None;
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
mac_getcwd(self, args)
|
||||
object *self;
|
||||
object *args;
|
||||
{
|
||||
extern char *getwd();
|
||||
char buf[1025];
|
||||
if (!getnoarg(args))
|
||||
return NULL;
|
||||
strcpy(buf, "mac.getcwd() failed"); /* In case getwd() doesn't set a msg */
|
||||
if (getwd(buf) == NULL) {
|
||||
err_setstr(MacError, buf);
|
||||
return NULL;
|
||||
}
|
||||
return newstringobject(buf);
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
mac_listdir(self, args)
|
||||
object *self;
|
||||
object *args;
|
||||
{
|
||||
object *d, *v;
|
||||
char *name;
|
||||
DIR *dirp;
|
||||
struct direct *ep;
|
||||
if (!getstrarg(args, &name))
|
||||
return NULL;
|
||||
if ((dirp = opendir(name)) == NULL)
|
||||
return err_errno(MacError);
|
||||
if ((d = newlistobject(0)) == NULL) {
|
||||
closedir(dirp);
|
||||
return NULL;
|
||||
}
|
||||
while ((ep = readdir(dirp)) != NULL) {
|
||||
v = newstringobject(ep->d_name);
|
||||
if (v == NULL) {
|
||||
DECREF(d);
|
||||
d = NULL;
|
||||
break;
|
||||
}
|
||||
if (addlistitem(d, v) != 0) {
|
||||
DECREF(v);
|
||||
DECREF(d);
|
||||
d = NULL;
|
||||
break;
|
||||
}
|
||||
DECREF(v);
|
||||
}
|
||||
closedir(dirp);
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
mac_mkdir(self, args)
|
||||
object *self;
|
||||
object *args;
|
||||
{
|
||||
char *path;
|
||||
int mode;
|
||||
if (!getargs(args, "(si)", &path, &mode))
|
||||
return NULL;
|
||||
if (mkdir(path, mode) != 0)
|
||||
return err_errno(MacError);
|
||||
INCREF(None);
|
||||
return None;
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
mac_rename(self, args)
|
||||
object *self;
|
||||
object *args;
|
||||
{
|
||||
char *src, *dst;
|
||||
if (!getargs(args, "(ss)", &src, &dst))
|
||||
return NULL;
|
||||
if (rename(src, dst) != 0)
|
||||
return err_errno(MacError);
|
||||
INCREF(None);
|
||||
return None;
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
mac_rmdir(self, args)
|
||||
object *self;
|
||||
object *args;
|
||||
{
|
||||
char *path;
|
||||
if (!getstrarg(args, &path))
|
||||
return NULL;
|
||||
if (rmdir(path) != 0)
|
||||
return err_errno(MacError);
|
||||
INCREF(None);
|
||||
return None;
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
mac_stat(self, args)
|
||||
object *self;
|
||||
object *args;
|
||||
{
|
||||
struct stat st;
|
||||
char *path;
|
||||
object *v;
|
||||
if (!getstrarg(args, &path))
|
||||
return NULL;
|
||||
if (stat(path, &st) != 0)
|
||||
return err_errno(MacError);
|
||||
v = newtupleobject(11);
|
||||
if (v == NULL)
|
||||
return NULL;
|
||||
#define SET(i, val) settupleitem(v, i, newintobject((long)(val)))
|
||||
#define UNSET(i, val) SET(i, 0) /* For values my Mac stat doesn't support */
|
||||
SET(0, st.st_mode);
|
||||
UNSET(1, st.st_ino);
|
||||
UNSET(2, st.st_dev);
|
||||
UNSET(3, st.st_nlink);
|
||||
UNSET(4, st.st_uid);
|
||||
UNSET(5, st.st_gid);
|
||||
SET(6, st.st_size);
|
||||
UNSET(7, st.st_atime);
|
||||
SET(8, st.st_mtime);
|
||||
UNSET(9, st.st_ctime);
|
||||
SET(10, st.st_rsize); /* Mac-specific: resource size */
|
||||
/* XXX Check that unixemu:stat.c defines this! */
|
||||
#undef SET
|
||||
if (err_occurred()) {
|
||||
DECREF(v);
|
||||
return NULL;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
mac_sync(self, args)
|
||||
object *self;
|
||||
object *args;
|
||||
{
|
||||
if (!getnoarg(args))
|
||||
return NULL;
|
||||
sync();
|
||||
INCREF(None);
|
||||
return None;
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
mac_unlink(self, args)
|
||||
object *self;
|
||||
object *args;
|
||||
{
|
||||
char *path;
|
||||
if (!getstrarg(args, &path))
|
||||
return NULL;
|
||||
if (unlink(path) != 0)
|
||||
return err_errno(MacError);
|
||||
INCREF(None);
|
||||
return None;
|
||||
}
|
||||
|
||||
|
||||
static struct methodlist mac_methods[] = {
|
||||
{"chdir", mac_chdir},
|
||||
{"getcwd", mac_getcwd},
|
||||
{"listdir", mac_listdir},
|
||||
{"mkdir", mac_mkdir},
|
||||
{"rename", mac_rename},
|
||||
{"rmdir", mac_rmdir},
|
||||
{"stat", mac_stat},
|
||||
{"sync", mac_sync},
|
||||
{"unlink", mac_unlink},
|
||||
{NULL, NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
initmac()
|
||||
{
|
||||
object *m, *d;
|
||||
|
||||
m = initmodule("mac", mac_methods);
|
||||
d = getmoduledict(m);
|
||||
|
||||
/* Initialize mac.error exception */
|
||||
MacError = newstringobject("mac.error");
|
||||
if (MacError == NULL || dictinsert(d, "error", MacError) != 0)
|
||||
fatal("can't define mac.error");
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue