#ifndef __NASAL_ERR_H__ #define __NASAL_ERR_H__ #include #include #include // MSVC need this to use std::getline #include #ifdef _WIN32 #include // use SetConsoleTextAttribute struct for_reset { CONSOLE_SCREEN_BUFFER_INFO scr; for_reset(){ GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&scr); } }reset_ter_color; #endif std::ostream& back_white(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0); #else s<<"\033[7m"; #endif return s; } std::ostream& bold_red(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0c); #else s<<"\033[91;1m"; #endif return s; } std::ostream& bold_cyan(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x03); #else s<<"\033[36;1m"; #endif return s; } std::ostream& bold_orange(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0e); #else s<<"\033[93;1m"; #endif return s; } std::ostream& bold_white(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0f); #else s<<"\033[0m\033[1m"; #endif return s; } std::ostream& reset(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),reset_ter_color.scr.wAttributes); #else s<<"\033[0m"; #endif return s; } class fstreamline { protected: string file; std::vector res; public: void load(const string& f) { if(file==f) return; // don't need to load a loaded file file=f; res.clear(); std::ifstream in(f,std::ios::binary); if(in.fail()) { std::cerr<\n"; std::exit(1); } string line; while(!in.eof()) { std::getline(in,line); res.push_back(line); } } const string& operator[](usize n){return res[n];} const string& name(){return file;} usize size(){return res.size();} }; class error:public fstreamline { private: u32 cnt; string identation(usize len) { string tmp=""; tmp.resize(len,' '); return tmp; } public: error():cnt(0){} void err(const char* stage,const string& info) { ++cnt; std::cerr< "< "<