shithub: sl

Download patch

ref: 5209a8864aa07897b5d3c7cf07e238f318337932
parent: 6efc3cb390b56e0d5d645098bdd372dbef959445
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Jan 28 20:19:45 EST 2025

string-char: throw bounds error instead of returning #\nul if went past the string

--- a/src/string.c
+++ b/src/string.c
@@ -214,7 +214,7 @@
 	size_t startbytes, n, startchar = tosize(args[1]);
 	for(startbytes = n = 0; n < startchar && startbytes < lenbytes; n++)
 		startbytes += u8_seqlen(s+startbytes);
-	if(n != startchar)
+	if(n != startchar || startbytes >= lenbytes)
 		bounds_error(args[0], args[1]);
 	Rune r;
 	chartorune(&r, s+startbytes);
--- a/test/unittest.lsp
+++ b/test/unittest.lsp
@@ -521,5 +521,9 @@
 (assert (equal? '("пр" "вет" "пок" "") (string-split s "аи\0")))
 (assert (equal? '("" "") (string-split "1" "1")))
 
+(assert (equal? #\а (string-char s 10)))
+(assert (equal? #\nul (string-char s 6)))
+(assert-fail (string-char s 11))
+
 (princ "all tests pass")
 (newline)
--