[Python-checkins] CVS: python/dist/src/Modules gdbmmodule.c,2.24,2.25

Fred L. Drake python-dev@python.org
Fri, 7 Jul 2000 22:00:10 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory slayer.i.sourceforge.net:/tmp/cvs-serv7465

Modified Files:
	gdbmmodule.c 
Log Message:

ANSI-fy the sources.
Convert to using PyArg_ParseTuple() as appropriate to allow method names
in error messages.
Re-indent to four-space indentation.


Index: gdbmmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/gdbmmodule.c,v
retrieving revision 2.24
retrieving revision 2.25
diff -C2 -r2.24 -r2.25
*** gdbmmodule.c	2000/06/30 23:58:05	2.24
--- gdbmmodule.c	2000/07/08 05:00:07	2.25
***************
*** 39,45 ****
  
  typedef struct {
! 	PyObject_HEAD
! 	int di_size;	/* -1 means recompute */
! 	GDBM_FILE di_dbm;
  } dbmobject;
  
--- 39,45 ----
  
  typedef struct {
!     PyObject_HEAD
!     int di_size;	/* -1 means recompute */
!     GDBM_FILE di_dbm;
  } dbmobject;
  
***************
*** 48,53 ****
  #define is_dbmobject(v) ((v)->ob_type == &Dbmtype)
  #define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \
!                { PyErr_SetString(DbmError, "GDBM object has already been closed"); \
!                  return NULL; }
  
  
--- 48,53 ----
  #define is_dbmobject(v) ((v)->ob_type == &Dbmtype)
  #define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \
!     { PyErr_SetString(DbmError, "GDBM object has already been closed"); \
!       return NULL; }
  
  
***************
*** 66,90 ****
  
  static PyObject *
! newdbmobject(file, flags, mode)
! 	char *file;
! int flags;
! int mode;
! {
!         dbmobject *dp;
! 
! 	dp = PyObject_New(dbmobject, &Dbmtype);
! 	if (dp == NULL)
! 		return NULL;
! 	dp->di_size = -1;
! 	errno = 0;
! 	if ( (dp->di_dbm = gdbm_open(file, 0, flags, mode, NULL)) == 0 ) {
! 		if (errno != 0)
! 			PyErr_SetFromErrno(DbmError);
! 		else
! 			PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
! 		Py_DECREF(dp);
! 		return NULL;
! 	}
! 	return (PyObject *)dp;
  }
  
--- 66,87 ----
  
  static PyObject *
! newdbmobject(char *file, int flags, int mode)
! {
!     dbmobject *dp;
! 
!     dp = PyObject_New(dbmobject, &Dbmtype);
!     if (dp == NULL)
!         return NULL;
!     dp->di_size = -1;
!     errno = 0;
!     if ((dp->di_dbm = gdbm_open(file, 0, flags, mode, NULL)) == 0) {
!         if (errno != 0)
!             PyErr_SetFromErrno(DbmError);
!         else
!             PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
!         Py_DECREF(dp);
!         return NULL;
!     }
!     return (PyObject *)dp;
  }
  
***************
*** 92,202 ****
  
  static void
! dbm_dealloc(dp)
! 	register dbmobject *dp;
  {
!         if ( dp->di_dbm )
! 		gdbm_close(dp->di_dbm);
! 	PyObject_Del(dp);
  }
  
  static int
! dbm_length(dp)
! 	dbmobject *dp;
  {
!         if (dp->di_dbm == NULL) {
!                  PyErr_SetString(DbmError, "GDBM object has already been closed"); 
!                  return -1; 
          }
!         if ( dp->di_size < 0 ) {
! 		datum key,okey;
! 		int size;
! 		okey.dsize=0;
! 
! 		size = 0;
! 		for ( key=gdbm_firstkey(dp->di_dbm); key.dptr;
! 		      key = gdbm_nextkey(dp->di_dbm,okey)) {
! 			size++;
! 			if(okey.dsize) free(okey.dptr);
! 			okey=key;
! 		}
! 		dp->di_size = size;
! 	}
! 	return dp->di_size;
  }
  
  static PyObject *
