50
50
51
51
#include " pydbtoc.h"
52
52
#include " pysilo.h"
53
+ #include < stdlib.h>
54
+ #include < string.h>
53
55
54
56
// ****************************************************************************
55
57
// Method: DBtoc_dealloc
@@ -240,8 +242,14 @@ GET_FUNC_DEFS(mrgvar);
240
242
GET_FUNC_DEFS (groupelmap);
241
243
GET_FUNC_DEFS (obj);
242
244
243
- #define GET_FUNC_N (nm ) if (!strcmp(name, " n" #nm)) return DBtoc_GetN ## nm(self, NULL );
244
- #define GET_FUNC_NAMES (nm ) if (!strcmp(name, #nm " _names" )) return DBtoc_Get ## nm ## names(self, NULL );
245
+ #define HANDLE_ENTRY (nm ) \
246
+ if (!strcmp(name, " n" #nm)) return DBtoc_GetN ## nm(self, NULL ); \
247
+ else if (!strcmp(name, #nm " _names" )) return DBtoc_Get ## nm ## names(self, NULL ); \
248
+ else if (!strcmp(name, " __dict__" )) \
249
+ { \
250
+ PyDict_SetItem (__dict__result, PyString_FromString (" n" #nm), DBtoc_GetN ## nm (self, NULL )); \
251
+ PyDict_SetItem (__dict__result, PyString_FromString (#nm " _names" ), DBtoc_Get ## nm ## names (self, NULL )); \
252
+ }
245
253
246
254
// ****************************************************************************
247
255
// Method: DBtoc_getattr
@@ -261,57 +269,54 @@ GET_FUNC_DEFS(obj);
261
269
// ****************************************************************************
262
270
static PyObject *DBtoc_getattr (PyObject *self, char *name)
263
271
{
264
- GET_FUNC_N (var);
265
- GET_FUNC_N (dir);
266
- GET_FUNC_N (curve);
267
- GET_FUNC_N (multimesh);
268
- GET_FUNC_N (multivar);
269
- GET_FUNC_N (multimat);
270
- GET_FUNC_N (multimatspecies);
271
- GET_FUNC_N (csgmesh);
272
- GET_FUNC_N (csgvar);
273
- GET_FUNC_N (defvars);
274
- GET_FUNC_N (qmesh);
275
- GET_FUNC_N (qvar);
276
- GET_FUNC_N (ucdmesh);
277
- GET_FUNC_N (ucdvar);
278
- GET_FUNC_N (ptmesh);
279
- GET_FUNC_N (ptvar);
280
- GET_FUNC_N (mat);
281
- GET_FUNC_N (matspecies);
282
- GET_FUNC_N (array);
283
- GET_FUNC_N (mrgtree);
284
- GET_FUNC_N (mrgvar);
285
- GET_FUNC_N (groupelmap);
286
- GET_FUNC_N (obj);
272
+ PyObject *__dict__result = strcmp (name, " __dict__" ) ? 0 : PyDict_New ();
273
+
274
+ HANDLE_ENTRY (var);
275
+ HANDLE_ENTRY (dir);
276
+ HANDLE_ENTRY (curve);
277
+ HANDLE_ENTRY (multimesh);
278
+ HANDLE_ENTRY (multivar);
279
+ HANDLE_ENTRY (multimat);
280
+ HANDLE_ENTRY (multimatspecies);
281
+ HANDLE_ENTRY (csgmesh);
282
+ HANDLE_ENTRY (csgvar);
283
+ HANDLE_ENTRY (defvars);
284
+ HANDLE_ENTRY (qmesh);
285
+ HANDLE_ENTRY (qvar);
286
+ HANDLE_ENTRY (ucdmesh);
287
+ HANDLE_ENTRY (ucdvar);
288
+ HANDLE_ENTRY (ptmesh);
289
+ HANDLE_ENTRY (ptvar);
290
+ HANDLE_ENTRY (mat);
291
+ HANDLE_ENTRY (matspecies);
292
+ HANDLE_ENTRY (array);
293
+ HANDLE_ENTRY (mrgtree);
294
+ HANDLE_ENTRY (mrgvar);
295
+ HANDLE_ENTRY (groupelmap);
296
+ HANDLE_ENTRY (obj);
287
297
288
- GET_FUNC_NAMES (var);
289
- GET_FUNC_NAMES (dir);
290
- GET_FUNC_NAMES (curve);
291
- GET_FUNC_NAMES (multimesh);
292
- GET_FUNC_NAMES (multivar);
293
- GET_FUNC_NAMES (multimat);
294
- GET_FUNC_NAMES (multimatspecies);
295
- GET_FUNC_NAMES (csgmesh);
296
- GET_FUNC_NAMES (csgvar);
297
- GET_FUNC_NAMES (defvars);
298
- GET_FUNC_NAMES (qmesh);
299
- GET_FUNC_NAMES (qvar);
300
- GET_FUNC_NAMES (ucdmesh);
301
- GET_FUNC_NAMES (ucdvar);
302
- GET_FUNC_NAMES (ptmesh);
303
- GET_FUNC_NAMES (ptvar);
304
- GET_FUNC_NAMES (mat);
305
- GET_FUNC_NAMES (matspecies);
306
- GET_FUNC_NAMES (array);
307
- GET_FUNC_NAMES (mrgtree);
308
- GET_FUNC_NAMES (mrgvar);
309
- GET_FUNC_NAMES (groupelmap);
310
- GET_FUNC_NAMES (obj);
298
+ if (!strcmp (name, " __dict__" ))
299
+ return __dict__result;
311
300
301
+ PyErr_SetString (PyExc_AttributeError, " attribute not found" );
312
302
return 0 ;
313
303
}
314
304
305
+ static PyObject *DBtoc_getattro (PyObject *self, PyObject *o)
306
+ {
307
+ PyObject *retval;
308
+ char *dupname;
309
+ char const *name = PyString_AsString (o);
310
+ if (!name) {
311
+ PyErr_SetString (PyExc_TypeError, " Could not convert argument C string" );
312
+ return NULL ;
313
+ }
314
+ dupname = strdup (name);
315
+ retval = DBtoc_getattr (self, dupname);
316
+ free (dupname);
317
+ return retval;
318
+ }
319
+
315
320
// ****************************************************************************
316
321
// DBtoc Python Type Object
317
322
//
@@ -352,7 +357,7 @@ PyTypeObject DBtocType =
352
357
0 , // tp_hash
353
358
0 , // tp_call
354
359
(reprfunc)DBtoc_str, // tp_str
355
- 0 , // tp_getattro
360
+ (getattrofunc)DBtoc_getattro, // tp_getattro
356
361
0 , // tp_setattro
357
362
0 , // tp_as_buffer
358
363
0 , // tp_flags
0 commit comments