@@ -43,6 +43,20 @@ static PyTypeObject Dbmtype;
4343
4444static PyObject * DbmError ;
4545
46+ /*[clinic]
47+ module dbm
48+ class dbm.dbm
49+ [clinic]*/
50+ /*[clinic checksum: da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
51+
52+ /*[python]
53+ class dbmobject_converter(self_converter):
54+ type = "dbmobject *"
55+ def converter_init(self):
56+ self.name = 'dp'
57+ [python]*/
58+ /*[python checksum: da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
59+
4660static PyObject *
4761newdbmobject (const char * file , int flags , int mode )
4862{
@@ -248,27 +262,77 @@ static PySequenceMethods dbm_as_sequence = {
248262 0 , /* sq_inplace_repeat */
249263};
250264
265+ /*[clinic]
266+
267+ dbm.dbm.get
268+
269+ self: dbmobject
270+
271+ key: str(length=True)
272+ [
273+ default: object
274+ ]
275+ /
276+
277+ Return the value for key if present, otherwise default.
278+ [clinic]*/
279+
280+ PyDoc_STRVAR (dbm_dbm_get__doc__ ,
281+ "Return the value for key if present, otherwise default.\n"
282+ "\n"
283+ "dbm.dbm.get(key, [default])" );
284+
285+ #define DBM_DBM_GET_METHODDEF \
286+ {"get", (PyCFunction)dbm_dbm_get, METH_VARARGS, dbm_dbm_get__doc__},
287+
288+ static PyObject *
289+ dbm_dbm_get_impl (dbmobject * dp , const char * key , Py_ssize_clean_t key_length , int group_right_1 , PyObject * default_value );
290+
251291static PyObject *
252- dbm_get ( dbmobject * dp , PyObject * args )
292+ dbm_dbm_get ( PyObject * self , PyObject * args )
253293{
254- datum key , val ;
255- PyObject * defvalue = Py_None ;
256- char * tmp_ptr ;
257- Py_ssize_t tmp_size ;
294+ PyObject * return_value = NULL ;
295+ const char * key ;
296+ Py_ssize_clean_t key_length ;
297+ int group_right_1 = 0 ;
298+ PyObject * default_value = NULL ;
299+
300+ switch (PyTuple_Size (args )) {
301+ case 1 :
302+ if (!PyArg_ParseTuple (args , "s#:get" , & key , & key_length ))
303+ return NULL ;
304+ break ;
305+ case 2 :
306+ if (!PyArg_ParseTuple (args , "s#O:get" , & key , & key_length , & default_value ))
307+ return NULL ;
308+ group_right_1 = 1 ;
309+ break ;
310+ default :
311+ PyErr_SetString (PyExc_TypeError , "dbm.dbm.get requires 1 to 2 arguments" );
312+ return NULL ;
313+ }
314+ return_value = dbm_dbm_get_impl ((dbmobject * )self , key , key_length , group_right_1 , default_value );
258315
259- if (!PyArg_ParseTuple (args , "s#|O:get" ,
260- & tmp_ptr , & tmp_size , & defvalue ))
261- return NULL ;
262- key .dptr = tmp_ptr ;
263- key .dsize = tmp_size ;
316+ return return_value ;
317+ }
318+
319+ static PyObject *
320+ dbm_dbm_get_impl (dbmobject * dp , const char * key , Py_ssize_clean_t key_length , int group_right_1 , PyObject * default_value )
321+ /*[clinic checksum: 5b4265e66568f163ef0fc7efec09410eaf793508]*/
322+ {
323+ datum dbm_key , val ;
324+
325+ if (!group_right_1 )
326+ default_value = Py_None ;
327+ dbm_key .dptr = (char * )key ;
328+ dbm_key .dsize = key_length ;
264329 check_dbmobject_open (dp );
265- val = dbm_fetch (dp -> di_dbm , key );
330+ val = dbm_fetch (dp -> di_dbm , dbm_key );
266331 if (val .dptr != NULL )
267332 return PyBytes_FromStringAndSize (val .dptr , val .dsize );
268- else {
269- Py_INCREF (defvalue );
270- return defvalue ;
271- }
333+
334+ Py_INCREF (default_value );
335+ return default_value ;
272336}
273337
274338static PyObject *
@@ -333,9 +397,7 @@ static PyMethodDef dbm_methods[] = {
333397 "close()\nClose the database." },
334398 {"keys" , (PyCFunction )dbm_keys , METH_NOARGS ,
335399 "keys() -> list\nReturn a list of all keys in the database." },
336- {"get" , (PyCFunction )dbm_get , METH_VARARGS ,
337- "get(key[, default]) -> value\n"
338- "Return the value for key if present, otherwise default." },
400+ DBM_DBM_GET_METHODDEF
339401 {"setdefault" , (PyCFunction )dbm_setdefault , METH_VARARGS ,
340402 "setdefault(key[, default]) -> value\n"
341403 "Return the value for key if present, otherwise default. If key\n"
@@ -379,7 +441,6 @@ static PyTypeObject Dbmtype = {
379441/* ----------------------------------------------------------------- */
380442
381443/*[clinic]
382- module dbm
383444
384445dbm.open as dbmopen
385446
@@ -415,10 +476,10 @@ PyDoc_STRVAR(dbmopen__doc__,
415476 {"open", (PyCFunction)dbmopen, METH_VARARGS, dbmopen__doc__},
416477
417478static PyObject *
418- dbmopen_impl (PyObject * module , const char * filename , const char * flags , int mode );
479+ dbmopen_impl (PyModuleDef * module , const char * filename , const char * flags , int mode );
419480
420481static PyObject *
421- dbmopen (PyObject * module , PyObject * args )
482+ dbmopen (PyModuleDef * module , PyObject * args )
422483{
423484 PyObject * return_value = NULL ;
424485 const char * filename ;
@@ -436,8 +497,8 @@ dbmopen(PyObject *module, PyObject *args)
436497}
437498
438499static PyObject *
439- dbmopen_impl (PyObject * module , const char * filename , const char * flags , int mode )
440- /*[clinic checksum: 2b0ec9e3c6ecd19e06d16c9f0ba33848245cb1ab ]*/
500+ dbmopen_impl (PyModuleDef * module , const char * filename , const char * flags , int mode )
501+ /*[clinic checksum: c1f2036017ec36a43ac6f59893732751e67c19d5 ]*/
441502{
442503 int iflags ;
443504
0 commit comments