// 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 #include #include #include #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& names() const noexcept { return names_; } bool get(BooleanCapability) const noexcept; absl::optional get(NumericCapability) const noexcept; const absl::optional& get(StringCapability) const noexcept; private: std::vector names_; std::vector booleans_; std::vector numbers_; std::vector> strings_; }; } // namespace goldfishterm #endif // EC_GOLDFISHTERM_TERMINFO_H_