1 /*
2  *      EnvInit (char **env)
3  *              Initialixe Env packadge by environment vector.
4  *
5  *      char *EnvGet (char *name)
6  *              Get variable from environment.
7  *
8  *      EnvPut (char *name, char *value)
9  *              Change value of variable.
10  *
11  *      char **EnvVector
12  *              Current environment vector.
13  */
14 #include <stdlib.h>
15 #include <string.h>
16 #include "deco.h"
17 
18 #define QUANT 10
19 
20 char **EnvVector;
21 
22 static int nenv;
23 static int last;
24 
25 static char *nvmatch (char *s1, char *s2);
26 static char *findvar (char *name, char ***ptr);
27 
EnvInit(char ** env)28 void EnvInit (char **env)
29 {
30 	register char **p;
31 	register i;
32 
33 	if (EnvVector) {
34 		for (p=EnvVector; *p; ++p)
35 			free (*p);
36 		free (EnvVector);
37 		EnvVector = 0;
38 		nenv = 0;
39 		last = nenv = 0;
40 	}
41 	if (! env)
42 		return;
43 	for (i=0, p=env; *p; ++p, ++i) {
44 		mcheck (EnvVector, char**, nenv, QUANT, i);
45 		EnvVector [i] = malloc (strlen (*p) + 1);
46 		strcpy (EnvVector [i], *p);
47 	}
48 	mcheck (EnvVector, char **, nenv, QUANT, i);
49 	last = i;
50 	EnvVector [last] = 0;
51 }
52 
EnvPut(char * name,char * value)53 void EnvPut (char *name, char *value)
54 {
55 	register char *v;
56 	char **p;
57 
58 	if (! name)
59 		return;
60 	if (! value)
61 		value = "";
62 	v = findvar (name, &p);
63 	if (v)
64 		free (*p);
65 	else {
66 		p = EnvVector + last;
67 		++last;
68 		mcheck (EnvVector, char **, nenv, QUANT, last);
69 		EnvVector [last] = 0;
70 	}
71 	*p = malloc (strlen (name) + 1 + strlen (value) + 1);
72 	strcpy (*p, name);
73 	strcat (*p, "=");
74 	strcat (*p, value);
75 }
76 
EnvDelete(char * name)77 void EnvDelete (char *name)
78 {
79 	register char *v;
80 	char **p;
81 
82 	if (! name)
83 		return;
84 	v = findvar (name, &p);
85 	if (! v)
86 		return;
87 	free (*p);
88 	for (++p; *p; ++p)
89 		*(p-1) = *p;
90 	EnvVector [--last] = 0;
91 }
92 
EnvGet(char * name)93 char *EnvGet (char *name)
94 {
95 	char **p;
96 
97 	return (findvar (name, &p));
98 }
99 
findvar(char * name,char *** ptr)100 static char *findvar (char *name, char ***ptr)
101 {
102 	register char *v, **p;
103 
104 	p = EnvVector;
105 	if (! p)
106 		return (0);
107 	for (; *p; ++p)
108 		if ((v = nvmatch (name, *p))) {
109 			*ptr = p;
110 			return (v);
111 		}
112 	return (0);
113 }
114 
115 /*
116  *	s1 is either name, or name=value
117  *	s2 is name=value
118  *	if names match, return value of s2, else NULL
119  *	used for environment searching: see getenv
120  */
nvmatch(char * s1,char * s2)121 static char *nvmatch (char *s1, char *s2)
122 {
123 	while (*s1 == *s2++)
124 		if (*s1++ == '=')
125 			return (s2);
126 	if (*s1 == '\0' && *(s2-1) == '=')
127 		return (s2);
128 	return (0);
129 }
130