about summary refs log tree commit diff stats
path: root/033exclusive_container.cc
Commit message (Expand)AuthorAgeFilesLines
* 3123Kartik K. Agaram2016-07-221-5/+16
* 3120Kartik K. Agaram2016-07-211-5/+5
* 3108Kartik K. Agaram2016-07-101-1/+0
* 3048 - bugfix: checking 'merge' instructionsKartik K. Agaram2016-06-111-1/+21
* 3046Kartik K. Agaram2016-06-111-3/+3
* 2990Kartik K. Agaram2016-05-201-9/+9
* 2965 - update refcounts when copying containersKartik K. Agaram2016-05-151-3/+7
* 2955 - back to more refcount housekeepingKartik K. Agaram2016-05-121-3/+3
* 2936Kartik K. Agaram2016-05-071-2/+2
* 2935Kartik K. Agaram2016-05-071-3/+3
* 2934 - all layers running againKartik K. Agaram2016-05-071-2/+0
* 2931 - be explicit about making copiesKartik K. Agaram2016-05-061-13/+13
* 2898 - start filling in missing refcountsKartik K. Agaram2016-05-031-6/+7
* 2893Kartik K. Agaram2016-05-031-0/+424
* 2863Kartik K. Agaram2016-04-241-414/+0
* 2861 - 'maybe-convert' no longer returns addressKartik K. Agaram2016-04-231-13/+51
* 2818Kartik K. Agaram2016-03-281-2/+2
* 2803Kartik K. Agaram2016-03-211-6/+6
* 2773 - switch to 'int'Kartik K. Agaram2016-03-131-8/+8
* 2769 - fix build_and_test_until 043space.ccKartik K. Agaram2016-03-131-3/+3
* 2735 - define recipes using 'def'Kartik K. Agaram2016-03-081-13/+13
* 2712Kartik K. Agaram2016-02-261-8/+8
* 2709Kartik K. Agaram2016-02-251-5/+0
* 2704 - eradicate all mention of warnings from coreKartik K. Agaram2016-02-251-1/+1
* 2681 - drop reagent types from reagent propertiesKartik K. Agaram2016-02-211-4/+3
* 2677Kartik K. Agaram2016-02-201-1/+1
* 2671 - never use debug_string() in tracesKartik K. Agaram2016-02-191-4/+4
* 2685Kartik K. Agaram2016-02-191-4/+4
* 2679 - all tests passing againKartik K. Agaram2016-02-191-2/+3
* 2667 - redo container data structureKartik K. Agaram2016-02-171-14/+6
* 2660 - check dynamic arrays in exclusive containersKartik K. Agaram2016-02-151-0/+17
* 2657 - type-checking for 'merge' instructionsKartik K. Agaram2016-02-151-0/+139
* 2655 - support shape-shifting exclusive containersKartik K. Agaram2016-02-141-2/+3
* 2653Kartik K. Agaram2016-02-141-10/+8
* 2635Kartik K. Agaram2016-02-061-0/+2
* 2582Kartik K. Agaram2016-01-201-2/+2
* 2580 - check product type of 'maybe-convert'Kartik K. Agaram2016-01-201-4/+46
* 2555Kartik K. Agaram2016-01-111-3/+3
* 2378Kartik K. Agaram2015-11-061-1/+1
* 2377 - stop using operator[] in mapKartik K. Agaram2015-11-061-16/+16
* 2311Kartik K. Agaram2015-10-291-1/+1
* 2284Kartik K. Agaram2015-10-261-5/+5
* 2277 - reagents now have a tree of typesKartik K. Agaram2015-10-251-12/+10
* 2270Kartik K. Agaram2015-10-121-1/+1
* 2258 - separate warnings from errorsKartik K. Agaram2015-10-061-5/+5
* 2230Kartik K. Agaram2015-10-011-11/+17
* 2226 - standardize warning formatKartik K. Agaram2015-10-011-3/+3
* 2115Kartik K. Agaram2015-08-301-0/+36
* 1988 - handle reagents without typesKartik K. Agaram2015-08-131-2/+1
* 1923Kartik K. Agaram2015-08-021-1/+1
p">(Recipe, r).name) << "'$open-file-for-reading' requires exactly one product, but got '" << to_original_string(inst) << "'\n" << end(); break; } if (!is_mu_number(inst.products.at(0))) { raise << maybe(get(Recipe, r).name) << "first product of '$open-file-for-reading' should be a number (file handle), but got '" << to_string(inst.products.at(0)) << "'\n" << end(); break; } break; } :(before "End Primitive Recipe Implementations") case _OPEN_FILE_FOR_READING: { string filename = read_mu_text(ingredients.at(0).at(/*skip alloc id*/1)); assert(sizeof(long long int) >= sizeof(FILE*)); FILE* f = fopen(filename.c_str(), "r"); long long int result = reinterpret_cast<long long int>(f); products.resize(1); products.at(0).push_back(static_cast<double>(result)); break; } :(before "End Primitive Recipe Declarations") _OPEN_FILE_FOR_WRITING, :(before "End Primitive Recipe Numbers") put(Recipe_ordinal, "$open-file-for-writing", _OPEN_FILE_FOR_WRITING); :(before "End Primitive Recipe Checks") case _OPEN_FILE_FOR_WRITING: { if (SIZE(inst.ingredients) != 1) { raise << maybe(get(Recipe, r).name) << "'$open-file-for-writing' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end(); break; } if (!is_mu_text(inst.ingredients.at(0))) { raise << maybe(get(Recipe, r).name) << "first ingredient of '$open-file-for-writing' should be a string, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end(); break; } if (SIZE(inst.products) != 1) { raise << maybe(get(Recipe, r).name) << "'$open-file-for-writing' requires exactly one product, but got '" << to_original_string(inst) << "'\n" << end(); break; } if (!is_mu_number(inst.products.at(0))) { raise << maybe(get(Recipe, r).name) << "first product of '$open-file-for-writing' should be a number (file handle), but got '" << to_string(inst.products.at(0)) << "'\n" << end(); break; } break; } :(before "End Primitive Recipe Implementations") case _OPEN_FILE_FOR_WRITING: { string filename = read_mu_text(ingredients.at(0).at(/*skip alloc id*/1)); assert(sizeof(long long int) >= sizeof(FILE*)); long long int result = reinterpret_cast<long long int>(fopen(filename.c_str(), "w")); products.resize(1); products.at(0).push_back(static_cast<double>(result)); break; } :(before "End Primitive Recipe Declarations") _READ_FROM_FILE, :(before "End Primitive Recipe Numbers") put(Recipe_ordinal, "$read-from-file", _READ_FROM_FILE); :(before "End Primitive Recipe Checks") case _READ_FROM_FILE: { if (SIZE(inst.ingredients) != 1) { raise << maybe(get(Recipe, r).name) << "'$read-from-file' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end(); break; } if (!is_mu_number(inst.ingredients.at(0))) { raise << maybe(get(Recipe, r).name) << "first ingredient of '$read-from-file' should be a number, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end(); break; } if (SIZE(inst.products) != 2) { raise << maybe(get(Recipe, r).name) << "'$read-from-file' requires exactly two products, but got '" << to_original_string(inst) << "'\n" << end(); break; } if (!is_mu_character(inst.products.at(0))) { raise << maybe(get(Recipe, r).name) << "first product of '$read-from-file' should be a character, but got '" << to_string(inst.products.at(0)) << "'\n" << end(); break; } if (!is_mu_boolean(inst.products.at(1))) { raise << maybe(get(Recipe, r).name) << "second product of '$read-from-file' should be a boolean, but got '" << to_string(inst.products.at(1)) << "'\n" << end(); break; } break; } :(before "End Primitive Recipe Implementations") case _READ_FROM_FILE: { long long int x = static_cast<long long int>(ingredients.at(0).at(0)); FILE* f = reinterpret_cast<FILE*>(x); if (f == NULL) { raise << maybe(current_recipe_name()) << "can't read from null file in '" << to_string(current_instruction()) << "'\n" << end(); break; } products.resize(2); if (feof(f)) { products.at(0).push_back(0); products.at(1).push_back(1); // eof break; } if (ferror(f)) { raise << maybe(current_recipe_name()) << "file in invalid state in '" << to_string(current_instruction()) << "'\n" << end(); break; } char c = getc(f); // todo: unicode if (c == EOF) { products.at(0).push_back(0); products.at(1).push_back(1); // eof break; } if (ferror(f)) { raise << maybe(current_recipe_name()) << "couldn't read from file in '" << to_string(current_instruction()) << "'\n" << end(); raise << " errno: " << errno << '\n' << end(); break; } products.at(0).push_back(c); products.at(1).push_back(0); // not eof break; } :(before "End Includes") #include <errno.h> :(before "End Primitive Recipe Declarations") _WRITE_TO_FILE, :(before "End Primitive Recipe Numbers") put(Recipe_ordinal, "$write-to-file", _WRITE_TO_FILE); :(before "End Primitive Recipe Checks") case _WRITE_TO_FILE: { if (SIZE(inst.ingredients) != 2) { raise << maybe(get(Recipe, r).name) << "'$write-to-file' requires exactly two ingredients, but got '" << to_original_string(inst) << "'\n" << end(); break; } if (!is_mu_number(inst.ingredients.at(0))) { raise << maybe(get(Recipe, r).name) << "first ingredient of '$write-to-file' should be a number, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end(); break; } if (!is_mu_character(inst.ingredients.at(1))) { raise << maybe(get(Recipe, r).name) << "second ingredient of '$write-to-file' should be a character, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end(); break; } if (!inst.products.empty()) { raise << maybe(get(Recipe, r).name) << "'$write-to-file' writes to no products, but got '" << to_original_string(inst) << "'\n" << end(); break; } break; } :(before "End Primitive Recipe Implementations") case _WRITE_TO_FILE: { long long int x = static_cast<long long int>(ingredients.at(0).at(0)); FILE* f = reinterpret_cast<FILE*>(x); if (f == NULL) { raise << maybe(current_recipe_name()) << "can't write to null file in '" << to_string(current_instruction()) << "'\n" << end(); break; } if (feof(f)) break; if (ferror(f)) { raise << maybe(current_recipe_name()) << "file in invalid state in '" << to_string(current_instruction()) << "'\n" << end(); break; } long long int y = static_cast<long long int>(ingredients.at(1).at(0)); char c = static_cast<char>(y); putc(c, f); // todo: unicode if (ferror(f)) { raise << maybe(current_recipe_name()) << "couldn't write to file in '" << to_string(current_instruction()) << "'\n" << end(); raise << " errno: " << errno << '\n' << end(); break; } break; } :(before "End Primitive Recipe Declarations") _CLOSE_FILE, :(before "End Primitive Recipe Numbers") put(Recipe_ordinal, "$close-file", _CLOSE_FILE); :(before "End Primitive Recipe Checks") case _CLOSE_FILE: { if (SIZE(inst.ingredients) != 1) { raise << maybe(get(Recipe, r).name) << "'$close-file' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end(); break; } if (!is_mu_number(inst.ingredients.at(0))) { raise << maybe(get(Recipe, r).name) << "first ingredient of '$close-file' should be a number, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end(); break; } if (SIZE(inst.products) != 1) { raise << maybe(get(Recipe, r).name) << "'$close-file' requires exactly one product, but got '" << to_original_string(inst) << "'\n" << end(); break; } if (inst.products.at(0).name != inst.ingredients.at(0).name) { raise << maybe(get(Recipe, r).name) << "'$close-file' requires its product to be the same as its ingredient, but got '" << to_original_string(inst) << "'\n" << end(); break; } break; } :(before "End Primitive Recipe Implementations") case _CLOSE_FILE: { long long int x = static_cast<long long int>(ingredients.at(0).at(0)); FILE* f = reinterpret_cast<FILE*>(x); fclose(f); products.resize(1); products.at(0).push_back(0); // todo: ensure that caller always resets the ingredient break; }