From 0893d65e27e00e123d8d4f58a4c50dabe32ae7fa Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sat, 15 Oct 2016 23:55:21 -0700 Subject: 3504 --- 089scenario_filesystem.cc | 116 +++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 58 deletions(-) (limited to '089scenario_filesystem.cc') diff --git a/089scenario_filesystem.cc b/089scenario_filesystem.cc index 95880cce..6f65b06f 100644 --- a/089scenario_filesystem.cc +++ b/089scenario_filesystem.cc @@ -1,14 +1,14 @@ //: Clean syntax to manipulate and check the file system in scenarios. -//: Instructions 'assume-filesystem' and 'filesystem-should-contain' implicitly create -//: a variable called 'filesystem' that is accessible to later instructions in -//: the scenario. 'filesystem-should-contain' can check unicode characters in -//: the fake filesystem +//: Instructions 'assume-resources' and 'resources-should-contain' implicitly create +//: a variable called 'resources' that is accessible to later instructions in +//: the scenario. 'resources-should-contain' can check unicode characters in +//: the fake resources :(scenarios run_mu_scenario) :(scenario simple_filesystem) scenario simple-filesystem [ local-scope - assume-filesystem [ + assume-resources [ # file 'a' containing two lines of data [a] <- [ |a bc| @@ -20,18 +20,18 @@ scenario simple-filesystem [ |xyz| ] ] - data:&:@:file-mapping <- get *filesystem, data:offset - file1:file-mapping <- index *data, 0 + data:&:@:resource <- get *resources, data:offset + file1:resource <- index *data, 0 file1-name:text <- get file1, name:offset 10:@:char/raw <- copy *file1-name file1-contents:text <- get file1, contents:offset 100:@:char/raw <- copy *file1-contents - file2:file-mapping <- index *data, 1 + file2:resource <- index *data, 1 file2-name:text <- get file2, name:offset 30:@:char/raw <- copy *file2-name file2-contents:text <- get file2, contents:offset 40:@:char/raw <- copy *file2-contents - file3:file-mapping <- index *data, 2 + file3:resource <- index *data, 2 file3-name:text <- get file3, name:offset 50:@:char/raw <- copy *file3-name file3-contents:text <- get file3, contents:offset @@ -52,15 +52,15 @@ de f :(scenario escaping_file_contents) scenario escaping-file-contents [ local-scope - assume-filesystem [ + assume-resources [ # file 'a' containing a '|' # need to escape '\' once for each block [a] <- [ |x\\\\|yz| ] ] - data:&:@:file-mapping <- get *filesystem, data:offset - file1:file-mapping <- index *data, 0 + data:&:@:resource <- get *resources, data:offset + file1:resource <- index *data, 0 file1-name:text <- get file1, name:offset 10:@:char/raw <- copy *file1-name file1-contents:text <- get file1, contents:offset @@ -73,43 +73,43 @@ scenario escaping-file-contents [ ] :(before "End Globals") -extern const int FILESYSTEM = Next_predefined_global_for_scenarios++; -//: give 'filesystem' a fixed location in scenarios +extern const int RESOURCES = Next_predefined_global_for_scenarios++; +//: give 'resources' a fixed location in scenarios :(before "End Special Scenario Variable Names(r)") -Name[r]["filesystem"] = FILESYSTEM; -//: make 'filesystem' always a raw location in scenarios +Name[r]["resources"] = RESOURCES; +//: make 'resources' always a raw location in scenarios :(before "End is_special_name Cases") -if (s == "filesystem") return true; +if (s == "resources") return true; :(before "End Initialize Type Of Special Name In Scenario(r)") -if (r.name == "filesystem") r.type = new_type_tree("address:filesystem"); +if (r.name == "resources") r.type = new_type_tree("address:resources"); :(before "End initialize_transform_rewrite_literal_string_to_text()") -recipes_taking_literal_strings.insert("assume-filesystem"); +recipes_taking_literal_strings.insert("assume-resources"); //: screen-should-contain is a regular instruction :(before "End Primitive Recipe Declarations") -ASSUME_FILESYSTEM, +ASSUME_RESOURCES, :(before "End Primitive Recipe Numbers") -put(Recipe_ordinal, "assume-filesystem", ASSUME_FILESYSTEM); +put(Recipe_ordinal, "assume-resources", ASSUME_RESOURCES); :(before "End Primitive Recipe Checks") -case ASSUME_FILESYSTEM: { +case ASSUME_RESOURCES: { break; } :(before "End Primitive Recipe Implementations") -case ASSUME_FILESYSTEM: { +case ASSUME_RESOURCES: { assert(scalar(ingredients.at(0))); - assume_filesystem(current_instruction().ingredients.at(0).name, current_recipe_name()); + assume_resources(current_instruction().ingredients.at(0).name, current_recipe_name()); break; } :(code) -void assume_filesystem(const string& data, const string& caller) { +void assume_resources(const string& data, const string& caller) { map contents; - parse_filesystem(data, contents, caller); - construct_filesystem_object(contents); + parse_resources(data, contents, caller); + construct_resources_object(contents); } -void parse_filesystem(const string& data, map& out, const string& caller) { +void parse_resources(const string& data, map& out, const string& caller) { istringstream in(data); in >> std::noskipws; while (true) { @@ -118,44 +118,44 @@ void parse_filesystem(const string& data, map& out, const string if (!has_data(in)) break; string filename = next_word(in); if (*filename.begin() != '[') { - raise << caller << ": assume-filesystem: filename '" << filename << "' must begin with a '['\n" << end(); + raise << caller << ": assume-resources: filename '" << filename << "' must begin with a '['\n" << end(); break; } if (*filename.rbegin() != ']') { - raise << caller << ": assume-filesystem: filename '" << filename << "' must end with a ']'\n" << end(); + raise << caller << ": assume-resources: filename '" << filename << "' must end with a ']'\n" << end(); break; } filename.erase(0, 1); filename.erase(SIZE(filename)-1); if (!has_data(in)) { - raise << caller << ": assume-filesystem: no data for filename '" << filename << "'\n" << end(); + raise << caller << ": assume-resources: no data for filename '" << filename << "'\n" << end(); break; } string arrow = next_word(in); if (arrow != "<-") { - raise << caller << ": assume-filesystem: expected '<-' after filename '" << filename << "' but got '" << arrow << "'\n" << end(); + raise << caller << ": assume-resources: expected '<-' after filename '" << filename << "' but got '" << arrow << "'\n" << end(); break; } if (!has_data(in)) { - raise << caller << ": assume-filesystem: no data for filename '" << filename << "' after '<-'\n" << end(); + raise << caller << ": assume-resources: no data for filename '" << filename << "' after '<-'\n" << end(); break; } string contents = next_word(in); if (*contents.begin() != '[') { - raise << caller << ": assume-filesystem: file contents '" << contents << "' for filename '" << filename << "' must begin with a '['\n" << end(); + raise << caller << ": assume-resources: file contents '" << contents << "' for filename '" << filename << "' must begin with a '['\n" << end(); break; } if (*contents.rbegin() != ']') { - raise << caller << ": assume-filesystem: file contents '" << contents << "' for filename '" << filename << "' must end with a ']'\n" << end(); + raise << caller << ": assume-resources: file contents '" << contents << "' for filename '" << filename << "' must end with a ']'\n" << end(); break; } contents.erase(0, 1); contents.erase(SIZE(contents)-1); - put(out, filename, munge_filesystem_contents(contents, filename, caller)); + put(out, filename, munge_resources_contents(contents, filename, caller)); } } -string munge_filesystem_contents(const string& data, const string& filename, const string& caller) { +string munge_resources_contents(const string& data, const string& filename, const string& caller) { if (data.empty()) return ""; istringstream in(data); in >> std::noskipws; @@ -166,7 +166,7 @@ string munge_filesystem_contents(const string& data, const string& filename, con skip_whitespace(in); if (!has_data(in)) break; if (in.peek() != '|') { - raise << caller << ": assume-filesystem: file contents for filename '" << filename << "' must be delimited in '|'s\n" << end(); + raise << caller << ": assume-resources: file contents for filename '" << filename << "' must be delimited in '|'s\n" << end(); break; } in.get(); // skip leading '|' @@ -177,7 +177,7 @@ string munge_filesystem_contents(const string& data, const string& filename, con if (line.at(i) == '\\') { ++i; // skip if (i == SIZE(line)) { - raise << caller << ": assume-filesystem: file contents can't end a line with '\\'\n" << end(); + raise << caller << ": assume-resources: file contents can't end a line with '\\'\n" << end(); break; } } @@ -189,9 +189,9 @@ string munge_filesystem_contents(const string& data, const string& filename, con return out.str(); } -void construct_filesystem_object(const map& contents) { - int filesystem_data_address = allocate(SIZE(contents)*2 + /*array length*/1); - int curr = filesystem_data_address + /*skip refcount and length*/2; +void construct_resources_object(const map& contents) { + int resources_data_address = allocate(SIZE(contents)*2 + /*array length*/1); + int curr = resources_data_address + /*skip refcount and length*/2; for (map::const_iterator p = contents.begin(); p != contents.end(); ++p) { put(Memory, curr, new_mu_text(p->first)); trace(9999, "mem") << "storing file name " << get(Memory, curr) << " in location " << curr << end(); @@ -204,29 +204,29 @@ void construct_filesystem_object(const map& contents) { trace(9999, "mem") << "storing refcount 1 in location " << get(Memory, curr) << end(); ++curr; } - curr = filesystem_data_address+/*skip refcount*/1; + curr = resources_data_address+/*skip refcount*/1; put(Memory, curr, SIZE(contents)); // size of array - trace(9999, "mem") << "storing filesystem size " << get(Memory, curr) << " in location " << curr << end(); - put(Memory, filesystem_data_address, 1); // initialize refcount - trace(9999, "mem") << "storing refcount 1 in location " << filesystem_data_address << end(); - // wrap the filesystem data in a filesystem object - int filesystem_address = allocate(size_of_filesystem()); - curr = filesystem_address+/*skip refcount*/1; - put(Memory, curr, filesystem_data_address); - trace(9999, "mem") << "storing filesystem data address " << filesystem_data_address << " in location " << curr << end(); - put(Memory, filesystem_address, 1); // initialize refcount - trace(9999, "mem") << "storing refcount 1 in location " << filesystem_address << end(); + trace(9999, "mem") << "storing resources size " << get(Memory, curr) << " in location " << curr << end(); + put(Memory, resources_data_address, 1); // initialize refcount + trace(9999, "mem") << "storing refcount 1 in location " << resources_data_address << end(); + // wrap the resources data in a 'resources' object + int resources_address = allocate(size_of_resources()); + curr = resources_address+/*skip refcount*/1; + put(Memory, curr, resources_data_address); + trace(9999, "mem") << "storing resources data address " << resources_data_address << " in location " << curr << end(); + put(Memory, resources_address, 1); // initialize refcount + trace(9999, "mem") << "storing refcount 1 in location " << resources_address << end(); // save in product - put(Memory, FILESYSTEM, filesystem_address); - trace(9999, "mem") << "storing filesystem address " << filesystem_address << " in location " << FILESYSTEM << end(); + put(Memory, RESOURCES, resources_address); + trace(9999, "mem") << "storing resources address " << resources_address << " in location " << RESOURCES << end(); } -int size_of_filesystem() { +int size_of_resources() { // memoize result if already computed static int result = 0; if (result) return result; - assert(get(Type_ordinal, "filesystem")); - type_tree* type = new type_tree("filesystem"); + assert(get(Type_ordinal, "resources")); + type_tree* type = new type_tree("resources"); result = size_of(type)+/*refcount*/1; delete type; return result; -- cgit 1.4.1-2-gfad0