From e15a7d0df0e7a9cb1f582eaab626455ea91ad8c6 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Mon, 10 Sep 2018 20:22:34 -0500 Subject: [PATCH] Media support added! Probably has bugs. --- .gitattributes | 2 + ansiterm.c | 95 +-- ansiterm.h | 8 +- fileio.c | 21 +- gamedata.dat | 3 + gamedata.z5 | Bin 188416 -> 0 bytes ifengine.pro | 1 - input.c | 653 ++++++++++---------- joeyio.c | 175 +++++- jzip.h | 37 -- main.c | 55 +- nowhere.vec | 0 nowhere.vec.source | 29 + osdepend.c | 5 +- property.c | 596 +++++++++---------- quetzal.c | 880 +++++++++++++-------------- text.c | 1421 ++++++++++++++++++++++---------------------- ztypes.h | 16 +- 18 files changed, 2093 insertions(+), 1904 deletions(-) create mode 100644 gamedata.dat delete mode 100644 gamedata.z5 delete mode 100644 jzip.h create mode 100644 nowhere.vec create mode 100644 nowhere.vec.source diff --git a/.gitattributes b/.gitattributes index 115ef26..dce9157 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,4 @@ *.sta filter=lfs diff=lfs merge=lfs -text *.z5 filter=lfs diff=lfs merge=lfs -text +*.z8 filter=lfs diff=lfs merge=lfs -text +*.vec filter=lfs diff=lfs merge=lfs -text diff --git a/ansiterm.c b/ansiterm.c index 52bd580..4d96b32 100644 --- a/ansiterm.c +++ b/ansiterm.c @@ -13,38 +13,38 @@ segment "ansiterm"; typedef struct { - int x; - int y; -} Vector2T; + byte x; + byte y; +} PositionT; -static int _columns = 40; -static int _rows = 25; -static int _xoff = 0; -static int _yoff = 0; -static bool _escFound = false; -static bool _inEscape = false; -static bool _bold = false; -static bool _blink = false; -static bool _reverse = false; -static bool _destructiveBS = false; -static int _foreground = 7; -static int _background = 0; -static int _fColor = 7; -static int _bColor = 0; -static int _number = 0; -static int _parameters[5]; -static int _parameterCount = 0; -static jlStaT *_ansiFont = NULL; -static Vector2T _cursorSave; -static Vector2T _cursor; -static Vector2T *_screenBuffer = NULL; +static byte _columns = 40; +static byte _rows = 25; +static byte _xoff = 0; +static byte _yoff = 0; +static bool _escFound = false; +static bool _inEscape = false; +static bool _bold = false; +static bool _blink = false; +static bool _reverse = false; +static bool _destructiveBS = false; +static byte _foreground = 7; +static byte _background = 0; +static byte _fColor = 7; +static byte _bColor = 0; +static byte _number = 0; +static byte _parameters[5]; +static byte _parameterCount = 0; +static byte _hiddenLines = 0; +static jlStaT *_ansiFont = NULL; +static PositionT _cursorSave; +static PositionT _cursor; +static PositionT *_screenBuffer = NULL; void termDebug(const char *what, ...); bool termParseANSI(char c); void termRenderCharacterAtCursor(byte c); -void termRepaint(void); void termResetSequence(void); void termScrollUp(void); void termUpdateColors(void); @@ -81,13 +81,18 @@ void termDestruciveBackspace(bool dbs) { } -void termGetCursor(int *x, int *y) { +void termGetCursor(byte *x, byte *y) { *x = _cursor.x; *y = _cursor.y; } -void termMoveCursor(int x, int y) { +void termHideTopLines(byte count) { + _hiddenLines = count; +} + + +void termMoveCursor(byte x, byte y) { if (x < 1) { _cursor.x = 1; termDebug("Attempt to position cursor too far left: %d", x); @@ -114,13 +119,13 @@ void termMoveCursor(int x, int y) { bool termParseANSI(char c) { - int x; - int y; - int oldX; - int cx; - int p; - bool updateDisplay = false; - Vector2T cursor = _cursor; + bool x; + bool y; + bool oldX; + bool cx; + int p; + bool updateDisplay = false; + PositionT cursor = _cursor; // Find leading ESC character. if ((c == (char)27) && !_escFound && !_inEscape) { @@ -389,7 +394,7 @@ bool termParseANSI(char c) { default: // Number? if ((c >= '0') && (c <= '9')) { - _number = _number * 10 + (c - '0'); + _number = (byte)(_number * 10 + (c - '0')); } else { termDebug("Unknown sequence: %d", (int)c); termResetSequence(); @@ -489,23 +494,25 @@ void termPrintChar(char c) { void termRenderCharacterAtCursor(byte c) { - int r = (_reverse ? 7 : 0); - int cx = c % 40; - int cy = (c / 40) + r; + byte r = (_reverse ? 7 : 0); + byte cx = c % 40; + byte cy = (c / 40) + r; int i = ((_cursor.y - 1) * _columns) + (_cursor.x - 1); _screenBuffer[i].x = cx; _screenBuffer[i].y = cy; - jlDrawBlit8x8(_ansiFont, cx, cy, _cursor.x - 1 + _xoff, _cursor.y - 1 + _yoff); + if (_cursor.y > _hiddenLines) { + jlDrawBlit8x8(_ansiFont, cx, cy, _cursor.x - 1 + _xoff, _cursor.y - 1 + _yoff); + } } void termRepaint(void) { - int i = 0; + int i = _hiddenLines * _columns; int x; int y; - for (y=0; y<_rows; y++) { + for (y=_hiddenLines; y<_rows; y++) { for (x=0; x<_columns; x++) { - jlDrawBlit8x8(_ansiFont, _screenBuffer[i].x, _screenBuffer[i].y, x, y); + jlDrawBlit8x8(_ansiFont, _screenBuffer[i].x, _screenBuffer[i].y, x + _xoff, y + _yoff); i++; } } @@ -546,7 +553,7 @@ void termScrollUp(void) { } -void termStart(jlStaT *font, int xoff, int yoff, int cols, int rows) { +void termStart(jlStaT *font, byte xoff, byte yoff, byte cols, byte rows) { _ansiFont = font; _xoff = xoff; _yoff = yoff; @@ -556,7 +563,7 @@ void termStart(jlStaT *font, int xoff, int yoff, int cols, int rows) { _cursorSave.y = 1; _cursor.x = 1; _cursor.y = 1; - _screenBuffer = (Vector2T *)jlMalloc(sizeof(Vector2T) * (size_t)(_columns * _rows)); + _screenBuffer = (PositionT *)jlMalloc(sizeof(PositionT) * (size_t)(_columns * _rows)); termClearScreen(); } diff --git a/ansiterm.h b/ansiterm.h index 4519159..7db9d56 100644 --- a/ansiterm.h +++ b/ansiterm.h @@ -5,13 +5,15 @@ void termClearScreen(void); void termDestruciveBackspace(bool dbs); -void termGetCursor(int *x, int *y); -void termMoveCursor(int x, int y); +void termGetCursor(byte *x, byte *y); +void termHideTopLines(byte count); +void termMoveCursor(byte x, byte y); void termPrint(char *string); void termPrintChar(char c); +void termRepaint(void); void termRestoreCursor(void); void termSaveCursor(void); -void termStart(jlStaT *font, int xoff, int yoff, int cols, int rows); +void termStart(jlStaT *font, byte xoff, byte yoff, byte cols, byte rows); void termStop(void); #endif // _H_ANSITERM_ diff --git a/fileio.c b/fileio.c index 7af60ac..8a89fae 100644 --- a/fileio.c +++ b/fileio.c @@ -52,8 +52,8 @@ static FILE *rfp = NULL; /* Record file pointer */ static char gfpbuffer[BUFSIZ]; #endif #endif -static char sfpbuffer[BUFSIZ]; -static char rfpbuffer[BUFSIZ]; +//static char sfpbuffer[BUFSIZ]; +//static char rfpbuffer[BUFSIZ]; char save_name[Z_FILENAME_MAX + Z_PATHNAME_MAX + 1] = "story.sav"; char script_name[Z_FILENAME_MAX + Z_PATHNAME_MAX + 1] = "story.scr"; @@ -123,7 +123,8 @@ void set_names( const char *storyname ) void open_story( const char *storyname ) { - char *path, *p; + char *path = NULL; + char *p = NULL; char tmp[Z_FILENAME_MAX + Z_PATHNAME_MAX + 1]; // if ( !STANDALONE_FLAG ) @@ -297,7 +298,7 @@ void read_page( int page, void *buffer ) #endif { /* Read failed. Are we in the last page? */ - file_size = ( unsigned long ) h_file_size *story_scaler; + file_size = ( unsigned long )(h_file_size *story_scaler); pages = ( unsigned int ) ( ( unsigned long ) file_size / PAGE_SIZE ); offset = ( unsigned int ) ( ( unsigned long ) file_size & PAGE_MASK ); @@ -401,7 +402,7 @@ void z_verify( void ) /* Calculate game file dimensions */ - file_size = ( unsigned long ) h_file_size *story_scaler; + file_size = ( unsigned long )(h_file_size *story_scaler); pages = ( unsigned int ) ( ( unsigned long ) file_size / PAGE_SIZE ); offset = ( unsigned int ) file_size & PAGE_MASK; @@ -410,7 +411,7 @@ void z_verify( void ) for ( i = 0; i <= pages; i++ ) { - read_page( i, buffer ); + read_page( (int)i, buffer ); start = ( i == 0 ) ? 64 : 0; end = ( i == pages ) ? offset : PAGE_SIZE; for ( j = start; j < end; j++ ) @@ -448,7 +449,7 @@ static void get_default_name( char *default_name, zword_t addr ) { addr++; c = get_byte( addr ); - default_name[i] = c; + default_name[i] = (char)c; } default_name[i] = 0; @@ -503,7 +504,7 @@ int z_save( int argc, zword_t table, zword_t bytes, zword_t name ) setbuf( afp, afpbuffer ); #endif - status = fwrite( datap + table, bytes, 1, afp ); + status = (int)fwrite( datap + table, bytes, 1, afp ); fclose( afp ); @@ -591,7 +592,7 @@ int z_restore( int argc, zword_t table, zword_t bytes, zword_t name ) setbuf( afp, afpbuffer ); #endif - status = fread( datap + table, bytes, 1, afp ); + status = (int)fread( datap + table, bytes, 1, afp ); fclose( afp ); @@ -1315,7 +1316,7 @@ int playback_line( int buflen, char *buffer, int *read_size ) { *cp = '\0'; } - *read_size = strlen( buffer ); + *read_size = (int)strlen( buffer ); output_line( buffer ); } diff --git a/gamedata.dat b/gamedata.dat new file mode 100644 index 0000000..8fefff2 --- /dev/null +++ b/gamedata.dat @@ -0,0 +1,3 @@ +IF Engine Test Game +output.z8 +8x8thin.sta diff --git a/gamedata.z5 b/gamedata.z5 deleted file mode 100644 index 474c9d9d73df6c1835974055ddb0f4bd85914023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188416 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'QUw`^Xbq^^vm;m$|P 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 z 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 V4 ) ? cbuf[1] : 0; + cbuf = ( char * ) &datap[argv[0]]; + in_size = ( h_type > V4 ) ? cbuf[1] : 0; - /* Read the line then script and record it */ + /* Read the line then script and record it */ - terminator = get_line( cbuf, argv[2], argv[3] ); - script_line( ( h_type > V4 ) ? &cbuf[2] : &cbuf[1] ); - record_line( ( h_type > V4 ) ? &cbuf[2] : &cbuf[1] ); + terminator = get_line( cbuf, argv[2], argv[3] ); + script_line( ( h_type > V4 ) ? &cbuf[2] : &cbuf[1] ); + record_line( ( h_type > V4 ) ? &cbuf[2] : &cbuf[1] ); - /* Convert new text in line to lowercase */ + /* Convert new text in line to lowercase */ - if ( h_type > V4 ) - { - buffer = &cbuf[2]; - out_size = cbuf[1]; - } - else - { - buffer = &cbuf[1]; - out_size = strlen( buffer ); - } + if ( h_type > V4 ) + { + buffer = &cbuf[2]; + out_size = cbuf[1]; + } + else + { + buffer = &cbuf[1]; + out_size = (int)strlen( buffer ); + } - if ( out_size > in_size ) - for ( i = in_size; i < out_size; i++ ) - buffer[i] = ( char ) tolower( buffer[i] ); + if ( out_size > in_size ) + for ( i = in_size; i < out_size; i++ ) + buffer[i] = ( char ) tolower( buffer[i] ); - /* Tokenise the line, if a token buffer is present */ + /* Tokenise the line, if a token buffer is present */ - if ( argv[1] ) - tokenise_line( argv[0], argv[1], h_words_offset, 0 ); + if ( argv[1] ) + tokenise_line( argv[0], argv[1], h_words_offset, 0 ); - /* Return the line terminator */ + /* Return the line terminator */ - if ( h_type > V4 ) - store_operand( ( zword_t ) terminator ); + if ( h_type > V4 ) + store_operand( ( zword_t ) terminator ); } /* z_sread_aread */ @@ -205,78 +205,78 @@ void z_sread_aread( int argc, zword_t * argv ) int get_line( char *cbuf, zword_t timeout, zword_t action_routine ) { - char *buffer; - int buflen, read_size, status, c; - zword_t arg_list[2]; + char *buffer; + int buflen, read_size, status, c; + zword_t arg_list[2]; - /* Set maximum buffer size to width of screen minus any - * right margin and 1 character for a terminating NULL */ + /* Set maximum buffer size to width of screen minus any + * right margin and 1 character for a terminating NULL */ - buflen = ( screen_cols > 127 ) ? 127 : screen_cols; - buflen -= right_margin + 1; - if ( ( int ) cbuf[0] <= buflen ) - buflen = cbuf[0]; + buflen = ( screen_cols > 127 ) ? 127 : screen_cols; + buflen -= right_margin + 1; + if ( ( int ) cbuf[0] <= buflen ) + buflen = cbuf[0]; - /* Set read size and start of read buffer. The buffer may already be - * primed with some text in V5 games. The Z-code will have already - * displayed the text so we don't have to do that */ + /* Set read size and start of read buffer. The buffer may already be + * primed with some text in V5 games. The Z-code will have already + * displayed the text so we don't have to do that */ - if ( h_type > V4 ) - { - read_size = cbuf[1]; - buffer = &cbuf[2]; - } - else - { - read_size = 0; - buffer = &cbuf[1]; - } + if ( h_type > V4 ) + { + read_size = cbuf[1]; + buffer = &cbuf[2]; + } + else + { + read_size = 0; + buffer = &cbuf[1]; + } - /* Try to read input from command file */ + /* Try to read input from command file */ - c = playback_line( buflen, buffer, &read_size ); + c = playback_line( buflen, buffer, &read_size ); - if ( c == -1 ) - { + if ( c == -1 ) + { - /* Setup the timeout routine argument list */ + /* Setup the timeout routine argument list */ - arg_list[0] = action_routine; - arg_list[1] = 0; /* as per spec.1.0 */ - /* arg_list[1] = timeout/10; */ + arg_list[0] = action_routine; + arg_list[1] = 0; /* as per spec.1.0 */ + /* arg_list[1] = timeout/10; */ - /* Read a line with a timeout. If the input timed out then - * call the timeout action routine. If the return status from the - * timeout routine was 0 then try to read the line again */ + /* Read a line with a timeout. If the input timed out then + * call the timeout action routine. If the return status from the + * timeout routine was 0 then try to read the line again */ - do - { - c = input_line( buflen, buffer, timeout, &read_size ); - status = 0; - } - while ( c == -1 && ( status = z_call( 1, arg_list, ASYNC ) ) == 0 ); + do + { + c = input_line( buflen, buffer, timeout, &read_size ); + status = 0; + } + while ( c == -1 && ( status = z_call( 1, arg_list, ASYNC ) ) == 0 ); - /* Throw away any input if timeout returns success */ + /* Throw away any input if timeout returns success */ - if ( status ) - read_size = 0; + if ( status ) + read_size = 0; - } + } - /* Zero terminate line */ + /* Zero terminate line */ - if ( h_type > V4 ) - { - cbuf[1] = ( char ) read_size; - } - else - { - /* Zero terminate line (V1-4 only) */ - buffer[read_size] = '\0'; - } + if ( h_type > V4 ) + { + cbuf[1] = ( char ) read_size; + } + else + { + /* Zero terminate line (V1-4 only) */ + buffer[read_size] = '\0'; + } - return ( c ); + return ( c ); } /* get_line */ @@ -295,108 +295,109 @@ int get_line( char *cbuf, zword_t timeout, zword_t action_routine ) static void tokenise_line( zword_t char_buf, zword_t token_buf, zword_t dictionary, zword_t flag ) { - int i, count, words, token_length; - long word_index, chop = 0; - int slen; - char *str_end; - char *cbuf, *tbuf, *tp; - const char *cp, *token; - char punctuation[16]; - zword_t word; + int i, count, words, token_length; + long word_index, chop = 0; + int slen; + char *str_end; + char *cbuf, *tbuf, *tp; + const char *cp, *token; + char punctuation[16]; + zword_t word; - /* Initialise character and token buffer pointers */ + /* Initialise character and token buffer pointers */ - cbuf = ( char * ) &datap[char_buf]; - tbuf = ( char * ) &datap[token_buf]; + cbuf = ( char * ) &datap[char_buf]; + tbuf = ( char * ) &datap[token_buf]; - /* Find the string length */ + /* Find the string length */ - if ( h_type > V4 ) - { - slen = ( unsigned char ) ( cbuf[1] ); - str_end = cbuf + 2 + slen; - } - else - { - slen = strlen( cbuf + 1 ); - str_end = cbuf + 1 + slen; - } + if ( h_type > V4 ) + { + slen = ( unsigned char ) ( cbuf[1] ); + str_end = cbuf + 2 + slen; + } + else + { + slen = (int)strlen( cbuf + 1 ); + str_end = cbuf + 1 + slen; + } - /* Initialise word count and pointers */ + /* Initialise word count and pointers */ - words = 0; - cp = ( h_type > V4 ) ? cbuf + 2 : cbuf + 1; - tp = tbuf + 2; + words = 0; + cp = ( h_type > V4 ) ? cbuf + 2 : cbuf + 1; + tp = tbuf + 2; - /* Initialise dictionary */ + /* Initialise dictionary */ - count = get_byte( dictionary++ ); - for ( i = 0; i < count; i++ ) - punctuation[i] = get_byte( dictionary++ ); - punctuation[i] = '\0'; - entry_size = get_byte( dictionary++ ); - dictionary_size = ( ZINT16 ) get_word( dictionary ); - dictionary_offset = dictionary + 2; + count = get_byte( dictionary++ ); + for ( i = 0; i < count; i++ ) + punctuation[i] = (char)get_byte( dictionary++ ); + punctuation[i] = '\0'; + entry_size = get_byte( dictionary++ ); + dictionary_size = ( ZINT16 ) get_word( dictionary ); + dictionary_offset = dictionary + 2; - /* Calculate the binary chop start position */ + /* Calculate the binary chop start position */ - if ( dictionary_size > 0 ) - { - word_index = dictionary_size / 2; - chop = 1; - do - chop *= 2; - while ( word_index /= 2 ); - } + if ( dictionary_size > 0 ) + { + word_index = dictionary_size / 2; + chop = 1; + do + chop *= 2; + while ( word_index /= 2 ); + } - /* Tokenise the line */ + /* Tokenise the line */ - do - { + do + { - /* Skip to next token */ + /* Skip to next token */ - cp = next_token( cp, str_end, &token, &token_length, punctuation ); - if ( token_length ) + cp = next_token( cp, str_end, &token, &token_length, punctuation ); + if ( token_length ) { - /* If still space in token buffer then store word */ + /* If still space in token buffer then store word */ - if ( words <= tbuf[0] ) - { + if ( words <= tbuf[0] ) + { - /* Get the word offset from the dictionary */ + /* Get the word offset from the dictionary */ - word = find_word( token_length, token, chop ); + word = find_word( token_length, token, chop ); - /* Store the dictionary offset, token length and offset */ + /* Store the dictionary offset, token length and offset */ - if ( word || flag == 0 ) - { - tp[0] = ( char ) ( word >> 8 ); - tp[1] = ( char ) ( word & 0xff ); - } - tp[2] = ( char ) token_length; - tp[3] = ( char ) ( token - cbuf ); + if ( word || flag == 0 ) + { + tp[0] = ( char ) ( word >> 8 ); + tp[1] = ( char ) ( word & 0xff ); + } + tp[2] = ( char ) token_length; + tp[3] = ( char ) ( token - cbuf ); - /* Step to next token position and count the word */ + /* Step to next token position and count the word */ - tp += 4; - words++; - } - else - { + tp += 4; + words++; + } + else + { - /* Moan if token buffer space exhausted */ + /* Moan if token buffer space exhausted */ - output_string( "Too many words typed, discarding: " ); - output_line( token ); - } - } - while ( token_length ); + output_string( "Too many words typed, discarding: " ); + output_line( token ); + } + } + } + while ( token_length ); - /* Store word count */ + /* Store word count */ - tbuf[1] = ( char ) words; + tbuf[1] = ( char ) words; } /* tokenise_line */ @@ -415,71 +416,71 @@ static void tokenise_line( zword_t char_buf, zword_t token_buf, zword_t dictiona */ static const char *next_token( const char *s, const char *str_end, const char **token, int *length, - const char *punctuation ) + const char *punctuation ) { - int i; + int i; - /* Set the token length to zero */ + /* Set the token length to zero */ - *length = 0; + *length = 0; - /* Step through the string looking for separators */ + /* Step through the string looking for separators */ - for ( ; s < str_end; s++ ) - { + for ( ; s < str_end; s++ ) + { - /* Look for game specific word separators first */ + /* Look for game specific word separators first */ - for ( i = 0; punctuation[i] && *s != punctuation[i]; i++ ) - ; + for ( i = 0; punctuation[i] && *s != punctuation[i]; i++ ) + ; - /* If a separator is found then return the information */ + /* If a separator is found then return the information */ - if ( punctuation[i] ) - { + if ( punctuation[i] ) + { - /* If length has been set then just return the word position */ + /* If length has been set then just return the word position */ - if ( *length ) - return ( s ); - else - { + if ( *length ) + return ( s ); + else + { - /* End of word, so set length, token pointer and return string */ + /* End of word, so set length, token pointer and return string */ - ( *length )++; - *token = s; - return ( ++s ); - } - } + ( *length )++; + *token = s; + return ( ++s ); + } + } - /* Look for statically defined separators last */ + /* Look for statically defined separators last */ - for ( i = 0; separators[i] && *s != separators[i]; i++ ) - ; + for ( i = 0; separators[i] && *s != separators[i]; i++ ) + ; - /* If a separator is found then return the information */ + /* If a separator is found then return the information */ - if ( separators[i] ) - { + if ( separators[i] ) + { - /* If length has been set then just return the word position */ + /* If length has been set then just return the word position */ - if ( *length ) - return ( ++s ); - } - else - { + if ( *length ) + return ( ++s ); + } + else + { - /* If first token character then remember its position */ + /* If first token character then remember its position */ - if ( *length == 0 ) - *token = s; - ( *length )++; - } - } + if ( *length == 0 ) + *token = s; + ( *length )++; + } + } - return ( s ); + return ( s ); } /* next_token */ @@ -493,89 +494,89 @@ static const char *next_token( const char *s, const char *str_end, const char ** static zword_t find_word( int len, const char *cp, long chop ) { - ZINT16 word[3]; - long word_index, offset, status; + ZINT16 word[3]; + long word_index, offset, status; - /* Don't look up the word if there are no dictionary entries */ + /* Don't look up the word if there are no dictionary entries */ - if ( dictionary_size == 0 ) - return ( 0 ); + if ( dictionary_size == 0 ) + return ( 0 ); - /* Encode target word */ + /* Encode target word */ - encode_text( len, cp, word ); + encode_text( len, cp, word ); - /* Do a binary chop search on the main dictionary, otherwise do - * a linear search */ + /* Do a binary chop search on the main dictionary, otherwise do + * a linear search */ - word_index = chop - 1; + word_index = chop - 1; - if ( dictionary_size > 0 ) - { + if ( dictionary_size > 0 ) + { - /* Binary chop until the word is found */ + /* Binary chop until the word is found */ - while ( chop ) - { + while ( chop ) + { - chop /= 2; + chop /= 2; - /* Calculate dictionary offset */ + /* Calculate dictionary offset */ - if ( word_index > ( dictionary_size - 1 ) ) - word_index = dictionary_size - 1; + if ( word_index > ( dictionary_size - 1 ) ) + word_index = dictionary_size - 1; - offset = dictionary_offset + ( word_index * entry_size ); + offset = dictionary_offset + ( word_index * entry_size ); - /* If word matches then return dictionary offset */ + /* If word matches then return dictionary offset */ - if ( ( status = word[0] - ( ZINT16 ) get_word( offset + 0 ) ) == 0 && - ( status = word[1] - ( ZINT16 ) get_word( offset + 2 ) ) == 0 && - ( h_type < V4 || ( status = word[2] - ( ZINT16 ) get_word( offset + 4 ) ) == 0 ) ) - return ( ( zword_t ) offset ); + if ( ( status = word[0] - ( ZINT16 ) get_word( offset + 0 ) ) == 0 && + ( status = word[1] - ( ZINT16 ) get_word( offset + 2 ) ) == 0 && + ( h_type < V4 || ( status = word[2] - ( ZINT16 ) get_word( offset + 4 ) ) == 0 ) ) + return ( ( zword_t ) offset ); - /* Set next position depending on direction of overshoot */ + /* Set next position depending on direction of overshoot */ - if ( status > 0 ) - { - word_index += chop; + if ( status > 0 ) + { + word_index += chop; - /* Deal with end of dictionary case */ + /* Deal with end of dictionary case */ - if ( word_index >= ( int ) dictionary_size ) - word_index = dictionary_size - 1; - } - else - { - word_index -= chop; + if ( word_index >= ( int ) dictionary_size ) + word_index = dictionary_size - 1; + } + else + { + word_index -= chop; - /* Deal with start of dictionary case */ + /* Deal with start of dictionary case */ - if ( word_index < 0 ) - word_index = 0; - } - } - } - else - { + if ( word_index < 0 ) + word_index = 0; + } + } + } + else + { - for ( word_index = 0; word_index < -dictionary_size; word_index++ ) - { + for ( word_index = 0; word_index < -dictionary_size; word_index++ ) + { - /* Calculate dictionary offset */ + /* Calculate dictionary offset */ - offset = dictionary_offset + ( word_index * entry_size ); + offset = dictionary_offset + ( word_index * entry_size ); - /* If word matches then return dictionary offset */ + /* If word matches then return dictionary offset */ - if ( ( status = word[0] - ( ZINT16 ) get_word( offset + 0 ) ) == 0 && - ( status = word[1] - ( ZINT16 ) get_word( offset + 2 ) ) == 0 && - ( h_type < V4 || ( status = word[2] - ( ZINT16 ) get_word( offset + 4 ) ) == 0 ) ) - return ( ( zword_t ) offset ); - } - } + if ( ( status = word[0] - ( ZINT16 ) get_word( offset + 0 ) ) == 0 && + ( status = word[1] - ( ZINT16 ) get_word( offset + 2 ) ) == 0 && + ( h_type < V4 || ( status = word[2] - ( ZINT16 ) get_word( offset + 4 ) ) == 0 ) ) + return ( ( zword_t ) offset ); + } + } - return ( 0 ); + return ( 0 ); } /* find_word */ @@ -592,15 +593,15 @@ static zword_t find_word( int len, const char *cp, long chop ) void z_tokenise( int argc, zword_t * argv ) { - /* Supply default parameters */ + /* Supply default parameters */ - if ( argc < 4 ) - argv[3] = 0; - if ( argc < 3 ) - argv[2] = h_words_offset; + if ( argc < 4 ) + argv[3] = 0; + if ( argc < 3 ) + argv[2] = h_words_offset; - /* Convert the line to tokens */ + /* Convert the line to tokens */ - tokenise_line( argv[0], argv[1], argv[2], argv[3] ); + tokenise_line( argv[0], argv[1], argv[2], argv[3] ); } /* z_tokenise */ diff --git a/joeyio.c b/joeyio.c index 246b762..2f91836 100644 --- a/joeyio.c +++ b/joeyio.c @@ -3,10 +3,31 @@ #include "ztypes.h" -static int _cursorIndex = 0; -static int _cursorSize = 9; -static unsigned int _cursorTime = 0; -static byte _cursor[] = { 32, 176, 177, 178, 219, 178, 177, 176, 32 }; +#define DISPLAY_MIXED_SIZE 5 +#define COMMAND_BUFFER_SIZE 32 + +typedef enum { + DISPLAY_MODE_TEXT = 0, + DISPLAY_MODE_GRAPHICS, + DISPLAY_MODE_MIXED, + DISPLAY_MODE_LAST +} DModeT; + + +static jlVecT *_vectorImage = NULL; +static jlStaT *_graphicsPage = NULL; +static jlSoundT *_soundEffect = NULL; +static DModeT _displayMode = DISPLAY_MODE_TEXT; +static byte _bufferCount = 0; +static char _buffer[COMMAND_BUFFER_SIZE]; +static bool _inCommand = false; +static byte _cursorIndex = 0; +static byte _cursorSize = 9; +static unsigned int _cursorTime = 0; +static byte _cursor[] = { 32, 176, 177, 178, 219, 178, 177, 176, 32 }; + + +void set_next_display_mode(void); void clear_line(void) { @@ -16,7 +37,7 @@ void clear_line(void) { void clear_screen(void) { termClearScreen(); - termMoveCursor(1, screen_rows); + termMoveCursor(1, (byte)screen_rows); jlDisplayPresent(); } @@ -58,17 +79,106 @@ void delete_status_window(void) { void display_char(int c) { - termPrintChar((char)c); + char command; + char *token; + int x; + int y; + // This also handles processing of embedded media commands: + // {I name x y} - Display Image "name" @ x, y + // {M name} - Play Music "name" + // {S name} - Play Sound "name" + // {Q} - Quiet! + if (_inCommand) { + if ((char) c == '}') { + // Exit command mode. + if (_bufferCount > 0) { + // Did we get a command we understand? + command = (char)toupper(_buffer[0]); + _buffer[_bufferCount] = 0; + (void)strtok(_buffer, " "); + switch (command) { + case 'I': + token = strtok(NULL, " "); + if (jlVecLoad(_vectorImage, token)) { + x = y = 0; + token = strtok(NULL, " "); + if (token != NULL) { + x = atoi(token); + token = strtok(NULL, " "); + if (token != NULL) { + y = atoi(token); + } + } + // Put user into GRAPHICS mode if they aren't. + _displayMode = DISPLAY_MODE_GRAPHICS - 1; + set_next_display_mode(); + // Render the image. + jlVecDisplay(_vectorImage, x, y); + // Save it to the graphics page. + jlStaCreate(_graphicsPage); + } + break; + + case 'M': + token = strtok(NULL, " "); + jlSoundMusicPlay(token); + break; + + case 'S': + token = strtok(NULL, " "); + if (jlSoundLoad(_soundEffect, token)) { + jlSoundPlay(_soundEffect); + } + break; + + case 'Q': + jlSoundMusicStop(); + break; + } + } + // Exit command mode + _bufferCount = 0; + _inCommand = false; + } else { + if (_bufferCount < COMMAND_BUFFER_SIZE - 1) { + // Add character to command buffer. + _buffer[_bufferCount++] = (char)c; + } else { + // Overflowed buffer - exit command mode + _bufferCount = 0; + _inCommand = false; + } + } + } else { + if ((char)c == '{') { + // Switch to embedded command mode. + _inCommand = true; + } else { + // Display game text. + termPrintChar((char)c); + } + } } void get_cursor_position(int *row, int *col) { - termGetCursor(col, row); + byte x; + byte y; + termGetCursor(&x, &y); + *col = (int)x; + *row = (int)y; } void initialize_screen(void) { - // Handled in main + // Also handled in main + + // Create initial empty graphics image. + jlDrawColor(0); + jlDrawClear(); + jlDrawColor(15); + jlDisplayPresent(); + jlStaCreate(_graphicsPage); } @@ -129,8 +239,12 @@ int input_line(int buflen, char *buffer, int timeout, int *read_size) { //***TODO*** Flash border or ding or something } else { if (c == 13) { - scroll_line(); - return c; + if (curr_char_pos == 0) { + set_next_display_mode(); + } else { + scroll_line(); + return c; + } } else { buffer[curr_char_pos++] = (char)c; if (*read_size < curr_char_pos) { @@ -148,12 +262,15 @@ int input_line(int buflen, char *buffer, int timeout, int *read_size) { void move_cursor(int row, int col) { - termMoveCursor(col, row); + termMoveCursor((byte)col, (byte)row); } void reset_screen(void) { - // Handled in main + // Also handled in main + jlStaFree(_graphicsPage); + jlVecFree(_vectorImage); + jlSoundFree(_soundEffect); } @@ -197,3 +314,37 @@ void set_attribute(int attribute) { termPrint("\33[7m"); } } + + +void set_next_display_mode(void) { + + _displayMode++; + if (_displayMode >= DISPLAY_MODE_LAST) { + _displayMode = DISPLAY_MODE_TEXT; + } + + switch (_displayMode) { + case DISPLAY_MODE_TEXT: + printf("Terminal now TEXT\n"); + termHideTopLines(0); + termRepaint(); + break; + + case DISPLAY_MODE_GRAPHICS: + printf("Terminal now GRAPHICS\n"); + termHideTopLines((byte)screen_rows); + jlStaDisplay(_graphicsPage); + break; + + case DISPLAY_MODE_MIXED: + printf("Terminal now MIXED\n"); + termHideTopLines((byte)screen_rows - DISPLAY_MIXED_SIZE); + jlStaDisplay(_graphicsPage); + termRepaint(); + break; + + case DISPLAY_MODE_LAST: + // Won't happen. Silences a warning. + break; + } +} diff --git a/jzip.h b/jzip.h deleted file mode 100644 index ba1497b..0000000 --- a/jzip.h +++ /dev/null @@ -1,37 +0,0 @@ - -/* $Id: jzip.h,v 1.5 2000/10/10 14:46:22 jholder Exp $ - * -------------------------------------------------------------------- - * see doc/License.txt for License Information - * -------------------------------------------------------------------- - * - * File name: $Id: jzip.h,v 1.5 2000/10/10 14:46:22 jholder Exp $ - * - * Description: - * - * Modification history: - * $Log: jzip.h,v $ - * Revision 1.5 2000/10/10 14:46:22 jholder - * Fixed text wrap bug when printing array w/ \r chars in it - * - * Revision 1.4 2000/10/05 17:09:12 jholder - * removed old email address - * - * Revision 1.3 2000/10/04 23:07:57 jholder - * fixed redirect problem with isolatin1 range chars - * - * Revision 1.2 2000/09/18 15:31:44 jholder - * Updated release date for package release - * - * Revision 1.1.1.1 2000/05/10 14:21:34 jholder - * - * imported - * - * - * -------------------------------------------------------------------- - */ - -#define JZIPVER "Jzip V2.1" -#define JZIPRELDATE "Tue, Oct 10 2000" -#define JZIPAUTHOR "John Holder (j-holder@home.com)" -#define JZIPURL "http://jzip.sourceforge.net/" - diff --git a/main.c b/main.c index fa582d4..70d4d55 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,6 @@ #include #include +#include #include "joey.h" @@ -94,30 +95,48 @@ void process_arguments(char *game) { int main(void) { + FILE *in; jlStaT *font = NULL; + char name[40]; + char game[40]; + char text[40]; - jlUtilStartup("IF Engine"); - jlStaLoad(font, "8x8thin.sta"); + in = fopen("gamedata.dat", "rt"); + if (in != NULL) { - termStart(font, 0, 0, 40, 25); - termDestruciveBackspace(false); - termMoveCursor(1, 25); - termSaveCursor(); + fgets(name, 40, in); + fgets(game, 40, in); + fgets(text, 40, in); - process_arguments("gamedata.z5"); - configure(V1, V8); - initialize_screen(); - load_cache(); - z_restart(); - (void)interpret(); - unload_cache(); - close_story(); - close_script(); - reset_screen(); + fclose(in); - termStop(); + name[strlen(name) - 1] = 0; + game[strlen(game) - 1] = 0; + text[strlen(text) - 1] = 0; - jlStaFree(font); + jlUtilStartup(name); + jlStaLoad(font, text); + + termStart(font, 0, 0, 40, 25); + termDestruciveBackspace(false); + termMoveCursor(1, 25); + termSaveCursor(); + + process_arguments(game); + configure(V1, V8); + initialize_screen(); + load_cache(); + z_restart(); + (void)interpret(); + unload_cache(); + close_story(); + close_script(); + reset_screen(); + + termStop(); + + jlStaFree(font); + } jlUtilShutdown(); } diff --git a/nowhere.vec b/nowhere.vec new file mode 100644 index 0000000..e69de29 diff --git a/nowhere.vec.source b/nowhere.vec.source new file mode 100644 index 0000000..817fe39 --- /dev/null +++ b/nowhere.vec.source @@ -0,0 +1,29 @@ +# Reset Palette, Clear Screen to White, Draw in Black +# Hacky Border because we can't hit 319 yet. +R +C 0 +E +C 15 +S 0 0 255 199 +C 0 + +# Horizon +L 0 87 255 87 + +# Sun +L 255 64 248 61 240 61 233 62 228 66 223 72 220 78 220 87 + +# Beach +L 0 101 87 124 126 128 148 133 160 136 168 141 172 146 171 149 169 153 169 158 176 164 188 168 205 171 227 174 255 174 + +# Fill Sun +C 12 +F 242 74 + +# Fill Beach +C 14 +F 105 161 + +# Fill Ocean +C 1 +F 194 106 diff --git a/osdepend.c b/osdepend.c index 0bd0b3f..337444f 100644 --- a/osdepend.c +++ b/osdepend.c @@ -468,7 +468,8 @@ void set_font( int font_type ) void set_colours( zword_t foreground, zword_t background ) { - + (void)foreground; + (void)background; } /* set_colours */ #endif /* !defined MSDOS && !defined OS2 && !defined AMIGA !defined HARD_COLORS && !defined ATARIST */ @@ -519,6 +520,8 @@ void set_colours( zword_t foreground, zword_t background ) int codes_to_text( int c, char *s ) { + (void)c; + (void)s; return 1; } /* codes_to_text */ diff --git a/property.c b/property.c index 6bfcc94..65a84fc 100644 --- a/property.c +++ b/property.c @@ -1,14 +1,14 @@ -/* $Id: property.c,v 1.2 2000/05/25 22:28:56 jholder Exp $ +/* $Id: property.c,v 1.2 2000/05/25 22:28:56 jholder Exp $ * -------------------------------------------------------------------- - * see doc/License.txt for License Information + * see doc/License.txt for License Information * -------------------------------------------------------------------- - * - * File name: $Id: property.c,v 1.2 2000/05/25 22:28:56 jholder Exp $ - * - * Description: - * - * Modification history: + * + * File name: $Id: property.c,v 1.2 2000/05/25 22:28:56 jholder Exp $ + * + * Description: + * + * Modification history: * $Log: property.c,v $ * Revision 1.2 2000/05/25 22:28:56 jholder * changes routine names to reflect zmachine opcode names per spec 1.0 @@ -40,22 +40,22 @@ static zword_t get_property_addr( zword_t obj ) { - zword_t object_addr; - zword_t prop_addr; - zbyte_t size; + zword_t object_addr; + zword_t prop_addr; + zbyte_t size; - /* Calculate the address of the property pointer in the object */ + /* Calculate the address of the property pointer in the object */ - object_addr = get_object_address( obj ); - object_addr += ( h_type <= V3 ) ? O3_PROPERTY_OFFSET : O4_PROPERTY_OFFSET; + object_addr = get_object_address( obj ); + object_addr += ( h_type <= V3 ) ? O3_PROPERTY_OFFSET : O4_PROPERTY_OFFSET; - /* Read the property address */ - prop_addr = get_word( object_addr ); + /* Read the property address */ + prop_addr = get_word( object_addr ); - /* Skip past object description which is an ASCIC of encoded words */ - size = get_byte( prop_addr ); + /* Skip past object description which is an ASCIC of encoded words */ + size = get_byte( prop_addr ); - return prop_addr + ( size * 2 ) + 1; + return prop_addr + ( size * 2 ) + 1; } /* get_property_addr */ @@ -68,29 +68,29 @@ static zword_t get_property_addr( zword_t obj ) static zword_t get_next_property( zword_t prop_addr ) { - zbyte_t value; + zbyte_t value; - /* Load the current property id */ - value = get_byte( prop_addr ); - prop_addr++; + /* Load the current property id */ + value = get_byte( prop_addr ); + prop_addr++; - /* Calculate the length of this property */ + /* Calculate the length of this property */ - if ( h_type <= V3 ) - value >>= 5; - else if ( !( value & 0x80 ) ) - value >>= 6; - else - { - value = get_byte( prop_addr ); - value &= property_size_mask; + if ( h_type <= V3 ) + value >>= 5; + else if ( !( value & 0x80 ) ) + value >>= 6; + else + { + value = get_byte( prop_addr ); + value &= property_size_mask; - if ( value == 0 ) - value = 64; /* spec 1.0 */ - } + if ( value == 0 ) + value = 64; /* spec 1.0 */ + } - /* Address property length to current property pointer */ - return prop_addr + value + 1; + /* Address property length to current property pointer */ + return prop_addr + value + 1; } /* get_next_property */ @@ -106,58 +106,58 @@ static zword_t get_next_property( zword_t prop_addr ) void z_get_prop( zword_t obj, zword_t prop ) { - zword_t prop_addr; - zword_t wprop_val; - zbyte_t bprop_val; - zbyte_t value; + zword_t prop_addr; + zword_t wprop_val; + zbyte_t bprop_val; + zbyte_t value; #ifdef STRICTZ - if ( obj == 0 ) - { - report_strictz_error( STRZERR_GET_PROP, "@get_prop called with object 0" ); - store_operand( 0 ); - return; - } + if ( obj == 0 ) + { + report_strictz_error( STRZERR_GET_PROP, "@get_prop called with object 0" ); + store_operand( 0 ); + return; + } #endif - /* Load address of first property */ - prop_addr = get_property_addr( obj ); + /* Load address of first property */ + prop_addr = get_property_addr( obj ); - /* Scan down the property list */ - for ( ;; ) - { - value = get_byte( prop_addr ); - if ( ( zbyte_t ) ( value & property_mask ) <= ( zbyte_t ) prop ) - break; - prop_addr = get_next_property( prop_addr ); - } + /* Scan down the property list */ + for ( ;; ) + { + value = get_byte( prop_addr ); + if ( ( zbyte_t ) ( value & property_mask ) <= ( zbyte_t ) prop ) + break; + prop_addr = get_next_property( prop_addr ); + } - /* If the property ids match then load the first property */ + /* If the property ids match then load the first property */ - if ( ( zbyte_t ) ( value & property_mask ) == ( zbyte_t ) prop ) /* property found */ - { - prop_addr++; - /* Only load first property if it is a byte sized property */ - if ( h_type <= V3 && !( value & 0xe0 ) || h_type >= V4 && !( value & 0xc0 ) ) - { - bprop_val = get_byte( prop_addr ); - wprop_val = bprop_val; - } - else - { - wprop_val = get_word( prop_addr ); - } - } - else /* property not found */ - { - /* Calculate the address of the default property */ - prop_addr = h_objects_offset + ( ( prop - 1 ) * 2 ); - wprop_val = get_word( prop_addr ); - } + if ( ( zbyte_t ) ( value & property_mask ) == ( zbyte_t ) prop ) /* property found */ + { + prop_addr++; + /* Only load first property if it is a byte sized property */ + if ( (h_type <= V3 && !( value & 0xe0 )) || (h_type >= V4 && !( value & 0xc0 )) ) + { + bprop_val = get_byte( prop_addr ); + wprop_val = bprop_val; + } + else + { + wprop_val = get_word( prop_addr ); + } + } + else /* property not found */ + { + /* Calculate the address of the default property */ + prop_addr = h_objects_offset + ( ( prop - 1 ) * 2 ); + wprop_val = get_word( prop_addr ); + } - /* store the property value */ + /* store the property value */ - store_operand( wprop_val ); + store_operand( wprop_val ); } /* z_get_prop */ @@ -171,48 +171,48 @@ void z_get_prop( zword_t obj, zword_t prop ) void z_put_prop( zword_t obj, zword_t prop, zword_t setvalue ) { - zword_t prop_addr; - zword_t value; + zword_t prop_addr; + zword_t value; #ifdef STRICTZ - if ( obj == 0 ) - { - report_strictz_error( STRZERR_PUT_PROP, "@put_prop called with object 0" ); - return; - } + if ( obj == 0 ) + { + report_strictz_error( STRZERR_PUT_PROP, "@put_prop called with object 0" ); + return; + } #endif - /* Load address of first property */ - prop_addr = get_property_addr( obj ); + /* Load address of first property */ + prop_addr = get_property_addr( obj ); - /* Scan down the property list */ - for ( ;; ) - { - value = get_byte( prop_addr ); - if ( ( value & property_mask ) <= prop ) - break; - prop_addr = get_next_property( prop_addr ); - } + /* Scan down the property list */ + for ( ;; ) + { + value = get_byte( prop_addr ); + if ( ( value & property_mask ) <= prop ) + break; + prop_addr = get_next_property( prop_addr ); + } - /* If the property id was found, store a new value, otherwise complain */ + /* If the property id was found, store a new value, otherwise complain */ - if ( ( value & property_mask ) != prop ) - { - fatal( "store_property(): No such property" ); - } + if ( ( value & property_mask ) != prop ) + { + fatal( "store_property(): No such property" ); + } - /* Determine if this is a byte or word sized property */ + /* Determine if this is a byte or word sized property */ - prop_addr++; + prop_addr++; - if ( h_type <= V3 && !( value & 0xe0 ) || h_type >= V4 && !( value & 0xc0 ) ) - { - set_byte( prop_addr, ( zbyte_t ) setvalue ); - } - else - { - set_word( prop_addr, ( zword_t ) setvalue ); - } + if ( (h_type <= V3 && !( value & 0xe0 )) || (h_type >= V4 && !( value & 0xc0 )) ) + { + set_byte( prop_addr, ( zbyte_t ) setvalue ); + } + else + { + set_word( prop_addr, ( zword_t ) setvalue ); + } } /* z_put_prop */ @@ -226,43 +226,43 @@ void z_put_prop( zword_t obj, zword_t prop, zword_t setvalue ) void z_get_next_prop( zword_t obj, zword_t prop ) { - zword_t prop_addr; - zbyte_t value; + zword_t prop_addr; + zbyte_t value; #ifdef STRICTZ - if ( obj == 0 ) - { - report_strictz_error( STRZERR_GET_NEXT_PROP, "@get_next_prop called with object 0" ); - store_operand( 0 ); - return; - } + if ( obj == 0 ) + { + report_strictz_error( STRZERR_GET_NEXT_PROP, "@get_next_prop called with object 0" ); + store_operand( 0 ); + return; + } #endif - /* Load address of first property */ - prop_addr = get_property_addr( obj ); + /* Load address of first property */ + prop_addr = get_property_addr( obj ); - /* If the property id is non zero then find the next property */ - if ( prop != 0 ) - { - /* Scan down the property list while the target property id is less - * than the property id in the list */ - do - { - value = get_byte( prop_addr ); - prop_addr = get_next_property( prop_addr ); - } - while ( ( zbyte_t ) ( value & property_mask ) > ( zbyte_t ) prop ); + /* If the property id is non zero then find the next property */ + if ( prop != 0 ) + { + /* Scan down the property list while the target property id is less + * than the property id in the list */ + do + { + value = get_byte( prop_addr ); + prop_addr = get_next_property( prop_addr ); + } + while ( ( zbyte_t ) ( value & property_mask ) > ( zbyte_t ) prop ); - /* If the property id wasn't found then complain */ - if ( ( zbyte_t ) ( value & property_mask ) != ( zbyte_t ) prop ) - { - fatal( "load_next_property(): No such property" ); - } - } + /* If the property id wasn't found then complain */ + if ( ( zbyte_t ) ( value & property_mask ) != ( zbyte_t ) prop ) + { + fatal( "load_next_property(): No such property" ); + } + } - /* Return the next property id */ - value = get_byte( prop_addr ); - store_operand( ( zword_t ) ( value & property_mask ) ); + /* Return the next property id */ + value = get_byte( prop_addr ); + store_operand( ( zword_t ) ( value & property_mask ) ); } /* z_get_next_prop */ @@ -275,47 +275,47 @@ void z_get_next_prop( zword_t obj, zword_t prop ) void z_get_prop_addr( zword_t obj, zword_t prop ) { - zword_t prop_addr; - zbyte_t value; + zword_t prop_addr; + zbyte_t value; #ifdef STRICTZ - if ( obj == 0 ) - { - report_strictz_error( STRZERR_GET_PROP_ADDR, "@get_prop_addr called with object 0" ); - store_operand( 0 ); - return; - } + if ( obj == 0 ) + { + report_strictz_error( STRZERR_GET_PROP_ADDR, "@get_prop_addr called with object 0" ); + store_operand( 0 ); + return; + } #endif - /* Load address of first property */ - prop_addr = get_property_addr( obj ); + /* Load address of first property */ + prop_addr = get_property_addr( obj ); - /* Scan down the property list */ - for ( ;; ) - { - value = get_byte( prop_addr ); - if ( ( zbyte_t ) ( value & property_mask ) <= ( zbyte_t ) prop ) - break; - prop_addr = get_next_property( prop_addr ); - } + /* Scan down the property list */ + for ( ;; ) + { + value = get_byte( prop_addr ); + if ( ( zbyte_t ) ( value & property_mask ) <= ( zbyte_t ) prop ) + break; + prop_addr = get_next_property( prop_addr ); + } - /* If the property id was found, calc the prop addr, else return zero */ + /* If the property id was found, calc the prop addr, else return zero */ - if ( ( zbyte_t ) ( value & property_mask ) == ( zbyte_t ) prop ) - { - /* Skip past property id, can be a byte or a word */ + if ( ( zbyte_t ) ( value & property_mask ) == ( zbyte_t ) prop ) + { + /* Skip past property id, can be a byte or a word */ - if ( h_type >= V4 && ( value & 0x80 ) ) - { - prop_addr++; - } - store_operand( ( zword_t ) ( prop_addr + 1 ) ); - } - else - { - /* No property found, just return 0 */ - store_operand( 0 ); - } + if ( h_type >= V4 && ( value & 0x80 ) ) + { + prop_addr++; + } + store_operand( ( zword_t ) ( prop_addr + 1 ) ); + } + else + { + /* No property found, just return 0 */ + store_operand( 0 ); + } } /* z_get_prop_addr */ @@ -328,36 +328,36 @@ void z_get_prop_addr( zword_t obj, zword_t prop ) void z_get_prop_len( zword_t prop_addr ) { - zbyte_t value; + zbyte_t value; - /* This is proper according to an email to the Zmachine list by Graham*/ - if ( prop_addr == 0 ) - { - store_operand( ( zword_t ) 0 ); - return; - } + /* This is proper according to an email to the Zmachine list by Graham*/ + if ( prop_addr == 0 ) + { + store_operand( ( zword_t ) 0 ); + return; + } - /* Back up the property pointer to the property id */ - prop_addr--; - value = get_byte( prop_addr ); + /* Back up the property pointer to the property id */ + prop_addr--; + value = get_byte( prop_addr ); - if ( h_type <= V3 ) - { - value = ( zbyte_t ) ( ( value >> ( zbyte_t ) 5 ) + ( zbyte_t ) 1 ); - } - else if ( !( value & 0x80 ) ) - { - value = ( zbyte_t ) ( ( value >> ( zbyte_t ) 6 ) + ( zbyte_t ) 1 ); - } - else - { - value &= ( zbyte_t ) property_size_mask; + if ( h_type <= V3 ) + { + value = ( zbyte_t ) ( ( value >> ( zbyte_t ) 5 ) + ( zbyte_t ) 1 ); + } + else if ( !( value & 0x80 ) ) + { + value = ( zbyte_t ) ( ( value >> ( zbyte_t ) 6 ) + ( zbyte_t ) 1 ); + } + else + { + value &= ( zbyte_t ) property_size_mask; - if ( value == 0 ) - value = ( zbyte_t ) 64; /* spec 1.0 */ - } + if ( value == 0 ) + value = ( zbyte_t ) 64; /* spec 1.0 */ + } - store_operand( value ); + store_operand( value ); } /* z_get_prop_len */ @@ -372,76 +372,76 @@ void z_get_prop_len( zword_t prop_addr ) void z_scan_table( int argc, zword_t * argv ) { - unsigned long address; - unsigned int i, step; + unsigned long address; + unsigned int i, step; - /* Supply default parameters */ + /* Supply default parameters */ - if ( argc < 4 ) - argv[3] = 0x82; + if ( argc < 4 ) + argv[3] = 0x82; - address = argv[1]; - step = argv[3]; + address = argv[1]; + step = argv[3]; - /* Check size bit (bit 7 of step, 1 = word, 0 = byte) */ + /* Check size bit (bit 7 of step, 1 = word, 0 = byte) */ - if ( step & 0x80 ) - { + if ( step & 0x80 ) + { - step &= 0x7f; + step &= 0x7f; - /* Scan down an array for count words looking for a match */ + /* Scan down an array for count words looking for a match */ - for ( i = 0; i < argv[2]; i++ ) - { + for ( i = 0; i < argv[2]; i++ ) + { - /* If the word was found store its address and jump */ + /* If the word was found store its address and jump */ - if ( read_data_word( &address ) == argv[0] ) - { - store_operand( ( zword_t ) ( address - 2 ) ); - conditional_jump( TRUE ); - return; - } + if ( read_data_word( &address ) == argv[0] ) + { + store_operand( ( zword_t ) ( address - 2 ) ); + conditional_jump( TRUE ); + return; + } - /* Back up address then step by increment */ + /* Back up address then step by increment */ - address = ( address - 2 ) + step; + address = ( address - 2 ) + step; - } + } - } - else - { + } + else + { - step &= 0x7f; + step &= 0x7f; - /* Scan down an array for count bytes looking for a match */ + /* Scan down an array for count bytes looking for a match */ - for ( i = 0; i < argv[2]; i++ ) - { + for ( i = 0; i < argv[2]; i++ ) + { - /* If the byte was found store its address and jump */ + /* If the byte was found store its address and jump */ - if ( ( zword_t ) read_data_byte( &address ) == ( zword_t ) argv[0] ) - { - store_operand( ( zword_t ) ( address - 1 ) ); - conditional_jump( TRUE ); - return; - } + if ( ( zword_t ) read_data_byte( &address ) == ( zword_t ) argv[0] ) + { + store_operand( ( zword_t ) ( address - 1 ) ); + conditional_jump( TRUE ); + return; + } - /* Back up address then step by increment */ + /* Back up address then step by increment */ - address = ( address - 1 ) + step; + address = ( address - 1 ) + step; - } + } - } + } - /* If the data was not found store zero and jump */ + /* If the data was not found store zero and jump */ - store_operand( 0 ); - conditional_jump( FALSE ); + store_operand( 0 ); + conditional_jump( FALSE ); } /* z_scan_table */ @@ -452,41 +452,41 @@ void z_scan_table( int argc, zword_t * argv ) void z_copy_table( zword_t src, zword_t dst, zword_t count ) { - unsigned long address; - unsigned int i; + unsigned long address; + unsigned int i; - /* Catch no-op move case */ + /* Catch no-op move case */ - if ( src == dst || count == 0 ) - return; + if ( src == dst || count == 0 ) + return; - /* If destination address is zero then fill source with zeros */ + /* If destination address is zero then fill source with zeros */ - if ( dst == 0 ) - { - for ( i = 0; i < count; i++ ) - z_storeb( src++, 0, 0 ); - return; - } + if ( dst == 0 ) + { + for ( i = 0; i < count; i++ ) + z_storeb( src++, 0, 0 ); + return; + } - address = src; + address = src; - if ( ( ZINT16 ) count < 0 ) - { - while ( count++ ) - z_storeb( dst++, 0, read_data_byte( &address ) ); - } - else - { - address += ( unsigned long ) count; - dst += count; - while ( count-- ) - { - address--; - z_storeb( --dst, 0, read_data_byte( &address ) ); - address--; - } - } + if ( ( ZINT16 ) count < 0 ) + { + while ( count++ ) + z_storeb( dst++, 0, read_data_byte( &address ) ); + } + else + { + address += ( unsigned long ) count; + dst += count; + while ( count-- ) + { + address--; + z_storeb( --dst, 0, read_data_byte( &address ) ); + address--; + } + } } /* z_copy_table */ @@ -499,15 +499,15 @@ void z_copy_table( zword_t src, zword_t dst, zword_t count ) void z_loadw( zword_t addr, zword_t offset ) { - unsigned long address; + unsigned long address; - /* Calculate word array index address */ + /* Calculate word array index address */ - address = addr + ( offset * 2 ); + address = addr + ( offset * 2 ); - /* Store the byte */ + /* Store the byte */ - store_operand( read_data_word( &address ) ); + store_operand( read_data_word( &address ) ); } /* z_loadw */ @@ -520,15 +520,15 @@ void z_loadw( zword_t addr, zword_t offset ) void z_loadb( zword_t addr, zword_t offset ) { - unsigned long address; + unsigned long address; - /* Calculate byte array index address */ + /* Calculate byte array index address */ - address = addr + offset; + address = addr + offset; - /* Load the byte */ + /* Load the byte */ - store_operand( read_data_byte( &address ) ); + store_operand( read_data_byte( &address ) ); } /* z_loadb */ @@ -542,18 +542,18 @@ void z_loadb( zword_t addr, zword_t offset ) void z_storew( zword_t addr, zword_t offset, zword_t value ) { - /* Calculate word array index address */ + /* Calculate word array index address */ - addr += offset * 2; + addr += offset * 2; - /* Check we are not writing outside of the writeable data area */ + /* Check we are not writing outside of the writeable data area */ - if ( addr > data_size ) - fatal( "z_storew(): Attempted write outside of data area" ); + if ( addr > data_size ) + fatal( "z_storew(): Attempted write outside of data area" ); - /* Store the word */ + /* Store the word */ - set_word( addr, value ); + set_word( addr, value ); } /* z_storew */ @@ -567,17 +567,17 @@ void z_storew( zword_t addr, zword_t offset, zword_t value ) void z_storeb( zword_t addr, zword_t offset, zword_t value ) { - /* Calculate byte array index address */ + /* Calculate byte array index address */ - addr += offset; + addr += offset; - /* Check we are not writing outside of the writeable data area */ + /* Check we are not writing outside of the writeable data area */ - if ( addr > data_size ) - fatal( "z_storeb(): Attempted write outside of data area" ); + if ( addr > data_size ) + fatal( "z_storeb(): Attempted write outside of data area" ); - /* Store the byte */ + /* Store the byte */ - set_byte( addr, value ); + set_byte( addr, value ); } /* z_storeb */ diff --git a/quetzal.c b/quetzal.c index 291caf3..5abe208 100644 --- a/quetzal.c +++ b/quetzal.c @@ -1,14 +1,14 @@ -/* $Id: quetzal.c,v 1.3 2000/07/05 15:20:34 jholder Exp $ +/* $Id: quetzal.c,v 1.3 2000/07/05 15:20:34 jholder Exp $ * -------------------------------------------------------------------- - * see doc/License.txt for License Information + * see doc/License.txt for License Information * -------------------------------------------------------------------- - * - * File name: $Id: quetzal.c,v 1.3 2000/07/05 15:20:34 jholder Exp $ - * - * Description: - * - * Modification history: + * + * File name: $Id: quetzal.c,v 1.3 2000/07/05 15:20:34 jholder Exp $ + * + * Description: + * + * Modification history: * $Log: quetzal.c,v $ * Revision 1.3 2000/07/05 15:20:34 jholder * Updated code to remove warnings. @@ -59,17 +59,17 @@ typedef unsigned long ul_t; #define ID_ANNO 0x414e4e4f /* macros to write QUETZAL files */ -#define write_byte(fp,b) (put_c ((unsigned)(b),fp) != EOF) +#define write_byte(fp,b) (put_c ((unsigned)(b),fp) != EOF) #define write_bytx(fp,b) write_byte(fp,(b) & 0xFF) #define write_word(fp,w) \ - (write_bytx(fp,(w)>> 8) && write_bytx(fp,(w))) + (write_bytx(fp,(w)>> 8) && write_bytx(fp,(w))) #define write_long(fp,l) \ - (write_bytx(fp,(ul_t)(l)>>24) && write_bytx(fp,(ul_t)(l)>>16) && \ - write_bytx(fp,(ul_t)(l)>> 8) && write_bytx(fp,(ul_t)(l))) + (write_bytx(fp,(ul_t)(l)>>24) && write_bytx(fp,(ul_t)(l)>>16) && \ + write_bytx(fp,(ul_t)(l)>> 8) && write_bytx(fp,(ul_t)(l))) #define write_chnk(fp,id,len) \ - (write_long(fp,id) && write_long(fp,len)) + (write_long(fp,id) && write_long(fp,len)) #define write_run(fp,run) \ - (write_byte(fp,0) && write_byte(fp,(run))) + (write_byte(fp,0) && write_byte(fp,(run))) /* save_quetzal * @@ -82,160 +82,160 @@ int save_quetzal( FILE * sfp, gzFile * gfp ) int save_quetzal( FILE * sfp, FILE * gfp ) #endif { - ul_t ifzslen = 0, cmemlen = 0, stkslen = 0, tmp_pc; - int c; - zword_t i, j, n, init_fp, tmp_fp, nstk, nvars, args; - zword_t frames[STACK_SIZE / 4 + 1]; - zbyte_t var; - long cmempos, stkspos; + ul_t ifzslen = 0, cmemlen = 0, stkslen = 0, tmp_pc; + int c; + zword_t i, j, n, init_fp, tmp_fp, nstk, nvars, args; + zword_t frames[STACK_SIZE / 4 + 1]; + zbyte_t var; + long cmempos, stkspos; - /* write IFZS header */ - if ( !write_chnk( sfp, ID_FORM, 0 ) ) - return FALSE; - if ( !write_long( sfp, ID_IFZS ) ) - return FALSE; + /* write IFZS header */ + if ( !write_chnk( sfp, ID_FORM, 0 ) ) + return FALSE; + if ( !write_long( sfp, ID_IFZS ) ) + return FALSE; - /* write IFhd chunk */ - if ( !write_chnk( sfp, ID_IFhd, 13 ) ) - return FALSE; - if ( !write_word( sfp, h_version ) ) - return FALSE; - for ( i = 0; i < 6; ++i ) - if ( !write_byte( sfp, get_byte( H_RELEASE_DATE + i ) ) ) - return FALSE; - if ( !write_word( sfp, h_checksum ) ) - return FALSE; - if ( !write_long( sfp, ( ( ul_t ) pc ) << 8 ) ) /* includes pad byte */ - return FALSE; + /* write IFhd chunk */ + if ( !write_chnk( sfp, ID_IFhd, 13 ) ) + return FALSE; + if ( !write_word( sfp, h_version ) ) + return FALSE; + for ( i = 0; i < 6; ++i ) + if ( !write_byte( sfp, get_byte( H_RELEASE_DATE + i ) ) ) + return FALSE; + if ( !write_word( sfp, h_checksum ) ) + return FALSE; + if ( !write_long( sfp, ( ( ul_t ) pc ) << 8 ) ) /* includes pad byte */ + return FALSE; - /* write CMem chunk */ - /* j is current run length */ - if ( ( cmempos = ftell( sfp ) ) < 0 ) - return FALSE; - if ( !write_chnk( sfp, ID_CMem, 0 ) ) - return FALSE; - jz_rewind( gfp ); - for ( i = 0, j = 0, cmemlen = 0; i < h_restart_size; ++i ) - { - if ( ( c = jz_getc( gfp ) ) == EOF ) - return FALSE; - c ^= get_byte( i ); - if ( c == 0 ) - ++j; - else - { - /* write any run there may be */ - if ( j > 0 ) - { - for ( ; j > 0x100; j -= 0x100 ) - { - if ( !write_run( sfp, 0xFF ) ) - return FALSE; - cmemlen += 2; - } - if ( !write_run( sfp, j - 1 ) ) - return FALSE; - cmemlen += 2; - j = 0; - } - /* write this byte */ - if ( !write_byte( sfp, c ) ) - return FALSE; - ++cmemlen; - } - } - /* there may be a run here, which we ignore */ - if ( cmemlen & 1 ) /* chunk length must be even */ - if ( !write_byte( sfp, 0 ) ) - return FALSE; + /* write CMem chunk */ + /* j is current run length */ + if ( ( cmempos = ftell( sfp ) ) < 0 ) + return FALSE; + if ( !write_chnk( sfp, ID_CMem, 0 ) ) + return FALSE; + jz_rewind( gfp ); + for ( i = 0, j = 0, cmemlen = 0; i < h_restart_size; ++i ) + { + if ( ( c = jz_getc( gfp ) ) == EOF ) + return FALSE; + c ^= get_byte( i ); + if ( c == 0 ) + ++j; + else + { + /* write any run there may be */ + if ( j > 0 ) + { + for ( ; j > 0x100; j -= 0x100 ) + { + if ( !write_run( sfp, 0xFF ) ) + return FALSE; + cmemlen += 2; + } + if ( !write_run( sfp, j - 1 ) ) + return FALSE; + cmemlen += 2; + j = 0; + } + /* write this byte */ + if ( !write_byte( sfp, c ) ) + return FALSE; + ++cmemlen; + } + } + /* there may be a run here, which we ignore */ + if ( cmemlen & 1 ) /* chunk length must be even */ + if ( !write_byte( sfp, 0 ) ) + return FALSE; - /* write Stks chunk */ - if ( ( stkspos = ftell( sfp ) ) < 0 ) - return FALSE; - if ( !write_chnk( sfp, ID_Stks, 0 ) ) - return FALSE; + /* write Stks chunk */ + if ( ( stkspos = ftell( sfp ) ) < 0 ) + return FALSE; + if ( !write_chnk( sfp, ID_Stks, 0 ) ) + return FALSE; - /* frames is a list of FPs, most recent first */ - frames[0] = sp - 5; /* what FP would be if we did a call now */ - for ( init_fp = fp, n = 0; init_fp <= STACK_SIZE - 5; init_fp = stack[init_fp + 2] ) - frames[++n] = init_fp; - init_fp = frames[n] + 4; + /* frames is a list of FPs, most recent first */ + frames[0] = sp - 5; /* what FP would be if we did a call now */ + for ( init_fp = fp, n = 0; init_fp <= STACK_SIZE - 5; init_fp = stack[init_fp + 2] ) + frames[++n] = init_fp; + init_fp = frames[n] + 4; - if ( h_type != 6 ) - { /* write a dummy frame for stack used before first call */ - for ( i = 0; i < 6; ++i ) - if ( !write_byte( sfp, 0 ) ) - return FALSE; - nstk = STACK_SIZE - 1 - init_fp; - if ( !write_word( sfp, nstk ) ) - return FALSE; - for ( i = STACK_SIZE - 1; i > init_fp; --i ) - if ( !write_word( sfp, stack[i] ) ) - return FALSE; - stkslen = 8 + 2 * nstk; - } - for ( i = n; i > 0; --i ) - { - /* write out one stack frame. - * - * tmp_fp : FP when this frame was current - * tmp_pc : PC on return from this frame, plus 000pvvvv - * nvars : number of local vars for this frame - * args : argument mask for this frame - * nstk : words of evaluation stack used for this frame - * var : variable to store result - */ - tmp_fp = frames[i]; - nvars = ( stack[tmp_fp + 1] & VARS_MASK ) >> VAR_SHIFT; - args = stack[tmp_fp + 1] & ARGS_MASK; - nstk = tmp_fp - frames[i - 1] - nvars - 4; - tmp_pc = stack[tmp_fp + 3] + ( ul_t ) stack[tmp_fp + 4] * PAGE_SIZE; - switch ( stack[tmp_fp + 1] & TYPE_MASK ) - { - case FUNCTION: - var = read_data_byte( &tmp_pc ); /* also increments tmp_pc */ - tmp_pc = ( tmp_pc << 8 ) | nvars; - break; - case PROCEDURE: - var = 0; - tmp_pc = ( tmp_pc << 8 ) | 0x10 | nvars; /* set procedure flag */ - break; - /* case ASYNC: */ - default: - output_line( "Illegal Z-machine operation: can't save while in interrupt." ); - return FALSE; - } - if ( args != 0 ) - args = ( 1 << args ) - 1; /* make args into bitmap */ - if ( !write_long( sfp, tmp_pc ) ) - return FALSE; - if ( !write_byte( sfp, var ) ) - return FALSE; - if ( !write_byte( sfp, args ) ) - return FALSE; - if ( !write_word( sfp, nstk ) ) - return FALSE; - for ( j = 0; j < nvars + nstk; ++j, --tmp_fp ) - if ( !write_word( sfp, stack[tmp_fp] ) ) - return FALSE; - stkslen += 8 + 2 * ( nvars + nstk ); - } + if ( h_type != 6 ) + { /* write a dummy frame for stack used before first call */ + for ( i = 0; i < 6; ++i ) + if ( !write_byte( sfp, 0 ) ) + return FALSE; + nstk = STACK_SIZE - 1 - init_fp; + if ( !write_word( sfp, nstk ) ) + return FALSE; + for ( i = STACK_SIZE - 1; i > init_fp; --i ) + if ( !write_word( sfp, stack[i] ) ) + return FALSE; + stkslen = 8 + 2 * nstk; + } + for ( i = n; i > 0; --i ) + { + /* write out one stack frame. + * + * tmp_fp : FP when this frame was current + * tmp_pc : PC on return from this frame, plus 000pvvvv + * nvars : number of local vars for this frame + * args : argument mask for this frame + * nstk : words of evaluation stack used for this frame + * var : variable to store result + */ + tmp_fp = frames[i]; + nvars = ( stack[tmp_fp + 1] & VARS_MASK ) >> VAR_SHIFT; + args = stack[tmp_fp + 1] & ARGS_MASK; + nstk = tmp_fp - frames[i - 1] - nvars - 4; + tmp_pc = stack[tmp_fp + 3] + ( ul_t ) stack[tmp_fp + 4] * PAGE_SIZE; + switch ( stack[tmp_fp + 1] & TYPE_MASK ) + { + case FUNCTION: + var = read_data_byte( &tmp_pc ); /* also increments tmp_pc */ + tmp_pc = ( tmp_pc << 8 ) | nvars; + break; + case PROCEDURE: + var = 0; + tmp_pc = ( tmp_pc << 8 ) | 0x10 | nvars; /* set procedure flag */ + break; + /* case ASYNC: */ + default: + output_line( "Illegal Z-machine operation: can't save while in interrupt." ); + return FALSE; + } + if ( args != 0 ) + args = ( 1 << args ) - 1; /* make args into bitmap */ + if ( !write_long( sfp, tmp_pc ) ) + return FALSE; + if ( !write_byte( sfp, var ) ) + return FALSE; + if ( !write_byte( sfp, args ) ) + return FALSE; + if ( !write_word( sfp, nstk ) ) + return FALSE; + for ( j = 0; j < nvars + nstk; ++j, --tmp_fp ) + if ( !write_word( sfp, stack[tmp_fp] ) ) + return FALSE; + stkslen += 8 + 2 * ( nvars + nstk ); + } - /* fill in lengths for variable-sized chunks */ - ifzslen = 3 * 8 + 4 + 14 + cmemlen + stkslen; - if ( cmemlen & 1 ) - ++ifzslen; - ( void ) fseek( sfp, ( long ) 4, SEEK_SET ); - if ( !write_long( sfp, ifzslen ) ) - return FALSE; - ( void ) fseek( sfp, cmempos + 4, SEEK_SET ); - if ( !write_long( sfp, cmemlen ) ) - return FALSE; - ( void ) fseek( sfp, stkspos + 4, SEEK_SET ); - if ( !write_long( sfp, stkslen ) ) - return FALSE; + /* fill in lengths for variable-sized chunks */ + ifzslen = 3 * 8 + 4 + 14 + cmemlen + stkslen; + if ( cmemlen & 1 ) + ++ifzslen; + ( void ) fseek( sfp, ( long ) 4, SEEK_SET ); + if ( !write_long( sfp, ifzslen ) ) + return FALSE; + ( void ) fseek( sfp, cmempos + 4, SEEK_SET ); + if ( !write_long( sfp, cmemlen ) ) + return FALSE; + ( void ) fseek( sfp, stkspos + 4, SEEK_SET ); + if ( !write_long( sfp, stkslen ) ) + return FALSE; - return TRUE; + return TRUE; } /* end save_quetzal */ @@ -247,14 +247,14 @@ int save_quetzal( FILE * sfp, FILE * gfp ) static int read_word( FILE * fp, zword_t * result ) { - int a, b; + int a, b; - if ( ( a = get_c( fp ) ) == EOF ) - return FALSE; - if ( ( b = get_c( fp ) ) == EOF ) - return FALSE; - *result = ( ( zword_t ) a << 8 ) | b; - return TRUE; + if ( ( a = get_c( fp ) ) == EOF ) + return FALSE; + if ( ( b = get_c( fp ) ) == EOF ) + return FALSE; + *result = ( ( zword_t ) a << 8 ) | b; + return TRUE; } /* read_long @@ -264,21 +264,21 @@ static int read_word( FILE * fp, zword_t * result ) static int read_long( FILE * fp, ul_t * result ) { - int a, b, c, d; + int a, b, c, d; - if ( ( a = get_c( fp ) ) == EOF ) - return FALSE; - if ( ( b = get_c( fp ) ) == EOF ) - return FALSE; - if ( ( c = get_c( fp ) ) == EOF ) - return FALSE; - if ( ( d = get_c( fp ) ) == EOF ) - return FALSE; - *result = ( ( ul_t ) a << 24 ) | ( ( ul_t ) b << 16 ) | ( ( ul_t ) c << 8 ) | d; + if ( ( a = get_c( fp ) ) == EOF ) + return FALSE; + if ( ( b = get_c( fp ) ) == EOF ) + return FALSE; + if ( ( c = get_c( fp ) ) == EOF ) + return FALSE; + if ( ( d = get_c( fp ) ) == EOF ) + return FALSE; + *result = ( ( ul_t ) a << 24 ) | ( ( ul_t ) b << 16 ) | ( ( ul_t ) c << 8 ) | d; #ifdef QDEBUG - printf( "%c%c%c%c", a, b, c, d ); + printf( "%c%c%c%c", a, b, c, d ); #endif - return TRUE; + return TRUE; } /* restore_quetzal @@ -299,274 +299,274 @@ int restore_quetzal( FILE * sfp, gzFile * gfp ) int restore_quetzal( FILE * sfp, FILE * gfp ) #endif { - ul_t ifzslen, currlen, tmpl, skip = 0; - zword_t i, tmpw; - zbyte_t progress = GOT_NONE; - int x, y; + ul_t ifzslen, currlen, tmpl, skip = 0; + zword_t i, tmpw; + zbyte_t progress = GOT_NONE; + int x, y; - /* check for IFZS file */ - if ( !read_long( sfp, &tmpl ) || !read_long( sfp, &ifzslen ) ) - return FALSE; - if ( !read_long( sfp, &currlen ) ) - return FALSE; - if ( tmpl != ID_FORM || currlen != ID_IFZS ) - { - output_line( "This is not a saved game file!" ); - return FALSE; - } - if ( ( ifzslen & 1 ) || ifzslen < 4 ) - return FALSE; - ifzslen -= 4; + /* check for IFZS file */ + if ( !read_long( sfp, &tmpl ) || !read_long( sfp, &ifzslen ) ) + return FALSE; + if ( !read_long( sfp, &currlen ) ) + return FALSE; + if ( tmpl != ID_FORM || currlen != ID_IFZS ) + { + output_line( "This is not a saved game file!" ); + return FALSE; + } + if ( ( ifzslen & 1 ) || ifzslen < 4 ) + return FALSE; + ifzslen -= 4; - /* read a chunk and process it */ - while ( ifzslen > 0 ) - { - /* read chunk header */ - if ( ifzslen < 8 ) - return FALSE; - if ( !read_long( sfp, &tmpl ) || !read_long( sfp, &currlen ) ) - return FALSE; - ifzslen -= 8; + /* read a chunk and process it */ + while ( ifzslen > 0 ) + { + /* read chunk header */ + if ( ifzslen < 8 ) + return FALSE; + if ( !read_long( sfp, &tmpl ) || !read_long( sfp, &currlen ) ) + return FALSE; + ifzslen -= 8; - /* body of chunk */ - if ( ifzslen < currlen ) - return FALSE; - skip = currlen & 1; - ifzslen -= currlen + skip; - switch ( tmpl ) - { - case ID_IFhd: - if ( progress & GOT_HEADER ) - { - output_line( "Save file has two IFhd chunks!" ); - return FALSE; - } - progress |= GOT_HEADER; - if ( currlen < 13 || !read_word( sfp, &i ) ) - return FALSE; - if ( i != h_version ) - progress = GOT_ERROR; - for ( i = H_RELEASE_DATE; i < H_RELEASE_DATE + 6; ++i ) - { - if ( ( x = get_c( sfp ) ) == EOF ) - return FALSE; - if ( x != ( int ) get_byte( i ) ) - progress = GOT_ERROR; - } - if ( !read_word( sfp, &i ) ) - return FALSE; - if ( i != h_checksum ) - progress = GOT_ERROR; - if ( progress == GOT_ERROR ) - { - output_line( "File was not saved from this story!" ); - return FALSE; - } - if ( ( x = get_c( sfp ) ) == EOF ) - return FALSE; - pc = ( ul_t ) x << 16; - if ( ( x = get_c( sfp ) ) == EOF ) - return FALSE; - pc |= ( ul_t ) x << 8; - if ( ( x = get_c( sfp ) ) == EOF ) - return FALSE; - pc |= ( ul_t ) x; - for ( i = 13; ( ul_t ) i < currlen; ++i ) - ( void ) get_c( sfp ); /* skip rest of chunk */ - break; - case ID_Stks: - if ( progress & GOT_STACK ) - { - output_line( "File contains two stack chunks!" ); - break; - } - progress |= GOT_STACK; - sp = STACK_SIZE; - if ( h_type != 6 ) - { - /* dummy stack frame for stack used before call */ - if ( currlen < 8 ) - return FALSE; - for ( i = 0; i < 6; ++i ) - if ( get_c( sfp ) != 0 ) - return FALSE; - if ( !read_word( sfp, &tmpw ) ) - return FALSE; - currlen -= 8; - if ( currlen < (unsigned long)(tmpw * 2) ) - return FALSE; - for ( i = 0; i < tmpw; ++i ) - if ( !read_word( sfp, stack + ( --sp ) ) ) - return FALSE; - currlen -= tmpw * 2; - } - for ( fp = STACK_SIZE - 1, frame_count = 0; currlen > 0; currlen -= 8 ) - { - if ( currlen < 8 ) - return FALSE; - if ( sp < 4 ) - { - output_line( "error: this save-file has too much stack, and I can't cope." ); - return FALSE; - } - /* read PC, procedure flag, and arg count */ - if ( !read_long( sfp, &tmpl ) ) - return FALSE; - y = ( zword_t ) tmpl & 0x0F; - tmpw = y << VAR_SHIFT; /* number of variables */ - /* read result variable */ - if ( ( x = get_c( sfp ) ) == EOF ) - return FALSE; + /* body of chunk */ + if ( ifzslen < currlen ) + return FALSE; + skip = currlen & 1; + ifzslen -= currlen + skip; + switch ( tmpl ) + { + case ID_IFhd: + if ( progress & GOT_HEADER ) + { + output_line( "Save file has two IFhd chunks!" ); + return FALSE; + } + progress |= GOT_HEADER; + if ( currlen < 13 || !read_word( sfp, &i ) ) + return FALSE; + if ( i != h_version ) + progress = GOT_ERROR; + for ( i = H_RELEASE_DATE; i < H_RELEASE_DATE + 6; ++i ) + { + if ( ( x = get_c( sfp ) ) == EOF ) + return FALSE; + if ( x != ( int ) get_byte( i ) ) + progress = GOT_ERROR; + } + if ( !read_word( sfp, &i ) ) + return FALSE; + if ( i != h_checksum ) + progress = GOT_ERROR; + if ( progress == GOT_ERROR ) + { + output_line( "File was not saved from this story!" ); + return FALSE; + } + if ( ( x = get_c( sfp ) ) == EOF ) + return FALSE; + pc = ( ul_t ) x << 16; + if ( ( x = get_c( sfp ) ) == EOF ) + return FALSE; + pc |= ( ul_t ) x << 8; + if ( ( x = get_c( sfp ) ) == EOF ) + return FALSE; + pc |= ( ul_t ) x; + for ( i = 13; ( ul_t ) i < currlen; ++i ) + ( void ) get_c( sfp ); /* skip rest of chunk */ + break; + case ID_Stks: + if ( progress & GOT_STACK ) + { + output_line( "File contains two stack chunks!" ); + break; + } + progress |= GOT_STACK; + sp = STACK_SIZE; + if ( h_type != 6 ) + { + /* dummy stack frame for stack used before call */ + if ( currlen < 8 ) + return FALSE; + for ( i = 0; i < 6; ++i ) + if ( get_c( sfp ) != 0 ) + return FALSE; + if ( !read_word( sfp, &tmpw ) ) + return FALSE; + currlen -= 8; + if ( currlen < (unsigned long)(tmpw * 2) ) + return FALSE; + for ( i = 0; i < tmpw; ++i ) + if ( !read_word( sfp, stack + ( --sp ) ) ) + return FALSE; + currlen -= tmpw * 2; + } + for ( fp = STACK_SIZE - 1, frame_count = 0; currlen > 0; currlen -= 8 ) + { + if ( currlen < 8 ) + return FALSE; + if ( sp < 4 ) + { + output_line( "error: this save-file has too much stack, and I can't cope." ); + return FALSE; + } + /* read PC, procedure flag, and arg count */ + if ( !read_long( sfp, &tmpl ) ) + return FALSE; + y = ( zword_t ) tmpl & 0x0F; + tmpw = (zword_t)(y << VAR_SHIFT); /* number of variables */ + /* read result variable */ + if ( ( x = get_c( sfp ) ) == EOF ) + return FALSE; - if ( tmpl & 0x10 ) - { - tmpw |= PROCEDURE; - tmpl >>= 8; - } - else - { - tmpw |= FUNCTION; - tmpl >>= 8; - --tmpl; - /* sanity check on result variable */ - if ( read_data_byte( &tmpl ) != ( zbyte_t ) x ) - { - output_line( "error: wrong variable number on stack (wrong story file?)." ); - return FALSE; - } - --tmpl; /* read_data_byte increments it */ - } - stack[--sp] = ( zword_t ) ( tmpl / PAGE_SIZE ); - stack[--sp] = ( zword_t ) ( tmpl % PAGE_SIZE ); - stack[--sp] = fp; + if ( tmpl & 0x10 ) + { + tmpw |= PROCEDURE; + tmpl >>= 8; + } + else + { + tmpw |= FUNCTION; + tmpl >>= 8; + --tmpl; + /* sanity check on result variable */ + if ( read_data_byte( &tmpl ) != ( zbyte_t ) x ) + { + output_line( "error: wrong variable number on stack (wrong story file?)." ); + return FALSE; + } + --tmpl; /* read_data_byte increments it */ + } + stack[--sp] = ( zword_t ) ( tmpl / PAGE_SIZE ); + stack[--sp] = ( zword_t ) ( tmpl % PAGE_SIZE ); + stack[--sp] = fp; - if ( ( x = get_c( sfp ) ) == EOF ) - return FALSE; - ++x; /* hopefully x now contains a single set bit */ + if ( ( x = get_c( sfp ) ) == EOF ) + return FALSE; + ++x; /* hopefully x now contains a single set bit */ - for ( i = 0; i < 8; ++i ) - if ( x & ( 1 << i ) ) - break; - if ( x ^ ( 1 << i ) ) /* if more than 1 bit set */ - { - output_line - ( "error: this game uses incomplete argument lists (which I can't handle)." ); - return FALSE; - } - tmpw |= i; - stack[--sp] = tmpw; - fp = sp - 1; /* FP for next frame */ - if ( !read_word( sfp, &tmpw ) ) - return FALSE; - tmpw += y; /* local vars plus eval stack used */ - if ( tmpw >= sp ) - { - output_line( "error: this save-file uses more stack than I can cope with." ); - return FALSE; - } - if ( currlen < (unsigned long)(tmpw * 2) ) - return FALSE; - for ( i = 0; i < tmpw; ++i ) - if ( !read_word( sfp, stack + ( --sp ) ) ) - return FALSE; - currlen -= tmpw * 2; - } - break; - case ID_ANNO: - z_buffer_mode( ON ); - for ( ; currlen > 0; --currlen ) - if ( ( x = get_c( sfp ) ) == EOF ) - return FALSE; - else - write_char( x ); - write_char( ( char ) 13 ); - break; - case ID_CMem: - if ( !( progress & GOT_MEMORY ) ) - { - jz_rewind( gfp ); - i = 0; /* bytes written to data area */ - for ( ; currlen > 0; --currlen ) - { - if ( ( x = get_c( sfp ) ) == EOF ) - return FALSE; - if ( x == 0 ) /* start run */ - { - if ( currlen < 2 ) - { - output_line( "File contains bogus CMem chunk" ); - for ( ; currlen > 0; --currlen ) - ( void ) get_c( sfp ); /* skip rest */ - currlen = 1; - i = 0xFFFF; - break; /* keep going in case there's a UMem */ - } - --currlen; - if ( ( x = get_c( sfp ) ) == EOF ) - return FALSE; - for ( ; x >= 0 && i < h_restart_size; --x, ++i ) - if ( ( y = jz_getc( gfp ) ) == EOF ) - return FALSE; - else - set_byte( i, y ); - } - else /* not a run */ - { - if ( ( y = jz_getc( gfp ) ) == EOF ) - return FALSE; - set_byte( i, x ^ y ); - ++i; - } - if ( i > h_restart_size ) - { - output_line( "warning: CMem chunk too long!" ); - for ( ; currlen > 1; --currlen ) - ( void ) get_c( sfp ); /* skip rest */ - break; /* keep going in case there's a UMem */ - } - } - /* if chunk is short, assume a run */ - for ( ; i < h_restart_size; ++i ) - if ( ( y = jz_getc( gfp ) ) == EOF ) - return FALSE; - else - set_byte( i, y ); - if ( currlen == 0 ) - progress |= GOT_MEMORY; /* only if succeeded */ - break; - } - /* Fall thru (to default) if already got memory */ - case ID_UMem: - if ( !( progress & GOT_MEMORY ) ) - { - if ( currlen == h_restart_size ) - { - if ( fread( datap, h_restart_size, 1, sfp ) == 1 ) - { - progress |= GOT_MEMORY; /* only if succeeded */ - break; - } - } - else - output_line( "warning: UMem chunk wrong size!" ); - /* and fall thru into default */ - } - /* Fall thru (to default) if already got memory */ - default: - ( void ) fseek( sfp, currlen, SEEK_CUR ); /* skip chunk */ - break; - } - if ( skip ) - ( void ) get_c( sfp ); /* skip pad byte */ - } + for ( i = 0; i < 8; ++i ) + if ( x & ( 1 << i ) ) + break; + if ( x ^ ( 1 << i ) ) /* if more than 1 bit set */ + { + output_line + ( "error: this game uses incomplete argument lists (which I can't handle)." ); + return FALSE; + } + tmpw |= i; + stack[--sp] = tmpw; + fp = sp - 1; /* FP for next frame */ + if ( !read_word( sfp, &tmpw ) ) + return FALSE; + tmpw += y; /* local vars plus eval stack used */ + if ( tmpw >= sp ) + { + output_line( "error: this save-file uses more stack than I can cope with." ); + return FALSE; + } + if ( currlen < (unsigned long)(tmpw * 2) ) + return FALSE; + for ( i = 0; i < tmpw; ++i ) + if ( !read_word( sfp, stack + ( --sp ) ) ) + return FALSE; + currlen -= tmpw * 2; + } + break; + case ID_ANNO: + z_buffer_mode( ON ); + for ( ; currlen > 0; --currlen ) + if ( ( x = get_c( sfp ) ) == EOF ) + return FALSE; + else + write_char( x ); + write_char( ( char ) 13 ); + break; + case ID_CMem: + if ( !( progress & GOT_MEMORY ) ) + { + jz_rewind( gfp ); + i = 0; /* bytes written to data area */ + for ( ; currlen > 0; --currlen ) + { + if ( ( x = get_c( sfp ) ) == EOF ) + return FALSE; + if ( x == 0 ) /* start run */ + { + if ( currlen < 2 ) + { + output_line( "File contains bogus CMem chunk" ); + for ( ; currlen > 0; --currlen ) + ( void ) get_c( sfp ); /* skip rest */ + currlen = 1; + i = 0xFFFF; + break; /* keep going in case there's a UMem */ + } + --currlen; + if ( ( x = get_c( sfp ) ) == EOF ) + return FALSE; + for ( ; x >= 0 && i < h_restart_size; --x, ++i ) + if ( ( y = jz_getc( gfp ) ) == EOF ) + return FALSE; + else + set_byte( i, y ); + } + else /* not a run */ + { + if ( ( y = jz_getc( gfp ) ) == EOF ) + return FALSE; + set_byte( i, x ^ y ); + ++i; + } + if ( i > h_restart_size ) + { + output_line( "warning: CMem chunk too long!" ); + for ( ; currlen > 1; --currlen ) + ( void ) get_c( sfp ); /* skip rest */ + break; /* keep going in case there's a UMem */ + } + } + /* if chunk is short, assume a run */ + for ( ; i < h_restart_size; ++i ) + if ( ( y = jz_getc( gfp ) ) == EOF ) + return FALSE; + else + set_byte( i, y ); + if ( currlen == 0 ) + progress |= GOT_MEMORY; /* only if succeeded */ + break; + } + /* Fall thru (to default) if already got memory */ + case ID_UMem: + if ( !( progress & GOT_MEMORY ) ) + { + if ( currlen == h_restart_size ) + { + if ( fread( datap, h_restart_size, 1, sfp ) == 1 ) + { + progress |= GOT_MEMORY; /* only if succeeded */ + break; + } + } + else + output_line( "warning: UMem chunk wrong size!" ); + /* and fall thru into default */ + } + /* Fall thru (to default) if already got memory */ + default: + ( void ) fseek( sfp, (long)currlen, SEEK_CUR ); /* skip chunk */ + break; + } + if ( skip ) + ( void ) get_c( sfp ); /* skip pad byte */ + } - if ( !( progress & GOT_HEADER ) ) - output_line( "error: no header chunk in file." ); - if ( !( progress & GOT_STACK ) ) - output_line( "error: no stack chunk in file." ); - if ( !( progress & GOT_MEMORY ) ) - output_line( "error: no memory chunk in file." ); - return ( progress == GOT_ALL ); + if ( !( progress & GOT_HEADER ) ) + output_line( "error: no header chunk in file." ); + if ( !( progress & GOT_STACK ) ) + output_line( "error: no stack chunk in file." ); + if ( !( progress & GOT_MEMORY ) ) + output_line( "error: no memory chunk in file." ); + return ( progress == GOT_ALL ); } diff --git a/text.c b/text.c index b1ae0a0..3e77d39 100644 --- a/text.c +++ b/text.c @@ -1,14 +1,14 @@ -/* $Id: text.c,v 1.5 2000/10/10 14:46:22 jholder Exp $ +/* $Id: text.c,v 1.5 2000/10/10 14:46:22 jholder Exp $ * -------------------------------------------------------------------- - * see doc/License.txt for License Information + * see doc/License.txt for License Information * -------------------------------------------------------------------- - * - * File name: $Id: text.c,v 1.5 2000/10/10 14:46:22 jholder Exp $ - * - * Description: - * - * Modification history: + * + * File name: $Id: text.c,v 1.5 2000/10/10 14:46:22 jholder Exp $ + * + * Description: + * + * Modification history: * $Log: text.c,v $ * Revision 1.5 2000/10/10 14:46:22 jholder * Fixed text wrap bug when printing array w/ \r chars in it @@ -60,211 +60,211 @@ static int char_count = 0; void decode_text( unsigned long *address ) { - int i, synonym_flag, synonym = 0, zscii_flag, zscii = 0; - int data, code, shift_state, shift_lock; - unsigned long addr; + int i, synonym_flag, synonym = 0, zscii_flag, zscii = 0; + int data, code, shift_state, shift_lock; + unsigned long addr; - /* Set state variables */ + /* Set state variables */ - shift_state = 0; - shift_lock = 0; - zscii_flag = 0; - synonym_flag = 0; + shift_state = 0; + shift_lock = 0; + zscii_flag = 0; + synonym_flag = 0; - do - { + do + { - /* - * Read one 16 bit word. Each word contains three 5 bit codes. If the - * high bit is set then this is the last word in the string. - */ + /* + * Read one 16 bit word. Each word contains three 5 bit codes. If the + * high bit is set then this is the last word in the string. + */ - data = read_data_word( address ); + data = read_data_word( address ); - for ( i = 10; i >= 0; i -= 5 ) - { + for ( i = 10; i >= 0; i -= 5 ) + { - /* Get code, high bits first */ + /* Get code, high bits first */ - code = ( data >> i ) & 0x1f; + code = ( data >> i ) & 0x1f; - /* Synonym codes */ + /* Synonym codes */ - if ( synonym_flag ) - { + if ( synonym_flag ) + { - synonym_flag = 0; - synonym = ( synonym - 1 ) * 64; - addr = ( unsigned long ) get_word( h_synonyms_offset + synonym + ( code * 2 ) ) * 2; - decode_text( &addr ); - shift_state = shift_lock; + synonym_flag = 0; + synonym = ( synonym - 1 ) * 64; + addr = ( unsigned long ) get_word( h_synonyms_offset + synonym + ( code * 2 ) ) * 2; + decode_text( &addr ); + shift_state = shift_lock; - } - /* ZSCII codes */ - else if ( zscii_flag ) - { + } + /* ZSCII codes */ + else if ( zscii_flag ) + { - /* - * If this is the first part ZSCII ten-bit code then remember it. - * Because the codes are only 5 bits you need two codes to make - * one eight bit ASCII character. The first code contains the - * top 5 bits (although only 3 bits are used at the moment). - * The second code contains the bottom 5 bits. - */ + /* + * If this is the first part ZSCII ten-bit code then remember it. + * Because the codes are only 5 bits you need two codes to make + * one eight bit ASCII character. The first code contains the + * top 5 bits (although only 3 bits are used at the moment). + * The second code contains the bottom 5 bits. + */ - if ( zscii_flag++ == 1 ) - { - zscii = code << 5; - } - /* - * If this is the second part of a ten-bit ZSCII code then assemble the - * character from the two codes and output it. - */ - else - { - zscii_flag = 0; - write_zchar( ( unsigned char ) ( zscii | code ) ); - } + if ( zscii_flag++ == 1 ) + { + zscii = code << 5; + } + /* + * If this is the second part of a ten-bit ZSCII code then assemble the + * character from the two codes and output it. + */ + else + { + zscii_flag = 0; + write_zchar( ( unsigned char ) ( zscii | code ) ); + } - } + } - /* Character codes */ - else if ( code > 5 ) - { + /* Character codes */ + else if ( code > 5 ) + { - code -= 6; + code -= 6; - /* - * If this is character 0 in the punctuation set then the next two - * codes make a ten-bit ZSCII character. (Std. Sec. 3.4) - */ + /* + * If this is character 0 in the punctuation set then the next two + * codes make a ten-bit ZSCII character. (Std. Sec. 3.4) + */ - if ( shift_state == 2 && code == 0 ) - { - zscii_flag = 1; - } + if ( shift_state == 2 && code == 0 ) + { + zscii_flag = 1; + } - /* - * If this is character 1 in the punctuation set then this - * is a new line. - */ + /* + * If this is character 1 in the punctuation set then this + * is a new line. + */ - else if ( shift_state == 2 && code == 1 && h_type > V1 ) - { - z_new_line( ); - } - /* - * This is a normal character so select it from the character - * table appropriate for the current shift state. - */ + else if ( shift_state == 2 && code == 1 && h_type > V1 ) + { + z_new_line( ); + } + /* + * This is a normal character so select it from the character + * table appropriate for the current shift state. + */ - else - { - write_zchar( lookup_table[shift_state][code] ); - } - shift_state = shift_lock; + else + { + write_zchar( lookup_table[shift_state][code] ); + } + shift_state = shift_lock; - } + } - /* Special codes 0 to 5 */ - else - { + /* Special codes 0 to 5 */ + else + { - /* Space: 0 Output a space character. */ + /* Space: 0 Output a space character. */ - if ( code == 0 ) - { - write_zchar( ' ' ); - } - else - { - /* The use of the synonym and shift codes is the only - * difference between the different versions. - */ + if ( code == 0 ) + { + write_zchar( ' ' ); + } + else + { + /* The use of the synonym and shift codes is the only + * difference between the different versions. + */ - if ( h_type < V3 ) - { + if ( h_type < V3 ) + { - /* Newline or synonym: 1 - * Output a newline character or set synonym flag. - */ + /* Newline or synonym: 1 + * Output a newline character or set synonym flag. + */ - if ( code == 1 ) - { - if ( h_type == V1 ) - { - z_new_line( ); - } - else - { - synonym_flag = 1; - synonym = code; - } - } - else - { - /* - * Shift keys: 2, 3, 4 or 5 - * - * Shift keys 2 & 3 only shift the next character and can be used regardless of - * the state of the shift lock. Shift keys 4 & 5 lock the shift until reset. - * - * The following code implements the the shift code state transitions: - * +-------------+-------------+-------------+-------------+ - * | Shift State | Lock State | - * +-------------+-------------+-------------+-------------+-------------+ - * | Code | 2 | 3 | 4 | 5 | - * +-------------+-------------+-------------+-------------+-------------+ - * | lowercase | uppercase | punctuation | uppercase | punctuation | - * | uppercase | punctuation | lowercase | punctuation | lowercase | - * | punctuation | lowercase | uppercase | lowercase | uppercase | - * +-------------+-------------+-------------+-------------+-------------+ - */ - if ( code < 4 ) - { - shift_state = ( shift_lock + code + 2 ) % 3; - } - else - { - shift_lock = shift_state = ( shift_lock + code ) % 3; - } - } + if ( code == 1 ) + { + if ( h_type == V1 ) + { + z_new_line( ); + } + else + { + synonym_flag = 1; + synonym = code; + } + } + else + { + /* + * Shift keys: 2, 3, 4 or 5 + * + * Shift keys 2 & 3 only shift the next character and can be used regardless of + * the state of the shift lock. Shift keys 4 & 5 lock the shift until reset. + * + * The following code implements the the shift code state transitions: + * +-------------+-------------+-------------+-------------+ + * | Shift State | Lock State | + * +-------------+-------------+-------------+-------------+-------------+ + * | Code | 2 | 3 | 4 | 5 | + * +-------------+-------------+-------------+-------------+-------------+ + * | lowercase | uppercase | punctuation | uppercase | punctuation | + * | uppercase | punctuation | lowercase | punctuation | lowercase | + * | punctuation | lowercase | uppercase | lowercase | uppercase | + * +-------------+-------------+-------------+-------------+-------------+ + */ + if ( code < 4 ) + { + shift_state = ( shift_lock + code + 2 ) % 3; + } + else + { + shift_lock = shift_state = ( shift_lock + code ) % 3; + } + } - } - else /* not V3 */ - { + } + else /* not V3 */ + { - /* - * Synonym table: 1, 2 or 3 - * - * Selects which of three synonym tables the synonym - * code following in the next code is to use. - */ - if ( code < 4 ) - { - synonym_flag = 1; - synonym = code; - } - /* - * Shift key: 4 or 5 - * - * Selects the shift state for the next character, - * either uppercase (4) or punctuation (5). The shift - * state automatically gets reset back to lowercase for - * V3+ games after the next character is output. - * - */ - else - { - shift_state = code - 3; - shift_lock = 0; - } - } - } - } - } - } - while ( ( data & 0x8000 ) == 0 ); + /* + * Synonym table: 1, 2 or 3 + * + * Selects which of three synonym tables the synonym + * code following in the next code is to use. + */ + if ( code < 4 ) + { + synonym_flag = 1; + synonym = code; + } + /* + * Shift key: 4 or 5 + * + * Selects the shift state for the next character, + * either uppercase (4) or punctuation (5). The shift + * state automatically gets reset back to lowercase for + * V3+ games after the next character is output. + * + */ + else + { + shift_state = code - 3; + shift_lock = 0; + } + } + } + } + } + } + while ( ( data & 0x8000 ) == 0 ); } /* decode_text */ @@ -277,162 +277,162 @@ void decode_text( unsigned long *address ) void encode_text( int len, const char *s, ZINT16 * buffer ) { - int i, j, prev_table, table, next_table, shift_state, code, codes_count; - char codes[9]; + int i, j, prev_table, table, next_table, shift_state, code, codes_count; + char codes[9]; - /* Initialise codes count and prev_table number */ + /* Initialise codes count and prev_table number */ - codes_count = 0; - prev_table = 0; + codes_count = 0; + prev_table = 0; - /* Scan do the string one character at a time */ + /* Scan do the string one character at a time */ - while ( len-- ) - { + while ( len-- ) + { - /* - * Set the table and code to be the ASCII character inducer, then - * look for the character in the three lookup tables. If the - * character isn't found then it will be an ASCII character. - */ + /* + * Set the table and code to be the ASCII character inducer, then + * look for the character in the three lookup tables. If the + * character isn't found then it will be an ASCII character. + */ - table = 2; - code = 0; - for ( i = 0; i < 3; i++ ) - { - for ( j = 0; j < 26; j++ ) - { - if ( lookup_table[i][j] == *s ) - { - table = i; - code = j; - } - } - } + table = 2; + code = 0; + for ( i = 0; i < 3; i++ ) + { + for ( j = 0; j < 26; j++ ) + { + if ( lookup_table[i][j] == *s ) + { + table = i; + code = j; + } + } + } - /* - * Type 1 and 2 games differ on how the shift keys are used. Switch - * now depending on the game version. - */ + /* + * Type 1 and 2 games differ on how the shift keys are used. Switch + * now depending on the game version. + */ - if ( h_type < V3 ) - { + if ( h_type < V3 ) + { - /* - * If the current table is the same as the previous table then - * just store the character code, otherwise switch tables. - */ + /* + * If the current table is the same as the previous table then + * just store the character code, otherwise switch tables. + */ - if ( table != prev_table ) - { + if ( table != prev_table ) + { - /* Find the table for the next character */ + /* Find the table for the next character */ - next_table = 0; - if ( len ) - { - next_table = 2; - for ( i = 0; i < 3; i++ ) - { - for ( j = 0; j < 26; j++ ) - { - if ( lookup_table[i][j] == s[1] ) - next_table = i; - } - } - } + next_table = 0; + if ( len ) + { + next_table = 2; + for ( i = 0; i < 3; i++ ) + { + for ( j = 0; j < 26; j++ ) + { + if ( lookup_table[i][j] == s[1] ) + next_table = i; + } + } + } - /* - * Calculate the shift key. This magic. See the description in - * decode_text for more information on version 1 and 2 shift - * key changes. - */ + /* + * Calculate the shift key. This magic. See the description in + * decode_text for more information on version 1 and 2 shift + * key changes. + */ - shift_state = ( table + ( prev_table * 2 ) ) % 3; + shift_state = ( table + ( prev_table * 2 ) ) % 3; - /* Only store the shift key if there is a change in table */ + /* Only store the shift key if there is a change in table */ - if ( shift_state ) - { + if ( shift_state ) + { - /* - * If the next character as the uses the same table as - * this character then change the shift from a single - * shift to a shift lock. Also remember the current - * table for the next iteration. - */ + /* + * If the next character as the uses the same table as + * this character then change the shift from a single + * shift to a shift lock. Also remember the current + * table for the next iteration. + */ - if ( next_table == table ) - { - shift_state += 2; - prev_table = table; - } - else - prev_table = 0; + if ( next_table == table ) + { + shift_state += 2; + prev_table = table; + } + else + prev_table = 0; - /* Store the code in the codes buffer */ + /* Store the code in the codes buffer */ - if ( codes_count < 9 ) - codes[codes_count++] = ( char ) ( shift_state + 1 ); - } - } - } - else - { + if ( codes_count < 9 ) + codes[codes_count++] = ( char ) ( shift_state + 1 ); + } + } + } + else + { - /* - * For V3 games each uppercase or punctuation table is preceded - * by a separate shift key. If this is such a shift key then - * put it in the codes buffer. - */ + /* + * For V3 games each uppercase or punctuation table is preceded + * by a separate shift key. If this is such a shift key then + * put it in the codes buffer. + */ - if ( table && codes_count < 9 ) - codes[codes_count++] = ( char ) ( table + 3 ); - } + if ( table && codes_count < 9 ) + codes[codes_count++] = ( char ) ( table + 3 ); + } - /* Put the character code in the code buffer */ + /* Put the character code in the code buffer */ - if ( codes_count < 9 ) - codes[codes_count++] = ( char ) ( code + 6 ); + if ( codes_count < 9 ) + codes[codes_count++] = ( char ) ( code + 6 ); - /* - * Cannot find character in table so treat it as a literal ASCII - * code. The ASCII code inducer (code 0 in table 2) is followed by - * the high 3 bits of the ASCII character followed by the low 5 - * bits to make 8 bits in total. - */ + /* + * Cannot find character in table so treat it as a literal ASCII + * code. The ASCII code inducer (code 0 in table 2) is followed by + * the high 3 bits of the ASCII character followed by the low 5 + * bits to make 8 bits in total. + */ - if ( table == 2 && code == 0 ) - { - if ( codes_count < 9 ) - codes[codes_count++] = ( char ) ( ( *s >> 5 ) & 0x07 ); - if ( codes_count < 9 ) - codes[codes_count++] = ( char ) ( *s & 0x1f ); - } + if ( table == 2 && code == 0 ) + { + if ( codes_count < 9 ) + codes[codes_count++] = ( char ) ( ( *s >> 5 ) & 0x07 ); + if ( codes_count < 9 ) + codes[codes_count++] = ( char ) ( *s & 0x1f ); + } - /* Advance to next character */ + /* Advance to next character */ - s++; + s++; - } + } - /* Pad out codes with shift 5's */ + /* Pad out codes with shift 5's */ - while ( codes_count < 9 ) - codes[codes_count++] = 5; + while ( codes_count < 9 ) + codes[codes_count++] = 5; - /* Pack codes into buffer */ + /* Pack codes into buffer */ - buffer[0] = ( ( ZINT16 ) codes[0] << 10 ) | ( ( ZINT16 ) codes[1] << 5 ) | ( ZINT16 ) codes[2]; - buffer[1] = ( ( ZINT16 ) codes[3] << 10 ) | ( ( ZINT16 ) codes[4] << 5 ) | ( ZINT16 ) codes[5]; - buffer[2] = ( ( ZINT16 ) codes[6] << 10 ) | ( ( ZINT16 ) codes[7] << 5 ) | ( ZINT16 ) codes[8]; + buffer[0] = (short)(( ( ZINT16 ) codes[0] << 10 ) | ( ( ZINT16 ) codes[1] << 5 ) | ( ZINT16 ) codes[2]); + buffer[1] = (short)(( ( ZINT16 ) codes[3] << 10 ) | ( ( ZINT16 ) codes[4] << 5 ) | ( ZINT16 ) codes[5]); + buffer[2] = (short)(( ( ZINT16 ) codes[6] << 10 ) | ( ( ZINT16 ) codes[7] << 5 ) | ( ZINT16 ) codes[8]); - /* Terminate buffer at 6 or 9 codes depending on the version */ + /* Terminate buffer at 6 or 9 codes depending on the version */ - if ( h_type < V4 ) - buffer[1] |= 0x8000; - else - buffer[2] |= 0x8000; + if ( h_type < V4 ) + buffer[1] |= 0x8000; + else + buffer[2] |= 0x8000; } /* encode_text */ @@ -448,86 +448,86 @@ void encode_text( int len, const char *s, ZINT16 * buffer ) void write_zchar( int c ) { - char xlat_buffer[MAX_TEXT_SIZE + 1]; - int i; + char xlat_buffer[MAX_TEXT_SIZE + 1]; + int i; - c = ( unsigned int ) ( c & 0xff ); + c = ( unsigned int ) ( c & 0xff ); - /* If character is not special character then just write it */ + /* If character is not special character then just write it */ - if ( c >= ' ' && c <= '~' ) - { - write_char( c ); - } - else if ( c == 13 ) - { - write_char( '\r' ); - } - else - { - /* Put default character in translation buffer */ - xlat_buffer[0] = '?'; - xlat_buffer[1] = '\0'; + if ( c >= ' ' && c <= '~' ) + { + write_char( c ); + } + else if ( c == 13 ) + { + write_char( '\r' ); + } + else + { + /* Put default character in translation buffer */ + xlat_buffer[0] = '?'; + xlat_buffer[1] = '\0'; - /* If translation fails then supply a default */ - if ( codes_to_text( c, xlat_buffer ) ) - { - if ( c > 23 && c < 28 ) - { - /* Arrow keys - these must the keyboard keys used for input */ - static char xlat[4] = { '\\', '/', '+', '-' }; + /* If translation fails then supply a default */ + if ( codes_to_text( c, xlat_buffer ) ) + { + if ( c > 23 && c < 28 ) + { + /* Arrow keys - these must the keyboard keys used for input */ + static char xlat[4] = { '\\', '/', '+', '-' }; - xlat_buffer[0] = xlat[c - 24]; - xlat_buffer[1] = '\0'; - } - else if ( c == 0 ) - { - /* Null - print nothing */ - xlat_buffer[0] = '\0'; - } - else if ( c < 32 ) - { - /* Some other control character: print an octal escape. */ - xlat_buffer[0] = '\\'; - xlat_buffer[1] = ( char ) ( '0' + ( ( c >> 6 ) & 7 ) ); - xlat_buffer[2] = ( char ) ( '0' + ( ( c >> 3 ) & 7 ) ); - xlat_buffer[3] = ( char ) ( '0' + ( c & 7 ) ); - xlat_buffer[4] = '\0'; - } - else if ( c > 178 && c < 219 ) - { - /* IBM line drawing characters to ASCII characters */ - if ( c == 179 ) - xlat_buffer[0] = '|'; - else if ( c == 186 ) - xlat_buffer[0] = '#'; - else if ( c == 196 ) - xlat_buffer[0] = '-'; - else if ( c == 205 ) - xlat_buffer[0] = '='; - else - xlat_buffer[0] = '+'; - xlat_buffer[1] = '\0'; - } - else if ( c > 154 && c < 164 ) - { - /* German character replacements */ - static char xlat[] = "aeoeueAeOeUess>><<"; + xlat_buffer[0] = xlat[c - 24]; + xlat_buffer[1] = '\0'; + } + else if ( c == 0 ) + { + /* Null - print nothing */ + xlat_buffer[0] = '\0'; + } + else if ( c < 32 ) + { + /* Some other control character: print an octal escape. */ + xlat_buffer[0] = '\\'; + xlat_buffer[1] = ( char ) ( '0' + ( ( c >> 6 ) & 7 ) ); + xlat_buffer[2] = ( char ) ( '0' + ( ( c >> 3 ) & 7 ) ); + xlat_buffer[3] = ( char ) ( '0' + ( c & 7 ) ); + xlat_buffer[4] = '\0'; + } + else if ( c > 178 && c < 219 ) + { + /* IBM line drawing characters to ASCII characters */ + if ( c == 179 ) + xlat_buffer[0] = '|'; + else if ( c == 186 ) + xlat_buffer[0] = '#'; + else if ( c == 196 ) + xlat_buffer[0] = '-'; + else if ( c == 205 ) + xlat_buffer[0] = '='; + else + xlat_buffer[0] = '+'; + xlat_buffer[1] = '\0'; + } + else if ( c > 154 && c < 164 ) + { + /* German character replacements */ + static char xlat[] = "aeoeueAeOeUess>><<"; - xlat_buffer[0] = xlat[( ( c - 155 ) * 2 ) + 0]; - xlat_buffer[1] = xlat[( ( c - 155 ) * 2 ) + 1]; - xlat_buffer[2] = '\0'; - } - } + xlat_buffer[0] = xlat[( ( c - 155 ) * 2 ) + 0]; + xlat_buffer[1] = xlat[( ( c - 155 ) * 2 ) + 1]; + xlat_buffer[2] = '\0'; + } + } - /* Substitute translated characters */ + /* Substitute translated characters */ - for ( i = 0; xlat_buffer[i] != '\0'; i++ ) - { - write_char( ( unsigned char ) xlat_buffer[i] ); - } + for ( i = 0; xlat_buffer[i] != '\0'; i++ ) + { + write_char( ( unsigned char ) xlat_buffer[i] ); + } - } + } } /* write_zchar */ /* @@ -537,27 +537,27 @@ void write_zchar( int c ) */ zbyte_t translate_to_zscii(int c) { - int i; + int i; - if( c>= 0xa0 ) - { - if( h_unicode_table !=0 ) - { - fprintf(stderr,"[[ Unicode support not enabled yet. ]]"); - } - else - { - for (i = 0x9b; i <= 0xdf; i++) - { - if (c == zscii2latin1[i - 0x9b]) - { - return (zbyte_t) i; - } - } - return '?'; - } - } - return (zbyte_t) c; + if( c>= 0xa0 ) + { + if( h_unicode_table !=0 ) + { + fprintf(stderr,"[[ Unicode support not enabled yet. ]]"); + } + else + { + for (i = 0x9b; i <= 0xdf; i++) + { + if (c == zscii2latin1[i - 0x9b]) + { + return (zbyte_t) i; + } + } + return '?'; + } + } + return (zbyte_t) c; } /* @@ -570,109 +570,109 @@ zbyte_t translate_to_zscii(int c) */ void write_char( int c ) { - char *cp; - int right_len; + char *cp; + int right_len; - /* Only do if text formatting is turned on */ + /* Only do if text formatting is turned on */ - if ( redirect_depth ) - { - /* If redirect is on then write the character to the status line - * for V1 to V3 games or into the writeable data area for V4+ games */ - if ( h_type < V4 ) - { - status_line[status_pos++] = ( char ) c; - } - else - { - set_byte( story_pos++, translate_to_zscii(c) ); - story_count++; - } - } - else if ( formatting == ON && screen_window == TEXT_WINDOW ) - { - if ( fit_line( line, line_pos, screen_cols - right_margin ) == 0 || char_count < 1 ) - { - /* Null terminate the line */ - line[line_pos] = '\0'; + if ( redirect_depth ) + { + /* If redirect is on then write the character to the status line + * for V1 to V3 games or into the writeable data area for V4+ games */ + if ( h_type < V4 ) + { + status_line[status_pos++] = ( char ) c; + } + else + { + set_byte( story_pos++, translate_to_zscii(c) ); + story_count++; + } + } + else if ( formatting == ON && screen_window == TEXT_WINDOW ) + { + if ( fit_line( line, line_pos, screen_cols - right_margin ) == 0 || char_count < 1 ) + { + /* Null terminate the line */ + line[line_pos] = '\0'; - /* If the next character is a space then no wrap is neccessary */ - if ( c == ' ' ) - { - z_new_line( ); - c = '\0'; - } - else - { - /* Wrap the line. First find the last space */ - cp = strrchr( line, ' ' ); + /* If the next character is a space then no wrap is neccessary */ + if ( c == ' ' ) + { + z_new_line( ); + c = '\0'; + } + else + { + /* Wrap the line. First find the last space */ + cp = strrchr( line, ' ' ); - /* If no spaces in the lines then cannot do wrap */ - if ( cp == NULL ) - { - /* Output the buffer and a new line */ - z_new_line( ); - } - - if (cp != NULL) - { - /* Terminate the line at the last space */ - *cp++ = '\0'; + /* If no spaces in the lines then cannot do wrap */ + if ( cp == NULL ) + { + /* Output the buffer and a new line */ + z_new_line( ); + } - /* Calculate the text length after the last space */ - right_len = &line[line_pos] - cp; + if (cp != NULL) + { + /* Terminate the line at the last space */ + *cp++ = '\0'; - /* Output the buffer and a new line */ - z_new_line( ); + /* Calculate the text length after the last space */ + right_len = &line[line_pos] - cp; - /* If any text to wrap then move it to the start of the line */ - if ( right_len > 0 ) - { - memmove( line, cp, right_len ); - line_pos = right_len; - } - } - } - } - /* Put the character into the buffer and count it. - * Decrement line width if the character is visible */ - if ( c ) - { - line[line_pos++] = ( char ) c; + /* Output the buffer and a new line */ + z_new_line( ); - /* Wrap the line when there is a newline in the stream. */ - cp = strrchr( line, 13 ); - if ( cp!= NULL ) - { - /* Terminate the line at the last space */ - *cp++ = '\0'; + /* If any text to wrap then move it to the start of the line */ + if ( right_len > 0 ) + { + memmove( line, cp, right_len ); + line_pos = right_len; + } + } + } + } + /* Put the character into the buffer and count it. + * Decrement line width if the character is visible */ + if ( c ) + { + line[line_pos++] = ( char ) c; - /* Calculate the text length after the last space */ - right_len = &line[line_pos] - cp; + /* Wrap the line when there is a newline in the stream. */ + cp = strrchr( line, 13 ); + if ( cp!= NULL ) + { + /* Terminate the line at the last space */ + *cp++ = '\0'; - /* Output the buffer and a new line */ - z_new_line( ); + /* Calculate the text length after the last space */ + right_len = &line[line_pos] - cp; - /* If any text to wrap then move it to the start of the line */ - if ( right_len > 0 ) - { - memmove( line, cp, right_len ); - line_pos = right_len; - } - } + /* Output the buffer and a new line */ + z_new_line( ); - if ( isprint( c ) ) - { - char_count--; - } - } - } - else - { - /* No formatting or output redirection, so just output the character */ - script_char( c ); - output_char( c ); - } + /* If any text to wrap then move it to the start of the line */ + if ( right_len > 0 ) + { + memmove( line, cp, right_len ); + line_pos = right_len; + } + } + + if ( isprint( c ) ) + { + char_count--; + } + } + } + else + { + /* No formatting or output redirection, so just output the character */ + script_char( c ); + output_char( c ); + } } /* write_char */ @@ -687,14 +687,15 @@ void write_char( int c ) void z_set_text_style( zword_t mode ) { - if ( mode >= MIN_ATTRIBUTE && mode <= MAX_ATTRIBUTE ) - { - set_attribute( mode ); - } - else - { - fatal( "@set_text_style called with invalid mode." ); - } + //if ( mode >= MIN_ATTRIBUTE && mode <= MAX_ATTRIBUTE ) + if (mode <= MAX_ATTRIBUTE ) + { + set_attribute( mode ); + } + else + { + fatal( "@set_text_style called with invalid mode." ); + } } /* z_set_text_style */ /* @@ -706,8 +707,8 @@ void z_set_text_style( zword_t mode ) void write_string( const char *s ) { - while ( *s ) - write_char( *s++ ); + while ( *s ) + write_char( *s++ ); } /* write_string */ @@ -720,24 +721,24 @@ void write_string( const char *s ) void flush_buffer( int flag ) { - /* Terminate the line */ - line[line_pos] = '\0'; + /* Terminate the line */ + line[line_pos] = '\0'; - /* Send the line buffer to the printer */ - script_string( line ); - flush_script( ); + /* Send the line buffer to the printer */ + script_string( line ); + flush_script( ); - /* Send the line buffer to the screen */ - output_string( line ); + /* Send the line buffer to the screen */ + output_string( line ); - /* Reset the character count only if a carriage return is expected */ - if ( flag == TRUE ) - { - char_count = screen_cols - right_margin; - } + /* Reset the character count only if a carriage return is expected */ + if ( flag == TRUE ) + { + char_count = screen_cols - right_margin; + } - /* Reset the buffer pointer */ - line_pos = 0; + /* Reset the buffer pointer */ + line_pos = 0; } /* flush_buffer */ @@ -745,21 +746,21 @@ void flush_buffer( int flag ) * z_buffer_mode * * Set the format mode flag. Formatting disables writing into the output buffer. - * If set to 1, text output in the lower window on stream one is buffered so that + * If set to 1, text output in the lower window on stream one is buffered so that * it can be word-wrapped properly. If set to 0, it isn't. * */ void z_buffer_mode( zword_t flag ) { - /* Flush any current output */ - flush_buffer( FALSE ); + /* Flush any current output */ + flush_buffer( FALSE ); - /* Set formatting depending on the flag */ - if ( flag ) - formatting = ON; - else - formatting = OFF; + /* Set formatting depending on the flag */ + if ( flag ) + formatting = ON; + else + formatting = OFF; } /* z_buffer_mode */ @@ -780,142 +781,142 @@ void z_buffer_mode( zword_t flag ) typedef struct redirect_stash_struct { - zword_t count; - zword_t buffer; - zword_t pos; + zword_t count; + zword_t buffer; + zword_t pos; } redirect_stash_t; void z_output_stream( zword_t type, zword_t option ) { - static int redirect_size = 0; - static redirect_stash_t *stash = NULL; + static int redirect_size = 0; + static redirect_stash_t *stash = NULL; - if ( ( ZINT16 ) type == 1 ) - { - /* Turn on text output */ - outputting = ON; - } - else if ( ( ZINT16 ) type == 2 ) - { - /* Turn on scripting */ - open_script( ); - } - else if ( ( ZINT16 ) type == 3 ) - { - /* Turn on output redirection */ - if ( redirect_depth == 0 ) - { - /* Disable text formatting during redirection */ - saved_formatting = formatting; - formatting = OFF; + if ( ( ZINT16 ) type == 1 ) + { + /* Turn on text output */ + outputting = ON; + } + else if ( ( ZINT16 ) type == 2 ) + { + /* Turn on scripting */ + open_script( ); + } + else if ( ( ZINT16 ) type == 3 ) + { + /* Turn on output redirection */ + if ( redirect_depth == 0 ) + { + /* Disable text formatting during redirection */ + saved_formatting = formatting; + formatting = OFF; - /* Enable text redirection */ - redirect_depth = 1; - } - else - { - if ( redirect_size == 0 ) - { - redirect_size = 4; - stash = ( redirect_stash_t * ) malloc( redirect_size * sizeof ( redirect_stash_t ) ); - } - if ( redirect_depth > redirect_size ) - { - redirect_size *= 2; - stash = ( redirect_stash_t * ) realloc( stash, redirect_size * sizeof ( redirect_stash_t ) ); - } + /* Enable text redirection */ + redirect_depth = 1; + } + else + { + if ( redirect_size == 0 ) + { + redirect_size = 4; + stash = ( redirect_stash_t * ) malloc( redirect_size * sizeof ( redirect_stash_t ) ); + } + if ( redirect_depth > redirect_size ) + { + redirect_size *= 2; + stash = ( redirect_stash_t * ) realloc( stash, redirect_size * sizeof ( redirect_stash_t ) ); + } - if ( h_type < V4 ) - { - stash[redirect_depth - 1].pos = status_pos; - } - else - { - stash[redirect_depth - 1].pos = story_pos; - stash[redirect_depth - 1].buffer = story_buffer; - stash[redirect_depth - 1].count = story_count; - } + if ( h_type < V4 ) + { + stash[redirect_depth - 1].pos = status_pos; + } + else + { + stash[redirect_depth - 1].pos = story_pos; + stash[redirect_depth - 1].buffer = story_buffer; + stash[redirect_depth - 1].count = story_count; + } - redirect_depth++; - } + redirect_depth++; + } - /* Set up the redirection pointers */ + /* Set up the redirection pointers */ - if ( h_type < V4 ) - { - status_pos = 0; - } - else - { - story_count = 0; - story_buffer = option; - story_pos = option + 2; - } + if ( h_type < V4 ) + { + status_pos = 0; + } + else + { + story_count = 0; + story_buffer = option; + story_pos = option + 2; + } - } - else if ( ( ZINT16 ) type == 4 ) - { - /* Turn on input recording */ - open_record( ); - } - else if ( ( ZINT16 ) type == -1 ) - { - /* Turn off text output */ - outputting = OFF; - } - else if ( ( ZINT16 ) type == -2 ) - { - /* Turn off scripting */ - close_script( ); - } - else if ( ( ZINT16 ) type == -3 ) - { - /* Turn off output redirection */ - if ( redirect_depth ) - { - if ( redirect_depth == 1 ) - { - /* Restore the format mode and turn off redirection */ - formatting = saved_formatting; - redirect_depth = 0; + } + else if ( ( ZINT16 ) type == 4 ) + { + /* Turn on input recording */ + open_record( ); + } + else if ( ( ZINT16 ) type == -1 ) + { + /* Turn off text output */ + outputting = OFF; + } + else if ( ( ZINT16 ) type == -2 ) + { + /* Turn off scripting */ + close_script( ); + } + else if ( ( ZINT16 ) type == -3 ) + { + /* Turn off output redirection */ + if ( redirect_depth ) + { + if ( redirect_depth == 1 ) + { + /* Restore the format mode and turn off redirection */ + formatting = saved_formatting; + redirect_depth = 0; - /* Terminate the redirection buffer and store the count of - * character in the buffer into the first word of the buffer */ - if ( h_type > V3 ) - { - set_word( story_buffer, story_count ); - } - } - else - { - if ( h_type > V3 ) - { - set_word( story_buffer, story_count ); - } + /* Terminate the redirection buffer and store the count of + * character in the buffer into the first word of the buffer */ + if ( h_type > V3 ) + { + set_word( story_buffer, story_count ); + } + } + else + { + if ( h_type > V3 ) + { + set_word( story_buffer, story_count ); + } - redirect_depth--; + redirect_depth--; - if ( h_type < V4 ) - { - status_pos = stash[redirect_depth - 1].pos; - } - else - { - story_pos = stash[redirect_depth - 1].pos; - story_buffer = stash[redirect_depth - 1].buffer; - story_count = stash[redirect_depth - 1].count; - } + if ( h_type < V4 ) + { + status_pos = stash[redirect_depth - 1].pos; + } + else + { + story_pos = stash[redirect_depth - 1].pos; + story_buffer = stash[redirect_depth - 1].buffer; + story_count = stash[redirect_depth - 1].count; + } - } - } + } + } - } - else if ( ( ZINT16 ) type == -4 ) - { - /* Turn off input recording */ - close_record( ); - } + } + else if ( ( ZINT16 ) type == -4 ) + { + /* Turn off input recording */ + close_record( ); + } } /* z_output_stream */ /* @@ -927,7 +928,7 @@ void z_output_stream( zword_t type, zword_t option ) void z_print_char( zword_t c ) { - write_zchar( ( char ) c ); + write_zchar( ( char ) c ); } /* z_print_char */ /* @@ -939,14 +940,14 @@ void z_print_char( zword_t c ) void z_print_num( zword_t num ) { - int i, count; - char buffer[10]; + int i, count; + char buffer[10]; - i = ( ZINT16 ) num; - sprintf( buffer, "%d", i ); - count = strlen( buffer ); - for ( i = 0; i < count; i++ ) - write_char( buffer[i] ); + i = ( ZINT16 ) num; + sprintf( buffer, "%d", i ); + count = strlen( buffer ); + for ( i = 0; i < count; i++ ) + write_char( buffer[i] ); } /* z_print_num */ @@ -960,13 +961,13 @@ void z_print_num( zword_t num ) void z_print_paddr( zword_t packed_address ) { - unsigned long address; + unsigned long address; - /* Convert packed address to real address */ - address = ( unsigned long ) packed_address * story_scaler; + /* Convert packed address to real address */ + address = ( unsigned long ) packed_address * story_scaler; - /* Decode and output text at address */ - decode_text( &address ); + /* Decode and output text at address */ + decode_text( &address ); } /* z_print_paddr */ @@ -980,12 +981,12 @@ void z_print_paddr( zword_t packed_address ) void z_print_addr( zword_t offset ) { - unsigned long address; + unsigned long address; - address = offset; + address = offset; - /* Decode and output text at address */ - decode_text( &address ); + /* Decode and output text at address */ + decode_text( &address ); } /* z_print_addr */ @@ -999,22 +1000,22 @@ void z_print_addr( zword_t offset ) void z_print_obj( zword_t obj ) { - zword_t offset; - unsigned long address; + zword_t offset; + unsigned long address; - /* Check for NULL object */ - if ( obj == 0 ) - return; + /* Check for NULL object */ + if ( obj == 0 ) + return; - /* Calculate address of property list */ - offset = get_object_address( obj ); - offset += ( h_type < V4 ) ? O3_PROPERTY_OFFSET : O4_PROPERTY_OFFSET; + /* Calculate address of property list */ + offset = get_object_address( obj ); + offset += ( h_type < V4 ) ? O3_PROPERTY_OFFSET : O4_PROPERTY_OFFSET; - /* Read the property list address and skip the count byte */ - address = ( unsigned long ) get_word( offset ) + 1; + /* Read the property list address and skip the count byte */ + address = ( unsigned long ) get_word( offset ) + 1; - /* Decode and output text at address */ - decode_text( &address ); + /* Decode and output text at address */ + decode_text( &address ); } /* z_print_obj */ @@ -1031,8 +1032,8 @@ void z_print_obj( zword_t obj ) void z_print( void ) { - /* Decode and output text at PC */ - decode_text( &pc ); + /* Decode and output text at PC */ + decode_text( &pc ); } /* z_print */ @@ -1048,9 +1049,9 @@ void z_print( void ) void z_print_ret( void ) { - z_print( ); - z_new_line( ); - z_ret( TRUE ); + z_print( ); + z_new_line( ); + z_ret( TRUE ); } /* z_print_ret */ @@ -1065,17 +1066,17 @@ void z_print_ret( void ) void z_new_line( void ) { - /* Only flush buffer if story redirect is off */ - if ( redirect_depth == 0 ) - { - flush_buffer( TRUE ); - script_new_line( ); - output_new_line( ); - } - else - { - write_char( '\r' ); - } + /* Only flush buffer if story redirect is off */ + if ( redirect_depth == 0 ) + { + flush_buffer( TRUE ); + script_new_line( ); + output_new_line( ); + } + else + { + write_char( '\r' ); + } } /* z_new_line */ @@ -1090,34 +1091,34 @@ void z_new_line( void ) void print_time( int hours, int minutes ) { - int pm_indicator; + int pm_indicator; - /* Remember if time is pm */ - pm_indicator = ( hours < 12 ) ? OFF : ON; + /* Remember if time is pm */ + pm_indicator = ( hours < 12 ) ? OFF : ON; - /* Convert 24 hour clock to 12 hour clock */ - hours %= 12; - if ( hours == 0 ) - hours = 12; + /* Convert 24 hour clock to 12 hour clock */ + hours %= 12; + if ( hours == 0 ) + hours = 12; - /* Write hour right justified */ - if ( hours < 10 ) - write_char( ' ' ); - z_print_num( (zword_t)hours ); + /* Write hour right justified */ + if ( hours < 10 ) + write_char( ' ' ); + z_print_num( (zword_t)hours ); - /* Write hours/minutes separator */ - write_char( ':' ); + /* Write hours/minutes separator */ + write_char( ':' ); - /* Write minutes zero filled */ - if ( minutes < 10 ) - write_char( '0' ); - z_print_num( (zword_t)minutes ); + /* Write minutes zero filled */ + if ( minutes < 10 ) + write_char( '0' ); + z_print_num( (zword_t)minutes ); - /* Write the am or pm string */ - if ( pm_indicator == ON ) - write_string( " pm" ); - else - write_string( " am" ); + /* Write the am or pm string */ + if ( pm_indicator == ON ) + write_string( " pm" ); + else + write_string( " am" ); } /* print_time */ @@ -1130,16 +1131,16 @@ void print_time( int hours, int minutes ) void z_encode( zword_t word_addr, zword_t word_length, zword_t word_offset, zword_t dest_addr ) { - ZINT16 word[3]; - int i; + ZINT16 word[3]; + int i; - /* Encode the word */ + /* Encode the word */ - encode_text( word_length, ( const char * ) &datap[word_addr + word_offset], word ); + encode_text( word_length, ( const char * ) &datap[word_addr + word_offset], word ); - /* Move the encoded word, byte swapped, into the destination buffer */ + /* Move the encoded word, byte swapped, into the destination buffer */ - for ( i = 0; i < 3; i++, dest_addr += 2 ) - set_word( dest_addr, word[i] ); + for ( i = 0; i < 3; i++, dest_addr += 2 ) + set_word( dest_addr, word[i] ); } /* z_encode */ diff --git a/ztypes.h b/ztypes.h index 81b4432..0fa488c 100644 --- a/ztypes.h +++ b/ztypes.h @@ -34,8 +34,8 @@ * */ -#if !defined(__ZTYPES_INCLUDED) -#define __ZTYPES_INCLUDED +#if !defined(ZTYPES_INCLUDED) +#define ZTYPES_INCLUDED // IIgs stuff - everyone gets it #include "joey.h" @@ -74,8 +74,11 @@ #endif /* MSDOS */ /* Set Version of JZIP */ +#define JZIPVER "Jzip V2.1" +#define JZIPRELDATE "Tue, Oct 10 2000" +#define JZIPAUTHOR "John Holder (j-holder@home.com)" +#define JZIPURL "http://jzip.sourceforge.net/" -#include "jzip.h" extern unsigned char JTERP; /* Configuration options */ @@ -456,6 +459,11 @@ zobjectv4_t; /* External data */ +extern char save_name[Z_FILENAME_MAX + Z_PATHNAME_MAX + 1]; +extern char script_name[Z_FILENAME_MAX + Z_PATHNAME_MAX + 1]; +extern char record_name[Z_FILENAME_MAX + Z_PATHNAME_MAX + 1]; +extern char auxilary_name[Z_FILENAME_MAX + Z_PATHNAME_MAX + 1]; + extern int GLOBALVER; extern zbyte_t h_type; extern zbyte_t h_config; @@ -796,4 +804,4 @@ void z_load( zword_t ); void z_pull( zword_t ); void z_push( zword_t ); -#endif /* !defined(__ZTYPES_INCLUDED) */ +#endif /* !defined(ZTYPES_INCLUDED) */