diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-05-27 22:25:01 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-05-27 22:25:01 -0700 |
commit | 036ec49c606ab792f1705c024a176e47e1433488 (patch) | |
tree | ddf821c72503f39d3b090c661240aace6dd5ab96 | |
parent | d389a61a34c9c4562af69354726c18d6b83032c8 (diff) | |
download | mu-036ec49c606ab792f1705c024a176e47e1433488.tar.gz |
1494
-rw-r--r-- | 050scenario.cc | 2 | ||||
-rw-r--r-- | repl.mu | 193 |
2 files changed, 189 insertions, 6 deletions
diff --git a/050scenario.cc b/050scenario.cc index 30e82989..5ed9faa1 100644 --- a/050scenario.cc +++ b/050scenario.cc @@ -88,7 +88,7 @@ time_t mu_time; time(&mu_time); cerr << "\nMu tests: " << ctime(&mu_time); for (long long int i = 0; i < SIZE(Scenarios); ++i) { //? cerr << Passed << '\n'; //? 1 -//? cerr << i << ": " << Scenarios.at(i).name << '\n'; //? 3 +//? cerr << i << ": " << Scenarios.at(i).name << '\n'; //? 5 run_mu_scenario(Scenarios.at(i)); if (Passed) cerr << "."; } diff --git a/repl.mu b/repl.mu index c1364a6b..ddb7e6a2 100644 --- a/repl.mu +++ b/repl.mu @@ -63,10 +63,20 @@ recipe read-instruction [ comment?:boolean <- equal c:character, 35:literal/hash break-unless comment?:boolean print-character x:address:screen, c:character, 4:literal/blue + result:address:buffer <- buffer-append result:address:buffer, c:character result:address:buffer, k:address:keyboard, x:address:screen <- slurp-comment result:address:buffer, k:address:keyboard, x:address:screen # continue appending to this instruction, whether comment ended or was backspaced out of loop +next-character:label } + # string + { + string?:boolean <- equal c:character, 91:literal/open-bracket + break-unless string?:boolean + print-character x:address:screen, c:character, 6:literal/cyan + result:address:buffer <- buffer-append result:address:buffer, c:character + result:address:buffer, _, k:address:keyboard, x:address:screen <- slurp-string result:address:buffer, k:address:keyboard, x:address:screen + loop +next-character:label + } # print print-character x:address:screen, c:character # default color # append @@ -77,7 +87,7 @@ recipe read-instruction [ loop } result2:address:array:character <- buffer-to-array result:address:buffer - reply result2:address:array:character, k:address:keyboard, x:address:screen + reply result2:address:array:character, k:address:keyboard/same-as-ingredient:0, x:address:screen/same-as-ingredient:1 ] # Simpler version of read-instruction that prints in the comment color and @@ -98,12 +108,12 @@ recipe slurp-comment [ { ctrl-d?:boolean <- equal c:character, 4:literal/ctrl-d/eof break-unless ctrl-d?:boolean - reply 0:literal, k:address:keyboard/same-as-ingredient:0, x:address:screen/same-as-ingredient:1 + reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2 } { null?:boolean <- equal c:character, 0:literal/null break-unless null?:boolean - reply 0:literal, k:address:keyboard/same-as-ingredient:0, x:address:screen/same-as-ingredient:1 + reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2 } # print print-character x:address:screen, c:character, 4:literal/blue @@ -117,7 +127,7 @@ recipe slurp-comment [ { reset-color?:boolean <- lesser-or-equal characters-slurped:number, 0:literal break-unless reset-color?:boolean - reply result:address:buffer, k:address:keyboard, x:address:screen + reply result:address:buffer, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2 } loop +next-character:label } @@ -128,7 +138,58 @@ recipe slurp-comment [ break-if done?:boolean loop } - reply result:address:buffer, k:address:keyboard, x:address:screen + reply result:address:buffer, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2 +] + +# Version of read-instruction that prints in the string color and doesn't +# handle comments. Does handle nested strings. Tracks an extra count in case +# we backspace out of it, which it needs to return because recursion. +recipe slurp-string [ + default-space:address:array:location <- new location:type, 60:literal + result:address:buffer <- next-ingredient + k:address:keyboard <- next-ingredient + x:address:screen <- next-ingredient + # use this to track when backspace should reset color + characters-slurped:number <- copy 1:literal # for the initial '[' that's already appended to result + { + +next-character + # read character + c:character, k:address:keyboard <- wait-for-key k:address:keyboard + # quit? + { + ctrl-d?:boolean <- equal c:character, 4:literal/ctrl-d/eof + break-unless ctrl-d?:boolean + reply 0:literal, 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2 + } + { + null?:boolean <- equal c:character, 0:literal/null + break-unless null?:boolean + reply 0:literal, 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2 + } + # print + print-character x:address:screen, c:character, 6:literal/cyan + # append + result:address:buffer <- buffer-append result:address:buffer, c:character + # backspace? decrement + { + backspace?:boolean <- equal c:character, 8:literal/backspace + break-unless backspace?:boolean + characters-slurped:number <- subtract characters-slurped:number, 1:literal + { + reset-color?:boolean <- lesser-or-equal characters-slurped:number, 0:literal + break-unless reset-color?:boolean + reply result:address:buffer/same-as-ingredient:0, 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2 + } + loop +next-character:label + } + # otherwise increment + characters-slurped:number <- add characters-slurped:number, 1:literal + # done with this instruction? + done?:boolean <- equal c:character, 93:literal/close-bracket + break-if done?:boolean + loop + } + reply result:address:buffer/same-as-ingredient:0, characters-slurped:number, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2 ] scenario read-instruction-color-comment [ @@ -222,3 +283,125 @@ scenario read-instruction-cancel-comment-on-backspace3 [ . . ] ] + +scenario read-instruction-color-string [ +#? $start-tracing #? 1 + assume-screen 30:literal/width, 5:literal/height + assume-keyboard [abc [string] +] + run [ + read-instruction keyboard:address, screen:address + ] + screen-should-contain [ + .abc [string] . + . . + ] + screen-should-contain-in-color 6:literal/cyan, [ + . [string] . + . . + ] + screen-should-contain-in-color 7:literal/white, [ + .abc . + . . + ] +] + +scenario read-instruction-color-string-multiline [ + assume-screen 30:literal/width, 5:literal/height + assume-keyboard [abc [line1 +line2] +] + run [ + read-instruction keyboard:address, screen:address + ] + screen-should-contain [ + .abc [line1 . + .line2] . + . . + ] + screen-should-contain-in-color 6:literal/cyan, [ + . [line1 . + .line2] . + . . + ] + screen-should-contain-in-color 7:literal/white, [ + .abc . + . . + . . + ] +] + +scenario read-instruction-color-string-and-comment [ + assume-screen 30:literal/width, 5:literal/height + assume-keyboard [abc [string] # comment +] + run [ + read-instruction keyboard:address, screen:address + ] + screen-should-contain [ + .abc [string] # comment . + . . + ] + screen-should-contain-in-color 4:literal/blue, [ + . # comment . + . . + ] + screen-should-contain-in-color 6:literal/cyan, [ + . [string] . + . . + ] + screen-should-contain-in-color 7:literal/white, [ + .abc . + . . + ] +] + +scenario read-instruction-ignore-comment-inside-string [ + assume-screen 30:literal/width, 5:literal/height + assume-keyboard [abc [string # not a comment] +] + run [ + read-instruction keyboard:address, screen:address + ] + screen-should-contain [ + .abc [string # not a comment] . + . . + ] + screen-should-contain-in-color 6:literal/cyan, [ + . [string # not a comment] . + . . + ] + screen-should-contain-in-color 7:literal/white, [ + .abc . + . . + ] + screen-should-contain-in-color 4:literal/blue, [ + . . + . . + ] +] + +scenario read-instruction-ignore-string-inside-comment [ + assume-screen 30:literal/width, 5:literal/height + assume-keyboard [abc # comment [not a string] +] + run [ + read-instruction keyboard:address, screen:address + ] + screen-should-contain [ + .abc # comment [not a string] . + . . + ] + screen-should-contain-in-color 6:literal/cyan, [ + . . + . . + ] + screen-should-contain-in-color 7:literal/white, [ + .abc . + . . + ] + screen-should-contain-in-color 4:literal/blue, [ + . # comment [not a string] . + . . + ] +] |