From 87fbfc2d4607ff31d5b0b023f41d8ba439dd5958 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sun, 31 May 2015 23:44:52 -0700 Subject: 1518 - still horribly broken Just figured out why a first keystroke of backspace was sending me out for a spin: run_interactive needs all early exits that don't actually run anything to increment the current_step_index(). FML, this is lousy.. --- 078run_interactive.cc | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 078run_interactive.cc (limited to '078run_interactive.cc') diff --git a/078run_interactive.cc b/078run_interactive.cc new file mode 100644 index 00000000..25ca4dd9 --- /dev/null +++ b/078run_interactive.cc @@ -0,0 +1,58 @@ +//: Helper for the repl. + +:(before "End Primitive Recipe Declarations") +RUN_INTERACTIVE, +:(before "End Primitive Recipe Numbers") +Recipe_number["run-interactive"] = RUN_INTERACTIVE; +//? cerr << "run-interactive: " << RUN_INTERACTIVE << '\n'; //? 1 +:(before "End Primitive Recipe Implementations") +case RUN_INTERACTIVE: { + assert(scalar(ingredients.at(0))); +//? cerr << "AAA 0\n"; //? 1 + run_interactive(ingredients.at(0).at(0)); +//? cerr << "ZZZ\n"; //? 1 + continue; // not done with caller; don't increment current_step_index() +} + +:(code) +// manual tests: +// just an integer prints value of that location in memory +// instruction executes [not yet working] +// backspace at start begins new attempt +void run_interactive(long long int address) { +//? tb_shutdown(); //? 1 + long long int size = Memory[address]; + if (size == 0) { + ++current_step_index(); + return; + } + ostringstream tmp; + for (long long int curr = address+1; curr < address+size; ++curr) { + // todo: unicode + tmp << (char)(int)Memory[curr]; + } +//? cerr << size << ' ' << Memory[address+size] << '\n'; //? 1 + assert(Memory[address+size] == 10); // skip the newline + if (Recipe_number.find("interactive") == Recipe_number.end()) + Recipe_number["interactive"] = Next_recipe_number++; + if (is_integer(tmp.str())) { + cerr << "=> " << Memory[to_integer(tmp.str())] << '\n'; + ++current_step_index(); + return; + } +//? exit(0); //? 1 + if (Name[Recipe_number["interactive"]].find(tmp.str()) != Name[Recipe_number["interactive"]].end()) { + cerr << "=> " << Memory[Name[Recipe_number["interactive"]][tmp.str()]] << '\n'; + ++current_step_index(); + return; + } +//? tb_shutdown(); //? 1 +//? cerr << tmp.str(); //? 1 +//? exit(0); //? 1 +//? cerr << "AAA 1\n"; //? 1 + Recipe.erase(Recipe_number["interactive"]); + // call run(string) but without the scheduling + load("recipe interactive [\n"+tmp.str()+"]\n"); + transform_all(); + Current_routine->calls.push_front(call(Recipe_number["interactive"])); +} -- cgit 1.4.1-2-gfad0