* Modules/xxmodule.c: integrated with xxobject.c by Jack
* Modules/(posix,socket}module.c: more NT changes
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 @@
******************************************************************/
-/* 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 @@
}
-/* 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 @@
static struct methodlist xx_methods[] = {
{"foo", xx_foo},
- {"bar", xx_bar},
+ {"new", xx_new},
{NULL, NULL} /* sentinel */
};
@@ -74,17 +195,15 @@
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())