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