xref: /dragonfly/contrib/gdb-7/readline/complete.c (revision 6b445a62)
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, &quote_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, &quote_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, &quote_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, &quote_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, &quote_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, &quote_char);
2478*6b445a62SJohn Marino     }
2479*6b445a62SJohn Marino   else
2480*6b445a62SJohn Marino     {
2481*6b445a62SJohn Marino       insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, &quote_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, &quote_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, &quote_char);
2646*6b445a62SJohn Marino     }
2647*6b445a62SJohn Marino   else
2648*6b445a62SJohn Marino     {
2649*6b445a62SJohn Marino       insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, &quote_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