commit d9b07a955ad27b4143c3f34b18b1130957718d50
parent 6f3496ae521b5cb620b09de33f5c13030a02a417
Author: Henry Wilson <henry@henryandlizzy.uk>
Date: Thu, 8 Jan 2026 21:28:37 +0000
noexcept more things
Diffstat:
| M | linux.hpp | | | 48 | ++++++++++++++++++++++++++++++------------------ |
| M | ls.cpp | | | 11 | +---------- |
2 files changed, 31 insertions(+), 28 deletions(-)
diff --git a/linux.hpp b/linux.hpp
@@ -49,13 +49,13 @@ template <typename T>
struct span
{
span() = default;
- inline span(T* p, size_t n)
+ inline span(T* p, size_t n) noexcept
: ptr{p}
, len{n}
{}
template <size_t N>
- inline span(T (&arr)[N])
+ inline span(T (&arr)[N]) noexcept
: span{arr, N}
{}
@@ -83,8 +83,8 @@ private:
struct file
{
constexpr file() = default;
- constexpr explicit file(int n) : num{n} {}
- constexpr operator bool() const { return num >= 0; }
+ constexpr explicit file(int n) noexcept : num{n} {}
+ constexpr operator bool() const noexcept { return num >= 0; }
int num = -1;
};
@@ -98,8 +98,8 @@ enum class errno_t : int16_t;
template <typename T>
struct [[nodiscard]] syscall_result
{
- explicit operator bool() const { return val >= 0; }
- T operator*() const
+ explicit operator bool() const noexcept { return val >= 0; }
+ T operator*() const noexcept
{
assert(*this);
if constexpr (__is_pointer(T))
@@ -107,7 +107,7 @@ struct [[nodiscard]] syscall_result
else
return static_cast<T>(val);
}
- errno_t err() const
+ errno_t err() const noexcept
{
assert(not *this);
return static_cast<errno_t>(val);
@@ -118,17 +118,29 @@ private:
struct c_str
{
- constexpr c_str(char const *p)
+ constexpr c_str(char const *p) noexcept
: str{p}
{}
template <size_t N>
- constexpr c_str(char const (&arr)[N])
+ constexpr c_str(char const (&arr)[N]) noexcept
: str{arr}
{
static_assert(N > 0);
static_assert(arr[N-1] == '\0');
}
+ size_t length() const noexcept
+ {
+ if (not str)
+ return 0;
+
+ char const* p = str;
+ while (*p)
+ ++p;
+
+ return p - str;
+ }
+
private:
[[maybe_unused]] char const* str;
};
@@ -187,11 +199,11 @@ enum class unlink_flags : int
REMOVEDIR = 0x200,
};
-extern syscall_result<void> unlinkat(file dir, c_str path, unlink_flags flags);
+extern syscall_result<void> unlinkat(file dir, c_str path, unlink_flags flags) noexcept;
-extern syscall_result<void> execve(c_str path, char *const /*_Nullable*/ argv[], char *const /*_Nullable*/ envp[]);
+extern syscall_result<void> execve(c_str path, char *const /*_Nullable*/ argv[], char *const /*_Nullable*/ envp[]) noexcept;
-extern syscall_result<file> socket(int domain, int type, int protocol);
+extern syscall_result<file> socket(int domain, int type, int protocol) noexcept;
struct addr_ref
{
@@ -200,7 +212,7 @@ struct addr_ref
struct in_addr
{
- in_addr(uint16_t port, uint32_t ipv4)
+ in_addr(uint16_t port, uint32_t ipv4) noexcept
: family{2}
, data{
uint8_t((port & 0xFF00) >> 8),
@@ -212,13 +224,13 @@ struct in_addr
}
{}
- operator addr_ref() const { return {.fat_ptr = {(char const*)this, sizeof(*this)}}; }
+ operator addr_ref() const noexcept { return {.fat_ptr = {(char const*)this, sizeof(*this)}}; }
private:
[[maybe_unused]] uint16_t family;
[[maybe_unused]] uint8_t data[14];
};
-extern syscall_result<void> bind(file socket, addr_ref addr);
-extern syscall_result<void> listen(file socket, int backlog);
-extern syscall_result<file> accept(file socket, void* addr_buf, socklen_t* addr_len);
-extern syscall_result<file> dup(file oldfd, file newfd, int flags = 0);
+extern syscall_result<void> bind(file socket, addr_ref addr) noexcept;
+extern syscall_result<void> listen(file socket, int backlog) noexcept;
+extern syscall_result<file> accept(file socket, void* addr_buf, socklen_t* addr_len) noexcept;
+extern syscall_result<file> dup(file oldfd, file newfd, int flags = 0) noexcept;
diff --git a/ls.cpp b/ls.cpp
@@ -1,14 +1,5 @@
#include "linux.hpp"
-static size_t strlen(char const* p)
-{
- char const* const begin = p;
- while (*p)
- ++p;
-
- return p - begin;
-}
-
int main()
{
auto dir = openat(AT_FDCWD, ".", O_RDONLY, 0);
@@ -29,7 +20,7 @@ int main()
{
auto e = reinterpret_cast<linux_dirent64*>(buf + i);
char* const name = buf + i + sizeof(linux_dirent64);
- size_t len = strlen(name);
+ size_t len = c_str{name}.length();
name[len++] = '\n';
ios[n_io++] = span<char const>{name, len};
i += e->d_reclen;