! ! PROCEDURE REPLACEMENTS_MODULE_IDENT ! PROCEDURE REPLACEMENTS_MODULE_INIT ! PROCEDURE EVE$EDT_DELETE_CHAR ! PROCEDURE EVE$INIT_DO_KEY ! PROCEDURE EVE$POSITION_IN_MIDDLE (NEW_POSITION) ! PROCEDURE EVE$WPS_PARAGRAPH ! PROCEDURE EVE$WPS_SENTENCE ! PROCEDURE EVE$$GET_FIND_TARGET (TARGET, HOW_EXACT, REPLACING; OLD_FIND) ! PROCEDURE EVE$$REMEMBER ! PROCEDURE EVE_BUFFER (BUFFER_PARAMETER) ! PROCEDURE EVE_ERASE_CHARACTER ! PROCEDURE EVE_DCL (DCL_PARAMETER) ! PROCEDURE EVE_FILL_PARAGRAPH (MY_INDENT_VALUE) ! PROCEDURE EVE_FILL_RANGE (MY_INDENT_VALUE) ! PROCEDURE EVE_FILL ! PROCEDURE EVE_FIND (TARGET) ! PROCEDURE EVE_GET_FILE (GET_FILE_PARAMETER) ! PROCEDURE EVE_INCLUDE_FILE (INCLUDE_FILE_PARAMETER) ! PROCEDURE EVE_LINE (LINE_PARAMETER, PROCEDURE_PARAMETER) ! PROCEDURE EVE_MOVE_BY_PAGE ! PROCEDURE EVE_ONE_WINDOW ! PROCEDURE EVE_TWO_WINDOWS ! !**************************************** PROCEDURE REPLACEMENTS_MODULE_IDENT return "REPLACEMENTS V05.00-000"; ENDPROCEDURE; !**************************************** PROCEDURE REPLACEMENTS_MODULE_INIT eve$arg1_fill_paragraph := "integer"; eve$arg1_fill_range := "integer"; ENDPROCEDURE; !**************************************** PROCEDURE EVE$EDT_DELETE_CHAR !+ ! EDT -- Delete character !- local delete_eol, char_range, saved_mark; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); ! restore free cursor position eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; saved_mark := mark (FREE_CURSOR); if eve$edt_eol_nopad_delete then return (1); endif; position (search (ANCHOR, FORWARD)); ! snap to text if mark (NONE) = end_of (current_buffer) then move_vertical (1); ! force an error message endif; if current_character = "" then if eve$in_prompting_window then eve$x_restore_char := 0; return (1); else delete_eol := TRUE; endif; else delete_eol := FALSE; endif; char_range := create_range (mark (NONE), mark (NONE), NONE); eve$x_erased_char_forward := TRUE; eve$x_restore_char := erase_character(1); if length (eve$x_restore_char) = 0 then position (saved_mark); endif; return (1); ENDPROCEDURE; !**************************************** PROCEDURE EVE$INIT_DO_KEY ! Make sure there is a DO key either on DO or PF4 on_error [OTHERWISE]: endon_error; if eve$on_a_pre_lk201 then !*** AND current keypad = VT100 ?? if lookup_key (PF4, PROGRAM, eve$x_user_keys) <> 0 then if not eve$test_synonym ("do", eve$$lookup_comment (PF4, eve$x_user_keys)) then message ("WARNING - No DO key has been defined", 0); ! 890405 ! if eve$insist_y_n (message_text (EVE$_ASKPF4, 1)) then ! 890405 ! define_key (eve$$kt_return + "eve_do ('')", PF4, " do", ! 890405 ! eve$x_user_keys); ! 890405 ! endif; ! 890405 endif; endif; endif; ENDPROCEDURE; !**************************************** PROCEDURE EVE$POSITION_IN_MIDDLE (NEW_POSITION) ! Move to a new position in the current window, honoring existing scroll ! regions; if no scroll regions exist, then position to no more than ! 4 rows from top of the window by temporarily resetting the scrolling region ! proportional to the window height. ! ! Parameters: ! new_position mark to position to - input local scroll_offset, ! New value for scroll_top and scroll_bottom saved_scrolls, ! Boolean set if saved_scroll_xxx are valid saved_scroll_top, ! Original value of scroll_top saved_scroll_bottom, ! Original value of scroll_bottom saved_scroll_amount, ! Original value of scroll_amount saved_window, ! Current window saved_mark; ! Current position on_error [TPU$_CONTROLC]: if saved_scrolls then set (SCROLLING, saved_window, ON, saved_scroll_top, saved_scroll_bottom, saved_scroll_amount); eve$$restore_position (new_position); update (saved_window); else eve$$restore_position (saved_mark); endif; eve$learn_abort; abort; [OTHERWISE]: if saved_scrolls then set (SCROLLING, saved_window, ON, saved_scroll_top, saved_scroll_bottom, saved_scroll_amount); eve$$restore_position (new_position); update (saved_window); else eve$$restore_position (saved_mark); endif; endon_error; saved_window := current_window; saved_mark := mark (FREE_CURSOR); scroll_offset := (get_info (saved_window, "visible_length") / 2); if scroll_offset < 0 then scroll_offset := 0; else if scroll_offset > eve$x_max_scroll_offset then scroll_offset := eve$x_max_scroll_offset; endif; endif; saved_scroll_top := get_info (saved_window, "scroll_top"); saved_scroll_bottom := get_info (saved_window, "scroll_bottom"); saved_scroll_amount := get_info (saved_window, "scroll_amount"); if (saved_scroll_top = 0) and (saved_scroll_bottom = 0) and (saved_scroll_amount = 0) then ! No scroll regions set, force one <= 4 lines saved_scrolls := TRUE; set (SCROLLING, saved_window, ON, scroll_offset, scroll_offset, 0); position (new_position); update (saved_window); set (SCROLLING, saved_window, ON, saved_scroll_top, saved_scroll_bottom, saved_scroll_amount); else ! Use current scroll regions position (new_position); update (saved_window); endif; ENDPROCEDURE; !**************************************** PROCEDURE EVE$WPS_SENTENCE local the_target, the_find, saved_mark; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; saved_mark := mark (FREE_CURSOR); the_find := search_quietly (eve$x_wps_pattern_sentence, current_direction); if (the_find <> 0) then position (the_find); if (current_direction = REVERSE) then ! We're on the end of the previous sentence, now move to the ! beginning of it (go backwards to end of previous sentence, and ! then forward to the beginning of this one). if (mark (NONE) <> beginning_of (current_buffer)) then move_horizontal (-1); the_target := search_quietly (eve$x_wps_pattern_sentence, REVERSE); if (the_target <> 0) then position (the_target); else position (beginning_of (current_buffer)); endif; endif; endif; ! We've found end of sentence, now move to start of the next sentence. the_find := search_quietly (eve$x_wps_pattern_symbols, FORWARD); if (the_find <> 0) then position (the_find); else position (end_of (current_buffer)); endif; !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF eve$$case_change (saved_mark); !Change case if we really moved eve$position_in_middle (mark (free_cursor)); return (1); else if (current_direction = REVERSE) then position (beginning_of (current_buffer)); else if (current_direction = FORWARD) then position (end_of (current_buffer)); endif; endif; eve$message (EVE$_EOSNOTFOUND); eve$learn_abort; return (0); endif; eve$position_in_middle (mark (free_cursor)); ENDPROCEDURE; !**************************************** PROCEDURE EVE$WPS_PARAGRAPH local saved_mark; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; ! An EVE paragraph_break is the blank line above the 1st line of text in the ! paragraph. saved_mark := mark (FREE_CURSOR); if (current_direction = FORWARD) then if saved_mark = end_of (current_buffer) then message ("You are at the end of the buffer -- operation cancelled"); endif; else if (current_direction = REVERSE) then if saved_mark = beginning_of (current_buffer) then message ("You are at the beginning of the buffer -- operation cancelled"); endif; endif; endif; position (LINE_BEGIN); if (current_direction = FORWARD) then if mark (NONE) = end_of (current_buffer) then return (1); endif; loop exitif (mark (NONE) = end_of (current_buffer)); position (LINE_END); move_horizontal (1); exitif eve$paragraph_break; endloop; loop exitif (mark (NONE) = end_of (current_buffer)); position (LINE_END); move_horizontal (1); exitif not eve$paragraph_break; endloop; else if mark (NONE) = beginning_of (current_buffer) then return (1); else if eve$paragraph_break then loop ! move up to non-break (skipping over all breaks) exitif (mark (NONE) = beginning_of (current_buffer)); move_vertical (-1); position (LINE_BEGIN); exitif not eve$paragraph_break; endloop; else move_vertical (-1); position (LINE_BEGIN); if eve$paragraph_break then ! we were on 1st line of text in para loop ! move up to non - break (skipping over all breaks) exitif (mark (NONE) = beginning_of (current_buffer)); move_vertical (-1); position (LINE_BEGIN); exitif not eve$paragraph_break; endloop; endif; endif; loop ! move up to start of paragraph we're in exitif (mark (NONE) = beginning_of (current_buffer)); move_vertical (-1); position (LINE_BEGIN); exitif eve$paragraph_break; endloop; if mark (NONE) <> beginning_of (current_buffer) then position (LINE_END); move_horizontal (1); ! now move down to start of text in this para endif; endif; endif; !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF eve$$case_change (saved_mark); eve$position_in_middle (mark (free_cursor)); return (1); ENDPROCEDURE; !**************************************** PROCEDURE EVE$$GET_FIND_TARGET (TARGET, HOW_EXACT, REPLACING; OLD_FIND) ! Set up for a find. Search is case-sensitive unless (1) sensitivity has been ! set to noexact in the global preferences dialog box, and (2) the target is all ! lowercase: in this case the search is case-insensitive. ! If , use the direction in eve$x_old_find_direction; ! otherwise, use the buffer's current direction (OR the direction specified ! by a direction-changing terminator that terminates the find prompt). ! Parameters: ! target String to find - input + output ! how_exact eve$x_find_exact or eve$x_find_no_exact - output ! replacing 1 = called by eve_replace: allow a ! match at current cursor position and ! return if no string found ! 2 = called by wildcard_find ! 0 = called by a find procedure - input ! old_find 1 = called by eve$find - optional input local new_target, ! Local copy of target lowercase_target, ! Lowercase version of eve$x_target patt_return_value, ! Value returned by eve$$build_pattern start_find_key, ! String describing key used to invoke find stop_find_key, ! String describing key used after prompt leading_whitespace, ! Boolean for including leading whitespace status, ! Status from set (widget) result, ! Result returned from eve$$test_find_terminator the_prompt, ! Prompt string key_is_defined, ! Boolean for key press = "FIND xxx" saved_direction; ! Direction upon entry on_error [TPU$_CONTROLC]: if (saved_direction <> current_direction) and (get_info (saved_direction, "type") = KEYWORD) then set (saved_direction, current_buffer); endif; eve$learn_abort; abort; [OTHERWISE]: if (saved_direction <> current_direction) and (get_info (saved_direction, "type") = KEYWORD) then set (saved_direction, current_buffer); endif; endon_error; saved_direction := current_direction; start_find_key := last_key; if start_find_key <> 0 then if eve$test_synonym ("return", eve$$lookup_comment (start_find_key, "")) then start_find_key := DO; endif; endif; if replacing = 1 then eve$$remove_found_range; endif; eve$clear_message; if target <> "" then new_target := target; if start_find_key <> 0 then eve$$test_find_terminator (last_key); ! possibly change direction endif; else loop if current_direction = FORWARD then if replacing <> 2 then ! <> wildcard find if current_direction = eve$x_old_find_direction then the_prompt := message_text (EVE$_FINDPROMPT, 1); else if (eve$$x_state_array {eve$$k_command_line_flag} = eve$k_invoked_by_menu) and (eve$$x_state_array {eve$$k_dialog_box}) then the_prompt := message_text (EVE$_FINDPROMPT, 1); else the_prompt := message_text (EVE$_FINDPROMPT2, 1); endif; endif; else if current_direction = eve$x_old_find_direction then the_prompt := message_text (EVE$_WILDFINDPROMPT, 1); else if (eve$$x_state_array {eve$$k_command_line_flag} = eve$k_invoked_by_menu) and (eve$$x_state_array {eve$$k_dialog_box}) then the_prompt := message_text (EVE$_WILDFINDPROMPT, 1); else the_prompt := message_text (EVE$_WILDFINDPROMPT2, 1); endif; endif; endif; else if replacing <> 2 then ! <> wildcard find if current_direction = eve$x_old_find_direction then the_prompt := message_text (EVE$_REVPROMPT, 1); else if (eve$$x_state_array {eve$$k_command_line_flag} = eve$k_invoked_by_menu) and (eve$$x_state_array {eve$$k_dialog_box}) then the_prompt := message_text (EVE$_REVPROMPT, 1); else the_prompt := message_text (EVE$_REVPROMPT2, 1); endif; endif; else if current_direction = eve$x_old_find_direction then the_prompt := message_text (EVE$_WILDREVPROMPT, 1); else if (eve$$x_state_array {eve$$k_command_line_flag} = eve$k_invoked_by_menu) and (eve$$x_state_array {eve$$k_dialog_box}) then the_prompt := message_text (EVE$_WILDREVPROMPT, 1); else the_prompt := message_text (EVE$_WILDREVPROMPT2, 1); endif; endif; endif; endif; if (eve$$x_state_array {eve$$k_command_line_flag} = eve$k_invoked_by_menu) and (eve$$x_state_array {eve$$k_dialog_box}) then ! supersede the program bound to the find_ok button ! (can't call eve$$get_find_target because data is expected from widget) !%IF eve$x_option_decwindows !%THEN if eve$x_decwindows_active then if replacing = 2 then ! = wildcard find if get_info (eve$x_wildcard_find_dialog, "type") <> WIDGET then eve$x_wildcard_find_dialog := create_widget ("WILDCARD_FIND_DIALOG", eve$x_widget_hierarchy, SCREEN, eve$kt_callback_routine); endif; if old_find = tpu$k_unspecified then eve$$set_responder (eve$$k_wildcard_find_ok, fao ("eve$$widget_find_ok (!UL)", replacing)); else eve$$set_responder (eve$$k_wildcard_find_ok, fao ("eve$$widget_find_ok (!UL, !UL)", replacing, old_find)); endif; status := set (WIDGET, get_info (WIDGET, "widget_id", eve$x_wildcard_find_dialog, "WILDCARD_FIND_DIALOG.WILDCARD_FIND_LABEL"), eve$dwt$c_nlabel, the_prompt); status := set (WIDGET, get_info (WIDGET, "widget_id", eve$x_wildcard_find_dialog, "WILDCARD_FIND_DIALOG.WILDCARD_FIND_LABEL1"), eve$dwt$c_nlabel, message_text (EVE$_CURRENTWILD, 1, eve$$x_wild_patterns)); if get_info (eve$x_target, "type") = STRING then status := set (TEXT, get_info (WIDGET, "widget_id", eve$x_wildcard_find_dialog, "WILDCARD_FIND_DIALOG.WILDCARD_FIND_TEXT"), eve$x_target); else status := set (TEXT, get_info (WIDGET, "widget_id", eve$x_wildcard_find_dialog, "WILDCARD_FIND_DIALOG.WILDCARD_FIND_TEXT"), eve$x_printable_target); endif; eve$manage_widget (eve$x_wildcard_find_dialog); else if get_info (eve$x_find_dialog, "type") <> WIDGET then eve$x_find_dialog := create_widget ("FIND_DIALOG", eve$x_widget_hierarchy, SCREEN, eve$kt_callback_routine); endif; if old_find = tpu$k_unspecified then eve$$set_responder (eve$$k_find_ok, fao ("eve$$widget_find_ok (!UL)", replacing)); else eve$$set_responder (eve$$k_find_ok, fao ("eve$$widget_find_ok (!UL, !UL)", replacing, old_find)); endif; status := set (WIDGET, get_info (WIDGET, "widget_id", eve$x_find_dialog, "FIND_DIALOG.FIND_LABEL"), eve$dwt$c_nlabel, the_prompt); if get_info (eve$x_target, "type") = STRING then status := set (TEXT, get_info (WIDGET, "widget_id", eve$x_find_dialog, "FIND_DIALOG.FIND_TEXT"), eve$x_target); else status := set (TEXT, get_info (WIDGET, "widget_id", eve$x_find_dialog, "FIND_DIALOG.FIND_TEXT"), eve$x_printable_target); endif; eve$manage_widget (eve$x_find_dialog); endif; endif; !%ENDIF return (eve$k_async_prompting); else new_target := eve$prompt_line (the_prompt, eve$$x_find_terminators); if new_target = 0 then return (FALSE); endif; ! Test the terminator, and change direction if it's ! a direction-setting terminator. if start_find_key <> 0 then result := eve$$test_find_terminator (last_key); else result := 0; endif; ! stay in loop if just a direction-setting key were pressed exitif not ((new_target = "") and (result)); endif; endloop; endif; if start_find_key <> 0 then stop_find_key := last_key; endif; if new_target = "" then ! allow both and ! (as well as wildcard versions) if start_find_key <> 0 then if (start_find_key = stop_find_key) or (eve$test_synonym ("find", eve$$lookup_comment (stop_find_key, ""))) then if eve$x_target = "" then eve$message (EVE$_NOPREVTARG); return (0); else ! use the direction for the prior set (eve$x_old_find_direction, current_buffer); if get_info (eve$x_target, "type") = STRING then eve$message (EVE$_FINDPREV, 0, eve$x_target); else eve$message (EVE$_FINDPREVWILD, 0, eve$x_printable_target); endif; endif; else eve$message (EVE$_NOFIND); return (0); ! let caller set direction back if needed endif; else eve$message (EVE$_NOFIND); return (0); ! let caller set direction back if needed endif; else ! restore eve$$k_find_ok widget to invalid_event program !%IF eve$x_option_decwindows !%THEN if eve$x_decwindows_active then if replacing = 2 then ! = wildcard find eve$$set_responder (eve$$k_wildcard_find_ok, "eve$invalid_event(" + str (eve$$k_wildcard_find_ok) + ")"); else eve$$set_responder (eve$$k_find_ok, "eve$invalid_event(" + str (eve$$k_find_ok) + ")"); endif; endif; !%ENDIF ! insure a key = "FIND xxx" will always do a find next if start_find_key <> 0 then if (eve$$x_state_array {eve$$k_command_line_flag} = eve$k_invoked_by_key) and (start_find_key = stop_find_key) and (target <> "") then if (((get_info (eve$x_target, "type") = STRING) and (eve$x_target = target)) or ((get_info (eve$x_target, "type") = PATTERN) and (eve$x_printable_target = target))) then set (eve$x_old_find_direction, current_buffer); key_is_defined := TRUE; endif; endif; endif; if not key_is_defined then if replacing = 2 then patt_return_value := eve$$build_pattern (new_target, eve$x_target_pattern, leading_whitespace); if get_info (patt_return_value, "type") = KEYWORD then ! (keyword means an error occurred) return (0); ! let caller set direction back if needed else if patt_return_value then ! eve$x_target_pattern is pattern string, e.g., ! "\" = bol + abcd + eol eve$x_target := execute ("return(" + eve$x_target_pattern + ")"); else ! eve$x_target_pattern is a search string eve$x_target := eve$x_target_pattern; endif; endif; else if get_info (new_target, "type") = STRING then if eve$$x_state_array {eve$$k_find_whitespace} then if eve$$build_space_pattern (new_target, eve$x_target_pattern, leading_whitespace) then ! spaces in new_target eve$x_target := execute ("return(" + eve$x_target_pattern + ")"); else ! no spaced in new_target eve$x_target := eve$x_target_pattern; endif; else eve$x_target := new_target; endif; else eve$x_target := execute ("return(" + eve$x_target_pattern + ")"); endif; endif; if get_info (new_target, 'type') = STRING then eve$x_printable_target := new_target; endif; eve$$x_state_array {eve$$k_leading_whitespace} := leading_whitespace; endif; endif; if get_info (eve$x_target, "type") = STRING then lowercase_target := eve$x_target; change_case (lowercase_target, LOWER); how_exact := eve$x_find_exact; if not eve$$x_state_array {eve$$k_find_case_exact} then if lowercase_target = eve$x_target then how_exact := eve$x_find_no_exact; endif; endif; else lowercase_target := eve$x_target_pattern; change_case (lowercase_target, LOWER); how_exact := eve$x_find_exact; if not eve$$x_state_array {eve$$k_find_case_exact} then if lowercase_target = eve$x_target_pattern then how_exact := eve$x_find_no_exact; endif; endif; endif; if pce$case_sensitive <> "" then if pce$case_sensitive then how_exact := eve$x_find_exact; else if pce$case_sensitive = false then how_exact := eve$x_find_no_exact; endif; endif; endif; return (TRUE); ! let caller set direction back if needed ENDPROCEDURE; !**************************************** PROCEDURE EVE$$REMEMBER (DISPLAY_ERRORS) ! Guts of REMEMBER ! ! modified 890210 - RHS - to 'remember' in both EVE and EDT mode (V5.0) ! modified 890503 - RHS - to 'remember' in both EVE and EDT mode (V5.1) ! local learn_sequence, ! Learn sequence returned by end_learn builtin learn_key, ! Keyword for key to bind sequence to remember_key, ! Keyword for last key pressed before this proc mouse_number, ! Number of mouse clicked define_error; ! Integer - true if recursive key definition on_error [TPU$_NOTLEARNING]: if display_errors then eve$message (EVE$_NOREMEM); eve$learn_abort; endif; return (FALSE); [TPU$_RECURLEARN]: eve$message (EVE$_NORECURS); define_error := 1; [OTHERWISE]: endon_error; remember_key := last_key; ! Insure REMEMBER isn't entered from the command line - that doesn't work. if eve$$x_state_array {eve$$k_command_line_flag} then if eve$test_synonym ("remember", eve$$lookup_comment (CTRL_R_KEY, eve$x_key_map_list)) then eve$message (EVE$_REMEMBERCTRLR); else eve$message (EVE$_REMEMBERKEY); endif; eve$learn_abort; return (FALSE); endif; learn_sequence := learn_end; eve$set_message (""); ! restore the null message as the default loop learn_key := eve$prompt_key (message_text (EVE$_KEYTOLEARN, 1), 1); ! 1 = allow mouse keys in user windows if learn_key = 0 then eve$learn_abort; return (FALSE); endif; ! Return gets you out without redefining a key if learn_key = RET_KEY then eve$message (EVE$_SEQNOTREM); eve$learn_abort; return (FALSE); endif; if get_info (learn_key, "type") = ARRAY then if learn_key {TYPE} = eve$k_user_window then learn_key := learn_key {KEYWORD}; mouse_number := eve$$mouse_button_number (learn_key); if mouse_number = 1 then ! reject all M1 keys !%IF eve$x_at_least_tpu_2_2 !%THEN eve$message (EVE$_NOLEARNM1); !%ELSE !% eve$message ("You cannot define an M1 key for a learn sequence." !% , 0); !%ENDIF; else !%IF eve$x_option_decwindows !%THEN if eve$is_mouse_down(learn_key) or eve$is_mouse_up (learn_key) then ! Convert DOWN's or UP's into CLICK's case mouse_number [2]: learn_key := M2CLICK; [3]: learn_key := M3CLICK; [4]: learn_key := M4CLICK; [5]: learn_key := M5CLICK; endcase; endif; !%ENDIF define_key (learn_sequence, learn_key, eve$x_sequence, eve$x_user_keys); define_key (learn_sequence, learn_key, eve$x_sequence, eve$x_edt_keys); if define_error then ! recursive learn caught by on_error define_error := 0; else exitif; endif; endif; else !%IF eve$x_at_least_tpu_2_2 !%THEN eve$message (EVE$_MOUSEOUTWINDOW); !%ELSE !% eve$message ("You cannot define a mouse key outside a user window.", !% 0); !%ENDIF; endif; else if eve$test_synonym ("do", eve$$lookup_comment (learn_key, "")) then ! reject if last available VALID DO key if not eve$$redefine_do_key (learn_key, learn_sequence, 1) then eve$message (EVE$_NOLRNDO); else exitif; endif; else ! Reject user binding sequence to key that invoked this procedure. if remember_key = learn_key then eve$message (EVE$_NOLRNREMEMBER); else if eve$alphabetic (learn_key) = "" then define_key (learn_sequence, learn_key, eve$x_sequence, eve$x_user_keys); define_key (learn_sequence, learn_key, eve$x_sequence, eve$x_edt_keys); if define_error then ! recursive learn caught by on_error define_error := 0; else exitif; endif; else eve$message (EVE$_NOLRNTYP); endif; endif; endif; ! end of if endif; endloop; eve$message (EVE$_SEQREMMED); return (TRUE); ENDPROCEDURE; !**************************************** PROCEDURE EVE_BUFFER (BUFFER_PARAMETER) ! Go to a (create a new) buffer ! Map a buffer to the current window. If the buffer doesn't already ! exist, create a new buffer. ! Parameters: ! buffer_parameter String containing buffer name - input local buffer_name, ! Local copy of buffer_parameter saved_buffer, ! Current buffer saved_mark, ! Current cursor position saved_window, ! Current window loop_buffer, ! Current buffer being checked in loop loop_buffer_name, ! String containing name of loop_buffer found_a_buffer, ! True if buffer found with same exact name possible_buffer_name, ! Most recent string entered in choice buffer possible_buffer, ! Buffer whose name is possible_buffer_name how_many_buffers, ! Number of buffers listed in choice buffer new_buffer; ! New buffer created when there is no match on_error [TPU$_CONTROLC]: eve$$restore_position (saved_window, saved_mark); eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_window, saved_mark); endon_error; if eve$check_bad_window then eve$message (EVE$_CURSINTEXT); eve$learn_abort; return (FALSE); endif; if not (eve$prompt_string (buffer_parameter, buffer_name, message_text (EVE$_BUFNAM, 1), message_text (EVE$_BUFNOTSWITCH, 0))) then eve$learn_abort; return (FALSE); endif; eve$cleanse_string (buffer_name); ! See if we already have a buffer by that name saved_mark := mark (FREE_CURSOR); saved_window := current_window; saved_buffer := current_buffer; loop_buffer := get_info (BUFFERS, "first"); change_case (buffer_name, UPPER); ! buffer names are uppercase erase (eve$choice_buffer); loop exitif loop_buffer = 0; loop_buffer_name := get_info (loop_buffer, "name"); if buffer_name = loop_buffer_name then found_a_buffer := 1; how_many_buffers := 1; exitif 1; else if buffer_name = substr (loop_buffer_name, 1, length (buffer_name)) then eve$add_choice (loop_buffer_name); possible_buffer := loop_buffer; possible_buffer_name := loop_buffer_name; how_many_buffers := how_many_buffers + 1; endif; endif; loop_buffer := get_info (BUFFERS, "next"); endloop; change_case (buffer_name, LOWER); ! for messages if found_a_buffer then if loop_buffer = saved_buffer then eve$message (EVE$_INBUFF, 0, loop_buffer_name); eve$learn_abort; return (FALSE); else map (current_window, loop_buffer); endif; else if get_info (eve$choice_buffer, "record_count") > 0 then if how_many_buffers = 1 then if possible_buffer = saved_buffer then eve$message (EVE$_INBUFF, 0, possible_buffer_name); eve$learn_abort; return (FALSE); else map (current_window, possible_buffer); endif; else change_case (buffer_name, LOWER); eve$display_choices (message_text (EVE$_AMBBUF, 0, buffer_name), !** How do we get the synonym for the key that was defined to this command? "buffer ", buffer_name); eve$learn_abort; return (FALSE); endif; else if not eve$create_new_buffer (buffer_name) then return (FALSE); endif; endif; endif; eve$set_status_line (current_window); !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF eve$position_in_middle (mark (free_cursor)); return (TRUE); ENDPROCEDURE; !*************************************** PROCEDURE EVE_DCL (DCL_PARAMETER) ! Run a DCL command and put the output in a second window on the screen. ! This is the only command to automatically create a second window if ! needed, but the user is left in the current buffer at the end of the ! command (reduce trap-door risk). Returns true if successful, false ! if no dcl command was issued. ! ! Parameters: ! ! dcl_parameter String containing DCL command - input local dcl_string, ! Local copy of dcl_parameter dcl_window, ! Window to map dcl_buffer this_window, ! Current window this_buffer, ! Current buffer map_status; on_error [TPU$_CREATEFAIL]: !%IF eve$x_option_decwindows !%THEN if eve$x_decwindows_active then eve$popup_message (message_text (EVE$_CANTCREADCL, 1)); else eve$message (EVE$_CANTCREADCL); endif; !%ELSE !% eve$message (EVE$_CANTCREADCL); !%ENDIF eve$learn_abort; return (FALSE); [OTHERWISE]: endon_error; if not (eve$prompt_string (dcl_parameter, dcl_string, message_text (EVE$_DCLPROMT, 1), message_text (EVE$_NODCLCMD, 0))) then eve$learn_abort; return (FALSE); endif; if (get_info (eve$dcl_buffer, "type") <> BUFFER) then eve$dcl_buffer := eve$init_buffer ("DCL", ""); endif; if (get_info (eve$x_dcl_process, "type") = UNSPECIFIED) or (eve$x_dcl_process = 0) then eve$message (EVE$_CREATEDCL); eve$x_dcl_process := create_process (eve$dcl_buffer, "$ set noon"); endif; ! following code added to account for mapping feature -- 890530 - RHS map_status := eag$x_map_on; if eag$x_map_on then eve_set_nomapping; endif; ! above code added to account for mapping feature -- 890530 - RHS this_buffer := current_buffer; if this_buffer = eve$dcl_buffer then dcl_window := current_window; else if eve$x_number_of_windows = 1 then eve_split_window (2); this_window := eve$top_window; update (eve$top_window); dcl_window := current_window; map (dcl_window, eve$dcl_buffer); else this_window := current_window; dcl_window := eve$get_mapped_window (eve$dcl_buffer); if dcl_window = 0 then ! insure the dcl_window is opposite the current_window dcl_window := eve$bottom_window; if dcl_window = this_window then dcl_window := eve$top_window; endif; endif; map (dcl_window, eve$dcl_buffer); endif; endif; set (STATUS_LINE, dcl_window, REVERSE, message_text (EVE$_DCLSTATUS, 1)); position (end_of (eve$dcl_buffer)); ! Process the DCL string - need to include the $ split_line; copy_text (dcl_string); update (current_window); send (dcl_string, eve$x_dcl_process); position (end_of (eve$dcl_buffer)); update (current_window); if this_buffer <> eve$dcl_buffer then position (this_window); endif; ! following code added to account for mapping feature -- 890530 - RHS if map_status then eve_one_window; eve_set_mapping; message ("Output (if any) from DCL cmd is in DCL buffer"); endif; ! above code added to account for mapping feature -- 890530 - RHS !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF return (TRUE); ENDPROCEDURE; !*************************************** PROCEDURE EVE_ERASE_CHARACTER ! Delete current character local char_range, delete_eol, saved_mark, start_mark; on_error [TPU$_CONTROLC]: eve$$restore_position (saved_mark); ! restore free cursor position eve$learn_abort; abort; [OTHERWISE]: eve$$restore_position (saved_mark); endon_error; saved_mark := mark (FREE_CURSOR); position (search (ANCHOR, FORWARD)); ! snap to text if mark (NONE) = end_of (current_buffer) then move_vertical (1); ! force error msg and return endif; if current_character = "" then if eve$in_prompting_window then eve$x_restore_char := 0; eve$learn_abort; return (FALSE); else delete_eol := TRUE; endif; else delete_eol := FALSE; endif; if (get_info (current_buffer, "mode") = OVERSTRIKE) then ! if not delete_eol then ! eve$insert_text (" "); ! endif; set (INSERT, current_buffer); char_range := create_range (mark (NONE), mark (NONE), NONE); eve$x_erased_char_forward := FALSE; eve$x_restore_char := eve$erase_text (char_range, eve$x_char_buffer, delete_eol); set (OVERSTRIKE, current_buffer); else char_range := create_range (mark (NONE), mark (NONE), NONE); eve$x_erased_char_forward := FALSE; eve$x_restore_char := eve$erase_text (char_range, eve$x_char_buffer, delete_eol); endif; return (TRUE); ENDPROCEDURE; !**************************************** PROCEDURE EVE_FILL_PARAGRAPH (MY_INDENT_VALUE) ! Fills the current paragraph ! Fill paragraph between margins using spaces local pce_indent_value, current_left_margin, current_right_margin, saved_mark, ! Marker for current cursor position start_paragraph, ! Marker for start of current paragraph stop_paragraph, ! Marker for end of current paragraph fill_range; ! Range for current paragraph on_error [OTHERWISE]: endon_error; if get_info (current_buffer, "system") then eve$message (EVE$_CANTSYSTEMBUF); eve$learn_abort; return (FALSE); endif; ! Can't fill an empty buffer - avoid additional checks later on if beginning_of (current_buffer) = end_of (current_buffer) then eve$message (EVE$_NOFILL); eve$learn_abort; return (FALSE); endif; pce_indent_value := my_indent_value; if pce_indent_value <= 0 then pce_indent_value := 0; endif; current_left_margin := get_info (current_buffer, "left_margin"); current_right_margin := get_info (current_buffer, "right_margin"); position (search (ANCHOR, FORWARD)); saved_mark := mark (NONE); ! Find beginning and end of paragraph ! If on a blank line do preceding paragraph loop position (LINE_BEGIN); exitif mark (NONE) = beginning_of (current_buffer); move_vertical (-1); position (LINE_BEGIN); ! incase set(column_move_vertical,on) if eve$paragraph_break then position (LINE_END); move_horizontal (1); exitif 1; endif; endloop; start_paragraph := mark (NONE); position (saved_mark); loop position (LINE_BEGIN); exitif mark (NONE) = end_of (current_buffer); exitif eve$paragraph_break; move_vertical (1); endloop; if start_paragraph = mark (NONE) then eve$message (EVE$_NOFILL); position (saved_mark); eve$learn_abort; return (FALSE); else move_horizontal (-1); stop_paragraph := mark (NONE); ! Now fill the paragraph fill_range := create_range (start_paragraph, stop_paragraph, NONE); fill (fill_range, eve$x_fill_separators, current_left_margin, current_right_margin, pce_indent_value); position (stop_paragraph); eve$show_first_line; !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF endif; return (TRUE); ENDPROCEDURE; !**************************************** PROCEDURE EVE_FILL_RANGE (MY_INDENT_VALUE) ! Fill the selected text range local pce_indent_value, current_left_margin, current_right_margin, the_selection, start_mark, ! Start of the range to fill end_mark; ! Marker for end of range on_error [OTHERWISE]: endon_error; if get_info (current_buffer, "system") then eve$message (EVE$_CANTSYSTEMBUF); eve$learn_abort; return (FALSE); endif; pce_indent_value := my_indent_value; if pce_indent_value <= 0 then pce_indent_value := 0; endif; current_left_margin := get_info (current_buffer, "left_margin"); current_right_margin := get_info (current_buffer, "right_margin"); the_selection := eve$selection (FALSE); if the_selection <> 0 then if beginning_of (the_selection) <= end_of (the_selection) then start_mark := beginning_of (the_selection); end_mark := end_of (the_selection); else end_mark := beginning_of (the_selection); start_mark := end_of (the_selection); endif; the_selection := 0; position (start_mark); loop ! For all paragraphs loop ! Find the paragraph bounds position (LINE_END); move_horizontal (1); exitif mark (NONE) > end_mark; exitif eve$paragraph_break; endloop; move_horizontal (-1); if mark (NONE) > end_mark then position (end_mark); endif; fill (create_range (start_mark, mark (NONE), NONE), eve$x_fill_separators, current_left_margin, current_right_margin, pce_indent_value); loop ! Skip the inter-paragraph break; position (LINE_END); move_horizontal (1); exitif not eve$paragraph_break; endloop; start_mark := mark (NONE); exitif start_mark >= end_mark; endloop; position (end_mark); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! screen manager issue !!!!!!!!!!!!!!!!!!!!!!!!!! update (current_window); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF else eve$message (EVE$_SELFIRST); eve$learn_abort; return (FALSE); endif; eve$clear_message; return (TRUE); ENDPROCEDURE; !**************************************** PROCEDURE EVE_FILL ! Fill select range or paragraph if (eve$x_select_position <> 0) then if get_info (eve$x_select_position, "buffer") = current_buffer then return (eve_fill_range(0)); endif; endif; if get_info (eve$x_found_range, "type") = RANGE then if get_info (eve$x_found_range, "buffer") = current_buffer then return (eve_fill_range(0)); endif; endif; return (eve_fill_paragraph(0)); ENDPROCEDURE; !**************************************** PROCEDURE EVE_FIND (TARGET) ! ! Top-level find command. ! Doesn't change direction after the find, but saves the found direction ! in eve$x_old_find_direction for a subsequent or FNDNXT. ! ! Parameters: ! target String to find - input local saved_direction, status, how_exact; on_error [TPU$_CONTROLC]: if (saved_direction <> current_direction) and (get_info (saved_direction, "type") = KEYWORD) then set (saved_direction, current_buffer); endif; eve$learn_abort; abort; [OTHERWISE]: if (saved_direction <> current_direction) and (get_info (saved_direction, "type") = KEYWORD) then set (saved_direction, current_buffer); endif; endon_error; saved_direction := current_direction; if current_window = eve$prompt_window then eve$learn_abort; return (FALSE); ! already a find(?) going on endif; status := eve$$get_find_target (target, how_exact, 0); if status then ! ! Allow for EDTPlus redefinition of exactness on searches ! if EDTP$x_search_case = exact then how_exact := exact; else if EDTP$x_search_case = no_exact then how_exact := no_exact; endif; endif; status := eve$remember_found (eve$$find (how_exact, 0, 1)); else ! eve$$find does its own learn_abort eve$learn_abort; endif; eve$x_old_find_direction := current_direction; set (saved_direction, current_buffer); !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF return (status); ENDPROCEDURE; !**************************************** PROCEDURE EVE_GET_FILE (GET_FILE_PARAMETER) ! ! Edit a file in the current window. If the file is already in a buffer, ! use the old buffer. If not, create a new buffer. ! ! Modified 881112 by R. Stacks to handle getting multiple files (i.e. ! wildcard file specs) while in the editor... NOT on start up ! ! Parameters: ! get_file_parameter String containing file name - input local get_file_name, ! Local copy of get_file_parameter temp_buffer_name, ! String for buffer name based on get_file_name file_search_result, ! Latest string returned by file_search temp_file, ! Save the filename temp_file_name, ! First file name string returned by file_search loop_buffer, ! Buffer currently being checked in loop file_count, ! Number of files matching the spec temp_answer, ! Answer to "Create file?" new_buffer, ! New buffer created if needed found_a_buffer, ! True if buffer found with same name want_new_buffer, ! True if file should go into a new buffer current_file_name, current_file_type; on_error [TPU$_CONTROLC]: eve$learn_abort; abort; [TPU$_SEARCHFAIL]: eve$message (EVE$_NOSUCHFILE, 0, get_file_name); eve$learn_abort; return (FALSE); [OTHERWISE]: endon_error; if eve$check_bad_window then eve$message (EVE$_CURSINTEXT); eve$learn_abort; return (FALSE); endif; if not (eve$prompt_string (get_file_parameter, get_file_name, message_text (EVE$_GETFILEPROMPT, 1), message_text (EVE$_NOFILESPEC, 0))) then eve$learn_abort; return (FALSE); endif; ! ! If no file type is given use file type of name of current buffer or ! * for the file type. ! current_file_name := get_info(current_buffer, "name"); current_file_type := substr(current_file_name, index(current_file_name, '.'), length(current_file_name)); get_file_name := file_parse(get_file_name, "", "", node) + file_parse(get_file_name, "", "", device) + file_parse(get_file_name, "", "", directory) + file_parse(get_file_name, "", "", name) + file_parse(get_file_name, current_file_type, "*", type) + file_parse(get_file_name, "", "", version); ! Protect against earlier file_search with same file name. eve$reset_file_search; temp_file_name := ""; erase (eve$choice_buffer); loop file_search_result := eve$$file_search (get_file_name); exitif file_search_result = ""; file_count := file_count + 1; eve$add_choice (file_search_result); temp_file_name := file_search_result; endloop; if file_count > 1 then ! If get_file is called from eve$init_procedure, can't handle ! multiple choices, so set status line on main window and return if eve$x_starting_up then !** How do we get the synonym for the key that was defined to this command? eve$display_choices (message_text (EVE$_AMBFILE, 0, get_file_name), "get file " + get_file_name); eve$learn_abort; return (FALSE); endif; ! otherwise if we are in the editor already, past the init part then, ! get all files specified by the user's use of wildcards eve$reset_file_search; temp_file_name := ""; erase (eve$choice_buffer); loop ! set up to search for the files again, ! this time pull each one into the editor using ! a separate buffer for each file file_search_result := eve$$file_search (get_file_name); exitif file_search_result = ""; temp_file_name := file_search_result; ! Set-up to see if we already have a buffer by that name if temp_file_name = "" then temp_buffer_name := file_parse (get_file_name, "", "", NAME, TYPE); else temp_buffer_name := file_parse (temp_file_name, "", "", NAME, TYPE); endif; temp_file := get_file_name; get_file_name := file_parse (get_file_name); if get_file_name = "" then get_file_name := temp_file; endif; ! Make sure we don't try to use a wildcard file-spec to create a new file. if file_count = 0 then if eve$is_wildcard (get_file_name) then eve$message (EVE$_NOFILMATCH, 0, get_file_name); eve$learn_abort; return (FALSE); endif; endif; loop_buffer := get_info (BUFFERS, "first"); loop exitif loop_buffer = 0; if temp_buffer_name = get_info (loop_buffer, "name") then found_a_buffer := 1; exitif 1; endif; loop_buffer := get_info (BUFFERS, "next"); endloop; ! If there is a buffer by that name, is it the exact same file? ! If so, switch to that buffer. Otherwise use a new buffer, ! asking for a new buffer name (null new name will abort). if found_a_buffer then ! Have a buffer with the same name if temp_file_name = "" then ! No file on disk if get_file_name = get_info (loop_buffer, "output_file") then want_new_buffer := 0; else want_new_buffer := 1; endif; else ! Check to see if the same file if (temp_file_name = get_info (loop_buffer, "output_file")) or (temp_file_name = get_info (loop_buffer, "file_name")) then want_new_buffer := 0; else want_new_buffer := 1; endif; endif; if want_new_buffer then eve$message (EVE$_BUFINUSE, 0, temp_buffer_name); temp_buffer_name := eve$prompt_line(message_text(EVE$_NEWBUFPROMPT, 1), eve$$x_prompt_terminators, ""); if temp_buffer_name = 0 then eve$learn_abort; return (FALSE); endif; if temp_buffer_name = "" then eve$message (EVE$_NOBUFFCREA); eve$learn_abort; return (FALSE); else new_buffer := eve$create_buffer (temp_buffer_name, get_file_name, temp_file_name); if new_buffer = 0 then return (FALSE); endif; endif; else if current_buffer = loop_buffer then eve$message (EVE$_ALREDIT, 0, get_file_name); eve$learn_abort; return (FALSE); else map (current_window, loop_buffer); endif; endif; else if (temp_file_name = "") and (eve$x_starting_up) and (get_info (COMMAND_LINE, "create") = 0) then ! EXIT the editor: input file doesn't exist and /NOCREATE was specified eve$message (EVE$_NOSUCHFILE, 0, get_file_name); exit; endif; ! No buffer with the same name, so create a new buffer new_buffer := eve$create_buffer (temp_buffer_name, get_file_name, temp_file_name); if new_buffer = 0 then return (FALSE); endif; endif; ! Correct the status line in any event eve$set_status_line (current_window); set (informational, off); pce$init_tabs; set (informational, on); endloop; else ! Set-up to see if we already have a buffer by that name if temp_file_name = "" then temp_buffer_name := file_parse (get_file_name, "", "", NAME, TYPE); else temp_buffer_name := file_parse (temp_file_name, "", "", NAME, TYPE); endif; temp_file := get_file_name; get_file_name := file_parse (get_file_name); if get_file_name = "" then get_file_name := temp_file; endif; ! Make sure we don't try to use a wildcard file-spec to create a new file. if file_count = 0 then if eve$is_wildcard (get_file_name) then eve$message (EVE$_NOFILMATCH, 0, get_file_name); eve$learn_abort; return (FALSE); endif; endif; loop_buffer := get_info (BUFFERS, "first"); loop exitif loop_buffer = 0; if temp_buffer_name = get_info (loop_buffer, "name") then found_a_buffer := 1; exitif 1; endif; loop_buffer := get_info (BUFFERS, "next"); endloop; ! If there is a buffer by that name, is it the exact same file? ! If so, switch to that buffer. Otherwise use a new buffer, ! asking for a new buffer name (null new name will abort). if found_a_buffer then ! Have a buffer with the same name if temp_file_name = "" then ! No file on disk if get_file_name = get_info (loop_buffer, "output_file") then want_new_buffer := 0; else want_new_buffer := 1; endif; else ! Check to see if the same file if (temp_file_name = get_info (loop_buffer, "output_file")) or (temp_file_name = get_info (loop_buffer, "file_name")) then want_new_buffer := 0; else want_new_buffer := 1; endif; endif; if want_new_buffer then eve$message (EVE$_BUFINUSE, 0, temp_buffer_name); temp_buffer_name := eve$prompt_line(message_text(EVE$_NEWBUFPROMPT, 1), eve$$x_prompt_terminators, ""); if temp_buffer_name = 0 then eve$learn_abort; return (FALSE); endif; if temp_buffer_name = "" then eve$message (EVE$_NOBUFFCREA); eve$learn_abort; return (FALSE); else new_buffer := eve$create_buffer (temp_buffer_name, get_file_name, temp_file_name); if new_buffer = 0 then return (FALSE); endif; endif; else if current_buffer = loop_buffer then eve$message (EVE$_ALREDIT, 0, get_file_name); eve$learn_abort; return (FALSE); else map (current_window, loop_buffer); endif; endif; else if (temp_file_name = "") and (eve$x_starting_up) and (get_info (COMMAND_LINE, "create") = 0) then ! EXIT the editor: input file doesn't exist and /NOCREATE was specified eve$message (EVE$_NOSUCHFILE, 0, get_file_name); exit; endif; ! No buffer with the same name, so create a new buffer new_buffer := eve$create_buffer (temp_buffer_name, get_file_name, temp_file_name); if new_buffer = 0 then return (FALSE); endif; endif; ! Correct the status line in any event eve$set_status_line (current_window); endif; set (informational, off); pce$init_tabs; set (informational, on); if eag_map_lock = 1 then eag_show_map; endif; !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF return (TRUE); ENDPROCEDURE; !**************************************** PROCEDURE EVE_INCLUDE_FILE (INCLUDE_FILE_PARAMETER) ! ! Like read_file built-in, but positions the cursor at the start of ! the inserted file. Handles wildcarding in file name. ! ! Parameters: ! ! include_file_parameter String containing file name - input local include_file_name, ! Local copy of include_file_parameter started_at_bof, ! True if current position at start of file include_position, ! Marker for where cursor should end up temp_file_name, ! First file name string - from file_parse file_search_result, ! Latest string returned by file_search current_file_name, current_file_type; on_error [TPU$_CONTROLC]: eve$learn_abort; return (FALSE); [TPU$_SEARCHFAIL]: eve$message (EVE$_NOSUCHFILE, 0, include_file_name); eve$learn_abort; return (FALSE); [TPU$_TRUNCATE]: eve$message (error_text, error); [OTHERWISE]: endon_error; position (search (ANCHOR, FORWARD)); ! no padding if eve$check_bad_window then eve$message (EVE$_CURSINTEXT); eve$learn_abort; return (FALSE); endif; if not (eve$prompt_string (include_file_parameter, include_file_name, message_text (EVE$_INCLPROMPT, 1), message_text (EVE$_NOFILEINCL, 0))) then eve$learn_abort; return (FALSE); endif; ! ! If no file type is given use file type of name of current buffer ! current_file_name := get_info(current_buffer, "name"); current_file_type := substr(current_file_name, index(current_file_name, '.'), length(current_file_name)); include_file_name := file_parse(include_file_name, "", "", node) + file_parse(include_file_name, "", "", device) + file_parse(include_file_name, "", "", directory) + file_parse(include_file_name, "", "", name) + file_parse(include_file_name, current_file_type, "", type) + file_parse(include_file_name, "", "", version); if mark (FREE_CURSOR) = beginning_of (current_buffer) then started_at_bof := 1; endif; if started_at_bof then include_position := mark (FREE_CURSOR); else move_horizontal (-1); include_position := mark (FREE_CURSOR); move_horizontal (1); endif; ! Initialize to null string and protect against earlier file_search ! with same file name. eve$reset_file_search; temp_file_name := file_parse (include_file_name); erase (eve$choice_buffer); loop file_search_result := file_search (include_file_name); exitif file_search_result = ""; eve$add_choice (file_search_result); temp_file_name := file_search_result; endloop; case get_info (eve$choice_buffer, "record_count") from 0 to 1 [0]: eve$message (EVE$_CANTINCLFILE, 0, include_file_name); [1]: read_file (temp_file_name); if started_at_bof then position (beginning_of (current_buffer)); else eve$position_in_middle (include_position); move_horizontal (1); endif; return (TRUE); [outrange]: ! multiple files specified (wild-carded) ! multiple files specified (wild-carded) position(beginning_of(eve$choice_buffer)); loop choice_position := mark(none); if current_line <> eve$kt_null then temp_file_name := current_line; position (include_position); read_file (temp_file_name); endif; position(choice_position); move_vertical(1); exitif mark(none) = end_of(current_buffer); endloop; if started_at_bof then position (include_position); position (beginning_of (current_buffer)); else eve$position_in_middle (include_position); move_horizontal (1); endif; update(current_window); return (TRUE); !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF ! [OUTRANGE]: !** How do we get the synonym for the key that was defined to this command? ! eve$display_choices (message_text (EVE$_AMBFILE, 0, include_file_name), ! "include file " + include_file_name); endcase; eve$learn_abort; return (FALSE); ENDPROCEDURE; !**************************************** PROCEDURE EVE_LINE (LINE_PARAMETER, PROCEDURE_PARAMETER) ! Go to start of a certain line in the current buffer, or optionally to ! the line in a certain procedure ! ! Parameters: ! ! line_parameter Line number to move to - input ! procedure_parameter Procedure in which to move to line number local the_line, ! Local copy of line_parameter the_name, ! Local (and normalized) copy of 2nd arg saved_mark, ! Marker for current cursor position saved_window, ! Current window last_line, ! Number of lines in buffer, including eob_text procedure_pattern, ! Pattern that matchs the PROCEDURE and w/s search_pattern, ! Pattern that matches the procedure statement search_range, ! Range returned by search temp_mark, ! Beginning of a possible procedure start_mark, ! Start of the procedure end_mark, ! End of the procedure procedure_range, ! The name part of the procedure statement this_name; ! String version of procedure_range on_error [TPU$_CONTROLC]: eve$$restore_position (saved_window, saved_mark); eve$learn_abort; abort; [TPU$_ENDOFBUF]: [OTHERWISE]: eve$message (EVE$_CANTMOVE, 0, the_line); eve$$restore_position (saved_window, saved_mark); eve$learn_abort; return (FALSE); endon_error; if not (eve$prompt_number (line_parameter, the_line, message_text (EVE$_LINENO, 1), message_text (EVE$_NOLINNO, 0))) then eve$learn_abort; return (FALSE); endif; if the_line <= 0 then eve$message (EVE$_CANTMOVE, 0, the_line); eve$learn_abort; return (FALSE); endif; last_line := get_info (current_buffer, "record_count"); ! do NOT include eob_text if last_line = 0 then eve$message (EVE$_BUFEMPTY); eve$learn_abort; return (FALSE); endif; saved_mark := mark (FREE_CURSOR); saved_window := current_window; position (TEXT); ! snap the cursor the_name := procedure_parameter; edit (the_name, UPPER, TRIM, COMPRESS); if the_name = "" then if the_line > last_line then position (end_of (current_buffer)); eve$message (EVE$_BUFHASONLY, 0, last_line); eve$learn_abort; return (FALSE); else position (beginning_of (current_buffer)); move_vertical (the_line - 1); ! already at line 1 eve$position_in_middle (mark (FREE_CURSOR)); return (TRUE); endif; else eve$message (EVE$_FINDINGPROC, 0, the_name); erase (eve$choice_buffer); procedure_pattern := ANCHOR + "procedure" + span (eve$kt_whitespace); search_pattern := LINE_BEGIN + "procedure" + span (eve$kt_whitespace) + the_name; position (beginning_of (current_buffer)); loop search_range := search_quietly (search_pattern, FORWARD); exitif search_range = 0; position (beginning_of (search_range)); temp_mark := mark (FREE_CURSOR); ! Get entire name of this procedure position (end_of (search_quietly (procedure_pattern, FORWARD))); move_horizontal (1); procedure_range := search_quietly (eve$pattern_procname, FORWARD); ! Find corresponding endprocedure search_range := search_quietly (eve$pattern_endprocedure, FORWARD); if search_range <> 0 then start_mark := temp_mark; position (end_of (search_range)); move_horizontal (1); end_mark := mark (FREE_CURSOR); this_name := substr (procedure_range, 1, length (procedure_range)); change_case (this_name, UPPER); if this_name = the_name then erase (eve$choice_buffer); eve$add_choice (this_name); exitif 1; else eve$add_choice (this_name); endif; endif; position (LINE_END); move_horizontal (1); endloop; case get_info (eve$choice_buffer, "record_count") from 0 to 1 [0]: eve$message (EVE$_PROCNOTFOUND, 0, the_name); eve$$restore_position (saved_window, saved_mark); eve$learn_abort; return (FALSE); [1]: position (start_mark); move_vertical (the_line - 1); if mark (FREE_CURSOR) > end_mark then eve$message (EVE$_LESSLINES, 0, this_name, the_line); position (end_mark); position (LINE_BEGIN); endif; [OUTRANGE]: eve$display_choices (message_text (EVE$_AMBPROC, 0, the_name), !** How do we get the synonym for the key that was defined to this command? "line " + str (the_line) + " ", procedure_parameter); eve$learn_abort; return (FALSE); endcase; endif; eve$position_in_middle (mark (FREE_CURSOR)); !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF return (TRUE); ENDPROCEDURE; !**************************************** PROCEDURE EVE_MOVE_BY_PAGE ! Move to next page break local saved_mark, ! Marker where we started saved_scrolls, ! Boolean set if saved_scroll_xxx valid saved_scroll_top, ! Original value of scroll_top saved_scroll_bottom, ! Original value of scroll_bottom saved_scroll_amount, ! Original value of scroll_amount window_length; ! For finding bottom of scroll region on_error [TPU$_CONTROLC]: if saved_scrolls then set (SCROLLING, current_window, ON, saved_scroll_top, saved_scroll_bottom, saved_scroll_amount); update (current_window); endif; eve$learn_abort; abort; [TPU$_STRNOTFOUND]: if current_window = eve$prompt_window then eve$learn_abort; return (FALSE); endif; if current_direction = FORWARD then position (end_of (current_buffer)); if mark (NONE) <> saved_mark then eve$message (EVE$_NONEXTPAGE); endif; else position (beginning_of (current_buffer)); if mark (NONE) <> saved_mark then eve$message (EVE$_NOPREVPAGE); endif; endif; [OTHERWISE]: if saved_scrolls then set (SCROLLING, current_window, ON, saved_scroll_top, saved_scroll_bottom, saved_scroll_amount); update (current_window); endif; !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF endon_error; saved_mark := mark (FREE_CURSOR); ! prevent padding position (search (ANCHOR, FORWARD)); ! snap cursor to prevent padding eve$position_in_middle (search (PAGE_BREAK, current_direction, EXACT)); ! want error if none if mark (NONE) = saved_mark then if current_direction = FORWARD then move_horizontal (1); else move_horizontal (-1); endif; eve$position_in_middle (search (PAGE_BREAK, current_direction, EXACT)); endif; !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF return (TRUE); ENDPROCEDURE; !**************************************** PROCEDURE EVE_ONE_WINDOW ! delete windows and map only one window on the screen local this_window, ! Current window the_number, the_pad, the_text, the_video, the_width, the_blink, the_bold, the_reverse, the_underline; on_error [TPU$_CONTROLC]: if eve$x_number_of_windows = 1 then eve$x_number_of_windows := 2; ! get past onlyone test below endif; eve_one_window; eve$learn_abort; abort; [TPU$_NOTARRAY]: if eve$eve_in_control then eve$message (error_text, error); endif; eve$learn_abort; return (0); [OTHERWISE]: endon_error; eve$check_bad_window; this_window := current_window; if eve$x_number_of_windows = 1 then eve$message (EVE$_ONLYONE); return (FALSE); ! no learn_abort here else the_number := eve$$get_window_number; ! get the window's attributes the_pad := get_info (this_window, "pad"); the_text := get_info (this_window, "text"); the_width := get_info (this_window, "width"); the_video := get_info (this_window, "video"); ! keyword or 1 if the_video = 1 then the_blink := get_info (this_window, "blink_video"); the_bold := get_info (this_window, "bold_video"); the_reverse := get_info (this_window, "reverse_video"); the_underline := get_info (this_window, "underline_video"); endif; ! eve$x_number_of_windows can exceed actual window count, and the ! following will still work loop exitif eve$x_number_of_windows < 1; ! in case ^C aborted this loop after deleting a window ! but before decrementing the count if (eve$$x_windows {eve$x_number_of_windows} <> this_window) AND (get_info (eve$$x_windows {eve$x_number_of_windows}, "type") = WINDOW) then delete (eve$$x_windows {eve$x_number_of_windows}); endif; eve$x_number_of_windows := eve$x_number_of_windows - 1; endloop; eve$x_number_of_windows := 1; ! eve$$x_windows {the_number} := TPU$K_UNSPECIFIED; eve$$x_windows {1} := this_window; adjust_window (this_window, 1 - get_info (this_window, "visible_top"), eve$main_window_length - get_info (this_window, "visible_bottom") - (get_info (this_window, "status_line") <> 0)); ! reset the window's attributes that changed due to adjust_window if (eve$x_scroll_top <> 0) or (eve$x_scroll_bottom <> 0) then eve$set_scroll_margins (this_window, eve$x_scroll_top, eve$x_scroll_bottom); endif; if eag_map_lock = 1 then eag$x_pre_command_window := current_window; adjust_window (current_window, 0, -eag_map_lines); ! adjust_window (eag_map_window, eag_map_lines, -eag_map_lines); position (eag$x_pre_command_window); eag_show_map; endif; ! !%IF eve$x_option_evej !%THEN !% eve$conversion_start; !%ENDIF endif; return (TRUE); ENDPROCEDURE; !**************************************** PROCEDURE EVE_TWO_WINDOWS if eve$x_number_of_windows = 2 then message("Already 2 windows on screen"); else eve_split_window (2); endif; ENDPROCEDURE;