OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [branches/] [newlib/] [newlib/] [newlib/] [libc/] [stdlib/] [setenv.c] - Diff between revs 39 and 56

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 39 Rev 56
Line 24... Line 24...
 
 
#include <stddef.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
 
 
/* _findenv is defined in getenv.c.  */
extern void unsetenv_r _PARAMS ((struct _reent *, const char *));
 
 
extern char *_findenv _PARAMS ((const char *, int *));
 
 
 
/*
/*
 * setenv --
 * setenv --
 *      Set the value of the environmental variable "name" to be
 *      Set the value of the environmental variable "name" to be
 *      "value".  If rewrite is set, replace any current value.
 *      "value".  If rewrite is set, replace any current value.
Line 40... Line 38...
_DEFUN (setenv, (name, value, rewrite),
_DEFUN (setenv, (name, value, rewrite),
        _CONST char *name _AND
        _CONST char *name _AND
        _CONST char *value _AND
        _CONST char *value _AND
        int rewrite)
        int rewrite)
{
{
  extern char **environ;
  return _setenv_r (_REENT, name, value, rewrite);
  static int alloced;           /* if allocated space before */
 
  register char *C;
 
  int l_value, offset;
 
 
 
  if (*value == '=')            /* no `=' in value */
 
    ++value;
 
  l_value = strlen (value);
 
  if ((C = _findenv (name, &offset)))
 
    {                           /* find if already exists */
 
      if (!rewrite)
 
        return 0;
 
      if (strlen (C) >= l_value)
 
        {                       /* old larger; copy over */
 
          while (*C++ = *value++);
 
          return 0;
 
        }
 
    }
 
  else
 
    {                           /* create new slot */
 
      register int cnt;
 
      register char **P;
 
 
 
      for (P = environ, cnt = 0; *P; ++P, ++cnt);
 
      if (alloced)
 
        {                       /* just increase size */
 
          environ = (char **) realloc ((char *) environ,
 
                                       (size_t) (sizeof (char *) * (cnt + 2)));
 
          if (!environ)
 
            return -1;
 
        }
 
      else
 
        {                       /* get new space */
 
          alloced = 1;          /* copy old entries into it */
 
          P = (char **) malloc ((size_t) (sizeof (char *) * (cnt + 2)));
 
          if (!P)
 
            return (-1);
 
          bcopy ((char *) environ, (char *) P, cnt * sizeof (char *));
 
          environ = P;
 
        }
 
      environ[cnt + 1] = NULL;
 
      offset = cnt;
 
    }
 
  for (C = (char *) name; *C && *C != '='; ++C);        /* no `=' in name */
 
  if (!(environ[offset] =       /* name + `=' + value */
 
        malloc ((size_t) ((int) (C - name) + l_value + 2))))
 
    return -1;
 
  for (C = environ[offset]; (*C = *name++) && *C != '='; ++C);
 
  for (*C++ = '='; *C++ = *value++;);
 
  return 0;
 
}
}
 
 
/*
/*
 * unsetenv(name) --
 * unsetenv(name) --
 *      Delete environmental variable "name".
 *      Delete environmental variable "name".
 */
 */
void
void
_DEFUN (unsetenv, (name),
_DEFUN (unsetenv, (name),
        _CONST char *name)
        _CONST char *name)
{
{
  extern char **environ;
  unsetenv_r (_REENT, name);
  register char **P;
 
  int offset;
 
 
 
  while (_findenv (name, &offset))      /* if set multiple times */
 
    for (P = &environ[offset];; ++P)
 
      if (!(*P = *(P + 1)))
 
        break;
 
}
}
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.