diff options
Diffstat (limited to 'gnu')
-rw-r--r-- | gnu/egcs/libiberty/putenv.c | 68 | ||||
-rw-r--r-- | gnu/egcs/libiberty/setenv.c | 161 | ||||
-rw-r--r-- | gnu/egcs/libio/ChangeLog | 8 | ||||
-rw-r--r-- | gnu/egcs/libio/configure.in | 14 |
4 files changed, 238 insertions, 13 deletions
diff --git a/gnu/egcs/libiberty/putenv.c b/gnu/egcs/libiberty/putenv.c new file mode 100644 index 00000000000..9d5692222cf --- /dev/null +++ b/gnu/egcs/libiberty/putenv.c @@ -0,0 +1,68 @@ +/* Copyright (C) 1991, 1994, 1995, 1996 Free Software Foundation, Inc. + This file based on putenv.c in the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#if defined (_AIX) && !defined (__GNUC__) + #pragma alloca +#endif + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include "ansidecl.h" + +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif +#if HAVE_STRING_H +# include <string.h> +#endif + +#ifdef HAVE_ALLOCA_H +# include <alloca.h> +#else +# ifndef alloca +# ifdef __GNUC__ +# define alloca __builtin_alloca +# else +extern char *alloca (); +# endif /* __GNUC__ */ +# endif /* alloca */ +#endif /* HAVE_ALLOCA_H */ + +/* Below this point, it's verbatim code from the glibc-2.0 implementation */ + + +/* Put STRING, which is of the form "NAME=VALUE", in the environment. */ +int +putenv (string) + const char *string; +{ + const char *const name_end = strchr (string, '='); + + if (name_end) + { + char *name = (char *) alloca (name_end - string + 1); + memcpy (name, string, name_end - string); + name[name_end - string] = '\0'; + return setenv (name, name_end + 1, 1); + } + + unsetenv (string); + return 0; +} diff --git a/gnu/egcs/libiberty/setenv.c b/gnu/egcs/libiberty/setenv.c new file mode 100644 index 00000000000..8a039d18fa8 --- /dev/null +++ b/gnu/egcs/libiberty/setenv.c @@ -0,0 +1,161 @@ +/* Copyright (C) 1992, 1995, 1996, 1997 Free Software Foundation, Inc. + This file based on setenv.c in the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include "ansidecl.h" + +#include <errno.h> +#if !defined(errno) && !defined(HAVE_ERRNO_DECL) +extern int errno; +#endif +#define __set_errno(ev) ((errno) = (ev)) + +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif +#if HAVE_STRING_H +# include <string.h> +#endif +#if HAVE_UNISTD_H +# include <unistd.h> +#endif + +#define __environ environ +#ifndef HAVE_ENVIRON_DECL +extern char **environ; +#endif + +/* LOCK and UNLOCK are defined as no-ops. This makes the libiberty + * implementation MT-Unsafe. */ +#define LOCK +#define UNLOCK + +/* Below this point, it's verbatim code from the glibc-2.0 implementation */ + +/* If this variable is not a null pointer we allocated the current + environment. */ +static char **last_environ; + + +int +setenv (name, value, replace) + const char *name; + const char *value; + int replace; +{ + register char **ep; + register size_t size; + const size_t namelen = strlen (name); + const size_t vallen = strlen (value) + 1; + + LOCK; + + size = 0; + if (__environ != NULL) + for (ep = __environ; *ep != NULL; ++ep) + if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=') + break; + else + ++size; + + if (__environ == NULL || *ep == NULL) + { + char **new_environ; + if (__environ == last_environ && __environ != NULL) + /* We allocated this space; we can extend it. */ + new_environ = (char **) realloc (last_environ, + (size + 2) * sizeof (char *)); + else + new_environ = (char **) malloc ((size + 2) * sizeof (char *)); + + if (new_environ == NULL) + { + UNLOCK; + return -1; + } + + new_environ[size] = malloc (namelen + 1 + vallen); + if (new_environ[size] == NULL) + { + free ((char *) new_environ); + __set_errno (ENOMEM); + UNLOCK; + return -1; + } + + if (__environ != last_environ) + memcpy ((char *) new_environ, (char *) __environ, + size * sizeof (char *)); + + memcpy (new_environ[size], name, namelen); + new_environ[size][namelen] = '='; + memcpy (&new_environ[size][namelen + 1], value, vallen); + + new_environ[size + 1] = NULL; + + last_environ = __environ = new_environ; + } + else if (replace) + { + size_t len = strlen (*ep); + if (len + 1 < namelen + 1 + vallen) + { + /* The existing string is too short; malloc a new one. */ + char *new = malloc (namelen + 1 + vallen); + if (new == NULL) + { + UNLOCK; + return -1; + } + *ep = new; + } + memcpy (*ep, name, namelen); + (*ep)[namelen] = '='; + memcpy (&(*ep)[namelen + 1], value, vallen); + } + + UNLOCK; + + return 0; +} + +void +unsetenv (name) + const char *name; +{ + const size_t len = strlen (name); + char **ep; + + LOCK; + + for (ep = __environ; *ep; ++ep) + if (!strncmp (*ep, name, len) && (*ep)[len] == '=') + { + /* Found it. Remove this pointer by moving later ones back. */ + char **dp = ep; + do + dp[0] = dp[1]; + while (*dp++); + /* Continue the loop in case NAME appears again. */ + } + + UNLOCK; +} diff --git a/gnu/egcs/libio/ChangeLog b/gnu/egcs/libio/ChangeLog index aa546a46c4c..e7b75a1861f 100644 --- a/gnu/egcs/libio/ChangeLog +++ b/gnu/egcs/libio/ChangeLog @@ -1,3 +1,11 @@ +1999-05-20 Angela Marie Thomas <angela@cygnus.com> + + * configure.in: Test for ${compiler_name}.exe as well. + +1999-05-17 Mark Kettenis <kettenis@gnu.org> + + * libioP.h: Only include libc-lock.h if _IO_MTSAFE_IO is defined. + 1999-05-12 Jason Merrill <jason@yorick.cygnus.com> * configure.in (compiler_name): Don't do the skip-this-dir thing diff --git a/gnu/egcs/libio/configure.in b/gnu/egcs/libio/configure.in index 084e901aabf..9139a1d6a74 100644 --- a/gnu/egcs/libio/configure.in +++ b/gnu/egcs/libio/configure.in @@ -2,18 +2,6 @@ # necessary for a configure script to process the program in # this directory. For more information, look at ../configure. -# find a possible extension of the just-built C++ compiler. Note that this -# is not the only choice, taking into cross and canadian cross into -# account, and we need to search for with and without the extension. -case "${host_alias}" in -*cygwin* | *mingw32*) - EXEEXT=.exe - ;; -*) - EXEEXT= - ;; -esac - # If the language specific compiler does not exist, but the "gcc" directory # does, we do not build anything. Note, $r is set by the top-level Makefile. # Note that when we look for the compiler, we search both with and without @@ -25,7 +13,7 @@ rm -f skip-this-dir if test -n "$r" && [ -z "$norecursion" ] ; then if test -d "$r"/gcc; then if test -f "$r"/gcc/$compiler_name \ - || test -f "$r"/gcc/$compiler_name$EXEEXT; then + || test -f "$r"/gcc/$compiler_name.exe; then true else echo "rm -f multilib.out" > skip-this-dir |