File: //usr/share/jed/lib/search.sl
%
% forward and backward search functions. These functions can search across
% lines.
%
require ("srchmisc");
define search_across_lines (str, dir)
{
variable n, s, s1, fun, len;
len = strlen (str);
fun = &fsearch;
if (dir < 0) fun = &bsearch;
n = is_substr (str, "\n");
ifnot (n)
{
if (@fun (str)) return len;
return -1;
}
s = substr (str, 1, n);
s1 = substr (str, n + 1, strlen(str));
n = strlen(s);
push_mark ();
while (@fun(s))
{
% we are matched at end of the line.
go_right (n);
if (looking_at(s1))
{
go_left(n);
pop_mark_0 ();
return len;
}
if (dir < 0) go_left (n);
}
pop_mark_1 ();
-1;
}
private define setup_case_search (pat)
{
variable cs = CASE_SEARCH;
if (strlow (pat) != pat)
{
CASE_SEARCH = 1;
}
return cs;
}
define search_generic_search (prompt, dir, line_ok_fun)
{
variable str, not_found = 1;
str = read_mini(prompt, LAST_SEARCH, Null_String);
ifnot (strlen(str)) return;
push_mark ();
variable cs = setup_case_search (str);
ERROR_BLOCK
{
pop_mark (not_found);
CASE_SEARCH = cs;
}
if ((dir > 0) and looking_at(str)) go_right_1 ();
save_search_string (str);
not_found = not (search_maybe_again (&search_across_lines, str, dir,
line_ok_fun));
if (not_found) verror ("%s: not found.", str);
EXECUTE_ERROR_BLOCK;
}
define search_forward ()
{
search_generic_search ("Search forward:", 1, &_function_return_1);
}
define search_backward ()
{
search_generic_search ("Search backward:", -1, &_function_return_1);
}
define replace_do_replace (str, len)
{
replace_chars (len, str); % returns strlen (str)
#iffalse
push_mark ();
go_right(len);
del_region ();
insert (str);
strlen (str);
#endif
}
define search_search_function (pat)
{
variable cs = setup_case_search (pat);
EXIT_BLOCK
{
CASE_SEARCH = cs;
}
variable len = strlen (pat);
if (search_across_lines (pat, 1) > 0) return len;
return -1;
}
define replace_cmd ()
{
variable pat, prompt, rep;
variable has_prefix;
pat = read_mini("Replace:", Null_String, Null_String);
ifnot (strlen (pat)) return;
prompt = strcat (strcat ("Replace '", pat), "' with:");
rep = read_mini(prompt, "", "");
variable cs = setup_case_search (pat);
ERROR_BLOCK
{
CASE_SEARCH = cs;
}
replace_with_query (&search_search_function, pat, rep, 1, &replace_do_replace);
EXECUTE_ERROR_BLOCK;
message ("done.");
}
provide ("search");