This is a change file of GFtype for FPC, Wolfgang Helbig, Oct. 2020
To be used with the Free Pascal Compiler
[0] About type-FPC
@x
\pageno=\contentspagenumber \advance\pageno by 1
@y
\pageno=\contentspagenumber \advance\pageno by 1
\input webmac-fpc
% \let\maybe=\iftrue % uncomment to print changed modules only.
\def\name{\tt GFtype}
\N0\*. About \namefpc.\fi
This is an adaption of Donald~E. Knuth's \.{GFtype}, to Unix.
\namefpc\ is based on Free~Pascal.
\namefpc\ expects the name of the input file (\.{.gf}) as the first
and the name of the output file (\.{.typ} as the second parameter
on the command line.
\hint
Comments and questions are welcome!
\bigskip
\address
@z
[1] Change the banner line
@x
@d banner=='This is GFtype, Version 3.1' {printed when the program starts}
@y
@d banner=='This is GFtype-FPC, 3rd ed.' {printed when the program starts}
@z
[2] othercases
@x
@d othercases == others: {default for cases not listed explicitly}
@y
@d othercases == @+ else {default for cases not listed explicitly}
@z
[9] text file.
@x
@!text_file=packed file of text_char;
@y
@!text_file=text;
@z
[21] declare typ file
@x
@!gf_file:byte_file; {the stuff we are \.{GF}typing}
@y
@!gf_file:byte_file; {the stuff we are \.{GF}typing}
@!typ_file: text; { output file }
@z
[22] open gf file
@x
begin reset(gf_file);
@y
begin assign(gf_file, param_str(1));
@#
@{$I-@}
@#
ioresult; reset(gf_file);
if ioresult <> 0 then begin
write_ln('Could not open gf file: ', param_str(1));
halt(1);
end;
@#
@{$I+@}
@#
@z
[27] standard io files
@x
and |term_out| for terminal output.
@^system dependencies@>
@<Glob...@>=
@!buffer:array[0..terminal_line_length] of ASCII_code;
@!term_in:text_file; {the terminal, considered as an input file}
@!term_out:text_file; {the terminal, considered as an output file}
@y
and |term_out| for terminal output.
@^system dependencies@>
@d term_in == input
@d term_out == output
@<Glob...@>=
@!buffer:array[0..terminal_line_length] of ASCII_code;
@z
[28] no break known to fpc
@x
@d update_terminal == break(term_out) {empty the terminal output buffer}
@y
@d update_terminal == {empty the terminal output buffer}
@z
[29] input_ln
@x
@p procedure input_ln; {inputs a line from the terminal}
var k:0..terminal_line_length;
begin update_terminal; reset(term_in);
if eoln(term_in) then read_ln(term_in);
k:=0;
while (k<terminal_line_length)and not eoln(term_in) do
begin buffer[k]:=xord[term_in^]; incr(k); get(term_in);
end;
buffer[k]:=" ";
end;
@y
@p procedure input_ln; {inputs a line from the terminal}
var k:0..terminal_line_length;
begin
k:=0;
while (k<terminal_line_length) and not eoln do
begin buffer[k]:=xord[input^]; incr(k); get(input);
end;
readln;
buffer[k]:=" ";
end;
@z
[66] open typ file
@x
@p begin initialize; {get all variables initialized}
@y
@p begin
if paramcount <> 2 then begin
write_ln('Usage: ', param_str(0), ' gf_file typ_file');
halt(1);
end;
assign(typ_file, param_str(2));
@#
@{$I-@}
@#
ioresult; rewrite(typ_file);
if ioresult <> 0 then begin
write_ln('Could not open type file: ', param_str(2));
halt(1);
end;
@#
@{$I+@}
@#
initialize; {get all variables initialized}
@z
[66] terminate last line in typ file
@x
final_end:end.
@y
print_nl;
close(typ_file);
final_end:end.
@z