#include <rmsdef.h>
#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
/* The d_nameln member of a struct dirent includes the '\0' character
on some systems, but not on others. What's worse, you can't tell
at compile-time which one it will be, since it really depends on
#include "lisp.h"
#include "buffer.h"
#include "commands.h"
-
+#include "charset.h"
+#include "coding.h"
#include "regex.h"
/* Returns a search buffer, with a fastmap allocated and ready to go. */
#define min(a, b) ((a) < (b) ? (a) : (b))
-/* Encode the file name NAME using the specified coding system
- for file names, if any. */
-#define ENCODE_FILE(name) \
- (! NILP (Vfile_name_coding_system) \
- && XFASTINT (Vfile_name_coding_system) != 0 \
- ? Fencode_coding_string (name, Vfile_name_coding_system, Qt) \
- : name)
-
/* if system does not have symbolic links, it does not have lstat.
In that case, use ordinary stat instead. */
extern int completion_ignore_case;
extern Lisp_Object Vcompletion_regexp_list;
-extern Lisp_Object Vfile_name_coding_system;
+extern Lisp_Object Vfile_name_coding_system, Vdefault_file_name_coding_system;
Lisp_Object Vcompletion_ignored_extensions;
Lisp_Object Qcompletion_ignore_case;
Lisp_Object encoded_directory;
Lisp_Object handler;
struct re_pattern_buffer *bufp;
+ int needsep = 0;
+ struct gcpro gcpro1, gcpro2;
/* If the file name has special constructs in it,
call the corresponding file handler. */
return Ffuncall (6, args);
}
- {
- struct gcpro gcpro1, gcpro2;
-
- /* Because of file name handlers, these functions might call
+ /* Because of file name handlers, these functions might call
Ffuncall, and cause a GC. */
- GCPRO1 (match);
- directory = Fexpand_file_name (directory, Qnil);
- UNGCPRO;
- GCPRO2 (match, directory);
- dirfilename = Fdirectory_file_name (directory);
- UNGCPRO;
- }
+ GCPRO1 (match);
+ directory = Fexpand_file_name (directory, Qnil);
+ UNGCPRO;
+ GCPRO2 (match, directory);
+ dirfilename = Fdirectory_file_name (directory);
+ UNGCPRO;
if (!NILP (match))
{
because we do make multibyte strings if the contents warrant. */
#ifdef VMS
bufp = compile_pattern (match, 0,
- buffer_defaults.downcase_table->contents, 0, 1);
+ buffer_defaults.downcase_table, 0, 1);
#else
- bufp = compile_pattern (match, 0, 0, 0, 1);
+ bufp = compile_pattern (match, 0, Qnil, 0, 1);
#endif
}
report_file_error ("Opening directory", Fcons (directory, Qnil));
list = Qnil;
- dirnamelen = XSTRING (encoded_directory)->size;
+ dirnamelen = STRING_BYTES (XSTRING (encoded_directory));
re_match_object = Qt;
+ /* Decide whether we need to add a directory separator. */
+#ifndef VMS
+ if (dirnamelen == 0
+ || !IS_ANY_SEP (XSTRING (encoded_directory)->data[dirnamelen - 1]))
+ needsep = 1;
+#endif /* not VMS */
+
+ GCPRO2 (encoded_directory, list);
+
/* Loop reading blocks */
while (1)
{
{
int afterdirindex = dirnamelen;
int total = len + dirnamelen;
- int needsep = 0;
-
- /* Decide whether we need to add a directory separator. */
-#ifndef VMS
- if (dirnamelen == 0
- || !IS_ANY_SEP (XSTRING (encoded_directory)->data[dirnamelen - 1]))
- needsep = 1;
-#endif /* VMS */
+ int nchars;
- name = make_uninit_string (total + needsep);
+ name = make_uninit_multibyte_string (total + needsep,
+ total + needsep);
bcopy (XSTRING (encoded_directory)->data, XSTRING (name)->data,
dirnamelen);
if (needsep)
XSTRING (name)->data[afterdirindex++] = DIRECTORY_SEP;
bcopy (dp->d_name,
XSTRING (name)->data + afterdirindex, len);
+ nchars = chars_in_text (XSTRING (name)->data,
+ afterdirindex + len);
+ XSTRING (name)->size = nchars;
+ if (nchars == STRING_BYTES (XSTRING (name)))
+ SET_STRING_BYTES (XSTRING (name), -1);
}
else
name = make_string (dp->d_name, len);
- if (! NILP (Vfile_name_coding_system))
- name = Fdecode_coding_string (name, Vfile_name_coding_system,
- Qt);
+ name = DECODE_FILE (name);
list = Fcons (name, list);
}
}
}
closedir (d);
+ UNGCPRO;
if (!NILP (nosort))
return list;
return Fsort (Fnreverse (list), Qstring_lessp);
return file_name_completion (file, directory, 1, 0);
}
+static int file_name_completion_stat ();
+
Lisp_Object
file_name_completion (file, dirname, all_flag, ver_flag)
Lisp_Object file, dirname;
name = make_string (dp->d_name, len);
if (all_flag)
{
- if (! NILP (Vfile_name_coding_system))
- name = Fdecode_coding_string (name,
- Vfile_name_coding_system, Qt);
+ name = DECODE_FILE (name);
bestmatch = Fcons (name, bestmatch);
}
else
if (all_flag || NILP (bestmatch))
{
- if (! NILP (Vfile_name_coding_system)
- && STRINGP (bestmatch))
- bestmatch = Fdecode_coding_string (bestmatch,
- Vfile_name_coding_system, Qt);
+ if (STRINGP (bestmatch))
+ bestmatch = DECODE_FILE (bestmatch);
return bestmatch;
}
if (matchcount == 1 && bestmatchsize == XSTRING (file)->size)
make_number (bestmatchsize));
/* Now that we got the right initial segment of BESTMATCH,
decode it from the coding system in use. */
- if (! NILP (Vfile_name_coding_system))
- bestmatch = Fdecode_coding_string (bestmatch,
- Vfile_name_coding_system, Qt);
+ bestmatch = DECODE_FILE (bestmatch);
return bestmatch;
quit:
return Fsignal (Qquit, Qnil);
}
+static int
file_name_completion_stat (dirname, dp, st_addr)
Lisp_Object dirname;
DIRENTRY *dp;
return Flist (sizeof(values) / sizeof(values[0]), values);
}
\f
+void
syms_of_dired ()
{
Qdirectory_files = intern ("directory-files");