// 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 #include #include #include #include #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 parameters) { goldfishterm_internal::Emit( InterpretStringCapability( InterpretStringCapabilityInput(terminfo_, terminfo_.get(cap).value(), std::move(parameters), /*baud=*/baud_, /*lines_affected=*/1)) .terms, std::cout); } } // namespace goldfishterm