Backward search in internal viewer
Andrew V. Samoilov
sav at bcs.zp.ua
Tue Jun 19 10:35:14 UTC 2001
Hi!
This patch adds backward search feature for normal search
in internal viewer. This one is for non gnome edition, sorry.
I want to receive some comments about this patch.
TODO: As far as I know get_line_at () is needed only for regexp search.
do_normal_search should be rewritten without allocating memory for string.
BTW, I can't understand, who need MenuBarEmpty structure in main.c ?
With best regards,
Andrew.
--- ChangeLog-orig Sat Jun 16 10:46:05 2001
+++ ChangeLog Sat Jun 16 11:46:37 2001
@@ -8,6 +8,12 @@
* tree.c (tree_copy, tree_move): Possible memory leaking fixed.
(tree_keymap): Constified.
+ * view.c [!HAVE_GNOME]: Implement backward search in "normal" search.
+ (icase_search_p): Add code for backward search.
+ (get_line_at): Likewise.
+ (do_normal_search): Likewise.
+ (search): Fix backward search.
+
2001-06-15 Pavel Roskin <proski at gnu.org>
* panelize.c: Define DIR_H_INCLUDE_HANDLE_DIRENT earlier, since
Index: view.c
===================================================================
RCS file: /home/sav/.cvsroot/mc/src/view.c,v
retrieving revision 1.46
diff -u -p -r1.46 view.c
--- view.c 2001/05/25 08:20:13 1.46
+++ view.c 2001/05/25 18:41:05
@@ -1368,10 +1378,27 @@ icase_search_p (WView *view, char *text,
{
char *q;
int lng;
+#ifndef HAVE_GNOME
+ int direction = view->direction;
+
+ if (direction == -1)
+ reverse_string (text);
+
+ q = _icase_search (text, data, &lng);
+ if (direction == -1)
+ reverse_string (text);
+
+ if (q != 0) {
+ if (direction > 0)
+ view->search_start = q - data - lng;
+ else
+ view->search_start = strlen (data) - (q - data);
+#else
if ((q = _icase_search (text, data, &lng)) != 0) {
- view->found_len = lng;
view->search_start = q - data - lng;
+#endif
+ view->found_len = lng;
return 1;
}
return 0;
@@ -1403,8 +1430,13 @@ get_line_at (WView *view, unsigned long
long i = 0;
int prev = 0;
+ if (!pos && direction == -1)
+ return 0;
+
/* skip over all the possible zeros in the file */
while ((ch = get_byte (view, pos)) == 0) {
+ if (!pos && direction == -1)
+ break;
pos += direction; i++;
}
*skipped = i;
@@ -1422,21 +1454,27 @@ get_line_at (WView *view, unsigned long
usable_size = buffer_size - 2;
}
- pos += direction; i++;
+ i++;
+ buffer [i] = ch;
- if (ch == '\n' || !ch){
+ if (!pos && direction == -1)
break;
- }
- buffer [i] = ch;
+
+ pos += direction;
+
+ if (ch == '\n' || !ch)
+ break;
}
+
if (buffer){
buffer [0] = prev;
buffer [i] = 0;
-
+#ifdef HAVE_GNOME
/* If we are searching backwards, reverse the string */
if (direction < 0) {
reverse_string (buffer + 1);
}
+#endif
}
*p = pos;
@@ -1520,7 +1558,7 @@ search (WView *view, char *text, int (*s
if (view->direction == 1){
p = found_len ? search_start + 1 : search_start;
} else {
- p = (found_len ? search_start : view->last) - 1;
+ p = found_len ? (search_start ? search_start - 1 : 0) : search_start;
}
beginning = p;
@@ -1567,7 +1604,7 @@ search (WView *view, char *text, int (*s
if (view->direction == 1)
t += forward_line_start;
else
- t += reverse_line_start ? reverse_line_start + 3 : 0;
+ t = reverse_line_start ? reverse_line_start + 2 : 0;
view->search_start += t;
if (t != beginning){
@@ -1983,7 +2016,53 @@ normal_search (WView *view, int directio
convert_to_display( exp );
#endif
+#ifndef HAVE_GNOME
+ if (!view->hex_mode) {
+
+ enum {
+ SEARCH_DLG_HEIGHT = 8,
+ SEARCH_DLG_WIDTH = 58
+ };
+
+ static int replace_backwards;
+ int treplace_backwards = replace_backwards;
+ char *tsearch_text;
+
+ QuickWidget quick_widgets[] = {
+ {quick_button, 6, 10, 5, SEARCH_DLG_HEIGHT, N_("&Cancel"), 0, B_CANCEL,
+ 0, 0, NULL},
+ {quick_button, 2, 10, 5, SEARCH_DLG_HEIGHT, N_("&Ok"), 0, B_ENTER,
+ 0, 0, NULL},
+ {quick_checkbox, 3, SEARCH_DLG_WIDTH, 4, SEARCH_DLG_HEIGHT, N_("&Backwards"), 0, 0,
+ 0, 0, NULL},
+ {quick_input, 3, SEARCH_DLG_WIDTH, 3, SEARCH_DLG_HEIGHT, "", 52, 0,
+ 0, 0, N_(" Search ")},
+ {quick_label, 2, SEARCH_DLG_WIDTH, 2, SEARCH_DLG_HEIGHT, N_(" Enter search string:"), 0, 0,
+ 0, 0, 0},
+ {0}
+ };
+
+ quick_widgets[2].result = &treplace_backwards;
+ quick_widgets[3].str_result = &tsearch_text;
+ quick_widgets[3].text = exp;
+
+ {
+ QuickDialog Quick_input = {
+ SEARCH_DLG_WIDTH, SEARCH_DLG_HEIGHT, -1, 0, N_(" Search "),
+ "[Input Line Keys]", "quick_input", 0, 0
+ };
+ Quick_input.widgets = quick_widgets;
+ if (quick_dialog (&Quick_input) == B_CANCEL) {
+ return;
+ }
+ exp = *(quick_widgets[3].str_result);
+ replace_backwards = treplace_backwards;
+ direction = (replace_backwards) ? -1 : 1;
+ }
+} else
+#endif /* !HAVE_GNOME */
exp = input_dialog (_(" Search "), _(" Enter search string:"), exp);
+
if ((!exp)){
return;
}
More information about the mc-devel
mailing list