# HG changeset patch # User Paul Boddie # Date 1481477589 -3600 # Node ID 333e1b23f4e47f6d4990de9f81a2a65dbc1b8376 # Parent 553d14eaf82c71eb7d10f0fe8da3990e3a6c0364 Allocate separate strings for the function results. Fixed comments. diff -r 553d14eaf82c -r 333e1b23f4e4 templates/native/locale.c --- a/templates/native/locale.c Sun Dec 11 18:07:32 2016 +0100 +++ b/templates/native/locale.c Sun Dec 11 18:33:09 2016 +0100 @@ -17,6 +17,7 @@ */ #include /* setlocale */ +#include /* strlen */ #include "native/common.h" #include "types.h" #include "exceptions.h" @@ -31,33 +32,44 @@ __attr __fn_native_locale_getlocale(__attr __args[]) { __attr * const category = &__args[1]; - /* category interpreted as int */ + /* category.__data__ interpreted as int */ int cat = __load_via_object(category->value, __pos___data__).intvalue; - char *result; + char *result, *out; + size_t length; result = setlocale(cat, NULL); if (result == NULL) return __builtins___none_None; - else - return __new_str(result); + + length = strlen(result); + out = __ALLOCATE(length + 1, sizeof(char)); + strncpy(out, result, length); + + return __new_str(result); } __attr __fn_native_locale_setlocale(__attr __args[]) { __attr * const category = &__args[1]; __attr * const value = &__args[2]; - /* category interpreted as int */ + /* category.__data__ interpreted as int */ int cat = __load_via_object(category->value, __pos___data__).intvalue; - /* value interpreted as string */ - char *s = __load_via_object(value->value, __pos___data__).strvalue, *result; + /* value.__data__ interpreted as string */ + char *s = __load_via_object(value->value, __pos___data__).strvalue; + char *result, *out; + size_t length; result = setlocale(cat, s); if (result == NULL) return __builtins___none_None; - else - return __new_str(result); + + length = strlen(result); + out = __ALLOCATE(length + 1, sizeof(char)); + strncpy(out, result, length); + + return __new_str(result); } /* Module initialisation. */