|
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
|
| /* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */ |
/* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */ |
| |
|
| /* Copyright (C) 1988-2009 Free Software Foundation, Inc. | /* Copyright (C) 1988-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 57 static void *xmalloc (), *xrealloc ();
|
Line 57 static void *xmalloc (), *xrealloc ();
|
| |
|
| #if !defined (HAVE_GETPW_DECLS) |
#if !defined (HAVE_GETPW_DECLS) |
| # if defined (HAVE_GETPWUID) |
# if defined (HAVE_GETPWUID) |
| extern struct passwd *getpwuid PARAMS((uid_t)); | extern struct passwd *getpwuid (uid_t); |
| # endif |
# endif |
| # if defined (HAVE_GETPWNAM) |
# if defined (HAVE_GETPWNAM) |
| extern struct passwd *getpwnam PARAMS((const char *)); | extern struct passwd *getpwnam (const char *); |
| # endif |
# endif |
| #endif /* !HAVE_GETPW_DECLS */ |
#endif /* !HAVE_GETPW_DECLS */ |
| |
|
|
Line 79 extern struct passwd *getpwnam PARAMS((const char *));
|
Line 79 extern struct passwd *getpwnam PARAMS((const char *));
|
| /* If being compiled as part of bash, these will be satisfied from |
/* If being compiled as part of bash, these will be satisfied from |
| variables.o. If being compiled as part of readline, they will |
variables.o. If being compiled as part of readline, they will |
| be satisfied from shell.o. */ |
be satisfied from shell.o. */ |
| extern char *sh_get_home_dir PARAMS((void)); | extern char *sh_get_home_dir (void); |
| extern char *sh_get_env_value PARAMS((const char *)); | extern char *sh_get_env_value (const char *); |
| |
|
| /* The default value of tilde_additional_prefixes. This is set to |
/* The default value of tilde_additional_prefixes. This is set to |
| whitespace preceding a tilde so that simple programs which do not |
whitespace preceding a tilde so that simple programs which do not |
|
Line 116 char **tilde_additional_prefixes = (char **)default_pr
|
Line 116 char **tilde_additional_prefixes = (char **)default_pr
|
| `:' and `=~'. */ |
`:' and `=~'. */ |
| char **tilde_additional_suffixes = (char **)default_suffixes; |
char **tilde_additional_suffixes = (char **)default_suffixes; |
| |
|
| static int tilde_find_prefix PARAMS((const char *, int *)); | static int tilde_find_prefix (const char *, int *); |
| static int tilde_find_suffix PARAMS((const char *)); | static int tilde_find_suffix (const char *); |
| static char *isolate_tilde_prefix PARAMS((const char *, int *)); | static char *isolate_tilde_prefix (const char *, int *); |
| static char *glue_prefix_and_suffix PARAMS((char *, const char *, int)); | static char *glue_prefix_and_suffix (char *, const char *, int); |
| |
|
| /* Find the start of a tilde expansion in STRING, and return the index of |
/* Find the start of a tilde expansion in STRING, and return the index of |
| the tilde which starts the expansion. Place the length of the text |
the tilde which starts the expansion. Place the length of the text |
| which identified this tilde starter in LEN, excluding the tilde itself. */ |
which identified this tilde starter in LEN, excluding the tilde itself. */ |
| static int |
static int |
| tilde_find_prefix (string, len) | tilde_find_prefix (const char *string, int *len) |
| const char *string; | |
| int *len; | |
| { |
{ |
| register int i, j, string_len; |
register int i, j, string_len; |
| register char **prefixes; |
register char **prefixes; |
|
Line 160 tilde_find_prefix (string, len)
|
Line 158 tilde_find_prefix (string, len)
|
| /* Find the end of a tilde expansion in STRING, and return the index of |
/* Find the end of a tilde expansion in STRING, and return the index of |
| the character which ends the tilde definition. */ |
the character which ends the tilde definition. */ |
| static int |
static int |
| tilde_find_suffix (string) | tilde_find_suffix (const char *string) |
| const char *string; | |
| { |
{ |
| register int i, j, string_len; |
register int i, j, string_len; |
| register char **suffixes; |
register char **suffixes; |
|
Line 189 tilde_find_suffix (string)
|
Line 186 tilde_find_suffix (string)
|
| |
|
| /* Return a new string which is the result of tilde expanding STRING. */ |
/* Return a new string which is the result of tilde expanding STRING. */ |
| char * |
char * |
| tilde_expand (string) | tilde_expand (const char *string) |
| const char *string; | |
| { |
{ |
| char *result; |
char *result; |
| int result_size, result_index; |
int result_size, result_index; |
|
Line 236 tilde_expand (string)
|
Line 232 tilde_expand (string)
|
| string += end; |
string += end; |
| |
|
| expansion = tilde_expand_word (tilde_word); |
expansion = tilde_expand_word (tilde_word); |
| xfree (tilde_word); |
|
| |
|
| |
if (expansion == 0) |
| |
expansion = tilde_word; |
| |
else |
| |
xfree (tilde_word); |
| |
|
| len = strlen (expansion); |
len = strlen (expansion); |
| #ifdef __CYGWIN__ |
#ifdef __CYGWIN__ |
| /* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when |
/* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when |
|
Line 263 tilde_expand (string)
|
Line 263 tilde_expand (string)
|
| non-null, the index of the end of the prefix into FNAME is returned in |
non-null, the index of the end of the prefix into FNAME is returned in |
| the location it points to. */ |
the location it points to. */ |
| static char * |
static char * |
| isolate_tilde_prefix (fname, lenp) | isolate_tilde_prefix (const char *fname, int *lenp) |
| const char *fname; | |
| int *lenp; | |
| { |
{ |
| char *ret; |
char *ret; |
| int i; |
int i; |
|
Line 289 isolate_tilde_prefix (fname, lenp)
|
Line 287 isolate_tilde_prefix (fname, lenp)
|
| function. Right now, it just calls tilde_find_suffix and allocates new |
function. Right now, it just calls tilde_find_suffix and allocates new |
| memory, but it can be expanded to do different things later. */ |
memory, but it can be expanded to do different things later. */ |
| char * |
char * |
| tilde_find_word (fname, flags, lenp) | tilde_find_word (const char *fname, int flags, int *lenp) |
| const char *fname; | |
| int flags, *lenp; | |
| { |
{ |
| int x; |
int x; |
| char *r; |
char *r; |
|
Line 319 tilde_find_word (fname, flags, lenp)
|
Line 315 tilde_find_word (fname, flags, lenp)
|
| /* Return a string that is PREFIX concatenated with SUFFIX starting at |
/* Return a string that is PREFIX concatenated with SUFFIX starting at |
| SUFFIND. */ |
SUFFIND. */ |
| static char * |
static char * |
| glue_prefix_and_suffix (prefix, suffix, suffind) | glue_prefix_and_suffix (char *prefix, const char *suffix, int suffind) |
| char *prefix; | |
| const char *suffix; | |
| int suffind; | |
| { |
{ |
| char *ret; |
char *ret; |
| int plen, slen; |
int plen, slen; |
|
Line 340 glue_prefix_and_suffix (prefix, suffix, suffind)
|
Line 333 glue_prefix_and_suffix (prefix, suffix, suffind)
|
| tilde. If there is no expansion, call tilde_expansion_failure_hook. |
tilde. If there is no expansion, call tilde_expansion_failure_hook. |
| This always returns a newly-allocated string, never static storage. */ |
This always returns a newly-allocated string, never static storage. */ |
| char * |
char * |
| tilde_expand_word (filename) | tilde_expand_word (const char *filename) |
| const char *filename; | |
| { |
{ |
| char *dirname, *expansion, *username; |
char *dirname, *expansion, *username; |
| int user_len; |
int user_len; |
|
Line 360 tilde_expand_word (filename)
|
Line 352 tilde_expand_word (filename)
|
| { |
{ |
| /* Prefix $HOME to the rest of the string. */ |
/* Prefix $HOME to the rest of the string. */ |
| expansion = sh_get_env_value ("HOME"); |
expansion = sh_get_env_value ("HOME"); |
| |
#if defined (_WIN32) |
| |
if (expansion == 0) |
| |
expansion = sh_get_env_value ("APPDATA"); |
| |
#endif |
| |
|
| /* If there is no HOME variable, look up the directory in |
/* If there is no HOME variable, look up the directory in |
| the password database. */ |
the password database. */ |
|
Line 426 tilde_expand_word (filename)
|
Line 422 tilde_expand_word (filename)
|
| #undef NULL |
#undef NULL |
| #include <stdio.h> |
#include <stdio.h> |
| |
|
| main (argc, argv) | main (int argc, char **argv) |
| int argc; | |
| char **argv; | |
| { |
{ |
| char *result, line[512]; |
char *result, line[512]; |
| int done = 0; |
int done = 0; |
|
Line 456 main (argc, argv)
|
Line 450 main (argc, argv)
|
| exit (0); |
exit (0); |
| } |
} |
| |
|
| static void memory_error_and_abort (); | static void memory_error_and_abort (void); |
| |
|
| static void * |
static void * |
| xmalloc (bytes) | xmalloc (size_t bytes) |
| size_t bytes; | |
| { |
{ |
| void *temp = (char *)malloc (bytes); |
void *temp = (char *)malloc (bytes); |
| |
|
|
Line 470 xmalloc (bytes)
|
Line 463 xmalloc (bytes)
|
| } |
} |
| |
|
| static void * |
static void * |
| xrealloc (pointer, bytes) | xrealloc (void *pointer, int bytes) |
| void *pointer; | |
| int bytes; | |
| { |
{ |
| void *temp; |
void *temp; |
| |
|
|
Line 488 xrealloc (pointer, bytes)
|
Line 479 xrealloc (pointer, bytes)
|
| } |
} |
| |
|
| static void |
static void |
| memory_error_and_abort () | memory_error_and_abort (void) |
| { |
{ |
| fprintf (stderr, "readline: out of virtual memory\n"); |
fprintf (stderr, "readline: out of virtual memory\n"); |
| abort (); |
abort (); |