&dA
&dA
&dA &d@ Program to decompress (expand) files that have been
&dA &d@ compressed by the COMPRESS.Z program
&dA
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(108,108),bitcnt,method(108)
int nfiles,curfile,lastchar
int g,h,i,j,k
int curmethod,datalength,bytecnt
int a,b
label FF(8),EE(108)
&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 <> 109
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 = 1
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):
bcode = bigbitout{bitcnt}
++bitcnt
if bcode = "0"
a = 1
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
if bcode <> "111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 2
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 9
end
end
goto FX
FF(2):
bcode = bigbitout{bitcnt}
++bitcnt
if bcode = "0"
a = 1
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
if bcode <> "111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 2
else
bcode = bigbitout{bitcnt,4}
bitcnt += 4
bytes = cby(bcode)
k = ors(bytes)
k >>= 4
a = k + 9
end
end
goto FX
FF(3):
bcode = bigbitout{bitcnt}
++bitcnt
if bcode = "0"
a = 1
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
if bcode <> "111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 2
else
bcode = bigbitout{bitcnt,4}
bitcnt += 4
if bcode <> "1111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 4
a = k + 9
else
bcode = bigbitout{bitcnt,4}
bitcnt += 4
bytes = cby(bcode)
k = ors(bytes)
k >>= 4
a = k + 24
end
end
end
goto FX
FF(4):
bcode = bigbitout{bitcnt}
++bitcnt
if bcode = "0"
a = 1
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
if bcode <> "111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 2
else
bcode = bigbitout{bitcnt,5}
bitcnt += 5
if bcode <> "11111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 3
a = k + 9
else
bcode = bigbitout{bitcnt,5}
bitcnt += 5
if bcode <> "11111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 3
a = k + 40
else
bcode = bigbitout{bitcnt,6}
bitcnt += 6
bytes = cby(bcode)
k = ors(bytes)
k >>= 2
a = k + 71
end
end
end
end
goto FX
FF(5):
bcode = bigbitout{bitcnt,2}
bitcnt += 2
if bcode <> "11"
bytes = cby(bcode)
k = ors(bytes)
k >>= 6
a = k + 1
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
if bcode <> "111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 4
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 11
end
end
goto FX
FF(6):
bcode = bigbitout{bitcnt,2}
bitcnt += 2
if bcode <> "11"
bytes = cby(bcode)
k = ors(bytes)
k >>= 6
a = k + 1
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
if bcode <> "111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 4
else
bcode = bigbitout{bitcnt,4}
bitcnt += 4
bytes = cby(bcode)
k = ors(bytes)
k >>= 4
a = k + 11
end
end
goto FX
FF(7):
bcode = bigbitout{bitcnt,2}
bitcnt += 2
if bcode <> "11"
bytes = cby(bcode)
k = ors(bytes)
k >>= 6
a = k + 1
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
if bcode <> "111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 4
else
bcode = bigbitout{bitcnt,4}
bitcnt += 4
if bcode <> "1111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 4
a = k + 11
else
bcode = bigbitout{bitcnt,4}
bitcnt += 4
bytes = cby(bcode)
k = ors(bytes)
k >>= 4
a = k + 26
end
end
end
goto FX
FF(8):
bcode = bigbitout{bitcnt,2}
bitcnt += 2
if bcode <> "11"
bytes = cby(bcode)
k = ors(bytes)
k >>= 6
a = k + 1
else
bcode = bigbitout{bitcnt,3}
bitcnt += 3
if bcode <> "111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 5
a = k + 4
else
bcode = bigbitout{bitcnt,5}
bitcnt += 5
if bcode <> "11111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 3
a = k + 11
else
bcode = bigbitout{bitcnt,5}
bitcnt += 5
if bcode <> "11111"
bytes = cby(bcode)
k = ors(bytes)
k >>= 3
a = k + 42
else
bcode = bigbitout{bitcnt,6}
bitcnt += 6
bytes = cby(bcode)
k = ors(bytes)
k >>= 2
a = k + 73
end
end
end
end
goto FX
FX:
b = cypher(lastchar,a)
lastchar = b
goto EE(b)
EE(1):
putc Program Error
stop
EE(2): /* new_line
&dA &d@ putc ~rec
putf [2] ~rec
bytecnt += 2
goto NEW_LINE
EE(3): /* sp16
rec = rec // " "
bytecnt += 16
goto NEW_CHAR
EE(4): /* sp8 -- space
rec = rec // " "{1,12 - b}
bytecnt += 12 - b
goto NEW_CHAR
EE(12): /* characters 33 to 127
rec = rec // chr(b+21)
++bytecnt
goto NEW_CHAR
EE(107): /* "measure "
rec = rec // "measure "
bytecnt += 8
goto NEW_CHAR
EE(108): /* "rest"
rec = rec // "rest"
bytecnt += 4
goto NEW_CHAR
END_LOOP:
close [2]
putc .w7 ~bytecnt bytes
repeat
run