|
|
c636548 |
diff -up meld3-0.6.7/meld3/cmeld3.c.missing-src-file meld3-0.6.7/meld3/cmeld3.c
|
|
|
c636548 |
--- meld3-0.6.7/meld3/cmeld3.c.missing-src-file 2011-04-05 14:31:26.229563043 +0200
|
|
|
c636548 |
+++ meld3-0.6.7/meld3/cmeld3.c 2011-04-05 14:30:52.631796235 +0200
|
|
|
c636548 |
@@ -0,0 +1,395 @@
|
|
|
c636548 |
+#include <Python.h>
|
|
|
c636548 |
+
|
|
|
c636548 |
+/* fprintf(stderr, "%s:%s:%d\n", __FILE__,__FUNCTION__,__LINE__);
|
|
|
c636548 |
+ fflush(stderr); */
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyObject *PySTR__class__, *PySTR__dict__, *PySTR_children;
|
|
|
c636548 |
+static PyObject *PySTRattrib, *PySTRparent, *PySTR_MELD_ID;
|
|
|
c636548 |
+static PyObject *PySTRtag, *PySTRtext, *PySTRtail, *PySTRstructure;
|
|
|
c636548 |
+static PyObject *PySTRReplace;
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyObject *emptyattrs, *emptychildren = NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyObject*
|
|
|
c636548 |
+bfclone(PyObject *nodes, PyObject *parent)
|
|
|
c636548 |
+{
|
|
|
c636548 |
+ int len, i;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(PyList_Check(nodes))) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ len = PyList_Size(nodes);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (len < 0) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ PyObject *L;
|
|
|
c636548 |
+ if (!(L = PyList_New(0))) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ for (i = 0; i < len; i++) {
|
|
|
c636548 |
+
|
|
|
c636548 |
+ PyObject *node;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(node = PyList_GetItem(nodes, i))) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ PyObject *klass;
|
|
|
c636548 |
+ PyObject *children;
|
|
|
c636548 |
+ PyObject *text;
|
|
|
c636548 |
+ PyObject *tail;
|
|
|
c636548 |
+ PyObject *tag;
|
|
|
c636548 |
+ PyObject *attrib;
|
|
|
c636548 |
+ PyObject *structure;
|
|
|
c636548 |
+ PyObject *dict;
|
|
|
c636548 |
+ PyObject *newdict;
|
|
|
c636548 |
+ PyObject *newchildren;
|
|
|
c636548 |
+ PyObject *attrib_copy;
|
|
|
c636548 |
+ PyObject *element;
|
|
|
c636548 |
+ int childsize;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(klass = PyObject_GetAttr(node, PySTR__class__))) return NULL;
|
|
|
c636548 |
+ if (!(dict = PyObject_GetAttr(node, PySTR__dict__))) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(children = PyDict_GetItem(dict, PySTR_children))) return NULL;
|
|
|
c636548 |
+ if (!(tag = PyDict_GetItem(dict, PySTRtag))) return NULL;
|
|
|
c636548 |
+ if (!(attrib = PyDict_GetItem(dict, PySTRattrib))) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(text = PyDict_GetItem(dict, PySTRtext))) {
|
|
|
c636548 |
+ text = Py_None;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ if (!(tail = PyDict_GetItem(dict, PySTRtail))) {
|
|
|
c636548 |
+ tail = Py_None;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ if (!(structure = PyDict_GetItem(dict, PySTRstructure))) {
|
|
|
c636548 |
+ structure = Py_None;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ Py_DECREF(dict);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(newdict = PyDict_New())) return NULL;
|
|
|
c636548 |
+ if (!(newchildren = PyList_New(0))) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ attrib_copy = PyDict_Copy(attrib);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTR_children, newchildren);
|
|
|
c636548 |
+ Py_DECREF(newchildren);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRattrib, attrib_copy);
|
|
|
c636548 |
+ Py_DECREF(attrib_copy);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRtext, text);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRtail, tail);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRtag, tag);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRstructure, structure);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRparent, parent);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(element = PyInstance_NewRaw(klass, newdict))) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ Py_DECREF(newdict);
|
|
|
c636548 |
+ Py_DECREF(klass);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (PyList_Append(L, element)) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ Py_DECREF(element);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!PyList_Check(children)) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if ((childsize = PyList_Size(children)) < 0) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ else {
|
|
|
c636548 |
+ if (childsize > 0) {
|
|
|
c636548 |
+ bfclone(children, element);
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (PyObject_SetAttr(parent, PySTR_children, L)) return NULL;
|
|
|
c636548 |
+ Py_DECREF(L);
|
|
|
c636548 |
+ return parent;
|
|
|
c636548 |
+
|
|
|
c636548 |
+}
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyObject*
|
|
|
c636548 |
+bfclonehandler(PyObject *self, PyObject *args)
|
|
|
c636548 |
+{
|
|
|
c636548 |
+ PyObject *node, *parent;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!PyArg_ParseTuple(args, "OO:clone", &node, &parent)) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ PyObject *klass;
|
|
|
c636548 |
+ PyObject *children;
|
|
|
c636548 |
+ PyObject *text;
|
|
|
c636548 |
+ PyObject *tail;
|
|
|
c636548 |
+ PyObject *tag;
|
|
|
c636548 |
+ PyObject *attrib;
|
|
|
c636548 |
+ PyObject *structure;
|
|
|
c636548 |
+ PyObject *dict;
|
|
|
c636548 |
+ PyObject *newdict;
|
|
|
c636548 |
+ PyObject *newchildren;
|
|
|
c636548 |
+ PyObject *attrib_copy;
|
|
|
c636548 |
+ PyObject *element;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(klass = PyObject_GetAttr(node, PySTR__class__))) return NULL;
|
|
|
c636548 |
+ if (!(dict = PyObject_GetAttr(node, PySTR__dict__))) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(children = PyDict_GetItem(dict, PySTR_children))) return NULL;
|
|
|
c636548 |
+ if (!(tag = PyDict_GetItem(dict, PySTRtag))) return NULL;
|
|
|
c636548 |
+ if (!(attrib = PyDict_GetItem(dict, PySTRattrib))) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(text = PyDict_GetItem(dict, PySTRtext))) {
|
|
|
c636548 |
+ text = Py_None;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ if (!(tail = PyDict_GetItem(dict, PySTRtail))) {
|
|
|
c636548 |
+ tail = Py_None;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ if (!(structure = PyDict_GetItem(dict, PySTRstructure))) {
|
|
|
c636548 |
+ structure = Py_None;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ Py_DECREF(dict);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(newdict = PyDict_New())) return NULL;
|
|
|
c636548 |
+ if (!(newchildren = PyList_New(0))) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ attrib_copy = PyDict_Copy(attrib);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTR_children, newchildren);
|
|
|
c636548 |
+ Py_DECREF(newchildren);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRattrib, attrib_copy);
|
|
|
c636548 |
+ Py_DECREF(attrib_copy);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRtext, text);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRtail, tail);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRtag, tag);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRstructure, structure);
|
|
|
c636548 |
+ PyDict_SetItem(newdict, PySTRparent, parent);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(element = PyInstance_NewRaw(klass, newdict))) return NULL;
|
|
|
c636548 |
+ Py_DECREF(newdict);
|
|
|
c636548 |
+ Py_DECREF(klass);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ PyObject *pchildren;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (parent != Py_None) {
|
|
|
c636548 |
+ if (!(pchildren=PyObject_GetAttr(parent, PySTR_children))) return NULL;
|
|
|
c636548 |
+ if (PyList_Append(pchildren, element)) return NULL;
|
|
|
c636548 |
+ Py_DECREF(pchildren);
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(PyList_Check(children))) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (PyList_Size(children) > 0) {
|
|
|
c636548 |
+ if (bfclone(children, element) == NULL) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ return element;
|
|
|
c636548 |
+
|
|
|
c636548 |
+}
|
|
|
c636548 |
+
|
|
|
c636548 |
+PyDoc_STRVAR(bfclonehandler_doc,
|
|
|
c636548 |
+"bfclone(node, parent=None)\n \
|
|
|
c636548 |
+\n\
|
|
|
c636548 |
+Return a clone of the meld3 node named by node (breadth-first). If parent\n\
|
|
|
c636548 |
+is not None, append the clone to the parent.\n");
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyObject*
|
|
|
c636548 |
+getiterator(PyObject *node, PyObject *list) {
|
|
|
c636548 |
+ if (PyList_Append(list, node) == -1) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ PyObject *children;
|
|
|
c636548 |
+ PyObject *child;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(children = PyObject_GetAttr(node, PySTR_children))) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ int len, i;
|
|
|
c636548 |
+ len = PyList_Size(children);
|
|
|
c636548 |
+ if (len < 0) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ for (i = 0; i < len; i++) {
|
|
|
c636548 |
+ if (!(child = PyList_GetItem(children, i))) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ getiterator(child, list);
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ Py_DECREF(children);
|
|
|
c636548 |
+ return list;
|
|
|
c636548 |
+}
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyObject*
|
|
|
c636548 |
+getiteratorhandler(PyObject *self, PyObject *args)
|
|
|
c636548 |
+{
|
|
|
c636548 |
+ PyObject *node;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!PyArg_ParseTuple(args, "O:getiterator", &node)) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ PyObject *list;
|
|
|
c636548 |
+ PyObject *result;
|
|
|
c636548 |
+ if (!(list = PyList_New(0))) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ result = getiterator(node, list);
|
|
|
c636548 |
+ if (result == NULL) {
|
|
|
c636548 |
+ PyList_SetSlice(list, 0, PyList_GET_SIZE(list), (PyObject *)NULL);
|
|
|
c636548 |
+ Py_DECREF(list);
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ return result;
|
|
|
c636548 |
+}
|
|
|
c636548 |
+
|
|
|
c636548 |
+PyDoc_STRVAR(getiteratorhandler_doc,
|
|
|
c636548 |
+"getiterator(node)\n\
|
|
|
c636548 |
+\n\
|
|
|
c636548 |
+Returns an iterator for the node.");
|
|
|
c636548 |
+
|
|
|
c636548 |
+static char* _MELD_ID = "{http://www.plope.com/software/meld3}id";
|
|
|
c636548 |
+/*static PyObject *PySTR_MELD_ID = PyString_FromString(_MELD_ID);*/
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyObject*
|
|
|
c636548 |
+findmeld(PyObject *node, PyObject *name) {
|
|
|
c636548 |
+ PyObject *attrib, *meldid, *result;
|
|
|
c636548 |
+ if (!(attrib = PyObject_GetAttr(node, PySTRattrib))) return NULL;
|
|
|
c636548 |
+ meldid = PyDict_GetItem(attrib, PySTR_MELD_ID);
|
|
|
c636548 |
+ Py_DECREF(attrib);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (meldid != NULL) {
|
|
|
c636548 |
+ int compareresult = PyUnicode_Compare(meldid, name);
|
|
|
c636548 |
+ if (compareresult == 0) {
|
|
|
c636548 |
+ Py_INCREF(node);
|
|
|
c636548 |
+ return node;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ int len, i;
|
|
|
c636548 |
+ result = Py_None;
|
|
|
c636548 |
+ PyObject *children = PyObject_GetAttr(node, PySTR_children);
|
|
|
c636548 |
+ len = PyList_Size(children);
|
|
|
c636548 |
+ for (i = 0; i < len; i++) {
|
|
|
c636548 |
+ PyObject *child = PyList_GetItem(children, i);
|
|
|
c636548 |
+ result = findmeld(child, name);
|
|
|
c636548 |
+ if (result != Py_None) {
|
|
|
c636548 |
+ break;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ Py_DECREF(children);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ return result;
|
|
|
c636548 |
+
|
|
|
c636548 |
+}
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyObject*
|
|
|
c636548 |
+findmeldhandler(PyObject *self, PyObject *args)
|
|
|
c636548 |
+{
|
|
|
c636548 |
+ PyObject *node, *name, *result;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!PyArg_ParseTuple(args, "OO:findmeld", &node, &name)) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ if (!(result = findmeld(node, name))) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (result == Py_None) {
|
|
|
c636548 |
+ Py_INCREF(Py_None);
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+
|
|
|
c636548 |
+ return result;
|
|
|
c636548 |
+}
|
|
|
c636548 |
+
|
|
|
c636548 |
+PyDoc_STRVAR(findmeldhandler_doc,
|
|
|
c636548 |
+"findmeld(node, meldid)\n\
|
|
|
c636548 |
+\n\
|
|
|
c636548 |
+Return a meld node or None.\n");
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyObject*
|
|
|
c636548 |
+contenthandler(PyObject *self, PyObject *args) {
|
|
|
c636548 |
+ PyObject *node, *text, *structure;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!PyArg_ParseTuple(args, "OOO:content", &node, &text, &structure)) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ PyObject *replacel = NULL;
|
|
|
c636548 |
+ PyObject *replace = NULL;
|
|
|
c636548 |
+ PyObject *replacenode = NULL;
|
|
|
c636548 |
+ PyObject *newchildren = NULL;
|
|
|
c636548 |
+ PyObject *newdict = NULL;
|
|
|
c636548 |
+ PyObject *klass = NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(klass = PyObject_GetAttr(node, PySTR__class__))) return NULL;
|
|
|
c636548 |
+ if (!(replacel = PyObject_GetAttr(node, PySTRReplace))) return NULL;
|
|
|
c636548 |
+ if (!(replace = PyList_GetItem(replacel, 0))) return NULL;
|
|
|
c636548 |
+ Py_DECREF(replacel);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ PyObject_SetAttr(node, PySTRtext, Py_None);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(newdict = PyDict_New())) return NULL;
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (PyDict_SetItem(newdict, PySTRparent, node) == -1) return NULL;
|
|
|
c636548 |
+ if (PyDict_SetItem(newdict, PySTRattrib, emptyattrs) == -1) return NULL;
|
|
|
c636548 |
+ if (PyDict_SetItem(newdict, PySTRtext, text) == -1) return NULL;
|
|
|
c636548 |
+ if (PyDict_SetItem(newdict, PySTRstructure, structure) == -1) return NULL;
|
|
|
c636548 |
+ if (PyDict_SetItem(newdict, PySTRtag, replace) == -1) return NULL;
|
|
|
c636548 |
+ if (PyDict_SetItem(newdict, PySTR_children, emptychildren) == -1) {
|
|
|
c636548 |
+ return NULL;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ if (!(replacenode = PyInstance_NewRaw(klass, newdict))) return NULL;
|
|
|
c636548 |
+ Py_DECREF(klass);
|
|
|
c636548 |
+ Py_DECREF(newdict);
|
|
|
c636548 |
+
|
|
|
c636548 |
+ if (!(newchildren = PyList_New(1))) return NULL;
|
|
|
c636548 |
+ PyList_SET_ITEM(newchildren, 0, replacenode); // steals a reference to rn
|
|
|
c636548 |
+ PyObject_SetAttr(node, PySTR_children, newchildren);
|
|
|
c636548 |
+ Py_DECREF(newchildren);
|
|
|
c636548 |
+ Py_INCREF(Py_None);
|
|
|
c636548 |
+ return Py_None;
|
|
|
c636548 |
+
|
|
|
c636548 |
+}
|
|
|
c636548 |
+
|
|
|
c636548 |
+PyDoc_STRVAR(contenthandler_doc,
|
|
|
c636548 |
+"content(node, text, structure)\n\
|
|
|
c636548 |
+\n\
|
|
|
c636548 |
+Add a content node to node.");
|
|
|
c636548 |
+
|
|
|
c636548 |
+static PyMethodDef methods[] = {
|
|
|
c636548 |
+ {"bfclone", bfclonehandler, METH_VARARGS, bfclonehandler_doc},
|
|
|
c636548 |
+ {"getiterator", getiteratorhandler, METH_VARARGS, getiteratorhandler_doc},
|
|
|
c636548 |
+ {"findmeld", findmeldhandler, METH_VARARGS, findmeldhandler_doc},
|
|
|
c636548 |
+ {"content", contenthandler, METH_VARARGS, contenthandler_doc},
|
|
|
c636548 |
+ {NULL, NULL}
|
|
|
c636548 |
+};
|
|
|
c636548 |
+
|
|
|
c636548 |
+PyMODINIT_FUNC
|
|
|
c636548 |
+initcmeld3(void)
|
|
|
c636548 |
+{
|
|
|
c636548 |
+#define DEFINE_STRING(s) \
|
|
|
c636548 |
+ if (!(PySTR##s = PyString_FromString(#s))) return
|
|
|
c636548 |
+ DEFINE_STRING(__class__);
|
|
|
c636548 |
+ DEFINE_STRING(__dict__);
|
|
|
c636548 |
+ DEFINE_STRING(_children);
|
|
|
c636548 |
+ DEFINE_STRING(parent);
|
|
|
c636548 |
+ DEFINE_STRING(tag);
|
|
|
c636548 |
+ DEFINE_STRING(attrib);
|
|
|
c636548 |
+ DEFINE_STRING(text);
|
|
|
c636548 |
+ DEFINE_STRING(tail);
|
|
|
c636548 |
+ DEFINE_STRING(structure);
|
|
|
c636548 |
+ DEFINE_STRING(Replace);
|
|
|
c636548 |
+#undef DEFINE_STRING
|
|
|
c636548 |
+ PySTR_MELD_ID = PyString_FromString(_MELD_ID);
|
|
|
c636548 |
+ if (!PySTR_MELD_ID) {
|
|
|
c636548 |
+ return;
|
|
|
c636548 |
+ }
|
|
|
c636548 |
+ emptyattrs = PyDict_New();
|
|
|
c636548 |
+/* emptyattrs = PyDictProxy_New(emptyattrs); can't copy a proxy, so... */
|
|
|
c636548 |
+ emptychildren = PyList_New(0);
|
|
|
c636548 |
+ Py_InitModule3("cmeld3", methods,
|
|
|
c636548 |
+ "C helpers for meld3");
|
|
|
c636548 |
+}
|