about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2017-04-18 18:02:07 -0700
committerKartik K. Agaram <vc@akkartik.com>2017-04-18 18:02:07 -0700
commit04683e4ecec9bc26f0930a548fc2173d89f686c4 (patch)
tree4d505319f264a76b51327a32a536160ea893b2ca
parent978803c5ef53260b775bc0be36e8646ba9c5d9a1 (diff)
downloadmu-04683e4ecec9bc26f0930a548fc2173d89f686c4.tar.gz
3832
More fixes for commit 3828 (supporting buffers of something other than
characters).
-rw-r--r--061text.mu35
1 files changed, 27 insertions, 8 deletions
diff --git a/061text.mu b/061text.mu
index 58a7b230..96e6b644 100644
--- a/061text.mu
+++ b/061text.mu
@@ -147,17 +147,17 @@ def grow-buffer buf:&:buffer:_elem -> buf:&:buffer:_elem [
   local-scope
   load-ingredients
   # double buffer size
-  olddata:text <- get *buf, data:offset
+  olddata:&:@:_elem <- get *buf, data:offset
   oldlen:num <- length *olddata
   newlen:num <- multiply oldlen, 2
-  newdata:text <- new character:type, newlen
+  newdata:&:@:_elem <- new _elem:type, newlen
   *buf <- put *buf, data:offset, newdata
   # copy old contents
   i:num <- copy 0
   {
     done?:bool <- greater-or-equal i, oldlen
     break-if done?
-    src:char <- index *olddata, i
+    src:_elem <- index *olddata, i
     *newdata <- put-index *newdata, i, src
     i <- add i, 1
     loop
@@ -168,12 +168,30 @@ def buffer-full? in:&:buffer:_elem -> result:bool [
   local-scope
   load-ingredients
   len:num <- get *in, length:offset
-  s:text <- get *in, data:offset
+  s:&:@:_elem <- get *in, data:offset
   capacity:num <- length *s
   result <- greater-or-equal len, capacity
 ]
 
-# most broadly applicable definition of append to a buffer: just call to-text
+# most broadly applicable definition of append to a buffer
+def append buf:&:buffer:_elem, x:_elem -> buf:&:buffer:_elem [
+  local-scope
+  load-ingredients
+  len:num <- get *buf, length:offset
+  {
+    # grow buffer if necessary
+    full?:bool <- buffer-full? buf
+    break-unless full?
+    buf <- grow-buffer buf
+  }
+  s:&:@:_elem <- get *buf, data:offset
+  *s <- put-index *s, len, x
+  len <- add len, 1
+  *buf <- put *buf, length:offset, len
+]
+
+# most broadly applicable definition of append to a buffer of characters: just
+# call to-text
 def append buf:&:buffer:char, x:_elem -> buf:&:buffer:char [
   local-scope
   load-ingredients
@@ -190,6 +208,7 @@ def append buf:&:buffer:char, x:_elem -> buf:&:buffer:char [
   }
 ]
 
+# specialization for characters that is backspace-aware
 def append buf:&:buffer:char, c:char -> buf:&:buffer:char [
   local-scope
   load-ingredients
@@ -334,14 +353,14 @@ def buffer-to-array in:&:buffer:_elem -> result:&:@:_elem [
     return 0
   }
   len:num <- get *in, length:offset
-  s:text <- get *in, data:offset
+  s:&:@:_elem <- get *in, data:offset
   # we can't just return s because it is usually the wrong length
-  result <- new character:type, len
+  result <- new _elem:type, len
   i:num <- copy 0
   {
     done?:bool <- greater-or-equal i, len
     break-if done?
-    src:char <- index *s, i
+    src:_elem <- index *s, i
     *result <- put-index *result, i, src
     i <- add i, 1
     loop