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);
77 if (root ==
NULL) root =
"/";
84 nb = (ac + 1) *
sizeof(*s->
roots);
85 nb += strlen(root) + 1;
86 s->
roots = malloc(nb);
88 char *
t = (
char *) &s->
roots[ac + 1];
116 Py_BEGIN_ALLOW_THREADS
125 Py_BEGIN_ALLOW_THREADS
149 Py_BEGIN_ALLOW_THREADS
156 result = (PyObject *)s;
187 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"i:Debug", kwlist,
208 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"|sii:Open", kwlist,
209 &root, &options, &ignore))
212 xx = rpmfts_initialize(s, root, options, ignore);
215 return (PyObject *)
s;
228 result = rpmfts_step(s);
230 if (result ==
NULL) {
240 rpmfts_Children(
rpmftsObject * s, PyObject * args, PyObject * kwds)
245 char * kwlist[] = {
"instructions",
NULL};
248 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"i:Children", kwlist, &instr))
254 Py_BEGIN_ALLOW_THREADS
275 rpmfts_Set(
rpmftsObject * s, PyObject * args, PyObject * kwds)
280 char * kwlist[] = {
"instructions",
NULL};
283 if (!PyArg_ParseTupleAndKeywords(args, kwds,
"i:Set", kwlist, &instr))
298 {
"Debug", (PyCFunction)
rpmfts_Debug, METH_VARARGS|METH_KEYWORDS,
300 {
"open", (PyCFunction)rpmfts_Open, METH_VARARGS|METH_KEYWORDS,
302 {
"read", (PyCFunction)rpmfts_Read, METH_NOARGS,
304 {
"children",(PyCFunction)rpmfts_Children, METH_VARARGS|METH_KEYWORDS,
306 {
"close", (PyCFunction)rpmfts_Close, METH_NOARGS,
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}"},
332 return PyObject_GenericGetAttr(o, n);
339 return PyObject_GenericSetAttr(o, n, v);
349 return (PyObject *)
s;
362 return rpmfts_step(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))
414 return rpmfts_initialize(s, root, options, ignore);
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)
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;
544 PyObject_HEAD_INIT(&PyType_Type)
565 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
571 (getiterfunc) rpmfts_iter,
572 (iternextfunc) rpmfts_iternext,
static int rpmfts_setattro(PyObject *o, PyObject *n, PyObject *v)
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 *int type
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 char *size_t nb
fgets(3) analogue that reads \ continuations.
static PyObject * rpmfts_alloc(PyTypeObject *type, Py_ssize_t nitems)
static PyObject * rpmfts_Debug(rpmftsObject *s, PyObject *args, PyObject *kwds)
static PyObject * rpmfts_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
fprintf(stderr,"--> %s(%p,%p,%p) sig %p sigp %p\n", __FUNCTION__, dig, t, rsactx, sig, sigp)
static const char * ftsInfoStr(int fts_info)
FTSENT * Fts_read(FTS *sp)
Return next node in the file hierarchy traversal.
static int rpmfts_traverse(rpmftsObject *s, visitproc visit, void *arg)
int Fts_set(FTS *sp, FTSENT *p, int instr)
Modify the traversal for a file set member.
return Py_BuildValue("i", pkgKey)
static int rpmfts_init(rpmftsObject *s, PyObject *args, PyObject *kwds)
char * stpcpy(char *dest, const char *src)
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
int(* compare)(const void *, const void *)
int
Save source and expand field into target.
static void rpmfts_free(PyObject *s)
static struct PyMethodDef rpmfts_methods[]
static void rpmfts_debug(const char *msg, rpmftsObject *s)
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
#define FTS_ROOTPARENTLEVEL
struct rpmftsObject_s rpmftsObject
static PyMemberDef rpmfts_members[]