summaryrefslogtreecommitdiff
path: root/ZAPD/OutputFormatter.cpp
diff options
context:
space:
mode:
authorM4xw <m4x@m4xw.net>2022-03-22 02:54:48 +0100
committerM4xw <m4x@m4xw.net>2022-03-22 02:54:48 +0100
commit5ff2df23782b302c73ab08095be9708d26c0d3a2 (patch)
tree90b79914735e42cb316a708a3569606a4092cf7f /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.cpp119
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);
+}