annotate src/dired.c @ 4413:5a00cec8e9b0

(fill-region-as-paragraph): When we take one word after the fill column, don't stop at period with just one space. When checking whether at beginning of line, if no fill prefix, ignore intervening whitespace.
author Richard M. Stallman <rms@gnu.org>
date Mon, 02 Aug 1993 05:55:56 +0000
parents b00953e22dc3
children 1fc792473491
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
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
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
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
83 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
84
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 Lisp_Object Vcompletion_ignored_extensions;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 Lisp_Object Qcompletion_ignore_case;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
88
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
89 Lisp_Object Qdirectory_files;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
90 Lisp_Object Qfile_name_completion;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
91 Lisp_Object Qfile_name_all_completions;
847
8d43bfe19803 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 843
diff changeset
92 Lisp_Object Qfile_attributes;
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 "Return a list of names of files in DIRECTORY.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 There are three optional arguments:\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 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
98 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
99 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
100 NOSORT is useful if you plan to sort the result yourself.")
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 (dirname, full, match, nosort)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 Lisp_Object dirname, full, match, nosort;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 DIR *d;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 int length;
2182
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
106 Lisp_Object list, name, dirfilename;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
107 Lisp_Object handler;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
108
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
109 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
110 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
111 handler = Ffind_file_name_handler (dirname);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
112 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
113 {
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
114 Lisp_Object args[6];
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
115
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
116 args[0] = handler;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
117 args[1] = Qdirectory_files;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
118 args[2] = dirname;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
119 args[3] = full;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
120 args[4] = match;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
121 args[5] = nosort;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
122 return Ffuncall (6, args);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
123 }
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124
2182
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
125 {
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
126 struct gcpro gcpro1, gcpro2;
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
127
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
128 /* 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
129 Ffuncall, and cause a GC. */
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
130 GCPRO1 (match);
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
131 dirname = Fexpand_file_name (dirname, Qnil);
2183
1d57af6e24e9 Fix the fix.
Jim Blandy <jimb@redhat.com>
parents: 2182
diff changeset
132 UNGCPRO;
2182
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
133 GCPRO2 (match, dirname);
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
134 dirfilename = Fdirectory_file_name (dirname);
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
135 UNGCPRO;
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
136 }
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
137
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
138 if (!NILP (match))
153
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 CHECK_STRING (match, 3);
808
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
141
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
142 /* MATCH might be a flawed regular expression. Rather than
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
143 catching and signalling our own errors, we just call
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
144 compile_pattern to do the work for us. */
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 #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
146 compile_pattern (match, &searchbuf, 0,
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 buffer_defaults.downcase_table->contents);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 #else
808
707866b2a190 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
149 compile_pattern (match, &searchbuf, 0, 0);
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152
2182
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
153 /* 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
154 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
155
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
156 /* 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
157 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
158 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
159 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
160 d = opendir (XSTRING (dirfilename)->data);
4ffe88f2e493 * dired.c (Fdirectory_files): Compile the MATCH regexp after
Jim Blandy <jimb@redhat.com>
parents: 2117
diff changeset
161 if (! d)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 report_file_error ("Opening directory", Fcons (dirname, Qnil));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 list = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 length = XSTRING (dirname)->size;
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 /* Loop reading blocks */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 while (1)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 DIRENTRY *dp = readdir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 int len;
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 if (!dp) break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 len = NAMLEN (dp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 if (dp->d_ino)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
177 if (NILP (match)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 || (0 <= re_search (&searchbuf, dp->d_name, len, 0, len, 0)))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 {
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
180 if (!NILP (full))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 int index = XSTRING (dirname)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 int total = len + index;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 #ifndef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 if (length == 0
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 || XSTRING (dirname)->data[length - 1] != '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 total++;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 name = make_uninit_string (total);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 bcopy (XSTRING (dirname)->data, XSTRING (name)->data,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 index);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 #ifndef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 if (length == 0
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 || XSTRING (dirname)->data[length - 1] != '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 XSTRING (name)->data[index++] = '/';
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 bcopy (dp->d_name, XSTRING (name)->data + index, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 name = make_string (dp->d_name, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 list = Fcons (name, list);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 }
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 closedir (d);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
207 if (!NILP (nosort))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 return list;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 return Fsort (Fnreverse (list), Qstring_lessp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 }
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 Lisp_Object file_name_completion ();
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 2, 2, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 "Complete file name FILE in directory DIR.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 Returns the longest string\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 common to all filenames in DIR that start with FILE.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 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
220 Returns nil if DIR contains no name starting with FILE.")
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 (file, dirname)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 Lisp_Object file, dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
224 Lisp_Object handler;
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 /* Don't waste time trying to complete a null string.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 Besides, this case happens when user is being asked for
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 a directory name and has supplied one ending in a /.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 We would not want to add anything in that case
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 even if there are some unique characters in that directory. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 if (XTYPE (file) == Lisp_String && XSTRING (file)->size == 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 return file;
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
232
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
233 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
234 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
235 handler = Ffind_file_name_handler (dirname);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
236 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
237 return call3 (handler, Qfile_name_completion, file, dirname);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
238
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 return file_name_completion (file, dirname, 0, 0);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 }
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 DEFUN ("file-name-all-completions", Ffile_name_all_completions,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 Sfile_name_all_completions, 2, 2, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 "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
245 These are all file names in directory DIR which begin with FILE.")
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 (file, dirname)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 Lisp_Object file, dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
249 Lisp_Object handler;
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
250
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
251 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
252 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
253 handler = Ffind_file_name_handler (dirname);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
254 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
255 return call3 (handler, Qfile_name_all_completions, file, dirname);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
256
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 return file_name_completion (file, dirname, 1, 0);
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
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 Lisp_Object
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 file_name_completion (file, dirname, all_flag, ver_flag)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 Lisp_Object file, dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 int all_flag, ver_flag;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 DIR *d;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 DIRENTRY *dp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 int bestmatchsize, skip;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 register int compare, matchsize;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 unsigned char *p1, *p2;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 int matchcount = 0;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 Lisp_Object bestmatch, tem, elt, name;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 struct stat st;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 int directoryp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 int passcount;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 int count = specpdl_ptr - specpdl;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 extern DIRENTRY * readdirver ();
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 *((* readfunc) ());
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 /* Filename completion on VMS ignores case, since VMS filesys does. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 specbind (Qcompletion_ignore_case, Qt);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 readfunc = readdir;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 if (ver_flag)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 readfunc = readdirver;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 file = Fupcase (file);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 #else /* not VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 CHECK_STRING (file, 0);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 #endif /* not VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 dirname = Fexpand_file_name (dirname, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 bestmatch = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 /* With passcount = 0, ignore files that end in an ignored extension.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 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
297 If looking for all completions, start with passcount = 1,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 so always take even the ignored ones.
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 ** 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
301 completions when making a list of them.** */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
303 for (passcount = !!all_flag; NILP (bestmatch) && passcount < 2; passcount++)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 if (!(d = opendir (XSTRING (Fdirectory_file_name (dirname))->data)))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 report_file_error ("Opening directory", Fcons (dirname, Qnil));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 /* Loop reading blocks */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 /* (att3b compiler bug requires do a null comparison this way) */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 while (1)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 DIRENTRY *dp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 int len;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 dp = (*readfunc) (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 #else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 dp = readdir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 if (!dp) break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 len = NAMLEN (dp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
324 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 goto quit;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 if (!dp->d_ino
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 || len < XSTRING (file)->size
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 || 0 <= scmp (dp->d_name, XSTRING (file)->data,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 XSTRING (file)->size))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 continue;
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 if (file_name_completion_stat (dirname, dp, &st) < 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 directoryp = ((st.st_mode & S_IFMT) == S_IFDIR);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 tem = Qnil;
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 /* Compare extensions-to-be-ignored against end of this file name */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 /* if name is not an exact match against specified string */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 if (!passcount && len > XSTRING (file)->size)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 /* and exit this for loop if a match is found */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 for (tem = Vcompletion_ignored_extensions;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 CONSP (tem); tem = XCONS (tem)->cdr)
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 elt = XCONS (tem)->car;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 if (XTYPE (elt) != Lisp_String) continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 skip = len - XSTRING (elt)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 if (skip < 0) continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 if (0 <= scmp (dp->d_name + skip,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 XSTRING (elt)->data,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 XSTRING (elt)->size))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 continue;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 }
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 /* Unless an ignored-extensions match was found,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 process this name as a completion */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 if (passcount || !CONSP (tem))
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 /* Update computation of how much all possible completions match */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 matchcount++;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
367 if (all_flag || NILP (bestmatch))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 /* This is a possible completion */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 if (directoryp)
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 /* This completion is a directory; make it end with '/' */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 name = Ffile_name_as_directory (make_string (dp->d_name, len));
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 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 name = make_string (dp->d_name, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 if (all_flag)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 bestmatch = Fcons (name, bestmatch);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 else
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 bestmatch = name;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 bestmatchsize = XSTRING (name)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 }
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 else
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 compare = min (bestmatchsize, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 p1 = XSTRING (bestmatch)->data;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 p2 = (unsigned char *) dp->d_name;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 matchsize = scmp(p1, p2, compare);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 if (matchsize < 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 matchsize = compare;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 /* If this dirname all matches,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 see if implicit following slash does too. */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 if (directoryp
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 && compare == matchsize
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 && bestmatchsize > matchsize
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 && p1[matchsize] == '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 matchsize++;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 bestmatchsize = min (matchsize, bestmatchsize);
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 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 closedir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 }
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 unbind_to (count, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 374
diff changeset
411 if (all_flag || NILP (bestmatch))
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 return bestmatch;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 if (matchcount == 1 && bestmatchsize == XSTRING (file)->size)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 return Qt;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 return Fsubstring (bestmatch, make_number (0), make_number (bestmatchsize));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 quit:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 if (d) closedir (d);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 Vquit_flag = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 return Fsignal (Qquit, Qnil);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 file_name_completion_stat (dirname, dp, st_addr)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 Lisp_Object dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 DIRENTRY *dp;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 struct stat *st_addr;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 int len = NAMLEN (dp);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 int pos = XSTRING (dirname)->size;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 char *fullname = (char *) alloca (len + pos + 2);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 bcopy (XSTRING (dirname)->data, fullname, pos);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 #ifndef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 if (fullname[pos - 1] != '/')
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 fullname[pos++] = '/';
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 bcopy (dp->d_name, fullname + pos, len);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 fullname[pos + len] = 0;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 return stat (fullname, st_addr);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442
1172
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
443 #ifdef VMS
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
444
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
445 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
446 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
447 "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
448 (file, dirname)
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
449 Lisp_Object file, dirname;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
450 {
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
451 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
452 }
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
453
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
454 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
455 "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
456 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
457 (filename)
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
458 Lisp_Object filename;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
459 {
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
460 Lisp_Object retval;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
461 struct FAB fab;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
462 struct RAB rab;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
463 struct XABFHC xabfhc;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
464 int status;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
465
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
466 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
467 fab = cc$rms_fab;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
468 xabfhc = cc$rms_xabfhc;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
469 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
470 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
471 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
472 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
473 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
474 return Qnil;
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
475 sys$close (&fab, 0, 0);
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
476 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
477 return Qnil; /* No version limit */
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
478 else
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
479 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
480 }
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
481
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
482 #endif /* VMS */
c942305917c1 [VMS]: Include string.h, rms.h, rmsdef.h.
Richard M. Stallman <rms@gnu.org>
parents: 847
diff changeset
483
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 Lisp_Object
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 make_time (time)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 int time;
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 return Fcons (make_number (time >> 16),
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489 Fcons (make_number (time & 0177777), Qnil));
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492 DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 1, 0,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 "Return a list of attributes of file FILENAME.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 Value is nil if specified file cannot be opened.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 Otherwise, list elements are:\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 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
497 1. Number of links to file.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 2. File uid.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 3. File gid.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 4. Last access time, as a list of two integers.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 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
502 5. Last modification time, likewise.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 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
504 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
505 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
506 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
507 10. inode number.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 11. Device number.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 \n\
1509
9675ae1d95c2 * dired.c (find_file_handler): Declare this extern.
Jim Blandy <jimb@redhat.com>
parents: 1173
diff changeset
510 If file does not exist, returns nil.")
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 (filename)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 Lisp_Object filename;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 Lisp_Object values[12];
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 Lisp_Object dirname;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 struct stat s;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 struct stat sdir;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 char modes[10];
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
519 Lisp_Object handler;
153
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 filename = Fexpand_file_name (filename, Qnil);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
522
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
523 /* If the file name has special constructs in it,
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
524 call the corresponding file handler. */
1681
a03b87a92614 * fileio.c (find_file_handler): Rename this to
Jim Blandy <jimb@redhat.com>
parents: 1596
diff changeset
525 handler = Ffind_file_name_handler (filename);
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
526 if (!NILP (handler))
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
527 return call2 (handler, Qfile_attributes, filename);
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
528
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 if (lstat (XSTRING (filename)->data, &s) < 0)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 return Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532 switch (s.st_mode & S_IFMT)
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 {
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 default:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 values[0] = Qnil; break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
536 case S_IFDIR:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 values[0] = Qt; break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538 #ifdef S_IFLNK
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539 case S_IFLNK:
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540 values[0] = Ffile_symlink_p (filename); break;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 values[1] = make_number (s.st_nlink);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
544 values[2] = make_number (s.st_uid);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545 values[3] = make_number (s.st_gid);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546 values[4] = make_time (s.st_atime);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547 values[5] = make_time (s.st_mtime);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 values[6] = make_time (s.st_ctime);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 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
550 /* 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
551 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
552 XSETINT (values[7], -1);
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
553 filemodestring (&s, modes);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554 values[8] = make_string (modes, 10);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555 #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
556 #define BSD4_2 /* A new meaning to the term `backwards compatibility' */
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
557 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558 #ifdef BSD4_2 /* file gid will be dir gid */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 dirname = Ffile_name_directory (filename);
1509
9675ae1d95c2 * dired.c (find_file_handler): Declare this extern.
Jim Blandy <jimb@redhat.com>
parents: 1173
diff changeset
560 if (! NILP (dirname) && stat (XSTRING (dirname)->data, &sdir) == 0)
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 else /* if we can't tell, assume worst */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 values[9] = Qt;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 #else /* file gid will be egid */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565 values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566 #endif /* BSD4_2 (or BSD4_3) */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567 #ifdef BSD4_3
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568 #undef BSD4_2 /* ok, you can look again without throwing up */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569 #endif
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570 values[10] = make_number (s.st_ino);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 values[11] = make_number (s.st_dev);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572 return Flist (sizeof(values) / sizeof(values[0]), values);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 }
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
574
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575 syms_of_dired ()
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
576 {
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
577 Qdirectory_files = intern ("directory-files");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
578 Qfile_name_completion = intern ("file-name-completion");
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
579 Qfile_name_all_completions = intern ("file-name-all-completions");
847
8d43bfe19803 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 843
diff changeset
580 Qfile_attributes = intern ("file-attributes");
843
8f6ea998ad0a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 808
diff changeset
581
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582 defsubr (&Sdirectory_files);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583 defsubr (&Sfile_name_completion);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
584 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585 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
586 defsubr (&Sfile_version_limit);
153
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588 defsubr (&Sfile_name_all_completions);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589 defsubr (&Sfile_attributes);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
590
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
591 #ifdef VMS
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
592 Qcompletion_ignore_case = intern ("completion-ignore-case");
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
593 staticpro (&Qcompletion_ignore_case);
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
594 #endif /* VMS */
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
595
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
596 DEFVAR_LISP ("completion-ignored-extensions", &Vcompletion_ignored_extensions,
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
597 "*Completion ignores filenames ending in any string in this list.\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
598 This variable does not affect lists of possible completions,\n\
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
599 but does affect the commands that actually do completions.");
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
600 Vcompletion_ignored_extensions = Qnil;
636408ebaaaa Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
601 }