about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-01-28 00:24:28 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-01-28 00:24:34 -0800
commit88220d1dde7b8f0395ef756265f8bbfa7709053e (patch)
tree937475e82f2f4fedb6754af11e6ffdb1d0495bde
parenta3a488f96f0dbd78093a18b258363b406231b7f7 (diff)
downloadmu-88220d1dde7b8f0395ef756265f8bbfa7709053e.tar.gz
651 - new data structure in repl: list of backslash escapes
'#\\' only contains one escape character: the first backslash
-rw-r--r--color-repl.mu23
-rw-r--r--mu.arc31
2 files changed, 47 insertions, 7 deletions
diff --git a/color-repl.mu b/color-repl.mu
index 143d7e5b..eede10e1 100644
--- a/color-repl.mu
+++ b/color-repl.mu
@@ -9,6 +9,9 @@
   (default-space:space-address <- new space:literal 30:literal)
   (result:buffer-address <- init-buffer 30:literal)
   (open-parens:integer <- copy 0:literal)  ; for balancing parens and tracking nesting depth
+  ; we can change color when backspacing over parens or comments or strings,
+  ; but we need to know that they aren't escaped
+  (escapes:integer-buffer-address <- init-integer-buffer 5:literal)
   ; test: 34<enter>
   { begin
     next-key
@@ -36,7 +39,7 @@
       (backslash?:boolean <- equal c:character ((#\\ literal)))
       (break-unless backslash?:boolean)
       ($print-key-to-host c:character 7:literal/white)
-      (result:buffer-address <- slurp-escaped-character result:buffer-address 7:literal/white)
+      (result:buffer-address escapes:integer-buffer-address <- slurp-escaped-character result:buffer-address 7:literal/white escapes:integer-buffer-address)
       (jump next-key:offset)
     }
     ; parse comment
@@ -55,7 +58,7 @@
       (string-started?:boolean <- equal c:character ((#\" literal)))  ; for vim: "
       (break-unless string-started?:boolean)
       ($print-key-to-host c:character 6:literal/fg/cyan)
-      (slurp-string result:buffer-address)
+      (slurp-string result:buffer-address escapes:integer-buffer-address)
       (jump next-key:offset)
     }
     ; balance parens
@@ -132,6 +135,7 @@
   (default-space:space-address <- new space:literal 30:literal)
   (result:buffer-address <- next-input)
   (orig-len:integer <- get result:buffer-address/deref length:offset)
+  (escapes:integer-buffer-address <- next-input)
   ; test: "abc"
   { begin
     next-key-in-string
@@ -159,7 +163,7 @@
     { begin
       (backslash?:boolean <- equal c:character ((#\\ literal)))
       (break-unless backslash?:boolean)
-      (result:buffer-address <- slurp-escaped-character result:buffer-address 6:literal/cyan)
+      (result:buffer-address escapes:integer-buffer-address <- slurp-escaped-character result:buffer-address 6:literal/cyan escapes:integer-buffer-address)
       (jump next-key-in-string:offset)
     }
     ; if not backslash
@@ -175,19 +179,26 @@
   (color-code:integer <- next-input)
   (c2:character <- $wait-for-key-from-host)
   ($print-key-to-host c2:character color-code:integer)
+  (escapes:integer-buffer-address <- next-input)
+  (len:integer-address <- get-address result:buffer-address/deref length:offset)
+  (escapes:integer-buffer-address <- append escapes:integer-buffer-address len:integer-address/deref)  ; todo: type violation
+;?   (print-primitive-to-host (("+" literal))) ;? 1
   ; handle backspace
   ; test: "abc\<backspace>def"
+  ; test: #\<backspace>
   { begin
     (backspace?:boolean <- equal c2:character ((#\backspace literal)))
     (break-unless backspace?:boolean)
-    (len:integer-address <- get-address result:buffer-address/deref length:offset)
     ; just typed a backslash, so buffer can't be empty
     (len:integer-address/deref <- subtract len:integer-address/deref 1:literal)
-    (reply result:buffer-address/same-as-arg:0)
+    (elen:integer-address <- get-address escapes:integer-buffer-address/deref length:offset)
+    (elen:integer-address/deref <- subtract elen:integer-address/deref 1:literal)
+;?     (print-primitive-to-host (("-" literal))) ;? 1
+    (reply result:buffer-address/same-as-arg:0 escapes:integer-buffer-address/same-as-arg:2)
   }
   ; if not backspace
   (result:buffer-address <- append result:buffer-address c2:character)
-  (reply result:buffer-address/same-as-arg:0)
+  (reply result:buffer-address/same-as-arg:0 escapes:integer-buffer-address/same-as-arg:2)
 ])
 
 (function main [
diff --git a/mu.arc b/mu.arc
index 38dc0999..6ff2c6af 100644
--- a/mu.arc
+++ b/mu.arc
@@ -169,6 +169,8 @@
               integer-array-address-address (obj size 1  address t  elem '(integer-array-address))
               integer-address (obj size 1  address t  elem '(integer))  ; pointer to int
               integer-address-address (obj size 1  address t  elem '(integer-address))
+              integer-buffer (obj size 2  and-record t  elems '((integer) (integer-array-address))  fields '(length data))
+              integer-buffer-address (obj size 1  address t  elem '(integer-buffer))
               ; and-records consist of a multiple fields of different types
               integer-boolean-pair (obj size 2  and-record t  elems '((integer) (boolean))  fields '(int bool))
               integer-boolean-pair-address (obj size 1  address t  elem '(integer-boolean-pair))
@@ -2308,6 +2310,17 @@
   (reply result:buffer-address)
 )
 
+(init-fn init-integer-buffer
+  (default-space:space-address <- new space:literal 30:literal)
+  (result:integer-buffer-address <- new integer-buffer:literal)
+  (len:integer-address <- get-address result:buffer-address/deref length:offset)
+  (len:integer-address/deref <- copy 0:literal)
+  (s:integer-array-address-address <- get-address result:integer-buffer-address/deref data:offset)
+  (capacity:integer <- next-input)
+  (s:integer-array-address-address/deref <- new integer-array:literal capacity:integer)
+  (reply result:integer-buffer-address)
+)
+
 (init-fn grow-buffer
   (default-space:space-address <- new space:literal 30:literal)
   (in:buffer-address <- next-input)
@@ -2358,6 +2371,22 @@
   (reply in:buffer-address/same-as-arg:0)
 )
 
+(init-fn last
+  (default-space:space-address <- new space:literal 30:literal)
+  (in:buffer-address <- next-input)
+  (n:integer <- get in:buffer-address/deref length:offset)
+  { begin
+    ; if empty return nil
+    (empty?:boolean <- equal n:integer 0:literal)
+    (break-unless empty?:boolean)
+    (reply nil:literal)
+  }
+  (n:integer <- subtract n:integer 1:literal)
+  (s:string-address <- get in:buffer-address/deref data:offset)
+  (result:character <- index s:string-address/deref n:integer)
+  (reply result:character)
+)
+
 (init-fn integer-to-decimal-string
   (default-space:space-address <- new space:literal 30:literal)
   (n:integer <- next-input)
@@ -2471,7 +2500,7 @@
 
 ;; load all provided files and start at 'main'
 (reset)
-;? (new-trace "main") ;? 3
+;? (new-trace "main") ;? 4
 (awhen (pos "--" argv)
   (map add-code:readfile (cut argv (+ it 1)))
 ;?   (= dump-trace* (obj whitelist '("run")))