&dA &dA &dA &d@ Program to decompress (expand) files that have been &dA &d@ compressed by the COMPRESS.Z program &dA #define NCHAR 192 str rec.180,slib.180,file.180,cdir.180,bytes.12,storefile.120,outlib.120 str infiles.80(2000),outfile.180,exten.3,bigout.1000000,subdir.180 bstr bigbitout.8000000,bcode.30 int cypher(NCHAR,NCHAR),bitcnt,method(NCHAR) int nfiles,curfile,lastchar int g,h,i,j,k int curmethod,datalength,bytecnt int a,b label FF(8),EE(NCHAR) &dA &dA &d@ Old variables &dA putc Library of compressed files getc slib putc Outout library (must exist, and should be empty) getc outlib getdir cdir slib = cdir // "/" // slib outlib = cdir // "/" // outlib storefile = slib // "/" // "cypher.bin" k = 0 open [1,1] slib loop getf [1] rec rec = rec // pad(12) exten = rec{10,3} exten = trm(exten) rec = rec{1,8} if rec{1} = " " goto CLIB end rec = trm(rec) if exten = "CPR" ++i infiles(i) = rec // ".cpr" end if len(exten) > 0 rec = rec // "." // exten if rec = "CYPHER.BIN" k = 1 end end repeat CLIB: nfiles = i close [1] if k = 0 putc No CYPHER.BIN file found; decompression is impossible; Sorry! stop end &dA &dA &d@ Get the cypher matrix and method &dA open [2,1] storefile i = 1 j = 0 A: getf [2] k if k <> 0 ++j cypher(i,j) = k goto A else getf [2] method(i) ++i j = 0 goto A end eof2: close [2] if i <> NCHAR + 1 putc Program error; i = ~i end &dA &dA &d@ Loop through compressed files &dA loop for curfile = 1 to nfiles file = infiles(curfile) putc ~file .t10 ÄÄÄ ... file = slib // "/" // file open [1,5] file &dA &dA &d@ Get header information &dA len(bigout) = 200 read [1,1] bigout k = ors(bigout{1}) outfile = bigout{2,k} putc ~outfile .t20 ... if outfile con "/" or outfile con "\" subdir = outfile{1,mpt-1} end if subdir <> "" &dA &dA &d@ Must check to see if it is allocated &dA subdir = ucs(subdir) open [5,1] outlib loop getf [5] rec rec = rec // pad(18) if rec{14,5} = "" rec = rec{1,8} rec = trm(rec) if rec = subdir goto NO_ALLOC end end if rec{1} = " " goto ALLOC end repeat ALLOC: subdir = outlib // "/" // subdir createdir subdir NO_ALLOC: close [5] end k += 2 datalength = ors(bigout{k,4}) k += 3 len(bigout) = sze - k read [1,1+k] bigout bigbitout = cbi(bigout) bitcnt = 1 close [1] outfile = outlib // "/" // outfile open [2,2] outfile lastchar = NCHAR bytecnt = 0 &dA &dA &d@ examine &dA NEW_LINE: rec = "" if bitcnt > datalength goto END_LOOP end NEW_CHAR: curmethod = method(lastchar) goto FF(curmethod+1) FF(1): /* one 1 1 3 3 15 128 bcode = bigbitout{bitcnt} ++bitcnt if bcode = "0" a = 1 else bcode = bigbitout{bitcnt} ++bitcnt if bcode = "0" a = 2 else bcode = bigbitout{bitcnt,2} bitcnt += 2 if bcode <> "11" /* 3 .. 5 bytes = cby(bcode) k = ors(bytes) k >>= 6 a = k + 3 else bcode = bigbitout{bitcnt,2} bitcnt += 2 if bcode <> "11" /* 6 .. 8 bytes = cby(bcode) k = ors(bytes) k >>= 6 a = k + 6 else bcode = bigbitout{bitcnt,4} bitcnt += 4 if bcode <> "1111" /* 9 .. 23 bytes = cby(bcode) k = ors(bytes) k >>= 4 a = k + 9 else bcode = bigbitout{bitcnt,8} bitcnt += 8 /* 24 ... bytes = cby(bcode) k = ors(bytes) a = k + 24 end end end end end goto FX FF(2): /* two 1 1 7 15 31 128 bcode = bigbitout{bitcnt} ++bitcnt if bcode = "0" a = 1 else bcode = bigbitout{bitcnt} ++bitcnt if bcode = "0" a = 2 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 3 .. 9 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 3 else bcode = bigbitout{bitcnt,4} bitcnt += 4 if bcode <> "1111" /* 10 .. 24 bytes = cby(bcode) k = ors(bytes) k >>= 4 a = k + 10 else bcode = bigbitout{bitcnt,5} bitcnt += 5 if bcode <> "11111" /* 25 .. 55 bytes = cby(bcode) k = ors(bytes) k >>= 3 a = k + 25 else bcode = bigbitout{bitcnt,8} bitcnt += 8 /* 56 ... bytes = cby(bcode) k = ors(bytes) a = k + 56 end end end end end goto FX FF(3): /* three 1 3 3 7 31 128 bcode = bigbitout{bitcnt} ++bitcnt if bcode = "0" a = 1 else bcode = bigbitout{bitcnt,2} bitcnt += 2 if bcode <> "11" /* 2 .. 4 bytes = cby(bcode) k = ors(bytes) k >>= 6 a = k + 2 else bcode = bigbitout{bitcnt,2} bitcnt += 2 if bcode <> "11" /* 5 .. 7 bytes = cby(bcode) k = ors(bytes) k >>= 6 a = k + 5 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 8 .. 14 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 8 else bcode = bigbitout{bitcnt,5} bitcnt += 5 if bcode <> "11111" /* 15 .. 45 bytes = cby(bcode) k = ors(bytes) k >>= 3 a = k + 15 else bcode = bigbitout{bitcnt,8} bitcnt += 8 /* 46 ... bytes = cby(bcode) k = ors(bytes) a = k + 46 end end end end end goto FX FF(4): /* four 1 7 15 31 31 128 bcode = bigbitout{bitcnt} ++bitcnt if bcode = "0" a = 1 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 2 .. 8 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 2 else bcode = bigbitout{bitcnt,4} bitcnt += 4 if bcode <> "1111" /* 9 .. 23 bytes = cby(bcode) k = ors(bytes) k >>= 4 a = k + 9 else bcode = bigbitout{bitcnt,5} bitcnt += 5 if bcode <> "11111" /* 24 .. 54 bytes = cby(bcode) k = ors(bytes) k >>= 3 a = k + 24 else bcode = bigbitout{bitcnt,5} bitcnt += 5 if bcode <> "11111" /* 55 .. 85 bytes = cby(bcode) k = ors(bytes) k >>= 3 a = k + 55 else bcode = bigbitout{bitcnt,8} bitcnt += 8 /* 86 ... bytes = cby(bcode) k = ors(bytes) a = k + 86 end end end end end goto FX FF(5): /* five 3 3 3 7 31 128 bcode = bigbitout{bitcnt,2} bitcnt += 2 if bcode <> "11" /* 1 .. 3 bytes = cby(bcode) k = ors(bytes) k >>= 6 a = k + 1 else bcode = bigbitout{bitcnt,2} bitcnt += 2 if bcode <> "11" /* 4 .. 6 bytes = cby(bcode) k = ors(bytes) k >>= 6 a = k + 4 else bcode = bigbitout{bitcnt,2} bitcnt += 2 if bcode <> "11" /* 7 .. 9 bytes = cby(bcode) k = ors(bytes) k >>= 6 a = k + 7 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 10 .. 16 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 10 else bcode = bigbitout{bitcnt,5} bitcnt += 5 if bcode <> "11111" /* 17 .. 47 bytes = cby(bcode) k = ors(bytes) k >>= 3 a = k + 17 else bcode = bigbitout{bitcnt,8} bitcnt += 8 /* 48 ... bytes = cby(bcode) k = ors(bytes) a = k + 46 end end end end end goto FX FF(6): /* six 3 7 7 7 31 128 bcode = bigbitout{bitcnt,2} bitcnt += 2 if bcode <> "11" /* 1 .. 3 bytes = cby(bcode) k = ors(bytes) k >>= 6 a = k + 1 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 4 .. 10 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 4 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 11 .. 17 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 11 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 18 .. 24 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 18 else bcode = bigbitout{bitcnt,5} bitcnt += 5 if bcode <> "11111" /* 25 .. 55 bytes = cby(bcode) k = ors(bytes) k >>= 3 a = k + 25 else bcode = bigbitout{bitcnt,8} bitcnt += 8 /* 56 ... bytes = cby(bcode) k = ors(bytes) a = k + 56 end end end end end goto FX FF(7): /* seven 7 7 7 7 31 128 bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 1 .. 7 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 1 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 8 .. 14 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 8 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 16 .. 21 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 15 else bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 22 .. 28 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 22 else bcode = bigbitout{bitcnt,5} bitcnt += 5 if bcode <> "11111" /* 29 .. 59 bytes = cby(bcode) k = ors(bytes) k >>= 3 a = k + 29 else bcode = bigbitout{bitcnt,8} bitcnt += 8 /* 60 ... bytes = cby(bcode) k = ors(bytes) a = k + 60 end end end end end goto FX FF(8): /* eight 7 15 15 31 63 128 bcode = bigbitout{bitcnt,3} bitcnt += 3 if bcode <> "111" /* 1 .. 7 bytes = cby(bcode) k = ors(bytes) k >>= 5 a = k + 1 else bcode = bigbitout{bitcnt,4} bitcnt += 4 if bcode <> "1111" /* 8 .. 22 bytes = cby(bcode) k = ors(bytes) k >>= 4 a = k + 8 else bcode = bigbitout{bitcnt,4} bitcnt += 4 if bcode <> "1111" /* 23 .. 37 bytes = cby(bcode) k = ors(bytes) k >>= 4 a = k + 23 else bcode = bigbitout{bitcnt,5} bitcnt += 5 if bcode <> "11111" /* 38 .. 68 bytes = cby(bcode) k = ors(bytes) k >>= 3 a = k + 38 else bcode = bigbitout{bitcnt,6} bitcnt += 6 if bcode <> "111111" /* 69 .. 131 bytes = cby(bcode) k = ors(bytes) k >>= 2 a = k + 69 else bcode = bigbitout{bitcnt,8} bitcnt += 8 /* 132 ... bytes = cby(bcode) k = ors(bytes) a = k + 132 end end end end end goto FX FX: b = cypher(lastchar,a) lastchar = b goto EE(b) EE(1): rec = rec // chr(b+31) ++bytecnt goto NEW_CHAR EE(97): /* "42 46 1 0 0" rec = rec // "42 46 1 0 0" bytecnt += 11 goto NEW_CHAR EE(98): /* "28 46 1 0 0" rec = rec // "28 46 1 0 0" bytecnt += 11 goto NEW_CHAR EE(99): /* "12 46 1 0 0" rec = rec // "12 46 1 0 0" bytecnt += 11 goto NEW_CHAR EE(100): /* "1 82 6913 " rec = rec // "1 82 6913 " bytecnt += 10 goto NEW_CHAR EE(101): /* "0 0 0 " rec = rec // "0 0 0 " bytecnt += 6 goto NEW_CHAR EE(102): /* "K 0 0 " rec = rec // "K 0 0 " bytecnt += 6 goto NEW_CHAR EE(103): /* "1152 " rec = rec // "1152 " bytecnt += 5 goto NEW_CHAR EE(104): /* "1729 " rec = rec // "1729 " bytecnt += 5 goto NEW_CHAR EE(105): /* "2305 " rec = rec // "2305 " bytecnt += 5 goto NEW_CHAR EE(106): /* "3457 " rec = rec // "3457 " bytecnt += 5 goto NEW_CHAR EE(107): /* "4609 " rec = rec // "4609 " bytecnt += 5 goto NEW_CHAR EE(108): /* "5185 " rec = rec // "5185 " bytecnt += 5 goto NEW_CHAR EE(109): /* "A D " rec = rec // "A D " bytecnt += 4 goto NEW_CHAR EE(110): /* "J N " rec = rec // "J N " bytecnt += 4 goto NEW_CHAR EE(111): /* "J R " rec = rec // "J R " bytecnt += 4 goto NEW_CHAR EE(112): /* "J B " rec = rec // "J B " bytecnt += 4 goto NEW_CHAR EE(113): /* "K 0 " rec = rec // "K 0 " bytecnt += 4 goto NEW_CHAR EE(114): /* "K 1 " rec = rec // "K 1 " bytecnt += 4 goto NEW_CHAR EE(115): /* "-11 " rec = rec // "-11 " bytecnt += 4 goto NEW_CHAR EE(116): /* "-12 " rec = rec // "-12 " bytecnt += 4 goto NEW_CHAR EE(117): /* "-14 " rec = rec // "-14 " bytecnt += 4 goto NEW_CHAR EE(118): /* "-15 " rec = rec // "-15 " bytecnt += 4 goto NEW_CHAR EE(119): /* "-18 " rec = rec // "-18 " bytecnt += 4 goto NEW_CHAR EE(120): /* "-21 " rec = rec // "-21 " bytecnt += 4 goto NEW_CHAR EE(121): /* "-28 " rec = rec // "-28 " bytecnt += 4 goto NEW_CHAR EE(122): /* "-32 " rec = rec // "-32 " bytecnt += 4 goto NEW_CHAR EE(123): /* "-35 " rec = rec // "-35 " bytecnt += 4 goto NEW_CHAR EE(124): /* "-42 " rec = rec // "-42 " bytecnt += 4 goto NEW_CHAR EE(125): /* "-49 " rec = rec // "-49 " bytecnt += 4 goto NEW_CHAR EE(126): /* "-53 " rec = rec // "-53 " bytecnt += 4 goto NEW_CHAR EE(127): /* "-63 " rec = rec // "-63 " bytecnt += 4 goto NEW_CHAR EE(128): /* "-74 " rec = rec // "-74 " bytecnt += 4 goto NEW_CHAR EE(129): /* "576 " rec = rec // "576 " bytecnt += 4 goto NEW_CHAR EE(130): /* "288 " rec = rec // "288 " bytecnt += 4 goto NEW_CHAR EE(131): /* "144 " rec = rec // "144 " bytecnt += 4 goto NEW_CHAR EE(132): /* "-1 " rec = rec // "-1 " bytecnt += 3 goto NEW_CHAR EE(133): /* "-2 " rec = rec // "-2 " bytecnt += 3 goto NEW_CHAR EE(134): /* "-3 " rec = rec // "-3 " bytecnt += 3 goto NEW_CHAR EE(135): /* "-6 " rec = rec // "-6 " bytecnt += 3 goto NEW_CHAR EE(136): /* "-7 " rec = rec // "-7 " bytecnt += 3 goto NEW_CHAR EE(137): /* "-9 " rec = rec // "-9 " bytecnt += 3 goto NEW_CHAR EE(138): /* "10 " rec = rec // "10 " bytecnt += 3 goto NEW_CHAR EE(139): /* "12 " rec = rec // "12 " bytecnt += 3 goto NEW_CHAR EE(140): /* "14 " rec = rec // "14 " bytecnt += 3 goto NEW_CHAR EE(141): /* "15 " rec = rec // "15 " bytecnt += 3 goto NEW_CHAR EE(142): /* "16 " rec = rec // "16 " bytecnt += 3 goto NEW_CHAR EE(143): /* "18 " rec = rec // "18 " bytecnt += 3 goto NEW_CHAR EE(144): /* "21 " rec = rec // "21 " bytecnt += 3 goto NEW_CHAR EE(145): /* "24 " rec = rec // "24 " bytecnt += 3 goto NEW_CHAR EE(146): /* "28 " rec = rec // "28 " bytecnt += 3 goto NEW_CHAR EE(147): /* "31 " rec = rec // "31 " bytecnt += 3 goto NEW_CHAR EE(148): /* "32 " rec = rec // "32 " bytecnt += 3 goto NEW_CHAR EE(149): /* "35 " rec = rec // "35 " bytecnt += 3 goto NEW_CHAR EE(150): /* "42 " rec = rec // "42 " bytecnt += 3 goto NEW_CHAR EE(151): /* "49 " rec = rec // "49 " bytecnt += 3 goto NEW_CHAR EE(152): /* "52 " rec = rec // "52 " bytecnt += 3 goto NEW_CHAR EE(153): /* "56 " rec = rec // "56 " bytecnt += 3 goto NEW_CHAR EE(154): /* "63 " rec = rec // "63 " bytecnt += 3 goto NEW_CHAR EE(155): /* "72 " rec = rec // "72 " bytecnt += 3 goto NEW_CHAR EE(156): /* " * " rec = rec // " * " bytecnt += 3 goto NEW_CHAR EE(157): /* " - " rec = rec // " - " bytecnt += 3 goto NEW_CHAR EE(158): /* "12" rec = rec // "12" bytecnt += 2 goto EE(191) EE(159): /* "16" rec = rec // "16" bytecnt += 2 goto EE(191) EE(160): /* "24" rec = rec // "24" bytecnt += 2 goto EE(191) EE(161): /* "32" rec = rec // "32" bytecnt += 2 goto EE(191) EE(162): /* "42" rec = rec // "42" bytecnt += 2 goto EE(191) EE(163): /* "43" rec = rec // "43" bytecnt += 2 goto EE(191) EE(164): /* "44" rec = rec // "44" bytecnt += 2 goto EE(191) EE(165): /* "45" rec = rec // "45" bytecnt += 2 goto EE(191) EE(166): /* "48" rec = rec // "48" bytecnt += 2 goto EE(191) EE(167): /* "49" rec = rec // "49" bytecnt += 2 goto EE(191) EE(168): /* "53" rec = rec // "53" bytecnt += 2 goto EE(191) EE(169): /* "54" rec = rec // "54" bytecnt += 2 goto EE(191) EE(170): /* "59" rec = rec // "59" bytecnt += 2 goto EE(191) EE(171): /* "60" rec = rec // "60" bytecnt += 2 goto EE(191) EE(172): /* "63" rec = rec // "63" bytecnt += 2 goto EE(191) EE(173): /* "64" rec = rec // "64" bytecnt += 2 goto EE(191) EE(174): /* "65" rec = rec // "65" bytecnt += 2 goto EE(191) EE(175): /* "96" rec = rec // "96" bytecnt += 2 goto EE(191) EE(176): /* "0" rec = rec // "0" bytecnt += 1 goto EE(191) EE(177): /* "4" rec = rec // "4" bytecnt += 1 goto EE(191) EE(178): /* "6" rec = rec // "6" bytecnt += 1 goto EE(191) EE(179): /* "8" rec = rec // "8" bytecnt += 1 goto EE(191) EE(180): /* "K " rec = rec // "K " bytecnt += 2 goto NEW_CHAR EE(181): /* "0 " rec = rec // "0 " bytecnt += 2 goto NEW_CHAR EE(182): /* "1 " rec = rec // "1 " bytecnt += 2 goto NEW_CHAR EE(183): /* "2 " rec = rec // "2 " bytecnt += 2 goto NEW_CHAR EE(184): /* "3 " rec = rec // "3 " bytecnt += 2 goto NEW_CHAR EE(185): /* "4 " rec = rec // "4 " bytecnt += 2 goto NEW_CHAR EE(186): /* "5 " rec = rec // "5 " bytecnt += 2 goto NEW_CHAR EE(187): /* "6 " rec = rec // "6 " bytecnt += 2 goto NEW_CHAR EE(188): /* "7 " rec = rec // "7 " bytecnt += 2 goto NEW_CHAR EE(189): /* "8 " rec = rec // "8 " bytecnt += 2 goto NEW_CHAR EE(190): /* "9 " rec = rec // "9 " bytecnt += 2 goto NEW_CHAR EE(191): /* new_line putf [2] ~rec bytecnt += 2 goto NEW_LINE EE(192): /* new_file putc Program Error stop END_LOOP: close [2] putc .w7 ~bytecnt bytes repeat run