7 #include "structmember.h"
11 #define PyObject_HEAD int _PyObjectHead;
25 #define infoBit(_ix) (1 << (((unsigned)(_ix)) & 0x1f))
49 if (!(fts_info >= 1 && fts_info <= 14))
54 #define RPMFTS_CLOSE 0
56 #define RPMFTS_OPEN_LAZY 2
64 fprintf(stderr,
"*** %s(%p)", msg, s);
66 fprintf(stderr,
" %d %d ftsp %p fts %p\n", s->ob_refcnt, s->
active, s->
ftsp, s->
fts);
77 if (root == NULL) root =
"/";
84 nb = (ac + 1) *
sizeof(*s->
roots);
85 nb += strlen(root) + 1;
86 s->
roots = malloc(nb);
87 if (s->
roots != NULL) {
88 char *t = (
char *) &s->
roots[ac + 1];
115 if (s->
ftsp != NULL) {
116 Py_BEGIN_ALLOW_THREADS
124 if (s->
ftsp == NULL) {
125 Py_BEGIN_ALLOW_THREADS
141 PyObject * result = NULL;
149 Py_BEGIN_ALLOW_THREADS
154 if (s->
fts != NULL) {
156 result = (PyObject *)s;
184 char * kwlist[] = {
"debugLevel", NULL};
186 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"i:Debug", kwlist,
204 char * kwlist[] = {
"root",
"options",
"ignore", NULL};
207 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"|sii:Open", kwlist,
208 &root, &options, &ignore))
214 return (PyObject *)s;
229 if (result == NULL) {
244 char * kwlist[] = {
"instructions", NULL};
247 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"i:Children", kwlist, &instr))
253 Py_BEGIN_ALLOW_THREADS
279 char * kwlist[] = {
"instructions", NULL};
282 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"i:Set", kwlist, &instr))
288 return Py_BuildValue(
"i", rc);
297 {
"Debug", (PyCFunction)
rpmfts_Debug, METH_VARARGS|METH_KEYWORDS,
299 {
"open", (PyCFunction)
rpmfts_Open, METH_VARARGS|METH_KEYWORDS,
307 {
"set", (PyCFunction)
rpmfts_Set, METH_VARARGS|METH_KEYWORDS,
316 {
"__dict__",T_OBJECT,offsetof(
rpmftsObject, md_dict), READONLY,
318 {
"callbacks",T_OBJECT,offsetof(
rpmftsObject, callbacks), 0,
319 "Callback dictionary per fts_info state: FTS_{D|DC|DEFAULT|DNR|DOT|DP|ERR|F|INIT|NS|NSOK|SL|SLNONE|W}"},
321 "Option bit(s): FTS_{COMFOLLOW|LOGICAL|NOCHDIR|NOSTAT|PHYSICAL|SEEDOT|XDEV}"},
323 "Ignore bit(s): (1 << info) with info one of FTS_{D|DC|DEFAULT|DNR|DOT|DP|ERR|F|INIT|NS|NSOK|SL|SLNONE|W}"},
324 {NULL, 0, 0, 0, NULL}
331 return PyObject_GenericGetAttr(o, n);
338 return PyObject_GenericSetAttr(o, n, v);
348 return (PyObject *)s;
375 return PyType_GenericAlloc(type, nitems);
388 PyObject_GC_UnTrack((PyObject *)s);
390 _PyModule_Clear((PyObject *)s);
394 _PyModule_Clear((PyObject *)s);
397 _PyObject_GC_Del((PyObject *)s);
406 char * kwlist[] = {
"root",
"options",
"ignore", NULL};
409 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"|sii:rpmfts_init", kwlist,
410 &root, &options, &ignore))
417 static PyObject *
rpmfts_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
423 char * kwlist[] = {0};
426 if (!PyArg_ParseTupleAndKeywords(args, kwds,
":rpmfts_new", kwlist))
441 if ((name = strrchr(type->tp_name,
'.')) != NULL)
444 name = type->tp_name;
445 n = PyString_FromString(name);
447 if (n != NULL && PyDict_SetItemString(s->
md_dict,
"__name__", n) != 0)
449 if (PyDict_SetItemString(s->
md_dict,
"__doc__", Py_None) != 0)
452 #define CONSTANT(_v) \
453 PyDict_SetItemString(s->md_dict, #_v, o=PyInt_FromLong(_v)); Py_DECREF(o)
499 PyObject_GC_Track((PyObject *)s);
500 return (PyObject *)s;
524 if (!(s != NULL && s->
ftsp != NULL && s->
fts != NULL))
542 PyObject_HEAD_INIT(&PyType_Type)
563 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,