core: Add setenv.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 7 Apr 2018 07:21:51 +0000 (09:21 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 7 Apr 2018 07:21:51 +0000 (09:21 +0200)
* lib/libc.c (setenv): New function.
* include/stdlib.h (setenv): Declare it.
* scaffold/tests/61-array.c (test): Test it.

include/stdlib.h
lib/libc.c
scaffold/tests/61-array.c

index 651fb0eeab32e6998f21485e7ad9fb95222e5323..3bf99a5331faeda032045ecbe611428f600a6fdb 100644 (file)
@@ -39,6 +39,7 @@ void * calloc (size_t nmemb, size_t size);
 void exit (int);
 void free (void *ptr);
 char* getenv (char const* s);
+int settenv (char const* s, char const* v, int overwrite_p);
 void *malloc (size_t);
 void qsort (void *base, size_t nmemb, size_t size, int (*compar)(void const *, void const *));
 void *realloc (void *p, size_t size);
index 384af166c0d380799a59503b3385a4ed3c083353..836800ca6f988fc1610c89856c553b9d87935c8a 100644 (file)
@@ -320,6 +320,29 @@ getenv (char const* s)
   return 0;
 }
 
+int
+setenv (char const* s, char const* v, int overwrite_p)
+{
+  char **p = g_environment;
+  int length = strlen (s);
+  while (*p)
+    {
+      if (!strncmp (s, *p, length) && *(*p + length) == '=')
+        break;
+      p++;
+    }
+  char *entry = malloc (length + strlen (v) + 2);
+  int end_p = *p == 0;
+  *p = entry;
+  strcpy (entry, s);
+  strcpy (entry + length, "=");
+  strcpy (entry + length + 1, v);
+  *(entry + length + strlen (v) + 2) = 0;
+  if (end_p)
+    *++p = 0;
+  return 0;
+}
+
 int
 vprintf (char const* format, va_list ap)
 {
index 0239f02dd1e8de2a04471b5f744c5d08b687abde..376a6a4199ad091522dd5e39c7b6832322a97333 100644 (file)
@@ -46,10 +46,10 @@ test (char **e)
   puts ("]\n");
 
   puts ("env [0] == \"foo\"\n");
-  if (strcmp (env[0], "foo")) return 1;
+  if (strcmp (env[0], "foo")) return 2;
 
   puts ("env [1] == \"bar\"\n");
-  if (strcmp (env[1], "bar")) return 1;
+  if (strcmp (env[1], "bar")) return 3;
 
   puts ("t: **p in *env[]\n");
 
@@ -68,27 +68,33 @@ test (char **e)
 
   pp = env;
   puts ("t: *pp++ == \"foo\"\n");
-  if (strcmp (*pp++, "foo")) return 1;
+  if (strcmp (*pp++, "foo")) return 4;
 
   puts ("t: *pp++ == \"bar\"\n");
-  if (strcmp (*pp++, "bar")) return 1;
+  if (strcmp (*pp++, "bar")) return 5;
 
   char *buf = "hello";
   puts ("t: buf[0]\n");
-  if (buf[0] != 'h') return 1;
+  if (buf[0] != 'h') return 6;
 
   puts ("t: buf + 1\n");
-  if (*(buf+1) != 'e') return 1;
+  if (*(buf+1) != 'e') return 7;
 
   char **p = &buf;
   puts ("t: **p\n");
-  if (**p != 'h') return 1;
+  if (**p != 'h') return 8;
 
   puts ("t: *(p + 1)\n");
-  if (*(*p + 1) != 'e') return 1;
+  if (*(*p + 1) != 'e') return 9;
 
   puts ("t: getenv ()");
-  if (!getenv ("PATH")) return 1;
+  if (!getenv ("PATH")) return 10;
+
+  puts ("t: setenv ()");
+  if (setenv ("61-array", "yes", 1)) return 11;
+
+  puts ("t: getenv2 ()");
+  if (strcmp (getenv ("61-array"), "yes")) return 12;
 
   return 0;
 }