diff options
Diffstat (limited to 'goldfishterm/terminfo.h')
-rw-r--r-- | goldfishterm/terminfo.h | 544 |
1 files changed, 544 insertions, 0 deletions
diff --git a/goldfishterm/terminfo.h b/goldfishterm/terminfo.h new file mode 100644 index 0000000..9452468 --- /dev/null +++ b/goldfishterm/terminfo.h @@ -0,0 +1,544 @@ +// 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. + +// Terminfo entries and the terminfo database. + +#ifndef EC_GOLDFISHTERM_TERMINFO_H_ +#define EC_GOLDFISHTERM_TERMINFO_H_ + +#include <stdint.h> + +#include <istream> +#include <string> +#include <vector> + +#include "third_party/abseil/absl/strings/string_view.h" +#include "third_party/abseil/absl/types/optional.h" + +namespace goldfishterm { + +// Boolean terminal capabilities. See terminfo(5) for full documentation. +enum class BooleanCapability { + kAutoLeftMargin = 0, + kAutoRightMargin = 1, + kNoEscCtlc = 2, + kCeolStandoutGlitch = 3, + kEatNewlineGlitch = 4, + kEraseOverstrike = 5, + kGenericType = 6, + kHardCopy = 7, + kHasMetaKey = 8, + kHasStatusLine = 9, + kInsertNullGlitch = 10, + kMemoryAbove = 11, + kMemoryBelow = 12, + kMoveInsertMode = 13, + kMoveStandoutMode = 14, + kOverStrike = 15, + kStatusLineEscOk = 16, + kDestTabsMagicSmso = 17, + kTildeGlitch = 18, + kTransparentUnderline = 19, + kXonXoff = 20, + kNeedsXonXoff = 21, + kPrtrSilent = 22, + kHardCursor = 23, + kNonRevRmcup = 24, + kNoPadChar = 25, + kNonDestScrollRegion = 26, + kCanChange = 27, + kBackColorErase = 28, + kHueLightnessSaturation = 29, + kColAddrGlitch = 30, + kCrCancelsMicroMode = 31, + kHasPrintWheel = 32, + kRowAddrGlitch = 33, + kSemiAutoRightMargin = 34, + kCpiChangesRes = 35, + kLpiChangesRes = 36, +}; + +// Numeric terminal capabilities. See terminfo(5) for full documentation. +enum class NumericCapability { + kColumns = 0, + kInitTabs = 1, + kLines = 2, + kLinesOfMemory = 3, + kMagicCookieGlitch = 4, + kPaddingBaudRate = 5, + kVirtualTerminal = 6, + kWidthStatusLine = 7, + kNumLabels = 8, + kLabelHeight = 9, + kLabelWidth = 10, + kMaxAttributes = 11, + kMaximumWindows = 12, + kMaxColors = 13, + kMaxPairs = 14, + kNoColorVideo = 15, + kBufferCapacity = 16, + kDotVertSpacing = 17, + kDotHorzSpacing = 18, + kMaxMicroAddress = 19, + kMaxMicroJump = 20, + kMicroColSize = 21, + kMicroLineSize = 22, + kNumberOfPins = 23, + kOutputResChar = 24, + kOutputResLine = 25, + kOutputResHorzInch = 26, + kOutputResVertInch = 27, + kPrintRate = 28, + kWideCharSize = 29, + kButtons = 30, + kBitImageEntwining = 31, + kBitImageType = 32, +}; + +// String terminal capabilities. See terminfo(5) for full documentation. +enum class StringCapability { + kBackTab = 0, + kBell = 1, + kCarriageReturn = 2, + kChangeScrollRegion = 3, + kClearAllTabs = 4, + kClearScreen = 5, + kClrEol = 6, + kClrEos = 7, + kColumnAddress = 8, + kCommandCharacter = 9, + kCursorAddress = 10, + kCursorDown = 11, + kCursorHome = 12, + kCursorInvisible = 13, + kCursorLeft = 14, + kCursorMemAddress = 15, + kCursorNormal = 16, + kCursorRight = 17, + kCursorToLl = 18, + kCursorUp = 19, + kCursorVisible = 20, + kDeleteCharacter = 21, + kDeleteLine = 22, + kDisStatusLine = 23, + kDownHalfLine = 24, + kEnterAltCharsetMode = 25, + kEnterBlinkMode = 26, + kEnterBoldMode = 27, + kEnterCaMode = 28, + kEnterDeleteMode = 29, + kEnterDimMode = 30, + kEnterInsertMode = 31, + kEnterSecureMode = 32, + kEnterProtectedMode = 33, + kEnterReverseMode = 34, + kEnterStandoutMode = 35, + kEnterUnderlineMode = 36, + kEraseChars = 37, + kExitAltCharsetMode = 38, + kExitAttributeMode = 39, + kExitCaMode = 40, + kExitDeleteMode = 41, + kExitInsertMode = 42, + kExitStandoutMode = 43, + kExitUnderlineMode = 44, + kFlashScreen = 45, + kFormFeed = 46, + kFromStatusLine = 47, + kInit1string = 48, + kInit2string = 49, + kInit3string = 50, + kInitFile = 51, + kInsertCharacter = 52, + kInsertLine = 53, + kInsertPadding = 54, + kKeyBackspace = 55, + kKeyCatab = 56, + kKeyClear = 57, + kKeyCtab = 58, + kKeyDc = 59, + kKeyDl = 60, + kKeyDown = 61, + kKeyEic = 62, + kKeyEol = 63, + kKeyEos = 64, + kKeyF0 = 65, + kKeyF1 = 66, + kKeyF10 = 67, + kKeyF2 = 68, + kKeyF3 = 69, + kKeyF4 = 70, + kKeyF5 = 71, + kKeyF6 = 72, + kKeyF7 = 73, + kKeyF8 = 74, + kKeyF9 = 75, + kKeyHome = 76, + kKeyIc = 77, + kKeyIl = 78, + kKeyLeft = 79, + kKeyLl = 80, + kKeyNpage = 81, + kKeyPpage = 82, + kKeyRight = 83, + kKeySf = 84, + kKeySr = 85, + kKeyStab = 86, + kKeyUp = 87, + kKeypadLocal = 88, + kKeypadXmit = 89, + kLabF0 = 90, + kLabF1 = 91, + kLabF10 = 92, + kLabF2 = 93, + kLabF3 = 94, + kLabF4 = 95, + kLabF5 = 96, + kLabF6 = 97, + kLabF7 = 98, + kLabF8 = 99, + kLabF9 = 100, + kMetaOff = 101, + kMetaOn = 102, + kNewline = 103, + kPadChar = 104, + kParmDch = 105, + kParmDeleteLine = 106, + kParmDownCursor = 107, + kParmIch = 108, + kParmIndex = 109, + kParmInsertLine = 110, + kParmLeftCursor = 111, + kParmRightCursor = 112, + kParmRindex = 113, + kParmUpCursor = 114, + kPkeyKey = 115, + kPkeyLocal = 116, + kPkeyXmit = 117, + kPrintScreen = 118, + kPrtrOff = 119, + kPrtrOn = 120, + kRepeatChar = 121, + kReset1string = 122, + kReset2string = 123, + kReset3string = 124, + kResetFile = 125, + kRestoreCursor = 126, + kRowAddress = 127, + kSaveCursor = 128, + kScrollForward = 129, + kScrollReverse = 130, + kSetAttributes = 131, + kSetTab = 132, + kSetWindow = 133, + kTab = 134, + kToStatusLine = 135, + kUnderlineChar = 136, + kUpHalfLine = 137, + kInitProg = 138, + kKeyA1 = 139, + kKeyA3 = 140, + kKeyB2 = 141, + kKeyC1 = 142, + kKeyC3 = 143, + kPrtrNon = 144, + kCharPadding = 145, + kAcsChars = 146, + kPlabNorm = 147, + kKeyBtab = 148, + kEnterXonMode = 149, + kExitXonMode = 150, + kEnterAmMode = 151, + kExitAmMode = 152, + kXonCharacter = 153, + kXoffCharacter = 154, + kEnaAcs = 155, + kLabelOn = 156, + kLabelOff = 157, + kKeyBeg = 158, + kKeyCancel = 159, + kKeyClose = 160, + kKeyCommand = 161, + kKeyCopy = 162, + kKeyCreate = 163, + kKeyEnd = 164, + kKeyEnter = 165, + kKeyExit = 166, + kKeyFind = 167, + kKeyHelp = 168, + kKeyMark = 169, + kKeyMessage = 170, + kKeyMove = 171, + kKeyNext = 172, + kKeyOpen = 173, + kKeyOptions = 174, + kKeyPrevious = 175, + kKeyPrint = 176, + kKeyRedo = 177, + kKeyReference = 178, + kKeyRefresh = 179, + kKeyReplace = 180, + kKeyRestart = 181, + kKeyResume = 182, + kKeySave = 183, + kKeySuspend = 184, + kKeyUndo = 185, + kKeySbeg = 186, + kKeyScancel = 187, + kKeyScommand = 188, + kKeyScopy = 189, + kKeyScreate = 190, + kKeySdc = 191, + kKeySdl = 192, + kKeySelect = 193, + kKeySend = 194, + kKeySeol = 195, + kKeySexit = 196, + kKeySfind = 197, + kKeyShelp = 198, + kKeyShome = 199, + kKeySic = 200, + kKeySleft = 201, + kKeySmessage = 202, + kKeySmove = 203, + kKeySnext = 204, + kKeySoptions = 205, + kKeySprevious = 206, + kKeySprint = 207, + kKeySredo = 208, + kKeySreplace = 209, + kKeySright = 210, + kKeySrsume = 211, + kKeySsave = 212, + kKeySsuspend = 213, + kKeySundo = 214, + kReqForInput = 215, + kKeyF11 = 216, + kKeyF12 = 217, + kKeyF13 = 218, + kKeyF14 = 219, + kKeyF15 = 220, + kKeyF16 = 221, + kKeyF17 = 222, + kKeyF18 = 223, + kKeyF19 = 224, + kKeyF20 = 225, + kKeyF21 = 226, + kKeyF22 = 227, + kKeyF23 = 228, + kKeyF24 = 229, + kKeyF25 = 230, + kKeyF26 = 231, + kKeyF27 = 232, + kKeyF28 = 233, + kKeyF29 = 234, + kKeyF30 = 235, + kKeyF31 = 236, + kKeyF32 = 237, + kKeyF33 = 238, + kKeyF34 = 239, + kKeyF35 = 240, + kKeyF36 = 241, + kKeyF37 = 242, + kKeyF38 = 243, + kKeyF39 = 244, + kKeyF40 = 245, + kKeyF41 = 246, + kKeyF42 = 247, + kKeyF43 = 248, + kKeyF44 = 249, + kKeyF45 = 250, + kKeyF46 = 251, + kKeyF47 = 252, + kKeyF48 = 253, + kKeyF49 = 254, + kKeyF50 = 255, + kKeyF51 = 256, + kKeyF52 = 257, + kKeyF53 = 258, + kKeyF54 = 259, + kKeyF55 = 260, + kKeyF56 = 261, + kKeyF57 = 262, + kKeyF58 = 263, + kKeyF59 = 264, + kKeyF60 = 265, + kKeyF61 = 266, + kKeyF62 = 267, + kKeyF63 = 268, + kClrBol = 269, + kClearMargins = 270, + kSetLeftMargin = 271, + kSetRightMargin = 272, + kLabelFormat = 273, + kSetClock = 274, + kDisplayClock = 275, + kRemoveClock = 276, + kCreateWindow = 277, + kGotoWindow = 278, + kHangup = 279, + kDialPhone = 280, + kQuickDial = 281, + kTone = 282, + kPulse = 283, + kFlashHook = 284, + kFixedPause = 285, + kWaitTone = 286, + kUser0 = 287, + kUser1 = 288, + kUser2 = 289, + kUser3 = 290, + kUser4 = 291, + kUser5 = 292, + kUser6 = 293, + kUser7 = 294, + kUser8 = 295, + kUser9 = 296, + kOrigPair = 297, + kOrigColors = 298, + kInitializeColor = 299, + kInitializePair = 300, + kSetColorPair = 301, + kSetForeground = 302, + kSetBackground = 303, + kChangeCharPitch = 304, + kChangeLinePitch = 305, + kChangeResHorz = 306, + kChangeResVert = 307, + kDefineChar = 308, + kEnterDoublewideMode = 309, + kEnterDraftQuality = 310, + kEnterItalicsMode = 311, + kEnterLeftwardMode = 312, + kEnterMicroMode = 313, + kEnterNearLetterQuality = 314, + kEnterNormalQuality = 315, + kEnterShadowMode = 316, + kEnterSubscriptMode = 317, + kEnterSuperscriptMode = 318, + kEnterUpwardMode = 319, + kExitDoublewideMode = 320, + kExitItalicsMode = 321, + kExitLeftwardMode = 322, + kExitMicroMode = 323, + kExitShadowMode = 324, + kExitSubscriptMode = 325, + kExitSuperscriptMode = 326, + kExitUpwardMode = 327, + kMicroColumnAddress = 328, + kMicroDown = 329, + kMicroLeft = 330, + kMicroRight = 331, + kMicroRowAddress = 332, + kMicroUp = 333, + kOrderOfPins = 334, + kParmDownMicro = 335, + kParmLeftMicro = 336, + kParmRightMicro = 337, + kParmUpMicro = 338, + kSelectCharSet = 339, + kSetBottomMargin = 340, + kSetBottomMarginParm = 341, + kSetLeftMarginParm = 342, + kSetRightMarginParm = 343, + kSetTopMargin = 344, + kSetTopMarginParm = 345, + kStartBitImage = 346, + kStartCharSetDef = 347, + kStopBitImage = 348, + kStopCharSetDef = 349, + kSubscriptCharacters = 350, + kSuperscriptCharacters = 351, + kTheseCauseCr = 352, + kZeroMotion = 353, + kCharSetNames = 354, + kKeyMouse = 355, + kMouseInfo = 356, + kReqMousePos = 357, + kGetMouse = 358, + kSetAForeground = 359, + kSetABackground = 360, + kPkeyPlab = 361, + kDeviceType = 362, + kCodeSetInit = 363, + kSet0DesSeq = 364, + kSet1DesSeq = 365, + kSet2DesSeq = 366, + kSet3DesSeq = 367, + kSetLrMargin = 368, + kSetTbMargin = 369, + kBitImageRepeat = 370, + kBitImageNewline = 371, + kBitImageCarriageReturn = 372, + kColorNames = 373, + kDefineBitImageRegion = 374, + kEndBitImageRegion = 375, + kSetColorBand = 376, + kSetPageLength = 377, + kDisplayPcChar = 378, + kEnterPcCharsetMode = 379, + kExitPcCharsetMode = 380, + kEnterScancodeMode = 381, + kExitScancodeMode = 382, + kPcTermOptions = 383, + kScancodeEscape = 384, + kAltScancodeEsc = 385, + kEnterHorizontalHlMode = 386, + kEnterLeftHlMode = 387, + kEnterLowHlMode = 388, + kEnterRightHlMode = 389, + kEnterTopHlMode = 390, + kEnterVerticalHlMode = 391, + kSetAAttributes = 392, + kSetPglenInch = 393, +}; + +// An entry from the terminfo database. +// +// This class is thread-safe. +class TerminfoEntry final { + public: + // Looks up a terminfo entry in the system terminfo database. Throws + // std::runtime_error if no valid system entry exists for the specified + // terminal. + // + // This function is thread-hostile (it inspects the environment). + static TerminfoEntry FromSystemDatabase(absl::string_view terminal_name); + + // Parses an entry from binary data. Throws std::runtime_error if the data are + // invalid. + explicit TerminfoEntry(std::istream&); + + TerminfoEntry(const TerminfoEntry&) noexcept = default; + TerminfoEntry& operator=(const TerminfoEntry&) noexcept = default; + TerminfoEntry(TerminfoEntry&&) noexcept = default; + TerminfoEntry& operator=(TerminfoEntry&&) noexcept = default; + + const std::string& name() const noexcept { return names_[0]; } + const std::vector<std::string>& names() const noexcept { return names_; } + + bool get(BooleanCapability) const noexcept; + absl::optional<int> get(NumericCapability) const noexcept; + const absl::optional<std::string>& get(StringCapability) const noexcept; + + private: + std::vector<std::string> names_; + std::vector<int8_t> booleans_; + std::vector<int32_t> numbers_; + std::vector<absl::optional<std::string>> strings_; +}; + +} // namespace goldfishterm + +#endif // EC_GOLDFISHTERM_TERMINFO_H_ |