Imported from ../bash-2.04.tar.gz.
[platform/upstream/bash.git] / lib / readline / complete.c
1 /* complete.c -- filename completion for readline. */
2
3 /* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
4
5    This file is part of the GNU Readline Library, a library for
6    reading lines of text with interactive input and history editing.
7
8    The GNU Readline Library is free software; you can redistribute it
9    and/or modify it under the terms of the GNU General Public License
10    as published by the Free Software Foundation; either version 2, or
11    (at your option) any later version.
12
13    The GNU Readline Library is distributed in the hope that it will be
14    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
15    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    The GNU General Public License is often shipped with GNU software, and
19    is generally kept in a file called COPYING or LICENSE.  If you do not
20    have a copy of the license, write to the Free Software Foundation,
21    59 Temple Place, Suite 330, Boston, MA 02111 USA. */
22 #define READLINE_LIBRARY
23
24 #if defined (HAVE_CONFIG_H)
25 #  include <config.h>
26 #endif
27
28 #include <sys/types.h>
29 #include <fcntl.h>
30 #if defined (HAVE_SYS_FILE_H)
31 #include <sys/file.h>
32 #endif
33
34 #if defined (HAVE_UNISTD_H)
35 #  include <unistd.h>
36 #endif /* HAVE_UNISTD_H */
37
38 #if defined (HAVE_STDLIB_H)
39 #  include <stdlib.h>
40 #else
41 #  include "ansi_stdlib.h"
42 #endif /* HAVE_STDLIB_H */
43
44 #include <stdio.h>
45
46 #include <errno.h>
47 #if !defined (errno)
48 extern int errno;
49 #endif /* !errno */
50
51 #include <pwd.h>
52 #if !defined (HAVE_GETPW_DECLS)
53 extern struct passwd *getpwent ();
54 #endif /* USG && !HAVE_GETPW_DECLS */
55
56 /* ISC systems don't define getpwent() if _POSIX_SOURCE is defined. */
57 #if defined (isc386) && defined (_POSIX_SOURCE)
58 #  if defined (__STDC__)
59 extern struct passwd *getpwent (void);
60 #  else
61 extern struct passwd *getpwent ();
62 #  endif /* !__STDC__ */
63 #endif /* isc386 && _POSIX_SOURCE */
64
65 #include "posixdir.h"
66 #include "posixstat.h"
67
68 /* System-specific feature definitions and include files. */
69 #include "rldefs.h"
70
71 /* Some standard library routines. */
72 #include "readline.h"
73 #include "xmalloc.h"
74 #include "rlprivate.h"
75
76 #ifdef __STDC__
77 typedef int QSFUNC (const void *, const void *);
78 #else
79 typedef int QSFUNC ();
80 #endif
81
82 /* If non-zero, then this is the address of a function to call when
83    completing a word would normally display the list of possible matches.
84    This function is called instead of actually doing the display.
85    It takes three arguments: (char **matches, int num_matches, int max_length)
86    where MATCHES is the array of strings that matched, NUM_MATCHES is the
87    number of strings in that array, and MAX_LENGTH is the length of the
88    longest string in that array. */
89 VFunction *rl_completion_display_matches_hook = (VFunction *)NULL;
90
91 /* Forward declarations for functions defined and used in this file. */
92 char *filename_completion_function __P((char *, int));
93 char **completion_matches __P((char *, CPFunction *));
94
95 #if defined (VISIBLE_STATS)
96 #  if !defined (X_OK)
97 #    define X_OK 1
98 #  endif
99 static int stat_char __P((char *));
100 #endif
101
102 static char *rl_quote_filename __P((char *, int, char *));
103 static char *rl_strpbrk __P((char *, char *));
104
105 static char **remove_duplicate_matches __P((char **));
106 static void insert_match __P((char *, int, int, char *));
107 static int append_to_match __P((char *, int, int));
108 static void insert_all_matches __P((char **, int, char *));
109 static void display_matches __P((char **));
110 static int compute_lcd_of_matches __P((char **, int, char *));
111
112 /* **************************************************************** */
113 /*                                                                  */
114 /*      Completion matching, from readline's point of view.         */
115 /*                                                                  */
116 /* **************************************************************** */
117
118 /* Variables known only to the readline library. */
119
120 /* If non-zero, non-unique completions always show the list of matches. */
121 int _rl_complete_show_all = 0;
122
123 /* If non-zero, completed directory names have a slash appended. */
124 int _rl_complete_mark_directories = 1;
125
126 /* If non-zero, completions are printed horizontally in alphabetical order,
127    like `ls -x'. */
128 int _rl_print_completions_horizontally;
129
130 /* Non-zero means that case is not significant in filename completion. */
131 #if defined (__MSDOS__) && !defined (__DJGPP__)
132 int _rl_completion_case_fold = 1;
133 #else
134 int _rl_completion_case_fold;
135 #endif
136
137 /* Global variables available to applications using readline. */
138
139 #if defined (VISIBLE_STATS)
140 /* Non-zero means add an additional character to each filename displayed
141    during listing completion iff rl_filename_completion_desired which helps
142    to indicate the type of file being listed. */
143 int rl_visible_stats = 0;
144 #endif /* VISIBLE_STATS */
145
146 /* If non-zero, then this is the address of a function to call when
147    completing on a directory name.  The function is called with
148    the address of a string (the current directory name) as an arg. */
149 Function *rl_directory_completion_hook = (Function *)NULL;
150
151 /* Non-zero means readline completion functions perform tilde expansion. */
152 int rl_complete_with_tilde_expansion = 0;
153
154 /* Pointer to the generator function for completion_matches ().
155    NULL means to use filename_completion_function (), the default filename
156    completer. */
157 Function *rl_completion_entry_function = (Function *)NULL;
158
159 /* Pointer to alternative function to create matches.
160    Function is called with TEXT, START, and END.
161    START and END are indices in RL_LINE_BUFFER saying what the boundaries
162    of TEXT are.
163    If this function exists and returns NULL then call the value of
164    rl_completion_entry_function to try to match, otherwise use the
165    array of strings returned. */
166 CPPFunction *rl_attempted_completion_function = (CPPFunction *)NULL;
167
168 /* Non-zero means to suppress normal filename completion after the
169    user-specified completion function has been called. */
170 int rl_attempted_completion_over = 0;
171
172 /* Set to a character indicating the type of completion being performed
173    by rl_complete_internal, available for use by application completion
174    functions. */
175 int rl_completion_type = 0;
176
177 /* Up to this many items will be displayed in response to a
178    possible-completions call.  After that, we ask the user if
179    she is sure she wants to see them all. */
180 int rl_completion_query_items = 100;
181
182 /* The basic list of characters that signal a break between words for the
183    completer routine.  The contents of this variable is what breaks words
184    in the shell, i.e. " \t\n\"\\'`@$><=" */
185 char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{(";
186
187 /* List of basic quoting characters. */
188 char *rl_basic_quote_characters = "\"'";
189
190 /* The list of characters that signal a break between words for
191    rl_complete_internal.  The default list is the contents of
192    rl_basic_word_break_characters.  */
193 char *rl_completer_word_break_characters = (char *)NULL;
194
195 /* List of characters which can be used to quote a substring of the line.
196    Completion occurs on the entire substring, and within the substring
197    rl_completer_word_break_characters are treated as any other character,
198    unless they also appear within this list. */
199 char *rl_completer_quote_characters = (char *)NULL;
200
201 /* List of characters that should be quoted in filenames by the completer. */
202 char *rl_filename_quote_characters = (char *)NULL;
203
204 /* List of characters that are word break characters, but should be left
205    in TEXT when it is passed to the completion function.  The shell uses
206    this to help determine what kind of completing to do. */
207 char *rl_special_prefixes = (char *)NULL;
208
209 /* If non-zero, then disallow duplicates in the matches. */
210 int rl_ignore_completion_duplicates = 1;
211
212 /* Non-zero means that the results of the matches are to be treated
213    as filenames.  This is ALWAYS zero on entry, and can only be changed
214    within a completion entry finder function. */
215 int rl_filename_completion_desired = 0;
216
217 /* Non-zero means that the results of the matches are to be quoted using
218    double quotes (or an application-specific quoting mechanism) if the
219    filename contains any characters in rl_filename_quote_chars.  This is
220    ALWAYS non-zero on entry, and can only be changed within a completion
221    entry finder function. */
222 int rl_filename_quoting_desired = 1;
223
224 /* This function, if defined, is called by the completer when real
225    filename completion is done, after all the matching names have been
226    generated. It is passed a (char**) known as matches in the code below.
227    It consists of a NULL-terminated array of pointers to potential
228    matching strings.  The 1st element (matches[0]) is the maximal
229    substring that is common to all matches. This function can re-arrange
230    the list of matches as required, but all elements of the array must be
231    free()'d if they are deleted. The main intent of this function is
232    to implement FIGNORE a la SunOS csh. */
233 Function *rl_ignore_some_completions_function = (Function *)NULL;
234
235 /* Set to a function to quote a filename in an application-specific fashion.
236    Called with the text to quote, the type of match found (single or multiple)
237    and a pointer to the quoting character to be used, which the function can
238    reset if desired. */
239 CPFunction *rl_filename_quoting_function = rl_quote_filename;
240          
241 /* Function to call to remove quoting characters from a filename.  Called
242    before completion is attempted, so the embedded quotes do not interfere
243    with matching names in the file system.  Readline doesn't do anything
244    with this; it's set only by applications. */
245 CPFunction *rl_filename_dequoting_function = (CPFunction *)NULL;
246
247 /* Function to call to decide whether or not a word break character is
248    quoted.  If a character is quoted, it does not break words for the
249    completer. */
250 Function *rl_char_is_quoted_p = (Function *)NULL;
251
252 /* Character appended to completed words when at the end of the line.  The
253    default is a space. */
254 int rl_completion_append_character = ' ';
255
256 /* If non-zero, inhibit completion (temporarily). */
257 int rl_inhibit_completion;
258
259 /* Variables local to this file. */
260
261 /* Local variable states what happened during the last completion attempt. */
262 static int completion_changed_buffer;
263
264 /*************************************/
265 /*                                   */
266 /*    Bindable completion functions  */
267 /*                                   */
268 /*************************************/
269
270 /* Complete the word at or before point.  You have supplied the function
271    that does the initial simple matching selection algorithm (see
272    completion_matches ()).  The default is to do filename completion. */
273 int
274 rl_complete (ignore, invoking_key)
275      int ignore, invoking_key;
276 {
277   if (rl_inhibit_completion)
278     return (rl_insert (ignore, invoking_key));
279   else if (rl_last_func == rl_complete && !completion_changed_buffer)
280     return (rl_complete_internal ('?'));
281   else if (_rl_complete_show_all)
282     return (rl_complete_internal ('!'));
283   else
284     return (rl_complete_internal (TAB));
285 }
286
287 /* List the possible completions.  See description of rl_complete (). */
288 int
289 rl_possible_completions (ignore, invoking_key)
290      int ignore, invoking_key;
291 {
292   return (rl_complete_internal ('?'));
293 }
294
295 int
296 rl_insert_completions (ignore, invoking_key)
297      int ignore, invoking_key;
298 {
299   return (rl_complete_internal ('*'));
300 }
301
302 /************************************/
303 /*                                  */
304 /*    Completion utility functions  */
305 /*                                  */
306 /************************************/
307
308 /* Find the first occurrence in STRING1 of any character from STRING2.
309    Return a pointer to the character in STRING1. */
310 static char *
311 rl_strpbrk (string1, string2)
312      char *string1, *string2;
313 {
314   register char *scan;
315
316   for (; *string1; string1++)
317     {
318       for (scan = string2; *scan; scan++)
319         {
320           if (*string1 == *scan)
321             {
322               return (string1);
323             }
324         }
325     }
326   return ((char *)NULL);
327 }
328
329 /* The user must press "y" or "n". Non-zero return means "y" pressed. */
330 static int
331 get_y_or_n ()
332 {
333   int c;
334
335   for (;;)
336     {
337       c = rl_read_key ();
338       if (c == 'y' || c == 'Y' || c == ' ')
339         return (1);
340       if (c == 'n' || c == 'N' || c == RUBOUT)
341         return (0);
342       if (c == ABORT_CHAR)
343         _rl_abort_internal ();
344       ding ();
345     }
346 }
347
348 #if defined (VISIBLE_STATS)
349 /* Return the character which best describes FILENAME.
350      `@' for symbolic links
351      `/' for directories
352      `*' for executables
353      `=' for sockets
354      `|' for FIFOs
355      `%' for character special devices
356      `#' for block special devices */
357 static int
358 stat_char (filename)
359      char *filename;
360 {
361   struct stat finfo;
362   int character, r;
363
364 #if defined (HAVE_LSTAT) && defined (S_ISLNK)
365   r = lstat (filename, &finfo);
366 #else
367   r = stat (filename, &finfo);
368 #endif
369
370   if (r == -1)
371     return (0);
372
373   character = 0;
374   if (S_ISDIR (finfo.st_mode))
375     character = '/';
376 #if defined (S_ISCHR)
377   else if (S_ISCHR (finfo.st_mode))
378     character = '%';
379 #endif /* S_ISCHR */
380 #if defined (S_ISBLK)
381   else if (S_ISBLK (finfo.st_mode))
382     character = '#';
383 #endif /* S_ISBLK */
384 #if defined (S_ISLNK)
385   else if (S_ISLNK (finfo.st_mode))
386     character = '@';
387 #endif /* S_ISLNK */
388 #if defined (S_ISSOCK)
389   else if (S_ISSOCK (finfo.st_mode))
390     character = '=';
391 #endif /* S_ISSOCK */
392 #if defined (S_ISFIFO)
393   else if (S_ISFIFO (finfo.st_mode))
394     character = '|';
395 #endif
396   else if (S_ISREG (finfo.st_mode))
397     {
398       if (access (filename, X_OK) == 0)
399         character = '*';
400     }
401   return (character);
402 }
403 #endif /* VISIBLE_STATS */
404
405 /* Return the portion of PATHNAME that should be output when listing
406    possible completions.  If we are hacking filename completion, we
407    are only interested in the basename, the portion following the
408    final slash.  Otherwise, we return what we were passed. */
409 static char *
410 printable_part (pathname)
411       char *pathname;
412 {
413   char *temp;
414
415   temp = rl_filename_completion_desired ? strrchr (pathname, '/') : (char *)NULL;
416 #if defined (__MSDOS__)
417   if (rl_filename_completion_desired && temp == 0 && isalpha (pathname[0]) && pathname[1] == ':')
418     temp = pathname + 1;
419 #endif
420   return (temp ? ++temp : pathname);
421 }
422
423 /* Output TO_PRINT to rl_outstream.  If VISIBLE_STATS is defined and we
424    are using it, check for and output a single character for `special'
425    filenames.  Return the number of characters we output. */
426
427 #define PUTX(c) \
428     do { \
429       if (CTRL_CHAR (c)) \
430         { \
431           putc ('^', rl_outstream); \
432           putc (UNCTRL (c), rl_outstream); \
433           printed_len += 2; \
434         } \
435       else if (c == RUBOUT) \
436         { \
437           putc ('^', rl_outstream); \
438           putc ('?', rl_outstream); \
439           printed_len += 2; \
440         } \
441       else \
442         { \
443           putc (c, rl_outstream); \
444           printed_len++; \
445         } \
446     } while (0)
447
448 static int
449 print_filename (to_print, full_pathname)
450      char *to_print, *full_pathname;
451 {
452   int printed_len = 0;
453 #if !defined (VISIBLE_STATS)
454   char *s;
455
456   for (s = to_print; *s; s++)
457     {
458       PUTX (*s);
459     }
460 #else  
461   char *s, c, *new_full_pathname;
462   int extension_char, slen, tlen;
463
464   for (s = to_print; *s; s++)
465     {
466       PUTX (*s);
467     }
468
469  if (rl_filename_completion_desired && rl_visible_stats)
470     {
471       /* If to_print != full_pathname, to_print is the basename of the
472          path passed.  In this case, we try to expand the directory
473          name before checking for the stat character. */
474       if (to_print != full_pathname)
475         {
476           /* Terminate the directory name. */
477           c = to_print[-1];
478           to_print[-1] = '\0';
479
480           /* If setting the last slash in full_pathname to a NUL results in
481              full_pathname being the empty string, we are trying to complete
482              files in the root directory.  If we pass a null string to the
483              bash directory completion hook, for example, it will expand it
484              to the current directory.  We just want the `/'. */
485           s = tilde_expand (full_pathname && *full_pathname ? full_pathname : "/");
486           if (rl_directory_completion_hook)
487             (*rl_directory_completion_hook) (&s);
488
489           slen = strlen (s);
490           tlen = strlen (to_print);
491           new_full_pathname = xmalloc (slen + tlen + 2);
492           strcpy (new_full_pathname, s);
493           new_full_pathname[slen] = '/';
494           strcpy (new_full_pathname + slen + 1, to_print);
495
496           extension_char = stat_char (new_full_pathname);
497
498           free (new_full_pathname);
499           to_print[-1] = c;
500         }
501       else
502         {
503           s = tilde_expand (full_pathname);
504           extension_char = stat_char (s);
505         }
506
507       free (s);
508       if (extension_char)
509         {
510           putc (extension_char, rl_outstream);
511           printed_len++;
512         }
513     }
514 #endif /* VISIBLE_STATS */
515   return printed_len;
516 }
517
518 static char *
519 rl_quote_filename (s, rtype, qcp)
520      char *s;
521      int rtype;
522      char *qcp;
523 {
524   char *r;
525
526   r = xmalloc (strlen (s) + 2);
527   *r = *rl_completer_quote_characters;
528   strcpy (r + 1, s);
529   if (qcp)
530     *qcp = *rl_completer_quote_characters;
531   return r;
532 }
533
534 /* Find the bounds of the current word for completion purposes, and leave
535    rl_point set to the end of the word.  This function skips quoted
536    substrings (characters between matched pairs of characters in
537    rl_completer_quote_characters.  First we try to find an unclosed
538    quoted substring on which to do matching.  If one is not found, we use
539    the word break characters to find the boundaries of the current word.
540    We call an application-specific function to decide whether or not a
541    particular word break character is quoted; if that function returns a
542    non-zero result, the character does not break a word.  This function
543    returns the opening quote character if we found an unclosed quoted
544    substring, '\0' otherwise.  FP, if non-null, is set to a value saying
545    which (shell-like) quote characters we found (single quote, double
546    quote, or backslash) anywhere in the string.  DP, if non-null, is set to
547    the value of the delimiter character that caused a word break. */
548
549 static char
550 find_completion_word (fp, dp)
551      int *fp, *dp;
552 {
553   int scan, end, found_quote, delimiter, pass_next, isbrk;
554   char quote_char;
555
556   end = rl_point;
557   found_quote = delimiter = 0;
558   quote_char = '\0';
559
560   if (rl_completer_quote_characters)
561     {
562       /* We have a list of characters which can be used in pairs to
563          quote substrings for the completer.  Try to find the start
564          of an unclosed quoted substring. */
565       /* FOUND_QUOTE is set so we know what kind of quotes we found. */
566       for (scan = pass_next = 0; scan < end; scan++)
567         {
568           if (pass_next)
569             {
570               pass_next = 0;
571               continue;
572             }
573
574           if (rl_line_buffer[scan] == '\\')
575             {
576               pass_next = 1;
577               found_quote |= RL_QF_BACKSLASH;
578               continue;
579             }
580
581           if (quote_char != '\0')
582             {
583               /* Ignore everything until the matching close quote char. */
584               if (rl_line_buffer[scan] == quote_char)
585                 {
586                   /* Found matching close.  Abandon this substring. */
587                   quote_char = '\0';
588                   rl_point = end;
589                 }
590             }
591           else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan]))
592             {
593               /* Found start of a quoted substring. */
594               quote_char = rl_line_buffer[scan];
595               rl_point = scan + 1;
596               /* Shell-like quoting conventions. */
597               if (quote_char == '\'')
598                 found_quote |= RL_QF_SINGLE_QUOTE;
599               else if (quote_char == '"')
600                 found_quote |= RL_QF_DOUBLE_QUOTE;
601             }
602         }
603     }
604
605   if (rl_point == end && quote_char == '\0')
606     {
607       /* We didn't find an unclosed quoted substring upon which to do
608          completion, so use the word break characters to find the
609          substring on which to complete. */
610       while (--rl_point)
611         {
612           scan = rl_line_buffer[rl_point];
613
614           if (strchr (rl_completer_word_break_characters, scan) == 0)
615             continue;
616
617           /* Call the application-specific function to tell us whether
618              this word break character is quoted and should be skipped. */
619           if (rl_char_is_quoted_p && found_quote &&
620               (*rl_char_is_quoted_p) (rl_line_buffer, rl_point))
621             continue;
622
623           /* Convoluted code, but it avoids an n^2 algorithm with calls
624              to char_is_quoted. */
625           break;
626         }
627     }
628
629   /* If we are at an unquoted word break, then advance past it. */
630   scan = rl_line_buffer[rl_point];
631
632   /* If there is an application-specific function to say whether or not
633      a character is quoted and we found a quote character, let that
634      function decide whether or not a character is a word break, even
635      if it is found in rl_completer_word_break_characters.  Don't bother
636      if we're at the end of the line, though. */
637   if (scan)
638     {
639       if (rl_char_is_quoted_p)
640         isbrk = (found_quote == 0 ||
641                 (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) &&
642                 strchr (rl_completer_word_break_characters, scan) != 0;
643       else
644         isbrk = strchr (rl_completer_word_break_characters, scan) != 0;
645
646       if (isbrk)
647         {
648           /* If the character that caused the word break was a quoting
649              character, then remember it as the delimiter. */
650           if (rl_basic_quote_characters &&
651               strchr (rl_basic_quote_characters, scan) &&
652               (end - rl_point) > 1)
653             delimiter = scan;
654
655           /* If the character isn't needed to determine something special
656              about what kind of completion to perform, then advance past it. */
657           if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0)
658             rl_point++;
659         }
660     }
661
662   if (fp)
663     *fp = found_quote;
664   if (dp)
665     *dp = delimiter;
666
667   return (quote_char);
668 }
669
670 static char **
671 gen_completion_matches (text, start, end, our_func, found_quote, quote_char)
672      char *text;
673      int start, end;
674      Function *our_func;
675      int found_quote, quote_char;
676 {
677   char **matches, *temp;
678
679   /* If the user wants to TRY to complete, but then wants to give
680      up and use the default completion function, they set the
681      variable rl_attempted_completion_function. */
682   if (rl_attempted_completion_function)
683     {
684       matches = (*rl_attempted_completion_function) (text, start, end);
685
686       if (matches || rl_attempted_completion_over)
687         {
688           rl_attempted_completion_over = 0;
689           return (matches);
690         }
691     }
692
693   /* Beware -- we're stripping the quotes here.  Do this only if we know
694      we are doing filename completion and the application has defined a
695      filename dequoting function. */
696   temp = (char *)NULL;
697
698   if (found_quote && our_func == (Function *)filename_completion_function &&
699       rl_filename_dequoting_function)
700     {
701       /* delete single and double quotes */
702       temp = (*rl_filename_dequoting_function) (text, quote_char);
703       text = temp;      /* not freeing text is not a memory leak */
704     }
705
706   matches = completion_matches (text, (CPFunction *)our_func);
707   FREE (temp);
708   return matches;  
709 }
710
711 /* Filter out duplicates in MATCHES.  This frees up the strings in
712    MATCHES. */
713 static char **
714 remove_duplicate_matches (matches)
715      char **matches;
716 {
717   char *lowest_common;
718   int i, j, newlen;
719   char dead_slot;
720   char **temp_array;
721
722   /* Sort the items. */
723   for (i = 0; matches[i]; i++)
724     ;
725
726   /* Sort the array without matches[0], since we need it to
727      stay in place no matter what. */
728   if (i)
729     qsort (matches+1, i-1, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
730
731   /* Remember the lowest common denominator for it may be unique. */
732   lowest_common = savestring (matches[0]);
733
734   for (i = newlen = 0; matches[i + 1]; i++)
735     {
736       if (strcmp (matches[i], matches[i + 1]) == 0)
737         {
738           free (matches[i]);
739           matches[i] = (char *)&dead_slot;
740         }
741       else
742         newlen++;
743     }
744
745   /* We have marked all the dead slots with (char *)&dead_slot.
746      Copy all the non-dead entries into a new array. */
747   temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *));
748   for (i = j = 1; matches[i]; i++)
749     {
750       if (matches[i] != (char *)&dead_slot)
751         temp_array[j++] = matches[i];
752     }
753   temp_array[j] = (char *)NULL;
754
755   if (matches[0] != (char *)&dead_slot)
756     free (matches[0]);
757
758   /* Place the lowest common denominator back in [0]. */
759   temp_array[0] = lowest_common;
760
761   /* If there is one string left, and it is identical to the
762      lowest common denominator, then the LCD is the string to
763      insert. */
764   if (j == 2 && strcmp (temp_array[0], temp_array[1]) == 0)
765     {
766       free (temp_array[1]);
767       temp_array[1] = (char *)NULL;
768     }
769   return (temp_array);
770 }
771
772 /* Find the common prefix of the list of matches, and put it into
773    matches[0]. */
774 static int
775 compute_lcd_of_matches (match_list, matches, text)
776      char **match_list;
777      int matches;
778      char *text;
779 {
780   register int i, c1, c2, si;
781   int low;              /* Count of max-matched characters. */
782
783   /* If only one match, just use that.  Otherwise, compare each
784      member of the list with the next, finding out where they
785      stop matching. */
786   if (matches == 1)
787     {
788       match_list[0] = match_list[1];
789       match_list[1] = (char *)NULL;
790       return 1;
791     }
792
793   for (i = 1, low = 100000; i < matches; i++)
794     {
795       if (_rl_completion_case_fold)
796         {
797           for (si = 0;
798                (c1 = _rl_to_lower(match_list[i][si])) &&
799                (c2 = _rl_to_lower(match_list[i + 1][si]));
800                si++)
801             if (c1 != c2)
802               break;
803         }
804       else
805         {
806           for (si = 0;
807                (c1 = match_list[i][si]) &&
808                (c2 = match_list[i + 1][si]);
809                si++)
810             if (c1 != c2)
811               break;
812         }
813
814       if (low > si)
815         low = si;
816     }
817
818   /* If there were multiple matches, but none matched up to even the
819      first character, and the user typed something, use that as the
820      value of matches[0]. */
821   if (low == 0 && text && *text)
822     {
823       match_list[0] = xmalloc (strlen (text) + 1);
824       strcpy (match_list[0], text);
825     }
826   else
827     {
828       match_list[0] = xmalloc (low + 1);
829       strncpy (match_list[0], match_list[1], low);
830       match_list[0][low] = '\0';
831     }
832
833   return matches;
834 }
835
836 static int
837 postprocess_matches (matchesp, matching_filenames)
838      char ***matchesp;
839      int matching_filenames;
840 {
841   char *t, **matches, **temp_matches;
842   int nmatch, i;
843
844   matches = *matchesp;
845
846   /* It seems to me that in all the cases we handle we would like
847      to ignore duplicate possiblilities.  Scan for the text to
848      insert being identical to the other completions. */
849   if (rl_ignore_completion_duplicates)
850     {
851       temp_matches = remove_duplicate_matches (matches);
852       free (matches);
853       matches = temp_matches;
854     }
855
856   /* If we are matching filenames, then here is our chance to
857      do clever processing by re-examining the list.  Call the
858      ignore function with the array as a parameter.  It can
859      munge the array, deleting matches as it desires. */
860   if (rl_ignore_some_completions_function && matching_filenames)
861     {
862       for (nmatch = 1; matches[nmatch]; nmatch++)
863         ;
864       (void)(*rl_ignore_some_completions_function) (matches);
865       if (matches == 0 || matches[0] == 0)
866         {
867           FREE (matches);
868           *matchesp = (char **)0;
869           return 0;
870         }
871       else
872         {
873           /* If we removed some matches, recompute the common prefix. */
874           for (i = 1; matches[i]; i++)
875             ;
876           if (i > 1 && i < nmatch)
877             {
878               t = matches[0];
879               compute_lcd_of_matches (matches, i - 1, t);
880               FREE (t);
881             }
882         }
883     }
884
885   *matchesp = matches;
886   return (1);
887 }
888
889 /* A convenience function for displaying a list of strings in
890    columnar format on readline's output stream.  MATCHES is the list
891    of strings, in argv format, LEN is the number of strings in MATCHES,
892    and MAX is the length of the longest string in MATCHES. */
893 void
894 rl_display_match_list (matches, len, max)
895      char **matches;
896      int len, max;
897 {
898   int count, limit, printed_len;
899   int i, j, k, l;
900   char *temp;
901
902   /* How many items of MAX length can we fit in the screen window? */
903   max += 2;
904   limit = screenwidth / max;
905   if (limit != 1 && (limit * max == screenwidth))
906     limit--;
907
908   /* Avoid a possible floating exception.  If max > screenwidth,
909      limit will be 0 and a divide-by-zero fault will result. */
910   if (limit == 0)
911     limit = 1;
912
913   /* How many iterations of the printing loop? */
914   count = (len + (limit - 1)) / limit;
915
916   /* Watch out for special case.  If LEN is less than LIMIT, then
917      just do the inner printing loop.
918            0 < len <= limit  implies  count = 1. */
919
920   /* Sort the items if they are not already sorted. */
921   if (rl_ignore_completion_duplicates == 0)
922     qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
923
924   crlf ();
925
926   if (_rl_print_completions_horizontally == 0)
927     {
928       /* Print the sorted items, up-and-down alphabetically, like ls. */
929       for (i = 1; i <= count; i++)
930         {
931           for (j = 0, l = i; j < limit; j++)
932             {
933               if (l > len || matches[l] == 0)
934                 break;
935               else
936                 {
937                   temp = printable_part (matches[l]);
938                   printed_len = print_filename (temp, matches[l]);
939
940                   if (j + 1 < limit)
941                     for (k = 0; k < max - printed_len; k++)
942                       putc (' ', rl_outstream);
943                 }
944               l += count;
945             }
946           crlf ();
947         }
948     }
949   else
950     {
951       /* Print the sorted items, across alphabetically, like ls -x. */
952       for (i = 1; matches[i]; i++)
953         {
954           temp = printable_part (matches[i]);
955           printed_len = print_filename (temp, matches[i]);
956           /* Have we reached the end of this line? */
957           if (matches[i+1])
958             {
959               if (i && (limit > 1) && (i % limit) == 0)
960                 crlf ();
961               else
962                 for (k = 0; k < max - printed_len; k++)
963                   putc (' ', rl_outstream);
964             }
965         }
966       crlf ();
967     }
968 }
969
970 /* Display MATCHES, a list of matching filenames in argv format.  This
971    handles the simple case -- a single match -- first.  If there is more
972    than one match, we compute the number of strings in the list and the
973    length of the longest string, which will be needed by the display
974    function.  If the application wants to handle displaying the list of
975    matches itself, it sets RL_COMPLETION_DISPLAY_MATCHES_HOOK to the
976    address of a function, and we just call it.  If we're handling the
977    display ourselves, we just call rl_display_match_list.  We also check
978    that the list of matches doesn't exceed the user-settable threshold,
979    and ask the user if he wants to see the list if there are more matches
980    than RL_COMPLETION_QUERY_ITEMS. */
981 static void
982 display_matches (matches)
983      char **matches;
984 {
985   int len, max, i;
986   char *temp;
987
988   /* Move to the last visible line of a possibly-multiple-line command. */
989   _rl_move_vert (_rl_vis_botlin);
990
991   /* Handle simple case first.  What if there is only one answer? */
992   if (matches[1] == 0)
993     {
994       temp = printable_part (matches[0]);
995       crlf ();
996       print_filename (temp, matches[0]);
997       crlf ();
998
999       rl_forced_update_display ();
1000       rl_display_fixed = 1;
1001
1002       return;
1003     }
1004
1005   /* There is more than one answer.  Find out how many there are,
1006      and find the maximum printed length of a single entry. */
1007   for (max = 0, i = 1; matches[i]; i++)
1008     {
1009       temp = printable_part (matches[i]);
1010       len = strlen (temp);
1011
1012       if (len > max)
1013         max = len;
1014     }
1015
1016   len = i - 1;
1017
1018   /* If the caller has defined a display hook, then call that now. */
1019   if (rl_completion_display_matches_hook)
1020     {
1021       (*rl_completion_display_matches_hook) (matches, len, max);
1022       return;
1023     }
1024         
1025   /* If there are many items, then ask the user if she really wants to
1026      see them all. */
1027   if (len >= rl_completion_query_items)
1028     {
1029       crlf ();
1030       fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len);
1031       fflush (rl_outstream);
1032       if (get_y_or_n () == 0)
1033         {
1034           crlf ();
1035
1036           rl_forced_update_display ();
1037           rl_display_fixed = 1;
1038
1039           return;
1040         }
1041     }
1042
1043   rl_display_match_list (matches, len, max);
1044
1045   rl_forced_update_display ();
1046   rl_display_fixed = 1;
1047 }
1048
1049 static char *
1050 make_quoted_replacement (match, mtype, qc)
1051      char *match;
1052      int mtype;
1053      char *qc;  /* Pointer to quoting character, if any */
1054 {
1055   int should_quote, do_replace;
1056   char *replacement;
1057
1058   /* If we are doing completion on quoted substrings, and any matches
1059      contain any of the completer_word_break_characters, then auto-
1060      matically prepend the substring with a quote character (just pick
1061      the first one from the list of such) if it does not already begin
1062      with a quote string.  FIXME: Need to remove any such automatically
1063      inserted quote character when it no longer is necessary, such as
1064      if we change the string we are completing on and the new set of
1065      matches don't require a quoted substring. */
1066   replacement = match;
1067
1068   should_quote = match && rl_completer_quote_characters &&
1069                         rl_filename_completion_desired &&
1070                         rl_filename_quoting_desired;
1071
1072   if (should_quote)
1073     should_quote = should_quote && (!qc || !*qc ||
1074                      (rl_completer_quote_characters && strchr (rl_completer_quote_characters, *qc)));
1075
1076   if (should_quote)
1077     {
1078       /* If there is a single match, see if we need to quote it.
1079          This also checks whether the common prefix of several
1080          matches needs to be quoted. */
1081       should_quote = rl_filename_quote_characters
1082                         ? (rl_strpbrk (match, rl_filename_quote_characters) != 0)
1083                         : 0;
1084
1085       do_replace = should_quote ? mtype : NO_MATCH;
1086       /* Quote the replacement, since we found an embedded
1087          word break character in a potential match. */
1088       if (do_replace != NO_MATCH && rl_filename_quoting_function)
1089         replacement = (*rl_filename_quoting_function) (match, do_replace, qc);
1090     }
1091   return (replacement);
1092 }
1093
1094 static void
1095 insert_match (match, start, mtype, qc)
1096      char *match;
1097      int start, mtype;
1098      char *qc;
1099 {
1100   char *replacement;
1101   char oqc;
1102
1103   oqc = qc ? *qc : '\0';
1104   replacement = make_quoted_replacement (match, mtype, qc);
1105
1106   /* Now insert the match. */
1107   if (replacement)
1108     {
1109       /* Don't double an opening quote character. */
1110       if (qc && *qc && start && rl_line_buffer[start - 1] == *qc &&
1111             replacement[0] == *qc)
1112         start--;
1113       /* If make_quoted_replacement changed the quoting character, remove
1114          the opening quote and insert the (fully-quoted) replacement. */
1115       else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc &&
1116             replacement[0] != oqc)
1117         start--;
1118       _rl_replace_text (replacement, start, rl_point - 1);
1119       if (replacement != match)
1120         free (replacement);
1121     }
1122 }
1123
1124 /* Append any necessary closing quote and a separator character to the
1125    just-inserted match.  If the user has specified that directories
1126    should be marked by a trailing `/', append one of those instead.  The
1127    default trailing character is a space.  Returns the number of characters
1128    appended. */
1129 static int
1130 append_to_match (text, delimiter, quote_char)
1131      char *text;
1132      int delimiter, quote_char;
1133 {
1134   char temp_string[4], *filename;
1135   int temp_string_index;
1136   struct stat finfo;
1137
1138   temp_string_index = 0;
1139   if (quote_char && rl_point && rl_line_buffer[rl_point - 1] != quote_char)
1140     temp_string[temp_string_index++] = quote_char;
1141
1142   if (delimiter)
1143     temp_string[temp_string_index++] = delimiter;
1144   else if (rl_completion_append_character)
1145     temp_string[temp_string_index++] = rl_completion_append_character;
1146
1147   temp_string[temp_string_index++] = '\0';
1148
1149   if (rl_filename_completion_desired)
1150     {
1151       filename = tilde_expand (text);
1152       if (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode))
1153         {
1154           if (_rl_complete_mark_directories && rl_line_buffer[rl_point] != '/')
1155             rl_insert_text ("/");
1156         }
1157       else
1158         {
1159           if (rl_point == rl_end)
1160             rl_insert_text (temp_string);
1161         }
1162       free (filename);
1163     }
1164   else
1165     {
1166       if (rl_point == rl_end)
1167         rl_insert_text (temp_string);
1168     }
1169
1170   return (temp_string_index);
1171 }
1172
1173 static void
1174 insert_all_matches (matches, point, qc)
1175      char **matches;
1176      int point;
1177      char *qc;
1178 {
1179   int i;
1180   char *rp;
1181
1182   rl_begin_undo_group ();
1183   /* remove any opening quote character; make_quoted_replacement will add
1184      it back. */
1185   if (qc && *qc && point && rl_line_buffer[point - 1] == *qc)
1186     point--;
1187   rl_delete_text (point, rl_point);
1188   rl_point = point;
1189
1190   if (matches[1])
1191     {
1192       for (i = 1; matches[i]; i++)
1193         {
1194           rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc);
1195           rl_insert_text (rp);
1196           rl_insert_text (" ");
1197           if (rp != matches[i])
1198             free (rp);
1199         }
1200     }
1201   else
1202     {
1203       rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc);
1204       rl_insert_text (rp);
1205       rl_insert_text (" ");
1206       if (rp != matches[0])
1207         free (rp);
1208     }
1209   rl_end_undo_group ();
1210 }
1211
1212 static void
1213 free_match_list (matches)
1214      char **matches;
1215 {
1216   register int i;
1217
1218   for (i = 0; matches[i]; i++)
1219     free (matches[i]);
1220   free (matches);
1221 }
1222
1223 /* Complete the word at or before point.
1224    WHAT_TO_DO says what to do with the completion.
1225    `?' means list the possible completions.
1226    TAB means do standard completion.
1227    `*' means insert all of the possible completions.
1228    `!' means to do standard completion, and list all possible completions if
1229    there is more than one. */
1230 int
1231 rl_complete_internal (what_to_do)
1232      int what_to_do;
1233 {
1234   char **matches;
1235   Function *our_func;
1236   int start, end, delimiter, found_quote, i;
1237   char *text, *saved_line_buffer;
1238   char quote_char;
1239
1240   /* Only the completion entry function can change these. */
1241   rl_filename_completion_desired = 0;
1242   rl_filename_quoting_desired = 1;
1243   rl_completion_type = what_to_do;
1244
1245   saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL;
1246   our_func = rl_completion_entry_function
1247                 ? rl_completion_entry_function
1248                 : (Function *)filename_completion_function;
1249
1250   /* We now look backwards for the start of a filename/variable word. */
1251   end = rl_point;
1252   found_quote = delimiter = 0;
1253   quote_char = '\0';
1254
1255   if (rl_point)
1256     /* This (possibly) changes rl_point.  If it returns a non-zero char,
1257        we know we have an open quote. */
1258     quote_char = find_completion_word (&found_quote, &delimiter);
1259
1260   start = rl_point;
1261   rl_point = end;
1262
1263   text = rl_copy_text (start, end);
1264   matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char);
1265   free (text);
1266
1267   if (matches == 0)
1268     {
1269       ding ();
1270       FREE (saved_line_buffer);
1271       return (0);
1272     }
1273
1274 #if 0
1275   /* If we are matching filenames, our_func will have been set to
1276      filename_completion_function */
1277   i = our_func == (Function *)filename_completion_function;
1278 #else
1279   /* If we are matching filenames, the attempted completion function will
1280      have set rl_filename_completion_desired to a non-zero value.  The basic
1281      filename_completion_function does this. */
1282   i = rl_filename_completion_desired;
1283 #endif
1284
1285   if (postprocess_matches (&matches, i) == 0)
1286     {
1287       ding ();
1288       FREE (saved_line_buffer);
1289       completion_changed_buffer = 0;
1290       return (0);
1291     }
1292
1293   switch (what_to_do)
1294     {
1295     case TAB:
1296     case '!':
1297       /* Insert the first match with proper quoting. */
1298       if (*matches[0])
1299         insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
1300
1301       /* If there are more matches, ring the bell to indicate.
1302          If we are in vi mode, Posix.2 says to not ring the bell.
1303          If the `show-all-if-ambiguous' variable is set, display
1304          all the matches immediately.  Otherwise, if this was the
1305          only match, and we are hacking files, check the file to
1306          see if it was a directory.  If so, and the `mark-directories'
1307          variable is set, add a '/' to the name.  If not, and we
1308          are at the end of the line, then add a space.  */
1309       if (matches[1])
1310         {
1311           if (what_to_do == '!')
1312             {
1313               display_matches (matches);
1314               break;
1315             }
1316           else if (rl_editing_mode != vi_mode)
1317             ding ();    /* There are other matches remaining. */
1318         }
1319       else
1320         append_to_match (matches[0], delimiter, quote_char);
1321
1322       break;
1323
1324     case '*':
1325       insert_all_matches (matches, start, &quote_char);
1326       break;
1327
1328     case '?':
1329       display_matches (matches);
1330       break;
1331
1332     default:
1333       fprintf (stderr, "\r\nreadline: bad value %d for what_to_do in rl_complete\n", what_to_do);
1334       ding ();
1335       FREE (saved_line_buffer);
1336       return 1;
1337     }
1338
1339   free_match_list (matches);
1340
1341   /* Check to see if the line has changed through all of this manipulation. */
1342   if (saved_line_buffer)
1343     {
1344       completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0;
1345       free (saved_line_buffer);
1346     }
1347
1348   return 0;
1349 }
1350
1351 /***************************************************************/
1352 /*                                                             */
1353 /*  Application-callable completion match generator functions  */
1354 /*                                                             */
1355 /***************************************************************/
1356
1357 /* Return an array of (char *) which is a list of completions for TEXT.
1358    If there are no completions, return a NULL pointer.
1359    The first entry in the returned array is the substitution for TEXT.
1360    The remaining entries are the possible completions.
1361    The array is terminated with a NULL pointer.
1362
1363    ENTRY_FUNCTION is a function of two args, and returns a (char *).
1364      The first argument is TEXT.
1365      The second is a state argument; it should be zero on the first call, and
1366      non-zero on subsequent calls.  It returns a NULL pointer to the caller
1367      when there are no more matches.
1368  */
1369 char **
1370 completion_matches (text, entry_function)
1371      char *text;
1372      CPFunction *entry_function;
1373 {
1374   /* Number of slots in match_list. */
1375   int match_list_size;
1376
1377   /* The list of matches. */
1378   char **match_list;
1379
1380   /* Number of matches actually found. */
1381   int matches;
1382
1383   /* Temporary string binder. */
1384   char *string;
1385
1386   matches = 0;
1387   match_list_size = 10;
1388   match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *));
1389   match_list[1] = (char *)NULL;
1390
1391   while (string = (*entry_function) (text, matches))
1392     {
1393       if (matches + 1 == match_list_size)
1394         match_list = (char **)xrealloc
1395           (match_list, ((match_list_size += 10) + 1) * sizeof (char *));
1396
1397       match_list[++matches] = string;
1398       match_list[matches + 1] = (char *)NULL;
1399     }
1400
1401   /* If there were any matches, then look through them finding out the
1402      lowest common denominator.  That then becomes match_list[0]. */
1403   if (matches)
1404     compute_lcd_of_matches (match_list, matches, text);
1405   else                          /* There were no matches. */
1406     {
1407       free (match_list);
1408       match_list = (char **)NULL;
1409     }
1410   return (match_list);
1411 }
1412
1413 /* A completion function for usernames.
1414    TEXT contains a partial username preceded by a random
1415    character (usually `~').  */
1416 char *
1417 username_completion_function (text, state)
1418      char *text;
1419      int state;
1420 {
1421 #if defined (__WIN32__) || defined (__OPENNT)
1422   return (char *)NULL;
1423 #else /* !__WIN32__ && !__OPENNT) */
1424   static char *username = (char *)NULL;
1425   static struct passwd *entry;
1426   static int namelen, first_char, first_char_loc;
1427   char *value;
1428
1429   if (state == 0)
1430     {
1431       FREE (username);
1432
1433       first_char = *text;
1434       first_char_loc = first_char == '~';
1435
1436       username = savestring (&text[first_char_loc]);
1437       namelen = strlen (username);
1438       setpwent ();
1439     }
1440
1441   while (entry = getpwent ())
1442     {
1443       /* Null usernames should result in all users as possible completions. */
1444       if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
1445         break;
1446     }
1447
1448   if (entry == 0)
1449     {
1450       endpwent ();
1451       return ((char *)NULL);
1452     }
1453   else
1454     {
1455       value = xmalloc (2 + strlen (entry->pw_name));
1456
1457       *value = *text;
1458
1459       strcpy (value + first_char_loc, entry->pw_name);
1460
1461       if (first_char == '~')
1462         rl_filename_completion_desired = 1;
1463
1464       return (value);
1465     }
1466 #endif /* !__WIN32__ && !__OPENNT */
1467 }
1468
1469 /* Okay, now we write the entry_function for filename completion.  In the
1470    general case.  Note that completion in the shell is a little different
1471    because of all the pathnames that must be followed when looking up the
1472    completion for a command. */
1473 char *
1474 filename_completion_function (text, state)
1475      char *text;
1476      int state;
1477 {
1478   static DIR *directory = (DIR *)NULL;
1479   static char *filename = (char *)NULL;
1480   static char *dirname = (char *)NULL;
1481   static char *users_dirname = (char *)NULL;
1482   static int filename_len;
1483   char *temp;
1484   int dirlen;
1485   struct dirent *entry;
1486
1487   /* If we don't have any state, then do some initialization. */
1488   if (state == 0)
1489     {
1490       /* If we were interrupted before closing the directory or reading
1491          all of its contents, close it. */
1492       if (directory)
1493         {
1494           closedir (directory);
1495           directory = (DIR *)NULL;
1496         }
1497       FREE (dirname);
1498       FREE (filename);
1499       FREE (users_dirname);
1500
1501       filename = savestring (text);
1502       if (*text == 0)
1503         text = ".";
1504       dirname = savestring (text);
1505
1506       temp = strrchr (dirname, '/');
1507
1508 #if defined (__MSDOS__)
1509       /* special hack for //X/... */
1510       if (dirname[0] == '/' && dirname[1] == '/' && isalpha (dirname[2]) && dirname[3] == '/')
1511         temp = strrchr (dirname + 3, '/');
1512 #endif
1513
1514       if (temp)
1515         {
1516           strcpy (filename, ++temp);
1517           *temp = '\0';
1518         }
1519 #if defined (__MSDOS__)
1520       /* searches from current directory on the drive */
1521       else if (isalpha (dirname[0]) && dirname[1] == ':')
1522         {
1523           strcpy (filename, dirname + 2);
1524           dirname[2] = '\0';
1525         }
1526 #endif
1527       else
1528         {
1529           dirname[0] = '.';
1530           dirname[1] = '\0';
1531         }
1532
1533       /* We aren't done yet.  We also support the "~user" syntax. */
1534
1535       /* Save the version of the directory that the user typed. */
1536       users_dirname = savestring (dirname);
1537
1538       if (*dirname == '~')
1539         {
1540           temp = tilde_expand (dirname);
1541           free (dirname);
1542           dirname = temp;
1543         }
1544
1545       if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname))
1546         {
1547           free (users_dirname);
1548           users_dirname = savestring (dirname);
1549         }
1550
1551       directory = opendir (dirname);
1552       filename_len = strlen (filename);
1553
1554       rl_filename_completion_desired = 1;
1555     }
1556
1557   /* At this point we should entertain the possibility of hacking wildcarded
1558      filenames, like /usr/man/man<WILD>/te<TAB>.  If the directory name
1559      contains globbing characters, then build an array of directories, and
1560      then map over that list while completing. */
1561   /* *** UNIMPLEMENTED *** */
1562
1563   /* Now that we have some state, we can read the directory. */
1564
1565   entry = (struct dirent *)NULL;
1566   while (directory && (entry = readdir (directory)))
1567     {
1568       /* Special case for no filename.
1569          All entries except "." and ".." match. */
1570       if (filename_len == 0)
1571         {
1572           if (entry->d_name[0] != '.' ||
1573                (entry->d_name[1] &&
1574                  (entry->d_name[1] != '.' || entry->d_name[2])))
1575             break;
1576         }
1577       else
1578         {
1579           /* Otherwise, if these match up to the length of filename, then
1580              it is a match. */
1581           if (_rl_completion_case_fold)
1582             {
1583               if ((_rl_to_lower (entry->d_name[0]) == _rl_to_lower (filename[0])) &&
1584                   (((int)D_NAMLEN (entry)) >= filename_len) &&
1585                   (_rl_strnicmp (filename, entry->d_name, filename_len) == 0))
1586                 break;
1587             }
1588           else
1589             {
1590               if ((entry->d_name[0] == filename[0]) &&
1591                   (((int)D_NAMLEN (entry)) >= filename_len) &&
1592                   (strncmp (filename, entry->d_name, filename_len) == 0))
1593                 break;
1594             }
1595         }
1596     }
1597
1598   if (entry == 0)
1599     {
1600       if (directory)
1601         {
1602           closedir (directory);
1603           directory = (DIR *)NULL;
1604         }
1605       if (dirname)
1606         {
1607           free (dirname);
1608           dirname = (char *)NULL;
1609         }
1610       if (filename)
1611         {
1612           free (filename);
1613           filename = (char *)NULL;
1614         }
1615       if (users_dirname)
1616         {
1617           free (users_dirname);
1618           users_dirname = (char *)NULL;
1619         }
1620
1621       return (char *)NULL;
1622     }
1623   else
1624     {
1625       /* dirname && (strcmp (dirname, ".") != 0) */
1626       if (dirname && (dirname[0] != '.' || dirname[1]))
1627         {
1628           if (rl_complete_with_tilde_expansion && *users_dirname == '~')
1629             {
1630               dirlen = strlen (dirname);
1631               temp = xmalloc (2 + dirlen + D_NAMLEN (entry));
1632               strcpy (temp, dirname);
1633               /* Canonicalization cuts off any final slash present.  We
1634                  may need to add it back. */
1635               if (dirname[dirlen - 1] != '/')
1636                 {
1637                   temp[dirlen++] = '/';
1638                   temp[dirlen] = '\0';
1639                 }
1640             }
1641           else
1642             {
1643               dirlen = strlen (users_dirname);
1644               temp = xmalloc (1 + dirlen + D_NAMLEN (entry));
1645               strcpy (temp, users_dirname);
1646             }
1647
1648           strcpy (temp + dirlen, entry->d_name);
1649         }
1650       else
1651         temp = savestring (entry->d_name);
1652
1653       return (temp);
1654     }
1655 }
1656
1657 /* An initial implementation of a menu completion function a la tcsh.  The
1658    first time (if the last readline command was not rl_menu_complete), we
1659    generate the list of matches.  This code is very similar to the code in
1660    rl_complete_internal -- there should be a way to combine the two.  Then,
1661    for each item in the list of matches, we insert the match in an undoable
1662    fashion, with the appropriate character appended (this happens on the
1663    second and subsequent consecutive calls to rl_menu_complete).  When we
1664    hit the end of the match list, we restore the original unmatched text,
1665    ring the bell, and reset the counter to zero. */
1666 int
1667 rl_menu_complete (count, ignore)
1668      int count, ignore;
1669 {
1670   Function *our_func;
1671   int matching_filenames, found_quote;
1672
1673   static char *orig_text;
1674   static char **matches = (char **)0;
1675   static int match_list_index = 0;
1676   static int match_list_size = 0;
1677   static int orig_start, orig_end;
1678   static char quote_char;
1679   static int delimiter;
1680
1681   /* The first time through, we generate the list of matches and set things
1682      up to insert them. */
1683   if (rl_last_func != rl_menu_complete)
1684     {
1685       /* Clean up from previous call, if any. */
1686       FREE (orig_text);
1687       if (matches)
1688         free_match_list (matches);
1689
1690       match_list_index = match_list_size = 0;
1691       matches = (char **)NULL;
1692
1693       /* Only the completion entry function can change these. */
1694       rl_filename_completion_desired = 0;
1695       rl_filename_quoting_desired = 1;
1696       rl_completion_type = '%';
1697
1698       our_func = rl_completion_entry_function
1699                         ? rl_completion_entry_function
1700                         : (Function *)filename_completion_function;
1701
1702       /* We now look backwards for the start of a filename/variable word. */
1703       orig_end = rl_point;
1704       found_quote = delimiter = 0;
1705       quote_char = '\0';
1706
1707       if (rl_point)
1708         /* This (possibly) changes rl_point.  If it returns a non-zero char,
1709            we know we have an open quote. */
1710         quote_char = find_completion_word (&found_quote, &delimiter);
1711
1712       orig_start = rl_point;
1713       rl_point = orig_end;
1714
1715       orig_text = rl_copy_text (orig_start, orig_end);
1716       matches = gen_completion_matches (orig_text, orig_start, orig_end,
1717                                         our_func, found_quote, quote_char);
1718
1719 #if 0
1720       /* If we are matching filenames, our_func will have been set to
1721          filename_completion_function */
1722       matching_filenames = our_func == (Function *)filename_completion_function;
1723 #else
1724       /* If we are matching filenames, the attempted completion function will
1725          have set rl_filename_completion_desired to a non-zero value.  The basic
1726          filename_completion_function does this. */
1727       matching_filenames = rl_filename_completion_desired;
1728 #endif
1729       if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0)
1730         {
1731           ding ();
1732           FREE (matches);
1733           matches = (char **)0;
1734           FREE (orig_text);
1735           orig_text = (char *)0;
1736           completion_changed_buffer = 0;
1737           return (0);
1738         }
1739
1740       for (match_list_size = 0; matches[match_list_size]; match_list_size++)
1741         ;
1742       /* matches[0] is lcd if match_list_size > 1, but the circular buffer
1743          code below should take care of it. */
1744     }
1745
1746   /* Now we have the list of matches.  Replace the text between
1747      rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with
1748      matches[match_list_index], and add any necessary closing char. */
1749
1750   if (matches == 0 || match_list_size == 0) 
1751     {
1752       ding ();
1753       FREE (matches);
1754       matches = (char **)0;
1755       completion_changed_buffer = 0;
1756       return (0);
1757     }
1758
1759   match_list_index = (match_list_index + count) % match_list_size;
1760   if (match_list_index < 0)
1761     match_list_index += match_list_size;
1762
1763   if (match_list_index == 0 && match_list_size > 1)
1764     {
1765       ding ();
1766       insert_match (orig_text, orig_start, MULT_MATCH, &quote_char);
1767     }
1768   else
1769     {
1770       insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, &quote_char);
1771       append_to_match (matches[match_list_index], delimiter, quote_char);
1772     }
1773
1774   completion_changed_buffer = 1;
1775   return (0);
1776 }