aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/gargoyle/glk.cpp25
-rw-r--r--engines/gargoyle/glk.h17
-rw-r--r--engines/gargoyle/streams.cpp53
-rw-r--r--engines/gargoyle/streams.h20
4 files changed, 96 insertions, 19 deletions
diff --git a/engines/gargoyle/glk.cpp b/engines/gargoyle/glk.cpp
index d8152428ab..8beca88f2c 100644
--- a/engines/gargoyle/glk.cpp
+++ b/engines/gargoyle/glk.cpp
@@ -1115,39 +1115,36 @@ glsi32 Glk::glk_date_to_simple_time_local(const glkdate_t *date, glui32 factor)
/* XXX non-official Glk functions that may or may not exist */
-char *garglk_fileref_get_name(frefid_t fref) {
- // TODO
- return nullptr;
+const char *Glk::garglk_fileref_get_name(frefid_t fref) const {
+ return fref->_filename.c_str();
}
void Glk::garglk_set_program_name(const char *name) {
- // TODO
+ // Program name isn't displayed
}
void Glk::garglk_set_program_info(const char *info) {
- // TODO
+ // Program info isn't displayed
}
void Glk::garglk_set_story_name(const char *name) {
- // TODO
+ // Story name isn't displayed
}
void Glk::garglk_set_story_title(const char *title) {
- // TODO
+ // Story title isn't displayed
}
void Glk::garglk_set_config(const char *name) {
- // TODO
+ // No implementation
}
-/* garglk_unput_string - removes the specified string from the end of the output buffer, if
-* indeed it is there. */
-void Glk::garglk_unput_string(char *str) {
- // TODO
+void Glk::garglk_unput_string(const char *str) {
+ _streams->getCurrent()->unputBuffer(str, strlen(str));
}
-void Glk::garglk_unput_string_uni(glui32 *str) {
- // TODO
+void Glk::garglk_unput_string_uni(const glui32 *str) {
+ _streams->getCurrent()->unputBufferUni(str, strlen_uni(str));
}
void Glk::garglk_set_zcolors(glui32 fg, glui32 bg) {
diff --git a/engines/gargoyle/glk.h b/engines/gargoyle/glk.h
index 7312a35d8e..eb3e68d9a6 100644
--- a/engines/gargoyle/glk.h
+++ b/engines/gargoyle/glk.h
@@ -260,7 +260,7 @@ public:
/* XXX non-official Glk functions that may or may not exist */
#define GARGLK 1
- char* garglk_fileref_get_name(frefid_t fref);
+ const char *garglk_fileref_get_name(frefid_t fref) const;
void garglk_set_program_name(const char *name);
void garglk_set_program_info(const char *info);
@@ -268,10 +268,17 @@ public:
void garglk_set_story_title(const char *title);
void garglk_set_config(const char *name);
- /* garglk_unput_string - removes the specified string from the end of the output buffer, if
- * indeed it is there. */
- void garglk_unput_string(char *str);
- void garglk_unput_string_uni(glui32 *str);
+ /**
+ * Removes the specified string from the end of the output buffer, if
+ * indeed it is there.
+ */
+ void garglk_unput_string(const char *str);
+
+ /**
+ * Removes the specified string from the end of the output buffer, if
+ * indeed it is there.
+ */
+ void garglk_unput_string_uni(const glui32 *str);
void garglk_set_zcolors(glui32 fg, glui32 bg);
void garglk_set_zcolors_stream(strid_t str, glui32 fg, glui32 bg);
diff --git a/engines/gargoyle/streams.cpp b/engines/gargoyle/streams.cpp
index 24917c56dd..0f95984046 100644
--- a/engines/gargoyle/streams.cpp
+++ b/engines/gargoyle/streams.cpp
@@ -147,6 +147,59 @@ void WindowStream::putBufferUni(const uint32 *buf, size_t len) {
_window->_echoStream->putBufferUni(buf, len);
}
+void WindowStream::unputBuffer(const char *buf, size_t len) {
+ glui32 lx;
+ const char *cx;
+
+ if (!_writable)
+ return;
+
+ if (_window->_lineRequest || _window->_lineRequestUni) {
+ if (g_conf->_safeClicks && g_vm->_events->_forceClick) {
+ _window->cancelLineEvent(nullptr);
+ g_vm->_events->_forceClick = false;
+ } else {
+ warning("unput_buffer: window has pending line request");
+ return;
+ }
+ }
+
+ for (lx = 0, cx = buf + len - 1; lx<len; lx++, cx--) {
+ if (!_window->unputCharUni(*cx))
+ break;
+ _writeCount--;
+ }
+ if (_window->_echoStream)
+ _window->_echoStream->unputBuffer(buf, len);
+}
+
+void WindowStream::unputBufferUni(const glui32 *buf, size_t len) {
+ glui32 lx;
+ const glui32 *cx;
+
+ if (!_writable)
+ return;
+
+ if (_window->_lineRequest || _window->_lineRequestUni) {
+ if (g_conf->_safeClicks && g_vm->_events->_forceClick) {
+ _window->cancelLineEvent(nullptr);
+ g_vm->_events->_forceClick = false;
+ } else {
+ warning("unput_buffer: window has pending line request");
+ return;
+ }
+ }
+
+ for (lx = 0, cx = buf + len - 1; lx<len; lx++, cx--) {
+ if (!_window->unputCharUni(*cx))
+ break;
+ _writeCount--;
+ }
+
+ if (_window->_echoStream)
+ _window->_echoStream->unputBufferUni(buf, len);
+}
+
void WindowStream::setStyle(glui32 val) {
if (!_writable)
return;
diff --git a/engines/gargoyle/streams.h b/engines/gargoyle/streams.h
index 16f63dbf0b..02e2f3b7e6 100644
--- a/engines/gargoyle/streams.h
+++ b/engines/gargoyle/streams.h
@@ -192,6 +192,16 @@ public:
virtual void putBufferUni(const uint32 *buf, size_t len) = 0;
/**
+ * Remove a string from the end of the stream, if indeed it is at the end
+ */
+ virtual void unputBuffer(const char *buf, size_t len) {}
+
+ /**
+ * Remove a string from the end of the stream, if indeed it is at the end
+ */
+ virtual void unputBufferUni(const glui32 *buf, size_t len) {}
+
+ /**
* Send a line to the stream with a trailing newline
*/
void echoLine(char *buf, glui32 len) {
@@ -288,6 +298,16 @@ public:
*/
virtual void putBufferUni(const uint32 *buf, size_t len) override;
+ /**
+ * Remove a string from the end of the stream, if indeed it is at the end
+ */
+ virtual void unputBuffer(const char *buf, size_t len) override;
+
+ /**
+ * Remove a string from the end of the stream, if indeed it is at the end
+ */
+ virtual void unputBufferUni(const glui32 *buf, size_t len) override;
+
virtual void setStyle(glui32 val) override;
/**