@@ -135,6 +135,28 @@ dbm_subscript(dbmobject *dp, register PyObject *key)
135135 return v ;
136136}
137137
138+ PyDoc_STRVAR (dbm_get__doc__ ,
139+ "get(key[, default]) -> value\n\
140+ Get the value for key, or default if not present; if not given,\n\
141+ default is None." );
142+
143+ static PyObject *
144+ dbm_get (dbmobject * dp , PyObject * args )
145+ {
146+ PyObject * v , * res ;
147+ PyObject * def = Py_None ;
148+
149+ if (!PyArg_UnpackTuple (args , "get" , 1 , 2 , & v , & def ))
150+ return NULL ;
151+ res = dbm_subscript (dp , v );
152+ if (res == NULL && PyErr_ExceptionMatches (PyExc_KeyError )) {
153+ PyErr_Clear ();
154+ Py_INCREF (def );
155+ return def ;
156+ }
157+ return res ;
158+ }
159+
138160static int
139161dbm_ass_sub (dbmobject * dp , PyObject * v , PyObject * w )
140162{
@@ -176,6 +198,29 @@ dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
176198 return 0 ;
177199}
178200
201+ PyDoc_STRVAR (dbm_setdefault__doc__ ,
202+ "setdefault(key[, default]) -> value\n\
203+ Get value for key, or set it to default and return default if not present;\n\
204+ if not given, default is None." );
205+
206+ static PyObject *
207+ dbm_setdefault (dbmobject * dp , PyObject * args )
208+ {
209+ PyObject * v , * res ;
210+ PyObject * def = Py_None ;
211+
212+ if (!PyArg_UnpackTuple (args , "setdefault" , 1 , 2 , & v , & def ))
213+ return NULL ;
214+ res = dbm_subscript (dp , v );
215+ if (res == NULL && PyErr_ExceptionMatches (PyExc_KeyError )) {
216+ PyErr_Clear ();
217+ if (dbm_ass_sub (dp , v , def ) < 0 )
218+ return NULL ;
219+ return dbm_subscript (dp , v );
220+ }
221+ return res ;
222+ }
223+
179224static PyMappingMethods dbm_as_mapping = {
180225 (lenfunc )dbm_length , /*mp_length*/
181226 (binaryfunc )dbm_subscript , /*mp_subscript*/
@@ -378,6 +423,8 @@ static PyMethodDef dbm_methods[] = {
378423 {"nextkey" , (PyCFunction )dbm_nextkey , METH_VARARGS , dbm_nextkey__doc__ },
379424 {"reorganize" ,(PyCFunction )dbm_reorganize ,METH_NOARGS , dbm_reorganize__doc__ },
380425 {"sync" , (PyCFunction )dbm_sync , METH_NOARGS , dbm_sync__doc__ },
426+ {"get" , (PyCFunction )dbm_get , METH_VARARGS , dbm_get__doc__ },
427+ {"setdefault" ,(PyCFunction )dbm_setdefault ,METH_VARARGS , dbm_setdefault__doc__ },
381428 {NULL , NULL } /* sentinel */
382429};
383430
0 commit comments