Cosmos/Demos/zMachine/Frotz.Net/source/Desktop/FrotzBase/Frotz/Generic/buffer.cs

142 lines
No EOL
4 KiB
C#

/* buffer.c - Text buffering and word wrapping
* Copyright (c) 1995-1997 Stefan Jokisch
*
* This file is part of Frotz.
*
* Frotz is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Frotz is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
using zword = System.UInt16;
using zbyte = System.Byte;
using Frotz;
using Frotz.Constants;
namespace Frotz.Generic {
internal static class Buffer {
internal static zword[] buffer_var; // TODO Was a zword
internal static int bufpos = 0;
internal static bool locked = false;
internal static zword prev_c = 0;
/*
* init_buffer
*
* Initialize buffer variables.
*
*/
internal static void init_buffer()
{
buffer_var = new zword[General.TEXT_BUFFER_SIZE];
bufpos = 0;
prev_c = 0;
locked = false;
}
///*
// * flush_buffer
// *
// * Copy the contents of the text buffer to the output streams.
// *
// */
internal static void flush_buffer ()
{
/* Make sure we stop when flush_buffer is called from flush_buffer.
Note that this is difficult to avoid as we might print a newline
during flush_buffer, which might cause a newline interrupt, that
might execute any arbitrary opcode, which might flush the buffer. */
if (locked || bufpos == 0)
return;
/* Send the buffer to the output streams */
buffer_var[bufpos] = '\0';
locked = true; Stream.stream_word (buffer_var); locked = false;
/* Reset the buffer */
bufpos = 0;
prev_c = 0;
}/* flush_buffer */
/*
* print_char
*
* High level output function.
*
*/
static bool print_char_flag = false;
internal static void print_char(zword c)
{
if (main.message || main.ostream_memory || main.enable_buffering) {
if (!print_char_flag) {
/* Characters 0 and ZC_RETURN are special cases */
if (c == CharCodes.ZC_RETURN) { new_line(); return; }
if (c == 0)
return;
/* Flush the buffer before a whitespace or after a hyphen */
if (c == ' ' || c == CharCodes.ZC_INDENT || c == CharCodes.ZC_GAP || (prev_c == '-' && c != '-'))
flush_buffer();
/* Set the flag if this is part one of a style or font change */
if (c == CharCodes.ZC_NEW_FONT || c == CharCodes.ZC_NEW_STYLE)
print_char_flag = true;
/* Remember the current character code */
prev_c = c;
} else print_char_flag = false;
/* Insert the character into the buffer */
buffer_var[bufpos++] = (char)c;
if (bufpos == General.TEXT_BUFFER_SIZE)
Err.runtime_error(ErrorCodes.ERR_TEXT_BUF_OVF);
} else Stream.stream_char (c);
}/* print_char */
/*
* new_line
*
* High level newline function.
*
*/
internal static void new_line ()
{
flush_buffer (); Stream.stream_new_line ();
}/* new_line */
}
}