aboutsummaryrefslogtreecommitdiff
path: root/goldfishterm/simple.cc
diff options
context:
space:
mode:
Diffstat (limited to 'goldfishterm/simple.cc')
-rw-r--r--goldfishterm/simple.cc74
1 files changed, 74 insertions, 0 deletions
diff --git a/goldfishterm/simple.cc b/goldfishterm/simple.cc
new file mode 100644
index 0000000..9c4c9a9
--- /dev/null
+++ b/goldfishterm/simple.cc
@@ -0,0 +1,74 @@
+// Copyright 2021 Benjamin Barenblat
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+#include "goldfishterm/simple.h"
+
+#include <stdlib.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include <stdexcept>
+#include <vector>
+
+#include "goldfishterm/internal/emit.h"
+#include "goldfishterm/terminfo.h"
+#include "third_party/abseil/absl/strings/string_view.h"
+
+namespace goldfishterm {
+
+namespace {
+
+using ::goldfishterm_internal::InterpretStringCapability;
+using ::goldfishterm_internal::InterpretStringCapabilityInput;
+
+termios StdoutTermios() {
+ termios tty;
+ if (tcgetattr(STDOUT_FILENO, &tty) < 0) {
+ throw std::system_error(errno, std::system_category(), "tcgetattr");
+ }
+ return tty;
+}
+
+absl::string_view TerminalNameFromEnvironment() {
+ const char* name = getenv("TERM");
+ if (name == nullptr) {
+ throw std::runtime_error("TERM unset");
+ }
+ return name;
+}
+
+} // namespace
+
+SimpleTerminalOutput::SimpleTerminalOutput()
+ : SimpleTerminalOutput(StdoutTermios()) {}
+
+SimpleTerminalOutput::SimpleTerminalOutput(const termios& tty)
+ : terminfo_(
+ TerminfoEntry::FromSystemDatabase(TerminalNameFromEnvironment())) {
+ baud_ = cfgetospeed(&tty);
+}
+
+void SimpleTerminalOutput::Emit(
+ StringCapability cap,
+ std::vector<goldfishterm_internal::StringCapabilityParameter> parameters) {
+ goldfishterm_internal::Emit(
+ InterpretStringCapability(
+ InterpretStringCapabilityInput(terminfo_, terminfo_.get(cap).value(),
+ std::move(parameters), /*baud=*/baud_,
+ /*lines_affected=*/1))
+ .terms,
+ std::cout);
+}
+
+} // namespace goldfishterm