version 1.1.1.1, 2014/07/30 08:16:45
|
version 1.1.1.2, 2021/03/17 01:01:01
|
Line 1
|
Line 1
|
/* complete.c -- filename completion for readline. */ |
/* complete.c -- filename completion for readline. */ |
|
|
/* Copyright (C) 1987-2012 Free Software Foundation, Inc. | /* Copyright (C) 1987-2020 Free Software Foundation, Inc. |
|
|
This file is part of the GNU Readline Library (Readline), a library |
This file is part of the GNU Readline Library (Readline), a library |
for reading lines of text with interactive input and history editing. |
for reading lines of text with interactive input and history editing. |
Line 21
|
Line 21
|
|
|
#define READLINE_LIBRARY |
#define READLINE_LIBRARY |
|
|
|
#if defined (__TANDEM) |
|
# define _XOPEN_SOURCE_EXTENDED 1 |
|
#endif |
|
|
#if defined (HAVE_CONFIG_H) |
#if defined (HAVE_CONFIG_H) |
# include <config.h> |
# include <config.h> |
#endif |
#endif |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
#if defined (__TANDEM) |
|
# include <sys/stat.h> |
|
#endif |
#include <fcntl.h> |
#include <fcntl.h> |
#if defined (HAVE_SYS_FILE_H) |
#if defined (HAVE_SYS_FILE_H) |
# include <sys/file.h> |
# include <sys/file.h> |
Line 111 static int stat_char PARAMS((char *));
|
Line 118 static int stat_char PARAMS((char *));
|
#endif |
#endif |
|
|
#if defined (COLOR_SUPPORT) |
#if defined (COLOR_SUPPORT) |
static int colored_stat_start PARAMS((char *)); | static int colored_stat_start PARAMS((const char *)); |
static void colored_stat_end PARAMS((void)); |
static void colored_stat_end PARAMS((void)); |
|
static int colored_prefix_start PARAMS((void)); |
|
static void colored_prefix_end PARAMS((void)); |
#endif |
#endif |
|
|
static int path_isdir PARAMS((const char *)); |
static int path_isdir PARAMS((const char *)); |
Line 126 static int get_y_or_n PARAMS((int));
|
Line 135 static int get_y_or_n PARAMS((int));
|
static int _rl_internal_pager PARAMS((int)); |
static int _rl_internal_pager PARAMS((int)); |
static char *printable_part PARAMS((char *)); |
static char *printable_part PARAMS((char *)); |
static int fnwidth PARAMS((const char *)); |
static int fnwidth PARAMS((const char *)); |
static int fnprint PARAMS((const char *, int)); | static int fnprint PARAMS((const char *, int, const char *)); |
static int print_filename PARAMS((char *, char *, int)); |
static int print_filename PARAMS((char *, char *, int)); |
|
|
static char **gen_completion_matches PARAMS((char *, int, int, rl_compentry_func_t *, int, int)); |
static char **gen_completion_matches PARAMS((char *, int, int, rl_compentry_func_t *, int, int)); |
Line 139 static int complete_fncmp PARAMS((const char *, int, c
|
Line 148 static int complete_fncmp PARAMS((const char *, int, c
|
static void display_matches PARAMS((char **)); |
static void display_matches PARAMS((char **)); |
static int compute_lcd_of_matches PARAMS((char **, int, const char *)); |
static int compute_lcd_of_matches PARAMS((char **, int, const char *)); |
static int postprocess_matches PARAMS((char ***, int)); |
static int postprocess_matches PARAMS((char ***, int)); |
|
static int compare_match PARAMS((char *, const char *)); |
static int complete_get_screenwidth PARAMS((void)); |
static int complete_get_screenwidth PARAMS((void)); |
|
|
static char *make_quoted_replacement PARAMS((char *, int, char *)); |
static char *make_quoted_replacement PARAMS((char *, int, char *)); |
Line 172 int _rl_complete_mark_symlink_dirs = 0;
|
Line 182 int _rl_complete_mark_symlink_dirs = 0;
|
int _rl_print_completions_horizontally; |
int _rl_print_completions_horizontally; |
|
|
/* Non-zero means that case is not significant in filename completion. */ |
/* Non-zero means that case is not significant in filename completion. */ |
#if defined (__MSDOS__) && !defined (__DJGPP__) | #if (defined (__MSDOS__) && !defined (__DJGPP__)) || (defined (_WIN32) && !defined (__CYGWIN__)) |
int _rl_completion_case_fold = 1; |
int _rl_completion_case_fold = 1; |
#else |
#else |
int _rl_completion_case_fold = 0; |
int _rl_completion_case_fold = 0; |
Line 196 int _rl_completion_prefix_display_length = 0;
|
Line 206 int _rl_completion_prefix_display_length = 0;
|
matches. If < 0 or > _rl_screenwidth, it is ignored. */ |
matches. If < 0 or > _rl_screenwidth, it is ignored. */ |
int _rl_completion_columns = -1; |
int _rl_completion_columns = -1; |
|
|
/* Global variables available to applications using readline. */ |
|
|
|
#if defined (VISIBLE_STATS) |
|
/* Non-zero means add an additional character to each filename displayed |
|
during listing completion iff rl_filename_completion_desired which helps |
|
to indicate the type of file being listed. */ |
|
int rl_visible_stats = 0; |
|
#endif /* VISIBLE_STATS */ |
|
|
|
#if defined (COLOR_SUPPORT) |
#if defined (COLOR_SUPPORT) |
/* Non-zero means to use colors to indicate file type when listing possible |
/* Non-zero means to use colors to indicate file type when listing possible |
completions. The colors used are taken from $LS_COLORS, if set. */ |
completions. The colors used are taken from $LS_COLORS, if set. */ |
int _rl_colored_stats = 0; |
int _rl_colored_stats = 0; |
|
|
|
/* Non-zero means to use a color (currently magenta) to indicate the common |
|
prefix of a set of possible word completions. */ |
|
int _rl_colored_completion_prefix = 0; |
#endif |
#endif |
|
|
/* If non-zero, when completing in the middle of a word, don't insert |
/* If non-zero, when completing in the middle of a word, don't insert |
Line 221 int _rl_skip_completed_text = 0;
|
Line 226 int _rl_skip_completed_text = 0;
|
cycle of possible completions instead of the last. */ |
cycle of possible completions instead of the last. */ |
int _rl_menu_complete_prefix_first = 0; |
int _rl_menu_complete_prefix_first = 0; |
|
|
|
/* Global variables available to applications using readline. */ |
|
|
|
#if defined (VISIBLE_STATS) |
|
/* Non-zero means add an additional character to each filename displayed |
|
during listing completion iff rl_filename_completion_desired which helps |
|
to indicate the type of file being listed. */ |
|
int rl_visible_stats = 0; |
|
#endif /* VISIBLE_STATS */ |
|
|
/* If non-zero, then this is the address of a function to call when |
/* If non-zero, then this is the address of a function to call when |
completing on a directory name. The function is called with |
completing on a directory name. The function is called with |
the address of a string (the current directory name) as an arg. */ |
the address of a string (the current directory name) as an arg. */ |
Line 400 int rl_sort_completion_matches = 1;
|
Line 414 int rl_sort_completion_matches = 1;
|
|
|
/* Local variable states what happened during the last completion attempt. */ |
/* Local variable states what happened during the last completion attempt. */ |
static int completion_changed_buffer; |
static int completion_changed_buffer; |
|
static int last_completion_failed = 0; |
|
|
/* The result of the query to the user about displaying completion matches */ |
/* The result of the query to the user about displaying completion matches */ |
static int completion_y_or_n; |
static int completion_y_or_n; |
|
|
|
static int _rl_complete_display_matches_interrupt = 0; |
|
|
/*************************************/ |
/*************************************/ |
/* */ |
/* */ |
/* Bindable completion functions */ |
/* Bindable completion functions */ |
Line 414 static int completion_y_or_n;
|
Line 431 static int completion_y_or_n;
|
that does the initial simple matching selection algorithm (see |
that does the initial simple matching selection algorithm (see |
rl_completion_matches ()). The default is to do filename completion. */ |
rl_completion_matches ()). The default is to do filename completion. */ |
int |
int |
rl_complete (ignore, invoking_key) | rl_complete (int ignore, int invoking_key) |
int ignore, invoking_key; | |
{ |
{ |
rl_completion_invoking_key = invoking_key; |
rl_completion_invoking_key = invoking_key; |
|
|
if (rl_inhibit_completion) |
if (rl_inhibit_completion) |
return (_rl_insert_char (ignore, invoking_key)); |
return (_rl_insert_char (ignore, invoking_key)); |
else if (rl_last_func == rl_complete && !completion_changed_buffer) | #if 0 |
| else if (rl_last_func == rl_complete && completion_changed_buffer == 0 && last_completion_failed == 0) |
| #else |
| else if (rl_last_func == rl_complete && completion_changed_buffer == 0) |
| #endif |
return (rl_complete_internal ('?')); |
return (rl_complete_internal ('?')); |
else if (_rl_complete_show_all) |
else if (_rl_complete_show_all) |
return (rl_complete_internal ('!')); |
return (rl_complete_internal ('!')); |
Line 433 rl_complete (ignore, invoking_key)
|
Line 453 rl_complete (ignore, invoking_key)
|
|
|
/* List the possible completions. See description of rl_complete (). */ |
/* List the possible completions. See description of rl_complete (). */ |
int |
int |
rl_possible_completions (ignore, invoking_key) | rl_possible_completions (int ignore, int invoking_key) |
int ignore, invoking_key; | |
{ |
{ |
rl_completion_invoking_key = invoking_key; |
rl_completion_invoking_key = invoking_key; |
return (rl_complete_internal ('?')); |
return (rl_complete_internal ('?')); |
} |
} |
|
|
int |
int |
rl_insert_completions (ignore, invoking_key) | rl_insert_completions (int ignore, int invoking_key) |
int ignore, invoking_key; | |
{ |
{ |
rl_completion_invoking_key = invoking_key; |
rl_completion_invoking_key = invoking_key; |
return (rl_complete_internal ('*')); |
return (rl_complete_internal ('*')); |
Line 454 rl_insert_completions (ignore, invoking_key)
|
Line 472 rl_insert_completions (ignore, invoking_key)
|
an application-specific completion function to honor the |
an application-specific completion function to honor the |
show-all-if-ambiguous readline variable. */ |
show-all-if-ambiguous readline variable. */ |
int |
int |
rl_completion_mode (cfunc) | rl_completion_mode (rl_command_func_t *cfunc) |
rl_command_func_t *cfunc; | |
{ |
{ |
if (rl_last_func == cfunc && !completion_changed_buffer) |
if (rl_last_func == cfunc && !completion_changed_buffer) |
return '?'; |
return '?'; |
Line 473 rl_completion_mode (cfunc)
|
Line 490 rl_completion_mode (cfunc)
|
/* */ |
/* */ |
/************************************/ |
/************************************/ |
|
|
/* Reset readline state on a signal or other event. */ | /* Reset public readline state on a signal or other event. */ |
void |
void |
_rl_reset_completion_state () | _rl_reset_completion_state (void) |
{ |
{ |
rl_completion_found_quote = 0; |
rl_completion_found_quote = 0; |
rl_completion_quote_character = 0; |
rl_completion_quote_character = 0; |
} |
} |
|
|
static void |
static void |
_rl_complete_sigcleanup (sig, ptr) | _rl_complete_sigcleanup (int sig, void *ptr) |
int sig; | |
void *ptr; | |
{ |
{ |
if (sig == SIGINT) /* XXX - for now */ |
if (sig == SIGINT) /* XXX - for now */ |
_rl_free_match_list ((char **)ptr); | { |
| _rl_free_match_list ((char **)ptr); |
| _rl_complete_display_matches_interrupt = 1; |
| } |
} |
} |
|
|
/* Set default values for readline word completion. These are the variables |
/* Set default values for readline word completion. These are the variables |
that application completion functions can change or inspect. */ |
that application completion functions can change or inspect. */ |
static void |
static void |
set_completion_defaults (what_to_do) | set_completion_defaults (int what_to_do) |
int what_to_do; | |
{ |
{ |
/* Only the completion entry function can change these. */ |
/* Only the completion entry function can change these. */ |
rl_filename_completion_desired = 0; |
rl_filename_completion_desired = 0; |
Line 505 set_completion_defaults (what_to_do)
|
Line 522 set_completion_defaults (what_to_do)
|
|
|
/* The completion entry function may optionally change this. */ |
/* The completion entry function may optionally change this. */ |
rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs; |
rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs; |
|
|
|
/* Reset private state. */ |
|
_rl_complete_display_matches_interrupt = 0; |
} |
} |
|
|
/* The user must press "y" or "n". Non-zero return means "y" pressed. */ |
/* The user must press "y" or "n". Non-zero return means "y" pressed. */ |
static int |
static int |
get_y_or_n (for_pager) | get_y_or_n (int for_pager) |
int for_pager; | |
{ |
{ |
int c; |
int c; |
|
|
Line 543 get_y_or_n (for_pager)
|
Line 562 get_y_or_n (for_pager)
|
} |
} |
|
|
static int |
static int |
_rl_internal_pager (lines) | _rl_internal_pager (int lines) |
int lines; | |
{ |
{ |
int i; |
int i; |
|
|
Line 561 _rl_internal_pager (lines)
|
Line 579 _rl_internal_pager (lines)
|
} |
} |
|
|
static int |
static int |
path_isdir (filename) | path_isdir (const char *filename) |
const char *filename; | |
{ |
{ |
struct stat finfo; |
struct stat finfo; |
|
|
Line 579 path_isdir (filename)
|
Line 596 path_isdir (filename)
|
`%' for character special devices |
`%' for character special devices |
`#' for block special devices */ |
`#' for block special devices */ |
static int |
static int |
stat_char (filename) | stat_char (char *filename) |
char *filename; | |
{ |
{ |
struct stat finfo; |
struct stat finfo; |
int character, r; |
int character, r; |
Line 611 stat_char (filename)
|
Line 627 stat_char (filename)
|
#endif |
#endif |
|
|
if (r == -1) |
if (r == -1) |
return (0); | { |
| xfree (f); |
| return (0); |
| } |
|
|
character = 0; |
character = 0; |
if (S_ISDIR (finfo.st_mode)) |
if (S_ISDIR (finfo.st_mode)) |
Line 638 stat_char (filename)
|
Line 657 stat_char (filename)
|
#endif |
#endif |
else if (S_ISREG (finfo.st_mode)) |
else if (S_ISREG (finfo.st_mode)) |
{ |
{ |
|
#if defined (_WIN32) && !defined (__CYGWIN__) |
|
char *ext; |
|
|
|
/* Windows doesn't do access and X_OK; check file extension instead */ |
|
ext = strrchr (fn, '.'); |
|
if (ext && (_rl_stricmp (ext, ".exe") == 0 || |
|
_rl_stricmp (ext, ".cmd") == 0 || |
|
_rl_stricmp (ext, ".bat") == 0 || |
|
_rl_stricmp (ext, ".com") == 0)) |
|
character = '*'; |
|
#else |
if (access (filename, X_OK) == 0) |
if (access (filename, X_OK) == 0) |
character = '*'; |
character = '*'; |
|
#endif |
} |
} |
|
|
free (f); | xfree (f); |
return (character); |
return (character); |
} |
} |
#endif /* VISIBLE_STATS */ |
#endif /* VISIBLE_STATS */ |
|
|
#if defined (COLOR_SUPPORT) |
#if defined (COLOR_SUPPORT) |
static int |
static int |
colored_stat_start (filename) | colored_stat_start (const char *filename) |
char *filename; | |
{ |
{ |
_rl_set_normal_color (); |
_rl_set_normal_color (); |
return (_rl_print_color_indicator (filename)); |
return (_rl_print_color_indicator (filename)); |
} |
} |
|
|
static void |
static void |
colored_stat_end () | colored_stat_end (void) |
{ |
{ |
_rl_prep_non_filename_text (); |
_rl_prep_non_filename_text (); |
_rl_put_indicator (&_rl_color_indicator[C_CLR_TO_EOL]); |
_rl_put_indicator (&_rl_color_indicator[C_CLR_TO_EOL]); |
} |
} |
|
|
|
static int |
|
colored_prefix_start (void) |
|
{ |
|
_rl_set_normal_color (); |
|
return (_rl_print_prefix_color ()); |
|
} |
|
|
|
static void |
|
colored_prefix_end (void) |
|
{ |
|
colored_stat_end (); /* for now */ |
|
} |
#endif |
#endif |
|
|
/* Return the portion of PATHNAME that should be output when listing |
/* Return the portion of PATHNAME that should be output when listing |
Line 673 colored_stat_end ()
|
Line 716 colored_stat_end ()
|
for the previous slash and return the portion following that. If |
for the previous slash and return the portion following that. If |
there's no previous slash, we just return what we were passed. */ |
there's no previous slash, we just return what we were passed. */ |
static char * |
static char * |
printable_part (pathname) | printable_part (char *pathname) |
char *pathname; | |
{ |
{ |
char *temp, *x; |
char *temp, *x; |
|
|
Line 682 printable_part (pathname)
|
Line 724 printable_part (pathname)
|
return (pathname); |
return (pathname); |
|
|
temp = strrchr (pathname, '/'); |
temp = strrchr (pathname, '/'); |
#if defined (__MSDOS__) | #if defined (__MSDOS__) || defined (_WIN32) |
if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':') |
if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':') |
temp = pathname + 1; |
temp = pathname + 1; |
#endif |
#endif |
|
|
if (temp == 0 || *temp == '\0') |
if (temp == 0 || *temp == '\0') |
return (pathname); |
return (pathname); |
|
else if (temp[1] == 0 && temp == pathname) |
|
return (pathname); |
/* If the basename is NULL, we might have a pathname like '/usr/src/'. |
/* If the basename is NULL, we might have a pathname like '/usr/src/'. |
Look for a previous slash and, if one is found, return the portion |
Look for a previous slash and, if one is found, return the portion |
following that slash. If there's no previous slash, just return the |
following that slash. If there's no previous slash, just return the |
Line 706 printable_part (pathname)
|
Line 750 printable_part (pathname)
|
|
|
/* Compute width of STRING when displayed on screen by print_filename */ |
/* Compute width of STRING when displayed on screen by print_filename */ |
static int |
static int |
fnwidth (string) | fnwidth (const char *string) |
const char *string; | |
{ |
{ |
int width, pos; |
int width, pos; |
#if defined (HANDLE_MULTIBYTE) |
#if defined (HANDLE_MULTIBYTE) |
Line 759 fnwidth (string)
|
Line 802 fnwidth (string)
|
#define ELLIPSIS_LEN 3 |
#define ELLIPSIS_LEN 3 |
|
|
static int |
static int |
fnprint (to_print, prefix_bytes) | fnprint (const char *to_print, int prefix_bytes, const char *real_pathname) |
const char *to_print; | |
int prefix_bytes; | |
{ |
{ |
int printed_len, w; |
int printed_len, w; |
const char *s; |
const char *s; |
|
int common_prefix_len, print_len; |
#if defined (HANDLE_MULTIBYTE) |
#if defined (HANDLE_MULTIBYTE) |
mbstate_t ps; |
mbstate_t ps; |
const char *end; |
const char *end; |
Line 772 fnprint (to_print, prefix_bytes)
|
Line 814 fnprint (to_print, prefix_bytes)
|
int width; |
int width; |
wchar_t wc; |
wchar_t wc; |
|
|
end = to_print + strlen (to_print) + 1; | print_len = strlen (to_print); |
| end = to_print + print_len + 1; |
memset (&ps, 0, sizeof (mbstate_t)); |
memset (&ps, 0, sizeof (mbstate_t)); |
|
#else |
|
print_len = strlen (to_print); |
#endif |
#endif |
|
|
printed_len = 0; | printed_len = common_prefix_len = 0; |
|
|
/* Don't print only the ellipsis if the common prefix is one of the |
/* Don't print only the ellipsis if the common prefix is one of the |
possible completions */ | possible completions. Only cut off prefix_bytes if we're going to be |
if (to_print[prefix_bytes] == '\0') | printing the ellipsis, which takes precedence over coloring the |
| completion prefix (see print_filename() below). */ |
| if (_rl_completion_prefix_display_length > 0 && prefix_bytes >= print_len) |
prefix_bytes = 0; |
prefix_bytes = 0; |
|
|
if (prefix_bytes) | #if defined (COLOR_SUPPORT) |
| if (_rl_colored_stats && (prefix_bytes == 0 || _rl_colored_completion_prefix <= 0)) |
| colored_stat_start (real_pathname); |
| #endif |
| |
| if (prefix_bytes && _rl_completion_prefix_display_length > 0) |
{ |
{ |
char ellipsis; |
char ellipsis; |
|
|
Line 792 fnprint (to_print, prefix_bytes)
|
Line 844 fnprint (to_print, prefix_bytes)
|
putc (ellipsis, rl_outstream); |
putc (ellipsis, rl_outstream); |
printed_len = ELLIPSIS_LEN; |
printed_len = ELLIPSIS_LEN; |
} |
} |
|
#if defined (COLOR_SUPPORT) |
|
else if (prefix_bytes && _rl_colored_completion_prefix > 0) |
|
{ |
|
common_prefix_len = prefix_bytes; |
|
prefix_bytes = 0; |
|
/* XXX - print color indicator start here */ |
|
colored_prefix_start (); |
|
} |
|
#endif |
|
|
s = to_print + prefix_bytes; |
s = to_print + prefix_bytes; |
while (*s) |
while (*s) |
Line 842 fnprint (to_print, prefix_bytes)
|
Line 903 fnprint (to_print, prefix_bytes)
|
printed_len++; |
printed_len++; |
#endif |
#endif |
} |
} |
|
if (common_prefix_len > 0 && (s - to_print) >= common_prefix_len) |
|
{ |
|
#if defined (COLOR_SUPPORT) |
|
/* printed bytes = s - to_print */ |
|
/* printed bytes should never be > but check for paranoia's sake */ |
|
colored_prefix_end (); |
|
if (_rl_colored_stats) |
|
colored_stat_start (real_pathname); /* XXX - experiment */ |
|
#endif |
|
common_prefix_len = 0; |
|
} |
} |
} |
|
|
|
#if defined (COLOR_SUPPORT) |
|
/* XXX - unconditional for now */ |
|
if (_rl_colored_stats) |
|
colored_stat_end (); |
|
#endif |
|
|
return printed_len; |
return printed_len; |
} |
} |
|
|
Line 852 fnprint (to_print, prefix_bytes)
|
Line 930 fnprint (to_print, prefix_bytes)
|
filenames. Return the number of characters we output. */ |
filenames. Return the number of characters we output. */ |
|
|
static int |
static int |
print_filename (to_print, full_pathname, prefix_bytes) | print_filename (char *to_print, char *full_pathname, int prefix_bytes) |
char *to_print, *full_pathname; | |
int prefix_bytes; | |
{ |
{ |
int printed_len, extension_char, slen, tlen; |
int printed_len, extension_char, slen, tlen; |
char *s, c, *new_full_pathname, *dn; |
char *s, c, *new_full_pathname, *dn; |
Line 864 print_filename (to_print, full_pathname, prefix_bytes)
|
Line 940 print_filename (to_print, full_pathname, prefix_bytes)
|
/* Defer printing if we want to prefix with a color indicator */ |
/* Defer printing if we want to prefix with a color indicator */ |
if (_rl_colored_stats == 0 || rl_filename_completion_desired == 0) |
if (_rl_colored_stats == 0 || rl_filename_completion_desired == 0) |
#endif |
#endif |
printed_len = fnprint (to_print, prefix_bytes); | printed_len = fnprint (to_print, prefix_bytes, to_print); |
|
|
if (rl_filename_completion_desired && ( |
if (rl_filename_completion_desired && ( |
#if defined (VISIBLE_STATS) |
#if defined (VISIBLE_STATS) |
Line 911 print_filename (to_print, full_pathname, prefix_bytes)
|
Line 987 print_filename (to_print, full_pathname, prefix_bytes)
|
slen--; |
slen--; |
else |
else |
new_full_pathname[slen] = '/'; |
new_full_pathname[slen] = '/'; |
new_full_pathname[slen] = '/'; |
|
strcpy (new_full_pathname + slen + 1, to_print); |
strcpy (new_full_pathname + slen + 1, to_print); |
|
|
#if defined (VISIBLE_STATS) |
#if defined (VISIBLE_STATS) |
Line 926 print_filename (to_print, full_pathname, prefix_bytes)
|
Line 1001 print_filename (to_print, full_pathname, prefix_bytes)
|
{ |
{ |
dn = savestring (new_full_pathname); |
dn = savestring (new_full_pathname); |
(*rl_filename_stat_hook) (&dn); |
(*rl_filename_stat_hook) (&dn); |
free (new_full_pathname); | xfree (new_full_pathname); |
new_full_pathname = dn; |
new_full_pathname = dn; |
} |
} |
if (path_isdir (new_full_pathname)) |
if (path_isdir (new_full_pathname)) |
extension_char = '/'; |
extension_char = '/'; |
} |
} |
|
|
|
/* Move colored-stats code inside fnprint() */ |
#if defined (COLOR_SUPPORT) |
#if defined (COLOR_SUPPORT) |
if (_rl_colored_stats) |
if (_rl_colored_stats) |
{ | printed_len = fnprint (to_print, prefix_bytes, new_full_pathname); |
colored_stat_start (new_full_pathname); | |
printed_len = fnprint (to_print, prefix_bytes); | |
colored_stat_end (); | |
} | |
#endif |
#endif |
|
|
xfree (new_full_pathname); |
xfree (new_full_pathname); |
Line 956 print_filename (to_print, full_pathname, prefix_bytes)
|
Line 1028 print_filename (to_print, full_pathname, prefix_bytes)
|
if (_rl_complete_mark_directories && path_isdir (s)) |
if (_rl_complete_mark_directories && path_isdir (s)) |
extension_char = '/'; |
extension_char = '/'; |
|
|
|
/* Move colored-stats code inside fnprint() */ |
#if defined (COLOR_SUPPORT) |
#if defined (COLOR_SUPPORT) |
if (_rl_colored_stats) |
if (_rl_colored_stats) |
{ | printed_len = fnprint (to_print, prefix_bytes, s); |
colored_stat_start (s); | |
printed_len = fnprint (to_print, prefix_bytes); | |
colored_stat_end (); | |
} | |
#endif |
#endif |
|
|
} |
} |
|
|
xfree (s); |
xfree (s); |
Line 979 print_filename (to_print, full_pathname, prefix_bytes)
|
Line 1047 print_filename (to_print, full_pathname, prefix_bytes)
|
} |
} |
|
|
static char * |
static char * |
rl_quote_filename (s, rtype, qcp) | rl_quote_filename (char *s, int rtype, char *qcp) |
char *s; | |
int rtype; | |
char *qcp; | |
{ |
{ |
char *r; |
char *r; |
|
|
Line 1010 rl_quote_filename (s, rtype, qcp)
|
Line 1075 rl_quote_filename (s, rtype, qcp)
|
the value of the delimiter character that caused a word break. */ |
the value of the delimiter character that caused a word break. */ |
|
|
char |
char |
_rl_find_completion_word (fp, dp) | _rl_find_completion_word (int *fp, int *dp) |
int *fp, *dp; | |
{ |
{ |
int scan, end, found_quote, delimiter, pass_next, isbrk; |
int scan, end, found_quote, delimiter, pass_next, isbrk; |
char quote_char, *brkchars; |
char quote_char, *brkchars; |
Line 1143 _rl_find_completion_word (fp, dp)
|
Line 1207 _rl_find_completion_word (fp, dp)
|
} |
} |
|
|
static char ** |
static char ** |
gen_completion_matches (text, start, end, our_func, found_quote, quote_char) | gen_completion_matches (char *text, int start, int end, rl_compentry_func_t *our_func, int found_quote, int quote_char) |
char *text; | |
int start, end; | |
rl_compentry_func_t *our_func; | |
int found_quote, quote_char; | |
{ |
{ |
char **matches; |
char **matches; |
|
|
Line 1191 gen_completion_matches (text, start, end, our_func, fo
|
Line 1251 gen_completion_matches (text, start, end, our_func, fo
|
/* Filter out duplicates in MATCHES. This frees up the strings in |
/* Filter out duplicates in MATCHES. This frees up the strings in |
MATCHES. */ |
MATCHES. */ |
static char ** |
static char ** |
remove_duplicate_matches (matches) | remove_duplicate_matches (char **matches) |
char **matches; | |
{ |
{ |
char *lowest_common; |
char *lowest_common; |
int i, j, newlen; |
int i, j, newlen; |
Line 1252 remove_duplicate_matches (matches)
|
Line 1311 remove_duplicate_matches (matches)
|
/* Find the common prefix of the list of matches, and put it into |
/* Find the common prefix of the list of matches, and put it into |
matches[0]. */ |
matches[0]. */ |
static int |
static int |
compute_lcd_of_matches (match_list, matches, text) | compute_lcd_of_matches (char **match_list, int matches, const char *text) |
char **match_list; | |
int matches; | |
const char *text; | |
{ |
{ |
register int i, c1, c2, si; |
register int i, c1, c2, si; |
int low; /* Count of max-matched characters. */ |
int low; /* Count of max-matched characters. */ |
Line 1287 compute_lcd_of_matches (match_list, matches, text)
|
Line 1343 compute_lcd_of_matches (match_list, matches, text)
|
memset (&ps2, 0, sizeof (mbstate_t)); |
memset (&ps2, 0, sizeof (mbstate_t)); |
} |
} |
#endif |
#endif |
if (_rl_completion_case_fold) | for (si = 0; (c1 = match_list[i][si]) && (c2 = match_list[i + 1][si]); si++) |
{ |
{ |
for (si = 0; | if (_rl_completion_case_fold) |
(c1 = _rl_to_lower(match_list[i][si])) && | { |
(c2 = _rl_to_lower(match_list[i + 1][si])); | c1 = _rl_to_lower (c1); |
si++) | c2 = _rl_to_lower (c2); |
| } |
#if defined (HANDLE_MULTIBYTE) |
#if defined (HANDLE_MULTIBYTE) |
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) |
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) |
{ |
{ |
Line 1304 compute_lcd_of_matches (match_list, matches, text)
|
Line 1361 compute_lcd_of_matches (match_list, matches, text)
|
break; |
break; |
continue; |
continue; |
} |
} |
wc1 = towlower (wc1); | if (_rl_completion_case_fold) |
wc2 = towlower (wc2); | { |
| wc1 = towlower (wc1); |
| wc2 = towlower (wc2); |
| } |
if (wc1 != wc2) |
if (wc1 != wc2) |
break; |
break; |
else if (v1 > 1) |
else if (v1 > 1) |
Line 1316 compute_lcd_of_matches (match_list, matches, text)
|
Line 1376 compute_lcd_of_matches (match_list, matches, text)
|
if (c1 != c2) |
if (c1 != c2) |
break; |
break; |
} |
} |
else |
|
{ |
|
for (si = 0; |
|
(c1 = match_list[i][si]) && |
|
(c2 = match_list[i + 1][si]); |
|
si++) |
|
#if defined (HANDLE_MULTIBYTE) |
|
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) |
|
{ |
|
mbstate_t ps_back; |
|
ps_back = ps1; |
|
if (!_rl_compare_chars (match_list[i], si, &ps1, match_list[i+1], si, &ps2)) |
|
break; |
|
else if ((v = _rl_get_char_len (&match_list[i][si], &ps_back)) > 1) |
|
si += v - 1; |
|
} |
|
else |
|
#endif |
|
if (c1 != c2) |
|
break; |
|
} |
|
|
|
if (low > si) |
if (low > si) |
low = si; |
low = si; |
Line 1381 compute_lcd_of_matches (match_list, matches, text)
|
Line 1420 compute_lcd_of_matches (match_list, matches, text)
|
} |
} |
|
|
/* sort the list to get consistent answers. */ |
/* sort the list to get consistent answers. */ |
qsort (match_list+1, matches, sizeof(char *), (QSFUNC *)_rl_qsort_string_compare); | if (rl_sort_completion_matches) |
| qsort (match_list+1, matches, sizeof(char *), (QSFUNC *)_rl_qsort_string_compare); |
|
|
si = strlen (text); |
si = strlen (text); |
lx = (si <= low) ? si : low; /* check shorter of text and matches */ |
lx = (si <= low) ? si : low; /* check shorter of text and matches */ |
Line 1411 compute_lcd_of_matches (match_list, matches, text)
|
Line 1451 compute_lcd_of_matches (match_list, matches, text)
|
} |
} |
|
|
static int |
static int |
postprocess_matches (matchesp, matching_filenames) | postprocess_matches (char ***matchesp, int matching_filenames) |
char ***matchesp; | |
int matching_filenames; | |
{ |
{ |
char *t, **matches, **temp_matches; |
char *t, **matches, **temp_matches; |
int nmatch, i; |
int nmatch, i; |
Line 1467 postprocess_matches (matchesp, matching_filenames)
|
Line 1505 postprocess_matches (matchesp, matching_filenames)
|
} |
} |
|
|
static int |
static int |
complete_get_screenwidth () | complete_get_screenwidth (void) |
{ |
{ |
int cols; |
int cols; |
char *envcols; |
char *envcols; |
Line 1488 complete_get_screenwidth ()
|
Line 1526 complete_get_screenwidth ()
|
of strings, in argv format, LEN is the number of strings in MATCHES, |
of strings, in argv format, LEN is the number of strings in MATCHES, |
and MAX is the length of the longest string in MATCHES. */ |
and MAX is the length of the longest string in MATCHES. */ |
void |
void |
rl_display_match_list (matches, len, max) | rl_display_match_list (char **matches, int len, int max) |
char **matches; | |
int len, max; | |
{ |
{ |
int count, limit, printed_len, lines, cols; |
int count, limit, printed_len, lines, cols; |
int i, j, k, l, common_length, sind; |
int i, j, k, l, common_length, sind; |
Line 1502 rl_display_match_list (matches, len, max)
|
Line 1538 rl_display_match_list (matches, len, max)
|
if (_rl_completion_prefix_display_length > 0) |
if (_rl_completion_prefix_display_length > 0) |
{ |
{ |
t = printable_part (matches[0]); |
t = printable_part (matches[0]); |
temp = strrchr (t, '/'); | /* check again in case of /usr/src/ */ |
| temp = rl_filename_completion_desired ? strrchr (t, '/') : 0; |
common_length = temp ? fnwidth (temp) : fnwidth (t); |
common_length = temp ? fnwidth (temp) : fnwidth (t); |
sind = temp ? strlen (temp) : strlen (t); |
sind = temp ? strlen (temp) : strlen (t); |
|
if (common_length > max || sind > max) |
|
common_length = sind = 0; |
|
|
if (common_length > _rl_completion_prefix_display_length && common_length > ELLIPSIS_LEN) |
if (common_length > _rl_completion_prefix_display_length && common_length > ELLIPSIS_LEN) |
max -= common_length - ELLIPSIS_LEN; |
max -= common_length - ELLIPSIS_LEN; |
else |
else |
common_length = sind = 0; |
common_length = sind = 0; |
} |
} |
|
#if defined (COLOR_SUPPORT) |
|
else if (_rl_colored_completion_prefix > 0) |
|
{ |
|
t = printable_part (matches[0]); |
|
temp = rl_filename_completion_desired ? strrchr (t, '/') : 0; |
|
common_length = temp ? fnwidth (temp) : fnwidth (t); |
|
sind = temp ? RL_STRLEN (temp+1) : RL_STRLEN (t); /* want portion after final slash */ |
|
if (common_length > max || sind > max) |
|
common_length = sind = 0; |
|
} |
|
#endif |
|
|
/* How many items of MAX length can we fit in the screen window? */ |
/* How many items of MAX length can we fit in the screen window? */ |
cols = complete_get_screenwidth (); |
cols = complete_get_screenwidth (); |
Line 1557 rl_display_match_list (matches, len, max)
|
Line 1607 rl_display_match_list (matches, len, max)
|
printed_len = print_filename (temp, matches[l], sind); |
printed_len = print_filename (temp, matches[l], sind); |
|
|
if (j + 1 < limit) |
if (j + 1 < limit) |
for (k = 0; k < max - printed_len; k++) | { |
putc (' ', rl_outstream); | if (max <= printed_len) |
| putc (' ', rl_outstream); |
| else |
| for (k = 0; k < max - printed_len; k++) |
| putc (' ', rl_outstream); |
| } |
} |
} |
l += count; |
l += count; |
} |
} |
rl_crlf (); |
rl_crlf (); |
|
#if defined (SIGWINCH) |
|
if (RL_SIG_RECEIVED () && RL_SIGWINCH_RECEIVED() == 0) |
|
#else |
|
if (RL_SIG_RECEIVED ()) |
|
#endif |
|
return; |
lines++; |
lines++; |
if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count) |
if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count) |
{ |
{ |
Line 1580 rl_display_match_list (matches, len, max)
|
Line 1641 rl_display_match_list (matches, len, max)
|
temp = printable_part (matches[i]); |
temp = printable_part (matches[i]); |
printed_len = print_filename (temp, matches[i], sind); |
printed_len = print_filename (temp, matches[i], sind); |
/* Have we reached the end of this line? */ |
/* Have we reached the end of this line? */ |
|
#if defined (SIGWINCH) |
|
if (RL_SIG_RECEIVED () && RL_SIGWINCH_RECEIVED() == 0) |
|
#else |
|
if (RL_SIG_RECEIVED ()) |
|
#endif |
|
return; |
if (matches[i+1]) |
if (matches[i+1]) |
{ |
{ |
if (limit == 1 || (i && (limit > 1) && (i % limit) == 0)) |
if (limit == 1 || (i && (limit > 1) && (i % limit) == 0)) |
Line 1593 rl_display_match_list (matches, len, max)
|
Line 1660 rl_display_match_list (matches, len, max)
|
return; |
return; |
} |
} |
} |
} |
|
else if (max <= printed_len) |
|
putc (' ', rl_outstream); |
else |
else |
for (k = 0; k < max - printed_len; k++) |
for (k = 0; k < max - printed_len; k++) |
putc (' ', rl_outstream); |
putc (' ', rl_outstream); |
Line 1614 rl_display_match_list (matches, len, max)
|
Line 1683 rl_display_match_list (matches, len, max)
|
and ask the user if he wants to see the list if there are more matches |
and ask the user if he wants to see the list if there are more matches |
than RL_COMPLETION_QUERY_ITEMS. */ |
than RL_COMPLETION_QUERY_ITEMS. */ |
static void |
static void |
display_matches (matches) | display_matches (char **matches) |
char **matches; | |
{ |
{ |
int len, max, i; |
int len, max, i; |
char *temp; |
char *temp; |
Line 1681 display_matches (matches)
|
Line 1749 display_matches (matches)
|
rl_display_fixed = 1; |
rl_display_fixed = 1; |
} |
} |
|
|
|
/* qc == pointer to quoting character, if any */ |
static char * |
static char * |
make_quoted_replacement (match, mtype, qc) | make_quoted_replacement (char *match, int mtype, char *qc) |
char *match; | |
int mtype; | |
char *qc; /* Pointer to quoting character, if any */ | |
{ |
{ |
int should_quote, do_replace; |
int should_quote, do_replace; |
char *replacement; |
char *replacement; |
Line 1727 make_quoted_replacement (match, mtype, qc)
|
Line 1793 make_quoted_replacement (match, mtype, qc)
|
} |
} |
|
|
static void |
static void |
insert_match (match, start, mtype, qc) | insert_match (char *match, int start, int mtype, char *qc) |
char *match; | |
int start, mtype; | |
char *qc; | |
{ |
{ |
char *replacement, *r; |
char *replacement, *r; |
char oqc; |
char oqc; |
Line 1787 insert_match (match, start, mtype, qc)
|
Line 1850 insert_match (match, start, mtype, qc)
|
value of _rl_complete_mark_symlink_dirs, but may be modified by an |
value of _rl_complete_mark_symlink_dirs, but may be modified by an |
application's completion function). */ |
application's completion function). */ |
static int |
static int |
append_to_match (text, delimiter, quote_char, nontrivial_match) | append_to_match (char *text, int delimiter, int quote_char, int nontrivial_match) |
char *text; | |
int delimiter, quote_char, nontrivial_match; | |
{ |
{ |
char temp_string[4], *filename, *fn; |
char temp_string[4], *filename, *fn; |
int temp_string_index, s; |
int temp_string_index, s; |
Line 1856 append_to_match (text, delimiter, quote_char, nontrivi
|
Line 1917 append_to_match (text, delimiter, quote_char, nontrivi
|
} |
} |
|
|
static void |
static void |
insert_all_matches (matches, point, qc) | insert_all_matches (char **matches, int point, char *qc) |
char **matches; | |
int point; | |
char *qc; | |
{ |
{ |
int i; |
int i; |
char *rp; |
char *rp; |
Line 1895 insert_all_matches (matches, point, qc)
|
Line 1953 insert_all_matches (matches, point, qc)
|
} |
} |
|
|
void |
void |
_rl_free_match_list (matches) | _rl_free_match_list (char **matches) |
char **matches; | |
{ |
{ |
register int i; |
register int i; |
|
|
Line 1908 _rl_free_match_list (matches)
|
Line 1965 _rl_free_match_list (matches)
|
xfree (matches); |
xfree (matches); |
} |
} |
|
|
|
/* Compare a possibly-quoted filename TEXT from the line buffer and a possible |
|
MATCH that is the product of filename completion, which acts on the dequoted |
|
text. */ |
|
static int |
|
compare_match (char *text, const char *match) |
|
{ |
|
char *temp; |
|
int r; |
|
|
|
if (rl_filename_completion_desired && rl_filename_quoting_desired && |
|
rl_completion_found_quote && rl_filename_dequoting_function) |
|
{ |
|
temp = (*rl_filename_dequoting_function) (text, rl_completion_quote_character); |
|
r = strcmp (temp, match); |
|
free (temp); |
|
return r; |
|
} |
|
return (strcmp (text, match)); |
|
} |
|
|
/* Complete the word at or before point. |
/* Complete the word at or before point. |
WHAT_TO_DO says what to do with the completion. |
WHAT_TO_DO says what to do with the completion. |
`?' means list the possible completions. |
`?' means list the possible completions. |
Line 1918 _rl_free_match_list (matches)
|
Line 1995 _rl_free_match_list (matches)
|
`@' means to do standard completion, and list all possible completions if |
`@' means to do standard completion, and list all possible completions if |
there is more than one and partial completion is not possible. */ |
there is more than one and partial completion is not possible. */ |
int |
int |
rl_complete_internal (what_to_do) | rl_complete_internal (int what_to_do) |
int what_to_do; | |
{ |
{ |
char **matches; |
char **matches; |
rl_compentry_func_t *our_func; |
rl_compentry_func_t *our_func; |
int start, end, delimiter, found_quote, i, nontrivial_lcd; |
int start, end, delimiter, found_quote, i, nontrivial_lcd; |
char *text, *saved_line_buffer; |
char *text, *saved_line_buffer; |
char quote_char; |
char quote_char; |
#if 1 | int tlen, mlen, saved_last_completion_failed; |
int tlen, mlen; | |
#endif | |
|
|
RL_SETSTATE(RL_STATE_COMPLETING); |
RL_SETSTATE(RL_STATE_COMPLETING); |
|
|
|
saved_last_completion_failed = last_completion_failed; |
|
|
set_completion_defaults (what_to_do); |
set_completion_defaults (what_to_do); |
|
|
saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL; |
saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL; |
Line 1955 rl_complete_internal (what_to_do)
|
Line 2031 rl_complete_internal (what_to_do)
|
matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char); |
matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char); |
/* nontrivial_lcd is set if the common prefix adds something to the word |
/* nontrivial_lcd is set if the common prefix adds something to the word |
being completed. */ |
being completed. */ |
nontrivial_lcd = matches && strcmp (text, matches[0]) != 0; | nontrivial_lcd = matches && compare_match (text, matches[0]) != 0; |
if (what_to_do == '!' || what_to_do == '@') |
if (what_to_do == '!' || what_to_do == '@') |
tlen = strlen (text); |
tlen = strlen (text); |
xfree (text); |
xfree (text); |
Line 1965 rl_complete_internal (what_to_do)
|
Line 2041 rl_complete_internal (what_to_do)
|
rl_ding (); |
rl_ding (); |
FREE (saved_line_buffer); |
FREE (saved_line_buffer); |
completion_changed_buffer = 0; |
completion_changed_buffer = 0; |
|
last_completion_failed = 1; |
RL_UNSETSTATE(RL_STATE_COMPLETING); |
RL_UNSETSTATE(RL_STATE_COMPLETING); |
_rl_reset_completion_state (); |
_rl_reset_completion_state (); |
return (0); |
return (0); |
Line 1980 rl_complete_internal (what_to_do)
|
Line 2057 rl_complete_internal (what_to_do)
|
rl_ding (); |
rl_ding (); |
FREE (saved_line_buffer); |
FREE (saved_line_buffer); |
completion_changed_buffer = 0; |
completion_changed_buffer = 0; |
|
last_completion_failed = 1; |
RL_UNSETSTATE(RL_STATE_COMPLETING); |
RL_UNSETSTATE(RL_STATE_COMPLETING); |
_rl_reset_completion_state (); |
_rl_reset_completion_state (); |
return (0); |
return (0); |
} |
} |
|
|
|
if (matches && matches[0] && *matches[0]) |
|
last_completion_failed = 0; |
|
|
switch (what_to_do) |
switch (what_to_do) |
{ |
{ |
case TAB: |
case TAB: |
Line 2040 rl_complete_internal (what_to_do)
|
Line 2121 rl_complete_internal (what_to_do)
|
break; |
break; |
|
|
case '?': |
case '?': |
|
/* Let's try to insert a single match here if the last completion failed |
|
but this attempt returned a single match. */ |
|
if (saved_last_completion_failed && matches[0] && *matches[0] && matches[1] == 0) |
|
{ |
|
insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); |
|
append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd); |
|
break; |
|
} |
|
|
if (rl_completion_display_matches_hook == 0) |
if (rl_completion_display_matches_hook == 0) |
{ |
{ |
_rl_sigcleanup = _rl_complete_sigcleanup; |
_rl_sigcleanup = _rl_complete_sigcleanup; |
_rl_sigcleanarg = matches; |
_rl_sigcleanarg = matches; |
|
_rl_complete_display_matches_interrupt = 0; |
} |
} |
display_matches (matches); |
display_matches (matches); |
|
if (_rl_complete_display_matches_interrupt) |
|
{ |
|
matches = 0; /* already freed by rl_complete_sigcleanup */ |
|
_rl_complete_display_matches_interrupt = 0; |
|
if (rl_signal_event_hook) |
|
(*rl_signal_event_hook) (); /* XXX */ |
|
} |
_rl_sigcleanup = 0; |
_rl_sigcleanup = 0; |
_rl_sigcleanarg = 0; |
_rl_sigcleanarg = 0; |
break; |
break; |
Line 2071 rl_complete_internal (what_to_do)
|
Line 2169 rl_complete_internal (what_to_do)
|
|
|
RL_UNSETSTATE(RL_STATE_COMPLETING); |
RL_UNSETSTATE(RL_STATE_COMPLETING); |
_rl_reset_completion_state (); |
_rl_reset_completion_state (); |
|
|
|
RL_CHECK_SIGNALS (); |
return 0; |
return 0; |
} |
} |
|
|
Line 2093 rl_complete_internal (what_to_do)
|
Line 2193 rl_complete_internal (what_to_do)
|
when there are no more matches. |
when there are no more matches. |
*/ |
*/ |
char ** |
char ** |
rl_completion_matches (text, entry_function) | rl_completion_matches (const char *text, rl_compentry_func_t *entry_function) |
const char *text; | |
rl_compentry_func_t *entry_function; | |
{ |
{ |
register int i; |
register int i; |
|
|
Line 2163 rl_completion_matches (text, entry_function)
|
Line 2261 rl_completion_matches (text, entry_function)
|
TEXT contains a partial username preceded by a random |
TEXT contains a partial username preceded by a random |
character (usually `~'). */ |
character (usually `~'). */ |
char * |
char * |
rl_username_completion_function (text, state) | rl_username_completion_function (const char *text, int state) |
const char *text; | |
int state; | |
{ |
{ |
#if defined (__WIN32__) || defined (__OPENNT) |
#if defined (__WIN32__) || defined (__OPENNT) |
return (char *)NULL; |
return (char *)NULL; |
Line 2227 rl_username_completion_function (text, state)
|
Line 2323 rl_username_completion_function (text, state)
|
_rl_completion_case_map is set, make `-' and `_' equivalent. CONVFN is |
_rl_completion_case_map is set, make `-' and `_' equivalent. CONVFN is |
the possibly-converted directory entry; FILENAME is what the user typed. */ |
the possibly-converted directory entry; FILENAME is what the user typed. */ |
static int |
static int |
complete_fncmp (convfn, convlen, filename, filename_len) | complete_fncmp (const char *convfn, int convlen, const char *filename, int filename_len) |
const char *convfn; | |
int convlen; | |
const char *filename; | |
int filename_len; | |
{ |
{ |
register char *s1, *s2; |
register char *s1, *s2; |
int d, len; |
int d, len; |
Line 2359 complete_fncmp (convfn, convlen, filename, filename_le
|
Line 2451 complete_fncmp (convfn, convlen, filename, filename_le
|
because of all the pathnames that must be followed when looking up the |
because of all the pathnames that must be followed when looking up the |
completion for a command. */ |
completion for a command. */ |
char * |
char * |
rl_filename_completion_function (text, state) | rl_filename_completion_function (const char *text, int state) |
const char *text; | |
int state; | |
{ |
{ |
static DIR *directory = (DIR *)NULL; |
static DIR *directory = (DIR *)NULL; |
static char *filename = (char *)NULL; |
static char *filename = (char *)NULL; |
Line 2370 rl_filename_completion_function (text, state)
|
Line 2460 rl_filename_completion_function (text, state)
|
static int filename_len; |
static int filename_len; |
char *temp, *dentry, *convfn; |
char *temp, *dentry, *convfn; |
int dirlen, dentlen, convlen; |
int dirlen, dentlen, convlen; |
|
int tilde_dirname; |
struct dirent *entry; |
struct dirent *entry; |
|
|
/* If we don't have any state, then do some initialization. */ |
/* If we don't have any state, then do some initialization. */ |
Line 2393 rl_filename_completion_function (text, state)
|
Line 2484 rl_filename_completion_function (text, state)
|
|
|
temp = strrchr (dirname, '/'); |
temp = strrchr (dirname, '/'); |
|
|
#if defined (__MSDOS__) | #if defined (__MSDOS__) || defined (_WIN32) |
/* special hack for //X/... */ |
/* special hack for //X/... */ |
if (dirname[0] == '/' && dirname[1] == '/' && ISALPHA ((unsigned char)dirname[2]) && dirname[3] == '/') |
if (dirname[0] == '/' && dirname[1] == '/' && ISALPHA ((unsigned char)dirname[2]) && dirname[3] == '/') |
temp = strrchr (dirname + 3, '/'); |
temp = strrchr (dirname + 3, '/'); |
Line 2404 rl_filename_completion_function (text, state)
|
Line 2495 rl_filename_completion_function (text, state)
|
strcpy (filename, ++temp); |
strcpy (filename, ++temp); |
*temp = '\0'; |
*temp = '\0'; |
} |
} |
#if defined (__MSDOS__) | #if defined (__MSDOS__) || (defined (_WIN32) && !defined (__CYGWIN__)) |
/* searches from current directory on the drive */ |
/* searches from current directory on the drive */ |
else if (ISALPHA ((unsigned char)dirname[0]) && dirname[1] == ':') |
else if (ISALPHA ((unsigned char)dirname[0]) && dirname[1] == ':') |
{ |
{ |
Line 2427 rl_filename_completion_function (text, state)
|
Line 2518 rl_filename_completion_function (text, state)
|
else |
else |
users_dirname = savestring (dirname); |
users_dirname = savestring (dirname); |
|
|
|
tilde_dirname = 0; |
if (*dirname == '~') |
if (*dirname == '~') |
{ |
{ |
temp = tilde_expand (dirname); |
temp = tilde_expand (dirname); |
xfree (dirname); |
xfree (dirname); |
dirname = temp; |
dirname = temp; |
|
tilde_dirname = 1; |
} |
} |
|
|
/* We have saved the possibly-dequoted version of the directory name |
/* We have saved the possibly-dequoted version of the directory name |
Line 2450 rl_filename_completion_function (text, state)
|
Line 2543 rl_filename_completion_function (text, state)
|
xfree (users_dirname); |
xfree (users_dirname); |
users_dirname = savestring (dirname); |
users_dirname = savestring (dirname); |
} |
} |
else if (rl_completion_found_quote && rl_filename_dequoting_function) | else if (tilde_dirname == 0 && rl_completion_found_quote && rl_filename_dequoting_function) |
{ |
{ |
/* delete single and double quotes */ |
/* delete single and double quotes */ |
xfree (dirname); |
xfree (dirname); |
Line 2586 rl_filename_completion_function (text, state)
|
Line 2679 rl_filename_completion_function (text, state)
|
hit the end of the match list, we restore the original unmatched text, |
hit the end of the match list, we restore the original unmatched text, |
ring the bell, and reset the counter to zero. */ |
ring the bell, and reset the counter to zero. */ |
int |
int |
rl_old_menu_complete (count, invoking_key) | rl_old_menu_complete (int count, int invoking_key) |
int count, invoking_key; | |
{ |
{ |
rl_compentry_func_t *our_func; |
rl_compentry_func_t *our_func; |
int matching_filenames, found_quote; |
int matching_filenames, found_quote; |
Line 2701 rl_old_menu_complete (count, invoking_key)
|
Line 2793 rl_old_menu_complete (count, invoking_key)
|
{ |
{ |
insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); |
insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); |
append_to_match (matches[match_list_index], delimiter, quote_char, |
append_to_match (matches[match_list_index], delimiter, quote_char, |
strcmp (orig_text, matches[match_list_index])); | compare_match (orig_text, matches[match_list_index])); |
} |
} |
|
|
completion_changed_buffer = 1; |
completion_changed_buffer = 1; |
return (0); |
return (0); |
} |
} |
|
|
|
/* The current version of menu completion. |
|
The differences between this function and the original are: |
|
|
|
1. It honors the maximum number of completions variable (completion-query-items) |
|
2. It appends to the word as usual if there is only one match |
|
3. It displays the common prefix if there is one, and makes it the first menu |
|
choice if the menu-complete-display-prefix option is enabled |
|
*/ |
|
|
int |
int |
rl_menu_complete (count, ignore) | rl_menu_complete (int count, int ignore) |
int count, ignore; | |
{ |
{ |
rl_compentry_func_t *our_func; |
rl_compentry_func_t *our_func; |
int matching_filenames, found_quote; |
int matching_filenames, found_quote; |
Line 2767 rl_menu_complete (count, ignore)
|
Line 2867 rl_menu_complete (count, ignore)
|
matches = gen_completion_matches (orig_text, orig_start, orig_end, |
matches = gen_completion_matches (orig_text, orig_start, orig_end, |
our_func, found_quote, quote_char); |
our_func, found_quote, quote_char); |
|
|
nontrivial_lcd = matches && strcmp (orig_text, matches[0]) != 0; | nontrivial_lcd = matches && compare_match (orig_text, matches[0]) != 0; |
|
|
/* If we are matching filenames, the attempted completion function will |
/* If we are matching filenames, the attempted completion function will |
have set rl_filename_completion_desired to a non-zero value. The basic |
have set rl_filename_completion_desired to a non-zero value. The basic |
Line 2874 rl_menu_complete (count, ignore)
|
Line 2974 rl_menu_complete (count, ignore)
|
{ |
{ |
insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); |
insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); |
append_to_match (matches[match_list_index], delimiter, quote_char, |
append_to_match (matches[match_list_index], delimiter, quote_char, |
strcmp (orig_text, matches[match_list_index])); | compare_match (orig_text, matches[match_list_index])); |
} |
} |
|
|
completion_changed_buffer = 1; |
completion_changed_buffer = 1; |
Line 2882 rl_menu_complete (count, ignore)
|
Line 2982 rl_menu_complete (count, ignore)
|
} |
} |
|
|
int |
int |
rl_backward_menu_complete (count, key) | rl_backward_menu_complete (int count, int key) |
int count, key; | |
{ |
{ |
/* Positive arguments to backward-menu-complete translate into negative |
/* Positive arguments to backward-menu-complete translate into negative |
arguments for menu-complete, and vice versa. */ |
arguments for menu-complete, and vice versa. */ |