From c1d28086339ea0c7ca8ccf2cd7431cf7a4fa7ec7 Mon Sep 17 00:00:00 2001 From: James <101812526+WoodchuckXL@users.noreply.github.com> Date: Wed, 17 Jun 2026 14:41:55 -0400 Subject: [PATCH] Fix string negative indexing --- src/classes/strng.c | 17 ++++++++++++++++- test/string/index_neg.morpho | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/string/index_neg.morpho diff --git a/src/classes/strng.c b/src/classes/strng.c index 2d1ca699..70bbaf02 100644 --- a/src/classes/strng.c +++ b/src/classes/strng.c @@ -176,6 +176,7 @@ int string_countchars(objectstring *s) { /** Get a pointer to the i'th character of a string */ char *string_index(objectstring *s, int i) { + if (i<0) return NULL; int n=0; for (char *c = s->string; *c!='\0'; ) { if (i==n) return (char *) c; @@ -219,6 +220,20 @@ value String_clone(vm *v, int nargs, value *args) { return out; } +/** Gets a specified character from a string */ +value String_getindex(vm *v, int nargs, value *args) { + objectstring *slf = MORPHO_GETSTRING(MORPHO_SELF(args)); + value out=MORPHO_NIL; + int n=MORPHO_GETINTEGERVALUE(MORPHO_GETARG(args, 0)); + + char *c = string_index(slf, n); + if (c) { + out=object_stringfromcstring(c, morpho_utf8numberofbytes(c)); + morpho_bindobjects(v, 1, &out); + } else morpho_runtimeerror(v, VM_OUTOFBOUNDS); + return out; +} + /** Enumerate members of a string */ value String_enumerate(vm *v, int nargs, value *args) { objectstring *slf = MORPHO_GETSTRING(MORPHO_SELF(args)); @@ -292,7 +307,7 @@ MORPHO_BEGINCLASS(String) MORPHO_METHOD_SIGNATURE(MORPHO_COUNT_METHOD, "Int ()", String_count, MORPHO_FN_PUREFN), MORPHO_METHOD_SIGNATURE(MORPHO_PRINT_METHOD, "String ()", String_print, MORPHO_FN_IO), MORPHO_METHOD_SIGNATURE(MORPHO_CLONE_METHOD, "String ()", String_clone, MORPHO_FN_PUREFN|MORPHO_FN_ALLOCATES), -MORPHO_METHOD_SIGNATURE(MORPHO_GETINDEX_METHOD, "(Int)", String_enumerate, MORPHO_FN_THROWS), +MORPHO_METHOD_SIGNATURE(MORPHO_GETINDEX_METHOD, "String (Int)", String_getindex, MORPHO_FN_THROWS), MORPHO_METHOD_SIGNATURE(MORPHO_GETINDEX_METHOD, "Nil (...)", String_enumerate__err, MORPHO_FN_THROWS), MORPHO_METHOD_SIGNATURE(MORPHO_ENUMERATE_METHOD, "(Int)", String_enumerate, MORPHO_FN_THROWS), MORPHO_METHOD_SIGNATURE(MORPHO_ENUMERATE_METHOD, "Nil (...)", String_enumerate__err, MORPHO_FN_THROWS), diff --git a/test/string/index_neg.morpho b/test/string/index_neg.morpho new file mode 100644 index 00000000..c58dee6e --- /dev/null +++ b/test/string/index_neg.morpho @@ -0,0 +1,5 @@ +var s = "Hello" + +print s[-1] +// expect Error 'IndxBnds' +