nagy%warner.hepnet@LBL.GOV (Frank J. Nagy, VAX Wizard & Guru) (01/06/88)
Another interested user here at Fermilab has provided a better (than my last distributed fix) set of changes to SWING which I am distributing here. Below is the note on these changes from the modifier: This afternoon, I finally got a chance to look at SWING again. I was able to solve the original problem - one change took care of that which you corrected, plus the annoying screen shift on the first update. One of our users also uncovered a problem with a system error (arithmetic trap) when attempting to delete a tree branch that contained one or more subdirectories created outside of SWING and NOT SAVED. This I was also able to fix by putting a limit (MAX_NODES) on a DO WHILE loop. The following modules are available to you as updates in in the VMS_SHAR below: DRAW_SCREEN.FOR - correct display positioning FIND_NODE.FOR - limit 'unknown' node search SWING.FOR - update modification history (no code changes here) Modifications by Lin A. Winterowd of Fermilab. = Frank J. Nagy "VAX Guru & Wizard" = Fermilab Research Division EED/Controls = HEPNET: WARNER::NAGY (43198::NAGY) or FNAL::NAGY (43009::NAGY) = BitNet: NAGY@FNAL = USnail: Fermilab POB 500 MS/220 Batavia, IL 60510 ....................... Cut between dotted lines and save ...................... $!.............................................................................. $! VAX/VMS archive file created by VMS_SHAR V-5.01 01-Oct-1987 $! which was written by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au) $! To unpack, simply save and execute (@) this file. $! $! This archive was created by NAGY $! on Wednesday 6-JAN-1988 06:40:10.84 $! $! It contains the following 3 files: $! DRAW_SCREEN.FOR FIND_NODE.FOR SWING.FOR $!============================================================================== $ Set Symbol/Scope=(NoLocal,NoGlobal) $ Version=F$GetSYI("VERSION") ! See what VMS version we have here: $ If Version.ges."V4.4" then goto Version_OK $ Write SYS$Output "Sorry, you are running VMS ",Version, - ", but this procedure requires V4.4 or higher." $ Exit 44 $Version_OK: CR[0,8]=13 $ Pass_or_Failed="failed!,passed." $ Goto Start $Convert_File: $ Read/Time_Out=0/Error=No_Error1/Prompt="creating ''File_is'" SYS$Command ddd $No_Error1: Define/User_Mode SYS$Output NL: $ Edit/TPU/NoSection/NoDisplay/Command=SYS$Input/Output='File_is' - VMS_SHAR_DUMMY.DUMMY f:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f); o:=Get_Info(Command_Line,"Output_File");Set(Output_File,b,o); Position(Beginning_of(b));Loop x:=Erase_Character(1);Loop ExitIf x<>"V"; Move_Vertical(1);x:=Erase_Character(1);Append_Line; Move_Horizontal(-Current_Offset);EndLoop;Move_Vertical(1); ExitIf Mark(None)=End_of(b) EndLoop;Position(Beginning_of(b));Loop x:=Search("`",Forward,Exact);ExitIf x=0;Position(x);Erase_Character(1); If Current_Character='`' then Move_Horizontal(1);else Copy_Text(ASCII(INT(Erase_Character(3))));EndIf;EndLoop;Exit; $ Delete VMS_SHAR_DUMMY.DUMMY;* $ Checksum 'File_is $ Success=F$Element(Check_Sum_is.eq.CHECKSUM$CHECKSUM,",",Pass_or_Failed)+CR $ Read/Time_Out=0/Error=No_Error2/Prompt=" CHECKSUM ''Success'" SYS$Command ddd $No_Error2: Return $Start: $ File_is="DRAW_SCREEN.FOR" $ Check_Sum_is=1584627796 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X subroutine draw_screen X X include 'swing.cmn' X include '($smgdef)' X XC XC To cope with strange terminal screen lengths XC 19 --- > linest - 5 XC 20 --- > linest - 4 XC 23 --- > linest - 1 XC XC XC Added by EH Perkins, Aug 16, 1987 XC X X`009integer linest X`009common /length/ linest X X integer ii, jj, kk, smg$change_pbd_characteristics X integer smg$change_rendition X X call smg$begin_pasteboard_update( board_id ) X X call smg$paste_virtual_display( window2, board_id, 3, 1 )`009`009!LAW X call smg$paste_virtual_display( window1, board_id, 2, 1 ) X call smg$paste_virtual_display( window3, board_id, X . (linest - 1), 1 ) X X call smg$set_display_scroll_region( window3, 1, 2 ) X X call pd_draw_bar( board_id ) X X top_line = 1 X bottom_line = (linest - 4) X X node_num = node_pointer( cur_level, cur_line ) X X call smg$change_rendition( window2, cur_line, cur_level*17+1, X . 1, 12, X . smg$m_bold + node(node_num).rend ) X X if ( cur_line .gt. bottom_line ) then X`009 top_line = cur_line - (linest - 5) X`009 bottom_line = cur_line X`009 call smg$move_virtual_display( window2, board_id, X . (linest - 1) - cur_line, 1 ) X`009 else if ( cur_line .lt. top_line ) then X`009 top_line = cur_line X`009 bottom_line = cur_line + (linest - 5) X call smg$move_virtual_display( window2, board_id, X . cur_line, 1 ) X end if X X call update_window1 X X call smg$end_pasteboard_update( board_id ) X X call smg$set_cursor_abs( window2, cur_line, cur_level*17+1 ) X X update = .true. X X return X end $ GoSub Convert_File $ File_is="FIND_NODE.FOR" $ Check_Sum_is=1679971356 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X logical function find_node( dir_spec, ptr ) X X include 'swing.cmn' X X character dir_spec*(*) X integer ii, jj, ptr X logical found_node X X ii = len( dir_spec ) X do while ( dir_spec(ii:ii) .eq. ' ' .and. ii .gt. 0 ) X ii = ii - 1 X end do X X jj = 1 X found_node = .false. X do while ( .not. found_node .and. jj .le. max_nodes)`009`009!LAW X if ( node(jj).length .ne. 0 ) then X if ( node(jj).spec(1:node(jj).length) .eq. dir_spec(1:ii) )then X found_node = .true. X ptr = jj X end if X end if X jj = jj + 1 X end do X X find_node = found_node X X return X end $ GoSub Convert_File $ File_is="SWING.FOR" $ Check_Sum_is=1870215468 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X*======================================================================= X* X* Title: SWING X* X* Version: 1-001 X* X* Abstract: SWING is a VMS utility for displaying and manipulating X* VMS directory trees. X* X* Environment: VMS X* X* Author: Eric Andresen of General Research Corporation X* X* Date: 24-SEP-1986 X* X*----------------------------------------------------------------------- X* X* Modified and X* Expanded by: Craig Young of Hughes Aircraft Company X* X* Additions: The main addition was the FILER and all the subroutines X* which support it. The DCL Command option was added to X* the SWING command menu. Changes were made to subroutine X* Load_Nodes to support '<' and '>' as directory indica- X* tors, to allow the Master file directory as the root X* directory and to allow the START qualifier. X* X* Date: 3-AUG-1987 X* X*----------------------------------------------------------------------- X* X* Modified by:`009 Frank J Nagy of Fermilab X* X* Changes:`009 Modified main routine to pick up command line as foreign X*`009`009 command, add the SWING verb and parse it with DCL so that X*`009`009 the /START qualifier can be checked for. X* X* Date: 16-AUG-1987 X* X*----------------------------------------------------------------------- X* X* Modified by: Lin A Winterowd of Fermilab X* X* Changes: Modified DRAW_SCREEN to correct initial screen layout X* positioning error; and FIND_NODE to limit search for X* directory created outside of SWING and not SAVED X* (causing arithmetic trap on DELETE operation). X X program swing X X include 'swing.cmn' X include '($smgdef)' X X integer linest X common /length/ linest X X integer ii, jj, istat X integer ikey, old_level, old_line, isave, code, code_type X integer smg$create_virtual_display X logical crt, finished X character key, choice*(PD_MAX_CHOICE_LEN) X X`009External Swing_Tables X`009Integer*4 Lib$Get_Foreign, Cli$Dcl_Parse, Lib$Get_Input, sts X`009Character*255 CmdLine X`009Integer*2 CL_Len X XC XC Get the Foreign Command line, tack the verb onto the front and XC invoke the DCL command processor on the result. XC X`009sts = Lib$Get_Foreign( CmdLine,, CL_Len) X`009IF (.NOT. sts) CALL Lib$Signal( %VAL(sts)) X`009IF (CL_Len .gt. 0) Then X`009 sts = Cli$Dcl_Parse( 'SWING '//CmdLine(1:CL_Len), X`0091`009`009`009Swing_Tables, Lib$Get_Input) X`009Else X`009 sts = Cli$Dcl_Parse( 'SWING ', Swing_Tables, Lib$Get_Input) X`009EndIf X`009IF (.NOT. sts) CALL Exit X X if ( .not. crt() ) X . call print_message( 'You must use a DEC CRT terminal', 1 ) X X call define_paste_board X Xc CREATE THE WINDOWS X X istat = smg$create_virtual_display( 1, 132, window1 ) X istat = smg$create_virtual_display( MAX_LINES, 132, window2 ) X istat = smg$create_virtual_display( 2, 132, window3 ) X istat = smg$create_virtual_display( 12, 25, file_window ) X call smg$set_display_scroll_region( file_window ) X istat = smg$create_virtual_display( 15, 70, DCL_window ) X call smg$set_display_scroll_region( DCL_window ) X X call load_nodes X call define_smg_layout X call load_display X call draw_screen X X proc_created = 0 X X do while ( .not. finished ) X X call smg$read_keystroke( keyboard, ikey ) X X call print_message( ' ', 0 ) X X old_line = cur_line X old_level = cur_level X old_rend = node(node_num).rend X X code_type = 0 X code = 0 X X if ( ikey .eq. smg$k_trm_do .or. X . ikey .eq. smg$k_trm_ctrlp ) then X if ( avo ) then X call pd_get_choice( board_id, keyboard, width, X . pull_choices, choice, code ) X code_type = code / 10 X else X call print_message( 'Advanced video option required', 0 ) X end if X end if X X if ( ikey .eq. smg$k_trm_ctrlz .or. X . ikey .eq. smg$k_trm_f10 .or. X . ikey .eq. smg$k_trm_lowercase_x .or. X . ikey .eq. smg$k_trm_uppercase_x .or. X . ikey .eq. smg$k_trm_lowercase_e .or. X . ikey .eq. smg$k_trm_uppercase_e .or. X . ikey .eq. smg$k_trm_lowercase_q .or. X . ikey .eq. smg$k_trm_uppercase_q .or. X . ikey .eq. smg$k_trm_enter .or. X . ikey .eq. smg$k_trm_cr .or. X . code .eq. 91 ) then X finished = .true. X X else if ( ikey .eq. smg$k_trm_up ) then X ii = cur_level X jj = cur_line - 1 X do while( jj .ge. 1 .and. node_pointer(ii,jj) .eq. 0 ) X jj = jj - 1 X end do X if ( jj .ge. 1 ) cur_line = jj X call update_screen( old_line, old_level ) X X else if ( ikey .eq. smg$k_trm_down ) then X ii = cur_level X jj = cur_line + 1 X do while( node_pointer(ii,jj) .eq. 0 .and.jj .le. num_lines) X jj = jj + 1 X end do X if ( jj .le. num_lines ) cur_line = jj X call update_screen( old_line, old_level ) X X else if ( ikey .eq. smg$k_trm_right ) then X ii = cur_level + 1 X jj = cur_line X do while( node_pointer(ii,jj) .eq. 0 .and.ii.le. MAX_LEVELS) X ii = ii + 1 X end do X if ( ii .le. MAX_LEVELS ) cur_level = ii X call update_screen( old_line, old_level ) X X else if ( ikey .eq. smg$k_trm_left .and. X . cur_level .ge. 1 ) then X ii = cur_level - 1 X jj = cur_line X do while( node_pointer(ii,jj) .eq. 0 .and. jj .ge. 1 ) X jj = jj - 1 X end do X if ( jj .ge. 1 ) then X cur_level = ii X cur_line = jj X end if X call update_screen( old_line, old_level ) X X else if ( ikey .eq. smg$k_trm_lowercase_b .or. X . ikey .eq. smg$k_trm_uppercase_b ) then X ii = MAX_LEVELS X cur_line = num_lines X do while( node_pointer(ii,cur_line) .eq. 0 .and. ii .ge. 1 ) X ii = ii - 1 X end do X cur_level = ii X call update_screen( old_line, old_level ) X X else if ( ikey .eq. smg$k_trm_lowercase_t .or. X . ikey .eq. smg$k_trm_uppercase_t ) then X cur_line = 1 X cur_level = 0 X call update_screen( old_line, old_level ) X X else if ( code_type .eq. 1 .or. X . ikey .eq. smg$k_trm_lowercase_c .or. X . ikey .eq. smg$k_trm_uppercase_c ) then X call create_directory( code ) X X else if ( code_type .eq. 2 .or. X . ikey .eq. smg$k_trm_lowercase_r .or. X . ikey .eq. smg$k_trm_uppercase_r ) then X call rename_directory( 20 ) X X else if ( code_type .eq. 3 .or. X . ikey .eq. smg$k_trm_lowercase_m .or. X . ikey .eq. smg$k_trm_uppercase_m ) then X call rename_directory( 30 ) X X else if ( code_type .eq. 4 .or. X . ikey .eq. smg$k_trm_lowercase_d .or. X . ikey .eq. smg$k_trm_uppercase_d ) then X call delete_directory( code ) X X else if ( code_type .eq. 5 .or. X . ikey .eq. smg$k_trm_lowercase_p .or. X . ikey .eq. smg$k_trm_uppercase_p ) then X call hardcopy( code ) X X else if ( code_type .eq. 6 .or. X . ikey .eq. smg$k_trm_lowercase_s .or. X . ikey .eq. smg$k_trm_uppercase_s ) then X call record_structure( .true. ) X X else if ( code_type .eq. 7 .or. X . ikey .eq. smg$k_trm_lowercase_o .or. X . ikey .eq. smg$k_trm_uppercase_o ) then X call change_options( code ) X X else if ( code_type .eq. 8 .or. X . ikey .eq. smg$k_trm_pf2 .or. X . ikey .eq. smg$k_trm_help .or. X . ikey .eq. smg$k_trm_lowercase_h .or. X . ikey .eq. smg$k_trm_uppercase_h ) then X call help( code ) X end if X X call smg$set_cursor_abs( window2, cur_line, cur_level*17+1 ) X X end do X X call exit_swing X end $ GoSub Convert_File $ Exit