home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) 1992 The Geometry Center; University of Minnesota
- 1300 South Second Street; Minneapolis, MN 55454, USA;
-
- This file is part of geomview/OOGL. geomview/OOGL is free software;
- you can redistribute it and/or modify it only under the terms given in
- the file COPYING, which you should have received along with this file.
- This and other related software may be obtained via anonymous ftp from
- geom.umn.edu; email: software@geom.umn.edu. */
-
- /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */
-
-
- /*
- * Routines for porting to brain-damaged operating systems.
- * Contents:
- * strdup(str)
- * putenv(name
- */
-
- #ifdef NeXT
- #include <stdlib.h>
- #include <string.h>
-
- char *
- strdup( char *str )
- {
- char *s;
- int len;
-
- if(str == NULL)
- return NULL;
- len = strlen(str);
- s = malloc(len+1);
- memcpy(s, str, len+1);
- return s;
- }
-
-
- /*
- * Copyright (c) 1987 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
- #if defined(LIBC_SCCS) && !defined(lint)
- static char sccsid[] = "@(#)getenv.c 5.5 (Berkeley) 6/27/88";
- #endif /* LIBC_SCCS and not lint */
-
- #include <stdio.h>
-
- /*
- * _findenv --
- * 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)/putenv(3) and unsetenv(3).
- * Explicitly removes '=' in argument name.
- */
- static char *
- _findenv(name, offset)
- register char *name;
- int *offset;
- {
- extern char **environ;
- register int len;
- register char **P, *C;
-
- for (C = name, len = 0; *C && *C != '='; ++C, ++len);
- for (P = environ; *P; ++P)
- if (!strncmp(*P, name, len))
- if (*(C = *P + len) == '=') {
- *offset = P - environ;
- return(++C);
- }
- return(NULL);
- }
- #if defined(LIBC_SCCS) && !defined(lint)
- /* static char sccsid[] = "@(#)setenv.c 5.2 (Berkeley) 6/27/88"; */
- #endif /* LIBC_SCCS and not lint */
-
- #include <sys/types.h>
-
- /*
- * putenv --
- * Put a string of the form "name=value" into the environment.
- * [Adapted from BSD routine setenv(name, value, rewrite).]
- */
- putenv(register char *name)
- {
- extern char **environ;
- static int alloced; /* if allocated space before */
- register char *value;
- register char *C;
- int l_value, offset;
-
- value = strchr(name, '=');
- value = value ? value+1 : name;
- l_value = strlen(value);
- if ((C = _findenv(name, &offset))) { /* find if already exists */
- 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,
- (u_int)(sizeof(char *) * (cnt + 2)));
- if (!environ)
- return(-1);
- }
- else { /* get new space */
- alloced = 1; /* copy old entries into it */
- P = (char **)malloc((u_int)(sizeof(char *) *
- (cnt + 2)));
- if (!P)
- return(-1);
- bcopy(environ, P, cnt * sizeof(char *));
- environ = P;
- }
- environ[cnt + 1] = NULL;
- offset = cnt;
- }
- for (C = name; *C && *C != '='; ++C); /* no `=' in name */
- if (!(environ[offset] = /* name + `=' + value */
- malloc((u_int)((int)(C - name) + l_value + 2))))
- return(-1);
- for (C = environ[offset]; (*C = *name++) && *C != '='; ++C);
- for (*C++ = '='; *C++ = *value++;);
- return(0);
- }
-
- /*
- * unputenv(name) --
- * Delete environmental variable "name".
- */
- void
- unputenv(name)
- char *name;
- {
- extern char **environ;
- register char **P;
- int offset;
-
- while (_findenv(name, &offset)) /* if set multiple times */
- for (P = &environ[offset];; ++P)
- if (!(*P = *(P + 1)))
- break;
- }
-
- #endif /*NeXT*/
-