diff --git a/src/parser.cpp b/src/parser.cpp index 7d9e690..322803a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5,8 +5,8 @@ #include "utils.hpp" /* macros rather then function to avoid warnings */ -#define UNEXPECTED_END() { endwin(); cerr << "Unexpected end of file" << std::endl; exit(1); } -#define UNEXPECTED_CHAR(c) { endwin(); cerr << "Line " << line << ": Unexpected '" << c << std::endl; exit(1); } +#define ERR_UNEXPECTED_END() { endwin(); cerr << "Unexpected end of file" << endl; exit(1); } +#define ERR_UNEXPECTED_CHAR(c) { endwin(); cerr << "Line " << line << ": Unexpected '" << c << endl; exit(1); } using std::cerr; @@ -14,6 +14,7 @@ using std::cerr; using std::string; using std::vector; using std::pair; +using std::endl; namespace /* internal */ { @@ -44,6 +45,13 @@ namespace /* internal */ /* result */ Tree* cur_tree; + void err_three_parents(const char* extra_name) + { + endwin(); + cerr << "Line " << line << " two parents are already defined, " + << extra_name << " is third" << endl; + } + bool isNum(char c) { return c >= '0' && c <= '9'; @@ -57,7 +65,7 @@ namespace /* internal */ !isNum(*it_data)) { if(*it_data == ':' /* && *it_data == '-' */) - UNEXPECTED_CHAR(*it_data); + ERR_UNEXPECTED_CHAR(*it_data); ++it_data; } @@ -85,11 +93,11 @@ namespace /* internal */ else if(*it_data == 'F') res = F; else - UNEXPECTED_CHAR(*it_data); + ERR_UNEXPECTED_CHAR(*it_data); ++it_data; if(*it_data != '\n') - UNEXPECTED_CHAR(*it_data); + ERR_UNEXPECTED_CHAR(*it_data); } return res; } @@ -110,7 +118,7 @@ namespace /* internal */ break; case '.': if(val == 0) - UNEXPECTED_CHAR('.') + ERR_UNEXPECTED_CHAR('.') else return sign * val; break; @@ -119,10 +127,10 @@ namespace /* internal */ return sign * val; /* case '?': todo */ default: - UNEXPECTED_CHAR(*it_data) + ERR_UNEXPECTED_CHAR(*it_data) } } - UNEXPECTED_END() + ERR_UNEXPECTED_END() } EventTime processDate(char*& it_data) /* todo validate */ @@ -158,7 +166,8 @@ namespace /* internal */ else if(res.second == Nobody) res.second = cur_tree->findId(name.data())[same_name_index]; else - /* todo */TFT_EXIT(1); + err_three_parents(name.data()); + same_name_index = 0; name.clear(); break; @@ -166,7 +175,7 @@ namespace /* internal */ if(name.empty() && res.first == Nobody) return prev_parents; else - UNEXPECTED_CHAR('-') + ERR_UNEXPECTED_CHAR('-') case '\n': ++line; if(res.first == Nobody) @@ -184,7 +193,7 @@ namespace /* internal */ name.push_back(*it_data); } } - UNEXPECTED_END() + ERR_UNEXPECTED_END() } vector parseSpouses(char*& it_data) @@ -200,7 +209,7 @@ namespace /* internal */ if(name.empty()) res.push_back( cur_tree->last() ); else - UNEXPECTED_CHAR('-') + ERR_UNEXPECTED_CHAR('-') break; case ',': if(!name.empty()) @@ -210,7 +219,7 @@ namespace /* internal */ same_name_index = 0; } else - UNEXPECTED_CHAR(',') + ERR_UNEXPECTED_CHAR(',') break; case '\n': ++line; @@ -248,7 +257,7 @@ namespace /* internal */ case '-': case 0 ... 9: case ':': - UNEXPECTED_CHAR(*it_data) + ERR_UNEXPECTED_CHAR(*it_data) } } } @@ -305,7 +314,7 @@ namespace /* internal */ spouses = parseSpouses(it_data); break; default: - UNEXPECTED_CHAR(it_data[-1]) + ERR_UNEXPECTED_CHAR(it_data[-1]) } } @@ -320,7 +329,7 @@ namespace /* internal */ break; /* case 0...9: */ /* case ':': */ - /* UNEXPECTED_CHAR(*it_data) */ + /* ERR_UNEXPECTED_CHAR(*it_data) */ /* default: */ /* break; */ } diff --git a/src/tree.cpp b/src/tree.cpp index 818bb1f..95eb9cc 100644 --- a/src/tree.cpp +++ b/src/tree.cpp @@ -383,6 +383,9 @@ static void displayHelp() void Tree::display() { + if(people.size() == 0) + return; + bool to_draw = true; I32 c; do