Mercurial > emacs
changeset 45551:811d06e337cb
(Fread_file_name_internal): Added brute-force
speed up for using predicate file-directory-p.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Tue, 28 May 2002 09:03:22 +0000 |
parents | acd09cfa0ecd |
children | 0c2a22313f16 |
files | src/fileio.c |
diffstat | 1 files changed, 30 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- 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); }