#pragma once #include #include #include // MSVC need this to use std::getline #include #include #include "nasal.h" struct span { u32 begin_line; u32 begin_column; u32 end_line; u32 end_column; string file; }; #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& red(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0c); #else s<<"\033[91;1m"; #endif return s; } std::ostream& cyan(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x03); #else s<<"\033[36;1m"; #endif return s; } std::ostream& orange(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0e); #else s<<"\033[93;1m"; #endif return s; } std::ostream& 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 flstream { protected: string file; std::vector res; public: flstream():file("") {} void load(const string&); const string& operator[](usize n) const {return res[n];} const string& name() const {return file;} usize size() const {return res.size();} }; class error:public flstream { private: u32 cnt; // counter for errors string identation(usize len) { return string(len,' '); } string leftpad(u32 num, usize len) { string tmp=std::to_string(num); while(tmp.length()\n"; std::exit(1); } while(!in.eof()) { string line; std::getline(in, line); res.push_back(line); } } void error::fatal(const string& stage, const string& info) { std::cerr< "< "< " <