diff --git a/build-aux/check-mescc.sh b/build-aux/check-mescc.sh index 6d7c6099..83d67362 100755 --- a/build-aux/check-mescc.sh +++ b/build-aux/check-mescc.sh @@ -138,6 +138,7 @@ t 91-fseek 92-stat 93-fread-fwrite +94-unsetenv " # 90: needs GNU, fails for mescc, passes for tcc diff --git a/include/stdlib.h b/include/stdlib.h index 5e2078a9..36c21d8d 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -40,6 +40,7 @@ void exit (int); void free (void *ptr); char* getenv (char const* s); int setenv (char const* s, char const* v, int overwrite_p); +void unsetenv (char const *name); 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); diff --git a/lib/gcc.c b/lib/gcc.c index 351385ad..45fa72fd 100644 --- a/lib/gcc.c +++ b/lib/gcc.c @@ -61,3 +61,22 @@ __moddi3 (double a, double b) eputs ("__moddi3 stub\n"); return ((int) a %(int)b); } + +// gcc-3.4 +void +unsetenv (char const *name) +{ + int length = strlen (name); + char **p = environ; + while (*p) + { + if (!strncmp (name, *p, length) && *(*p + length) == '=') + { + char **q = p; + q[0] = q[1]; + while (*q++) + q[0] = q[1]; + } + p++; + } +} diff --git a/scaffold/tests/94-unsetenv.c b/scaffold/tests/94-unsetenv.c new file mode 100644 index 00000000..7a2cc3a6 --- /dev/null +++ b/scaffold/tests/94-unsetenv.c @@ -0,0 +1,41 @@ +/* -*-comment-start: "//";comment-end:""-*- + * Mes --- Maxwell Equations of Software + * Copyright © 2018 Jan (janneke) Nieuwenhuizen + * + * This file is part of Mes. + * + * Mes is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * Mes is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mes. If not, see . + */ + +#include +#include +#include +#include +#include +#include + +int +main () +{ + eputs ("setenv\n"); + setenv ("FOO", "BAR", 1); + if (strcmp (getenv ("FOO"), "BAR")) + return 1; + eputs ("unsetenv\n"); + unsetenv ("FOO"); + if (getenv ("FOO")) + return 2; + + return 0; +}