! dbm_subscript(dp, key)
! 	dbmobject *dp;
! register PyObject *key;
! {
! 	PyObject *v;
! 	datum drec, krec;
! 	
! 	if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) )
! 		return NULL;
! 
! 	if (dp->di_dbm == NULL) {
! 		PyErr_SetString(DbmError,
! 				"GDBM object has already been closed");
! 		return NULL;
! 	}
! 	drec = gdbm_fetch(dp->di_dbm, krec);
! 	if ( drec.dptr == 0 ) {
! 		PyErr_SetString(PyExc_KeyError,
! 				PyString_AS_STRING((PyStringObject *)key));
! 		return NULL;
! 	}
! 	v = PyString_FromStringAndSize(drec.dptr, drec.dsize);
! 	free(drec.dptr);
! 	return v;
  }
  
  static int
! dbm_ass_sub(dp, v, w)
! 	dbmobject *dp;
! PyObject *v, *w;
! {
!         datum krec, drec;
! 	
!         if ( !PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) {
! 		PyErr_SetString(PyExc_TypeError,
! 				"gdbm mappings have string indices only");
! 		return -1;
! 	}
!         if (dp->di_dbm == NULL) {
!                  PyErr_SetString(DbmError,
!                                  "GDBM object has already been closed"); 
!                  return -1; 
          }
! 	dp->di_size = -1;
! 	if (w == NULL) {
! 		if ( gdbm_delete(dp->di_dbm, krec) < 0 ) {
! 			PyErr_SetString(PyExc_KeyError,
! 				      PyString_AS_STRING((PyStringObject *)v));
! 			return -1;
! 		}
! 	} else {
! 		if ( !PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize) ) {
! 			PyErr_SetString(PyExc_TypeError,
! 				    "gdbm mappings have string elements only");
! 			return -1;
! 		}
! 		errno = 0;
! 		if ( gdbm_store(dp->di_dbm, krec, drec, GDBM_REPLACE) < 0 ) {
! 			if (errno != 0)
! 				PyErr_SetFromErrno(DbmError);
! 			else
! 				PyErr_SetString(DbmError,
! 						gdbm_strerror(gdbm_errno));
! 			return -1;
! 		}
! 	}
! 	return 0;
  }
  
  static PyMappingMethods dbm_as_mapping = {
! 	(inquiry)dbm_length,		/*mp_length*/
! 	(binaryfunc)dbm_subscript,	/*mp_subscript*/
! 	(objobjargproc)dbm_ass_sub,	/*mp_ass_subscript*/
  };
  
--- 89,194 ----
  
  static void
! dbm_dealloc(register dbmobject *dp)
  {
!     if (dp->di_dbm)
!         gdbm_close(dp->di_dbm);
!     PyObject_Del(dp);
  }
  
  static int
! dbm_length(dbmobject *dp)
  {
!     if (dp->di_dbm == NULL) {
!         PyErr_SetString(DbmError, "GDBM object has already been closed"); 
!         return -1; 
!     }
!     if (dp->di_size < 0) {
!         datum key,okey;
!         int size;
!         okey.dsize=0;
! 
!         size = 0;
!         for (key=gdbm_firstkey(dp->di_dbm); key.dptr;
!              key = gdbm_nextkey(dp->di_dbm,okey)) {
!             size++;
!             if(okey.dsize) free(okey.dptr);
!             okey=key;
          }
!         dp->di_size = size;
!     }
!     return dp->di_size;
  }
  
  static PyObject *
! dbm_subscript(dbmobject *dp, register PyObject *key)
! {
!     PyObject *v;
!     datum drec, krec;
! 
!     if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) )
!         return NULL;
! 
!     if (dp->di_dbm == NULL) {
!         PyErr_SetString(DbmError,
!                         "GDBM object has already been closed");
!         return NULL;
!     }
!     drec = gdbm_fetch(dp->di_dbm, krec);
!     if (drec.dptr == 0) {
!         PyErr_SetString(PyExc_KeyError,
!                         PyString_AS_STRING((PyStringObject *)key));
!         return NULL;
!     }
!     v = PyString_FromStringAndSize(drec.dptr, drec.dsize);
!     free(drec.dptr);
!     return v;
  }
  
  static int
! dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
! {
!     datum krec, drec;
! 
!     if (!PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) {
!         PyErr_SetString(PyExc_TypeError,
!                         "gdbm mappings have string indices only");
!         return -1;
!     }
!     if (dp->di_dbm == NULL) {
!         PyErr_SetString(DbmError,
!                         "GDBM object has already been closed"); 
!         return -1; 
!     }
!     dp->di_size = -1;
!     if (w == NULL) {
!         if (gdbm_delete(dp->di_dbm, krec) < 0) {
!             PyErr_SetString(PyExc_KeyError,
!                             PyString_AS_STRING((PyStringObject *)v));
!             return -1;
!         }
!     }
!     else {
!         if (!PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize)) {
!             PyErr_SetString(PyExc_TypeError,
!                             "gdbm mappings have string elements only");
!             return -1;
          }
!         errno = 0;
!         if (gdbm_store(dp->di_dbm, krec, drec, GDBM_REPLACE) < 0) {
!             if (errno != 0)
!                 PyErr_SetFromErrno(DbmError);
!             else
!                 PyErr_SetString(DbmError,
!                                 gdbm_strerror(gdbm_errno));
!             return -1;
!         }
!     }
!     return 0;
  }
  
  static PyMappingMethods dbm_as_mapping = {
!     (inquiry)dbm_length,		/*mp_length*/
!     (binaryfunc)dbm_subscript,          /*mp_subscript*/
!     (objobjargproc)dbm_ass_sub,         /*mp_ass_subscript*/
  };
  
***************
*** 206,220 ****
  
  static PyObject *
! dbm_close(dp, args)
! 	register dbmobject *dp;
! PyObject *args;
! {
! 	if ( !PyArg_NoArgs(args) )
! 		return NULL;
!         if ( dp->di_dbm )
! 		gdbm_close(dp->di_dbm);
! 	dp->di_dbm = NULL;
! 	Py_INCREF(Py_None);
! 	return Py_None;
  }
  
--- 198,210 ----
  
  static PyObject *
! dbm_close(register dbmobject *dp, PyObject *args)
! {
!     if (!PyArg_ParseTuple(args, ":close"))
!         return NULL;
!     if (dp->di_dbm)
!         gdbm_close(dp->di_dbm);
!     dp->di_dbm = NULL;
!     Py_INCREF(Py_None);
!     return Py_None;
  }
  
***************
*** 224,270 ****
  
  static PyObject *
! dbm_keys(dp, args)
! 	register dbmobject *dp;
! PyObject *args;
! {
! 	register PyObject *v, *item;
! 	datum key, nextkey;
! 	int err;
! 
! 	if (dp == NULL || !is_dbmobject(dp)) {
! 		PyErr_BadInternalCall();
! 		return NULL;
! 	}
! 
! 	if (!PyArg_NoArgs(args))
! 		return NULL;
! 
! 	check_dbmobject_open(dp);
! 
! 	v = PyList_New(0);
! 	if (v == NULL)
! 		return NULL;
! 
! 	key = gdbm_firstkey(dp->di_dbm);
! 	while (key.dptr) {
! 		item = PyString_FromStringAndSize(key.dptr, key.dsize);
! 		if (item == NULL) {
! 			free(key.dptr);
! 			Py_DECREF(v);
! 			return NULL;
! 		}
! 		err = PyList_Append(v, item);
! 		Py_DECREF(item);
! 		if (err != 0) {
! 			free(key.dptr);
! 			Py_DECREF(v);
! 			return NULL;
! 		}
! 		nextkey = gdbm_nextkey(dp->di_dbm, key);
! 		free(key.dptr);
! 		key = nextkey;
! 	}
! 
! 	return v;
  }
  
--- 214,256 ----
  
  static PyObject *
! dbm_keys(register dbmobject *dp, PyObject *args)
! {
!     register PyObject *v, *item;
!     datum key, nextkey;
!     int err;
! 
!     if (dp == NULL || !is_dbmobject(dp)) {
!         PyErr_BadInternalCall();
!         return NULL;
!     }
!     if (!PyArg_ParseTuple(args, ":keys"))
!         return NULL;
! 
!     check_dbmobject_open(dp);
! 
!     v = PyList_New(0);
!     if (v == NULL)
!         return NULL;
! 
!     key = gdbm_firstkey(dp->di_dbm);
!     while (key.dptr) {
!         item = PyString_FromStringAndSize(key.dptr, key.dsize);
!         if (item == NULL) {
!             free(key.dptr);
!             Py_DECREF(v);
!             return NULL;
!         }
!         err = PyList_Append(v, item);
!         Py_DECREF(item);
!         if (err != 0) {
!             free(key.dptr);
!             Py_DECREF(v);
!             return NULL;
!         }
!         nextkey = gdbm_nextkey(dp->di_dbm, key);
!         free(key.dptr);
!         key = nextkey;
!     }
!     return v;
  }
  
