From 55cd4077b12fa1bf5c768c22143d963c8b721ae0 Mon Sep 17 00:00:00 2001 From: nova Date: Sun, 17 Aug 2025 23:21:28 +0200 Subject: [PATCH] smart case search in file search --- backend.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ backend.h | 1 + interactions.c | 6 +++--- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/backend.c b/backend.c index 277543a..fa0d6e0 100644 --- a/backend.c +++ b/backend.c @@ -1,3 +1,6 @@ +#include +#include + char* concat(const char *s1, const char *s2){ const size_t len1 = strlen(s1); const size_t len2 = strlen(s2); @@ -6,5 +9,46 @@ char* concat(const char *s1, const char *s2){ memcpy(result + len1, s2, len2 + 1); return result; } +char* smartstrcasestr(char *haystack, const char *needle){ + char smart = 0; + char *ret; + char passes = 0; + while (*needle) { + if (*needle >= 'A' && *needle <= 'Z') { + smart = 1; + break; + } + passes++; + needle++; + } + needle -= passes; + if (smart == 0) { + char *needle_case = malloc(strlen(needle)+1); + strcpy(needle_case, needle); + passes = 0; + while (*needle_case) { + *needle_case = *needle_case | ' '; + needle_case++; + passes++; + } + needle_case -= passes; + char *haystack_case = malloc(strlen(haystack)+1); + strcpy(haystack_case, haystack); + passes = 0; + while (*haystack_case) { + *haystack_case = *haystack_case | ' '; + haystack_case++; + passes++; + } + haystack_case -= passes; + + ret = strstr(haystack_case, needle_case); + free(needle_case); + free(haystack_case); + } else { + ret = strstr(haystack, needle); + } + return ret; +} diff --git a/backend.h b/backend.h index 3435102..bbf0919 100644 --- a/backend.h +++ b/backend.h @@ -6,3 +6,4 @@ char* concat(const char *s1, const char *s2); +char* smartstrcasestr(char *haystack, const char *needle); diff --git a/interactions.c b/interactions.c index 0597675..92dac15 100644 --- a/interactions.c +++ b/interactions.c @@ -772,7 +772,7 @@ void search(){ pass++; unsigned long i; for (i = 0; i < mid_file_count; i++) { - if (strstr(mid_content[i].file_name, search_buffer)) { + if (smartstrcasestr(mid_content[i].file_name, search_buffer)) { selected_file_current = i; status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_0); update_selected_file(); @@ -794,7 +794,7 @@ void search(){ void search_next(){ unsigned long i; for (i = selected_file_current+1; i < mid_file_count; i++) { - if (strstr(mid_content[i].file_name, search_buffer)) { + if (smartstrcasestr(mid_content[i].file_name, search_buffer)) { selected_file_current = i; status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_0); update_selected_file(); @@ -809,7 +809,7 @@ void search_previous(){ if(i > selected_file_current) { break; } - if (strstr(mid_content[i].file_name, search_buffer)) { + if (smartstrcasestr(mid_content[i].file_name, search_buffer)) { selected_file_current = i; status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_0); update_selected_file();