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