57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
#include "pybongo.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
void
|
|
AddLibrary(PyObject *module, char *name, PyMethodDef *classMethods,
|
|
EnumItemDef *enumItems)
|
|
{
|
|
PyMethodDef *def;
|
|
EnumItemDef *item;
|
|
|
|
/* Create the new class object and add it to the module */
|
|
PyObject *moduleDict = PyModule_GetDict(module);
|
|
PyObject *classDict = PyDict_New();
|
|
PyObject *className = PyString_FromString(name);
|
|
PyObject *classObj = PyClass_New(NULL, classDict, className);
|
|
|
|
PyDict_SetItemString(moduleDict, name, classObj);
|
|
|
|
/* Add the class's methods to its dict */
|
|
for (def = classMethods; def->ml_name != NULL; def++) {
|
|
PyObject *func = PyCFunction_New(def, NULL);
|
|
PyObject *method;
|
|
if (def->ml_flags & METH_STATIC) {
|
|
method = PyStaticMethod_New(func);
|
|
} else {
|
|
method = PyMethod_New(func, NULL, classObj);
|
|
}
|
|
PyDict_SetItemString(classDict, def->ml_name, method);
|
|
Py_DECREF(func);
|
|
Py_DECREF(method);
|
|
}
|
|
|
|
if (enumItems != NULL) {
|
|
for (item = enumItems; item->name != NULL; item++) {
|
|
PyObject *value;
|
|
if(item->strvalue) {
|
|
value = PyString_FromString(item->strvalue);
|
|
} else {
|
|
value = PyInt_FromLong(item->value);
|
|
}
|
|
PyDict_SetItemString(classDict, item->name, value);
|
|
Py_DECREF(value);
|
|
}
|
|
}
|
|
|
|
Py_DECREF(classDict);
|
|
Py_DECREF(className);
|
|
Py_DECREF(classObj);
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|