aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAutumn! <autumnull@posteo.net>2023-05-24 20:37:01 +0000
committerDrew DeVault <sir@cmpwn.com>2023-06-04 09:23:19 +0200
commit93cf66cf5eec566960290da42f12bcff93c68025 (patch)
tree95180739f2874fc1ee88f687906dc0f9e48574ea
parentUse types::c:: instead of char and strings:: (diff)
downloadhare-chip8-93cf66cf5eec566960290da42f12bcff93c68025.tar.gz
rwops.ha: make more rigorous in order to fix various bugs
Signed-off-by: Autumn! <autumnull@posteo.net>
Diffstat (limited to '')
-rw-r--r--sdl2/mixer/samples.ha3
-rw-r--r--sdl2/rwops.ha20
2 files changed, 14 insertions, 9 deletions
diff --git a/sdl2/mixer/samples.ha b/sdl2/mixer/samples.ha
index 0a45151..ad1ecc1 100644
--- a/sdl2/mixer/samples.ha
+++ b/sdl2/mixer/samples.ha
@@ -13,10 +13,9 @@ export type Mix_Chunk = struct {
@symbol("Mix_LoadWAV_RW") fn _Mix_LoadWAV_RW(src: *sdl2::SDL_RWops, freesrc: int) nullable *Mix_Chunk;
-// Loads a sample from an [[io::handle]]. The stream will not be closed for you.
+// Loads a sample from an [[io::handle]].
export fn Mix_LoadWAV_RW(src: io::handle) (*Mix_Chunk | sdl2::error) = {
const rw = sdl2::rw_from_handle(src);
- defer sdl2::SDL_RWclose(rw);
return sdl2::wrapptr(_Mix_LoadWAV_RW(rw, 0))?: *Mix_Chunk;
};
diff --git a/sdl2/rwops.ha b/sdl2/rwops.ha
index 9b9a190..4c9077b 100644
--- a/sdl2/rwops.ha
+++ b/sdl2/rwops.ha
@@ -16,8 +16,8 @@ export type SDL_RWops = struct {
sz: *fn(ctx: *SDL_RWops) i64,
seek: *fn(ctx: *SDL_RWops, offs: i64, whence: int) i64,
read: *fn(ctx: *SDL_RWops, ptr: *void, sz: size, maxnum: size) size,
- write: *fn(ctx: *SDL_RWops, ptr: *void, sz: size, num: size) size,
- close: *fn(ctx: *SDL_RWops) void,
+ write: *fn(ctx: *SDL_RWops, ptr: *const void, sz: size, num: size) size,
+ close: *fn(ctx: *SDL_RWops) int,
type_: rwops_type,
// XXX: This union is platform-specific
@@ -105,24 +105,30 @@ fn stream_read(ctx: *SDL_RWops, ptr: *void, sz: size, maxnum: size) size = {
let buf = ptr: *[*]u8;
match (io::readall(handle, buf[..sz * maxnum])) {
case let n: size =>
- return n;
+ return n / sz;
+ case io::EOF =>
+ return 0;
case io::error =>
return 0;
};
};
-fn stream_write(ctx: *SDL_RWops, ptr: *void, sz: size, num: size) size = {
+fn stream_write(ctx: *SDL_RWops, ptr: *const void, sz: size, num: size) size = {
const handle = *(&ctx.hidden.unknown.data1: *io::handle);
- let buf = ptr: *[*]u8;
+ let buf = ptr: *[*]const u8;
match (io::writeall(handle, buf[..sz * num])) {
case let n: size =>
- return n;
+ return n / sz;
case io::error =>
return 0;
};
};
-fn stream_close(ctx: *SDL_RWops) void = {
+fn stream_close(ctx: *SDL_RWops) int = {
const handle = *(&ctx.hidden.unknown.data1: *io::handle);
free(ctx);
+ match (io::close(handle)) {
+ case void => return 0;
+ case io::error => return -1;
+ };
};