diff options
Diffstat (limited to 'goldfishterm/simple.cc')
-rw-r--r-- | goldfishterm/simple.cc | 74 |
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 |