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,
" %u %d ftsp %p fts %p\n", (
unsigned) 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;
185 char * kwlist[] = {
"debugLevel", NULL};
187 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"i:Debug", kwlist,
205 char * kwlist[] = {
"root",
"options",
"ignore", NULL};
208 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"|sii:Open", kwlist,
209 &root, &options, &ignore))
215 return (PyObject *)s;
230 if (result == NULL) {
245 char * kwlist[] = {
"instructions", NULL};
248 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"i:Children", kwlist, &instr))
254 Py_BEGIN_ALLOW_THREADS
280 char * kwlist[] = {
"instructions", NULL};
283 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"i:Set", kwlist, &instr))
289 return Py_BuildValue(
"i", rc);
298 {
"Debug", (PyCFunction)
rpmfts_Debug, METH_VARARGS|METH_KEYWORDS,
300 {
"open", (PyCFunction)
rpmfts_Open, METH_VARARGS|METH_KEYWORDS,
308 {
"set", (PyCFunction)
rpmfts_Set, METH_VARARGS|METH_KEYWORDS,
317 {
"__dict__",T_OBJECT,offsetof(
rpmftsObject, md_dict), READONLY,
319 {
"callbacks",T_OBJECT,offsetof(
rpmftsObject, callbacks), 0,
320 "Callback dictionary per fts_info state: FTS_{D|DC|DEFAULT|DNR|DOT|DP|ERR|F|INIT|NS|NSOK|SL|SLNONE|W}"},
322 "Option bit(s): FTS_{COMFOLLOW|LOGICAL|NOCHDIR|NOSTAT|PHYSICAL|SEEDOT|XDEV}"},
324 "Ignore bit(s): (1 << info) with info one of FTS_{D|DC|DEFAULT|DNR|DOT|DP|ERR|F|INIT|NS|NSOK|SL|SLNONE|W}"},
325 {NULL, 0, 0, 0, NULL}
332 return PyObject_GenericGetAttr(o, n);
339 return PyObject_GenericSetAttr(o, n, v);
349 return (PyObject *)s;
376 return PyType_GenericAlloc(type, nitems);
389 PyObject_GC_UnTrack((PyObject *)s);
391 _PyModule_Clear((PyObject *)s);
395 _PyModule_Clear((PyObject *)s);
398 _PyObject_GC_Del((PyObject *)s);
407 char * kwlist[] = {
"root",
"options",
"ignore", NULL};
410 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"|sii:rpmfts_init", kwlist,
411 &root, &options, &ignore))
418 static PyObject *
rpmfts_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
424 char * kwlist[] = {0};
427 if (!PyArg_ParseTupleAndKeywords(args, kwds,
":rpmfts_new", kwlist))
442 if ((name = strrchr(type->tp_name,
'.')) != NULL)
445 name = type->tp_name;
446 n = PyString_FromString(name);
448 if (n != NULL && PyDict_SetItemString(s->
md_dict,
"__name__", n) != 0)
450 if (PyDict_SetItemString(s->
md_dict,
"__doc__", Py_None) != 0)
453 #define CONSTANT(_v) \
454 PyDict_SetItemString(s->md_dict, #_v, o=PyInt_FromLong(_v)); Py_XDECREF(o)
500 PyObject_GC_Track((PyObject *)s);
501 return (PyObject *)s;
526 if (!(s != NULL && s->
ftsp != NULL && s->
fts != NULL))
544 PyObject_HEAD_INIT(&PyType_Type)
565 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,