diff options
| author | M4xw <m4x@m4xw.net> | 2022-03-22 02:54:48 +0100 |
|---|---|---|
| committer | M4xw <m4x@m4xw.net> | 2022-03-22 02:54:48 +0100 |
| commit | 5ff2df23782b302c73ab08095be9708d26c0d3a2 (patch) | |
| tree | 90b79914735e42cb316a708a3569606a4092cf7f /ZAPD/OutputFormatter.cpp | |
git subrepo clone https://github.com/HarbourMasters/ZAPDTR.git
subrepo:
subdir: "ZAPDTR"
merged: "a53a53ea4"
upstream:
origin: "https://github.com/HarbourMasters/ZAPDTR.git"
branch: "master"
commit: "a53a53ea4"
git-subrepo:
version: "0.4.1"
origin: "???"
commit: "???"
Diffstat (limited to 'ZAPD/OutputFormatter.cpp')
| -rw-r--r-- | ZAPD/OutputFormatter.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/ZAPD/OutputFormatter.cpp b/ZAPD/OutputFormatter.cpp new file mode 100644 index 0000000..dbb8692 --- /dev/null +++ b/ZAPD/OutputFormatter.cpp @@ -0,0 +1,119 @@ +#include "OutputFormatter.h" +#include <Globals.h> + +void OutputFormatter::Flush() +{ + //if (!Globals::Instance->otrMode) + { + if (col > lineLimit && !Globals::Instance->otrMode) + { + str.append(1, '\n'); + str.append(currentIndent, ' '); + + uint32_t newCol = currentIndent + (wordP - word); + + for (uint32_t i = 0; i < wordNests; i++) + nestIndent[nest - i] -= col - newCol; + + col = newCol; + } + else + { + str.append(space, spaceP - space); + } + spaceP = space; + + str.append(word, wordP - word); + wordP = word; + wordNests = 0; + } +} + +int OutputFormatter::Write(const char* buf, int count) +{ + for (int i = 0; i < count; i++) + { + char c = buf[i]; + + if (c == ' ' || c == '\t' || c == '\n') + { + if (wordP - word != 0) + { + Flush(); + } + + if (c == '\n') + { + col = 0; + *spaceP++ = c; + } + else if (c == '\t') + { + int n = tabSize - (col % tabSize); + col += n; + for (int j = 0; j < n; j++) + *spaceP++ = ' '; + } + else + { + col++; + *spaceP++ = c; + } + + currentIndent = nestIndent[nest]; + } + else + { + col++; + + if (c == '(') + { + nest++; + nestIndent[nest] = col; + wordNests++; + } + else if (c == ')') + { + if (nest > 0) + nest--; + if (wordNests > 0) + wordNests--; + } + + *wordP++ = c; + } + } + + return count; +} + +int OutputFormatter::Write(const std::string& buf) +{ + return Write(buf.data(), buf.size()); +} + +OutputFormatter* OutputFormatter::Instance; + +int OutputFormatter::WriteStatic(const char* buf, int count) +{ + return Instance->Write(buf, count); +} + +int (*OutputFormatter::StaticWriter())(const char* buf, int count) +{ + Instance = this; + return &WriteStatic; +} + +OutputFormatter::OutputFormatter(uint32_t tabSize, uint32_t indentation, uint32_t lineLimit) + : tabSize{tabSize}, lineLimit{lineLimit}, col{0}, nest{0}, nestIndent{indentation}, + currentIndent{indentation}, wordNests(0), wordP{word}, spaceP{space} +{ +} + +std::string OutputFormatter::GetOutput() +{ + Flush(); + + return std::move(str); +} |
