msm: consistency for equally ranked keys
[platform/upstream/rpm.git] / python / rpmbmodule.c
index 2332590..f6e1491 100644 (file)
@@ -2,27 +2,94 @@
 
 #include "spec-py.h"
 
-#include "debug.h"
-
 static char rpmb__doc__[] =
 "";
 
-void init_rpmb(void);  /* XXX eliminate gcc warning */
+/*
+  Do any common preliminary work before python 2 vs python 3 module creation:
+*/
+static int prepareInitModule(void)
+{
+    if (PyType_Ready(&spec_Type) < 0) return 0;
+    if (PyType_Ready(&specPkg_Type) < 0) return 0;
 
-void init_rpmb(void)
+    return 1;
+}
+
+static int initModule(PyObject *m)
 {
-    PyObject * d, *m;
+    Py_INCREF(&spec_Type);
+    PyModule_AddObject(m, "spec", (PyObject *) &spec_Type);
+    Py_INCREF(&specPkg_Type);
+    PyModule_AddObject(m, "specPkg", (PyObject *) &specPkg_Type);
 
-    if (PyType_Ready(&spec_Type) < 0) return;
+#define REGISTER_ENUM(val) PyModule_AddIntConstant(m, #val, val)
+    REGISTER_ENUM(RPMBUILD_ISSOURCE);
+    REGISTER_ENUM(RPMBUILD_ISPATCH);
+    REGISTER_ENUM(RPMBUILD_ISICON);
+    REGISTER_ENUM(RPMBUILD_ISNO);
 
-    m = Py_InitModule3("_rpmb", NULL, rpmb__doc__);
-    if (m == NULL)
-       return;
+    REGISTER_ENUM(RPMBUILD_NONE);
+    REGISTER_ENUM(RPMBUILD_PREP);
+    REGISTER_ENUM(RPMBUILD_BUILD);
+    REGISTER_ENUM(RPMBUILD_INSTALL);
+    REGISTER_ENUM(RPMBUILD_CHECK);
+    REGISTER_ENUM(RPMBUILD_CLEAN);
+    REGISTER_ENUM(RPMBUILD_FILECHECK);
+    REGISTER_ENUM(RPMBUILD_PACKAGESOURCE);
+    REGISTER_ENUM(RPMBUILD_PACKAGEBINARY);
+    REGISTER_ENUM(RPMBUILD_RMSOURCE);
+    REGISTER_ENUM(RPMBUILD_RMBUILD);
+    REGISTER_ENUM(RPMBUILD_RMSPEC);
 
-    d = PyModule_GetDict(m);
+    REGISTER_ENUM(RPMBUILD_PKG_NONE);
+    REGISTER_ENUM(RPMBUILD_PKG_NODIRTOKENS);
 
-    Py_INCREF(&spec_Type);
-    PyModule_AddObject(m, "spec", (PyObject *) &spec_Type);
+    REGISTER_ENUM(RPMSPEC_NONE);
+    REGISTER_ENUM(RPMSPEC_ANYARCH);
+    REGISTER_ENUM(RPMSPEC_FORCE);
+    REGISTER_ENUM(RPMSPEC_NOLANG);
 
+    return 1;
 }
 
+#if PY_MAJOR_VERSION >= 3
+static struct PyModuleDef moduledef = {
+    PyModuleDef_HEAD_INIT,
+    "_rpmb",     /* m_name */
+    rpmb__doc__, /* m_doc */
+    0,           /* m_size */
+    NULL,        /* m_methods */
+    NULL,        /* m_reload */
+    NULL,        /* m_traverse */
+    NULL,        /* m_clear */
+    NULL         /* m_free */
+};
+
+PyObject * PyInit__rpm(void);  /* XXX eliminate gcc warning */
+PyObject * PyInit__rpm(void)
+{
+    PyObject *m;
+
+    if (!prepareInitModule())
+        return NULL;
+    m = PyModule_Create(&moduledef);
+    if (m == NULL || !initModule(m)) {
+        Py_XDECREF(m);
+        m = NULL;
+    }
+    return m;
+}
+#else
+void init_rpmb(void);  /* XXX eliminate gcc warning */
+void init_rpmb(void)
+{
+    PyObject *m;
+  
+    if (!prepareInitModule())
+        return;
+
+    m = Py_InitModule3("_rpmb", NULL, rpmb__doc__);
+    if (m) initModule(m);
+}
+#endif