***************
*** 274,287 ****
  
  static PyObject *
! dbm_has_key(dp, args)
! 	register dbmobject *dp;
! PyObject *args;
! {
! 	datum key;
! 	
! 	if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize))
! 		return NULL;
! 	check_dbmobject_open(dp);
! 	return PyInt_FromLong((long) gdbm_exists(dp->di_dbm, key));
  }
  
--- 260,271 ----
  
  static PyObject *
! dbm_has_key(register dbmobject *dp, PyObject *args)
! {
!     datum key;
! 
!     if (!PyArg_ParseTuple(args, "s#:has_key", &key.dptr, &key.dsize))
!         return NULL;
!     check_dbmobject_open(dp);
!     return PyInt_FromLong((long) gdbm_exists(dp->di_dbm, key));
  }
  
***************
*** 294,316 ****
  
  static PyObject *
! dbm_firstkey(dp, args)
! 	register dbmobject *dp;
! PyObject *args;
! {
! 	register PyObject *v;
! 	datum key;
! 
! 	if (!PyArg_NoArgs(args))
! 		return NULL;
! 	check_dbmobject_open(dp);
! 	key = gdbm_firstkey(dp->di_dbm);
! 	if (key.dptr) {
! 		v = PyString_FromStringAndSize(key.dptr, key.dsize);
! 		free(key.dptr);
! 		return v;
! 	} else {
! 		Py_INCREF(Py_None);
! 		return Py_None;
! 	}
  }
  
--- 278,299 ----
  
  static PyObject *
! dbm_firstkey(register dbmobject *dp, PyObject *args)
! {
!     register PyObject *v;
!     datum key;
! 
!     if (!PyArg_ParseTuple(args, ":firstkey"))
!         return NULL;
!     check_dbmobject_open(dp);
!     key = gdbm_firstkey(dp->di_dbm);
!     if (key.dptr) {
!         v = PyString_FromStringAndSize(key.dptr, key.dsize);
!         free(key.dptr);
!         return v;
!     }
!     else {
!         Py_INCREF(Py_None);
!         return Py_None;
!     }
  }
  
***************
*** 327,349 ****
  
  static PyObject *
! dbm_nextkey(dp, args)
! 	register dbmobject *dp;
! PyObject *args;
! {
! 	register PyObject *v;
! 	datum key, nextkey;
! 
! 	if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize))
! 		return NULL;
! 	check_dbmobject_open(dp);
! 	nextkey = gdbm_nextkey(dp->di_dbm, key);
! 	if (nextkey.dptr) {
! 		v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize);
! 		free(nextkey.dptr);
! 		return v;
! 	} else {
! 		Py_INCREF(Py_None);
! 		return Py_None;
! 	}
  }
  
--- 310,331 ----
  
  static PyObject *
! dbm_nextkey(register dbmobject *dp, PyObject *args)
! {
!     register PyObject *v;
!     datum key, nextkey;
! 
!     if (!PyArg_ParseTuple(args, "s#:nextkey", &key.dptr, &key.dsize))
!         return NULL;
!     check_dbmobject_open(dp);
!     nextkey = gdbm_nextkey(dp->di_dbm, key);
!     if (nextkey.dptr) {
!         v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize);
!         free(nextkey.dptr);
!         return v;
!     }
!     else {
!         Py_INCREF(Py_None);
!         return Py_None;
!     }
  }
  
***************
*** 357,377 ****
  
  static PyObject *
! dbm_reorganize(dp, args)
! 	register dbmobject *dp;
! PyObject *args;
! {
! 	if (!PyArg_NoArgs(args))
! 		return NULL;
! 	check_dbmobject_open(dp);
! 	errno = 0;
! 	if (gdbm_reorganize(dp->di_dbm) < 0) {
! 		if (errno != 0)
! 			PyErr_SetFromErrno(DbmError);
! 		else
! 			PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
! 		return NULL;
! 	}
! 	Py_INCREF(Py_None);
! 	return Py_None;
  }
  
--- 339,357 ----
  
  static PyObject *
! dbm_reorganize(register dbmobject *dp, PyObject *args)
! {
!     if (!PyArg_ParseTuple(args, ":reorganize"))
!         return NULL;
!     check_dbmobject_open(dp);
!     errno = 0;
!     if (gdbm_reorganize(dp->di_dbm) < 0) {
!         if (errno != 0)
!             PyErr_SetFromErrno(DbmError);
!         else
!             PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
!         return NULL;
!     }
!     Py_INCREF(Py_None);
!     return Py_None;
  }
  
