annotate src/dired.c @ 1869:30eb06b22ae4

* fileio.c (Fdo_auto_save): If NO_MESSAGE is non-nil, don't tell users that buffers have shrunk a lot. This is called when Emacs is crashing, so we don't want to run any code that isn't absolutely necessary. Also, autosave buffers which don't have specially handled autosave file names first. * fileio.c (Fexpand_file_name): Pass DEFALT through Fexpand_file_name before using it. * fileio.c (Fexpand_file_name): Doc fix.
author Jim Blandy <jimb@redhat.com>
date Sun, 14 Feb 1993 14:37:33 +0000
parents a03b87a92614
children cb164a9e44ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 /* Lisp functions for making directory listings.
1173
4e4ade70cf7e Update copyright year.
Richard M. Stallman <rms@gnu.org>
parents: 1172
diff changeset
2 Copyright (C) 1985, 1986, 1992 Free Software Foundation, Inc.
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 the Free Software Foundation; either version 1, or (at your option)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 any later version.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 #include <stdio.h>
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 #include <sys/types.h>
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 #include <sys/stat.h>
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 #include "config.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
1172
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
27 #ifdef VMS
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
28 #include <string.h>
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
29 #include <rms.h>
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
30 #include <rmsdef.h>
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
31 #endif
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
32
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 #ifdef SYSV_SYSTEM_DIR
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 #include <dirent.h>
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 #define DIRENTRY struct dirent
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 #define NAMLEN(p) strlen (p->d_name)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 #else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 #ifdef NONSYSTEM_DIR_LIBRARY
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 #include "ndir.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 #else /* not NONSYSTEM_DIR_LIBRARY */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 #include <sys/dir.h>
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 #endif /* not NONSYSTEM_DIR_LIBRARY */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 #define DIRENTRY struct direct
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 #define NAMLEN(p) p->d_namlen
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 extern DIR *opendir ();
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 extern struct direct *readdir ();
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 #include "lisp.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 #include "buffer.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 #include "commands.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 #include "regex.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 #define min(a, b) ((a) < (b) ? (a) : (b))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 /* if system does not have symbolic links, it does not have lstat.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 In that case, use ordinary stat instead. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 #ifndef S_IFLNK
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 #define lstat stat
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
70 extern Lisp_Object Ffind_file_name_handler ();
1509
9675ae1d95c2 * dired.c (find_file_handler): Declare this extern.
Jim Blandy <jimb@redhat.com>
parents: 1173
diff changeset
71
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 Lisp_Object Vcompletion_ignored_extensions;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 Lisp_Object Qcompletion_ignore_case;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
75
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
76 Lisp_Object Qdirectory_files;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
77 Lisp_Object Qfile_name_completion;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
78 Lisp_Object Qfile_name_all_completions;
847
8d43bfe19803 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 843
diff changeset
79 Lisp_Object Qfile_attributes;
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82 "Return a list of names of files in DIRECTORY.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83 There are three optional arguments:\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84 If FULL is non-nil, absolute pathnames of the files are returned.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 If MATCH is non-nil, only pathnames containing that regexp are returned.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 NOSORT is useful if you plan to sort the result yourself.")
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 (dirname, full, match, nosort)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 Lisp_Object dirname, full, match, nosort;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 DIR *d;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 int length;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 Lisp_Object list, name;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
94 Lisp_Object handler;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
95
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
96 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
97 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
98 handler = Ffind_file_name_handler (dirname);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
99 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
100 {
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
101 Lisp_Object args[6];
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
102
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
103 args[0] = handler;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
104 args[1] = Qdirectory_files;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
105 args[2] = dirname;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
106 args[3] = full;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
107 args[4] = match;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
108 args[5] = nosort;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
109 return Ffuncall (6, args);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
110 }
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
112 if (!NILP (match))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 CHECK_STRING (match, 3);
808
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
115
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
116 /* MATCH might be a flawed regular expression. Rather than
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
117 catching and signalling our own errors, we just call
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
118 compile_pattern to do the work for us. */
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 #ifdef VMS
1596
0e105bd23f44 * systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents: 1509
diff changeset
120 compile_pattern (match, &searchbuf, 0,
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 buffer_defaults.downcase_table->contents);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 #else
808
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
123 compile_pattern (match, &searchbuf, 0, 0);
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 dirname = Fexpand_file_name (dirname, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 if (!(d = opendir (XSTRING (Fdirectory_file_name (dirname))->data)))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 report_file_error ("Opening directory", Fcons (dirname, Qnil));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 list = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132 length = XSTRING (dirname)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 /* Loop reading blocks */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 while (1)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 DIRENTRY *dp = readdir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 int len;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 if (!dp) break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 len = NAMLEN (dp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 if (dp->d_ino)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
144 if (NILP (match)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 || (0 <= re_search (&searchbuf, dp->d_name, len, 0, len, 0)))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
147 if (!NILP (full))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 int index = XSTRING (dirname)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 int total = len + index;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 #ifndef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 if (length == 0
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 || XSTRING (dirname)->data[length - 1] != '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 total++;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 name = make_uninit_string (total);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 bcopy (XSTRING (dirname)->data, XSTRING (name)->data,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 index);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 #ifndef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 if (length == 0
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 || XSTRING (dirname)->data[length - 1] != '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 XSTRING (name)->data[index++] = '/';
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 bcopy (dp->d_name, XSTRING (name)->data + index, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 name = make_string (dp->d_name, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 list = Fcons (name, list);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 closedir (d);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
174 if (!NILP (nosort))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 return list;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 return Fsort (Fnreverse (list), Qstring_lessp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 Lisp_Object file_name_completion ();
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 2, 2, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 "Complete file name FILE in directory DIR.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 Returns the longest string\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 common to all filenames in DIR that start with FILE.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 If there is only one and FILE matches it exactly, returns t.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 Returns nil if DIR contains no name starting with FILE.")
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 (file, dirname)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 Lisp_Object file, dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
191 Lisp_Object handler;
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 /* Don't waste time trying to complete a null string.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 Besides, this case happens when user is being asked for
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 a directory name and has supplied one ending in a /.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 We would not want to add anything in that case
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 even if there are some unique characters in that directory. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 if (XTYPE (file) == Lisp_String && XSTRING (file)->size == 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 return file;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
199
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
200 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
201 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
202 handler = Ffind_file_name_handler (dirname);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
203 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
204 return call3 (handler, Qfile_name_completion, file, dirname);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
205
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 return file_name_completion (file, dirname, 0, 0);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 DEFUN ("file-name-all-completions", Ffile_name_all_completions,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 Sfile_name_all_completions, 2, 2, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 "Return a list of all completions of file name FILE in directory DIR.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 These are all file names in directory DIR which begin with FILE.")
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 (file, dirname)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 Lisp_Object file, dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
216 Lisp_Object handler;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
217
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
218 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
219 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
220 handler = Ffind_file_name_handler (dirname);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
221 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
222 return call3 (handler, Qfile_name_all_completions, file, dirname);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
223
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 return file_name_completion (file, dirname, 1, 0);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 Lisp_Object
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 file_name_completion (file, dirname, all_flag, ver_flag)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 Lisp_Object file, dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 int all_flag, ver_flag;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 DIR *d;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 DIRENTRY *dp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 int bestmatchsize, skip;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 register int compare, matchsize;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 unsigned char *p1, *p2;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 int matchcount = 0;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 Lisp_Object bestmatch, tem, elt, name;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 struct stat st;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 int directoryp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 int passcount;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 int count = specpdl_ptr - specpdl;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 extern DIRENTRY * readdirver ();
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 DIRENTRY *((* readfunc) ());
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 /* Filename completion on VMS ignores case, since VMS filesys does. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 specbind (Qcompletion_ignore_case, Qt);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 readfunc = readdir;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 if (ver_flag)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 readfunc = readdirver;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 file = Fupcase (file);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 #else /* not VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 CHECK_STRING (file, 0);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 #endif /* not VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 dirname = Fexpand_file_name (dirname, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 bestmatch = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 /* With passcount = 0, ignore files that end in an ignored extension.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 If nothing found then try again with passcount = 1, don't ignore them.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 If looking for all completions, start with passcount = 1,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 so always take even the ignored ones.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 ** It would not actually be helpful to the user to ignore any possible
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 completions when making a list of them.** */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
270 for (passcount = !!all_flag; NILP (bestmatch) && passcount < 2; passcount++)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 if (!(d = opendir (XSTRING (Fdirectory_file_name (dirname))->data)))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 report_file_error ("Opening directory", Fcons (dirname, Qnil));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 /* Loop reading blocks */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 /* (att3b compiler bug requires do a null comparison this way) */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 while (1)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 DIRENTRY *dp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 int len;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 dp = (*readfunc) (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 #else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 dp = readdir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 if (!dp) break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 len = NAMLEN (dp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
291 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 goto quit;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 if (!dp->d_ino
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 || len < XSTRING (file)->size
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 || 0 <= scmp (dp->d_name, XSTRING (file)->data,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 XSTRING (file)->size))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 if (file_name_completion_stat (dirname, dp, &st) < 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 directoryp = ((st.st_mode & S_IFMT) == S_IFDIR);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 tem = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 if (!directoryp)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 /* Compare extensions-to-be-ignored against end of this file name */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 /* if name is not an exact match against specified string */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 if (!passcount && len > XSTRING (file)->size)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 /* and exit this for loop if a match is found */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 for (tem = Vcompletion_ignored_extensions;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 CONSP (tem); tem = XCONS (tem)->cdr)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 elt = XCONS (tem)->car;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 if (XTYPE (elt) != Lisp_String) continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 skip = len - XSTRING (elt)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 if (skip < 0) continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 if (0 <= scmp (dp->d_name + skip,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 XSTRING (elt)->data,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 XSTRING (elt)->size))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 /* Unless an ignored-extensions match was found,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 process this name as a completion */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 if (passcount || !CONSP (tem))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 /* Update computation of how much all possible completions match */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 matchcount++;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
334 if (all_flag || NILP (bestmatch))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 /* This is a possible completion */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 if (directoryp)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 /* This completion is a directory; make it end with '/' */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 name = Ffile_name_as_directory (make_string (dp->d_name, len));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 name = make_string (dp->d_name, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 if (all_flag)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 bestmatch = Fcons (name, bestmatch);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 bestmatch = name;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 bestmatchsize = XSTRING (name)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 compare = min (bestmatchsize, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 p1 = XSTRING (bestmatch)->data;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 p2 = (unsigned char *) dp->d_name;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 matchsize = scmp(p1, p2, compare);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 if (matchsize < 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 matchsize = compare;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 /* If this dirname all matches,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 see if implicit following slash does too. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 if (directoryp
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 && compare == matchsize
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 && bestmatchsize > matchsize
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 && p1[matchsize] == '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 matchsize++;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 bestmatchsize = min (matchsize, bestmatchsize);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 closedir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 unbind_to (count, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
378 if (all_flag || NILP (bestmatch))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 return bestmatch;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 if (matchcount == 1 && bestmatchsize == XSTRING (file)->size)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 return Qt;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 return Fsubstring (bestmatch, make_number (0), make_number (bestmatchsize));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 quit:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 if (d) closedir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 Vquit_flag = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 return Fsignal (Qquit, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 file_name_completion_stat (dirname, dp, st_addr)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 Lisp_Object dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 DIRENTRY *dp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 struct stat *st_addr;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 int len = NAMLEN (dp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 int pos = XSTRING (dirname)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 char *fullname = (char *) alloca (len + pos + 2);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 bcopy (XSTRING (dirname)->data, fullname, pos);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 #ifndef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 if (fullname[pos - 1] != '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 fullname[pos++] = '/';
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 bcopy (dp->d_name, fullname + pos, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 fullname[pos + len] = 0;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 return stat (fullname, st_addr);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409
1172
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
410 #ifdef VMS
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
411
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
412 DEFUN ("file-name-all-versions", Ffile_name_all_versions,
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
413 Sfile_name_all_versions, 2, 2, 0,
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
414 "Return a list of all versions of file name FILE in directory DIR.")
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
415 (file, dirname)
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
416 Lisp_Object file, dirname;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
417 {
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
418 return file_name_completion (file, dirname, 1, 1);
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
419 }
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
420
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
421 DEFUN ("file-version-limit", Ffile_version_limit, Sfile_version_limit, 1, 1, 0,
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
422 "Return the maximum number of versions allowed for FILE.\n\
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
423 Returns nil if the file cannot be opened or if there is no version limit.")
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
424 (filename)
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
425 Lisp_Object filename;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
426 {
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
427 Lisp_Object retval;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
428 struct FAB fab;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
429 struct RAB rab;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
430 struct XABFHC xabfhc;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
431 int status;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
432
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
433 filename = Fexpand_file_name (filename, Qnil);
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
434 fab = cc$rms_fab;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
435 xabfhc = cc$rms_xabfhc;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
436 fab.fab$l_fna = XSTRING (filename)->data;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
437 fab.fab$b_fns = strlen (fab.fab$l_fna);
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
438 fab.fab$l_xab = (char *) &xabfhc;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
439 status = sys$open (&fab, 0, 0);
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
440 if (status != RMS$_NORMAL) /* Probably non-existent file */
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
441 return Qnil;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
442 sys$close (&fab, 0, 0);
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
443 if (xabfhc.xab$w_verlimit == 32767)
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
444 return Qnil; /* No version limit */
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
445 else
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
446 return make_number (xabfhc.xab$w_verlimit);
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
447 }
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
448
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
449 #endif /* VMS */
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
450
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 Lisp_Object
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 make_time (time)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 int time;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 return Fcons (make_number (time >> 16),
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 Fcons (make_number (time & 0177777), Qnil));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 1, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 "Return a list of attributes of file FILENAME.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461 Value is nil if specified file cannot be opened.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 Otherwise, list elements are:\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 0. t for directory, string (name linked to) for symbolic link, or nil.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 1. Number of links to file.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 2. File uid.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 3. File gid.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 4. Last access time, as a list of two integers.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 First integer has high-order 16 bits of time, second has low 16 bits.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 5. Last modification time, likewise.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 6. Last status change time, likewise.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 7. Size in bytes.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 8. File modes, as a string of ten letters or dashes as in ls -l.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 9. t iff file's gid would change if file were deleted and recreated.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 10. inode number.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 11. Device number.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 \n\
1509
9675ae1d95c2 * dired.c (find_file_handler): Declare this extern.
Jim Blandy <jimb@redhat.com>
parents: 1173
diff changeset
477 If file does not exist, returns nil.")
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 (filename)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 Lisp_Object filename;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 Lisp_Object values[12];
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 Lisp_Object dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 struct stat s;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 struct stat sdir;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 char modes[10];
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
486 Lisp_Object handler;
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488 filename = Fexpand_file_name (filename, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
489
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
490 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
491 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
492 handler = Ffind_file_name_handler (filename);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
493 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
494 return call2 (handler, Qfile_attributes, filename);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
495
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 if (lstat (XSTRING (filename)->data, &s) < 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 return Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 switch (s.st_mode & S_IFMT)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 default:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 values[0] = Qnil; break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 case S_IFDIR:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 values[0] = Qt; break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 #ifdef S_IFLNK
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 case S_IFLNK:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 values[0] = Ffile_symlink_p (filename); break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 values[1] = make_number (s.st_nlink);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 values[2] = make_number (s.st_uid);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 values[3] = make_number (s.st_gid);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 values[4] = make_time (s.st_atime);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 values[5] = make_time (s.st_mtime);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 values[6] = make_time (s.st_ctime);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 /* perhaps we should set this to most-positive-fixnum if it is too large? */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 values[7] = make_number (s.st_size);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 filemodestring (&s, modes);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 values[8] = make_string (modes, 10);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 #ifdef BSD4_3 /* Gross kludge to avoid lack of "#if defined(...)" in VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 #define BSD4_2 /* A new meaning to the term `backwards compatability' */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 #ifdef BSD4_2 /* file gid will be dir gid */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 dirname = Ffile_name_directory (filename);
1509
9675ae1d95c2 * dired.c (find_file_handler): Declare this extern.
Jim Blandy <jimb@redhat.com>
parents: 1173
diff changeset
525 if (! NILP (dirname) && stat (XSTRING (dirname)->data, &sdir) == 0)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 else /* if we can't tell, assume worst */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 values[9] = Qt;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 #else /* file gid will be egid */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 #endif /* BSD4_2 (or BSD4_3) */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532 #ifdef BSD4_3
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 #undef BSD4_2 /* ok, you can look again without throwing up */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 values[10] = make_number (s.st_ino);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
536 values[11] = make_number (s.st_dev);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 return Flist (sizeof(values) / sizeof(values[0]), values);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540 syms_of_dired ()
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
542 Qdirectory_files = intern ("directory-files");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
543 Qfile_name_completion = intern ("file-name-completion");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
544 Qfile_name_all_completions = intern ("file-name-all-completions");
847
8d43bfe19803 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 843
diff changeset
545 Qfile_attributes = intern ("file-attributes");
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
546
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547 defsubr (&Sdirectory_files);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 defsubr (&Sfile_name_completion);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550 defsubr (&Sfile_name_all_versions);
1172
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
551 defsubr (&Sfile_version_limit);
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
553 defsubr (&Sfile_name_all_completions);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554 defsubr (&Sfile_attributes);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
556 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
557 Qcompletion_ignore_case = intern ("completion-ignore-case");
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558 staticpro (&Qcompletion_ignore_case);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 DEFVAR_LISP ("completion-ignored-extensions", &Vcompletion_ignored_extensions,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 "*Completion ignores filenames ending in any string in this list.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 This variable does not affect lists of possible completions,\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 but does affect the commands that actually do completions.");
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565 Vcompletion_ignored_extensions = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566 }