]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - readline/tilde.c
TUI resize unification
[thirdparty/binutils-gdb.git] / readline / tilde.c
index 60fc7fc6cdd1b9b7147a1694751f150bfdae97c8..9d0f29614b65f28245a2d170f11a6167dfefad35 100644 (file)
@@ -1,23 +1,23 @@
 /* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */
 
-/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
+/* Copyright (C) 1988-2017 Free Software Foundation, Inc.
 
-   This file is part of GNU Readline, a library for reading lines
-   of text with interactive input and history editing.
+   This file is part of the GNU Readline Library (Readline), a library
+   for reading lines of text with interactive input and history editing.
 
-   Readline is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2, or (at your option) any
-   later version.
+   Readline is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
-   Readline is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Readline is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with Readline; see the file COPYING.  If not, write to the Free
-   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   along with Readline.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
 #if defined (HAVE_CONFIG_H)
 #  include <config.h>
@@ -43,9 +43,9 @@
 #endif /* HAVE_STDLIB_H */
 
 #include <sys/types.h>
-#ifdef HAVE_PWD_H
+#if defined (HAVE_PWD_H)
 #include <pwd.h>
-#endif /* HAVE_PWD_H */
+#endif
 
 #include "tilde.h"
 
@@ -55,10 +55,14 @@ static void *xmalloc (), *xrealloc ();
 #  include "xmalloc.h"
 #endif /* TEST || STATIC_MALLOC */
 
-#if defined (HAVE_GETPWNAM) && !defined (HAVE_GETPW_DECLS)
+#if !defined (HAVE_GETPW_DECLS)
+#  if defined (HAVE_GETPWUID)
 extern struct passwd *getpwuid PARAMS((uid_t));
+#  endif
+#  if defined (HAVE_GETPWNAM)
 extern struct passwd *getpwnam PARAMS((const char *));
-#endif /* defined (HAVE_GETPWNAM) && !HAVE_GETPW_DECLS */
+#  endif
+#endif /* !HAVE_GETPW_DECLS */
 
 #if !defined (savestring)
 #define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x))
@@ -121,9 +125,7 @@ static char *glue_prefix_and_suffix PARAMS((char *, const char *, int));
    the tilde which starts the expansion.  Place the length of the text
    which identified this tilde starter in LEN, excluding the tilde itself. */
 static int
