!************************************************************************* ! * ! © Copyright 2005 Hewlett-Packard Development Company, L.P. * ! * ! Confidential computer software. Valid license from HP required for * ! possession, use or copying. Consistent with FAR 12.211 and 12.212, * ! Commercial Computer Software, Computer Software Documentation, and * ! Technical Data for Commercial Items are licensed to the U.S. * ! Government under vendor's standard commercial license. * ! * !************************************************************************* !++ ! Facility: ! eXtended LSE (XLSE) ! ! Abstract: ! XLSE's variant of Ben Jones' "Emacs-style Incremental Search" feature. ! ! NOTE: Modifications to Ben Jones' original source file are flagged with ! three quotation marks (!!!). ! ! Author: ! W. Ward Clark, CASEE Group ! ! Creation Date: 28-Nov-87 ! !-- PROCEDURE bsj$search LOCAL exit_flag; bsj$search_start := MARK(NONE); bsj$search_mark0 := MARK(NONE); bsj$old_window := CURRENT_WINDOW; bsj$search_init; LOOP !!! UPDATE (lse$$prompt_window); UPDATE (EVE$PROMPT_WINDOW); SET (TIMER, OFF, ""); bsj$new_char := READ_CHAR; SET (TIMER, ON, "working..."); exit_flag := 0; CASE bsj$new_char FROM '' TO '' [' ']: ! return bsj$search_exit; exit_flag := 1; ['']: ! ctrl_t SPAWN(""); ['','']: ! ctrl_r, ctrl_w REFRESH; ['', '']: ! ctrl_u, ctrl_z bsj$search_flag := 0; bsj$search_exit; POSITION (bsj$search_start); IF bsj$new_char = '' THEN exit_flag := 1; ! ctrl_z ELSE bsj$search_init; ! ctrl_u ENDIF; ['']: ! escape exit_flag := bsj$search_escape; ['']: ! delete bsj$search_for (0); [INRANGE]: bsj$search_for (1); ENDCASE; EXITIF (exit_flag); ENDLOOP; RETURN bsj$search_flag; ENDPROCEDURE PROCEDURE bsj$search_init bsj$prompt_string := "_Search for: "; bsj$search_string := ""; bsj$search_level := 0; bsj$search_range := 0; bsj$search_flag := 0; !!! POSITION (BEGINNING_OF(lse$$prompt_buffer)); !!! ERASE (lse$$prompt_buffer); POSITION (BEGINNING_OF(EVE$PROMPT_BUFFER)); ERASE (EVE$PROMPT_BUFFER); COPY_TEXT (bsj$prompt_string); bsj$prompt_mark := MARK(NONE); !!! SET (VIDEO, lse$$prompt_window, REVERSE); !!! MAP (lse$$prompt_window, lse$$prompt_buffer); SET (VIDEO, EVE$PROMPT_WINDOW, REVERSE); MAP (EVE$PROMPT_WINDOW, EVE$PROMPT_BUFFER); ENDPROCEDURE PROCEDURE bsj$search_for (flag) IF flag THEN COPY_TEXT (bsj$new_char); bsj$search_string := bsj$search_string+bsj$new_char; bsj$prompt_mark := MARK(NONE); bsj$search_mark (0); bsj$search_level := bsj$search_level+1; ELSE IF bsj$search_level > 0 THEN bsj$search_level := bsj$search_level-1; IF bsj$search_level = 0 THEN bsj$search_init; ELSE ERASE_CHARACTER (-1); bsj$search_string := SUBSTR (bsj$search_string, 1, LENGTH(bsj$search_string)-1); ENDIF; ENDIF; bsj$search_mark (0); ENDIF; bsj$search_show (0); ENDPROCEDURE PROCEDURE bsj$search_show (next_mode) LOCAL show_text, mark_text1, mark_text2, direction; ON_ERROR !!! MESSAGE ('String "'+bsj$search_string+'" not found'); MESSAGE( "Could not find: " + bsj$search_string ); !!! UPDATE (lse$message_window); UPDATE (MESSAGE_WINDOW); ENDON_ERROR bsj$search_flag := 0; IF bsj$search_level = 0 THEN bsj$search_range := 0; ELSE mark_text1 := MARK (NONE); IF next_mode = 0 THEN direction := CURRENT_DIRECTION; ELSE direction := next_mode; IF bsj$search_range <> 0 THEN IF direction = FORWARD THEN POSITION(END_OF(bsj$search_range));MOVE_HORIZONTAL(1); ELSE POSITION(BEGINNING_OF(bsj$search_range));MOVE_HORIZONTAL(-1); ENDIF; ENDIF; ENDIF; show_text := SEARCH (bsj$search_string, direction); IF show_text <> 0 THEN bsj$search_flag := 1; mark_text1 := BEGINNING_OF (show_text); mark_text2 := END_OF (show_text); bsj$search_range := CREATE_RANGE (mark_text1, mark_text2, REVERSE); IF CURRENT_DIRECTION = REVERSE THEN POSITION (mark_text2); MOVE_HORIZONTAL (1); mark_text1 := MARK (NONE); ENDIF; ENDIF; POSITION (mark_text1); ENDIF; bsj$search_mark (1); UPDATE (bsj$old_window); POSITION (bsj$prompt_mark); ENDPROCEDURE PROCEDURE bsj$search_escape !+ ! Block error messages. !- ON_ERROR [TPU$_INVNUMSTR] : ; ! Invalid numeric string ENDON_ERROR; bsj$new_char := READ_CHAR; LOOP bsj$new_char := READ_CHAR; EXITIF INT (bsj$new_char) = 0; ENDLOOP; CASE bsj$new_char FROM 'A' TO 'D' ['A', 'B']: ! up_arrow, down_arrow IF bsj$search_level = 0 THEN bsj$search_exit; bsj$search_init; !!! bsj$new_char := lse$$search_string; bsj$new_char := EVE$X_TARGET; bsj$search_for (1); ELSE bsj$search_mark (0); IF bsj$new_char = 'A' THEN bsj$search_show (REVERSE); ELSE bsj$search_show (FORWARD); ENDIF; ENDIF; ['C']: ! right_arrow bsj$search_mark (0); IF CURRENT_DIRECTION = FORWARD THEN MOVE_HORIZONTAL (LENGTH (bsj$search_string)); ENDIF; bsj$new_char := CURRENT_CHARACTER; POSITION (bsj$prompt_mark); IF bsj$new_char <> "" THEN bsj$search_for (1); ENDIF; ['D']: ! left_arrow bsj$search_for (0); [OUTRANGE]: bsj$search_exit; RETURN (1); ENDCASE; RETURN (0); ENDPROCEDURE PROCEDURE bsj$search_exit IF bsj$search_range <> 0 THEN POSITION (bsj$search_range); EVE$X_FOUND_RANGE := bsj$search_range; bsj$search_range := 0; EVE$X_FOUND_RANGE := CREATE_RANGE(BEGINNING_OF(EVE$X_FOUND_RANGE), END_OF(EVE$X_FOUND_RANGE), BOLD); ENDIF; !!! IF bsj$search_flag THEN EVE$X_TARGET := bsj$search_string; EVE$X_TARGET_PATTERN := bsj$search_string; !!! ENDIF; UPDATE (bsj$old_window); !!! unmap (lse$$prompt_window); unmap (EVE$PROMPT_WINDOW); ENDPROCEDURE PROCEDURE bsj$search_mark (flag) LOCAL s; s := STR (bsj$search_level); IF flag THEN s := 'bsj$search_mark'+s+':=MARK(NONE)'; ELSE s := 'POSITION (bsj$search_mark'+s+')'; ENDIF; EXECUTE (s); ENDPROCEDURE !!!DEFINE_KEY ('bsj$search', KEY_NAME (KP8, SHIFT_KEY), !!! 'emacs search');