projects
/
gnulib.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Make fflush after ungetc work on BSD platforms.
[gnulib.git]
/
lib
/
fts.c
diff --git
a/lib/fts.c
b/lib/fts.c
index
fa4d757
..
7956f72
100644
(file)
--- a/
lib/fts.c
+++ b/
lib/fts.c
@@
-1,11
+1,11
@@
/* Traverse a file hierarchy.
/* Traverse a file hierarchy.
- Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006
, 2007, 2008
Free Software Foundation, Inc.
- This program is free software
;
you can redistribute it and/or modify
+ This program is free software
:
you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version
2, or (at your option)
- any later version.
+ the Free Software Foundation; either version
3 of the License, or
+
(at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@
-13,8
+13,7
@@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/*-
* Copyright (c) 1990, 1993, 1994
/*-
* Copyright (c) 1990, 1993, 1994
@@
-121,7
+120,7
@@
enum Fts_stat
#endif
#ifndef __attribute__
#endif
#ifndef __attribute__
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
|| __STRICT_ANSI__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
# define __attribute__(x) /* empty */
# endif
#endif
# define __attribute__(x) /* empty */
# endif
#endif
@@
-138,6
+137,18
@@
enum Fts_stat
# define HAVE_OPENAT_SUPPORT 0
#endif
# define HAVE_OPENAT_SUPPORT 0
#endif
+#ifdef NDEBUG
+# define fts_assert(expr) ((void) 0)
+#else
+# define fts_assert(expr) \
+ do \
+ { \
+ if (!(expr)) \
+ abort (); \
+ } \
+ while (false)
+#endif
+
static FTSENT *fts_alloc (FTS *, const char *, size_t) internal_function;
static FTSENT *fts_build (FTS *, int) internal_function;
static void fts_lfree (FTSENT *) internal_function;
static FTSENT *fts_alloc (FTS *, const char *, size_t) internal_function;
static FTSENT *fts_build (FTS *, int) internal_function;
static void fts_lfree (FTSENT *) internal_function;
@@
-150,13
+161,13
@@
static unsigned short int fts_stat (FTS *, FTSENT *, bool) internal_function;
static int fts_safe_changedir (FTS *, FTSENT *, int, const char *)
internal_function;
static int fts_safe_changedir (FTS *, FTSENT *, int, const char *)
internal_function;
-#if _LGPL_PACKAGE
+#if GNULIB_FTS
+# include "fts-cycle.c"
+#else
static bool enter_dir (FTS *fts, FTSENT *ent) { return true; }
static void leave_dir (FTS *fts, FTSENT *ent) {}
static bool setup_dir (FTS *fts) { return true; }
static void free_dir (FTS *fts) {}
static bool enter_dir (FTS *fts, FTSENT *ent) { return true; }
static void leave_dir (FTS *fts, FTSENT *ent) {}
static bool setup_dir (FTS *fts) { return true; }
static void free_dir (FTS *fts) {}
-#else
-# include "fts-cycle.c"
#endif
#ifndef MAX
#endif
#ifndef MAX
@@
-236,8
+247,7
@@
fd_ring_clear (I_ring *fd_ring)
static void
fts_set_stat_required (FTSENT *p, bool required)
{
static void
fts_set_stat_required (FTSENT *p, bool required)
{
- if (p->fts_info != FTS_NSOK)
- abort ();
+ fts_assert (p->fts_info == FTS_NSOK);
p->fts_statp->st_size = (required
? FTS_STAT_REQUIRED
: FTS_NO_STAT_REQUIRED);
p->fts_statp->st_size = (required
? FTS_STAT_REQUIRED
: FTS_NO_STAT_REQUIRED);
@@
-274,8
+284,7
@@
internal_function
cwd_advance_fd (FTS *sp, int fd, bool chdir_down_one)
{
int old = sp->fts_cwd_fd;
cwd_advance_fd (FTS *sp, int fd, bool chdir_down_one)
{
int old = sp->fts_cwd_fd;
- if (old == fd && old != AT_FDCWD)
- abort ();
+ fts_assert (old != fd || old == AT_FDCWD);
if (chdir_down_one)
{
if (chdir_down_one)
{
@@
-675,7
+684,7
@@
fts_read (register FTS *sp)
/* If fts_build's call to fts_safe_changedir failed
because it was not able to fchdir into a
subdirectory, tell the caller. */
/* If fts_build's call to fts_safe_changedir failed
because it was not able to fchdir into a
subdirectory, tell the caller. */
- if (p->fts_errno)
+ if (p->fts_errno
&& p->fts_info != FTS_DNR
)
p->fts_info = FTS_ERR;
LEAVE_DIR (sp, p, "2");
return (p);
p->fts_info = FTS_ERR;
LEAVE_DIR (sp, p, "2");
return (p);
@@
-688,6
+697,7
@@
fts_read (register FTS *sp)
/* Move to the next node on this level. */
next: tmp = p;
if ((p = p->fts_link) != NULL) {
/* Move to the next node on this level. */
next: tmp = p;
if ((p = p->fts_link) != NULL) {
+ sp->fts_cur = p;
free(tmp);
/*
free(tmp);
/*
@@
-698,7
+708,6
@@
next: tmp = p;
if (p->fts_level == FTS_ROOTLEVEL) {
if (RESTORE_INITIAL_CWD(sp)) {
SET(FTS_STOP);
if (p->fts_level == FTS_ROOTLEVEL) {
if (RESTORE_INITIAL_CWD(sp)) {
SET(FTS_STOP);
- sp->fts_cur = p;
return (NULL);
}
fts_load(sp, p);
return (NULL);
}
fts_load(sp, p);
@@
-728,22
+737,15
@@
name: t = sp->fts_path + NAPPEND(p->fts_parent);
*t++ = '/';
memmove(t, p->fts_name, p->fts_namelen + 1);
check_for_dir:
*t++ = '/';
memmove(t, p->fts_name, p->fts_namelen + 1);
check_for_dir:
+ sp->fts_cur = p;
if (p->fts_info == FTS_NSOK)
{
if (p->fts_info == FTS_NSOK)
{
- enum Fts_stat need_stat = p->fts_statp->st_size;
- switch (need_stat)
- {
- case FTS_STAT_REQUIRED:
- p->fts_info = fts_stat(sp, p, false);
- break;
- case FTS_NO_STAT_REQUIRED:
- break;
- default:
- abort ();
- }
+ if (p->fts_statp->st_size == FTS_STAT_REQUIRED)
+ p->fts_info = fts_stat(sp, p, false);
+ else
+ fts_assert (p->fts_statp->st_size == FTS_NO_STAT_REQUIRED);
}
}
- sp->fts_cur = p;
if (p->fts_info == FTS_D)
{
/* Now that P->fts_statp is guaranteed to be valid,
if (p->fts_info == FTS_D)
{
/* Now that P->fts_statp is guaranteed to be valid,
@@
-763,6
+765,7
@@
check_for_dir:
/* Move up to the parent node. */
p = tmp->fts_parent;
/* Move up to the parent node. */
p = tmp->fts_parent;
+ sp->fts_cur = p;
free(tmp);
if (p->fts_level == FTS_ROOTPARENTLEVEL) {
free(tmp);
if (p->fts_level == FTS_ROOTPARENTLEVEL) {
@@
-775,8
+778,7
@@
check_for_dir:
return (sp->fts_cur = NULL);
}
return (sp->fts_cur = NULL);
}
- if (p->fts_info == FTS_NSOK)
- abort ();
+ fts_assert (p->fts_info != FTS_NSOK);
/* NUL terminate the file name. */
sp->fts_path[p->fts_pathlen] = '\0';
/* NUL terminate the file name. */
sp->fts_path[p->fts_pathlen] = '\0';
@@
-809,7
+811,6
@@
check_for_dir:
p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
if (p->fts_errno == 0)
LEAVE_DIR (sp, p, "3");
p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
if (p->fts_errno == 0)
LEAVE_DIR (sp, p, "3");
- sp->fts_cur = p;
return ISSET(FTS_STOP) ? NULL : p;
}
return ISSET(FTS_STOP) ? NULL : p;
}
@@
-1089,7
+1090,7
@@
mem1: saved_errno = errno;
new_len = len + _D_EXACT_NAMLEN (dp);
if (new_len < len) {
/*
new_len = len + _D_EXACT_NAMLEN (dp);
if (new_len < len) {
/*
- * In the unlikely even that we would end up
+ * In the unlikely even
t
that we would end up
* with a file name longer than SIZE_MAX, free up
* the current structure and the structures already
* allocated, then error out with ENAMETOOLONG.
* with a file name longer than SIZE_MAX, free up
* the current structure and the structures already
* allocated, then error out with ENAMETOOLONG.
@@
-1345,7
+1346,7
@@
fd_ring_check (FTS const *sp)
error (0, errno, "parent: %s", c2);
free (cwd);
free (c2);
error (0, errno, "parent: %s", c2);
free (cwd);
free (c2);
-
abort (
);
+
fts_assert (0
);
}
close (cwd_fd);
cwd_fd = parent_fd;
}
close (cwd_fd);
cwd_fd = parent_fd;
@@
-1403,7
+1404,7
@@
err: memset(sbp, 0, sizeof(struct stat));
return (p->fts_level == FTS_ROOTLEVEL ? FTS_D : FTS_DOT);
}
return (p->fts_level == FTS_ROOTLEVEL ? FTS_D : FTS_DOT);
}
-#if
_LGPL_PACKAGE
+#if
!GNULIB_FTS
{
/*
* Cycle detection is done by brute force when the directory
{
/*
* Cycle detection is done by brute force when the directory
@@
-1474,7
+1475,7
@@
fts_sort (FTS *sp, FTSENT *head, register size_t nitems)
* 40 so don't realloc one entry at a time.
*/
if (nitems > sp->fts_nitems) {
* 40 so don't realloc one entry at a time.
*/
if (nitems > sp->fts_nitems) {
-
struct _ftsent
**a;
+
FTSENT
**a;
sp->fts_nitems = nitems + 40;
if (SIZE_MAX / sizeof *a < sp->fts_nitems
sp->fts_nitems = nitems + 40;
if (SIZE_MAX / sizeof *a < sp->fts_nitems