Example #1
0
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)));
}