static ssize_t port_read (void *cookie, char *buf, size_t siz) { SCM port = PTR2SCM (cookie); #ifdef GUILE_CHARS_ARE_UCS4 int c; if (siz >= 1) { c = scm_get_byte_or_eof (port); if (c == EOF) return 0; else buf[0] = c; return 1; } else return PORT_ERR; #else /* For Guile 1.8.x, we use scm_read_char so we can preserve line and column information. */ SCM c; if (siz >= 1) { c = scm_read_char (port); if (scm_is_true (scm_eof_object_p (c))) return 0; else buf[0] = scm_to_char (c); return 1; } else return PORT_ERR; #endif }
scm_close_port(port); TEST_ASSERT_EQUAL_INT(-1, scm_read_cchr(&actual, port)); } static void test_read_char(ScmObj port) { ScmObj actual = SCM_OBJ_INIT, expected = SCM_OBJ_INIT; SCM_REFSTK_INIT_REG(&port, &actual, &expected); expected = scm_make_char(&(scm_char_t){ .ascii = TEST_FILE_CONTENTS[0] }, SCM_ENC_SRC); actual = scm_read_char(port); TEST_ASSERT_SCM_EQUAL(expected, actual); } static void test_read_char__return_EOF(ScmObj port) { SCM_REFSTK_INIT_REG(&port); for (size_t i = 0; i < strlen(TEST_FILE_CONTENTS); i++) scm_read_char(port); TEST_ASSERT_TRUE(scm_eof_object_p(scm_read_char(port))); }