1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
|
ACCENTS.CHG - WEB change file for ACCENTS 1 for MS-DOS and Turbo Pascal.
DOS-TP 1.0: Written by Jiri Zlatuska, April 1991;
based on change files for VFTOVP and VPTOVF 1.2
by P. Breitenlohner.
% No line numbers refer to .WEB, as of ????.
@x limbo l.10
\def\PASCAL{Pascal}
@y
\def\PASCAL{Pascal}
\def\TP{\hbox{Turbo Pascal}} % Version 4.0 or later
@z
%---------------------------------------
@x limbo l.17 - print only changed modules
\def\topofcontents{\null
@y
%\let\maybe=\iffalse
\def\topofcontents{\null
@z
%---------------------------------------
@x limbo l.24
\vfill}
@y
\centerline{(DOS-TP Version 1, April 1991)}
\vfill}
@z
%---------------------------------------
@x [1] m.1 l.58 - banner
@d banner=='This is ACCENTS, Version 1' {printed when the program starts}
@y
@d TP_dir(#)==@\@={$@>#@=}@>
@#
@d banner=='This is ACCENTS, Version 1/DOS-TP 1'
{printed when the program starts}
@z
%---------------------------------------
@x [1] m.2 l.72 -
@d print(#)==write(#)
@y
@d integer==long_int {we will use |Integer| for two-byte integers}
@d xchr==Xchr(ASCII)
@#
@d print(#)==write(#)
@z
%---------------------------------------
@x [1] m.2 l.75 - unit DOS
@p program ACCENTS(@!T_tfm_file,@!vf_file,@!adj_file,@!tfm_file,@!output);
@y
@p program ACCENTS(@!T_tfm_file,@!vf_file,@!tfm_file,@!output);
uses DOS; {unit DOS used for |get_env|, file and path names}
@z
%---------------------------------------
@x [1] m.2 l.82 - DOS initializations
begin print_ln(banner);@/
print_ln(copyright);
print_ln('Distributed under terms of GNU General Public License');@/
@y
@!name_of_file:path_str; {a DOS file name}
begin @<Initialize DOS variables@>@/
print_ln(banner);@/
print_ln(copyright);
print_ln('Distributed under terms of GNU General Public License');@/
@z
%---------------------------------------
@x [1] m.4 l.96 constants - file handling
@<Constants...@>=
@y
@d vf_buf_size=1024 {size of buffer for |vf_file|}
@d tfm_buf_size=256 {size of buffer (words) for |tfm_file|}
@d adj_buf_size=1024 {size of buffer for |adj_file|}
@<Constants...@>=
@z
%---------------------------------------
@x [1] m.4 l.103 constants - file names
@!name_length=50; {a file name shouldn't be longer than this}
@y
@!name_length=size_of(path_str)-1;
{a file name shouldn't be longer than this}
@z
%---------------------------------------
@x [1] m.5 l.108 - optimization
@d incr(#) == #:=#+1 {increase a variable by unity}
@d decr(#) == #:=#-1 {decrease a variable by unity}
@y
@d incr(#) == inc(#) {increase a variable by unity}
@d decr(#) == dec(#) {decrease a variable by unity}
@z
%---------------------------------------
@x
@d othercases == others: {default for cases not listed explicitly}
@y
@d othercases == else {default for cases not listed explicitly}
@z
%---------------------------------------
@x [1] m.5 l.117 - optimization
@!byte=0..255; {unsigned eight-bit quantity}
@y
@!five_choices = 1..5; {used when there are five variants in a record}
@!aux_word = record@;@/
case five_choices of
1: (@!b3,@!b2,@!b1,@!b0 : byte);
2: (@!s3,@!s2,@!s1,@!s0 : short_int);
3: (@!ww1,@!ww0 : word);
4: (@!ii1,@!ii0 : Integer);
5: (@!llll0 : integer);
end; {used to access individual bytes}
@z
%---------------------------------------
@x [3] m.10 l.290 - file handling
@!T_tfm_file:packed file of byte;
@y
@!T_tfm_file:file;
@!T_tfm_open:boolean; {|true| if |T_tfm_file| has been opened}
@!T_tfm_buf:array[0..tfm_buf_size-1] of aux_word; {input buffer}
@!T_tfm_words:word; {number of words in buffer}
@!T_tfm_count:word; {last word read from buffer}
@!T_tfm_eof:boolean; {|true| if \.{TFM} file has been exhausted}
@z
%---------------------------------------
@x [3] m.11 l.299 - file handling
reset(T_tfm_file);
@y
assign(T_tfm_file,in_dir+in_name+'.tfm');
TP_dir(I-)@; reset(T_tfm_file,1); TP_dir(I+)@;
if io_result<>0 then
begin write_ln('! File ',in_dir+in_name+'.tfm',' not found'); halt(4);
end;
T_tfm_open:=true;
@z
%---------------------------------------
@x dynamic memory allocation
@!T_index=0..T_tfm_size; {address of a byte in |tfm|}
@y
@!T_index=0..T_tfm_size; {address of a byte in |tfm|}
@!p_tfm=array [-1000..T_tfm_size] of byte;
@z
%---------------------------------------
@x dynamic memory allocation
@ @<Glob...@>=
@!T_tfm:array [-1000..T_tfm_size] of byte; {the \.{TFM} input data all goes here}
{the negative addresses avoid range checks for invalid characters}
@y
@ |T_tfm| array is allocated dynamically.
@d T_tfm==p_T_tfm^
@<Glob...@>=
@!p_T_tfm:^p_tfm; {the \.{TFM} input data all goes here}
{the negative addresses avoid range checks for invalid characters}
@z
%---------------------------------------
@x [4] m.24 l.596 - file handling
read(T_tfm_file,T_tfm[0]);
if T_tfm[0]>127 then abort('The first byte of the input file exceeds 127!');
@.The first byte...@>
if eof(T_tfm_file) then abort('The input file is only one byte long!');
@.The input...one byte long@>
read(T_tfm_file,T_tfm[1]); T_lf:=T_tfm[0]*@'400+T_tfm[1];
@y
block_read(T_tfm_file,T_tfm[0],1,T_tfm_ptr);
if eof(T_tfm_file) then abort('The input file is only one byte long!');
@.The input...one byte long@>
if T_tfm[0]>127 then abort('The first byte of the input file exceeds 127!');
@.The first byte...@>
block_read(T_tfm_file,T_tfm[1],T_tfm_size,T_tfm_ptr);
T_lf:=T_tfm[0]*@'400+T_tfm[1];
@z
%---------------------------------------
@x [4] m.24 l.607 - file handling
for T_tfm_ptr:=2 to 4*T_lf-1 do
begin if eof(T_tfm_file) then
@y
if T_tfm_ptr<4*T_lf-1 then
@z
%---------------------------------------
@x [4] m.24 l.611 - file handling
read(T_tfm_file,T_tfm[T_tfm_ptr]);
end;
if not eof(T_tfm_file) then
@y
if (T_tfm_ptr>=4*T_lf) or (not eof(T_tfm_file)) then
@z
%---------------------------------------
@x [4] m.26 l.668 - optimization
@!T_char_base,@!T_width_base,@!T_height_base,@!T_depth_base,@!T_italic_base,
@!T_lig_kern_base,@!T_kern_base,@!T_exten_base,@!T_param_base:integer;
@y
@!T_char_base,@!T_width_base,@!T_height_base,@!T_depth_base,@!T_italic_base,
@!T_lig_kern_base,@!T_kern_base,@!T_exten_base,@!T_param_base:Integer;
@z
%---------------------------------------
@x [2] m.21 l.627 - file handling
@!vf_file:packed file of 0..255;
@!tfm_file:packed file of 0..255;
@y
@!vf_file:file;
@!vf_buf:array[0..vf_buf_size-1] of byte; {output buffer}
@!vf_count:word; {next byte to be written to buffer}
@!tfm_file:file;
@!tfm_buf:array[0..tfm_buf_size-1] of byte; {output buffer}
@!tfm_count:word; {next byte to be written to buffer}
@z
%---------------------------------------
@x [2] m.22 l.637 - file handling
rewrite(vf_file); rewrite(tfm_file);
@y
assign(vf_file,out_dir+out_name+out_ext);
TP_dir(I-)@; rewrite(vf_file,1); TP_dir(I+)@;
if io_result<>0 then
begin write_ln('! Unable to open output file ',out_dir+out_name+out_ext);
halt(4);
end;
vf_count:=0;
assign(tfm_file,out_dir+out_name+'.tfm');
TP_dir(I-)@; rewrite(tfm_file,1); TP_dir(I+)@;
if io_result<>0 then
begin write_ln('! Unable to open output file ',out_dir+out_name+'.tfm');
halt(4);
end;
tfm_count:=0;
@z
%---------------------------------------
@x extract font names from file names
fname_start:=vf_ptr;
for k:= 1 to T_tfm[T_family] do vf_store(T_tfm[T_family+k]);
fname_length:=vf_ptr-fname_start;
vtitle_start:=vf_ptr;
for k:= 1 to T_tfm[T_family] do vf_store(T_tfm[T_family+k]);
vtitle_length:=vf_ptr-vtitle_start;
@y
fname_start:=vf_ptr;
for k:= 1 to byte(in_name[0]) do vf_store(byte(in_name[k]));
fname_length:=vf_ptr-fname_start;
vtitle_start:=vf_ptr;
for k:= 1 to byte(out_name[0]) do vf_store(byte(out_name[k]));
vf_store(".");vf_store("V");vf_store("F");
vtitle_length:=vf_ptr-vtitle_start;
@z
%---------------------------------------
@x [10] m.146 l.2582 - dynamic memory allocation
@d pending=4 {$f(x,y)$ is being evaluated}
@y
@d pending=4 {$f(x,y)$ is being evaluated}
@#
@d hash==p_hash^
@d class==p_class^
@d lig_z==p_lig_z^
@d hash_list==p_hash_list^
@z
%---------------------------------------
@x [10] m.147 l.2587 - dynamic memory allocation
@!hash:array[0..hash_size] of 0..66048; {$256x+y+1$ for $x\le257$ and $y\le255$}
@!class:array[0..hash_size] of simple..pending;
@!lig_z:array[0..hash_size] of 0..257;
@!hash_ptr:0..hash_size; {the number of nonzero entries in |hash|}
@!hash_list:array[0..hash_size] of 0..hash_size; {list of those nonzero entries}
@y
@!p_hash:^a_hash;
@!p_class:^a_class;
@!p_lig_z:^a_lig_z;
@!hash_ptr:0..hash_size; {the number of nonzero entries in |hash|}
@!p_hash_list:^a_hash_list;
@z
%---------------------------------------
@x [10] m.150 l.2639 hash_input - arithmetic
key:=256*c+y+1; h:=(1009*key) mod hash_size;
@y
key:=256*integer(c)+y+1; h:=(1009*key) mod hash_size;
@z
%---------------------------------------
@x [10] m.152 l.2675 eval - arithmetic
begin key:=256*x+y+1; h:=(1009*key) mod hash_size;
@y
begin key:=256*integer(x)+y+1; h:=(1009*key) mod hash_size;
@z
%---------------------------------------
@x [11] m.156 l.2770 - file handling
@d out(#)==write(tfm_file,#)
@y
@d out(#)==
begin if tfm_count>=tfm_buf_size then
begin block_write(tfm_file,tfm_buf,tfm_count); tfm_count:=0;
end;
tfm_buf[tfm_count]:=#; incr(tfm_count);
end
@z
%---------------------------------------
@x [11] m.157 l.2782 - file handling
@<Output the parameters@>
@y
@<Output the parameters@>;
block_write(tfm_file,tfm_buf,tfm_count); close(tfm_file)
@z
%---------------------------------------
@x [12] m.175 l.3035 - file handling
@d vout(#)==write(vf_file,#)
@y
@d vout(#)==
begin if vf_count>=vf_buf_size then
begin block_write(vf_file,vf_buf,vf_count); vf_count:=0;
end;
vf_buf[vf_count]:=#; incr(vf_count);
end
@z
%---------------------------------------
@x [12] m.177 l.3060 - file handling
until vcount mod 4 = 0
@y
until vcount mod 4 = 0;
block_write(vf_file,vf_buf,vf_count); close(vf_file)
@z
%---------------------------------------
@x [2] m.5 l.125 - file handling
@!adj_file:text;
@y
@!adj_file:text;
@!adj_buf:array[0..adj_buf_size-1] of char; {input buffer}
@z
%---------------------------------------
@x [2] m.6 l.128 - file handling
reset(adj_file);
adj_present:=true; {set to false if default adjustment file not found}
@y
assign(adj_file,adj_dir+adj_name+adj_ext); set_text_buf(adj_file,adj_buf);
TP_dir(I-)@; reset(adj_file); TP_dir(I+)@;
if io_result<>0 then
begin write_ln('! File ',adj_dir+adj_name+adj_ext,' not found');
if adj_present then halt(4);
end
else adj_present:=true;
@z
%---------------------------------------
@x [14] m.182 l.3159 - additions
This section should be replaced, if necessary, by changes to the program
that are necessary to make \.{ACCENTS} work at a particular installation.
It is usually best to design your change file so that all changes to
previous sections preserve the section numbering; then everybody's version
will be consistent with the printed program. More extensive changes,
which introduce new sections, can be inserted here; then only the index
itself will get a new section number.
@^system dependencies@>
@y
The following sections, as recommended, contain the changes necessary to
make \.{VPtoVF} work under \TP\ and DOS.
@^system dependencies@>
@ Here are the additional types needed for DOS.
@<Types...@>=
@!a_hash=array[0..hash_size] of 0..66048;
{$256x+y+1$ for $x\le257$ and $y\le255$}
@!a_class=array[0..hash_size] of simple..pending;
@!a_lig_z=array[0..hash_size] of 0..257;
@!a_hash_list=array[0..hash_size] of 0..hash_size;
{list of those nonzero entries}
@ And here are the additional global variables needed for DOS.
@<Glob...@>=
@!in_dir,@!out_dir,@!adj_dir:dir_str; {dir part of DOS file names}
@!in_name,@!out_name,@!adj_name:name_str; {name part of DOS file names}
@!in_ext,@!out_ext,@!adj_ext:ext_str; {ext part of DOS file names}
@ Here is the additional initialization needed for DOS.
@<Initialize DOS variables@>=
new(p_hash); new(p_class); new(p_lig_z); new(p_hash_list); file_mode:=0;
new(p_T_tfm);
@<Determine the input and output file names@>;
@ If the name of the input file is not specified in the command line,
we have to prompt for it.
@<Determine the input and output file names@>=
if param_count>0 then name_of_file:=param_str(1)
else begin write('Input file [.TFM]: '); read_ln(name_of_file);
if name_of_file='' then
begin write_ln('Usage: ACCENTS [<tfm> [<vf> [<adj>]]]'); halt;
end;
end;
f_split(name_of_file,in_dir,in_name,in_ext);
if in_ext='' then in_ext:='.tfm';
if param_count>0 then name_of_file:=param_str(2)
else begin write('Output file [','V'+in_name,'.VF]: '); read_ln(name_of_file);
end;
f_split(name_of_file,out_dir,out_name,out_ext);
if out_name='' then out_name:='V'+in_name;
if out_ext='' then out_ext:='.vf';
if param_count>0 then name_of_file:=param_str(3)
else begin write('Adjustment file (optional) [',in_name,'.ADJ]: '); read_ln(name_of_file);
end;
f_split(name_of_file,adj_dir,adj_name,adj_ext);
if adj_name='' then
begin adj_name:=in_name;
adj_present:=false; {do not insist on finding this file}
end;
if adj_ext='' then adj_ext:='.adj'
@z
%---------------------------------------
|