version 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 (); |