diff options
Diffstat (limited to 'src/dired.c')
-rw-r--r-- | src/dired.c | 93 |
1 files changed, 35 insertions, 58 deletions
diff --git a/src/dired.c b/src/dired.c index 5d7977bf024..e31fdf87ac2 100644 --- a/src/dired.c +++ b/src/dired.c @@ -51,13 +51,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "msdos.h" /* for fstatat */ #endif -static Lisp_Object Qdirectory_files; -static Lisp_Object Qdirectory_files_and_attributes; -static Lisp_Object Qfile_name_completion; -static Lisp_Object Qfile_name_all_completions; -static Lisp_Object Qfile_attributes; -static Lisp_Object Qfile_attributes_lessp; - static ptrdiff_t scmp (const char *, const char *, ptrdiff_t); static Lisp_Object file_attributes (int, char const *, Lisp_Object); @@ -183,10 +176,8 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full, /* Note: ENCODE_FILE and DECODE_FILE can GC because they can run run_pre_post_conversion_on_str which calls Lisp directly and indirectly. */ - if (STRING_MULTIBYTE (dirfilename)) - dirfilename = ENCODE_FILE (dirfilename); - encoded_directory = (STRING_MULTIBYTE (directory) - ? ENCODE_FILE (directory) : directory); + dirfilename = ENCODE_FILE (dirfilename); + encoded_directory = ENCODE_FILE (directory); /* Now *bufp is the compiled form of MATCH; don't call anything which might compile a new regexp until we're done with the loop! */ @@ -450,7 +441,6 @@ These are all file names in directory DIRECTORY which begin with FILE. */) } static int file_name_completion_stat (int, struct dirent *, struct stat *); -static Lisp_Object Qdefault_directory; static Lisp_Object file_name_completion (Lisp_Object file, Lisp_Object dirname, bool all_flag, @@ -490,7 +480,7 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, bool all_flag, /* Actually, this is not quite true any more: we do most of the completion work with decoded file names, but we still do some filtering based on the encoded file name. */ - encoded_file = STRING_MULTIBYTE (file) ? ENCODE_FILE (file) : file; + encoded_file = ENCODE_FILE (file); encoded_dir = ENCODE_FILE (Fdirectory_file_name (dirname)); @@ -642,23 +632,14 @@ file_name_completion (Lisp_Object file, Lisp_Object dirname, bool all_flag, name = DECODE_FILE (name); { - Lisp_Object regexps; + Lisp_Object regexps, table = (completion_ignore_case + ? Vascii_canon_table : Qnil); /* Ignore this element if it fails to match all the regexps. */ - if (completion_ignore_case) - { - for (regexps = Vcompletion_regexp_list; CONSP (regexps); - regexps = XCDR (regexps)) - if (fast_string_match_ignore_case (XCAR (regexps), name) < 0) - break; - } - else - { - for (regexps = Vcompletion_regexp_list; CONSP (regexps); - regexps = XCDR (regexps)) - if (fast_string_match (XCAR (regexps), name) < 0) - break; - } + for (regexps = Vcompletion_regexp_list; CONSP (regexps); + regexps = XCDR (regexps)) + if (fast_string_match_internal (XCAR (regexps), name, table) < 0) + break; if (CONSP (regexps)) continue; @@ -933,7 +914,6 @@ so last access time will always be midnight of that day. */) static Lisp_Object file_attributes (int fd, char const *name, Lisp_Object id_format) { - Lisp_Object values[12]; struct stat s; int lstat_result; @@ -960,10 +940,6 @@ file_attributes (int fd, char const *name, Lisp_Object id_format) if (lstat_result < 0) return Qnil; - values[0] = (S_ISLNK (s.st_mode) ? emacs_readlinkat (fd, name) - : S_ISDIR (s.st_mode) ? Qt : Qnil); - values[1] = make_number (s.st_nlink); - if (!(NILP (id_format) || EQ (id_format, Qinteger))) { block_input (); @@ -971,34 +947,35 @@ file_attributes (int fd, char const *name, Lisp_Object id_format) gname = stat_gname (&s); unblock_input (); } - if (uname) - values[2] = DECODE_SYSTEM (build_unibyte_string (uname)); - else - values[2] = make_fixnum_or_float (s.st_uid); - if (gname) - values[3] = DECODE_SYSTEM (build_unibyte_string (gname)); - else - values[3] = make_fixnum_or_float (s.st_gid); - - values[4] = make_lisp_time (get_stat_atime (&s)); - values[5] = make_lisp_time (get_stat_mtime (&s)); - values[6] = make_lisp_time (get_stat_ctime (&s)); - - /* If the file size is a 4-byte type, assume that files of sizes in - the 2-4 GiB range wrap around to negative values, as this is a - common bug on older 32-bit platforms. */ - if (sizeof (s.st_size) == 4) - values[7] = make_fixnum_or_float (s.st_size & 0xffffffffu); - else - values[7] = make_fixnum_or_float (s.st_size); filemodestring (&s, modes); - values[8] = make_string (modes, 10); - values[9] = Qt; - values[10] = INTEGER_TO_CONS (s.st_ino); - values[11] = INTEGER_TO_CONS (s.st_dev); - return Flist (sizeof (values) / sizeof (values[0]), values); + return CALLN (Flist, + (S_ISLNK (s.st_mode) ? emacs_readlinkat (fd, name) + : S_ISDIR (s.st_mode) ? Qt : Qnil), + make_number (s.st_nlink), + (uname + ? DECODE_SYSTEM (build_unibyte_string (uname)) + : make_fixnum_or_float (s.st_uid)), + (gname + ? DECODE_SYSTEM (build_unibyte_string (gname)) + : make_fixnum_or_float (s.st_gid)), + make_lisp_time (get_stat_atime (&s)), + make_lisp_time (get_stat_mtime (&s)), + make_lisp_time (get_stat_ctime (&s)), + + /* If the file size is a 4-byte type, assume that + files of sizes in the 2-4 GiB range wrap around to + negative values, as this is a common bug on older + 32-bit platforms. */ + make_fixnum_or_float (sizeof (s.st_size) == 4 + ? s.st_size & 0xffffffffu + : s.st_size), + + make_string (modes, 10), + Qt, + INTEGER_TO_CONS (s.st_ino), + INTEGER_TO_CONS (s.st_dev)); } DEFUN ("file-attributes-lessp", Ffile_attributes_lessp, Sfile_attributes_lessp, 2, 2, 0, |