1.1 --- a/templates/native.c Thu Dec 01 19:09:28 2016 +0100
1.2 +++ b/templates/native.c Thu Dec 01 19:48:31 2016 +0100
1.3 @@ -302,7 +302,7 @@
1.4 char *r = (char *) __ALLOCATE(n, sizeof(char));
1.5
1.6 strncpy(r, s, n);
1.7 - strncpy(r + strlen(s), o, n - strlen(s));
1.8 + strncpy(r + strlen(s), o, n - strlen(s)); /* should null terminate */
1.9
1.10 /* Return a new string. */
1.11 return __new_str(r);
1.12 @@ -363,6 +363,24 @@
1.13 return strlen(s) ? __builtins___boolean_True : __builtins___boolean_False;
1.14 }
1.15
1.16 +__attr __fn_native__str_substr(__attr __args[])
1.17 +{
1.18 + __attr * const self = &__args[1];
1.19 + __attr * const start = &__args[2];
1.20 + __attr * const size = &__args[3];
1.21 + /* self.__data__ interpreted as string */
1.22 + char *s = __load_via_object(self->value, __pos___data__).strvalue, *sub;
1.23 + /* start.__data__ interpreted as int */
1.24 + int i = __load_via_object(start->value, __pos___data__).intvalue;
1.25 + /* size.__data__ interpreted as int */
1.26 + int l = __load_via_object(size->value, __pos___data__).intvalue;
1.27 +
1.28 + /* Reserve space for a new string. */
1.29 + sub = (char *) __ALLOCATE(l + 1, sizeof(char));
1.30 + strncpy(sub, s + i, l); /* does not null terminate but final byte should be zero */
1.31 + return __new_str(sub);
1.32 +}
1.33 +
1.34 __attr __fn_native__list_init(__attr __args[])
1.35 {
1.36 __attr * const size = &__args[1];
1.37 @@ -649,7 +667,7 @@
1.38 {
1.39 o = __load_via_object(data->attrs[i].value, __pos___data__).strvalue;
1.40 n = strlen(o);
1.41 - strncpy(s + j, o, n);
1.42 + strncpy(s + j, o, n); /* does not null terminate but final byte should be zero */
1.43 j += n;
1.44 }
1.45