From da46f04f2c88c210ddec0a1acf63868beeb34c63 Mon Sep 17 00:00:00 2001 From: "Kim F. Storm" Date: Tue, 28 May 2002 09:03:22 +0000 Subject: [PATCH] (Fread_file_name_internal): Added brute-force speed up for using predicate file-directory-p. --- src/fileio.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/fileio.c b/src/fileio.c index dbc5c7d9a54..2f658f9bee0 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -5911,15 +5911,36 @@ DEFUN ("read-file-name-internal", Fread_file_name_internal, Sread_file_name_inte if (NILP (Vread_file_name_predicate) || EQ (Vread_file_name_predicate, Qfile_exists_p)) return all; - GCPRO3 (all, comp, specdir); - count = specpdl_ptr - specpdl; - record_unwind_protect (read_file_name_cleanup, current_buffer->directory); - current_buffer->directory = realdir; - for (comp = Qnil; CONSP (all); all = XCDR (all)) - if (!NILP (call1 (Vread_file_name_predicate, XCAR (all)))) - comp = Fcons (XCAR (all), comp); - unbind_to (count, Qnil); - UNGCPRO; + +#ifndef VMS + if (EQ (Vread_file_name_predicate, Qfile_directory_p)) + { + /* Brute-force speed up for directory checking: + Discard strings which don't end in a slash. */ + for (comp = Qnil; CONSP (all); all = XCDR (all)) + { + Lisp_Object tem = XCAR (all); + int len; + if (STRINGP (tem) && + (len = XSTRING (tem)->size, len > 0) && + IS_DIRECTORY_SEP (XSTRING (tem)->data[len-1])) + comp = Fcons (tem, comp); + } + } + else +#endif + { + /* Must do it the hard (and slow) way. */ + GCPRO3 (all, comp, specdir); + count = specpdl_ptr - specpdl; + record_unwind_protect (read_file_name_cleanup, current_buffer->directory); + current_buffer->directory = realdir; + for (comp = Qnil; CONSP (all); all = XCDR (all)) + if (!NILP (call1 (Vread_file_name_predicate, XCAR (all)))) + comp = Fcons (XCAR (all), comp); + unbind_to (count, Qnil); + UNGCPRO; + } return Fnreverse (comp); } -- 2.39.5