shithub: sl

Download patch

ref: e93703c0c160dd07a585b808ea4353b45d9c577c
parent: c5d0002936da93518bb6b027100be54fe8c90ddc
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Fri Oct 25 21:49:52 EDT 2024

string.char: same, operate on runes rather than bytes

--- a/string.c
+++ b/string.c
@@ -209,15 +209,14 @@
 {
 	argcount(nargs, 2);
 	char *s = tostring(args[0]);
-	size_t len = cv_len(ptr(args[0]));
-	size_t i = toulong(args[1]);
-	if(i >= len)
+	size_t lenbytes = cv_len(ptr(args[0]));
+	size_t startbytes, n, startchar = toulong(args[1]);
+	for(startbytes = n = 0; n < startchar && startbytes < lenbytes; n++)
+		startbytes += u8_seqlen(s+startbytes);
+	if(n != startchar)
 		bounds_error(args[0], args[1]);
-	size_t sl = u8_seqlen(&s[i]);
-	if(sl > len || i > len-sl)
-		bounds_error(args[0], args[1]);
 	Rune r;
-	chartorune(&r, s+i);
+	chartorune(&r, s+startbytes);
 	return mk_rune(r);
 }
 
--