% This is a change file for WEAVE-FPC, Wolfgang Helbig, Nov. 2007 - Feb. 2021
[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}
\tracingstats=1

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

\N0\*. About \namefpc.\fi
This is an adaption of Donald~E. Knuth's \.{WEAVE}, version 4.5
from January 2021, to Unix. \namefpc\ is based on FPC~Pascal,
version 3.0.0.

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.
These commands will do:

{\obeylines
\indent\.{sed s/MEMMAX=30000/MEMMAX=32000/ ../tex/tex.p >tex.p}
\indent\.{fpc -Fasysutils,baseunix,unix tex.p}
}

\medskip
Comments and questions are welcome!
\bigskip
\address
@z

[1] Change the banner line
@x
@d banner=='This is WEAVE, Version 4.5'
@y
@d banner=='This is WEAVE-FPC, 3rd ed.'
@z

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

[3] shift left to turn debugging on, shift right to turn it off
	@x debug
	@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 stats
	@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
@{$MO@&DE@,ISO@}
@/
@{$Q+@}
@/
@{$R+@}
@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_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] open input files
@x
begin reset(web_file); reset(change_file);
end;
@y
begin
assign(web_file, param_str(1)); assign(change_file, param_str(2));
@{$I-@}
@#
ioresult; reset(web_file);
if ioresult <> 0 then begin
  write_ln('Could not open web file: ', param_str(1));
  halt(1);
  end;
ioresult; reset(change_file);
if ioresult <> 0 then begin
  write_ln('Could not open change file: ', param_str(2));
  halt(1);
  end;
@#
@{$I+@}
end;
@z

[26] get file names from command line
@x
rewrite(tex_file);
@y
if param_count <> 3 then begin
   write_ln('Usage: ', param_str(0), ' web-file change-file TeX-file');
   halt(1);
   end;
assign(tex_file, param_str(3));
@#
@{$I-@}
@#
ioresult; rewrite(tex_file);
if ioresult <> 0 then begin
  write_ln('Could not open tex_file: ', param_str(3));
  halt(1);
  end;
@#
@{$I+@}
@#
@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
end_of_WEAVE:
@y
fpc_close(tex_file);
end_of_WEAVE:
@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