Deleted Added
full compact
complete.c (47563) complete.c (58314)
1/* $FreeBSD: head/contrib/libreadline/complete.c 58314 2000-03-19 22:00:57Z ache $ */
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
2/* complete.c -- filename completion for readline. */
3
4/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
5
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
8
9 The GNU Readline Library is free software; you can redistribute it
10 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 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,
12 (at your option) any later version.
13
14 The GNU Readline Library is distributed in the hope that it will be
15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
16 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 The GNU General Public License is often shipped with GNU software, and
20 is generally kept in a file called COPYING or LICENSE. If you do not
21 have a copy of the license, write to the Free Software Foundation,
21 675 Mass Ave, Cambridge, MA 02139, USA. */
22 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>

--- 35 unchanged lines hidden (view full) ---

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"
23#define READLINE_LIBRARY
24
25#if defined (HAVE_CONFIG_H)
26# include <config.h>
27#endif
28
29#include <sys/types.h>
30#include <fcntl.h>

--- 35 unchanged lines hidden (view full) ---

66#include "posixdir.h"
67#include "posixstat.h"
68
69/* System-specific feature definitions and include files. */
70#include "rldefs.h"
71
72/* Some standard library routines. */
73#include "readline.h"
74#include "xmalloc.h"
75#include "rlprivate.h"
73
76
74extern char *tilde_expand ();
75extern char *rl_copy_text ();
76extern void _rl_abort_internal ();
77extern int _rl_qsort_string_compare ();
78extern void _rl_replace_text ();
77#ifdef __STDC__
78typedef int QSFUNC (const void *, const void *);
79#else
80typedef int QSFUNC ();
81#endif
79
82
80extern Function *rl_last_func;
81extern int rl_editing_mode;
82extern int screenwidth;
83
84extern void _rl_move_vert ();
85extern int _rl_vis_botlin;
86extern int rl_display_fixed;
87
88/* If non-zero, then this is the address of a function to call when
89 completing a word would normally display the list of possible matches.
90 This function is called instead of actually doing the display.
91 It takes three arguments: (char **matches, int num_matches, int max_length)
92 where MATCHES is the array of strings that matched, NUM_MATCHES is the
93 number of strings in that array, and MAX_LENGTH is the length of the
94 longest string in that array. */
95VFunction *rl_completion_display_matches_hook = (VFunction *)NULL;
96
97/* Forward declarations for functions defined and used in this file. */
83/* If non-zero, then this is the address of a function to call when
84 completing a word would normally display the list of possible matches.
85 This function is called instead of actually doing the display.
86 It takes three arguments: (char **matches, int num_matches, int max_length)
87 where MATCHES is the array of strings that matched, NUM_MATCHES is the
88 number of strings in that array, and MAX_LENGTH is the length of the
89 longest string in that array. */
90VFunction *rl_completion_display_matches_hook = (VFunction *)NULL;
91
92/* Forward declarations for functions defined and used in this file. */
98char *filename_completion_function ();
99char **completion_matches ();
93char *filename_completion_function __P((char *, int));
94char **completion_matches __P((char *, CPFunction *));
100
101#if defined (VISIBLE_STATS)
102# if !defined (X_OK)
103# define X_OK 1
104# endif
95
96#if defined (VISIBLE_STATS)
97# if !defined (X_OK)
98# define X_OK 1
99# endif
105static int stat_char ();
100static int stat_char __P((char *));
106#endif
107
101#endif
102
108static char *rl_quote_filename ();
109static char *rl_strpbrk ();
103static char *rl_quote_filename __P((char *, int, char *));
104static char *rl_strpbrk __P((char *, char *));
110
105
111static char **remove_duplicate_matches ();
112static void insert_match ();
113static int append_to_match ();
114static void insert_all_matches ();
115static void display_matches ();
116static int compute_lcd_of_matches ();
106static char **remove_duplicate_matches __P((char **));
107static void insert_match __P((char *, int, int, char *));
108static int append_to_match __P((char *, int, int));
109static void insert_all_matches __P((char **, int, char *));
110static void display_matches __P((char **));
111static int compute_lcd_of_matches __P((char **, int, char *));
117
112
118extern char *xmalloc (), *xrealloc ();
119
120/* **************************************************************** */
121/* */
122/* Completion matching, from readline's point of view. */
123/* */
124/* **************************************************************** */
125
126/* Variables known only to the readline library. */
127
128/* If non-zero, non-unique completions always show the list of matches. */
129int _rl_complete_show_all = 0;
130
131/* If non-zero, completed directory names have a slash appended. */
132int _rl_complete_mark_directories = 1;
133
134/* If non-zero, completions are printed horizontally in alphabetical order,
135 like `ls -x'. */
136int _rl_print_completions_horizontally;
137
138/* Non-zero means that case is not significant in filename completion. */
113/* **************************************************************** */
114/* */
115/* Completion matching, from readline's point of view. */
116/* */
117/* **************************************************************** */
118
119/* Variables known only to the readline library. */
120
121/* If non-zero, non-unique completions always show the list of matches. */
122int _rl_complete_show_all = 0;
123
124/* If non-zero, completed directory names have a slash appended. */
125int _rl_complete_mark_directories = 1;
126
127/* If non-zero, completions are printed horizontally in alphabetical order,
128 like `ls -x'. */
129int _rl_print_completions_horizontally;
130
131/* Non-zero means that case is not significant in filename completion. */
132#if defined (__MSDOS__) && !defined (__DJGPP__)
133int _rl_completion_case_fold = 1;
134#else
139int _rl_completion_case_fold;
135int _rl_completion_case_fold;
136#endif
140
141/* Global variables available to applications using readline. */
142
143#if defined (VISIBLE_STATS)
144/* Non-zero means add an additional character to each filename displayed
145 during listing completion iff rl_filename_completion_desired which helps
146 to indicate the type of file being listed. */
147int rl_visible_stats = 0;