***************
*** 382,439 ****
  
  static PyObject *
! dbm_sync(dp, args)
! 	register dbmobject *dp;
!                 PyObject *args;
! {
! 	if (!PyArg_NoArgs(args))
! 		return NULL;
! 	check_dbmobject_open(dp);
! 	gdbm_sync(dp->di_dbm);
! 	Py_INCREF(Py_None);
! 	return Py_None;
  }
  
  static PyMethodDef dbm_methods[] = {
! 	{"close",	(PyCFunction)dbm_close, 0, dbm_close__doc__},
! 	{"keys",	(PyCFunction)dbm_keys, 0, dbm_keys__doc__},
! 	{"has_key",	(PyCFunction)dbm_has_key, 0, dbm_has_key__doc__},
! 	{"firstkey",	(PyCFunction)dbm_firstkey, 0, dbm_firstkey__doc__},
! 	{"nextkey",	(PyCFunction)dbm_nextkey, 0, dbm_nextkey__doc__},
! 	{"reorganize",	(PyCFunction)dbm_reorganize, 0, dbm_reorganize__doc__},
! 	{"sync",                    (PyCFunction)dbm_sync, 0, dbm_sync__doc__},
! 	{NULL,		NULL}		/* sentinel */
  };
  
  static PyObject *
! dbm_getattr(dp, name)
! 	dbmobject *dp;
! char *name;
  {
! 	return Py_FindMethod(dbm_methods, (PyObject *)dp, name);
  }
  
  static PyTypeObject Dbmtype = {
! 	PyObject_HEAD_INIT(0)
! 	0,
! 	"gdbm",
! 	sizeof(dbmobject),
! 	0,
! 	(destructor)dbm_dealloc,   /*tp_dealloc*/
! 	0,			   /*tp_print*/
! 	(getattrfunc)dbm_getattr,  /*tp_getattr*/
! 	0,			   /*tp_setattr*/
! 	0,			   /*tp_compare*/
! 	0,			   /*tp_repr*/
! 	0,			   /*tp_as_number*/
! 	0,			   /*tp_as_sequence*/
! 	&dbm_as_mapping,	   /*tp_as_mapping*/
!         0,                         /*tp_hash*/
!         0,                         /*tp_call*/
!         0,                         /*tp_str*/
!         0,                         /*tp_getattro*/
!         0,                         /*tp_setattro*/
!         0,                         /*tp_as_buffer*/
!         0,                         /*tp_xxx4*/
!         gdbm_object__doc__,        /*tp_doc*/
  };
  
--- 362,415 ----
  
  static PyObject *
! dbm_sync(register dbmobject *dp, PyObject *args)
! {
!     if (!PyArg_ParseTuple(args, ":sync"))
!         return NULL;
!     check_dbmobject_open(dp);
!     gdbm_sync(dp->di_dbm);
!     Py_INCREF(Py_None);
!     return Py_None;
  }
  
  static PyMethodDef dbm_methods[] = {
!     {"close",	  (PyCFunction)dbm_close,   METH_VARARGS, dbm_close__doc__},
!     {"keys",	  (PyCFunction)dbm_keys,    METH_VARARGS, dbm_keys__doc__},
!     {"has_key",   (PyCFunction)dbm_has_key, METH_VARARGS, dbm_has_key__doc__},
!     {"firstkey",  (PyCFunction)dbm_firstkey,METH_VARARGS, dbm_firstkey__doc__},
!     {"nextkey",	  (PyCFunction)dbm_nextkey, METH_VARARGS, dbm_nextkey__doc__},
!     {"reorganize",(PyCFunction)dbm_reorganize,METH_VARARGS, dbm_reorganize__doc__},
!     {"sync",      (PyCFunction)dbm_sync,    METH_VARARGS, dbm_sync__doc__},
!     {NULL,		NULL}		/* sentinel */
  };
  
  static PyObject *
