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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc2/] [newlib/] [libc/] [stdlib/] [getenv_r.c] - Diff between revs 207 and 520

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 520
/*
/*
FUNCTION
FUNCTION
<<_getenv_r>>---look up environment variable
<<_getenv_r>>---look up environment variable
 
 
INDEX
INDEX
        _getenv_r
        _getenv_r
INDEX
INDEX
        environ
        environ
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <stdlib.h>
        #include <stdlib.h>
        char *_getenv_r(struct _reent *<[reent_ptr]>, const char *<[name]>);
        char *_getenv_r(struct _reent *<[reent_ptr]>, const char *<[name]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <stdlib.h>
        #include <stdlib.h>
        char *_getenv_r(<[reent_ptr]>, <[name]>)
        char *_getenv_r(<[reent_ptr]>, <[name]>)
        struct _reent *<[reent_ptr]>;
        struct _reent *<[reent_ptr]>;
        char *<[name]>;
        char *<[name]>;
 
 
DESCRIPTION
DESCRIPTION
<<_getenv_r>> searches the list of environment variable names and values
<<_getenv_r>> searches the list of environment variable names and values
(using the global pointer ``<<char **environ>>'') for a variable whose
(using the global pointer ``<<char **environ>>'') for a variable whose
name matches the string at <[name]>.  If a variable name matches,
name matches the string at <[name]>.  If a variable name matches,
<<_getenv_r>> returns a pointer to the associated value.
<<_getenv_r>> returns a pointer to the associated value.
 
 
RETURNS
RETURNS
A pointer to the (string) value of the environment variable, or
A pointer to the (string) value of the environment variable, or
<<NULL>> if there is no such environment variable.
<<NULL>> if there is no such environment variable.
 
 
PORTABILITY
PORTABILITY
<<_getenv_r>> is not ANSI; the rules for properly forming names of environment
<<_getenv_r>> is not ANSI; the rules for properly forming names of environment
variables vary from one system to another.  This implementation does not
variables vary from one system to another.  This implementation does not
permit '=' to be in identifiers.
permit '=' to be in identifiers.
 
 
<<_getenv_r>> requires a global pointer <<environ>>.
<<_getenv_r>> requires a global pointer <<environ>>.
*/
*/
 
 
/* This file may have been modified by DJ Delorie (Jan 1991).  If so,
/* This file may have been modified by DJ Delorie (Jan 1991).  If so,
** these modifications are Copyright (C) 1991 DJ Delorie.
** these modifications are Copyright (C) 1991 DJ Delorie.
*/
*/
 
 
/*
/*
 * Copyright (c) 1987 Regents of the University of California.
 * Copyright (c) 1987 Regents of the University of California.
 * All rights reserved.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms are permitted
 * Redistribution and use in source and binary forms are permitted
 * provided that: (1) source distributions retain this entire copyright
 * provided that: (1) source distributions retain this entire copyright
 * notice and comment, and (2) distributions including binaries display
 * notice and comment, and (2) distributions including binaries display
 * the following acknowledgement:  ``This product includes software
 * the following acknowledgement:  ``This product includes software
 * developed by the University of California, Berkeley and its contributors''
 * developed by the University of California, Berkeley and its contributors''
 * in the documentation or other materials provided with the distribution
 * in the documentation or other materials provided with the distribution
 * and in all advertising materials mentioning features or use of this
 * and in all advertising materials mentioning features or use of this
 * software. Neither the name of the University nor the names of its
 * software. Neither the name of the University nor the names of its
 * contributors may be used to endorse or promote products derived
 * contributors may be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */
 */
 
 
#include <stdlib.h>
#include <stdlib.h>
#include <stddef.h>
#include <stddef.h>
#include <string.h>
#include <string.h>
#include "envlock.h"
#include "envlock.h"
 
 
extern char **environ;
extern char **environ;
 
 
/* Only deal with a pointer to environ, to work around subtle bugs with shared
/* Only deal with a pointer to environ, to work around subtle bugs with shared
   libraries and/or small data systems where the user declares his own
   libraries and/or small data systems where the user declares his own
   'environ'.  */
   'environ'.  */
static char ***p_environ = &environ;
static char ***p_environ = &environ;
 
 
/*
/*
 * _findenv --
 * _findenv --
 *      Returns pointer to value associated with name, if any, else NULL.
 *      Returns pointer to value associated with name, if any, else NULL.
 *      Sets offset to be the offset of the name/value combination in the
 *      Sets offset to be the offset of the name/value combination in the
 *      environmental array, for use by setenv(3) and unsetenv(3).
 *      environmental array, for use by setenv(3) and unsetenv(3).
 *
 *
 *      This routine *should* be a static; don't use it.
 *      This routine *should* be a static; don't use it.
 */
 */
 
 
char *
char *
_DEFUN (_findenv_r, (reent_ptr, name, offset),
_DEFUN (_findenv_r, (reent_ptr, name, offset),
        struct _reent *reent_ptr   _AND
        struct _reent *reent_ptr   _AND
        register _CONST char *name _AND
        register _CONST char *name _AND
        int *offset)
        int *offset)
{
{
  register int len;
  register int len;
  register char **p;
  register char **p;
  _CONST char *c;
  _CONST char *c;
 
 
  ENV_LOCK;
  ENV_LOCK;
 
 
  /* In some embedded systems, this does not get set.  This protects
  /* In some embedded systems, this does not get set.  This protects
     newlib from dereferencing a bad pointer.  */
     newlib from dereferencing a bad pointer.  */
  if (!*p_environ)
  if (!*p_environ)
    {
    {
      ENV_UNLOCK;
      ENV_UNLOCK;
      return NULL;
      return NULL;
    }
    }
 
 
  c = name;
  c = name;
  while (*c && *c != '=')  c++;
  while (*c && *c != '=')  c++;
 
 
  /* Identifiers may not contain an '=', so cannot match if does */
  /* Identifiers may not contain an '=', so cannot match if does */
  if(*c != '=')
  if(*c != '=')
    {
    {
    len = c - name;
    len = c - name;
    for (p = *p_environ; *p; ++p)
    for (p = *p_environ; *p; ++p)
      if (!strncmp (*p, name, len))
      if (!strncmp (*p, name, len))
        if (*(c = *p + len) == '=')
        if (*(c = *p + len) == '=')
        {
        {
          *offset = p - *p_environ;
          *offset = p - *p_environ;
          ENV_UNLOCK;
          ENV_UNLOCK;
          return (char *) (++c);
          return (char *) (++c);
        }
        }
    }
    }
  ENV_UNLOCK;
  ENV_UNLOCK;
  return NULL;
  return NULL;
}
}
 
 
/*
/*
 * _getenv_r --
 * _getenv_r --
 *      Returns ptr to value associated with name, if any, else NULL.
 *      Returns ptr to value associated with name, if any, else NULL.
 */
 */
 
 
char *
char *
_DEFUN (_getenv_r, (reent_ptr, name),
_DEFUN (_getenv_r, (reent_ptr, name),
        struct _reent *reent_ptr _AND
        struct _reent *reent_ptr _AND
        _CONST char *name)
        _CONST char *name)
{
{
  int offset;
  int offset;
  char *_findenv_r ();
  char *_findenv_r ();
 
 
  return _findenv_r (reent_ptr, name, &offset);
  return _findenv_r (reent_ptr, name, &offset);
}
}
 
 

powered by: WebSVN 2.1.0

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