shithub: sl

Download patch

ref: 03caa766eca727daba0c3c149ff6b27675e09b1c
parent: 3efd625f94ba38fb5c37499441fdad603db25cd3
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Mar 25 21:35:58 EDT 2025

bikeshedding

--- a/src/io.c
+++ b/src/io.c
@@ -170,7 +170,7 @@
 	sl_ios *s = toio(args[0]);
 	Rune r;
 	int res;
-	if((res = ios_getutf8(s, &r)) == IOS_EOF)
+	if((res = ios_getrune(s, &r)) == IOS_EOF)
 		//lerrorf(sl_errio, "end of file reached");
 		return sl_eof;
 	if(res == 0)
@@ -186,7 +186,7 @@
 	if(!iscprim(args[1]) || cp_class(cp) != sl_runetype)
 		type_error("rune", args[1]);
 	Rune r = *(Rune*)cp_data(cp);
-	return fixnum(ios_pututf8(s, r));
+	return fixnum(ios_putrune(s, r));
 }
 
 BUILTIN("io-skip", io_skip)
@@ -316,7 +316,7 @@
 		if(nargs > 2)
 			lerrorf(sl_errarg, "offset argument not supported for characters");
 		Rune r = *(Rune*)cp_data(ptr(args[1]));
-		return fixnum(ios_pututf8(s, r));
+		return fixnum(ios_putrune(s, r));
 	}
 	u8int *data;
 	usize sz, offs = 0;
--- a/src/ios.c
+++ b/src/ios.c
@@ -887,7 +887,7 @@
 }
 
 int
-ios_getutf8(sl_ios *s, Rune *r)
+ios_getrune(sl_ios *s, Rune *r)
 {
 	int c;
 	usize i;
@@ -913,7 +913,7 @@
 }
 
 int
-ios_pututf8(sl_ios *s, Rune r)
+ios_putrune(sl_ios *s, Rune r)
 {
 	char buf[UTFmax];
 	return ios_write(s, buf, runetochar(buf, &r));
--- a/src/ios.h
+++ b/src/ios.h
@@ -90,12 +90,12 @@
 void ios_init_std(void);
 
 /* high-level functions - output */
-int ios_pututf8(sl_ios *s, Rune r);
+int ios_putrune(sl_ios *s, Rune r);
 int ios_printf(sl_ios *s, const char *format, ...) sl_printfmt(2, 3);
 int ios_vprintf(sl_ios *s, const char *format, va_list args) sl_printfmt(2, 0);
 
 /* high-level io functions - input */
-int ios_getutf8(sl_ios *s, Rune *r);
+int ios_getrune(sl_ios *s, Rune *r);
 
 // discard data buffered for reading
 void ios_purge(sl_ios *s);
--- a/src/print.c
+++ b/src/print.c
@@ -23,9 +23,13 @@
 {
 	if(ios_write(f, s, n) != n)
 		lerrorf(sl_errio, "write failed");
-	ssize w = u8_strwidth(s, n);
-	if(w > 0)
-		sl.hpos += w;
+	ssize w;
+	const char *nl = llt_memrchr(s, '\n', n);
+	if(nl == nil){
+		if((w = u8_strwidth(s, n)) > 0)
+			sl.hpos += w;
+	}else if((w = u8_strwidth(nl+1, s+n-nl+1)) > 0)
+		sl.hpos = w;
 }
 
 static inline void
@@ -34,6 +38,11 @@
 	outsn(f, s, strlen(s));
 }
 