--- 264 unchanged lines hidden (view full) ---

412 final slash. Otherwise, we return what we were passed. */
413static char *
414printable_part (pathname)
415 char *pathname;
416{
417 char *temp;
418
419 temp = rl_filename_completion_desired ? strrchr (pathname, '/') : (char *)NULL;
137
138/* Global variables available to applications using readline. */
139
140#if defined (VISIBLE_STATS)
141/* Non-zero means add an additional character to each filename displayed
142 during listing completion iff rl_filename_completion_desired which helps
143 to indicate the type of file being listed. */
144int rl_visible_stats = 0;

--- 264 unchanged lines hidden (view full) ---

409 final slash. Otherwise, we return what we were passed. */
410static char *
411printable_part (pathname)
412 char *pathname;
413{
414 char *temp;
415
416 temp = rl_filename_completion_desired ? strrchr (pathname, '/') : (char *)NULL;
417#if defined (__MSDOS__)
418 if (rl_filename_completion_desired && temp == 0 && isalpha (pathname[0]) && pathname[1] == ':')
419 temp = pathname + 1;
420#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) \

--- 44 unchanged lines hidden (view full) ---

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
421 return (temp ? ++temp : pathname);
422}
423
424/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and we
425 are using it, check for and output a single character for `special'
426 filenames. Return the number of characters we output. */
427
428#define PUTX(c) \

--- 44 unchanged lines hidden (view full) ---

473 path passed. In this case, we try to expand the directory
474 name before checking for the stat character. */
475 if (to_print != full_pathname)
476 {
477 /* Terminate the directory name. */
478 c = to_print[-1];
479 to_print[-1] = '\0';
480
480 s = tilde_expand (full_pathname);
481 /* If setting the last slash in full_pathname to a NUL results in
482 full_pathname being the empty string, we are trying to complete
483 files in the root directory. If we pass a null string to the
484 bash directory completion hook, for example, it will expand it
485 to the current directory. We just want the `/'. */
486 s = tilde_expand (full_pathname && *full_pathname ? full_pathname : "/");
481 if (rl_directory_completion_hook)
482 (*rl_directory_completion_hook) (&s);
483
484 slen = strlen (s);
485 tlen = strlen (to_print);
486 new_full_pathname = xmalloc (slen + tlen + 2);
487 strcpy (new_full_pathname, s);
488 new_full_pathname[slen] = '/';

--- 133 unchanged lines hidden (view full) ---

622 }
623
624 /* If we are at an unquoted word break, then advance past it. */
625 scan = rl_line_buffer[rl_point];
626
627 /* If there is an application-specific function to say whether or not
628 a character is quoted and we found a quote character, let that
629 function decide whether or not a character is a word break, even
487 if (rl_directory_completion_hook)
488 (*rl_directory_completion_hook) (&s);
489
490 slen = strlen (s);
491 tlen = strlen (to_print);
492 new_full_pathname = xmalloc (slen + tlen + 2);
493 strcpy (new_full_pathname, s);
494 new_full_pathname[slen] = '/';

--- 133 unchanged lines hidden (view full) ---

628 }
629
630 /* If we are at an unquoted word break, then advance past it. */
631 scan = rl_line_buffer[rl_point];
632
633 /* If there is an application-specific function to say whether or not
634 a character is quoted and we found a quote character, let that
635 function decide whether or not a character is a word break, even
630 if it is found in rl_completer_word_break_characters. */
631 if (rl_char_is_quoted_p)
632 isbrk = (found_quote == 0 ||
633 (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) &&
634 strchr (rl_completer_word_break_characters, scan) != 0;
635 else
636 isbrk = strchr (rl_completer_word_break_characters, scan) != 0;
637
638 if (isbrk)
636 if it is found in rl_completer_word_break_characters. Don't bother
637 if we're at the end of the line, though. */
638 if (scan)
639 {
639 {
640 /* If the character that caused the word break was a quoting
641 character, then remember it as the delimiter. */
642 if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, scan) && (end - rl_point) > 1)
643 delimiter = scan;
640 if (rl_char_is_quoted_p)
641 isbrk = (found_quote == 0 ||
642 (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) &&
643 strchr (rl_completer_word_break_characters, scan) != 0;
644 else
645 isbrk = strchr (rl_completer_word_break_characters, scan) != 0;
644
646
645 /* If the character isn't needed to determine something special
646 about what kind of completion to perform, then advance past it. */
647 if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0)
648 rl_point++;
647 if (isbrk)
648 {
649 /* If the character that caused the word break was a quoting
650 character, then remember it as the delimiter. */
651 if (rl_basic_quote_characters &&
652 strchr (rl_basic_quote_characters, scan) &&
653 (end - rl_point) > 1)
654 delimiter = scan;
655
656 /* If the character isn't needed to determine something special
657 about what kind of completion to perform, then advance past it. */
658 if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0)
659 rl_point++;
660 }
649 }
650
651 if (fp)
652 *fp = found_quote;
653 if (dp)
654 *dp = delimiter;
655
656 return (quote_char);

