diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..271cb4f Binary files /dev/null and b/.DS_Store differ diff --git a/build b/discord repl/build similarity index 100% rename from build rename to discord repl/build diff --git a/discord repl/main.cpp b/discord repl/main.cpp new file mode 100644 index 0000000..7eacc89 --- /dev/null +++ b/discord repl/main.cpp @@ -0,0 +1,199 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "timercpp.h" + +using namespace std; + +void beforeExit(); +void beforeExit(int i); +void setCursor(int XPos, int YPos); +void getCursor(int* x, int* y); +void hideCursor(); +void showCursor(); +void clearScreen(); +void clearScreen(short width, short height); +void writeAt(int x, int y, char ch); +void printFrame(vector> screen, short width, short height); +void screen_type(vector> &screen, string str, int x, int y, bool vertical); +void eachFrame(vector> &screen, short width, short height); + +Timer t = Timer(); + +int main(int argc, char **argv) +{ + + //^C + signal(SIGINT, beforeExit); + //abort() + signal(SIGABRT, beforeExit); + //sent by "kill" command + signal(SIGTERM, beforeExit); + //^Z + signal(SIGTSTP, beforeExit); + atexit(beforeExit); + + float framerate = 10.0; + float frameduration = 1000.0/framerate; + + vector> screen; // WILL ALWAYS BE AT LEAST 1x1 + + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + // width: w.ws_col + // height: w.ws_row + + for (int i = 0; i < w.ws_row-1; i++) + cout << endl; + + hideCursor(); + + t.setInterval([&]() { + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + + if (w.ws_row > 0 && w.ws_col > 0) { + + //fill vector + screen.resize(w.ws_col); + for (auto& col : screen) + col.resize(w.ws_row); + + eachFrame(screen, w.ws_col, w.ws_row); + + printFrame(screen, w.ws_col, w.ws_row); + } + }, (int) frameduration); + + while (true); + + return 0; +} + +void beforeExit() +{ + //clearScreen(); + setCursor(0,0); + showCursor(); + t.stop(); + cout << "goodbye" << endl; + exit(0); +} + +void beforeExit(int i) +{ + beforeExit(); +} + +void setCursor(int XPos, int YPos) { + printf("\033[%d;%dH",YPos+1,XPos+1); +} +void getCursor(int* x, int* y) { + printf("\033[6n"); + scanf("\033[%d;%dR", x, y); +} + +void hideCursor() +{ + cout << "\e[?25l" << flush; +} + +void showCursor() +{ + cout << "\e[?25h" << flush; +} + +void writeAt(int x, int y, char ch) +{ + if (ch == 0) + ch == ' '; + setCursor(x, y); + //printf("%s", ch); + cout << ch << flush; + fflush(stdout); +} + +void clearScreen() { + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + clearScreen(w.ws_col, w.ws_row); +} + +void clearScreen(short width, short height) +{ + setCursor(0, 0); + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) + writeAt(j, i, ' '); + setCursor(0, 0); + +} + +void printFrame(vector> screen, short width, short height) +{ + //print frame + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + //cout << screen.at(x).at(y); + writeAt(x, y, screen.at(x).at(y)); + //cout << endl; + } + setCursor(0,0); + /*for (auto& col : screen) { + for (auto& ch : col) + cout << ch; + cout << endl; + }*/ + //cout << endl; +} + +void screen_type(vector> &screen, string str, int x, int y, bool vertical) +{ + + int width = 0, + height = 0; + + if (str.length()) { + + //str.append("\033[0m"); + + width = 1; + height = 1; + + if (vertical) + height = str.length(); + else + width = str.length(); + + width = min(width, (int) screen.size() - x); + height = min(height, (int) screen.at(0).size() - y); + + } + + for (int i = x, ii = 0, d = 0; ii < width; i++, ii++) + for (int j = y, jj = 0; jj < height; j++, jj++, d++) { + //cout << str.at(d) << " " << i << "," << j << endl; + screen.at(i).at(j) = str.at(d); + } +} + +void eachFrame(vector> &screen, short width, short height) +{ + + stringstream ss; + + ss << width << "x" << height; + //ss << "Hello World."; + + screen_type(screen, ss.str(), 10, 10, false); + +} \ No newline at end of file diff --git a/timercpp.h b/discord repl/timercpp.h similarity index 100% rename from timercpp.h rename to discord repl/timercpp.h diff --git a/main/build b/main/build new file mode 100755 index 0000000..319104d --- /dev/null +++ b/main/build @@ -0,0 +1 @@ +g++-10 -fconcepts-ts $1.cpp -o $1.o && chmod +x $1.o diff --git a/main.cpp b/main/main.cpp similarity index 100% rename from main.cpp rename to main/main.cpp diff --git a/main/timercpp.h b/main/timercpp.h new file mode 100644 index 0000000..9878c06 --- /dev/null +++ b/main/timercpp.h @@ -0,0 +1,50 @@ +// https: //github.com/99x/timercpp/blob/master/timercpp.h +#include +#include +#include + +class Timer +{ + bool clear = false; + + public: + void setTimeout(auto function, int delay); + void setInterval(auto function, int interval); + void stop(); +}; + +void Timer::setTimeout(auto function, int delay) +{ + this->clear = false; + std::thread t([=]() { + if (this->clear) + return; + std::this_thread::sleep_for(std::chrono::milliseconds(delay)); + if (this->clear) + return; + function(); + }); + t.detach(); +} + +void Timer::setInterval(auto function, int interval) +{ + this->clear = false; + std::thread t([=]() { + while (true) + { + if (this->clear) + return; + std::this_thread::sleep_for(std::chrono::milliseconds(interval)); + if (this->clear) + return; + function(); + } + }); + t.detach(); +} + +void Timer::stop() +{ + this->clear = true; +} \ No newline at end of file