X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=src%2Fstream.c;h=7e61dc93b9a4b5183b8e99cc3b9c82571aea6546;hb=59ec228b7cbadb992b27c435c8b2b4fdc4252556;hp=abcf2dda5e9016553a6aa1229f5173fb2849877c;hpb=2baac1a1aa285bc52da8feb92433144a1e50bcce;p=rodin%2Fchimara.git diff --git a/src/stream.c b/src/stream.c index abcf2dd..7e61dc9 100644 --- a/src/stream.c +++ b/src/stream.c @@ -3,10 +3,8 @@ #include #include -/* Global current stream */ -static strid_t current_stream = NULL; -/* List of streams currently in existence */ -static GList *stream_list = NULL; +#include "chimara-glk-private.h" +extern ChimaraGlkPrivate *glk_data; /* Internal function: create a window stream to go with window. */ strid_t @@ -19,8 +17,8 @@ window_stream_new(winid_t window) str->window = window; /* Add it to the global stream list */ - stream_list = g_list_prepend(stream_list, str); - str->stream_list = stream_list; + glk_data->stream_list = g_list_prepend(glk_data->stream_list, str); + str->stream_list = glk_data->stream_list; return str; } @@ -46,7 +44,7 @@ glk_stream_iterate(strid_t str, glui32 *rockptr) GList *retnode; if(str == NULL) - retnode = stream_list; + retnode = glk_data->stream_list; else retnode = str->stream_list->next; strid_t retval = retnode? (strid_t)retnode->data : NULL; @@ -90,7 +88,7 @@ glk_stream_set_current(strid_t str) return; } - current_stream = str; + glk_data->current_stream = str; } /** @@ -103,7 +101,7 @@ glk_stream_set_current(strid_t str) strid_t glk_stream_get_current() { - return current_stream; + return glk_data->current_stream; } /** @@ -116,8 +114,22 @@ glk_stream_get_current() void glk_put_char(unsigned char ch) { - g_return_if_fail(current_stream != NULL); - glk_put_char_stream(current_stream, ch); + g_return_if_fail(glk_data->current_stream != NULL); + glk_put_char_stream(glk_data->current_stream, ch); +} + +/** + * glk_put_char_uni: + * @ch: A Unicode code point. + * + * Prints one character to the current stream. The character is assumed to be a + * Unicode code point. + */ +void +glk_put_char_uni(glui32 ch) +{ + g_return_if_fail(glk_data->current_stream != NULL); + glk_put_char_stream_uni(glk_data->current_stream, ch); } /** @@ -135,8 +147,23 @@ glk_put_char(unsigned char ch) void glk_put_string(char *s) { - g_return_if_fail(current_stream != NULL); - glk_put_string_stream(current_stream, s); + g_return_if_fail(glk_data->current_stream != NULL); + glk_put_string_stream(glk_data->current_stream, s); +} + +/** + * glk_put_string_uni: + * @s: A zero-terminated string of Unicode code points. + * + * Prints a string of Unicode characters to the current stream. It is equivalent + * to a series of glk_put_char_uni() calls. A string ends on a #glui32 whose + * value is 0. + */ +void +glk_put_string_uni(glui32 *s) +{ + g_return_if_fail(glk_data->current_stream != NULL); + glk_put_string_stream_uni(glk_data->current_stream, s); } /** @@ -155,8 +182,23 @@ glk_put_string(char *s) void glk_put_buffer(char *buf, glui32 len) { - g_return_if_fail(current_stream != NULL); - glk_put_buffer_stream(current_stream, buf, len); + g_return_if_fail(glk_data->current_stream != NULL); + glk_put_buffer_stream(glk_data->current_stream, buf, len); +} + +/** + * glk_put_buffer_uni: + * @buf: An array of Unicode code points. + * @len: Length of @buf. + * + * Prints a block of Unicode characters to the current stream. It is equivalent + * to a series of glk_put_char_uni() calls. + */ +void +glk_put_buffer_uni(glui32 *buf, glui32 len) +{ + g_return_if_fail(glk_data->current_stream != NULL); + glk_put_buffer_stream_uni(glk_data->current_stream, buf, len); } /** @@ -214,8 +256,8 @@ glk_stream_open_memory(char *buf, glui32 buflen, glui32 fmode, glui32 rock) str->unicode = FALSE; /* Add it to the global stream list */ - stream_list = g_list_prepend(stream_list, str); - str->stream_list = stream_list; + glk_data->stream_list = g_list_prepend(glk_data->stream_list, str); + str->stream_list = glk_data->stream_list; return str; } @@ -248,8 +290,8 @@ glk_stream_open_memory_uni(glui32 *buf, glui32 buflen, glui32 fmode, glui32 rock str->unicode = TRUE; /* Add it to the global stream list */ - stream_list = g_list_prepend(stream_list, str); - str->stream_list = stream_list; + glk_data->stream_list = g_list_prepend(glk_data->stream_list, str); + str->stream_list = glk_data->stream_list; return str; } @@ -328,8 +370,8 @@ file_stream_new(frefid_t fileref, glui32 fmode, glui32 rock, gboolean unicode) if(str->filename == NULL) str->filename = g_strdup("Unknown file name"); /* fail silently */ /* Add it to the global stream list */ - stream_list = g_list_prepend(stream_list, str); - str->stream_list = stream_list; + glk_data->stream_list = g_list_prepend(glk_data->stream_list, str); + str->stream_list = glk_data->stream_list; return str; } @@ -436,11 +478,11 @@ void stream_close_common(strid_t str, stream_result_t *result) { /* Remove the stream from the global stream list */ - stream_list = g_list_delete_link(stream_list, str->stream_list); + glk_data->stream_list = g_list_delete_link(glk_data->stream_list, str->stream_list); /* If it was the current output stream, set that to NULL */ - if(current_stream == str) - current_stream = NULL; + if(glk_data->current_stream == str) + glk_data->current_stream = NULL; /* If it was one or more windows' echo streams, set those to NULL */ winid_t win;