--- /dev/null
+/* buffer.c - Text buffering and word wrapping
+ * Copyright (c) 2003 Tor Andersson -- zapped!
+ * 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
+ */
+
+#include "frotz.h"
+
+extern void stream_char (zchar);
+extern void stream_word (const zchar *);
+extern void stream_new_line (void);
+
+static zchar buffer[TEXT_BUFFER_SIZE];
+static int bufpos = 0;
+
+static zchar prev_c = 0;
+
+/*
+ * flush_buffer
+ *
+ * Copy the contents of the text buffer to the output streams.
+ *
+ */
+
+void flush_buffer (void)
+{
+ static bool locked = FALSE;
+
+ /* 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[bufpos] = 0;
+
+
+ locked = TRUE;
+
+ stream_word (buffer);
+
+#ifdef SPEECH_OUTPUT
+ os_speech_output(buffer);
+#endif
+
+ locked = FALSE;
+
+ /* Reset the buffer */
+
+ bufpos = 0;
+ prev_c = 0;
+
+}/* flush_buffer */
+
+/*
+ * print_char
+ *
+ * High level output function.
+ *
+ */
+
+void print_char (zchar c)
+{
+ static bool flag = FALSE;
+
+ if (message || ostream_memory || enable_buffering) {
+
+ if (!flag) {
+
+ /* Characters 0 and ZC_RETURN are special cases */
+
+ if (c == ZC_RETURN)
+ { new_line (); return; }
+ if (c == 0)
+ return;
+
+ /* Flush the buffer before a whitespace or after a hyphen */
+
+ if (c == ' ' || c == ZC_INDENT || c == ZC_GAP || (prev_c == '-' && c != '-'))
+
+
+ flush_buffer ();
+
+ /* Set the flag if this is part one of a style or font change */
+
+ if (c == ZC_NEW_FONT || c == ZC_NEW_STYLE)
+ flag = TRUE;
+
+ /* Remember the current character code */
+
+ prev_c = c;
+
+ } else flag = FALSE;
+
+ /* Insert the character into the buffer */
+
+ buffer[bufpos++] = c;
+
+ if (bufpos == TEXT_BUFFER_SIZE)
+ runtime_error (ERR_TEXT_BUF_OVF);
+
+ } else stream_char (c);
+
+}/* print_char */
+
+/*
+ * new_line
+ *
+ * High level newline function.
+ *
+ */
+
+void new_line (void)
+{
+
+ flush_buffer (); stream_new_line ();
+
+}/* new_line */
+
+
+/*
+ * init_buffer
+ *
+ * Initialize buffer variables.
+ *
+ */
+
+void init_buffer(void)
+{
+ memset(buffer, 0, sizeof (zchar) * TEXT_BUFFER_SIZE);
+ bufpos = 0;
+ prev_c = 0;
+}
+