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);