# HG changeset patch # User Kim F. Storm # Date 1022576602 0 # Node ID 811d06e337cb9ebf9b3db46f255e675e417fbff4 # Parent acd09cfa0ecdc33ff39c5193e3a271e79ad1f7cc (Fread_file_name_internal): Added brute-force speed up for using predicate file-directory-p. diff -r acd09cfa0ecd -r 811d06e337cb src/fileio.c --- a/src/fileio.c Tue May 28 01:32:36 2002 +0000 +++ b/src/fileio.c Tue May 28 09:03:22 2002 +0000 @@ -5911,15 +5911,36 @@ 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); }