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);
  
  
  

Reply via email to