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