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