Skip to content

Commit c9f584c

Browse files
Merge pull request #373 from LLNL/bug_mcm86_26apr24_dir_dbtoc
Fix dir on dbtoc
2 parents 085a68a + 959b533 commit c9f584c

File tree

2 files changed

+55
-49
lines changed

2 files changed

+55
-49
lines changed

src/silo/silo_ns.c

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ reflect those of the United States Government or Lawrence Livermore
4949
National Security, LLC, and shall not be used for advertising or
5050
product endorsement purposes.
5151
*/
52+
#include <ctype.h>
5253
#include <stdarg.h>
5354
#include <stdlib.h>
5455
#include <errno.h>

tools/python/pydbtoc.cpp

+54-49
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050

5151
#include "pydbtoc.h"
5252
#include "pysilo.h"
53+
#include <stdlib.h>
54+
#include <string.h>
5355

5456
// ****************************************************************************
5557
// Method: DBtoc_dealloc
@@ -240,8 +242,14 @@ GET_FUNC_DEFS(mrgvar);
240242
GET_FUNC_DEFS(groupelmap);
241243
GET_FUNC_DEFS(obj);
242244

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+
}
245253

246254
// ****************************************************************************
247255
// Method: DBtoc_getattr
@@ -261,57 +269,54 @@ GET_FUNC_DEFS(obj);
261269
// ****************************************************************************
262270
static PyObject *DBtoc_getattr(PyObject *self, char *name)
263271
{
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);
287297

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;
311300

301+
PyErr_SetString(PyExc_AttributeError, "attribute not found");
312302
return 0;
313303
}
314304

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+
315320
// ****************************************************************************
316321
// DBtoc Python Type Object
317322
//
@@ -352,7 +357,7 @@ PyTypeObject DBtocType =
352357
0, // tp_hash
353358
0, // tp_call
354359
(reprfunc)DBtoc_str, // tp_str
355-
0, // tp_getattro
360+
(getattrofunc)DBtoc_getattro, // tp_getattro
356361
0, // tp_setattro
357362
0, // tp_as_buffer
358363
0, // tp_flags

0 commit comments

Comments
 (0)