summaryrefslogtreecommitdiff
path: root/systems/unix/tex-fpc/tangle.ch
diff options
context:
space:
mode:
Diffstat (limited to 'systems/unix/tex-fpc/tangle.ch')
-rw-r--r--systems/unix/tex-fpc/tangle.ch216
1 files changed, 216 insertions, 0 deletions
diff --git a/systems/unix/tex-fpc/tangle.ch b/systems/unix/tex-fpc/tangle.ch
new file mode 100644
index 0000000000..ee73c2a3c8
--- /dev/null
+++ b/systems/unix/tex-fpc/tangle.ch
@@ -0,0 +1,216 @@
+% This is a change file for TANGLE-FPC, Wolfgang Helbig, Nov. 2007
+
+[0] About TANGLE-FPC
+@x
+\pageno=\contentspagenumber \advance\pageno by 1
+@y
+\pageno=1 \advance\pageno by 1
+\input webmac-fpc
+\def\name{{\tt TANGLE}}
+
+\let\maybe=\iftrue % print changed modules only.
+
+\N0\*. About \namefpc.\fi
+This is an adaption of Donald~E. Knuth's \.{TANGLE} to Unix and the
+Free Pascal Compiler~(FPC).
+
+\namefpc\ expects four file names on the command line: Two input
+files, the web and change file, followed by two output files, the
+Pascal and string pool file.
+
+To support shell scripting, tangle sets the exit code to its
+`\\{history}'---zero means ok, one means a warning was issued, two
+an error occurred and three means \namefpc\ ended prematurely.
+\hint
+
+Comments and questions are welcome!
+\bigskip
+\address
+@z
+
+[1] Change the banner line
+@x
+@d banner=='This is TANGLE, Version 4.5'
+@y
+@d banner=='This is TANGLE-FPC, 2nd ed.'
+@z
+
+ [3] turn debugging on
+ @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
+
+[2]
+@x
+program TANGLE(@!web_file,@!change_file,@!Pascal_file,@!pool);
+@y
+program TANGLE(@!term_out);
+@z
+
+[3] shift left to turn stats on, right to turn them off.
+ @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
+@{$MODE@,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 output
+@x
+@d print(#)==write(term_out,#) {`|print|' means write on the terminal}
+@y
+@d term_out == output
+@d term_in == input
+@d print(#)==write(#) {`|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 implicitely opened in 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
+@p procedure open_input; {prepare to read |web_file| and |change_file|}
+begin reset(web_file); reset(change_file);
+end;
+@y
+@p procedure open_input; {prepare to read |web_file| and |change_file|}
+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 arguments
+@x
+rewrite(Pascal_file); rewrite(pool);
+@y
+if paramcount <> 4 then begin
+ write_ln('Usage: ', param_str(0),
+ ' web_file change_file Pascal_file pool_file');
+ halt(1);
+ end;
+assign(Pascal_file, param_str(3)); assign(pool, param_str(4));
+@#
+@{$I-@}
+@#
+ioresult; rewrite(Pascal_file);
+if ioresult <> 0 then begin
+ write_ln('Could not open Pascal file: ', param_str(3));
+ halt(1);
+ end;
+ioresult; rewrite(pool);
+if ioresult <> 0 then begin
+ write_ln('Could not open pool file: ', param_str(4));
+ halt(1);
+ end;
+@#
+@{$I+@}
+@#
+@z
+
+[38] increase token capacity to tangle mf.
+@x
+@d zz=3 {we multiply the token capacity by approximately this amount}
+@y
+@d zz=4 {we need 4 not 3 to tangle mf}
+@z
+
+[179]
+@x
+@!term_in:text_file; {the user's terminal as an input file}
+@y
+@z
+
+[180] terminal input, implicitely done by Pascal
+@x
+reset(term_in,'TTY:','/I'); {open |term_in| as the terminal, don't do a |get|}
+@y
+@z
+
+[182] close output files
+@x
+end_of_TANGLE:
+if string_ptr>256 then @<Finish off the string pool file@>;
+@y
+if string_ptr>256 then @<Finish off the string pool file@>;
+close (Pascal_file); close (pool);
+end_of_TANGLE:
+@z
+
+[187] 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