about summary refs log tree commit diff stats
path: root/070text.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-05-24 19:20:35 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-05-24 19:20:35 -0700
commit765c729ebd6b3b5df0d9825b77fff785509b326a (patch)
treea73d33db4f6f24ca445e837e0fcaf895da3b1e84 /070text.mu
parente38b7a998955dac52d53ac20eead3854974efdf2 (diff)
downloadmu-765c729ebd6b3b5df0d9825b77fff785509b326a.tar.gz
3004 - print non-integers correctly
Thanks Caleb Couch for finding this hole, and for noticing that it made
a bug in binary-search harder to find. For now we'll just rely on the
host's support for printing floating-point.
Diffstat (limited to '070text.mu')
-rw-r--r--070text.mu101
1 files changed, 27 insertions, 74 deletions
diff --git a/070text.mu b/070text.mu
index f7d5897b..03b44bf4 100644
--- a/070text.mu
+++ b/070text.mu
@@ -15,13 +15,6 @@ def array-to-text-line x:address:array:_elem -> y:address:array:character [
   y <- to-text *x
 ]
 
-# to-text on text is just the identity function
-def to-text x:address:array:character -> y:address:array:character [
-  local-scope
-  load-ingredients
-  return x
-]
-
 def equal a:address:array:character, b:address:array:character -> result:boolean [
   local-scope
   load-ingredients
@@ -269,73 +262,6 @@ scenario buffer-append-handles-backspace [
   ]
 ]
 
-def to-text n:number -> result:address:array:character [
-  local-scope
-  load-ingredients
-  # is n zero?
-  {
-    break-if n
-    result <- new [0]
-    return
-  }
-  # save sign
-  negate-result:boolean <- copy 0
-  {
-    negative?:boolean <- lesser-than n, 0
-    break-unless negative?
-    negate-result <- copy 1
-    n <- multiply n, -1
-  }
-  # add digits from right to left into intermediate buffer
-  tmp:address:buffer <- new-buffer 30
-  digit-base:number <- copy 48  # '0'
-  {
-    done?:boolean <- equal n, 0
-    break-if done?
-    n, digit:number <- divide-with-remainder n, 10
-    c:character <- add digit-base, digit
-    tmp:address:buffer <- append tmp, c
-    loop
-  }
-  # add sign
-  {
-    break-unless negate-result:boolean
-    minus:character <- copy 45/-
-    tmp <- append tmp, minus
-  }
-  # reverse buffer into text result
-  len:number <- get *tmp, length:offset
-  buf:address:array:character <- get *tmp, data:offset
-  result <- new character:type, len
-  i:number <- subtract len, 1  # source index, decreasing
-  j:number <- copy 0  # destination index, increasing
-  {
-    # while i >= 0
-    done?:boolean <- lesser-than i, 0
-    break-if done?
-    # result[j] = tmp[i]
-    src:character <- index *buf, i
-    *result <- put-index *result, j, src
-    i <- subtract i, 1
-    j <- add j, 1
-    loop
-  }
-]
-
-def to-text x:boolean -> result:address:array:character [
-  local-scope
-  load-ingredients
-  n:number <- copy x:boolean
-  result <- to-text n
-]
-
-def to-text x:address:_elem -> result:address:array:character [
-  local-scope
-  load-ingredients
-  n:number <- copy x
-  result <- to-text n
-]
-
 def buffer-to-array in:address:buffer -> result:address:array:character [
   local-scope
   load-ingredients
@@ -394,6 +320,9 @@ scenario integer-to-decimal-digit-negative [
 def append a:address:array:character, b:address:array:character -> result:address:array:character [
   local-scope
   load-ingredients
+  # handle null addresses
+  reply-unless a, b
+  reply-unless b, a
   # result = new character[a.length + b.length]
   a-len:number <- length *a
   b-len:number <- length *b
@@ -440,6 +369,30 @@ scenario text-append-1 [
   ]
 ]
 
+scenario text-append-null [
+  run [
+    1:address:array:character/raw <- copy 0
+    2:address:array:character/raw <- new [ world!]
+    3:address:array:character/raw <- append 1:address:array:character/raw, 2:address:array:character/raw
+    4:array:character/raw <- copy *3:address:array:character/raw
+  ]
+  memory-should-contain [
+    4:array:character <- [ world!]
+  ]
+]
+
+scenario text-append-null-2 [
+  run [
+    1:address:array:character/raw <- new [hello,]
+    2:address:array:character/raw <- copy 0
+    3:address:array:character/raw <- append 1:address:array:character/raw, 2:address:array:character/raw
+    4:array:character/raw <- copy *3:address:array:character/raw
+  ]
+  memory-should-contain [
+    4:array:character <- [hello,]
+  ]
+]
+
 scenario replace-character-in-text [
   run [
     1:address:array:character/raw <- new [abc]