diff options
Diffstat (limited to 'systems/unix/tex-fpc/tangle.ch')
-rw-r--r-- | systems/unix/tex-fpc/tangle.ch | 216 |
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 |