(root)/
gcc-13.2.0/
libiberty/
putenv.c
       1  /* Copyright (C) 1991-2023 Free Software Foundation, Inc.
       2     This file based on putenv.c in the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Library General Public License as
       6     published by the Free Software Foundation; either version 2 of the
       7     License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Library General Public License for more details.
      13  
      14     You should have received a copy of the GNU Library General Public
      15     License along with the GNU C Library; see the file COPYING.LIB.  If not,
      16     write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
      17     Boston, MA 02110-1301, USA.  */
      18  
      19  /*
      20  
      21  @deftypefn Supplemental int putenv (const char *@var{string})
      22  
      23  Uses @code{setenv} or @code{unsetenv} to put @var{string} into
      24  the environment or remove it.  If @var{string} is of the form
      25  @samp{name=value} the string is added; if no @samp{=} is present the
      26  name is unset/removed.
      27  
      28  @end deftypefn
      29  
      30  */
      31  
      32  #if defined (_AIX) && !defined (__GNUC__)
      33   #pragma alloca
      34  #endif
      35  
      36  #if HAVE_CONFIG_H
      37  # include <config.h>
      38  #endif
      39  
      40  #include "ansidecl.h"
      41  
      42  #define putenv libiberty_putenv
      43  
      44  #if HAVE_STDLIB_H
      45  # include <stdlib.h>
      46  #endif
      47  #if HAVE_STRING_H
      48  # include <string.h>
      49  #endif
      50  
      51  #ifdef HAVE_ALLOCA_H
      52  # include <alloca.h>
      53  #else
      54  # ifndef alloca
      55  #  ifdef __GNUC__
      56  #   define alloca __builtin_alloca
      57  #  else
      58  extern char *alloca ();
      59  #  endif /* __GNUC__ */
      60  # endif /* alloca */
      61  #endif /* HAVE_ALLOCA_H */
      62  
      63  #undef putenv
      64  
      65  /* Below this point, it's verbatim code from the glibc-2.0 implementation */
      66  
      67  
      68  /* Put STRING, which is of the form "NAME=VALUE", in the environment.  */
      69  int
      70  putenv (const char *string)
      71  {
      72    const char *const name_end = strchr (string, '=');
      73  
      74    if (name_end)
      75      {
      76        char *name = (char *) alloca (name_end - string + 1);
      77        memcpy (name, string, name_end - string);
      78        name[name_end - string] = '\0';
      79        return setenv (name, name_end + 1, 1);
      80      }
      81  
      82    unsetenv (string);
      83    return 0;
      84  }