-tilde_find_prefix (string, len)
-     const char *string;
-     int *len;
+tilde_find_prefix (const char *string, int *len)
 {
   register int i, j, string_len;
   register char **prefixes;
@@ -156,8 +158,7 @@ tilde_find_prefix (string, len)
 /* Find the end of a tilde expansion in STRING, and return the index of
    the character which ends the tilde definition.  */
 static int
-tilde_find_suffix (string)
-     const char *string;
+tilde_find_suffix (const char *string)
 {
   register int i, j, string_len;
   register char **suffixes;
@@ -185,8 +186,7 @@ tilde_find_suffix (string)
 
 /* Return a new string which is the result of tilde expanding STRING. */
 char *
-tilde_expand (string)
-     const char *string;
+tilde_expand (const char *string)
 {
   char *result;
   int result_size, result_index;
@@ -232,7 +232,11 @@ tilde_expand (string)
       string += end;
 
       expansion = tilde_expand_word (tilde_word);
-      free (tilde_word);
+
+      if (expansion == 0)
+       expansion = tilde_word;
+      else
+       xfree (tilde_word);     
 
       len = strlen (expansion);
 #ifdef __CYGWIN__
@@ -247,7 +251,7 @@ tilde_expand (string)
          strcpy (result + result_index, expansion);
          result_index += len;
        }
-      free (expansion);
+      xfree (expansion);
     }
 
   result[result_index] = '\0';
@@ -259,9 +263,7 @@ tilde_expand (string)
    non-null, the index of the end of the prefix into FNAME is returned in
    the location it points to. */
 static char *
-isolate_tilde_prefix (fname, lenp)
-     const char *fname;
-     int *lenp;
+isolate_tilde_prefix (const char *fname, int *lenp)
 {
   char *ret;
   int i;
@@ -279,13 +281,41 @@ isolate_tilde_prefix (fname, lenp)
   return ret;
 }
 
+#if 0
+/* Public function to scan a string (FNAME) beginning with a tilde and find
+   the portion of the string that should be passed to the tilde expansion
+   function.  Right now, it just calls tilde_find_suffix and allocates new
+   memory, but it can be expanded to do different things later. */
+char *
+tilde_find_word (const char *fname, int flags, int *lenp)
+{
+  int x;
+  char *r;
+
+  x = tilde_find_suffix (fname);
+  if (x == 0)
+    {
+      r = savestring (fname);
+      if (lenp)
+       *lenp = 0;
+    }
+  else
+    {
+      r = (char *)xmalloc (1 + x);
+      strncpy (r, fname, x);
+      r[x] = '\0';
+      if (lenp)
+       *lenp = x;
+    }
+
+  return r;
+}
+#endif
+
 /* Return a string that is PREFIX concatenated with SUFFIX starting at
    SUFFIND. */
 static char *
-glue_prefix_and_suffix (prefix, suffix, suffind)
-     char *prefix;
-     const char *suffix;
-     int suffind;
+glue_prefix_and_suffix (char *prefix, const char *suffix, int suffind)
 {
   char *ret;
   int plen, slen;
@@ -303,8 +333,7 @@ glue_prefix_and_suffix (prefix, suffix, suffind)
    tilde.  If there is no expansion, call tilde_expansion_failure_hook.
    This always returns a newly-allocated string, never static storage. */
 char *
-tilde_expand_word (filename)
-     const char *filename;
+tilde_expand_word (const char *filename)
 {
   char *dirname, *expansion, *username;
   int user_len;
@@ -323,6 +352,10 @@ tilde_expand_word (filename)
     {
       /* Prefix $HOME to the rest of the string. */
       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
         the password database. */
@@ -340,8 +373,8 @@ tilde_expand_word (filename)
       if (expansion)
        {
          dirname = glue_prefix_and_suffix (expansion, filename, user_len);
-         free (username);
-         free (expansion);
+         xfree (username);
+         xfree (expansion);
          return (dirname);
        }
     }
@@ -349,8 +382,11 @@ tilde_expand_word (filename)
   /* No preexpansion hook, or the preexpansion hook failed.  Look in the
      password database. */
   dirname = (char *)NULL;
-#ifdef HAVE_GETPWNAM
+#if defined (HAVE_GETPWNAM)
   user_entry = getpwnam (username);
+#else
+  user_entry = 0;
+#endif
   if (user_entry == 0)
     {
       /* If the calling program has a special syntax for expanding tildes,
@@ -361,21 +397,21 @@ tilde_expand_word (filename)
          if (expansion)
            {
              dirname = glue_prefix_and_suffix (expansion, filename, user_len);
-             free (expansion);
+             xfree (expansion);
            }
        }
-      free (username);
       /* If we don't have a failure hook, or if the failure hook did not
         expand the tilde, return a copy of what we were passed. */
       if (dirname == 0)
        dirname = savestring (filename);
     }
+#if defined (HAVE_GETPWENT)
   else
-    {
-      free (username);
-      dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
-    }
+    dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
+#endif
 
+  xfree (username);
+#if defined (HAVE_GETPWENT)
   endpwent ();
 #endif
   return (dirname);
@@ -386,9 +422,7 @@ tilde_expand_word (filename)
 #undef NULL
 #include <stdio.h>
 
-main (argc, argv)
-     int argc;
-     char **argv;
+main (int argc, char **argv)
 {
   char *result, line[512];
   int done = 0;
@@ -416,11 +450,10 @@ main (argc, argv)
   exit (0);
 }
 
-static void memory_error_and_abort ();
+static void memory_error_and_abort (void);
 
 static void *
-xmalloc (bytes)
-     size_t bytes;
+xmalloc (size_t bytes)
 {
   void *temp = (char *)malloc (bytes);
 
@@ -430,9 +463,7 @@ xmalloc (bytes)
 }
 
 static void *
-xrealloc (pointer, bytes)
-     void *pointer;
-     int bytes;
+xrealloc (void *pointer, int bytes)
 {
   void *temp;
 
@@ -448,7 +479,7 @@ xrealloc (pointer, bytes)
 }
 
 static void
-memory_error_and_abort ()
+memory_error_and_abort (void)
 {
   fprintf (stderr, "readline: out of virtual memory\n");
   abort ();