aboutsummaryrefslogtreecommitdiff
path: root/sdl2/errors.ha
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2021-12-10 09:42:10 +0100
committerDrew DeVault <sir@cmpwn.com>2021-12-10 09:44:50 +0100
commit9607eb0de784fab1a99833f567c0eaca72b67e4a (patch)
tree7f79a0914a6db1d963d877bed051f6856c54cfa8 /sdl2/errors.ha
parentMakefile: drop -T+libc (diff)
downloadhare-chip8-9607eb0de784fab1a99833f567c0eaca72b67e4a.tar.gz
all: rig up Hare-native error handling
Diffstat (limited to 'sdl2/errors.ha')
-rw-r--r--sdl2/errors.ha31
1 files changed, 31 insertions, 0 deletions
diff --git a/sdl2/errors.ha b/sdl2/errors.ha
new file mode 100644
index 0000000..bc02505
--- /dev/null
+++ b/sdl2/errors.ha
@@ -0,0 +1,31 @@
+use strings;
+
+// Returned when an error occurs in an SDL function.
+export type error = !str;
+
+// Converts an SDL error into a human-friendly string.
+export fn strerror(err: error) str = {
+ return err: str;
+};
+
+@symbol("SDL_GetError") fn geterror() const *char;
+
+export fn wrapvoid(ret: int) (void | error) = {
+ wrapint(ret)?;
+};
+
+export fn wrapint(ret: int) (int | error) = {
+ if (ret < 0) {
+ return strings::fromc(geterror()): error;
+ };
+ return ret;
+};
+
+export fn wrapptr(ret: nullable *void) (*void | error) = {
+ match (ret) {
+ case let v: *void =>
+ return v;
+ case null =>
+ return strings::fromc(geterror()): error;
+ };
+};