TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 1 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00001 0 0 [inherit('SYS$SHARE:STARLET','SYS$SHARE:PASCAL$LIB_ROUTINES')] 00002 0 0 00003 C 0 0 {******************************************************************************* 00004 C 0 0 * This program is an example of how to use the FTDRIVER (Pseudo Terminal) * 00005 C 0 0 * supplied with VMS V5.4. It is based on the example given in Chapter 9 of * 00006 C 0 0 * the I/O Users Guide. * 00007 C 0 0 * * 00008 C 0 0 * Author Jeremy Begg 7-Jan-1992 * 00009 C 0 0 * ------ * 00010 C 0 0 * * 00011 C 0 0 * Modifications * 00012 C 0 0 * * 00013 C 0 0 * * 00014 C 0 0 *******************************************************************************} 00015 0 0 00016 0 0 Program TEST_FTDRIVER (input, output, logfile 00017 C 0 0 {**TRACE** ,tracewrite {**TRACE**} 00018 0 0 ); 00019 0 0 00020 0 0 Const 00021 0 0 XON = chr(17); XOFF = chr(19); BELL = chr(7); 00022 0 0 data_buffer_size = 500; { Max amount of data in each buffer } 00023 0 0 exit_character = ''(28); { Ctrl-\ } 00024 0 0 max_buffers = 10; { Maximum number of data buffers } 00025 0 0 00026 0 0 Type 00027 0 0 address_range = record 00028 0 0 start_addr, end_addr : unsigned; 00029 0 0 end; 00030 0 0 00031 0 0 buffer_uses = [byte] (free, allocated, tt_read, tt_write_after_read, tt_write_after_echo, ft_echo, ft_read, ft_write, logging); 00032 0 0 00033 0 0 characteristics_buffer = packed record 00034 0 0 devclass : [byte] 0..255; 00035 0 0 devtype : [byte] 0..255; 00036 0 0 page_width : [word] 0..65535; 00037 0 0 basic : TT$TYPE; { Includes page_length } 00038 0 0 extended : TT2$TYPE; 00039 0 0 end; 00040 0 0 00041 0 0 IO_Status_Block = record 00042 0 0 sts, count : [word] 0..65535; 00043 0 0 trm, trm_size : [word] 0..65535; 00044 0 0 end; 00045 0 0 00046 0 0 io_buffer = [aligned(9),volatile] record 00047 0 0 sts : [word] 0..65535; 00048 0 0 data_buffer : [pos(16)] varying [data_buffer_size] of char; 00049 0 0 IOSB : IO_Status_Block; 00050 0 0 idx : integer; 00051 0 0 usage : buffer_uses; 00052 0 0 end; 00053 0 0 00054 0 0 io_buffer_idx = 0..max_buffers; TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 2 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00055 0 0 00056 0 0 signal_array = array [0..9] of integer; 00057 0 0 mechanism_array = array [0..4] of integer; 00058 0 0 00059 0 0 Var 00060 0 0 ret_status : integer; 00061 0 0 00062 0 0 ft_efn : [volatile] unsigned; 00063 0 0 ft_chan : [volatile,word] 0..65535; { I/O channel to FT terminal } 00064 0 0 ft_devnam : varying [64] of char; 00065 0 0 00066 0 0 tt_efn : [volatile] unsigned; 00067 0 0 tt_chan : [volatile,word] 0..65535; { I/O channel to real terminal } 00068 0 0 tt_devchar : [volatile] characteristics_buffer; { Saved device char for TT: } 00069 0 0 tt_read_efn, { EFN for real terminal input } 00070 0 0 tt_write_efn : [volatile] unsigned;{ EFN for real terminal output } 00071 0 0 00072 0 0 read_suspended, { PTD$READ suspended due to lack of buffers} 00073 0 0 exit_flag : [volatile] boolean; { The program must exit A.S.A.P. } 00074 0 0 exit_status : [volatile] integer; { Status to exit with } 00075 0 0 00076 0 0 buffers : [volatile,static] array [1..max_buffers] of io_buffer := ZERO; 00077 0 0 00078 0 0 out_queue : [volatile] record 00079 0 0 head, tail : 0..max_buffers+1; 00080 0 0 pending : array [1..max_buffers] of io_buffer_idx; 00081 0 0 queue_length : io_buffer_idx; 00082 0 0 end := ZERO; 00083 0 0 00084 0 0 00085 0 0 00086 0 0 PID : [volatile] unsigned;{ Subprocess' PID } 00087 0 0 subprc_sts : [volatile] integer; { Subprocess completion status } 00088 0 0 00089 0 0 logfile : text; { The log file } 00090 0 0 log_data : varying [data_buffer_size] of char; 00091 0 0 MAXBUF : [external(IOC$GW_MAXBUF),readonly,word] 0..65535; 00092 C 0 0 {**TRACE 00093 C 0 0 tracewrite : [volatile] text; {**TRACE} 00094 0 0 00095 0 0 exit_block : record 00096 0 0 forward_link : unsigned; 00097 0 0 handler_addr : unsigned; 00098 0 0 arg_count : integer; 00099 0 0 exit_sts_addr : unsigned; 00100 0 0 tt_charbuff : unsigned; 00101 0 0 end; 00102 0 0 00103 0 0 00104 C 0 0 {******************************************************************************* 00105 C 0 0 * Forward Declarations * 00106 C 0 0 *******************************************************************************} 00107 0 0 00108 0 0 [asynchronous,unbound] 00109 0 0 procedure ft_read_ast (var readbuff : io_buffer); forward; TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 3 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00110 0 0 00111 0 0 00112 0 0 [asynchronous, unbound] 00113 0 0 procedure ft_echo_ast (var echobuff : io_buffer); forward; 00114 0 0 00115 0 0 00116 C 0 0 {******************************************************************************* 00117 C 0 0 * Trace Write * 00118 C 0 0 *******************************************************************************} 00119 C 0 0 {**TRACE 00120 C 0 0 [asynchronous, unbound] 00121 C 0 0 procedure trace_write (trace_data : packed array [l0..h0:integer] of char); 00122 C 0 0 var ast_enabled : boolean; 00123 C 0 0 begin 00124 C 0 0 ast_enabled := ($SETAST(0) = SS$_WASSET); 00125 C 0 0 writeln(tracewrite,trace_data); 00126 C 0 0 if ast_enabled then $SETAST(1); 00127 C 0 0 end; 00128 C 0 0 {**TRACE} 00129 C 0 0 {******************************************************************************* 00130 C 0 0 * Buffer Management * 00131 C 0 0 *******************************************************************************} 00132 0 0 00133 C 0 0 { 00134 C 0 0 allocate_io_buffer 00135 C 0 0 00136 C 0 0 This routine returns the array index for an I/O buffer in the pool of 00137 C 0 0 buffers. If there are no free buffers it returns 0. 00138 C 0 0 } 00139 0 0 [asynchronous, unbound] 00140 1 0 procedure allocate_io_buffer (var b : io_buffer_idx); 00141 1 1 begin 00142 C 1 1 {**TRACE** trace_write('allocate_io_buffer'); {**TRACE**} 00143 1 1 b := max_buffers; 00144 1 1 while (b > 0) and_then (buffers[b].usage <> free) do b := b - 1; 00145 1 1 if b > 0 then buffers[b].usage := allocated; 00146 0 0 end; {allocate_io_buffer} 00147 0 0 00148 0 0 00149 0 0 00150 C 0 0 { 00151 C 0 0 free_io_buffer 00152 C 0 0 00153 C 0 0 This routine returns the buffer to the pool of available buffers. 00154 C 0 0 It assumes that ASTs have been disabled before it is called, or that it is 00155 C 0 0 called at AST level. 00156 C 0 0 } 00157 0 0 [asynchronous, unbound] 00158 1 0 procedure free_io_buffer (var b : io_buffer); 00159 1 0 var ret_status : integer; 00160 1 1 begin 00161 C 1 1 {**TRACE** trace_write('free_io_buffer'); {**TRACE**} 00162 1 1 if not read_suspended then 00163 1 1 b.usage := free 00164 1 1 else TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 4 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00165 C 1 1 { Use this buffer to do the PTD$READ that we couldn't do before } 00166 1 2 begin 00167 C 1 2 {**TRACE** trace_write(' -- issuing PTD$READ after suspension'); {**TRACE**} 00168 1 2 b.usage := ft_read; 00169 1 2 ret_status := PTD$READ (ft_efn 00170 1 2 ,ft_chan 00171 1 2 ,%immed ft_read_ast 00172 1 2 ,%ref b 00173 1 2 ,b 00174 1 2 ,data_buffer_size 00175 1 2 ); 00176 1 2 if odd(ret_status) then 00177 1 2 read_suspended := false 00178 1 2 else 00179 1 3 begin 00180 C 1 3 {**TRACE** trace_write(' -- read still suspended; PTD$READ failed');{**TRACE**} 00181 1 3 exit_flag := true; 00182 1 3 exit_status := ret_status; 00183 1 2 end; 00184 1 2 end 00185 0 0 end; {free_io_buffer} 00186 0 0 00187 0 0 00188 C 0 0 {******************************************************************************* 00189 C 0 0 * Routines which look after the Real Terminal * 00190 C 0 0 *******************************************************************************} 00191 0 0 00192 C 0 0 { 00193 C 0 0 kbd_read_ast 00194 C 0 0 00195 C 0 0 This routine is called every time data is read from the terminal. 00196 C 0 0 If the program is exiting, then the routine exits without restarting the 00197 C 0 0 read. The character read is checked to see if the 'terminate processing' 00198 C 0 0 character, Ctrl-\, was entered. If so, the exiting state is set and a 00199 C 0 0 SYS$WAKE is issued to start the main routine. Now an attempt is made to 00200 C 0 0 obtain an I/O buffer in which to store echoed output. If an I/O buffer is 00201 C 0 0 unavailable, a simple PTD$WRITE is issued; a PTD$WRiTE with echo is issued 00202 C 0 0 if a buffer is available. If the write completes successfully, another read 00203 C 0 0 is issued to the keyboard. 00204 C 0 0 00205 C 0 0 Note that, although this routine has an 'io_buffer' as its input, in reality 00206 C 0 0 it only ever reads one character at a time. 00207 C 0 0 } 00208 0 0 [asynchronous, unbound] 00209 1 0 procedure kbd_read_ast (var keybuff : io_buffer); 00210 1 0 label ignore_read; 00211 1 0 var ret_status : integer; 00212 1 0 screenbuff : io_buffer_idx; 00213 1 0 ch_read : char; 00214 1 1 begin 00215 C 1 1 {**TRACE** trace_write('kbd_read_ast'); {**TRACE**} 00216 C 1 1 { Exit if the escape character has already been seen } 00217 1 1 if exit_flag then goto ignore_read; { Ignore data after Ctrl-\ } 00218 1 1 00219 C 1 1 { Exit if the read $QIO to the real terminal failed } TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 5 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00220 1 1 if not odd(keybuff.IOSB.sts) then 00221 1 2 begin 00222 1 2 exit_flag := true; 00223 1 2 exit_status := keybuff.IOSB.sts; 00224 1 2 goto ignore_read 00225 1 1 end; 00226 1 1 00227 C 1 1 { Check to see if the escape character is present } 00228 1 1 keybuff.data_buffer.length := 1; 00229 1 1 ch_read := keybuff.data_buffer.body[1]; 00230 1 1 if ch_read = exit_character then 00231 1 2 begin 00232 1 2 exit_flag := true; 00233 1 2 exit_status := SS$_NORMAL; 00234 1 2 goto ignore_read; 00235 1 1 end; 00236 1 1 00237 C 1 1 { Allocate a buffer in which to receive characters from a Write-with-Echo } 00238 C 1 1 { then send the characters to the pseudo-terminal. } 00239 1 1 allocate_io_buffer(screenbuff); 00240 1 1 if screenbuff > 0 then 00241 1 2 begin 00242 1 2 buffers[screenbuff].usage := ft_echo; 00243 1 2 ret_status := PTD$WRITE (ft_chan 00244 1 2 ,%immed ft_echo_ast 00245 1 2 ,%ref buffers[screenbuff] 00246 1 2 ,keybuff 00247 1 2 ,1 00248 1 2 ,buffers[screenbuff] 00249 1 2 ,data_buffer_size 00250 1 2 ) 00251 1 2 end 00252 1 1 else 00253 1 1 ret_status := PTD$WRITE (ft_chan 00254 1 1 , 00255 1 1 , 00256 1 1 ,keybuff 00257 1 1 ,1 00258 1 1 ); 00259 1 1 00260 C 1 1 { Check the return status } 00261 1 1 if odd(ret_status) then 00262 1 2 begin 00263 1 2 if odd(keybuff.sts) or (keybuff.sts = SS$_DATALOST) then 00264 1 3 begin 00265 1 3 keybuff.usage := tt_read; 00266 1 3 ret_status := $QIO (tt_read_efn 00267 1 3 ,tt_chan 00268 1 3 ,IO$_READVBLK 00269 1 3 ,keybuff.IOSB 00270 1 3 ,%immed kbd_read_ast 00271 1 3 ,%ref keybuff 00272 1 3 ,keybuff.data_buffer.body 00273 1 3 ,1 00274 1 3 ); TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 6 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00275 1 3 if not odd(ret_status) then 00276 1 4 begin 00277 1 4 exit_flag := true; 00278 1 4 exit_status := ret_status; 00279 1 3 end; 00280 1 3 end 00281 1 2 else { PTD$WRITE failed to complete } 00282 1 3 begin 00283 1 3 exit_flag := true; 00284 1 3 exit_status := keybuff.sts; 00285 1 3 end 00286 1 2 end 00287 1 1 else { PTD$WRITE failed to begin } 00288 1 2 begin 00289 1 2 exit_flag := true; 00290 1 2 exit_status := ret_status 00291 1 1 end; 00292 1 1 00293 1 1 ignore_read: 00294 1 1 if exit_flag then $WAKE; { Wake the main program since we are finished. } 00295 0 0 end; {kbd_read_ast} 00296 0 0 00297 0 0 00298 0 0 00299 C 0 0 { 00300 C 0 0 terminal_output_ast 00301 C 0 0 00302 C 0 0 This routine is called every time an I/O buffer is written to the real 00303 C 0 0 terminal's screen. If the terminal write request completed successfully, it 00304 C 0 0 inserts the I/O buffer into the queue of I/O buffers waiting to be logged. 00305 C 0 0 If the I/O buffer is the only entry in the queue, it calls SYS$WAKE to start 00306 C 0 0 the main routine; this call is not issued if the queue already has buffer(s) 00307 C 0 0 in it to prevent spurious wakeups. If a terminal write error occured, the 00308 C 0 0 routine sets the exit flag and wakes the main routine. 00309 C 0 0 } 00310 0 0 [asynchronous, unbound] 00311 1 0 procedure terminal_output_ast (var screenbuff : io_buffer); 00312 1 1 begin {terminal_output_ast} 00313 C 1 1 {**TRACE** trace_write('terminal_output_ast'); {**TRACE**} 00314 1 1 if not odd(screenbuff.IOSB.sts) then 00315 1 2 begin 00316 1 2 exit_flag := true; 00317 1 2 exit_status := screenbuff.IOSB.sts; 00318 1 2 end 00319 1 1 else 00320 C 1 1 { Enqueue the buffer for writing to the log file } 00321 1 1 with out_queue do 00322 1 2 begin 00323 1 2 screenbuff.usage := logging; 00324 1 2 head := head + 1; if head > max_buffers then head := 1; 00325 1 2 pending[head] := screenbuff.idx; 00326 1 2 queue_length := queue_length + 1; 00327 1 2 if queue_length = 1 then 00328 1 3 begin 00329 C 1 3 {**TRACE** trace_write(' -- waking Main'); {**TRACE**} TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 7 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00330 1 3 tail := head; 00331 1 2 end; 00332 1 2 $WAKE; 00333 1 1 end; 00334 0 0 end; {terminal_output_ast} 00335 0 0 00336 0 0 00337 0 0 00338 C 0 0 { 00339 C 0 0 flow_ast 00340 C 0 0 00341 C 0 0 This routine is called for the Pseudo-terminal driver to signal a flow 00342 C 0 0 control operation to the real terminal. The routine attempts to send the 00343 C 0 0 appropriate character (passed as the routine parameter) to the real terminal 00344 C 0 0 using SYS$QIO. The completion status is ignored; if the send fails, too 00345 C 0 0 bad. 00346 C 0 0 } 00347 0 0 [asynchronous, unbound] 00348 1 0 procedure flow_ast (control_char : char); 00349 1 1 begin 00350 C 1 1 {**TRACE** trace_write('flow_ast'); {**TRACE**} 00351 1 1 if not exit_flag then 00352 1 1 $QIO (efn := tt_write_efn, chan := tt_chan, func := IO$_WRITEVBLK, p1 := control_char, p2 := 1); 00353 0 0 end; 00354 0 0 00355 0 0 00356 0 0 00357 C 0 0 { 00358 C 0 0 set_line_ast 00359 C 0 0 00360 C 0 0 This routine is called when the application running on the pseudo terminal 00361 C 0 0 changes the device characteristics. The new characteristics are copied from 00362 C 0 0 the Pseudo-terminal, PASTHRU and NOECHO are set, and applied to the real 00363 C 0 0 terminal. 00364 C 0 0 } 00365 0 0 [asynchronous,unbound] 00366 1 0 procedure set_line_ast; 00367 1 0 var ret_status : integer; 00368 1 0 ttchar : characteristics_buffer; 00369 1 0 iosb : IO_Status_Block; 00370 1 1 begin 00371 C 1 1 {**TRACE** trace_write('set_line_ast'); {**TRACE**} 00372 1 1 if not exit_flag then 00373 1 2 begin 00374 1 2 ret_status := $QIOW (tt_efn 00375 1 2 ,tt_chan 00376 1 2 ,IO$_SENSEMODE 00377 1 2 ,iosb 00378 1 2 ,, 00379 1 2 ,ttchar 00380 1 2 ,size(ttchar) 00381 1 2 ); 00382 1 2 if odd(ret_status) and_then odd(iosb.sts) then 00383 1 3 begin 00384 1 3 ttchar.basic.TT$V_NOECHO := true; TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 8 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00385 1 3 ttchar.extended.TT2$V_PASTHRU := true; 00386 1 3 $QIO (efn := tt_efn, chan := tt_chan, func := IO$_SETMODE, p1 := ttchar, p2 := size(ttchar)); 00387 1 3 end 00388 1 2 end 00389 0 0 end; {set_line_ast} 00390 0 0 00391 C 0 0 {******************************************************************************* 00392 C 0 0 * Pseudo Terminal Routines * 00393 C 0 0 *******************************************************************************} 00394 0 0 00395 C 0 0 { 00396 C 0 0 ft_read_ast 00397 C 0 0 00398 C 0 0 This routine is called when a Pseudo-terminal read request completes 00399 C 0 0 (PTD$READ). It writes the buffer to the terminal and attempts to start 00400 C 0 0 another read from the Pseudo-terminal. If the program is exiting, this 00401 C 0 0 routine writes the buffer to the terminal but does not start another 00402 C 0 0 PTD$READ. 00403 C 0 0 } 00404 1 0 procedure ft_read_ast; { Attributes and Parameters on FORWARD declaration } 00405 1 0 label ignore_read; 00406 1 0 var ret_status : integer; 00407 1 0 nextbuff : io_buffer_idx; 00408 1 1 begin 00409 C 1 1 {**TRACE** trace_write('ft_read_ast'); {**TRACE**} 00410 C 1 1 { Ignore the data if the escape key has been pressed } 00411 1 1 if exit_flag then goto ignore_read; 00412 1 1 00413 C 1 1 { Check the PTD$READ completion status and process data } 00414 1 1 if odd(readbuff.sts) then 00415 1 2 begin 00416 1 2 readbuff.usage := tt_write_after_read; 00417 1 2 ret_status := $QIO (tt_write_efn 00418 1 2 ,tt_chan 00419 1 2 ,IO$_WRITEVBLK 00420 1 2 ,readbuff.IOSB 00421 1 2 ,%immed terminal_output_ast 00422 1 2 ,%ref readbuff 00423 1 2 ,readbuff.data_buffer.body 00424 1 2 ,length(readbuff.data_buffer) 00425 1 2 ); 00426 1 2 if odd(ret_status) then 00427 1 3 begin 00428 C 1 3 { Set up the next PTD$READ } 00429 1 3 allocate_io_buffer(nextbuff); 00430 1 3 if nextbuff > 0 then 00431 1 4 begin 00432 1 4 buffers[nextbuff].usage := ft_read; 00433 1 4 ret_status := PTD$READ (ft_efn 00434 1 4 ,ft_chan 00435 1 4 ,%immed ft_read_ast 00436 1 4 ,%ref buffers[nextbuff] 00437 1 4 ,buffers[nextbuff] 00438 1 4 ,data_buffer_size 00439 1 4 ); TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 9 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00440 1 4 if not odd(ret_status) then 00441 C 1 4 { PTD$READ failed } 00442 1 5 begin 00443 1 5 exit_flag := true; 00444 1 5 exit_status := ret_status; 00445 1 5 $WAKE; 00446 1 4 end; 00447 1 4 end 00448 1 3 else 00449 C 1 3 { Unable to get a new buffer } 00450 1 4 begin 00451 C 1 4 { $SETAST(0); { Disable ASTs so that log buffers can be purged } 00452 C 1 4 {**TRACE** trace_write(' -- no buffer available, suspending reads');{**TRACE**} 00453 1 4 read_suspended := true 00454 1 4 end 00455 1 3 end 00456 1 2 else 00457 C 1 2 { $QIO failed } 00458 1 3 begin 00459 C 1 3 {**TRACE** trace_write('!!! $QIO to screen failed !!!'); {**TRACE**} 00460 1 3 exit_flag := true; 00461 1 3 exit_status := ret_status; 00462 1 3 $WAKE; 00463 1 3 end 00464 1 2 end 00465 1 1 else 00466 C 1 1 { Previous PTD$READ failed } 00467 1 2 begin 00468 1 2 exit_flag := true; 00469 1 2 exit_status := readbuff.sts; 00470 1 2 $WAKE; 00471 1 1 end; 00472 1 1 ignore_read: 00473 0 0 end; {ft_read_ast} 00474 0 0 00475 0 0 00476 0 0 00477 C 0 0 { 00478 C 0 0 ft_echo_ast 00479 C 0 0 00480 C 0 0 This routine is called if a write to the Pseudo-terminal used an ECHO 00481 C 0 0 buffer. If any data was echoed, the output is written to the terminal; 00482 C 0 0 otherwise, the I/O buffer is freed so that it can be used later. If the 00483 C 0 0 program is exiting, this routine exits. 00484 C 0 0 } 00485 1 0 procedure ft_echo_ast; { Attributes and Parameters on FORWARD declaration } 00486 1 0 var ret_status : integer; 00487 1 1 begin 00488 C 1 1 {**TRACE** trace_write('ft_echo_ast'); {**TRACE**} 00489 1 1 if not exit_flag then 00490 1 2 begin 00491 1 2 if length(echobuff.data_buffer) > 0 then 00492 1 3 begin 00493 1 3 echobuff.usage := tt_write_after_echo; 00494 1 3 ret_status := $QIO (tt_write_efn TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 10 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00495 1 3 ,tt_chan 00496 1 3 ,IO$_WRITEVBLK 00497 1 3 ,echobuff.IOSB 00498 1 3 ,%immed terminal_output_ast 00499 1 3 ,%ref echobuff 00500 1 3 ,echobuff.data_buffer.body 00501 1 3 ,length(echobuff.data_buffer) 00502 1 3 ); 00503 1 3 if not odd(ret_status) then 00504 1 4 begin 00505 C 1 4 { $QIO failed } 00506 C 1 4 {**TRACE** trace_write ('!!! $QIO to screen (echo) failed !!!'); {**TRACE**} 00507 1 4 exit_flag := true; 00508 1 4 exit_status := ret_status; 00509 1 4 $WAKE; 00510 1 4 end 00511 1 3 end 00512 1 2 else 00513 C 1 2 { ECHO buffer is empty } 00514 1 3 begin 00515 C 1 3 {**TRACE** trace_write(' -- nothing to echo'); {**TRACE**} 00516 1 3 free_io_buffer(echobuff); 00517 1 3 end 00518 1 2 end 00519 0 0 end; {ft_echo_ast} 00520 0 0 00521 0 0 00522 C 0 0 {******************************************************************************* 00523 C 0 0 * Log File Routines * 00524 C 0 0 *******************************************************************************} 00525 0 0 00526 C 0 0 { 00527 C 0 0 write_log_data 00528 C 0 0 00529 C 0 0 This routine is called from the main program to write data to the log file. 00530 C 0 0 It keeps track of how much data has been put into the file buffer and 00531 C 0 0 processing to determine when to write the file. 00532 C 0 0 } 00533 1 0 procedure write_log_data; 00534 1 0 const CR = chr(13); LF = chr(10); NUL = chr(0); 00535 1 0 var cr_seen : [static] boolean := false; 00536 1 0 bytes : [static] integer := 1; 00537 1 0 s,i : 0..data_buffer_size+1; 00538 1 0 00539 1 1 begin 00540 C 1 1 {**TRACE** trace_write('write_log_data'); {**TRACE**} 00541 C 1 1 { Initialize the data buffer pointer } 00542 1 1 i := 1; 00543 1 2 repeat 00544 C 1 2 { Skip NULs } 00545 1 2 if log_data[i] = NUL then i := i + 1; 00546 1 2 00547 C 1 2 { Check for } 00548 1 2 if cr_seen then 00549 1 3 begin TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 11 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00550 1 3 if log_data[i] = LF then 00551 1 4 begin 00552 1 4 i := i + 1; 00553 1 4 cr_seen := false; 00554 1 4 writeln(logfile); 00555 1 4 bytes := 1; 00556 1 4 end 00557 1 3 else 00558 1 4 begin 00559 1 4 write(logfile,CR); bytes := bytes + 1; 00560 1 4 if log_data[i] = CR then 00561 1 4 i := i + 1 00562 1 4 else 00563 1 4 cr_seen := false; 00564 1 4 end 00565 1 3 end 00566 1 2 else 00567 C 1 2 { Check fo a CR } 00568 1 2 if log_data[i] = CR then 00569 1 3 begin 00570 1 3 cr_seen := true; { Skip if CR } 00571 1 3 i := i + 1; 00572 1 3 end 00573 1 2 else 00574 1 3 begin { Fill the file buffer } 00575 1 3 s := i; 00576 1 3 while (bytes <= MAXBUF) and ((i <= length(log_data)) and_then (log_data[i] <> CR)) do 00577 1 4 begin 00578 1 4 i := i + 1; 00579 1 4 bytes := bytes + 1; 00580 1 3 end; 00581 1 3 if (s = 1) and (i > length(log_data)) then 00582 C 1 3 { Entire data buffer can go to the file } 00583 1 3 write(logfile, log_data) 00584 1 3 else 00585 C 1 3 { A substring of the data buffer can go to the file } 00586 1 3 write(logfile, substr(log_data, s, i-s)); 00587 1 2 end; 00588 1 2 00589 C 1 2 { Write the file buffer if it is full } 00590 1 2 if bytes >= MAXBUF then 00591 1 3 begin 00592 1 3 writeln(logfile); 00593 1 3 bytes := 1; 00594 1 2 end; 00595 1 2 00596 1 1 until i > length(log_data); 00597 0 0 end; {write_log_data} 00598 0 0 00599 C 0 0 {******************************************************************************* 00600 C 0 0 * Subprocess Management * 00601 C 0 0 {******************************************************************************} 00602 0 0 00603 C 0 0 { 00604 C 0 0 subprocess_exit_ast TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 12 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00605 C 0 0 00606 C 0 0 This routine is called when the subprocess has completed and died. It 00607 C 0 0 checks to see if the program is already exiting; if not, it sets the exit 00608 C 0 0 flag and wakes the main program. 00609 C 0 0 } 00610 0 0 [asynchronous, unbound] 00611 1 0 procedure subprocess_exit_ast; 00612 1 1 begin 00613 C 1 1 {**TRACE** trace_write('subprocess_exit_ast'); {**TRACE**} 00614 1 1 if not exit_flag and (PID <> 0) then 00615 1 2 begin 00616 1 2 exit_flag := true; 00617 1 2 exit_status := SS$_NORMAL; 00618 1 2 $WAKE; 00619 1 2 end 00620 0 0 end; {subprocess_exit_ast} 00621 0 0 00622 0 0 00623 0 0 00624 C 0 0 {******************************************************************************* 00625 C 0 0 * Initialization * 00626 C 0 0 * * 00627 C 0 0 * This routine sets the terminal characteristics, creates the Pseudo-terminal, * 00628 C 0 0 * starts up the subprocess, and opens the log file. If any of these * 00629 C 0 0 * operations fail, it undoes any steps already done and returns to the main * 00630 C 0 0 * routine. * 00631 C 0 0 * * 00632 C 0 0 *******************************************************************************} 00633 0 0 00634 1 0 function initialization : integer; 00635 1 0 label done, deassign_tt, close_logfile, delete_ft, reset_tt, delete_subprc, cancel_read; 00636 1 0 var ret_status : integer; 00637 1 0 buffer_space : address_range; 00638 1 0 new_devchar : characteristics_buffer; 00639 1 0 IOSB : IO_Status_Block; 00640 1 0 b,kb : io_buffer_idx; 00641 1 0 00642 1 1 begin 00643 C 1 1 { Assign a channel to TT: } 00644 1 1 ret_status := $ASSIGN ('TT:', tt_chan); 00645 1 1 if not odd(ret_status) then goto done; 00646 1 1 LIB$GET_EF (tt_efn); 00647 1 1 LIB$GET_EF (tt_read_efn); 00648 1 1 LIB$GET_EF (tt_write_efn); 00649 1 1 00650 C 1 1 { Get the terminal characteristics } 00651 1 1 ret_status := $QIOW (efn := tt_efn, chan := tt_chan, func := IO$_SENSEMODE, iosb := IOSB, p1 := tt_devchar, p2 := size(tt_devchar)); 00652 1 1 if not odd(ret_status) then goto deassign_tt; 00653 1 1 if not odd(IOSB.sts) then 00654 1 2 begin 00655 1 2 ret_status := IOSB.sts; 00656 1 2 goto deassign_tt; 00657 1 1 end; 00658 1 1 TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 13 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00659 C 1 1 { Open the log file } 00660 1 1 open(file_variable := logfile 00661 1 1 ,record_length := MAXBUF 00662 1 1 ,error := continue 00663 1 1 ); 00664 1 1 if status(logfile) = 0 then rewrite(logfile,error:=continue); 00665 1 1 ret_status := status(logfile); 00666 1 1 if ret_status > 0 then 00667 1 2 begin 00668 1 2 ret_status := %X218644 + ret_status * 8; 00669 1 2 goto close_logfile; 00670 1 1 end; 00671 1 1 00672 C 1 1 { Create the Pseudo-terminal with the same characteristics as TT: } 00673 1 1 buffer_space.start_addr := iaddress(buffers[1]); 00674 1 1 buffer_space.end_addr := uand(iaddress(buffers[max_buffers]) + size(io_buffer), %XFFFFFE00); 00675 1 1 ret_status := PTD$CREATE (ft_chan 00676 1 1 , 00677 1 1 ,tt_devchar 00678 1 1 ,size(tt_devchar) 00679 1 1 ,subprocess_exit_ast 00680 1 1 , 00681 1 1 , 00682 1 1 ,buffer_space 00683 1 1 ); 00684 1 1 if not odd(ret_status) then goto close_logfile; 00685 1 1 LIB$GET_EF (ft_efn); 00686 1 1 00687 1 1 new_devchar := tt_devchar; 00688 1 1 new_devchar.basic.TT$V_NOECHO := true; 00689 1 1 new_devchar.extended.TT2$V_PASTHRU := true; 00690 1 1 ret_status := $QIOW (efn := tt_efn, chan := tt_chan, func := IO$_SETMODE, iosb := IOSB, p1 := new_devchar, p2 := size(new_devchar)); 00691 1 1 if not odd(ret_status) then goto delete_ft; 00692 1 1 if not odd(IOSB.sts) then 00693 1 2 begin 00694 1 2 ret_status := IOSB.sts; 00695 1 2 goto delete_ft; 00696 1 1 end; 00697 1 1 exit_block.tt_charbuff := iaddress(tt_devchar); 00698 1 1 00699 C 1 1 { Initialize the data buffers } 00700 1 1 for b := 1 to max_buffers do with buffers[b] do 00701 1 2 begin 00702 1 2 idx := b; 00703 1 2 usage := free; 00704 1 1 end; 00705 1 1 00706 C 1 1 { Get the FT device name } 00707 1 1 ret_status := LIB$GETDVI (DVI$_DEVNAM, ft_chan,,,ft_devnam.body, ft_devnam.length); 00708 1 1 if not odd(ret_status) then goto reset_tt; 00709 1 1 00710 C 1 1 { Create the subprocess } 00711 1 1 ret_status := LIB$SPAWN ( 00712 1 1 ,ft_devnam TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 14 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00713 1 1 ,ft_devnam 00714 1 1 ,CLI$M_NOWAIT 00715 1 1 , 00716 1 1 ,PID 00717 1 1 ,subprc_sts 00718 1 1 , 00719 1 1 ,subprocess_exit_ast 00720 1 1 ); 00721 1 1 if not odd(ret_status) then goto reset_tt; 00722 1 1 writeln('%FT-I-BEGIN, terminal attached to subprocess for logging'); 00723 1 1 00724 C 1 1 { Enable XON, XOFF, BELL, SET_LINE event notification ASTs } 00725 1 1 ret_status := PTD$SET_EVENT_NOTIFICATION (ft_chan, %immed flow_ast, %ref XON,, PTD$C_SEND_XON); 00726 1 1 if not odd(ret_status) then goto delete_subprc; 00727 1 1 ret_status := PTD$SET_EVENT_NOTIFICATION (ft_chan, %immed flow_ast, %ref XOFF,, PTD$C_SEND_XOFF); 00728 1 1 if not odd(ret_status) then goto delete_subprc; 00729 1 1 ret_status := PTD$SET_EVENT_NOTIFICATION (ft_chan, %immed flow_ast, %ref BELL,, PTD$C_SEND_BELL); 00730 1 1 if not odd(ret_status) then goto delete_subprc; 00731 1 1 ret_status := PTD$SET_EVENT_NOTIFICATION (ft_chan, set_line_ast,,, PTD$C_CHAR_CHANGED); 00732 1 1 if not odd(ret_status) then goto delete_subprc; 00733 1 1 00734 C 1 1 { Start reading from the Pseudo-terminal } 00735 1 1 allocate_io_buffer(kb); { TT keyboard } 00736 1 1 allocate_io_buffer(b); { FT screen } 00737 1 1 buffers[b].usage := ft_read; 00738 1 1 ret_status := PTD$READ (ft_efn 00739 1 1 ,ft_chan 00740 1 1 ,%immed ft_read_ast 00741 1 1 ,%ref buffers[b] 00742 1 1 ,buffers[b] 00743 1 1 ,data_buffer_size 00744 1 1 ); 00745 1 1 if not odd(ret_status) then goto delete_subprc; 00746 1 1 00747 C 1 1 { Begin reading keystrokes } 00748 1 1 buffers[kb].usage := tt_read; 00749 1 1 ret_status := $QIO (tt_read_efn 00750 1 1 ,tt_chan 00751 1 1 ,IO$_READVBLK 00752 1 1 ,buffers[kb].IOSB 00753 1 1 ,%immed kbd_read_ast 00754 1 1 ,%ref buffers[kb] 00755 1 1 ,buffers[kb].data_buffer.body 00756 1 1 ,1 00757 1 1 ); 00758 1 1 if odd(ret_status) then goto done; 00759 1 1 00760 C 1 1 { The following code cleans up after an error during initialization } 00761 1 1 cancel_read: 00762 1 1 PTD$CANCEL (ft_chan); 00763 1 1 delete_subprc: 00764 1 1 $DELPRC (PID); 00765 1 1 reset_tt: 00766 1 1 $QIOW (efn := tt_efn, chan := tt_chan, func := IO$_SETMODE, p1 := tt_devchar, p2 := size(tt_devchar)); 00767 1 1 delete_ft: TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 15 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00768 1 1 PTD$DELETE (ft_chan); 00769 1 1 close_logfile: 00770 1 1 close(logfile, DELETE, error:=continue); 00771 1 1 deassign_tt: 00772 1 1 $DASSGN (tt_chan); 00773 1 1 done: 00774 1 1 initialization := ret_status; 00775 0 0 end; {initialization} 00776 0 0 00777 0 0 00778 0 0 00779 C 0 0 {******************************************************************************* 00780 C 0 0 * Condition Handler * 00781 C 0 0 *******************************************************************************} 00782 0 0 00783 0 0 [asynchronous, unbound] 00784 1 0 procedure exit_handler (var exit_status : integer; var tt_charbuff : characteristics_buffer); 00785 1 0 const exit_msg = '%FT-I-END, logging completed'; 00786 1 1 begin 00787 1 1 $CANCEL(tt_chan); 00788 1 1 if iaddress(tt_charbuff) <> 0 then 00789 1 1 $QIOW(efn := tt_efn, chan := tt_chan, func := IO$_SETMODE, p1 := tt_charbuff, p2 := size(tt_charbuff)); 00790 1 1 if odd(exit_status) then 00791 1 1 $QIOW (chan := tt_chan 00792 1 1 ,func := IO$_WRITEVBLK 00793 1 1 ,P1 := exit_msg 00794 1 1 ,P2 := length(exit_msg) 00795 1 1 ,P4 := 48 {'0' - double space} 00796 1 1 ) 00797 1 1 else 00798 1 1 $QIOW (chan := tt_chan 00799 1 1 ,func := IO$_WRITEVBLK 00800 1 1 ,P1 := '' 00801 1 1 ,P2 := 0 00802 1 1 ,P4 := 20 {' ' - single space} 00803 1 1 ); 00804 0 0 end; {exit_handler} 00805 0 0 00806 0 0 00807 C 0 0 {******************************************************************************* 00808 C 0 0 * Main Program * 00809 C 0 0 * * 00810 C 0 0 * The main program begins by initializing with a call to initialization, then * 00811 C 0 0 * hibernates. When awakened, the program checks the exit_flag; if it is * 00812 C 0 0 * false, there is log data to write to the log file. The log data is appended * 00813 C 0 0 * to the current log record and checked to see if the record should be written * 00814 C 0 0 * to the log file. A write to the file will occur when either there are a * 00815 C 0 0 * MAXBUF characters in the record, or when a pair is seen in the * 00816 C 0 0 * log data. An unlimited number of characters is allowed between the * 00817 C 0 0 * and the . * 00818 C 0 0 * * 00819 C 0 0 * When the program exits it closes the log file, deletes the subprocess and * 00820 C 0 0 * the Pseudo-terminal, resets the terminal and exits. * 00821 C 0 0 * * 00822 C 0 0 *******************************************************************************} TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 16 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00823 0 0 00824 0 1 begin 00825 C 0 1 { Set up an Exit Handler to reset terminal characteristics } 00826 0 1 with exit_block do 00827 0 2 begin 00828 0 2 handler_addr := iaddress(exit_handler); 00829 0 2 arg_count := 2; 00830 0 2 exit_sts_addr := iaddress(exit_status); 00831 0 2 tt_charbuff := 0; 00832 0 1 end; 00833 0 1 ret_status := $DCLEXH (exit_block); 00834 0 1 00835 C 0 1 {**TRACE** rewrite(tracewrite); {**TRACE**} 00836 0 1 00837 C 0 1 { Initialize } 00838 0 1 exit_status := SS$_NORMAL; 00839 0 1 00840 0 1 ret_status := initialization; if not odd(ret_status) then LIB$SIGNAL(ret_status); 00841 0 1 00842 0 1 00843 C 0 1 { Run in a loop, checking the size of the log queue and the exit flag } 00844 0 2 repeat 00845 C 0 2 { Write out any log data } 00846 C 0 2 {**TRACE** writev(log_data, 'Awake! Queue length = ',out_queue.queue_length:1);{**TRACE**} 00847 C 0 2 {**TRACE** trace_write(log_data); {**TRACE**} 00848 0 2 with out_queue do while (queue_length > 0) do 00849 0 3 begin 00850 C 0 3 { Remove an entry from the queue } 00851 0 3 $SETAST(0); { Disable ASTs } 00852 0 3 log_data := buffers[pending[tail]].data_buffer; { Dequeue the data } 00853 0 3 free_io_buffer(buffers[pending[tail]]); 00854 0 3 pending[tail] := 0; 00855 0 3 queue_length := queue_length - 1; 00856 0 3 if queue_length = 0 then 00857 0 4 begin 00858 0 4 head := 0; 00859 0 4 tail := 0; 00860 0 4 end 00861 0 3 else 00862 0 4 begin 00863 0 4 tail := tail + 1; if tail > max_buffers then tail := 1; 00864 0 3 end; 00865 0 3 $SETAST(1); { Re-enable ASTs } 00866 0 3 write_log_data; 00867 0 2 end; 00868 0 2 00869 C 0 2 { Check for exit flag; hibernate if not exiting } 00870 0 2 if out_queue.queue_length = 0 then 00871 0 3 begin 00872 C 0 3 {**TRACE** trace_write('Queue Length = 0'); {**TRACE**} 00873 0 3 if not exit_flag then $HIBER; 00874 0 2 end; 00875 0 1 until exit_flag and (out_queue.queue_length = 0); 00876 0 1 00877 0 1 TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 17 01 Source Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) -LINE-IDC-PL-SL- 00878 0 1 00879 C 0 1 { All done. Clean up and exit } 00880 0 1 close(logfile); 00881 0 1 00882 0 1 if PID <> 0 then 00883 0 2 begin 00884 0 2 $FORCEX(PID); 00885 0 2 $DELPRC(PID); 00886 0 1 end; 00887 0 1 00888 0 1 PTD$CANCEL(ft_chan); 00889 0 1 00890 0 1 $CANCEL(tt_chan); 00891 0 1 00892 0 1 ret_status := PTD$DELETE(ft_chan); 00893 0 1 if not odd(ret_status) and (exit_status = SS$_NORMAL) then 00894 0 1 exit_status := ret_status; 00895 0 1 00896 0 1 ret_status := $QIOW(efn := tt_efn, chan := tt_chan, func := IO$_SETMODE, p1 := tt_devchar, p2 := size(tt_devchar)); 00897 0 1 if not odd(ret_status) and (exit_status = SS$_NORMAL) then 00898 0 1 exit_status := ret_status; 00899 0 1 00900 0 1 if not odd(exit_status) then LIB$SIGNAL(exit_status); 00901 0 1 00902 0 0 end. TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 18 01 Cross Reference Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) $ASSIGN FUNC [HIDDEN, EXTERNAL(SYS$ASSIGN), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 644 $CANCEL FUNC [HIDDEN, EXTERNAL(SYS$CANCEL), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 787 890 $DASSGN FUNC [HIDDEN, EXTERNAL(SYS$DASSGN), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 772 $DCLEXH FUNC [HIDDEN, EXTERNAL(SYS$DCLEXH), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 833 $DELPRC FUNC [HIDDEN, EXTERNAL(SYS$DELPRC), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 764 885 $FORCEX FUNC [HIDDEN, EXTERNAL(SYS$FORCEX), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 884 $HIBER FUNC [HIDDEN, EXTERNAL(SYS$HIBER), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 873 $QIO FUNC [HIDDEN, EXTERNAL(SYS$QIO), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 266 352 386 417 494 749 $QIOW FUNC [HIDDEN, EXTERNAL(SYS$QIOW), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 374 651 690 766 789 791 798 896 $SETAST FUNC [HIDDEN, EXTERNAL(SYS$SETAST), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 851 865 $WAKE FUNC [HIDDEN, EXTERNAL(SYS$WAKE), UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 294 332 445 462 470 509 618 ADDRESS_RANGE TYPE RECORD { IN PROGRAM TEST_FTDRIVER } 27 637 ALLOCATED CONST 'ALLOCATED = 1' { IN PROGRAM TEST_FTDRIVER } 31 145 ALLOCATE_IO_BUFFER PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 140 239 429 735 736 ARG_COUNT FIELD INTEGER 98 829 = B PARM IO_BUFFER_IDX { IN PROCEDURE ALLOCATE_IO_BUFFER } 140 143 = 144 144 144 = 144 145 145 B PARM [ALIGNED(9), VOLATILE] IO_BUFFER { IN PROCEDURE FREE_IO_BUFFER } 158 163 168 172 P 173 P B VAR IO_BUFFER_IDX { IN FUNCTION INITIALIZATION } 640 700 = 700 702 736 P 737 741 742 BASIC FIELD { IN CHARACTERISTICS_BUFFER } TT$TYPE 37 384 688 BELL CONST ''(7) { IN PROGRAM TEST_FTDRIVER } 21 729 BOOLEAN TYPE * 73 535 BUFFERS VAR [PSECT($LOCAL), VOLATILE] ARRAY OF IO_BUFFER { IN PROGRAM TEST_FTDRIVER } 76 144 145 242 245 P 248 P 432 436 P 437 P 673 A 674 A 700 W 737 741 P 742 P 748 752 754 P 755 852 853 P BUFFER_SPACE VAR ADDRESS_RANGE { IN FUNCTION INITIALIZATION } 637 673 674 682 BUFFER_USES TYPE [BYTE] ENUMERATION { IN PROGRAM TEST_FTDRIVER } 31 51 BYTES VAR [PSECT($LOCAL)] INTEGER { IN PROCEDURE WRITE_LOG_DATA } 536 555 = 559 = 559 576 579 = 579 590 593 = CANCEL_READ LABEL 635 761 L CHAN PARM INTEGER * 651 690 766 789 791 798 896 CHAN PARM INTEGER TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 19 01 Cross Reference Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) * 352 386 CHAR TYPE * 48 64 90 213 348 CHARACTERISTICS_BUFFER TYPE RECORD { IN PROGRAM TEST_FTDRIVER } 33 68 368 638 784 CHR FUNC { BUILTIN } : CHAR * 21 21 21 534 534 534 CH_READ VAR CHAR { IN PROCEDURE KBD_READ_AST } 213 229 = 230 CLI$M_NOWAIT CONST 1 { FROM ENVIRONMENT #1 } * 714 CLOSE PROC { BUILTIN } * 770 880 CLOSE_LOGFILE LABEL 635 669 684 769 L CONTROL_CHAR PARM CHAR { IN PROCEDURE FLOW_AST } 348 352 P COUNT FIELD { IN IO_STATUS_BLOCK } SUBRANGE OF INTEGER 42 CR CONST ''(13) { IN PROCEDURE WRITE_LOG_DATA } 534 559 560 568 576 CR_SEEN VAR [PSECT($LOCAL)] BOOLEAN { IN PROCEDURE WRITE_LOG_DATA } 535 548 553 = 563 = 570 = DATA_BUFFER FIELD { IN IO_BUFFER } VARYING OF CHAR 48 228 = 229 272 P 423 P 424 491 500 P 501 755 P 852 DATA_BUFFER_SIZE CONST 500 { IN PROGRAM TEST_FTDRIVER } 22 48 90 174 249 438 537 743 DEASSIGN_TT LABEL 635 652 656 771 L DELETE_FT LABEL 635 691 695 767 L DELETE_SUBPRC LABEL 635 726 728 730 732 745 763 L DEVCLASS FIELD { IN CHARACTERISTICS_BUFFER } SUBRANGE OF INTEGER 34 DEVTYPE FIELD { IN CHARACTERISTICS_BUFFER } SUBRANGE OF INTEGER 35 DONE LABEL 635 645 758 773 L DVI$_DEVNAM CONST 32 { FROM ENVIRONMENT #1 } * 707 ECHOBUFF PARM [ALIGNED(9), VOLATILE] IO_BUFFER { IN PROCEDURE FT_ECHO_AST } 113 491 493 497 499 P 500 501 516 P EFN PARM UNSIGNED * 352 386 EFN PARM UNSIGNED * 651 690 766 789 896 END_ADDR FIELD { IN ADDRESS_RANGE } UNSIGNED 28 674 = EXIT_BLOCK VAR [PSECT($LOCAL)] RECORD { IN PROGRAM TEST_FTDRIVER } 95 697 826 W 833 P EXIT_CHARACTER CONST ''(28) { IN PROGRAM TEST_FTDRIVER } 23 230 EXIT_FLAG VAR [PSECT($LOCAL), VOLATILE] BOOLEAN { IN PROGRAM TEST_FTDRIVER } 73 181 = 217 222 = 232 = 277 = 283 = 289 = 294 316 = 351 372 411 443 = 460 = 468 = 489 507 = 614 616 = TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 20 01 Cross Reference Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) 873 875 EXIT_HANDLER PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 784 EXIT_MSG CONST '%FT-I-END, logging completed' { IN PROCEDURE EXIT_HANDLER } 785 793 794 EXIT_STATUS VAR [PSECT($LOCAL), VOLATILE] INTEGER { IN PROGRAM TEST_FTDRIVER } 74 182 = 223 = 233 = 278 = 284 = 290 = 317 = 444 = 461 = 469 = 508 = 617 = 830 A 838 = 893 894 = 897 898 = 900 900 EXIT_STATUS PARM INTEGER { IN PROCEDURE EXIT_HANDLER } 784 790 EXIT_STS_ADDR FIELD UNSIGNED 99 830 = EXTENDED FIELD { IN CHARACTERISTICS_BUFFER } TT2$TYPE 38 385 689 FALSE CONST 'FALSE = 0' * 177 535 553 563 FLOW_AST PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 348 725 P 727 P 729 P FORWARD_LINK FIELD UNSIGNED 96 FREE CONST 'FREE = 0' { IN PROGRAM TEST_FTDRIVER } 31 144 163 703 FREE_IO_BUFFER PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 158 516 853 FT_CHAN VAR [PSECT($LOCAL), WORD, VOLATILE] SUBRANGE OF INTEGER { IN PROGRAM TEST_FTDRIVER } 63 170 243 253 434 675 P 707 725 727 729 731 739 762 768 888 892 FT_DEVNAM VAR [PSECT($LOCAL)] VARYING OF CHAR { IN PROGRAM TEST_FTDRIVER } 64 707 P 707 P 712 713 FT_ECHO CONST 'FT_ECHO = 5' { IN PROGRAM TEST_FTDRIVER } 31 242 FT_ECHO_AST PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 113 244 P 485 F FT_EFN VAR [PSECT($LOCAL), VOLATILE] UNSIGNED { IN PROGRAM TEST_FTDRIVER } 62 169 433 685 P 738 FT_READ CONST 'FT_READ = 6' { IN PROGRAM TEST_FTDRIVER } 31 168 432 737 FT_READ_AST PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 109 171 P 404 F 435 P 740 P FT_WRITE CONST 'FT_WRITE = 7' { IN PROGRAM TEST_FTDRIVER } 31 FUNC PARM INTEGER * 651 690 766 789 792 799 896 FUNC PARM INTEGER * 352 386 HANDLER_ADDR FIELD UNSIGNED 97 828 = HEAD FIELD SUBRANGE OF INTEGER 79 324 = 324 324 324 = 325 330 858 = I VAR SUBRANGE OF INTEGER { IN PROCEDURE WRITE_LOG_DATA } 537 542 = 545 545 = 545 550 552 = 552 560 561 = 561 568 571 = 571 575 576 576 578 = 578 581 586 596 IADDRESS FUNC { BUILTIN } * 673 674 697 788 828 830 IDX FIELD { IN IO_BUFFER } INTEGER TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 21 01 Cross Reference Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) 50 325 702 = IGNORE_READ LABEL 210 217 224 234 293 L IGNORE_READ LABEL 405 411 472 L INITIALIZATION FUNC [PSECT($CODE), UNBOUND] : INTEGER { IN PROGRAM TEST_FTDRIVER } 634 774 = 840 INPUT VAR [EXTERNAL(PAS$FV_INPUT)] TEXT { IN PROGRAM TEST_FTDRIVER } * 16 INTEGER TYPE * 50 56 57 60 74 87 98 159 211 367 406 486 536 634 636 784 IO$_READVBLK CONST 49 { FROM ENVIRONMENT #1 } * 268 751 IO$_SENSEMODE CONST 39 { FROM ENVIRONMENT #1 } * 376 651 IO$_SETMODE CONST 35 { FROM ENVIRONMENT #1 } * 386 690 766 789 896 IO$_WRITEVBLK CONST 48 { FROM ENVIRONMENT #1 } * 352 419 496 792 799 IOSB PARM [QUAD, VOLATILE, UNSAFE] RECORD * 651 690 IOSB FIELD { IN IO_BUFFER } IO_STATUS_BLOCK 49 220 223 269 P 314 317 420 P 497 P 752 P IOSB VAR IO_STATUS_BLOCK { IN PROCEDURE SET_LINE_AST } 369 377 P 382 IOSB VAR IO_STATUS_BLOCK { IN FUNCTION INITIALIZATION } 639 651 P 653 655 690 P 692 694 IO_BUFFER TYPE [ALIGNED(9), VOLATILE] RECORD { IN PROGRAM TEST_FTDRIVER } 46 76 109 113 158 209 311 IO_BUFFER_IDX TYPE SUBRANGE OF INTEGER { IN PROGRAM TEST_FTDRIVER } 54 80 81 140 212 407 640 IO_STATUS_BLOCK TYPE RECORD { IN PROGRAM TEST_FTDRIVER } 41 49 369 639 KB VAR IO_BUFFER_IDX { IN FUNCTION INITIALIZATION } 640 735 P 748 752 754 755 KBD_READ_AST PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 209 270 P 753 P KEYBUFF PARM [ALIGNED(9), VOLATILE] IO_BUFFER { IN PROCEDURE KBD_READ_AST } 209 220 223 228 229 246 P 256 P 263 263 265 269 271 P 272 284 LENGTH FUNC { BUILTIN } : INTEGER * 424 491 501 576 581 596 794 LF CONST ''(10) { IN PROCEDURE WRITE_LOG_DATA } 534 550 LIB$GETDVI FUNC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #2 } * 707 LIB$GET_EF FUNC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #2 } * 646 647 648 685 LIB$SIGNAL PROC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] { FROM ENVIRONMENT #2 } * 840 900 LIB$SPAWN FUNC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #2 } * 711 LOGFILE VAR [PSECT($LOCAL)] TEXT { IN PROGRAM TEST_FTDRIVER } 89 16 554 559 583 586 592 660 664 664 665 770 880 LOGGING CONST 'LOGGING = 8' { IN PROGRAM TEST_FTDRIVER } TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 22 01 Cross Reference Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) 31 323 LOG_DATA VAR [PSECT($LOCAL)] VARYING OF CHAR { IN PROGRAM TEST_FTDRIVER } 90 545 550 560 568 576 576 581 583 586 596 852 = MAXBUF VAR [EXTERNAL(IOC$GW_MAXBUF), WORD, READONLY] SUBRANGE OF INTEGER { IN PROGRAM TEST_FTDRIVER } 91 576 590 661 MAX_BUFFERS CONST 10 { IN PROGRAM TEST_FTDRIVER } 24 54 76 79 80 143 324 674 700 863 MECHANISM_ARRAY TYPE ARRAY OF INTEGER { IN PROGRAM TEST_FTDRIVER } 57 NEW_DEVCHAR VAR CHARACTERISTICS_BUFFER { IN FUNCTION INITIALIZATION } 638 687 = 688 689 690 P 690 NEXTBUFF VAR IO_BUFFER_IDX { IN PROCEDURE FT_READ_AST } 407 429 P 430 432 436 437 NUL CONST ''(0) { IN PROCEDURE WRITE_LOG_DATA } 534 545 ODD FUNC { BUILTIN } : BOOLEAN * 176 220 261 263 275 314 382 382 414 426 440 503 645 652 653 684 691 692 708 721 726 728 730 732 745 758 790 840 893 897 900 OPEN PROC { BUILTIN } * 660 OUTPUT VAR [EXTERNAL(PAS$FV_OUTPUT)] TEXT { IN PROGRAM TEST_FTDRIVER } * 16 722 OUT_QUEUE VAR [PSECT($LOCAL), VOLATILE] RECORD { IN PROGRAM TEST_FTDRIVER } 78 321 W 848 W 870 875 P1 PARM [UNSAFE] CONFORMANT ARRAY * 651 690 766 789 793 800 896 P1 PARM [UNSAFE] CONFORMANT ARRAY * 352 386 P2 PARM INTEGER * 352 386 P2 PARM INTEGER * 651 690 766 789 794 801 896 P4 PARM INTEGER * 795 802 PAGE_WIDTH FIELD { IN CHARACTERISTICS_BUFFER } SUBRANGE OF INTEGER 36 PENDING FIELD ARRAY OF IO_BUFFER_IDX 80 325 = 852 853 854 = PID VAR [PSECT($LOCAL), VOLATILE] UNSIGNED { IN PROGRAM TEST_FTDRIVER } 86 614 716 P 764 P 882 884 P 885 P PTD$CANCEL FUNC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 762 888 PTD$CREATE FUNC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 675 PTD$C_CHAR_CHANGED CONST 5 { FROM ENVIRONMENT #1 } * 731 PTD$C_SEND_BELL CONST 1 { FROM ENVIRONMENT #1 } * 729 PTD$C_SEND_XOFF CONST 2 { FROM ENVIRONMENT #1 } * 727 PTD$C_SEND_XON CONST 0 { FROM ENVIRONMENT #1 } * 725 PTD$DELETE FUNC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 768 892 TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 23 01 Cross Reference Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) PTD$READ FUNC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 169 433 738 PTD$SET_EVENT_NOTIFICATION FUNC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 725 727 729 731 PTD$WRITE FUNC [HIDDEN, EXTERNAL, UNBOUND, ASYNCHRONOUS] : INTEGER { FROM ENVIRONMENT #1 } * 243 253 QUEUE_LENGTH FIELD IO_BUFFER_IDX 81 326 = 326 327 848 855 = 855 856 870 875 READBUFF PARM [ALIGNED(9), VOLATILE] IO_BUFFER { IN PROCEDURE FT_READ_AST } 109 414 416 420 422 P 423 424 469 READ_SUSPENDED VAR [PSECT($LOCAL), VOLATILE] BOOLEAN { IN PROGRAM TEST_FTDRIVER } 72 162 177 = 453 = RESET_TT LABEL 635 708 721 765 L RET_STATUS VAR [PSECT($LOCAL)] INTEGER { IN PROGRAM TEST_FTDRIVER } 60 833 = 840 = 840 840 892 = 893 894 896 = 897 898 RET_STATUS VAR INTEGER { IN PROCEDURE FREE_IO_BUFFER } 159 169 = 176 182 RET_STATUS VAR INTEGER { IN PROCEDURE KBD_READ_AST } 211 243 = 253 = 261 266 = 275 278 290 RET_STATUS VAR INTEGER { IN PROCEDURE SET_LINE_AST } 367 374 = 382 RET_STATUS VAR INTEGER { IN PROCEDURE FT_READ_AST } 406 417 = 426 433 = 440 444 461 RET_STATUS VAR INTEGER { IN PROCEDURE FT_ECHO_AST } 486 494 = 503 508 RET_STATUS VAR INTEGER { IN FUNCTION INITIALIZATION } 636 644 = 645 651 = 652 655 = 665 = 666 668 = 668 675 = 684 690 = 691 694 = 707 = 708 711 = 721 725 = 726 727 = 728 729 = 730 731 = 732 738 = 745 749 = 758 774 REWRITE PROC { BUILTIN } * 664 S VAR SUBRANGE OF INTEGER { IN PROCEDURE WRITE_LOG_DATA } 537 575 = 581 586 586 SCREENBUFF VAR IO_BUFFER_IDX { IN PROCEDURE KBD_READ_AST } 212 239 P 240 242 245 248 SCREENBUFF PARM [ALIGNED(9), VOLATILE] IO_BUFFER { IN PROCEDURE TERMINAL_OUTPUT_AST } 311 314 317 323 325 SET_LINE_AST PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 366 731 P SIGNAL_ARRAY TYPE ARRAY OF INTEGER { IN PROGRAM TEST_FTDRIVER } 56 SIZE FUNC { BUILTIN } : INTEGER * 380 386 651 674 678 690 766 789 896 SS$_DATALOST CONST 8932 { FROM ENVIRONMENT #1 } * 263 SS$_NORMAL CONST 1 { FROM ENVIRONMENT #1 } * 233 617 838 893 897 START_ADDR FIELD { IN ADDRESS_RANGE } UNSIGNED 28 673 = STATUS FUNC { BUILTIN } : INTEGER * 664 665 STS FIELD { IN IO_STATUS_BLOCK } SUBRANGE OF INTEGER 42 220 223 314 317 382 653 655 692 694 STS FIELD { IN IO_BUFFER } SUBRANGE OF INTEGER TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 24 01 Cross Reference Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) 47 263 263 284 414 469 SUBPRC_STS VAR [PSECT($LOCAL), VOLATILE] INTEGER { IN PROGRAM TEST_FTDRIVER } 87 717 SUBPROCESS_EXIT_AST PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 611 679 P 719 P SUBSTR FUNC { BUILTIN } * 586 TAIL FIELD SUBRANGE OF INTEGER 79 330 = 852 853 854 859 = 863 = 863 863 863 = TERMINAL_OUTPUT_AST PROC [PSECT($CODE), UNBOUND, ASYNCHRONOUS] { IN PROGRAM TEST_FTDRIVER } 311 421 P 498 P TEST_FTDRIVER PROG [PSECT($CODE)] 16 TEXT TYPE * 89 TRM FIELD { IN IO_STATUS_BLOCK } SUBRANGE OF INTEGER 43 TRM_SIZE FIELD { IN IO_STATUS_BLOCK } SUBRANGE OF INTEGER 43 TRUE CONST 'TRUE = 1' * 181 222 232 277 283 289 316 384 385 443 453 460 468 507 570 616 688 689 TT$TYPE TYPE RECORD { FROM ENVIRONMENT #1 } * 37 TT$V_NOECHO FIELD { IN TT$TYPE } BOOLEAN * 384 = 688 = TT2$TYPE TYPE RECORD { FROM ENVIRONMENT #1 } * 38 TT2$V_PASTHRU FIELD { IN TT2$TYPE } BOOLEAN * 385 = 689 = TTCHAR VAR CHARACTERISTICS_BUFFER { IN PROCEDURE SET_LINE_AST } 368 379 P 380 384 385 386 P 386 TT_CHAN VAR [PSECT($LOCAL), WORD, VOLATILE] SUBRANGE OF INTEGER { IN PROGRAM TEST_FTDRIVER } 67 267 352 375 386 418 495 644 P 651 690 750 766 772 787 789 791 798 890 896 TT_CHARBUFF FIELD UNSIGNED 100 697 = 831 = TT_CHARBUFF PARM CHARACTERISTICS_BUFFER { IN PROCEDURE EXIT_HANDLER } 784 788 A 789 P 789 TT_DEVCHAR VAR [PSECT($LOCAL), VOLATILE] CHARACTERISTICS_BUFFER { IN PROGRAM TEST_FTDRIVER } 68 651 P 651 677 P 678 687 697 A 766 P 766 896 P 896 TT_EFN VAR [PSECT($LOCAL), VOLATILE] UNSIGNED { IN PROGRAM TEST_FTDRIVER } 66 374 386 646 P 651 690 766 789 896 TT_READ CONST 'TT_READ = 2' { IN PROGRAM TEST_FTDRIVER } 31 265 748 TT_READ_EFN VAR [PSECT($LOCAL), VOLATILE] UNSIGNED { IN PROGRAM TEST_FTDRIVER } 69 266 647 P 749 TT_WRITE_AFTER_ECHO CONST 'TT_WRITE_AFTER_ECHO = 4' { IN PROGRAM TEST_FTDRIVER } 31 493 TT_WRITE_AFTER_READ CONST 'TT_WRITE_AFTER_READ = 3' { IN PROGRAM TEST_FTDRIVER } 31 416 TT_WRITE_EFN VAR [PSECT($LOCAL), VOLATILE] UNSIGNED { IN PROGRAM TEST_FTDRIVER } 70 352 417 494 648 P UAND FUNC { BUILTIN } : UNSIGNED * 674 UNSIGNED TYPE TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 25 01 Cross Reference Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) * 28 62 66 70 86 96 97 99 100 USAGE FIELD { IN IO_BUFFER } BUFFER_USES 51 144 145 = 163 = 168 = 242 = 265 = 323 = 416 = 432 = 493 = 703 = 737 = 748 = WRITE PROC { BUILTIN } * 559 583 586 WRITELN PROC { BUILTIN } * 554 592 722 WRITE_LOG_DATA PROC [PSECT($CODE), UNBOUND] { IN PROGRAM TEST_FTDRIVER } 533 866 XOFF CONST ''(19) { IN PROGRAM TEST_FTDRIVER } 21 727 XON CONST ''(17) { IN PROGRAM TEST_FTDRIVER } 21 725 ZERO FUNC { BUILTIN } * 76 82 ENVIRONMENT FILE SUMMARY ------------------------ #1 SYS$COMMON:[SYSLIB]STARLET.PEN;3 #2 SYS$COMMON:[SYSLIB]PASCAL$LIB_ROUTINES.PEN;3 +-----------------------------------------------------------------------+ | KEY TO REFERENCE FLAGS: | | | | * predeclared | | = modified | | A address of | | F forward declared procedure or function | | L label defining reference | | P passed as a parameter, possibly modified or called | | R READ operation done | | W used in a WITH statement | +-----------------------------------------------------------------------+ TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 26 01 Inline Summary Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) { IN PROCEDURE EXIT_HANDLER } $CANCEL <> EXIT_HANDLER at line 787 $QIOW <> EXIT_HANDLER at line 789 $QIOW <> EXIT_HANDLER at line 791 $QIOW <> EXIT_HANDLER at line 798 { IN PROCEDURE WRITE_LOG_DATA } { IN PROCEDURE ALLOCATE_IO_BUFFER } { IN PROCEDURE TERMINAL_OUTPUT_AST } $WAKE <> TERMINAL_OUTPUT_AST at line 332 { IN PROCEDURE FT_READ_AST } $QIO <> FT_READ_AST at line 417 ALLOCATE_IO_BUFFER -> FT_READ_AST at line 429 PTD$READ <> FT_READ_AST at line 433 $WAKE <> FT_READ_AST at line 445 $WAKE <> FT_READ_AST at line 462 $WAKE <> FT_READ_AST at line 470 { IN PROCEDURE FREE_IO_BUFFER } PTD$READ <> FREE_IO_BUFFER at line 169 { IN PROCEDURE FT_ECHO_AST } $QIO <> FT_ECHO_AST at line 494 $WAKE <> FT_ECHO_AST at line 509 FREE_IO_BUFFER -> FT_ECHO_AST at line 516 PTD$READ <> FREE_IO_BUFFER at line 169 { IN PROCEDURE KBD_READ_AST } ALLOCATE_IO_BUFFER -> KBD_READ_AST at line 239 PTD$WRITE <> KBD_READ_AST at line 243 PTD$WRITE <> KBD_READ_AST at line 253 $QIO <> KBD_READ_AST at line 266 $WAKE <> KBD_READ_AST at line 294 { IN PROCEDURE SET_LINE_AST } $QIOW <> SET_LINE_AST at line 374 $QIO <> SET_LINE_AST at line 386 { IN PROCEDURE FLOW_AST } $QIO <> FLOW_AST at line 352 { IN PROCEDURE SUBPROCESS_EXIT_AST } $WAKE <> SUBPROCESS_EXIT_AST at line 618 TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 27 01 Inline Summary Listing 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) { IN FUNCTION INITIALIZATION } $ASSIGN <> INITIALIZATION at line 644 LIB$GET_EF <> INITIALIZATION at line 646 LIB$GET_EF <> INITIALIZATION at line 647 LIB$GET_EF <> INITIALIZATION at line 648 $QIOW <> INITIALIZATION at line 651 PTD$CREATE <> INITIALIZATION at line 675 LIB$GET_EF <> INITIALIZATION at line 685 $QIOW <> INITIALIZATION at line 690 LIB$GETDVI <> INITIALIZATION at line 707 LIB$SPAWN <> INITIALIZATION at line 711 PTD$SET_EVENT_NOTIFICATION <> INITIALIZATION at line 725 PTD$SET_EVENT_NOTIFICATION <> INITIALIZATION at line 727 PTD$SET_EVENT_NOTIFICATION <> INITIALIZATION at line 729 PTD$SET_EVENT_NOTIFICATION <> INITIALIZATION at line 731 ALLOCATE_IO_BUFFER <> INITIALIZATION at line 735 ALLOCATE_IO_BUFFER <> INITIALIZATION at line 736 PTD$READ <> INITIALIZATION at line 738 $QIO <> INITIALIZATION at line 749 PTD$CANCEL <> INITIALIZATION at line 762 $DELPRC <> INITIALIZATION at line 764 $QIOW <> INITIALIZATION at line 766 PTD$DELETE <> INITIALIZATION at line 768 $DASSGN <> INITIALIZATION at line 772 { IN PROGRAM TEST_FTDRIVER } $DCLEXH <> TEST_FTDRIVER at line 833 INITIALIZATION <> TEST_FTDRIVER at line 840 LIB$SIGNAL <> TEST_FTDRIVER at line 840 $SETAST <> TEST_FTDRIVER at line 851 FREE_IO_BUFFER -> TEST_FTDRIVER at line 853 PTD$READ <> FREE_IO_BUFFER at line 169 $SETAST <> TEST_FTDRIVER at line 865 WRITE_LOG_DATA <> TEST_FTDRIVER at line 866 $HIBER <> TEST_FTDRIVER at line 873 $FORCEX <> TEST_FTDRIVER at line 884 $DELPRC <> TEST_FTDRIVER at line 885 PTD$CANCEL <> TEST_FTDRIVER at line 888 $CANCEL <> TEST_FTDRIVER at line 890 PTD$DELETE <> TEST_FTDRIVER at line 892 $QIOW <> TEST_FTDRIVER at line 896 LIB$SIGNAL <> TEST_FTDRIVER at line 900 +---------------------------------------+ | KEY TO REFERENCE FLAGS: | | | | -> expanded into | | <> not expanded into | +---------------------------------------+ TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 28 01 Pascal Compilation Statistics 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) PSECT SUMMARY Name Bytes Attributes $CODE 3785 NOVEC,NOWRT, RD, EXE, SHR, LCL, REL, CON, PIC,ALIGN(2) $LOCAL 11432 NOVEC, WRT, RD,NOEXE,NOSHR, LCL, REL, CON, PIC,ALIGN(9) ENVIRONMENT STATISTICS -------- Symbols -------- File Total Loaded Percent SYS$COMMON:[SYSLIB]STARLET.PEN;3 32078 310 1 SYS$COMMON:[SYSLIB]PASCAL$LIB_ROUTINES.PEN;3 1225 62 5 COMMAND QUALIFIERS PASCAL/LIST/CROSS_REFERENCE/SHOW=(INLINE)/TERMINAL/USAGE/NOCHECK $USERS:[JEREMY.PMDF]FT.PAS;65 /CHECK=(NOBOUNDS,NOCASE_SELECTORS,NODECLARATIONS,NOOVERFLOW,NOPOINTERS,NOSUBRANGE) /DEBUG=(NOSYMBOLS,TRACEBACK) /NODESIGN /SHOW=(DICTIONARY,INCLUDE,INLINE,HEADER,SOURCE,STATISTICS,TABLE_OF_CONTENTS) /OPTIMIZE /STANDARD=NONE /TERMINAL=(FILE_NAME,ROUTINE_NAME,STATISTICS) /USAGE=(UNUSED,UNINITIALIZED,UNCERTAIN) /NOANALYSIS_DATA /NOENVIRONMENT /LIST=$USERS:[JEREMY.PMDF]FT.LIS;64 /OBJECT=$USERS:[JEREMY.PMDF]FT.OBJ;55 /CROSS_REFERENCE /ERROR_LIMIT=30 /NOG_FLOATING /NOMACHINE_CODE /NOOLD_VERSION /WARNINGS COMPILER INTERNAL TIMING Phase Faults CPU Time Elapsed Time Initialization 245 00:00.3 00:01.4 Source Analysis 1159 00:04.8 00:11.8 Source Listing 45 00:01.5 00:02.2 Tree Construction 165 00:00.6 00:01.0 Flow Analysis 12 00:00.3 00:00.4 Value Propagation 0 00:00.1 00:00.1 Profit Analysis 32 00:00.3 00:00.5 Context Analysis 337 00:03.1 00:03.6 Name Packing 7 00:00.1 00:00.1 Code Selection 81 00:00.6 00:00.9 Final 43 00:00.8 00:01.0 TOTAL 2170 00:12.5 00:23.4 COMPILATION STATISTICS CPU Time: 00:12.5 (4316 Lines/Minute) Elapsed Time: 00:23.4 TEST_FTDRIVER 20-Jan-1992 15:37:06 VAX Pascal V4.1-33 Page 29 01 Pascal Compilation Statistics 15-Jan-1992 15:44:01 $USERS:[JEREMY.PMDF]FT.PAS;65 (1) Page Faults: 2170 Pages Used: 3307 Compilation Complete