1*6b445a62SJohn Marino /* complete.c -- filename completion for readline. */
2*6b445a62SJohn Marino
3*6b445a62SJohn Marino /* Copyright (C) 1987-2011 Free Software Foundation, Inc.
4*6b445a62SJohn Marino
5*6b445a62SJohn Marino This file is part of the GNU Readline Library (Readline), a library
6*6b445a62SJohn Marino for reading lines of text with interactive input and history editing.
7*6b445a62SJohn Marino
8*6b445a62SJohn Marino Readline is free software: you can redistribute it and/or modify
9*6b445a62SJohn Marino it under the terms of the GNU General Public License as published by
10*6b445a62SJohn Marino the Free Software Foundation, either version 3 of the License, or
11*6b445a62SJohn Marino (at your option) any later version.
12*6b445a62SJohn Marino
13*6b445a62SJohn Marino Readline is distributed in the hope that it will be useful,
14*6b445a62SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
15*6b445a62SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*6b445a62SJohn Marino GNU General Public License for more details.
17*6b445a62SJohn Marino
18*6b445a62SJohn Marino You should have received a copy of the GNU General Public License
19*6b445a62SJohn Marino along with Readline. If not, see <http://www.gnu.org/licenses/>.
20*6b445a62SJohn Marino */
21*6b445a62SJohn Marino
22*6b445a62SJohn Marino #define READLINE_LIBRARY
23*6b445a62SJohn Marino
24*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H)
25*6b445a62SJohn Marino # include <config.h>
26*6b445a62SJohn Marino #endif
27*6b445a62SJohn Marino
28*6b445a62SJohn Marino #include <sys/types.h>
29*6b445a62SJohn Marino #include <fcntl.h>
30*6b445a62SJohn Marino #if defined (HAVE_SYS_FILE_H)
31*6b445a62SJohn Marino # include <sys/file.h>
32*6b445a62SJohn Marino #endif
33*6b445a62SJohn Marino
34*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H)
35*6b445a62SJohn Marino # include <unistd.h>
36*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */
37*6b445a62SJohn Marino
38*6b445a62SJohn Marino #if defined (HAVE_STDLIB_H)
39*6b445a62SJohn Marino # include <stdlib.h>
40*6b445a62SJohn Marino #else
41*6b445a62SJohn Marino # include "ansi_stdlib.h"
42*6b445a62SJohn Marino #endif /* HAVE_STDLIB_H */
43*6b445a62SJohn Marino
44*6b445a62SJohn Marino #include <stdio.h>
45*6b445a62SJohn Marino
46*6b445a62SJohn Marino #include <errno.h>
47*6b445a62SJohn Marino #if !defined (errno)
48*6b445a62SJohn Marino extern int errno;
49*6b445a62SJohn Marino #endif /* !errno */
50*6b445a62SJohn Marino
51*6b445a62SJohn Marino #if defined (HAVE_PWD_H)
52*6b445a62SJohn Marino #include <pwd.h>
53*6b445a62SJohn Marino #endif
54*6b445a62SJohn Marino
55*6b445a62SJohn Marino #include "posixdir.h"
56*6b445a62SJohn Marino #include "posixstat.h"
57*6b445a62SJohn Marino
58*6b445a62SJohn Marino /* System-specific feature definitions and include files. */
59*6b445a62SJohn Marino #include "rldefs.h"
60*6b445a62SJohn Marino #include "rlmbutil.h"
61*6b445a62SJohn Marino
62*6b445a62SJohn Marino /* Some standard library routines. */
63*6b445a62SJohn Marino #include "readline.h"
64*6b445a62SJohn Marino #include "xmalloc.h"
65*6b445a62SJohn Marino #include "rlprivate.h"
66*6b445a62SJohn Marino
67*6b445a62SJohn Marino #ifdef __STDC__
68*6b445a62SJohn Marino typedef int QSFUNC (const void *, const void *);
69*6b445a62SJohn Marino #else
70*6b445a62SJohn Marino typedef int QSFUNC ();
71*6b445a62SJohn Marino #endif
72*6b445a62SJohn Marino
73*6b445a62SJohn Marino #ifdef HAVE_LSTAT
74*6b445a62SJohn Marino # define LSTAT lstat
75*6b445a62SJohn Marino #else
76*6b445a62SJohn Marino # define LSTAT stat
77*6b445a62SJohn Marino #endif
78*6b445a62SJohn Marino
79*6b445a62SJohn Marino /* Unix version of a hidden file. Could be different on other systems. */
80*6b445a62SJohn Marino #define HIDDEN_FILE(fname) ((fname)[0] == '.')
81*6b445a62SJohn Marino
82*6b445a62SJohn Marino /* Most systems don't declare getpwent in <pwd.h> if _POSIX_SOURCE is
83*6b445a62SJohn Marino defined. */
84*6b445a62SJohn Marino #if defined (HAVE_GETPWENT) && (!defined (HAVE_GETPW_DECLS) || defined (_POSIX_SOURCE))
85*6b445a62SJohn Marino extern struct passwd *getpwent PARAMS((void));
86*6b445a62SJohn Marino #endif /* HAVE_GETPWENT && (!HAVE_GETPW_DECLS || _POSIX_SOURCE) */
87*6b445a62SJohn Marino
88*6b445a62SJohn Marino /* If non-zero, then this is the address of a function to call when
89*6b445a62SJohn Marino completing a word would normally display the list of possible matches.
90*6b445a62SJohn Marino This function is called instead of actually doing the display.
91*6b445a62SJohn Marino It takes three arguments: (char **matches, int num_matches, int max_length)
92*6b445a62SJohn Marino where MATCHES is the array of strings that matched, NUM_MATCHES is the
93*6b445a62SJohn Marino number of strings in that array, and MAX_LENGTH is the length of the
94*6b445a62SJohn Marino longest string in that array. */
95*6b445a62SJohn Marino rl_compdisp_func_t *rl_completion_display_matches_hook = (rl_compdisp_func_t *)NULL;
96*6b445a62SJohn Marino
97*6b445a62SJohn Marino #if defined (VISIBLE_STATS)
98*6b445a62SJohn Marino # if !defined (X_OK)
99*6b445a62SJohn Marino # define X_OK 1
100*6b445a62SJohn Marino # endif
101*6b445a62SJohn Marino static int stat_char PARAMS((char *));
102*6b445a62SJohn Marino #endif
103*6b445a62SJohn Marino
104*6b445a62SJohn Marino static int path_isdir PARAMS((const char *));
105*6b445a62SJohn Marino
106*6b445a62SJohn Marino static char *rl_quote_filename PARAMS((char *, int, char *));
107*6b445a62SJohn Marino
108*6b445a62SJohn Marino static void set_completion_defaults PARAMS((int));
109*6b445a62SJohn Marino static int get_y_or_n PARAMS((int));
110*6b445a62SJohn Marino static int _rl_internal_pager PARAMS((int));
111*6b445a62SJohn Marino static char *printable_part PARAMS((char *));
112*6b445a62SJohn Marino static int fnwidth PARAMS((const char *));
113*6b445a62SJohn Marino static int fnprint PARAMS((const char *, int));
114*6b445a62SJohn Marino static int print_filename PARAMS((char *, char *, int));
115*6b445a62SJohn Marino
116*6b445a62SJohn Marino static char **gen_completion_matches PARAMS((char *, int, int, rl_compentry_func_t *, int, int));
117*6b445a62SJohn Marino
118*6b445a62SJohn Marino static char **remove_duplicate_matches PARAMS((char **));
119*6b445a62SJohn Marino static void insert_match PARAMS((char *, int, int, char *));
120*6b445a62SJohn Marino static int append_to_match PARAMS((char *, int, int, int));
121*6b445a62SJohn Marino static void insert_all_matches PARAMS((char **, int, char *));
122*6b445a62SJohn Marino static int complete_fncmp PARAMS((const char *, int, const char *, int));
123*6b445a62SJohn Marino static void display_matches PARAMS((char **));
124*6b445a62SJohn Marino static int compute_lcd_of_matches PARAMS((char **, int, const char *));
125*6b445a62SJohn Marino static int postprocess_matches PARAMS((char ***, int));
126*6b445a62SJohn Marino static int complete_get_screenwidth PARAMS((void));
127*6b445a62SJohn Marino
128*6b445a62SJohn Marino static char *make_quoted_replacement PARAMS((char *, int, char *));
129*6b445a62SJohn Marino
130*6b445a62SJohn Marino /* **************************************************************** */
131*6b445a62SJohn Marino /* */
132*6b445a62SJohn Marino /* Completion matching, from readline's point of view. */
133*6b445a62SJohn Marino /* */
134*6b445a62SJohn Marino /* **************************************************************** */
135*6b445a62SJohn Marino
136*6b445a62SJohn Marino /* Variables known only to the readline library. */
137*6b445a62SJohn Marino
138*6b445a62SJohn Marino /* If non-zero, non-unique completions always show the list of matches. */
139*6b445a62SJohn Marino int _rl_complete_show_all = 0;
140*6b445a62SJohn Marino
141*6b445a62SJohn Marino /* If non-zero, non-unique completions show the list of matches, unless it
142*6b445a62SJohn Marino is not possible to do partial completion and modify the line. */
143*6b445a62SJohn Marino int _rl_complete_show_unmodified = 0;
144*6b445a62SJohn Marino
145*6b445a62SJohn Marino /* If non-zero, completed directory names have a slash appended. */
146*6b445a62SJohn Marino int _rl_complete_mark_directories = 1;
147*6b445a62SJohn Marino
148*6b445a62SJohn Marino /* If non-zero, the symlinked directory completion behavior introduced in
149*6b445a62SJohn Marino readline-4.2a is disabled, and symlinks that point to directories have
150*6b445a62SJohn Marino a slash appended (subject to the value of _rl_complete_mark_directories).
151*6b445a62SJohn Marino This is user-settable via the mark-symlinked-directories variable. */
152*6b445a62SJohn Marino int _rl_complete_mark_symlink_dirs = 0;
153*6b445a62SJohn Marino
154*6b445a62SJohn Marino /* If non-zero, completions are printed horizontally in alphabetical order,
155*6b445a62SJohn Marino like `ls -x'. */
156*6b445a62SJohn Marino int _rl_print_completions_horizontally;
157*6b445a62SJohn Marino
158*6b445a62SJohn Marino /* Non-zero means that case is not significant in filename completion. */
159*6b445a62SJohn Marino #if defined (__MSDOS__) && !defined (__DJGPP__)
160*6b445a62SJohn Marino int _rl_completion_case_fold = 1;
161*6b445a62SJohn Marino #else
162*6b445a62SJohn Marino int _rl_completion_case_fold = 0;
163*6b445a62SJohn Marino #endif
164*6b445a62SJohn Marino
165*6b445a62SJohn Marino /* Non-zero means that `-' and `_' are equivalent when comparing filenames
166*6b445a62SJohn Marino for completion. */
167*6b445a62SJohn Marino int _rl_completion_case_map = 0;
168*6b445a62SJohn Marino
169*6b445a62SJohn Marino /* If zero, don't match hidden files (filenames beginning with a `.' on
170*6b445a62SJohn Marino Unix) when doing filename completion. */
171*6b445a62SJohn Marino int _rl_match_hidden_files = 1;
172*6b445a62SJohn Marino
173*6b445a62SJohn Marino /* Length in characters of a common prefix replaced with an ellipsis (`...')
174*6b445a62SJohn Marino when displaying completion matches. Matches whose printable portion has
175*6b445a62SJohn Marino more than this number of displaying characters in common will have the common
176*6b445a62SJohn Marino display prefix replaced with an ellipsis. */
177*6b445a62SJohn Marino int _rl_completion_prefix_display_length = 0;
178*6b445a62SJohn Marino
179*6b445a62SJohn Marino /* The readline-private number of screen columns to use when displaying
180*6b445a62SJohn Marino matches. If < 0 or > _rl_screenwidth, it is ignored. */
181*6b445a62SJohn Marino int _rl_completion_columns = -1;
182*6b445a62SJohn Marino
183*6b445a62SJohn Marino /* Global variables available to applications using readline. */
184*6b445a62SJohn Marino
185*6b445a62SJohn Marino #if defined (VISIBLE_STATS)
186*6b445a62SJohn Marino /* Non-zero means add an additional character to each filename displayed
187*6b445a62SJohn Marino during listing completion iff rl_filename_completion_desired which helps
188*6b445a62SJohn Marino to indicate the type of file being listed. */
189*6b445a62SJohn Marino int rl_visible_stats = 0;
190*6b445a62SJohn Marino #endif /* VISIBLE_STATS */
191*6b445a62SJohn Marino
192*6b445a62SJohn Marino /* If non-zero, when completing in the middle of a word, don't insert
193*6b445a62SJohn Marino characters from the match that match characters following point in
194*6b445a62SJohn Marino the word. This means, for instance, completing when the cursor is
195*6b445a62SJohn Marino after the `e' in `Makefile' won't result in `Makefilefile'. */
196*6b445a62SJohn Marino int _rl_skip_completed_text = 0;
197*6b445a62SJohn Marino
198*6b445a62SJohn Marino /* If non-zero, menu completion displays the common prefix first in the
199*6b445a62SJohn Marino cycle of possible completions instead of the last. */
200*6b445a62SJohn Marino int _rl_menu_complete_prefix_first = 0;
201*6b445a62SJohn Marino
202*6b445a62SJohn Marino /* If non-zero, then this is the address of a function to call when
203*6b445a62SJohn Marino completing on a directory name. The function is called with
204*6b445a62SJohn Marino the address of a string (the current directory name) as an arg. */
205*6b445a62SJohn Marino rl_icppfunc_t *rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
206*6b445a62SJohn Marino
207*6b445a62SJohn Marino rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
208*6b445a62SJohn Marino
209*6b445a62SJohn Marino /* If non-zero, this is the address of a function to call when reading
210*6b445a62SJohn Marino directory entries from the filesystem for completion and comparing
211*6b445a62SJohn Marino them to the partial word to be completed. The function should
212*6b445a62SJohn Marino either return its first argument (if no conversion takes place) or
213*6b445a62SJohn Marino newly-allocated memory. This can, for instance, convert filenames
214*6b445a62SJohn Marino between character sets for comparison against what's typed at the
215*6b445a62SJohn Marino keyboard. The returned value is what is added to the list of
216*6b445a62SJohn Marino matches. The second argument is the length of the filename to be
217*6b445a62SJohn Marino converted. */
218*6b445a62SJohn Marino rl_dequote_func_t *rl_filename_rewrite_hook = (rl_dequote_func_t *)NULL;
219*6b445a62SJohn Marino
220*6b445a62SJohn Marino /* Non-zero means readline completion functions perform tilde expansion. */
221*6b445a62SJohn Marino int rl_complete_with_tilde_expansion = 0;
222*6b445a62SJohn Marino
223*6b445a62SJohn Marino /* Pointer to the generator function for completion_matches ().
224*6b445a62SJohn Marino NULL means to use rl_filename_completion_function (), the default filename
225*6b445a62SJohn Marino completer. */
226*6b445a62SJohn Marino rl_compentry_func_t *rl_completion_entry_function = (rl_compentry_func_t *)NULL;
227*6b445a62SJohn Marino
228*6b445a62SJohn Marino /* Pointer to generator function for rl_menu_complete (). NULL means to use
229*6b445a62SJohn Marino *rl_completion_entry_function (see above). */
230*6b445a62SJohn Marino rl_compentry_func_t *rl_menu_completion_entry_function = (rl_compentry_func_t *)NULL;
231*6b445a62SJohn Marino
232*6b445a62SJohn Marino /* Pointer to alternative function to create matches.
233*6b445a62SJohn Marino Function is called with TEXT, START, and END.
234*6b445a62SJohn Marino START and END are indices in RL_LINE_BUFFER saying what the boundaries
235*6b445a62SJohn Marino of TEXT are.
236*6b445a62SJohn Marino If this function exists and returns NULL then call the value of
237*6b445a62SJohn Marino rl_completion_entry_function to try to match, otherwise use the
238*6b445a62SJohn Marino array of strings returned. */
239*6b445a62SJohn Marino rl_completion_func_t *rl_attempted_completion_function = (rl_completion_func_t *)NULL;
240*6b445a62SJohn Marino
241*6b445a62SJohn Marino /* Non-zero means to suppress normal filename completion after the
242*6b445a62SJohn Marino user-specified completion function has been called. */
243*6b445a62SJohn Marino int rl_attempted_completion_over = 0;
244*6b445a62SJohn Marino
245*6b445a62SJohn Marino /* Set to a character indicating the type of completion being performed
246*6b445a62SJohn Marino by rl_complete_internal, available for use by application completion
247*6b445a62SJohn Marino functions. */
248*6b445a62SJohn Marino int rl_completion_type = 0;
249*6b445a62SJohn Marino
250*6b445a62SJohn Marino /* Up to this many items will be displayed in response to a
251*6b445a62SJohn Marino possible-completions call. After that, we ask the user if
252*6b445a62SJohn Marino she is sure she wants to see them all. A negative value means
253*6b445a62SJohn Marino don't ask. */
254*6b445a62SJohn Marino int rl_completion_query_items = 100;
255*6b445a62SJohn Marino
256*6b445a62SJohn Marino int _rl_page_completions = 1;
257*6b445a62SJohn Marino
258*6b445a62SJohn Marino /* The basic list of characters that signal a break between words for the
259*6b445a62SJohn Marino completer routine. The contents of this variable is what breaks words
260*6b445a62SJohn Marino in the shell, i.e. " \t\n\"\\'`@$><=" */
261*6b445a62SJohn Marino const char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{("; /* }) */
262*6b445a62SJohn Marino
263*6b445a62SJohn Marino /* List of basic quoting characters. */
264*6b445a62SJohn Marino const char *rl_basic_quote_characters = "\"'";
265*6b445a62SJohn Marino
266*6b445a62SJohn Marino /* The list of characters that signal a break between words for
267*6b445a62SJohn Marino rl_complete_internal. The default list is the contents of
268*6b445a62SJohn Marino rl_basic_word_break_characters. */
269*6b445a62SJohn Marino /*const*/ char *rl_completer_word_break_characters = (/*const*/ char *)NULL;
270*6b445a62SJohn Marino
271*6b445a62SJohn Marino /* Hook function to allow an application to set the completion word
272*6b445a62SJohn Marino break characters before readline breaks up the line. Allows
273*6b445a62SJohn Marino position-dependent word break characters. */
274*6b445a62SJohn Marino rl_cpvfunc_t *rl_completion_word_break_hook = (rl_cpvfunc_t *)NULL;
275*6b445a62SJohn Marino
276*6b445a62SJohn Marino /* List of characters which can be used to quote a substring of the line.
277*6b445a62SJohn Marino Completion occurs on the entire substring, and within the substring
278*6b445a62SJohn Marino rl_completer_word_break_characters are treated as any other character,
279*6b445a62SJohn Marino unless they also appear within this list. */
280*6b445a62SJohn Marino const char *rl_completer_quote_characters = (const char *)NULL;
281*6b445a62SJohn Marino
282*6b445a62SJohn Marino /* List of characters that should be quoted in filenames by the completer. */
283*6b445a62SJohn Marino const char *rl_filename_quote_characters = (const char *)NULL;
284*6b445a62SJohn Marino
285*6b445a62SJohn Marino /* List of characters that are word break characters, but should be left
286*6b445a62SJohn Marino in TEXT when it is passed to the completion function. The shell uses
287*6b445a62SJohn Marino this to help determine what kind of completing to do. */
288*6b445a62SJohn Marino const char *rl_special_prefixes = (const char *)NULL;
289*6b445a62SJohn Marino
290*6b445a62SJohn Marino /* If non-zero, then disallow duplicates in the matches. */
291*6b445a62SJohn Marino int rl_ignore_completion_duplicates = 1;
292*6b445a62SJohn Marino
293*6b445a62SJohn Marino /* Non-zero means that the results of the matches are to be treated
294*6b445a62SJohn Marino as filenames. This is ALWAYS zero on entry, and can only be changed
295*6b445a62SJohn Marino within a completion entry finder function. */
296*6b445a62SJohn Marino int rl_filename_completion_desired = 0;
297*6b445a62SJohn Marino
298*6b445a62SJohn Marino /* Non-zero means that the results of the matches are to be quoted using
299*6b445a62SJohn Marino double quotes (or an application-specific quoting mechanism) if the
300*6b445a62SJohn Marino filename contains any characters in rl_filename_quote_chars. This is
301*6b445a62SJohn Marino ALWAYS non-zero on entry, and can only be changed within a completion
302*6b445a62SJohn Marino entry finder function. */
303*6b445a62SJohn Marino int rl_filename_quoting_desired = 1;
304*6b445a62SJohn Marino
305*6b445a62SJohn Marino /* This function, if defined, is called by the completer when real
306*6b445a62SJohn Marino filename completion is done, after all the matching names have been
307*6b445a62SJohn Marino generated. It is passed a (char**) known as matches in the code below.
308*6b445a62SJohn Marino It consists of a NULL-terminated array of pointers to potential
309*6b445a62SJohn Marino matching strings. The 1st element (matches[0]) is the maximal
310*6b445a62SJohn Marino substring that is common to all matches. This function can re-arrange
311*6b445a62SJohn Marino the list of matches as required, but all elements of the array must be
312*6b445a62SJohn Marino free()'d if they are deleted. The main intent of this function is
313*6b445a62SJohn Marino to implement FIGNORE a la SunOS csh. */
314*6b445a62SJohn Marino rl_compignore_func_t *rl_ignore_some_completions_function = (rl_compignore_func_t *)NULL;
315*6b445a62SJohn Marino
316*6b445a62SJohn Marino /* Set to a function to quote a filename in an application-specific fashion.
317*6b445a62SJohn Marino Called with the text to quote, the type of match found (single or multiple)
318*6b445a62SJohn Marino and a pointer to the quoting character to be used, which the function can
319*6b445a62SJohn Marino reset if desired. */
320*6b445a62SJohn Marino rl_quote_func_t *rl_filename_quoting_function = rl_quote_filename;
321*6b445a62SJohn Marino
322*6b445a62SJohn Marino /* Function to call to remove quoting characters from a filename. Called
323*6b445a62SJohn Marino before completion is attempted, so the embedded quotes do not interfere
324*6b445a62SJohn Marino with matching names in the file system. Readline doesn't do anything
325*6b445a62SJohn Marino with this; it's set only by applications. */
326*6b445a62SJohn Marino rl_dequote_func_t *rl_filename_dequoting_function = (rl_dequote_func_t *)NULL;
327*6b445a62SJohn Marino
328*6b445a62SJohn Marino /* Function to call to decide whether or not a word break character is
329*6b445a62SJohn Marino quoted. If a character is quoted, it does not break words for the
330*6b445a62SJohn Marino completer. */
331*6b445a62SJohn Marino rl_linebuf_func_t *rl_char_is_quoted_p = (rl_linebuf_func_t *)NULL;
332*6b445a62SJohn Marino
333*6b445a62SJohn Marino /* If non-zero, the completion functions don't append anything except a
334*6b445a62SJohn Marino possible closing quote. This is set to 0 by rl_complete_internal and
335*6b445a62SJohn Marino may be changed by an application-specific completion function. */
336*6b445a62SJohn Marino int rl_completion_suppress_append = 0;
337*6b445a62SJohn Marino
338*6b445a62SJohn Marino /* Character appended to completed words when at the end of the line. The
339*6b445a62SJohn Marino default is a space. */
340*6b445a62SJohn Marino int rl_completion_append_character = ' ';
341*6b445a62SJohn Marino
342*6b445a62SJohn Marino /* If non-zero, the completion functions don't append any closing quote.
343*6b445a62SJohn Marino This is set to 0 by rl_complete_internal and may be changed by an
344*6b445a62SJohn Marino application-specific completion function. */
345*6b445a62SJohn Marino int rl_completion_suppress_quote = 0;
346*6b445a62SJohn Marino
347*6b445a62SJohn Marino /* Set to any quote character readline thinks it finds before any application
348*6b445a62SJohn Marino completion function is called. */
349*6b445a62SJohn Marino int rl_completion_quote_character;
350*6b445a62SJohn Marino
351*6b445a62SJohn Marino /* Set to a non-zero value if readline found quoting anywhere in the word to
352*6b445a62SJohn Marino be completed; set before any application completion function is called. */
353*6b445a62SJohn Marino int rl_completion_found_quote;
354*6b445a62SJohn Marino
355*6b445a62SJohn Marino /* If non-zero, a slash will be appended to completed filenames that are
356*6b445a62SJohn Marino symbolic links to directory names, subject to the value of the
357*6b445a62SJohn Marino mark-directories variable (which is user-settable). This exists so
358*6b445a62SJohn Marino that application completion functions can override the user's preference
359*6b445a62SJohn Marino (set via the mark-symlinked-directories variable) if appropriate.
360*6b445a62SJohn Marino It's set to the value of _rl_complete_mark_symlink_dirs in
361*6b445a62SJohn Marino rl_complete_internal before any application-specific completion
362*6b445a62SJohn Marino function is called, so without that function doing anything, the user's
363*6b445a62SJohn Marino preferences are honored. */
364*6b445a62SJohn Marino int rl_completion_mark_symlink_dirs;
365*6b445a62SJohn Marino
366*6b445a62SJohn Marino /* If non-zero, inhibit completion (temporarily). */
367*6b445a62SJohn Marino int rl_inhibit_completion;
368*6b445a62SJohn Marino
369*6b445a62SJohn Marino /* Set to the last key used to invoke one of the completion functions */
370*6b445a62SJohn Marino int rl_completion_invoking_key;
371*6b445a62SJohn Marino
372*6b445a62SJohn Marino /* If non-zero, sort the completion matches. On by default. */
373*6b445a62SJohn Marino int rl_sort_completion_matches = 1;
374*6b445a62SJohn Marino
375*6b445a62SJohn Marino /* Variables local to this file. */
376*6b445a62SJohn Marino
377*6b445a62SJohn Marino /* Local variable states what happened during the last completion attempt. */
378*6b445a62SJohn Marino static int completion_changed_buffer;
379*6b445a62SJohn Marino
380*6b445a62SJohn Marino /* The result of the query to the user about displaying completion matches */
381*6b445a62SJohn Marino static int completion_y_or_n;
382*6b445a62SJohn Marino
383*6b445a62SJohn Marino /*************************************/
384*6b445a62SJohn Marino /* */
385*6b445a62SJohn Marino /* Bindable completion functions */
386*6b445a62SJohn Marino /* */
387*6b445a62SJohn Marino /*************************************/
388*6b445a62SJohn Marino
389*6b445a62SJohn Marino /* Complete the word at or before point. You have supplied the function
390*6b445a62SJohn Marino that does the initial simple matching selection algorithm (see
391*6b445a62SJohn Marino rl_completion_matches ()). The default is to do filename completion. */
392*6b445a62SJohn Marino int
rl_complete(ignore,invoking_key)393*6b445a62SJohn Marino rl_complete (ignore, invoking_key)
394*6b445a62SJohn Marino int ignore, invoking_key;
395*6b445a62SJohn Marino {
396*6b445a62SJohn Marino rl_completion_invoking_key = invoking_key;
397*6b445a62SJohn Marino
398*6b445a62SJohn Marino if (rl_inhibit_completion)
399*6b445a62SJohn Marino return (_rl_insert_char (ignore, invoking_key));
400*6b445a62SJohn Marino else if (rl_last_func == rl_complete && !completion_changed_buffer)
401*6b445a62SJohn Marino return (rl_complete_internal ('?'));
402*6b445a62SJohn Marino else if (_rl_complete_show_all)
403*6b445a62SJohn Marino return (rl_complete_internal ('!'));
404*6b445a62SJohn Marino else if (_rl_complete_show_unmodified)
405*6b445a62SJohn Marino return (rl_complete_internal ('@'));
406*6b445a62SJohn Marino else
407*6b445a62SJohn Marino return (rl_complete_internal (TAB));
408*6b445a62SJohn Marino }
409*6b445a62SJohn Marino
410*6b445a62SJohn Marino /* List the possible completions. See description of rl_complete (). */
411*6b445a62SJohn Marino int
rl_possible_completions(ignore,invoking_key)412*6b445a62SJohn Marino rl_possible_completions (ignore, invoking_key)
413*6b445a62SJohn Marino int ignore, invoking_key;
414*6b445a62SJohn Marino {
415*6b445a62SJohn Marino rl_completion_invoking_key = invoking_key;
416*6b445a62SJohn Marino return (rl_complete_internal ('?'));
417*6b445a62SJohn Marino }
418*6b445a62SJohn Marino
419*6b445a62SJohn Marino int
rl_insert_completions(ignore,invoking_key)420*6b445a62SJohn Marino rl_insert_completions (ignore, invoking_key)
421*6b445a62SJohn Marino int ignore, invoking_key;
422*6b445a62SJohn Marino {
423*6b445a62SJohn Marino rl_completion_invoking_key = invoking_key;
424*6b445a62SJohn Marino return (rl_complete_internal ('*'));
425*6b445a62SJohn Marino }
426*6b445a62SJohn Marino
427*6b445a62SJohn Marino /* Return the correct value to pass to rl_complete_internal performing
428*6b445a62SJohn Marino the same tests as rl_complete. This allows consecutive calls to an
429*6b445a62SJohn Marino application's completion function to list possible completions and for
430*6b445a62SJohn Marino an application-specific completion function to honor the
431*6b445a62SJohn Marino show-all-if-ambiguous readline variable. */
432*6b445a62SJohn Marino int
rl_completion_mode(cfunc)433*6b445a62SJohn Marino rl_completion_mode (cfunc)
434*6b445a62SJohn Marino rl_command_func_t *cfunc;
435*6b445a62SJohn Marino {
436*6b445a62SJohn Marino if (rl_last_func == cfunc && !completion_changed_buffer)
437*6b445a62SJohn Marino return '?';
438*6b445a62SJohn Marino else if (_rl_complete_show_all)
439*6b445a62SJohn Marino return '!';
440*6b445a62SJohn Marino else if (_rl_complete_show_unmodified)
441*6b445a62SJohn Marino return '@';
442*6b445a62SJohn Marino else
443*6b445a62SJohn Marino return TAB;
444*6b445a62SJohn Marino }
445*6b445a62SJohn Marino
446*6b445a62SJohn Marino /************************************/
447*6b445a62SJohn Marino /* */
448*6b445a62SJohn Marino /* Completion utility functions */
449*6b445a62SJohn Marino /* */
450*6b445a62SJohn Marino /************************************/
451*6b445a62SJohn Marino
452*6b445a62SJohn Marino /* Reset readline state on a signal or other event. */
453*6b445a62SJohn Marino void
_rl_reset_completion_state()454*6b445a62SJohn Marino _rl_reset_completion_state ()
455*6b445a62SJohn Marino {
456*6b445a62SJohn Marino rl_completion_found_quote = 0;
457*6b445a62SJohn Marino rl_completion_quote_character = 0;
458*6b445a62SJohn Marino }
459*6b445a62SJohn Marino
460*6b445a62SJohn Marino /* Set default values for readline word completion. These are the variables
461*6b445a62SJohn Marino that application completion functions can change or inspect. */
462*6b445a62SJohn Marino static void
set_completion_defaults(what_to_do)463*6b445a62SJohn Marino set_completion_defaults (what_to_do)
464*6b445a62SJohn Marino int what_to_do;
465*6b445a62SJohn Marino {
466*6b445a62SJohn Marino /* Only the completion entry function can change these. */
467*6b445a62SJohn Marino rl_filename_completion_desired = 0;
468*6b445a62SJohn Marino rl_filename_quoting_desired = 1;
469*6b445a62SJohn Marino rl_completion_type = what_to_do;
470*6b445a62SJohn Marino rl_completion_suppress_append = rl_completion_suppress_quote = 0;
471*6b445a62SJohn Marino rl_completion_append_character = ' ';
472*6b445a62SJohn Marino
473*6b445a62SJohn Marino /* The completion entry function may optionally change this. */
474*6b445a62SJohn Marino rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs;
475*6b445a62SJohn Marino }
476*6b445a62SJohn Marino
477*6b445a62SJohn Marino /* The user must press "y" or "n". Non-zero return means "y" pressed. */
478*6b445a62SJohn Marino static int
get_y_or_n(for_pager)479*6b445a62SJohn Marino get_y_or_n (for_pager)
480*6b445a62SJohn Marino int for_pager;
481*6b445a62SJohn Marino {
482*6b445a62SJohn Marino int c;
483*6b445a62SJohn Marino
484*6b445a62SJohn Marino /* Disabled for GDB due to the gdb.base/readline-ask.exp regression.
485*6b445a62SJohn Marino [patch] testsuite: Test readline-6.2 "ask" regression
486*6b445a62SJohn Marino http://sourceware.org/ml/gdb-patches/2011-05/msg00002.html */
487*6b445a62SJohn Marino #if 0
488*6b445a62SJohn Marino /* For now, disable pager in callback mode, until we later convert to state
489*6b445a62SJohn Marino driven functions. Have to wait until next major version to add new
490*6b445a62SJohn Marino state definition, since it will change value of RL_STATE_DONE. */
491*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
492*6b445a62SJohn Marino if (RL_ISSTATE (RL_STATE_CALLBACK))
493*6b445a62SJohn Marino return 1;
494*6b445a62SJohn Marino #endif
495*6b445a62SJohn Marino #endif
496*6b445a62SJohn Marino
497*6b445a62SJohn Marino for (;;)
498*6b445a62SJohn Marino {
499*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_MOREINPUT);
500*6b445a62SJohn Marino c = rl_read_key ();
501*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_MOREINPUT);
502*6b445a62SJohn Marino
503*6b445a62SJohn Marino if (c == 'y' || c == 'Y' || c == ' ')
504*6b445a62SJohn Marino return (1);
505*6b445a62SJohn Marino if (c == 'n' || c == 'N' || c == RUBOUT)
506*6b445a62SJohn Marino return (0);
507*6b445a62SJohn Marino if (c == ABORT_CHAR || c < 0)
508*6b445a62SJohn Marino _rl_abort_internal ();
509*6b445a62SJohn Marino if (for_pager && (c == NEWLINE || c == RETURN))
510*6b445a62SJohn Marino return (2);
511*6b445a62SJohn Marino if (for_pager && (c == 'q' || c == 'Q'))
512*6b445a62SJohn Marino return (0);
513*6b445a62SJohn Marino rl_ding ();
514*6b445a62SJohn Marino }
515*6b445a62SJohn Marino }
516*6b445a62SJohn Marino
517*6b445a62SJohn Marino static int
_rl_internal_pager(lines)518*6b445a62SJohn Marino _rl_internal_pager (lines)
519*6b445a62SJohn Marino int lines;
520*6b445a62SJohn Marino {
521*6b445a62SJohn Marino int i;
522*6b445a62SJohn Marino
523*6b445a62SJohn Marino fprintf (rl_outstream, "--More--");
524*6b445a62SJohn Marino fflush (rl_outstream);
525*6b445a62SJohn Marino i = get_y_or_n (1);
526*6b445a62SJohn Marino _rl_erase_entire_line ();
527*6b445a62SJohn Marino if (i == 0)
528*6b445a62SJohn Marino return -1;
529*6b445a62SJohn Marino else if (i == 2)
530*6b445a62SJohn Marino return (lines - 1);
531*6b445a62SJohn Marino else
532*6b445a62SJohn Marino return 0;
533*6b445a62SJohn Marino }
534*6b445a62SJohn Marino
535*6b445a62SJohn Marino static int
path_isdir(filename)536*6b445a62SJohn Marino path_isdir (filename)
537*6b445a62SJohn Marino const char *filename;
538*6b445a62SJohn Marino {
539*6b445a62SJohn Marino struct stat finfo;
540*6b445a62SJohn Marino
541*6b445a62SJohn Marino return (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode));
542*6b445a62SJohn Marino }
543*6b445a62SJohn Marino
544*6b445a62SJohn Marino #if defined (VISIBLE_STATS)
545*6b445a62SJohn Marino /* Return the character which best describes FILENAME.
546*6b445a62SJohn Marino `@' for symbolic links
547*6b445a62SJohn Marino `/' for directories
548*6b445a62SJohn Marino `*' for executables
549*6b445a62SJohn Marino `=' for sockets
550*6b445a62SJohn Marino `|' for FIFOs
551*6b445a62SJohn Marino `%' for character special devices
552*6b445a62SJohn Marino `#' for block special devices */
553*6b445a62SJohn Marino static int
stat_char(filename)554*6b445a62SJohn Marino stat_char (filename)
555*6b445a62SJohn Marino char *filename;
556*6b445a62SJohn Marino {
557*6b445a62SJohn Marino struct stat finfo;
558*6b445a62SJohn Marino int character, r;
559*6b445a62SJohn Marino
560*6b445a62SJohn Marino /* Short-circuit a //server on cygwin, since that will always behave as
561*6b445a62SJohn Marino a directory. */
562*6b445a62SJohn Marino #if __CYGWIN__
563*6b445a62SJohn Marino if (filename[0] == '/' && filename[1] == '/' && strchr (filename+2, '/') == 0)
564*6b445a62SJohn Marino return '/';
565*6b445a62SJohn Marino #endif
566*6b445a62SJohn Marino
567*6b445a62SJohn Marino #if defined (HAVE_LSTAT) && defined (S_ISLNK)
568*6b445a62SJohn Marino r = lstat (filename, &finfo);
569*6b445a62SJohn Marino #else
570*6b445a62SJohn Marino r = stat (filename, &finfo);
571*6b445a62SJohn Marino #endif
572*6b445a62SJohn Marino
573*6b445a62SJohn Marino if (r == -1)
574*6b445a62SJohn Marino return (0);
575*6b445a62SJohn Marino
576*6b445a62SJohn Marino character = 0;
577*6b445a62SJohn Marino if (S_ISDIR (finfo.st_mode))
578*6b445a62SJohn Marino character = '/';
579*6b445a62SJohn Marino #if defined (S_ISCHR)
580*6b445a62SJohn Marino else if (S_ISCHR (finfo.st_mode))
581*6b445a62SJohn Marino character = '%';
582*6b445a62SJohn Marino #endif /* S_ISCHR */
583*6b445a62SJohn Marino #if defined (S_ISBLK)
584*6b445a62SJohn Marino else if (S_ISBLK (finfo.st_mode))
585*6b445a62SJohn Marino character = '#';
586*6b445a62SJohn Marino #endif /* S_ISBLK */
587*6b445a62SJohn Marino #if defined (S_ISLNK)
588*6b445a62SJohn Marino else if (S_ISLNK (finfo.st_mode))
589*6b445a62SJohn Marino character = '@';
590*6b445a62SJohn Marino #endif /* S_ISLNK */
591*6b445a62SJohn Marino #if defined (S_ISSOCK)
592*6b445a62SJohn Marino else if (S_ISSOCK (finfo.st_mode))
593*6b445a62SJohn Marino character = '=';
594*6b445a62SJohn Marino #endif /* S_ISSOCK */
595*6b445a62SJohn Marino #if defined (S_ISFIFO)
596*6b445a62SJohn Marino else if (S_ISFIFO (finfo.st_mode))
597*6b445a62SJohn Marino character = '|';
598*6b445a62SJohn Marino #endif
599*6b445a62SJohn Marino else if (S_ISREG (finfo.st_mode))
600*6b445a62SJohn Marino {
601*6b445a62SJohn Marino if (access (filename, X_OK) == 0)
602*6b445a62SJohn Marino character = '*';
603*6b445a62SJohn Marino }
604*6b445a62SJohn Marino return (character);
605*6b445a62SJohn Marino }
606*6b445a62SJohn Marino #endif /* VISIBLE_STATS */
607*6b445a62SJohn Marino
608*6b445a62SJohn Marino /* Return the portion of PATHNAME that should be output when listing
609*6b445a62SJohn Marino possible completions. If we are hacking filename completion, we
610*6b445a62SJohn Marino are only interested in the basename, the portion following the
611*6b445a62SJohn Marino final slash. Otherwise, we return what we were passed. Since
612*6b445a62SJohn Marino printing empty strings is not very informative, if we're doing
613*6b445a62SJohn Marino filename completion, and the basename is the empty string, we look
614*6b445a62SJohn Marino for the previous slash and return the portion following that. If
615*6b445a62SJohn Marino there's no previous slash, we just return what we were passed. */
616*6b445a62SJohn Marino static char *
printable_part(pathname)617*6b445a62SJohn Marino printable_part (pathname)
618*6b445a62SJohn Marino char *pathname;
619*6b445a62SJohn Marino {
620*6b445a62SJohn Marino char *temp, *x;
621*6b445a62SJohn Marino
622*6b445a62SJohn Marino if (rl_filename_completion_desired == 0) /* don't need to do anything */
623*6b445a62SJohn Marino return (pathname);
624*6b445a62SJohn Marino
625*6b445a62SJohn Marino temp = strrchr (pathname, '/');
626*6b445a62SJohn Marino #if defined (__MSDOS__)
627*6b445a62SJohn Marino if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':')
628*6b445a62SJohn Marino temp = pathname + 1;
629*6b445a62SJohn Marino #endif
630*6b445a62SJohn Marino
631*6b445a62SJohn Marino if (temp == 0 || *temp == '\0')
632*6b445a62SJohn Marino return (pathname);
633*6b445a62SJohn Marino /* If the basename is NULL, we might have a pathname like '/usr/src/'.
634*6b445a62SJohn Marino Look for a previous slash and, if one is found, return the portion
635*6b445a62SJohn Marino following that slash. If there's no previous slash, just return the
636*6b445a62SJohn Marino pathname we were passed. */
637*6b445a62SJohn Marino else if (temp[1] == '\0')
638*6b445a62SJohn Marino {
639*6b445a62SJohn Marino for (x = temp - 1; x > pathname; x--)
640*6b445a62SJohn Marino if (*x == '/')
641*6b445a62SJohn Marino break;
642*6b445a62SJohn Marino return ((*x == '/') ? x + 1 : pathname);
643*6b445a62SJohn Marino }
644*6b445a62SJohn Marino else
645*6b445a62SJohn Marino return ++temp;
646*6b445a62SJohn Marino }
647*6b445a62SJohn Marino
648*6b445a62SJohn Marino /* Compute width of STRING when displayed on screen by print_filename */
649*6b445a62SJohn Marino static int
fnwidth(string)650*6b445a62SJohn Marino fnwidth (string)
651*6b445a62SJohn Marino const char *string;
652*6b445a62SJohn Marino {
653*6b445a62SJohn Marino int width, pos;
654*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
655*6b445a62SJohn Marino mbstate_t ps;
656*6b445a62SJohn Marino int left, w;
657*6b445a62SJohn Marino size_t clen;
658*6b445a62SJohn Marino wchar_t wc;
659*6b445a62SJohn Marino
660*6b445a62SJohn Marino left = strlen (string) + 1;
661*6b445a62SJohn Marino memset (&ps, 0, sizeof (mbstate_t));
662*6b445a62SJohn Marino #endif
663*6b445a62SJohn Marino
664*6b445a62SJohn Marino width = pos = 0;
665*6b445a62SJohn Marino while (string[pos])
666*6b445a62SJohn Marino {
667*6b445a62SJohn Marino if (CTRL_CHAR (string[pos]) || string[pos] == RUBOUT)
668*6b445a62SJohn Marino {
669*6b445a62SJohn Marino width += 2;
670*6b445a62SJohn Marino pos++;
671*6b445a62SJohn Marino }
672*6b445a62SJohn Marino else
673*6b445a62SJohn Marino {
674*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
675*6b445a62SJohn Marino clen = mbrtowc (&wc, string + pos, left - pos, &ps);
676*6b445a62SJohn Marino if (MB_INVALIDCH (clen))
677*6b445a62SJohn Marino {
678*6b445a62SJohn Marino width++;
679*6b445a62SJohn Marino pos++;
680*6b445a62SJohn Marino memset (&ps, 0, sizeof (mbstate_t));
681*6b445a62SJohn Marino }
682*6b445a62SJohn Marino else if (MB_NULLWCH (clen))
683*6b445a62SJohn Marino break;
684*6b445a62SJohn Marino else
685*6b445a62SJohn Marino {
686*6b445a62SJohn Marino pos += clen;
687*6b445a62SJohn Marino w = wcwidth (wc);
688*6b445a62SJohn Marino width += (w >= 0) ? w : 1;
689*6b445a62SJohn Marino }
690*6b445a62SJohn Marino #else
691*6b445a62SJohn Marino width++;
692*6b445a62SJohn Marino pos++;
693*6b445a62SJohn Marino #endif
694*6b445a62SJohn Marino }
695*6b445a62SJohn Marino }
696*6b445a62SJohn Marino
697*6b445a62SJohn Marino return width;
698*6b445a62SJohn Marino }
699*6b445a62SJohn Marino
700*6b445a62SJohn Marino #define ELLIPSIS_LEN 3
701*6b445a62SJohn Marino
702*6b445a62SJohn Marino static int
fnprint(to_print,prefix_bytes)703*6b445a62SJohn Marino fnprint (to_print, prefix_bytes)
704*6b445a62SJohn Marino const char *to_print;
705*6b445a62SJohn Marino int prefix_bytes;
706*6b445a62SJohn Marino {
707*6b445a62SJohn Marino int printed_len, w;
708*6b445a62SJohn Marino const char *s;
709*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
710*6b445a62SJohn Marino mbstate_t ps;
711*6b445a62SJohn Marino const char *end;
712*6b445a62SJohn Marino size_t tlen;
713*6b445a62SJohn Marino int width;
714*6b445a62SJohn Marino wchar_t wc;
715*6b445a62SJohn Marino
716*6b445a62SJohn Marino end = to_print + strlen (to_print) + 1;
717*6b445a62SJohn Marino memset (&ps, 0, sizeof (mbstate_t));
718*6b445a62SJohn Marino #endif
719*6b445a62SJohn Marino
720*6b445a62SJohn Marino printed_len = 0;
721*6b445a62SJohn Marino
722*6b445a62SJohn Marino /* Don't print only the ellipsis if the common prefix is one of the
723*6b445a62SJohn Marino possible completions */
724*6b445a62SJohn Marino if (to_print[prefix_bytes] == '\0')
725*6b445a62SJohn Marino prefix_bytes = 0;
726*6b445a62SJohn Marino
727*6b445a62SJohn Marino if (prefix_bytes)
728*6b445a62SJohn Marino {
729*6b445a62SJohn Marino char ellipsis;
730*6b445a62SJohn Marino
731*6b445a62SJohn Marino ellipsis = (to_print[prefix_bytes] == '.') ? '_' : '.';
732*6b445a62SJohn Marino for (w = 0; w < ELLIPSIS_LEN; w++)
733*6b445a62SJohn Marino putc (ellipsis, rl_outstream);
734*6b445a62SJohn Marino printed_len = ELLIPSIS_LEN;
735*6b445a62SJohn Marino }
736*6b445a62SJohn Marino
737*6b445a62SJohn Marino s = to_print + prefix_bytes;
738*6b445a62SJohn Marino while (*s)
739*6b445a62SJohn Marino {
740*6b445a62SJohn Marino if (CTRL_CHAR (*s))
741*6b445a62SJohn Marino {
742*6b445a62SJohn Marino putc ('^', rl_outstream);
743*6b445a62SJohn Marino putc (UNCTRL (*s), rl_outstream);
744*6b445a62SJohn Marino printed_len += 2;
745*6b445a62SJohn Marino s++;
746*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
747*6b445a62SJohn Marino memset (&ps, 0, sizeof (mbstate_t));
748*6b445a62SJohn Marino #endif
749*6b445a62SJohn Marino }
750*6b445a62SJohn Marino else if (*s == RUBOUT)
751*6b445a62SJohn Marino {
752*6b445a62SJohn Marino putc ('^', rl_outstream);
753*6b445a62SJohn Marino putc ('?', rl_outstream);
754*6b445a62SJohn Marino printed_len += 2;
755*6b445a62SJohn Marino s++;
756*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
757*6b445a62SJohn Marino memset (&ps, 0, sizeof (mbstate_t));
758*6b445a62SJohn Marino #endif
759*6b445a62SJohn Marino }
760*6b445a62SJohn Marino else
761*6b445a62SJohn Marino {
762*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
763*6b445a62SJohn Marino tlen = mbrtowc (&wc, s, end - s, &ps);
764*6b445a62SJohn Marino if (MB_INVALIDCH (tlen))
765*6b445a62SJohn Marino {
766*6b445a62SJohn Marino tlen = 1;
767*6b445a62SJohn Marino width = 1;
768*6b445a62SJohn Marino memset (&ps, 0, sizeof (mbstate_t));
769*6b445a62SJohn Marino }
770*6b445a62SJohn Marino else if (MB_NULLWCH (tlen))
771*6b445a62SJohn Marino break;
772*6b445a62SJohn Marino else
773*6b445a62SJohn Marino {
774*6b445a62SJohn Marino w = wcwidth (wc);
775*6b445a62SJohn Marino width = (w >= 0) ? w : 1;
776*6b445a62SJohn Marino }
777*6b445a62SJohn Marino fwrite (s, 1, tlen, rl_outstream);
778*6b445a62SJohn Marino s += tlen;
779*6b445a62SJohn Marino printed_len += width;
780*6b445a62SJohn Marino #else
781*6b445a62SJohn Marino putc (*s, rl_outstream);
782*6b445a62SJohn Marino s++;
783*6b445a62SJohn Marino printed_len++;
784*6b445a62SJohn Marino #endif
785*6b445a62SJohn Marino }
786*6b445a62SJohn Marino }
787*6b445a62SJohn Marino
788*6b445a62SJohn Marino return printed_len;
789*6b445a62SJohn Marino }
790*6b445a62SJohn Marino
791*6b445a62SJohn Marino /* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and we
792*6b445a62SJohn Marino are using it, check for and output a single character for `special'
793*6b445a62SJohn Marino filenames. Return the number of characters we output. */
794*6b445a62SJohn Marino
795*6b445a62SJohn Marino static int
print_filename(to_print,full_pathname,prefix_bytes)796*6b445a62SJohn Marino print_filename (to_print, full_pathname, prefix_bytes)
797*6b445a62SJohn Marino char *to_print, *full_pathname;
798*6b445a62SJohn Marino int prefix_bytes;
799*6b445a62SJohn Marino {
800*6b445a62SJohn Marino int printed_len, extension_char, slen, tlen;
801*6b445a62SJohn Marino char *s, c, *new_full_pathname, *dn;
802*6b445a62SJohn Marino
803*6b445a62SJohn Marino extension_char = 0;
804*6b445a62SJohn Marino printed_len = fnprint (to_print, prefix_bytes);
805*6b445a62SJohn Marino
806*6b445a62SJohn Marino #if defined (VISIBLE_STATS)
807*6b445a62SJohn Marino if (rl_filename_completion_desired && (rl_visible_stats || _rl_complete_mark_directories))
808*6b445a62SJohn Marino #else
809*6b445a62SJohn Marino if (rl_filename_completion_desired && _rl_complete_mark_directories)
810*6b445a62SJohn Marino #endif
811*6b445a62SJohn Marino {
812*6b445a62SJohn Marino /* If to_print != full_pathname, to_print is the basename of the
813*6b445a62SJohn Marino path passed. In this case, we try to expand the directory
814*6b445a62SJohn Marino name before checking for the stat character. */
815*6b445a62SJohn Marino if (to_print != full_pathname)
816*6b445a62SJohn Marino {
817*6b445a62SJohn Marino /* Terminate the directory name. */
818*6b445a62SJohn Marino c = to_print[-1];
819*6b445a62SJohn Marino to_print[-1] = '\0';
820*6b445a62SJohn Marino
821*6b445a62SJohn Marino /* If setting the last slash in full_pathname to a NUL results in
822*6b445a62SJohn Marino full_pathname being the empty string, we are trying to complete
823*6b445a62SJohn Marino files in the root directory. If we pass a null string to the
824*6b445a62SJohn Marino bash directory completion hook, for example, it will expand it
825*6b445a62SJohn Marino to the current directory. We just want the `/'. */
826*6b445a62SJohn Marino if (full_pathname == 0 || *full_pathname == 0)
827*6b445a62SJohn Marino dn = "/";
828*6b445a62SJohn Marino else if (full_pathname[0] != '/')
829*6b445a62SJohn Marino dn = full_pathname;
830*6b445a62SJohn Marino else if (full_pathname[1] == 0)
831*6b445a62SJohn Marino dn = "//"; /* restore trailing slash to `//' */
832*6b445a62SJohn Marino else if (full_pathname[1] == '/' && full_pathname[2] == 0)
833*6b445a62SJohn Marino dn = "/"; /* don't turn /// into // */
834*6b445a62SJohn Marino else
835*6b445a62SJohn Marino dn = full_pathname;
836*6b445a62SJohn Marino s = tilde_expand (dn);
837*6b445a62SJohn Marino if (rl_directory_completion_hook)
838*6b445a62SJohn Marino (*rl_directory_completion_hook) (&s);
839*6b445a62SJohn Marino
840*6b445a62SJohn Marino slen = strlen (s);
841*6b445a62SJohn Marino tlen = strlen (to_print);
842*6b445a62SJohn Marino new_full_pathname = (char *)xmalloc (slen + tlen + 2);
843*6b445a62SJohn Marino strcpy (new_full_pathname, s);
844*6b445a62SJohn Marino if (s[slen - 1] == '/')
845*6b445a62SJohn Marino slen--;
846*6b445a62SJohn Marino else
847*6b445a62SJohn Marino new_full_pathname[slen] = '/';
848*6b445a62SJohn Marino new_full_pathname[slen] = '/';
849*6b445a62SJohn Marino strcpy (new_full_pathname + slen + 1, to_print);
850*6b445a62SJohn Marino
851*6b445a62SJohn Marino #if defined (VISIBLE_STATS)
852*6b445a62SJohn Marino if (rl_visible_stats)
853*6b445a62SJohn Marino extension_char = stat_char (new_full_pathname);
854*6b445a62SJohn Marino else
855*6b445a62SJohn Marino #endif
856*6b445a62SJohn Marino if (path_isdir (new_full_pathname))
857*6b445a62SJohn Marino extension_char = '/';
858*6b445a62SJohn Marino
859*6b445a62SJohn Marino xfree (new_full_pathname);
860*6b445a62SJohn Marino to_print[-1] = c;
861*6b445a62SJohn Marino }
862*6b445a62SJohn Marino else
863*6b445a62SJohn Marino {
864*6b445a62SJohn Marino s = tilde_expand (full_pathname);
865*6b445a62SJohn Marino #if defined (VISIBLE_STATS)
866*6b445a62SJohn Marino if (rl_visible_stats)
867*6b445a62SJohn Marino extension_char = stat_char (s);
868*6b445a62SJohn Marino else
869*6b445a62SJohn Marino #endif
870*6b445a62SJohn Marino if (path_isdir (s))
871*6b445a62SJohn Marino extension_char = '/';
872*6b445a62SJohn Marino }
873*6b445a62SJohn Marino
874*6b445a62SJohn Marino xfree (s);
875*6b445a62SJohn Marino if (extension_char)
876*6b445a62SJohn Marino {
877*6b445a62SJohn Marino putc (extension_char, rl_outstream);
878*6b445a62SJohn Marino printed_len++;
879*6b445a62SJohn Marino }
880*6b445a62SJohn Marino }
881*6b445a62SJohn Marino
882*6b445a62SJohn Marino return printed_len;
883*6b445a62SJohn Marino }
884*6b445a62SJohn Marino
885*6b445a62SJohn Marino static char *
rl_quote_filename(s,rtype,qcp)886*6b445a62SJohn Marino rl_quote_filename (s, rtype, qcp)
887*6b445a62SJohn Marino char *s;
888*6b445a62SJohn Marino int rtype;
889*6b445a62SJohn Marino char *qcp;
890*6b445a62SJohn Marino {
891*6b445a62SJohn Marino char *r;
892*6b445a62SJohn Marino
893*6b445a62SJohn Marino r = (char *)xmalloc (strlen (s) + 2);
894*6b445a62SJohn Marino *r = *rl_completer_quote_characters;
895*6b445a62SJohn Marino strcpy (r + 1, s);
896*6b445a62SJohn Marino if (qcp)
897*6b445a62SJohn Marino *qcp = *rl_completer_quote_characters;
898*6b445a62SJohn Marino return r;
899*6b445a62SJohn Marino }
900*6b445a62SJohn Marino
901*6b445a62SJohn Marino /* Find the bounds of the current word for completion purposes, and leave
902*6b445a62SJohn Marino rl_point set to the end of the word. This function skips quoted
903*6b445a62SJohn Marino substrings (characters between matched pairs of characters in
904*6b445a62SJohn Marino rl_completer_quote_characters). First we try to find an unclosed
905*6b445a62SJohn Marino quoted substring on which to do matching. If one is not found, we use
906*6b445a62SJohn Marino the word break characters to find the boundaries of the current word.
907*6b445a62SJohn Marino We call an application-specific function to decide whether or not a
908*6b445a62SJohn Marino particular word break character is quoted; if that function returns a
909*6b445a62SJohn Marino non-zero result, the character does not break a word. This function
910*6b445a62SJohn Marino returns the opening quote character if we found an unclosed quoted
911*6b445a62SJohn Marino substring, '\0' otherwise. FP, if non-null, is set to a value saying
912*6b445a62SJohn Marino which (shell-like) quote characters we found (single quote, double
913*6b445a62SJohn Marino quote, or backslash) anywhere in the string. DP, if non-null, is set to
914*6b445a62SJohn Marino the value of the delimiter character that caused a word break. */
915*6b445a62SJohn Marino
916*6b445a62SJohn Marino char
_rl_find_completion_word(fp,dp)917*6b445a62SJohn Marino _rl_find_completion_word (fp, dp)
918*6b445a62SJohn Marino int *fp, *dp;
919*6b445a62SJohn Marino {
920*6b445a62SJohn Marino int scan, end, found_quote, delimiter, pass_next, isbrk;
921*6b445a62SJohn Marino char quote_char, *brkchars;
922*6b445a62SJohn Marino
923*6b445a62SJohn Marino end = rl_point;
924*6b445a62SJohn Marino found_quote = delimiter = 0;
925*6b445a62SJohn Marino quote_char = '\0';
926*6b445a62SJohn Marino
927*6b445a62SJohn Marino brkchars = 0;
928*6b445a62SJohn Marino if (rl_completion_word_break_hook)
929*6b445a62SJohn Marino brkchars = (*rl_completion_word_break_hook) ();
930*6b445a62SJohn Marino if (brkchars == 0)
931*6b445a62SJohn Marino brkchars = rl_completer_word_break_characters;
932*6b445a62SJohn Marino
933*6b445a62SJohn Marino if (rl_completer_quote_characters)
934*6b445a62SJohn Marino {
935*6b445a62SJohn Marino /* We have a list of characters which can be used in pairs to
936*6b445a62SJohn Marino quote substrings for the completer. Try to find the start
937*6b445a62SJohn Marino of an unclosed quoted substring. */
938*6b445a62SJohn Marino /* FOUND_QUOTE is set so we know what kind of quotes we found. */
939*6b445a62SJohn Marino for (scan = pass_next = 0; scan < end; scan = MB_NEXTCHAR (rl_line_buffer, scan, 1, MB_FIND_ANY))
940*6b445a62SJohn Marino {
941*6b445a62SJohn Marino if (pass_next)
942*6b445a62SJohn Marino {
943*6b445a62SJohn Marino pass_next = 0;
944*6b445a62SJohn Marino continue;
945*6b445a62SJohn Marino }
946*6b445a62SJohn Marino
947*6b445a62SJohn Marino /* Shell-like semantics for single quotes -- don't allow backslash
948*6b445a62SJohn Marino to quote anything in single quotes, especially not the closing
949*6b445a62SJohn Marino quote. If you don't like this, take out the check on the value
950*6b445a62SJohn Marino of quote_char. */
951*6b445a62SJohn Marino if (quote_char != '\'' && rl_line_buffer[scan] == '\\')
952*6b445a62SJohn Marino {
953*6b445a62SJohn Marino pass_next = 1;
954*6b445a62SJohn Marino found_quote |= RL_QF_BACKSLASH;
955*6b445a62SJohn Marino continue;
956*6b445a62SJohn Marino }
957*6b445a62SJohn Marino
958*6b445a62SJohn Marino if (quote_char != '\0')
959*6b445a62SJohn Marino {
960*6b445a62SJohn Marino /* Ignore everything until the matching close quote char. */
961*6b445a62SJohn Marino if (rl_line_buffer[scan] == quote_char)
962*6b445a62SJohn Marino {
963*6b445a62SJohn Marino /* Found matching close. Abandon this substring. */
964*6b445a62SJohn Marino quote_char = '\0';
965*6b445a62SJohn Marino rl_point = end;
966*6b445a62SJohn Marino }
967*6b445a62SJohn Marino }
968*6b445a62SJohn Marino else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan]))
969*6b445a62SJohn Marino {
970*6b445a62SJohn Marino /* Found start of a quoted substring. */
971*6b445a62SJohn Marino quote_char = rl_line_buffer[scan];
972*6b445a62SJohn Marino rl_point = scan + 1;
973*6b445a62SJohn Marino /* Shell-like quoting conventions. */
974*6b445a62SJohn Marino if (quote_char == '\'')
975*6b445a62SJohn Marino found_quote |= RL_QF_SINGLE_QUOTE;
976*6b445a62SJohn Marino else if (quote_char == '"')
977*6b445a62SJohn Marino found_quote |= RL_QF_DOUBLE_QUOTE;
978*6b445a62SJohn Marino else
979*6b445a62SJohn Marino found_quote |= RL_QF_OTHER_QUOTE;
980*6b445a62SJohn Marino }
981*6b445a62SJohn Marino }
982*6b445a62SJohn Marino }
983*6b445a62SJohn Marino
984*6b445a62SJohn Marino if (rl_point == end && quote_char == '\0')
985*6b445a62SJohn Marino {
986*6b445a62SJohn Marino /* We didn't find an unclosed quoted substring upon which to do
987*6b445a62SJohn Marino completion, so use the word break characters to find the
988*6b445a62SJohn Marino substring on which to complete. */
989*6b445a62SJohn Marino while (rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_ANY))
990*6b445a62SJohn Marino {
991*6b445a62SJohn Marino scan = rl_line_buffer[rl_point];
992*6b445a62SJohn Marino
993*6b445a62SJohn Marino if (strchr (brkchars, scan) == 0)
994*6b445a62SJohn Marino continue;
995*6b445a62SJohn Marino
996*6b445a62SJohn Marino /* Call the application-specific function to tell us whether
997*6b445a62SJohn Marino this word break character is quoted and should be skipped. */
998*6b445a62SJohn Marino if (rl_char_is_quoted_p && found_quote &&
999*6b445a62SJohn Marino (*rl_char_is_quoted_p) (rl_line_buffer, rl_point))
1000*6b445a62SJohn Marino continue;
1001*6b445a62SJohn Marino
1002*6b445a62SJohn Marino /* Convoluted code, but it avoids an n^2 algorithm with calls
1003*6b445a62SJohn Marino to char_is_quoted. */
1004*6b445a62SJohn Marino break;
1005*6b445a62SJohn Marino }
1006*6b445a62SJohn Marino }
1007*6b445a62SJohn Marino
1008*6b445a62SJohn Marino /* If we are at an unquoted word break, then advance past it. */
1009*6b445a62SJohn Marino scan = rl_line_buffer[rl_point];
1010*6b445a62SJohn Marino
1011*6b445a62SJohn Marino /* If there is an application-specific function to say whether or not
1012*6b445a62SJohn Marino a character is quoted and we found a quote character, let that
1013*6b445a62SJohn Marino function decide whether or not a character is a word break, even
1014*6b445a62SJohn Marino if it is found in rl_completer_word_break_characters. Don't bother
1015*6b445a62SJohn Marino if we're at the end of the line, though. */
1016*6b445a62SJohn Marino if (scan)
1017*6b445a62SJohn Marino {
1018*6b445a62SJohn Marino if (rl_char_is_quoted_p)
1019*6b445a62SJohn Marino isbrk = (found_quote == 0 ||
1020*6b445a62SJohn Marino (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) &&
1021*6b445a62SJohn Marino strchr (brkchars, scan) != 0;
1022*6b445a62SJohn Marino else
1023*6b445a62SJohn Marino isbrk = strchr (brkchars, scan) != 0;
1024*6b445a62SJohn Marino
1025*6b445a62SJohn Marino if (isbrk)
1026*6b445a62SJohn Marino {
1027*6b445a62SJohn Marino /* If the character that caused the word break was a quoting
1028*6b445a62SJohn Marino character, then remember it as the delimiter. */
1029*6b445a62SJohn Marino if (rl_basic_quote_characters &&
1030*6b445a62SJohn Marino strchr (rl_basic_quote_characters, scan) &&
1031*6b445a62SJohn Marino (end - rl_point) > 1)
1032*6b445a62SJohn Marino delimiter = scan;
1033*6b445a62SJohn Marino
1034*6b445a62SJohn Marino /* If the character isn't needed to determine something special
1035*6b445a62SJohn Marino about what kind of completion to perform, then advance past it. */
1036*6b445a62SJohn Marino if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0)
1037*6b445a62SJohn Marino rl_point++;
1038*6b445a62SJohn Marino }
1039*6b445a62SJohn Marino }
1040*6b445a62SJohn Marino
1041*6b445a62SJohn Marino if (fp)
1042*6b445a62SJohn Marino *fp = found_quote;
1043*6b445a62SJohn Marino if (dp)
1044*6b445a62SJohn Marino *dp = delimiter;
1045*6b445a62SJohn Marino
1046*6b445a62SJohn Marino return (quote_char);
1047*6b445a62SJohn Marino }
1048*6b445a62SJohn Marino
1049*6b445a62SJohn Marino static char **
gen_completion_matches(text,start,end,our_func,found_quote,quote_char)1050*6b445a62SJohn Marino gen_completion_matches (text, start, end, our_func, found_quote, quote_char)
1051*6b445a62SJohn Marino char *text;
1052*6b445a62SJohn Marino int start, end;
1053*6b445a62SJohn Marino rl_compentry_func_t *our_func;
1054*6b445a62SJohn Marino int found_quote, quote_char;
1055*6b445a62SJohn Marino {
1056*6b445a62SJohn Marino char **matches;
1057*6b445a62SJohn Marino
1058*6b445a62SJohn Marino rl_completion_found_quote = found_quote;
1059*6b445a62SJohn Marino rl_completion_quote_character = quote_char;
1060*6b445a62SJohn Marino
1061*6b445a62SJohn Marino /* If the user wants to TRY to complete, but then wants to give
1062*6b445a62SJohn Marino up and use the default completion function, they set the
1063*6b445a62SJohn Marino variable rl_attempted_completion_function. */
1064*6b445a62SJohn Marino if (rl_attempted_completion_function)
1065*6b445a62SJohn Marino {
1066*6b445a62SJohn Marino _rl_interrupt_immediately++;
1067*6b445a62SJohn Marino matches = (*rl_attempted_completion_function) (text, start, end);
1068*6b445a62SJohn Marino if (_rl_interrupt_immediately > 0)
1069*6b445a62SJohn Marino _rl_interrupt_immediately--;
1070*6b445a62SJohn Marino
1071*6b445a62SJohn Marino if (matches || rl_attempted_completion_over)
1072*6b445a62SJohn Marino {
1073*6b445a62SJohn Marino rl_attempted_completion_over = 0;
1074*6b445a62SJohn Marino return (matches);
1075*6b445a62SJohn Marino }
1076*6b445a62SJohn Marino }
1077*6b445a62SJohn Marino
1078*6b445a62SJohn Marino /* XXX -- filename dequoting moved into rl_filename_completion_function */
1079*6b445a62SJohn Marino
1080*6b445a62SJohn Marino matches = rl_completion_matches (text, our_func);
1081*6b445a62SJohn Marino return matches;
1082*6b445a62SJohn Marino }
1083*6b445a62SJohn Marino
1084*6b445a62SJohn Marino /* Filter out duplicates in MATCHES. This frees up the strings in
1085*6b445a62SJohn Marino MATCHES. */
1086*6b445a62SJohn Marino static char **
remove_duplicate_matches(matches)1087*6b445a62SJohn Marino remove_duplicate_matches (matches)
1088*6b445a62SJohn Marino char **matches;
1089*6b445a62SJohn Marino {
1090*6b445a62SJohn Marino char *lowest_common;
1091*6b445a62SJohn Marino int i, j, newlen;
1092*6b445a62SJohn Marino char dead_slot;
1093*6b445a62SJohn Marino char **temp_array;
1094*6b445a62SJohn Marino
1095*6b445a62SJohn Marino /* Sort the items. */
1096*6b445a62SJohn Marino for (i = 0; matches[i]; i++)
1097*6b445a62SJohn Marino ;
1098*6b445a62SJohn Marino
1099*6b445a62SJohn Marino /* Sort the array without matches[0], since we need it to
1100*6b445a62SJohn Marino stay in place no matter what. */
1101*6b445a62SJohn Marino if (i && rl_sort_completion_matches)
1102*6b445a62SJohn Marino qsort (matches+1, i-1, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
1103*6b445a62SJohn Marino
1104*6b445a62SJohn Marino /* Remember the lowest common denominator for it may be unique. */
1105*6b445a62SJohn Marino lowest_common = savestring (matches[0]);
1106*6b445a62SJohn Marino
1107*6b445a62SJohn Marino for (i = newlen = 0; matches[i + 1]; i++)
1108*6b445a62SJohn Marino {
1109*6b445a62SJohn Marino if (strcmp (matches[i], matches[i + 1]) == 0)
1110*6b445a62SJohn Marino {
1111*6b445a62SJohn Marino xfree (matches[i]);
1112*6b445a62SJohn Marino matches[i] = (char *)&dead_slot;
1113*6b445a62SJohn Marino }
1114*6b445a62SJohn Marino else
1115*6b445a62SJohn Marino newlen++;
1116*6b445a62SJohn Marino }
1117*6b445a62SJohn Marino
1118*6b445a62SJohn Marino /* We have marked all the dead slots with (char *)&dead_slot.
1119*6b445a62SJohn Marino Copy all the non-dead entries into a new array. */
1120*6b445a62SJohn Marino temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *));
1121*6b445a62SJohn Marino for (i = j = 1; matches[i]; i++)
1122*6b445a62SJohn Marino {
1123*6b445a62SJohn Marino if (matches[i] != (char *)&dead_slot)
1124*6b445a62SJohn Marino temp_array[j++] = matches[i];
1125*6b445a62SJohn Marino }
1126*6b445a62SJohn Marino temp_array[j] = (char *)NULL;
1127*6b445a62SJohn Marino
1128*6b445a62SJohn Marino if (matches[0] != (char *)&dead_slot)
1129*6b445a62SJohn Marino xfree (matches[0]);
1130*6b445a62SJohn Marino
1131*6b445a62SJohn Marino /* Place the lowest common denominator back in [0]. */
1132*6b445a62SJohn Marino temp_array[0] = lowest_common;
1133*6b445a62SJohn Marino
1134*6b445a62SJohn Marino /* If there is one string left, and it is identical to the
1135*6b445a62SJohn Marino lowest common denominator, then the LCD is the string to
1136*6b445a62SJohn Marino insert. */
1137*6b445a62SJohn Marino if (j == 2 && strcmp (temp_array[0], temp_array[1]) == 0)
1138*6b445a62SJohn Marino {
1139*6b445a62SJohn Marino xfree (temp_array[1]);
1140*6b445a62SJohn Marino temp_array[1] = (char *)NULL;
1141*6b445a62SJohn Marino }
1142*6b445a62SJohn Marino return (temp_array);
1143*6b445a62SJohn Marino }
1144*6b445a62SJohn Marino
1145*6b445a62SJohn Marino /* Find the common prefix of the list of matches, and put it into
1146*6b445a62SJohn Marino matches[0]. */
1147*6b445a62SJohn Marino static int
compute_lcd_of_matches(match_list,matches,text)1148*6b445a62SJohn Marino compute_lcd_of_matches (match_list, matches, text)
1149*6b445a62SJohn Marino char **match_list;
1150*6b445a62SJohn Marino int matches;
1151*6b445a62SJohn Marino const char *text;
1152*6b445a62SJohn Marino {
1153*6b445a62SJohn Marino register int i, c1, c2, si;
1154*6b445a62SJohn Marino int low; /* Count of max-matched characters. */
1155*6b445a62SJohn Marino char *dtext; /* dequoted TEXT, if needed */
1156*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1157*6b445a62SJohn Marino int v;
1158*6b445a62SJohn Marino mbstate_t ps1, ps2;
1159*6b445a62SJohn Marino wchar_t wc1, wc2;
1160*6b445a62SJohn Marino #endif
1161*6b445a62SJohn Marino
1162*6b445a62SJohn Marino /* If only one match, just use that. Otherwise, compare each
1163*6b445a62SJohn Marino member of the list with the next, finding out where they
1164*6b445a62SJohn Marino stop matching. */
1165*6b445a62SJohn Marino if (matches == 1)
1166*6b445a62SJohn Marino {
1167*6b445a62SJohn Marino match_list[0] = match_list[1];
1168*6b445a62SJohn Marino match_list[1] = (char *)NULL;
1169*6b445a62SJohn Marino return 1;
1170*6b445a62SJohn Marino }
1171*6b445a62SJohn Marino
1172*6b445a62SJohn Marino for (i = 1, low = 100000; i < matches; i++)
1173*6b445a62SJohn Marino {
1174*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1175*6b445a62SJohn Marino if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1176*6b445a62SJohn Marino {
1177*6b445a62SJohn Marino memset (&ps1, 0, sizeof (mbstate_t));
1178*6b445a62SJohn Marino memset (&ps2, 0, sizeof (mbstate_t));
1179*6b445a62SJohn Marino }
1180*6b445a62SJohn Marino #endif
1181*6b445a62SJohn Marino if (_rl_completion_case_fold)
1182*6b445a62SJohn Marino {
1183*6b445a62SJohn Marino for (si = 0;
1184*6b445a62SJohn Marino (c1 = _rl_to_lower(match_list[i][si])) &&
1185*6b445a62SJohn Marino (c2 = _rl_to_lower(match_list[i + 1][si]));
1186*6b445a62SJohn Marino si++)
1187*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1188*6b445a62SJohn Marino if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1189*6b445a62SJohn Marino {
1190*6b445a62SJohn Marino v = mbrtowc (&wc1, match_list[i]+si, strlen (match_list[i]+si), &ps1);
1191*6b445a62SJohn Marino mbrtowc (&wc2, match_list[i+1]+si, strlen (match_list[i+1]+si), &ps2);
1192*6b445a62SJohn Marino wc1 = towlower (wc1);
1193*6b445a62SJohn Marino wc2 = towlower (wc2);
1194*6b445a62SJohn Marino if (wc1 != wc2)
1195*6b445a62SJohn Marino break;
1196*6b445a62SJohn Marino else if (v > 1)
1197*6b445a62SJohn Marino si += v - 1;
1198*6b445a62SJohn Marino }
1199*6b445a62SJohn Marino else
1200*6b445a62SJohn Marino #endif
1201*6b445a62SJohn Marino if (c1 != c2)
1202*6b445a62SJohn Marino break;
1203*6b445a62SJohn Marino }
1204*6b445a62SJohn Marino else
1205*6b445a62SJohn Marino {
1206*6b445a62SJohn Marino for (si = 0;
1207*6b445a62SJohn Marino (c1 = match_list[i][si]) &&
1208*6b445a62SJohn Marino (c2 = match_list[i + 1][si]);
1209*6b445a62SJohn Marino si++)
1210*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
1211*6b445a62SJohn Marino if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
1212*6b445a62SJohn Marino {
1213*6b445a62SJohn Marino mbstate_t ps_back;
1214*6b445a62SJohn Marino ps_back = ps1;
1215*6b445a62SJohn Marino if (!_rl_compare_chars (match_list[i], si, &ps1, match_list[i+1], si, &ps2))
1216*6b445a62SJohn Marino break;
1217*6b445a62SJohn Marino else if ((v = _rl_get_char_len (&match_list[i][si], &ps_back)) > 1)
1218*6b445a62SJohn Marino si += v - 1;
1219*6b445a62SJohn Marino }
1220*6b445a62SJohn Marino else
1221*6b445a62SJohn Marino #endif
1222*6b445a62SJohn Marino if (c1 != c2)
1223*6b445a62SJohn Marino break;
1224*6b445a62SJohn Marino }
1225*6b445a62SJohn Marino
1226*6b445a62SJohn Marino if (low > si)
1227*6b445a62SJohn Marino low = si;
1228*6b445a62SJohn Marino }
1229*6b445a62SJohn Marino
1230*6b445a62SJohn Marino /* If there were multiple matches, but none matched up to even the
1231*6b445a62SJohn Marino first character, and the user typed something, use that as the
1232*6b445a62SJohn Marino value of matches[0]. */
1233*6b445a62SJohn Marino if (low == 0 && text && *text)
1234*6b445a62SJohn Marino {
1235*6b445a62SJohn Marino match_list[0] = (char *)xmalloc (strlen (text) + 1);
1236*6b445a62SJohn Marino strcpy (match_list[0], text);
1237*6b445a62SJohn Marino }
1238*6b445a62SJohn Marino else
1239*6b445a62SJohn Marino {
1240*6b445a62SJohn Marino match_list[0] = (char *)xmalloc (low + 1);
1241*6b445a62SJohn Marino
1242*6b445a62SJohn Marino /* XXX - this might need changes in the presence of multibyte chars */
1243*6b445a62SJohn Marino
1244*6b445a62SJohn Marino /* If we are ignoring case, try to preserve the case of the string
1245*6b445a62SJohn Marino the user typed in the face of multiple matches differing in case. */
1246*6b445a62SJohn Marino if (_rl_completion_case_fold)
1247*6b445a62SJohn Marino {
1248*6b445a62SJohn Marino /* We're making an assumption here:
1249*6b445a62SJohn Marino IF we're completing filenames AND
1250*6b445a62SJohn Marino the application has defined a filename dequoting function AND
1251*6b445a62SJohn Marino we found a quote character AND
1252*6b445a62SJohn Marino the application has requested filename quoting
1253*6b445a62SJohn Marino THEN
1254*6b445a62SJohn Marino we assume that TEXT was dequoted before checking against
1255*6b445a62SJohn Marino the file system and needs to be dequoted here before we
1256*6b445a62SJohn Marino check against the list of matches
1257*6b445a62SJohn Marino FI */
1258*6b445a62SJohn Marino dtext = (char *)NULL;
1259*6b445a62SJohn Marino if (rl_filename_completion_desired &&
1260*6b445a62SJohn Marino rl_filename_dequoting_function &&
1261*6b445a62SJohn Marino rl_completion_found_quote &&
1262*6b445a62SJohn Marino rl_filename_quoting_desired)
1263*6b445a62SJohn Marino {
1264*6b445a62SJohn Marino dtext = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
1265*6b445a62SJohn Marino text = dtext;
1266*6b445a62SJohn Marino }
1267*6b445a62SJohn Marino
1268*6b445a62SJohn Marino /* sort the list to get consistent answers. */
1269*6b445a62SJohn Marino qsort (match_list+1, matches, sizeof(char *), (QSFUNC *)_rl_qsort_string_compare);
1270*6b445a62SJohn Marino
1271*6b445a62SJohn Marino si = strlen (text);
1272*6b445a62SJohn Marino if (si <= low)
1273*6b445a62SJohn Marino {
1274*6b445a62SJohn Marino for (i = 1; i <= matches; i++)
1275*6b445a62SJohn Marino if (strncmp (match_list[i], text, si) == 0)
1276*6b445a62SJohn Marino {
1277*6b445a62SJohn Marino strncpy (match_list[0], match_list[i], low);
1278*6b445a62SJohn Marino break;
1279*6b445a62SJohn Marino }
1280*6b445a62SJohn Marino /* no casematch, use first entry */
1281*6b445a62SJohn Marino if (i > matches)
1282*6b445a62SJohn Marino strncpy (match_list[0], match_list[1], low);
1283*6b445a62SJohn Marino }
1284*6b445a62SJohn Marino else
1285*6b445a62SJohn Marino /* otherwise, just use the text the user typed. */
1286*6b445a62SJohn Marino strncpy (match_list[0], text, low);
1287*6b445a62SJohn Marino
1288*6b445a62SJohn Marino FREE (dtext);
1289*6b445a62SJohn Marino }
1290*6b445a62SJohn Marino else
1291*6b445a62SJohn Marino strncpy (match_list[0], match_list[1], low);
1292*6b445a62SJohn Marino
1293*6b445a62SJohn Marino match_list[0][low] = '\0';
1294*6b445a62SJohn Marino }
1295*6b445a62SJohn Marino
1296*6b445a62SJohn Marino return matches;
1297*6b445a62SJohn Marino }
1298*6b445a62SJohn Marino
1299*6b445a62SJohn Marino static int
postprocess_matches(matchesp,matching_filenames)1300*6b445a62SJohn Marino postprocess_matches (matchesp, matching_filenames)
1301*6b445a62SJohn Marino char ***matchesp;
1302*6b445a62SJohn Marino int matching_filenames;
1303*6b445a62SJohn Marino {
1304*6b445a62SJohn Marino char *t, **matches, **temp_matches;
1305*6b445a62SJohn Marino int nmatch, i;
1306*6b445a62SJohn Marino
1307*6b445a62SJohn Marino matches = *matchesp;
1308*6b445a62SJohn Marino
1309*6b445a62SJohn Marino if (matches == 0)
1310*6b445a62SJohn Marino return 0;
1311*6b445a62SJohn Marino
1312*6b445a62SJohn Marino /* It seems to me that in all the cases we handle we would like
1313*6b445a62SJohn Marino to ignore duplicate possiblilities. Scan for the text to
1314*6b445a62SJohn Marino insert being identical to the other completions. */
1315*6b445a62SJohn Marino if (rl_ignore_completion_duplicates)
1316*6b445a62SJohn Marino {
1317*6b445a62SJohn Marino temp_matches = remove_duplicate_matches (matches);
1318*6b445a62SJohn Marino xfree (matches);
1319*6b445a62SJohn Marino matches = temp_matches;
1320*6b445a62SJohn Marino }
1321*6b445a62SJohn Marino
1322*6b445a62SJohn Marino /* If we are matching filenames, then here is our chance to
1323*6b445a62SJohn Marino do clever processing by re-examining the list. Call the
1324*6b445a62SJohn Marino ignore function with the array as a parameter. It can
1325*6b445a62SJohn Marino munge the array, deleting matches as it desires. */
1326*6b445a62SJohn Marino if (rl_ignore_some_completions_function && matching_filenames)
1327*6b445a62SJohn Marino {
1328*6b445a62SJohn Marino for (nmatch = 1; matches[nmatch]; nmatch++)
1329*6b445a62SJohn Marino ;
1330*6b445a62SJohn Marino (void)(*rl_ignore_some_completions_function) (matches);
1331*6b445a62SJohn Marino if (matches == 0 || matches[0] == 0)
1332*6b445a62SJohn Marino {
1333*6b445a62SJohn Marino FREE (matches);
1334*6b445a62SJohn Marino *matchesp = (char **)0;
1335*6b445a62SJohn Marino return 0;
1336*6b445a62SJohn Marino }
1337*6b445a62SJohn Marino else
1338*6b445a62SJohn Marino {
1339*6b445a62SJohn Marino /* If we removed some matches, recompute the common prefix. */
1340*6b445a62SJohn Marino for (i = 1; matches[i]; i++)
1341*6b445a62SJohn Marino ;
1342*6b445a62SJohn Marino if (i > 1 && i < nmatch)
1343*6b445a62SJohn Marino {
1344*6b445a62SJohn Marino t = matches[0];
1345*6b445a62SJohn Marino compute_lcd_of_matches (matches, i - 1, t);
1346*6b445a62SJohn Marino FREE (t);
1347*6b445a62SJohn Marino }
1348*6b445a62SJohn Marino }
1349*6b445a62SJohn Marino }
1350*6b445a62SJohn Marino
1351*6b445a62SJohn Marino *matchesp = matches;
1352*6b445a62SJohn Marino return (1);
1353*6b445a62SJohn Marino }
1354*6b445a62SJohn Marino
1355*6b445a62SJohn Marino static int
complete_get_screenwidth()1356*6b445a62SJohn Marino complete_get_screenwidth ()
1357*6b445a62SJohn Marino {
1358*6b445a62SJohn Marino int cols;
1359*6b445a62SJohn Marino char *envcols;
1360*6b445a62SJohn Marino
1361*6b445a62SJohn Marino cols = _rl_completion_columns;
1362*6b445a62SJohn Marino if (cols >= 0 && cols <= _rl_screenwidth)
1363*6b445a62SJohn Marino return cols;
1364*6b445a62SJohn Marino envcols = getenv ("COLUMNS");
1365*6b445a62SJohn Marino if (envcols && *envcols)
1366*6b445a62SJohn Marino cols = atoi (envcols);
1367*6b445a62SJohn Marino if (cols >= 0 && cols <= _rl_screenwidth)
1368*6b445a62SJohn Marino return cols;
1369*6b445a62SJohn Marino return _rl_screenwidth;
1370*6b445a62SJohn Marino }
1371*6b445a62SJohn Marino
1372*6b445a62SJohn Marino /* A convenience function for displaying a list of strings in
1373*6b445a62SJohn Marino columnar format on readline's output stream. MATCHES is the list
1374*6b445a62SJohn Marino of strings, in argv format, LEN is the number of strings in MATCHES,
1375*6b445a62SJohn Marino and MAX is the length of the longest string in MATCHES. */
1376*6b445a62SJohn Marino void
rl_display_match_list(matches,len,max)1377*6b445a62SJohn Marino rl_display_match_list (matches, len, max)
1378*6b445a62SJohn Marino char **matches;
1379*6b445a62SJohn Marino int len, max;
1380*6b445a62SJohn Marino {
1381*6b445a62SJohn Marino int count, limit, printed_len, lines, cols;
1382*6b445a62SJohn Marino int i, j, k, l, common_length, sind;
1383*6b445a62SJohn Marino char *temp, *t;
1384*6b445a62SJohn Marino
1385*6b445a62SJohn Marino /* Find the length of the prefix common to all items: length as displayed
1386*6b445a62SJohn Marino characters (common_length) and as a byte index into the matches (sind) */
1387*6b445a62SJohn Marino common_length = sind = 0;
1388*6b445a62SJohn Marino if (_rl_completion_prefix_display_length > 0)
1389*6b445a62SJohn Marino {
1390*6b445a62SJohn Marino t = printable_part (matches[0]);
1391*6b445a62SJohn Marino temp = strrchr (t, '/');
1392*6b445a62SJohn Marino common_length = temp ? fnwidth (temp) : fnwidth (t);
1393*6b445a62SJohn Marino sind = temp ? strlen (temp) : strlen (t);
1394*6b445a62SJohn Marino
1395*6b445a62SJohn Marino if (common_length > _rl_completion_prefix_display_length && common_length > ELLIPSIS_LEN)
1396*6b445a62SJohn Marino max -= common_length - ELLIPSIS_LEN;
1397*6b445a62SJohn Marino else
1398*6b445a62SJohn Marino common_length = sind = 0;
1399*6b445a62SJohn Marino }
1400*6b445a62SJohn Marino
1401*6b445a62SJohn Marino /* How many items of MAX length can we fit in the screen window? */
1402*6b445a62SJohn Marino cols = complete_get_screenwidth ();
1403*6b445a62SJohn Marino max += 2;
1404*6b445a62SJohn Marino limit = cols / max;
1405*6b445a62SJohn Marino if (limit != 1 && (limit * max == cols))
1406*6b445a62SJohn Marino limit--;
1407*6b445a62SJohn Marino
1408*6b445a62SJohn Marino /* If cols == 0, limit will end up -1 */
1409*6b445a62SJohn Marino if (cols < _rl_screenwidth && limit < 0)
1410*6b445a62SJohn Marino limit = 1;
1411*6b445a62SJohn Marino
1412*6b445a62SJohn Marino /* Avoid a possible floating exception. If max > cols,
1413*6b445a62SJohn Marino limit will be 0 and a divide-by-zero fault will result. */
1414*6b445a62SJohn Marino if (limit == 0)
1415*6b445a62SJohn Marino limit = 1;
1416*6b445a62SJohn Marino
1417*6b445a62SJohn Marino /* How many iterations of the printing loop? */
1418*6b445a62SJohn Marino count = (len + (limit - 1)) / limit;
1419*6b445a62SJohn Marino
1420*6b445a62SJohn Marino /* Watch out for special case. If LEN is less than LIMIT, then
1421*6b445a62SJohn Marino just do the inner printing loop.
1422*6b445a62SJohn Marino 0 < len <= limit implies count = 1. */
1423*6b445a62SJohn Marino
1424*6b445a62SJohn Marino /* Sort the items if they are not already sorted. */
1425*6b445a62SJohn Marino if (rl_ignore_completion_duplicates == 0 && rl_sort_completion_matches)
1426*6b445a62SJohn Marino qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
1427*6b445a62SJohn Marino
1428*6b445a62SJohn Marino rl_crlf ();
1429*6b445a62SJohn Marino
1430*6b445a62SJohn Marino lines = 0;
1431*6b445a62SJohn Marino if (_rl_print_completions_horizontally == 0)
1432*6b445a62SJohn Marino {
1433*6b445a62SJohn Marino /* Print the sorted items, up-and-down alphabetically, like ls. */
1434*6b445a62SJohn Marino for (i = 1; i <= count; i++)
1435*6b445a62SJohn Marino {
1436*6b445a62SJohn Marino for (j = 0, l = i; j < limit; j++)
1437*6b445a62SJohn Marino {
1438*6b445a62SJohn Marino if (l > len || matches[l] == 0)
1439*6b445a62SJohn Marino break;
1440*6b445a62SJohn Marino else
1441*6b445a62SJohn Marino {
1442*6b445a62SJohn Marino temp = printable_part (matches[l]);
1443*6b445a62SJohn Marino printed_len = print_filename (temp, matches[l], sind);
1444*6b445a62SJohn Marino
1445*6b445a62SJohn Marino if (j + 1 < limit)
1446*6b445a62SJohn Marino for (k = 0; k < max - printed_len; k++)
1447*6b445a62SJohn Marino putc (' ', rl_outstream);
1448*6b445a62SJohn Marino }
1449*6b445a62SJohn Marino l += count;
1450*6b445a62SJohn Marino }
1451*6b445a62SJohn Marino rl_crlf ();
1452*6b445a62SJohn Marino lines++;
1453*6b445a62SJohn Marino if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count)
1454*6b445a62SJohn Marino {
1455*6b445a62SJohn Marino lines = _rl_internal_pager (lines);
1456*6b445a62SJohn Marino if (lines < 0)
1457*6b445a62SJohn Marino return;
1458*6b445a62SJohn Marino }
1459*6b445a62SJohn Marino }
1460*6b445a62SJohn Marino }
1461*6b445a62SJohn Marino else
1462*6b445a62SJohn Marino {
1463*6b445a62SJohn Marino /* Print the sorted items, across alphabetically, like ls -x. */
1464*6b445a62SJohn Marino for (i = 1; matches[i]; i++)
1465*6b445a62SJohn Marino {
1466*6b445a62SJohn Marino temp = printable_part (matches[i]);
1467*6b445a62SJohn Marino printed_len = print_filename (temp, matches[i], sind);
1468*6b445a62SJohn Marino /* Have we reached the end of this line? */
1469*6b445a62SJohn Marino if (matches[i+1])
1470*6b445a62SJohn Marino {
1471*6b445a62SJohn Marino if (i && (limit > 1) && (i % limit) == 0)
1472*6b445a62SJohn Marino {
1473*6b445a62SJohn Marino rl_crlf ();
1474*6b445a62SJohn Marino lines++;
1475*6b445a62SJohn Marino if (_rl_page_completions && lines >= _rl_screenheight - 1)
1476*6b445a62SJohn Marino {
1477*6b445a62SJohn Marino lines = _rl_internal_pager (lines);
1478*6b445a62SJohn Marino if (lines < 0)
1479*6b445a62SJohn Marino return;
1480*6b445a62SJohn Marino }
1481*6b445a62SJohn Marino }
1482*6b445a62SJohn Marino else
1483*6b445a62SJohn Marino for (k = 0; k < max - printed_len; k++)
1484*6b445a62SJohn Marino putc (' ', rl_outstream);
1485*6b445a62SJohn Marino }
1486*6b445a62SJohn Marino }
1487*6b445a62SJohn Marino rl_crlf ();
1488*6b445a62SJohn Marino }
1489*6b445a62SJohn Marino }
1490*6b445a62SJohn Marino
1491*6b445a62SJohn Marino /* Display MATCHES, a list of matching filenames in argv format. This
1492*6b445a62SJohn Marino handles the simple case -- a single match -- first. If there is more
1493*6b445a62SJohn Marino than one match, we compute the number of strings in the list and the
1494*6b445a62SJohn Marino length of the longest string, which will be needed by the display
1495*6b445a62SJohn Marino function. If the application wants to handle displaying the list of
1496*6b445a62SJohn Marino matches itself, it sets RL_COMPLETION_DISPLAY_MATCHES_HOOK to the
1497*6b445a62SJohn Marino address of a function, and we just call it. If we're handling the
1498*6b445a62SJohn Marino display ourselves, we just call rl_display_match_list. We also check
1499*6b445a62SJohn Marino that the list of matches doesn't exceed the user-settable threshold,
1500*6b445a62SJohn Marino and ask the user if he wants to see the list if there are more matches
1501*6b445a62SJohn Marino than RL_COMPLETION_QUERY_ITEMS. */
1502*6b445a62SJohn Marino static void
display_matches(matches)1503*6b445a62SJohn Marino display_matches (matches)
1504*6b445a62SJohn Marino char **matches;
1505*6b445a62SJohn Marino {
1506*6b445a62SJohn Marino int len, max, i;
1507*6b445a62SJohn Marino char *temp;
1508*6b445a62SJohn Marino
1509*6b445a62SJohn Marino /* Move to the last visible line of a possibly-multiple-line command. */
1510*6b445a62SJohn Marino _rl_move_vert (_rl_vis_botlin);
1511*6b445a62SJohn Marino
1512*6b445a62SJohn Marino /* Handle simple case first. What if there is only one answer? */
1513*6b445a62SJohn Marino if (matches[1] == 0)
1514*6b445a62SJohn Marino {
1515*6b445a62SJohn Marino temp = printable_part (matches[0]);
1516*6b445a62SJohn Marino rl_crlf ();
1517*6b445a62SJohn Marino print_filename (temp, matches[0], 0);
1518*6b445a62SJohn Marino rl_crlf ();
1519*6b445a62SJohn Marino
1520*6b445a62SJohn Marino rl_forced_update_display ();
1521*6b445a62SJohn Marino rl_display_fixed = 1;
1522*6b445a62SJohn Marino
1523*6b445a62SJohn Marino return;
1524*6b445a62SJohn Marino }
1525*6b445a62SJohn Marino
1526*6b445a62SJohn Marino /* There is more than one answer. Find out how many there are,
1527*6b445a62SJohn Marino and find the maximum printed length of a single entry. */
1528*6b445a62SJohn Marino for (max = 0, i = 1; matches[i]; i++)
1529*6b445a62SJohn Marino {
1530*6b445a62SJohn Marino temp = printable_part (matches[i]);
1531*6b445a62SJohn Marino len = fnwidth (temp);
1532*6b445a62SJohn Marino
1533*6b445a62SJohn Marino if (len > max)
1534*6b445a62SJohn Marino max = len;
1535*6b445a62SJohn Marino }
1536*6b445a62SJohn Marino
1537*6b445a62SJohn Marino len = i - 1;
1538*6b445a62SJohn Marino
1539*6b445a62SJohn Marino /* If the caller has defined a display hook, then call that now. */
1540*6b445a62SJohn Marino if (rl_completion_display_matches_hook)
1541*6b445a62SJohn Marino {
1542*6b445a62SJohn Marino (*rl_completion_display_matches_hook) (matches, len, max);
1543*6b445a62SJohn Marino return;
1544*6b445a62SJohn Marino }
1545*6b445a62SJohn Marino
1546*6b445a62SJohn Marino /* If there are many items, then ask the user if she really wants to
1547*6b445a62SJohn Marino see them all. */
1548*6b445a62SJohn Marino if (rl_completion_query_items > 0 && len >= rl_completion_query_items)
1549*6b445a62SJohn Marino {
1550*6b445a62SJohn Marino rl_crlf ();
1551*6b445a62SJohn Marino fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len);
1552*6b445a62SJohn Marino fflush (rl_outstream);
1553*6b445a62SJohn Marino if ((completion_y_or_n = get_y_or_n (0)) == 0)
1554*6b445a62SJohn Marino {
1555*6b445a62SJohn Marino rl_crlf ();
1556*6b445a62SJohn Marino
1557*6b445a62SJohn Marino rl_forced_update_display ();
1558*6b445a62SJohn Marino rl_display_fixed = 1;
1559*6b445a62SJohn Marino
1560*6b445a62SJohn Marino return;
1561*6b445a62SJohn Marino }
1562*6b445a62SJohn Marino }
1563*6b445a62SJohn Marino
1564*6b445a62SJohn Marino rl_display_match_list (matches, len, max);
1565*6b445a62SJohn Marino
1566*6b445a62SJohn Marino rl_forced_update_display ();
1567*6b445a62SJohn Marino rl_display_fixed = 1;
1568*6b445a62SJohn Marino }
1569*6b445a62SJohn Marino
1570*6b445a62SJohn Marino static char *
make_quoted_replacement(match,mtype,qc)1571*6b445a62SJohn Marino make_quoted_replacement (match, mtype, qc)
1572*6b445a62SJohn Marino char *match;
1573*6b445a62SJohn Marino int mtype;
1574*6b445a62SJohn Marino char *qc; /* Pointer to quoting character, if any */
1575*6b445a62SJohn Marino {
1576*6b445a62SJohn Marino int should_quote, do_replace;
1577*6b445a62SJohn Marino char *replacement;
1578*6b445a62SJohn Marino
1579*6b445a62SJohn Marino /* If we are doing completion on quoted substrings, and any matches
1580*6b445a62SJohn Marino contain any of the completer_word_break_characters, then auto-
1581*6b445a62SJohn Marino matically prepend the substring with a quote character (just pick
1582*6b445a62SJohn Marino the first one from the list of such) if it does not already begin
1583*6b445a62SJohn Marino with a quote string. FIXME: Need to remove any such automatically
1584*6b445a62SJohn Marino inserted quote character when it no longer is necessary, such as
1585*6b445a62SJohn Marino if we change the string we are completing on and the new set of
1586*6b445a62SJohn Marino matches don't require a quoted substring. */
1587*6b445a62SJohn Marino replacement = match;
1588*6b445a62SJohn Marino
1589*6b445a62SJohn Marino should_quote = match && rl_completer_quote_characters &&
1590*6b445a62SJohn Marino rl_filename_completion_desired &&
1591*6b445a62SJohn Marino rl_filename_quoting_desired;
1592*6b445a62SJohn Marino
1593*6b445a62SJohn Marino if (should_quote)
1594*6b445a62SJohn Marino should_quote = should_quote && (!qc || !*qc ||
1595*6b445a62SJohn Marino (rl_completer_quote_characters && strchr (rl_completer_quote_characters, *qc)));
1596*6b445a62SJohn Marino
1597*6b445a62SJohn Marino if (should_quote)
1598*6b445a62SJohn Marino {
1599*6b445a62SJohn Marino /* If there is a single match, see if we need to quote it.
1600*6b445a62SJohn Marino This also checks whether the common prefix of several
1601*6b445a62SJohn Marino matches needs to be quoted. */
1602*6b445a62SJohn Marino should_quote = rl_filename_quote_characters
1603*6b445a62SJohn Marino ? (_rl_strpbrk (match, rl_filename_quote_characters) != 0)
1604*6b445a62SJohn Marino : 0;
1605*6b445a62SJohn Marino
1606*6b445a62SJohn Marino do_replace = should_quote ? mtype : NO_MATCH;
1607*6b445a62SJohn Marino /* Quote the replacement, since we found an embedded
1608*6b445a62SJohn Marino word break character in a potential match. */
1609*6b445a62SJohn Marino if (do_replace != NO_MATCH && rl_filename_quoting_function)
1610*6b445a62SJohn Marino replacement = (*rl_filename_quoting_function) (match, do_replace, qc);
1611*6b445a62SJohn Marino }
1612*6b445a62SJohn Marino return (replacement);
1613*6b445a62SJohn Marino }
1614*6b445a62SJohn Marino
1615*6b445a62SJohn Marino static void
insert_match(match,start,mtype,qc)1616*6b445a62SJohn Marino insert_match (match, start, mtype, qc)
1617*6b445a62SJohn Marino char *match;
1618*6b445a62SJohn Marino int start, mtype;
1619*6b445a62SJohn Marino char *qc;
1620*6b445a62SJohn Marino {
1621*6b445a62SJohn Marino char *replacement, *r;
1622*6b445a62SJohn Marino char oqc;
1623*6b445a62SJohn Marino int end, rlen;
1624*6b445a62SJohn Marino
1625*6b445a62SJohn Marino oqc = qc ? *qc : '\0';
1626*6b445a62SJohn Marino replacement = make_quoted_replacement (match, mtype, qc);
1627*6b445a62SJohn Marino
1628*6b445a62SJohn Marino /* Now insert the match. */
1629*6b445a62SJohn Marino if (replacement)
1630*6b445a62SJohn Marino {
1631*6b445a62SJohn Marino rlen = strlen (replacement);
1632*6b445a62SJohn Marino /* Don't double an opening quote character. */
1633*6b445a62SJohn Marino if (qc && *qc && start && rl_line_buffer[start - 1] == *qc &&
1634*6b445a62SJohn Marino replacement[0] == *qc)
1635*6b445a62SJohn Marino start--;
1636*6b445a62SJohn Marino /* If make_quoted_replacement changed the quoting character, remove
1637*6b445a62SJohn Marino the opening quote and insert the (fully-quoted) replacement. */
1638*6b445a62SJohn Marino else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc &&
1639*6b445a62SJohn Marino replacement[0] != oqc)
1640*6b445a62SJohn Marino start--;
1641*6b445a62SJohn Marino end = rl_point - 1;
1642*6b445a62SJohn Marino /* Don't double a closing quote character */
1643*6b445a62SJohn Marino if (qc && *qc && end && rl_line_buffer[rl_point] == *qc && replacement[rlen - 1] == *qc)
1644*6b445a62SJohn Marino end++;
1645*6b445a62SJohn Marino if (_rl_skip_completed_text)
1646*6b445a62SJohn Marino {
1647*6b445a62SJohn Marino r = replacement;
1648*6b445a62SJohn Marino while (start < rl_end && *r && rl_line_buffer[start] == *r)
1649*6b445a62SJohn Marino {
1650*6b445a62SJohn Marino start++;
1651*6b445a62SJohn Marino r++;
1652*6b445a62SJohn Marino }
1653*6b445a62SJohn Marino if (start <= end || *r)
1654*6b445a62SJohn Marino _rl_replace_text (r, start, end);
1655*6b445a62SJohn Marino rl_point = start + strlen (r);
1656*6b445a62SJohn Marino }
1657*6b445a62SJohn Marino else
1658*6b445a62SJohn Marino _rl_replace_text (replacement, start, end);
1659*6b445a62SJohn Marino if (replacement != match)
1660*6b445a62SJohn Marino xfree (replacement);
1661*6b445a62SJohn Marino }
1662*6b445a62SJohn Marino }
1663*6b445a62SJohn Marino
1664*6b445a62SJohn Marino /* Append any necessary closing quote and a separator character to the
1665*6b445a62SJohn Marino just-inserted match. If the user has specified that directories
1666*6b445a62SJohn Marino should be marked by a trailing `/', append one of those instead. The
1667*6b445a62SJohn Marino default trailing character is a space. Returns the number of characters
1668*6b445a62SJohn Marino appended. If NONTRIVIAL_MATCH is set, we test for a symlink (if the OS
1669*6b445a62SJohn Marino has them) and don't add a suffix for a symlink to a directory. A
1670*6b445a62SJohn Marino nontrivial match is one that actually adds to the word being completed.
1671*6b445a62SJohn Marino The variable rl_completion_mark_symlink_dirs controls this behavior
1672*6b445a62SJohn Marino (it's initially set to the what the user has chosen, indicated by the
1673*6b445a62SJohn Marino value of _rl_complete_mark_symlink_dirs, but may be modified by an
1674*6b445a62SJohn Marino application's completion function). */
1675*6b445a62SJohn Marino static int
append_to_match(text,delimiter,quote_char,nontrivial_match)1676*6b445a62SJohn Marino append_to_match (text, delimiter, quote_char, nontrivial_match)
1677*6b445a62SJohn Marino char *text;
1678*6b445a62SJohn Marino int delimiter, quote_char, nontrivial_match;
1679*6b445a62SJohn Marino {
1680*6b445a62SJohn Marino char temp_string[4], *filename;
1681*6b445a62SJohn Marino int temp_string_index, s;
1682*6b445a62SJohn Marino struct stat finfo;
1683*6b445a62SJohn Marino
1684*6b445a62SJohn Marino temp_string_index = 0;
1685*6b445a62SJohn Marino if (quote_char && rl_point && rl_completion_suppress_quote == 0 &&
1686*6b445a62SJohn Marino rl_line_buffer[rl_point - 1] != quote_char)
1687*6b445a62SJohn Marino temp_string[temp_string_index++] = quote_char;
1688*6b445a62SJohn Marino
1689*6b445a62SJohn Marino if (delimiter)
1690*6b445a62SJohn Marino temp_string[temp_string_index++] = delimiter;
1691*6b445a62SJohn Marino else if (rl_completion_suppress_append == 0 && rl_completion_append_character)
1692*6b445a62SJohn Marino temp_string[temp_string_index++] = rl_completion_append_character;
1693*6b445a62SJohn Marino
1694*6b445a62SJohn Marino temp_string[temp_string_index++] = '\0';
1695*6b445a62SJohn Marino
1696*6b445a62SJohn Marino if (rl_filename_completion_desired)
1697*6b445a62SJohn Marino {
1698*6b445a62SJohn Marino filename = tilde_expand (text);
1699*6b445a62SJohn Marino s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0)
1700*6b445a62SJohn Marino ? LSTAT (filename, &finfo)
1701*6b445a62SJohn Marino : stat (filename, &finfo);
1702*6b445a62SJohn Marino if (s == 0 && S_ISDIR (finfo.st_mode))
1703*6b445a62SJohn Marino {
1704*6b445a62SJohn Marino if (_rl_complete_mark_directories /* && rl_completion_suppress_append == 0 */)
1705*6b445a62SJohn Marino {
1706*6b445a62SJohn Marino /* This is clumsy. Avoid putting in a double slash if point
1707*6b445a62SJohn Marino is at the end of the line and the previous character is a
1708*6b445a62SJohn Marino slash. */
1709*6b445a62SJohn Marino if (rl_point && rl_line_buffer[rl_point] == '\0' && rl_line_buffer[rl_point - 1] == '/')
1710*6b445a62SJohn Marino ;
1711*6b445a62SJohn Marino else if (rl_line_buffer[rl_point] != '/')
1712*6b445a62SJohn Marino rl_insert_text ("/");
1713*6b445a62SJohn Marino }
1714*6b445a62SJohn Marino }
1715*6b445a62SJohn Marino #ifdef S_ISLNK
1716*6b445a62SJohn Marino /* Don't add anything if the filename is a symlink and resolves to a
1717*6b445a62SJohn Marino directory. */
1718*6b445a62SJohn Marino else if (s == 0 && S_ISLNK (finfo.st_mode) &&
1719*6b445a62SJohn Marino stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode))
1720*6b445a62SJohn Marino ;
1721*6b445a62SJohn Marino #endif
1722*6b445a62SJohn Marino else
1723*6b445a62SJohn Marino {
1724*6b445a62SJohn Marino if (rl_point == rl_end && temp_string_index)
1725*6b445a62SJohn Marino rl_insert_text (temp_string);
1726*6b445a62SJohn Marino }
1727*6b445a62SJohn Marino xfree (filename);
1728*6b445a62SJohn Marino }
1729*6b445a62SJohn Marino else
1730*6b445a62SJohn Marino {
1731*6b445a62SJohn Marino if (rl_point == rl_end && temp_string_index)
1732*6b445a62SJohn Marino rl_insert_text (temp_string);
1733*6b445a62SJohn Marino }
1734*6b445a62SJohn Marino
1735*6b445a62SJohn Marino return (temp_string_index);
1736*6b445a62SJohn Marino }
1737*6b445a62SJohn Marino
1738*6b445a62SJohn Marino static void
insert_all_matches(matches,point,qc)1739*6b445a62SJohn Marino insert_all_matches (matches, point, qc)
1740*6b445a62SJohn Marino char **matches;
1741*6b445a62SJohn Marino int point;
1742*6b445a62SJohn Marino char *qc;
1743*6b445a62SJohn Marino {
1744*6b445a62SJohn Marino int i;
1745*6b445a62SJohn Marino char *rp;
1746*6b445a62SJohn Marino
1747*6b445a62SJohn Marino rl_begin_undo_group ();
1748*6b445a62SJohn Marino /* remove any opening quote character; make_quoted_replacement will add
1749*6b445a62SJohn Marino it back. */
1750*6b445a62SJohn Marino if (qc && *qc && point && rl_line_buffer[point - 1] == *qc)
1751*6b445a62SJohn Marino point--;
1752*6b445a62SJohn Marino rl_delete_text (point, rl_point);
1753*6b445a62SJohn Marino rl_point = point;
1754*6b445a62SJohn Marino
1755*6b445a62SJohn Marino if (matches[1])
1756*6b445a62SJohn Marino {
1757*6b445a62SJohn Marino for (i = 1; matches[i]; i++)
1758*6b445a62SJohn Marino {
1759*6b445a62SJohn Marino rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc);
1760*6b445a62SJohn Marino rl_insert_text (rp);
1761*6b445a62SJohn Marino rl_insert_text (" ");
1762*6b445a62SJohn Marino if (rp != matches[i])
1763*6b445a62SJohn Marino xfree (rp);
1764*6b445a62SJohn Marino }
1765*6b445a62SJohn Marino }
1766*6b445a62SJohn Marino else
1767*6b445a62SJohn Marino {
1768*6b445a62SJohn Marino rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc);
1769*6b445a62SJohn Marino rl_insert_text (rp);
1770*6b445a62SJohn Marino rl_insert_text (" ");
1771*6b445a62SJohn Marino if (rp != matches[0])
1772*6b445a62SJohn Marino xfree (rp);
1773*6b445a62SJohn Marino }
1774*6b445a62SJohn Marino rl_end_undo_group ();
1775*6b445a62SJohn Marino }
1776*6b445a62SJohn Marino
1777*6b445a62SJohn Marino void
_rl_free_match_list(matches)1778*6b445a62SJohn Marino _rl_free_match_list (matches)
1779*6b445a62SJohn Marino char **matches;
1780*6b445a62SJohn Marino {
1781*6b445a62SJohn Marino register int i;
1782*6b445a62SJohn Marino
1783*6b445a62SJohn Marino if (matches == 0)
1784*6b445a62SJohn Marino return;
1785*6b445a62SJohn Marino
1786*6b445a62SJohn Marino for (i = 0; matches[i]; i++)
1787*6b445a62SJohn Marino xfree (matches[i]);
1788*6b445a62SJohn Marino xfree (matches);
1789*6b445a62SJohn Marino }
1790*6b445a62SJohn Marino
1791*6b445a62SJohn Marino /* Complete the word at or before point.
1792*6b445a62SJohn Marino WHAT_TO_DO says what to do with the completion.
1793*6b445a62SJohn Marino `?' means list the possible completions.
1794*6b445a62SJohn Marino TAB means do standard completion.
1795*6b445a62SJohn Marino `*' means insert all of the possible completions.
1796*6b445a62SJohn Marino `!' means to do standard completion, and list all possible completions if
1797*6b445a62SJohn Marino there is more than one.
1798*6b445a62SJohn Marino `@' means to do standard completion, and list all possible completions if
1799*6b445a62SJohn Marino there is more than one and partial completion is not possible. */
1800*6b445a62SJohn Marino int
rl_complete_internal(what_to_do)1801*6b445a62SJohn Marino rl_complete_internal (what_to_do)
1802*6b445a62SJohn Marino int what_to_do;
1803*6b445a62SJohn Marino {
1804*6b445a62SJohn Marino char **matches;
1805*6b445a62SJohn Marino rl_compentry_func_t *our_func;
1806*6b445a62SJohn Marino int start, end, delimiter, found_quote, i, nontrivial_lcd;
1807*6b445a62SJohn Marino char *text, *saved_line_buffer;
1808*6b445a62SJohn Marino char quote_char;
1809*6b445a62SJohn Marino #if 1
1810*6b445a62SJohn Marino int tlen, mlen;
1811*6b445a62SJohn Marino #endif
1812*6b445a62SJohn Marino
1813*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_COMPLETING);
1814*6b445a62SJohn Marino
1815*6b445a62SJohn Marino set_completion_defaults (what_to_do);
1816*6b445a62SJohn Marino
1817*6b445a62SJohn Marino saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL;
1818*6b445a62SJohn Marino our_func = rl_completion_entry_function
1819*6b445a62SJohn Marino ? rl_completion_entry_function
1820*6b445a62SJohn Marino : rl_filename_completion_function;
1821*6b445a62SJohn Marino /* We now look backwards for the start of a filename/variable word. */
1822*6b445a62SJohn Marino end = rl_point;
1823*6b445a62SJohn Marino found_quote = delimiter = 0;
1824*6b445a62SJohn Marino quote_char = '\0';
1825*6b445a62SJohn Marino
1826*6b445a62SJohn Marino if (rl_point)
1827*6b445a62SJohn Marino /* This (possibly) changes rl_point. If it returns a non-zero char,
1828*6b445a62SJohn Marino we know we have an open quote. */
1829*6b445a62SJohn Marino quote_char = _rl_find_completion_word (&found_quote, &delimiter);
1830*6b445a62SJohn Marino
1831*6b445a62SJohn Marino start = rl_point;
1832*6b445a62SJohn Marino rl_point = end;
1833*6b445a62SJohn Marino
1834*6b445a62SJohn Marino text = rl_copy_text (start, end);
1835*6b445a62SJohn Marino matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char);
1836*6b445a62SJohn Marino /* nontrivial_lcd is set if the common prefix adds something to the word
1837*6b445a62SJohn Marino being completed. */
1838*6b445a62SJohn Marino nontrivial_lcd = matches && strcmp (text, matches[0]) != 0;
1839*6b445a62SJohn Marino #if 1
1840*6b445a62SJohn Marino if (what_to_do == '!' || what_to_do == '@')
1841*6b445a62SJohn Marino tlen = strlen (text);
1842*6b445a62SJohn Marino #endif
1843*6b445a62SJohn Marino xfree (text);
1844*6b445a62SJohn Marino
1845*6b445a62SJohn Marino if (matches == 0)
1846*6b445a62SJohn Marino {
1847*6b445a62SJohn Marino rl_ding ();
1848*6b445a62SJohn Marino FREE (saved_line_buffer);
1849*6b445a62SJohn Marino completion_changed_buffer = 0;
1850*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_COMPLETING);
1851*6b445a62SJohn Marino _rl_reset_completion_state ();
1852*6b445a62SJohn Marino return (0);
1853*6b445a62SJohn Marino }
1854*6b445a62SJohn Marino
1855*6b445a62SJohn Marino /* If we are matching filenames, the attempted completion function will
1856*6b445a62SJohn Marino have set rl_filename_completion_desired to a non-zero value. The basic
1857*6b445a62SJohn Marino rl_filename_completion_function does this. */
1858*6b445a62SJohn Marino i = rl_filename_completion_desired;
1859*6b445a62SJohn Marino
1860*6b445a62SJohn Marino if (postprocess_matches (&matches, i) == 0)
1861*6b445a62SJohn Marino {
1862*6b445a62SJohn Marino rl_ding ();
1863*6b445a62SJohn Marino FREE (saved_line_buffer);
1864*6b445a62SJohn Marino completion_changed_buffer = 0;
1865*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_COMPLETING);
1866*6b445a62SJohn Marino _rl_reset_completion_state ();
1867*6b445a62SJohn Marino return (0);
1868*6b445a62SJohn Marino }
1869*6b445a62SJohn Marino
1870*6b445a62SJohn Marino switch (what_to_do)
1871*6b445a62SJohn Marino {
1872*6b445a62SJohn Marino case TAB:
1873*6b445a62SJohn Marino case '!':
1874*6b445a62SJohn Marino case '@':
1875*6b445a62SJohn Marino /* Insert the first match with proper quoting. */
1876*6b445a62SJohn Marino #if 0
1877*6b445a62SJohn Marino if (*matches[0])
1878*6b445a62SJohn Marino insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char);
1879*6b445a62SJohn Marino #else
1880*6b445a62SJohn Marino if (what_to_do == TAB)
1881*6b445a62SJohn Marino {
1882*6b445a62SJohn Marino if (*matches[0])
1883*6b445a62SJohn Marino insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char);
1884*6b445a62SJohn Marino }
1885*6b445a62SJohn Marino else if (*matches[0] && matches[1] == 0)
1886*6b445a62SJohn Marino /* should we perform the check only if there are multiple matches? */
1887*6b445a62SJohn Marino insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char);
1888*6b445a62SJohn Marino else if (*matches[0]) /* what_to_do != TAB && multiple matches */
1889*6b445a62SJohn Marino {
1890*6b445a62SJohn Marino mlen = *matches[0] ? strlen (matches[0]) : 0;
1891*6b445a62SJohn Marino if (mlen >= tlen)
1892*6b445a62SJohn Marino insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char);
1893*6b445a62SJohn Marino }
1894*6b445a62SJohn Marino #endif
1895*6b445a62SJohn Marino
1896*6b445a62SJohn Marino /* If there are more matches, ring the bell to indicate.
1897*6b445a62SJohn Marino If we are in vi mode, Posix.2 says to not ring the bell.
1898*6b445a62SJohn Marino If the `show-all-if-ambiguous' variable is set, display
1899*6b445a62SJohn Marino all the matches immediately. Otherwise, if this was the
1900*6b445a62SJohn Marino only match, and we are hacking files, check the file to
1901*6b445a62SJohn Marino see if it was a directory. If so, and the `mark-directories'
1902*6b445a62SJohn Marino variable is set, add a '/' to the name. If not, and we
1903*6b445a62SJohn Marino are at the end of the line, then add a space. */
1904*6b445a62SJohn Marino if (matches[1])
1905*6b445a62SJohn Marino {
1906*6b445a62SJohn Marino if (what_to_do == '!')
1907*6b445a62SJohn Marino {
1908*6b445a62SJohn Marino display_matches (matches);
1909*6b445a62SJohn Marino break;
1910*6b445a62SJohn Marino }
1911*6b445a62SJohn Marino else if (what_to_do == '@')
1912*6b445a62SJohn Marino {
1913*6b445a62SJohn Marino if (nontrivial_lcd == 0)
1914*6b445a62SJohn Marino display_matches (matches);
1915*6b445a62SJohn Marino break;
1916*6b445a62SJohn Marino }
1917*6b445a62SJohn Marino else if (rl_editing_mode != vi_mode)
1918*6b445a62SJohn Marino rl_ding (); /* There are other matches remaining. */
1919*6b445a62SJohn Marino }
1920*6b445a62SJohn Marino else
1921*6b445a62SJohn Marino append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd);
1922*6b445a62SJohn Marino
1923*6b445a62SJohn Marino break;
1924*6b445a62SJohn Marino
1925*6b445a62SJohn Marino case '*':
1926*6b445a62SJohn Marino insert_all_matches (matches, start, "e_char);
1927*6b445a62SJohn Marino break;
1928*6b445a62SJohn Marino
1929*6b445a62SJohn Marino case '?':
1930*6b445a62SJohn Marino display_matches (matches);
1931*6b445a62SJohn Marino break;
1932*6b445a62SJohn Marino
1933*6b445a62SJohn Marino default:
1934*6b445a62SJohn Marino _rl_ttymsg ("bad value %d for what_to_do in rl_complete", what_to_do);
1935*6b445a62SJohn Marino rl_ding ();
1936*6b445a62SJohn Marino FREE (saved_line_buffer);
1937*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_COMPLETING);
1938*6b445a62SJohn Marino _rl_reset_completion_state ();
1939*6b445a62SJohn Marino return 1;
1940*6b445a62SJohn Marino }
1941*6b445a62SJohn Marino
1942*6b445a62SJohn Marino _rl_free_match_list (matches);
1943*6b445a62SJohn Marino
1944*6b445a62SJohn Marino /* Check to see if the line has changed through all of this manipulation. */
1945*6b445a62SJohn Marino if (saved_line_buffer)
1946*6b445a62SJohn Marino {
1947*6b445a62SJohn Marino completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0;
1948*6b445a62SJohn Marino xfree (saved_line_buffer);
1949*6b445a62SJohn Marino }
1950*6b445a62SJohn Marino
1951*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_COMPLETING);
1952*6b445a62SJohn Marino _rl_reset_completion_state ();
1953*6b445a62SJohn Marino return 0;
1954*6b445a62SJohn Marino }
1955*6b445a62SJohn Marino
1956*6b445a62SJohn Marino /***************************************************************/
1957*6b445a62SJohn Marino /* */
1958*6b445a62SJohn Marino /* Application-callable completion match generator functions */
1959*6b445a62SJohn Marino /* */
1960*6b445a62SJohn Marino /***************************************************************/
1961*6b445a62SJohn Marino
1962*6b445a62SJohn Marino /* Return an array of (char *) which is a list of completions for TEXT.
1963*6b445a62SJohn Marino If there are no completions, return a NULL pointer.
1964*6b445a62SJohn Marino The first entry in the returned array is the substitution for TEXT.
1965*6b445a62SJohn Marino The remaining entries are the possible completions.
1966*6b445a62SJohn Marino The array is terminated with a NULL pointer.
1967*6b445a62SJohn Marino
1968*6b445a62SJohn Marino ENTRY_FUNCTION is a function of two args, and returns a (char *).
1969*6b445a62SJohn Marino The first argument is TEXT.
1970*6b445a62SJohn Marino The second is a state argument; it should be zero on the first call, and
1971*6b445a62SJohn Marino non-zero on subsequent calls. It returns a NULL pointer to the caller
1972*6b445a62SJohn Marino when there are no more matches.
1973*6b445a62SJohn Marino */
1974*6b445a62SJohn Marino char **
rl_completion_matches(text,entry_function)1975*6b445a62SJohn Marino rl_completion_matches (text, entry_function)
1976*6b445a62SJohn Marino const char *text;
1977*6b445a62SJohn Marino rl_compentry_func_t *entry_function;
1978*6b445a62SJohn Marino {
1979*6b445a62SJohn Marino /* Number of slots in match_list. */
1980*6b445a62SJohn Marino int match_list_size;
1981*6b445a62SJohn Marino
1982*6b445a62SJohn Marino /* The list of matches. */
1983*6b445a62SJohn Marino char **match_list;
1984*6b445a62SJohn Marino
1985*6b445a62SJohn Marino /* Number of matches actually found. */
1986*6b445a62SJohn Marino int matches;
1987*6b445a62SJohn Marino
1988*6b445a62SJohn Marino /* Temporary string binder. */
1989*6b445a62SJohn Marino char *string;
1990*6b445a62SJohn Marino
1991*6b445a62SJohn Marino matches = 0;
1992*6b445a62SJohn Marino match_list_size = 10;
1993*6b445a62SJohn Marino match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *));
1994*6b445a62SJohn Marino match_list[1] = (char *)NULL;
1995*6b445a62SJohn Marino
1996*6b445a62SJohn Marino _rl_interrupt_immediately++;
1997*6b445a62SJohn Marino while (string = (*entry_function) (text, matches))
1998*6b445a62SJohn Marino {
1999*6b445a62SJohn Marino if (matches + 1 == match_list_size)
2000*6b445a62SJohn Marino match_list = (char **)xrealloc
2001*6b445a62SJohn Marino (match_list, ((match_list_size += 10) + 1) * sizeof (char *));
2002*6b445a62SJohn Marino
2003*6b445a62SJohn Marino match_list[++matches] = string;
2004*6b445a62SJohn Marino match_list[matches + 1] = (char *)NULL;
2005*6b445a62SJohn Marino }
2006*6b445a62SJohn Marino if (_rl_interrupt_immediately > 0)
2007*6b445a62SJohn Marino _rl_interrupt_immediately--;
2008*6b445a62SJohn Marino
2009*6b445a62SJohn Marino /* If there were any matches, then look through them finding out the
2010*6b445a62SJohn Marino lowest common denominator. That then becomes match_list[0]. */
2011*6b445a62SJohn Marino if (matches)
2012*6b445a62SJohn Marino compute_lcd_of_matches (match_list, matches, text);
2013*6b445a62SJohn Marino else /* There were no matches. */
2014*6b445a62SJohn Marino {
2015*6b445a62SJohn Marino xfree (match_list);
2016*6b445a62SJohn Marino match_list = (char **)NULL;
2017*6b445a62SJohn Marino }
2018*6b445a62SJohn Marino return (match_list);
2019*6b445a62SJohn Marino }
2020*6b445a62SJohn Marino
2021*6b445a62SJohn Marino /* A completion function for usernames.
2022*6b445a62SJohn Marino TEXT contains a partial username preceded by a random
2023*6b445a62SJohn Marino character (usually `~'). */
2024*6b445a62SJohn Marino char *
rl_username_completion_function(text,state)2025*6b445a62SJohn Marino rl_username_completion_function (text, state)
2026*6b445a62SJohn Marino const char *text;
2027*6b445a62SJohn Marino int state;
2028*6b445a62SJohn Marino {
2029*6b445a62SJohn Marino #if defined (__WIN32__) || defined (__OPENNT)
2030*6b445a62SJohn Marino return (char *)NULL;
2031*6b445a62SJohn Marino #else /* !__WIN32__ && !__OPENNT) */
2032*6b445a62SJohn Marino static char *username = (char *)NULL;
2033*6b445a62SJohn Marino static struct passwd *entry;
2034*6b445a62SJohn Marino static int namelen, first_char, first_char_loc;
2035*6b445a62SJohn Marino char *value;
2036*6b445a62SJohn Marino
2037*6b445a62SJohn Marino if (state == 0)
2038*6b445a62SJohn Marino {
2039*6b445a62SJohn Marino FREE (username);
2040*6b445a62SJohn Marino
2041*6b445a62SJohn Marino first_char = *text;
2042*6b445a62SJohn Marino first_char_loc = first_char == '~';
2043*6b445a62SJohn Marino
2044*6b445a62SJohn Marino username = savestring (&text[first_char_loc]);
2045*6b445a62SJohn Marino namelen = strlen (username);
2046*6b445a62SJohn Marino setpwent ();
2047*6b445a62SJohn Marino }
2048*6b445a62SJohn Marino
2049*6b445a62SJohn Marino #if defined (HAVE_GETPWENT)
2050*6b445a62SJohn Marino while (entry = getpwent ())
2051*6b445a62SJohn Marino {
2052*6b445a62SJohn Marino /* Null usernames should result in all users as possible completions. */
2053*6b445a62SJohn Marino if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
2054*6b445a62SJohn Marino break;
2055*6b445a62SJohn Marino }
2056*6b445a62SJohn Marino #endif
2057*6b445a62SJohn Marino
2058*6b445a62SJohn Marino if (entry == 0)
2059*6b445a62SJohn Marino {
2060*6b445a62SJohn Marino #if defined (HAVE_GETPWENT)
2061*6b445a62SJohn Marino endpwent ();
2062*6b445a62SJohn Marino #endif
2063*6b445a62SJohn Marino return ((char *)NULL);
2064*6b445a62SJohn Marino }
2065*6b445a62SJohn Marino else
2066*6b445a62SJohn Marino {
2067*6b445a62SJohn Marino value = (char *)xmalloc (2 + strlen (entry->pw_name));
2068*6b445a62SJohn Marino
2069*6b445a62SJohn Marino *value = *text;
2070*6b445a62SJohn Marino
2071*6b445a62SJohn Marino strcpy (value + first_char_loc, entry->pw_name);
2072*6b445a62SJohn Marino
2073*6b445a62SJohn Marino if (first_char == '~')
2074*6b445a62SJohn Marino rl_filename_completion_desired = 1;
2075*6b445a62SJohn Marino
2076*6b445a62SJohn Marino return (value);
2077*6b445a62SJohn Marino }
2078*6b445a62SJohn Marino #endif /* !__WIN32__ && !__OPENNT */
2079*6b445a62SJohn Marino }
2080*6b445a62SJohn Marino
2081*6b445a62SJohn Marino /* Return non-zero if CONVFN matches FILENAME up to the length of FILENAME
2082*6b445a62SJohn Marino (FILENAME_LEN). If _rl_completion_case_fold is set, compare without
2083*6b445a62SJohn Marino regard to the alphabetic case of characters. CONVFN is the possibly-
2084*6b445a62SJohn Marino converted directory entry; FILENAME is what the user typed. */
2085*6b445a62SJohn Marino static int
complete_fncmp(convfn,convlen,filename,filename_len)2086*6b445a62SJohn Marino complete_fncmp (convfn, convlen, filename, filename_len)
2087*6b445a62SJohn Marino const char *convfn;
2088*6b445a62SJohn Marino int convlen;
2089*6b445a62SJohn Marino const char *filename;
2090*6b445a62SJohn Marino int filename_len;
2091*6b445a62SJohn Marino {
2092*6b445a62SJohn Marino register char *s1, *s2;
2093*6b445a62SJohn Marino int d, len;
2094*6b445a62SJohn Marino
2095*6b445a62SJohn Marino /* Otherwise, if these match up to the length of filename, then
2096*6b445a62SJohn Marino it is a match. */
2097*6b445a62SJohn Marino if (_rl_completion_case_fold && _rl_completion_case_map)
2098*6b445a62SJohn Marino {
2099*6b445a62SJohn Marino /* Case-insensitive comparison treating _ and - as equivalent */
2100*6b445a62SJohn Marino if (filename_len == 0)
2101*6b445a62SJohn Marino return 1;
2102*6b445a62SJohn Marino if (convlen < filename_len)
2103*6b445a62SJohn Marino return 0;
2104*6b445a62SJohn Marino s1 = (char *)convfn;
2105*6b445a62SJohn Marino s2 = (char *)filename;
2106*6b445a62SJohn Marino len = filename_len;
2107*6b445a62SJohn Marino do
2108*6b445a62SJohn Marino {
2109*6b445a62SJohn Marino d = _rl_to_lower (*s1) - _rl_to_lower (*s2);
2110*6b445a62SJohn Marino /* *s1 == [-_] && *s2 == [-_] */
2111*6b445a62SJohn Marino if ((*s1 == '-' || *s1 == '_') && (*s2 == '-' || *s2 == '_'))
2112*6b445a62SJohn Marino d = 0;
2113*6b445a62SJohn Marino if (d != 0)
2114*6b445a62SJohn Marino return 0;
2115*6b445a62SJohn Marino s1++; s2++; /* already checked convlen >= filename_len */
2116*6b445a62SJohn Marino }
2117*6b445a62SJohn Marino while (--len != 0);
2118*6b445a62SJohn Marino return 1;
2119*6b445a62SJohn Marino }
2120*6b445a62SJohn Marino else if (_rl_completion_case_fold)
2121*6b445a62SJohn Marino {
2122*6b445a62SJohn Marino if ((_rl_to_lower (convfn[0]) == _rl_to_lower (filename[0])) &&
2123*6b445a62SJohn Marino (convlen >= filename_len) &&
2124*6b445a62SJohn Marino (_rl_strnicmp (filename, convfn, filename_len) == 0))
2125*6b445a62SJohn Marino return 1;
2126*6b445a62SJohn Marino }
2127*6b445a62SJohn Marino else
2128*6b445a62SJohn Marino {
2129*6b445a62SJohn Marino if ((convfn[0] == filename[0]) &&
2130*6b445a62SJohn Marino (convlen >= filename_len) &&
2131*6b445a62SJohn Marino (strncmp (filename, convfn, filename_len) == 0))
2132*6b445a62SJohn Marino return 1;
2133*6b445a62SJohn Marino }
2134*6b445a62SJohn Marino return 0;
2135*6b445a62SJohn Marino }
2136*6b445a62SJohn Marino
2137*6b445a62SJohn Marino /* Okay, now we write the entry_function for filename completion. In the
2138*6b445a62SJohn Marino general case. Note that completion in the shell is a little different
2139*6b445a62SJohn Marino because of all the pathnames that must be followed when looking up the
2140*6b445a62SJohn Marino completion for a command. */
2141*6b445a62SJohn Marino char *
rl_filename_completion_function(text,state)2142*6b445a62SJohn Marino rl_filename_completion_function (text, state)
2143*6b445a62SJohn Marino const char *text;
2144*6b445a62SJohn Marino int state;
2145*6b445a62SJohn Marino {
2146*6b445a62SJohn Marino static DIR *directory = (DIR *)NULL;
2147*6b445a62SJohn Marino static char *filename = (char *)NULL;
2148*6b445a62SJohn Marino static char *dirname = (char *)NULL;
2149*6b445a62SJohn Marino static char *users_dirname = (char *)NULL;
2150*6b445a62SJohn Marino static int filename_len;
2151*6b445a62SJohn Marino char *temp, *dentry, *convfn;
2152*6b445a62SJohn Marino int dirlen, dentlen, convlen;
2153*6b445a62SJohn Marino struct dirent *entry;
2154*6b445a62SJohn Marino
2155*6b445a62SJohn Marino /* If we don't have any state, then do some initialization. */
2156*6b445a62SJohn Marino if (state == 0)
2157*6b445a62SJohn Marino {
2158*6b445a62SJohn Marino /* If we were interrupted before closing the directory or reading
2159*6b445a62SJohn Marino all of its contents, close it. */
2160*6b445a62SJohn Marino if (directory)
2161*6b445a62SJohn Marino {
2162*6b445a62SJohn Marino closedir (directory);
2163*6b445a62SJohn Marino directory = (DIR *)NULL;
2164*6b445a62SJohn Marino }
2165*6b445a62SJohn Marino FREE (dirname);
2166*6b445a62SJohn Marino FREE (filename);
2167*6b445a62SJohn Marino FREE (users_dirname);
2168*6b445a62SJohn Marino
2169*6b445a62SJohn Marino filename = savestring (text);
2170*6b445a62SJohn Marino if (*text == 0)
2171*6b445a62SJohn Marino text = ".";
2172*6b445a62SJohn Marino dirname = savestring (text);
2173*6b445a62SJohn Marino
2174*6b445a62SJohn Marino temp = strrchr (dirname, '/');
2175*6b445a62SJohn Marino
2176*6b445a62SJohn Marino #if defined (__MSDOS__)
2177*6b445a62SJohn Marino /* special hack for //X/... */
2178*6b445a62SJohn Marino if (dirname[0] == '/' && dirname[1] == '/' && ISALPHA ((unsigned char)dirname[2]) && dirname[3] == '/')
2179*6b445a62SJohn Marino temp = strrchr (dirname + 3, '/');
2180*6b445a62SJohn Marino #endif
2181*6b445a62SJohn Marino
2182*6b445a62SJohn Marino if (temp)
2183*6b445a62SJohn Marino {
2184*6b445a62SJohn Marino strcpy (filename, ++temp);
2185*6b445a62SJohn Marino *temp = '\0';
2186*6b445a62SJohn Marino }
2187*6b445a62SJohn Marino #if defined (__MSDOS__)
2188*6b445a62SJohn Marino /* searches from current directory on the drive */
2189*6b445a62SJohn Marino else if (ISALPHA ((unsigned char)dirname[0]) && dirname[1] == ':')
2190*6b445a62SJohn Marino {
2191*6b445a62SJohn Marino strcpy (filename, dirname + 2);
2192*6b445a62SJohn Marino dirname[2] = '\0';
2193*6b445a62SJohn Marino }
2194*6b445a62SJohn Marino #endif
2195*6b445a62SJohn Marino else
2196*6b445a62SJohn Marino {
2197*6b445a62SJohn Marino dirname[0] = '.';
2198*6b445a62SJohn Marino dirname[1] = '\0';
2199*6b445a62SJohn Marino }
2200*6b445a62SJohn Marino
2201*6b445a62SJohn Marino /* We aren't done yet. We also support the "~user" syntax. */
2202*6b445a62SJohn Marino
2203*6b445a62SJohn Marino /* Save the version of the directory that the user typed, dequoting
2204*6b445a62SJohn Marino it if necessary. */
2205*6b445a62SJohn Marino if (rl_completion_found_quote && rl_filename_dequoting_function)
2206*6b445a62SJohn Marino users_dirname = (*rl_filename_dequoting_function) (dirname, rl_completion_quote_character);
2207*6b445a62SJohn Marino else
2208*6b445a62SJohn Marino users_dirname = savestring (dirname);
2209*6b445a62SJohn Marino
2210*6b445a62SJohn Marino if (*dirname == '~')
2211*6b445a62SJohn Marino {
2212*6b445a62SJohn Marino temp = tilde_expand (dirname);
2213*6b445a62SJohn Marino xfree (dirname);
2214*6b445a62SJohn Marino dirname = temp;
2215*6b445a62SJohn Marino }
2216*6b445a62SJohn Marino
2217*6b445a62SJohn Marino /* We have saved the possibly-dequoted version of the directory name
2218*6b445a62SJohn Marino the user typed. Now transform the directory name we're going to
2219*6b445a62SJohn Marino pass to opendir(2). The directory rewrite hook modifies only the
2220*6b445a62SJohn Marino directory name; the directory completion hook modifies both the
2221*6b445a62SJohn Marino directory name passed to opendir(2) and the version the user
2222*6b445a62SJohn Marino typed. Both the directory completion and rewrite hooks should perform
2223*6b445a62SJohn Marino any necessary dequoting. The hook functions return 1 if they modify
2224*6b445a62SJohn Marino the directory name argument. If either hook returns 0, it should
2225*6b445a62SJohn Marino not modify the directory name pointer passed as an argument. */
2226*6b445a62SJohn Marino if (rl_directory_rewrite_hook)
2227*6b445a62SJohn Marino (*rl_directory_rewrite_hook) (&dirname);
2228*6b445a62SJohn Marino else if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname))
2229*6b445a62SJohn Marino {
2230*6b445a62SJohn Marino xfree (users_dirname);
2231*6b445a62SJohn Marino users_dirname = savestring (dirname);
2232*6b445a62SJohn Marino }
2233*6b445a62SJohn Marino else if (rl_completion_found_quote && rl_filename_dequoting_function)
2234*6b445a62SJohn Marino {
2235*6b445a62SJohn Marino /* delete single and double quotes */
2236*6b445a62SJohn Marino xfree (dirname);
2237*6b445a62SJohn Marino dirname = savestring (users_dirname);
2238*6b445a62SJohn Marino }
2239*6b445a62SJohn Marino directory = opendir (dirname);
2240*6b445a62SJohn Marino
2241*6b445a62SJohn Marino /* Now dequote a non-null filename. */
2242*6b445a62SJohn Marino if (filename && *filename && rl_completion_found_quote && rl_filename_dequoting_function)
2243*6b445a62SJohn Marino {
2244*6b445a62SJohn Marino /* delete single and double quotes */
2245*6b445a62SJohn Marino temp = (*rl_filename_dequoting_function) (filename, rl_completion_quote_character);
2246*6b445a62SJohn Marino xfree (filename);
2247*6b445a62SJohn Marino filename = temp;
2248*6b445a62SJohn Marino }
2249*6b445a62SJohn Marino filename_len = strlen (filename);
2250*6b445a62SJohn Marino
2251*6b445a62SJohn Marino rl_filename_completion_desired = 1;
2252*6b445a62SJohn Marino }
2253*6b445a62SJohn Marino
2254*6b445a62SJohn Marino /* At this point we should entertain the possibility of hacking wildcarded
2255*6b445a62SJohn Marino filenames, like /usr/man/man<WILD>/te<TAB>. If the directory name
2256*6b445a62SJohn Marino contains globbing characters, then build an array of directories, and
2257*6b445a62SJohn Marino then map over that list while completing. */
2258*6b445a62SJohn Marino /* *** UNIMPLEMENTED *** */
2259*6b445a62SJohn Marino
2260*6b445a62SJohn Marino /* Now that we have some state, we can read the directory. */
2261*6b445a62SJohn Marino
2262*6b445a62SJohn Marino entry = (struct dirent *)NULL;
2263*6b445a62SJohn Marino while (directory && (entry = readdir (directory)))
2264*6b445a62SJohn Marino {
2265*6b445a62SJohn Marino convfn = dentry = entry->d_name;
2266*6b445a62SJohn Marino convlen = dentlen = D_NAMLEN (entry);
2267*6b445a62SJohn Marino
2268*6b445a62SJohn Marino if (rl_filename_rewrite_hook)
2269*6b445a62SJohn Marino {
2270*6b445a62SJohn Marino convfn = (*rl_filename_rewrite_hook) (dentry, dentlen);
2271*6b445a62SJohn Marino convlen = (convfn == dentry) ? dentlen : strlen (convfn);
2272*6b445a62SJohn Marino }
2273*6b445a62SJohn Marino
2274*6b445a62SJohn Marino /* Special case for no filename. If the user has disabled the
2275*6b445a62SJohn Marino `match-hidden-files' variable, skip filenames beginning with `.'.
2276*6b445a62SJohn Marino All other entries except "." and ".." match. */
2277*6b445a62SJohn Marino if (filename_len == 0)
2278*6b445a62SJohn Marino {
2279*6b445a62SJohn Marino if (_rl_match_hidden_files == 0 && HIDDEN_FILE (convfn))
2280*6b445a62SJohn Marino continue;
2281*6b445a62SJohn Marino
2282*6b445a62SJohn Marino if (convfn[0] != '.' ||
2283*6b445a62SJohn Marino (convfn[1] && (convfn[1] != '.' || convfn[2])))
2284*6b445a62SJohn Marino break;
2285*6b445a62SJohn Marino }
2286*6b445a62SJohn Marino else
2287*6b445a62SJohn Marino {
2288*6b445a62SJohn Marino if (complete_fncmp (convfn, convlen, filename, filename_len))
2289*6b445a62SJohn Marino break;
2290*6b445a62SJohn Marino }
2291*6b445a62SJohn Marino }
2292*6b445a62SJohn Marino
2293*6b445a62SJohn Marino if (entry == 0)
2294*6b445a62SJohn Marino {
2295*6b445a62SJohn Marino if (directory)
2296*6b445a62SJohn Marino {
2297*6b445a62SJohn Marino closedir (directory);
2298*6b445a62SJohn Marino directory = (DIR *)NULL;
2299*6b445a62SJohn Marino }
2300*6b445a62SJohn Marino if (dirname)
2301*6b445a62SJohn Marino {
2302*6b445a62SJohn Marino xfree (dirname);
2303*6b445a62SJohn Marino dirname = (char *)NULL;
2304*6b445a62SJohn Marino }
2305*6b445a62SJohn Marino if (filename)
2306*6b445a62SJohn Marino {
2307*6b445a62SJohn Marino xfree (filename);
2308*6b445a62SJohn Marino filename = (char *)NULL;
2309*6b445a62SJohn Marino }
2310*6b445a62SJohn Marino if (users_dirname)
2311*6b445a62SJohn Marino {
2312*6b445a62SJohn Marino xfree (users_dirname);
2313*6b445a62SJohn Marino users_dirname = (char *)NULL;
2314*6b445a62SJohn Marino }
2315*6b445a62SJohn Marino
2316*6b445a62SJohn Marino return (char *)NULL;
2317*6b445a62SJohn Marino }
2318*6b445a62SJohn Marino else
2319*6b445a62SJohn Marino {
2320*6b445a62SJohn Marino /* dirname && (strcmp (dirname, ".") != 0) */
2321*6b445a62SJohn Marino if (dirname && (dirname[0] != '.' || dirname[1]))
2322*6b445a62SJohn Marino {
2323*6b445a62SJohn Marino if (rl_complete_with_tilde_expansion && *users_dirname == '~')
2324*6b445a62SJohn Marino {
2325*6b445a62SJohn Marino dirlen = strlen (dirname);
2326*6b445a62SJohn Marino temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry));
2327*6b445a62SJohn Marino strcpy (temp, dirname);
2328*6b445a62SJohn Marino /* Canonicalization cuts off any final slash present. We
2329*6b445a62SJohn Marino may need to add it back. */
2330*6b445a62SJohn Marino if (dirname[dirlen - 1] != '/')
2331*6b445a62SJohn Marino {
2332*6b445a62SJohn Marino temp[dirlen++] = '/';
2333*6b445a62SJohn Marino temp[dirlen] = '\0';
2334*6b445a62SJohn Marino }
2335*6b445a62SJohn Marino }
2336*6b445a62SJohn Marino else
2337*6b445a62SJohn Marino {
2338*6b445a62SJohn Marino dirlen = strlen (users_dirname);
2339*6b445a62SJohn Marino temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry));
2340*6b445a62SJohn Marino strcpy (temp, users_dirname);
2341*6b445a62SJohn Marino /* Make sure that temp has a trailing slash here. */
2342*6b445a62SJohn Marino if (users_dirname[dirlen - 1] != '/')
2343*6b445a62SJohn Marino temp[dirlen++] = '/';
2344*6b445a62SJohn Marino }
2345*6b445a62SJohn Marino
2346*6b445a62SJohn Marino strcpy (temp + dirlen, convfn);
2347*6b445a62SJohn Marino }
2348*6b445a62SJohn Marino else
2349*6b445a62SJohn Marino temp = savestring (convfn);
2350*6b445a62SJohn Marino
2351*6b445a62SJohn Marino if (convfn != dentry)
2352*6b445a62SJohn Marino xfree (convfn);
2353*6b445a62SJohn Marino
2354*6b445a62SJohn Marino return (temp);
2355*6b445a62SJohn Marino }
2356*6b445a62SJohn Marino }
2357*6b445a62SJohn Marino
2358*6b445a62SJohn Marino /* An initial implementation of a menu completion function a la tcsh. The
2359*6b445a62SJohn Marino first time (if the last readline command was not rl_old_menu_complete), we
2360*6b445a62SJohn Marino generate the list of matches. This code is very similar to the code in
2361*6b445a62SJohn Marino rl_complete_internal -- there should be a way to combine the two. Then,
2362*6b445a62SJohn Marino for each item in the list of matches, we insert the match in an undoable
2363*6b445a62SJohn Marino fashion, with the appropriate character appended (this happens on the
2364*6b445a62SJohn Marino second and subsequent consecutive calls to rl_old_menu_complete). When we
2365*6b445a62SJohn Marino hit the end of the match list, we restore the original unmatched text,
2366*6b445a62SJohn Marino ring the bell, and reset the counter to zero. */
2367*6b445a62SJohn Marino int
rl_old_menu_complete(count,invoking_key)2368*6b445a62SJohn Marino rl_old_menu_complete (count, invoking_key)
2369*6b445a62SJohn Marino int count, invoking_key;
2370*6b445a62SJohn Marino {
2371*6b445a62SJohn Marino rl_compentry_func_t *our_func;
2372*6b445a62SJohn Marino int matching_filenames, found_quote;
2373*6b445a62SJohn Marino
2374*6b445a62SJohn Marino static char *orig_text;
2375*6b445a62SJohn Marino static char **matches = (char **)0;
2376*6b445a62SJohn Marino static int match_list_index = 0;
2377*6b445a62SJohn Marino static int match_list_size = 0;
2378*6b445a62SJohn Marino static int orig_start, orig_end;
2379*6b445a62SJohn Marino static char quote_char;
2380*6b445a62SJohn Marino static int delimiter;
2381*6b445a62SJohn Marino
2382*6b445a62SJohn Marino /* The first time through, we generate the list of matches and set things
2383*6b445a62SJohn Marino up to insert them. */
2384*6b445a62SJohn Marino if (rl_last_func != rl_old_menu_complete)
2385*6b445a62SJohn Marino {
2386*6b445a62SJohn Marino /* Clean up from previous call, if any. */
2387*6b445a62SJohn Marino FREE (orig_text);
2388*6b445a62SJohn Marino if (matches)
2389*6b445a62SJohn Marino _rl_free_match_list (matches);
2390*6b445a62SJohn Marino
2391*6b445a62SJohn Marino match_list_index = match_list_size = 0;
2392*6b445a62SJohn Marino matches = (char **)NULL;
2393*6b445a62SJohn Marino
2394*6b445a62SJohn Marino rl_completion_invoking_key = invoking_key;
2395*6b445a62SJohn Marino
2396*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_COMPLETING);
2397*6b445a62SJohn Marino
2398*6b445a62SJohn Marino /* Only the completion entry function can change these. */
2399*6b445a62SJohn Marino set_completion_defaults ('%');
2400*6b445a62SJohn Marino
2401*6b445a62SJohn Marino our_func = rl_menu_completion_entry_function;
2402*6b445a62SJohn Marino if (our_func == 0)
2403*6b445a62SJohn Marino our_func = rl_completion_entry_function
2404*6b445a62SJohn Marino ? rl_completion_entry_function
2405*6b445a62SJohn Marino : rl_filename_completion_function;
2406*6b445a62SJohn Marino
2407*6b445a62SJohn Marino /* We now look backwards for the start of a filename/variable word. */
2408*6b445a62SJohn Marino orig_end = rl_point;
2409*6b445a62SJohn Marino found_quote = delimiter = 0;
2410*6b445a62SJohn Marino quote_char = '\0';
2411*6b445a62SJohn Marino
2412*6b445a62SJohn Marino if (rl_point)
2413*6b445a62SJohn Marino /* This (possibly) changes rl_point. If it returns a non-zero char,
2414*6b445a62SJohn Marino we know we have an open quote. */
2415*6b445a62SJohn Marino quote_char = _rl_find_completion_word (&found_quote, &delimiter);
2416*6b445a62SJohn Marino
2417*6b445a62SJohn Marino orig_start = rl_point;
2418*6b445a62SJohn Marino rl_point = orig_end;
2419*6b445a62SJohn Marino
2420*6b445a62SJohn Marino orig_text = rl_copy_text (orig_start, orig_end);
2421*6b445a62SJohn Marino matches = gen_completion_matches (orig_text, orig_start, orig_end,
2422*6b445a62SJohn Marino our_func, found_quote, quote_char);
2423*6b445a62SJohn Marino
2424*6b445a62SJohn Marino /* If we are matching filenames, the attempted completion function will
2425*6b445a62SJohn Marino have set rl_filename_completion_desired to a non-zero value. The basic
2426*6b445a62SJohn Marino rl_filename_completion_function does this. */
2427*6b445a62SJohn Marino matching_filenames = rl_filename_completion_desired;
2428*6b445a62SJohn Marino
2429*6b445a62SJohn Marino if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0)
2430*6b445a62SJohn Marino {
2431*6b445a62SJohn Marino rl_ding ();
2432*6b445a62SJohn Marino FREE (matches);
2433*6b445a62SJohn Marino matches = (char **)0;
2434*6b445a62SJohn Marino FREE (orig_text);
2435*6b445a62SJohn Marino orig_text = (char *)0;
2436*6b445a62SJohn Marino completion_changed_buffer = 0;
2437*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_COMPLETING);
2438*6b445a62SJohn Marino return (0);
2439*6b445a62SJohn Marino }
2440*6b445a62SJohn Marino
2441*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_COMPLETING);
2442*6b445a62SJohn Marino
2443*6b445a62SJohn Marino for (match_list_size = 0; matches[match_list_size]; match_list_size++)
2444*6b445a62SJohn Marino ;
2445*6b445a62SJohn Marino /* matches[0] is lcd if match_list_size > 1, but the circular buffer
2446*6b445a62SJohn Marino code below should take care of it. */
2447*6b445a62SJohn Marino
2448*6b445a62SJohn Marino if (match_list_size > 1 && _rl_complete_show_all)
2449*6b445a62SJohn Marino display_matches (matches);
2450*6b445a62SJohn Marino }
2451*6b445a62SJohn Marino
2452*6b445a62SJohn Marino /* Now we have the list of matches. Replace the text between
2453*6b445a62SJohn Marino rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with
2454*6b445a62SJohn Marino matches[match_list_index], and add any necessary closing char. */
2455*6b445a62SJohn Marino
2456*6b445a62SJohn Marino if (matches == 0 || match_list_size == 0)
2457*6b445a62SJohn Marino {
2458*6b445a62SJohn Marino rl_ding ();
2459*6b445a62SJohn Marino FREE (matches);
2460*6b445a62SJohn Marino matches = (char **)0;
2461*6b445a62SJohn Marino completion_changed_buffer = 0;
2462*6b445a62SJohn Marino return (0);
2463*6b445a62SJohn Marino }
2464*6b445a62SJohn Marino
2465*6b445a62SJohn Marino match_list_index += count;
2466*6b445a62SJohn Marino if (match_list_index < 0)
2467*6b445a62SJohn Marino {
2468*6b445a62SJohn Marino while (match_list_index < 0)
2469*6b445a62SJohn Marino match_list_index += match_list_size;
2470*6b445a62SJohn Marino }
2471*6b445a62SJohn Marino else
2472*6b445a62SJohn Marino match_list_index %= match_list_size;
2473*6b445a62SJohn Marino
2474*6b445a62SJohn Marino if (match_list_index == 0 && match_list_size > 1)
2475*6b445a62SJohn Marino {
2476*6b445a62SJohn Marino rl_ding ();
2477*6b445a62SJohn Marino insert_match (orig_text, orig_start, MULT_MATCH, "e_char);
2478*6b445a62SJohn Marino }
2479*6b445a62SJohn Marino else
2480*6b445a62SJohn Marino {
2481*6b445a62SJohn Marino insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char);
2482*6b445a62SJohn Marino append_to_match (matches[match_list_index], delimiter, quote_char,
2483*6b445a62SJohn Marino strcmp (orig_text, matches[match_list_index]));
2484*6b445a62SJohn Marino }
2485*6b445a62SJohn Marino
2486*6b445a62SJohn Marino completion_changed_buffer = 1;
2487*6b445a62SJohn Marino return (0);
2488*6b445a62SJohn Marino }
2489*6b445a62SJohn Marino
2490*6b445a62SJohn Marino int
rl_menu_complete(count,ignore)2491*6b445a62SJohn Marino rl_menu_complete (count, ignore)
2492*6b445a62SJohn Marino int count, ignore;
2493*6b445a62SJohn Marino {
2494*6b445a62SJohn Marino rl_compentry_func_t *our_func;
2495*6b445a62SJohn Marino int matching_filenames, found_quote;
2496*6b445a62SJohn Marino
2497*6b445a62SJohn Marino static char *orig_text;
2498*6b445a62SJohn Marino static char **matches = (char **)0;
2499*6b445a62SJohn Marino static int match_list_index = 0;
2500*6b445a62SJohn Marino static int match_list_size = 0;
2501*6b445a62SJohn Marino static int nontrivial_lcd = 0;
2502*6b445a62SJohn Marino static int full_completion = 0; /* set to 1 if menu completion should reinitialize on next call */
2503*6b445a62SJohn Marino static int orig_start, orig_end;
2504*6b445a62SJohn Marino static char quote_char;
2505*6b445a62SJohn Marino static int delimiter, cstate;
2506*6b445a62SJohn Marino
2507*6b445a62SJohn Marino /* The first time through, we generate the list of matches and set things
2508*6b445a62SJohn Marino up to insert them. */
2509*6b445a62SJohn Marino if ((rl_last_func != rl_menu_complete && rl_last_func != rl_backward_menu_complete) || full_completion)
2510*6b445a62SJohn Marino {
2511*6b445a62SJohn Marino /* Clean up from previous call, if any. */
2512*6b445a62SJohn Marino FREE (orig_text);
2513*6b445a62SJohn Marino if (matches)
2514*6b445a62SJohn Marino _rl_free_match_list (matches);
2515*6b445a62SJohn Marino
2516*6b445a62SJohn Marino match_list_index = match_list_size = 0;
2517*6b445a62SJohn Marino matches = (char **)NULL;
2518*6b445a62SJohn Marino
2519*6b445a62SJohn Marino full_completion = 0;
2520*6b445a62SJohn Marino
2521*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_COMPLETING);
2522*6b445a62SJohn Marino
2523*6b445a62SJohn Marino /* Only the completion entry function can change these. */
2524*6b445a62SJohn Marino set_completion_defaults ('%');
2525*6b445a62SJohn Marino
2526*6b445a62SJohn Marino our_func = rl_menu_completion_entry_function;
2527*6b445a62SJohn Marino if (our_func == 0)
2528*6b445a62SJohn Marino our_func = rl_completion_entry_function
2529*6b445a62SJohn Marino ? rl_completion_entry_function
2530*6b445a62SJohn Marino : rl_filename_completion_function;
2531*6b445a62SJohn Marino
2532*6b445a62SJohn Marino /* We now look backwards for the start of a filename/variable word. */
2533*6b445a62SJohn Marino orig_end = rl_point;
2534*6b445a62SJohn Marino found_quote = delimiter = 0;
2535*6b445a62SJohn Marino quote_char = '\0';
2536*6b445a62SJohn Marino
2537*6b445a62SJohn Marino if (rl_point)
2538*6b445a62SJohn Marino /* This (possibly) changes rl_point. If it returns a non-zero char,
2539*6b445a62SJohn Marino we know we have an open quote. */
2540*6b445a62SJohn Marino quote_char = _rl_find_completion_word (&found_quote, &delimiter);
2541*6b445a62SJohn Marino
2542*6b445a62SJohn Marino orig_start = rl_point;
2543*6b445a62SJohn Marino rl_point = orig_end;
2544*6b445a62SJohn Marino
2545*6b445a62SJohn Marino orig_text = rl_copy_text (orig_start, orig_end);
2546*6b445a62SJohn Marino matches = gen_completion_matches (orig_text, orig_start, orig_end,
2547*6b445a62SJohn Marino our_func, found_quote, quote_char);
2548*6b445a62SJohn Marino
2549*6b445a62SJohn Marino nontrivial_lcd = matches && strcmp (orig_text, matches[0]) != 0;
2550*6b445a62SJohn Marino
2551*6b445a62SJohn Marino /* If we are matching filenames, the attempted completion function will
2552*6b445a62SJohn Marino have set rl_filename_completion_desired to a non-zero value. The basic
2553*6b445a62SJohn Marino rl_filename_completion_function does this. */
2554*6b445a62SJohn Marino matching_filenames = rl_filename_completion_desired;
2555*6b445a62SJohn Marino
2556*6b445a62SJohn Marino if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0)
2557*6b445a62SJohn Marino {
2558*6b445a62SJohn Marino rl_ding ();
2559*6b445a62SJohn Marino FREE (matches);
2560*6b445a62SJohn Marino matches = (char **)0;
2561*6b445a62SJohn Marino FREE (orig_text);
2562*6b445a62SJohn Marino orig_text = (char *)0;
2563*6b445a62SJohn Marino completion_changed_buffer = 0;
2564*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_COMPLETING);
2565*6b445a62SJohn Marino return (0);
2566*6b445a62SJohn Marino }
2567*6b445a62SJohn Marino
2568*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_COMPLETING);
2569*6b445a62SJohn Marino
2570*6b445a62SJohn Marino for (match_list_size = 0; matches[match_list_size]; match_list_size++)
2571*6b445a62SJohn Marino ;
2572*6b445a62SJohn Marino
2573*6b445a62SJohn Marino if (match_list_size == 0)
2574*6b445a62SJohn Marino {
2575*6b445a62SJohn Marino rl_ding ();
2576*6b445a62SJohn Marino FREE (matches);
2577*6b445a62SJohn Marino matches = (char **)0;
2578*6b445a62SJohn Marino match_list_index = 0;
2579*6b445a62SJohn Marino completion_changed_buffer = 0;
2580*6b445a62SJohn Marino return (0);
2581*6b445a62SJohn Marino }
2582*6b445a62SJohn Marino
2583*6b445a62SJohn Marino /* matches[0] is lcd if match_list_size > 1, but the circular buffer
2584*6b445a62SJohn Marino code below should take care of it. */
2585*6b445a62SJohn Marino if (*matches[0])
2586*6b445a62SJohn Marino {
2587*6b445a62SJohn Marino insert_match (matches[0], orig_start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char);
2588*6b445a62SJohn Marino orig_end = orig_start + strlen (matches[0]);
2589*6b445a62SJohn Marino completion_changed_buffer = STREQ (orig_text, matches[0]) == 0;
2590*6b445a62SJohn Marino }
2591*6b445a62SJohn Marino
2592*6b445a62SJohn Marino if (match_list_size > 1 && _rl_complete_show_all)
2593*6b445a62SJohn Marino {
2594*6b445a62SJohn Marino display_matches (matches);
2595*6b445a62SJohn Marino /* If there are so many matches that the user has to be asked
2596*6b445a62SJohn Marino whether or not he wants to see the matches, menu completion
2597*6b445a62SJohn Marino is unwieldy. */
2598*6b445a62SJohn Marino if (rl_completion_query_items > 0 && match_list_size >= rl_completion_query_items)
2599*6b445a62SJohn Marino {
2600*6b445a62SJohn Marino rl_ding ();
2601*6b445a62SJohn Marino FREE (matches);
2602*6b445a62SJohn Marino matches = (char **)0;
2603*6b445a62SJohn Marino full_completion = 1;
2604*6b445a62SJohn Marino return (0);
2605*6b445a62SJohn Marino }
2606*6b445a62SJohn Marino }
2607*6b445a62SJohn Marino else if (match_list_size <= 1)
2608*6b445a62SJohn Marino {
2609*6b445a62SJohn Marino append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd);
2610*6b445a62SJohn Marino full_completion = 1;
2611*6b445a62SJohn Marino return (0);
2612*6b445a62SJohn Marino }
2613*6b445a62SJohn Marino else if (_rl_menu_complete_prefix_first && match_list_size > 1)
2614*6b445a62SJohn Marino {
2615*6b445a62SJohn Marino rl_ding ();
2616*6b445a62SJohn Marino return (0);
2617*6b445a62SJohn Marino }
2618*6b445a62SJohn Marino }
2619*6b445a62SJohn Marino
2620*6b445a62SJohn Marino /* Now we have the list of matches. Replace the text between
2621*6b445a62SJohn Marino rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with
2622*6b445a62SJohn Marino matches[match_list_index], and add any necessary closing char. */
2623*6b445a62SJohn Marino
2624*6b445a62SJohn Marino if (matches == 0 || match_list_size == 0)
2625*6b445a62SJohn Marino {
2626*6b445a62SJohn Marino rl_ding ();
2627*6b445a62SJohn Marino FREE (matches);
2628*6b445a62SJohn Marino matches = (char **)0;
2629*6b445a62SJohn Marino completion_changed_buffer = 0;
2630*6b445a62SJohn Marino return (0);
2631*6b445a62SJohn Marino }
2632*6b445a62SJohn Marino
2633*6b445a62SJohn Marino match_list_index += count;
2634*6b445a62SJohn Marino if (match_list_index < 0)
2635*6b445a62SJohn Marino {
2636*6b445a62SJohn Marino while (match_list_index < 0)
2637*6b445a62SJohn Marino match_list_index += match_list_size;
2638*6b445a62SJohn Marino }
2639*6b445a62SJohn Marino else
2640*6b445a62SJohn Marino match_list_index %= match_list_size;
2641*6b445a62SJohn Marino
2642*6b445a62SJohn Marino if (match_list_index == 0 && match_list_size > 1)
2643*6b445a62SJohn Marino {
2644*6b445a62SJohn Marino rl_ding ();
2645*6b445a62SJohn Marino insert_match (matches[0], orig_start, MULT_MATCH, "e_char);
2646*6b445a62SJohn Marino }
2647*6b445a62SJohn Marino else
2648*6b445a62SJohn Marino {
2649*6b445a62SJohn Marino insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char);
2650*6b445a62SJohn Marino append_to_match (matches[match_list_index], delimiter, quote_char,
2651*6b445a62SJohn Marino strcmp (orig_text, matches[match_list_index]));
2652*6b445a62SJohn Marino }
2653*6b445a62SJohn Marino
2654*6b445a62SJohn Marino completion_changed_buffer = 1;
2655*6b445a62SJohn Marino return (0);
2656*6b445a62SJohn Marino }
2657*6b445a62SJohn Marino
2658*6b445a62SJohn Marino int
rl_backward_menu_complete(count,key)2659*6b445a62SJohn Marino rl_backward_menu_complete (count, key)
2660*6b445a62SJohn Marino int count, key;
2661*6b445a62SJohn Marino {
2662*6b445a62SJohn Marino /* Positive arguments to backward-menu-complete translate into negative
2663*6b445a62SJohn Marino arguments for menu-complete, and vice versa. */
2664*6b445a62SJohn Marino return (rl_menu_complete (-count, key));
2665*6b445a62SJohn Marino }
2666