&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