version 1.12, 2016/10/18 23:58:12 |
version 1.15, 2020/06/14 22:49:36 |
Line 62 static int fts_palloc(FTS *, size_t); |
|
Line 62 static int fts_palloc(FTS *, size_t); |
|
static FTSENT *fts_sort(FTS *, FTSENT *, int); |
static FTSENT *fts_sort(FTS *, FTSENT *, int); |
static unsigned short fts_stat(FTS *, FTSENT *); |
static unsigned short fts_stat(FTS *, FTSENT *); |
|
|
|
typedef int (*qsort_compar_proto)(const void *, const void *); |
|
|
#define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2]))) |
#define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2]))) |
#ifndef O_DIRECTORY |
|
#define O_DIRECTORY 0 |
|
#endif |
|
#ifndef O_CLOEXEC |
#ifndef O_CLOEXEC |
#define O_CLOEXEC 0 |
#define O_CLOEXEC 0 |
#endif |
#endif |
#ifndef PATH_MAX |
|
#define PATH_MAX 4096 |
|
#endif |
|
|
|
#define CLR(opt) (sp->fts_options &= ~(opt)) |
#define CLR(opt) (sp->fts_options &= ~(opt)) |
#define ISSET(opt) (sp->fts_options & (opt)) |
#define ISSET(opt) (sp->fts_options & (opt)) |
Line 84 fts_open(char * const *argv, int options, |
|
Line 80 fts_open(char * const *argv, int options, |
|
FTS *sp; |
FTS *sp; |
FTSENT *p, *root; |
FTSENT *p, *root; |
int nitems; |
int nitems; |
FTSENT *parent, *tmp; |
FTSENT *parent, *prev; |
|
|
/* Options check. */ |
/* Options check. */ |
if (options & ~FTS_OPTIONMASK) { |
if (options & ~FTS_OPTIONMASK) { |
Line 117 fts_open(char * const *argv, int options, |
|
Line 113 fts_open(char * const *argv, int options, |
|
parent->fts_level = FTS_ROOTPARENTLEVEL; |
parent->fts_level = FTS_ROOTPARENTLEVEL; |
|
|
/* Allocate/initialize root(s). */ |
/* Allocate/initialize root(s). */ |
for (root = NULL, nitems = 0; *argv; ++argv, ++nitems) { |
for (root = prev = NULL, nitems = 0; *argv; ++argv, ++nitems) { |
if ((p = fts_alloc(sp, *argv, strlen(*argv))) == NULL) |
if ((p = fts_alloc(sp, *argv, strlen(*argv))) == NULL) |
goto mem3; |
goto mem3; |
p->fts_level = FTS_ROOTLEVEL; |
p->fts_level = FTS_ROOTLEVEL; |
Line 139 fts_open(char * const *argv, int options, |
|
Line 135 fts_open(char * const *argv, int options, |
|
} else { |
} else { |
p->fts_link = NULL; |
p->fts_link = NULL; |
if (root == NULL) |
if (root == NULL) |
tmp = root = p; |
root = p; |
else { |
else |
tmp->fts_link = p; |
prev->fts_link = p; |
tmp = p; |
prev = p; |
} |
|
} |
} |
} |
} |
if (compar && nitems > 1) |
if (compar && nitems > 1) |
Line 592 fts_sort(FTS *sp, FTSENT *head, int nitems) |
|
Line 587 fts_sort(FTS *sp, FTSENT *head, int nitems) |
|
} |
} |
for (ap = sp->fts_array, p = head; p; p = p->fts_link) |
for (ap = sp->fts_array, p = head; p; p = p->fts_link) |
*ap++ = p; |
*ap++ = p; |
qsort(sp->fts_array, nitems, sizeof(FTSENT *), sp->fts_compar); |
qsort(sp->fts_array, nitems, sizeof(FTSENT *), |
|
(qsort_compar_proto)sp->fts_compar); |
for (head = *(ap = sp->fts_array); --nitems; ++ap) |
for (head = *(ap = sp->fts_array); --nitems; ++ap) |
ap[0]->fts_link = ap[1]; |
ap[0]->fts_link = ap[1]; |
ap[0]->fts_link = NULL; |
ap[0]->fts_link = NULL; |