tUpdate TODO, perform find on raw strings - ve - a minimal text editor (work in… | |
git clone git://src.adamsgaard.dk/ve | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 7b9298fa4a55f2d4c7fdfcddf3a34c01748f2819 | |
parent 7c68f24f6652203a84104651ceb7ee4790ff8906 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Wed, 7 Aug 2019 14:54:53 +0200 | |
Update TODO, perform find on raw strings | |
Diffstat: | |
M TODO | 2 ++ | |
M find.c | 45 ++++++++++++++++++++++++-----… | |
2 files changed, 37 insertions(+), 10 deletions(-) | |
--- | |
diff --git a/TODO b/TODO | |
t@@ -11,6 +11,8 @@ Core functionality: | |
- Implement syntax highlighting | |
- Full unicode support | |
- Keep indentation level, adjust with > and < | |
+ - Hard-wrap (insert newline) | |
+ - Soft-wrap (wrap display of long lines) | |
Interfacing: | |
- Allow call of external processes with commands (sed?, sam?) | |
diff --git a/find.c b/find.c | |
t@@ -10,13 +10,28 @@ | |
#include "row.h" | |
#include "output.h" | |
+/* reverse of strstr (3) */ | |
+char* | |
+strrstr(char *haystack, char *needle, | |
+ ssize_t haystack_length, ssize_t needle_length) | |
+{ | |
+ char *cp; | |
+ for (cp = haystack + haystack_length - needle_length; | |
+ cp >= haystack; | |
+ cp--) { | |
+ if (strncmp(cp, needle, needle_length) == 0) | |
+ return cp; | |
+ } | |
+ return NULL; | |
+} | |
+ | |
/* find E.find_query from current cursor position moving in E.direction | |
* if opposite_direction = 0, and opposite E.direction if | |
* opposite_direction = 1 */ | |
void | |
editor_find_next_occurence(int opposite_direction) | |
{ | |
- int y, y_inc, x_offset; | |
+ int y, y_inc, x_offset, query_len; | |
eRow *row; | |
char *match; | |
t@@ -30,6 +45,7 @@ editor_find_next_occurence(int opposite_direction) | |
y_inc = -1; | |
x_offset = 0; | |
+ query_len = strlen(E.find_query); | |
/* from cursor until end of document */ | |
for (y = E.cursor_y; | |
y != ((y_inc == +1) ? E.num_rows : -1); | |
t@@ -37,33 +53,42 @@ editor_find_next_occurence(int opposite_direction) | |
row = &E.row[y]; | |
if (y == E.cursor_y) | |
- x_offset = y_inc + editor_row_cursor_x_to_rx(&E.row[E.… | |
- E.cursor_x); | |
+ x_offset = y_inc + E.cursor_x; | |
else | |
x_offset = 0; | |
- /* TODO: lines are not searched in reverse with opposite_direc… | |
- match = strstr(row->rchars + x_offset, E.find_query); | |
- if (match) | |
- break; | |
+ if (y_inc == +1) { | |
+ match = strstr(row->chars + x_offset, E.find_query); | |
+ editor_set_status_message("'%s', x_offset=%d", | |
+ row->chars + x_offset, x_off… | |
+ if (match) | |
+ break; | |
+ } else { | |
+ match = strrstr(row->chars, E.find_query, | |
+ row->size - x_offset, query_len); | |
+ if (match) | |
+ break; | |
+ } | |
} | |
+ | |
if (match) { | |
E.cursor_y = y; | |
- E.cursor_x = editor_row_cursor_rx_to_x(row, match - row->rchar… | |
+ E.cursor_x = match - row->chars; | |
/* E.row_offset = E.num_rows; */ /* put line to top of screen … | |
+ | |
} else { | |
/* from other end of file until cursor */ | |
for (y = (y_inc == +1) ? 0 : E.num_rows - 1; | |
y != E.cursor_y + y_inc; | |
y += y_inc) { | |
row = &E.row[y]; | |
- match = strstr(row->rchars, E.find_query); | |
+ match = strstr(row->chars, E.find_query); | |
if (match) | |
break; | |
} | |
if (match) { | |
E.cursor_y = y; | |
- E.cursor_x = editor_row_cursor_rx_to_x(row, match - ro… | |
+ E.cursor_x = editor_row_cursor_rx_to_x(row, match - ro… | |
} | |
} | |
} |