diff options
-rw-r--r-- | Modules/posixmodule.c | 25 | ||||
-rw-r--r-- | Modules/socketmodule.c | 12 | ||||
-rw-r--r-- | Modules/xxmodule.c | 145 |
3 files changed, 169 insertions, 13 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 7ffcd66..59e27a7 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -76,6 +76,11 @@ extern int symlink(); #include <utime.h> #endif /* HAVE_UTIME_H */ +#ifdef HAVE_SYS_UTIME_H +#include <sys/utime.h> +#define HAVE_UTIME_H /* pretend we do for the rest of this file */ +#endif /* HAVE_SYS_UTIME_H */ + #ifdef HAVE_SYS_TIMES_H #include <sys/times.h> #endif /* HAVE_SYS_TIMES_H */ @@ -1010,6 +1015,26 @@ posix_times(self, args) (double)t.tms_cstime / HZ); } #endif /* HAVE_TIMES */ +#ifdef NT +#define HAVE_TIMES /* so the method table will pick it up */ +static object * +posix_times(self, args) + object *self; + object *args; +{ + FILETIME create, exit, kernel, user; + HANDLE hProc; + if (!getnoarg(args)) + return NULL; + hProc = GetCurrentProcess(); + GetProcessTimes(hProc,&create, &exit, &kernel, &user); + return mkvalue("dddd", + (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6, + (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6, + (double)0, + (double)0); +} +#endif /* NT */ #ifdef HAVE_SETSID static object * diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 6f50fc3..82250ee 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -153,6 +153,18 @@ static object *SocketError; static object * socket_error() { +#ifdef NT + if (WSAGetLastError()) { + object *v; + v = mkvalue("(is)", WSAGetLastError(), "winsock error"); + if (v != NULL) { + err_setval(SocketError, v); + DECREF(v); + } + return NULL; + } + else +#endif return err_errno(SocketError); } diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c index 4e81810..52f4895 100644 --- a/Modules/xxmodule.c +++ b/Modules/xxmodule.c @@ -22,11 +22,129 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ -/* xx module */ +/* Use this file as a template to start implementing a module that + also declares objects types. All occurrences of 'xxo' should be changed + to something reasonable for your objects. After that, all other + occurrences of 'xx' should be changed to something reasonable for your + module. If your module is named foo your sourcefile should be named + foomodule.c. + + You will probably want to delete all references to 'x_attr' and add + your own types of attributes instead. Maybe you want to name your + local variables other than 'self'. If your object type is needed in + other files, you'll have to create a file "foobarobject.h"; see + intobject.h for an example. */ + +/* Xxo objects */ #include "allobjects.h" -#include "modsupport.h" +#include "modsupport.h" /* For getargs() etc. */ +static object *ErrorObject; + +typedef struct { + OB_HEAD + object *x_attr; /* Attributes dictionary */ +} xxoobject; + +staticforward typeobject Xxotype; + +#define is_xxoobject(v) ((v)->ob_type == &Xxotype) + +static xxoobject * +newxxoobject(arg) + object *arg; +{ + xxoobject *self; + self = NEWOBJ(xxoobject, &Xxotype); + if (self == NULL) + return NULL; + self->x_attr = NULL; + return self; +} + +/* Xxo methods */ + +static void +xxo_dealloc(self) + xxoobject *self; +{ + XDECREF(self->x_attr); + DEL(self); +} + +static object * +xxo_demo(self, args) + xxoobject *self; + object *args; +{ + if (!getnoarg(args)) + return NULL; + INCREF(None); + return None; +} + +static struct methodlist xxo_methods[] = { + {"demo", (method)xxo_demo}, + {NULL, NULL} /* sentinel */ +}; + +static object * +xxo_getattr(self, name) + xxoobject *self; + char *name; +{ + if (self->x_attr != NULL) { + object *v = dictlookup(self->x_attr, name); + if (v != NULL) { + INCREF(v); + return v; + } + } + return findmethod(xxo_methods, (object *)self, name); +} + +static int +xxo_setattr(self, name, v) + xxoobject *self; + char *name; + object *v; +{ + if (self->x_attr == NULL) { + self->x_attr = newdictobject(); + if (self->x_attr == NULL) + return -1; + } + if (v == NULL) { + int rv = dictremove(self->x_attr, name); + if (rv < 0) + err_setstr(AttributeError, + "delete non-existing xxo attribute"); + return rv; + } + else + return dictinsert(self->x_attr, name, v); +} + +static typeobject Xxotype = { + OB_HEAD_INIT(&Typetype) + 0, /*ob_size*/ + "xxo", /*tp_name*/ + sizeof(xxoobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)xxo_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + (getattrfunc)xxo_getattr, /*tp_getattr*/ + (setattrfunc)xxo_setattr, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ +}; +/* --------------------------------------------------------------------- */ /* Function of two integers returning integer */ @@ -44,19 +162,22 @@ xx_foo(self, args) } -/* Function of no arguments returning None */ +/* Function of no arguments returning new xxo object */ static object * -xx_bar(self, args) +xx_new(self, args) object *self; /* Not used */ object *args; { int i, j; + xxoobject *rv; + if (!getnoarg(args)) return NULL; - /* XXX Do something here */ - INCREF(None); - return None; + rv = newxxoobject(args); + if ( rv == NULL ) + return NULL; + return (object *)rv; } @@ -64,7 +185,7 @@ xx_bar(self, args) static struct methodlist xx_methods[] = { {"foo", xx_foo}, - {"bar", xx_bar}, + {"new", xx_new}, {NULL, NULL} /* sentinel */ }; @@ -74,17 +195,15 @@ static struct methodlist xx_methods[] = { void initxx() { - object *m, *d, *x; + object *m, *d; /* Create the module and add the functions */ m = initmodule("xx", xx_methods); /* Add some symbolic constants to the module */ d = getmoduledict(m); - x = newstringobject("xx.error"); - dictinsert(d, "error", x); - x = newintobject(42L); - dictinsert(d, "magic", x); + ErrorObject = newstringobject("xx.error"); + dictinsert(d, "error", ErrorObject); /* Check for errors */ if (err_occurred()) |