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