diff --git a/main.cpp b/main.cpp
index bc59149..9a0ca4e 100644
--- a/main.cpp
+++ b/main.cpp
@@ -26,6 +26,7 @@ along with pilang. If not, see .
#include
#include
+#include
#include
#include
#include
@@ -40,6 +41,7 @@ std::string badarguments = "Bad arguments";
// Exception defs
class markergoto : public std::string {};
+class pilerror : public std::string {};
std::string markergotoname;
// Environment defs
@@ -47,9 +49,18 @@ std::vector cmdargs;
std::map variables;
std::map markers;
bool interactivecli;
+bool catcherrs = false;
+std::string lasterr = "";
std::vector markersetqueue;
+int main(int argc, char *argv[]);
std::string execline(std::string commandstr);
+// Restart program on segmenation fault
+void sigsegv_handler(int signal) {
+ std::cerr << std::endl << "Pilang crashed: signal " << signal << "=SIGSEGV (memory error)" << std::endl;
+ exit(177);
+}
+
// Helper functions
bool is_float(std::string s) {
std::istringstream iss(s);
@@ -93,6 +104,14 @@ void do_markersetqueue(int currline) {
}
markersetqueue = {};
}
+std::string get_rstring(std::string rstring) {
+ if (rstring == nosuchcommand or rstring == nosuchvariable or rstring == badarguments) {
+ lasterr = rstring;
+ if (catcherrs)
+ throw pilerror();
+ }
+ return rstring;
+}
// Builtin functions
std::string cmd_ret(std::vector args) {
@@ -102,6 +121,20 @@ std::string cmd_ret(std::vector args) {
}
return retstring;
}
+std::string cmd_catch(std::vector args) {
+ std::cout << "reached" << std::endl;
+ if (args.size() != 1) {
+ return badarguments;
+ }
+ std::string boolstr = *args.begin();
+ if (str_lower(boolstr) == "true")
+ catcherrs = true;
+ else if (str_lower(boolstr) == "false")
+ catcherrs = false;
+ else
+ return badarguments;
+ return success;
+}
std::string cmd_get(std::vector args) {
if (args.size() != 2) {
return badarguments;
@@ -376,6 +409,8 @@ std::string run_command(std::string command, std::vector args) {
//std::cout << "Running command:" << command << "!" << std::endl;
if (command == "ret")
return cmd_ret(args);
+ else if (command == "catch")
+ return cmd_catch(args);
else if (command == "get")
return cmd_get(args);
else if (command == "len")
@@ -419,7 +454,7 @@ std::string run_command(std::string command, std::vector args) {
else if (command == "argc")
return cmd_argc(args);
else
- return "No such command";
+ return nosuchcommand;
}
// Interpreter initialiser
@@ -500,7 +535,7 @@ std::string execline(std::string commandstr) {
}
}
//std::cout << "Args len: " << args.size() << std::endl;
- return run_command(command, args);
+ return get_rstring(run_command(command, args));
}
}
@@ -509,6 +544,7 @@ std::string execline(std::string commandstr) {
// Main CLI
int main(int argc, char *argv[]) {
+ signal(SIGSEGV, sigsegv_handler);
std::string line;
using namespace std;
if (argc == 1) { // Start interactive CLI
@@ -557,8 +593,11 @@ int main(int argc, char *argv[]) {
linesit = lines.begin() + currline;
} else {
cerr << "No such marker: \"" << markergotoname << "\" (critical)" << endl;
- return 77;
+ return 78;
}
+ } catch (pilerror) {
+ cerr << "Line " << currline << ": " << lasterr << " (catched)" << endl;
+ return 77;
}
linesit++;
}