nagy%warner.hepnet@Lbl.Arpa (08/20/87)
The following VMS_SHAR file contains a modified version of SWING.FOR, the main program module for the recently distributed version of SWING, and SWINGTABLES.CLD, my version of the DCL command tables for SWING. I have made some modifications so that this version of SWING can be defined as a foreign DCL command since the definition $ SWING :== $disk:[directory]SWING is a LOT faster to execute than $ SET COMMAND disk:[directory]SWINGTABLES and is easier on system resources (memory). I have submitted an article to the PageSwapper describing how to make this change in general and why it is a good thing to do. I have written several utilities which are defined as foreign commands but which have DCL command syntax and use the CLI$ routines to decode the command line (using the DCL parser makes it very easy to write such things). I have also modified some utilities from past VAX SIG tapes in the same manner. Anyway, unpack the SHAR file, compile the modules and add to the library and relink: $ FORTRAN SWING $ SET COMMAND/OBJECT SWINGTABLES !Makes .OBJ file $ LIBRARY SWING SWING,SWINGTABLES $ LINK/EXECUTABLE=SWING SWING/LIBRARY/INCLUDE=SWING ....................... Cut between dotted lines and save ...................... $!.............................................................................. $! VAX/VMS archive file created by VMS_SHAR V-4.04 12-Aug-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 Thursday 20-AUG-1987 06:31:14.61 $! $! It contains the following 2 files: $! SWING.FOR SWINGTABLES.CLD $!============================================================================= $ 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;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="SWING.FOR" $ Check_Sum_is=1195880454 $ 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: Frank J Nagy of Fermilab X* X* Changes: Modified main routine to pick up command line as foreign X* command, add the SWING verb and parse it with DCL so that X* the /START qualifier can be checked for. X* X* Date: 16-AUG-1987 X* X*----------------------------------------------------------------------- X X program swing X X include 'swing.cmn' X include '($smgdef)' 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 External Swing_Tables X Integer*4 Lib$Get_Foreign, Cli$Dcl_Parse, Lib$Get_Input, sts X Character*255 CmdLine X Integer*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 sts = Lib$Get_Foreign( CmdLine,, CL_Len) X IF (.NOT. sts) CALL Lib$Signal( %VAL(sts)) X IF (CL_Len .gt. 0) Then X sts = Cli$Dcl_Parse( 'SWING '//CmdLine(1:CL_Len), X 1 Swing_Tables, Lib$Get_Input) X Else X sts = Cli$Dcl_Parse( 'SWING ', Swing_Tables, Lib$Get_Input) X EndIf X IF (.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_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_enter .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 $ File_is="SWINGTABLES.CLD" $ Check_Sum_is=1029839912 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY XModule Swing_Tables XIdent "V1.0" XDefine Verb SWING X Qualifier START, Placement=Global, Nonnegatable, Value(Default=Current) $ GoSub Convert_File $ Exit = Frank J. Nagy "VAX Guru" = 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