summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorjbj <devnull@localhost>2002-12-12 17:46:22 +0000
committerjbj <devnull@localhost>2002-12-12 17:46:22 +0000
commit8681309f1a19ebe597464aa3d1304bef06d3790e (patch)
tree03a04336ed0f3bfd939c4baf51a28afb1fc5cc9e /python
parent78ddb8c8761d21ad59f99404c1f077c1434e943a (diff)
downloadlibrpm-tizen-8681309f1a19ebe597464aa3d1304bef06d3790e.tar.gz
librpm-tizen-8681309f1a19ebe597464aa3d1304bef06d3790e.tar.bz2
librpm-tizen-8681309f1a19ebe597464aa3d1304bef06d3790e.zip
Add
PyObject *md_dict; /*!< to look like PyModuleObject */ to all rpmfoo_Type's. CVS patchset: 5936 CVS date: 2002/12/12 17:46:22
Diffstat (limited to 'python')
-rw-r--r--python/rpmal-py.h1
-rw-r--r--python/rpmbc-py.h1
-rw-r--r--python/rpmdb-py.h1
-rw-r--r--python/rpmdebug-py.c20
-rw-r--r--python/rpmds-py.h1
-rw-r--r--python/rpmfd-py.h1
-rw-r--r--python/rpmfi-py.h1
-rw-r--r--python/rpmfts-py.c397
-rw-r--r--python/rpmfts-py.h3
-rw-r--r--python/rpmmi-py.h1
-rw-r--r--python/rpmrc-py.h1
-rw-r--r--python/rpmte-py.h1
-rw-r--r--python/rpmts-py.h1
13 files changed, 251 insertions, 179 deletions
diff --git a/python/rpmal-py.h b/python/rpmal-py.h
index ee79fd6cd..62d69a44d 100644
--- a/python/rpmal-py.h
+++ b/python/rpmal-py.h
@@ -9,6 +9,7 @@
typedef struct rpmalObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
rpmal al;
} rpmalObject;
diff --git a/python/rpmbc-py.h b/python/rpmbc-py.h
index 54814c8c6..787509fd6 100644
--- a/python/rpmbc-py.h
+++ b/python/rpmbc-py.h
@@ -11,6 +11,7 @@
*/
typedef struct rpmbcObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
mp32number n;
} rpmbcObject;
diff --git a/python/rpmdb-py.h b/python/rpmdb-py.h
index 87e4a0528..377f59e3c 100644
--- a/python/rpmdb-py.h
+++ b/python/rpmdb-py.h
@@ -15,6 +15,7 @@ typedef struct rpmdbObject_s rpmdbObject;
*/
struct rpmdbObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
rpmdb db;
int offx;
int noffs;
diff --git a/python/rpmdebug-py.c b/python/rpmdebug-py.c
index 279c0907f..bd5520cfc 100644
--- a/python/rpmdebug-py.c
+++ b/python/rpmdebug-py.c
@@ -9,15 +9,16 @@ extern PyTypeObject PyFrame_Type;
#include "rpmbc-py.h" /* XXX debug only */
#include <rpmcli.h> /* XXX debug only */
-#include "header-py.h" /* XXX debug only */
-#include "rpmal-py.h" /* XXX debug only */
-#include "rpmds-py.h" /* XXX debug only */
-#include "rpmfd-py.h" /* XXX debug only */
-#include "rpmfi-py.h" /* XXX debug only */
-#include "rpmmi-py.h" /* XXX debug only */
-#include "rpmrc-py.h" /* XXX debug only */
-#include "rpmte-py.h" /* XXX debug only */
-#include "rpmts-py.h" /* XXX debug only */
+#include "header-py.h" /* XXX debug only */
+#include "rpmal-py.h" /* XXX debug only */
+#include "rpmds-py.h" /* XXX debug only */
+#include "rpmfd-py.h" /* XXX debug only */
+#include "rpmfi-py.h" /* XXX debug only */
+#include "rpmfts-py.h" /* XXX debug only */
+#include "rpmmi-py.h" /* XXX debug only */
+#include "rpmrc-py.h" /* XXX debug only */
+#include "rpmte-py.h" /* XXX debug only */
+#include "rpmts-py.h" /* XXX debug only */
/**
*/
@@ -63,6 +64,7 @@ static const char * lbl(void * s)
if (o->ob_type == &rpmds_Type) return "rpmds";
if (o->ob_type == &rpmfd_Type) return "rpmfd";
if (o->ob_type == &rpmfi_Type) return "rpmfi";
+ if (o->ob_type == &rpmfts_Type) return "rpmfts";
if (o->ob_type == &rpmmi_Type) return "rpmmi";
if (o->ob_type == &rpmrc_Type) return "rpmrc";
if (o->ob_type == &rpmte_Type) return "rpmte";
diff --git a/python/rpmds-py.h b/python/rpmds-py.h
index 56f1b5c24..83c892814 100644
--- a/python/rpmds-py.h
+++ b/python/rpmds-py.h
@@ -11,6 +11,7 @@
*/
typedef struct rpmdsObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
int active;
/*@null@*/
rpmds ds;
diff --git a/python/rpmfd-py.h b/python/rpmfd-py.h
index 5ab81d692..142ff1bc9 100644
--- a/python/rpmfd-py.h
+++ b/python/rpmfd-py.h
@@ -7,6 +7,7 @@
typedef struct rpmfdObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
FD_t fd;
} rpmfdObject;
diff --git a/python/rpmfi-py.h b/python/rpmfi-py.h
index f6ce8bcbe..386b308b8 100644
--- a/python/rpmfi-py.h
+++ b/python/rpmfi-py.h
@@ -9,6 +9,7 @@
typedef struct rpmfiObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
int active;
/*@null@*/
rpmfi fi;
diff --git a/python/rpmfts-py.c b/python/rpmfts-py.c
index c48b5022b..c59944bba 100644
--- a/python/rpmfts-py.c
+++ b/python/rpmfts-py.c
@@ -5,6 +5,7 @@
#include "system.h"
#include "Python.h"
+#include "structmember.h"
#ifdef __LCLINT__
#undef PyObject_HEAD
#define PyObject_HEAD int _PyObjectHead;
@@ -12,10 +13,12 @@
#include <fts.h>
-#include <rpmlib.h> /* XXX _free */
-
#include "rpmfts-py.h"
+#include "rpmdebug-py.c"
+
+#include <rpmlib.h> /* XXX _free */
+
#include "debug.h"
/*@unchecked@*/
@@ -52,6 +55,7 @@ static const char * ftsInfoStr(int fts_info)
static void
rpmfts_initialize(rpmftsObject * s, const char * root, int options, int ignore)
+ /*@modifies s @*/
{
int ac = 1;
char * t;
@@ -82,6 +86,52 @@ fprintf(stderr, "*** initialize: %p[0] %p %s %x %x\n", s->roots, s->roots[0], s-
}
+static int
+rpmfts_inactive(rpmftsObject * s)
+ /*@modifies s @*/
+{
+ int rc = 0;
+
+ if (s->ftsp) {
+ Py_BEGIN_ALLOW_THREADS
+ rc = Fts_close(s->ftsp);
+ Py_END_ALLOW_THREADS
+ s->ftsp = NULL;
+ s->fts = NULL;
+ s->active = 0;
+ }
+ return rc;
+}
+
+static PyObject *
+rpmfts_walk(rpmftsObject * s)
+ /*@modifies s @*/
+{
+ PyObject * result = NULL;
+ int xx;
+
+ if (s->ftsp == NULL)
+ return NULL;
+
+ do {
+ Py_BEGIN_ALLOW_THREADS
+ s->fts = Fts_read(s->ftsp);
+ Py_END_ALLOW_THREADS
+ } while (s->fts && (infoBit(s->fts->fts_info) & s->ignore));
+
+ if (s->fts != NULL) {
+ Py_INCREF(s);
+ result = (PyObject *)s;
+ } else {
+ if (s->active == 2)
+ xx = rpmfts_inactive(s);
+ s->active = 0;
+ }
+ return result;
+}
+
+/* ---------- */
+
/** \ingroup python
* \name Class: Rpmfts
* \class Rpmfts
@@ -93,7 +143,8 @@ rpmfts_Debug(/*@unused@*/ rpmftsObject * s, PyObject * args)
/*@globals _Py_NoneStruct @*/
/*@modifies _Py_NoneStruct @*/
{
- if (!PyArg_ParseTuple(args, "i:Debug", &_rpmfts_debug)) return NULL;
+ if (!PyArg_ParseTuple(args, "i:Debug", &_rpmfts_debug))
+ return NULL;
Py_INCREF(Py_None);
return Py_None;
@@ -104,8 +155,6 @@ rpmfts_iter(rpmftsObject * s)
/*@*/
{
Py_INCREF(s);
-if (_rpmfts_debug < 0)
-fprintf(stderr, "*** rpmfts_iter(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
return (PyObject *)s;
}
@@ -113,59 +162,15 @@ static PyObject *
rpmfts_iternext(rpmftsObject * s)
/*@modifies s @*/
{
- PyObject * result = NULL;
- int xx;
-
/* Reset loop indices on 1st entry. */
if (!s->active) {
+ Py_BEGIN_ALLOW_THREADS
s->ftsp = Fts_open((char *const *)s->roots, s->options, (int (*)())s->compare);
+ Py_END_ALLOW_THREADS
s->fts = NULL;
s->active = 2;
}
-
- if (s->ftsp != NULL)
- do {
- s->fts = Fts_read(s->ftsp);
- } while (s->fts && (infoBit(s->fts->fts_info) & s->ignore));
-
- if (s->fts != NULL) {
- Py_INCREF(s);
- result = (PyObject *)s;
- } else {
- if (s->active == 2) {
- xx = Fts_close(s->ftsp);
- s->ftsp = NULL;
- s->fts = NULL;
- }
- s->active = 0;
- }
-
-if (_rpmfts_debug < 0)
-fprintf(stderr, "*** rpmfts_iternext(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
-
- return result;
-}
-
-static PyObject *
-rpmfts_Next(rpmftsObject * s, PyObject *args)
- /*@globals _Py_NoneStruct @*/
- /*@modifies s, _Py_NoneStruct @*/
-{
- PyObject * result;
-
-if (_rpmfts_debug)
-fprintf(stderr, "*** rpmfts_Next(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
-
- if (!PyArg_ParseTuple(args, ":Next"))
- return NULL;
-
- result = rpmfts_iternext(s);
-
- if (result == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- return result;
+ return rpmfts_walk(s);
}
static PyObject *
@@ -183,7 +188,9 @@ fprintf(stderr, "*** rpmfts_Open(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s
return NULL;
rpmfts_initialize(s, root, options, ignore);
+ Py_BEGIN_ALLOW_THREADS
s->ftsp = Fts_open((char *const *)s->roots, s->options, (int (*)())s->compare);
+ Py_END_ALLOW_THREADS
s->active = 1;
return (PyObject *)s;
@@ -194,31 +201,18 @@ rpmfts_Read(rpmftsObject * s, PyObject * args)
/*@globals _Py_NoneStruct @*/
/*@modifies s, _Py_NoneStruct @*/
{
- PyObject * result = NULL;
- int xx;
+ PyObject * result;
if (_rpmfts_debug)
fprintf(stderr, "*** rpmfts_Read(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
if (!PyArg_ParseTuple(args, ":Read")) return NULL;
- if (s->ftsp != NULL)
- do {
- s->fts = Fts_read(s->ftsp);
- } while (s->fts && (infoBit(s->fts->fts_info) & s->ignore));
+ result = rpmfts_walk(s);
- if (s->fts != NULL) {
- Py_INCREF(s);
- result = (PyObject *)s;
- } else {
- if (s->active == 2) {
- xx = Fts_close(s->ftsp);
- s->ftsp = NULL;
- s->fts = NULL;
- }
- s->active = 0;
+ if (result == NULL) {
Py_INCREF(Py_None);
- result = Py_None;
+ return Py_None;
}
return result;
@@ -229,17 +223,19 @@ rpmfts_Children(rpmftsObject * s, PyObject * args)
/*@globals _Py_NoneStruct @*/
/*@modifies s, _Py_NoneStruct @*/
{
- int instr = 0;
+ int instr;
if (_rpmfts_debug)
fprintf(stderr, "*** rpmfts_Children(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
- if (!PyArg_ParseTuple(args, ":Children")) return NULL;
+ if (!PyArg_ParseTuple(args, "i:Children", &instr)) return NULL;
if (!(s && s->ftsp))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
s->fts = Fts_children(s->ftsp, instr);
+ Py_END_ALLOW_THREADS
Py_INCREF(Py_None);
return Py_None;
@@ -249,21 +245,12 @@ static PyObject *
rpmfts_Close(rpmftsObject * s, PyObject * args)
/*@modifies s @*/
{
- int rc = 0;
-
if (_rpmfts_debug)
fprintf(stderr, "*** rpmfts_Close(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
if (!PyArg_ParseTuple(args, ":Close")) return NULL;
- if (s->ftsp) {
- rc = Fts_close(s->ftsp);
- s->ftsp = NULL;
- s->fts = NULL;
- s->active = 0;
- }
-
- return Py_BuildValue("i", rc);
+ return Py_BuildValue("i", rpmfts_inactive(s));
}
static PyObject *
@@ -276,7 +263,7 @@ rpmfts_Set(rpmftsObject * s, PyObject * args)
if (_rpmfts_debug)
fprintf(stderr, "*** rpmfts_Set(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
- if (!PyArg_ParseTuple(args, ":Set")) return NULL;
+ if (!PyArg_ParseTuple(args, "i:Set", &instr)) return NULL;
if (s->ftsp && s->fts)
rc = Fts_set(s->ftsp, s->fts, instr);
@@ -291,8 +278,6 @@ fprintf(stderr, "*** rpmfts_Set(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s-
static struct PyMethodDef rpmfts_methods[] = {
{"Debug", (PyCFunction)rpmfts_Debug, METH_VARARGS,
NULL},
- {"next", (PyCFunction)rpmfts_Next, METH_VARARGS,
- NULL},
{"open", (PyCFunction)rpmfts_Open, METH_VARARGS,
NULL},
{"read", (PyCFunction)rpmfts_Read, METH_VARARGS,
@@ -309,56 +294,72 @@ static struct PyMethodDef rpmfts_methods[] = {
/* ---------- */
-/** \ingroup python
- */
-static void
-rpmfts_dealloc(/*@only@*/ /*@null@*/ rpmftsObject * s)
- /*@modifies s @*/
+static PyMemberDef rpmfts_members[] = {
+ {"__dict__",T_OBJECT,offsetof(rpmftsObject, md_dict), READONLY,
+ NULL},
+ {"callbacks",T_OBJECT,offsetof(rpmftsObject, callbacks), 0,
+"Callback dictionary for FTS_{D|DC|DEFAULT|DNR|DOT|DP|ERR|F|INIT|NS|NSOK|SL|SLNONE|W}"},
+ {"options", T_INT, offsetof(rpmftsObject, options), 0,
+"Option bit(s): FTS_{COMFOLLOW|LOGICAL|NOCHDIR|NOSTAT|PHYSICAL|SEEDOT|XDEV}"},
+ {"ignore", T_INT, offsetof(rpmftsObject, ignore), 0,
+"Ignore bit(s): (1 << info) with info one of FTS_{D|DC|DEFAULT|DNR|DOT|DP|ERR|F|INIT|NS|NSOK|SL|SLNONE|W}"},
+ {NULL, 0, 0, 0}
+};
+
+static PyObject * rpmfts_getattro(rpmftsObject * s, PyObject * n)
+ /*@*/
{
- if (s) {
-if (_rpmfts_debug < 0)
-fprintf(stderr, "*** rpmfts_dealloc(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
-
- if (s->ftsp) {
- (void) Fts_close(s->ftsp);
- s->ftsp = NULL;
- s->fts = NULL;
- s->active = 0;
- }
- s->roots = _free(s->roots);
- PyObject_Del(s);
- }
+if (_rpmfts_debug)
+fprintf(stderr, "*** rpmfts_getattro(%p[%s],%p[%s]) %d %d ftsp %p fts %p\n", s, lbl(s), n, lbl(n), s->ob_refcnt, s->active, s->ftsp, s->fts);
+
+ return PyObject_GenericGetAttr((PyObject *)s, n);
}
-/** \ingroup python
- */
-static int
-rpmfts_print(rpmftsObject * s, FILE * fp, /*@unused@*/ int flags)
- /*@globals fileSystem @*/
- /*@modifies fp, fileSystem @*/
+static int rpmfts_setattro(rpmftsObject * s, PyObject * n, PyObject * v)
+ /*@*/
{
- static int indent = 2;
- if (!(s && s->ftsp && s->fts))
- return -1;
- fprintf(fp, "FTS_%-7s %*s%s", ftsInfoStr(s->fts->fts_info),
- indent * (s->fts->fts_level < 0 ? 0 : s->fts->fts_level), "",
- s->fts->fts_name);
- return 0;
+if (_rpmfts_debug)
+fprintf(stderr, "*** rpmfts_setattro(%p[%s],%p[%s],%p[%s]) %d %d ftsp %p fts %p\n", s, lbl(s), n, lbl(n), v, lbl(v), s->ob_refcnt, s->active, s->ftsp, s->fts);
+ return PyObject_GenericSetAttr((PyObject *)s, n, v);
}
-/** \ingroup python
- */
-static PyObject * rpmfts_getattr(rpmftsObject * o, char * name)
+/* ---------- */
+
+static void rpmfts_free(/*@only@*/ PyObject * s)
+ /*@modifies s @*/
+{
+ _PyObject_GC_Del(s);
+}
+
+static PyObject * rpmfts_alloc(PyTypeObject * type, int nitems)
/*@*/
{
- return Py_FindMethod(rpmfts_methods, (PyObject *) o, name);
+ return PyType_GenericAlloc(type, nitems);
+}
+
+static void rpmfts_dealloc(/*@only@*/ rpmftsObject * s)
+ /*@modifies s @*/
+{
+ int xx;
+
+ xx = rpmfts_inactive(s);
+ s->roots = _free(s->roots);
+
+ PyObject_GC_UnTrack((PyObject *)s);
+ if (s->md_dict != NULL) {
+ _PyModule_Clear((PyObject *)s);
+ Py_DECREF(s->md_dict);
+ }
+ if (s->callbacks != NULL) {
+ _PyModule_Clear((PyObject *)s);
+ Py_DECREF(s->callbacks);
+ }
+ _PyObject_GC_Del((PyObject *)s);
}
-/** \ingroup python
- */
static int rpmfts_init(rpmftsObject * s, PyObject *args, PyObject *kwds)
/*@*/
{
@@ -366,9 +367,6 @@ static int rpmfts_init(rpmftsObject * s, PyObject *args, PyObject *kwds)
int options = -1;
int ignore = -1;
-if (_rpmfts_debug < 0)
-fprintf(stderr, "*** rpmfts_init(%p,%p,%p)\n", s, args, kwds);
-
if (!PyArg_ParseTuple(args, "|sii:rpmfts_init", &root, &options, &ignore))
return -1;
rpmfts_initialize(s, root, options, ignore);
@@ -376,53 +374,113 @@ fprintf(stderr, "*** rpmfts_init(%p,%p,%p)\n", s, args, kwds);
return 0;
}
-/** \ingroup python
- */
-static void rpmfts_free(/*@only@*/ rpmftsObject * s)
- /*@modifies s @*/
+static PyObject * rpmfts_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+ /*@*/
{
-if (_rpmfts_debug < 0)
-fprintf(stderr, "%p -- fts %p\n", s, s->ftsp);
+ rpmftsObject *s;
+ PyObject *o;
+ PyObject *n = NULL;
- if (s->ftsp) {
- (void) Fts_close(s->ftsp);
- s->ftsp = NULL;
- s->fts = NULL;
+ if ((s = PyObject_GC_New(rpmftsObject, type)) == NULL)
+ return NULL;
+
+ s->md_dict = PyDict_New();
+ if (s->md_dict == NULL)
+ goto fail;
+ s->callbacks = PyDict_New();
+ if (s->md_dict == NULL)
+ goto fail;
+ if (type->tp_name) {
+ char * name;
+ if ((name = strrchr(type->tp_name, '.')) != NULL)
+ name++;
+ else
+ name = type->tp_name;
+ n = PyString_FromString(name);
}
- s->roots = _free(s->roots);
+ if (n != NULL && PyDict_SetItemString(s->md_dict, "__name__", n) != 0)
+ goto fail;
+ if (PyDict_SetItemString(s->md_dict, "__doc__", Py_None) != 0)
+ goto fail;
+
+#define CONSTANT(_v) \
+ PyDict_SetItemString(s->md_dict, #_v, o=PyInt_FromLong(_v)); Py_DECREF(o)
+
+ CONSTANT(FTS_ROOTPARENTLEVEL);
+ CONSTANT(FTS_ROOTLEVEL);
+
+ CONSTANT(FTS_COMFOLLOW);
+ CONSTANT(FTS_LOGICAL);
+ CONSTANT(FTS_NOCHDIR);
+ CONSTANT(FTS_NOSTAT);
+ CONSTANT(FTS_PHYSICAL);
+ CONSTANT(FTS_SEEDOT);
+ CONSTANT(FTS_XDEV);
+ CONSTANT(FTS_WHITEOUT);
+ CONSTANT(FTS_OPTIONMASK);
+
+ CONSTANT(FTS_NAMEONLY);
+ CONSTANT(FTS_STOP);
+
+ CONSTANT(FTS_D);
+ CONSTANT(FTS_DC);
+ CONSTANT(FTS_DEFAULT);
+ CONSTANT(FTS_DNR);
+ CONSTANT(FTS_DOT);
+ CONSTANT(FTS_DP);
+ CONSTANT(FTS_ERR);
+ CONSTANT(FTS_F);
+ CONSTANT(FTS_NS);
+ CONSTANT(FTS_NSOK);
+ CONSTANT(FTS_SL);
+ CONSTANT(FTS_SLNONE);
+ CONSTANT(FTS_W);
+
+ CONSTANT(FTS_DONTCHDIR);
+ CONSTANT(FTS_SYMFOLLOW);
+
+ CONSTANT(FTS_AGAIN);
+ CONSTANT(FTS_FOLLOW);
+ CONSTANT(FTS_NOINSTR);
+ CONSTANT(FTS_SKIP);
- PyObject_Del((PyObject *)s);
-}
+ /* Perform additional initialization. */
+ if (rpmfts_init(s, args, kwds) < 0)
+ goto fail;
-/** \ingroup python
- */
-static PyObject * rpmfts_alloc(PyTypeObject * subtype, int nitems)
- /*@*/
-{
- PyObject * s = PyType_GenericAlloc(subtype, nitems);
+ Py_XDECREF(n);
+ PyObject_GC_Track((PyObject *)s);
+ return (PyObject *)s;
-if (_rpmfts_debug)
-fprintf(stderr, "*** rpmfts_alloc(%p,%d) ret %p\n", subtype, nitems, s);
- return s;
+ fail:
+ Py_XDECREF(n);
+ Py_DECREF(s);
+ return NULL;
}
-/** \ingroup python
- */
-static rpmftsObject * rpmfts_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
+static int rpmfts_traverse(rpmftsObject * s, visitproc visit, void * arg)
/*@*/
{
- rpmftsObject * s = PyObject_New(rpmftsObject, subtype);
+ if (s->md_dict != NULL)
+ return visit(s->md_dict, arg);
+ if (s->callbacks != NULL)
+ return visit(s->callbacks, arg);
+ return 0;
+}
- /* Perform additional initialization. */
- if (rpmfts_init(s, args, kwds) < 0) {
- rpmfts_free(s);
- return NULL;
- }
+static int rpmfts_print(rpmftsObject * s, FILE * fp, /*@unused@*/ int flags)
+ /*@globals fileSystem @*/
+ /*@modifies fp, fileSystem @*/
+{
+ static int indent = 2;
-if (_rpmfts_debug < 0)
-fprintf(stderr, "%p ++ fts %p\n", s, s->ftsp);
+ if (!(s && s->ftsp && s->fts))
+ return -1;
+ fprintf(fp, "FTS_%-7s %*s%s", ftsInfoStr(s->fts->fts_info),
+ indent * (s->fts->fts_level < 0 ? 0 : s->fts->fts_level), "",
+ s->fts->fts_name);
+ return 0;
- return s;
}
/**
@@ -443,7 +501,7 @@ PyTypeObject rpmfts_Type = {
/* methods */
(destructor) rpmfts_dealloc, /* tp_dealloc */
(printfunc) rpmfts_print, /* tp_print */
- (getattrfunc) rpmfts_getattr, /* tp_getattr */
+ (getattrfunc)0, /* tp_getattr */
(setattrfunc)0, /* tp_setattr */
(cmpfunc)0, /* tp_compare */
(reprfunc)0, /* tp_repr */
@@ -453,31 +511,30 @@ PyTypeObject rpmfts_Type = {
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
(reprfunc)0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
+ (getattrofunc) rpmfts_getattro, /* tp_getattro */
+ (setattrofunc) rpmfts_setattro, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | /* tp_flags */
+ Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE,
rpmfts_doc, /* tp_doc */
-#if Py_TPFLAGS_HAVE_ITER
- 0, /* tp_traverse */
+ (traverseproc) rpmfts_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
(getiterfunc) rpmfts_iter, /* tp_iter */
(iternextfunc) rpmfts_iternext, /* tp_iternext */
rpmfts_methods, /* tp_methods */
- 0, /* tp_members */
+ rpmfts_members, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
- 0, /* tp_dictoffset */
+ offsetof(rpmftsObject, md_dict),/* tp_dictoffset */
(initproc) rpmfts_init, /* tp_init */
- (allocfunc) rpmfts_alloc, /* tp_alloc */
- (newfunc) rpmfts_new, /* tp_new */
- (destructor) rpmfts_free, /* tp_free */
+ rpmfts_alloc, /* tp_alloc */
+ rpmfts_new, /* tp_new */
+ rpmfts_free, /* tp_free */
0, /* tp_is_gc */
-#endif
};
/*@=fullinitblock@*/
diff --git a/python/rpmfts-py.h b/python/rpmfts-py.h
index a9556b30b..56ebfdf09 100644
--- a/python/rpmfts-py.h
+++ b/python/rpmfts-py.h
@@ -9,6 +9,9 @@
typedef struct rpmftsObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
+ PyObject *callbacks;
+
/*@null@*/
const char ** roots;
int options;
diff --git a/python/rpmmi-py.h b/python/rpmmi-py.h
index bfa42fc07..9d6772106 100644
--- a/python/rpmmi-py.h
+++ b/python/rpmmi-py.h
@@ -13,6 +13,7 @@ typedef struct rpmmiObject_s rpmmiObject;
*/
struct rpmmiObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
rpmdbMatchIterator mi;
} ;
diff --git a/python/rpmrc-py.h b/python/rpmrc-py.h
index 50253866b..4ab119930 100644
--- a/python/rpmrc-py.h
+++ b/python/rpmrc-py.h
@@ -18,6 +18,7 @@ struct rpmrcObject_s {
#else
PyObject_HEAD
#endif
+ PyObject *md_dict; /*!< to look like PyModuleObject */
} ;
/*@unchecked@*/
diff --git a/python/rpmte-py.h b/python/rpmte-py.h
index 18b626704..3bce93523 100644
--- a/python/rpmte-py.h
+++ b/python/rpmte-py.h
@@ -9,6 +9,7 @@
typedef struct rpmteObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
rpmte te;
} rpmteObject;
diff --git a/python/rpmts-py.h b/python/rpmts-py.h
index 526b83817..9ca496d02 100644
--- a/python/rpmts-py.h
+++ b/python/rpmts-py.h
@@ -9,6 +9,7 @@
typedef struct rpmtsObject_s {
PyObject_HEAD
+ PyObject *md_dict; /*!< to look like PyModuleObject */
rpmts ts;
PyObject * keyList; /* keeps reference counts correct */
FD_t scriptFd;