summaryrefslogtreecommitdiff
path: root/systems/unix/tex-fpc/web/weave.ch
blob: bcb0a7e7d585b84c116193953a2354860bc4bb9b (plain)
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
% This is a change file for WEAVE-FPC, Wolfgang Helbig, Nov. 2007
% Apr. 2008 get file names from command line
% Jul. 2008 pass the exit code
% Jul. 2016 change from gpc to fpc
[0] About WEAVE-FPC
@x
\pageno=\contentspagenumber \advance\pageno by 1
@y
\pageno=\contentspagenumber \advance\pageno by 1
\input webmac-fpc
\def\name{\tt WEAVE}

\let\maybe=\iffalse % print changed modules only.

\N0\*. About \namefpc.\fi
This is an adaption of Donald~E. Knuth's \.{WEAVE}, version 4.4
from December 2002, to Unix. \namefpc\ is based on GNU~Pascal,
version 2.1.

This program expects three file names on the command line:  A
web~file (\.{.web}), a change~file (\.{.ch}), and a \TeX~file
(\.{.tex}). If you  call \namefpc\ with the wrong number of command
line arguments, it will tell you and exit.
To support shell scripting, \namefpc\ sets the exit code to its
`\\{history}'---zero means ok, one means a warning was issued, two
an error occurred and three means \.{WEAVE} ended prematurely.

\hint

The input file \.{weave.tex} will exceed \TeX's memory. To fix,
change the constant value \.{MEMMAX} to 32000 in \.{tex.p},
recompile and run it on \.{weave.tex}.  Put \.{\\tracingstats1}
in \.{weave.tex}. The log file then shows the memory \TeX\ needed
to compile its input.
\medskip
Comments and questions are welcome!
\bigskip
\address
@z

[1] Change the banner line
@x
@d banner=='This is WEAVE, Version 4.4'
@y
@d banner=='This is WEAVE-FPC'
@z

[2] terminal output and input
@x
program WEAVE(@!web_file,@!change_file,@!tex_file);
@y
program WEAVE(@!input,@!output);
@z

[3] shift left to turn debugging on, shift right to turn it off
	@x
	@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
	@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
	@y
	@d debug==
	@d gubed==
	@z

[3] turn stats on
@x
@d stat==@{ {change this to `$\\{stat}\equiv\null$'
  when gathering usage statistics}
@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$'
  when gathering usage statistics}
@y
@d stat==
@d tats==
@z

[4] compiler directives
@x
@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead}
@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging}
@y
@{@&$M@&O@&D@&E I@&S@&O@}
@z

[7] default case branch
@x
@d othercases == others: {default for cases not listed explicitly}
@y
@d othercases == @+else  {default for cases not listed explicitly}
@z

[12] the type of text_files is text in ISO Pascal
@x
@!text_file=packed file of text_char;
@y
@!text_file=text;
@z

[20] terminal input/output
@x
@d print(#)==write(term_out,#) {`|print|' means write on the terminal}
@y
@d term_in == input
@d term_out == output
@d print(#)==write(term_out,#) {`|print|' means write on the terminal}
@z

[20] terminal output, implicitely defined in ISO Pasal
@x
@<Globals...@>=
@!term_out:text_file; {the terminal as an output file}
@y
@z

[21] terminal output, output is rewritten implicitely in ISO Pascal
@x
@<Set init...@>=
rewrite(term_out,'TTY:'); {send |term_out| output to the terminal}
@y
@z

[22] terminal output, don't need update in ISO Pascal
@x
@d update_terminal == break(term_out) {empty the terminal output buffer}
@y
@d update_terminal == do_nothing
@z

[24] get file names from command line arguments
@x
begin reset(web_file); reset(change_file);
@y
begin
assign(web_file, param_str(1));
assign(change_file, param_str(2));
reset(web_file); reset(change_file);
@z

[26] get file names from command line
@x
rewrite(tex_file);
@y
if param_count <> 3 then begin
   fatal_error('Usage: weave web-file change-file TeX-file');
   end;
assign(tex_file, param_str(3));
rewrite(tex_file);
@z

[258] Don't define Pascal's standard text files 
@x
@!term_in:text_file; {the user's terminal as an input file}
@y
@z

[259] terminal input, implicitely done in ISO Pascal
@x
reset(term_in,'TTY:','/I'); {open |term_in| as the terminal, don't do a |get|}
@y
@z

[261] define fpc_close
@x
@^split procedures@>
@y
@^split procedures@>

@d fpc_close == c@&l@&o@&s@&e
@z

[261] close tex_file
@x
@t\4\4@>{here files should be closed if the operating system requires it}
@y
fpc_close(tex_file);
@z

[263] put eol after last terminal out line
@x
fatal_message: print_nl('(That was a fatal error, my friend.)');
end {there are no other cases}
@y
fatal_message: print_nl('(That was a fatal error, my friend.)');
end; {there are no other cases}
new_line;
halt(history) {pass the history as exit code to the operating system}
@z