Added Nitfol and Frotz source code.
[rodin/chimara.git] / interpreters / frotz / buffer.c
diff --git a/interpreters/frotz/buffer.c b/interpreters/frotz/buffer.c
new file mode 100644 (file)
index 0000000..f3a721e
--- /dev/null
@@ -0,0 +1,153 @@
+/* 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;
+}
+