home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 2
/
crawlyvol2.bin
/
program
/
c
/
itf_src
/
print.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-22
|
5KB
|
266 lines
/*
** File: print.c
**
** (C)opyright 1987-1992 InfoTaskforce.
*/
#include "infocom.h"
/*
** Print Routine Global Variables
**
** Note:
** The variables "p_buff_ptr" and "p_buff_end" are of
** type "byte *" NOT "byte_ptr" - these definitions are
** different for MSDOS Compilers ("byte_ptr" is huge).
*/
byte p_buff_strt[MAX_LINE_LENGTH] ;
byte *p_buff_ptr ;
byte *p_buff_end ;
Void
init_print ()
{
extern header data_head ;
extern int screen_width ;
extern int linecount ;
extern boolean enable_screen ;
extern boolean disable_script ;
extern proc_ptr PrintChar ;
extern boolean windowing_enabled ;
extern word current_window ;
extern boolean use_buffered_io ;
extern word top_screen_line ;
linecount = 0 ;
enable_screen = TRUE ;
disable_script = FALSE ;
PrintChar = print_char ;
p_buff_ptr = p_buff_strt ;
p_buff_end = &p_buff_strt[screen_width - 1] ;
windowing_enabled = FALSE ;
current_window = 0 ;
use_buffered_io = TRUE ;
if ( data_head.z_code_version <= VERSION_3 )
top_screen_line = STD_TOP_SCREEN_LINE ;
else
top_screen_line = PLUS_TOP_SCREEN_LINE ;
}
Void
flush_prt_buff ()
{
extern int linecount ;
print_buffer ( p_buff_ptr ) ;
p_buff_ptr = p_buff_strt ;
linecount = 0 ;
}
Void
print_num ( number )
word number ;
{
extern proc_ptr PrintChar ;
int num ;
if ( number == 0 )
(*PrintChar)( (word)'0' ) ;
else
{
num = (signed_word)number ;
if ( num < 0 )
{
num = -num ;
(*PrintChar)( (word)'-' ) ;
}
PrintNumber ( num ) ;
}
}
Void
PrintNumber ( num )
int num ;
{
extern proc_ptr PrintChar ;
word ch ;
if ( num > 9 )
PrintNumber ( num / 10 ) ;
ch = '0' + ( num % 10 ) ;
(*PrintChar)( ch ) ;
}
Void
std_print2 ( address )
word address ;
{
word page ;
word offset ;
page = STD_PAGE ( address ) ;
offset = STD_OFFSET ( address ) ;
print_coded ( &page,&offset ) ;
}
Void
plus_print2 ( address )
word address ;
{
word page ;
word offset ;
page = PLUS_PAGE ( address ) ;
offset = PLUS_OFFSET ( address ) ;
print_coded ( &page,&offset ) ;
}
Void
print1 ( address )
word address ;
{
word page ;
word offset ;
page = address / BLOCK_SIZE ;
offset = address % BLOCK_SIZE ;
print_coded ( &page,&offset ) ;
}
Void
std_p_obj ( obj_num )
word obj_num ;
{
extern std_object_ptr std_obj_list ;
std_object_ptr obj ;
word address ;
obj = STD_OBJ_ADDR ( obj_num ) ;
address = ((obj -> prop_ptr[0]) << 8) + (obj -> prop_ptr[1]) + 1 ;
print1 ( address ) ;
}
Void
plus_p_obj ( obj_num )
word obj_num ;
{
extern plus_object_ptr plus_obj_list ;
plus_object_ptr obj ;
word address ;
obj = PLUS_OBJ_ADDR ( obj_num ) ;
address = ((obj -> prop_ptr[0]) << 8) + (obj -> prop_ptr[1]) + 1 ;
print1 ( address ) ;
}
Void
wrt ()
{
extern word pc_page ;
extern word pc_offset ;
print_coded ( &pc_page,&pc_offset ) ;
fix_pc () ;
}
Void
writeln ()
{
wrt () ;
new_line () ;
ret_true () ;
}
Void
new_line ()
{
*p_buff_ptr++ = '\n' ;
print_buffer ( p_buff_ptr ) ;
p_buff_ptr = p_buff_strt ;
}
Void
print_char ( ch )
word ch ;
{
extern boolean use_buffered_io ;
extern boolean use_internal_buffer ;
extern byte_ptr internal_io_ptr ;
extern word int_io_buff_length ;
byte *ptr ;
/*
** Note:
** The variable "ptr" is of type "byte *"
** NOT "byte_ptr" - these definitions are
** different for MSDOS Compilers ("byte_ptr" is huge).
*/
if ( use_internal_buffer == TRUE )
{
*internal_io_ptr++ = (byte)ch ;
++int_io_buff_length ;
return ;
}
if ( use_buffered_io == FALSE )
{
out_char ( (char)ch ) ;
return ;
}
if ( p_buff_ptr == p_buff_end )
{
if ( ch == (word)' ' )
{
print_buffer ( p_buff_end ) ;
out_char ( '\n' ) ;
p_buff_ptr = p_buff_strt ;
return ;
}
else
{
--p_buff_ptr ;
while ((*p_buff_ptr != (byte)' ') && (p_buff_ptr != p_buff_strt))
--p_buff_ptr ;
if ( p_buff_ptr == p_buff_strt )
{
print_buffer ( p_buff_end ) ;
out_char ( '\n' ) ;
}
else
{
print_buffer ( ++p_buff_ptr ) ;
out_char ( '\n' ) ;
ptr = p_buff_strt ;
while ( p_buff_ptr != p_buff_end )
*ptr++ = *p_buff_ptr++ ;
p_buff_ptr = ptr ;
}
}
}
*p_buff_ptr++ = (byte)ch ;
}
Void
print_buffer ( buff_end )
byte *buff_end ;
{
byte *ptr = p_buff_strt ;
/*
** Note:
** The parameter "buff_end" and the variable "ptr"
** are of type "byte *" NOT "byte_ptr" - these
** definitions are different for MSDOS Compilers ("byte_ptr" is huge).
*/
while ( ptr != buff_end )
out_char ( (char)*ptr++ ) ;
}