Add missing input.cpp and input.hpp

This commit is contained in:
Louis Rubet 2022-02-22 16:34:17 +01:00
parent d590642a6c
commit 50351b1917
2 changed files with 94 additions and 0 deletions

71
src/input.cpp Normal file
View file

@ -0,0 +1,71 @@
#include "string.h"
#include "input.hpp"
vector<string>* Input::_acWords = nullptr;
Input::Input(string& entry, vector<string>& autocompletionWords, string prompt, string mlPrompt) : status(cont) {
char* c_entry;
bool multiline = false;
int entry_len;
_acWords = &autocompletionWords;
// linenoise for entry
linenoiseSetCompletionCallback(entry_completion_generator);
while (status == cont) {
// get user entry
if (multiline)
c_entry = linenoise(mlPrompt.c_str(), &entry_len);
else
c_entry = linenoise(prompt.c_str(), &entry_len);
// Ctrl-C
if (linenoiseKeyType() == 1) {
if (entry_len > 0 || multiline)
status = abort;
else
status = ctrlc;
} else if (linenoiseKeyType() == 3) {
multiline = true;
if (c_entry != nullptr) entry += c_entry;
entry += " ";
} else {
if (c_entry != nullptr) {
entry += c_entry;
// keep history
if (c_entry[0] != 0) (void)linenoiseHistoryAdd(entry.c_str());
status = ok;
} else
status = error;
}
}
}
/// @brief completion callback as asked by linenoise-ng
/// this is called by linenoise-ng whenever the user enters TAB
///
/// @param text the text after wich the user entered TAB
/// @param lc the completion object to add strings with linenoiseAddCompletion()
///
void Input::entry_completion_generator(const char* text, linenoiseCompletions* lc) {
if (Input::_acWords == nullptr || text == nullptr)
return;
int text_len = strnlen(text, 6);
// propose all keywords
if (text_len == 0)
for (string& ac : *Input::_acWords)
// add all keywords
linenoiseAddCompletion(lc, ac.c_str());
// propose keywords matching to text begining
else
for (string& ac : *Input::_acWords)
// compare list entry with text, return if match
if (ac.compare(0, text_len, text) == 0) linenoiseAddCompletion(lc, ac.c_str());
}
void Input::preload(const char* preloadText) {
if (preloadText != nullptr)
linenoisePreloadBuffer(preloadText);
}

23
src/input.hpp Normal file
View file

@ -0,0 +1,23 @@
#ifndef _ENTRY_HPP_
#define _ENTRY_HPP_
#include <string>
#include <vector>
using namespace std;
#include <cstdio>
#include "linenoise.h"
class Input {
public:
Input(string& entry, vector<string>& autocompletionWords, string prompt = "rpn> ", string mlPrompt = ">");
enum {ok, cont, abort, ctrlc, error} status;
static void preload(const char* preloadText);
private:
static void entry_completion_generator(const char* text, linenoiseCompletions* lc);
static vector<string>* _acWords;
};
#endif