#include #include #include #include #include #include #include "roman.h" #include "FRC.h" #include "input.h" //HelpStr, iHelpStr #include "strings.h" using std::string; using std::vector; using std::cin; using std::cout; using std::endl; bool Continue = true; input_trie commands; std::map vars; std::map settings; void runCommand(input_trie commands, string in); #define INPUT_TRIE_DECL(x) std::pair(std::string(x), new functdata(\ [](std::vector inList) -> std::vector{ int main(int argc, char** argv) { string in; commands.insert( std::vector>({ std::pair(std::string("h"), new functdata( [](std::vector inList) -> std::vector{ if (inList.size() > 1) { int len = 0; functdata *found = commands.longestPrefix(toLower(inList[1]), &len); if (found) { return {found->help}; } else { return {string("Nothing found for \"")+toLower(inList[1])+"\""}; } } else { //from strings.h return iHelpStr; }}, 0, 1, std::string("Get help"), functdata::Single)), std::pair(std::string("q"), new functdata( [](std::vector inList) -> std::vector{ Continue = false; return {}; }, 0, std::string("Quit"))), std::pair(std::string("set"), new functdata( [](std::vector inList) -> std::vector{ inList[1].resize(inList[1].size()); if (inList.size() > 2) settings[toLower(inList[1])] = truthy(inList[2]); else settings[toLower(inList[1])] = !settings[toLower(inList[1])]; return {}; }, 1, 2, std::string("Change settings (toggle if no argument)"), functdata::Single)), std::pair(std::string("?"), new functdata( [](std::vector inList) -> std::vector{ if (inList.size() == 2) { inList[1].resize(inList[1].size()); return {settings[toLower(inList[1])]?std::string("on"):std::string("off")}; } else { std::vector ret; for (auto i : settings) { ret.push_back(std::string("\"")+i.first+"\":"+std::to_string(i.second)); } return ret; } }, 0, 1, std::string("Query setting"), functdata::Single)), std::pair(std::string("e"), new functdata( [](std::vector inList) -> std::vector{ std::vector ret; string tmp = "["; for (auto i : inList) { (tmp+=i)+=':'; } tmp+=']'; ret.push_back(tmp); return ret; }, 0, std::string("Echo inputs"))), std::pair(std::string("el"), new functdata( [](std::vector inList) -> std::vector{ std::vector ret; inList.erase(inList.begin()); for (auto i : inList) { ret.push_back(i); } return ret; }, 0, std::string("Echo inputs (Long)"))), std::pair(std::string("es"), new functdata( [](std::vector inList) -> std::vector{ return {inList[1]}; }, 1, 1, std::string("Echo inputs (Single)"), functdata::Single)), std::pair(std::string("ec"), new functdata( [](std::vector inList) -> std::vector{ std::string ret {inList[1]}; inList.erase(inList.begin()); inList.erase(inList.begin()); for (auto i : inList) { ret += ' ' + i; } return {ret}; }, 1, -1, std::string("Echo inputs (Collating)"), functdata::Batch)), std::pair(std::string("k"), new functdata( [](std::vector inList) -> std::vector{ std::vector ret; inList.erase(inList.begin()); std::vector a; for (auto i : inList) { a = tokenizeInput(i); ret.insert(ret.end(), a.begin(), a.end()); } return ret; }, 0, std::string("Tokenize input (again)"))), std::pair(std::string("s"), new functdata( [](std::vector inList) -> std::vector{ std::vector ret; inList.erase(inList.begin()); for (auto i : inList) { ret.push_back(sanitizeAN(toLower(i))); } return ret; }, 0, std::string("Sanitize inputs"))), std::pair(std::string("sa"), new functdata( [](std::vector inList) -> std::vector{ std::vector ret; inList.erase(inList.begin()); for (auto i : inList) { ret.push_back(sanitizeAlpha(toLower(i))); } return ret; }, 0, std::string("Sanitize inputs to only alphabeticals"))), std::pair(std::string("sn"), new functdata( [](std::vector inList) -> std::vector{ std::vector ret; inList.erase(inList.begin()); for (auto i : inList) { ret.push_back(sanitizeNumeric(i)); } return ret; }, 0, std::string("Sanitize input number"))), std::pair(std::string("sr"), new functdata( [](std::vector inList) -> std::vector{ std::vector ret; inList.erase(inList.begin()); for (auto i : inList) { ret.push_back(Roman::E.sanitizeNumeral(i)); } return ret; }, 0, std::string("Sanitize input RN"))), std::pair(std::string("srl"), new functdata( [](std::vector inList) -> std::vector{ std::vector ret; inList.erase(inList.begin()); for (auto i : inList) { ret.push_back(Roman::L.sanitizeNumeral(i)); } return ret; }, 0, std::string("Sanitize input RN"))), std::pair(std::string("x"), new functdata( [](std::vector inList) -> std::vector{ return commands.execute( std::vector(inList.begin()+1, inList.end()) ); }, 1, std::string("Execute Command"))), std::pair(std::string("l"), new functdata( [](std::vector inList) -> std::vector{ std::size_t c = 2, cons = 0; std::vector ret; while ( c < inList.size() ) { auto b = std::vector(inList.begin()+c, inList.end()); b.insert(b.begin(), inList[1]); auto a = commands.execute( b, &cons ); ret.insert(ret.end(), a.begin(), a.end()); if (cons) c += cons; else return ret; } return ret; }, 2, -1, std::string("Loop Command"), functdata::Batch)), std::pair(std::string("la"), new functdata( [](std::vector inList) -> std::vector{ std::size_t c = 3, cons = 0; std::string r = inList[2]; while ( c < inList.size() ) { r = commands.execute( {inList[1], r, inList[c]}, &cons )[0]; if (cons) c += cons - 1; else return {r}; } return {r}; }, 2, -1, std::string("Loop-accumulate left"), functdata::Batch)), std::pair(std::string("lar"), new functdata( [](std::vector inList) -> std::vector{ std::size_t c = 3, cons = 0; std::reverse(inList.begin()+2, inList.end()); std::string r = inList[2]; while ( c < inList.size() ) { r = commands.execute( {inList[1], inList[c], r}, &cons )[0]; if (cons) c += cons - 1; else return {r}; } return {r}; }, 2, -1, std::string("Loop-accumulate right"), functdata::Batch)), std::pair(std::string("="), new functdata( [](std::vector inList) -> std::vector{ auto a = commands.execute( std::vector(inList.begin()+2, inList.end()) ); std::vector n = {inList[1]}; n.insert(n.end(),a.begin(), a.end()); return commands.execute(n); }, 2, -1, std::string("Apply function"), functdata::Batch)), std::pair(std::string("=p"), new functdata( [](std::vector inList) -> std::vector{ auto a = commands.execute( std::vector(inList.begin()+2, inList.end()) ); std::vector n = {inList[1]}; n.insert(n.end(),a.begin(), a.end()); return n; }, 2, -1, std::string("Pretend to apply function"), functdata::Batch)), std::pair(std::string("p"), new functdata( [](std::vector inList) -> std::vector{ if (inList.size() == 1) { auto dump = commands.getIndex(); std::vector ret; string tmp; for (unsigned i = 0; i != dump.size(); i++) { (tmp+=std::to_string(i))+=": "; for (unsigned char j = 0; j != 128; j++) { if (dump[i][j].first || dump[i][j].second) { tmp+=(char)(j?j:'/')+std::to_string(dump[i][j].first) +(dump[i][j].second?'*':' ')+' '; } } ret.push_back(tmp); tmp.clear(); if (inList[0][1] == 'l') { for (unsigned char j = 0; j != 128; j++) { tmp += ( dump[i][j].first ? std::to_string(dump[i][j].first) : string(" ") ) + ( dump[i][j].second ? '*' : ' ' ) + ' '; //print 16 to a line if (j%16 == 15) { ret.push_back(tmp); tmp.clear(); } } ret.push_back(tmp); tmp.clear(); } } return ret; } else { int len = 0; functdata *found = commands.longestPrefix(toLower(inList[1]), &len); if (found) return {string("Matched \"") + inList[1].substr(0,len) + "\": " + found->help+" [takes " + std::to_string(found->argN) + '-' + std::to_string(found->argX) + "; " + functdata::modeS(found->mode) + ']' + (found->call?' ':'!')}; else return {std::to_string(len) + "; Nothing found for \"" + toLower(inList[1])+"\""}; }}, 0, 1, std::string("Print/Probe input trie"), functdata::Single)), std::pair(std::string("p-"), new functdata( [](std::vector inList) -> std::vector{ return commands.allWithPrefix(inList.size()>1?inList[1]:""); }, 0, 1, std::string("List input trie"), functdata::Single)), std::pair(std::string("+"), new functdata( [](std::vector inList) -> std::vector{ return {toStr(fromStr(sanitizeNumeric(inList[1])) + fromStr(sanitizeNumeric(inList[2])))}; }, 2, 2, std::string("Add numbers"), functdata::FSingle)), std::pair(std::string("-"), new functdata( [](std::vector inList) -> std::vector{ return {toStr(fromStr(sanitizeNumeric(inList[1])) - fromStr(sanitizeNumeric(inList[2])))}; }, 2, 2, std::string("Subtract numbers"), functdata::FSingle)), std::pair(std::string("*"), new functdata( [](std::vector inList) -> std::vector{ return {toStr(fromStr(sanitizeNumeric(inList[1])) * fromStr(sanitizeNumeric(inList[2])))}; }, 2, 2, std::string("Multiply numbers"), functdata::FSingle)), std::pair(std::string("/"), new functdata( [](std::vector inList) -> std::vector{ return {toStr(fromStr(sanitizeNumeric(inList[1])) / fromStr(sanitizeNumeric(inList[2])))}; }, 2, 2, std::string("Divide numbers"), functdata::FSingle)), std::pair(std::string("%"), new functdata( [](std::vector inList) -> std::vector{ return {toStr(fromStr(sanitizeNumeric(inList[1])) % fromStr(sanitizeNumeric(inList[2])))}; }, 2, 2, std::string("Modulo numbers"), functdata::FSingle)), std::pair(std::string("t"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(sanitizeNumeric(inList[1]) + " = "):std::string("")) + Roman::E(fromStr(sanitizeNumeric(inList[1])))}; }, 1, 1, std::string("Convert decimal to extended roman"), functdata::Single)), std::pair(std::string("tc"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(sanitizeNumeric(inList[1]) + " = "):std::string("")) + Roman::C(fromStr(sanitizeNumeric(inList[1])))}; }, 1, 1, std::string("Convert decimal to \"compatible\" roman"), functdata::Single)), std::pair(std::string("tl"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(sanitizeNumeric(inList[1]) + " = "):std::string("")) + Roman::L(fromStr(sanitizeNumeric(inList[1])))}; }, 1, 1, std::string("Convert decimal to lowercase-extended roman"), functdata::Single)), std::pair(std::string("ta"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(sanitizeNumeric(inList[1]) + " = "):std::string("")) + Roman::S.toR(fromStr(sanitizeNumeric(inList[1])))}; }, 1, 1, std::string("Convert decimal to absolutely standard roman"), functdata::Single)), std::pair(std::string("f"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(Roman::E.sanitizeNumeral(inList[1]) + " = "):std::string("")) + toStr(Roman::E(Roman::E.sanitizeNumeral(inList[1])))}; }, 1, 1, std::string("Convert extended RN to decimal"), functdata::Single)), std::pair(std::string("fc"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(Roman::C.sanitizeNumeral(inList[1]) + " = "):std::string("")) + toStr(Roman::C(Roman::C.sanitizeNumeral(inList[1])))}; }, 1, 1, std::string("Convert \"compatible\" RN to decimal"), functdata::Single)), std::pair(std::string("fl"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(Roman::L.sanitizeNumeral(inList[1]) + " = "):std::string("")) + toStr(Roman::L(Roman::L.sanitizeNumeral(inList[1])))}; }, 1, 1, std::string("Convert lowercase-extended RN to decimal"), functdata::Single)), std::pair(std::string("fa"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(Roman::S.sanitizeNumeral(inList[1]) + " = "):std::string("")) + toStr(Roman::S(Roman::S.sanitizeNumeral(inList[1])))}; }, 1, 1, std::string("Convert absolutely standard RN to decimal"), functdata::Single)), std::pair(std::string("c"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(Roman::E.sanitizeNumeral(inList[1]) + " = "):std::string("")) + toStr(Roman::E.reduce(Roman::E.sanitizeNumeral(inList[1])))}; }, 1, 1, std::string("Canonicize extended RN"), functdata::Single)), std::pair(std::string("cc"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(Roman::C.sanitizeNumeral(inList[1]) + " = "):std::string("")) + toStr(Roman::C.reduce(Roman::C.sanitizeNumeral(inList[1])))}; }, 1, 1, std::string("Canonicize \"compatible\" RN"), functdata::Single)), std::pair(std::string("cl"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(Roman::L.sanitizeNumeral(inList[1]) + " = "):std::string("")) + toStr(Roman::L.reduce(Roman::L.sanitizeNumeral(inList[1])))}; }, 1, 1, std::string("Canonicize lowercase-extended RN"), functdata::Single)), std::pair(std::string("ca"), new functdata( [](std::vector inList) -> std::vector{ return {(settings["long"]?(Roman::S.sanitizeNumeral(inList[1]) + " = "):std::string("")) + toStr(Roman::S.reduce(Roman::S.sanitizeNumeral(inList[1])))}; }, 1, 1, std::string("Canonicize absolutely standard RN"), functdata::Single)), })); settings["long"] = false; settings["prompt"] = true; settings["s_prompt"] = false; std::vector scriptedCommands; bool cont_after = false; for (int i = 1; i < argc; i++) { //cout<<"["< "< "; getline(cin, in); if (in.empty()) { continue; } runCommand(commands, in); } catch (const std::runtime_error& err) { cout<<"Failed to read input. "< inList = tokenizeInput(in); vector out = commands.execute(inList); for (auto i : out) { cout<