summaryrefslogtreecommitdiffstats
path: root/Buffer.sml
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2025-05-16 16:54:17 -0700
committerRose Hogenson <rosehogenson@posteo.net>2025-05-16 16:54:17 -0700
commit5582235bd300f8de997192f9109d596d12df4bbe (patch)
treed219a6c0a3d96052eec422527cd05775354abf76 /Buffer.sml
parentff12ef4eea67453c1a6c1fa4614b74adf7c3caca (diff)
downloadsml-5582235bd300f8de997192f9109d596d12df4bbe.tar.zst
Fix spelling of file names
Diffstat (limited to 'Buffer.sml')
-rw-r--r--Buffer.sml50
1 files changed, 50 insertions, 0 deletions
diff --git a/Buffer.sml b/Buffer.sml
new file mode 100644
index 0000000..054f29c
--- /dev/null
+++ b/Buffer.sml
@@ -0,0 +1,50 @@
+structure Buffer =
+struct
+ fun append (a : Word8ArraySlice.slice) (b : Word8ArraySlice.slice) : Word8ArraySlice.slice =
+ let
+ val bLen = Word8ArraySlice.length b
+ val (base, i, aLen) = Word8ArraySlice.base a
+ val baseLen = Word8Array.length base
+ in
+ if i + aLen + bLen <= baseLen
+ then
+ (Word8ArraySlice.copy { src = b, dst = base, di = i + aLen } ;
+ Word8ArraySlice.slice (base, i, SOME (aLen + bLen)))
+ else
+ let val newBuf = Word8Array.array (baseLen * 2 + bLen, Word8.fromInt 0)
+ in
+ Word8ArraySlice.copy { src = a, dst = newBuf, di = 0 } ;
+ Word8ArraySlice.copy { src = b, dst = newBuf, di = aLen } ;
+ Word8ArraySlice.slice (newBuf, 0, SOME (aLen + bLen))
+ end
+ end
+
+ fun buf () : BinIO.outstream * Word8ArraySlice.slice ref =
+ let val buffer = ref (Word8ArraySlice.full (Word8Array.array (0, Word8.fromInt 0)))
+ in
+ (BinIO.mkOutstream
+ (BinIO.StreamIO.mkOutstream
+ (BinPrimIO.WR
+ { name = "buffer"
+ , chunkSize = 1
+ , writeVec = NONE
+ , writeArr =
+ SOME
+ (fn a =>
+ (buffer := append (!buffer) a ;
+ Word8ArraySlice.length a))
+ , writeVecNB = NONE
+ , writeArrNB = NONE
+ , block = NONE
+ , canOutput = NONE
+ , getPos = NONE
+ , setPos = NONE
+ , endPos = NONE
+ , verifyPos = NONE
+ , close = fn () => ()
+ , ioDesc = NONE
+ },
+ IO.NO_BUF)),
+ buffer)
+ end
+end