expansion of search features
This commit is contained in:
parent
be9dbd1ff8
commit
5d633df3ba
|
@ -365,6 +365,7 @@ default_keys(Bind_Helper *context){
|
||||||
bind(context, 'E', MDFR_CTRL, left_adjust_view);
|
bind(context, 'E', MDFR_CTRL, left_adjust_view);
|
||||||
bind(context, 'f', MDFR_CTRL, search);
|
bind(context, 'f', MDFR_CTRL, search);
|
||||||
bind(context, 'F', MDFR_CTRL, list_all_locations);
|
bind(context, 'F', MDFR_CTRL, list_all_locations);
|
||||||
|
bind(context, 'F', MDFR_ALT, list_all_substring_locations_case_insensitive);
|
||||||
bind(context, 'g', MDFR_CTRL, goto_line);
|
bind(context, 'g', MDFR_CTRL, goto_line);
|
||||||
bind(context, 'h', MDFR_CTRL, cmdid_history_backward);
|
bind(context, 'h', MDFR_CTRL, cmdid_history_backward);
|
||||||
bind(context, 'H', MDFR_CTRL, cmdid_history_forward);
|
bind(context, 'H', MDFR_CTRL, cmdid_history_forward);
|
||||||
|
|
|
@ -344,11 +344,12 @@ buffer_seek_string_backward(Application_Links *app, Buffer_Summary *buffer,
|
||||||
// replacing char read_buffer[512]; with more memory.
|
// replacing char read_buffer[512]; with more memory.
|
||||||
void
|
void
|
||||||
buffer_seek_string_insensitive_forward(Application_Links *app, Buffer_Summary *buffer,
|
buffer_seek_string_insensitive_forward(Application_Links *app, Buffer_Summary *buffer,
|
||||||
int pos, char *str, int size, int *result){
|
int pos, int end, char *str, int size, int *result){
|
||||||
char read_buffer[512];
|
char read_buffer[512];
|
||||||
char chunk[1024];
|
char chunk[1024];
|
||||||
int chunk_size = sizeof(chunk);
|
int chunk_size = sizeof(chunk);
|
||||||
Stream_Chunk stream = {0};
|
Stream_Chunk stream = {0};
|
||||||
|
stream.max_end = end;
|
||||||
|
|
||||||
if (size <= 0){
|
if (size <= 0){
|
||||||
*result = buffer->size;
|
*result = buffer->size;
|
||||||
|
@ -393,11 +394,12 @@ buffer_seek_string_insensitive_forward(Application_Links *app, Buffer_Summary *b
|
||||||
// replacing char read_buffer[512]; with more memory.
|
// replacing char read_buffer[512]; with more memory.
|
||||||
void
|
void
|
||||||
buffer_seek_string_insensitive_backward(Application_Links *app, Buffer_Summary *buffer,
|
buffer_seek_string_insensitive_backward(Application_Links *app, Buffer_Summary *buffer,
|
||||||
int pos, char *str, int size, int *result){
|
int pos, int min, char *str, int size, int *result){
|
||||||
char read_buffer[512];
|
char read_buffer[512];
|
||||||
char chunk[1024];
|
char chunk[1024];
|
||||||
int chunk_size = sizeof(chunk);
|
int chunk_size = sizeof(chunk);
|
||||||
Stream_Chunk stream = {0};
|
Stream_Chunk stream = {0};
|
||||||
|
stream.min_start = min;
|
||||||
|
|
||||||
if (size <= 0){
|
if (size <= 0){
|
||||||
*result = -1;
|
*result = -1;
|
||||||
|
@ -1716,13 +1718,13 @@ isearch(Application_Links *app, int start_reversed){
|
||||||
if (in.key.keycode != key_back){
|
if (in.key.keycode != key_back){
|
||||||
int new_pos;
|
int new_pos;
|
||||||
if (reverse){
|
if (reverse){
|
||||||
buffer_seek_string_insensitive_backward(app, &buffer, start_pos - 1,
|
buffer_seek_string_insensitive_backward(app, &buffer, start_pos - 1, 0,
|
||||||
bar.string.str, bar.string.size, &new_pos);
|
bar.string.str, bar.string.size, &new_pos);
|
||||||
if (new_pos >= 0){
|
if (new_pos >= 0){
|
||||||
if (step_backward){
|
if (step_backward){
|
||||||
pos = new_pos;
|
pos = new_pos;
|
||||||
start_pos = new_pos;
|
start_pos = new_pos;
|
||||||
buffer_seek_string_insensitive_backward(app, &buffer, start_pos - 1,
|
buffer_seek_string_insensitive_backward(app, &buffer, start_pos - 1, 0,
|
||||||
bar.string.str, bar.string.size, &new_pos);
|
bar.string.str, bar.string.size, &new_pos);
|
||||||
if (new_pos < 0) new_pos = start_pos;
|
if (new_pos < 0) new_pos = start_pos;
|
||||||
}
|
}
|
||||||
|
@ -1731,13 +1733,13 @@ isearch(Application_Links *app, int start_reversed){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
buffer_seek_string_insensitive_forward(app, &buffer, start_pos + 1,
|
buffer_seek_string_insensitive_forward(app, &buffer, start_pos + 1, 0,
|
||||||
bar.string.str, bar.string.size, &new_pos);
|
bar.string.str, bar.string.size, &new_pos);
|
||||||
if (new_pos < buffer.size){
|
if (new_pos < buffer.size){
|
||||||
if (step_forward){
|
if (step_forward){
|
||||||
pos = new_pos;
|
pos = new_pos;
|
||||||
start_pos = new_pos;
|
start_pos = new_pos;
|
||||||
buffer_seek_string_insensitive_forward(app, &buffer, start_pos + 1,
|
buffer_seek_string_insensitive_forward(app, &buffer, start_pos + 1, 0,
|
||||||
bar.string.str, bar.string.size, &new_pos);
|
bar.string.str, bar.string.size, &new_pos);
|
||||||
if (new_pos >= buffer.size) new_pos = start_pos;
|
if (new_pos >= buffer.size) new_pos = start_pos;
|
||||||
}
|
}
|
||||||
|
@ -2238,7 +2240,10 @@ CUSTOM_COMMAND_SIG(eol_nixify){
|
||||||
#include "4coder_table.cpp"
|
#include "4coder_table.cpp"
|
||||||
#include "4coder_search.cpp"
|
#include "4coder_search.cpp"
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(list_all_locations){
|
static void
|
||||||
|
generic_search_all_buffers(Application_Links *app, General_Memory *general, Partition *part,
|
||||||
|
unsigned int match_flags){
|
||||||
|
|
||||||
Query_Bar string;
|
Query_Bar string;
|
||||||
char string_space[1024];
|
char string_space[1024];
|
||||||
string.prompt = make_lit_string("List Locations For: ");
|
string.prompt = make_lit_string("List Locations For: ");
|
||||||
|
@ -2250,11 +2255,11 @@ CUSTOM_COMMAND_SIG(list_all_locations){
|
||||||
Search_Set set = {0};
|
Search_Set set = {0};
|
||||||
Search_Iter iter = {0};
|
Search_Iter iter = {0};
|
||||||
|
|
||||||
search_iter_init(&global_general, &iter, string.string.size);
|
search_iter_init(general, &iter, string.string.size);
|
||||||
copy(&iter.word, string.string);
|
copy(&iter.word, string.string);
|
||||||
|
|
||||||
int buffer_count = app->get_buffer_count(app);
|
int buffer_count = app->get_buffer_count(app);
|
||||||
search_set_init(&global_general, &set, buffer_count);
|
search_set_init(general, &set, buffer_count);
|
||||||
|
|
||||||
Search_Range *ranges = set.ranges;
|
Search_Range *ranges = set.ranges;
|
||||||
|
|
||||||
|
@ -2265,7 +2270,7 @@ CUSTOM_COMMAND_SIG(list_all_locations){
|
||||||
int j = 0;
|
int j = 0;
|
||||||
if (buffer.exists){
|
if (buffer.exists){
|
||||||
ranges[0].type = SearchRange_FrontToBack;
|
ranges[0].type = SearchRange_FrontToBack;
|
||||||
ranges[0].flags = 0;
|
ranges[0].flags = match_flags;
|
||||||
ranges[0].buffer = buffer.buffer_id;
|
ranges[0].buffer = buffer.buffer_id;
|
||||||
ranges[0].start = 0;
|
ranges[0].start = 0;
|
||||||
ranges[0].size = buffer.size;
|
ranges[0].size = buffer.size;
|
||||||
|
@ -2277,7 +2282,7 @@ CUSTOM_COMMAND_SIG(list_all_locations){
|
||||||
app->get_buffer_next(app, &buffer_it, AccessAll)){
|
app->get_buffer_next(app, &buffer_it, AccessAll)){
|
||||||
if (buffer.buffer_id != buffer_it.buffer_id){
|
if (buffer.buffer_id != buffer_it.buffer_id){
|
||||||
ranges[j].type = SearchRange_FrontToBack;
|
ranges[j].type = SearchRange_FrontToBack;
|
||||||
ranges[j].flags = 0;
|
ranges[j].flags = match_flags;
|
||||||
ranges[j].buffer = buffer_it.buffer_id;
|
ranges[j].buffer = buffer_it.buffer_id;
|
||||||
ranges[j].start = 0;
|
ranges[j].start = 0;
|
||||||
ranges[j].size = buffer_it.size;
|
ranges[j].size = buffer_it.size;
|
||||||
|
@ -2298,9 +2303,10 @@ CUSTOM_COMMAND_SIG(list_all_locations){
|
||||||
app->buffer_replace_range(app, &search_buffer, 0, search_buffer.size, 0, 0);
|
app->buffer_replace_range(app, &search_buffer, 0, search_buffer.size, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Temp_Memory temp = begin_temp_memory(&global_part);
|
Temp_Memory temp = begin_temp_memory(part);
|
||||||
Partition line_part = partition_sub_part(&global_part, (4 << 10));
|
Partition line_part = partition_sub_part(part, (4 << 10));
|
||||||
char *str = (char*)partition_current(&global_part);
|
char *str = (char*)partition_current(part);
|
||||||
|
int part_size = 0;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
for (;;){
|
for (;;){
|
||||||
Search_Match match = search_next_match(app, &set, &iter);
|
Search_Match match = search_next_match(app, &set, &iter);
|
||||||
|
@ -2318,8 +2324,21 @@ CUSTOM_COMMAND_SIG(list_all_locations){
|
||||||
|
|
||||||
int str_len = file_len + 1 + line_num_len + 1 + column_num_len + 1 + 1 + line_str.size + 1;
|
int str_len = file_len + 1 + line_num_len + 1 + column_num_len + 1 + 1 + line_str.size + 1;
|
||||||
|
|
||||||
char *spare = push_array(&global_part, char, str_len);
|
char *spare = push_array(part, char, str_len);
|
||||||
size += str_len;
|
|
||||||
|
if (spare == 0){
|
||||||
|
app->buffer_replace_range(app, &search_buffer,
|
||||||
|
size, size, str, part_size);
|
||||||
|
size += part_size;
|
||||||
|
|
||||||
|
end_temp_memory(temp);
|
||||||
|
temp = begin_temp_memory(part);
|
||||||
|
|
||||||
|
part_size = 0;
|
||||||
|
spare = push_array(part, char, str_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
part_size += str_len;
|
||||||
|
|
||||||
String out_line = make_string(spare, 0, str_len);
|
String out_line = make_string(spare, 0, str_len);
|
||||||
append(&out_line, make_string(match.buffer.file_name, file_len));
|
append(&out_line, make_string(match.buffer.file_name, file_len));
|
||||||
|
@ -2340,7 +2359,7 @@ CUSTOM_COMMAND_SIG(list_all_locations){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
app->buffer_replace_range(app, &search_buffer, 0, 0, str, size);
|
app->buffer_replace_range(app, &search_buffer, size, size, str, part_size);
|
||||||
|
|
||||||
View_Summary view = app->get_active_view(app, AccessAll);
|
View_Summary view = app->get_active_view(app, AccessAll);
|
||||||
app->view_set_buffer(app, &view, search_buffer.buffer_id, 0);
|
app->view_set_buffer(app, &view, search_buffer.buffer_id, 0);
|
||||||
|
@ -2348,6 +2367,22 @@ CUSTOM_COMMAND_SIG(list_all_locations){
|
||||||
end_temp_memory(temp);
|
end_temp_memory(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CUSTOM_COMMAND_SIG(list_all_locations){
|
||||||
|
generic_search_all_buffers(app, &global_general, &global_part, SearchFlag_MatchWholeWord);
|
||||||
|
}
|
||||||
|
|
||||||
|
CUSTOM_COMMAND_SIG(list_all_substring_locations){
|
||||||
|
generic_search_all_buffers(app, &global_general, &global_part, SearchFlag_MatchSubstring);
|
||||||
|
}
|
||||||
|
|
||||||
|
CUSTOM_COMMAND_SIG(list_all_locations_case_insensitive){
|
||||||
|
generic_search_all_buffers(app, &global_general, &global_part, SearchFlag_CaseInsensitive | SearchFlag_MatchWholeWord);
|
||||||
|
}
|
||||||
|
|
||||||
|
CUSTOM_COMMAND_SIG(list_all_substring_locations_case_insensitive){
|
||||||
|
generic_search_all_buffers(app, &global_general, &global_part, SearchFlag_CaseInsensitive | SearchFlag_MatchSubstring);
|
||||||
|
}
|
||||||
|
|
||||||
struct Word_Complete_State{
|
struct Word_Complete_State{
|
||||||
Search_Set set;
|
Search_Set set;
|
||||||
Search_Iter iter;
|
Search_Iter iter;
|
||||||
|
@ -2424,14 +2459,13 @@ CUSTOM_COMMAND_SIG(word_complete){
|
||||||
complete_state.iter.word.str);
|
complete_state.iter.word.str);
|
||||||
complete_state.iter.word.size = size;
|
complete_state.iter.word.size = size;
|
||||||
|
|
||||||
// NOTE(allen): Initialize the set of ranges
|
// NOTE(allen): Initialize the set of ranges to be searched.
|
||||||
// to be searched.
|
|
||||||
int buffer_count = app->get_buffer_count(app);
|
int buffer_count = app->get_buffer_count(app);
|
||||||
search_set_init(&global_general, &complete_state.set, buffer_count);
|
search_set_init(&global_general, &complete_state.set, buffer_count);
|
||||||
|
|
||||||
Search_Range *ranges = complete_state.set.ranges;
|
Search_Range *ranges = complete_state.set.ranges;
|
||||||
ranges[0].type = SearchRange_Wave;
|
ranges[0].type = SearchRange_Wave;
|
||||||
ranges[0].flags = SearchFlag_MatchStartOfIdentifier;
|
ranges[0].flags = SearchFlag_MatchWordPrefix;
|
||||||
ranges[0].buffer = buffer.buffer_id;
|
ranges[0].buffer = buffer.buffer_id;
|
||||||
ranges[0].start = 0;
|
ranges[0].start = 0;
|
||||||
ranges[0].size = buffer.size;
|
ranges[0].size = buffer.size;
|
||||||
|
@ -2444,7 +2478,7 @@ CUSTOM_COMMAND_SIG(word_complete){
|
||||||
app->get_buffer_next(app, &buffer_it, AccessAll)){
|
app->get_buffer_next(app, &buffer_it, AccessAll)){
|
||||||
if (buffer.buffer_id != buffer_it.buffer_id){
|
if (buffer.buffer_id != buffer_it.buffer_id){
|
||||||
ranges[j].type = SearchRange_FrontToBack;
|
ranges[j].type = SearchRange_FrontToBack;
|
||||||
ranges[j].flags = SearchFlag_MatchStartOfIdentifier;
|
ranges[j].flags = SearchFlag_MatchWordPrefix;
|
||||||
ranges[j].buffer = buffer_it.buffer_id;
|
ranges[j].buffer = buffer_it.buffer_id;
|
||||||
ranges[j].start = 0;
|
ranges[j].start = 0;
|
||||||
ranges[j].size = buffer_it.size;
|
ranges[j].size = buffer_it.size;
|
||||||
|
|
|
@ -9,7 +9,11 @@ enum Search_Range_Type{
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Search_Range_Flag{
|
enum Search_Range_Flag{
|
||||||
SearchFlag_MatchStartOfIdentifier = 0x1,
|
SearchFlag_MatchWholeWord = 0x00,
|
||||||
|
SearchFlag_MatchWordPrefix = 0x01,
|
||||||
|
SearchFlag_MatchSubstring = 0x02,
|
||||||
|
SearchFlag_MatchMask = 0xFF,
|
||||||
|
SearchFlag_CaseInsensitive = 0x0100,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Search_Range{
|
struct Search_Range{
|
||||||
|
@ -190,13 +194,60 @@ match_check(Application_Links *app, Search_Range *range, int *pos, Search_Match
|
||||||
Search_Match result = *result_ptr;
|
Search_Match result = *result_ptr;
|
||||||
int end_pos = range->start + range->size;
|
int end_pos = range->start + range->size;
|
||||||
|
|
||||||
if (range->flags & SearchFlag_MatchStartOfIdentifier){
|
int type = (range->flags & SearchFlag_MatchMask);
|
||||||
char prev = buffer_get_char(app, &result.buffer, result.start - 1);
|
|
||||||
if (!char_is_alpha_numeric(prev)){
|
|
||||||
result.end =
|
|
||||||
buffer_seek_alpha_numeric_end(
|
|
||||||
app, &result.buffer, result.start);
|
|
||||||
|
|
||||||
|
switch (type){
|
||||||
|
case SearchFlag_MatchWholeWord:
|
||||||
|
{
|
||||||
|
char first = word.str[0];
|
||||||
|
|
||||||
|
char prev = ' ';
|
||||||
|
if (char_is_alpha_numeric(first)){
|
||||||
|
prev = buffer_get_char(app, &result.buffer, result.start - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!char_is_alpha_numeric(prev)){
|
||||||
|
result.end = result.start + word.size;
|
||||||
|
if (result.end <= end_pos){
|
||||||
|
char last = word.str[word.size-1];
|
||||||
|
|
||||||
|
char next = ' ';
|
||||||
|
if (char_is_alpha_numeric(last)){
|
||||||
|
next = buffer_get_char(app, &result.buffer, result.end);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!char_is_alpha_numeric(next)){
|
||||||
|
result.found_match = true;
|
||||||
|
found_match = FindResult_FoundMatch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
found_match = FindResult_PastEnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case SearchFlag_MatchWordPrefix:
|
||||||
|
{
|
||||||
|
char prev = buffer_get_char(app, &result.buffer, result.start - 1);
|
||||||
|
if (!char_is_alpha_numeric(prev)){
|
||||||
|
result.end =
|
||||||
|
buffer_seek_alpha_numeric_end(
|
||||||
|
app, &result.buffer, result.start);
|
||||||
|
|
||||||
|
if (result.end <= end_pos){
|
||||||
|
result.found_match = true;
|
||||||
|
found_match = FindResult_FoundMatch;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
found_match = FindResult_PastEnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case SearchFlag_MatchSubstring:
|
||||||
|
{
|
||||||
|
result.end = result.start + word.size;
|
||||||
if (result.end <= end_pos){
|
if (result.end <= end_pos){
|
||||||
result.found_match = true;
|
result.found_match = true;
|
||||||
found_match = FindResult_FoundMatch;
|
found_match = FindResult_FoundMatch;
|
||||||
|
@ -204,35 +255,7 @@ match_check(Application_Links *app, Search_Range *range, int *pos, Search_Match
|
||||||
else{
|
else{
|
||||||
found_match = FindResult_PastEnd;
|
found_match = FindResult_PastEnd;
|
||||||
}
|
}
|
||||||
}
|
}break;
|
||||||
}
|
|
||||||
else{
|
|
||||||
char first = word.str[0];
|
|
||||||
|
|
||||||
char prev = ' ';
|
|
||||||
if (char_is_alpha_numeric(first)){
|
|
||||||
prev = buffer_get_char(app, &result.buffer, result.start - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!char_is_alpha_numeric(prev)){
|
|
||||||
result.end = result.start + word.size;
|
|
||||||
if (result.end <= end_pos){
|
|
||||||
char last = word.str[word.size-1];
|
|
||||||
|
|
||||||
char next = ' ';
|
|
||||||
if (char_is_alpha_numeric(last)){
|
|
||||||
next = buffer_get_char(app, &result.buffer, result.end);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!char_is_alpha_numeric(next)){
|
|
||||||
result.found_match = true;
|
|
||||||
found_match = FindResult_FoundMatch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
found_match = FindResult_PastEnd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*result_ptr = result;
|
*result_ptr = result;
|
||||||
|
@ -257,11 +280,21 @@ search_front_to_back_step(Application_Links *app,
|
||||||
start_pos = range->start;
|
start_pos = range->start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int case_insensitive = (range->flags & SearchFlag_CaseInsensitive);
|
||||||
|
|
||||||
result.buffer = app->get_buffer(app, range->buffer, AccessAll);
|
result.buffer = app->get_buffer(app, range->buffer, AccessAll);
|
||||||
buffer_seek_string_forward(app, &result.buffer,
|
if (case_insensitive){
|
||||||
start_pos, end_pos,
|
buffer_seek_string_insensitive_forward(app, &result.buffer,
|
||||||
word.str, word.size,
|
start_pos, end_pos,
|
||||||
&result.start);
|
word.str, word.size,
|
||||||
|
&result.start);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
buffer_seek_string_forward(app, &result.buffer,
|
||||||
|
start_pos, end_pos,
|
||||||
|
word.str, word.size,
|
||||||
|
&result.start);
|
||||||
|
}
|
||||||
|
|
||||||
if (result.start < end_pos){
|
if (result.start < end_pos){
|
||||||
*pos = result.start + 1;
|
*pos = result.start + 1;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Distribution Date: 15.7.2016 (dd.mm.yyyy)
|
Distribution Date: 17.7.2016 (dd.mm.yyyy)
|
||||||
|
|
||||||
Thank you for contributing to the 4coder project!
|
Thank you for contributing to the 4coder project!
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue