aboutsummaryrefslogtreecommitdiff
path: root/lib/env/env.c
blob: a458377d5d60f0f3c08956fb95d195b5dc1739b6 (plain)
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
#include "env.h"

#include "../malloc/malloc.h"
#include "../cstr/cstr.h"

char **envp;
u64 envsize = 0;
#define ENVSIZEINC 16

char **__getenvpair(const char *key);
u8 __match_env_key(const char *p, const char *key);


const char *getenv(const char *key)
{
	char **p = __getenvpair(key);
	const char *value;

	if (p == 0)
		return "";

	value = *p;

	while (*value != '=') ++value;
	return ++value;
}

void setenv(const char *key, const char *value)
{
	char **p = __getenvpair(key);

	if (p == 0) {
		p = envp;

		while (*p) ++p;

		if (p - envp >= envsize) {
			if (envsize == 0) {
				for (; *(envp + envsize); ++envsize);
				char **nenvp = malloc(sizeof(char *) * (envsize + ENVSIZEINC));
				p = nenvp;
				while (p < nenvp + envsize + ENVSIZEINC) *(p++) = 0;
				p = nenvp;
				while (*envp) *(p++) = *(envp++);
				envp = nenvp;
			} else {
				envp = realloc(envp, envsize + ENVSIZEINC);
			}

			p = envp + envsize;
			envsize += ENVSIZEINC;
		}
	}

	*p = malloc((cstr_length(key) + cstr_length(value)) + 2);
	char *i = *p;

	while (*key) *(i++) = *(key++);
	*(i++) = '=';
	while (*value) *(i++) = *(value++);
	*i = 0;
}


char **__getenvpair(const char *key)
{
	char **p = envp;

	while (*p) {
		if (__match_env_key(*p, key)) {
			return p;
		}

		++p;
	}

	return 0;
}


const char **getenvp()
{
	return (const char**)envp;
}


u8 __match_env_key(const char *p, const char *key)
{
	while (*key && *p) {

		if (*key != *p)
			return 0;

		++p;
		++key;
	}

	if (*p != '=')
		return 0;

	return 1;
}

void init_env(int argc, const char **argv, char **envp__)
{
	envp = envp__;
}

#ifdef ENV_UNIT_TEST

#include "../io/io.h"

int main(int argc, const char **argv)
{
	wstdf("TEST: %s\n", getenv("TEST"));
	setenv("TEST", "Hello, World!");
	wstdf("TEST: %s\n", getenv("TEST"));
}

#endif