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