shithub: sl

Download patch

ref: d239bae8435ef8dd6bd88c222f81708f3431b956
parent: 5ac5ac2d64c4aeed30d6f9a23eaa8dda7d295e47
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Fri Mar 7 19:04:44 EST 2025

add io-buffer-mode to get/set buffer mode

--- a/src/iostream.c
+++ b/src/iostream.c
@@ -5,6 +5,8 @@
 #include "read.h"
 #include "iostream.h"
 
+static sl_v sl_linesym, sl_blocksym, sl_memorysym, sl_nonesym;
+
 static void
 print_iostream(sl_v v, sl_ios *f)
 {
@@ -99,6 +101,35 @@
 	return f;
 }
 
+BUILTIN("io-buffer-mode", io_buffer_mode)
+{
+	if(nargs < 1 || nargs > 2)
+		argcount(nargs, 1);
+	sl_ios *s = toiostream(args[0]);
+	if(nargs == 1){
+		switch(s->bm){
+		case bm_none: return sl_nonesym;
+		case bm_line: return sl_linesym;
+		case bm_block: return sl_blocksym;
+		case bm_mem: return sl_memorysym;
+		}
+		assert("impossible" == nil);
+	}
+	sl_v a = args[1];
+	int bm = -1;
+	if(a == sl_nonesym)
+		bm = bm_none;
+	else if(a == sl_linesym)
+		bm = bm_line;
+	else if(a == sl_blocksym)
+		bm = bm_block;
+	else if(a == sl_memorysym)
+		bm = bm_mem;
+	if(bm < 0 || ios_bufmode(s, bm) != 0)
+		lerrorf(sl_errarg, "invalid buffer mode");
+	return sl_void;
+}
+
 BUILTIN("buffer", buffer)
 {
 	argcount(nargs, 0);
@@ -443,6 +474,10 @@
 	sl_apsym = csymbol(":append");
 	sl_crsym = csymbol(":create");
 	sl_truncsym = csymbol(":truncate");
+	sl_nonesym = csymbol(":none");
+	sl_linesym = csymbol(":line");
+	sl_blocksym = csymbol(":block");
+	sl_memorysym = csymbol(":memory");
 	sl_instrsym = csymbol("*input-stream*");
 	sl_outstrsym = csymbol("*output-stream*");
 	sl_iostreamtype = define_opaque_type(sl_iostreamsym, sizeof(sl_ios), &iostream_vtable, nil);
--