diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2017-07-31 12:31:02 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2017-07-31 12:56:51 -0700 |
commit | 3a8d0cc825635e07da2a90c4ac987b476fc9b05d (patch) | |
tree | 7a18ef1a777007f05feff6a35ebadc4338330906 /m4 | |
parent | 192342a3a93a2e467ab589ae2d1ffd5e7acf1398 (diff) | |
download | emacs-3a8d0cc825635e07da2a90c4ac987b476fc9b05d.tar.gz |
Avoid most stat calls when completing file names
* admin/merge-gnulib (GNULIB_MODULES): Add d-type.
* lib/gnulib.mk.in, m4/gnulib-comp.m4: Regenerate.
* m4/d-type.m4: New file, copied from gnulib.
* src/dired.c (DT_UNKNOWN, DT_DIR, DT_LINK)
[!HAVE_STRUCT_DIRENT_D_TYPE]: New constants.
(dirent_type): New function.
(file_name_completion): Use it, to avoid unnecessary calls to
stat-like functions on GNU/Linux and other platforms with d_type.
(file_name_completion_stat): Just follow the link; there is no
need to try first with AT_SYMLINK_NOFOLLOW since the directory
entry was already checked to exist.
Diffstat (limited to 'm4')
-rw-r--r-- | m4/d-type.m4 | 32 | ||||
-rw-r--r-- | m4/gnulib-comp.m4 | 3 |
2 files changed, 35 insertions, 0 deletions
diff --git a/m4/d-type.m4 b/m4/d-type.m4 new file mode 100644 index 00000000000..c819fc02f84 --- /dev/null +++ b/m4/d-type.m4 @@ -0,0 +1,32 @@ +# serial 12 + +dnl From Jim Meyering. +dnl +dnl Check whether struct dirent has a member named d_type. +dnl + +# Copyright (C) 1997, 1999-2004, 2006, 2009-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_CHECK_TYPE_STRUCT_DIRENT_D_TYPE], + [AC_CACHE_CHECK([for d_type member in directory struct], + [gl_cv_struct_dirent_d_type], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include <sys/types.h> +#include <dirent.h> + ]], + [[struct dirent dp; dp.d_type = 0;]])], + [gl_cv_struct_dirent_d_type=yes], + [gl_cv_struct_dirent_d_type=no]) + ] + ) + if test $gl_cv_struct_dirent_d_type = yes; then + AC_DEFINE([HAVE_STRUCT_DIRENT_D_TYPE], [1], + [Define if there is a member named d_type in the struct describing + directory headers.]) + fi + ] +) diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 index 2f135773930..188c116c851 100644 --- a/m4/gnulib-comp.m4 +++ b/m4/gnulib-comp.m4 @@ -61,6 +61,7 @@ AC_DEFUN([gl_EARLY], # Code from module crypto/sha1: # Code from module crypto/sha256: # Code from module crypto/sha512: + # Code from module d-type: # Code from module diffseq: # Code from module dirent: # Code from module dirfd: @@ -199,6 +200,7 @@ AC_DEFUN([gl_INIT], gl_SHA1 gl_SHA256 gl_SHA512 + gl_CHECK_TYPE_STRUCT_DIRENT_D_TYPE gl_DIRENT_H AC_REQUIRE([gl_C99_STRTOLD]) gl_FUNC_DUP2 @@ -968,6 +970,7 @@ AC_DEFUN([gl_FILE_LIST], [ m4/count-leading-zeros.m4 m4/count-one-bits.m4 m4/count-trailing-zeros.m4 + m4/d-type.m4 m4/dirent_h.m4 m4/dirfd.m4 m4/dup2.m4 |