From a307da34faa99c7b3eed23e2f858abcc690162ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tr=C3=A1vn=C3=AD=C4=8Dek?= <jan.travnicek@fit.cvut.cz> Date: Mon, 13 Dec 2021 22:01:01 +0100 Subject: [PATCH] aql: more code to cpp --- aql2/src/prompt/ReadlinePromptHistory.cpp | 22 +++++++++++++--------- aql2/src/prompt/ReadlinePromptHistory.h | 4 ---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/aql2/src/prompt/ReadlinePromptHistory.cpp b/aql2/src/prompt/ReadlinePromptHistory.cpp index 990feb74dd..9e1cdf264c 100644 --- a/aql2/src/prompt/ReadlinePromptHistory.cpp +++ b/aql2/src/prompt/ReadlinePromptHistory.cpp @@ -3,25 +3,27 @@ #include <readline/history.h> #include <cstring> +#include <array> -char ReadlinePromptHistory::esc_char [] = { '\a', '\b', '\f', '\n', '\r', '\t', '\v', '\\' }; -char ReadlinePromptHistory::essc_str [] = { 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\' }; -size_t ReadlinePromptHistory::esc_char_size = sizeof ( ReadlinePromptHistory::esc_char ); +static constexpr std::array < std::pair < char, char >, 8 > esc_char_list = { { { '\a', 'a'}, {'\b', 'b'}, {'\f', 'f'}, {'\n', 'n'}, {'\r', 'r'}, {'\t', 't'}, {'\v', 'v'}, {'\\', '\\'} } }; char * ReadlinePromptHistory::descape ( const char * buffer ) { size_t l = strlen ( buffer ); char * dest = static_cast < char * > ( malloc ( ( l + 1 ) * sizeof ( char ) ) ); char * ptr = dest; + for ( size_t i = 0; i < l; ++ i ) { if ( buffer [ i ] == '\\' ) { ++ i; - size_t j = std::find ( essc_str, essc_str + esc_char_size, buffer [ i ] ) - essc_str; - if ( j == esc_char_size ) { + auto find_by_escaped = [ & ] ( const std::pair < char, char > & esc_pair ) { return esc_pair.second == buffer [ i ]; }; + std::array < std::pair < char, char >, 8 >::const_iterator iter = std::find_if ( esc_char_list.begin ( ), esc_char_list.end ( ), find_by_escaped ); + if ( iter == esc_char_list.end ( ) ) { free ( dest ); return strdup ( buffer ); + } else { + * ptr ++ = iter->first; } - * ptr ++ = esc_char [ j ]; } else { * ptr ++ = buffer [ i ]; } @@ -36,13 +38,15 @@ char * ReadlinePromptHistory::escape ( const char * buffer){ char * dest = static_cast < char * > ( malloc ( ( l * 2 + 1 ) * sizeof ( char ) ) ); char * ptr = dest; + for ( size_t i = 0; i < l; ++ i ) { - size_t j = std::find ( esc_char, esc_char + esc_char_size, buffer [ i ] ) - esc_char; - if ( j == esc_char_size ) { + auto find_by_actual = [ & ] ( const std::pair < char, char > & esc_pair ) { return esc_pair.first == buffer [ i ]; }; + std::array < std::pair < char, char >, 8 >::const_iterator iter = std::find_if ( esc_char_list.begin ( ), esc_char_list.end ( ), find_by_actual ); + if ( iter == esc_char_list.end ( ) ) { * ptr ++ = buffer [ i ]; } else { * ptr ++ = '\\'; - * ptr ++ = essc_str [ j ]; + * ptr ++ = iter->second; } } * ptr = '\0'; diff --git a/aql2/src/prompt/ReadlinePromptHistory.h b/aql2/src/prompt/ReadlinePromptHistory.h index 5525731698..8bda77c625 100644 --- a/aql2/src/prompt/ReadlinePromptHistory.h +++ b/aql2/src/prompt/ReadlinePromptHistory.h @@ -3,10 +3,6 @@ #include <string> class ReadlinePromptHistory { - static char esc_char []; - static char essc_str []; - static size_t esc_char_size; - static char * descape ( const char * buffer ); static char * escape ( const char * buffer); -- GitLab