This source file includes following definitions.
- mcdiffview_dialog_search
- mcdiffview_do_search_backward
- mcdiffview_do_search_forward
- mcdiffview_do_search
- dview_search_cmd
- dview_continue_search_cmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <config.h>
28
29 #include <stdio.h>
30
31 #include "lib/global.h"
32 #include "lib/strutil.h"
33 #include "lib/tty/key.h"
34 #include "lib/widget.h"
35 #ifdef HAVE_CHARSET
36 #include "lib/charsets.h"
37 #endif
38
39 #include "src/history.h"
40
41 #include "internal.h"
42
43
44
45
46
47
48
49 typedef struct mcdiffview_search_options_struct
50 {
51 mc_search_type_t type;
52 gboolean case_sens;
53 gboolean backwards;
54 gboolean whole_words;
55 gboolean all_codepages;
56 } mcdiffview_search_options_t;
57
58
59
60 static mcdiffview_search_options_t mcdiffview_search_options = {
61 .type = MC_SEARCH_T_NORMAL,
62 .case_sens = FALSE,
63 .backwards = FALSE,
64 .whole_words = FALSE,
65 .all_codepages = FALSE,
66 };
67
68
69
70
71
72 static gboolean
73 mcdiffview_dialog_search (WDiff * dview)
74 {
75 char *exp = NULL;
76 int qd_result;
77 size_t num_of_types = 0;
78 gchar **list_of_types;
79
80 list_of_types = mc_search_get_types_strings_array (&num_of_types);
81
82 {
83 quick_widget_t quick_widgets[] = {
84
85 QUICK_LABELED_INPUT (N_("Enter search string:"), input_label_above, INPUT_LAST_TEXT,
86 MC_HISTORY_SHARED_SEARCH, &exp, NULL, FALSE, FALSE, INPUT_COMPLETE_NONE),
87 QUICK_SEPARATOR (TRUE),
88 QUICK_START_COLUMNS,
89 QUICK_RADIO (num_of_types, (const char **) list_of_types,
90 (int *) &mcdiffview_search_options.type, NULL),
91 QUICK_NEXT_COLUMN,
92 QUICK_CHECKBOX (N_("Cas&e sensitive"), &mcdiffview_search_options.case_sens, NULL),
93 QUICK_CHECKBOX (N_("&Backwards"), &mcdiffview_search_options.backwards, NULL),
94 QUICK_CHECKBOX (N_("&Whole words"), &mcdiffview_search_options.whole_words, NULL),
95 #ifdef HAVE_CHARSET
96 QUICK_CHECKBOX (N_("&All charsets"), &mcdiffview_search_options.all_codepages, NULL),
97 #endif
98 QUICK_STOP_COLUMNS,
99 QUICK_BUTTONS_OK_CANCEL,
100 QUICK_END
101
102 };
103
104 WRect r = { -1, -1, 0, 58 };
105
106 quick_dialog_t qdlg = {
107 r, N_("Search"), "[Input Line Keys]",
108 quick_widgets, NULL, NULL
109 };
110
111 qd_result = quick_dialog (&qdlg);
112 }
113
114 g_strfreev (list_of_types);
115
116 if ((qd_result == B_CANCEL) || (exp == NULL) || (exp[0] == '\0'))
117 {
118 g_free (exp);
119 return FALSE;
120 }
121
122 #ifdef HAVE_CHARSET
123 {
124 GString *tmp;
125
126 tmp = str_convert_to_input (exp);
127 g_free (exp);
128 exp = g_string_free (tmp, FALSE);
129 }
130 #endif
131
132 g_free (dview->search.last_string);
133 dview->search.last_string = exp;
134
135 return TRUE;
136 }
137
138
139
140 static gboolean
141 mcdiffview_do_search_backward (WDiff * dview)
142 {
143 ssize_t ind;
144
145 if (dview->search.last_accessed_num_line < 0)
146 {
147 dview->search.last_accessed_num_line = -1;
148 return FALSE;
149 }
150
151 if ((size_t) dview->search.last_accessed_num_line >= dview->a[dview->ord]->len)
152 dview->search.last_accessed_num_line = (ssize_t) dview->a[dview->ord]->len;
153
154 for (ind = --dview->search.last_accessed_num_line; ind >= 0; ind--)
155 {
156 DIFFLN *p;
157
158 p = (DIFFLN *) & g_array_index (dview->a[dview->ord], DIFFLN, (size_t) ind);
159 if (p->u.len == 0)
160 continue;
161
162 if (mc_search_run (dview->search.handle, p->p, 0, p->u.len, NULL))
163 {
164 dview->skip_rows = dview->search.last_found_line =
165 dview->search.last_accessed_num_line = ind;
166 return TRUE;
167 }
168 }
169 return FALSE;
170 }
171
172
173
174
175 static gboolean
176 mcdiffview_do_search_forward (WDiff * dview)
177 {
178 size_t ind;
179
180 if (dview->search.last_accessed_num_line < 0)
181 dview->search.last_accessed_num_line = -1;
182 else if ((size_t) dview->search.last_accessed_num_line >= dview->a[dview->ord]->len)
183 {
184 dview->search.last_accessed_num_line = (ssize_t) dview->a[dview->ord]->len;
185 return FALSE;
186 }
187
188 for (ind = (size_t)++ dview->search.last_accessed_num_line; ind < dview->a[dview->ord]->len;
189 ind++)
190 {
191 DIFFLN *p;
192
193 p = (DIFFLN *) & g_array_index (dview->a[dview->ord], DIFFLN, ind);
194 if (p->u.len == 0)
195 continue;
196
197 if (mc_search_run (dview->search.handle, p->p, 0, p->u.len, NULL))
198 {
199 dview->skip_rows = dview->search.last_found_line =
200 dview->search.last_accessed_num_line = (ssize_t) ind;
201 return TRUE;
202 }
203 }
204 return FALSE;
205 }
206
207
208
209 static void
210 mcdiffview_do_search (WDiff * dview)
211 {
212 gboolean present_result = FALSE;
213
214 tty_enable_interrupt_key ();
215
216 if (mcdiffview_search_options.backwards)
217 {
218 present_result = mcdiffview_do_search_backward (dview);
219 }
220 else
221 {
222 present_result = mcdiffview_do_search_forward (dview);
223 }
224
225 tty_disable_interrupt_key ();
226
227 if (!present_result)
228 {
229 dview->search.last_found_line = -1;
230 query_dialog (_("Search"), _(STR_E_NOTFOUND), D_NORMAL, 1, _("&Dismiss"));
231 }
232 }
233
234
235
236
237
238 void
239 dview_search_cmd (WDiff * dview)
240 {
241 if (dview->dsrc != DATA_SRC_MEM)
242 {
243 error_dialog (_("Search"), _("Search is disabled"));
244 return;
245 }
246
247 if (!mcdiffview_dialog_search (dview))
248 return;
249
250 mc_search_free (dview->search.handle);
251 #ifdef HAVE_CHARSET
252 dview->search.handle = mc_search_new (dview->search.last_string, cp_source);
253 #else
254 dview->search.handle = mc_search_new (dview->search.last_string, NULL);
255 #endif
256
257 if (dview->search.handle == NULL)
258 return;
259
260 dview->search.handle->search_type = mcdiffview_search_options.type;
261 #ifdef HAVE_CHARSET
262 dview->search.handle->is_all_charsets = mcdiffview_search_options.all_codepages;
263 #endif
264 dview->search.handle->is_case_sensitive = mcdiffview_search_options.case_sens;
265 dview->search.handle->whole_words = mcdiffview_search_options.whole_words;
266
267 mcdiffview_do_search (dview);
268 }
269
270
271
272 void
273 dview_continue_search_cmd (WDiff * dview)
274 {
275 if (dview->dsrc != DATA_SRC_MEM)
276 error_dialog (_("Search"), _("Search is disabled"));
277 else if (dview->search.handle == NULL)
278 dview_search_cmd (dview);
279 else
280 mcdiffview_do_search (dview);
281 }
282
283