Add initial keyboard_input parser and tests
The current implementation SEGFAULTs when F characters are followed by end of string.
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
#include "input_parser.h"
|
||||
|
||||
std::optional<Token> getModifier( const char& character )
|
||||
{
|
||||
switch ( character )
|
||||
{
|
||||
case '^':
|
||||
return Token::MODIFIER_CTRL;
|
||||
case '*':
|
||||
return Token::MODIFIER_ALT;
|
||||
case '>':
|
||||
return Token::MODIFIER_SHIFT;
|
||||
case '/':
|
||||
return Token::MODIFIER_ALTGR;
|
||||
case '#':
|
||||
return Token::MODIFIER_SUPER;
|
||||
default:
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<Token> getNumberOrLetter( const char& character )
|
||||
{
|
||||
if ( islower( character ) || isdigit( character ) )
|
||||
{
|
||||
return static_cast<Token>( character );
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::optional<Token> getFunctionNumber( const char& character )
|
||||
{
|
||||
switch ( character )
|
||||
{
|
||||
case '1':
|
||||
return Token::KEY_F1;
|
||||
case '2':
|
||||
return Token::KEY_F2;
|
||||
case '3':
|
||||
return Token::KEY_F3;
|
||||
case '4':
|
||||
return Token::KEY_F4;
|
||||
case '5':
|
||||
return Token::KEY_F5;
|
||||
case '6':
|
||||
return Token::KEY_F6;
|
||||
case '7':
|
||||
return Token::KEY_F7;
|
||||
case '8':
|
||||
return Token::KEY_F8;
|
||||
case '9':
|
||||
return Token::KEY_F9;
|
||||
|
||||
default:
|
||||
// LOG incorrect character
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<Token> ParseKeyboardInputsToTokens( const std::string inputs )
|
||||
{
|
||||
std::vector<Token> tokens{};
|
||||
|
||||
for ( auto ch = inputs.begin(); ch != inputs.end(); ++ch )
|
||||
{
|
||||
if ( const auto c = getNumberOrLetter( *ch ); c.has_value() )
|
||||
{
|
||||
tokens.push_back( *c );
|
||||
continue;
|
||||
}
|
||||
if ( const auto c = getModifier( *ch ); c.has_value() )
|
||||
{
|
||||
tokens.push_back( *c );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( !isupper( *ch ) )
|
||||
{
|
||||
// LOG incorrect character
|
||||
continue;
|
||||
}
|
||||
// Everything below is upper case
|
||||
|
||||
if ( *ch == 'F' )
|
||||
{
|
||||
++ch;
|
||||
const auto token = getFunctionNumber( *ch );
|
||||
if ( token.has_value() )
|
||||
{
|
||||
tokens.push_back( *token );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Spec says to abort on errors and submit correct values before
|
||||
// error.
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tokens;
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <cctype>
|
||||
#include <optional>
|
||||
|
||||
enum class Token
|
||||
{
|
||||
// Literals
|
||||
KEY_a = 'a',
|
||||
KEY_b = 'b',
|
||||
KEY_c = 'c',
|
||||
KEY_d = 'd',
|
||||
KEY_e = 'e',
|
||||
KEY_f = 'f',
|
||||
KEY_g = 'g',
|
||||
KEY_h = 'h',
|
||||
KEY_i = 'i',
|
||||
KEY_j = 'j',
|
||||
KEY_k = 'k',
|
||||
KEY_l = 'l',
|
||||
KEY_m = 'm',
|
||||
KEY_n = 'n',
|
||||
KEY_o = 'o',
|
||||
KEY_p = 'p',
|
||||
KEY_q = 'q',
|
||||
KEY_r = 'r',
|
||||
KEY_s = 's',
|
||||
KEY_t = 't',
|
||||
KEY_u = 'u',
|
||||
KEY_v = 'v',
|
||||
KEY_w = 'w',
|
||||
KEY_x = 'x',
|
||||
KEY_y = 'y',
|
||||
KEY_z = 'z',
|
||||
|
||||
KEY_0 = '0',
|
||||
KEY_1 = '1',
|
||||
KEY_2 = '2',
|
||||
KEY_3 = '3',
|
||||
KEY_4 = '4',
|
||||
KEY_5 = '5',
|
||||
KEY_6 = '6',
|
||||
KEY_7 = '7',
|
||||
KEY_8 = '8',
|
||||
KEY_9 = '9',
|
||||
|
||||
KEY_F1,
|
||||
KEY_F2,
|
||||
KEY_F3,
|
||||
KEY_F4,
|
||||
KEY_F5,
|
||||
KEY_F6,
|
||||
KEY_F7,
|
||||
KEY_F8,
|
||||
KEY_F9,
|
||||
|
||||
KEY_BACKSPACE,
|
||||
KEY_SPACE,
|
||||
KEY_TAB,
|
||||
KEY_ESC,
|
||||
KEY_INS,
|
||||
KEY_DEL,
|
||||
KEY_END,
|
||||
KEY_PGDN,
|
||||
KEY_PGUP,
|
||||
KEY_CAPS,
|
||||
KEY_PRNSCRN,
|
||||
KEY_PAUSE,
|
||||
KEY_SCRLOCK,
|
||||
KEY_LEFTARROW,
|
||||
KEY_RIGHTARROW,
|
||||
KEY_UPARROW,
|
||||
KEY_DOWNARROW,
|
||||
KEY_KPSLASH,
|
||||
KEY_KPSTAR,
|
||||
KEY_KPMINUS,
|
||||
KEY_KPPLUS,
|
||||
|
||||
// Misc tokens
|
||||
TOKEN_NEW_SEQUENCE,
|
||||
|
||||
// Modifiers
|
||||
MODIFIER_CTRL,
|
||||
MODIFIER_ALT,
|
||||
MODIFIER_SHIFT,
|
||||
MODIFIER_ALTGR,
|
||||
MODIFIER_SUPER,
|
||||
};
|
||||
|
||||
std::vector<Token> ParseKeyboardInputsToTokens( std::string inputs );
|
||||
Reference in New Issue
Block a user