diff options
-rw-r--r-- | 002test.cc | 2 | ||||
-rw-r--r-- | 041name.cc | 24 | ||||
-rw-r--r-- | 043space.cc | 3 | ||||
-rw-r--r-- | 070display.cc | 2 | ||||
-rw-r--r-- | edit.mu | 26 |
5 files changed, 33 insertions, 24 deletions
diff --git a/002test.cc b/002test.cc index a35f95bf..d59309a2 100644 --- a/002test.cc +++ b/002test.cc @@ -54,7 +54,7 @@ if (Run_tests) { time_t t; time(&t); cerr << "C tests: " << ctime(&t); for (size_t i=0; i < sizeof(Tests)/sizeof(Tests[0]); ++i) { -//? cerr << i << '\n'; //? 1 +//? cerr << i << '\n'; //? 2 run_test(i); } // End Tests diff --git a/041name.cc b/041name.cc index 20668ab5..e2c1d940 100644 --- a/041name.cc +++ b/041name.cc @@ -69,6 +69,8 @@ void transform_names(const recipe_number r) { void check_metadata(map<string, vector<type_number> >& metadata, const reagent& x, const recipe_number r) { if (is_literal(x)) return; if (is_raw(x)) return; + // if you use raw locations you're probably doing something unsafe + if (is_integer(x.name)) return; if (metadata.find(x.name) == metadata.end()) metadata[x.name] = x.types; if (metadata[x.name] != x.types) @@ -224,11 +226,12 @@ if (inst.operation == Recipe_number["get"] assert(SIZE(inst.ingredients) >= 2); //? cout << inst.ingredients.at(1).to_string() << '\n'; //? 1 assert(is_literal(inst.ingredients.at(1))); - if (inst.ingredients.at(1).name.find_first_not_of("0123456789") == string::npos) continue; - // since first non-address in base type must be a container, we don't have to canonize - type_number base_type = skip_addresses(inst.ingredients.at(0).types); - inst.ingredients.at(1).set_value(find_element_name(base_type, inst.ingredients.at(1).name)); - trace("name") << "element " << inst.ingredients.at(1).name << " of type " << Type[base_type].name << " is at offset " << inst.ingredients.at(1).value; + if (inst.ingredients.at(1).name.find_first_not_of("0123456789") != string::npos) { + // since first non-address in base type must be a container, we don't have to canonize + type_number base_type = skip_addresses(inst.ingredients.at(0).types); + inst.ingredients.at(1).set_value(find_element_name(base_type, inst.ingredients.at(1).name)); + trace("name") << "element " << inst.ingredients.at(1).name << " of type " << Type[base_type].name << " is at offset " << inst.ingredients.at(1).value; + } } //: this test is actually illegal so can't call run @@ -260,9 +263,10 @@ if (inst.operation == Recipe_number["maybe-convert"]) { // at least 2 args, and second arg is offset assert(SIZE(inst.ingredients) >= 2); assert(is_literal(inst.ingredients.at(1))); - if (inst.ingredients.at(1).name.find_first_not_of("0123456789") == string::npos) continue; - // since first non-address in base type must be an exclusive container, we don't have to canonize - type_number base_type = skip_addresses(inst.ingredients.at(0).types); - inst.ingredients.at(1).set_value(find_element_name(base_type, inst.ingredients.at(1).name)); - trace("name") << "variant " << inst.ingredients.at(1).name << " of type " << Type[base_type].name << " has tag " << inst.ingredients.at(1).value; + if (inst.ingredients.at(1).name.find_first_not_of("0123456789") != string::npos) { + // since first non-address in base type must be an exclusive container, we don't have to canonize + type_number base_type = skip_addresses(inst.ingredients.at(0).types); + inst.ingredients.at(1).set_value(find_element_name(base_type, inst.ingredients.at(1).name)); + trace("name") << "variant " << inst.ingredients.at(1).name << " of type " << Type[base_type].name << " has tag " << inst.ingredients.at(1).value; + } } diff --git a/043space.cc b/043space.cc index ddff7a4a..52c92f87 100644 --- a/043space.cc +++ b/043space.cc @@ -55,7 +55,8 @@ reagent absolutize(reagent x) { //? cout << is_raw(x) << '\n'; //? 1 if (is_raw(x) || is_dummy(x)) return x; //? cout << "not raw: " << x.to_string() << '\n'; //? 1 - assert(x.initialized); + if (!x.initialized) + raise << current_instruction().to_string() << ": reagent not initialized: " << x.to_string() << die(); reagent r = x; r.set_value(address(r.value, space_base(r))); //? cout << "after absolutize: " << r.value << '\n'; //? 1 diff --git a/070display.cc b/070display.cc index 07656c7d..9cec82ca 100644 --- a/070display.cc +++ b/070display.cc @@ -271,6 +271,8 @@ case CHECK_FOR_INTERACTION: { break; } if (event_type == TB_EVENT_MOUSE) { +//? tb_shutdown(); //? 1 +//? cerr << "AAA\n"; //? 1 products.at(0).push_back(/*touch event*/2); products.at(0).push_back(event.key); // which button, etc. products.at(0).push_back(event.y); // row diff --git a/edit.mu b/edit.mu index 214925ea..b04b9645 100644 --- a/edit.mu +++ b/edit.mu @@ -33,12 +33,12 @@ scenario editor-initially-prints-string-to-screen [ ## text to the screen. container editor-data [ - # doubly linked list of characters + # doubly linked list of characters (head contains a special marker) data:address:duplex-list # location of top-left of screen inside data (scrolling) top-of-screen:address:duplex-list - # location of cursor inside data - cursor:address:duplex-list + # location before cursor inside data + before-cursor:address:duplex-list screen:address:screen # raw bounds of display area on screen @@ -65,6 +65,8 @@ recipe new-editor [ right:number <- next-ingredient right:number <- subtract right:number, 1:literal result:address:editor-data <- new editor-data:type + d:address:address:duplex-list <- get-address result:address:editor-data/deref, data:offset + d:address:address:duplex-list/deref <- push-duplex 167:literal/§, 0:literal/tail # initialize screen-related fields sc:address:address:screen <- get-address result:address:editor-data/deref, screen:offset sc:address:address:screen/deref <- copy screen:address @@ -90,10 +92,7 @@ recipe new-editor [ # s is guaranteed to have at least one character, so initialize result's # duplex-list init:address:address:duplex-list <- get-address result:address:editor-data/deref, top-of-screen:offset - init:address:address:duplex-list/deref <- copy 0:literal - c:character <- index s:address:array:character/deref, idx:number - idx:number <- add idx:number, 1:literal - init:address:address:duplex-list/deref <- push c:character, init:address:address:duplex-list/deref + init:address:address:duplex-list/deref <- copy d:address:address:duplex-list/deref curr:address:duplex-list <- copy init:address:address:duplex-list/deref # now we can start appending the rest, character by character { @@ -111,7 +110,7 @@ recipe new-editor [ loop } # initialize cursor to top of screen - y:address:address:duplex-list <- get-address result:address:editor-data/deref, cursor:offset + y:address:address:duplex-list <- get-address result:address:editor-data/deref, before-cursor:offset y:address:address:duplex-list/deref <- copy init:address:address:duplex-list/deref # perform initial rendering to screen bottom:address:number <- get-address result:address:editor-data/deref, bottom:offset @@ -126,9 +125,9 @@ scenario editor-initializes-without-data [ 2:editor-data <- copy 1:address:editor-data/deref ] memory-should-contain [ - 2 <- 0 # data + # 2 <- just the § marker 3 <- 0 # pointer into data to top of screen - 4 <- 0 # pointer into data to cursor + # 4 (before cursor) <- the § marker # 5 <- screen 6 <- 1 # top 7 <- 2 # left @@ -154,6 +153,7 @@ recipe render [ right:number <- next-ingredient # traversing editor curr:address:duplex-list <- get editor:address:editor-data/deref, top-of-screen:offset + curr:address:duplex-list <- next-duplex curr:address:duplex-list # traversing screen row:number <- copy top:number column:number <- copy left:number @@ -277,12 +277,14 @@ recipe event-loop [ break-if quit?:boolean # only in tests trace [app], [next-event] { - t:address:touch-event <- maybe-convert e:event, touch:variant + t:address:touch-event <- maybe-convert e:event, 2:variant break-unless t:address:touch-event editor:address:editor-data <- move-cursor-in-editor editor:address:editor-data, t:address:touch-event/deref loop +next-event:label } + $print e:event c:address:character <- maybe-convert e:event, text:variant + close-console assert c:address:character, [event was of unknown type; neither keyboard nor mouse] loop } @@ -297,7 +299,7 @@ recipe move-cursor-in-editor [ column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset column:address:number/deref <- get t:touch-event, column:offset # clear cursor pointer; will be set correctly during render - cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, cursor:offset + cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset cursor:address:address:duplex-list/deref <- copy 0:literal ] |