! dbm_getattr(dbmobject *dp, char *name)
  {
!     return Py_FindMethod(dbm_methods, (PyObject *)dp, name);
  }
  
  static PyTypeObject Dbmtype = {
!     PyObject_HEAD_INIT(0)
!     0,
!     "gdbm",
!     sizeof(dbmobject),
!     0,
!     (destructor)dbm_dealloc,            /*tp_dealloc*/
!     0,                                  /*tp_print*/
!     (getattrfunc)dbm_getattr,           /*tp_getattr*/
!     0,                                  /*tp_setattr*/
!     0,                                  /*tp_compare*/
!     0,                                  /*tp_repr*/
!     0,                                  /*tp_as_number*/
!     0,                                  /*tp_as_sequence*/
!     &dbm_as_mapping,                    /*tp_as_mapping*/
!     0,                                  /*tp_hash*/
!     0,                                  /*tp_call*/
!     0,                                  /*tp_str*/
!     0,                                  /*tp_getattro*/
!     0,                                  /*tp_setattro*/
!     0,                                  /*tp_as_buffer*/
!     0,                                  /*tp_xxx4*/
!     gdbm_object__doc__,                 /*tp_doc*/
  };
  
***************
*** 461,514 ****
  
  static PyObject *
! dbmopen(self, args)
! 	PyObject *self;
! PyObject *args;
! {
! 	char *name;
! 	char *flags = "r ";
! 	int iflags;
! 	int mode = 0666;
! 
! 	if ( !PyArg_ParseTuple(args, "s|si:open", &name, &flags, &mode) )
! 		return NULL;
! 	switch (flags[0]) {
! 	case 'r':
! 		iflags = GDBM_READER;
! 		break;
! 	case 'w':
! 		iflags = GDBM_WRITER;
! 		break;
! 	case 'c':
! 		iflags = GDBM_WRCREAT;
! 		break;
! 	case 'n':
! 		iflags = GDBM_NEWDB;
! 		break;
! 	default:
! 		PyErr_SetString(DbmError,
! 				"Flags should be one of 'r', 'w', 'c' or 'n'");
! 		return NULL;
! 	}
! 	if (flags[1] == 'f')
! 		iflags |= GDBM_FAST;
! 	return newdbmobject(name, iflags, mode);
  }
  
  static PyMethodDef dbmmodule_methods[] = {
! 	{ "open", (PyCFunction)dbmopen, 1, dbmopen__doc__},
! 	{ 0, 0 },
  };
  
  DL_EXPORT(void)
  initgdbm() {
! 	PyObject *m, *d;
  
! 	Dbmtype.ob_type = &PyType_Type;
! 	m = Py_InitModule4("gdbm", dbmmodule_methods,
!                            gdbmmodule__doc__, (PyObject *)NULL,
! 			   PYTHON_API_VERSION);
! 	d = PyModule_GetDict(m);
! 	DbmError = PyErr_NewException("gdbm.error", NULL, NULL);
! 	if (DbmError != NULL)
! 		PyDict_SetItemString(d, "error", DbmError);
  }
--- 437,488 ----
  
  static PyObject *
! dbmopen(PyObject *self, PyObject *args)
! {
!     char *name;
!     char *flags = "r ";
!     int iflags;
!     int mode = 0666;
! 
!     if (!PyArg_ParseTuple(args, "s|si:open", &name, &flags, &mode))
!         return NULL;
!     switch (flags[0]) {
!     case 'r':
!         iflags = GDBM_READER;
!         break;
!     case 'w':
!         iflags = GDBM_WRITER;
!         break;
!     case 'c':
!         iflags = GDBM_WRCREAT;
!         break;
!     case 'n':
!         iflags = GDBM_NEWDB;
!         break;
!     default:
!         PyErr_SetString(DbmError,
!                         "Flags should be one of 'r', 'w', 'c' or 'n'");
!         return NULL;
!     }
!     if (flags[1] == 'f')
!         iflags |= GDBM_FAST;
!     return newdbmobject(name, iflags, mode);
  }
  
  static PyMethodDef dbmmodule_methods[] = {
!     { "open", (PyCFunction)dbmopen, METH_VARARGS, dbmopen__doc__},
!     { 0, 0 },
  };
  
  DL_EXPORT(void)
  initgdbm() {
!     PyObject *m, *d;
  
!     Dbmtype.ob_type = &PyType_Type;
!     m = Py_InitModule4("gdbm", dbmmodule_methods,
!                        gdbmmodule__doc__, (PyObject *)NULL,
!                        PYTHON_API_VERSION);
!     d = PyModule_GetDict(m);
!     DbmError = PyErr_NewException("gdbm.error", NULL, NULL);
!     if (DbmError != NULL)
!         PyDict_SetItemString(d, "error", DbmError);
  }