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,
static int rpmfts_setattro(PyObject *o, PyObject *n, PyObject *v)
static PyObject * rpmfts_Set(rpmftsObject *s, PyObject *args, PyObject *kwds)
static PyObject * rpmfts_step(rpmftsObject *s)
static const char * ftsInfoStrings[]
FTS * Fts_open(char *const *argv, int options, int(*compar)(const FTSENT **, const FTSENT **))
Create a handle for file hierarchy traversal.
static PyObject * rpmfts_iter(rpmftsObject *s)
FTSENT * Fts_children(FTS *sp, int instr)
Return list of children of the current node.
static int rpmfts_print(rpmftsObject *s, FILE *fp, int flags)
static PyObject * rpmfts_alloc(PyTypeObject *type, Py_ssize_t nitems)
static PyObject * rpmfts_Debug(rpmftsObject *s, PyObject *args, PyObject *kwds)
static PyObject * rpmfts_Close(rpmftsObject *s)
static PyObject * rpmfts_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static int rpmfts_initialize(rpmftsObject *s, const char *root, int options, int ignore)
static PyObject * rpmfts_Read(rpmftsObject *s)
static int rpmfts_state(rpmftsObject *s, int nactive)
static PyObject * rpmfts_Children(rpmftsObject *s, PyObject *args, PyObject *kwds)
static const char * ftsInfoStr(int fts_info)
static struct PyMethodDef rpmfts_methods[]
static PyObject * rpmfts_Open(rpmftsObject *s, PyObject *args, PyObject *kwds)
FTSENT * Fts_read(FTS *sp)
Return next node in the file hierarchy traversal.
static int rpmfts_traverse(rpmftsObject *s, visitproc visit, void *arg)
static PyObject * rpmfts_iternext(rpmftsObject *s)
int Fts_set(FTS *sp, FTSENT *p, int instr)
Modify the traversal for a file set member.
static int rpmfts_init(rpmftsObject *s, PyObject *args, PyObject *kwds)
char * stpcpy(char *dest, const char *src)
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
struct rpmftsObject_s rpmftsObject
int Fts_close(FTS *sp)
Destroy a file hierarchy traversal handle.
static PyObject * rpmfts_getattro(PyObject *o, PyObject *n)
static void rpmfts_dealloc(rpmftsObject *s)
PyObject_HEAD PyObject * md_dict
static void rpmfts_free(PyObject *s)
static void rpmfts_debug(const char *msg, rpmftsObject *s)
int(* compare)(const void *, const void *)
#define FTS_ROOTPARENTLEVEL
static PyMemberDef rpmfts_members[]