🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: vmsnet.sources
Article #83

UBBS, part 11/12

#83
From: Dick Munroe
Date: Fri, 21 Aug 1992 20:23
1692 lines
49381 bytes
Submitted-by: munroe@dmc.com (Dick Munroe)
Posting-number: Volume 3, Issue 119
Archive-name: ubbs/part11
-+-+-+-+-+-+-+-+ START OF PART 11 -+-+-+-+-+-+-+-+
XEnter name of file to download, ? for list, or <cr> to exit. ABC.XYZ`0D
XLast file added: 24-Jul-1986
XView (A)ll or (U)napproved files? `5BU`5D`0D
X    Files since:  1-Jul-1985
X(D)ownload, (U)pload, (H)elp or (E)xit? `5Bexit`5D D`0D
XArea? APP`0D
XEnter name of file to download, ? for list, or <cr> to exit. ABC.XYZ`0D
XLast file added: 12-Feb-1986
XView (A)ll or (U)napproved files? `5BU`5D`0D
X    Files since:  1-Jul-1985
XDDD2.1               23-Jul-1986  Size:     0  Ubinar    Accesses:    0
X
X     Keywords: a By:JASON FARNON                 `20
X
Xa
Xa
XCommand?D`0D
XDeleted`0D
XSTAR.TREK            18-Jul-1986  Size:    48  Uascii    Accesses:    0
X
X     Keywords: ASCII-GAME By:MIKE SHIRLEY                 `20
X
XSTAR TREK GAME-EXEC-SAVE-AND RUN.COMPATABLE W/3.3 OR PRODOS.
XCommand?X`0D
X(D)ownload, (U)pload, (H)elp or (E)xit? `5Bexit`5D `0D
X11:20:38-05 Command (B,C,E,F,G,H,K,M,P,R,S,U,W,X,?)?G`0D
X
XThank you for calling UBBS
X  BBS          logged out at 24-JUL-1986 11:20:41.34
$ CALL UNPACK [.UTILITY]SYSOP.HOWTO;2 134575356
$ create 'f'
XC---------------------------------------------------------------------------
V--
XC`09Program used to provide LSWEEP and some ARC functionality on VMS
XC
XC`09VMSsweep will handle .LBR and .ARC* files and can be used to extract`20
XC`09members or just display them on the terminal if they are non binary
XC
XC`09Restrictions:`20
XC`09`09The VMS file must have a maximum record length of 4096 bytes.`20
XC`09`09The library file (.ARC* or .LBR) can only have 200 members
XC
XC`09Functions provided:
XC`09`09View a member at the terminal -squeezed or unsqueezed
XC`09`09Extract a member to a file (Max 510 byte records)`20
XC`09`09List the directory of a library file
XC`09`09New library file requested
XC
XC`09Author:
XC`09`09John T. Coburn`09`09Digital Equipment, Cleveland
XC`09`09Copyright (c) 1986
XC
XC`09Please feel free to distribute this program by any noncommercial
XC`09means to anyone who can use it.
XC
XC`09* ARC is Copyright 1985,1986 by System Enhancements Associates
XC
XC`09This program was in general based on the Turbo Pascal program`20
XC`09DEARC that is in the public domain. Also referenced ARC sources
XC`09from System Enhancement Associates
XC
XC---------------------------------------------------------------------------
V--
XC---------------------------------------------------------------------------
V--
XC`09Modification History:
XC
XC`09Vers`09Date`09`09Who`09`09Comments
XC
XC`09V2.8`0912 Dec 86`09John Coburn`09Fix problem when running
XC`09`09`09`09`09`09in a subprocess
XC`09`09`09`09Walt Lamia`09Extraction of all members
XC
XC`09V2.7`0922 Nov 86`09John Coburn`09Add CRC checking for LBRs
XC
XC`09V2.6`0930 Oct 86`09John Coburn`09Add CRC checking for ARCs
XC
XC`09V2.5`0929 Oct 86`09John Coburn`09Fixed bug that occurred
XC`09`09`09`09`09`09when extracting unsqueezed
XC`09`09`09`09`09`09binary files. Also fixed
XC`09`09`09`09`09`09boundary condition problem`20
XC`09`09`09`09`09`09in decompression table that
XC`09`09`09`09`09`09caused ARC extracts to fail.
XC
XC`09V2.4`09 6 Sep 1986`09John Coburn`09Change to allow single CR or LF
XC`09`09`09`09Glenn Everharts`09to be a record terminator.
XC`09`09
XC`09V2.3`09 1 Mar 1986`09John Coburn`09Removed unreliable CRC checking
XC
XC`09V2.2`09 ???`09`09John Coburn`09Enhance ARC functions
XC
XC`09V2.1`09 ???`09`09John Coburn`09Add ARC functionality
XC
XC`09V2.0`09 1 Feb 1986`09John Coburn`09First released version
XC---------------------------------------------------------------------------
V--
X
X `09Program VAX_ARC_LBR
X
X`09Implicit None
X`0C`0A
X`09Character`09For_IOS(68)*30
X`09Common`09/ForIOS/ For_IOS
X
X!`20
X! `09Define FORTRAN error numbers for use with IOSTAT and ERRSNS
X!`20
X`09Data For_IOS /68*' '/
X`09Data FOR_IOS ('00000011'X ) /' syntax error in NAMELIST input'/
X`09Data FOR_IOS ('00000012'X ) /' too many values for NAMELIST variable'/
X`09Data FOR_IOS ('00000013'X ) /' invalid reference to variable'/
X`09Data FOR_IOS ('00000014'X ) /' REWIND error '/
X`09Data FOR_IOS ('00000015'X ) /' duplicate file specifications '/
X`09Data FOR_IOS ('00000016'X ) /' input record too long '/
X`09Data FOR_IOS ('00000017'X ) /' BACKSPACE error '/
X`09Data FOR_IOS ('00000018'X ) /' end-of-file during read '/
X`09Data FOR_IOS ('00000019'X ) /' record number outside range '/
X`09Data FOR_IOS ('0000001A'X ) /' OPEN or DEFINE FILE required'/
X`09Data FOR_IOS ('0000001B'X ) /' too many records in I/O statement'/
X`09Data FOR_IOS ('0000001C'X ) /' CLOSE error '/
X`09Data FOR_IOS ('0000001D'X ) /' file not found '/
X`09Data FOR_IOS ('0000001E'X ) /' open failure '/
X`09Data FOR_IOS ('0000001F'X ) /' mixed file access modes '/
X`09Data FOR_IOS ('00000020'X ) /' invalid logical unit number '/
X`09Data FOR_IOS ('00000021'X ) /' ENDFILE error '/
X`09Data FOR_IOS ('00000022'X ) /' unit already open '/
X`09Data FOR_IOS ('00000023'X ) /' segmented record format error '/
X`09Data FOR_IOS ('00000024'X ) /' attempt to access non-existent record'/
X`09Data FOR_IOS ('00000025'X ) /' inconsistent record length '/
X`09Data FOR_IOS ('00000026'X ) /' error during write '/
X`09Data FOR_IOS ('00000027'X ) /' error during read '/
X`09Data FOR_IOS ('00000028'X ) /' recursive I/O operation '/
X`09Data FOR_IOS ('00000029'X ) /' insufficient virtual memory '/
X`09Data FOR_IOS ('0000002A'X ) /' no such device '/
X`09Data FOR_IOS ('0000002B'X ) /' file name specification error '/
X`09Data FOR_IOS ('0000002C'X ) /' inconsistent record type'/
X`09Data FOR_IOS ('0000002D'X ) /' keyword value error in OPEN statement '/
X`09Data FOR_IOS ('0000002E'X ) /' inconsistent OPEN/CLOSE parameters'/
X`09Data FOR_IOS ('0000002F'X ) /' write to READONLY file '/
X`09Data FOR_IOS ('00000030'X ) /' invalid arg to FORTRAN RTL'/
X`09Data FOR_IOS ('00000031'X ) /' invalid key specification'/
X`09Data FOR_IOS ('00000032'X ) /' inconsistent key change, duplicate key'/
X`09Data FOR_IOS ('00000033'X ) /' inconsistent file organization'/
X`09Data FOR_IOS ('00000034'X ) /' specified record locked'/
X`09Data FOR_IOS ('00000035'X ) /' no current record'/
X`09Data FOR_IOS ('00000036'X ) /' REWRITE error'/
X`09Data FOR_IOS ('00000037'X ) /' DELETE error'/
X`09Data FOR_IOS ('00000038'X ) /' UNLOCK error'/
X`09Data FOR_IOS ('00000039'X ) /' FIND error'/
X`09Data FOR_IOS ('0000003B'X ) /' list-directed I/O syntax error '/
X`09Data FOR_IOS ('0000003C'X ) /' infinite format loop '/
X`09Data FOR_IOS ('0000003D'X ) /' format/variable-type mismatch '/
X       `09Data FOR_IOS ('0000003E'X ) /' syntax error in format '/
X`09Data FOR_IOS ('0000003F'X ) /' output conversion error '/
X`09Data FOR_IOS ('00000040'X ) /' input conversion error '/
X`09Data FOR_IOS ('00000042'X ) /' output statement overflows record '/
X`09Data FOR_IOS ('00000043'X ) /' input requires too much data '/
X`09Data FOR_IOS ('00000044'X ) /' variable format expression error '/
X`0C`0A
X`09Byte`09`09ArcMark, FBuf(128)
X`09Integer*2`09LBR_Recognize
X`09Integer`09`09Max_Num_Members
X
X`09Parameter ( ArcMark = 26 )
X`09Parameter ( LBR_recognize = 'FF76'x )
X`09Parameter ( Max_Num_Members = 200 )
X
X`09Character`09File_Name*12, In_FILE_NAME*50, ANS*1, Lib_Type*1
X`09Character`09Technique*10, Techs(10)*10, Actual_Len_Str*8
X`09Data`09Techs `09/ 2*'    --', '  Packed', ' Squeezed',`20
X`091`09`09  3*'Crunch(un)', ' Crunched',`20
X`092`09`09 2*' Unknown' /
X
X`09Character`09Member_NAMES(Max_Num_Members)*12
X`09Character`09Mem_Date(Max_Num_Members)*8
X`09Character`09Mem_Time(Max_Num_Members)*8
X
X`09Integer`09`09First_Byte_Arr(Max_Num_Members)
X`09Integer`09`09HDR_Vers(Max_Num_Members), Act_Len(Max_Num_Members)
X`09Integer`09`09Num_Bytes_Arr(Max_Num_Members)
X`09Integer*2`09CRCS(Max_Num_Members)
X
X`09Integer`09`09Temp
X
X`09Byte`09`09DIR_ENTRY(32)
X
X`09Byte`09`09STATUS, NAME(8), EXTEN(3), LBR_Filler(6), F1, F2
X`09Integer*2`09INDX, NSECTS, CRC, Frec, Crea_Date, Upd_Date
X`09Integer*2`09Crea_Time, Upd_Time
X`09Integer`09`09Num_Members, NBlks, Ivcr
X
X`09Common`09/LBR_Dire/ STATUS, NAME, EXTEN, INDX, NSECTS, CRC,`20
X`091`09`09   Crea_Date, Upd_Date, Crea_Time, Upd_Time,`20
X`091`09`09   LBR_Filler, F1, F2
X
X`09Equivalence`09( DIR_ENTRY(1), STATUS )
X`09Equivalence`09( Frec, F1 )
X
X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
X`09Integer`09 `09Out_Index, Out_Length, Out_Num
X`09Byte`09`09In_Buf(4096), Out_Buf(512)
X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
X
X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
X`09Integer`09`09Remaining_Size
X`09Integer*2`09CRC_Val
X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
V0
X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
X
X`09Integer*2`09I2
X`09Integer`09`09Q, I, J, K, M, N, DIR_SECTS, ISTAT, Ios
X`09INTEGER`09`09N1,N2,NN
X
X`09Logical*1`09Squeezed, File_OK
X`09Byte`09`09Tbytes(13), C, HDR_Ver
X`0C`0A
XC`09Start of Code
X
X`09Type *, ' '
X`09Type *, 'V M S   S w e e p   V2.8'
X`09Type *, 'for .LBR and .ARC files'
X`09Type *, ' '
X
X10`09Continue
X`09Last_In = 0
X`09First_In = 0
X`09Out_Index = 1
X`09In_FILE_NAME = ' '
X`09View_Cr = .False.
X`09Type 1020,'$Enter "library": '
X`09Accept 1021, Q, In_FILE_NAME(1:Q)`20
X`09If ( Q .eq. 0 ) GoTo 800
X
X`09K = Index( In_File_Name(1:Q), '.' )
X`09If ( K .eq. 0 ) Then
X`09  Lib_Type = ' '
X`09Else
X`09  Lib_Type = In_File_Name(K+1:K+1)
X`09EndIf
X
X`09If ( Lib_Type .eq. 'l' ) Lib_Type = 'L'
X`09If ( Lib_Type .eq. 'a' ) Lib_Type = 'A'
X
X20`09Continue
X`09If ( Lib_Type .ne. 'A' .and. Lib_Type .ne. 'L' ) Then
X`09  Type 1020, '$ARC or LBR file `5BL`5D: '
X`09  Accept 1021, I, Lib_Type
X`09  If ( I .eq. 0 ) Lib_Type = 'L'
X`09  If ( Lib_Type .eq. 'l' ) Lib_Type = 'L'
X`09  If ( Lib_Type .eq. 'a' ) Lib_Type = 'A'
X`09  If ( Lib_Type .ne. 'A' .and. Lib_Type .ne. 'L' ) Then
X`09    Type *, '--- Invalid File type entered: ', Lib_Type
X`09    GoTo 20
X`09  EndIf
X`09  If ( k .eq. 0 ) Then
X`09    If ( Lib_Type .eq. 'A' )In_File_Name(Q+1:) = '.ARC'
X`09    If ( Lib_Type .eq. 'L' )In_File_Name(Q+1:) = '.LBR'
X`09  EndIf
X`09EndIf
X
X`09Lbr_Flg = .True.
X`09If ( Lib_Type .eq. 'A' ) LBR_Flg = .False.
X
X`09Open( Unit=2, File=In_File_Name, Status='OLD', ReadOnly,`20
X`091`09DefaultFile='.', Err=900, IoStat=IoS )
X
X`09Call Position_Lib( 1 )
X`09N = 0
X
X`09If ( .Not. Lbr_Flg ) GoTo 75
X`0C`0A
X
XC`09Handle the .LBR file Specified
X
X50`09Continue
X
X`09Call Get_Byte_Knt( DIR_ENTRY, 32 )
X
X`09File_OK = .True.
X`09Do I=1,8
X`09  If ( Name(I) .ne. ' ' ) File_OK = .False.
X`09EndDo
X`09Do I=1,3
X`09  If ( EXTEN(I) .ne. ' ' ) File_OK = .False.
X`09EndDo
X
X`09If ( .Not. File_OK ) Then
X`09  Write( 6, * ) '+++ Requested file is not an LBR file +++'
X`09  Write( 6, * ) '+++ Invalid directory format for LBR  +++'
X`09  GoTo 700
X`09EndIf
X
X`09DIR_SECTS = NSECTS`09`09! How many directory segments are there
X
X`09If ( DIR_SECTS .GT. 1 ) Then
X`09   Write( 6, 1030 ) '++ There are ', DIR_SECTS,`20
X`091`09' directory segments in ' // In_File_name(1:Q) // ' ++'
X`09Else
X`09   Write( 6, 1030 ) '++ There is ', DIR_SECTS,`20
X`091`09' directory segment in ' // In_File_name(1:Q) // ' ++'
X`09EndIf
X
X`09Do 70 I = 2, DIR_SECTS*4
X`09    Call Get_Byte_Knt( DIR_ENTRY, 32 )
X`09    `09If ( STATUS .eq. 0 ) Then
X`09`09    If ( N .eq. max_num_members ) goto 100
X`09`09    N = N + 1
X`09`09    Member_Names(N) = ' '
X`09`09    M = 1
X`09`09    Do While ( M .le. 8 .and. Name(M) .ne. ' ' )
X`09`09`09    Member_Names(N)(M:M) = Char( Name(M) )
X`09`09`09    M = M + 1
X`09`09    EndDo
X`09`09    Member_Names(N)(M:M) = '.'
X`09`09    Hdr_Vers(N) = 10`09`09`09! Special blank
X`09`09    Do K=1,3
X`09`09`09    Member_NAMES(N)(M+K:M+K) = Char( EXTEN(K) )
X`09`09    EndDo
X`09`09    Temp = NSECTS
X`09`09    Num_Bytes_ARR(N) = Temp * 128
X`09`09    Act_Len(N) = Num_Bytes_ARR(N)`20
X`09`09    Temp = Indx
X`09`09    First_Byte_arr(N) = Temp * 128 + 1
X`09`09    CRCS(N) = CRC
X`09`09    If ( Crea_Date .ne. 0 ) Then
X`09`09`09Call LBR_Date_Str( 78, Crea_Date, Mem_Date(N) )
X`09`09    Else
X`09`09`09Mem_Date(N) = '   --'
X`09`09    EndIf
X`09`09    If ( Crea_Time .ne. 0 ) Then
X`09`09`09Call Time_Str( Crea_Time, Mem_Time(N) )
X`09`09    Else
X`09`09`09Mem_Time(N) = '  -'
X`09`09    EndIf
X`09    EndIf
X70`09Continue
X
XC`09Now lets determine how many of the members are squeezed
X
X`09Do I = 1, N
X`09  Call Position_Lib( First_Byte_Arr(I) )
X`09  Call Get_Byte_KNT( I2, 2 )`09`09! Read first 2 bytes
X`09  If ( I2 .eq. LBR_recognize ) Then
X`09    Hdr_Vers(I) = 4`09`09`09! Squeezed`20
X`09    Act_Len(I) = 0`09`09`09! Unknown actual size
X`09    Call Get_Byte_Knt( I2, 2 )`09`09! Get past the CRC
X`09    File_Name = ' '`20
X`09    Call Get_Byte( C )`09`09`09! Get the member orig name
X`09    K = 1
X`09    Do While ( C .ne. 0 )
X`09      File_Name(K:K) = Char( C )
X`09      Call Get_Byte( C )
X`09      K = K + 1
X`09    EndDo
X`09    Member_Names(I) = File_Name
X`09  Else
X`09    Hdr_Vers(I) = 2`09`09`09! Not squeezed
X`09  EndIf
X`09EndDo
X
X`09Goto 100
X`0C`0A
X
XC`09Read the .ARC file to get 'directory' type info
X
X75`09Continue`09`09! Get info for .ARC file
X
X`09Type *, 'Gathering "directory" information for ', In_File_Name(1:Q)
X`09Type *, ' '
X
X`09Call Get_Byte( C )
X
X`09Do While ( C .ne. -1 )
X`09  If ( C .ne. ArcMark ) Then`09`09! Not an ARC file
X`09    I = 0
X`09    Do While ( C .ne. ArcMark .and. I .lt. 10 )
X`09      Call Get_Byte( C )
X`09      I = I + 1
X`09    EndDo
X`09    If ( I .ge. 10 ) Then
X`09      Write( 6, * ) '+++ Requested file not an ARC file +++'
X`09      Write( 6, * ) '+++ Could not find the mark of ARC +++'
X`09      Goto 700
X`09    Else
X`09      Write( 6, * ) '+++ Bad Header encountered +++'
X`09      Write( 6, 1030 ) '+++ Skipped ', I, ' bytes  +++'
X`09    EndIf
X`09  EndIf
X
X`09  Call Get_Byte( Hdr_Ver )
X`09  If ( Hdr_Ver .lt. 0 ) Then `09`09! invalid header
X`09   Type *, 'Cannot handle this version of .ARC file:', Hdr_ver
X`09   goto 700
X`09  EndIf
X`09  If ( Hdr_Ver .eq. 0 ) Then `09`09! special endoffile
X`09    GoTo 100
X`09  EndIf
X
X`09  If ( N .eq. max_num_members ) goto 100
X`09  N = N + 1
X
X`09  Call Get_Byte_Knt( TBytes, 13 )
X
X`09  Member_NAMES(N) = ' '
X`09  M = 1
X`09  Do While ( TBytes(M) .ne. 0 )
X`09    Member_NAMES(N)(M:M) = Char( TBytes(M) )
X`09    M = M + 1
X`09  EndDo
X
X`09  Call Get_Byte_Knt( Num_Bytes_Arr(N), 4 )
X`09  Call Get_Byte_Knt( Crea_Date, 2 )
X`09  If ( Crea_Date .ne. 0 ) Then
X`09    Call ARC_Date_Str( Crea_Date, Mem_Date(N) )
X`09  Else
X`09    Mem_Date(N) = '   --'
X`09  EndIf
X`09  Call Get_Byte_Knt( Crea_Time, 2 )`09`09! Discard time`20
X`09  If ( Crea_Time .ne. 0 ) Then
X`09    Call Time_Str( Crea_Time, Mem_Time(N) )
X`09  Else
X`09    Mem_Time(N) = '  -'
X`09  EndIf
X`09  Call Get_Byte_Knt( CRCs(N), 2 )
X
X`09  If ( Hdr_Ver .gt. 1 ) Then
X`09    Call Get_Byte_Knt( Act_Len(N), 4 )`09`09! expanded length
X`09  Else
X`09    Act_Len(N) = Num_Bytes_Arr(N)
X`09  EndIf
X
X`09  Hdr_Vers(N) = Hdr_Ver
X`09  First_Byte_arr(N) = Buf_Index + First_In - 1
X
X`09  Call Position_Lib( Num_Bytes_Arr(N) + First_Byte_Arr(N) )
X
X`09  Call Get_Byte( C )
X
X`09EndDo
X`0C`0A
X
XC`09Now display the directory for this library
X
X100`09Continue
X`09Num_Members = N
X
X150`09Continue
X`09If ( Num_Members .GT. 1 ) Then
X`09   Write( 6, 1030 ) '++ There are ', Num_Members,`20
X`091`09`09`09' members ++'
X`09Else
X`09   Write( 6, 1030 ) '++ There is ', Num_Members, ' member ++'
X`09EndIf
X
X`09Write( 6, 1020 ) ' '
X`09Write( 6, 1008 )
X`09Write( 6, 1009 )
X`09Do I = 1, Num_Members
X`09  K = Index( Member_Names(I), '.' )`09`09! Make sure that`20
X`09  If ( K .eq. 0 ) Then`09`09`09`09! that created files
X`09    K = 1`09`09`09`09`09! don't get a .DAT
X`09    Do While ( Member_Names(I)(K:K) .ne. ' ' )`09! extension when
X`09      K = K + 1`09`09`09`09`09! extracting a member
X`09    EndDo`09`09`09`09`09! that has no extension
X`09    Member_Names(I)(K:K) = '.'
X`09  EndIf
X`09  NBLKS = Num_Bytes_Arr(I) / 512
X`09  If ( NBLKS*512 .ne. Num_Bytes_ARR(I) ) Nblks = NBlks + 1
X`09  Technique = Techs( Hdr_Vers(I) )
X`09  Actual_Len_Str = '    ??'
X`09  If ( Act_Len(I) .ne. 0 ) Then
X`09    Write( Actual_Len_Str, 1001, Err=160 ) Act_Len(I)
X`09  EndIf
X160`09  Write( 6,1010 ) I, Member_NAMES(I), Num_Bytes_Arr(I), CRCS(I),
X`091`09`09  Mem_Date(I), Mem_Time(I)(1:5), Technique,`20
X`091`09`09  Actual_Len_Str
X`09EndDo
X`0C`0A
X
Xc`09Now lets see if the user wants to extract any members
X
X200`09Continue
X`09Type 1020, ' '
X`09Type 1020, '$Enter command (? for list) `5BX`5D: '
X`09Accept 1020, ANS
X`09If ( ANS .eq. ' ' ) ANS = 'X'
X`09If ( ANS .eq. 'x' .or. ANS .eq. 'X' ) Goto 800
X
X`09View_flg = .False.
X`09Extr_flg = .False.
X`09Bin_flg  = .False.
X`09Ivcr = 0
X
X`09If ( ANS .eq. '?' ) Goto 230
X`09If ( ANS .eq. 'l' .or. ANS .eq. 'L' ) GoTo 150
X`09If ( ANS .eq. 'n' .or. ANS .eq. 'N' ) GoTo 700
X   `09If ( ANS .eq. 'i' .or. ANS .eq. 'I' ) ivcr=-1
X   `09If ( ANS .eq. 'k' .or. ANS .eq. 'K' ) ivcr=+1
X`09If ( ANS .eq. 'v' .or. ANS .eq. 'V' ) View_flg = .True.
X`09If ( ANS .eq. 'e' .or. ANS .eq. 'E' ) Extr_flg = .True.
X
X`09If ( View_flg .or. Extr_flg ) GoTo 250
Xc Allow K and I modes to set carriage control for terminal
Xc output...
X`09If(ivcr.eq.0)goto 207
X`09If(ivcr.eq.-1)View_cr=.false.
X`09If(ivcr.eq.1)View_cr=.True.
X`09Goto 200
X207`09Continue
X
X210`09Type *, '-- Illegal Command --'
X
X230`09Continue
X`09Type 1020, ' '
X`09Type 1020, ' Commands available:'
X`09Type 1020, ' '
X`09Type 1020, '   E - Extract a member to a file'
X`09Type 1020, '   L - List the directory again'
X`09Type 1020, '   N - Get a new library file'
X`09Type 1020, '   V - View member at terminal'
X`09Type 1020, '   K - Convert isolated CR or LF to CRLF'
X`09Type 1020, '   I - Leave isolated CR or LF alone (image)'
X`09Type 1020, '   X - No option wanted (exit)'
X`09Type 1020, '   ? - Display this list'
X
X`09GoTo 200
X
X250`09Continue
X`09Type 1400
X`09Accept 1410, N
X
X`09If ( N .le. 0 ) Then
X`09  Type *, '-- Illegal member number --'
X`09  Goto 250
X`09EndIf
X
X`09IF (N .GT. NUM_MEMBERS) THEN
X`09   N1 = 1
X`09   N2 = NUM_MEMBERS
X`09ELSE
X`09   N1 = N
X`09   N2 = N
X`09ENDIF
X
X`09If ( .Not. LBR_Flg ) GoTo 500
X`0C`0A
X
XC`09Now handle selection from .LBR file
X
X300`09Continue
X
X`09DO N = N1, N2
X
X`09Call Position_Lib( First_Byte_Arr(N) )
X`09Remaining_Size = Num_Bytes_Arr(N)
X
X`09CRC_Val = 0
X
X`09If ( Hdr_Vers(N) .eq. 4 ) Then
X`09  Squeezed = .True.
X`09  Call LBR_Init_UnSq`09`09`09`09! Init the decode tree
X`09Else
X`09  Squeezed = .False.
X`09EndIf
X
X`09Call Open_Ext_File( File_Name )`09`09! Open the output LUN
X
X`09If ( Squeezed ) Then
X`09  Call Get_Char_Sq( I2 )
X`09  Do While (( I2 .ne. -1 ) .and. .Not. Cancel_Op )
X`09    Call Put_Char_UnComp( I2 )
X`09    Call Get_Char_Sq( I2 )
X`09  EndDo
X`09Else
X`09  Call Get_Char( I2 )
X`09  Do While (( I2 .ne. -1 ) .and. .Not. Cancel_op )
X`09    Call Put_Char_CRC( I2 )
X`09    Call Get_Char( I2 )
X`09  EnDDo
X`09EndIf
X
X`09If (Remaining_Size.gt.0) Then
X`09  Call Get_Char_Knt( FBuf, Remaining_Size)`09! Finish CRC
X`09EndIf
X
X`09Call Close_Ext_File( CRCS(N) )
X
X`09ENDDO
X
X`09GoTo 200
X`0C`0A
X
XC`09This code is for the .ARC library format
X
X500`09Continue
X
X`09DO N = N1, N2
X
X`09Call Position_Lib( First_Byte_Arr(N) )
X`09Remaining_Size = Num_Bytes_Arr(N)
X
X`09CRC_Val = 0
X
X`09GoTo ( 510, 510, 520, 530, 590, 590, 590, 540 ), Hdr_Vers(N)
X`09Type *, '--- Illegal or Unknown ARC Header value: ', Hdr_Vers(N)
X`09GoTo 200
X
X510`09Continue `09`09! Extract member that has no compression
X`09Call Open_Ext_File( Member_Names(N) )
X
X`09Call Get_Char( I2 )
X`09Do While (( I2 .ne. -1 ) .and. .Not. Cancel_Op )
X`09  Call Put_Char_CRC( I2 )
X`09  Call Get_Char( I2 )
X`09EnDDo
X`09Goto 595
X
X520`09Continue`09`09! Extract member that uses DLE compression
X`09Call Open_Ext_File( Member_Names(N) )      `20
X
X`09Call Get_Char( I2 )
X`09Do While (( I2 .ne. -1 ) .and. .Not. Cancel_Op )
X`09  Call Put_Char_UnComp( I2 )
X`09  Call Get_Char( I2 )
X`09EnDDo
X`09Goto 595
X
X530`09Continue`09`09! Extract Member that uses Huffman squeeze
X`09Call Open_Ext_File( Member_Names(N) )
X
X`09Type *, ' '
X`09Type *, '--- Warning --- File may not extract properly ---'
X`09Type *, ' '
X
X`09Call Init_Unsq
X`09Call Get_Char_Sq( I2 )
X`09Do While (( I2 .ne. -1 ) .and. .Not. Cancel_Op )
X`09  Call Put_Char_UnComp( I2 )
X`09  Call Get_Char_Sq( I2 )
X`09EnDDo
X`09Goto 595
X
X540`09Continue
X`09Call Open_Ext_File( Member_Names(N) )
X`09Call DeComp_LZW_Var
X`09Goto 595
X
X590`09Continue
X`09Type *, 'Not implemented yet, Need a newer version'
X`09Type *, '(Also, old crunch options not supported.)'
X`09GoTo 200
X
X595`09Continue
X`09Call Close_Ext_File( CRCS(N) )
X
X`09ENDDO
X
X`09GoTo 200
X
Xc`09Now lets setup for another lib file`20
X
X700`09Continue
X`09Close( Unit=2 )`20
X`09Goto 10
X
X800`09Continue
X
X`09Call Exit
X`0C`0A
X
X900`09Continue
X`09If ( IOS .gt. 68 ) Then
X`09  Type *,'Unkown error on OPEN:', IOS
X`09Else`20
X`09  Type *, 'Error on OPEN: ', For_IOS( IOS )
X`09EndIf
X
X`09Call Exit
X
X1000`09Format( ' ', a, '     ', i4 )
X1001`09Format( I8 )
X1008`09Format( '   #  Member Name   # Bytes  CRC     Date    Time   ',
X`091`09'Stor. Type  Actual Len' )
X1009`09Format( ' ---- ------------  -------  ----  --------  -----  ',
X`091`09'----------  ----------' )
X1010`09Format( ' ', I3, '. ', a, '  ', I7, '  ', Z4.4, 4( '  ', A ) )
X
X1011`09Format( ' Extracting: ', a, '.', a, ', First Byte: ', I7,`20
X`091`09', # Bytes: ', I7 )
X1020`09Format( a )
X1021`09Format( q, a )
X1030`09Format( ' ', a, I4, a )
X1110`09Format( ' Member#', I3, '. ', a,`20
X`091`09', First: ', i7, ', Number: ', i7  )
X1111`09Format( ' ', A, I7 )
X1400`09Format( '$Enter member number (9999 for all) : ' )
X1410`09Format( I3 )
X
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine called to open an output LUN for processing a member
XC`09of library (eitrher .LBR or .ARC)
XC                                                  `20
XC`09Inputs:
XC`09`09File_Name`09Member filename
XC
XC`09Outputs:
XC`09`09The Bin_Flg will be set if the extension of the file is
XC`09`09.EXE, .BIN, .COM, .CMD, .OVR etc...
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Open_Ext_File( File_Name )
X
X`09Implicit None
X
X`09Logical*1`09File_Flg, Squeezed, Ctrlz_Flg
X
X`09Character`09File_Name*(*), Carriage*4, ANS, File_Ext*3
X`09Character`09Open_Name*12
X
X`09Integer`09`09K, I, IOS, Record_Length
X
X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
X`09Integer`09`09Remaining_Size
X`09Integer*2`09CRC_Val
X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
V0
X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
X
X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
X`09Integer`09   `09Out_Index, Out_Length, Out_Num
X`09Byte`09`09In_Buf(4096), Out_Buf(512)
X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
X
X`09Character`09For_IOS(68)*30
X`09Common`09/ForIOS/ For_IOS
X
X`09Out_Num = 0
X`09Bin_Flg = .True.
X`09K = Index( File_Name, '.' )
X`09If ( K. eq. 0 )Then
X`09  Type *, 'Is ', File_Name, ' a text file? '
X`09  Accept 1100, Ans
X`09  If ( Ans .eq. 'y' .or. Ans .eq. 'Y' ) Bin_Flg = .False.
X`09Else
X`09  File_Ext = File_Name(K+1:K+3)
X`09  Do K = 1, 3`09`09`09! Upcase the extension
X`09    If ( File_Ext(K:K) .ge. 'a' .and. File_Ext(K:K) .le. 'z' ) Then
X`09      File_Ext(K:K) = Char( Ichar( File_Ext(K:K) ) - '40'o )
X`09    EndIf
X`09  EndDo
X          K = Index( ' LBR ARC COM EXE REL CMD COM OVR BIN', File_Ext )
X`09  Bin_Flg = .False.`20
X`09  If ( K .ne. 0 ) Bin_Flg = .True.
X`09EndIf
X
X`09If ( .Not. Bin_Flg ) Then
X`09  Type *, '++ Member being treated as Text (Bit 8 cleared) ++'
X`09EndIf
X
X`09If ( View_flg .and. Bin_Flg ) Then
X`09  Type *, '---> Can''t view a binary file, extracting...'
X`09  View_Flg = .False.
X`09EndIf
X
X`09If ( Bin_Flg ) Then
X`09  Out_Length = 128
X`09  Carriage = 'NONE'
X`09Else
X`09  Out_Length = 510
X`09  Carriage = 'LIST'
X`09EndIf
X
X`09Cancel_op = .False.
X
X`09If ( View_flg ) Then
X`09  Open_Name = 'Sys$OutPut'
X`09Else
X`09  OPen_Name = File_Name
X`09  Do I = 1, 11
X`09    If ( Open_Name(I:I) .eq. '-' ) Open_Name(I:I) = '_'
X`09  EndDo
X`09  Write( 6, * ) 'Extracting to ', Open_Name, '...'
X`09EndIf
X
X`09If ( .Not. AST_On_Flg ) Then
X`09  Call Cancel_AST_Start
X`09  AST_On_Flg = .True.
X`09EndIf
X
X`09Type *, '+++ To cancel operation type Ctrl-C +++'
X`09Type *, ' '
X
X`09Open( Unit=1, File=Open_Name, Status='NEW', RecL=Out_Length,`20
X`091     IoStat=IOS, CarriageControl=Carriage, Err=900 )
X
X`09Return
X
X900`09Continue
X`09Type *, 'Error opening file: ', FOR_IOS( IOS )
X`09Return
X
X1100`09Format( A )
X
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine used to close the open LUN used for extract and View
XC`09commands. Insures that the last partial buffer is written.
XC
XC`09Inputs:
XC`09`09Uses info in buffer common to empty the output buffer
XC`09`09If needed.
XC
XC`09Outputs:
XC`09`09The last buffer is emptied before closing the LUN
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Close_Ext_File( Mem_CRC )
X
X`09Implicit None
X
X`09Byte`09`09B(2)
X`09Integer*2`09Mem_CRC, Loc_CRC, KeepCRC
X
X`09Equivalence`09( Loc_CRC, B(1) )
X
X`09Integer `09K
X
X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
X`09Integer`09 `09Out_Index, Out_Length, Out_Num
X`09Byte`09`09In_Buf(4096), Out_Buf(512)
X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
X
X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
X`09Integer`09`09Remaining_Size
X`09Integer*2`09CRC_Val
X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
V0
X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
X
Xc`09Start of routine code
X
X`09Loc_CRC = Mem_CRC          `20
X
X`09If ( Out_Index .gt. 1 ) Then
X`09  Write( 1, 1100 ) (Out_Buf(K), K=1,Out_Index)
X`09  Out_Num = Out_Num + 1
X`09  Out_Index = 1
X`09EndIf
X
X`09If ( Cancel_Op ) Then
X`09  Close( Unit=1, Disp='DELETE' )
X`09Else
X`09  Close( Unit=1 )
X`09  KeepCRC = CRC_Val
X`09  If ( .Not. LBR_Flg ) Then
X`09    Call ARC_CRC( CRC_Val, B(1) )
X`09    Call ARC_CRC( CRC_Val, B(2) )
X`09  Else
X`09    Call LBR_CRC( CRC_Val, B(2) )
X`09    Call LBR_CRC( CRC_Val, B(1) )
X`09  EndIf
X`09  If ( Mem_CRC .ne. 0 ) Then`09`09! Zero CRC means no check
X`09    If ( CRC_Val .ne. 0 ) Then
X`09      Type *,'--- Warning --- CRC Error ---'
X`09      Type 2000, Mem_CRC, KeepCRC, Crc_Val
X2000`09      Format( ' Member CRC: ', Z4.4, ', Calc''d CRC: ', Z4.4,`20
X`091`09`09', Final value CRC: ', Z4.4 )
X`09    EndIf
X`09  EndIf
X`09EndIf
X
X`09If ( .Not. View_Flg .and. .Not. Cancel_Op ) Then
X`09  If ( Bin_Flg )Then
X`09    Type 1000, Out_Num
X`09  Else
X`09    Type 1001, Out_Num
X`09  EndIf
X`09EndIf
X
X`09Return
X1000`09Format( //' --> ', I6, ' Records written' )
X1001`09Format( //' --> ', I6, ' Lines written' )
X1100`09Format( 510A1 )
X
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine used to get the next byte from the input buffer
XC`09If the input buffer is empty the next record will be read`20
XC
XC`09Inputs:
XC`09`09Common containing information about the buffers
XC
XC`09OutPut:
XC`09`09C is the next byte value from the input buffer
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Get_Byte( C )
X
X`09Implicit None
X
X`09Byte`09`09C
X
X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
X`09Integer`09 `09Out_Index, Out_Length, Out_Num
X`09Byte`09`09In_Buf(4096), Out_Buf(512)
X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
X
X`09If ( Buf_Index .gt. Buf_Length ) Then
X`09    Call Position_Lib( Last_In + 1 )
X`09EndIf
X
X`09C = In_Buf( Buf_Index )
X`09Buf_Index = Buf_Index + 1
X
X`09Return
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine used to get the next byte from the input buffer
XC`09Call Get_Byte after checking remaining size of member
XC
XC`09Inputs:
XC`09`09Common containing information about the member
XC
XC`09OutPut:
XC`09`09I is the next byte value from the input buffer in I*2
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Get_Char( I )
X
X`09Implicit None
X
X`09Integer*2`09I, W
X`09Byte`09`09C
X
X`09Integer*4`09Knt
X
X`09Equivalence`09( W, C )
X
X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
X`09Integer`09`09Remaining_Size
X`09Integer*2`09CRC_Val
X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
V0
X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
X
X`09W = 0
X`09If ( remaining_Size .gt. 0 ) Then
X`09    Call Get_Byte( C )
X`09    Remaining_Size = Remaining_Size - 1
X`09    If ( LBR_Flg ) Then
X`09`09Knt = Knt + 1
X`09`09Call LBR_CRC( CRC_Val, C )
Xc`09`09Type 10, 'Knt: ', Knt, ', Char: ', C, ', CRC: ', CRC_Val
Xc10`09`09Format( x, A, I5, A, Z2, A, Z4.4 )
X`09    EndIf
X`09Else
X`09    W = -1
X`09EndIf
X
X`09I = W
X
X`09Return
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine used to get KNT bytes from input
XC`09Call the Get_Byte subroutine to minimize buffer manipulation
XC
XC`09Input:
XC`09`09Buffer address to fill
XC`09`09KNT number of bytes to fill
XC
XC`09Output:
XC`09`09Fills parameter buffer with KNT bytes
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Get_Byte_Knt( Buf, Knt )
X
X`09Implicit None
X
X`09Integer`09`09Knt, I
X
X`09Byte`09`09Buf(KNT)
X
X`09Do I = 1, KNT
X`09    Call Get_Byte( Buf(I) )
X`09EndDo
X
X`09Return
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine used to get KNT bytes from input
XC`09Call the Get_Char subroutine to minimize buffer manipulation
XC
XC`09Input:
XC`09`09Buffer address to fill
XC`09`09KNT number of bytes to fill
XC
XC`09Output:
XC`09`09Fills parameter buffer with KNT bytes
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Get_Char_Knt( Buf, Knt )
X
X`09Implicit None
X
X`09Integer`09`09Knt, I
X
X`09Byte`09`09Buf(KNT)
X
X`09Do I = 1, KNT
X`09    Call Get_Char( Buf(I) )
X`09EndDo
X
X`09Return
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine that translates a byte to ASCII
XC
XC`09Input:
XC`09`09Will call Get_Char to get a bytes needed for translation
XC
XC`09Output:
XC`09`09The translated value (unsqueezed) in I*2 format
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Get_Char_Sq( W )
X
X`09Implicit None
X
X`09Integer*2`09SpEOF
X`09Parameter`09( SPEOF = 256 )
X
X`09Integer*2`09W
X`09Integer*2`09I, K, CurIn
X
X`09Integer*2`09DNode(0:255,0:1), BPos
X`09Common`09/UnSq/`09DNode, BPos
X
X`09I = 0
X`09Do While ( I .ge. 0 )
X`09  BPos = BPos + 1
X`09  If ( BPos .gt. 7 ) Then
X`09    BPos = 0
X`09    Call Get_Char( CurIN )
X`09    If ( Curin .eq. -1 ) Then
X`09      W = -1
X`09      Return
X`09    EndIf
X`09  Else
X`09    Curin = Ishft( Curin, -1 )`09`09!!!VMS!!! VAX intrinsic function
X`09  EndIf
X`09  K = Curin .and. 1
X`09  I = DNode( I, K )
X`09EndDo
X
X`09I = -( I + 1 )
X`09If ( I .eq. SPEOF ) Then
Xc`09  Type *, 'Special End of File found'
X`09  W = -1
X`09Else
X`09  W = I
X`09EndIf
X`09Return
X`09End                       `20
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine used to put a byte into outbut buffer and will check
XC`09for compression using the DLE technique
XC
XC`09Input:
XC`09`09W`09I*2 value holding the char to output
XC
XC`09Output:        `20
XC`09`09Places data into the output buffer
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Put_Char_UnComp( W )
X
X`09Implicit None
X
X`09Integer*2`09DLE
X`09Parameter`09( DLE = '90'x )
X
X`09Integer*2`09W, WC, RepCt, LastC
X
X`09Byte`09`09C
X
X`09Equivalence`09( WC, C )
X
X`09Data`09RepCt`09/0/
X
X`09If ( Repct .gt. 0 ) Then`09`09! Are we repeating a char?
X`09  If ( W .eq. 0 ) Then
X`09    Call Put_Char_Crc( DLE )`09`09! DLE was a real one
X`09  Else`09`09`09`09`09! Count is what we have
X`09    RepCt = W`09`09`09`09! Set the count right
X`09    repct = repct - 1`09`09`09! Now put the proper
X`09    Do While ( repCt .gt. 0 )`09`09!  number of characters
X`09      Call Put_Char_Crc( LastC )`09!  into the buffer
X`09      repct = repct - 1
X`09    EndDo
X`09  EndIf
X`09  repct = 0`09`09`09`09! All done with this repeat
X`09Else`09`09`09`09`09! Not repeating yet
X`09  If ( W .eq. DLE ) Then`09`09! Repeat introducer?
X`09    RepCt = 1`09`09`09`09! Yes, flag the repeat
X`09  Else`09`09`09`09`09! No, just put the char
X`09    Call Put_Char_Crc( W )`09`09! Always save last sent
X`09    LastC = W
X`09  EndIf
X`09EndIf
X
X`09Return
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine that places a byte into the output buffer
XC
XC`09Input:
XC`09`09A byte value
XC
XC`09OutPut:
XC`09`09The byte will be placed into the output buffer. When the
XC`09`09buffer is full then it will be written.
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Put_Byte( C )
X
X`09Implicit None
X
X`09Byte`09`09CR, LF
X`09Parameter`09( LF = '12'o )
X`09Parameter`09( CR = '15'o )
X
X`09Byte`09`09C
X
X`09Logical*1`09CR_Flg
X
X`09Integer `09K
X
X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
X`09Integer`09`09Remaining_Size
X`09Integer*2`09CRC_Val
X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
V0
X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
X
X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
X`09Integer`09 `09Out_Index, Out_Length, Out_Num
X`09Byte`09`09In_Buf(4096), Out_Buf(512)
X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
X
X`09Data`09CR_Flg /.False./
X
X`09If ( .Not. Bin_Flg ) Then
X`09  C = C .and. '7F'x
X`09  If ( C .eq. '1a'x ) Then`09`09! If `5Ez don't put in file
Xc`09    Remaining_Size = 0
X`09    Return
X`09  EndIf
X
X`09  If ((C.eq.LF.or.C.eq.CR).and.View_cr)Then
Xc Write out line if CR or LF up to what's saved alread.
Xc View_Cr mode only...
X`09    Write(1, 1100) (Out_Buf(K), K=1,Out_Index-1)
X`09    Out_Index=1
X`09    Out_Num = Out_Num+1
X`09    CR_FLG = .False.
X`09    Return
X`09  Endif
X`09  If ( CR_Flg ) Then
X`09    If ( C .eq. LF ) Then
X`09      Write( 1, 1100 ) (Out_Buf(K), K=1,Out_Index-1)
X`09      Out_Index = 1
X`09      Out_Num = Out_Num + 1
X`09      CR_Flg = .False.
X`09      Return
X`09    Else
X`09      Out_Buf( Out_Index ) = CR
X`09      Out_Index = Out_Index + 1
X`09      If ( Out_Index .gt. Out_Length ) Then
X`09       Write( 1, 1100 ) (Out_Buf(K), K=1,Out_Length )
X`09       Out_Index = 1
X`09       Out_Num = Out_Num + 1
X`09      EndIf
X`09    EndIf
X`09  EndIf
X`09  If ( C .eq. CR ) Then
X`09    CR_Flg = .True.
X`09    Return
X`09  EndIf
X`09  Cr_Flg = .False.
X`09EndIf
X
X`09Out_Buf( Out_Index ) = C
X`09Out_Index = Out_Index + 1
X
X`09If ( Out_Index .gt. Out_Length ) Then
X`09  Write( 1, 1100 ) (Out_Buf(K), K=1,Out_Length )
X`09  Out_Index = 1
X`09  Out_Num = Out_Num + 1
X`09EndIf
X
X`09Return
X
X1100`09Format( 510A1 )
X
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine that is used to calc a CRC`20
XC
XC`09Input:
XC`09`09I*2 with the character to add to the CRC
XC
XC`09Output:
XC`09`09Call Put_Byte to add the byte to the output buffer
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Put_Char_Crc( W )
X
X`09Implicit None
X
X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
X`09Integer`09`09Remaining_Size
X`09Integer*2`09CRC_Val
X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
V0
X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
X
X`09Integer*2`09W, Wc, Knt
X
X`09Byte`09`09C
X
X`09Equivalence`09( Wc, C )
X
X`09Wc = W
X`09Call Put_Byte( C )
X
X`09If ( .Not. Lbr_Flg ) Then
X`09  Call ARC_CRC( CRC_Val, C )
Xc`09  Type 10, 'Rem: ', Remaining_size, ', Char: ', C, ', CRC: ', CRC_Val
Xc10`09  Format( x, A, I5, A, Z2, A, Z4.4 )
X`09EndIf
X
X`09Return
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine that process the header of a squeezed member of a`20
XC`09LBR file.`20
XC
XC------------------------------------------------------------------------
X
X`09Subroutine LBR_Init_UnSq
X
X`09Implicit None
X
X`09Integer*2`09I2, K
X
X`09Byte`09`09C
X
X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
X`09Integer`09`09Remaining_Size
X`09Integer*2`09CRC_Val
X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
V0
X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
X
X`09Call Get_Char_KNT( I2, 2 )`09`09! Read first 2 bytes
X`09Call Get_Char_Knt( I2, 2 )`09`09! Get past the CRC
X`09Call Get_Char( C )`09`09`09! Get the member orig name
X`09Do While ( C .ne. 0 )`09`09`09!  Read all of it
X`09  Call Get_Char( C )`09`09`09!  until we point to the
X`09EndDo`09`09`09`09`09!  decode tree
X
X`09Call Init_UnSq`09`09`09`09! Read the decode tree
X
X`09Return
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine that sets up the translation array for the specified`20
XC`09member`20
XC
XC`09Input:
XC
XC`09Output:
XC`09`09The translation node array is filled in`20
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Init_UnSq
X
X`09Implicit None
X
X`09Integer*2`09SpEOF
X`09Parameter`09( SPEOF = 256 )
X
X`09Integer*2`09I, NumNodes
X
X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
X`09Integer`09`09Remaining_Size
X`09Integer*2`09CRC_Val
X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
V0
X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
X
X`09Integer*2`09DNode(0:255,0:1), BPos
X`09Common`09/UnSq/`09DNode, BPos
X
X`09Call Get_Char_Knt( NumNodes, 2 )
X
X`09BPos = 100
X`09Dnode(0,0) = -(SPEOF+1)
X `09Dnode(0,1) = -(SPEOF+1)
X
X`09NumNodes = NumNodes - 1
X
X`09Do I = 0, NumNodes
X`09  Call Get_Char_Knt( DNode( I, 0 ), 2 )
X`09  Call Get_Char_Knt( DNode( I, 1 ), 2 )
X`09EndDo
X
Xd`09  Write( 6, * ) 'Translation arrays:'
Xd`09  Do I = 0, NumNodes
Xd`09    Write( 6, 1000 ) I, Dnode(I,0), Dnode(I,1)
Xd1000`09    Format( ' #', I3, 2( ' ', Z4.4 ) )
Xd`09  EndDo
X
X`09Return
X`09End
X`0C`0A
XC------------------------------------------------------------------------
XC`09Subroutine called to position to a specified byte of a library`20
XC`09file opened on LUN 2
XC
XC`09Inputs:
XC`09`09Byte_Lk`09`09The first byte wanted
XC
XC`09Outputs:
XC`09`09Will put the requested byte in the buffer
XC
XC------------------------------------------------------------------------
X
X`09Subroutine Position_Lib( Byte_Lk )
X
X`09Implicit None
X
X`09Character`09For_IOS(68)*30
X`09Common`09/ForIOS/ For_IOS
X
X`09Integer`09`09I, J, K, L, Q, Byte_Lk, IoS
X
X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
X`09Integer`09 `09Out_Index, Out_Length, Out_Num
X`09Byte`09`09In_Buf(4096), Out_Buf(512)
X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
X
XC`09Check the starting byte that is requested
X
X100`09Continue
X`09If ( Byte_Lk .lt. First_In ) Goto 150`09`09! Need to REWIND file
X`09If ( Byte_Lk .gt. Last_In ) Goto 200`09`09! Read the next buffer
X
XC`09Otherwise byte is in the current buffer
X
X`09Buf_Index = Byte_Lk - First_In + 1
X
X`09Return
X
XC`09Needed to start over in the file
X
X150`09Continue             `20
X
X`09Rewind`092
X`09Last_In = 0
X
XC`09Read the next buffer
X
X200`09Continue
X`09Do I = 1, 4096
X`09  In_Buf(I) = 0
X`09EndDo
X`09Read( 2, 1010, End=500, Err=800, IoStat=IOS ) Q, ( In_Buf(K),K=1,Q )
X
Xd`09Write( 6, 1111 ) ( In_Buf(K),K=1,128 )
Xd1111`09Format( 8(/' ', 16( z2.2, ' ' ) ) )
X
X`09Buf_Length = Q
X`09First_In = Last_In + 1
X`09Last_In = First_In + Buf_Length - 1
X
X`09Goto 100
X
XC`09End of File Encountered while attempting to find a sector
X
X500`09Continue
X`09Rewind 2
X`09First_In = 0
X`09Last_In = 0
X
X`09Return
X
XC`09Error occurred on read
X
X800`09Continue
X`09If ( IOS .gt. 68 ) Then
X`09  Type *, 'Unknown error on READ: ', IOS
X`09Else
X`09  Type *, 'Error on READ: ', For_IOS( IOS )
X`09EndIf
X
X`09Return
X
X1010`09Format( Q, 4096A1 )
X
X`09End
X`0C`0A
XC---------------------------------------------------------------------------
V----
XC`09Subroutine used to convert a time in MSDOS I*2 format to a string
XC`09This routine calls a VMS FORTRAN shift routine (ISHFT).
XC
XC`09Inputs:
XC`09`09T`092 byte value containing time`20
XC`09`09`09Format: Bits 0-4 is number of 2 sec intervals
XC`09`09`09`09Bits 5-10 is number of minutes
XC`09`09`09`09Bits 11-15 is the number of hours
XC`09Outputs:
XC`09`09T_Str`09in form: hh:mm:ss
XC
XC---------------------------------------------------------------------------
V----
X
X`09Subroutine Time_Str( T, T_Str )
X
X`09Implicit None
X
X`09Integer*2`09T, Work
X`09Integer`09`09Sec, Hr, Min
X
X`09Character`09T_Str*(*)
X
X`09Integer*2`09H_Mask, M_Mask, S_Mask
X`09Parameter`09( H_Mask = 'F800'x,`20
X`091`09`09  M_Mask = '07E0'x,`20
X`091`09`09  S_Mask = '001F'x )
X
X`09Work = T .and. S_Mask
X`09Sec = Work
X
X`09Work = T .and. M_Mask
X`09Work = IShft( Work, -5 )`09`09! Shift right 5 !!!VMS!!!
X`09Min = Work
X
X`09Work = T .and. H_Mask
X`09Work = IShft( Work, -11 )`09`09! Shift right 11 !!!VMS!!!
X`09Hr = Work
X
X`09Write( T_Str, 1000, err = 100 ) Hr, Min, Sec*2
X
X`09Return
X
X100`09Continue
X
X`09T_Str = 'UnKnown'
X
X`09Return
X
X1000`09Format( I2, 2( ':', I2.2 ) )
X
X`09End
X`0C`0A
XC---------------------------------------------------------------------------
V----
XC`09Subroutine used to convert a date in MSDOS File date format into
XC`09a year, month and day.`20
XC
XC`09This routine uses VMS FORTRAN intrinsic function for shifting
XC
XC`09Inputs:
XC`09`09D`092 byte value containing the date`20
XC
XC`09Outputs:
XC`09`09D_Str`09in form: mm/dd/yy
XC
XC---------------------------------------------------------------------------
V----
X
X`09Subroutine ARC_Date_Str( D, D_Str )
X                 `20
X`09Implicit None
X
X`09Integer*2`09D, Work
X`09Integer`09`09Yr, Mo, Dy
X
X`09Character`09D_Str*(*)
X
X`09Integer*2`09Y_Mask, M_Mask, D_Mask
X`09Parameter`09( Y_Mask = 'FE00'x,`20
X`091`09`09  M_Mask = '01E0'x,`20
X`091`09`09  D_Mask = '001F'x )
X
X`09Work = D .and. D_Mask
X`09Dy = Work
X
X`09Work = D .and. M_Mask
X`09Work = IShft( Work, -5 )`09`09! Shift right 5 !!!VMS!!!
X`09Mo = Work
X
X`09Work = D .and. Y_Mask
X`09Work = IShft( Work, -9 )`09`09! Shift right 9 !!!VMS!!!
X`09Yr = Work
X
X`09Write( D_Str, 1000, err = 100 ) Mo, Dy, Yr+80
X
X`09Return
X
X100`09Continue
X
X`09D_Str = 'UnKnown'
X
X`09Return
X
X1000`09Format( I2, 2( '/', I2.2 ) )
X
X`09End
X`0C`0A
XC---------------------------------------------------------------------------
V----
XC`09Subroutines used to convert a count of days from a base date to
XC`09a year, month and day. The base date can be selected.
XC`09This routine uses VMS RTL routines for date and time manipulation.
XC
XC`09Inputs:
XC`09`09BY`09Base year (ie. 80 is 1-Jan-1980 is day 1)
XC`09`09D`092 byte value containing the date that is the number
XC`09`09`09of days since a base date
XC
XC`09Outputs:
XC`09`09D_Str`09in form: mm/dd/yy
XC
XC---------------------------------------------------------------------------
V----
X
X`09Subroutine LBR_Date_Str( BY, D, D_Str )
X
X`09Implicit None
X
X`09Integer*2`09D, Num_Time(7)
X
X`09Integer`09`09BY, Work, Delta(2), Base(2), Act_Date(2)
X
X`09Integer`09`09Lib$SubX, Sys$BinTim, Sys$NumTim, Stat`09!!!VMS!!!
X
X`09Character`09D_Str*(*), Temp_Str*23, Err
X
X`09Err = 'T'
X`09If ( D .gt. 9999 ) Goto 100
X
X`09Err = 'B'
X`09Write( Temp_Str, 1001, Err=100 ) BY-1
X`09Stat = Sys$BinTim( Temp_Str, Base )`09`09!!!VMS!!!
X`09If ( .Not. Stat ) GoTo 100
X
X`09Err = 'D'
X`09Write( Temp_Str, 1000, Err=100 ) D
X`09Stat = Sys$BinTim( Temp_Str, Delta )            !!!VMS!!!
X`09If ( .Not. Stat ) GoTo 100
X
X`09Err = 'S'
X`09Stat = Lib$SubX( Base, Delta, Act_Date, 2 )     !!!VMS!!!
X`09If ( .Not. Stat ) GoTo 100
X
X`09Err = 'N'
X`09Stat = Sys$NumTim( Num_Time, Act_Date )         !!!VMS!!!
X`09If ( .Not. Stat ) GoTo 100
X
X`09Err = 'W'
X`09Write( D_Str, 1002, Err=100 ) Num_Time(2), Num_Time(3),`20
X`091`09`09Num_Time(1)-1900
X
X`09Return
X
X100`09Continue
X`09D_Str = 'Cnv Err' // Err`09`09! Can't convert
X`09Return
X
X1000`09Format( I4.4, ' 00:00:00.00' )
X1001`09Format( '31-DEC-19', I2.2, ' 00:00:00.00' )    `20
X1002`09Format( I2, 2( '/', I2.2 ) )
X
X`09End
X`0C`0A
XC---------------------------------------------------------------------------
V----
XC`09Subroutine used to enable the control C trap used as a cancel signal
XC`09for View and Extract functions.
XC
XC`09This routine is very VMS specific!
XC---------------------------------------------------------------------------
V----
X
X`09Subroutine Cancel_AST_Start
X
X`09Implicit None
X
X`09Integer`09`09JPI_ITEM, IO_Func, K, L, IOS, TT_LEN
X`09Integer`09`09Lib$GetJPI, Sys$Assign, Sys$QioW
X
X`09Integer*2`09TT_Chan
X
X`09Character`09TT_Name*7
X
X`09Include`09`09'($IODEF)'
X`09Include`09`09'($JPIDEF)'
X
X`09External`09Cancel_AST
X
X`09JPI_Item = JPI$_Terminal
X`09IOS = Lib$GetJPI( JPI_ITEM,,,, TT_Name, TT_Len )
X`09If ( .Not. IOS ) Call Lib$Stop( %Val( IOS ) )
X
X`09If ( TT_Name .eq. ' ' ) Then
X`09  TT_Name = 'TT:'
X`09  TT_Len = 3
X`09EndIf
X
X`09IOS = Sys$Assign( TT_Name(1:TT_Len), TT_Chan,, )
X`09If ( .Not. IOS ) Call Lib$Stop( %Val( IOS ) )
X
X`09IO_Func = IO$_SetMode .or. IO$M_CtrlCAST
X
X`09IOS = Sys$QioW( , %Val(TT_Chan), %Val(IO_Func),,,, Cancel_AST,,,,, )
X`09If ( .Not. IOS ) Call Lib$Stop( %Val( IOS ) )
X
X`09Return
X`09End
X`0C`0A
XC---------------------------------------------------------------------------
V----
XC`09Subroutine to set Cancel AST for View and extract functions
XC
XC`09This routine is VMS specific
XC---------------------------------------------------------------------------
V----
X
X`09Subroutine Cancel_AST
X
X`09Implicit None
X
X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
+-+-+-+-+-+-+-+-  END  OF PART 11 +-+-+-+-+-+-+-+-
Technical Details
Message-ID: <7868519@MVB.SAIC.COM>
Path: arc1-ca.pugleaf.net!sparky!uunet!elroy.jpl.nasa.gov!swrinde!network.ucsd.edu!mvb.saic.com!vmsnet-sources

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!elroy.jpl.nasa.gov!swrinde!network.ucsd.edu!mvb.saic.com!vmsnet-sources
From: munroe@dmc.com (Dick Munroe)
Newsgroups: vmsnet.sources
Subject: UBBS, part 11/12
Message-ID: <7868519@MVB.SAIC.COM>
Date: 21 Aug 92 20:23:05 GMT
Organization: Doyle, Munroe Consultants, Inc., Hudson, MA
Lines: 1692
Approved: Mark.Berryman@Mvb.Saic.Com