From f43d32d6d2cc7ecd04f4f06f20d5a6fc2c87c9ae Mon Sep 17 00:00:00 2001 From: Aki Date: Tue, 12 Mar 2024 01:08:39 +0100 Subject: Another reorganization change that diverts me from crying unable to get rid off singleton madness --- FoundationEx/src/Reader.cpp | 119 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 FoundationEx/src/Reader.cpp (limited to 'FoundationEx/src/Reader.cpp') diff --git a/FoundationEx/src/Reader.cpp b/FoundationEx/src/Reader.cpp new file mode 100644 index 0000000..0ca49aa --- /dev/null +++ b/FoundationEx/src/Reader.cpp @@ -0,0 +1,119 @@ +/* Starshatter: The Open Source Project + Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors + Copyright (c) 1997-2006, Destroyer Studios LLC. + + AUTHOR: John DiCamillo + + + OVERVIEW + ======== + Implementation of the Reader class +*/ + +#include + +#include +#include +#include + +#include + + +Text +ConsoleReader::more() +{ + // loop until the user types something + do { + printPrimaryPrompt(); + fillInputBuffer(); + } while (! *p); + + return Text(p); +} + + +void +ConsoleReader::printPrimaryPrompt() +{ + std::printf("- "); +} + + +void +ConsoleReader::fillInputBuffer() +{ + std::fgets(buffer, 980, stdin); + p = buffer; + while (std::isspace(*p)) p++; +} + + +FileReader::FileReader(const char* fname) : + filename(fname), + done(0) +{ +} + + +Text +FileReader::more() +{ + if (done) return Text(); + + std::fstream fin(filename, std::fstream::in); + + if (!fin) { + Print("ERROR(Parse): Could not open file '%s'\n", filename.data()); + return Text(); + } + + Text result; + char buf[1000], newline; + + while (fin.get(buf, 1000)) { + result.append(buf); + fin.get(newline); + result.append(newline); + } + + done = 1; + return result; +} + + +BlockReader::BlockReader(const char* block) : + data((char*) block), + done(0), + length(0) +{ +} + + +BlockReader::BlockReader(const char* block, int len) : + data((char*) block), + done(0), + length(len) +{ +} + + +Text +BlockReader::more() +{ + if (done) return Text(); + + if (length) { + Text result(data, length); + done = 1; + return result; + } + else if (data) { + Text result(data); + done = 1; + return result; + } + + done = 1; + return Text(); +} -- cgit v1.1