80 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * (c) copyright 1989 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | |
|  * See the copyright notice in the ACK home directory, in the file "Copyright".
 | |
|  */
 | |
| /* $Header$ */
 | |
| 
 | |
| #include	<stdlib.h>
 | |
| #include	<string.h>
 | |
| 
 | |
| #define	ENTRY_INC	10
 | |
| #define	rounded(x)	(((x / ENTRY_INC) + 1) * ENTRY_INC)
 | |
| 
 | |
| extern _CONST char ***_penviron;
 | |
| 
 | |
| int
 | |
| putenv(name)
 | |
| char *name;
 | |
| {
 | |
| 	register _CONST char **v = *_penviron;
 | |
| 	register char *r;
 | |
| 	static int size = 0;
 | |
| 	/* When size != 0, it contains the number of entries in the
 | |
| 	 * table (including the final NULL pointer). This means that the
 | |
| 	 * last non-null entry  is environ[size - 2].
 | |
| 	 */
 | |
| 
 | |
| 	if (!name) return 0;
 | |
| 	if (*_penviron == NULL) return 1;
 | |
| 	if ((r = strchr(name, '='))) {
 | |
| 		register _CONST char *p, *q;
 | |
| 
 | |
| 		*r = '\0';
 | |
| 
 | |
| 		if (v != NULL) {
 | |
| 			while ((p = *v) != NULL) {
 | |
| 				q = name;
 | |
| 				while (*q && (*q++ == *p++))
 | |
| 					/* EMPTY */ ;
 | |
| 				if (*q || (*p != '=')) {
 | |
| 					v++;
 | |
| 				} else {
 | |
| 					/* The name was already in the
 | |
| 					 * environment.
 | |
| 					 */
 | |
| 					*r = '=';
 | |
| 					*v = name;
 | |
| 					return 0;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		*r = '=';
 | |
| 		v = *_penviron;
 | |
| 	}
 | |
| 
 | |
| 	if (!size) {
 | |
| 		register _CONST char **p;
 | |
| 		register int i = 0;
 | |
| 
 | |
| 		if (v)
 | |
| 			do {
 | |
| 				i++;
 | |
| 			} while (*v++);
 | |
| 		if (!(v = malloc(rounded(i) * sizeof(char **))))
 | |
| 			return 1;
 | |
| 		size = i;
 | |
| 		p = *_penviron;
 | |
| 		*_penviron = v;
 | |
| 		while ((*v++ = *p++));		/* copy the environment */
 | |
| 		v = *_penviron;
 | |
| 	} else if (!(size % ENTRY_INC)) {
 | |
| 		if (!(v = realloc(*_penviron, rounded(size) * sizeof(char **))))
 | |
| 			return 1;
 | |
| 		*_penviron = v;
 | |
| 	}
 | |
| 	v[size - 1] = name;
 | |
| 	v[size] = NULL;
 | |
| 	size++;
 | |
| 	return 0;
 | |
| }
 | 
