From 9542bb112419d575190a72baf7f964c3e32df223 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sat, 25 Jul 2015 22:15:51 -0700 Subject: 1853 --- html/082persist.cc.html | 75 +++++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 28 deletions(-) (limited to 'html/082persist.cc.html') diff --git a/html/082persist.cc.html b/html/082persist.cc.html index cf056dba..a450633a 100644 --- a/html/082persist.cc.html +++ b/html/082persist.cc.html @@ -15,11 +15,12 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } * { font-size: 1.05em; } .cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.PreProc { color: #c000c0; } +.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } -.Identifier { color: #804000; } -.PreProc { color: #c000c0; } .CommentedCode { color: #6c6c6c; } +.Identifier { color: #804000; } --> @@ -40,24 +41,35 @@ RESTORE, :(before "End Primitive Recipe Numbers") Recipe_ordinal["restore"] = RESTORE; :(before "End Primitive Recipe Implementations") -case RESTORE: { - if (!scalar(ingredients.at(0))) - raise << "restore: illegal operand " << current_instruction().ingredients.at(0).to_string() << '\n'; +case RESTORE: { + if (SIZE(ingredients) != 1) { + raise << current_recipe_name() << ": 'restore' requires exactly one ingredient, but got " << current_instruction().to_string() << '\n' << end(); + break; + } + if (!scalar(ingredients.at(0))) + raise << current_recipe_name() << ": first ingredient of 'restore' should be a literal string, but got " << current_instruction().ingredients.at(0).to_string() << '\n' << end(); products.resize(1); - products.at(0).push_back(new_string(slurp("lesson/"+current_instruction().ingredients.at(0).name))); + string filename = current_instruction().ingredients.at(0).name; + if (!is_literal(current_instruction().ingredients.at(0))) + filename = to_string(ingredients.at(0).at(0)); + string contents = slurp("lesson/"+filename); + if (contents.empty()) + products.at(0).push_back(0); + else + products.at(0).push_back(new_mu_string(contents)); break; } :(code) -string slurp(const string& filename) { +string slurp(const string& filename) { //? cerr << filename << '\n'; //? 1 ostringstream result; ifstream fin(filename.c_str()); fin.peek(); - if (!fin) return result.str(); // don't bother checking errno - const int N = 1024; - char buf[N]; - while (!fin.eof()) { + if (!fin) return result.str(); // don't bother checking errno + const int N = 1024; + char buf[N]; + while (!fin.eof()) { bzero(buf, N); fin.read(buf, N-1); // leave at least one null result << buf; @@ -72,35 +84,42 @@ SAVE, :(before "End Primitive Recipe Numbers") Recipe_ordinal["save"] = SAVE; :(before "End Primitive Recipe Implementations") -case SAVE: { - if (!scalar(ingredients.at(0))) - raise << "save: illegal operand 0 " << current_instruction().ingredients.at(0).to_string() << '\n'; - string filename = current_instruction().ingredients.at(0).name; - if (!is_literal(current_instruction().ingredients.at(0))) { - ostringstream tmp; - tmp << ingredients.at(0).at(0); - filename = tmp.str(); +case SAVE: { + if (SIZE(ingredients) != 2) { + raise << current_recipe_name() << ": 'save' requires exactly two ingredients, but got " << current_instruction().to_string() << '\n' << end(); + break; } + if (!scalar(ingredients.at(0))) + raise << current_recipe_name() << ": first ingredient of 'save' should be a literal string, but got " << current_instruction().ingredients.at(0).to_string() << '\n' << end(); + string filename = current_instruction().ingredients.at(0).name; + if (!is_literal(current_instruction().ingredients.at(0))) + filename = to_string(ingredients.at(0).at(0)); ofstream fout(("lesson/"+filename).c_str()); - if (!scalar(ingredients.at(1))) - raise << "save: illegal operand 1 " << current_instruction().ingredients.at(1).to_string() << '\n'; - string contents = to_string(ingredients.at(1).at(0)); + if (!scalar(ingredients.at(1))) + raise << current_recipe_name() << ": second ingredient of 'save' should be an address:array:character, but got " << current_instruction().ingredients.at(1).to_string() << '\n' << end(); + string contents = read_mu_string(ingredients.at(1).at(0)); fout << contents; fout.close(); - if (!exists("lesson/.git")) break; + if (!exists("lesson/.git")) break; // bug in git: git diff -q messes up --exit-code - int status = system("cd lesson; git add .; git diff HEAD --exit-code >/dev/null || git commit -a -m . >/dev/null"); - if (status != 0) - raise << "error in commit: contents " << contents << '\n'; + int status = system("cd lesson; git add .; git diff HEAD --exit-code >/dev/null || git commit -a -m . >/dev/null"); + if (status != 0) + raise << "error in commit: contents " << contents << '\n' << end(); break; } :(code) -bool exists(const string& filename) { - struct stat dummy; +bool exists(const string& filename) { + struct stat dummy; return 0 == stat(filename.c_str(), &dummy); } +string to_string(long long int x) { + ostringstream tmp; + tmp << x; + return tmp.str(); +} + :(before "End Includes") #include<sys/stat.h> -- cgit 1.4.1-2-gfad0