home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / vmsnet / sources / 313 < prev    next >
Encoding:
Internet Message Format  |  1992-08-21  |  46.6 KB

  1. Path: sparky!uunet!elroy.jpl.nasa.gov!swrinde!network.ucsd.edu!mvb.saic.com!vmsnet-sources
  2. From: munroe@dmc.com (Dick Munroe)
  3. Newsgroups: vmsnet.sources
  4. Subject: UBBS, part 11/12
  5. Message-ID: <7868519@MVB.SAIC.COM>
  6. Date: 21 Aug 92 20:23:05 GMT
  7. Organization: Doyle, Munroe Consultants, Inc., Hudson, MA
  8. Lines: 1692
  9. Approved: Mark.Berryman@Mvb.Saic.Com
  10.  
  11. Submitted-by: munroe@dmc.com (Dick Munroe)
  12. Posting-number: Volume 3, Issue 119
  13. Archive-name: ubbs/part11
  14. -+-+-+-+-+-+-+-+ START OF PART 11 -+-+-+-+-+-+-+-+
  15. XEnter name of file to download, ? for list, or <cr> to exit. ABC.XYZ`0D
  16. XLast file added: 24-Jul-1986
  17. XView (A)ll or (U)napproved files? `5BU`5D`0D
  18. X    Files since:  1-Jul-1985
  19. X(D)ownload, (U)pload, (H)elp or (E)xit? `5Bexit`5D D`0D
  20. XArea? APP`0D
  21. XEnter name of file to download, ? for list, or <cr> to exit. ABC.XYZ`0D
  22. XLast file added: 12-Feb-1986
  23. XView (A)ll or (U)napproved files? `5BU`5D`0D
  24. X    Files since:  1-Jul-1985
  25. XDDD2.1               23-Jul-1986  Size:     0  Ubinar    Accesses:    0
  26. X
  27. X     Keywords: a By:JASON FARNON                 `20
  28. X
  29. Xa
  30. Xa
  31. XCommand?D`0D
  32. XDeleted`0D
  33. XSTAR.TREK            18-Jul-1986  Size:    48  Uascii    Accesses:    0
  34. X
  35. X     Keywords: ASCII-GAME By:MIKE SHIRLEY                 `20
  36. X
  37. XSTAR TREK GAME-EXEC-SAVE-AND RUN.COMPATABLE W/3.3 OR PRODOS.
  38. XCommand?X`0D
  39. X(D)ownload, (U)pload, (H)elp or (E)xit? `5Bexit`5D `0D
  40. X11:20:38-05 Command (B,C,E,F,G,H,K,M,P,R,S,U,W,X,?)?G`0D
  41. X
  42. XThank you for calling UBBS
  43. X  BBS          logged out at 24-JUL-1986 11:20:41.34
  44. $ CALL UNPACK [.UTILITY]SYSOP.HOWTO;2 134575356
  45. $ create 'f'
  46. XC---------------------------------------------------------------------------
  47. V--
  48. XC`09Program used to provide LSWEEP and some ARC functionality on VMS
  49. XC
  50. XC`09VMSsweep will handle .LBR and .ARC* files and can be used to extract`20
  51. XC`09members or just display them on the terminal if they are non binary
  52. XC
  53. XC`09Restrictions:`20
  54. XC`09`09The VMS file must have a maximum record length of 4096 bytes.`20
  55. XC`09`09The library file (.ARC* or .LBR) can only have 200 members
  56. XC
  57. XC`09Functions provided:
  58. XC`09`09View a member at the terminal -squeezed or unsqueezed
  59. XC`09`09Extract a member to a file (Max 510 byte records)`20
  60. XC`09`09List the directory of a library file
  61. XC`09`09New library file requested
  62. XC
  63. XC`09Author:
  64. XC`09`09John T. Coburn`09`09Digital Equipment, Cleveland
  65. XC`09`09Copyright (c) 1986
  66. XC
  67. XC`09Please feel free to distribute this program by any noncommercial
  68. XC`09means to anyone who can use it.
  69. XC
  70. XC`09* ARC is Copyright 1985,1986 by System Enhancements Associates
  71. XC
  72. XC`09This program was in general based on the Turbo Pascal program`20
  73. XC`09DEARC that is in the public domain. Also referenced ARC sources
  74. XC`09from System Enhancement Associates
  75. XC
  76. XC---------------------------------------------------------------------------
  77. V--
  78. XC---------------------------------------------------------------------------
  79. V--
  80. XC`09Modification History:
  81. XC
  82. XC`09Vers`09Date`09`09Who`09`09Comments
  83. XC
  84. XC`09V2.8`0912 Dec 86`09John Coburn`09Fix problem when running
  85. XC`09`09`09`09`09`09in a subprocess
  86. XC`09`09`09`09Walt Lamia`09Extraction of all members
  87. XC
  88. XC`09V2.7`0922 Nov 86`09John Coburn`09Add CRC checking for LBRs
  89. XC
  90. XC`09V2.6`0930 Oct 86`09John Coburn`09Add CRC checking for ARCs
  91. XC
  92. XC`09V2.5`0929 Oct 86`09John Coburn`09Fixed bug that occurred
  93. XC`09`09`09`09`09`09when extracting unsqueezed
  94. XC`09`09`09`09`09`09binary files. Also fixed
  95. XC`09`09`09`09`09`09boundary condition problem`20
  96. XC`09`09`09`09`09`09in decompression table that
  97. XC`09`09`09`09`09`09caused ARC extracts to fail.
  98. XC
  99. XC`09V2.4`09 6 Sep 1986`09John Coburn`09Change to allow single CR or LF
  100. XC`09`09`09`09Glenn Everharts`09to be a record terminator.
  101. XC`09`09
  102. XC`09V2.3`09 1 Mar 1986`09John Coburn`09Removed unreliable CRC checking
  103. XC
  104. XC`09V2.2`09 ???`09`09John Coburn`09Enhance ARC functions
  105. XC
  106. XC`09V2.1`09 ???`09`09John Coburn`09Add ARC functionality
  107. XC
  108. XC`09V2.0`09 1 Feb 1986`09John Coburn`09First released version
  109. XC---------------------------------------------------------------------------
  110. V--
  111. X
  112. X `09Program VAX_ARC_LBR
  113. X
  114. X`09Implicit None
  115. X`0C`0A
  116. X`09Character`09For_IOS(68)*30
  117. X`09Common`09/ForIOS/ For_IOS
  118. X
  119. X!`20
  120. X! `09Define FORTRAN error numbers for use with IOSTAT and ERRSNS
  121. X!`20
  122. X`09Data For_IOS /68*' '/
  123. X`09Data FOR_IOS ('00000011'X ) /' syntax error in NAMELIST input'/
  124. X`09Data FOR_IOS ('00000012'X ) /' too many values for NAMELIST variable'/
  125. X`09Data FOR_IOS ('00000013'X ) /' invalid reference to variable'/
  126. X`09Data FOR_IOS ('00000014'X ) /' REWIND error '/
  127. X`09Data FOR_IOS ('00000015'X ) /' duplicate file specifications '/
  128. X`09Data FOR_IOS ('00000016'X ) /' input record too long '/
  129. X`09Data FOR_IOS ('00000017'X ) /' BACKSPACE error '/
  130. X`09Data FOR_IOS ('00000018'X ) /' end-of-file during read '/
  131. X`09Data FOR_IOS ('00000019'X ) /' record number outside range '/
  132. X`09Data FOR_IOS ('0000001A'X ) /' OPEN or DEFINE FILE required'/
  133. X`09Data FOR_IOS ('0000001B'X ) /' too many records in I/O statement'/
  134. X`09Data FOR_IOS ('0000001C'X ) /' CLOSE error '/
  135. X`09Data FOR_IOS ('0000001D'X ) /' file not found '/
  136. X`09Data FOR_IOS ('0000001E'X ) /' open failure '/
  137. X`09Data FOR_IOS ('0000001F'X ) /' mixed file access modes '/
  138. X`09Data FOR_IOS ('00000020'X ) /' invalid logical unit number '/
  139. X`09Data FOR_IOS ('00000021'X ) /' ENDFILE error '/
  140. X`09Data FOR_IOS ('00000022'X ) /' unit already open '/
  141. X`09Data FOR_IOS ('00000023'X ) /' segmented record format error '/
  142. X`09Data FOR_IOS ('00000024'X ) /' attempt to access non-existent record'/
  143. X`09Data FOR_IOS ('00000025'X ) /' inconsistent record length '/
  144. X`09Data FOR_IOS ('00000026'X ) /' error during write '/
  145. X`09Data FOR_IOS ('00000027'X ) /' error during read '/
  146. X`09Data FOR_IOS ('00000028'X ) /' recursive I/O operation '/
  147. X`09Data FOR_IOS ('00000029'X ) /' insufficient virtual memory '/
  148. X`09Data FOR_IOS ('0000002A'X ) /' no such device '/
  149. X`09Data FOR_IOS ('0000002B'X ) /' file name specification error '/
  150. X`09Data FOR_IOS ('0000002C'X ) /' inconsistent record type'/
  151. X`09Data FOR_IOS ('0000002D'X ) /' keyword value error in OPEN statement '/
  152. X`09Data FOR_IOS ('0000002E'X ) /' inconsistent OPEN/CLOSE parameters'/
  153. X`09Data FOR_IOS ('0000002F'X ) /' write to READONLY file '/
  154. X`09Data FOR_IOS ('00000030'X ) /' invalid arg to FORTRAN RTL'/
  155. X`09Data FOR_IOS ('00000031'X ) /' invalid key specification'/
  156. X`09Data FOR_IOS ('00000032'X ) /' inconsistent key change, duplicate key'/
  157. X`09Data FOR_IOS ('00000033'X ) /' inconsistent file organization'/
  158. X`09Data FOR_IOS ('00000034'X ) /' specified record locked'/
  159. X`09Data FOR_IOS ('00000035'X ) /' no current record'/
  160. X`09Data FOR_IOS ('00000036'X ) /' REWRITE error'/
  161. X`09Data FOR_IOS ('00000037'X ) /' DELETE error'/
  162. X`09Data FOR_IOS ('00000038'X ) /' UNLOCK error'/
  163. X`09Data FOR_IOS ('00000039'X ) /' FIND error'/
  164. X`09Data FOR_IOS ('0000003B'X ) /' list-directed I/O syntax error '/
  165. X`09Data FOR_IOS ('0000003C'X ) /' infinite format loop '/
  166. X`09Data FOR_IOS ('0000003D'X ) /' format/variable-type mismatch '/
  167. X       `09Data FOR_IOS ('0000003E'X ) /' syntax error in format '/
  168. X`09Data FOR_IOS ('0000003F'X ) /' output conversion error '/
  169. X`09Data FOR_IOS ('00000040'X ) /' input conversion error '/
  170. X`09Data FOR_IOS ('00000042'X ) /' output statement overflows record '/
  171. X`09Data FOR_IOS ('00000043'X ) /' input requires too much data '/
  172. X`09Data FOR_IOS ('00000044'X ) /' variable format expression error '/
  173. X`0C`0A
  174. X`09Byte`09`09ArcMark, FBuf(128)
  175. X`09Integer*2`09LBR_Recognize
  176. X`09Integer`09`09Max_Num_Members
  177. X
  178. X`09Parameter ( ArcMark = 26 )
  179. X`09Parameter ( LBR_recognize = 'FF76'x )
  180. X`09Parameter ( Max_Num_Members = 200 )
  181. X
  182. X`09Character`09File_Name*12, In_FILE_NAME*50, ANS*1, Lib_Type*1
  183. X`09Character`09Technique*10, Techs(10)*10, Actual_Len_Str*8
  184. X`09Data`09Techs `09/ 2*'    --', '  Packed', ' Squeezed',`20
  185. X`091`09`09  3*'Crunch(un)', ' Crunched',`20
  186. X`092`09`09 2*' Unknown' /
  187. X
  188. X`09Character`09Member_NAMES(Max_Num_Members)*12
  189. X`09Character`09Mem_Date(Max_Num_Members)*8
  190. X`09Character`09Mem_Time(Max_Num_Members)*8
  191. X
  192. X`09Integer`09`09First_Byte_Arr(Max_Num_Members)
  193. X`09Integer`09`09HDR_Vers(Max_Num_Members), Act_Len(Max_Num_Members)
  194. X`09Integer`09`09Num_Bytes_Arr(Max_Num_Members)
  195. X`09Integer*2`09CRCS(Max_Num_Members)
  196. X
  197. X`09Integer`09`09Temp
  198. X
  199. X`09Byte`09`09DIR_ENTRY(32)
  200. X
  201. X`09Byte`09`09STATUS, NAME(8), EXTEN(3), LBR_Filler(6), F1, F2
  202. X`09Integer*2`09INDX, NSECTS, CRC, Frec, Crea_Date, Upd_Date
  203. X`09Integer*2`09Crea_Time, Upd_Time
  204. X`09Integer`09`09Num_Members, NBlks, Ivcr
  205. X
  206. X`09Common`09/LBR_Dire/ STATUS, NAME, EXTEN, INDX, NSECTS, CRC,`20
  207. X`091`09`09   Crea_Date, Upd_Date, Crea_Time, Upd_Time,`20
  208. X`091`09`09   LBR_Filler, F1, F2
  209. X
  210. X`09Equivalence`09( DIR_ENTRY(1), STATUS )
  211. X`09Equivalence`09( Frec, F1 )
  212. X
  213. X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
  214. X`09Integer`09 `09Out_Index, Out_Length, Out_Num
  215. X`09Byte`09`09In_Buf(4096), Out_Buf(512)
  216. X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
  217. X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
  218. X
  219. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  220. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  221. X`09Integer`09`09Remaining_Size
  222. X`09Integer*2`09CRC_Val
  223. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  224. V0
  225. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  226. X
  227. X`09Integer*2`09I2
  228. X`09Integer`09`09Q, I, J, K, M, N, DIR_SECTS, ISTAT, Ios
  229. X`09INTEGER`09`09N1,N2,NN
  230. X
  231. X`09Logical*1`09Squeezed, File_OK
  232. X`09Byte`09`09Tbytes(13), C, HDR_Ver
  233. X`0C`0A
  234. XC`09Start of Code
  235. X
  236. X`09Type *, ' '
  237. X`09Type *, 'V M S   S w e e p   V2.8'
  238. X`09Type *, 'for .LBR and .ARC files'
  239. X`09Type *, ' '
  240. X
  241. X10`09Continue
  242. X`09Last_In = 0
  243. X`09First_In = 0
  244. X`09Out_Index = 1
  245. X`09In_FILE_NAME = ' '
  246. X`09View_Cr = .False.
  247. X`09Type 1020,'$Enter "library": '
  248. X`09Accept 1021, Q, In_FILE_NAME(1:Q)`20
  249. X`09If ( Q .eq. 0 ) GoTo 800
  250. X
  251. X`09K = Index( In_File_Name(1:Q), '.' )
  252. X`09If ( K .eq. 0 ) Then
  253. X`09  Lib_Type = ' '
  254. X`09Else
  255. X`09  Lib_Type = In_File_Name(K+1:K+1)
  256. X`09EndIf
  257. X
  258. X`09If ( Lib_Type .eq. 'l' ) Lib_Type = 'L'
  259. X`09If ( Lib_Type .eq. 'a' ) Lib_Type = 'A'
  260. X
  261. X20`09Continue
  262. X`09If ( Lib_Type .ne. 'A' .and. Lib_Type .ne. 'L' ) Then
  263. X`09  Type 1020, '$ARC or LBR file `5BL`5D: '
  264. X`09  Accept 1021, I, Lib_Type
  265. X`09  If ( I .eq. 0 ) Lib_Type = 'L'
  266. X`09  If ( Lib_Type .eq. 'l' ) Lib_Type = 'L'
  267. X`09  If ( Lib_Type .eq. 'a' ) Lib_Type = 'A'
  268. X`09  If ( Lib_Type .ne. 'A' .and. Lib_Type .ne. 'L' ) Then
  269. X`09    Type *, '--- Invalid File type entered: ', Lib_Type
  270. X`09    GoTo 20
  271. X`09  EndIf
  272. X`09  If ( k .eq. 0 ) Then
  273. X`09    If ( Lib_Type .eq. 'A' )In_File_Name(Q+1:) = '.ARC'
  274. X`09    If ( Lib_Type .eq. 'L' )In_File_Name(Q+1:) = '.LBR'
  275. X`09  EndIf
  276. X`09EndIf
  277. X
  278. X`09Lbr_Flg = .True.
  279. X`09If ( Lib_Type .eq. 'A' ) LBR_Flg = .False.
  280. X
  281. X`09Open( Unit=2, File=In_File_Name, Status='OLD', ReadOnly,`20
  282. X`091`09DefaultFile='.', Err=900, IoStat=IoS )
  283. X
  284. X`09Call Position_Lib( 1 )
  285. X`09N = 0
  286. X
  287. X`09If ( .Not. Lbr_Flg ) GoTo 75
  288. X`0C`0A
  289. X
  290. XC`09Handle the .LBR file Specified
  291. X
  292. X50`09Continue
  293. X
  294. X`09Call Get_Byte_Knt( DIR_ENTRY, 32 )
  295. X
  296. X`09File_OK = .True.
  297. X`09Do I=1,8
  298. X`09  If ( Name(I) .ne. ' ' ) File_OK = .False.
  299. X`09EndDo
  300. X`09Do I=1,3
  301. X`09  If ( EXTEN(I) .ne. ' ' ) File_OK = .False.
  302. X`09EndDo
  303. X
  304. X`09If ( .Not. File_OK ) Then
  305. X`09  Write( 6, * ) '+++ Requested file is not an LBR file +++'
  306. X`09  Write( 6, * ) '+++ Invalid directory format for LBR  +++'
  307. X`09  GoTo 700
  308. X`09EndIf
  309. X
  310. X`09DIR_SECTS = NSECTS`09`09! How many directory segments are there
  311. X
  312. X`09If ( DIR_SECTS .GT. 1 ) Then
  313. X`09   Write( 6, 1030 ) '++ There are ', DIR_SECTS,`20
  314. X`091`09' directory segments in ' // In_File_name(1:Q) // ' ++'
  315. X`09Else
  316. X`09   Write( 6, 1030 ) '++ There is ', DIR_SECTS,`20
  317. X`091`09' directory segment in ' // In_File_name(1:Q) // ' ++'
  318. X`09EndIf
  319. X
  320. X`09Do 70 I = 2, DIR_SECTS*4
  321. X`09    Call Get_Byte_Knt( DIR_ENTRY, 32 )
  322. X`09    `09If ( STATUS .eq. 0 ) Then
  323. X`09`09    If ( N .eq. max_num_members ) goto 100
  324. X`09`09    N = N + 1
  325. X`09`09    Member_Names(N) = ' '
  326. X`09`09    M = 1
  327. X`09`09    Do While ( M .le. 8 .and. Name(M) .ne. ' ' )
  328. X`09`09`09    Member_Names(N)(M:M) = Char( Name(M) )
  329. X`09`09`09    M = M + 1
  330. X`09`09    EndDo
  331. X`09`09    Member_Names(N)(M:M) = '.'
  332. X`09`09    Hdr_Vers(N) = 10`09`09`09! Special blank
  333. X`09`09    Do K=1,3
  334. X`09`09`09    Member_NAMES(N)(M+K:M+K) = Char( EXTEN(K) )
  335. X`09`09    EndDo
  336. X`09`09    Temp = NSECTS
  337. X`09`09    Num_Bytes_ARR(N) = Temp * 128
  338. X`09`09    Act_Len(N) = Num_Bytes_ARR(N)`20
  339. X`09`09    Temp = Indx
  340. X`09`09    First_Byte_arr(N) = Temp * 128 + 1
  341. X`09`09    CRCS(N) = CRC
  342. X`09`09    If ( Crea_Date .ne. 0 ) Then
  343. X`09`09`09Call LBR_Date_Str( 78, Crea_Date, Mem_Date(N) )
  344. X`09`09    Else
  345. X`09`09`09Mem_Date(N) = '   --'
  346. X`09`09    EndIf
  347. X`09`09    If ( Crea_Time .ne. 0 ) Then
  348. X`09`09`09Call Time_Str( Crea_Time, Mem_Time(N) )
  349. X`09`09    Else
  350. X`09`09`09Mem_Time(N) = '  -'
  351. X`09`09    EndIf
  352. X`09    EndIf
  353. X70`09Continue
  354. X
  355. XC`09Now lets determine how many of the members are squeezed
  356. X
  357. X`09Do I = 1, N
  358. X`09  Call Position_Lib( First_Byte_Arr(I) )
  359. X`09  Call Get_Byte_KNT( I2, 2 )`09`09! Read first 2 bytes
  360. X`09  If ( I2 .eq. LBR_recognize ) Then
  361. X`09    Hdr_Vers(I) = 4`09`09`09! Squeezed`20
  362. X`09    Act_Len(I) = 0`09`09`09! Unknown actual size
  363. X`09    Call Get_Byte_Knt( I2, 2 )`09`09! Get past the CRC
  364. X`09    File_Name = ' '`20
  365. X`09    Call Get_Byte( C )`09`09`09! Get the member orig name
  366. X`09    K = 1
  367. X`09    Do While ( C .ne. 0 )
  368. X`09      File_Name(K:K) = Char( C )
  369. X`09      Call Get_Byte( C )
  370. X`09      K = K + 1
  371. X`09    EndDo
  372. X`09    Member_Names(I) = File_Name
  373. X`09  Else
  374. X`09    Hdr_Vers(I) = 2`09`09`09! Not squeezed
  375. X`09  EndIf
  376. X`09EndDo
  377. X
  378. X`09Goto 100
  379. X`0C`0A
  380. X
  381. XC`09Read the .ARC file to get 'directory' type info
  382. X
  383. X75`09Continue`09`09! Get info for .ARC file
  384. X
  385. X`09Type *, 'Gathering "directory" information for ', In_File_Name(1:Q)
  386. X`09Type *, ' '
  387. X
  388. X`09Call Get_Byte( C )
  389. X
  390. X`09Do While ( C .ne. -1 )
  391. X`09  If ( C .ne. ArcMark ) Then`09`09! Not an ARC file
  392. X`09    I = 0
  393. X`09    Do While ( C .ne. ArcMark .and. I .lt. 10 )
  394. X`09      Call Get_Byte( C )
  395. X`09      I = I + 1
  396. X`09    EndDo
  397. X`09    If ( I .ge. 10 ) Then
  398. X`09      Write( 6, * ) '+++ Requested file not an ARC file +++'
  399. X`09      Write( 6, * ) '+++ Could not find the mark of ARC +++'
  400. X`09      Goto 700
  401. X`09    Else
  402. X`09      Write( 6, * ) '+++ Bad Header encountered +++'
  403. X`09      Write( 6, 1030 ) '+++ Skipped ', I, ' bytes  +++'
  404. X`09    EndIf
  405. X`09  EndIf
  406. X
  407. X`09  Call Get_Byte( Hdr_Ver )
  408. X`09  If ( Hdr_Ver .lt. 0 ) Then `09`09! invalid header
  409. X`09   Type *, 'Cannot handle this version of .ARC file:', Hdr_ver
  410. X`09   goto 700
  411. X`09  EndIf
  412. X`09  If ( Hdr_Ver .eq. 0 ) Then `09`09! special endoffile
  413. X`09    GoTo 100
  414. X`09  EndIf
  415. X
  416. X`09  If ( N .eq. max_num_members ) goto 100
  417. X`09  N = N + 1
  418. X
  419. X`09  Call Get_Byte_Knt( TBytes, 13 )
  420. X
  421. X`09  Member_NAMES(N) = ' '
  422. X`09  M = 1
  423. X`09  Do While ( TBytes(M) .ne. 0 )
  424. X`09    Member_NAMES(N)(M:M) = Char( TBytes(M) )
  425. X`09    M = M + 1
  426. X`09  EndDo
  427. X
  428. X`09  Call Get_Byte_Knt( Num_Bytes_Arr(N), 4 )
  429. X`09  Call Get_Byte_Knt( Crea_Date, 2 )
  430. X`09  If ( Crea_Date .ne. 0 ) Then
  431. X`09    Call ARC_Date_Str( Crea_Date, Mem_Date(N) )
  432. X`09  Else
  433. X`09    Mem_Date(N) = '   --'
  434. X`09  EndIf
  435. X`09  Call Get_Byte_Knt( Crea_Time, 2 )`09`09! Discard time`20
  436. X`09  If ( Crea_Time .ne. 0 ) Then
  437. X`09    Call Time_Str( Crea_Time, Mem_Time(N) )
  438. X`09  Else
  439. X`09    Mem_Time(N) = '  -'
  440. X`09  EndIf
  441. X`09  Call Get_Byte_Knt( CRCs(N), 2 )
  442. X
  443. X`09  If ( Hdr_Ver .gt. 1 ) Then
  444. X`09    Call Get_Byte_Knt( Act_Len(N), 4 )`09`09! expanded length
  445. X`09  Else
  446. X`09    Act_Len(N) = Num_Bytes_Arr(N)
  447. X`09  EndIf
  448. X
  449. X`09  Hdr_Vers(N) = Hdr_Ver
  450. X`09  First_Byte_arr(N) = Buf_Index + First_In - 1
  451. X
  452. X`09  Call Position_Lib( Num_Bytes_Arr(N) + First_Byte_Arr(N) )
  453. X
  454. X`09  Call Get_Byte( C )
  455. X
  456. X`09EndDo
  457. X`0C`0A
  458. X
  459. XC`09Now display the directory for this library
  460. X
  461. X100`09Continue
  462. X`09Num_Members = N
  463. X
  464. X150`09Continue
  465. X`09If ( Num_Members .GT. 1 ) Then
  466. X`09   Write( 6, 1030 ) '++ There are ', Num_Members,`20
  467. X`091`09`09`09' members ++'
  468. X`09Else
  469. X`09   Write( 6, 1030 ) '++ There is ', Num_Members, ' member ++'
  470. X`09EndIf
  471. X
  472. X`09Write( 6, 1020 ) ' '
  473. X`09Write( 6, 1008 )
  474. X`09Write( 6, 1009 )
  475. X`09Do I = 1, Num_Members
  476. X`09  K = Index( Member_Names(I), '.' )`09`09! Make sure that`20
  477. X`09  If ( K .eq. 0 ) Then`09`09`09`09! that created files
  478. X`09    K = 1`09`09`09`09`09! don't get a .DAT
  479. X`09    Do While ( Member_Names(I)(K:K) .ne. ' ' )`09! extension when
  480. X`09      K = K + 1`09`09`09`09`09! extracting a member
  481. X`09    EndDo`09`09`09`09`09! that has no extension
  482. X`09    Member_Names(I)(K:K) = '.'
  483. X`09  EndIf
  484. X`09  NBLKS = Num_Bytes_Arr(I) / 512
  485. X`09  If ( NBLKS*512 .ne. Num_Bytes_ARR(I) ) Nblks = NBlks + 1
  486. X`09  Technique = Techs( Hdr_Vers(I) )
  487. X`09  Actual_Len_Str = '    ??'
  488. X`09  If ( Act_Len(I) .ne. 0 ) Then
  489. X`09    Write( Actual_Len_Str, 1001, Err=160 ) Act_Len(I)
  490. X`09  EndIf
  491. X160`09  Write( 6,1010 ) I, Member_NAMES(I), Num_Bytes_Arr(I), CRCS(I),
  492. X`091`09`09  Mem_Date(I), Mem_Time(I)(1:5), Technique,`20
  493. X`091`09`09  Actual_Len_Str
  494. X`09EndDo
  495. X`0C`0A
  496. X
  497. Xc`09Now lets see if the user wants to extract any members
  498. X
  499. X200`09Continue
  500. X`09Type 1020, ' '
  501. X`09Type 1020, '$Enter command (? for list) `5BX`5D: '
  502. X`09Accept 1020, ANS
  503. X`09If ( ANS .eq. ' ' ) ANS = 'X'
  504. X`09If ( ANS .eq. 'x' .or. ANS .eq. 'X' ) Goto 800
  505. X
  506. X`09View_flg = .False.
  507. X`09Extr_flg = .False.
  508. X`09Bin_flg  = .False.
  509. X`09Ivcr = 0
  510. X
  511. X`09If ( ANS .eq. '?' ) Goto 230
  512. X`09If ( ANS .eq. 'l' .or. ANS .eq. 'L' ) GoTo 150
  513. X`09If ( ANS .eq. 'n' .or. ANS .eq. 'N' ) GoTo 700
  514. X   `09If ( ANS .eq. 'i' .or. ANS .eq. 'I' ) ivcr=-1
  515. X   `09If ( ANS .eq. 'k' .or. ANS .eq. 'K' ) ivcr=+1
  516. X`09If ( ANS .eq. 'v' .or. ANS .eq. 'V' ) View_flg = .True.
  517. X`09If ( ANS .eq. 'e' .or. ANS .eq. 'E' ) Extr_flg = .True.
  518. X
  519. X`09If ( View_flg .or. Extr_flg ) GoTo 250
  520. Xc Allow K and I modes to set carriage control for terminal
  521. Xc output...
  522. X`09If(ivcr.eq.0)goto 207
  523. X`09If(ivcr.eq.-1)View_cr=.false.
  524. X`09If(ivcr.eq.1)View_cr=.True.
  525. X`09Goto 200
  526. X207`09Continue
  527. X
  528. X210`09Type *, '-- Illegal Command --'
  529. X
  530. X230`09Continue
  531. X`09Type 1020, ' '
  532. X`09Type 1020, ' Commands available:'
  533. X`09Type 1020, ' '
  534. X`09Type 1020, '   E - Extract a member to a file'
  535. X`09Type 1020, '   L - List the directory again'
  536. X`09Type 1020, '   N - Get a new library file'
  537. X`09Type 1020, '   V - View member at terminal'
  538. X`09Type 1020, '   K - Convert isolated CR or LF to CRLF'
  539. X`09Type 1020, '   I - Leave isolated CR or LF alone (image)'
  540. X`09Type 1020, '   X - No option wanted (exit)'
  541. X`09Type 1020, '   ? - Display this list'
  542. X
  543. X`09GoTo 200
  544. X
  545. X250`09Continue
  546. X`09Type 1400
  547. X`09Accept 1410, N
  548. X
  549. X`09If ( N .le. 0 ) Then
  550. X`09  Type *, '-- Illegal member number --'
  551. X`09  Goto 250
  552. X`09EndIf
  553. X
  554. X`09IF (N .GT. NUM_MEMBERS) THEN
  555. X`09   N1 = 1
  556. X`09   N2 = NUM_MEMBERS
  557. X`09ELSE
  558. X`09   N1 = N
  559. X`09   N2 = N
  560. X`09ENDIF
  561. X
  562. X`09If ( .Not. LBR_Flg ) GoTo 500
  563. X`0C`0A
  564. X
  565. XC`09Now handle selection from .LBR file
  566. X
  567. X300`09Continue
  568. X
  569. X`09DO N = N1, N2
  570. X
  571. X`09Call Position_Lib( First_Byte_Arr(N) )
  572. X`09Remaining_Size = Num_Bytes_Arr(N)
  573. X
  574. X`09CRC_Val = 0
  575. X
  576. X`09If ( Hdr_Vers(N) .eq. 4 ) Then
  577. X`09  Squeezed = .True.
  578. X`09  Call LBR_Init_UnSq`09`09`09`09! Init the decode tree
  579. X`09Else
  580. X`09  Squeezed = .False.
  581. X`09EndIf
  582. X
  583. X`09Call Open_Ext_File( File_Name )`09`09! Open the output LUN
  584. X
  585. X`09If ( Squeezed ) Then
  586. X`09  Call Get_Char_Sq( I2 )
  587. X`09  Do While (( I2 .ne. -1 ) .and. .Not. Cancel_Op )
  588. X`09    Call Put_Char_UnComp( I2 )
  589. X`09    Call Get_Char_Sq( I2 )
  590. X`09  EndDo
  591. X`09Else
  592. X`09  Call Get_Char( I2 )
  593. X`09  Do While (( I2 .ne. -1 ) .and. .Not. Cancel_op )
  594. X`09    Call Put_Char_CRC( I2 )
  595. X`09    Call Get_Char( I2 )
  596. X`09  EnDDo
  597. X`09EndIf
  598. X
  599. X`09If (Remaining_Size.gt.0) Then
  600. X`09  Call Get_Char_Knt( FBuf, Remaining_Size)`09! Finish CRC
  601. X`09EndIf
  602. X
  603. X`09Call Close_Ext_File( CRCS(N) )
  604. X
  605. X`09ENDDO
  606. X
  607. X`09GoTo 200
  608. X`0C`0A
  609. X
  610. XC`09This code is for the .ARC library format
  611. X
  612. X500`09Continue
  613. X
  614. X`09DO N = N1, N2
  615. X
  616. X`09Call Position_Lib( First_Byte_Arr(N) )
  617. X`09Remaining_Size = Num_Bytes_Arr(N)
  618. X
  619. X`09CRC_Val = 0
  620. X
  621. X`09GoTo ( 510, 510, 520, 530, 590, 590, 590, 540 ), Hdr_Vers(N)
  622. X`09Type *, '--- Illegal or Unknown ARC Header value: ', Hdr_Vers(N)
  623. X`09GoTo 200
  624. X
  625. X510`09Continue `09`09! Extract member that has no compression
  626. X`09Call Open_Ext_File( Member_Names(N) )
  627. X
  628. X`09Call Get_Char( I2 )
  629. X`09Do While (( I2 .ne. -1 ) .and. .Not. Cancel_Op )
  630. X`09  Call Put_Char_CRC( I2 )
  631. X`09  Call Get_Char( I2 )
  632. X`09EnDDo
  633. X`09Goto 595
  634. X
  635. X520`09Continue`09`09! Extract member that uses DLE compression
  636. X`09Call Open_Ext_File( Member_Names(N) )      `20
  637. X
  638. X`09Call Get_Char( I2 )
  639. X`09Do While (( I2 .ne. -1 ) .and. .Not. Cancel_Op )
  640. X`09  Call Put_Char_UnComp( I2 )
  641. X`09  Call Get_Char( I2 )
  642. X`09EnDDo
  643. X`09Goto 595
  644. X
  645. X530`09Continue`09`09! Extract Member that uses Huffman squeeze
  646. X`09Call Open_Ext_File( Member_Names(N) )
  647. X
  648. X`09Type *, ' '
  649. X`09Type *, '--- Warning --- File may not extract properly ---'
  650. X`09Type *, ' '
  651. X
  652. X`09Call Init_Unsq
  653. X`09Call Get_Char_Sq( I2 )
  654. X`09Do While (( I2 .ne. -1 ) .and. .Not. Cancel_Op )
  655. X`09  Call Put_Char_UnComp( I2 )
  656. X`09  Call Get_Char_Sq( I2 )
  657. X`09EnDDo
  658. X`09Goto 595
  659. X
  660. X540`09Continue
  661. X`09Call Open_Ext_File( Member_Names(N) )
  662. X`09Call DeComp_LZW_Var
  663. X`09Goto 595
  664. X
  665. X590`09Continue
  666. X`09Type *, 'Not implemented yet, Need a newer version'
  667. X`09Type *, '(Also, old crunch options not supported.)'
  668. X`09GoTo 200
  669. X
  670. X595`09Continue
  671. X`09Call Close_Ext_File( CRCS(N) )
  672. X
  673. X`09ENDDO
  674. X
  675. X`09GoTo 200
  676. X
  677. Xc`09Now lets setup for another lib file`20
  678. X
  679. X700`09Continue
  680. X`09Close( Unit=2 )`20
  681. X`09Goto 10
  682. X
  683. X800`09Continue
  684. X
  685. X`09Call Exit
  686. X`0C`0A
  687. X
  688. X900`09Continue
  689. X`09If ( IOS .gt. 68 ) Then
  690. X`09  Type *,'Unkown error on OPEN:', IOS
  691. X`09Else`20
  692. X`09  Type *, 'Error on OPEN: ', For_IOS( IOS )
  693. X`09EndIf
  694. X
  695. X`09Call Exit
  696. X
  697. X1000`09Format( ' ', a, '     ', i4 )
  698. X1001`09Format( I8 )
  699. X1008`09Format( '   #  Member Name   # Bytes  CRC     Date    Time   ',
  700. X`091`09'Stor. Type  Actual Len' )
  701. X1009`09Format( ' ---- ------------  -------  ----  --------  -----  ',
  702. X`091`09'----------  ----------' )
  703. X1010`09Format( ' ', I3, '. ', a, '  ', I7, '  ', Z4.4, 4( '  ', A ) )
  704. X
  705. X1011`09Format( ' Extracting: ', a, '.', a, ', First Byte: ', I7,`20
  706. X`091`09', # Bytes: ', I7 )
  707. X1020`09Format( a )
  708. X1021`09Format( q, a )
  709. X1030`09Format( ' ', a, I4, a )
  710. X1110`09Format( ' Member#', I3, '. ', a,`20
  711. X`091`09', First: ', i7, ', Number: ', i7  )
  712. X1111`09Format( ' ', A, I7 )
  713. X1400`09Format( '$Enter member number (9999 for all) : ' )
  714. X1410`09Format( I3 )
  715. X
  716. X`09End
  717. X`0C`0A
  718. XC------------------------------------------------------------------------
  719. XC`09Subroutine called to open an output LUN for processing a member
  720. XC`09of library (eitrher .LBR or .ARC)
  721. XC                                                  `20
  722. XC`09Inputs:
  723. XC`09`09File_Name`09Member filename
  724. XC
  725. XC`09Outputs:
  726. XC`09`09The Bin_Flg will be set if the extension of the file is
  727. XC`09`09.EXE, .BIN, .COM, .CMD, .OVR etc...
  728. XC
  729. XC------------------------------------------------------------------------
  730. X
  731. X`09Subroutine Open_Ext_File( File_Name )
  732. X
  733. X`09Implicit None
  734. X
  735. X`09Logical*1`09File_Flg, Squeezed, Ctrlz_Flg
  736. X
  737. X`09Character`09File_Name*(*), Carriage*4, ANS, File_Ext*3
  738. X`09Character`09Open_Name*12
  739. X
  740. X`09Integer`09`09K, I, IOS, Record_Length
  741. X
  742. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  743. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  744. X`09Integer`09`09Remaining_Size
  745. X`09Integer*2`09CRC_Val
  746. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  747. V0
  748. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  749. X
  750. X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
  751. X`09Integer`09   `09Out_Index, Out_Length, Out_Num
  752. X`09Byte`09`09In_Buf(4096), Out_Buf(512)
  753. X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
  754. X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
  755. X
  756. X`09Character`09For_IOS(68)*30
  757. X`09Common`09/ForIOS/ For_IOS
  758. X
  759. X`09Out_Num = 0
  760. X`09Bin_Flg = .True.
  761. X`09K = Index( File_Name, '.' )
  762. X`09If ( K. eq. 0 )Then
  763. X`09  Type *, 'Is ', File_Name, ' a text file? '
  764. X`09  Accept 1100, Ans
  765. X`09  If ( Ans .eq. 'y' .or. Ans .eq. 'Y' ) Bin_Flg = .False.
  766. X`09Else
  767. X`09  File_Ext = File_Name(K+1:K+3)
  768. X`09  Do K = 1, 3`09`09`09! Upcase the extension
  769. X`09    If ( File_Ext(K:K) .ge. 'a' .and. File_Ext(K:K) .le. 'z' ) Then
  770. X`09      File_Ext(K:K) = Char( Ichar( File_Ext(K:K) ) - '40'o )
  771. X`09    EndIf
  772. X`09  EndDo
  773. X          K = Index( ' LBR ARC COM EXE REL CMD COM OVR BIN', File_Ext )
  774. X`09  Bin_Flg = .False.`20
  775. X`09  If ( K .ne. 0 ) Bin_Flg = .True.
  776. X`09EndIf
  777. X
  778. X`09If ( .Not. Bin_Flg ) Then
  779. X`09  Type *, '++ Member being treated as Text (Bit 8 cleared) ++'
  780. X`09EndIf
  781. X
  782. X`09If ( View_flg .and. Bin_Flg ) Then
  783. X`09  Type *, '---> Can''t view a binary file, extracting...'
  784. X`09  View_Flg = .False.
  785. X`09EndIf
  786. X
  787. X`09If ( Bin_Flg ) Then
  788. X`09  Out_Length = 128
  789. X`09  Carriage = 'NONE'
  790. X`09Else
  791. X`09  Out_Length = 510
  792. X`09  Carriage = 'LIST'
  793. X`09EndIf
  794. X
  795. X`09Cancel_op = .False.
  796. X
  797. X`09If ( View_flg ) Then
  798. X`09  Open_Name = 'Sys$OutPut'
  799. X`09Else
  800. X`09  OPen_Name = File_Name
  801. X`09  Do I = 1, 11
  802. X`09    If ( Open_Name(I:I) .eq. '-' ) Open_Name(I:I) = '_'
  803. X`09  EndDo
  804. X`09  Write( 6, * ) 'Extracting to ', Open_Name, '...'
  805. X`09EndIf
  806. X
  807. X`09If ( .Not. AST_On_Flg ) Then
  808. X`09  Call Cancel_AST_Start
  809. X`09  AST_On_Flg = .True.
  810. X`09EndIf
  811. X
  812. X`09Type *, '+++ To cancel operation type Ctrl-C +++'
  813. X`09Type *, ' '
  814. X
  815. X`09Open( Unit=1, File=Open_Name, Status='NEW', RecL=Out_Length,`20
  816. X`091     IoStat=IOS, CarriageControl=Carriage, Err=900 )
  817. X
  818. X`09Return
  819. X
  820. X900`09Continue
  821. X`09Type *, 'Error opening file: ', FOR_IOS( IOS )
  822. X`09Return
  823. X
  824. X1100`09Format( A )
  825. X
  826. X`09End
  827. X`0C`0A
  828. XC------------------------------------------------------------------------
  829. XC`09Subroutine used to close the open LUN used for extract and View
  830. XC`09commands. Insures that the last partial buffer is written.
  831. XC
  832. XC`09Inputs:
  833. XC`09`09Uses info in buffer common to empty the output buffer
  834. XC`09`09If needed.
  835. XC
  836. XC`09Outputs:
  837. XC`09`09The last buffer is emptied before closing the LUN
  838. XC
  839. XC------------------------------------------------------------------------
  840. X
  841. X`09Subroutine Close_Ext_File( Mem_CRC )
  842. X
  843. X`09Implicit None
  844. X
  845. X`09Byte`09`09B(2)
  846. X`09Integer*2`09Mem_CRC, Loc_CRC, KeepCRC
  847. X
  848. X`09Equivalence`09( Loc_CRC, B(1) )
  849. X
  850. X`09Integer `09K
  851. X
  852. X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
  853. X`09Integer`09 `09Out_Index, Out_Length, Out_Num
  854. X`09Byte`09`09In_Buf(4096), Out_Buf(512)
  855. X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
  856. X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
  857. X
  858. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  859. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  860. X`09Integer`09`09Remaining_Size
  861. X`09Integer*2`09CRC_Val
  862. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  863. V0
  864. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  865. X
  866. Xc`09Start of routine code
  867. X
  868. X`09Loc_CRC = Mem_CRC          `20
  869. X
  870. X`09If ( Out_Index .gt. 1 ) Then
  871. X`09  Write( 1, 1100 ) (Out_Buf(K), K=1,Out_Index)
  872. X`09  Out_Num = Out_Num + 1
  873. X`09  Out_Index = 1
  874. X`09EndIf
  875. X
  876. X`09If ( Cancel_Op ) Then
  877. X`09  Close( Unit=1, Disp='DELETE' )
  878. X`09Else
  879. X`09  Close( Unit=1 )
  880. X`09  KeepCRC = CRC_Val
  881. X`09  If ( .Not. LBR_Flg ) Then
  882. X`09    Call ARC_CRC( CRC_Val, B(1) )
  883. X`09    Call ARC_CRC( CRC_Val, B(2) )
  884. X`09  Else
  885. X`09    Call LBR_CRC( CRC_Val, B(2) )
  886. X`09    Call LBR_CRC( CRC_Val, B(1) )
  887. X`09  EndIf
  888. X`09  If ( Mem_CRC .ne. 0 ) Then`09`09! Zero CRC means no check
  889. X`09    If ( CRC_Val .ne. 0 ) Then
  890. X`09      Type *,'--- Warning --- CRC Error ---'
  891. X`09      Type 2000, Mem_CRC, KeepCRC, Crc_Val
  892. X2000`09      Format( ' Member CRC: ', Z4.4, ', Calc''d CRC: ', Z4.4,`20
  893. X`091`09`09', Final value CRC: ', Z4.4 )
  894. X`09    EndIf
  895. X`09  EndIf
  896. X`09EndIf
  897. X
  898. X`09If ( .Not. View_Flg .and. .Not. Cancel_Op ) Then
  899. X`09  If ( Bin_Flg )Then
  900. X`09    Type 1000, Out_Num
  901. X`09  Else
  902. X`09    Type 1001, Out_Num
  903. X`09  EndIf
  904. X`09EndIf
  905. X
  906. X`09Return
  907. X1000`09Format( //' --> ', I6, ' Records written' )
  908. X1001`09Format( //' --> ', I6, ' Lines written' )
  909. X1100`09Format( 510A1 )
  910. X
  911. X`09End
  912. X`0C`0A
  913. XC------------------------------------------------------------------------
  914. XC`09Subroutine used to get the next byte from the input buffer
  915. XC`09If the input buffer is empty the next record will be read`20
  916. XC
  917. XC`09Inputs:
  918. XC`09`09Common containing information about the buffers
  919. XC
  920. XC`09OutPut:
  921. XC`09`09C is the next byte value from the input buffer
  922. XC
  923. XC------------------------------------------------------------------------
  924. X
  925. X`09Subroutine Get_Byte( C )
  926. X
  927. X`09Implicit None
  928. X
  929. X`09Byte`09`09C
  930. X
  931. X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
  932. X`09Integer`09 `09Out_Index, Out_Length, Out_Num
  933. X`09Byte`09`09In_Buf(4096), Out_Buf(512)
  934. X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
  935. X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
  936. X
  937. X`09If ( Buf_Index .gt. Buf_Length ) Then
  938. X`09    Call Position_Lib( Last_In + 1 )
  939. X`09EndIf
  940. X
  941. X`09C = In_Buf( Buf_Index )
  942. X`09Buf_Index = Buf_Index + 1
  943. X
  944. X`09Return
  945. X`09End
  946. X`0C`0A
  947. XC------------------------------------------------------------------------
  948. XC`09Subroutine used to get the next byte from the input buffer
  949. XC`09Call Get_Byte after checking remaining size of member
  950. XC
  951. XC`09Inputs:
  952. XC`09`09Common containing information about the member
  953. XC
  954. XC`09OutPut:
  955. XC`09`09I is the next byte value from the input buffer in I*2
  956. XC
  957. XC------------------------------------------------------------------------
  958. X
  959. X`09Subroutine Get_Char( I )
  960. X
  961. X`09Implicit None
  962. X
  963. X`09Integer*2`09I, W
  964. X`09Byte`09`09C
  965. X
  966. X`09Integer*4`09Knt
  967. X
  968. X`09Equivalence`09( W, C )
  969. X
  970. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  971. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  972. X`09Integer`09`09Remaining_Size
  973. X`09Integer*2`09CRC_Val
  974. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  975. V0
  976. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  977. X
  978. X`09W = 0
  979. X`09If ( remaining_Size .gt. 0 ) Then
  980. X`09    Call Get_Byte( C )
  981. X`09    Remaining_Size = Remaining_Size - 1
  982. X`09    If ( LBR_Flg ) Then
  983. X`09`09Knt = Knt + 1
  984. X`09`09Call LBR_CRC( CRC_Val, C )
  985. Xc`09`09Type 10, 'Knt: ', Knt, ', Char: ', C, ', CRC: ', CRC_Val
  986. Xc10`09`09Format( x, A, I5, A, Z2, A, Z4.4 )
  987. X`09    EndIf
  988. X`09Else
  989. X`09    W = -1
  990. X`09EndIf
  991. X
  992. X`09I = W
  993. X
  994. X`09Return
  995. X`09End
  996. X`0C`0A
  997. XC------------------------------------------------------------------------
  998. XC`09Subroutine used to get KNT bytes from input
  999. XC`09Call the Get_Byte subroutine to minimize buffer manipulation
  1000. XC
  1001. XC`09Input:
  1002. XC`09`09Buffer address to fill
  1003. XC`09`09KNT number of bytes to fill
  1004. XC
  1005. XC`09Output:
  1006. XC`09`09Fills parameter buffer with KNT bytes
  1007. XC
  1008. XC------------------------------------------------------------------------
  1009. X
  1010. X`09Subroutine Get_Byte_Knt( Buf, Knt )
  1011. X
  1012. X`09Implicit None
  1013. X
  1014. X`09Integer`09`09Knt, I
  1015. X
  1016. X`09Byte`09`09Buf(KNT)
  1017. X
  1018. X`09Do I = 1, KNT
  1019. X`09    Call Get_Byte( Buf(I) )
  1020. X`09EndDo
  1021. X
  1022. X`09Return
  1023. X`09End
  1024. X`0C`0A
  1025. XC------------------------------------------------------------------------
  1026. XC`09Subroutine used to get KNT bytes from input
  1027. XC`09Call the Get_Char subroutine to minimize buffer manipulation
  1028. XC
  1029. XC`09Input:
  1030. XC`09`09Buffer address to fill
  1031. XC`09`09KNT number of bytes to fill
  1032. XC
  1033. XC`09Output:
  1034. XC`09`09Fills parameter buffer with KNT bytes
  1035. XC
  1036. XC------------------------------------------------------------------------
  1037. X
  1038. X`09Subroutine Get_Char_Knt( Buf, Knt )
  1039. X
  1040. X`09Implicit None
  1041. X
  1042. X`09Integer`09`09Knt, I
  1043. X
  1044. X`09Byte`09`09Buf(KNT)
  1045. X
  1046. X`09Do I = 1, KNT
  1047. X`09    Call Get_Char( Buf(I) )
  1048. X`09EndDo
  1049. X
  1050. X`09Return
  1051. X`09End
  1052. X`0C`0A
  1053. XC------------------------------------------------------------------------
  1054. XC`09Subroutine that translates a byte to ASCII
  1055. XC
  1056. XC`09Input:
  1057. XC`09`09Will call Get_Char to get a bytes needed for translation
  1058. XC
  1059. XC`09Output:
  1060. XC`09`09The translated value (unsqueezed) in I*2 format
  1061. XC
  1062. XC------------------------------------------------------------------------
  1063. X
  1064. X`09Subroutine Get_Char_Sq( W )
  1065. X
  1066. X`09Implicit None
  1067. X
  1068. X`09Integer*2`09SpEOF
  1069. X`09Parameter`09( SPEOF = 256 )
  1070. X
  1071. X`09Integer*2`09W
  1072. X`09Integer*2`09I, K, CurIn
  1073. X
  1074. X`09Integer*2`09DNode(0:255,0:1), BPos
  1075. X`09Common`09/UnSq/`09DNode, BPos
  1076. X
  1077. X`09I = 0
  1078. X`09Do While ( I .ge. 0 )
  1079. X`09  BPos = BPos + 1
  1080. X`09  If ( BPos .gt. 7 ) Then
  1081. X`09    BPos = 0
  1082. X`09    Call Get_Char( CurIN )
  1083. X`09    If ( Curin .eq. -1 ) Then
  1084. X`09      W = -1
  1085. X`09      Return
  1086. X`09    EndIf
  1087. X`09  Else
  1088. X`09    Curin = Ishft( Curin, -1 )`09`09!!!VMS!!! VAX intrinsic function
  1089. X`09  EndIf
  1090. X`09  K = Curin .and. 1
  1091. X`09  I = DNode( I, K )
  1092. X`09EndDo
  1093. X
  1094. X`09I = -( I + 1 )
  1095. X`09If ( I .eq. SPEOF ) Then
  1096. Xc`09  Type *, 'Special End of File found'
  1097. X`09  W = -1
  1098. X`09Else
  1099. X`09  W = I
  1100. X`09EndIf
  1101. X`09Return
  1102. X`09End                       `20
  1103. X`0C`0A
  1104. XC------------------------------------------------------------------------
  1105. XC`09Subroutine used to put a byte into outbut buffer and will check
  1106. XC`09for compression using the DLE technique
  1107. XC
  1108. XC`09Input:
  1109. XC`09`09W`09I*2 value holding the char to output
  1110. XC
  1111. XC`09Output:        `20
  1112. XC`09`09Places data into the output buffer
  1113. XC
  1114. XC------------------------------------------------------------------------
  1115. X
  1116. X`09Subroutine Put_Char_UnComp( W )
  1117. X
  1118. X`09Implicit None
  1119. X
  1120. X`09Integer*2`09DLE
  1121. X`09Parameter`09( DLE = '90'x )
  1122. X
  1123. X`09Integer*2`09W, WC, RepCt, LastC
  1124. X
  1125. X`09Byte`09`09C
  1126. X
  1127. X`09Equivalence`09( WC, C )
  1128. X
  1129. X`09Data`09RepCt`09/0/
  1130. X
  1131. X`09If ( Repct .gt. 0 ) Then`09`09! Are we repeating a char?
  1132. X`09  If ( W .eq. 0 ) Then
  1133. X`09    Call Put_Char_Crc( DLE )`09`09! DLE was a real one
  1134. X`09  Else`09`09`09`09`09! Count is what we have
  1135. X`09    RepCt = W`09`09`09`09! Set the count right
  1136. X`09    repct = repct - 1`09`09`09! Now put the proper
  1137. X`09    Do While ( repCt .gt. 0 )`09`09!  number of characters
  1138. X`09      Call Put_Char_Crc( LastC )`09!  into the buffer
  1139. X`09      repct = repct - 1
  1140. X`09    EndDo
  1141. X`09  EndIf
  1142. X`09  repct = 0`09`09`09`09! All done with this repeat
  1143. X`09Else`09`09`09`09`09! Not repeating yet
  1144. X`09  If ( W .eq. DLE ) Then`09`09! Repeat introducer?
  1145. X`09    RepCt = 1`09`09`09`09! Yes, flag the repeat
  1146. X`09  Else`09`09`09`09`09! No, just put the char
  1147. X`09    Call Put_Char_Crc( W )`09`09! Always save last sent
  1148. X`09    LastC = W
  1149. X`09  EndIf
  1150. X`09EndIf
  1151. X
  1152. X`09Return
  1153. X`09End
  1154. X`0C`0A
  1155. XC------------------------------------------------------------------------
  1156. XC`09Subroutine that places a byte into the output buffer
  1157. XC
  1158. XC`09Input:
  1159. XC`09`09A byte value
  1160. XC
  1161. XC`09OutPut:
  1162. XC`09`09The byte will be placed into the output buffer. When the
  1163. XC`09`09buffer is full then it will be written.
  1164. XC
  1165. XC------------------------------------------------------------------------
  1166. X
  1167. X`09Subroutine Put_Byte( C )
  1168. X
  1169. X`09Implicit None
  1170. X
  1171. X`09Byte`09`09CR, LF
  1172. X`09Parameter`09( LF = '12'o )
  1173. X`09Parameter`09( CR = '15'o )
  1174. X
  1175. X`09Byte`09`09C
  1176. X
  1177. X`09Logical*1`09CR_Flg
  1178. X
  1179. X`09Integer `09K
  1180. X
  1181. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  1182. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  1183. X`09Integer`09`09Remaining_Size
  1184. X`09Integer*2`09CRC_Val
  1185. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  1186. V0
  1187. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  1188. X
  1189. X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
  1190. X`09Integer`09 `09Out_Index, Out_Length, Out_Num
  1191. X`09Byte`09`09In_Buf(4096), Out_Buf(512)
  1192. X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
  1193. X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
  1194. X
  1195. X`09Data`09CR_Flg /.False./
  1196. X
  1197. X`09If ( .Not. Bin_Flg ) Then
  1198. X`09  C = C .and. '7F'x
  1199. X`09  If ( C .eq. '1a'x ) Then`09`09! If `5Ez don't put in file
  1200. Xc`09    Remaining_Size = 0
  1201. X`09    Return
  1202. X`09  EndIf
  1203. X
  1204. X`09  If ((C.eq.LF.or.C.eq.CR).and.View_cr)Then
  1205. Xc Write out line if CR or LF up to what's saved alread.
  1206. Xc View_Cr mode only...
  1207. X`09    Write(1, 1100) (Out_Buf(K), K=1,Out_Index-1)
  1208. X`09    Out_Index=1
  1209. X`09    Out_Num = Out_Num+1
  1210. X`09    CR_FLG = .False.
  1211. X`09    Return
  1212. X`09  Endif
  1213. X`09  If ( CR_Flg ) Then
  1214. X`09    If ( C .eq. LF ) Then
  1215. X`09      Write( 1, 1100 ) (Out_Buf(K), K=1,Out_Index-1)
  1216. X`09      Out_Index = 1
  1217. X`09      Out_Num = Out_Num + 1
  1218. X`09      CR_Flg = .False.
  1219. X`09      Return
  1220. X`09    Else
  1221. X`09      Out_Buf( Out_Index ) = CR
  1222. X`09      Out_Index = Out_Index + 1
  1223. X`09      If ( Out_Index .gt. Out_Length ) Then
  1224. X`09       Write( 1, 1100 ) (Out_Buf(K), K=1,Out_Length )
  1225. X`09       Out_Index = 1
  1226. X`09       Out_Num = Out_Num + 1
  1227. X`09      EndIf
  1228. X`09    EndIf
  1229. X`09  EndIf
  1230. X`09  If ( C .eq. CR ) Then
  1231. X`09    CR_Flg = .True.
  1232. X`09    Return
  1233. X`09  EndIf
  1234. X`09  Cr_Flg = .False.
  1235. X`09EndIf
  1236. X
  1237. X`09Out_Buf( Out_Index ) = C
  1238. X`09Out_Index = Out_Index + 1
  1239. X
  1240. X`09If ( Out_Index .gt. Out_Length ) Then
  1241. X`09  Write( 1, 1100 ) (Out_Buf(K), K=1,Out_Length )
  1242. X`09  Out_Index = 1
  1243. X`09  Out_Num = Out_Num + 1
  1244. X`09EndIf
  1245. X
  1246. X`09Return
  1247. X
  1248. X1100`09Format( 510A1 )
  1249. X
  1250. X`09End
  1251. X`0C`0A
  1252. XC------------------------------------------------------------------------
  1253. XC`09Subroutine that is used to calc a CRC`20
  1254. XC
  1255. XC`09Input:
  1256. XC`09`09I*2 with the character to add to the CRC
  1257. XC
  1258. XC`09Output:
  1259. XC`09`09Call Put_Byte to add the byte to the output buffer
  1260. XC
  1261. XC------------------------------------------------------------------------
  1262. X
  1263. X`09Subroutine Put_Char_Crc( W )
  1264. X
  1265. X`09Implicit None
  1266. X
  1267. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  1268. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  1269. X`09Integer`09`09Remaining_Size
  1270. X`09Integer*2`09CRC_Val
  1271. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  1272. V0
  1273. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  1274. X
  1275. X`09Integer*2`09W, Wc, Knt
  1276. X
  1277. X`09Byte`09`09C
  1278. X
  1279. X`09Equivalence`09( Wc, C )
  1280. X
  1281. X`09Wc = W
  1282. X`09Call Put_Byte( C )
  1283. X
  1284. X`09If ( .Not. Lbr_Flg ) Then
  1285. X`09  Call ARC_CRC( CRC_Val, C )
  1286. Xc`09  Type 10, 'Rem: ', Remaining_size, ', Char: ', C, ', CRC: ', CRC_Val
  1287. Xc10`09  Format( x, A, I5, A, Z2, A, Z4.4 )
  1288. X`09EndIf
  1289. X
  1290. X`09Return
  1291. X`09End
  1292. X`0C`0A
  1293. XC------------------------------------------------------------------------
  1294. XC`09Subroutine that process the header of a squeezed member of a`20
  1295. XC`09LBR file.`20
  1296. XC
  1297. XC------------------------------------------------------------------------
  1298. X
  1299. X`09Subroutine LBR_Init_UnSq
  1300. X
  1301. X`09Implicit None
  1302. X
  1303. X`09Integer*2`09I2, K
  1304. X
  1305. X`09Byte`09`09C
  1306. X
  1307. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  1308. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  1309. X`09Integer`09`09Remaining_Size
  1310. X`09Integer*2`09CRC_Val
  1311. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  1312. V0
  1313. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  1314. X
  1315. X`09Call Get_Char_KNT( I2, 2 )`09`09! Read first 2 bytes
  1316. X`09Call Get_Char_Knt( I2, 2 )`09`09! Get past the CRC
  1317. X`09Call Get_Char( C )`09`09`09! Get the member orig name
  1318. X`09Do While ( C .ne. 0 )`09`09`09!  Read all of it
  1319. X`09  Call Get_Char( C )`09`09`09!  until we point to the
  1320. X`09EndDo`09`09`09`09`09!  decode tree
  1321. X
  1322. X`09Call Init_UnSq`09`09`09`09! Read the decode tree
  1323. X
  1324. X`09Return
  1325. X`09End
  1326. X`0C`0A
  1327. XC------------------------------------------------------------------------
  1328. XC`09Subroutine that sets up the translation array for the specified`20
  1329. XC`09member`20
  1330. XC
  1331. XC`09Input:
  1332. XC
  1333. XC`09Output:
  1334. XC`09`09The translation node array is filled in`20
  1335. XC
  1336. XC------------------------------------------------------------------------
  1337. X
  1338. X`09Subroutine Init_UnSq
  1339. X
  1340. X`09Implicit None
  1341. X
  1342. X`09Integer*2`09SpEOF
  1343. X`09Parameter`09( SPEOF = 256 )
  1344. X
  1345. X`09Integer*2`09I, NumNodes
  1346. X
  1347. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  1348. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  1349. X`09Integer`09`09Remaining_Size
  1350. X`09Integer*2`09CRC_Val
  1351. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  1352. V0
  1353. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  1354. X
  1355. X`09Integer*2`09DNode(0:255,0:1), BPos
  1356. X`09Common`09/UnSq/`09DNode, BPos
  1357. X
  1358. X`09Call Get_Char_Knt( NumNodes, 2 )
  1359. X
  1360. X`09BPos = 100
  1361. X`09Dnode(0,0) = -(SPEOF+1)
  1362. X `09Dnode(0,1) = -(SPEOF+1)
  1363. X
  1364. X`09NumNodes = NumNodes - 1
  1365. X
  1366. X`09Do I = 0, NumNodes
  1367. X`09  Call Get_Char_Knt( DNode( I, 0 ), 2 )
  1368. X`09  Call Get_Char_Knt( DNode( I, 1 ), 2 )
  1369. X`09EndDo
  1370. X
  1371. Xd`09  Write( 6, * ) 'Translation arrays:'
  1372. Xd`09  Do I = 0, NumNodes
  1373. Xd`09    Write( 6, 1000 ) I, Dnode(I,0), Dnode(I,1)
  1374. Xd1000`09    Format( ' #', I3, 2( ' ', Z4.4 ) )
  1375. Xd`09  EndDo
  1376. X
  1377. X`09Return
  1378. X`09End
  1379. X`0C`0A
  1380. XC------------------------------------------------------------------------
  1381. XC`09Subroutine called to position to a specified byte of a library`20
  1382. XC`09file opened on LUN 2
  1383. XC
  1384. XC`09Inputs:
  1385. XC`09`09Byte_Lk`09`09The first byte wanted
  1386. XC
  1387. XC`09Outputs:
  1388. XC`09`09Will put the requested byte in the buffer
  1389. XC
  1390. XC------------------------------------------------------------------------
  1391. X
  1392. X`09Subroutine Position_Lib( Byte_Lk )
  1393. X
  1394. X`09Implicit None
  1395. X
  1396. X`09Character`09For_IOS(68)*30
  1397. X`09Common`09/ForIOS/ For_IOS
  1398. X
  1399. X`09Integer`09`09I, J, K, L, Q, Byte_Lk, IoS
  1400. X
  1401. X`09Integer`09`09First_In, Last_In, Buf_Index, Buf_Length
  1402. X`09Integer`09 `09Out_Index, Out_Length, Out_Num
  1403. X`09Byte`09`09In_Buf(4096), Out_Buf(512)
  1404. X`09Common`09/Buffers/ First_In, Last_In, Buf_Index, Buf_Length, In_Buf,
  1405. X`091`09`09Out_Buf, Out_Index, Out_Length, Out_Num
  1406. X
  1407. XC`09Check the starting byte that is requested
  1408. X
  1409. X100`09Continue
  1410. X`09If ( Byte_Lk .lt. First_In ) Goto 150`09`09! Need to REWIND file
  1411. X`09If ( Byte_Lk .gt. Last_In ) Goto 200`09`09! Read the next buffer
  1412. X
  1413. XC`09Otherwise byte is in the current buffer
  1414. X
  1415. X`09Buf_Index = Byte_Lk - First_In + 1
  1416. X
  1417. X`09Return
  1418. X
  1419. XC`09Needed to start over in the file
  1420. X
  1421. X150`09Continue             `20
  1422. X
  1423. X`09Rewind`092
  1424. X`09Last_In = 0
  1425. X
  1426. XC`09Read the next buffer
  1427. X
  1428. X200`09Continue
  1429. X`09Do I = 1, 4096
  1430. X`09  In_Buf(I) = 0
  1431. X`09EndDo
  1432. X`09Read( 2, 1010, End=500, Err=800, IoStat=IOS ) Q, ( In_Buf(K),K=1,Q )
  1433. X
  1434. Xd`09Write( 6, 1111 ) ( In_Buf(K),K=1,128 )
  1435. Xd1111`09Format( 8(/' ', 16( z2.2, ' ' ) ) )
  1436. X
  1437. X`09Buf_Length = Q
  1438. X`09First_In = Last_In + 1
  1439. X`09Last_In = First_In + Buf_Length - 1
  1440. X
  1441. X`09Goto 100
  1442. X
  1443. XC`09End of File Encountered while attempting to find a sector
  1444. X
  1445. X500`09Continue
  1446. X`09Rewind 2
  1447. X`09First_In = 0
  1448. X`09Last_In = 0
  1449. X
  1450. X`09Return
  1451. X
  1452. XC`09Error occurred on read
  1453. X
  1454. X800`09Continue
  1455. X`09If ( IOS .gt. 68 ) Then
  1456. X`09  Type *, 'Unknown error on READ: ', IOS
  1457. X`09Else
  1458. X`09  Type *, 'Error on READ: ', For_IOS( IOS )
  1459. X`09EndIf
  1460. X
  1461. X`09Return
  1462. X
  1463. X1010`09Format( Q, 4096A1 )
  1464. X
  1465. X`09End
  1466. X`0C`0A
  1467. XC---------------------------------------------------------------------------
  1468. V----
  1469. XC`09Subroutine used to convert a time in MSDOS I*2 format to a string
  1470. XC`09This routine calls a VMS FORTRAN shift routine (ISHFT).
  1471. XC
  1472. XC`09Inputs:
  1473. XC`09`09T`092 byte value containing time`20
  1474. XC`09`09`09Format: Bits 0-4 is number of 2 sec intervals
  1475. XC`09`09`09`09Bits 5-10 is number of minutes
  1476. XC`09`09`09`09Bits 11-15 is the number of hours
  1477. XC`09Outputs:
  1478. XC`09`09T_Str`09in form: hh:mm:ss
  1479. XC
  1480. XC---------------------------------------------------------------------------
  1481. V----
  1482. X
  1483. X`09Subroutine Time_Str( T, T_Str )
  1484. X
  1485. X`09Implicit None
  1486. X
  1487. X`09Integer*2`09T, Work
  1488. X`09Integer`09`09Sec, Hr, Min
  1489. X
  1490. X`09Character`09T_Str*(*)
  1491. X
  1492. X`09Integer*2`09H_Mask, M_Mask, S_Mask
  1493. X`09Parameter`09( H_Mask = 'F800'x,`20
  1494. X`091`09`09  M_Mask = '07E0'x,`20
  1495. X`091`09`09  S_Mask = '001F'x )
  1496. X
  1497. X`09Work = T .and. S_Mask
  1498. X`09Sec = Work
  1499. X
  1500. X`09Work = T .and. M_Mask
  1501. X`09Work = IShft( Work, -5 )`09`09! Shift right 5 !!!VMS!!!
  1502. X`09Min = Work
  1503. X
  1504. X`09Work = T .and. H_Mask
  1505. X`09Work = IShft( Work, -11 )`09`09! Shift right 11 !!!VMS!!!
  1506. X`09Hr = Work
  1507. X
  1508. X`09Write( T_Str, 1000, err = 100 ) Hr, Min, Sec*2
  1509. X
  1510. X`09Return
  1511. X
  1512. X100`09Continue
  1513. X
  1514. X`09T_Str = 'UnKnown'
  1515. X
  1516. X`09Return
  1517. X
  1518. X1000`09Format( I2, 2( ':', I2.2 ) )
  1519. X
  1520. X`09End
  1521. X`0C`0A
  1522. XC---------------------------------------------------------------------------
  1523. V----
  1524. XC`09Subroutine used to convert a date in MSDOS File date format into
  1525. XC`09a year, month and day.`20
  1526. XC
  1527. XC`09This routine uses VMS FORTRAN intrinsic function for shifting
  1528. XC
  1529. XC`09Inputs:
  1530. XC`09`09D`092 byte value containing the date`20
  1531. XC
  1532. XC`09Outputs:
  1533. XC`09`09D_Str`09in form: mm/dd/yy
  1534. XC
  1535. XC---------------------------------------------------------------------------
  1536. V----
  1537. X
  1538. X`09Subroutine ARC_Date_Str( D, D_Str )
  1539. X                 `20
  1540. X`09Implicit None
  1541. X
  1542. X`09Integer*2`09D, Work
  1543. X`09Integer`09`09Yr, Mo, Dy
  1544. X
  1545. X`09Character`09D_Str*(*)
  1546. X
  1547. X`09Integer*2`09Y_Mask, M_Mask, D_Mask
  1548. X`09Parameter`09( Y_Mask = 'FE00'x,`20
  1549. X`091`09`09  M_Mask = '01E0'x,`20
  1550. X`091`09`09  D_Mask = '001F'x )
  1551. X
  1552. X`09Work = D .and. D_Mask
  1553. X`09Dy = Work
  1554. X
  1555. X`09Work = D .and. M_Mask
  1556. X`09Work = IShft( Work, -5 )`09`09! Shift right 5 !!!VMS!!!
  1557. X`09Mo = Work
  1558. X
  1559. X`09Work = D .and. Y_Mask
  1560. X`09Work = IShft( Work, -9 )`09`09! Shift right 9 !!!VMS!!!
  1561. X`09Yr = Work
  1562. X
  1563. X`09Write( D_Str, 1000, err = 100 ) Mo, Dy, Yr+80
  1564. X
  1565. X`09Return
  1566. X
  1567. X100`09Continue
  1568. X
  1569. X`09D_Str = 'UnKnown'
  1570. X
  1571. X`09Return
  1572. X
  1573. X1000`09Format( I2, 2( '/', I2.2 ) )
  1574. X
  1575. X`09End
  1576. X`0C`0A
  1577. XC---------------------------------------------------------------------------
  1578. V----
  1579. XC`09Subroutines used to convert a count of days from a base date to
  1580. XC`09a year, month and day. The base date can be selected.
  1581. XC`09This routine uses VMS RTL routines for date and time manipulation.
  1582. XC
  1583. XC`09Inputs:
  1584. XC`09`09BY`09Base year (ie. 80 is 1-Jan-1980 is day 1)
  1585. XC`09`09D`092 byte value containing the date that is the number
  1586. XC`09`09`09of days since a base date
  1587. XC
  1588. XC`09Outputs:
  1589. XC`09`09D_Str`09in form: mm/dd/yy
  1590. XC
  1591. XC---------------------------------------------------------------------------
  1592. V----
  1593. X
  1594. X`09Subroutine LBR_Date_Str( BY, D, D_Str )
  1595. X
  1596. X`09Implicit None
  1597. X
  1598. X`09Integer*2`09D, Num_Time(7)
  1599. X
  1600. X`09Integer`09`09BY, Work, Delta(2), Base(2), Act_Date(2)
  1601. X
  1602. X`09Integer`09`09Lib$SubX, Sys$BinTim, Sys$NumTim, Stat`09!!!VMS!!!
  1603. X
  1604. X`09Character`09D_Str*(*), Temp_Str*23, Err
  1605. X
  1606. X`09Err = 'T'
  1607. X`09If ( D .gt. 9999 ) Goto 100
  1608. X
  1609. X`09Err = 'B'
  1610. X`09Write( Temp_Str, 1001, Err=100 ) BY-1
  1611. X`09Stat = Sys$BinTim( Temp_Str, Base )`09`09!!!VMS!!!
  1612. X`09If ( .Not. Stat ) GoTo 100
  1613. X
  1614. X`09Err = 'D'
  1615. X`09Write( Temp_Str, 1000, Err=100 ) D
  1616. X`09Stat = Sys$BinTim( Temp_Str, Delta )            !!!VMS!!!
  1617. X`09If ( .Not. Stat ) GoTo 100
  1618. X
  1619. X`09Err = 'S'
  1620. X`09Stat = Lib$SubX( Base, Delta, Act_Date, 2 )     !!!VMS!!!
  1621. X`09If ( .Not. Stat ) GoTo 100
  1622. X
  1623. X`09Err = 'N'
  1624. X`09Stat = Sys$NumTim( Num_Time, Act_Date )         !!!VMS!!!
  1625. X`09If ( .Not. Stat ) GoTo 100
  1626. X
  1627. X`09Err = 'W'
  1628. X`09Write( D_Str, 1002, Err=100 ) Num_Time(2), Num_Time(3),`20
  1629. X`091`09`09Num_Time(1)-1900
  1630. X
  1631. X`09Return
  1632. X
  1633. X100`09Continue
  1634. X`09D_Str = 'Cnv Err' // Err`09`09! Can't convert
  1635. X`09Return
  1636. X
  1637. X1000`09Format( I4.4, ' 00:00:00.00' )
  1638. X1001`09Format( '31-DEC-19', I2.2, ' 00:00:00.00' )    `20
  1639. X1002`09Format( I2, 2( '/', I2.2 ) )
  1640. X
  1641. X`09End
  1642. X`0C`0A
  1643. XC---------------------------------------------------------------------------
  1644. V----
  1645. XC`09Subroutine used to enable the control C trap used as a cancel signal
  1646. XC`09for View and Extract functions.
  1647. XC
  1648. XC`09This routine is very VMS specific!
  1649. XC---------------------------------------------------------------------------
  1650. V----
  1651. X
  1652. X`09Subroutine Cancel_AST_Start
  1653. X
  1654. X`09Implicit None
  1655. X
  1656. X`09Integer`09`09JPI_ITEM, IO_Func, K, L, IOS, TT_LEN
  1657. X`09Integer`09`09Lib$GetJPI, Sys$Assign, Sys$QioW
  1658. X
  1659. X`09Integer*2`09TT_Chan
  1660. X
  1661. X`09Character`09TT_Name*7
  1662. X
  1663. X`09Include`09`09'($IODEF)'
  1664. X`09Include`09`09'($JPIDEF)'
  1665. X
  1666. X`09External`09Cancel_AST
  1667. X
  1668. X`09JPI_Item = JPI$_Terminal
  1669. X`09IOS = Lib$GetJPI( JPI_ITEM,,,, TT_Name, TT_Len )
  1670. X`09If ( .Not. IOS ) Call Lib$Stop( %Val( IOS ) )
  1671. X
  1672. X`09If ( TT_Name .eq. ' ' ) Then
  1673. X`09  TT_Name = 'TT:'
  1674. X`09  TT_Len = 3
  1675. X`09EndIf
  1676. X
  1677. X`09IOS = Sys$Assign( TT_Name(1:TT_Len), TT_Chan,, )
  1678. X`09If ( .Not. IOS ) Call Lib$Stop( %Val( IOS ) )
  1679. X
  1680. X`09IO_Func = IO$_SetMode .or. IO$M_CtrlCAST
  1681. X
  1682. X`09IOS = Sys$QioW( , %Val(TT_Chan), %Val(IO_Func),,,, Cancel_AST,,,,, )
  1683. X`09If ( .Not. IOS ) Call Lib$Stop( %Val( IOS ) )
  1684. X
  1685. X`09Return
  1686. X`09End
  1687. X`0C`0A
  1688. XC---------------------------------------------------------------------------
  1689. V----
  1690. XC`09Subroutine to set Cancel AST for View and extract functions
  1691. XC
  1692. XC`09This routine is VMS specific
  1693. XC---------------------------------------------------------------------------
  1694. V----
  1695. X
  1696. X`09Subroutine Cancel_AST
  1697. X
  1698. X`09Implicit None
  1699. X
  1700. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  1701. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  1702. +-+-+-+-+-+-+-+-  END  OF PART 11 +-+-+-+-+-+-+-+-
  1703.