From: Kim F. Storm Date: Tue, 28 May 2002 09:03:22 +0000 (+0000) Subject: (Fread_file_name_internal): Added brute-force X-Git-Tag: ttn-vms-21-2-B4~14845 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=da46f04f2c88c210ddec0a1acf63868beeb34c63;p=emacs.git (Fread_file_name_internal): Added brute-force speed up for using predicate file-directory-p. --- 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); }