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
|
%
% pool in binary
%
@x
@!m,@!n:text_char; {characters input from |pool_file|}
@!g:str_number; {the string just created}
@!a:integer; {accumulator for check sum}
@!c:boolean; {check sum has been checked}
@y
@!g:str_number; {the string just created}
@z
@x
@ @d bad_pool(#)==begin wake_up_terminal; write_ln(term_out,#);
a_close(pool_file); get_strings_started:=false; return;
end
@<Read the other strings...@>=
name_length := strlen (pool_name);
name_of_file := xmalloc_array (ASCII_code, 1 + name_length);
strcpy (stringcast(name_of_file+1), pool_name); {copy the string}
if a_open_in (pool_file, kpse_mfpool_format) then
begin c:=false;
repeat @<Read one string, but return |false| if the
string memory space is getting too tight for comfort@>;
until c;
a_close(pool_file); get_strings_started:=true;
end
else bad_pool('! I can''t read ', pool_name, '; bad path?')
@.I can't read MF.POOL@>
@ @<Read one string...@>=
begin if eof(pool_file) then bad_pool('! ', pool_name, ' has no check sum.');
@.MF.POOL has no check sum@>
read(pool_file,m); read(pool_file,n); {read two digits of string length}
if m='*' then @<Check the pool check sum@>
else begin if (xord[m]<"0")or(xord[m]>"9")or@|
(xord[n]<"0")or(xord[n]>"9") then
bad_pool('! ', pool_name, ' line doesn''t begin with two digits.');
@.MF.POOL line doesn't...@>
l:=xord[m]*10+xord[n]-"0"*11; {compute the length}
if pool_ptr+l+string_vacancies>pool_size then
bad_pool('! You have to increase POOLSIZE.');
@.You have to increase POOLSIZE@>
for k:=1 to l do
begin if eoln(pool_file) then m:=' '@+else read(pool_file,m);
append_char(xord[m]);
end;
read_ln(pool_file); g:=make_string; str_ref[g]:=max_str_ref;
end;
end
@ The \.{WEB} operation \.{@@\$} denotes the value that should be at the
end of this \.{MF.POOL} file; any other value means that the wrong pool
file has been loaded.
@^check sum@>
@<Check the pool check sum@>=
begin a:=0; k:=1;
loop@+ begin if (xord[n]<"0")or(xord[n]>"9") then
bad_pool('! ', pool_name, ' check sum doesn''t have nine digits.');
@.MF.POOL check sum...@>
a:=10*a+xord[n]-"0";
if k=9 then goto done;
incr(k); read(pool_file,n);
end;
done: if a<>@$ then
bad_pool('! ', pool_name, ' doesn''t match; tangle me again (or fix the path).');
@.MF.POOL doesn't match@>
c:=true;
end
@y
@ @<Read the other strings...@>=
g := loadpoolstrings((pool_size-string_vacancies));
if g=0 then begin
wake_up_terminal; write_ln(term_out,'! You have to increase POOLSIZE.');
get_strings_started:=false;
return;
end;
get_strings_started:=true;
@ Empty module
@ Empty module
@z
|