Modernize some reader code for C++11

This commit is contained in:
ridiculousfish
2018-08-11 12:39:24 -07:00
parent 1f2b2b119a
commit 82bff2d692
2 changed files with 35 additions and 56 deletions

View File

@@ -159,37 +159,37 @@ class reader_data_t {
/// Current page rendering.
page_rendering_t current_page_rendering;
/// Whether autosuggesting is allowed at all.
bool allow_autosuggestion;
bool allow_autosuggestion{false};
/// When backspacing, we temporarily suppress autosuggestions.
bool suppress_autosuggestion;
bool suppress_autosuggestion{false};
/// Whether abbreviations are expanded.
bool expand_abbreviations;
bool expand_abbreviations{false};
/// Silent mode used for password input on the read command
bool silent;
bool silent{false};
/// The representation of the current screen contents.
screen_t screen;
/// The history.
history_t *history;
history_t *history{nullptr};
/// String containing the current search item.
wcstring search_buff;
/// History search.
history_search_t history_search;
/// Saved position used by token history search.
size_t token_history_pos;
size_t token_history_pos{0};
/// Saved search string for token history search. Not handled by command_line_changed.
wcstring token_history_buff;
/// List for storing previous search results. Used to avoid duplicates.
wcstring_list_t search_prev;
/// The current position in search_prev.
size_t search_pos;
/// The current position in token_search_prev.
size_t search_pos{0};
/// Indicates whether a selection is currently active.
bool sel_active;
bool sel_active{false};
/// The position of the cursor, when selection was initiated.
size_t sel_begin_pos;
size_t sel_begin_pos{0};
/// The start position of the current selection, if one.
size_t sel_start_pos;
size_t sel_start_pos{0};
/// The stop position of the current selection, if one.
size_t sel_stop_pos;
size_t sel_stop_pos{0};
/// Name of the current application.
wcstring app_name;
/// The prompt commands.
@@ -201,36 +201,36 @@ class reader_data_t {
wcstring right_prompt_buff;
/// Completion support.
wcstring cycle_command_line;
size_t cycle_cursor_pos;
size_t cycle_cursor_pos{0};
/// Color is the syntax highlighting for buff. The format is that color[i] is the
/// classification (according to the enum in highlight.h) of buff[i].
std::vector<highlight_spec_t> colors;
/// An array defining the block level at each character.
std::vector<int> indents;
/// Function for tab completion.
complete_function_t complete_func;
complete_function_t complete_func{nullptr};
/// Function for syntax highlighting.
highlight_function_t highlight_function;
highlight_function_t highlight_func{nullptr};
/// Function for testing if the string can be returned.
parser_test_error_bits_t (*test_func)(const wchar_t *);
test_function_t test_func{nullptr};
/// When this is true, the reader will exit.
bool end_loop;
bool end_loop{false};
/// If this is true, exit reader even if there are running jobs. This happens if we press e.g.
/// ^D twice.
bool prev_end_loop;
bool prev_end_loop{false};
/// The current contents of the top item in the kill ring.
wcstring kill_item;
/// Pointer to previous reader_data.
reader_data_t *next;
reader_data_t *next{nullptr};
/// This variable keeps state on if we are in search mode, and if yes, what mode.
history_search_mode_t search_mode = history_search_mode_t::none;
/// Keep track of whether any internal code has done something which is known to require a
/// repaint.
bool repaint_needed;
bool repaint_needed{false};
/// Whether a screen reset is needed after a repaint.
bool screen_reset_needed;
bool screen_reset_needed{false};
/// Whether the reader should exit on ^C.
bool exit_on_interrupt;
bool exit_on_interrupt{false};
bool is_navigating_pager_contents() const { return this->pager.is_navigating_contents(); }
@@ -253,28 +253,7 @@ class reader_data_t {
bool expand_abbreviation_as_necessary(size_t cursor_backtrack) const;
/// Constructor
reader_data_t()
: allow_autosuggestion(false),
suppress_autosuggestion(false),
expand_abbreviations(false),
silent(false),
history(0),
token_history_pos(0),
search_pos(0),
sel_active(false),
sel_begin_pos(0),
sel_start_pos(0),
sel_stop_pos(0),
cycle_cursor_pos(0),
complete_func(0),
highlight_function(0),
test_func(0),
end_loop(false),
prev_end_loop(false),
next(0),
repaint_needed(false),
screen_reset_needed(false),
exit_on_interrupt(false) {}
reader_data_t() = default;
};
/// Sets the command line contents, without clearing the pager.
@@ -1927,8 +1906,7 @@ void reader_run_command(parser_t &parser, const wcstring &cmd) {
#endif
}
parser_test_error_bits_t reader_shell_test(const wchar_t *b) {
assert(b != NULL);
parser_test_error_bits_t reader_shell_test(const wcstring &b) {
wcstring bstr = b;
// Append a newline, to act as a statement terminator.
@@ -1957,7 +1935,7 @@ parser_test_error_bits_t reader_shell_test(const wchar_t *b) {
///
/// TODO: Possibly remove this. It is called from only only one place: reader_push().Since it always
/// returns a static result it's not clear why it's needed.
static parser_test_error_bits_t default_test(const wchar_t *b) {
static parser_test_error_bits_t default_test(const wcstring &b) {
UNUSED(b);
return 0;
}
@@ -2024,11 +2002,9 @@ void reader_set_expand_abbreviations(bool flag) { data->expand_abbreviations = f
void reader_set_complete_function(complete_function_t f) { data->complete_func = f; }
void reader_set_highlight_function(highlight_function_t func) { data->highlight_function = func; }
void reader_set_highlight_function(highlight_function_t func) { data->highlight_func = func; }
void reader_set_test_function(parser_test_error_bits_t (*f)(const wchar_t *)) {
data->test_func = f;
}
void reader_set_test_function(test_function_t f) { data->test_func = f; }
void reader_set_exit_on_interrupt(bool i) { data->exit_on_interrupt = i; }
@@ -2098,7 +2074,7 @@ static std::function<highlight_result_t(void)> get_highlight_performer(const wcs
bool no_io) {
env_vars_snapshot_t vars(env_vars_snapshot_t::highlighting_keys);
unsigned int generation_count = read_generation_count();
highlight_function_t highlight_func = no_io ? highlight_shell_no_io : data->highlight_function;
highlight_function_t highlight_func = no_io ? highlight_shell_no_io : data->highlight_func;
return [=]() -> highlight_result_t {
if (generation_count != read_generation_count()) {
// The gen count has changed, so don't do anything.
@@ -2764,7 +2740,7 @@ const wchar_t *reader_readline(int nchars) {
}
// See if this command is valid.
int command_test_result = data->test_func(el->text.c_str());
int command_test_result = data->test_func(el->text);
if (command_test_result == 0 || command_test_result == PARSER_TEST_INCOMPLETE) {
// This command is valid, but an abbreviation may make it invalid. If so, we
// will have to test again.

View File

@@ -162,17 +162,20 @@ void reader_set_complete_function(complete_function_t);
typedef void (*highlight_function_t)(const wcstring &, std::vector<highlight_spec_t> &, size_t,
wcstring_list_t *, const env_vars_snapshot_t &vars);
/// Function type for testing if a string is valid for the reader to return.
using test_function_t = parser_test_error_bits_t (*)(const wcstring &);
/// Specify function for syntax highlighting. The function must take these arguments:
///
/// - The command to be highlighted as a null terminated array of wchar_t
/// - The color code of each character as an array of ints
/// - The cursor position
/// - An array_list_t used for storing error messages
void reader_set_highlight_function(highlight_function_t);
void reader_set_highlight_function(highlight_function_t func);
/// Specify function for testing if the command buffer contains syntax errors that must be corrected
/// before returning.
void reader_set_test_function(parser_test_error_bits_t (*f)(const wchar_t *));
void reader_set_test_function(test_function_t func);
/// Specify string of shell commands to be run in order to generate the prompt.
void reader_set_left_prompt(const wcstring &prompt);
@@ -202,7 +205,7 @@ bool reader_exit_forced();
/// Test if the given shell command contains errors. Uses parser_test for testing. Suitable for
/// reader_set_test_function().
parser_test_error_bits_t reader_shell_test(const wchar_t *b);
parser_test_error_bits_t reader_shell_test(const wcstring &);
/// Test whether the interactive reader is in search mode.
///