diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-01-28 00:24:28 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-01-28 00:24:34 -0800 |
commit | 88220d1dde7b8f0395ef756265f8bbfa7709053e (patch) | |
tree | 937475e82f2f4fedb6754af11e6ffdb1d0495bde | |
parent | a3a488f96f0dbd78093a18b258363b406231b7f7 (diff) | |
download | mu-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.mu | 23 | ||||
-rw-r--r-- | mu.arc | 31 |
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"))) |