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

  1. Path: sparky!uunet!usc!elroy.jpl.nasa.gov!ames!network.ucsd.edu!mvb.saic.com!vmsnet-sources
  2. From: munroe@dmc.com (Dick Munroe)
  3. Newsgroups: vmsnet.sources
  4. Subject: UBBS, part 12/12
  5. Message-ID: <7868523@MVB.SAIC.COM>
  6. Date: Fri, 21 Aug 1992 20:23:14 GMT
  7. Organization: Doyle, Munroe Consultants, Inc., Hudson, MA
  8. Lines: 484
  9. Approved: Mark.Berryman@Mvb.Saic.Com
  10.  
  11. Submitted-by: munroe@dmc.com (Dick Munroe)
  12. Posting-number: Volume 3, Issue 120
  13. Archive-name: ubbs/part12
  14. -+-+-+-+-+-+-+-+ START OF PART 12 -+-+-+-+-+-+-+-+
  15. X`09Integer`09`09Remaining_Size
  16. X`09Integer*2`09CRC_Val
  17. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  18. V0
  19. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  20. X
  21. X`09Cancel_OP = .True.
  22. X`09AST_On_Flg = .False.
  23. X
  24. X`09Type *, '+++ Operation Cancelled +++'
  25. X`09Type *, ' '
  26. X
  27. X`09Return
  28. X`09End
  29. X`0C`0A
  30. XC---------------------------------------------------------------------------
  31. V--
  32. XC`09Subroutine used to Decompress a file that uses Lempel-Zev crunching
  33. XC`09with adaptive reset of the string table
  34. XC
  35. XC`09Inputs:
  36. XC`09`09Uses Common
  37. XC
  38. XC`09Output:
  39. XC`09`09A character code in I*2 variable
  40. XC
  41. XC---------------------------------------------------------------------------
  42. V--
  43. X
  44. X`09Subroutine GetCode( C )
  45. X
  46. X`09Implicit None
  47. X
  48. X`09Integer*2`09R_Off, Bits, Code, C, Temp
  49. X`09Integer*2`09MaxCodeVal
  50. X
  51. Xc`09Common and declarations for Lempel-Zev Crunching`20
  52. X                        `20
  53. X`09Integer         Max_bits, H_Size, Init_Bits
  54. X`09Integer*2`09First_Entry, Clear_Ind, Eof_Mark
  55. X`09Parameter`09( Max_Bits = 12 )
  56. X`09Parameter`09( Init_Bits = 9 )
  57. X`09Parameter`09( First_Entry = 257 )
  58. X`09Parameter`09( Clear_Ind = 256 )
  59. X`09Parameter`09( EOF_Mark = -1 )
  60. X`09Parameter`09( H_Size = 5003 )
  61. X
  62. X`09Logical*1`09Clear_Flg
  63. X`09Byte`09   `09Suffix(0:H_Size), Stack(0:H_Size)
  64. X`09Byte`09`09R_Mask(0:9), L_Mask(0:9)
  65. X`09Integer*2`09MaxCode, Max_MaxCode, Free_Ent, N_Bits
  66. X`09Integer*2  `09Buf(0:Max_Bits), Buf_Inx, Offset, Size
  67. X`09Integer*2`09Prefix(0:H_Size)
  68. X
  69. X`09Common`09/LZWV/`09Clear_Flg, MaxCode, Max_MaxCode, Free_Ent, N_Bits,
  70. X`091`09`09Buf, Buf_Inx, R_Mask, L_Mask, Prefix, Suffix, Stack,
  71. X`091`09`09Offset, Size
  72. X
  73. Xc`09Start code
  74. X
  75. X`09If ( Clear_Flg .or. ( Offset .ge. Size ) .or.`20
  76. X`091  ( Free_ent .gt. Maxcode ) ) Then
  77. X
  78. Xc `09  if the next entry will be too big for current code size`20
  79. Xc`09  then we must increase the size and get a new buffer
  80. X
  81. X`09  If ( Free_ent .gt. Maxcode ) Then
  82. X`09    N_Bits = N_Bits + 1
  83. X`09    If ( N_Bits .eq. Max_Bits ) Then
  84. X`09      Maxcode = Max_Maxcode
  85. X`09    Else
  86. X`09      Maxcode = MaxcodeVal( N_Bits )
  87. X`09    EndIf
  88. X`09  EndIf
  89. X
  90. X`09  If ( Clear_Flg ) Then
  91. X`09    N_Bits = Init_Bits
  92. X`09    Maxcode = MaxcodeVal( N_Bits )
  93. X`09    Clear_Flg = .False.
  94. X`09  EndIf
  95. X
  96. X`09  Do Size = 0, N_Bits-1
  97. X`09    Call Get_Char( Code )
  98. X`09    If ( Code .eq. EOF_Mark ) Goto 100
  99. X`09    Buf( Size ) = Code
  100. X`09  EndDo
  101. X
  102. X100`09  Continue
  103. X`09  If ( Size .le. 0 ) Then
  104. X`09    C = -1
  105. X`09    Return
  106. X`09  EndIf
  107. X`09  Offset = 0
  108. X
  109. Xc`09  Round size down to integral number of codes
  110. X
  111. X`09  Size = Ishft( Size, 3 ) - ( N_bits - 1 )
  112. X`09EndIf
  113. X
  114. X`09R_Off = Offset
  115. X`09Bits = N_Bits
  116. X
  117. Xc`09Get the first byte
  118. X
  119. X`09Buf_Inx = Ishft( R_Off, -3 )
  120. X`09R_Off = R_Off .and. 7
  121. X
  122. X`09Temp = Buf(Buf_Inx)
  123. X`09Buf_Inx = Buf_Inx + 1
  124. X
  125. Xc`09get the first part of the code
  126. X
  127. X`09Code = Ishft( Temp, -R_Off )
  128. X`09Bits = Bits - ( 8 - R_Off )
  129. X`09R_Off = 8 - R_Off`20
  130. X
  131. Xc`09get any 8 bit parts in the middle ( <= 1 for up to 16 bits )
  132. X
  133. X`09If ( Bits .ge. 8 ) Then
  134. X`09  Temp = Buf( Buf_Inx )
  135. X`09  Buf_Inx = Buf_Inx + 1
  136. X`09  Code = Code .or. ( IShft( Temp, R_Off ) )
  137. X`09  R_Off = R_Off + 8
  138. X`09  Bits = Bits - 8
  139. X`09EndIf
  140. X
  141. Xc`09High order bits
  142. X
  143. X`09Temp = Buf( Buf_Inx ) .and. R_Mask( Bits )
  144. X`09Code = Code .or. ( Ishft( Temp, R_Off ) )
  145. X`09Offset = Offset + N_Bits
  146. X
  147. X`09C = Code
  148. X`09Return
  149. X`09End
  150. X`0C`0A
  151. XC---------------------------------------------------------------------------
  152. V--
  153. XC`09Main Subroutine to decompress a Lempel Zev crunched file using
  154. XC`09adaptive reset of string buffer when full - Based on ARC V5.0
  155. XC
  156. XC`09Inputs:
  157. XC`09`09None
  158. XC
  159. XC`09Outputs:
  160. XC`09`09Decompresses a member of an ARC file
  161. XC
  162. XC---------------------------------------------------------------------------
  163. V--
  164. X
  165. X`09Subroutine DeComp_LZW_Var
  166. X
  167. X`09Implicit None
  168. X
  169. X`09Byte`09`09BCode, BFinChar, BTemp
  170. X`09Integer*2`09FinChar, OldCode, InCode, Code, St_Inx, MaxCodeVal
  171. X`09Integer*2`09Temp
  172. X`09Equivalence`09( Temp, BTemp )
  173. X`09Equivalence`09( Code, BCode )
  174. X`09Equivalence`09( FinChar, BFinChar )
  175. X
  176. Xc`09Common and declarations for Lempel-Zev Crunching`20
  177. X
  178. X`09Integer         Max_bits, H_Size, Init_Bits
  179. X`09Integer*2`09First_Entry, Clear_Ind, Eof_Mark
  180. X`09Parameter`09( Max_Bits = 12 )
  181. X`09Parameter`09( Init_Bits = 9 )
  182. X`09Parameter`09( First_Entry = 257 )
  183. X`09Parameter`09( Clear_Ind = 256 )
  184. X`09Parameter  `09( EOF_Mark = -1 )
  185. X`09Parameter`09( H_Size = 5003 )
  186. X
  187. X`09Logical*1`09Clear_Flg
  188. X`09Byte`09`09Suffix(0:H_Size), Stack(0:H_Size)
  189. X`09Byte`09`09R_Mask(0:9), L_Mask(0:9)
  190. X`09Integer*2`09MaxCode, Max_MaxCode, Free_Ent, N_Bits
  191. X`09Integer*2`09Buf(0:Max_Bits), Buf_Inx, Offset, Size
  192. X`09Integer*2`09Prefix(0:H_Size)
  193. X
  194. X`09Common`09/LZWV/`09Clear_Flg, MaxCode, Max_MaxCode, Free_Ent, N_Bits,
  195. X`091`09`09Buf, Buf_Inx, R_Mask, L_Mask, Prefix, Suffix, Stack,
  196. X`091`09`09Offset, Size
  197. X
  198. X`09Data`09R_Mask`09/ '00'x, '01'x, '03'x, '07'x, '0f'x,`20
  199. X`091`09`09  '1f'x, '3f'x, '7f'x, 'ff'x, '00'x /
  200. X
  201. X`09Data`09L_Mask`09/ 'ff'x, 'fe'x, 'fc'x, 'f8'x, 'f0'x,`20
  202. X`091`09`09  'e0'x, 'c0'x, '80'x, '00'x, '00'x /
  203. X
  204. X`09Logical*1`09View_Cr, View_flg, Bin_flg, Extr_flg
  205. X`09Logical*1`09LBR_Flg, Cancel_Op, AST_On_Flg
  206. X`09Integer`09`09Remaining_Size
  207. X`09Integer*2`09CRC_Val
  208. X`09Common`09/Global/ Remaining_Size, View_Cr, View_Flg, Bin_Flg, Extr_Flg,`2
  209. V0
  210. X`091`09`09 LBR_Flg, Cancel_Op, AST_On_Flg, CRC_Val
  211. X
  212. Xc`09Start of code
  213. X
  214. Xc`09Check maximum number of bits used in code
  215. X
  216. X`09Call Get_Char( Code )
  217. X`09If ( Code .ne. Max_Bits ) Then
  218. X`09  Type *, '--- Cannot handle bit count of Crunch ---'
  219. X`09  Return
  220. X`09EndIf
  221. X
  222. X`09N_Bits = Init_Bits
  223. X`09Clear_Flg = .False.
  224. X
  225. X`09CRC_Val = 0`09`09`09`09! Reset some variables
  226. X`09Offset = 0`09`09`09`09!  for the new member
  227. X`09Size = 0
  228. X
  229. X`09MaxCode = MaxcodeVal( N_Bits )
  230. X`09Max_MaxCode = MaxcodeVal( Max_Bits )+1`09! Adjust so full table works
  231. X
  232. Xc`09Initialize the first 256 entries in the table
  233. X
  234. X`09Do Code = 255, 0, -1
  235. X`09  Prefix(Code) = 0
  236. X`09  Suffix(Code) = BCode
  237. X`09EndDo
  238. X
  239. X`09Free_Ent = First_Entry
  240. X
  241. Xc`09First code must be the actual character
  242. X
  243. X`09Call GetCode( OldCode )
  244. X`09FinChar = OldCode
  245. X
  246. X`09If ( OldCode .eq. -1 ) Return
  247. X
  248. X`09Call Put_Char_UnComp( FinChar )
  249. X
  250. X`09St_Inx = 1
  251. X
  252. Xc`09Now loop getting codes unyil all done
  253. X
  254. X`09Call GetCode( Code )
  255. X`09Do While ( ( Code .gt. -1 ) .and. .Not. Cancel_Op )
  256. X
  257. Xc`09Clear the table?
  258. X
  259. X`09  If ( Code .eq. Clear_Ind ) Then
  260. X`09    Do Code = 255, 0, -1
  261. X`09      Prefix(Code) = 0
  262. X`09    EndDo        `20
  263. X`09    Clear_Flg = .True.
  264. X`09    Free_Ent = First_Entry - 1
  265. X`09    Call GetCode( Code )
  266. X`09    If ( Code  .eq. -1 ) Return
  267. X`09  EndIf
  268. X
  269. X`09  InCode = Code
  270. X
  271. Xc`09Special case for KwKwK string
  272. X
  273. X`09  If ( Code .ge. Free_Ent ) Then
  274. X`09    Stack( St_Inx ) = BFinChar
  275. X`09    St_Inx = St_Inx + 1
  276. X`09    Code = OldCode
  277. X`09  EndIf
  278. X
  279. Xc`09Generate output chars in reverse order
  280. X
  281. X`09  Do While ( Code .ge. 256 )
  282. X`09    Stack( St_Inx ) = Suffix( Code )
  283. X`09    St_Inx = St_Inx + 1
  284. X`09    Code = Prefix( Code )
  285. X`09  EndDO
  286. X
  287. X`09  Stack( St_Inx ) = Suffix( Code )
  288. X`09  St_Inx = St_Inx + 1
  289. X`09  FinChar = Suffix( Code )
  290. X
  291. Xc`09Output them in correct order
  292. X
  293. X100`09  Continue
  294. X`09  St_Inx = St_Inx - 1
  295. X`09  Temp = 0
  296. X`09  BTemp = Stack( St_Inx )`20
  297. X`09  Call Put_Char_UnComp( TEMP )
  298. X
  299. X`09  If ( St_Inx .gt. 1 ) GoTo 100
  300. X
  301. XC`09Setup for next code
  302. X
  303. X`09  Code = Free_ent`20
  304. X`09  If ( Code .lt. Max_MaxCode ) Then
  305. X`09    Prefix( Code ) = OldCode
  306. X`09    Suffix( Code ) = BFinChar
  307. X`09    Free_Ent = Code + 1
  308. X`09  EndIf
  309. X
  310. X`09  OldCode = InCode
  311. X
  312. X`09  Call GetCode( Code )
  313. X`09EndDo
  314. X
  315. X`09Return
  316. X`09End
  317. X`0C`0A
  318. XC---------------------------------------------------------------------------
  319. V--
  320. XC`09Integer function used to calculate a maximum value based on the
  321. XC`09number of bits to be used
  322. XC
  323. XC`09Input:
  324. XC`09`09The number of bits to use (I)
  325. XC`09Output:
  326. XC`09`09The maximum (unsigned) value that can be stored in I bits
  327. XC
  328. XC---------------------------------------------------------------------------
  329. V--
  330. X
  331. X`09Integer*2 Function MaxCodeVal( I )
  332. X
  333. X`09Integer*2`09I, J
  334. X
  335. X`09J = 1
  336. X`09MaxCodeVal = ( Ishft( J, I ) - 1 )
  337. X
  338. X`09Return
  339. X`09End
  340. X`0C`0A
  341. XC---------------------------------------------------------------------------
  342. V--
  343. XC`09Subroutine used to calculate a CRC value based on the
  344. XC`09character (byte) passed to it.
  345. XC
  346. XC`09Input:
  347. XC`09`09The current CRC value and the byte to add into it
  348. XC`09Output:
  349. XC`09`09The updated CRC value
  350. XC
  351. XC---------------------------------------------------------------------------
  352. V--
  353. X
  354. X`09Subroutine ARC_CRC( CRCVal, Val )
  355. X
  356. X`09Implicit None
  357. X
  358. X`09Integer*2`09CRCTab(0:255), Temp, I, CRCVal
  359. X
  360. X`09Byte`09Val, IVal
  361. X
  362. X`09Equivalence`09( I, IVal )
  363. X
  364. X`09Data`09CRCTab`09/
  365. X`091`09'0000'x, 'C0C1'x, 'C181'x, '0140'x,`20
  366. X`091`09'C301'x, '03C0'x, '0280'x, 'C241'x,
  367. X`091`09'C601'x, '06C0'x, '0780'x, 'C741'x,`20
  368. X`091`09'0500'x, 'C5C1'x, 'C481'x, '0440'x,
  369. X`091`09'CC01'x, '0CC0'x, '0D80'x, 'CD41'x,`20
  370. X`091`09'0F00'x, 'CFC1'x, 'CE81'x, '0E40'x,
  371. X`091`09'0A00'x, 'CAC1'x, 'CB81'x, '0B40'x,`20
  372. X`091`09'C901'x, '09C0'x, '0880'x, 'C841'x,
  373. X`091`09'D801'x, '18C0'x, '1980'x, 'D941'x,`20
  374. X`091`09'1B00'x, 'DBC1'x, 'DA81'x, '1A40'x,
  375. X`091`09'1E00'x, 'DEC1'x, 'DF81'x, '1F40'x,`20
  376. X`091`09'DD01'x, '1DC0'x, '1C80'x, 'DC41'x,
  377. X`091`09'1400'x, 'D4C1'x, 'D581'x, '1540'x,`20
  378. X`091`09'D701'x, '17C0'x, '1680'x, 'D641'x,
  379. X`091`09'D201'x, '12C0'x, '1380'x, 'D341'x,`20
  380. X`091`09'1100'x, 'D1C1'x, 'D081'x, '1040'x,
  381. X`091`09'F001'x, '30C0'x, '3180'x, 'F141'x,`20
  382. X`091`09'3300'x, 'F3C1'x, 'F281'x, '3240'x,
  383. X`091`09'3600'x, 'F6C1'x, 'F781'x, '3740'x,`20
  384. X`091`09'F501'x, '35C0'x, '3480'x, 'F441'x,
  385. X`091`09'3C00'x, 'FCC1'x, 'FD81'x, '3D40'x,`20
  386. X`091`09'FF01'x, '3FC0'x, '3E80'x, 'FE41'x,
  387. X`091`09'FA01'x, '3AC0'x, '3B80'x, 'FB41'x,`20
  388. X`091`09'3900'x, 'F9C1'x, 'F881'x, '3840'x,
  389. X`091`09'2800'x, 'E8C1'x, 'E981'x, '2940'x,`20
  390. X`091`09'EB01'x, '2BC0'x, '2A80'x, 'EA41'x,
  391. X`091`09'EE01'x, '2EC0'x, '2F80'x, 'EF41'x,`20
  392. X`091`09'2D00'x, 'EDC1'x, 'EC81'x, '2C40'x,
  393. X`091`09'E401'x, '24C0'x, '2580'x, 'E541'x,`20
  394. X`091`09'2700'x, 'E7C1'x, 'E681'x, '2640'x,
  395. X`091`09'2200'x, 'E2C1'x, 'E381'x, '2340'x,`20
  396. X`091`09'E101'x, '21C0'x, '2080'x, 'E041'x,
  397. X`091`09'A001'x, '60C0'x, '6180'x, 'A141'x,`20
  398. X`091`09'6300'x, 'A3C1'x, 'A281'x, '6240'x,
  399. X`091`09'6600'x, 'A6C1'x, 'A781'x, '6740'x,`20
  400. X`091`09'A501'x, '65C0'x, '6480'x, 'A441'x,
  401. X`091`09'6C00'x, 'ACC1'x, 'AD81'x, '6D40'x,`20
  402. X`091`09'AF01'x, '6FC0'x, '6E80'x, 'AE41'x,
  403. X`091`09'AA01'x, '6AC0'x, '6B80'x, 'AB41'x,`20
  404. X`091`09'6900'x, 'A9C1'x, 'A881'x, '6840'x,
  405. X`091`09'7800'x, 'B8C1'x, 'B981'x, '7940'x,`20
  406. X`091`09'BB01'x, '7BC0'x, '7A80'x, 'BA41'x,
  407. X`091`09'BE01'x, '7EC0'x, '7F80'x, 'BF41'x,`20
  408. X`091`09'7D00'x, 'BDC1'x, 'BC81'x, '7C40'x,
  409. X`091`09'B401'x, '74C0'x, '7580'x, 'B541'x,`20
  410. X`091`09'7700'x, 'B7C1'x, 'B681'x, '7640'x,
  411. X`091`09'7200'x, 'B2C1'x, 'B381'x, '7340'x,`20
  412. X`091`09'B101'x, '71C0'x, '7080'x, 'B041'x,
  413. X`091`09'5000'x, '90C1'x, '9181'x, '5140'x,`20
  414. X`091`09'9301'x, '53C0'x, '5280'x, '9241'x,
  415. X`091`09'9601'x, '56C0'x, '5780'x, '9741'x,`20
  416. X`091`09'5500'x, '95C1'x, '9481'x, '5440'x,
  417. X`091`09'9C01'x, '5CC0'x, '5D80'x, '9D41'x,`20
  418. X`091`09'5F00'x, '9FC1'x, '9E81'x, '5E40'x,
  419. X`091`09'5A00'x, '9AC1'x, '9B81'x, '5B40'x,`20
  420. X`091`09'9901'x, '59C0'x, '5880'x, '9841'x,
  421. X`091`09'8801'x, '48C0'x, '4980'x, '8941'x,`20
  422. X`091`09'4B00'x, '8BC1'x, '8A81'x, '4A40'x,
  423. X`091`09'4E00'x, '8EC1'x, '8F81'x, '4F40'x,`20
  424. X`091`09'8D01'x, '4DC0'x, '4C80'x, '8C41'x,
  425. X`091`09'4400'x, '84C1'x, '8581'x, '4540'x,`20
  426. X`091`09'8701'x, '47C0'x, '4680'x, '8641'x,
  427. X`091`09'8201'x, '42C0'x, '4380'x, '8341'x,`20
  428. X`091`09'4100'x, '81C1'x, '8081'x, '4040'x
  429. X`091`09/
  430. X
  431. X`09I = 0
  432. X`09IVal = Val
  433. X
  434. X`09Temp = Ishft( CRCVal, -8 ) .and. '00ff'x
  435. X`09Temp = Temp .xor. CRCTab( ( (CRCVal .Xor. I) .and. '00ff'x ) )
  436. X`09CRCVal = Temp
  437. X
  438. X`09Return
  439. X`09End
  440. X`0C`0A
  441. XC---------------------------------------------------------------------------
  442. V---
  443. XC`09Subroutine used to calculate the CRC for .LBR files
  444. XC
  445. XC`09Input:
  446. XC`09`09Current CRC value
  447. XC`09`09New byte to include`20
  448. XC
  449. XC`09Output:
  450. XC`09`09Updated CRC value
  451. XC
  452. XC---------------------------------------------------------------------------
  453. V---
  454. X
  455. X`09Subroutine LBR_CRC( CRCVal, Val )
  456. X
  457. X`09Implicit None
  458. X
  459. X`09Byte`09`09Val, V
  460. X
  461. X`09Integer*2`09CRCVal, Temp, I, BitC, BitH, Mask_Bit, Poly
  462. X
  463. X`09Data`09`09Mask_Bit /15/, Poly /'1021'x/
  464. X
  465. X`09Integer*4`09Long, K
  466. X
  467. X`09Equivalence`09( Long, Temp )
  468. X`09Equivalence`09( I, V )
  469. X
  470. X`09I = 0
  471. X`09V = Val
  472. X
  473. X`09Do K = 1, 8
  474. X`09Bitc = IBits( I, 7, 1 )
  475. X`09BitH = IBits( CrcVal, Mask_Bit, 1 )
  476. X`09Temp = Ishft( I, 1 )`20
  477. X`09I = Temp .and. 'FF'x
  478. X
  479. X`09Long = 0
  480. X`09Temp = Ishft( CrcVal, 1 ) + BitC
  481. X
  482. X`09If ( BitH .eq. 1 ) Then
  483. X`09Temp = Temp .Xor. Poly
  484. X`09EndIf
  485. X
  486. X`09CrcVal = Temp
  487. X`09EndDo
  488. X
  489. X`09Return
  490. X`09End
  491. X`00`00`00
  492. $ CALL UNPACK [.UTILITY]VMSARC.FOR;2 50478767
  493. $ v=f$verify(v)
  494. $ EXIT
  495.