--- 53 unchanged lines hidden (view full) ---

710
711 /* Sort the items. */
712 for (i = 0; matches[i]; i++)
713 ;
714
715 /* Sort the array without matches[0], since we need it to
716 stay in place no matter what. */
717 if (i)
661 }
662
663 if (fp)
664 *fp = found_quote;
665 if (dp)
666 *dp = delimiter;
667
668 return (quote_char);

--- 53 unchanged lines hidden (view full) ---

722
723 /* Sort the items. */
724 for (i = 0; matches[i]; i++)
725 ;
726
727 /* Sort the array without matches[0], since we need it to
728 stay in place no matter what. */
729 if (i)
718 qsort (matches+1, i-1, sizeof (char *), _rl_qsort_string_compare);
730 qsort (matches+1, i-1, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
719
720 /* Remember the lowest common denominator for it may be unique. */
721 lowest_common = savestring (matches[0]);
722
723 for (i = newlen = 0; matches[i + 1]; i++)
724 {
725 if (strcmp (matches[i], matches[i + 1]) == 0)
726 {

--- 176 unchanged lines hidden (view full) ---

903 count = (len + (limit - 1)) / limit;
904
905 /* Watch out for special case. If LEN is less than LIMIT, then
906 just do the inner printing loop.
907 0 < len <= limit implies count = 1. */
908
909 /* Sort the items if they are not already sorted. */
910 if (rl_ignore_completion_duplicates == 0)
731
732 /* Remember the lowest common denominator for it may be unique. */
733 lowest_common = savestring (matches[0]);
734
735 for (i = newlen = 0; matches[i + 1]; i++)
736 {
737 if (strcmp (matches[i], matches[i + 1]) == 0)
738 {

--- 176 unchanged lines hidden (view full) ---

915 count = (len + (limit - 1)) / limit;
916
917 /* Watch out for special case. If LEN is less than LIMIT, then
918 just do the inner printing loop.
919 0 < len <= limit implies count = 1. */
920
921 /* Sort the items if they are not already sorted. */
922 if (rl_ignore_completion_duplicates == 0)
911 qsort (matches + 1, len, sizeof (char *), _rl_qsort_string_compare);
923 qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
912
913 crlf ();
914
915 if (_rl_print_completions_horizontally == 0)
916 {
917 /* Print the sorted items, up-and-down alphabetically, like ls. */
918 for (i = 1; i <= count; i++)
919 {

--- 482 unchanged lines hidden (view full) ---

1402/* A completion function for usernames.
1403 TEXT contains a partial username preceded by a random
1404 character (usually `~'). */
1405char *
1406username_completion_function (text, state)
1407 char *text;
1408 int state;
1409{
924
925 crlf ();
926
927 if (_rl_print_completions_horizontally == 0)
928 {
929 /* Print the sorted items, up-and-down alphabetically, like ls. */
930 for (i = 1; i <= count; i++)
931 {

--- 482 unchanged lines hidden (view full) ---

1414/* A completion function for usernames.
1415 TEXT contains a partial username preceded by a random
1416 character (usually `~'). */
1417char *
1418username_completion_function (text, state)
1419 char *text;
1420 int state;
1421{
1410#if defined (__GO32__) || defined (__WIN32__) || defined (__OPENNT)
1422#if defined (__WIN32__) || defined (__OPENNT)
1411 return (char *)NULL;
1423 return (char *)NULL;
1412#else /* !__GO32__ */
1424#else /* !__WIN32__ && !__OPENNT) */
1413 static char *username = (char *)NULL;
1414 static struct passwd *entry;
1415 static int namelen, first_char, first_char_loc;
1416 char *value;
1417
1418 if (state == 0)
1419 {
1420 FREE (username);

--- 26 unchanged lines hidden (view full) ---

1447
1448 strcpy (value + first_char_loc, entry->pw_name);
1449
1450 if (first_char == '~')
1451 rl_filename_completion_desired = 1;
1452
1453 return (value);
1454 }
1425 static char *username = (char *)NULL;
1426 static struct passwd *entry;
1427 static int namelen, first_char, first_char_loc;
1428 char *value;
1429
1430 if (state == 0)
1431 {
1432 FREE (username);

--- 26 unchanged lines hidden (view full) ---

1459
1460 strcpy (value + first_char_loc, entry->pw_name);
1461
1462 if (first_char == '~')
1463 rl_filename_completion_desired = 1;
1464
1465 return (value);
1466 }
1455#endif /* !__GO32__ */
1467#endif /* !__WIN32__ && !__OPENNT */
1456}
1457
1458/* Okay, now we write the entry_function for filename completion. In the
1459 general case. Note that completion in the shell is a little different
1460 because of all the pathnames that must be followed when looking up the
1461 completion for a command. */
1462char *
1463filename_completion_function (text, state)

--- 25 unchanged lines hidden (view full) ---

1489
1490 filename = savestring (text);
1491 if (*text == 0)
1492 text = ".";
1493 dirname = savestring (text);
1494
1495 temp = strrchr (dirname, '/');
1496
1468}
1469
1470/* Okay, now we write the entry_function for filename completion. In the
1471 general case. Note that completion in the shell is a little different
1472 because of all the pathnames that must be followed when looking up the
1473 completion for a command. */
1474char *
1475filename_completion_function (text, state)

--- 25 unchanged lines hidden (view full) ---

1501
1502 filename = savestring (text);
1503 if (*text == 0)
1504 text = ".";
1505 dirname = savestring (text);
1506
1507 temp = strrchr (dirname, '/');
1508
1509#if defined (__MSDOS__)
1510 /* special hack for //X/... */
1511 if (dirname[0] == '/' && dirname[1] == '/' && isalpha (dirname[2]) && dirname[3] == '/')
1512 temp = strrchr (dirname + 3, '/');
1513#endif
1514
1497 if (temp)
1498 {
1499 strcpy (filename, ++temp);
1500 *temp = '\0';
1501 }
1515 if (temp)
1516 {
1517 strcpy (filename, ++temp);
1518 *temp = '\0';
1519 }
1520#if defined (__MSDOS__)
1521 /* searches from current directory on the drive */
1522 else if (isalpha (dirname[0]) && dirname[1] == ':')
1523 {
1524 strcpy (filename, dirname + 2);
1525 dirname[2] = '\0';
1526 }
1527#endif
1502 else
1503 {
1504 dirname[0] = '.';
1505 dirname[1] = '\0';
1506 }
1507
1508 /* We aren't done yet. We also support the "~user" syntax. */
1509

--- 145 unchanged lines hidden (view full) ---

1655
1656 /* The first time through, we generate the list of matches and set things
1657 up to insert them. */
1658 if (rl_last_func != rl_menu_complete)
1659 {
1660 /* Clean up from previous call, if any. */
1661 FREE (orig_text);
1662 if (matches)
1528 else
1529 {
1530 dirname[0] = '.';
1531 dirname[1] = '\0';
1532 }
1533
1534 /* We aren't done yet. We also support the "~user" syntax. */
1535

--- 145 unchanged lines hidden (view full) ---

1681
1682 /* The first time through, we generate the list of matches and set things
1683 up to insert them. */
1684 if (rl_last_func != rl_menu_complete)
1685 {
1686 /* Clean up from previous call, if any. */
1687 FREE (orig_text);
1688 if (matches)
1663 {
1664 for (match_list_index = 0; matches[match_list_index]; match_list_index++)
1665 free (matches[match_list_index]);
1666 free (matches);
1667 }
1689 free_match_list (matches);
1668
1669 match_list_index = match_list_size = 0;
1670 matches = (char **)NULL;
1671
1672 /* Only the completion entry function can change these. */
1673 rl_filename_completion_desired = 0;
1674 rl_filename_quoting_desired = 1;
1675 rl_completion_type = '%';

--- 80 unchanged lines hidden ---
1690
1691 match_list_index = match_list_size = 0;
1692 matches = (char **)NULL;
1693
1694 /* Only the completion entry function can change these. */
1695 rl_filename_completion_desired = 0;
1696 rl_filename_quoting_desired = 1;
1697 rl_completion_type = '%';

--- 80 unchanged lines hidden ---