diff options
| -rw-r--r-- | engines/gargoyle/glk.cpp | 25 | ||||
| -rw-r--r-- | engines/gargoyle/glk.h | 17 | ||||
| -rw-r--r-- | engines/gargoyle/streams.cpp | 53 | ||||
| -rw-r--r-- | engines/gargoyle/streams.h | 20 | 
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;  	/** | 
