!**************************************** PROCEDURE SUBS_MODULE_IDENT return "SUBS V05.00-000"; ENDPROCEDURE; !**************************************** PROCEDURE SUBS_MODULE_INIT eve$arg1_substitute := "string"; eve$arg2_substitute := "string"; eve$arg3_substitute := "string"; eve$arg4_substitute := "string"; eve$arg5_substitute := "string"; ENDPROCEDURE; !**************************************** PROCEDURE EVE_SUBSTITUTE (SUBSTITUTE_PARAMETER_1, SUBSTITUTE_PARAMETER_2, SUBSTITUTE_PARAMETER_3, SUBSTITUTE_PARAMETER_4, SUBSTITUTE_PARAMETER_5) !--------------------------------------------------------------------------- ! Search and replace procedure. Case-sensitivity of search is same as ! for the FIND command. If case-insensitive, replacements are done to ! match case of current occurrence. ! ! Parameters: ! ! substitute_parameter_1 Old string - input ! substitute_parameter_2 New string - input ! substitute_parameter_3 Range - input ! (default = once only) ! substitute_parameter_4 start substitute column - input ! (default = 1) ! substitute_parameter_5 end substitute column - input ! (default = get_info(current_buffer, record_size)) ! ! The range parameter may be: ! ! "one" - Replace only the next occurrence in the ! current_direction. ! "rest" - Replace all occurrences between the current position and ! the end of buffer in the current direction. Return the ! cursor to its starting postion. ! "before" - Replace all occurrences between the current position and ! the beginning of buffer in the reverse direction. Return the ! cursor to its starting postion. ! "whole" - Replace occurrences and return cursor its current position. ! "select" - Replace all occurrences in the current select range and ! return the cursor to its current position. !--------------------------------------------------------------------------- local this_buffer, ! Current buffer this_position, start_marker, end_marker, range_parameter, selected_range, direction, once_only, null_parameters, start_column, end_column, this_mode, ! Keyword for current mode lowercase_target, ! Lowercase version of target string lowercase_replacement, ! Lowercase version of replacement string uppercase_target, ! Uppercase version of target string uppercase_replacement, ! Uppercase version of replacement string capital_target, ! Capitalized version of target string capital_replacement, ! Capitalized version of replacement string how_exact, ! Keyword to indicate case-sensitivity replace_range, ! Range of current occurrence range_length, ! Length of replace_action this_occurrence, ! String of replace_range occurrences; ! Number of replacements made so far this_position := mark (none); this_buffer := current_buffer; this_mode := get_info (current_buffer, "mode"); set (insert, this_buffer); eve$x_edt_subs_target := ""; if substitute_parameter_1 = "" then null_parameters := 1; else eve$x_edt_subs_temp := substitute_parameter_1; null_parameters := 0; endif; if not (eve$prompt_string (eve$x_edt_subs_temp, eve$x_edt_subs_target, "Old string: ", "No string to replace")) then return; endif; if null_parameters then ! empty string is ok here eve$x_edt_subs_replacement := read_line ("New string: "); else eve$x_edt_subs_replacement := substitute_parameter_2; endif; range_parameter := substitute_parameter_3; if get_info (range_parameter, "type") = string then change_case (range_parameter, lower); endif; once_only := 0; if range_parameter = "" then range_length := 0; else range_length := length (range_parameter); endif; if (range_length = 0) or (range_parameter = substr ("o", 1, 1)) then ! (range_parameter = substr ("one", 1, range_length)) then once_only := 1; start_marker := mark (none); end_marker := end_of (current_buffer); direction := current_direction; else ! if range_parameter = substr ("w", 1, 1) then if range_parameter = substr ("all", 1, range_length) then start_marker := beginning_of (current_buffer); end_marker := end_of (current_buffer); direction := forward; else ! if range_parameter = substr ("r", 1, 1) then if range_parameter = substr ("rest", 1, range_length) then start_marker := mark (none); end_marker := end_of (current_buffer); direction := current_direction; else ! if range_parameter = substr ("b", 1, 1) then if range_parameter = substr ("before", 1, range_length) then start_marker := mark (none); end_marker := beginning_of (current_buffer); direction := reverse; else ! if range_parameter = substr ("s", 1, 1) then if range_parameter = substr ("select", 1, range_length) then if eve$x_select_position <> 0 then if get_info (eve$x_select_position, "buffer") <> current_buffer then message ("Substitute must be used in the same buffer as Select."); else selected_range := select_range; eve$x_select_position := 0; start_marker := beginning_of (selected_range); end_marker := end_of (selected_range); direction := forward; endif; else message ("Use Select before using Substitute."); return; endif; else message ("Invalid range specification, "+range_parameter); return; endif; endif; endif; endif; endif; start_column := substitute_parameter_4; if get_info(start_column, "type") = string then if start_column = "" then start_column := 0; else translate (start_column, "1", "l"); start_column := int(start_column) - 1; endif; endif; end_column := substitute_parameter_5; if get_info(end_column, "type") = string then if end_column = "" then end_column := get_info (current_buffer, "record_size") - 1; else translate (end_column, "1", "l"); end_column := int(end_column) - 1; endif; endif; lowercase_target := eve$x_edt_subs_target; if get_info (lowercase_target, "type") = string then change_case (lowercase_target, lower); endif; lowercase_replacement := eve$x_edt_subs_replacement; change_case (lowercase_replacement, lower); if (lowercase_target = eve$x_edt_subs_target) and (lowercase_replacement = eve$x_edt_subs_replacement) then how_exact := no_exact; uppercase_target := eve$x_edt_subs_target; if get_info (uppercase_target, "type") = string then change_case (uppercase_target, upper); endif; capital_target := eve$x_edt_subs_target; if get_info (capital_target, "type") = string then eve$capitalize_string (capital_target); endif; uppercase_replacement := eve$x_edt_subs_replacement; change_case (uppercase_replacement, upper); capital_replacement := eve$x_edt_subs_replacement; eve$capitalize_string (capital_replacement); else how_exact := exact; endif; set (screen_update, off); position (start_marker); loop replace_range := search (eve$x_edt_subs_target, direction, how_exact); exitif replace_range = 0; position (replace_range); if (start_column <= current_offset) and (current_offset <= end_column) then exitif mark (none) >= end_marker; this_occurrence := erase_character (length (replace_range)); if how_exact = exact then copy_text (eve$x_edt_subs_replacement); else ! Make sure non-alphabetic target is replaced by lowercas if this_occurrence = lowercase_target then copy_text (lowercase_replacement); else if this_occurrence = uppercase_target then copy_text (uppercase_replacement); else if this_occurrence = capital_target then copy_text (capital_replacement); else copy_text (lowercase_replacement); endif; endif; endif; endif; if direction = reverse then move_horizontal (- (length (eve$x_edt_subs_replacement)+1)); endif; occurrences := occurrences + 1; exitif once_only; else if direction = reverse then move_horizontal (-1); else move_horizontal (+1); endif; endif; endloop; if not once_only then position (this_position); endif; set (screen_update, on); message (fao ("Replaced !SL occurrence!%S", occurrences)); set (this_mode, this_buffer); ENDPROCEDURE;