#ifndef	lint
static char sccsid[] = "@(#)nut_getenv.c 1.6 89/08/22";
#endif


/* REMIND */
/*
 * These routines are from libc/gen/common/getenv.c
 */ 
#ifndef NULL
#define NULL    0
#endif  !NULL
extern char **environ;
extern char *strcpy();
extern char *strcat();
static char *nvmatch();

#ifndef	WIRETAP
/* 
 * Get environment from Nut if possible, otherwise NULL.
 */ 
char *
nut_getenv(name)
register char *name;
{
    register char *v, **p=environ;

    if(p == NULL)
        return(NULL);
    while(*p != NULL)
        if((v = nvmatch(name, *p++)) != NULL) {
            return(v);
        }

    return(NULL);
}  
   
/* 
 * s1 is either name, or name=value
 * s2 is name=value
 * if names match, return value of s2, else NULL
 * used for environment searching: see getenv
 */
static char *
nvmatch(s1, s2)
    register char *s1, *s2;
{
    while(*s1 == *s2++)
        if(*s1++ == '=')
            return(s2);
    if(*s1 == '\0' && *(s2-1) == '=')
        return(s2);
    return(NULL);
}
#endif	/*WIRETAP*/
/* REMIND */
/*
 * Copyright (c) 1983 by Sun Microsystems, Inc.
 */

/*
 * Implement setenv and unsetenv
 */

extern	char **environ, *calloc();

static char **
blkend(up)
	register char **up;
{

	while (*up)
		up++;
	return (up);
}
 
static
blklen(av)
	register char **av;
{
	register int i = 0;

	while (*av++)
		i++;
	return (i);
}

static char **
blkcpy(oav, bv)
	char **oav;
	register char **bv;
{
	register char **av = oav;

	while (*av++ = *bv++)
		continue;
	return (oav);
}

static char **
blkcat(up, vp)
	char **up, **vp;
{
	(void) blkcpy(blkend(up), vp);
	return (up);
}

static
blkfree(av0)
	char **av0;
{
	register char **av = av0;

	while (*av)
		xfree(*av++);
	xfree((char *)av0);
}

static char *
strspl(cp, dp)
	register char *cp, *dp;
{
	register char *ep = calloc((unsigned) 1,
				(unsigned)(strlen(cp) + strlen(dp) + 1));
	(void) strcpy(ep, cp);
	(void) strcat(ep, dp);
	return (ep);
}

static char **
blkspl(up, vp)
	register char **up, **vp;
{
	register char **wp = (char **) calloc(
				(unsigned)(blklen(up) + blklen(vp) + 1),
				(unsigned)(sizeof (char **)));

	(void) blkcpy(wp, up);
	return (blkcat(wp, vp));
}

static
xfree(cp)
	char *cp;
{
	extern end;

	if (cp >= (char *) &end && cp < (char *) &cp)
		free(cp);
}

setenv(name, value)
	char *name;
	char *value;
{
	register char **ep = environ;
	register char *cp, *dp;
	char *blk[2], **oep = ep;

	for (; *ep; ep++) {
		for (cp = name, dp = *ep; *cp && *cp == *dp; cp++, dp++)
			continue;
		if (*cp != 0 || *dp != '=')
			continue;
		cp = strspl("=", value);
		xfree(*ep);
		*ep = strspl(name, cp);
		xfree(cp);
		return;
	}
	blk[0] = strspl(name, "="); blk[1] = 0;
	environ = blkspl(environ, blk);
	xfree((char *)oep);
	setenv(name, value);
}

