[comp.os.vms] Modified SWING modules to allow use as a foreign DCL command

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