cvsuser 03/08/15 04:56:23
Modified: classes env.pmc
config/auto/env test_unsetenv.in
config/gen/platform ansi.c darwin.c generic.c
platform_interface.h win32.c
. interpreter.c
Log:
Win32 env.pmc fixes by Mattia Barbon
Revision Changes Path
1.7 +13 -6 parrot/classes/env.pmc
Index: env.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/env.pmc,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -w -r1.6 -r1.7
--- env.pmc 28 Jul 2003 13:37:50 -0000 1.6
+++ env.pmc 15 Aug 2003 11:56:19 -0000 1.7
@@ -1,7 +1,7 @@
/* env.pmc
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: env.pmc,v 1.6 2003/07/28 13:37:50 leo Exp $
+ * $Id: env.pmc,v 1.7 2003/08/15 11:56:19 leo Exp $
* Overview:
* These are the vtable functions for the Env base class, which
* accesses the system environment
@@ -21,18 +21,23 @@
STRING* get_string_keyed(PMC* key) {
char *keyname = string_to_cstring(interpreter,
VTABLE_get_string(interpreter, key));
+ int free_it;
+ STRING *retval;
+ char *val = NULL;
if (keyname) {
- char *val = Parrot_getenv(keyname);
+ val = Parrot_getenv(keyname, &free_it);
string_cstring_free(keyname);
if (val) {
- return string_from_cstring(interpreter, val, 0);
+ retval = string_from_cstring(interpreter, val, 0);
} else {
- return string_from_cstring(interpreter, "", 0);
+ retval = string_from_cstring(interpreter, "", 0);
}
} else {
- return string_from_cstring(interpreter, "", 0);
+ retval = string_from_cstring(interpreter, "", 0);
}
+ if (free_it) mem_sys_free(val);
+ return retval;
}
void set_string_keyed(PMC* key, STRING* value) {
@@ -53,11 +58,13 @@
INTVAL exists_keyed(PMC* key) {
char *keyname = string_to_cstring(interpreter,
VTABLE_get_string(interpreter, key));
+ int free_it;
if (keyname) {
- char *val = Parrot_getenv(keyname);
+ char *val = Parrot_getenv(keyname, &free_it);
string_cstring_free(keyname);
if (val) {
+ if (free_it) mem_sys_free(val);
return 1;
}
}
1.2 +3 -0 parrot/config/auto/env/test_unsetenv.in
Index: test_unsetenv.in
===================================================================
RCS file: /cvs/public/parrot/config/auto/env/test_unsetenv.in,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -r1.1 -r1.2
--- test_unsetenv.in 14 Jul 2003 07:58:04 -0000 1.1
+++ test_unsetenv.in 15 Aug 2003 11:56:20 -0000 1.2
@@ -7,7 +7,10 @@
#include <stdlib.h>
int main(int argc, char **argv) {
+/* we have an hand-rolled unsetenv */
+#ifndef WIN32
unsetenv("PARROT_TEST");
+#endif
puts("ok");
return 0;
}
1.9 +2 -1 parrot/config/gen/platform/ansi.c
Index: ansi.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/ansi.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -w -r1.8 -r1.9
--- ansi.c 13 Aug 2003 05:59:15 -0000 1.8
+++ ansi.c 15 Aug 2003 11:56:22 -0000 1.9
@@ -80,8 +80,9 @@
}
char *
-Parrot_getenv(const char *name)
+Parrot_getenv(const char *name, int *free_it)
{
+ *free_it = 0;
return getenv(name);
}
1.11 +2 -1 parrot/config/gen/platform/darwin.c
Index: darwin.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/darwin.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -w -r1.10 -r1.11
--- darwin.c 13 Aug 2003 05:59:15 -0000 1.10
+++ darwin.c 15 Aug 2003 11:56:22 -0000 1.11
@@ -98,8 +98,9 @@
}
char *
-Parrot_getenv(const char *name)
+Parrot_getenv(const char *name, int *free_it)
{
+ *free_it = 0
return getenv(name);
}
1.20 +2 -1 parrot/config/gen/platform/generic.c
Index: generic.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/generic.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -w -r1.19 -r1.20
--- generic.c 13 Aug 2003 05:59:15 -0000 1.19
+++ generic.c 15 Aug 2003 11:56:22 -0000 1.20
@@ -88,8 +88,9 @@
}
char *
-Parrot_getenv(const char *name)
+Parrot_getenv(const char *name, int *free_it)
{
+ *free_it = 0;
return getenv(name);
}
1.9 +3 -1 parrot/config/gen/platform/platform_interface.h
Index: platform_interface.h
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/platform_interface.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -w -r1.8 -r1.9
--- platform_interface.h 13 Aug 2003 05:59:15 -0000 1.8
+++ platform_interface.h 15 Aug 2003 11:56:22 -0000 1.9
@@ -30,7 +30,9 @@
FLOATVAL Parrot_floatval_time(void);
void Parrot_setenv(const char *name, const char *value);
void Parrot_unsetenv(const char *name);
-char * Parrot_getenv(const char *name);
+/* free_it is set by the function to either 0 or 1; if set to 1,
+ the return value of the function needs to be mem_sys_free()d after use */
+char * Parrot_getenv(const char *name, int *free_it);
/*
** Dynamic Loading:
1.7 +11 -2 parrot/config/gen/platform/win32.c
Index: win32.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/win32.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -w -r1.6 -r1.7
--- win32.c 14 Jul 2003 09:55:02 -0000 1.6
+++ win32.c 15 Aug 2003 11:56:22 -0000 1.7
@@ -61,9 +61,18 @@
char *
-Parrot_getenv(const char *name)
+Parrot_getenv(const char *name, int *free_it)
{
- return getenv(name);
+ DWORD size = GetEnvironmentVariable(name, NULL, 0);
+ char *buffer;
+
+ *free_it = 1;
+ if (size == 0) return NULL;
+
+ buffer = mem_sys_allocate(size);
+ GetEnvironmentVariable(name, buffer, size);
+
+ return buffer;
}
void
Parrot_unsetenv(const char *name)
1.194 +12 -5 parrot/interpreter.c
Index: interpreter.c
===================================================================
RCS file: /cvs/public/parrot/interpreter.c,v
retrieving revision 1.193
retrieving revision 1.194
diff -u -w -r1.193 -r1.194
--- interpreter.c 15 Aug 2003 11:27:19 -0000 1.193
+++ interpreter.c 15 Aug 2003 11:56:23 -0000 1.194
@@ -1,7 +1,7 @@
/* interpreter.c
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: interpreter.c,v 1.193 2003/08/15 11:27:19 leo Exp $
+ * $Id: interpreter.c,v 1.194 2003/08/15 11:56:23 leo Exp $
* Overview:
* The interpreter api handles running the operations
* Data Structure and Algorithms:
@@ -666,10 +666,17 @@
static int
is_env_var_set(const char* var)
{
- char* value = Parrot_getenv(var);
- if (value == NULL) return 0;
- if (*value == '\0') return 0;
- return ! (strcmp(value, "0") == 0);
+ int free_it, retval;
+ char* value = Parrot_getenv(var, &free_it);
+ if (value == NULL)
+ retval = 0;
+ else if (*value == '\0')
+ retval = 0;
+ else
+ retval = ! (strcmp(value, "0") == 0);
+ if (free_it)
+ mem_sys_free(value);
+ return retval;
}
void Parrot_really_destroy(int exit_code, void *interpreter);