|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T g
Length: 16552 (0x40a8) Types: TextFile Names: »gftype.BSD4_n.ch«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89 └─⟦this⟧ »./tex82/Unsupported/MFpxl/mfware/gftype.BSD4_n.ch« └─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12 └─⟦beba6c409⟧ »unix3.0/Unsupported.tar.Z« └─⟦25c524ae4⟧ └─⟦this⟧ »Unsupported/MFpxl/mfware/gftype.BSD4_n.ch«
% $Header: gftype.ch,v 2.2.1.4 86/01/27 15:43:41 richards Released $ % Change file for the GFtype processor, for use on Berkeley UNIX systems. % History: % % $Log: gftype.ch,v $ % Revision 2.2.1.4 86/01/27 15:43:41 richards % Changed: % text_file type to "text" for Pyramid compiler, % who doesn't believe packed array of char == text, and % won't allow write('strings') to it! % % Revision 2.2.1.3 86/01/21 22:04:30 richards % Changed: % file_name_size and byte_file declaration to agree with binary I/O % library updates; b_open_in() call to include path specifier % % Revision 2.2.1.2 86/01/21 15:54:21 richards % Changed: % interface to byte I/O again; now cur_loc is back to a variable, % and b_set_ptr() saves addr of cur_loc so it can be kept in % sync with files. b_file_loc() was called more frequently than % I thought... % % Revision 2.2.1.1 86/01/20 22:06:53 richards % Incorporate new Byte-I/O routines in place of fudging Pascal into % reading bytes; for Pyramid .... % % Revision 2.2 85/10/18 23:31:09 richards % Updated for GFtype Version 2.2 % % Revision 2.1 85/03/03 21:41:49 richards % Updated to GF utilities distributed with MF Version 0.77 % (New GF file format) % % Revision 2.0 84/12/16 22:42:52 richards % Updated for GFtype Version 2.0 (New GF file format) % % Revision 1.2 84/12/06 02:35:40 richards % Updated to GFtype Version 1.2; merged in changes from sdcarl!rusty % % Revision 0.0 84/11/10 02:13:19 richards % Base version for GFtype 0.0 % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [0] WEAVE: print changes only %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x \pageno=\contentspagenumber \advance\pageno by 1 @y \pageno=\contentspagenumber \advance\pageno by 1 \let\maybe=\iffalse \def\title{GF$\,$\lowercase{type} changes for Berkeley {\mc UNIX}} @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [1] Change banner string %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @d banner=='This is GFtype, Version 2.2' {printed when the program starts} @y @d banner=='This is GFtype, Version 2.2 for Berkeley Unix' {printed when the program starts} @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [3] Redirect GFtype output to correct output file % depending on gftyout_active value %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @d print(#)==write(#) @d print_ln(#)==write_ln(#) @d print_nl==write_ln @y @d print(#)==begin if gftyout_active then write(gftyout,#) else write(#) end @d print_ln(#)==begin if gftyout_active then write_ln(gftyout,#) else write_ln(#) end @d print_nl==begin if gftyout_active then write_ln(gftyout) else write_ln end @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [3] Change program header to standard input/output %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @p program GF_type(@!gf_file,@!output); label @<Labels in the outer block@>@/ const @<Constants in the outer block@>@/ type @<Types in the outer block@>@/ var @<Globals in the outer block@>@/ procedure initialize; {this procedure gets things started properly} var i:integer; {loop index for initializations} begin print_ln(banner);@/ @<Set initial values@>@/ end; @y @p program GF_type(@!input,@!output); label @<Labels in the outer block@>@/ const @<Constants in the outer block@>@/ type @<Types in the outer block@>@/ var @<Globals in the outer block@>@/ @\@=#include "gftype_ext.h"@>@\ {declarations for external C procedures } procedure initialize; {this procedure gets things started properly} var i:integer; {loop index for initializations} begin @<Set initial values@>@/ @<Parse command line arguments@>@/ end; @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [5] Add file_name_size to constants %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @<Constants...@>= @!terminal_line_length=150; {maximum number of characters input in a single line of input from the terminal} @!line_length=79; {\\{xxx} strings will not produce lines longer than this} @!max_row=79; {vertical extent of pixel image array} @!max_col=79; {horizontal extent of pixel image array} @y @<Constants...@>= @!terminal_line_length=150; {maximum number of characters input in a single line of input from the terminal} @!line_length=79; {\\{xxx} strings will not produce lines longer than this} @!max_row=79; {vertical extent of pixel image array} @!max_col=79; {horizontal extent of pixel image array} @!file_name_size=256; {max length of file name on command line} @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [7] Have abort append <nl> to end of msg %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @d abort(#)==begin print(' ',#); jump_out; @y @d abort(#)==begin print_ln(' ',#); jump_out; @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [9] Change type of text_file to "text" (mostly for Pyramid) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @!text_file=packed file of text_char; @y @!text_file=text; @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [20] Change type of binary file for gf_file %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x We shall stick to simple \PASCAL\ in this program, for reasons of clarity, even if such simplicity is sometimes unrealistic. @<Types...@>= @!eight_bits=0..255; {unsigned one-byte quantity} @!byte_file=packed file of eight_bits; {files that contain binary data} @y For Berkeley Pascal, we use external routines to read and write bytes, so the |byte_file| type becomes a ``magic cookie'' for those routines, rather than a real file type. We also define the type |UNIX_file_name| here that is passed to the routine to open byte files. @<Types...@>= @!eight_bits=0..255; {unsigned one-byte quantity} @!UNIX_file_name=packed array[1..file_name_size] of char; @!byte_file=record@/ stdio_ptr: ^integer; {pointer for stdio FILE struct} loc_ptr: ^integer; {pointer to byte position ptr to keep in sync with file} file_name: UNIX_file_name; {file name saved by open routines} end; @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [21] Add gf_name declaration %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @ The program deals with one binary file variable: |gf_file| is the main input file that we are translating into symbolic form. @<Glob...@>= @!gf_file:byte_file; {the stuff we are \.{GF}typing} @y @ The program deals with one binary file variable: |gf_file| is the main input file that we are translating into symbolic form. We also declare array |gf_name|, used to hold the name of |gf_file|. @<Glob...@>= @!gf_file:byte_file; {the stuff we are \.{GF}typing} @!gf_name: UNIX_file_name; @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [22] Change open_gf_file to b_open_in() %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @ To prepare this file for input, we |reset| it. @p procedure open_gf_file; {prepares to read packed bytes in |gf_file|} begin reset(gf_file); cur_loc:=0; end; @y @ To prepare this file for input, we call an external library routine, |b_open_in|, which returns |true| if the open succeeded. The routine |b_set_ptr| causes the argument |cur_loc| to be maintained as a pointer to the current byte in the open file. Since this binding remains in effect while the file is open, |cur_loc| must be a global, static variable. We also need to define a value used by |b_open_in| to indicate whether we should search auxiliary directories for the input file. Since we don't perform path searching in this program, we disable it. @d NO_path_searching == 0 {no path searching is to be done on open} @p procedure open_gf_file; {prepares to read packed bytes in |gf_file|} begin if not b_open_in(gf_file, gf_name, NO_path_searching) then@/ abort('Unable to open GF file for input'); b_set_ptr(gf_file, cur_loc);@/ cur_loc:=0; end; @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [24] Use modified routines to access gf_file %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @ We shall use a set of simple functions to read the next byte or bytes from |gf_file|. There are four possibilities, each of which is treated as a separate function in order to minimize the overhead for subroutine calls. @^system dependencies@> @p function get_byte:integer; {returns the next byte, unsigned} var b:eight_bits; begin if eof(gf_file) then get_byte:=0 else begin read(gf_file,b); incr(cur_loc); get_byte:=b; end; end; @# function get_two_bytes:integer; {returns the next two bytes, unsigned} var a,@!b:eight_bits; begin read(gf_file,a); read(gf_file,b); cur_loc:=cur_loc+2; get_two_bytes:=a*256+b; end; @# function get_three_bytes:integer; {returns the next three bytes, unsigned} var a,@!b,@!c:eight_bits; begin read(gf_file,a); read(gf_file,b); read(gf_file,c); cur_loc:=cur_loc+3; get_three_bytes:=(a*256+b)*256+c; end; @# function signed_quad:integer; {returns the next four bytes, signed} var a,@!b,@!c,@!d:eight_bits; begin read(gf_file,a); read(gf_file,b); read(gf_file,c); read(gf_file,d); cur_loc:=cur_loc+4; if a<128 then signed_quad:=((a*256+b)*256+c)*256+d else signed_quad:=(((a-256)*256+b)*256+c)*256+d; end; @y @ We shall use a set of simple functions to read the next byte or bytes from |gf_file|. There are five possibilities, each of which is treated as a separate function in order to minimize the overhead for subroutine calls. Each routine is a member of an external library, the {\sc WEB} defines simply rename the functions and provide default arguments. @^system dependencies@> @d get_byte == b_read_unsigned(gf_file) @d get_two_bytes == b_read_2_unsigned(gf_file) @d get_three_bytes == b_read_3_unsigned(gf_file) @d signed_quad == b_read_4_signed(gf_file) @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [27] Set term_in and term_out to standard input/output %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @ The |input_ln| routine waits for the user to type a line at his or her terminal; then it puts ASCII-code equivalents for the characters on that line into the |buffer| array. The |term_in| file is used for terminal input, 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 @ The |input_ln| routine waits for the user to type a line at his or her terminal; then it puts ASCII-code equivalents for the characters on that line into the |buffer| array. The |term_in| file is used for terminal input, and |term_out| for terminal output. @^system dependencies@> @d term_in == input {standard input} @d term_out == output {standard output} @<Glob...@>= @!buffer:array[0..terminal_line_length] of ASCII_code; @!gftyout: text_file; {output from program} @!gftyout_name: UNIX_file_name; @!gftyout_active: boolean; {true if |gftyout| is open and ready to write} @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [28] update_terminal becomes flush() %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @d update_terminal == break(term_out) {empty the terminal output buffer} @y @d update_terminal == flush(term_out) {empty the terminal output buffer} @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [29] eliminate reset() from 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 update_terminal; 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; @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [31] eliminate rewrite() from dialog %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @p procedure dialog; label 1,2; begin rewrite(term_out); {prepare the terminal for output} write_ln(term_out,banner);@/ @<Determine whether the user |wants_mnemonics|@>; @<Determine whether the user |wants_pixels|@>; @<Print all the selected options@>; end; @y @p procedure dialog; label 1,2; begin write_ln(term_out,banner);@/ @<Determine whether the user |wants_mnemonics|@>; @<Determine whether the user |wants_pixels|@>; @<Print all the selected options@>; end; @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [50] change eof(gf_file) to b_eof(gf_file) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @d start_op==a:=cur_loc; o:=get_byte; p:=first_par(o); if eof(gf_file) then bad_gf('the file ended prematurely') @y @d start_op==a:=cur_loc; o:=get_byte; p:=first_par(o); if b_eof(gf_file) then bad_gf('the file ended prematurely') @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [64] change eof(gf_file) to b_eof(gf_file) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x while (m=223)and not eof(gf_file) do m:=get_byte; if not eof(gf_file) then bad_gf('signature in byte ',cur_loc-1:1, @y while (m=223)and not b_eof(gf_file) do m:=get_byte; if not b_eof(gf_file) then bad_gf('signature in byte ',cur_loc-1:1, @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [65] finish last line written to statistics (stdout) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x print('The file had ',total_chars:1,' character'); if total_chars<>1 then print('s'); print(' altogether.'); @.The file had n characters...@> final_end:end. @y print('The file had ',total_chars:1,' character'); if total_chars<>1 then print('s'); print_ln(' altogether.'); @.The file had n characters...@> final_end:end. @z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % [74,75,76] Add new section to parse command line arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @x @* System-dependent changes. This section should be replaced, if necessary, by changes to the program that are necessary to make \.{GFtype} work at a particular installation. It is usually best to design your change file so that all changes to previous sections preserve the section numbering; then everybody's version will be consistent with the printed program. More extensive changes, which introduce new sections, can be inserted here; then only the index itself will get a new section number. @^system dependencies@> @y @* System-dependent changes. This section contains additions to \.{GFtype} necessary to integrate it into the {\mc unix} environment. The primary addition is a section to parse command line arguments and put file names into their correct variables, if needed. @^system dependencies@> @ The command line issued to start \.{GFtype} should also contain the names of the input (GF) file, and optionally, the name of an output file to receive the output from \.{GFtype}. This segment decodes the command line, and saves the file names in the appropriate variables. @^system dependencies@> @<Parse command...@>= if (argc < 2) or (argc > 3) then begin@/ print_ln(banner);@/ print_ln('Usage: gftype GFfile [outputfile]');@/ goto final_end; { we will be unstructured just this once } end; argv(1, gf_name);@/ if argc > 2 then begin@/ argv(2, gftyout_name);@/ rewrite(gftyout, gftyout_name);@/ gftyout_active := true;@/ print_ln(banner);@/ end;@/ @ We also need to initialize the value of |gftyout_active| so we don't try to write on the output file before it is opened. @<Set initial ...@>= gftyout_active:=false; @z