/*
 * XREnvironImpl.c
 * created, February 9, 1989 8:31:34 pm PST
 * bj, October 27, 1989 5:36:45 pm PDT
 * eduardo, November 20, 1989 11:43:03 am PST
 * Willie-Sue Orr, January 19, 1993 12:15:06 pm PST
 */

#include <stdio.h>
#include <sys/types.h>

extern char **environ;
extern char *GC←malloc();
extern char *GC←realloc();

/* extern */ char **XR←environ;

extern char *XR←findenv(name, offset) register char *name; int *offset; {
  /*
   * Returns pointer to value associated with name, if any, else NULL.
   * Sets offset to be the offset of the name/value combination in the environmental array,
   * for use by setenv(3) and unsetenv(3).
   * Explicitly removes '=' in argument name.
   * - result is pointer into string in env, treat as readonly!
   */
  register int len;
  register char **p, *c;
  for ( c = name, len = 0; *c && *c != '='; ++c, ++len );
  for ( p = XR←environ; *p; ++p )
    if ( ! strncmp(*p, name, len) )
      if ( *(c = *p + len) == '=' ) { *offset = p - XR←environ; return(++c); }
  return(NULL);
  }
  
extern char *XR←getenv(name) char *name; {
  /*
   * Returns ptr to value associated with name, if any, else NULL
   * - result is pointer into string in env, treat as readonly!
   * - GC←malloc & copy would protect us from clients!
   */
  int offset;
  return(XR←findenv(name, &offset));
  }
  
extern void XR←install←XREnvironImpl() { /* PRE-start trap */
  }
  
extern void XR←run←XREnvironImpl() { /* start trap */
  /* little ditty to get it "out of the global frame" for threads*/
  XR←environ = environ;
  }
  
/* eof */