annotate src/dired.c @ 4890:dab300dfe449

(comint-scroll-to-bottom-on-input): Default to nil. (comint-mode): Use pre-command-hook, not before-change-function. (comint-preinput-scroll-to-bottom): Take no arguments. (comint-output-filter-functions): Renamed from comint-output-filter-hook. (comint-output-filter): Pass STRING as arg to output hook functions. (comint-preinput-scroll-to-bottom): Take an arg. Move point to new process mark if it was at the old one. Scroll so only if point is at or after the process mark. When scrolling, put end of text on bottom line, regardless of point.
author Richard M. Stallman <rms@gnu.org>
date Mon, 25 Oct 1993 20:01:29 +0000
parents 76f267188bbd
children c3677267e74d
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.
2961
e94a593c3952 Updated copyright years.
Jim Blandy <jimb@redhat.com>
parents: 2371
diff changeset
2 Copyright (C) 1985, 1986, 1993 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
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 3707
diff changeset
25 #include <config.h>
153
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
2117
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
33 /* The d_nameln member of a struct dirent includes the '\0' character
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
34 on some systems, but not on others. What's worse, you can't tell
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
35 at compile-time which one it will be, since it really depends on
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
36 the sort of system providing the filesystem you're reading from,
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
37 not the system you are running on. Paul Eggert
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
38 <eggert@bi.twinsun.com> says this occurs when Emacs is running on a
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
39 SunOS 4.1.2 host, reading a directory that is remote-mounted from a
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
40 Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
41
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
42 Since applying strlen to the name always works, we'll just do that. */
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
43 #define NAMLEN(p) strlen (p->d_name)
cb164a9e44ba * dired.c (NAMLEN): Never use d_nameln to get the length of the
Jim Blandy <jimb@redhat.com>
parents: 1681
diff changeset
44
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 #ifdef SYSV_SYSTEM_DIR
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 #include <dirent.h>
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 #define DIRENTRY struct dirent
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 #else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 #ifdef NONSYSTEM_DIR_LIBRARY
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 #include "ndir.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 #else /* not NONSYSTEM_DIR_LIBRARY */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 #include <sys/dir.h>
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 #endif /* not NONSYSTEM_DIR_LIBRARY */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 #define DIRENTRY struct direct
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 extern DIR *opendir ();
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 extern struct direct *readdir ();
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 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 #include "lisp.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 #include "buffer.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 #include "commands.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 #include "regex.h"
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70
2371
48f808108031 (searchbuf): Declare here.
Richard M. Stallman <rms@gnu.org>
parents: 2183
diff changeset
71 /* A search buffer, with a fastmap allocated and ready to go. */
48f808108031 (searchbuf): Declare here.
Richard M. Stallman <rms@gnu.org>
parents: 2183
diff changeset
72 extern struct re_pattern_buffer searchbuf;
48f808108031 (searchbuf): Declare here.
Richard M. Stallman <rms@gnu.org>
parents: 2183
diff changeset
73
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 #define min(a, b) ((a) < (b) ? (a) : (b))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 /* if system does not have symbolic links, it does not have lstat.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 In that case, use ordinary stat instead. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 #ifndef S_IFLNK
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 #define lstat stat
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82
4778
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
83 extern int completion_ignore_case;
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
84 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
85
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 Lisp_Object Vcompletion_ignored_extensions;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 Lisp_Object Qcompletion_ignore_case;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
89
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
90 Lisp_Object Qdirectory_files;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
91 Lisp_Object Qfile_name_completion;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
92 Lisp_Object Qfile_name_all_completions;
847
8d43bfe19803 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 843
diff changeset
93 Lisp_Object Qfile_attributes;
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 "Return a list of names of files in DIRECTORY.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 There are three optional arguments:\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 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
99 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
100 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
101 NOSORT is useful if you plan to sort the result yourself.")
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 (dirname, full, match, nosort)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 Lisp_Object dirname, full, match, nosort;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 DIR *d;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 int length;
2182
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
107 Lisp_Object list, name, dirfilename;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
108 Lisp_Object handler;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
109
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
110 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
111 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
112 handler = Ffind_file_name_handler (dirname);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
113 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
114 {
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
115 Lisp_Object args[6];
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
116
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
117 args[0] = handler;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
118 args[1] = Qdirectory_files;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
119 args[2] = dirname;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
120 args[3] = full;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
121 args[4] = match;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
122 args[5] = nosort;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
123 return Ffuncall (6, args);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
124 }
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125
2182
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
126 {
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
127 struct gcpro gcpro1, gcpro2;
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
128
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
129 /* Because of file name handlers, these functions might call
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
130 Ffuncall, and cause a GC. */
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
131 GCPRO1 (match);
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
132 dirname = Fexpand_file_name (dirname, Qnil);
2183
1d57af6e24e9 Fix the fix.
Jim Blandy <jimb@redhat.com>
parents: 2182
diff changeset
133 UNGCPRO;
2182
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
134 GCPRO2 (match, dirname);
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
135 dirfilename = Fdirectory_file_name (dirname);
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
136 UNGCPRO;
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
137 }
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
138
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
139 if (!NILP (match))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 CHECK_STRING (match, 3);
808
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
142
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
143 /* MATCH might be a flawed regular expression. Rather than
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
144 catching and signalling our own errors, we just call
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
145 compile_pattern to do the work for us. */
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 #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
147 compile_pattern (match, &searchbuf, 0,
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 buffer_defaults.downcase_table->contents);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 #else
808
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
150 compile_pattern (match, &searchbuf, 0, 0);
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153
2182
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
154 /* Now searchbuf is the compiled form of MATCH; don't call anything
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
155 which might compile a new regexp until we're done with the loop! */
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
156
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
157 /* Do this opendir after anything which might signal an error; if
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
158 an error is signalled while the directory stream is open, we
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
159 have to make sure it gets closed, and setting up an
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
160 unwind_protect to do so would be a pain. */
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
161 d = opendir (XSTRING (dirfilename)->data);
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
162 if (! d)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 report_file_error ("Opening directory", Fcons (dirname, Qnil));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 list = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 length = XSTRING (dirname)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 /* Loop reading blocks */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 while (1)
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 DIRENTRY *dp = readdir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 int len;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 if (!dp) break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 len = NAMLEN (dp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 if (dp->d_ino)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
178 if (NILP (match)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 || (0 <= re_search (&searchbuf, dp->d_name, len, 0, len, 0)))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
181 if (!NILP (full))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 int index = XSTRING (dirname)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 int total = len + index;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 #ifndef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 if (length == 0
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 || XSTRING (dirname)->data[length - 1] != '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 total++;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 name = make_uninit_string (total);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 bcopy (XSTRING (dirname)->data, XSTRING (name)->data,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 index);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 #ifndef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 if (length == 0
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 || XSTRING (dirname)->data[length - 1] != '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 XSTRING (name)->data[index++] = '/';
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 bcopy (dp->d_name, XSTRING (name)->data + index, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 name = make_string (dp->d_name, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 list = Fcons (name, list);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 closedir (d);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
208 if (!NILP (nosort))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 return list;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 return Fsort (Fnreverse (list), Qstring_lessp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 Lisp_Object file_name_completion ();
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 2, 2, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 "Complete file name FILE in directory DIR.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 Returns the longest string\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 common to all filenames in DIR that start with FILE.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 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
221 Returns nil if DIR contains no name starting with FILE.")
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 (file, dirname)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 Lisp_Object file, dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
225 Lisp_Object handler;
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 /* Don't waste time trying to complete a null string.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 Besides, this case happens when user is being asked for
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 a directory name and has supplied one ending in a /.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 We would not want to add anything in that case
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 even if there are some unique characters in that directory. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 if (XTYPE (file) == Lisp_String && XSTRING (file)->size == 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 return file;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
233
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
234 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
235 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
236 handler = Ffind_file_name_handler (dirname);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
237 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
238 return call3 (handler, Qfile_name_completion, file, dirname);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
239
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 return file_name_completion (file, dirname, 0, 0);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 DEFUN ("file-name-all-completions", Ffile_name_all_completions,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 Sfile_name_all_completions, 2, 2, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 "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
246 These are all file names in directory DIR which begin with FILE.")
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 (file, dirname)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 Lisp_Object file, dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
250 Lisp_Object handler;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
251
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
252 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
253 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
254 handler = Ffind_file_name_handler (dirname);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
255 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
256 return call3 (handler, Qfile_name_all_completions, file, dirname);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
257
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 return file_name_completion (file, dirname, 1, 0);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 Lisp_Object
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 file_name_completion (file, dirname, all_flag, ver_flag)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 Lisp_Object file, dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 int all_flag, ver_flag;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 DIR *d;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 DIRENTRY *dp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 int bestmatchsize, skip;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 register int compare, matchsize;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 unsigned char *p1, *p2;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 int matchcount = 0;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 Lisp_Object bestmatch, tem, elt, name;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 struct stat st;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 int directoryp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 int passcount;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 int count = specpdl_ptr - specpdl;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 extern DIRENTRY * readdirver ();
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 DIRENTRY *((* readfunc) ());
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 /* Filename completion on VMS ignores case, since VMS filesys does. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 specbind (Qcompletion_ignore_case, Qt);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 readfunc = readdir;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 if (ver_flag)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 readfunc = readdirver;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 file = Fupcase (file);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 #else /* not VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 CHECK_STRING (file, 0);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 #endif /* not VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 dirname = Fexpand_file_name (dirname, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 bestmatch = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 /* With passcount = 0, ignore files that end in an ignored extension.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 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
298 If looking for all completions, start with passcount = 1,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 so always take even the ignored ones.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 ** 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
302 completions when making a list of them.** */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
304 for (passcount = !!all_flag; NILP (bestmatch) && passcount < 2; passcount++)
153
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 if (!(d = opendir (XSTRING (Fdirectory_file_name (dirname))->data)))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 report_file_error ("Opening directory", Fcons (dirname, Qnil));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 /* Loop reading blocks */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 /* (att3b compiler bug requires do a null comparison this way) */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 while (1)
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 DIRENTRY *dp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 int len;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 dp = (*readfunc) (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 #else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 dp = readdir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 if (!dp) break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 len = NAMLEN (dp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
325 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 goto quit;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 if (!dp->d_ino
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 || len < XSTRING (file)->size
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 || 0 <= scmp (dp->d_name, XSTRING (file)->data,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 XSTRING (file)->size))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 if (file_name_completion_stat (dirname, dp, &st) < 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 continue;
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 directoryp = ((st.st_mode & S_IFMT) == S_IFDIR);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 tem = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 if (!directoryp)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 /* Compare extensions-to-be-ignored against end of this file name */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 /* if name is not an exact match against specified string */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 if (!passcount && len > XSTRING (file)->size)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 /* and exit this for loop if a match is found */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 for (tem = Vcompletion_ignored_extensions;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 CONSP (tem); tem = XCONS (tem)->cdr)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 elt = XCONS (tem)->car;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 if (XTYPE (elt) != Lisp_String) continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 skip = len - XSTRING (elt)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 if (skip < 0) continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 if (0 <= scmp (dp->d_name + skip,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 XSTRING (elt)->data,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 XSTRING (elt)->size))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 /* Unless an ignored-extensions match was found,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 process this name as a completion */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 if (passcount || !CONSP (tem))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 /* Update computation of how much all possible completions match */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 matchcount++;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
368 if (all_flag || NILP (bestmatch))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 /* This is a possible completion */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 if (directoryp)
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 /* This completion is a directory; make it end with '/' */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 name = Ffile_name_as_directory (make_string (dp->d_name, len));
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 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 name = make_string (dp->d_name, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 if (all_flag)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 bestmatch = Fcons (name, bestmatch);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 bestmatch = name;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 bestmatchsize = XSTRING (name)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 }
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 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 compare = min (bestmatchsize, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 p1 = XSTRING (bestmatch)->data;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 p2 = (unsigned char *) dp->d_name;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 matchsize = scmp(p1, p2, compare);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 if (matchsize < 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 matchsize = compare;
4778
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
396 if (completion_ignore_case)
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
397 {
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
398 /* If this is an exact match except for case,
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
399 use it as the best match rather than one that is not
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
400 an exact match. This way, we get the case pattern
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
401 of the actual match. */
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
402 if ((matchsize == len
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
403 && matchsize + !!directoryp
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
404 < XSTRING (bestmatch)->size)
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
405 ||
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
406 /* If there is no exact match ignoring case,
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
407 prefer a match that does not change the case
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
408 of the input. */
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
409 (((matchsize == len)
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
410 ==
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
411 (matchsize + !!directoryp
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
412 == XSTRING (bestmatch)->size))
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
413 /* If there is more than one exact match aside from
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
414 case, and one of them is exact including case,
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
415 prefer that one. */
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
416 && !bcmp (p2, XSTRING (file)->data, XSTRING (file)->size)
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
417 && bcmp (p1, XSTRING (file)->data, XSTRING (file)->size)))
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
418 {
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
419 bestmatch = make_string (dp->d_name, len);
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
420 if (directoryp)
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
421 bestmatch = Ffile_name_as_directory (bestmatch);
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
422 }
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
423 }
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
424
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
425 /* If this dirname all matches, see if implicit following
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
426 slash does too. */
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 if (directoryp
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 && compare == matchsize
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 && bestmatchsize > matchsize
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 && p1[matchsize] == '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 matchsize++;
4778
76f267188bbd (file_name_completion): Install case-preserving changes from Emacs 18
Brian Fox <bfox@gnu.org>
parents: 4696
diff changeset
432 bestmatchsize = matchsize;
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 closedir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 unbind_to (count, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
441 if (all_flag || NILP (bestmatch))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 return bestmatch;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 if (matchcount == 1 && bestmatchsize == XSTRING (file)->size)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 return Qt;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 return Fsubstring (bestmatch, make_number (0), make_number (bestmatchsize));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 quit:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 if (d) closedir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 Vquit_flag = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 return Fsignal (Qquit, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 file_name_completion_stat (dirname, dp, st_addr)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 Lisp_Object dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 DIRENTRY *dp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 struct stat *st_addr;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 int len = NAMLEN (dp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 int pos = XSTRING (dirname)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 char *fullname = (char *) alloca (len + pos + 2);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461 bcopy (XSTRING (dirname)->data, fullname, pos);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 #ifndef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 if (fullname[pos - 1] != '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 fullname[pos++] = '/';
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 bcopy (dp->d_name, fullname + pos, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 fullname[pos + len] = 0;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 return stat (fullname, st_addr);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472
1172
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
473 #ifdef VMS
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
474
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
475 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
476 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
477 "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
478 (file, dirname)
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
479 Lisp_Object file, dirname;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
480 {
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
481 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
482 }
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
483
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
484 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
485 "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
486 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
487 (filename)
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
488 Lisp_Object filename;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
489 {
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
490 Lisp_Object retval;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
491 struct FAB fab;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
492 struct RAB rab;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
493 struct XABFHC xabfhc;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
494 int status;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
495
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
496 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
497 fab = cc$rms_fab;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
498 xabfhc = cc$rms_xabfhc;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
499 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
500 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
501 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
502 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
503 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
504 return Qnil;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
505 sys$close (&fab, 0, 0);
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
506 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
507 return Qnil; /* No version limit */
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
508 else
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
509 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
510 }
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
511
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
512 #endif /* VMS */
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
513
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 Lisp_Object
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 make_time (time)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 int time;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 return Fcons (make_number (time >> 16),
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 Fcons (make_number (time & 0177777), Qnil));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 1, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 "Return a list of attributes of file FILENAME.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 Value is nil if specified file cannot be opened.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525 Otherwise, list elements are:\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 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
527 1. Number of links to file.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 2. File uid.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 3. File gid.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 4. Last access time, as a list of two integers.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 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
532 5. Last modification time, likewise.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 6. Last status change time, likewise.\n\
3707
b00953e22dc3 (Ffile_attributes): Give -1 as size if size won't fit.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
534 7. Size in bytes (-1, if number is out of range).\n\
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 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
536 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
537 10. inode number.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538 11. Device number.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539 \n\
1509
9675ae1d95c2 * dired.c (find_file_handler): Declare this extern.
Jim Blandy <jimb@redhat.com>
parents: 1173
diff changeset
540 If file does not exist, returns nil.")
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 (filename)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542 Lisp_Object filename;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
544 Lisp_Object values[12];
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545 Lisp_Object dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546 struct stat s;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547 struct stat sdir;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 char modes[10];
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
549 Lisp_Object handler;
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551 filename = Fexpand_file_name (filename, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
552
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
553 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
554 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
555 handler = Ffind_file_name_handler (filename);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
556 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
557 return call2 (handler, Qfile_attributes, filename);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
558
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 if (lstat (XSTRING (filename)->data, &s) < 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560 return Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 switch (s.st_mode & S_IFMT)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 default:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565 values[0] = Qnil; break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566 case S_IFDIR:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567 values[0] = Qt; break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568 #ifdef S_IFLNK
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569 case S_IFLNK:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570 values[0] = Ffile_symlink_p (filename); break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 values[1] = make_number (s.st_nlink);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
574 values[2] = make_number (s.st_uid);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575 values[3] = make_number (s.st_gid);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
576 values[4] = make_time (s.st_atime);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577 values[5] = make_time (s.st_mtime);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
578 values[6] = make_time (s.st_ctime);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
579 values[7] = make_number (s.st_size);
3707
b00953e22dc3 (Ffile_attributes): Give -1 as size if size won't fit.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
580 /* If the size is out of range, give back -1. */
b00953e22dc3 (Ffile_attributes): Give -1 as size if size won't fit.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
581 if (XINT (values[7]) != s.st_size)
b00953e22dc3 (Ffile_attributes): Give -1 as size if size won't fit.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
582 XSETINT (values[7], -1);
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583 filemodestring (&s, modes);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
584 values[8] = make_string (modes, 10);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585 #ifdef BSD4_3 /* Gross kludge to avoid lack of "#if defined(...)" in VMS */
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 2961
diff changeset
586 #define BSD4_2 /* A new meaning to the term `backwards compatibility' */
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588 #ifdef BSD4_2 /* file gid will be dir gid */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589 dirname = Ffile_name_directory (filename);
1509
9675ae1d95c2 * dired.c (find_file_handler): Declare this extern.
Jim Blandy <jimb@redhat.com>
parents: 1173
diff changeset
590 if (! NILP (dirname) && stat (XSTRING (dirname)->data, &sdir) == 0)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
591 values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
592 else /* if we can't tell, assume worst */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
593 values[9] = Qt;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
594 #else /* file gid will be egid */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
595 values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
596 #endif /* BSD4_2 (or BSD4_3) */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
597 #ifdef BSD4_3
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
598 #undef BSD4_2 /* ok, you can look again without throwing up */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
599 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
600 values[10] = make_number (s.st_ino);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
601 values[11] = make_number (s.st_dev);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
602 return Flist (sizeof(values) / sizeof(values[0]), values);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
603 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 syms_of_dired ()
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
607 Qdirectory_files = intern ("directory-files");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
608 Qfile_name_completion = intern ("file-name-completion");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
609 Qfile_name_all_completions = intern ("file-name-all-completions");
847
8d43bfe19803 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 843
diff changeset
610 Qfile_attributes = intern ("file-attributes");
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
611
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
612 defsubr (&Sdirectory_files);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
613 defsubr (&Sfile_name_completion);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
614 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
615 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
616 defsubr (&Sfile_version_limit);
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
617 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
618 defsubr (&Sfile_name_all_completions);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
619 defsubr (&Sfile_attributes);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
621 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
622 Qcompletion_ignore_case = intern ("completion-ignore-case");
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
623 staticpro (&Qcompletion_ignore_case);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
624 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
626 DEFVAR_LISP ("completion-ignored-extensions", &Vcompletion_ignored_extensions,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
627 "*Completion ignores filenames ending in any string in this list.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
628 This variable does not affect lists of possible completions,\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
629 but does affect the commands that actually do completions.");
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
630 Vcompletion_ignored_extensions = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
631 }