+#define outsc(f, s) do{ \
+	const char vs[] = s; \
+	outsn(f, vs, sizeof(vs)-1); \
+}while(0)
+
 static int
 outindent(sl_ios *f, int n)
 {
@@ -314,7 +323,7 @@
 	while(1){
 		cd = cdr_(v);
 		if(sl.print_length >= 0 && n >= sl.print_length && cd != sl_nil){
-			outsn(f, "...)", 4);
+			outsc(f, "...)");
 			break;
 		}
 		lastv = sl.vpos;
@@ -322,7 +331,7 @@
 		sl_print_child(f, car_(v));
 		if(!iscons(cd) || ptrhash_has(&sl.printconses, (void*)cd)){
 			if(cd != sl_nil){
-				outsn(f, " . ", 3);
+				outsc(f, " . ");
 				sl_print_child(f, cd);
 			}
 			outc(f, ')');
@@ -423,7 +432,7 @@
 		if(sl.print_princ)
 			outs(f, name);
 		else if(ismanaged(v)){
-			outsn(f, "#:", 2);
+			outsc(f, "#:");
 			outs(f, name);
 		}else
 			print_sym_name(f, name);
@@ -432,14 +441,14 @@
 		if(v == sl_t)
 			outc(f, 'T');
 		else if(v == sl_nil)
-			outsn(f, "NIL", 3);
+			outsc(f, "NIL");
 		else if(v == sl_eof)
-			outsn(f, "#<eof>", 6);
+			outsc(f, "#<eof>");
 		else if(v == sl_void){
-			outsn(f, "#<void>", 7);
+			outsc(f, "#<void>");
 		}else if(isbuiltin(v)){
 			if(!sl.print_princ)
-				outsn(f, "#.", 2);
+				outsc(f, "#.");
 			outs(f, builtins[uintval(v)].name);
 		}else{
 			assert(isfn(v));
@@ -490,7 +499,7 @@
 			int i, sz = vec_size(v);
 			for(i = 0; i < sz; i++){
 				if(sl.print_length >= 0 && i >= sl.print_length && i < sz-1){
-					outsn(f, "...", 3);
+					outsc(f, "...");
 					break;
 				}
 				sl_print_child(f, vec_elt(v, i));
@@ -533,13 +542,13 @@
 		for(; i < sz; i++){
 			c = str[i];
 			if(c == '\\')
-				outsn(f, "\\\\", 2);
+				outsc(f, "\\\\");
 			else if(c == '"')
-				outsn(f, "\\\"", 2);
+				outsc(f, "\\\"");
 			else if(c >= 32 && c < 0x7f)
 				outc(f, c);
 			else{
-				outsn(f, "\\x", 2);
+				outsc(f, "\\x");
 				outc(f, hexdig[c>>4]);
 				outc(f, hexdig[c&0xf]);
 			}
@@ -674,19 +683,19 @@
 		if(sl.print_princ){
 			outsn(f, seq, nb);
 		}else{
-			outsn(f, "#\\", 2);
+			outsc(f, "#\\");
 			switch(r){
-			case 0x00: outsn(f, "nul", 3); break;
-			case 0x07: outsn(f, "alarm", 5); break;
-			case 0x08: outsn(f, "backspace", 9); break;
-			case 0x09: outsn(f, "tab", 3); break;
-			case 0x0a: outsn(f, "newline", 7); break;
-			case 0x0b: outsn(f, "vtab", 4); break;
-			case 0x0c: outsn(f, "page", 4); break;
-			case 0x0d: outsn(f, "return", 6); break;
-			case 0x1b: outsn(f, "esc", 3); break;
-			case ' ':  outsn(f, "space", 5); break;
-			case 0x7f: outsn(f, "delete", 6); break;
+			case 0x00: outsc(f, "nul"); break;
+			case 0x07: outsc(f, "alarm"); break;
+			case 0x08: outsc(f, "backspace"); break;
+			case 0x09: outsc(f, "tab"); break;
+			case 0x0a: outsc(f, "newline"); break;
+			case 0x0b: outsc(f, "vtab"); break;
+			case 0x0c: outsc(f, "page"); break;
+			case 0x0d: outsc(f, "return"); break;
+			case 0x1b: outsc(f, "esc"); break;
+			case ' ':  outsc(f, "space"); break;
+			case 0x7f: outsc(f, "delete"); break;
 			default:
 				if(sl_iswprint(r))
 					outs(f, seq);
@@ -727,9 +736,9 @@
 				outs(f, rep);
 		}else if(d == 0){
 			if(1/d < 0)
-				outsn(f, "-0.0", 4);
+				outsc(f, "-0.0");
 			else
-				outsn(f, "0.0", 3);
+				outsc(f, "0.0");
 			if(type == sl_floatsym && !sl.print_princ && !weak)
 				outc(f, 'f');
 		}else{
@@ -737,7 +746,7 @@
 			int hasdec = (strpbrk(buf, ".eE") != nil);
 			outs(f, buf);
 			if(!hasdec)
-				outsn(f, ".0", 2);
+				outsc(f, ".0");
 			if(type == sl_floatsym && !sl.print_princ && !weak)
 				outc(f, 'f');
 		}
@@ -787,14 +796,7 @@
 			}
 			if(eltype == sl_bytesym){
 				if(sl.print_princ){
-					ios_write(f, data, len);
-					/*
-					char *nl = llt_memrchr(data, '\n', len);
-					if(nl)
-						sl.hpos = u8_strwidth(nl+1);
-					else
-						sl.hpos += u8_strwidth(data);
-					*/
+					outsn(f, data, len);
 				}else{
 					outc(f, '"');
 					print_str(f, (char*)data, len);
@@ -810,8 +812,8 @@
 					buf[n] = 0;
 					if(!sl.print_princ)
 						print_str(f, buf, n);
-					else if(ios_write(f, buf, n) != (usize)n)
-						goto err;
+					else
+						outsn(f, buf, n);
 				}
 				if(!sl.print_princ)
 					outc(f, '"');
@@ -819,9 +821,9 @@
 			}
 			if(!weak){
 				if(eltype == sl_u8sym){
-					outsn(f, "#vu8(", 5);
+					outsc(f, "#vu8(");
 				}else{
-					outsn(f, "#arr(", 7);
+					outsc(f, "#arr(");
 					sl_print_child(f, eltype);
 					if(cnt > 0)
 						outc(f, ' ');
@@ -856,7 +858,7 @@
 		if(sl.print_princ){
 			outs(f, sym_name(label));
 		}else{
-			outsn(f, "#fn(", 4);
+			outsc(f, "#fn(");
 			outs(f, sym_name(label));
 			outc(f, ')');
 		}
--- a/src/read.c
+++ b/src/read.c
@@ -245,7 +245,7 @@
 			ctx->toktype = TOK_SHARPQUOTE;
 		else if(c == '\\'){
 			Rune cval;
-			if(ios_getutf8(RS, &cval) == IOS_EOF)
+			if(ios_getrune(RS, &cval) == IOS_EOF)
 				parse_error(&ctx->loc, "end of input in character constant");
 			if(cval == 'u' || cval == 'U' || cval == 'x'){
 				read_token(ctx, 'u', 0);