Constant Story "ResStream"; Constant Headline "Not a game.^"; ! To run properly, the compiled game file for this test must be embedded in ! a blorb file with the following Data chunks: ! (No quotes. Newlines only where marked as "\n". "\0" represents a null ! byte. "\xFF" represents a byte with value 255.) ! ! Data 1, TEXT: "Magic purple people eater." ! Data 2, TEXT: "Orange bucket.\nLavender socks.\n" ! Data 3, BINA: "Az\xE1l\xEB\xE5\xDF.\n" ! Data 4, BINA: "\0\0\0C\0\0\0h\0\0\0e\0\0\0e\0\0\0s\0\0\0e\0\0\0\n ! \0\0\0b\0\0\0u\0\0\0c\0\0\0k\0\0\0e\0\0\0t\0\0\0.\0\0\0\n" ! ("Cheese\nbucket.\n" as a sequence of big-endian 4-byte values) ! Data 5, TEXT: "A \xC3\xA5\xCF\x89 \xD7\x90\xD7\xAA \xE2\x80\x9C\xE2\x80\x9D ! \xE3\x81\x8A\xE3\x81\x99\xE3\x82\x82.\n" ! ("A @{E5}@{3C9} @{5D0}@{5EA} @{201C}@{201D} @{304A}@{3059}@{3082}.\n", ! encoded in bytes as UTF-8) ! Data 6, TEXT: "\xE2\x80\x9CBob\xE2\x80\x9D Z\xC3\xB6r\xC3\xB1en\xC4\x8Dek\n ! The \xD0\xA7\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB2\xD0\xB5\xD0\xBA\n" ! ("@{201C}Bob@{201D} Z@{F6}r@{F1}en@{010D}ek\n ! The @{0427}@{0435}@{043b}@{043e}@{0432}@{0435}@{043a}\n", ! encoded in bytes as UTF-8) ! Data 7, BINA: "\0\0\0C\0\0\0\xE1\0\0\0t\0\0\0\n ! \0\0\x01f\0\0\x03\xA9\0\0\x1E\x8E\0\0 \x19\0\0\0s\0\0N\x08\0\0\0!" ! ("C@{E1}t\n@{0166}@{03A9}@{1E8E}@{2019}s@{4E08}!", ! as a sequence of big-endian 4-byte values) ! Data 8, FORM: "FORM\0\0\0\x04TEST" ! (A valid IFF file, with formtype TEST, containing no chunks) Release 2; Global mainwin = 0; Constant BUFLEN = 80; Array buffer -> BUFLEN+4; Array buffer2 -> BUFLEN+4; Array ubuffer --> BUFLEN+4; Array ubuffer2 --> BUFLEN+4; Array gg_result --> 2; Array gg_arguments --> 8; Global errorcount = 0; Constant HDR_GLULXVERSION $04; ! long word Constant ROM_GAMERELEASE $34; ! short word Constant ROM_GAMESERIAL $36; ! six ASCII characters [ Main val; @setiosys 2 0; ! select Glk I/O system mainwin = glk($0023, 0, 0, 0, 3, 0); ! glk_window_open glk($002F, mainwin); ! glk_set_window new_line; Banner(); new_line; RoomDesc(); val = glk($0004, 22, 0); ! gestalt_ResourceStream if (~~val) { print "This interpreter does not support resource streams.^"; return; } ResStreamTest(); if (errorcount == 0) print "^All tests passed.^"; else print "^", errorcount, " tests failed.^"; ]; [ Banner i ix; if (Story ~= 0) { glk($0086, 3); ! set header style print (string) Story; glk($0086, 0); ! set normal style } if (Headline ~= 0) print ": ", (string) Headline; print "Release "; @aloads ROM_GAMERELEASE 0 i; print i; print " / Serial number "; for (i=0 : i<6 : i++) print (char) ROM_GAMESERIAL->i; print " / Inform v"; inversion; print ", compiler options "; i = false; #Ifdef STRICT_MODE; print "S"; i++; #Endif; ! STRICT_MODE #Ifdef INFIX; print "X"; i++; #Ifnot; #Ifdef DEBUG; print "D"; i++; #Endif; ! DEBUG #Endif; ! INFIX if (~~i) print "(none)"; new_line; @gestalt 1 0 ix; print "Interpreter version ", ix / $10000, ".", (ix & $FF00) / $100, ".", ix & $FF, " / "; @gestalt 0 0 ix; print "VM ", ix / $10000, ".", (ix & $FF00) / $100, ".", ix & $FF, " / "; ix = HDR_GLULXVERSION-->0; print "game file format ", ix / $10000, ".", (ix & $FF00) / $100, ".", ix & $FF, "^"; ]; [ RoomDesc; print "A voice booooms out: Welcome to the test chamber.^^"; ]; [ uni_to_buffer arr val len str oldstr; oldstr = glk($0048); ! stream_get_current str = glk($0139, arr, BUFLEN, 1, 0); ! stream_open_memory_uni if (str == 0) return 0; glk($0047, str); ! stream_set_current if (val->0 == $c0 or $c1) val(); else @streamstr val; glk($0047, oldstr); ! stream_set_current @copy $ffffffff sp; @copy str sp; @glk $0044 2 0; ! stream_close @copy sp len; @copy sp 0; return len; ]; [ compare_string buf blen val len ix; len = val.print_to_array(buffer2, BUFLEN); if (len ~= blen) { print "ERROR: String does not match -- wrong length: ", len, ", not ", blen, "^"; errorcount++; return; } for (ix=0 : ixix ~= buffer2->(4+ix)) { print "ERROR: String does not match -- character ", ix, " is ", (char) buf->ix, ", not ", (char) buffer2->(4+ix), "^"; errorcount++; return; } } ]; [ compare_unistring ubuf blen val len ix; len = uni_to_buffer(ubuffer2, val); if (len ~= blen) { print "ERROR: String does not match -- wrong length: ", len, ", not ", blen, "^"; errorcount++; return; } for (ix=0 : ixix ~= ubuffer2-->(ix)) { print "ERROR: String does not match -- character ", ix, " is ", (char) ubuf-->ix, ", not ", (char) ubuffer2-->(ix), "^"; errorcount++; return; } } ]; [ check_value val wanted; print val; if (val ~= wanted) { print " (ERROR, wanted ", wanted, ")"; errorcount++; } ]; [ check_result_counts readcount writecount; if (gg_result-->0 ~= readcount) { print "ERROR: Read count was wrong: ", gg_result-->0, ", not ", readcount, "^"; errorcount++; } if (gg_result-->1 ~= writecount) { print "ERROR: Read count was wrong: ", gg_result-->1, ", not ", writecount, "^"; errorcount++; } ]; [ ResStreamTest str len len2 id count val; str = glk($0049, 999, 999); ! stream_open_resource if (str) { errorcount++; print "Error: opening stream for a nonexistent resource should fail.^"; } str = glk($013A, 999, 999); ! stream_open_resource_uni if (str) { errorcount++; print "Error: opening uni stream for a nonexistent resource should fail.^"; } print "Opening Data 1 for iteration:^"; str = glk($0049, 1, 11); ! stream_open_resource if (~~str) { errorcount++; print "Error: unable to open Data 1.^"; return; } count = 0; id = glk($0040, 0, gg_arguments); ! stream_iterate while (id) { if (id == str) { count++; if (gg_arguments-->0 ~= 11) { errorcount++; print "Error: wrong rock in iteration.^"; } } id = glk($0040, id, gg_arguments); ! stream_iterate } glk($0044, str, gg_result); ! stream_close check_result_counts(0, 0); if (count == 0) { errorcount++; print "Error: resource stream not visible in iteration.^"; } if (count > 1) { errorcount++; print "Error: resource stream multiply-visible in iteration.^"; } print "* text byte stream, byte read calls^"; print "Opening Data 1 for get_buffer_stream:^"; str = glk($0049, 1, 11); ! stream_open_resource len = glk($0092, str, buffer, BUFLEN); ! get_buffer_stream compare_string(buffer, len, "Magic purple people eater."); glk($0044, str, gg_result); ! stream_close check_result_counts(26, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 2 for short get_buffer_stream:^"; str = glk($0049, 2, 11); ! stream_open_resource len = glk($0092, str, buffer, 10); ! get_buffer_stream print "First read: "; check_value(len, 10); new_line; len2 = glk($0092, str, buffer+len, 40); ! get_buffer_stream len = len+len2; compare_string(buffer, len, "Orange bucket.^Lavender socks.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(31, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 1 for get_line_stream:^"; str = glk($0049, 1, 11); ! stream_open_resource len = glk($0091, str, buffer, BUFLEN); ! get_line_stream compare_string(buffer, len, "Magic purple people eater."); glk($0044, str, gg_result); ! stream_close check_result_counts(26, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 2 for get_line_stream:^"; str = glk($0049, 2, 11); ! stream_open_resource len = glk($0091, str, buffer, BUFLEN); ! get_line_stream compare_string(buffer, len, "Orange bucket.^"); print "got: "; glk($0084, buffer, len); ! put_buffer_stream len = glk($0091, str, buffer, BUFLEN); ! get_line_stream compare_string(buffer, len, "Lavender socks.^"); print "got: "; glk($0084, buffer, len); ! put_buffer_stream glk($0044, str, gg_result); ! stream_close check_result_counts(31, 0); new_line; print "Opening Data 2 for get_char_stream:^"; str = glk($0049, 2, 12); ! stream_open_resource len = 0; while (1) { val = glk($0090, str); ! get_char_stream if (val == -1) break; buffer->len = val; len++; } compare_string(buffer, len, "Orange bucket.^Lavender socks.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(31, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 1 for get/set position:^"; str = glk($0049, 1, 11); ! stream_open_resource glk($0045, str, 4, 0); ! stream_set_position val = glk($0090, str); ! get_char_stream print "Got "; check_value(val, 'c'); new_line; glk($0045, str, 2, 1); ! stream_set_position val = glk($0090, str); ! get_char_stream print "Got "; check_value(val, 'u'); new_line; val = glk($0046, str); print "Now at "; check_value(val, 8); new_line; glk($0045, str, -2, 2); ! stream_set_position val = glk($0090, str); ! get_char_stream print "Got "; check_value(val, 'r'); new_line; glk($0044, str, gg_result); ! stream_close check_result_counts(3, 0); new_line; print "* text byte stream, unicode read calls^"; buffer->0 = 'x'; ubuffer-->0 = 'x'; print "Opening Data 1 for get_buffer_stream_uni:^"; str = glk($0049, 1, 11); ! stream_open_resource len = glk($0131, str, ubuffer, BUFLEN); ! get_buffer_stream_uni compare_unistring(ubuffer, len, "Magic purple people eater."); glk($0044, str, gg_result); ! stream_close check_result_counts(26, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "Opening Data 2 for short get_buffer_stream_uni:^"; str = glk($0049, 2, 11); ! stream_open_resource len = glk($0131, str, ubuffer, 10); ! get_buffer_stream_uni print "First read: "; check_value(len, 10); new_line; len2 = glk($0131, str, ubuffer+4*len, 40); ! get_buffer_stream_uni len = len+len2; compare_unistring(ubuffer, len, "Orange bucket.^Lavender socks.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(31, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "Opening Data 1 for get_line_stream_uni:^"; str = glk($0049, 1, 11); ! stream_open_resource len = glk($0132, str, ubuffer, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len, "Magic purple people eater."); glk($0044, str, gg_result); ! stream_close check_result_counts(26, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "Opening Data 2 for get_line_stream_uni:^"; str = glk($0049, 2, 11); ! stream_open_resource len = glk($0132, str, ubuffer, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len, "Orange bucket.^"); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni len = glk($0132, str, ubuffer, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len, "Lavender socks.^"); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni glk($0044, str, gg_result); ! stream_close check_result_counts(31, 0); new_line; print "Opening Data 2 for get_char_stream_uni:^"; str = glk($0049, 2, 12); ! stream_open_resource len = 0; while (1) { val = glk($0130, str); ! get_char_stream_uni if (val == -1) break; ubuffer-->len = val; len++; } compare_unistring(ubuffer, len, "Orange bucket.^Lavender socks.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(31, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "Opening Data 1 for get/set position:^"; str = glk($0049, 1, 11); ! stream_open_resource glk($0045, str, 4, 0); ! stream_set_position val = glk($0130, str); ! get_char_stream_uni print "Got "; check_value(val, 'c'); new_line; glk($0045, str, -2, 1); ! stream_set_position val = glk($0130, str); ! get_char_stream_uni print "Got "; check_value(val, 'i'); new_line; val = glk($0046, str); print "Now at "; check_value(val, 4); new_line; glk($0045, str, -2, 2); ! stream_set_position val = glk($0130, str); ! get_char_stream_uni print "Got "; check_value(val, 'r'); new_line; glk($0044, str, gg_result); ! stream_close check_result_counts(3, 0); new_line; print "* binary byte stream, byte read calls^"; print "Opening Data 3 for get_buffer_stream:^"; str = glk($0049, 3, 11); ! stream_open_resource len = glk($0092, str, buffer, BUFLEN); ! get_buffer_stream compare_string(buffer, len, "Az@{E1}l@{EB}@{E5}@{DF}.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(9, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 3 for get_line_stream:^"; str = glk($0049, 3, 11); ! stream_open_resource len = glk($0091, str, buffer+1, BUFLEN); ! get_line_stream compare_string(buffer, len+1, "AAz@{E1}l@{EB}@{E5}@{DF}.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(9, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 3 for get_char_stream:^"; str = glk($0049, 3, 12); ! stream_open_resource len = 0; while (1) { val = glk($0090, str); ! get_char_stream if (val == -1) break; buffer->len = val; len++; } compare_string(buffer, len, "Az@{E1}l@{EB}@{E5}@{DF}.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(9, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "* binary byte stream, unicode read calls^"; buffer->0 = 'x'; ubuffer-->0 = 'x'; print "Opening Data 3 for get_buffer_stream_uni:^"; str = glk($0049, 3, 11); ! stream_open_resource len = glk($0131, str, ubuffer, BUFLEN); ! get_buffer_stream_uni compare_unistring(ubuffer, len, "Az@{E1}l@{EB}@{E5}@{DF}.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(9, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "Opening Data 3 for get_line_stream_uni:^"; str = glk($0049, 3, 11); ! stream_open_resource len = glk($0132, str, ubuffer+8, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len+2, "AzAz@{E1}l@{EB}@{E5}@{DF}.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(9, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "Opening Data 3 for get_char_stream_uni:^"; str = glk($0049, 3, 12); ! stream_open_resource len = 0; while (1) { val = glk($0130, str); ! get_char_stream_uni if (val == -1) break; ubuffer-->len = val; len++; } compare_unistring(ubuffer, len, "Az@{E1}l@{EB}@{E5}@{DF}.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(9, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "* text unicode stream, byte read calls^"; ! We treat an ASCII text resource as UTF-8, which is safe, because ! they're the same for the 0-7F range. print "Opening Data 1 for get_buffer_stream:^"; str = glk($013A, 1, 11); ! stream_open_resource_uni len = glk($0092, str, buffer, BUFLEN); ! get_buffer_stream compare_string(buffer, len, "Magic purple people eater."); glk($0044, str, gg_result); ! stream_close check_result_counts(26, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 2 for short get_buffer_stream:^"; str = glk($013A, 2, 11); ! stream_open_resource_uni len = glk($0092, str, buffer, 10); ! get_buffer_stream print "First read: "; check_value(len, 10); new_line; len2 = glk($0092, str, buffer+len, 40); ! get_buffer_stream len = len+len2; compare_string(buffer, len, "Orange bucket.^Lavender socks.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(31, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 1 for get_line_stream:^"; str = glk($013A, 1, 11); ! stream_open_resource_uni len = glk($0091, str, buffer, BUFLEN); ! get_line_stream compare_string(buffer, len, "Magic purple people eater."); glk($0044, str, gg_result); ! stream_close check_result_counts(26, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 2 for get_line_stream:^"; str = glk($013A, 2, 11); ! stream_open_resource_uni len = glk($0091, str, buffer, BUFLEN); ! get_line_stream compare_string(buffer, len, "Orange bucket.^"); print "got: "; glk($0084, buffer, len); ! put_buffer_stream len = glk($0091, str, buffer, BUFLEN); ! get_line_stream compare_string(buffer, len, "Lavender socks.^"); print "got: "; glk($0084, buffer, len); ! put_buffer_stream glk($0044, str, gg_result); ! stream_close check_result_counts(31, 0); new_line; print "Opening Data 2 for get_char_stream:^"; str = glk($013A, 2, 12); ! stream_open_resource_uni len = 0; while (1) { val = glk($0090, str); ! get_char_stream if (val == -1) break; buffer->len = val; len++; } compare_string(buffer, len, "Orange bucket.^Lavender socks.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(31, 0); print "got: "; glk($0084, buffer, len); ! put_buffer_stream new_line; print "Opening Data 1 for get/set position:^"; str = glk($013A, 1, 11); ! stream_open_resource_uni glk($0045, str, 4, 0); ! stream_set_position val = glk($0090, str); ! get_char_stream print "Got "; check_value(val, 'c'); new_line; glk($0045, str, 2, 1); ! stream_set_position val = glk($0090, str); ! get_char_stream print "Got "; check_value(val, 'u'); new_line; val = glk($0046, str); print "Now at "; check_value(val, 8); new_line; glk($0045, str, -2, 2); ! stream_set_position val = glk($0090, str); ! get_char_stream print "Got "; check_value(val, 'r'); new_line; glk($0044, str, gg_result); ! stream_close check_result_counts(3, 0); new_line; print "* text unicode stream, unicode read calls^"; print "Opening Data 5 for get_buffer_stream_uni:^"; str = glk($013A, 5, 11); ! stream_open_resource_uni len = glk($0131, str, ubuffer, BUFLEN); ! get_buffer_stream_uni compare_unistring(ubuffer, len, "A @{E5}@{3C9} @{5D0}@{5EA} @{201C}@{201D} @{304A}@{3059}@{3082}.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(16, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "Opening Data 6 for short get_buffer_stream_uni:^"; str = glk($013A, 6, 11); ! stream_open_resource_uni len = glk($0131, str, ubuffer, 10); ! get_buffer_stream_uni print "got ", len, " first: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; len2 = glk($0131, str, ubuffer+4*len, 64); ! get_buffer_stream_uni print "got ", len2, " second: "; glk($012A, ubuffer+4*len, len2); ! glk_put_buffer_uni glk($0044, str, gg_result); ! stream_close check_result_counts(28, 0); compare_unistring(ubuffer, len+len2, "@{201C}Bob@{201D} Z@{F6}r@{F1}en@{010D}ek^The @{0427}@{0435}@{043b}@{043e}@{0432}@{0435}@{043a}^"); new_line; print "Opening Data 5 for get_line_stream_uni:^"; str = glk($013A, 5, 11); ! stream_open_resource_uni len = glk($0132, str, ubuffer, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len, "A @{E5}@{3C9} @{5D0}@{5EA} @{201C}@{201D} @{304A}@{3059}@{3082}.^"); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; glk($0044, str, gg_result); ! stream_close check_result_counts(16, 0); new_line; print "Opening Data 6 for get_line_stream_uni:^"; str = glk($013A, 6, 11); ! stream_open_resource_uni len = glk($0132, str, ubuffer, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len, "@{201C}Bob@{201D} Z@{F6}r@{F1}en@{010D}ek^"); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; len = glk($0132, str, ubuffer, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len, "The @{0427}@{0435}@{043b}@{043e}@{0432}@{0435}@{043a}^"); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni glk($0044, str, gg_result); ! stream_close check_result_counts(28, 0); new_line; print "Opening Data 5 for get_char_stream_uni:^"; str = glk($013A, 5, 12); ! stream_open_resource_uni len = 0; while (1) { val = glk($0130, str); ! get_char_stream_uni if (val == -1) break; ubuffer-->len = val; len++; } compare_unistring(ubuffer, len, "A @{E5}@{3C9} @{5D0}@{5EA} @{201C}@{201D} @{304A}@{3059}@{3082}.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(16, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "* binary unicode stream, byte read calls^"; print "Opening Data 4 for get_buffer_stream_uni:^"; str = glk($013A, 4, 11); ! stream_open_resource_uni len = glk($0131, str, ubuffer, BUFLEN); ! get_buffer_stream_uni compare_unistring(ubuffer, len, "Cheese^bucket.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(15, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; ubuffer-->0 = '$'; print "Opening Data 4 for get_line_stream_uni:^"; str = glk($013A, 4, 11); ! stream_open_resource_uni len = glk($0132, str, ubuffer+4, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len+1, "$Cheese^"); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; len = glk($0132, str, ubuffer, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len, "bucket.^"); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni glk($0044, str, gg_result); ! stream_close check_result_counts(15, 0); new_line; print "Opening Data 4 for get_char_stream_uni:^"; str = glk($013A, 4, 12); ! stream_open_resource_uni len = 0; while (1) { val = glk($0130, str); ! get_char_stream_uni if (val == -1) break; ubuffer-->len = val; len++; } compare_unistring(ubuffer, len, "Cheese^bucket.^"); glk($0044, str, gg_result); ! stream_close check_result_counts(15, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; print "* binary unicode stream, unicode read calls^"; print "Opening Data 7 for get_buffer_stream_uni:^"; str = glk($013A, 7, 11); ! stream_open_resource_uni len = glk($0131, str, ubuffer, BUFLEN); ! get_buffer_stream_uni compare_unistring(ubuffer, len, "C@{E1}t^@{0166}@{03A9}@{1E8E}@{2019}s@{4E08}!"); glk($0044, str, gg_result); ! stream_close check_result_counts(11, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; ubuffer-->0 = '$'; print "Opening Data 7 for get_line_stream_uni:^"; str = glk($013A, 7, 11); ! stream_open_resource_uni len = glk($0132, str, ubuffer+4, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len+1, "$C@{E1}t^"); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; len = glk($0132, str, ubuffer, BUFLEN); ! get_line_stream_uni compare_unistring(ubuffer, len, "@{0166}@{03A9}@{1E8E}@{2019}s@{4E08}!"); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni glk($0044, str, gg_result); ! stream_close check_result_counts(11, 0); new_line; print "Opening Data 7 for get_char_stream_uni:^"; str = glk($013A, 7, 12); ! stream_open_resource_uni len = 0; while (1) { val = glk($0130, str); ! get_char_stream_uni if (val == -1) break; ubuffer-->len = val; len++; } compare_unistring(ubuffer, len, "C@{E1}t^@{0166}@{03A9}@{1E8E}@{2019}s@{4E08}!"); glk($0044, str, gg_result); ! stream_close check_result_counts(11, 0); print "got: "; glk($012A, ubuffer, len); ! glk_put_buffer_uni new_line; new_line; print "* binary FORM byte stream, byte read calls^"; print "Opening Data 8 for get_buffer_stream:^"; str = glk($0049, 8, 11); ! stream_open_resource if (~~str) { print "ERROR: This interpreter does not appear to support the July 2012 spec update for FORM data.^"; errorcount++; } else { len = glk($0092, str, buffer, BUFLEN); ! get_buffer_stream print "Read "; check_value(len, 12); print " bytes.^"; glk($0044, str, gg_result); ! stream_close check_result_counts(12, 0); print "Contents: "; val = buffer; check_value(val-->0, $464F524D); print ", "; check_value(val-->1, $0004); print ", "; check_value(val-->2, $54455354); new_line; } ];