liblinux++

A hosted C++ runtime without any libc.
git clone git://henryandlizzy.uk/liblinux++
Log | Files | Refs

commit d9b07a955ad27b4143c3f34b18b1130957718d50
parent 6f3496ae521b5cb620b09de33f5c13030a02a417
Author: Henry Wilson <henry@henryandlizzy.uk>
Date:   Thu,  8 Jan 2026 21:28:37 +0000

noexcept more things

Diffstat:
Mlinux.hpp | 48++++++++++++++++++++++++++++++------------------
Mls.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;