&dA
&dA &d@ Program to make a CFT file from pages files in a directory
&dA &d@ or a set of directories
&dA &d@
&dA &d@ a transition table for all characters from 32 to 127 plus 96
&dA &d@ Special cases
&dA
&dA &d@ 128 = "42 46 1 0 0" 97
&dA &d@ 129 = "28 46 1 0 0" 98
&dA &d@ 130 = "12 46 1 0 0" "20 46 1 0 0" 99
&dA &d@ 131 = "1 82 6913 " 100
&dA &d@ 132 = "0 0 0 " 101
&dA &d@ 133 = "K 0 0 " 102
&dA &d@ 134 = "1152 " 103
&dA &d@ 135 = "1729 " 104
&dA &d@ 136 = "2305 " 105
&dA &d@ 137 = "3457 " 106
&dA &d@ 138 = "4609 " 107
&dA &d@ 139 = "5185 " 108
&dA &d@ 140 = "A D " 109
&dA &d@ 141 = "J N " 110
&dA &d@ 142 = "J R " 111
&dA &d@ 143 = "J B " 112
&dA &d@ 144 = "K 0 " 113
&dA &d@ 145 = "K 1 " 114
&dA &d@ 146 = "-11 " "-10 " 115
&dA &d@ 147 = "-12 " "-11 " 116
&dA &d@ 148 = "-14 " "-14 " 117
&dA &d@ 149 = "-15 " "-15 " 118
&dA &d@ 150 = "-18 " "-20 " 119
&dA &d@ 151 = "-21 " "-21 " 120
&dA &d@ 152 = "-28 " "-25 " 121
&dA &d@ 153 = "-32 " "-28 " 122
&dA &d@ 154 = "-35 " "-30 " 123
&dA &d@ 155 = "-42 " "-32 " 124
&dA &d@ 156 = "-49 " "-35 " 125
&dA &d@ 157 = "-53 " "-42 " 126
&dA &d@ 158 = "-63 " "-49 " 127
&dA &d@ 159 = "-74 " "-53 " 128
&dA &d@ 160 = "576 " "-63 " 129
&dA &d@ 161 = "288 " "-74 " 130
&dA &d@ 162 = "144 " "576 " 131
&dA &d@ 163 = "-1 " "288 " 132
&dA &d@ 164 = "-2 " "144 " 133
&dA &d@ 165 = "-3 " "-1 " 134
&dA &d@ 166 = "-6 " "-2 " 135
&dA &d@ 167 = "-7 " "-5 " 136
&dA &d@ 168 = "-9 " "-7 " 137
&dA &d@ 169 = "10 " "10 " 138
&dA &d@ 170 = "12 " "14 " 139
&dA &d@ 171 = "14 " "15 " 140
&dA &d@ 172 = "15 " "16 " 141
&dA &d@ 173 = "16 " "20 " 142
&dA &d@ 174 = "18 " "21 " 143
&dA &d@ 175 = "21 " "25 " 144
&dA &d@ 176 = "24 " "28 " 145
&dA &d@ 177 = "28 " "30 " 146
&dA &d@ 178 = "31 " "31 " 147
&dA &d@ 179 = "32 " "32 " 148
&dA &d@ 180 = "35 " "35 " 149
&dA &d@ 181 = "42 " 150
&dA &d@ 182 = "49 " 151
&dA &d@ 183 = "52 " 152
&dA &d@ 184 = "56 " 153
&dA &d@ 185 = "63 " 154
&dA &d@ 186 = "72 " 155
&dA &d@ 187 = " * " 156
&dA &d@ 188 = " - " 157
&dA &d@ 189 = "12" 158
&dA &d@ 190 = "16" 159
&dA &d@ 191 = "24" 160
&dA &d@ 192 = "32" 161
&dA &d@ 193 = "42" 162
&dA &d@ 194 = "43" 163
&dA &d@ 195 = "44" 164
&dA &d@ 196 = "45" 165
&dA &d@ 197 = "48" 166
&dA &d@ 198 = "49" 167
&dA &d@ 199 = "53" 168
&dA &d@ 200 = "54" 169
&dA &d@ 201 = "59" 170
&dA &d@ 202 = "60" 171
&dA &d@ 203 = "63" 172
&dA &d@ 204 = "64" 173
&dA &d@ 205 = "65" 174
&dA &d@ 206 = "96" 175
&dA &d@ 207 = "0" 176
&dA &d@ 208 = "4" 177
&dA &d@ 209 = "6" 178
&dA &d@ 210 = "8" 179
&dA &d@ 211 = "K " 180
&dA &d@ 212 = "0 " 181
&dA &d@ 213 = "1 " 182
&dA &d@ 214 = "2 " 183
&dA &d@ 215 = "3 " 184
&dA &d@ 216 = "4 " 185
&dA &d@ 217 = "5 " 186
&dA &d@ 218 = "6 " 187
&dA &d@ 219 = "7 " 188
&dA &d@ 220 = "8 " 189
&dA &d@ 221 = "9 " 190
&dA &d@ 222 new line 191
&dA &d@ 223 beginning of file 192
&dA
&dA &d@ Total = 192 characters
&dA
#define NCHAR 192
#define NLINE 222
#define NFILE 223
#define NSPEC 94
str title.24,header.1100,errmsg.120
str rec.280,slib.100(255),file.180,cdir.180,byte.120,color.10,outfile.120
str infiles.80(2000),bigout.5000000
str sourcelib.100,source.15
str methodstr.30(8)
bstr bigbitout.8000000
int f,g,h,i,j,k,order(NCHAR),trans(NCHAR,NCHAR),acc(24)
int nfiles,curfile,sliblen,lastchar,total,ctotal,method(NCHAR)
int cypher(NCHAR,NCHAR),outcnt,numlibs
int limits(6),mults(6)
int n,p(255)
int n_recs
int doff,dlen
label FF(8)
methodstr(1) = " 1 1 3 3 15 128"
methodstr(2) = " 1 1 7 15 31 128"
methodstr(3) = " 1 3 3 7 31 128"
methodstr(4) = " 1 7 15 31 31 128"
methodstr(5) = " 3 3 3 7 31 128"
methodstr(6) = " 3 7 7 7 31 128"
methodstr(7) = " 7 7 7 7 31 128"
methodstr(8) = " 7 15 15 31 63 128"
ctotal = 0
putc Program to make a CFT file from a library of MPG files
putc
putc The library may consist of files or sub-libraries of files
putc The maximum number of sub-libraries is 255;
putc The maximum number of files is 2000.
putc
putc Enter name of source library for this compression
putc
putc NOTE: This will become the default name for the
putc for the expansion
putc
putc Enter source library
getc sourcelib
sourcelib = trm(sourcelib)
source = sourcelib
getdir cdir
sourcelib = cdir // "/" // sourcelib
putc Outout file
getc outfile
outfile = cdir // "/" // outfile
&dA
&dA &d@ I. Set up title and offsets
&dA
title = zpd(24)
title{1,8} = "CCARH "
title{9,4} = ch4(0x100)
bigout = title
&dA
&dA &d@ II. Construct header
&dA
putc Collecting information for the Header
putc Composer? (up to 255 bytes)
getc rec
rec = rec // pad(255)
rec = rec{1,255}
rec = trm(rec)
i = len(rec)
header = chr(i) // rec
putc Work name? (up to 255 bytes)
getc rec
rec = rec // pad(255)
rec = rec{1,255}
rec = trm(rec)
i = len(rec)
header = header // chr(i) // rec
putc
putc Type of representation? (up to 255 bytes)
putc
putc Select a standard response
putc 1 = Full Score
putc 2 = Complete Parts
putc Or enter type (e.b46 g.b46 Violine I)
getc rec
rec = rec // pad(255)
rec = rec{1,255}
rec = trm(rec)
if rec = "1"
rec = "Full Score"
end
if rec = "2"
rec = "Complete Parts"
end
i = len(rec)
header = header // chr(i) // rec
putc
putc Resolution (up to 255 bytes)
putc
putc Select a standard response
putc a = 300 dots/inch
putc Or enter resolution
getc rec
rec = rec // pad(255)
rec = rec{1,255}
rec = trm(rec)
if rec = "a"
rec = "300 dots/inch"
end
i = len(rec)
header = header // chr(i) // rec
bigout = bigout // header
i = len(bigout)
bigout{17,4} = ch4(i)
&dA
&dA &d@ Look at source situation
&dA
i = 0
j = 0
open [1,1] sourcelib
loop
getf [1] rec
rec = rec // pad(18)
if rec{1} = " "
goto CLIB1
end
if rec{14,5} = "
"
rec = rec{1,8}
++j
slib(j) = trm(rec)
else
rec = rec{1,8}
rec = trm(rec)
&dA &d@ rec = rec // ".MPG"
++i
infiles(i) = rec
end
repeat
CLIB1:
if j > 0 and i > 0
errmsg = "There are sub-directories and source files within the same directory"
goto SERROR
end
if j = 0 and i = 0
errmsg = "Source directory is empty"
goto SERROR
end
close [1]
numlibs = j
nfiles = i
if numlibs > 255
errmsg = "Number of sub-directories exceeds maximum (255)"
goto SERROR
end
if nfiles > 255
errmsg = "Number of pages in a directory exceeds maximum (255)"
goto SERROR
end
&dA
&dA &d@ III. Construct File Organization
&dA
&dA
&dA &d@ Field 1.
&dA
if numlibs = 0
bigout = bigout // chr(1) /* compression of a set of MPG page
/* files from a single directory.
else
bigout = bigout // chr(2) /* compression of directories,
/* each containing a set of MPG files.
end
&dA
&dA &d@ Field 2.
&dA
i = len(source)
bigout = bigout // chr(i) // source
&dA
&dA &d@ Field 3.
&dA
bigout = bigout // chr(numlibs)
if numlibs = 0
putc Enter information for 1 subdivision
else
putc Enter information for ~numlibs subdivision(s)
end
&dA
&dA &d@ CASE 2:
&dA
if numlibs = 0
&dA
&dA &d@ Field 4.
&dA
putc
putc Enter subdivision name (optional)
putc
putc e.b46 g.b46 Movement 1
putc e.b46 g.b46 Violine I
putc
getc rec
rec = trm(rec)
i = len(rec)
bigout = bigout // chr(i) // rec
&dA
&dA &d@ Field 5.
&dA
putc
putc Enter note size
putc
putc Select a standard response
putc a = 14 dots per staff line
putc b = 21 dots per staff line
putc c = 14 and 21 mixed
putc Or enter note size
getc rec
rec = trm(rec)
if rec = "a"
rec = "14 dots per staff line"
end
if rec = "b"
rec = "21 dots per staff line"
end
if rec = "c"
rec = "14 and 21 mixed"
end
i = len(rec)
bigout = bigout // chr(i) // rec
&dA
&dA &d@ Field 6.
&dA
bigout = bigout // chr(0)
&dA
&dA &d@ Field 7.
&dA
p(1) = nfiles
bigout = bigout // chr(nfiles)
&dA
&dA &d@ Field 8.
&dA
bigout = bigout // ch2(2)
&dA
&dA &d@ CASE 3:
&dA
else
n = 0
loop for j = 1 to numlibs
p(j) = 0
file = sourcelib // "/" // slib(j)
open [1,1] file
loop
getf [1] rec
rec = rec // pad(18)
if rec{14,5} = ""
errmsg = "There are sub-directories within sub-directories"
goto SERROR
end
rec = rec{1,8}
if rec{1} = " "
goto CLIB2
end
rec = trm(rec)
&dA &d@ rec = rec // ".MPG"
++n
++p(j)
infiles(n) = slib(j) // "/" // rec
repeat
CLIB2:
close [1]
if p(j) > 255
errmsg = "Number of pages in sub-directory " // chs(j)
errmsg = errmsg // " exceeds maximum (255)"
goto SERROR
end
&dA
&dA &d@ Field 4.
&dA
putc
putc Enter subdivision name for sub-directory number ~j
putc
putc e.b46 g.b46 Movement 1
putc e.b46 g.b46 Violine I
putc
getc rec
rec = trm(rec)
i = len(rec)
bigout = bigout // chr(i) // rec
&dA
&dA &d@ Field 5.
&dA
putc
putc Enter note size for sub-directory number ~j
putc
putc Select a standard response
putc a = 14 dots per staff line
putc b = 21 dots per staff line
putc c = 14 and 21 mixed
putc Or enter note size
getc rec
rec = trm(rec)
if rec = "a"
rec = "14 dots per staff line"
end
if rec = "b"
rec = "21 dots per staff line"
end
if rec = "c"
rec = "14 and 21 mixed"
end
i = len(rec)
bigout = bigout // chr(i) // rec
&dA
&dA &d@ Field 6.
&dA
i = len(slib(j))
bigout = bigout // chr(i) // slib(j)
&dA
&dA &d@ Field 7.
&dA
bigout = bigout // chr(p(j))
&dA
&dA &d@ Field 8.
&dA
if j = 1
bigout = bigout // ch2(2)
k = 2
else
k += p(j-1)
bigout = bigout // ch2(k)
end
repeat
nfiles = n
end
&dA
&dA &d@ IV. Set up space for Data group offsets and lengths
&dA
i = len(bigout)
bigout{21,4} = ch4(i)
doff = i + 1
if numlibs = 0
i = p(1) + 1
else
i = k + p(numlibs) - 1
end
rec = zpd(8)
bigout = bigout // dup(rec,i)
putc
putc Step 1: Analyzing files
loop for curfile = 1 to nfiles
file = infiles(curfile)
putc ~file .t25 ...
file = sourcelib // "/" // file
open [1,1] file
lastchar = NCHAR
j = 0
loop
getf [1] rec
rec = trm(rec)
rec = rec // chr(NLINE)
j += len(rec)
loop for i = 1 to len(rec)
if len(rec) - i >= 11
if rec{i,11} = "42 46 1 0 0"
k = 97
++trans(lastchar,k)
lastchar = k
i += 10
goto P2
end
if rec{i,11} = "28 46 1 0 0"
k = 98
++trans(lastchar,k)
lastchar = k
i += 10
goto P2
end
if rec{i,11} = "20 46 1 0 0"
k = 99
++trans(lastchar,k)
lastchar = k
i += 10
goto P2
end
end
if len(rec) - i >= 10
if rec{i,10} = "1 82 6913 "
k = 100
++trans(lastchar,k)
lastchar = k
i += 9
goto P2
end
end
if len(rec) - i >= 6
if rec{i,6} = "0 0 0 "
k = 101
++trans(lastchar,k)
lastchar = k
i += 5
goto P2
end
if rec{i,6} = "K 0 0 "
k = 102
++trans(lastchar,k)
lastchar = k
i += 5
goto P2
end
end
if len(rec) - i >= 5
if rec{i,5} = "1152 "
k = 103
++trans(lastchar,k)
lastchar = k
i += 4
goto P2
end
if rec{i,5} = "1729 "
k = 104
++trans(lastchar,k)
lastchar = k
i += 4
goto P2
end
if rec{i,5} = "2305 "
k = 105
++trans(lastchar,k)
lastchar = k
i += 4
goto P2
end
if rec{i,5} = "3457 "
k = 106
++trans(lastchar,k)
lastchar = k
i += 4
goto P2
end
if rec{i,5} = "4609 "
k = 107
++trans(lastchar,k)
lastchar = k
i += 4
goto P2
end
if rec{i,5} = "5185 "
k = 108
++trans(lastchar,k)
lastchar = k
i += 4
goto P2
end
end
if len(rec) - i >= 4
if rec{i,4} = "A D "
k = 109
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "J N "
k = 110
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "J R "
k = 111
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "J B "
k = 112
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "K 0 "
k = 113
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "K 1 "
k = 114
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-10 "
k = 115
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-11 "
k = 116
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-14 "
k = 117
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-15 "
k = 118
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-20 "
k = 119
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-21 "
k = 120
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-25 "
k = 121
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-28 "
k = 122
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-30 "
k = 123
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-32 "
k = 124
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-35 "
k = 125
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-42 "
k = 126
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-49 "
k = 127
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-53 "
k = 128
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-63 "
k = 129
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "-74 "
k = 130
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "576 "
k = 131
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "288 "
k = 132
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
if rec{i,4} = "144 "
k = 133
++trans(lastchar,k)
lastchar = k
i += 3
goto P2
end
end
if len(rec) - i >= 3
if rec{i,3} = "-1 "
k = 134
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "-2 "
k = 135
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "-5 "
k = 136
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "-7 "
k = 137
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "10 "
k = 138
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "14 "
k = 139
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "15 "
k = 140
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "16 "
k = 141
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "20 "
k = 142
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "21 "
k = 143
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "25 "
k = 144
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "28 "
k = 145
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "30 "
k = 146
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "31 "
k = 147
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "32 "
k = 148
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "35 "
k = 149
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "42 "
k = 150
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "49 "
k = 151
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "52 "
k = 152
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "56 "
k = 153
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "63 "
k = 154
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = "72 "
k = 155
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = " * "
k = 156
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,3} = " - "
k = 157
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
end
if len(rec) - i = 2
if rec{i,2} = "12"
k = 158
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "16"
k = 159
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "24"
k = 160
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "32"
k = 161
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "42"
k = 162
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "43"
k = 163
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "44"
k = 164
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "45"
k = 165
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "48"
k = 166
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "49"
k = 167
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "53"
k = 168
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "54"
k = 169
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "59"
k = 170
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "60"
k = 171
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "63"
k = 172
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "64"
k = 173
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "65"
k = 174
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
if rec{i,2} = "96"
k = 175
++trans(lastchar,k)
lastchar = k
i += 2
goto P2
end
end
if len(rec) - i = 1
if rec{i} = "0"
k = 176
++trans(lastchar,k)
lastchar = k
++i
goto P2
end
if rec{i} = "4"
k = 177
++trans(lastchar,k)
lastchar = k
++i
goto P2
end
if rec{i} = "6"
k = 178
++trans(lastchar,k)
lastchar = k
++i
goto P2
end
if rec{i} = "8"
k = 179
++trans(lastchar,k)
lastchar = k
++i
goto P2
end
end
if len(rec) - i >= 2
if rec{i,2} = "K "
k = 180
++trans(lastchar,k)
lastchar = k
++i
goto P2
end
if rec{i+1} = " " and "0123456789" con rec{i}
k = 180 + mpt
++trans(lastchar,k)
lastchar = k
++i
goto P2
end
end
k = ors(rec{i}) - 31
if (k >= 1 and k <= 96) or k = (NLINE - 31)
++trans(lastchar,k)
else
putc Funny byte k = ~k
end
lastchar = k
P2:
repeat
repeat
eof1:
close [1]
putc Total bytes in this file = .w6 ~j
total += j
repeat
putc
putc Total byte count = ~total
putc
putc Step 2: Compute cypher
&dA
&dA &d@ 1. Store offset to cypher
&dA
bigout{doff,4} = ch4(len(bigout))
doff += 4
&dA
&dA &d@ 2. Store cypher
&dA
dlen = 0
loop for h = 1 to NCHAR
loop for i = 1 to NCHAR
order(i) = i
repeat
putc ~h ...
i = h / 20
if rem = 0
putc
end
&dA
&dA &d@ Sort the transition array
&dA
loop for i = 1 to NCHAR
loop for j = i+1 to NCHAR
if trans(h,j) > trans(h,i)
k = trans(h,j)
trans(h,j) = trans(h,i)
trans(h,i) = k
k = order(j)
order(j) = order(i)
order(i) = k
end
repeat
repeat
&dA
&dA &d@ Compute method
&dA
loop for i = 1 to 8 /* 8 methods
acc(i) = 0
g = 0
loop for j = 1 to 6
k = j - 1 * 4 + 1
f = int(methodstr(i){k,4})
if j = 1
limits(j) = f
else
limits(j) = f + limits(j-1)
end
loop while f > 0
f >>= 1
++g
repeat
mults(j) = g
repeat
loop for j = 1 to NCHAR
if j <= limits(1)
f = trans(h,j) * mults(1)
acc(i) += f
else
if j <= limits(2)
f = trans(h,j) * mults(2)
acc(i) += f
else
if j <= limits(3)
f = trans(h,j) * mults(3)
acc(i) += f
else
if j <= limits(4)
f = trans(h,j) * mults(4)
acc(i) += f
else
if j <= limits(5)
f = trans(h,j) * mults(5)
acc(i) += f
else
f = trans(h,j) * mults(6)
acc(i) += f
end
end
end
end
end
repeat
repeat
k = 100000000
loop for i = 1 to 8
if acc(i) < k
k = acc(i)
j = i
end
repeat
&dA
&dA &d@ method breakdown
&dA &d@ ÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
&dA &d@ 000 1 1 3 3 15 128
&dA &d@ 001 1 1 7 15 31 128
&dA &d@ 010 1 3 3 7 31 128
&dA &d@ 011 1 7 15 31 31 128
&dA &d@ 100 3 3 3 7 31 128
&dA &d@ 101 3 7 7 7 31 128
&dA &d@ 102 7 7 7 7 31 128
&dA &d@ 111 7 15 15 31 63 128
&dA
method(h) = j - 1
loop for i = 1 to NCHAR
loop for j = 1 to NCHAR
if i = order(j)
cypher(h,i) = j
j = NCHAR
end
repeat
repeat
loop for i = 1 to NCHAR
if trans(h,i) = 0
bigout = bigout // chr(0)
i = NCHAR
else
bigout = bigout // chr(order(i))
end
++dlen
repeat
bigout = bigout // chr(method(h))
++dlen
ctotal += k
repeat
bigout{doff,4} = ch4(dlen)
doff += 4
&dA
&dA &d@ Cypher has been stored; offset and length are in place
&dA
putc
putc
ctotal = ctotal + 7 / 8
putc Total compression takes ~ctotal bytes
k = total * 100
k /= ctotal
putc Compression ratio = .d2 ~k
putc
putc Step 3: Compression
loop for curfile = 1 to nfiles
&dA
&dA &d@ Store offset
&dA
bigout{doff,4} = ch4(len(bigout))
doff += 4
dlen = 0
&dA
&dA &d@ Report and open source
&dA
putc ~infiles(curfile) .t20 ÄÄÄ ...
i = curfile + 1
putc Data group ~i .t16 ...
file = sourcelib // "/" // infiles(curfile)
open [3,1] file
bigbitout = ""
lastchar = NCHAR
j = 0
n_recs = 0
loop
getf [3] rec
++n_recs
rec = trm(rec)
rec = rec // chr(NLINE)
j += len(rec)
loop for i = 1 to len(rec)
if len(rec) - i >= 11
if rec{i,11} = "42 46 1 0 0"
k = 97
perform write_bits
lastchar = k
i += 10
goto P4
end
if rec{i,11} = "28 46 1 0 0"
k = 98
perform write_bits
lastchar = k
i += 10
goto P4
end
if rec{i,11} = "20 46 1 0 0"
k = 99
perform write_bits
lastchar = k
i += 10
goto P4
end
end
if len(rec) - i >= 10
if rec{i,10} = "1 82 6913 "
k = 100
perform write_bits
lastchar = k
i += 9
goto P4
end
end
if len(rec) - i >= 6
if rec{i,6} = "0 0 0 "
k = 101
perform write_bits
lastchar = k
i += 5
goto P4
end
if rec{i,6} = "K 0 0 "
k = 102
perform write_bits
lastchar = k
i += 5
goto P4
end
end
if len(rec) - i >= 5
if rec{i,5} = "1152 "
k = 103
perform write_bits
lastchar = k
i += 4
goto P4
end
if rec{i,5} = "1729 "
k = 104
perform write_bits
lastchar = k
i += 4
goto P4
end
if rec{i,5} = "2305 "
k = 105
perform write_bits
lastchar = k
i += 4
goto P4
end
if rec{i,5} = "3457 "
k = 106
perform write_bits
lastchar = k
i += 4
goto P4
end
if rec{i,5} = "4609 "
k = 107
perform write_bits
lastchar = k
i += 4
goto P4
end
if rec{i,5} = "5185 "
k = 108
perform write_bits
lastchar = k
i += 4
goto P4
end
end
if len(rec) - i >= 4
if rec{i,4} = "A D "
k = 109
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "J N "
k = 110
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "J R "
k = 111
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "J B "
k = 112
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "K 0 "
k = 113
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "K 1 "
k = 114
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-10 "
k = 115
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-11 "
k = 116
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-14 "
k = 117
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-15 "
k = 118
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-20 "
k = 119
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-21 "
k = 120
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-25 "
k = 121
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-28 "
k = 122
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-30 "
k = 123
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-32 "
k = 124
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-35 "
k = 125
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-42 "
k = 126
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-49 "
k = 127
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-53 "
k = 128
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-63 "
k = 129
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "-74 "
k = 130
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "576 "
k = 131
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "288 "
k = 132
perform write_bits
lastchar = k
i += 3
goto P4
end
if rec{i,4} = "144 "
k = 133
perform write_bits
lastchar = k
i += 3
goto P4
end
end
if len(rec) - i >= 3
if rec{i,3} = "-1 "
k = 134
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "-2 "
k = 135
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "-5 "
k = 136
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "-7 "
k = 137
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "10 "
k = 138
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "14 "
k = 139
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "15 "
k = 140
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "16 "
k = 141
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "20 "
k = 142
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "21 "
k = 143
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "25 "
k = 144
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "28 "
k = 145
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "30 "
k = 146
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "31 "
k = 147
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "32 "
k = 148
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "35 "
k = 149
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "42 "
k = 150
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "49 "
k = 151
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "52 "
k = 152
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "56 "
k = 153
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "63 "
k = 154
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = "72 "
k = 155
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = " * "
k = 156
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,3} = " - "
k = 157
perform write_bits
lastchar = k
i += 2
goto P4
end
end
if len(rec) - i = 2
if rec{i,2} = "12"
k = 158
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "16"
k = 159
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "24"
k = 160
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "32"
k = 161
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "42"
k = 162
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "43"
k = 163
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "44"
k = 164
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "45"
k = 165
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "48"
k = 166
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "49"
k = 167
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "53"
k = 168
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "54"
k = 169
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "59"
k = 170
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "60"
k = 171
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "63"
k = 172
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "64"
k = 173
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "65"
k = 174
perform write_bits
lastchar = k
i += 2
goto P4
end
if rec{i,2} = "96"
k = 175
perform write_bits
lastchar = k
i += 2
goto P4
end
end
if len(rec) - i = 1
if rec{i} = "0"
k = 176
perform write_bits
lastchar = k
++i
goto P4
end
if rec{i} = "4"
k = 177
perform write_bits
lastchar = k
++i
goto P4
end
if rec{i} = "6"
k = 178
perform write_bits
lastchar = k
++i
goto P4
end
if rec{i} = "8"
k = 179
perform write_bits
lastchar = k
++i
goto P4
end
end
if len(rec) - i >= 2
if rec{i,2} = "K "
k = 180
perform write_bits
lastchar = k
++i
goto P4
end
if rec{i+1} = " " and "0123456789" con rec{i}
k = 180 + mpt
perform write_bits
lastchar = k
++i
goto P4
end
end
k = ors(rec{i}) - 31
if (k >= 1 and k <= 96) or k = (NLINE - 31)
perform write_bits
else
putc Funny byte k = ~k
end
lastchar = k
P4:
repeat
repeat
eof3:
close [3]
&dA
&dA &d@ Store actual file name
&dA
rec = rev(file)
if rec con "/"
rec = rec{1,mpt-1}
end
if rec con "."
rec = rev(rec)
else
rec = rev(rec)
rec = rec // ".MPG"
end
k = len(rec)
bigout = bigout // chr(k) // rec
dlen += (k + 1)
&dA
&dA &d@ Store number of records
&dA
bigout = bigout // ch4(n_recs)
dlen += 4
k = bln(bigbitout)
&dA
&dA &d@ Store length of data in bits
&dA
bigout = bigout // ch4(k)
dlen += 4
k = k + 7 / 8 /* length in bytes
bigout = bigout // cby(bigbitout)
dlen += k
j = j * 100 / k
putc Size = .w5 ~k bytes .t22 ratio = .d2 ~j
bigout{doff,4} = ch4(dlen)
doff += 4
repeat
putc
putc Storing results in ouput CFT file .b46 .b46 .b46 ...
open [2,6] outfile
write [2] bigout
close [2]
putc Done
putc
stop
SERROR:
putc Error in source structure
putc
putc errmsg
putc
putc &dA Program Halted
putc
stop
procedure write_bits
int a,b,c,d,e
bstr code.30,btemp.8
str temp.1
a = cypher(lastchar,k)
b = method(lastchar)
goto FF(b+1)
FF(1): /* one 1 1 3 3 15 128
if a = 1
code = "0"
else
if a = 2
code = "10"
else
if a <= 5 /* 3 .. 5
a -= 3
temp = chr(a)
btemp = cbi(temp)
code = "11" // btemp{7..8}
else
if a <= 8 /* 6 .. 8
a -= 6
temp = chr(a)
btemp = cbi(temp)
code = "1111" // btemp{7..8}
else
if a <= 23 /* 9 .. 23
a -= 9
temp = chr(a)
btemp = cbi(temp)
code = "111111" // btemp{5..8}
else
a -= 24 /* 24 ...
temp = chr(a)
btemp = cbi(temp)
code = "1111111111" // btemp{1..8}
end
end
end
end
end
goto FX
FF(2): /* two 1 1 7 15 31 128
if a = 1
code = "0"
else
if a = 2
code = "10"
else
if a <= 9 /* 3 .. 9
a -= 3
temp = chr(a)
btemp = cbi(temp)
code = "11" // btemp{6..8}
else
if a <= 24 /* 10 .. 24
a -= 10
temp = chr(a)
btemp = cbi(temp)
code = "11111" // btemp{5..8}
else
if a <= 55 /* 25 .. 55
a -= 25
temp = chr(a)
btemp = cbi(temp)
code = "111111111" // btemp{4..8}
else
a -= 56 /* 56 ...
temp = chr(a)
btemp = cbi(temp)
code = "11111111111111" // btemp{1..8}
end
end
end
end
end
goto FX
FF(3): /* three 1 3 3 7 31 128
if a = 1
code = "0"
else
if a <= 4 /* 2 .. 4
a -= 2
temp = chr(a)
btemp = cbi(temp)
code = "1" // btemp{7..8}
else
if a <= 7 /* 5 .. 7
a -= 5
temp = chr(a)
btemp = cbi(temp)
code = "111" // btemp{7..8}
else
if a <= 14 /* 8 .. 14
a -= 8
temp = chr(a)
btemp = cbi(temp)
code = "11111" // btemp{6..8}
else
if a <= 45 /* 15 .. 45
a -= 15
temp = chr(a)
btemp = cbi(temp)
code = "11111111" // btemp{4..8}
else
a -= 46 /* 46 ...
temp = chr(a)
btemp = cbi(temp)
code = "1111111111111" // btemp{1..8}
end
end
end
end
end
goto FX
FF(4): /* four 1 7 15 31 31 128
if a = 1
code = "0"
else
if a <= 8 /* 2 .. 8
a -= 2
temp = chr(a)
btemp = cbi(temp)
code = "1" // btemp{6..8}
else
if a <= 23 /* 9 .. 23
a -= 9
temp = chr(a)
btemp = cbi(temp)
code = "1111" // btemp{5..8}
else
if a <= 54 /* 24 .. 54
a -= 24
temp = chr(a)
btemp = cbi(temp)
code = "11111111" // btemp{4..8}
else
if a <= 85 /* 55 .. 85
a -= 55
temp = chr(a)
btemp = cbi(temp)
code = "1111111111111" // btemp{4..8}
else
a -= 86 /* 86 ...
temp = chr(a)
btemp = cbi(temp)
code = "111111111111111111" // btemp{1..8}
end
end
end
end
end
goto FX
FF(5): /* five 3 3 3 7 31 128
if a <= 3 /* 1 .. 3
a -= 1
temp = chr(a)
btemp = cbi(temp)
code = btemp{7..8}
else
if a <= 6 /* 4 .. 6
a -= 4
temp = chr(a)
btemp = cbi(temp)
code = "11" // btemp{7..8}
else
if a <= 9 /* 7 .. 9
a -= 7
temp = chr(a)
btemp = cbi(temp)
code = "1111" // btemp{7..8}
else
if a <= 16 /* 10 .. 16
a -= 10
temp = chr(a)
btemp = cbi(temp)
code = "111111" // btemp{6..8}
else
if a <= 47 /* 17 .. 47
a -= 17
temp = chr(a)
btemp = cbi(temp)
code = "111111111" // btemp{4..8}
else
a -= 48 /* 48 ...
temp = chr(a)
btemp = cbi(temp)
code = "11111111111111" // btemp{1..8}
end
end
end
end
end
goto FX
FF(6): /* six 3 7 7 7 31 128
if a <= 3 /* 1 .. 3
a -= 1
temp = chr(a)
btemp = cbi(temp)
code = btemp{7..8}
else
if a <= 10 /* 4 .. 10
a -= 4
temp = chr(a)
btemp = cbi(temp)
code = "11" // btemp{6..8}
else
if a <= 17 /* 11 .. 17
a -= 11
temp = chr(a)
btemp = cbi(temp)
code = "11111" // btemp{6..8}
else
if a <= 24 /* 18 .. 24
a -= 18
temp = chr(a)
btemp = cbi(temp)
code = "11111111" // btemp{6..8}
else
if a <= 55 /* 25 .. 55
a -= 25
temp = chr(a)
btemp = cbi(temp)
code = "11111111111" // btemp{4..8}
else
a -= 56 /* 56 ...
temp = chr(a)
btemp = cbi(temp)
code = "1111111111111111" // btemp{1..8}
end
end
end
end
end
goto FX
FF(7): /* seven 7 7 7 7 31 128
if a <= 7 /* 1 .. 7
a -= 1
temp = chr(a)
btemp = cbi(temp)
code = btemp{6..8}
else
if a <= 14 /* 8 .. 14
a -= 8
temp = chr(a)
btemp = cbi(temp)
code = "111" // btemp{6..8}
else
if a <= 21 /* 15 .. 21
a -= 15
temp = chr(a)
btemp = cbi(temp)
code = "111111" // btemp{6..8}
else
if a <= 28 /* 22 .. 28
a -= 22
temp = chr(a)
btemp = cbi(temp)
code = "111111111" // btemp{6..8}
else
if a <= 59 /* 29 .. 59
a -= 29
temp = chr(a)
btemp = cbi(temp)
code = "111111111111" // btemp{4..8}
else
a -= 60 /* 60 ...
temp = chr(a)
btemp = cbi(temp)
code = "11111111111111111" // btemp{1..8}
end
end
end
end
end
goto FX
FF(8): /* eight 7 15 15 31 63 128
if a <= 7 /* 1 .. 7
a -= 1
temp = chr(a)
btemp = cbi(temp)
code = btemp{6..8}
else
if a <= 22 /* 8 .. 22
a -= 8
temp = chr(a)
btemp = cbi(temp)
code = "111" // btemp{5..8}
else
if a <= 37 /* 23 .. 37
a -= 23
temp = chr(a)
btemp = cbi(temp)
code = "1111111" // btemp{5..8}
else
if a <= 68 /* 38 .. 68
a -= 38
temp = chr(a)
btemp = cbi(temp)
code = "11111111111" // btemp{4..8}
else
if a <= 131 /* 69 .. 131
a -= 69
temp = chr(a)
btemp = cbi(temp)
code = "1111111111111111" // btemp{3..8}
else
a -= 132 /* 132 ...
temp = chr(a)
btemp = cbi(temp)
code = "1111111111111111111111" // btemp{1..8}
end
end
end
end
end
goto FX
FX:
bigbitout = bigbitout // code
return
run