File: rt.ha

package info (click to toggle)
hare 0.25.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,948 kB
  • sloc: asm: 1,264; makefile: 123; sh: 114; lisp: 101
file content (48 lines) | stat: -rw-r--r-- 1,116 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>

use rt;

// Wraps an [[rt::errno]] to produce an [[error]], which may be [[opaque_]].
// This is a non-portable interface which is mainly provided to support internal
// stdlib requirements.
export fn errno(errno: rt::errno) error = {
	switch (errno) {
	case rt::ECONNREFUSED =>
		return refused;
	case rt::ECANCELED =>
		return cancelled;
	case rt::EOVERFLOW =>
		return overflow;
	case rt::EACCES =>
		return noaccess;
	case rt::EINVAL =>
		return invalid;
	case rt::EEXIST =>
		return exists;
	case rt::ENOENT =>
		return noentry;
	case rt::ETIMEDOUT =>
		return timeout;
	case rt::EBUSY =>
		return busy;
	case rt::EINTR =>
		return interrupted;
	case rt::EAGAIN =>
		return again;
	case rt::ENETUNREACH =>
		return netunreachable;
	case => void;
	};

	static assert(size(rt::errno) <= size(opaque_data));
	let err = opaque_ { strerror = &rt_strerror, ... };
	let ptr = &err.data: *rt::errno;
	*ptr = errno;
	return err;
};

fn rt_strerror(err: *opaque_data) const str = {
	let err = err: *rt::errno;
	return rt::strerror(*err);
};