home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / AP / JED / JED097-1.TAR / jed / lib / search.sl < prev    next >
Encoding:
Text File  |  1994-12-12  |  2.1 KB  |  111 lines

  1. %
  2. %  forward and backward search functions.  These functions can search across
  3. %  lines.
  4. %
  5.  
  6. !if (is_defined ("replace_with_query")) () = evalfile ("srchmisc");
  7.  
  8. define search_across_lines (str, dir)
  9. {
  10.    variable n, s, s1, fun, len;
  11.  
  12.    len = strlen (str);
  13.    fun = &fsearch;
  14.    if (dir < 0) fun = &bsearch;
  15.  
  16.    n = is_substr (str, "\n");
  17.  
  18.    !if (n)
  19.      {
  20.     if (fun (str)) return len;
  21.     return -1;
  22.      }
  23.    s = substr (str, 1, n);
  24.    s1 = substr (str, n + 1, strlen(str));
  25.    n = strlen(s);
  26.    
  27.    push_mark ();
  28.    
  29.    while (fun(s))
  30.      {
  31.     % we are matched at end of the line.
  32.     go_right (n);
  33.     if (looking_at(s1)) 
  34.       {
  35.          go_left(n);
  36.          pop_mark(0);
  37.          return len;
  38.       }
  39.     if (dir < 0) go_left (n);
  40.      }
  41.    pop_mark(1);
  42.    -1;
  43. }
  44.  
  45.  
  46.  
  47. define search_forward ()
  48. {
  49.    variable str, not_found = 1;
  50.  
  51.    str = read_mini("Search forward:", LAST_SEARCH, Null_String);
  52.    !if (strlen(str)) return;
  53.    
  54.    push_mark ();
  55.    ERROR_BLOCK 
  56.      {
  57.     pop_mark (not_found);
  58.      }
  59.    
  60.    if (looking_at(str)) go_right(1);
  61.    
  62.    save_search_string (str);
  63.    not_found = not (search_maybe_again (&search_across_lines, str, 1));
  64.    
  65.    if (not_found) error ("Not found.");
  66.    EXECUTE_ERROR_BLOCK;
  67. }
  68.  
  69. define search_backward ()
  70. {
  71.    variable str;
  72.    
  73.    str = read_mini("Search backward:", LAST_SEARCH, Null_String);
  74.    !if (strlen(str)) return;
  75.    
  76.    save_search_string (str);
  77.    !if (search_maybe_again (&search_across_lines, str, -1))
  78.       error ("Not found.");
  79. }
  80.  
  81.  
  82. define replace_do_replace (str, len)
  83. {
  84.    push_mark ();
  85.    go_right(len);
  86.    del_region ();
  87.    insert (str);
  88.    strlen (str);
  89. }
  90.  
  91. define search_search_function (pat)
  92. {
  93.    variable len = strlen (pat);
  94.    if (search_across_lines (pat, 1) > 0) return len;
  95.    return -1;
  96. }
  97.  
  98. define replace_cmd ()
  99. {
  100.    variable pat, prompt, rep;
  101.    
  102.    pat = read_mini("Replace:", Null_String, Null_String);
  103.    !if (strlen (pat)) return;
  104.    
  105.    prompt = strcat (strcat ("Replace '", pat), "' with:");
  106.    rep = read_mini(prompt, Null_String, Null_String);
  107.    replace_with_query (&search_search_function, pat, rep, 1, &replace_do_replace);
  108.    message ("done.");   
  109. }
  110.  
  111.