mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-27 14:02:19 +00:00
142 lines
No EOL
4 KiB
C#
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 */
|
|
}
|
|
} |