LibC: Implement `clearenv`

This is GNU extension but seems nice to have :D
This commit is contained in:
Bananymous 2025-05-21 18:11:22 +03:00
parent 7eade002a7
commit 8aa4e4ff1e
2 changed files with 31 additions and 2 deletions

View File

@ -19,7 +19,7 @@ static int malloc_environ()
ASSERT(!s_environ_malloced);
size_t environ_count = 0;
while (environ[environ_count])
while (environ && environ[environ_count])
environ_count++;
const size_t bitmap_size = (environ_count + 7) / 8;
@ -111,12 +111,37 @@ static int putenv_impl(char* string, bool malloced)
return 0;
}
int clearenv(void)
{
if (s_environ_malloced)
{
ASSERT(environ);
for (size_t i = 0; environ[i]; i++)
{
const size_t byte = i / 8;
const size_t mask = 1 << (i % 8);
if (s_environ_bitmap[byte] & mask)
free(environ[i]);
}
free(s_environ_bitmap);
free(environ);
}
environ = nullptr;
s_environ_count = 0;
s_environ_bitmap = nullptr;
s_environ_malloced = false;
return 0;
}
char* getenv(const char* name)
{
if (environ == nullptr)
return nullptr;
const size_t namelen = strlen(name);
for (int i = 0; environ[i]; i++)
for (size_t i = 0; environ[i]; i++)
if (strncmp(name, environ[i], namelen) == 0)
if (environ[i][namelen] == '=')
return environ[i] + namelen + 1;
@ -154,6 +179,9 @@ int unsetenv(const char* name)
return -1;
}
if (environ == nullptr)
return 0;
const size_t namelen = strlen(name);
size_t i = 0;

View File

@ -51,6 +51,7 @@ long atol(const char* str);
long long atoll(const char* str);
void* bsearch(const void* key, const void* base, size_t nel, size_t width, int (*compar)(const void*, const void*));
void* calloc(size_t nelem, size_t elsize);
int clearenv(void);
div_t div(int numer, int denom);
double drand48(void);
double erand48(unsigned short xsubi[3]);