Compare commits

...

4 Commits

Author SHA1 Message Date
Bananymous fe6a6de923 BuildSystem: Rework the whole cmake build system
Now files are installed using the install() command instead of manually
copying files to their destinations. This allows automatic recompilation
of headers that did not work previously
2024-06-19 04:20:23 +03:00
Bananymous 318ce5dec8 All: Fix a lot of compiler warnings from header files
While reworking build system, header files started to report warnings.
2024-06-18 23:02:10 +03:00
Bananymous 526d4369ce Ports: Don't throw error if _installed_ does not exist
This was annoying and I got multiple people reporting it as a possible
bug.
2024-06-18 13:16:33 +03:00
Bananymous c69919738b BuildSystem: Move all userpace libraries under the userspace directory
As the number of libraries is increasing, root directory starts to
expand. This adds better organization for libraries
2024-06-18 13:14:35 +03:00
293 changed files with 1304 additions and 1802 deletions

View File

@ -1,7 +1,3 @@
cmake_minimum_required(VERSION 3.26)
project(BAN CXX)
set(BAN_SOURCES set(BAN_SOURCES
BAN/Assert.cpp BAN/Assert.cpp
BAN/New.cpp BAN/New.cpp
@ -9,16 +5,8 @@ set(BAN_SOURCES
BAN/Time.cpp BAN/Time.cpp
) )
add_custom_target(ban-headers
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${BANAN_INCLUDE}/
DEPENDS sysroot
)
add_library(ban ${BAN_SOURCES}) add_library(ban ${BAN_SOURCES})
add_dependencies(ban headers libc-install) banan_link_library(ban libc)
add_custom_target(ban-install banan_install_headers(ban)
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/libban.a ${BANAN_LIB}/ install(TARGETS ban)
DEPENDS ban
BYPRODUCTS ${BANAN_LIB}/libban.a
)

View File

@ -193,7 +193,7 @@ namespace BAN
} }
inline constexpr BAN::StringView operator""sv(const char* str, BAN::StringView::size_type len) { return BAN::StringView(str, len); } inline constexpr BAN::StringView operator""_sv(const char* str, BAN::StringView::size_type len) { return BAN::StringView(str, len); }
namespace BAN::Formatter namespace BAN::Formatter
{ {

View File

@ -10,52 +10,48 @@ add_compile_definitions(__enable_sse=1)
project(banan-os CXX C ASM) project(banan-os CXX C ASM)
set(BANAN_BASE_SYSROOT ${CMAKE_SOURCE_DIR}/base-sysroot.tar.gz) set(BANAN_BASE_SYSROOT ${CMAKE_SOURCE_DIR}/base-sysroot.tar.gz)
set(BANAN_INCLUDE ${BANAN_SYSROOT}/usr/include) set(BANAN_INCLUDE ${BANAN_SYSROOT}/usr/include)
set(BANAN_LIB ${BANAN_SYSROOT}/usr/lib) set(BANAN_LIB ${BANAN_SYSROOT}/usr/lib)
set(BANAN_BIN ${BANAN_SYSROOT}/usr/bin) set(BANAN_BIN ${BANAN_SYSROOT}/usr/bin)
set(BANAN_ETC ${BANAN_SYSROOT}/usr/etc)
set(BANAN_SHARE ${BANAN_SYSROOT}/usr/share) set(BANAN_SHARE ${BANAN_SYSROOT}/usr/share)
set(BANAN_BOOT ${BANAN_SYSROOT}/boot) set(BANAN_BOOT ${BANAN_SYSROOT}/boot)
set(CMAKE_INSTALL_BINDIR ${BANAN_BIN})
set(CMAKE_INSTALL_SBINDIR ${BANAN_BIN})
set(CMAKE_INSTALL_LIBDIR ${BANAN_LIB})
set(CMAKE_INSTALL_INCLUDEDIR ${BANAN_INCLUDE})
set(CMAKE_INSTALL_SYSCONF ${BANAN_ETC})
set(CMAKE_INSTALL_MESSAGE NEVER)
# include headers of ${library} to ${target}
function(banan_include_headers target library)
target_include_directories(${target} PRIVATE $<TARGET_PROPERTY:${library},SOURCE_DIR>/include)
endfunction()
# include headers and link ${library} to ${target}
function(banan_link_library target library)
target_link_libraries(${target} PRIVATE ${library})
banan_include_headers(${target} ${library})
endfunction()
# add install step for all header files of target
function(banan_install_headers target)
file(GLOB_RECURSE headers RELATIVE $<TARGET_PROPERTY:${target},SOURCE_DIR>/include "*.h")
foreach(header ${headers})
get_filename_component(subdirectory ${header} DIRECTORY)
install(FILES include/${header} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${subdirectory} OPTIONAL)
endforeach()
target_include_directories(${target} PRIVATE $<TARGET_PROPERTY:${target},SOURCE_DIR>/include)
endfunction()
add_subdirectory(kernel) add_subdirectory(kernel)
add_subdirectory(bootloader) add_subdirectory(bootloader)
add_subdirectory(BAN) add_subdirectory(BAN)
add_subdirectory(libc)
add_subdirectory(LibELF)
add_subdirectory(LibFont)
add_subdirectory(LibGUI)
add_subdirectory(LibImage)
add_subdirectory(LibInput)
add_subdirectory(userspace) add_subdirectory(userspace)
add_custom_target(sysroot add_custom_target(sysroot
COMMAND ${CMAKE_COMMAND} -E make_directory ${BANAN_SYSROOT} COMMAND ${CMAKE_COMMAND} -E make_directory ${BANAN_SYSROOT}
COMMAND cd ${BANAN_SYSROOT} && tar xf ${BANAN_BASE_SYSROOT} COMMAND cd ${BANAN_SYSROOT} && tar xf ${BANAN_BASE_SYSROOT}
) )
add_custom_target(headers
DEPENDS kernel-headers
DEPENDS ban-headers
DEPENDS libc-headers
DEPENDS libelf-headers
DEPENDS libfont-headers
DEPENDS libgui-headers
DEPENDS libimage-headers
DEPENDS libinput-headers
)
add_custom_target(install-sysroot
DEPENDS kernel-install
DEPENDS ban-install
DEPENDS libc-install
DEPENDS userspace-install
DEPENDS libelf-install
DEPENDS libfont-install
DEPENDS libgui-install
DEPENDS libimage-install
DEPENDS libinput-install
)
add_custom_target(package-sysroot
COMMAND cd ${BANAN_SYSROOT} && tar cf ${BANAN_SYSROOT_TAR} *
DEPENDS install-sysroot
)

View File

@ -1,12 +0,0 @@
cmake_minimum_required(VERSION 3.26)
project(LibELF CXX)
add_custom_target(libelf-headers
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${BANAN_INCLUDE}/
DEPENDS sysroot
)
add_custom_target(libelf-install
DEPENDS libelf-headers
)

View File

@ -1,25 +0,0 @@
cmake_minimum_required(VERSION 3.26)
project(libfont CXX)
set(LIBGUI_SOURCES
Font.cpp
PSF.cpp
)
add_custom_target(libfont-headers
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${BANAN_INCLUDE}/
DEPENDS sysroot
)
add_library(libfont ${LIBGUI_SOURCES})
add_dependencies(libfont headers libc-install)
target_link_libraries(libfont PUBLIC libc)
add_custom_target(libfont-install
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/libfont.a ${BANAN_LIB}/
DEPENDS libfont
BYPRODUCTS ${BANAN_LIB}/libfont.a
)
set(CMAKE_STATIC_LIBRARY_PREFIX "")

View File

@ -1,24 +0,0 @@
cmake_minimum_required(VERSION 3.26)
project(libgui CXX)
set(LIBGUI_SOURCES
Window.cpp
)
add_custom_target(libgui-headers
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${BANAN_INCLUDE}/
DEPENDS sysroot
)
add_library(libgui ${LIBGUI_SOURCES})
add_dependencies(libgui headers libc-install)
target_link_libraries(libgui PUBLIC libc libfont)
add_custom_target(libgui-install
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/libgui.a ${BANAN_LIB}/
DEPENDS libgui
BYPRODUCTS ${BANAN_LIB}/libgui.a
)
set(CMAKE_STATIC_LIBRARY_PREFIX "")

View File

@ -1,27 +0,0 @@
cmake_minimum_required(VERSION 3.26)
project(libimage CXX)
set(LIBIMAGE_SOURCES
Image.cpp
Netbpm.cpp
PNG.cpp
)
add_custom_target(libimage-headers
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${BANAN_INCLUDE}/
DEPENDS sysroot
)
add_library(libimage ${LIBIMAGE_SOURCES})
add_dependencies(libimage headers libc-install)
target_link_libraries(libimage PUBLIC libc)
target_compile_options(libimage PRIVATE -O3)
add_custom_target(libimage-install
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/libimage.a ${BANAN_LIB}/
DEPENDS libimage
BYPRODUCTS ${BANAN_LIB}/libimage.a
)
set(CMAKE_STATIC_LIBRARY_PREFIX "")

View File

@ -1,24 +0,0 @@
cmake_minimum_required(VERSION 3.26)
project(libinput CXX)
set(LIBINPUT_SOURCES
KeyEvent.cpp
KeyboardLayout.cpp
)
add_custom_target(libinput-headers
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${BANAN_INCLUDE}/
DEPENDS sysroot
)
add_library(libinput ${LIBINPUT_SOURCES})
target_link_libraries(libinput PUBLIC libc ban)
add_custom_target(libinput-install
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/libinput.a ${BANAN_LIB}/
DEPENDS libinput
BYPRODUCTS ${BANAN_LIB}/libinput.a
)
set(CMAKE_STATIC_LIBRARY_PREFIX "")

View File

@ -1,474 +0,0 @@
#include <BAN/Debug.h>
#include <BAN/HashMap.h>
#include <BAN/String.h>
#include <BAN/StringView.h>
#include <LibInput/KeyboardLayout.h>
#if __is_kernel
#include <kernel/FS/VirtualFileSystem.h>
#else
#include <fcntl.h>
#include <limits.h>
#include <sys/stat.h>
#endif
#include <ctype.h>
namespace LibInput
{
struct StringViewLower
{
BAN::StringView value;
StringViewLower(BAN::StringView sv)
: value(sv)
{ }
bool operator==(const StringViewLower& other) const
{
if (value.size() != other.value.size())
return false;
for (size_t i = 0; i < value.size(); i++)
if (tolower(value[i]) != tolower(other.value[i]))
return false;
return true;
}
};
struct StringViewLowerHash
{
BAN::hash_t operator()(const StringViewLower& value) const
{
constexpr BAN::hash_t FNV_offset_basis = 0x811c9dc5;
constexpr BAN::hash_t FNV_prime = 0x01000193;
BAN::hash_t hash = FNV_offset_basis;
for (size_t i = 0; i < value.value.size(); i++)
{
hash *= FNV_prime;
hash ^= (uint8_t)tolower(value.value[i]);
}
return hash;
}
};
static BAN::UniqPtr<KeyboardLayout> s_instance;
BAN::ErrorOr<void> KeyboardLayout::initialize()
{
ASSERT(!s_instance);
s_instance = TRY(BAN::UniqPtr<KeyboardLayout>::create());
return {};
}
KeyboardLayout& KeyboardLayout::get()
{
ASSERT(s_instance);
return *s_instance;
}
KeyboardLayout::KeyboardLayout()
{
for (auto& key : m_keycode_to_key_normal)
key = Key::None;
for (auto& key : m_keycode_to_key_shift)
key = Key::None;
for (auto& key : m_keycode_to_key_altgr)
key = Key::None;
}
KeyEvent KeyboardLayout::key_event_from_raw(RawKeyEvent event)
{
KeyEvent result;
result.modifier = event.modifier;
if (result.shift())
result.key = m_keycode_to_key_shift[event.keycode];
else if (result.ralt())
result.key = m_keycode_to_key_altgr[event.keycode];
else
result.key = m_keycode_to_key_normal[event.keycode];
return result;
}
static BAN::Optional<uint8_t> parse_keycode(BAN::StringView str)
{
if (str.size() > 3)
return {};
uint16_t keycode = 0;
for (char c : str)
{
if (!isdigit(c))
return {};
keycode = (keycode * 10) + (c - '0');
}
if (keycode >= 0xFF)
return {};
return keycode;
}
static BAN::HashMap<StringViewLower, Key, StringViewLowerHash> s_name_to_key;
static BAN::ErrorOr<void> initialize_name_to_key();
static BAN::Optional<Key> parse_key(BAN::StringView name)
{
if (s_name_to_key.contains(name))
return s_name_to_key[name];
return {};
}
static BAN::ErrorOr<BAN::Vector<BAN::String>> load_keymap_lines_and_parse_includes(BAN::StringView path)
{
BAN::String file_data;
BAN::String canonical_path;
#if __is_kernel
{
auto file = TRY(Kernel::VirtualFileSystem::get().file_from_absolute_path({ 0, 0, 0, 0 }, path, 0));
TRY(file_data.resize(file.inode->size()));
TRY(file.inode->read(0, BAN::ByteSpan { reinterpret_cast<uint8_t*>(file_data.data()), file_data.size() }));
canonical_path = file.canonical_path;
}
#else
{
char null_path[PATH_MAX];
strncpy(null_path, path.data(), path.size());
null_path[path.size()] = '\0';
struct stat st;
if (stat(null_path, &st) == -1)
return BAN::Error::from_errno(errno);
TRY(file_data.resize(st.st_size));
int fd = open(null_path, O_RDONLY);
if (fd == -1)
return BAN::Error::from_errno(errno);
ssize_t nread = read(fd, file_data.data(), st.st_size);
close(fd);
if (nread != st.st_size)
return BAN::Error::from_errno(errno);
MUST(canonical_path.append(path));
}
#endif
BAN::Vector<BAN::String> result;
auto lines = TRY(file_data.sv().split('\n'));
for (auto line : lines)
{
auto parts = TRY(line.split([](char c) -> bool { return isspace(c); }));
if (parts.empty() || parts.front().front() == '#')
continue;
if (parts.front() == "include"sv)
{
if (parts.size() != 2)
{
dprintln("Invalid modifier instruction in keymap '{}'", line);
dprintln(" format: include \"PATH\"");
return BAN::Error::from_errno(EINVAL);
}
if (parts[1].size() < 2 || parts[1].front() != '"' || parts[1].back() != '"')
{
dprintln("Invalid modifier instruction in keymap '{}'", line);
dprintln(" format: include \"PATH\"");
return BAN::Error::from_errno(EINVAL);
}
parts[1] = parts[1].substring(1, parts[1].size() - 2);
BAN::String include_path;
TRY(include_path.append(canonical_path));
ASSERT(include_path.sv().contains('/'));
while (include_path.back() != '/')
include_path.pop_back();
TRY(include_path.append(parts[1]));
auto new_lines = TRY(load_keymap_lines_and_parse_includes(include_path));
TRY(result.reserve(result.size() + new_lines.size()));
for (auto& line : new_lines)
TRY(result.push_back(BAN::move(line)));
}
else
{
BAN::String line_str;
TRY(line_str.append(line));
TRY(result.push_back(BAN::move(line_str)));
}
}
return result;
}
BAN::ErrorOr<void> KeyboardLayout::load_from_file(BAN::StringView path)
{
if (s_name_to_key.empty())
TRY(initialize_name_to_key());
auto new_layout = TRY(BAN::UniqPtr<KeyboardLayout>::create());
bool shift_is_mod = false;
bool altgr_is_mod = false;
auto lines = TRY(load_keymap_lines_and_parse_includes(path));
for (const auto& line : lines)
{
auto parts = TRY(line.sv().split([](char c) -> bool { return isspace(c); }));
if (parts.empty() || parts.front().front() == '#')
continue;
if (parts.size() == 1)
{
dprintln("Invalid line in keymap '{}'", line);
dprintln(" format: KEYCODE KEY [MODIFIER=KEY]...");
dprintln(" format: mod MODIFIER");
dprintln(" format: include \"PATH\"");
return BAN::Error::from_errno(EINVAL);
}
if (parts.front() == "mod"sv)
{
if (parts.size() != 2)
{
dprintln("Invalid modifier instruction in keymap '{}'", line);
dprintln(" format: mod MODIFIER");
return BAN::Error::from_errno(EINVAL);
}
if (parts[1] == "shift"sv)
shift_is_mod = true;
else if (parts[1] == "altgr"sv)
altgr_is_mod = true;
else
{
dprintln("Unrecognized modifier '{}'", parts[1]);
return BAN::Error::from_errno(EINVAL);
}
continue;
}
auto keycode = parse_keycode(parts.front());
if (!keycode.has_value())
{
dprintln("Invalid keycode '{}', keycode must number between [0, 0xFF[", parts.front());
return BAN::Error::from_errno(EINVAL);
}
auto default_key = parse_key(parts[1]);
if (!default_key.has_value())
{
dprintln("Unrecognized key '{}'", parts[1]);
return BAN::Error::from_errno(EINVAL);
}
new_layout->m_keycode_to_key_normal[*keycode] = *default_key;
new_layout->m_keycode_to_key_shift[*keycode] = *default_key;
new_layout->m_keycode_to_key_altgr[*keycode] = *default_key;
for (size_t i = 2; i < parts.size(); i++)
{
auto pair = TRY(parts[i].split('='));
if (pair.size() != 2)
{
dprintln("Invalid modifier format '{}', modifier format: MODIFIRER=KEY", parts[i]);
return BAN::Error::from_errno(EINVAL);
}
auto key = parse_key(pair.back());
if (!key.has_value())
{
dprintln("Unrecognized key '{}'", pair.back());
return BAN::Error::from_errno(EINVAL);
}
if (shift_is_mod && pair.front() == "shift"sv)
new_layout->m_keycode_to_key_shift[*keycode] = *key;
else if (altgr_is_mod && pair.front() == "altgr"sv)
new_layout->m_keycode_to_key_altgr[*keycode] = *key;
else
{
dprintln("Unrecognized modifier '{}'", pair.front());
return BAN::Error::from_errno(EINVAL);
}
}
}
for (size_t i = 0; i < new_layout->m_keycode_to_key_normal.size(); i++)
if (new_layout->m_keycode_to_key_normal[i] != Key::None)
m_keycode_to_key_normal[i] = new_layout->m_keycode_to_key_normal[i];
for (size_t i = 0; i < new_layout->m_keycode_to_key_shift.size(); i++)
if (new_layout->m_keycode_to_key_shift[i] != Key::None)
m_keycode_to_key_shift[i] = new_layout->m_keycode_to_key_shift[i];
for (size_t i = 0; i < new_layout->m_keycode_to_key_altgr.size(); i++)
if (new_layout->m_keycode_to_key_altgr[i] != Key::None)
m_keycode_to_key_altgr[i] = new_layout->m_keycode_to_key_altgr[i];
return {};
}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wstack-usage="
static BAN::ErrorOr<void> initialize_name_to_key()
{
ASSERT(s_name_to_key.empty());
TRY(s_name_to_key.insert("A_Ring"sv, Key::A_Ring));
TRY(s_name_to_key.insert("A_Umlaut"sv, Key::A_Umlaut));
TRY(s_name_to_key.insert("A"sv, Key::A));
TRY(s_name_to_key.insert("Acute"sv, Key::Acute));
TRY(s_name_to_key.insert("AltGr"sv, Key::AltGr));
TRY(s_name_to_key.insert("Ampersand"sv, Key::Ampersand));
TRY(s_name_to_key.insert("ArrowDown"sv, Key::ArrowDown));
TRY(s_name_to_key.insert("ArrowLeft"sv, Key::ArrowLeft));
TRY(s_name_to_key.insert("ArrowRight"sv, Key::ArrowRight));
TRY(s_name_to_key.insert("ArrowUp"sv, Key::ArrowUp));
TRY(s_name_to_key.insert("Asterix"sv, Key::Asterix));
TRY(s_name_to_key.insert("AtSign"sv, Key::AtSign));
TRY(s_name_to_key.insert("B"sv, Key::B));
TRY(s_name_to_key.insert("BackSlash"sv, Key::BackSlash));
TRY(s_name_to_key.insert("Backspace"sv, Key::Backspace));
TRY(s_name_to_key.insert("BackTick"sv, Key::BackTick));
TRY(s_name_to_key.insert("BrokenBar"sv, Key::BrokenBar));
TRY(s_name_to_key.insert("C"sv, Key::C));
TRY(s_name_to_key.insert("Calculator"sv, Key::Calculator));
TRY(s_name_to_key.insert("CapsLock"sv, Key::CapsLock));
TRY(s_name_to_key.insert("Caret"sv, Key::Caret));
TRY(s_name_to_key.insert("Cedilla"sv, Key::Cedilla));
TRY(s_name_to_key.insert("CloseCurlyBracket"sv, Key::CloseCurlyBracket));
TRY(s_name_to_key.insert("CloseParenthesis"sv, Key::CloseParenthesis));
TRY(s_name_to_key.insert("CloseSquareBracket"sv, Key::CloseSquareBracket));
TRY(s_name_to_key.insert("Colon"sv, Key::Colon));
TRY(s_name_to_key.insert("Comma"sv, Key::Comma));
TRY(s_name_to_key.insert("Currency"sv, Key::Currency));
TRY(s_name_to_key.insert("D"sv, Key::D));
TRY(s_name_to_key.insert("Delete"sv, Key::Delete));
TRY(s_name_to_key.insert("Dollar"sv, Key::Dollar));
TRY(s_name_to_key.insert("DoubleQuote"sv, Key::DoubleQuote));
TRY(s_name_to_key.insert("E"sv, Key::E));
TRY(s_name_to_key.insert("End"sv, Key::End));
TRY(s_name_to_key.insert("Enter"sv, Key::Enter));
TRY(s_name_to_key.insert("Equals"sv, Key::Equals));
TRY(s_name_to_key.insert("Escape"sv, Key::Escape));
TRY(s_name_to_key.insert("Euro"sv, Key::Euro));
TRY(s_name_to_key.insert("Exclamation"sv, Key::ExclamationMark));
TRY(s_name_to_key.insert("ExclamationMark"sv, Key::ExclamationMark));
TRY(s_name_to_key.insert("F"sv, Key::F));
TRY(s_name_to_key.insert("F1"sv, Key::F1));
TRY(s_name_to_key.insert("F10"sv, Key::F10));
TRY(s_name_to_key.insert("F11"sv, Key::F11));
TRY(s_name_to_key.insert("F12"sv, Key::F12));
TRY(s_name_to_key.insert("F2"sv, Key::F2));
TRY(s_name_to_key.insert("F3"sv, Key::F3));
TRY(s_name_to_key.insert("F4"sv, Key::F4));
TRY(s_name_to_key.insert("F5"sv, Key::F5));
TRY(s_name_to_key.insert("F6"sv, Key::F6));
TRY(s_name_to_key.insert("F7"sv, Key::F7));
TRY(s_name_to_key.insert("F8"sv, Key::F8));
TRY(s_name_to_key.insert("F9"sv, Key::F9));
TRY(s_name_to_key.insert("G"sv, Key::G));
TRY(s_name_to_key.insert("GreaterThan"sv, Key::GreaterThan));
TRY(s_name_to_key.insert("H"sv, Key::H));
TRY(s_name_to_key.insert("Half"sv, Key::Half));
TRY(s_name_to_key.insert("Hashtag"sv, Key::Hashtag));
TRY(s_name_to_key.insert("Home"sv, Key::Home));
TRY(s_name_to_key.insert("Hyphen"sv, Key::Hyphen));
TRY(s_name_to_key.insert("I"sv, Key::I));
TRY(s_name_to_key.insert("Insert"sv, Key::Insert));
TRY(s_name_to_key.insert("J"sv, Key::J));
TRY(s_name_to_key.insert("K"sv, Key::K));
TRY(s_name_to_key.insert("Key0"sv, Key::_0));
TRY(s_name_to_key.insert("Key1"sv, Key::_1));
TRY(s_name_to_key.insert("Key2"sv, Key::_2));
TRY(s_name_to_key.insert("Key3"sv, Key::_3));
TRY(s_name_to_key.insert("Key4"sv, Key::_4));
TRY(s_name_to_key.insert("Key5"sv, Key::_5));
TRY(s_name_to_key.insert("Key6"sv, Key::_6));
TRY(s_name_to_key.insert("Key7"sv, Key::_7));
TRY(s_name_to_key.insert("Key8"sv, Key::_8));
TRY(s_name_to_key.insert("Key9"sv, Key::_9));
TRY(s_name_to_key.insert("L"sv, Key::L));
TRY(s_name_to_key.insert("LAlt"sv, Key::LeftAlt));
TRY(s_name_to_key.insert("LControl"sv, Key::LeftCtrl));
TRY(s_name_to_key.insert("LeftAlt"sv, Key::LeftAlt));
TRY(s_name_to_key.insert("LeftControl"sv, Key::LeftCtrl));
TRY(s_name_to_key.insert("LeftShift"sv, Key::LeftShift));
TRY(s_name_to_key.insert("LessThan"sv, Key::LessThan));
TRY(s_name_to_key.insert("LShift"sv, Key::LeftShift));
TRY(s_name_to_key.insert("M"sv, Key::M));
TRY(s_name_to_key.insert("MediaNext"sv, Key::MediaNext));
TRY(s_name_to_key.insert("MediaPlayPause"sv, Key::MediaPlayPause));
TRY(s_name_to_key.insert("MediaPrevious"sv, Key::MediaPrevious));
TRY(s_name_to_key.insert("MediaStop"sv, Key::MediaStop));
TRY(s_name_to_key.insert("N"sv, Key::N));
TRY(s_name_to_key.insert("Negation"sv, Key::Negation));
TRY(s_name_to_key.insert("None"sv, Key::None));
TRY(s_name_to_key.insert("NumLock"sv, Key::NumLock));
TRY(s_name_to_key.insert("Numpad0"sv, Key::Numpad0));
TRY(s_name_to_key.insert("Numpad1"sv, Key::Numpad1));
TRY(s_name_to_key.insert("Numpad2"sv, Key::Numpad2));
TRY(s_name_to_key.insert("Numpad3"sv, Key::Numpad3));
TRY(s_name_to_key.insert("Numpad4"sv, Key::Numpad4));
TRY(s_name_to_key.insert("Numpad5"sv, Key::Numpad5));
TRY(s_name_to_key.insert("Numpad6"sv, Key::Numpad6));
TRY(s_name_to_key.insert("Numpad7"sv, Key::Numpad7));
TRY(s_name_to_key.insert("Numpad8"sv, Key::Numpad8));
TRY(s_name_to_key.insert("Numpad9"sv, Key::Numpad9));
TRY(s_name_to_key.insert("NumpadDecimal"sv, Key::NumpadDecimal));
TRY(s_name_to_key.insert("NumpadDivide"sv, Key::NumpadDivide));
TRY(s_name_to_key.insert("NumpadEnter"sv, Key::NumpadEnter));
TRY(s_name_to_key.insert("NumpadMinus"sv, Key::NumpadMinus));
TRY(s_name_to_key.insert("NumpadMultiply"sv, Key::NumpadMultiply));
TRY(s_name_to_key.insert("NumpadPlus"sv, Key::NumpadPlus));
TRY(s_name_to_key.insert("O_Umlaut"sv, Key::O_Umlaut));
TRY(s_name_to_key.insert("O"sv, Key::O));
TRY(s_name_to_key.insert("OpenCurlyBracket"sv, Key::OpenCurlyBracket));
TRY(s_name_to_key.insert("OpenParenthesis"sv, Key::OpenParenthesis));
TRY(s_name_to_key.insert("OpenSquareBracket"sv, Key::OpenSquareBracket));
TRY(s_name_to_key.insert("P"sv, Key::P));
TRY(s_name_to_key.insert("PageDown"sv, Key::PageDown));
TRY(s_name_to_key.insert("PageUp"sv, Key::PageUp));
TRY(s_name_to_key.insert("Percent"sv, Key::Percent));
TRY(s_name_to_key.insert("Period"sv, Key::Period));
TRY(s_name_to_key.insert("Pipe"sv, Key::Pipe));
TRY(s_name_to_key.insert("Plus"sv, Key::Plus));
TRY(s_name_to_key.insert("Pound"sv, Key::Pound));
TRY(s_name_to_key.insert("PrintScreen"sv, Key::PrintScreen));
TRY(s_name_to_key.insert("Q"sv, Key::Q));
TRY(s_name_to_key.insert("Question"sv, Key::QuestionMark));
TRY(s_name_to_key.insert("QuestionMark"sv, Key::QuestionMark));
TRY(s_name_to_key.insert("R"sv, Key::R));
TRY(s_name_to_key.insert("RAlt"sv, Key::RightAlt));
TRY(s_name_to_key.insert("RControl"sv, Key::RightCtrl));
TRY(s_name_to_key.insert("RightAlt"sv, Key::RightAlt));
TRY(s_name_to_key.insert("RightControl"sv, Key::RightCtrl));
TRY(s_name_to_key.insert("RightShift"sv, Key::RightShift));
TRY(s_name_to_key.insert("RShift"sv, Key::RightShift));
TRY(s_name_to_key.insert("S"sv, Key::S));
TRY(s_name_to_key.insert("ScrollLock"sv, Key::ScrollLock));
TRY(s_name_to_key.insert("Section"sv, Key::Section));
TRY(s_name_to_key.insert("Semicolon"sv, Key::Semicolon));
TRY(s_name_to_key.insert("SingleQuote"sv, Key::SingleQuote));
TRY(s_name_to_key.insert("Slash"sv, Key::Slash));
TRY(s_name_to_key.insert("Space"sv, Key::Space));
TRY(s_name_to_key.insert("Super"sv, Key::Super));
TRY(s_name_to_key.insert("T"sv, Key::T));
TRY(s_name_to_key.insert("Tab"sv, Key::Tab));
TRY(s_name_to_key.insert("Tilde"sv, Key::Tilde));
TRY(s_name_to_key.insert("TwoDots"sv, Key::TwoDots));
TRY(s_name_to_key.insert("U"sv, Key::U));
TRY(s_name_to_key.insert("Underscore"sv, Key::Underscore));
TRY(s_name_to_key.insert("V"sv, Key::V));
TRY(s_name_to_key.insert("VolumeDown"sv, Key::VolumeDown));
TRY(s_name_to_key.insert("VolumeMute"sv, Key::VolumeMute));
TRY(s_name_to_key.insert("VolumeUp"sv, Key::VolumeUp));
TRY(s_name_to_key.insert("W"sv, Key::W));
TRY(s_name_to_key.insert("X"sv, Key::X));
TRY(s_name_to_key.insert("Y"sv, Key::Y));
TRY(s_name_to_key.insert("Z"sv, Key::Z));
return {};
}
#pragma GCC diagnostic pop
}

View File

@ -18,5 +18,5 @@ set(SOURCES
add_executable(banan_os-bootloader-installer ${SOURCES}) add_executable(banan_os-bootloader-installer ${SOURCES})
target_compile_options(banan_os-bootloader-installer PRIVATE -O2 -std=c++20) target_compile_options(banan_os-bootloader-installer PRIVATE -O2 -std=c++20)
target_compile_definitions(banan_os-bootloader-installer PRIVATE __arch=${BANAN_ARCH}) target_compile_definitions(banan_os-bootloader-installer PRIVATE __arch=${BANAN_ARCH})
target_include_directories(banan_os-bootloader-installer PRIVATE ${CMAKE_SOURCE_DIR}/../../LibELF/include) target_include_directories(banan_os-bootloader-installer PRIVATE ${CMAKE_SOURCE_DIR}/../../userspace/libraries/LibELF/include)
target_include_directories(banan_os-bootloader-installer PRIVATE ${CMAKE_SOURCE_DIR}/../../kernel/include) target_include_directories(banan_os-bootloader-installer PRIVATE ${CMAKE_SOURCE_DIR}/../../kernel/include)

View File

@ -1,13 +1,3 @@
cmake_minimum_required(VERSION 3.26)
project(kernel CXX C ASM)
if("${BANAN_ARCH}" STREQUAL "x86_64")
set(ELF_FORMAT elf64-x86-64)
elseif("${BANAN_ARCH}" STREQUAL "i686")
set(ELF_FORMAT elf32-i386)
endif()
set(KERNEL_SOURCES set(KERNEL_SOURCES
font/prefs.psf.o font/prefs.psf.o
kernel/ACPI/ACPI.cpp kernel/ACPI/ACPI.cpp
@ -66,6 +56,7 @@ set(KERNEL_SOURCES
kernel/Networking/E1000/E1000E.cpp kernel/Networking/E1000/E1000E.cpp
kernel/Networking/IPv4Layer.cpp kernel/Networking/IPv4Layer.cpp
kernel/Networking/NetworkInterface.cpp kernel/Networking/NetworkInterface.cpp
kernel/Networking/NetworkLayer.cpp
kernel/Networking/NetworkManager.cpp kernel/Networking/NetworkManager.cpp
kernel/Networking/NetworkSocket.cpp kernel/Networking/NetworkSocket.cpp
kernel/Networking/TCPSocket.cpp kernel/Networking/TCPSocket.cpp
@ -105,7 +96,7 @@ set(KERNEL_SOURCES
icxxabi.cpp icxxabi.cpp
) )
#set(ENABLE_KERNEL_UBSAN True) set(ENABLE_KERNEL_UBSAN False)
if(ENABLE_KERNEL_UBSAN) if(ENABLE_KERNEL_UBSAN)
set(KERNEL_SOURCES ${KERNEL_SOURCES} ubsan.cpp) set(KERNEL_SOURCES ${KERNEL_SOURCES} ubsan.cpp)
@ -148,22 +139,21 @@ set(KLIBC_SOURCES
) )
set(LIBELF_SOURCES set(LIBELF_SOURCES
../LibELF/LibELF/LoadableELF.cpp ../userspace/libraries/LibELF/LibELF/LoadableELF.cpp
) )
set(LIBFONT_SOURCES set(LIBFONT_SOURCES
../LibFont/Font.cpp ../userspace/libraries/LibFont/Font.cpp
../LibFont/PSF.cpp ../userspace/libraries/LibFont/PSF.cpp
) )
set(LIBINPUT_SOURCE set(LIBINPUT_SOURCE
../LibInput/KeyboardLayout.cpp ../userspace/libraries/LibInput/KeyboardLayout.cpp
../LibInput/KeyEvent.cpp ../userspace/libraries/LibInput/KeyEvent.cpp
) )
set(KERNEL_SOURCES set(KERNEL_SOURCES
${KERNEL_SOURCES} ${KERNEL_SOURCES}
${LAI_SOURCES}
${BAN_SOURCES} ${BAN_SOURCES}
${KLIBC_SOURCES} ${KLIBC_SOURCES}
${LIBELF_SOURCES} ${LIBELF_SOURCES}
@ -172,7 +162,6 @@ set(KERNEL_SOURCES
) )
add_executable(kernel ${KERNEL_SOURCES}) add_executable(kernel ${KERNEL_SOURCES})
add_dependencies(kernel headers)
target_compile_definitions(kernel PUBLIC __is_kernel) target_compile_definitions(kernel PUBLIC __is_kernel)
target_compile_definitions(kernel PUBLIC __arch=${BANAN_ARCH}) target_compile_definitions(kernel PUBLIC __arch=${BANAN_ARCH})
@ -199,18 +188,6 @@ endif()
target_link_options(kernel PUBLIC -ffreestanding -nostdlib) target_link_options(kernel PUBLIC -ffreestanding -nostdlib)
set_source_files_properties(${LAI_SOURCES} PROPERTIES COMPILE_FLAGS -Wno-stack-usage)
add_custom_target(kernel-headers
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${BANAN_INCLUDE}/
DEPENDS sysroot
)
add_custom_target(kernel-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/kernel ${BANAN_BOOT}/banan-os.kernel
DEPENDS kernel
)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=crtbegin.o OUTPUT_VARIABLE CRTBEGIN OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=crtbegin.o OUTPUT_VARIABLE CRTBEGIN OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=crtend.o OUTPUT_VARIABLE CRTEND OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=crtend.o OUTPUT_VARIABLE CRTEND OUTPUT_STRIP_TRAILING_WHITESPACE)
@ -227,6 +204,22 @@ add_custom_command(
# COMMAND x86_64-banan_os-strip ${CMAKE_CURRENT_BINARY_DIR}/kernel # COMMAND x86_64-banan_os-strip ${CMAKE_CURRENT_BINARY_DIR}/kernel
#) #)
banan_include_headers(kernel ban)
banan_include_headers(kernel libc)
banan_include_headers(kernel libfont)
banan_include_headers(kernel libelf)
banan_include_headers(kernel libinput)
banan_install_headers(kernel)
set_target_properties(kernel PROPERTIES OUTPUT_NAME banan-os.kernel)
install(TARGETS kernel DESTINATION ${BANAN_BOOT})
if("${BANAN_ARCH}" STREQUAL "x86_64")
set(ELF_FORMAT elf64-x86-64)
elseif("${BANAN_ARCH}" STREQUAL "i686")
set(ELF_FORMAT elf32-i386)
endif()
add_custom_command( add_custom_command(
OUTPUT font/prefs.psf.o OUTPUT font/prefs.psf.o
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && objcopy -O ${ELF_FORMAT} -B i386 -I binary font/prefs.psf ${CMAKE_CURRENT_BINARY_DIR}/font/prefs.psf.o COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && objcopy -O ${ELF_FORMAT} -B i386 -I binary font/prefs.psf ${CMAKE_CURRENT_BINARY_DIR}/font/prefs.psf.o

View File

@ -48,7 +48,7 @@ namespace Kernel::ACPI::AML
AML_ERROR("IndexOp index is out of buffer bounds"); AML_ERROR("IndexOp index is out of buffer bounds");
return ParseResult::Failure; return ParseResult::Failure;
} }
auto buffer_field = MUST(BAN::RefPtr<BufferField>::create(NameSeg(""sv), buffer, index.value() * 8, 8)); auto buffer_field = MUST(BAN::RefPtr<BufferField>::create(NameSeg(""_sv), buffer, index.value() * 8, 8));
result = MUST(BAN::RefPtr<AML::Reference>::create(buffer_field)); result = MUST(BAN::RefPtr<AML::Reference>::create(buffer_field));
break; break;
} }

View File

@ -21,8 +21,8 @@ namespace Kernel::ACPI::AML
static BAN::RefPtr<Integer> Ones; static BAN::RefPtr<Integer> Ones;
}; };
const bool constant;
uint64_t value; uint64_t value;
const bool constant;
Integer(uint64_t value, bool constant = false) Integer(uint64_t value, bool constant = false)
: Node(Node::Type::Integer) : Node(Node::Type::Integer)

View File

@ -45,7 +45,7 @@ namespace Kernel::ACPI::AML
[[nodiscard]] BAN::Optional<uint64_t> as_integer(); [[nodiscard]] BAN::Optional<uint64_t> as_integer();
[[nodiscard]] virtual BAN::RefPtr<AML::Node> evaluate() { AML_TODO("evaluate, type {}", static_cast<uint8_t>(type)); return nullptr; } [[nodiscard]] virtual BAN::RefPtr<AML::Node> evaluate() { AML_TODO("evaluate, type {}", static_cast<uint8_t>(type)); return nullptr; }
[[nodiscard]] virtual bool store(BAN::RefPtr<AML::Node> source) { AML_TODO("store, type {}", static_cast<uint8_t>(type)); return false; } [[nodiscard]] virtual bool store(BAN::RefPtr<AML::Node>) { AML_TODO("store, type {}", static_cast<uint8_t>(type)); return false; }
virtual void debug_print(int indent) const = 0; virtual void debug_print(int indent) const = 0;
}; };

View File

@ -41,20 +41,20 @@ namespace Kernel::ACPI::AML
switch (object->type) switch (object->type)
{ {
case AML::Node::Type::Device: case AML::Node::Type::Device:
object_type_sv = "Device"sv; object_type_sv = "Device"_sv;
object_name_sv = static_cast<AML::Device*>(object.ptr())->name.sv(); object_name_sv = static_cast<AML::Device*>(object.ptr())->name.sv();
break; break;
case AML::Node::Type::Processor: case AML::Node::Type::Processor:
object_type_sv = "Processor"sv; object_type_sv = "Processor"_sv;
object_name_sv = static_cast<AML::Processor*>(object.ptr())->name.sv(); object_name_sv = static_cast<AML::Processor*>(object.ptr())->name.sv();
break; break;
case AML::Node::Type::ThermalZone: case AML::Node::Type::ThermalZone:
object_type_sv = "ThermalZone"sv; object_type_sv = "ThermalZone"_sv;
object_name_sv = static_cast<AML::ThermalZone*>(object.ptr())->name.sv(); object_name_sv = static_cast<AML::ThermalZone*>(object.ptr())->name.sv();
break; break;
default: default:
object_type_sv = "Unknown"sv; object_type_sv = "Unknown"_sv;
object_name_sv = "????"sv; object_name_sv = "????"_sv;
break; break;
} }

View File

@ -60,7 +60,6 @@ namespace Kernel::ACPI::AML
PackageElement(BAN::RefPtr<AML::Package> parent) PackageElement(BAN::RefPtr<AML::Package> parent)
: Node(Node::Type::PackageElement) : Node(Node::Type::PackageElement)
, parent(parent) , parent(parent)
, unresolved_name(unresolved_name)
{ {
resolved = false; resolved = false;
initialized = false; initialized = false;

View File

@ -82,18 +82,18 @@ namespace Kernel::ACPI::AML
BAN::StringView region_space_name; BAN::StringView region_space_name;
switch (region_space) switch (region_space)
{ {
case RegionSpace::SystemMemory: region_space_name = "SystemMemory"sv; break; case RegionSpace::SystemMemory: region_space_name = "SystemMemory"_sv; break;
case RegionSpace::SystemIO: region_space_name = "SystemIO"sv; break; case RegionSpace::SystemIO: region_space_name = "SystemIO"_sv; break;
case RegionSpace::PCIConfig: region_space_name = "PCIConfig"sv; break; case RegionSpace::PCIConfig: region_space_name = "PCIConfig"_sv; break;
case RegionSpace::EmbeddedController: region_space_name = "EmbeddedController"sv; break; case RegionSpace::EmbeddedController: region_space_name = "EmbeddedController"_sv; break;
case RegionSpace::SMBus: region_space_name = "SMBus"sv; break; case RegionSpace::SMBus: region_space_name = "SMBus"_sv; break;
case RegionSpace::SystemCMOS: region_space_name = "SystemCMOS"sv; break; case RegionSpace::SystemCMOS: region_space_name = "SystemCMOS"_sv; break;
case RegionSpace::PCIBarTarget: region_space_name = "PCIBarTarget"sv; break; case RegionSpace::PCIBarTarget: region_space_name = "PCIBarTarget"_sv; break;
case RegionSpace::IPMI: region_space_name = "IPMI"sv; break; case RegionSpace::IPMI: region_space_name = "IPMI"_sv; break;
case RegionSpace::GeneralPurposeIO: region_space_name = "GeneralPurposeIO"sv; break; case RegionSpace::GeneralPurposeIO: region_space_name = "GeneralPurposeIO"_sv; break;
case RegionSpace::GenericSerialBus: region_space_name = "GenericSerialBus"sv; break; case RegionSpace::GenericSerialBus: region_space_name = "GenericSerialBus"_sv; break;
case RegionSpace::PlatformCommunicationChannel: region_space_name = "PlatformCommunicationChannel"sv; break; case RegionSpace::PlatformCommunicationChannel: region_space_name = "PlatformCommunicationChannel"_sv; break;
default: region_space_name = "Unknown"sv; break; default: region_space_name = "Unknown"_sv; break;
} }
AML_DEBUG_PRINT_INDENT(indent); AML_DEBUG_PRINT_INDENT(indent);
AML_DEBUG_PRINT("OperationRegion("); AML_DEBUG_PRINT("OperationRegion(");

View File

@ -10,7 +10,7 @@ namespace Kernel
virtual dev_t rdev() const override { return m_rdev; } virtual dev_t rdev() const override { return m_rdev; }
virtual BAN::StringView name() const override { return "debug"sv; } virtual BAN::StringView name() const override { return "debug"_sv; }
protected: protected:
DebugDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev) DebugDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev)

View File

@ -16,7 +16,7 @@ namespace Kernel
virtual bool is_partition() const { return false; } virtual bool is_partition() const { return false; }
virtual bool is_storage_device() const { return false; } virtual bool is_storage_device() const { return false; }
virtual BAN::ErrorOr<BAN::UniqPtr<MemoryRegion>> mmap_region(PageTable&, off_t offset, size_t len, AddressRange, MemoryRegion::Type, PageTable::flags_t) { return BAN::Error::from_errno(EINVAL); } virtual BAN::ErrorOr<BAN::UniqPtr<MemoryRegion>> mmap_region(PageTable&, off_t offset, size_t len, AddressRange, MemoryRegion::Type, PageTable::flags_t) { (void)offset; (void)len; return BAN::Error::from_errno(EINVAL); }
virtual dev_t rdev() const override = 0; virtual dev_t rdev() const override = 0;

View File

@ -12,7 +12,7 @@ namespace Kernel
virtual dev_t rdev() const override { return m_rdev; } virtual dev_t rdev() const override { return m_rdev; }
virtual BAN::StringView name() const override { return "null"sv; } virtual BAN::StringView name() const override { return "null"_sv; }
protected: protected:
NullDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev) NullDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev)

View File

@ -10,7 +10,7 @@ namespace Kernel
virtual dev_t rdev() const override { return m_rdev; } virtual dev_t rdev() const override { return m_rdev; }
virtual BAN::StringView name() const override { return "zero"sv; } virtual BAN::StringView name() const override { return "zero"_sv; }
protected: protected:
ZeroDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev) ZeroDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev)

View File

@ -53,12 +53,12 @@ namespace Kernel
uint32_t first_fat_sector() const { return m_bpb.reserved_sector_count; } uint32_t first_fat_sector() const { return m_bpb.reserved_sector_count; }
private: private:
const FAT::BPB m_bpb;
const Type m_type;
BAN::RefPtr<BlockDevice> m_block_device; BAN::RefPtr<BlockDevice> m_block_device;
BAN::RefPtr<FATInode> m_root_inode; BAN::RefPtr<FATInode> m_root_inode;
const FAT::BPB m_bpb;
const Type m_type;
BAN::HashMap<ino_t, BAN::WeakPtr<FATInode>> m_inode_cache; BAN::HashMap<ino_t, BAN::WeakPtr<FATInode>> m_inode_cache;
BAN::Vector<uint8_t> m_fat_two_sector_buffer; BAN::Vector<uint8_t> m_fat_two_sector_buffer;

View File

@ -155,7 +155,7 @@ namespace Kernel
virtual bool can_write_impl() const = 0; virtual bool can_write_impl() const = 0;
virtual bool has_error_impl() const = 0; virtual bool has_error_impl() const = 0;
virtual BAN::ErrorOr<long> ioctl_impl(int request, void* arg) { return BAN::Error::from_errno(ENOTSUP); } virtual BAN::ErrorOr<long> ioctl_impl(int, void*) { return BAN::Error::from_errno(ENOTSUP); }
protected: protected:
mutable PriorityMutex m_mutex; mutable PriorityMutex m_mutex;

View File

@ -14,9 +14,9 @@ namespace Kernel
mode_t mode { 0 }; mode_t mode { 0 };
uid_t uid { 0 }; uid_t uid { 0 };
gid_t gid { 0 }; gid_t gid { 0 };
timespec atime { 0 }; timespec atime { 0, 0 };
timespec ctime { 0 }; timespec ctime { 0, 0 };
timespec mtime { 0 }; timespec mtime { 0, 0 };
nlink_t nlink { 0 }; nlink_t nlink { 0 };
size_t size { 0 }; size_t size { 0 };
blkcnt_t blocks { 0 }; blkcnt_t blocks { 0 };

View File

@ -154,7 +154,7 @@ namespace Kernel
#endif #endif
TaskStateSegment m_tss; TaskStateSegment m_tss;
const GDTR m_gdtr { const GDTR m_gdtr {
.size = m_gdt.size() * sizeof(SegmentDescriptor) - 1, .size = static_cast<uint16_t>(m_gdt.size() * sizeof(SegmentDescriptor) - 1),
.address = reinterpret_cast<uintptr_t>(m_gdt.data()) .address = reinterpret_cast<uintptr_t>(m_gdt.data())
}; };
}; };

View File

@ -72,8 +72,8 @@ namespace Kernel
private: private:
BAN::Array<GateDescriptor, 0x100> m_idt; BAN::Array<GateDescriptor, 0x100> m_idt;
IDTR m_idtr { IDTR m_idtr {
.size = m_idt.size() * sizeof(GateDescriptor) - 1, .size = static_cast<uint16_t>(m_idt.size() * sizeof(GateDescriptor) - 1),
.offset = reinterpret_cast<uint64_t>(m_idt.data()) .offset = reinterpret_cast<uintptr_t>(m_idt.data())
}; };
}; };

View File

@ -19,7 +19,7 @@ namespace Kernel::Input
static BAN::ErrorOr<PS2Mouse*> create(PS2Controller&); static BAN::ErrorOr<PS2Mouse*> create(PS2Controller&);
virtual void send_initialize() override; virtual void send_initialize() override;
virtual void command_timedout(uint8_t* command_data, uint8_t command_size) final override {} virtual void command_timedout(uint8_t* command_data, uint8_t command_size) final override { (void)command_data; (void)command_size; }
virtual void handle_byte(uint8_t) final override; virtual void handle_byte(uint8_t) final override;

View File

@ -14,7 +14,7 @@ namespace Kernel
protected: protected:
Interruptable() = default; Interruptable() = default;
~Interruptable() {} virtual ~Interruptable() {}
private: private:
int m_irq { -1 }; int m_irq { -1 };

View File

@ -35,18 +35,6 @@ namespace Kernel
NetworkLayer() = default; NetworkLayer() = default;
}; };
static uint16_t calculate_internet_checksum(BAN::ConstByteSpan packet, const PseudoHeader& pseudo_header) uint16_t calculate_internet_checksum(BAN::ConstByteSpan packet, const PseudoHeader& pseudo_header);
{
uint32_t checksum = 0;
for (size_t i = 0; i < sizeof(pseudo_header) / sizeof(uint16_t); i++)
checksum += BAN::host_to_network_endian(reinterpret_cast<const uint16_t*>(&pseudo_header)[i]);
for (size_t i = 0; i < packet.size() / sizeof(uint16_t); i++)
checksum += BAN::host_to_network_endian(reinterpret_cast<const uint16_t*>(packet.data())[i]);
if (packet.size() % 2)
checksum += (uint16_t)packet[packet.size() - 1] << 8;
while (checksum >> 16)
checksum = (checksum >> 16) + (checksum & 0xFFFF);
return ~(uint16_t)checksum;
}
} }

View File

@ -38,7 +38,7 @@ namespace Kernel
BAN::ErrorOr<void> add_packet(BAN::ConstByteSpan); BAN::ErrorOr<void> add_packet(BAN::ConstByteSpan);
bool is_bound() const { return !m_bound_path.empty(); } bool is_bound() const { return !m_bound_path.empty(); }
bool is_bound_to_unused() const { return m_bound_path == "X"sv; } bool is_bound_to_unused() const { return m_bound_path == "X"_sv; }
bool is_streaming() const; bool is_streaming() const;

View File

@ -25,6 +25,7 @@ namespace Kernel
Debug::dump_stack_trace(); Debug::dump_stack_trace();
} }
asm volatile("ud2"); asm volatile("ud2");
__builtin_unreachable();
} }
} }

View File

@ -132,7 +132,7 @@ acpi_release_global_lock:
if (!access_type.has_value()) if (!access_type.has_value())
return {}; return {};
auto op_region = MUST(BAN::RefPtr<AML::OpRegion>::create(""sv, address_space_id, (uint64_t)address, 0xFFFFFFFF)); auto op_region = MUST(BAN::RefPtr<AML::OpRegion>::create(""_sv, address_space_id, (uint64_t)address, 0xFFFFFFFF));
auto field_rules = AML::FieldRules { auto field_rules = AML::FieldRules {
.access_type = access_type.value(), .access_type = access_type.value(),
@ -141,7 +141,7 @@ acpi_release_global_lock:
.access_attrib = AML::FieldRules::AccessAttrib::Normal, .access_attrib = AML::FieldRules::AccessAttrib::Normal,
.access_length = 0 .access_length = 0
}; };
auto field_element = MUST(BAN::RefPtr<AML::FieldElement>::create(""sv, register_bit_offset, register_bit_width, field_rules)); auto field_element = MUST(BAN::RefPtr<AML::FieldElement>::create(""_sv, register_bit_offset, register_bit_width, field_rules));
field_element->op_region = op_region; field_element->op_region = op_region;
auto result = field_element->as_integer(); auto result = field_element->as_integer();
@ -156,7 +156,7 @@ acpi_release_global_lock:
if (!access_type.has_value()) if (!access_type.has_value())
return {}; return {};
auto op_region = MUST(BAN::RefPtr<AML::OpRegion>::create(""sv, address_space_id, (uint64_t)address, 0xFFFFFFFF)); auto op_region = MUST(BAN::RefPtr<AML::OpRegion>::create(""_sv, address_space_id, (uint64_t)address, 0xFFFFFFFF));
auto field_rules = AML::FieldRules { auto field_rules = AML::FieldRules {
.access_type = access_type.value(), .access_type = access_type.value(),
@ -165,7 +165,7 @@ acpi_release_global_lock:
.access_attrib = AML::FieldRules::AccessAttrib::Normal, .access_attrib = AML::FieldRules::AccessAttrib::Normal,
.access_length = 0 .access_length = 0
}; };
auto field_element = MUST(BAN::RefPtr<AML::FieldElement>::create(""sv, register_bit_offset, register_bit_width, field_rules)); auto field_element = MUST(BAN::RefPtr<AML::FieldElement>::create(""_sv, register_bit_offset, register_bit_width, field_rules));
field_element->op_region = op_region; field_element->op_region = op_region;
return field_element->store(MUST(BAN::RefPtr<AML::Integer>::create(value))); return field_element->store(MUST(BAN::RefPtr<AML::Integer>::create(value)));
@ -214,7 +214,7 @@ acpi_release_global_lock:
{ {
ASSERT(!s_global_lock); ASSERT(!s_global_lock);
const auto* fadt = static_cast<const FADT*>(ACPI::get().get_header("FACP"sv, 0)); const auto* fadt = static_cast<const FADT*>(ACPI::get().get_header("FACP"_sv, 0));
ASSERT(fadt); ASSERT(fadt);
uintptr_t facs_addr = fadt->firmware_ctrl; uintptr_t facs_addr = fadt->firmware_ctrl;
@ -679,7 +679,7 @@ acpi_release_global_lock:
return; return;
auto name = path.sv().substring(path.size() - 4); auto name = path.sv().substring(path.size() - 4);
if (name.substring(0, 2) != "_L"sv && name.substring(0, 2) != "_E"sv) if (name.substring(0, 2) != "_L"_sv && name.substring(0, 2) != "_E"_sv)
return; return;
auto index = hex_sv_to_int(name.substring(2)); auto index = hex_sv_to_int(name.substring(2));

View File

@ -41,7 +41,7 @@ namespace Kernel::ACPI
LockGuard _(m_object_mutex); LockGuard _(m_object_mutex);
// Base must be non-empty absolute path // Base must be non-empty absolute path
ASSERT(relative_base.prefix == "\\"sv || relative_base.path.empty()); ASSERT(relative_base.prefix == "\\"_sv || relative_base.path.empty());
// Do absolute path lookup // Do absolute path lookup
if (!relative_path.prefix.empty() || relative_path.path.size() != 1 || mode == FindMode::ForceAbsolute) if (!relative_path.prefix.empty() || relative_path.path.size() != 1 || mode == FindMode::ForceAbsolute)
@ -50,7 +50,7 @@ namespace Kernel::ACPI
MUST(absolute_path.push_back('\\')); MUST(absolute_path.push_back('\\'));
// Resolve root and parent references // Resolve root and parent references
if (relative_path.prefix == "\\"sv) if (relative_path.prefix == "\\"_sv)
; ;
else else
{ {
@ -76,7 +76,7 @@ namespace Kernel::ACPI
if (absolute_path.back() == '.') if (absolute_path.back() == '.')
absolute_path.pop_back(); absolute_path.pop_back();
if (!check_existence || absolute_path == "\\"sv || m_objects.contains(absolute_path)) if (!check_existence || absolute_path == "\\"_sv || m_objects.contains(absolute_path))
return absolute_path; return absolute_path;
return {}; return {};
} }
@ -125,7 +125,7 @@ namespace Kernel::ACPI
if (!canonical_path.has_value()) if (!canonical_path.has_value())
return nullptr; return nullptr;
if (canonical_path->sv() == "\\"sv) if (canonical_path->sv() == "\\"_sv)
return this; return this;
auto it = m_objects.find(canonical_path.value()); auto it = m_objects.find(canonical_path.value());
@ -191,28 +191,28 @@ namespace Kernel::ACPI
BAN::RefPtr<AML::Namespace> AML::Namespace::create_root_namespace() BAN::RefPtr<AML::Namespace> AML::Namespace::create_root_namespace()
{ {
ASSERT(!s_root_namespace); ASSERT(!s_root_namespace);
s_root_namespace = MUST(BAN::RefPtr<Namespace>::create(NameSeg("\\"sv))); s_root_namespace = MUST(BAN::RefPtr<Namespace>::create(NameSeg("\\"_sv)));
s_root_namespace->scope = AML::NameString("\\"sv); s_root_namespace->scope = AML::NameString("\\"_sv);
Integer::Constants::Zero = MUST(BAN::RefPtr<Integer>::create(0, true)); Integer::Constants::Zero = MUST(BAN::RefPtr<Integer>::create(0, true));
Integer::Constants::One = MUST(BAN::RefPtr<Integer>::create(1, true)); Integer::Constants::One = MUST(BAN::RefPtr<Integer>::create(1, true));
Integer::Constants::Ones = MUST(BAN::RefPtr<Integer>::create(0xFFFFFFFFFFFFFFFF, true)); Integer::Constants::Ones = MUST(BAN::RefPtr<Integer>::create(0xFFFFFFFFFFFFFFFF, true));
AML::ParseContext context; AML::ParseContext context;
context.scope = AML::NameString("\\"sv); context.scope = AML::NameString("\\"_sv);
// Add predefined namespaces // Add predefined namespaces
#define ADD_PREDEFIED_NAMESPACE(NAME) \ #define ADD_PREDEFIED_NAMESPACE(NAME) \
ASSERT(s_root_namespace->add_named_object(context, AML::NameString("\\" NAME), MUST(BAN::RefPtr<AML::Device>::create(NameSeg(NAME))))); ASSERT(s_root_namespace->add_named_object(context, AML::NameString("\\" NAME), MUST(BAN::RefPtr<AML::Device>::create(NameSeg(NAME)))));
ADD_PREDEFIED_NAMESPACE("_GPE"sv); ADD_PREDEFIED_NAMESPACE("_GPE"_sv);
ADD_PREDEFIED_NAMESPACE("_PR"sv); ADD_PREDEFIED_NAMESPACE("_PR"_sv);
ADD_PREDEFIED_NAMESPACE("_SB"sv); ADD_PREDEFIED_NAMESPACE("_SB"_sv);
ADD_PREDEFIED_NAMESPACE("_SI"sv); ADD_PREDEFIED_NAMESPACE("_SI"_sv);
ADD_PREDEFIED_NAMESPACE("_TZ"sv); ADD_PREDEFIED_NAMESPACE("_TZ"_sv);
#undef ADD_PREDEFIED_NAMESPACE #undef ADD_PREDEFIED_NAMESPACE
// Add \_OSI that returns true for Linux compatibility // Add \_OSI that returns true for Linux compatibility
auto osi = MUST(BAN::RefPtr<AML::Method>::create(NameSeg("_OSI"sv), 1, false, 0)); auto osi = MUST(BAN::RefPtr<AML::Method>::create(NameSeg("_OSI"_sv), 1, false, 0));
osi->override_function = [](AML::ParseContext& context) -> BAN::RefPtr<AML::Node> { osi->override_function = [](AML::ParseContext& context) -> BAN::RefPtr<AML::Node> {
ASSERT(context.method_args[0]); ASSERT(context.method_args[0]);
auto arg = context.method_args[0]->evaluate(); auto arg = context.method_args[0]->evaluate();
@ -234,7 +234,7 @@ namespace Kernel::ACPI
ASSERT(this == s_root_namespace.ptr()); ASSERT(this == s_root_namespace.ptr());
AML::ParseContext context; AML::ParseContext context;
context.scope = AML::NameString("\\"sv); context.scope = AML::NameString("\\"_sv);
context.aml_data = BAN::ConstByteSpan(reinterpret_cast<const uint8_t*>(&header), header.length).slice(sizeof(header)); context.aml_data = BAN::ConstByteSpan(reinterpret_cast<const uint8_t*>(&header), header.length).slice(sizeof(header));
while (context.aml_data.size() > 0) while (context.aml_data.size() > 0)

View File

@ -94,7 +94,7 @@ namespace Kernel::ACPI
AML_DEBUG_PRINTLN("Initializing {}", scope->scope); AML_DEBUG_PRINTLN("Initializing {}", scope->scope);
#endif #endif
if (auto reg = Namespace::root_namespace()->find_object(scope->scope, AML::NameString("_REG"sv), Namespace::FindMode::ForceAbsolute)) if (auto reg = Namespace::root_namespace()->find_object(scope->scope, AML::NameString("_REG"_sv), Namespace::FindMode::ForceAbsolute))
{ {
bool embedded_controller = false; bool embedded_controller = false;
Namespace::for_each_child(scope->scope, Namespace::for_each_child(scope->scope,
@ -135,7 +135,7 @@ namespace Kernel::ACPI
bool run_ini = true; bool run_ini = true;
bool init_children = true; bool init_children = true;
if (auto sta = Namespace::root_namespace()->find_object(scope->scope, AML::NameString("_STA"sv), Namespace::FindMode::ForceAbsolute)) if (auto sta = Namespace::root_namespace()->find_object(scope->scope, AML::NameString("_STA"_sv), Namespace::FindMode::ForceAbsolute))
{ {
auto result = evaluate_or_invoke(sta); auto result = evaluate_or_invoke(sta);
if (!result.has_value()) if (!result.has_value())
@ -150,7 +150,7 @@ namespace Kernel::ACPI
if (run_ini) if (run_ini)
{ {
auto ini = Namespace::root_namespace()->find_object(scope->scope, AML::NameString("_INI"sv), Namespace::FindMode::ForceAbsolute); auto ini = Namespace::root_namespace()->find_object(scope->scope, AML::NameString("_INI"_sv), Namespace::FindMode::ForceAbsolute);
if (ini) if (ini)
{ {
if (ini->type != AML::Node::Type::Method) if (ini->type != AML::Node::Type::Method)

View File

@ -132,7 +132,7 @@ namespace Kernel
return nullptr; return nullptr;
} }
const MADT* madt = (const MADT*)ACPI::ACPI::get().get_header("APIC"sv, 0); const MADT* madt = (const MADT*)ACPI::ACPI::get().get_header("APIC"_sv, 0);
if (madt == nullptr) if (madt == nullptr)
{ {
dprintln("Could not find MADT header"); dprintln("Could not find MADT header");

View File

@ -21,7 +21,7 @@ namespace Kernel
BAN::ErrorOr<BAN::String> Credentials::find_username() const BAN::ErrorOr<BAN::String> Credentials::find_username() const
{ {
auto inode = TRY(VirtualFileSystem::get().file_from_absolute_path(*this, "/etc/passwd"sv, O_RDONLY)).inode; auto inode = TRY(VirtualFileSystem::get().file_from_absolute_path(*this, "/etc/passwd"_sv, O_RDONLY)).inode;
BAN::String line; BAN::String line;
off_t offset = 0; off_t offset = 0;

View File

@ -436,8 +436,8 @@ done:
auto inode = inode_or_error.release_value(); auto inode = inode_or_error.release_value();
BAN::ScopeGuard cleanup([&] { inode->cleanup_from_fs(); }); BAN::ScopeGuard cleanup([&] { inode->cleanup_from_fs(); });
TRY(inode->link_inode_to_directory(*inode, "."sv)); TRY(inode->link_inode_to_directory(*inode, "."_sv));
TRY(inode->link_inode_to_directory(*this, ".."sv)); TRY(inode->link_inode_to_directory(*this, ".."_sv));
TRY(link_inode_to_directory(*inode, name)); TRY(link_inode_to_directory(*inode, name));
@ -569,7 +569,7 @@ needs_new_block:
if (entry.inode) if (entry.inode)
{ {
BAN::StringView entry_name(entry.name, entry.name_len); BAN::StringView entry_name(entry.name, entry.name_len);
if (entry_name != "."sv && entry_name != ".."sv) if (entry_name != "."_sv && entry_name != ".."_sv)
return false; return false;
} }
@ -608,12 +608,12 @@ needs_new_block:
{ {
BAN::StringView entry_name(entry.name, entry.name_len); BAN::StringView entry_name(entry.name, entry.name_len);
if (entry_name == "."sv) if (entry_name == "."_sv)
{ {
m_inode.links_count--; m_inode.links_count--;
sync(); sync();
} }
else if (entry_name == ".."sv) else if (entry_name == ".."_sv)
{ {
auto parent = TRY(Ext2Inode::create(m_fs, entry.inode)); auto parent = TRY(Ext2Inode::create(m_fs, entry.inode));
parent->m_inode.links_count--; parent->m_inode.links_count--;

View File

@ -212,9 +212,10 @@ namespace Kernel
return valid_entry_count; return valid_entry_count;
} }
BAN::ErrorOr<size_t> FATInode::read_impl(off_t offset, BAN::ByteSpan buffer) BAN::ErrorOr<size_t> FATInode::read_impl(off_t s_offset, BAN::ByteSpan buffer)
{ {
ASSERT(offset >= 0); ASSERT(s_offset >= 0);
uint32_t offset = s_offset;
if (offset >= m_entry.file_size) if (offset >= m_entry.file_size)
return 0; return 0;

View File

@ -103,7 +103,7 @@ namespace Kernel
LockGuard _(m_mutex); LockGuard _(m_mutex);
if (!mode().ifdir()) if (!mode().ifdir())
return BAN::Error::from_errno(ENOTDIR); return BAN::Error::from_errno(ENOTDIR);
if (name == "."sv || name == ".."sv) if (name == "."_sv || name == ".."_sv)
return BAN::Error::from_errno(EINVAL); return BAN::Error::from_errno(EINVAL);
return unlink_impl(name); return unlink_impl(name);
} }

View File

@ -12,9 +12,9 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM); return BAN::Error::from_errno(ENOMEM);
auto inode = BAN::RefPtr<ProcPidInode>::adopt(inode_ptr); auto inode = BAN::RefPtr<ProcPidInode>::adopt(inode_ptr);
TRY(inode->link_inode(*MUST(ProcROInode::create_new(process, &Process::proc_meminfo, fs, 0400, uid, gid)), "meminfo"sv)); TRY(inode->link_inode(*MUST(ProcROInode::create_new(process, &Process::proc_meminfo, fs, 0400, uid, gid)), "meminfo"_sv));
TRY(inode->link_inode(*MUST(ProcROInode::create_new(process, &Process::proc_cmdline, fs, 0400, uid, gid)), "cmdline"sv)); TRY(inode->link_inode(*MUST(ProcROInode::create_new(process, &Process::proc_cmdline, fs, 0400, uid, gid)), "cmdline"_sv));
TRY(inode->link_inode(*MUST(ProcROInode::create_new(process, &Process::proc_environ, fs, 0400, uid, gid)), "environ"sv)); TRY(inode->link_inode(*MUST(ProcROInode::create_new(process, &Process::proc_environ, fs, 0400, uid, gid)), "environ"_sv));
return inode; return inode;
} }
@ -27,9 +27,9 @@ namespace Kernel
void ProcPidInode::cleanup() void ProcPidInode::cleanup()
{ {
(void)TmpDirectoryInode::unlink_impl("meminfo"sv); (void)TmpDirectoryInode::unlink_impl("meminfo"_sv);
(void)TmpDirectoryInode::unlink_impl("cmdline"sv); (void)TmpDirectoryInode::unlink_impl("cmdline"_sv);
(void)TmpDirectoryInode::unlink_impl("environ"sv); (void)TmpDirectoryInode::unlink_impl("environ"_sv);
} }
BAN::ErrorOr<BAN::RefPtr<ProcROInode>> ProcROInode::create_new(Process& process, size_t (Process::*callback)(off_t, BAN::ByteSpan) const, TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid) BAN::ErrorOr<BAN::RefPtr<ProcROInode>> ProcROInode::create_new(Process& process, size_t (Process::*callback)(off_t, BAN::ByteSpan) const, TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid)

View File

@ -342,8 +342,8 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM); return BAN::Error::from_errno(ENOMEM);
auto inode = BAN::RefPtr<TmpDirectoryInode>::adopt(inode_ptr); auto inode = BAN::RefPtr<TmpDirectoryInode>::adopt(inode_ptr);
TRY(inode->link_inode(*inode, "."sv)); TRY(inode->link_inode(*inode, "."_sv));
TRY(inode->link_inode(*inode, ".."sv)); TRY(inode->link_inode(*inode, ".."_sv));
return inode; return inode;
} }
@ -358,8 +358,8 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM); return BAN::Error::from_errno(ENOMEM);
auto inode = BAN::RefPtr<TmpDirectoryInode>::adopt(inode_ptr); auto inode = BAN::RefPtr<TmpDirectoryInode>::adopt(inode_ptr);
TRY(inode->link_inode(*inode, "."sv)); TRY(inode->link_inode(*inode, "."_sv));
TRY(inode->link_inode(parent, ".."sv)); TRY(inode->link_inode(parent, ".."_sv));
return inode; return inode;
} }
@ -381,9 +381,9 @@ namespace Kernel
bool is_empty = true; bool is_empty = true;
for_each_valid_entry([&](TmpDirectoryEntry& entry) { for_each_valid_entry([&](TmpDirectoryEntry& entry) {
if (entry.name_sv() == "."sv) if (entry.name_sv() == "."_sv)
dot_ino = entry.ino; dot_ino = entry.ino;
else if (entry.name_sv() == ".."sv) else if (entry.name_sv() == ".."_sv)
dotdot_ino = entry.ino; dotdot_ino = entry.ino;
else else
{ {

View File

@ -17,7 +17,7 @@ namespace Kernel
ASSERT(!s_instance); ASSERT(!s_instance);
s_instance = MUST(BAN::RefPtr<VirtualFileSystem>::create()); s_instance = MUST(BAN::RefPtr<VirtualFileSystem>::create());
ASSERT(root_path.size() >= 5 && root_path.substring(0, 5) == "/dev/"sv);; ASSERT(root_path.size() >= 5 && root_path.substring(0, 5) == "/dev/"_sv);;
root_path = root_path.substring(5); root_path = root_path.substring(5);
auto root_inode = MUST(DevFileSystem::get().root_inode()->find_inode(root_path)); auto root_inode = MUST(DevFileSystem::get().root_inode()->find_inode(root_path));
@ -26,12 +26,12 @@ namespace Kernel
s_instance->m_root_fs = MUST(FileSystem::from_block_device(static_cast<BlockDevice*>(root_inode.ptr()))); s_instance->m_root_fs = MUST(FileSystem::from_block_device(static_cast<BlockDevice*>(root_inode.ptr())));
Credentials root_creds { 0, 0, 0, 0 }; Credentials root_creds { 0, 0, 0, 0 };
MUST(s_instance->mount(root_creds, &DevFileSystem::get(), "/dev"sv)); MUST(s_instance->mount(root_creds, &DevFileSystem::get(), "/dev"_sv));
MUST(s_instance->mount(root_creds, &ProcFileSystem::get(), "/proc"sv)); MUST(s_instance->mount(root_creds, &ProcFileSystem::get(), "/proc"_sv));
auto tmpfs = MUST(TmpFileSystem::create(1024, 0777, 0, 0)); auto tmpfs = MUST(TmpFileSystem::create(1024, 0777, 0, 0));
MUST(s_instance->mount(root_creds, tmpfs, "/tmp"sv)); MUST(s_instance->mount(root_creds, tmpfs, "/tmp"_sv));
} }
VirtualFileSystem& VirtualFileSystem::get() VirtualFileSystem& VirtualFileSystem::get()
@ -109,16 +109,16 @@ namespace Kernel
const auto& path_part = path_parts.back(); const auto& path_part = path_parts.back();
auto orig = inode; auto orig = inode;
if (path_part.empty() || path_part == "."sv) if (path_part.empty() || path_part == "."_sv)
{ {
} }
else if (path_part == ".."sv) else if (path_part == ".."_sv)
{ {
if (auto* mount_point = mount_from_root_inode(inode)) if (auto* mount_point = mount_from_root_inode(inode))
inode = TRY(mount_point->host.inode->find_inode(".."sv)); inode = TRY(mount_point->host.inode->find_inode(".."_sv));
else else
inode = TRY(inode->find_inode(".."sv)); inode = TRY(inode->find_inode(".."_sv));
if (!canonical_path.empty()) if (!canonical_path.empty())
{ {

View File

@ -244,7 +244,7 @@ namespace Kernel::Input
// FIXME: Initialise USB Controllers // FIXME: Initialise USB Controllers
// Determine if the PS/2 Controller Exists // Determine if the PS/2 Controller Exists
auto* fadt = static_cast<const ACPI::FADT*>(ACPI::ACPI::get().get_header("FACP"sv, 0)); auto* fadt = static_cast<const ACPI::FADT*>(ACPI::ACPI::get().get_header("FACP"_sv, 0));
if (fadt && fadt->revision > 1 && !(fadt->iapc_boot_arch & (1 << 1))) if (fadt && fadt->revision > 1 && !(fadt->iapc_boot_arch & (1 << 1)))
{ {
dwarnln_if(DEBUG_PS2, "No PS/2 available"); dwarnln_if(DEBUG_PS2, "No PS/2 available");

View File

@ -0,0 +1,20 @@
#include <kernel/Networking/NetworkLayer.h>
namespace Kernel
{
uint16_t calculate_internet_checksum(BAN::ConstByteSpan packet, const PseudoHeader& pseudo_header)
{
uint32_t checksum = 0;
for (size_t i = 0; i < sizeof(pseudo_header) / sizeof(uint16_t); i++)
checksum += BAN::host_to_network_endian(reinterpret_cast<const uint16_t*>(&pseudo_header)[i]);
for (size_t i = 0; i < packet.size() / sizeof(uint16_t); i++)
checksum += BAN::host_to_network_endian(reinterpret_cast<const uint16_t*>(packet.data())[i]);
if (packet.size() % 2)
checksum += (uint16_t)packet[packet.size() - 1] << 8;
while (checksum >> 16)
checksum = (checksum >> 16) + (checksum & 0xFFFF);
return ~(uint16_t)checksum;
}
}

View File

@ -65,7 +65,7 @@ namespace Kernel
int fd = TRY(get_free_fd()); int fd = TRY(get_free_fd());
// FIXME: path? // FIXME: path?
m_open_files[fd] = TRY(BAN::RefPtr<OpenFileDescription>::create(inode, ""sv, 0, flags)); m_open_files[fd] = TRY(BAN::RefPtr<OpenFileDescription>::create(inode, ""_sv, 0, flags));
return fd; return fd;
} }
@ -141,7 +141,7 @@ namespace Kernel
auto socket = TRY(NetworkManager::get().create_socket(sock_domain, sock_type, 0777, m_credentials.euid(), m_credentials.egid())); auto socket = TRY(NetworkManager::get().create_socket(sock_domain, sock_type, 0777, m_credentials.euid(), m_credentials.egid()));
int fd = TRY(get_free_fd()); int fd = TRY(get_free_fd());
m_open_files[fd] = TRY(BAN::RefPtr<OpenFileDescription>::create(socket, "no-path"sv, 0, O_RDWR)); m_open_files[fd] = TRY(BAN::RefPtr<OpenFileDescription>::create(socket, "no-path"_sv, 0, O_RDWR));
return fd; return fd;
} }
@ -150,8 +150,8 @@ namespace Kernel
TRY(get_free_fd_pair(fds)); TRY(get_free_fd_pair(fds));
auto pipe = TRY(Pipe::create(m_credentials)); auto pipe = TRY(Pipe::create(m_credentials));
m_open_files[fds[0]] = TRY(BAN::RefPtr<OpenFileDescription>::create(pipe, ""sv, 0, O_RDONLY)); m_open_files[fds[0]] = TRY(BAN::RefPtr<OpenFileDescription>::create(pipe, ""_sv, 0, O_RDONLY));
m_open_files[fds[1]] = TRY(BAN::RefPtr<OpenFileDescription>::create(pipe, ""sv, 0, O_WRONLY)); m_open_files[fds[1]] = TRY(BAN::RefPtr<OpenFileDescription>::create(pipe, ""_sv, 0, O_WRONLY));
return {}; return {};
} }

View File

@ -118,7 +118,7 @@ namespace Kernel
TRY(process->m_cmdline.push_back({})); TRY(process->m_cmdline.push_back({}));
TRY(process->m_cmdline.back().append(path)); TRY(process->m_cmdline.back().append(path));
process->m_loadable_elf = TRY(load_elf_for_exec(credentials, path, "/"sv, process->page_table())); process->m_loadable_elf = TRY(load_elf_for_exec(credentials, path, "/"_sv, process->page_table()));
if (!process->m_loadable_elf->is_address_space_free()) if (!process->m_loadable_elf->is_address_space_free())
{ {
dprintln("Could not load ELF address space"); dprintln("Could not load ELF address space");
@ -1942,7 +1942,7 @@ namespace Kernel
{ {
LockGuard _(m_process_lock); LockGuard _(m_process_lock);
if (path.empty() || path == "."sv) if (path.empty() || path == "."_sv)
return m_working_directory; return m_working_directory;
BAN::String absolute_path; BAN::String absolute_path;

View File

@ -30,11 +30,11 @@ namespace Kernel
s_tty = this; s_tty = this;
clear(); clear();
auto inode_or_error = DevFileSystem::get().root_inode()->find_inode("tty"sv); auto inode_or_error = DevFileSystem::get().root_inode()->find_inode("tty"_sv);
if (inode_or_error.is_error()) if (inode_or_error.is_error())
{ {
if (inode_or_error.error().get_error_code() == ENOENT) if (inode_or_error.error().get_error_code() == ENOENT)
DevFileSystem::get().add_inode("tty"sv, MUST(TmpSymlinkInode::create_new(DevFileSystem::get(), 0666, 0, 0, s_tty->name()))); DevFileSystem::get().add_inode("tty"_sv, MUST(TmpSymlinkInode::create_new(DevFileSystem::get(), 0666, 0, 0, s_tty->name())));
else else
dwarnln("{}", inode_or_error.error()); dwarnln("{}", inode_or_error.error());
return; return;
@ -82,7 +82,7 @@ namespace Kernel
Process::create_kernel( Process::create_kernel(
[](void*) [](void*)
{ {
auto file_or_error = VirtualFileSystem::get().file_from_absolute_path({ 0, 0, 0, 0 }, "/dev/input0"sv, O_RDONLY); auto file_or_error = VirtualFileSystem::get().file_from_absolute_path({ 0, 0, 0, 0 }, "/dev/input0"_sv, O_RDONLY);
if (file_or_error.is_error()) if (file_or_error.is_error())
{ {
dprintln("no input device found"); dprintln("no input device found");

View File

@ -131,7 +131,7 @@ namespace Kernel
BAN::ErrorOr<void> HPET::initialize(bool force_pic) BAN::ErrorOr<void> HPET::initialize(bool force_pic)
{ {
auto* header = static_cast<const ACPI::HPET*>(ACPI::ACPI::get().get_header("HPET"sv, 0)); auto* header = static_cast<const ACPI::HPET*>(ACPI::ACPI::get().get_header("HPET"_sv, 0));
if (header == nullptr) if (header == nullptr)
return BAN::Error::from_errno(ENODEV); return BAN::Error::from_errno(ENODEV);

View File

@ -34,7 +34,7 @@ struct ParsedCommandLine
{ {
bool force_pic = false; bool force_pic = false;
bool disable_serial = false; bool disable_serial = false;
BAN::StringView console = "tty0"sv; BAN::StringView console = "tty0"_sv;
BAN::StringView root; BAN::StringView root;
}; };
@ -215,7 +215,7 @@ static void init2(void*)
TTY::initialize_devices(); TTY::initialize_devices();
MUST(Process::create_userspace({ 0, 0, 0, 0 }, "/usr/bin/init"sv)); MUST(Process::create_userspace({ 0, 0, 0, 0 }, "/usr/bin/init"_sv));
} }
extern "C" void ap_main() extern "C" void ap_main()

View File

@ -1,68 +0,0 @@
cmake_minimum_required(VERSION 3.26)
project(libc CXX ASM)
set(LIBC_SOURCES
arpa/inet.cpp
assert.cpp
ctype.cpp
dirent.cpp
fcntl.cpp
grp.cpp
malloc.cpp
netdb.cpp
printf_impl.cpp
pwd.cpp
scanf_impl.cpp
signal.cpp
stdio.cpp
stdlib.cpp
string.cpp
strings.cpp
stropts.cpp
sys/banan-os.cpp
sys/mman.cpp
sys/select.cpp
sys/socket.cpp
sys/stat.cpp
sys/wait.cpp
termios.cpp
time.cpp
unistd.cpp
math.cpp
icxxabi.cpp
../BAN/BAN/Assert.cpp
)
add_custom_target(libc-headers
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${BANAN_INCLUDE}/
DEPENDS sysroot
)
add_custom_target(crtx
COMMAND ${CMAKE_C_COMPILER} -c ${CMAKE_CURRENT_SOURCE_DIR}/arch/${BANAN_ARCH}/crt0.S -o crt0.o
COMMAND ${CMAKE_C_COMPILER} -c ${CMAKE_CURRENT_SOURCE_DIR}/arch/${BANAN_ARCH}/crti.S -o crti.o
COMMAND ${CMAKE_C_COMPILER} -c ${CMAKE_CURRENT_SOURCE_DIR}/arch/${BANAN_ARCH}/crtn.S -o crtn.o
)
add_custom_target(crtx-install
COMMAND ${CMAKE_COMMAND} -E copy crt0.o ${BANAN_LIB}/
COMMAND ${CMAKE_COMMAND} -E copy crti.o ${BANAN_LIB}/
COMMAND ${CMAKE_COMMAND} -E copy crtn.o ${BANAN_LIB}/
DEPENDS crtx
)
add_library(libc ${LIBC_SOURCES})
add_dependencies(libc headers crtx-install)
target_compile_options(libc PRIVATE -O2 -g -Wstack-usage=512 -fno-tree-loop-distribute-patterns)
target_compile_options(libc PUBLIC -Wall -Wextra -Werror -Wno-error=stack-usage=)
add_custom_target(libc-install
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/libc.a ${BANAN_LIB}/
DEPENDS libc
BYPRODUCTS ${BANAN_LIB}/libc.a
)
set(CMAKE_STATIC_LIBRARY_PREFIX "")

View File

@ -1,10 +1,11 @@
#!/bin/bash #!/bin/bash
CURRENT_DIR=$(dirname $(realpath $0)) cd $(dirname $(realpath $0))
pushd "$CURRENT_DIR" >/dev/null
if [ ! -f installed ]; then
exit 0
fi
while read port; do while read port; do
${port}/build.sh ${port}/build.sh
done < installed done < installed
popd >/dev/null

View File

@ -112,7 +112,7 @@ index 0000000..9161771
+ +
+void DG_Init() +void DG_Init()
+{ +{
+ s_window = MUST(LibGUI::Window::create(DOOMGENERIC_RESX, DOOMGENERIC_RESY, "DOOM"sv)); + s_window = MUST(LibGUI::Window::create(DOOMGENERIC_RESX, DOOMGENERIC_RESY, "DOOM"_sv));
+ s_window->set_key_event_callback( + s_window->set_key_event_callback(
+ [](LibGUI::EventPacket::KeyEvent event) + [](LibGUI::EventPacket::KeyEvent event)
+ { + {

View File

@ -7,6 +7,9 @@ source $BANAN_SCRIPT_DIR/config.sh
FAKEROOT_FILE="$BANAN_BUILD_DIR/fakeroot-context" FAKEROOT_FILE="$BANAN_BUILD_DIR/fakeroot-context"
run_fakeroot() { run_fakeroot() {
if [ ! -f $FAKEROOT_FILE ]; then
touch $FAKEROOT_FILE
fi
fakeroot -i $FAKEROOT_FILE -s $FAKEROOT_FILE -- /bin/bash -c '$@' bash $@ fakeroot -i $FAKEROOT_FILE -s $FAKEROOT_FILE -- /bin/bash -c '$@' bash $@
} }
@ -44,9 +47,14 @@ build_toolchain () {
create_image () { create_image () {
build_target bootloader build_target bootloader
build_target install-sysroot build_target install
$BANAN_ROOT_DIR/ports/build.sh $BANAN_ROOT_DIR/ports/build.sh
build_target package-sysroot
pushd $BANAN_SYSROOT >/dev/null
run_fakeroot tar cf ${BANAN_SYSROOT_TAR} *
popd >/dev/null
$BANAN_SCRIPT_DIR/image.sh "$1" $BANAN_SCRIPT_DIR/image.sh "$1"
} }
@ -106,8 +114,12 @@ case $1 in
build_target clean build_target clean
rm -f $FAKEROOT_FILE rm -f $FAKEROOT_FILE
rm -rf $BANAN_SYSROOT rm -rf $BANAN_SYSROOT
rm -f $BANAN_SYSROOT.tar
rm -f $BANAN_DISK_IMAGE_PATH rm -f $BANAN_DISK_IMAGE_PATH
;; ;;
distclean)
rm -rf $BANAN_BUILD_DIR
;;
*) *)
build_target $1 build_target $1
;; ;;

View File

@ -1,7 +1,3 @@
cmake_minimum_required(VERSION 3.26)
project(userspace CXX)
set(USERSPACE_PROJECTS set(USERSPACE_PROJECTS
cat cat
cat-mmap cat-mmap
@ -18,7 +14,6 @@ set(USERSPACE_PROJECTS
ls ls
meminfo meminfo
mkdir mkdir
mmap-shared-test
nslookup nslookup
poweroff poweroff
resolver resolver
@ -34,6 +29,7 @@ set(USERSPACE_PROJECTS
test test
test-framebuffer test-framebuffer
test-globals test-globals
test-mmap-shared
test-mouse test-mouse
test-popen test-popen
test-sort test-sort
@ -48,19 +44,18 @@ set(USERSPACE_PROJECTS
yes yes
) )
foreach(USERSPACE_PROJECT ${USERSPACE_PROJECTS}) add_subdirectory(libraries)
add_subdirectory(${USERSPACE_PROJECT})
endforeach()
add_custom_target(userspace) add_custom_target(userspace)
add_custom_target(userspace-install DEPENDS userspace)
add_subdirectory(aoc2023) #add_subdirectory(aoc2023)
foreach(USERSPACE_PROJECT ${USERSPACE_PROJECTS}) foreach(project ${USERSPACE_PROJECTS})
target_compile_options(${USERSPACE_PROJECT} PRIVATE -g) add_subdirectory(${project})
add_dependencies(userspace ${USERSPACE_PROJECT}) add_dependencies(${project} crtx-install)
add_dependencies(userspace-install ${USERSPACE_PROJECT}-install) add_dependencies(userspace ${project})
# This is to allow cmake to link when libc updates
target_link_options(${USERSPACE_PROJECT} PRIVATE -nolibc) target_link_options(${project} PRIVATE -nolibc)
# Default compile options
target_compile_options(${project} PRIVATE -g -O2)
endforeach() endforeach()

View File

@ -1,16 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(Shell CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(Shell ${SOURCES}) add_executable(Shell ${SOURCES})
target_compile_options(Shell PUBLIC -O2 -g) banan_link_library(Shell ban)
target_link_libraries(Shell PUBLIC libc ban) banan_link_library(Shell libc)
add_custom_target(Shell-install install(TARGETS Shell)
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/Shell ${BANAN_BIN}/
DEPENDS Shell
)

View File

@ -36,7 +36,7 @@ BAN::Optional<BAN::String> parse_dollar(BAN::StringView command, size_t& i)
ASSERT(command[i] == '$'); ASSERT(command[i] == '$');
if (++i >= command.size()) if (++i >= command.size())
return "$"sv; return "$"_sv;
if (command[i] == '?') if (command[i] == '?')
{ {
@ -54,7 +54,7 @@ BAN::Optional<BAN::String> parse_dollar(BAN::StringView command, size_t& i)
if (const char* value = getenv(name.data())) if (const char* value = getenv(name.data()))
return BAN::StringView(value); return BAN::StringView(value);
return ""sv; return ""_sv;
} }
else if (command[i] == '{') else if (command[i] == '{')
{ {
@ -75,7 +75,7 @@ BAN::Optional<BAN::String> parse_dollar(BAN::StringView command, size_t& i)
if (const char* value = getenv(name.data())) if (const char* value = getenv(name.data()))
return BAN::StringView(value); return BAN::StringView(value);
return ""sv; return ""_sv;
} }
else if (command[i] == '[') else if (command[i] == '[')
{ {
@ -156,7 +156,7 @@ BAN::Optional<BAN::String> parse_dollar(BAN::StringView command, size_t& i)
return output; return output;
} }
BAN::String temp = "$"sv; BAN::String temp = "$"_sv;
MUST(temp.push_back(command[i])); MUST(temp.push_back(command[i]));
return temp; return temp;
} }
@ -288,16 +288,16 @@ BAN::Optional<int> execute_builtin(BAN::Vector<BAN::String>& args, int fd_in, in
} }
BAN::ScopeGuard _([fout, should_close] { if (should_close) fclose(fout); }); BAN::ScopeGuard _([fout, should_close] { if (should_close) fclose(fout); });
if (args.front() == "clear"sv) if (args.front() == "clear"_sv)
{ {
fprintf(fout, "\e[H\e[2J"); fprintf(fout, "\e[H\e[2J");
fflush(fout); fflush(fout);
} }
else if (args.front() == "exit"sv) else if (args.front() == "exit"_sv)
{ {
clean_exit(); clean_exit();
} }
else if (args.front() == "export"sv) else if (args.front() == "export"_sv)
{ {
bool first = false; bool first = false;
for (const auto& arg : args) for (const auto& arg : args)
@ -316,7 +316,7 @@ BAN::Optional<int> execute_builtin(BAN::Vector<BAN::String>& args, int fd_in, in
ERROR_RETURN("setenv", 1); ERROR_RETURN("setenv", 1);
} }
} }
else if (args.front() == "source"sv) else if (args.front() == "source"_sv)
{ {
if (args.size() != 2) if (args.size() != 2)
{ {
@ -325,13 +325,13 @@ BAN::Optional<int> execute_builtin(BAN::Vector<BAN::String>& args, int fd_in, in
} }
return source_script(args[1]); return source_script(args[1]);
} }
else if (args.front() == "env"sv) else if (args.front() == "env"_sv)
{ {
char** current = environ; char** current = environ;
while (*current) while (*current)
fprintf(fout, "%s\n", *current++); fprintf(fout, "%s\n", *current++);
} }
else if (args.front() == "start-gui"sv) else if (args.front() == "start-gui"_sv)
{ {
pid_t pid = fork(); pid_t pid = fork();
if (pid == 0) if (pid == 0)
@ -340,12 +340,12 @@ BAN::Optional<int> execute_builtin(BAN::Vector<BAN::String>& args, int fd_in, in
execl("/bin/Terminal", "Terminal", NULL); execl("/bin/Terminal", "Terminal", NULL);
waitpid(pid, nullptr, 0); waitpid(pid, nullptr, 0);
} }
else if (args.front() == "page-fault-test"sv) else if (args.front() == "page-fault-test"_sv)
{ {
volatile int* ptr = nullptr; volatile int* ptr = nullptr;
*ptr = 0; *ptr = 0;
} }
else if (args.front() == "kill-test"sv) else if (args.front() == "kill-test"_sv)
{ {
pid_t pid = fork(); pid_t pid = fork();
if (pid == 0) if (pid == 0)
@ -366,7 +366,7 @@ BAN::Optional<int> execute_builtin(BAN::Vector<BAN::String>& args, int fd_in, in
return 1; return 1;
} }
} }
else if (args.front() == "signal-test"sv) else if (args.front() == "signal-test"_sv)
{ {
pid_t pid = fork(); pid_t pid = fork();
if (pid == 0) if (pid == 0)
@ -400,7 +400,7 @@ BAN::Optional<int> execute_builtin(BAN::Vector<BAN::String>& args, int fd_in, in
return 1; return 1;
} }
} }
else if (args.front() == "printf-test"sv) else if (args.front() == "printf-test"_sv)
{ {
fprintf(fout, " 0.0: %f\n", 0.0f); fprintf(fout, " 0.0: %f\n", 0.0f);
fprintf(fout, " 123.0: %f\n", 123.0f); fprintf(fout, " 123.0: %f\n", 123.0f);
@ -409,7 +409,7 @@ BAN::Optional<int> execute_builtin(BAN::Vector<BAN::String>& args, int fd_in, in
fprintf(fout, "+INF: %f\n", INFINITY); fprintf(fout, "+INF: %f\n", INFINITY);
fprintf(fout, "-INF: %f\n", -INFINITY); fprintf(fout, "-INF: %f\n", -INFINITY);
} }
else if (args.front() == "cd"sv) else if (args.front() == "cd"_sv)
{ {
if (args.size() > 2) if (args.size() > 2)
{ {
@ -432,7 +432,7 @@ BAN::Optional<int> execute_builtin(BAN::Vector<BAN::String>& args, int fd_in, in
if (chdir(path.data()) == -1) if (chdir(path.data()) == -1)
ERROR_RETURN("chdir", 1); ERROR_RETURN("chdir", 1);
} }
else if (args.front() == "time"sv) else if (args.front() == "time"_sv)
{ {
args.remove(0); args.remove(0);
@ -783,7 +783,7 @@ int source_shellrc()
if (char* home = getenv("HOME")) if (char* home = getenv("HOME"))
{ {
BAN::String path(home); BAN::String path(home);
MUST(path.append("/.shellrc"sv)); MUST(path.append("/.shellrc"_sv));
if (exists(path)) if (exists(path))
return source_script(path); return source_script(path);
} }
@ -816,7 +816,7 @@ BAN::String get_prompt()
{ {
const char* raw_prompt = getenv("PS1"); const char* raw_prompt = getenv("PS1");
if (raw_prompt == nullptr) if (raw_prompt == nullptr)
return "$ "sv; return "$ "_sv;
BAN::String prompt; BAN::String prompt;
for (int i = 0; raw_prompt[i]; i++) for (int i = 0; raw_prompt[i]; i++)
@ -962,7 +962,7 @@ int main(int argc, char** argv)
tcsetattr(0, TCSANOW, &new_termios); tcsetattr(0, TCSANOW, &new_termios);
BAN::Vector<BAN::String> buffers, history; BAN::Vector<BAN::String> buffers, history;
MUST(buffers.emplace_back(""sv)); MUST(buffers.emplace_back(""_sv));
size_t index = 0; size_t index = 0;
size_t col = 0; size_t col = 0;
@ -1073,7 +1073,7 @@ int main(int argc, char** argv)
last_return = parse_and_execute_command(buffers[index]); last_return = parse_and_execute_command(buffers[index]);
MUST(history.push_back(buffers[index])); MUST(history.push_back(buffers[index]));
buffers = history; buffers = history;
MUST(buffers.emplace_back(""sv)); MUST(buffers.emplace_back(""_sv));
} }
print_prompt(); print_prompt();
index = buffers.size() - 1; index = buffers.size() - 1;

View File

@ -1,17 +1,13 @@
cmake_minimum_required(VERSION 3.26)
project(Terminal CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
Terminal.cpp Terminal.cpp
) )
add_executable(Terminal ${SOURCES}) add_executable(Terminal ${SOURCES})
target_compile_options(Terminal PUBLIC -O2 -g) banan_include_headers(Terminal ban)
target_link_libraries(Terminal PUBLIC libc ban libfont libgui libinput) banan_link_library(Terminal libc)
banan_link_library(Terminal libfont)
banan_link_library(Terminal libgui)
banan_link_library(Terminal libinput)
add_custom_target(Terminal-install install(TARGETS Terminal)
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/Terminal ${BANAN_BIN}/
DEPENDS Terminal
)

View File

@ -87,11 +87,11 @@ void Terminal::run()
signal(SIGCHLD, [](int) { s_shell_exited = true; }); signal(SIGCHLD, [](int) { s_shell_exited = true; });
start_shell(); start_shell();
m_window = MUST(LibGUI::Window::create(600, 400, "Terminal"sv)); m_window = MUST(LibGUI::Window::create(600, 400, "Terminal"_sv));
m_window->fill(m_bg_color); m_window->fill(m_bg_color);
m_window->invalidate(); m_window->invalidate();
m_font = MUST(LibFont::Font::load("/usr/share/fonts/lat0-16.psfu"sv)); m_font = MUST(LibFont::Font::load("/usr/share/fonts/lat0-16.psfu"_sv));
m_window->set_key_event_callback([&](LibGUI::EventPacket::KeyEvent event) { on_key_event(event); }); m_window->set_key_event_callback([&](LibGUI::EventPacket::KeyEvent event) { on_key_event(event); });

View File

@ -1,7 +1,3 @@
cmake_minimum_required(VERSION 3.26)
project(WindowServer CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
Framebuffer.cpp Framebuffer.cpp
@ -10,10 +6,11 @@ set(SOURCES
) )
add_executable(WindowServer ${SOURCES}) add_executable(WindowServer ${SOURCES})
target_compile_options(WindowServer PUBLIC -O2 -g) banan_include_headers(WindowServer ban)
target_link_libraries(WindowServer PUBLIC libc ban libfont libgui libimage libinput) banan_include_headers(WindowServer libgui)
banan_link_library(WindowServer libc)
banan_link_library(WindowServer libfont)
banan_link_library(WindowServer libimage)
banan_link_library(WindowServer libinput)
add_custom_target(WindowServer-install install(TARGETS WindowServer)
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/WindowServer ${BANAN_BIN}/
DEPENDS WindowServer
)

View File

@ -22,7 +22,7 @@ public:
WindowServer(Framebuffer& framebuffer) WindowServer(Framebuffer& framebuffer)
: m_framebuffer(framebuffer) : m_framebuffer(framebuffer)
, m_cursor({ framebuffer.width / 2, framebuffer.height / 2 }) , m_cursor({ framebuffer.width / 2, framebuffer.height / 2 })
, m_font(MUST(LibFont::Font::load("/usr/share/fonts/lat0-16.psfu"sv))) , m_font(MUST(LibFont::Font::load("/usr/share/fonts/lat0-16.psfu"_sv)))
{ {
invalidate(m_framebuffer.area()); invalidate(m_framebuffer.area());
} }

View File

@ -80,7 +80,7 @@ Config parse_config()
auto variable = parts[0]; auto variable = parts[0];
auto value = parts[1]; auto value = parts[1];
if (variable == "bg"sv) if (variable == "bg"_sv)
{ {
auto image = LibImage::Image::load_from_file(value); auto image = LibImage::Image::load_from_file(value);
if (image.is_error()) if (image.is_error())
@ -156,7 +156,7 @@ int main()
atexit([]() { tty_ctrl(STDIN_FILENO, TTY_CMD_SET, TTY_FLAG_ENABLE_INPUT); }); atexit([]() { tty_ctrl(STDIN_FILENO, TTY_CMD_SET, TTY_FLAG_ENABLE_INPUT); });
MUST(LibInput::KeyboardLayout::initialize()); MUST(LibInput::KeyboardLayout::initialize());
MUST(LibInput::KeyboardLayout::get().load_from_file("/usr/share/keymaps/us.keymap"sv)); MUST(LibInput::KeyboardLayout::get().load_from_file("/usr/share/keymaps/us.keymap"_sv));
int keyboard_fd = open("/dev/input0", O_RDONLY); int keyboard_fd = open("/dev/input0", O_RDONLY);
if (keyboard_fd == -1) if (keyboard_fd == -1)

View File

@ -1,7 +1,3 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023 CXX)
set(AOC2023_PROJECTS set(AOC2023_PROJECTS
day1 day1
day2 day2
@ -30,20 +26,21 @@ set(AOC2023_PROJECTS
full full
) )
set(BANAN_AOC2023_BIN ${BANAN_BIN}/aoc2023) set(BANAN_AOC2023_BIN ${CMAKE_INSTALL_BINDIR}/aoc2023)
set(BANAN_AOC2023_INPUT ${BANAN_SHARE}/aoc2023) set(BANAN_AOC2023_INPUT ${BANAN_SHARE}/aoc2023)
set(CMAKE_INSTALL_BINDIR ${BANAN_AOC2023_BIN})
add_custom_target(aoc2023) add_custom_target(aoc2023)
add_custom_target(aoc2023_always
COMMAND ${CMAKE_COMMAND} -E make_directory ${BANAN_AOC2023_BIN} file(GLOB_RECURSE input_files "input/*")
COMMAND ${CMAKE_COMMAND} -E make_directory ${BANAN_AOC2023_INPUT} foreach(file ${input_files})
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input/* ${BANAN_AOC2023_INPUT}/ install(FILES ${file} DESTINATION ${BANAN_AOC2023_INPUT})
) endforeach()
add_custom_target(aoc2023-install DEPENDS aoc2023 aoc2023_always)
foreach(AOC2023_PROJECT ${AOC2023_PROJECTS}) foreach(AOC2023_PROJECT ${AOC2023_PROJECTS})
add_subdirectory(${AOC2023_PROJECT}) add_subdirectory(${AOC2023_PROJECT})
add_dependencies(aoc2023 aoc2023_${AOC2023_PROJECT})
endforeach() endforeach()
add_dependencies(userspace aoc2023) add_dependencies(userspace aoc2023)
add_dependencies(userspace-install aoc2023-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day-template CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day-template ${SOURCES}) add_executable(aoc2023_day-template ${SOURCES})
target_compile_options(aoc2023_day-template PUBLIC -O2 -g) banan_include_headers(aoc2023_day-template ban)
target_link_libraries(aoc2023_day-template PUBLIC libc ban) banan_link_library(aoc2023_day-template libc)
add_dependencies(aoc2023_day-template libc-install ban-install) install(TARGETS aoc2023_day-template)
add_custom_target(aoc2023_day-template-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day-template ${BANAN_AOC2023_BIN}/day-template
DEPENDS aoc2023_day-template
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day-template)
add_dependencies(aoc2023-install aoc2023_day-template-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day1 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day1 ${SOURCES}) add_executable(aoc2023_day1 ${SOURCES})
target_compile_options(aoc2023_day1 PUBLIC -O2 -g) banan_include_headers(aoc2023_day1 ban)
target_link_libraries(aoc2023_day1 PUBLIC libc) banan_link_library(aoc2023_day1 libc)
add_dependencies(aoc2023_day1 libc-install ban-install) install(TARGETS aoc2023_day1)
add_custom_target(aoc2023_day1-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day1 ${BANAN_AOC2023_BIN}/day1
DEPENDS aoc2023_day1
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day1)
add_dependencies(aoc2023-install aoc2023_day1-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day10 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day10 ${SOURCES}) add_executable(aoc2023_day10 ${SOURCES})
target_compile_options(aoc2023_day10 PUBLIC -O2 -g) banan_include_headers(aoc2023_day10 ban)
target_link_libraries(aoc2023_day10 PUBLIC libc ban) banan_link_library(aoc2023_day10 libc)
add_dependencies(aoc2023_day10 libc-install ban-install) install(TARGETS aoc2023_day10)
add_custom_target(aoc2023_day10-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day10 ${BANAN_AOC2023_BIN}/day10
DEPENDS aoc2023_day10
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day10)
add_dependencies(aoc2023-install aoc2023_day10-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day11 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day11 ${SOURCES}) add_executable(aoc2023_day11 ${SOURCES})
target_compile_options(aoc2023_day11 PUBLIC -O2 -g) banan_include_headers(aoc2023_day11 ban)
target_link_libraries(aoc2023_day11 PUBLIC libc ban) banan_link_library(aoc2023_day11 libc)
add_dependencies(aoc2023_day11 libc-install ban-install) install(TARGETS aoc2023_day11)
add_custom_target(aoc2023_day11-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day11 ${BANAN_AOC2023_BIN}/day11
DEPENDS aoc2023_day11
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day11)
add_dependencies(aoc2023-install aoc2023_day11-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day12 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day12 ${SOURCES}) add_executable(aoc2023_day12 ${SOURCES})
target_compile_options(aoc2023_day12 PUBLIC -O2 -g) banan_link_library(aoc2023_day12 ban)
target_link_libraries(aoc2023_day12 PUBLIC libc ban) banan_link_library(aoc2023_day12 libc)
add_dependencies(aoc2023_day12 libc-install ban-install) install(TARGETS aoc2023_day12)
add_custom_target(aoc2023_day12-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day12 ${BANAN_AOC2023_BIN}/day12
DEPENDS aoc2023_day12
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day12)
add_dependencies(aoc2023-install aoc2023_day12-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day13 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day13 ${SOURCES}) add_executable(aoc2023_day13 ${SOURCES})
target_compile_options(aoc2023_day13 PUBLIC -O2 -g) banan_include_headers(aoc2023_day13 ban)
target_link_libraries(aoc2023_day13 PUBLIC libc ban) banan_link_library(aoc2023_day13 libc)
add_dependencies(aoc2023_day13 libc-install ban-install) install(TARGETS aoc2023_day13)
add_custom_target(aoc2023_day13-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day13 ${BANAN_AOC2023_BIN}/day13
DEPENDS aoc2023_day13
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day13)
add_dependencies(aoc2023-install aoc2023_day13-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day14 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day14 ${SOURCES}) add_executable(aoc2023_day14 ${SOURCES})
target_compile_options(aoc2023_day14 PUBLIC -O2 -g) banan_include_headers(aoc2023_day14 ban)
target_link_libraries(aoc2023_day14 PUBLIC libc ban) banan_link_library(aoc2023_day14 libc)
add_dependencies(aoc2023_day14 libc-install ban-install) install(TARGETS aoc2023_day14)
add_custom_target(aoc2023_day14-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day14 ${BANAN_AOC2023_BIN}/day14
DEPENDS aoc2023_day14
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day14)
add_dependencies(aoc2023-install aoc2023_day14-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day15 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day15 ${SOURCES}) add_executable(aoc2023_day15 ${SOURCES})
target_compile_options(aoc2023_day15 PUBLIC -O2 -g) banan_include_headers(aoc2023_day15 ban)
target_link_libraries(aoc2023_day15 PUBLIC libc ban) banan_link_library(aoc2023_day15 libc)
add_dependencies(aoc2023_day15 libc-install ban-install) install(TARGETS aoc2023_day15)
add_custom_target(aoc2023_day15-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day15 ${BANAN_AOC2023_BIN}/day15
DEPENDS aoc2023_day15
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day15)
add_dependencies(aoc2023-install aoc2023_day15-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day16 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day16 ${SOURCES}) add_executable(aoc2023_day16 ${SOURCES})
target_compile_options(aoc2023_day16 PUBLIC -O2 -g) banan_include_headers(aoc2023_day16 ban)
target_link_libraries(aoc2023_day16 PUBLIC libc ban) banan_link_library(aoc2023_day16 libc)
add_dependencies(aoc2023_day16 libc-install ban-install) install(TARGETS aoc2023_day16)
add_custom_target(aoc2023_day16-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day16 ${BANAN_AOC2023_BIN}/day16
DEPENDS aoc2023_day16
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day16)
add_dependencies(aoc2023-install aoc2023_day16-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day17 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day17 ${SOURCES}) add_executable(aoc2023_day17 ${SOURCES})
target_compile_options(aoc2023_day17 PUBLIC -O2 -g) banan_include_headers(aoc2023_day17 ban)
target_link_libraries(aoc2023_day17 PUBLIC libc ban) banan_link_library(aoc2023_day17 libc)
add_dependencies(aoc2023_day17 libc-install ban-install) install(TARGETS aoc2023_day17)
add_custom_target(aoc2023_day17-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day17 ${BANAN_AOC2023_BIN}/day17
DEPENDS aoc2023_day17
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day17)
add_dependencies(aoc2023-install aoc2023_day17-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day18 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day18 ${SOURCES}) add_executable(aoc2023_day18 ${SOURCES})
target_compile_options(aoc2023_day18 PUBLIC -O2 -g) banan_include_headers(aoc2023_day18 ban)
target_link_libraries(aoc2023_day18 PUBLIC libc ban) banan_link_library(aoc2023_day18 libc)
add_dependencies(aoc2023_day18 libc-install ban-install) install(TARGETS aoc2023_day18)
add_custom_target(aoc2023_day18-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day18 ${BANAN_AOC2023_BIN}/day18
DEPENDS aoc2023_day18
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day18)
add_dependencies(aoc2023-install aoc2023_day18-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day19 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day19 ${SOURCES}) add_executable(aoc2023_day19 ${SOURCES})
target_compile_options(aoc2023_day19 PUBLIC -O2 -g) banan_include_headers(aoc2023_day19 ban)
target_link_libraries(aoc2023_day19 PUBLIC libc ban) banan_link_library(aoc2023_day19 libc)
add_dependencies(aoc2023_day19 libc-install ban-install) install(TARGETS aoc2023_day19)
add_custom_target(aoc2023_day19-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day19 ${BANAN_AOC2023_BIN}/day19
DEPENDS aoc2023_day19
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day19)
add_dependencies(aoc2023-install aoc2023_day19-install)

View File

@ -168,9 +168,9 @@ bool is_accepted(const Item& item, const BAN::String& name, const Workflows& wor
{ {
if (!satifies_rule(item, rule)) if (!satifies_rule(item, rule))
continue; continue;
if (rule.target == "A"sv) if (rule.target == "A"_sv)
return true; return true;
if (rule.target == "R"sv) if (rule.target == "R"_sv)
return false; return false;
return is_accepted(item, rule.target, workflows); return is_accepted(item, rule.target, workflows);
} }
@ -185,7 +185,7 @@ i64 puzzle1(FILE* fp)
BAN::Vector<Item> accepted; BAN::Vector<Item> accepted;
for (const auto& item : items) for (const auto& item : items)
if (is_accepted(item, "in"sv, workflows)) if (is_accepted(item, "in"_sv, workflows))
MUST(accepted.push_back(item)); MUST(accepted.push_back(item));
i64 result = 0; i64 result = 0;
@ -243,7 +243,7 @@ i64 puzzle2(FILE* fp)
values_sorted[2][ai], values_sorted[2][ai],
values_sorted[3][si] values_sorted[3][si]
}}; }};
if (!is_accepted(item, "in"sv, workflows)) if (!is_accepted(item, "in"_sv, workflows))
continue; continue;
i64 x_count = values_sorted[0][xi + 1] - values_sorted[0][xi]; i64 x_count = values_sorted[0][xi + 1] - values_sorted[0][xi];

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day2 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day2 ${SOURCES}) add_executable(aoc2023_day2 ${SOURCES})
target_compile_options(aoc2023_day2 PUBLIC -O2 -g) banan_include_headers(aoc2023_day2 ban)
target_link_libraries(aoc2023_day2 PUBLIC libc) banan_link_library(aoc2023_day2 libc)
add_dependencies(aoc2023_day2 libc-install ban-install) install(TARGETS aoc2023_day2)
add_custom_target(aoc2023_day2-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day2 ${BANAN_AOC2023_BIN}/day2
DEPENDS aoc2023_day2
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day2)
add_dependencies(aoc2023-install aoc2023_day2-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day20 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day20 ${SOURCES}) add_executable(aoc2023_day20 ${SOURCES})
target_compile_options(aoc2023_day20 PUBLIC -O2 -g) banan_link_library(aoc2023_day20 ban)
target_link_libraries(aoc2023_day20 PUBLIC libc ban) banan_link_library(aoc2023_day20 libc)
add_dependencies(aoc2023_day20 libc-install ban-install) install(TARGETS aoc2023_day20)
add_custom_target(aoc2023_day20-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day20 ${BANAN_AOC2023_BIN}/day20
DEPENDS aoc2023_day20
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day20)
add_dependencies(aoc2023-install aoc2023_day20-install)

View File

@ -30,6 +30,8 @@ struct Module
BAN::String name; BAN::String name;
BAN::Vector<BAN::String> targets; BAN::Vector<BAN::String> targets;
virtual ~Module() {}
virtual void handle_signal(const Signal& signal, BAN::Queue<Signal>& signal_queue) = 0; virtual void handle_signal(const Signal& signal, BAN::Queue<Signal>& signal_queue) = 0;
}; };
@ -137,7 +139,7 @@ i64 puzzle1(FILE* fp)
for (size_t i = 0; i < 1000; i++) for (size_t i = 0; i < 1000; i++)
{ {
MUST(signal_queue.push({ "broadcaster"sv, ""sv, false })); MUST(signal_queue.push({ "broadcaster"_sv, ""_sv, false }));
while (!signal_queue.empty()) while (!signal_queue.empty())
{ {
auto signal = signal_queue.front(); auto signal = signal_queue.front();

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day21 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day21 ${SOURCES}) add_executable(aoc2023_day21 ${SOURCES})
target_compile_options(aoc2023_day21 PUBLIC -O2 -g) banan_include_headers(aoc2023_day21 ban)
target_link_libraries(aoc2023_day21 PUBLIC libc ban) banan_link_library(aoc2023_day21 libc)
add_dependencies(aoc2023_day21 libc-install ban-install) install(TARGETS aoc2023_day21)
add_custom_target(aoc2023_day21-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day21 ${BANAN_AOC2023_BIN}/day21
DEPENDS aoc2023_day21
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day21)
add_dependencies(aoc2023-install aoc2023_day21-install)

View File

@ -0,0 +1,9 @@
set(SOURCES
main.cpp
)
add_executable(aoc2023_day22 ${SOURCES})
banan_include_headers(aoc2023_day22 ban)
banan_link_library(aoc2023_day22 libc)
install(TARGETS aoc2023_day22)

View File

@ -0,0 +1,191 @@
#include <BAN/HashSet.h>
#include <BAN/Sort.h>
#include <BAN/Vector.h>
#include <ctype.h>
#include <inttypes.h>
#include <stdio.h>
using i8 = int8_t;
using i16 = int16_t;
using i32 = int32_t;
using i64 = int64_t;
using u8 = uint8_t;
using u16 = uint16_t;
using u32 = uint32_t;
using u64 = uint64_t;
struct Position
{
i64 x, y, z;
bool operator==(const Position& other) const
{
return x == other.x && y == other.y && z == other.z;
}
};
static constexpr bool rectangle_contains(const Position& c1, const Position& c2, const Position& p)
{
ASSERT(c1.x <= c2.x);
ASSERT(c1.y <= c2.y);
return (c1.x <= p.x && p.x <= c2.x) && (c1.y <= p.y && p.y <= c2.y);
}
struct Brick
{
Position corners[2];
BAN::HashSet<Brick*> supporting;
BAN::HashSet<Brick*> supported_by;
bool supports(const Brick& other) const
{
if (corners[1].z + 1 != other.corners[0].z)
return false;
for (i32 i = 0; i < 4; i++)
if (rectangle_contains(corners[0], corners[1], { other.corners[i / 2].x, other.corners[i % 2].y, 0 }))
return true;
for (i32 i = 0; i < 4; i++)
if (rectangle_contains(other.corners[0], other.corners[1], { corners[i / 2].x, corners[i % 2].y, 0 }))
return true;
return false;
}
};
i64 parse_i64(BAN::StringView str)
{
i64 result = 0;
for (char c : str)
{
ASSERT(isdigit(c));
result = (result * 10) + (c - '0');
}
return result;
}
BAN::Vector<Brick> parse_bricks(FILE* fp)
{
BAN::Vector<Brick> bricks;
char buffer[64];
while (fgets(buffer, sizeof(buffer), fp))
{
BAN::StringView line(buffer);
ASSERT(line.back() == '\n');
line = line.substring(0, line.size() - 1);
if (line.empty())
break;
auto corner_strs = MUST(line.split('~'));
ASSERT(corner_strs.size() == 2);
Brick brick;
for (i32 i = 0; i < 2; i++)
{
auto coords = MUST(corner_strs[i].split(','));
ASSERT(coords.size() == 3);
brick.corners[i].x = parse_i64(coords[0]);
brick.corners[i].y = parse_i64(coords[1]);
brick.corners[i].z = parse_i64(coords[2]);
}
ASSERT(brick.corners[0].x <= brick.corners[1].x);
ASSERT(brick.corners[0].y <= brick.corners[1].y);
ASSERT(brick.corners[0].z <= brick.corners[1].z);
MUST(bricks.push_back(brick));
}
return bricks;
}
i64 puzzle1(FILE* fp)
{
auto brick_comp = [](const Brick& b1, const Brick& b2) { return b1.corners[0].z < b2.corners[0].z; };
auto bricks = parse_bricks(fp);
BAN::sort::sort(bricks.begin(), bricks.end(), brick_comp);
// Simulate brick falling
for (size_t i = 0; i < bricks.size();)
{
bool can_fall = bricks[i].corners[0].z > 1;
for (size_t j = 0; j < i && can_fall; j++)
if (bricks[j].supports(bricks[i]))
can_fall = false;
if (!can_fall)
i++;
else
{
bricks[i].corners[0].z--;
bricks[i].corners[1].z--;
for (; i > 0; i--)
{
if (brick_comp(bricks[i - 1], bricks[i]))
break;
BAN::swap(bricks[i - 1], bricks[i]);
}
}
}
// Store brick supporting structures
for (size_t i = 0; i < bricks.size(); i++)
{
for (size_t j = 0; j < bricks.size(); j++)
{
if (i == j)
continue;
if (bricks[i].supports(bricks[j]))
{
MUST(bricks[i].supporting.insert(&bricks[j]));
MUST(bricks[j].supported_by.insert(&bricks[i]));
}
}
}
i64 result = 0;
for (const auto& brick : bricks)
{
bool disintegratable = true;
for (const auto* support : brick.supporting)
if (support->supported_by.size() <= 1)
disintegratable = false;
result += disintegratable;
}
// OFF BY 7
return result;
}
i64 puzzle2(FILE* fp)
{
(void)fp;
return -1;
}
int main(int argc, char** argv)
{
const char* file_path = "/usr/share/aoc2023/day22_input.txt";
if (argc >= 2)
file_path = argv[1];
FILE* fp = fopen(file_path, "r");
if (fp == nullptr)
{
perror("fopen");
return 1;
}
printf("puzzle1: %" PRId64 "\n", puzzle1(fp));
fseek(fp, 0, SEEK_SET);
printf("puzzle2: %" PRId64 "\n", puzzle2(fp));
fclose(fp);
}

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day23 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day23 ${SOURCES}) add_executable(aoc2023_day23 ${SOURCES})
target_compile_options(aoc2023_day23 PUBLIC -O2 -g) banan_include_headers(aoc2023_day23 ban)
target_link_libraries(aoc2023_day23 PUBLIC libc ban) banan_link_library(aoc2023_day23 libc)
add_dependencies(aoc2023_day23 libc-install ban-install) install(TARGETS aoc2023_day23)
add_custom_target(aoc2023_day23-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day23 ${BANAN_AOC2023_BIN}/day23
DEPENDS aoc2023_day23
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day23)
add_dependencies(aoc2023-install aoc2023_day23-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day24 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day24 ${SOURCES}) add_executable(aoc2023_day24 ${SOURCES})
target_compile_options(aoc2023_day24 PUBLIC -O2 -g) banan_include_headers(aoc2023_day24 ban)
target_link_libraries(aoc2023_day24 PUBLIC libc ban) banan_link_library(aoc2023_day24 libc)
add_dependencies(aoc2023_day24 libc-install ban-install) install(TARGETS aoc2023_day24)
add_custom_target(aoc2023_day24-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day24 ${BANAN_AOC2023_BIN}/day24
DEPENDS aoc2023_day24
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day24)
add_dependencies(aoc2023-install aoc2023_day24-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day25 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day25 ${SOURCES}) add_executable(aoc2023_day25 ${SOURCES})
target_compile_options(aoc2023_day25 PUBLIC -O2 -g) banan_link_library(aoc2023_day25 ban)
target_link_libraries(aoc2023_day25 PUBLIC libc ban) banan_link_library(aoc2023_day25 libc)
add_dependencies(aoc2023_day25 libc-install ban-install) install(TARGETS aoc2023_day25)
add_custom_target(aoc2023_day25-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day25 ${BANAN_AOC2023_BIN}/day25
DEPENDS aoc2023_day25
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day25)
add_dependencies(aoc2023-install aoc2023_day25-install)

View File

@ -21,6 +21,9 @@ using u64 = uint64_t;
struct Component struct Component
{ {
Component(BAN::String name)
: name(BAN::move(name))
{}
BAN::String name; BAN::String name;
BAN::Vector<BAN::String> connections; BAN::Vector<BAN::String> connections;
}; };

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day3 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day3 ${SOURCES}) add_executable(aoc2023_day3 ${SOURCES})
target_compile_options(aoc2023_day3 PUBLIC -O2 -g) banan_include_headers(aoc2023_day3 ban)
target_link_libraries(aoc2023_day3 PUBLIC libc ban) banan_link_library(aoc2023_day3 libc)
add_dependencies(aoc2023_day3 libc-install ban-install) install(TARGETS aoc2023_day3)
add_custom_target(aoc2023_day3-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day3 ${BANAN_AOC2023_BIN}/day3
DEPENDS aoc2023_day3
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day3)
add_dependencies(aoc2023-install aoc2023_day3-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day4 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day4 ${SOURCES}) add_executable(aoc2023_day4 ${SOURCES})
target_compile_options(aoc2023_day4 PUBLIC -O2 -g) banan_link_library(aoc2023_day4 ban)
target_link_libraries(aoc2023_day4 PUBLIC libc ban) banan_link_library(aoc2023_day4 libc)
add_dependencies(aoc2023_day4 libc-install ban-install) install(TARGETS aoc2023_day4)
add_custom_target(aoc2023_day4-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day4 ${BANAN_AOC2023_BIN}/day4
DEPENDS aoc2023_day4
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day4)
add_dependencies(aoc2023-install aoc2023_day4-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day5 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day5 ${SOURCES}) add_executable(aoc2023_day5 ${SOURCES})
target_compile_options(aoc2023_day5 PUBLIC -O2 -g) banan_include_headers(aoc2023_day5 ban)
target_link_libraries(aoc2023_day5 PUBLIC libc ban) banan_link_library(aoc2023_day5 libc)
add_dependencies(aoc2023_day5 libc-install ban-install) install(TARGETS aoc2023_day5)
add_custom_target(aoc2023_day5-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day5 ${BANAN_AOC2023_BIN}/day5
DEPENDS aoc2023_day5
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day5)
add_dependencies(aoc2023-install aoc2023_day5-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day6 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day6 ${SOURCES}) add_executable(aoc2023_day6 ${SOURCES})
target_compile_options(aoc2023_day6 PUBLIC -O2 -g) banan_include_headers(aoc2023_day6 ban)
target_link_libraries(aoc2023_day6 PUBLIC libc ban) banan_link_library(aoc2023_day6 libc)
add_dependencies(aoc2023_day6 libc-install ban-install) install(TARGETS aoc2023_day6)
add_custom_target(aoc2023_day6-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day6 ${BANAN_AOC2023_BIN}/day6
DEPENDS aoc2023_day6
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day6)
add_dependencies(aoc2023-install aoc2023_day6-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day7 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day7 ${SOURCES}) add_executable(aoc2023_day7 ${SOURCES})
target_compile_options(aoc2023_day7 PUBLIC -O2 -g) banan_include_headers(aoc2023_day7 ban)
target_link_libraries(aoc2023_day7 PUBLIC libc ban) banan_link_library(aoc2023_day7 libc)
add_dependencies(aoc2023_day7 libc-install ban-install) install(TARGETS aoc2023_day7)
add_custom_target(aoc2023_day7-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day7 ${BANAN_AOC2023_BIN}/day7
DEPENDS aoc2023_day7
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day7)
add_dependencies(aoc2023-install aoc2023_day7-install)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day8 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day8 ${SOURCES}) add_executable(aoc2023_day8 ${SOURCES})
target_compile_options(aoc2023_day8 PUBLIC -O2 -g) banan_include_headers(aoc2023_day8 ban)
target_link_libraries(aoc2023_day8 PUBLIC libc ban) banan_link_library(aoc2023_day8 libc)
add_dependencies(aoc2023_day8 libc-install ban-install) install(TARGETS aoc2023_day8)
add_custom_target(aoc2023_day8-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day8 ${BANAN_AOC2023_BIN}/day8
DEPENDS aoc2023_day8
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day8)
add_dependencies(aoc2023-install aoc2023_day8-install)

View File

@ -45,8 +45,8 @@ i64 puzzle1(FILE* fp)
} }
} }
u32 current = coord_to_u32("AAA"sv); u32 current = coord_to_u32("AAA"_sv);
u32 target = coord_to_u32("ZZZ"sv); u32 target = coord_to_u32("ZZZ"_sv);
i64 steps = 0; i64 steps = 0;
for (; current != target; steps++) for (; current != target; steps++)

View File

@ -1,22 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023_day9 CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023_day9 ${SOURCES}) add_executable(aoc2023_day9 ${SOURCES})
target_compile_options(aoc2023_day9 PUBLIC -O2 -g) banan_include_headers(aoc2023_day9 ban)
target_link_libraries(aoc2023_day9 PUBLIC libc ban) banan_link_library(aoc2023_day9 libc)
add_dependencies(aoc2023_day9 libc-install ban-install) install(TARGETS aoc2023_day9)
add_custom_target(aoc2023_day9-install
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day9 ${BANAN_AOC2023_BIN}/day9
DEPENDS aoc2023_day9
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023_day9)
add_dependencies(aoc2023-install aoc2023_day9-install)

View File

@ -1,20 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(aoc2023-full CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(aoc2023-full ${SOURCES}) add_executable(aoc2023_full ${SOURCES})
target_compile_options(aoc2023-full PUBLIC -O2 -g) banan_include_headers(aoc2023_full ban)
target_link_libraries(aoc2023-full PUBLIC libc) banan_link_library(aoc2023_full libc)
add_custom_target(aoc2023-full-install install(TARGETS aoc2023_full)
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023-full ${BANAN_AOC2023_BIN}/full
DEPENDS aoc2023-full
DEPENDS aoc2023_always
)
add_dependencies(aoc2023 aoc2023-full)
add_dependencies(aoc2023-install aoc2023-full-install)

View File

@ -1,16 +1,8 @@
cmake_minimum_required(VERSION 3.26)
project(cat-mmap CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(cat-mmap ${SOURCES}) add_executable(cat-mmap ${SOURCES})
target_compile_options(cat-mmap PUBLIC -O2 -g) banan_link_library(cat-mmap libc)
target_link_libraries(cat-mmap PUBLIC libc)
add_custom_target(cat-mmap-install install(TARGETS cat-mmap)
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cat-mmap ${BANAN_BIN}/
DEPENDS cat-mmap
)

View File

@ -1,16 +1,8 @@
cmake_minimum_required(VERSION 3.26)
project(cat CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(cat ${SOURCES}) add_executable(cat ${SOURCES})
target_compile_options(cat PUBLIC -O2 -g) banan_link_library(cat libc)
target_link_libraries(cat PUBLIC libc)
add_custom_target(cat-install install(TARGETS cat)
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cat ${BANAN_BIN}/
DEPENDS cat
)

View File

@ -1,16 +1,8 @@
cmake_minimum_required(VERSION 3.26)
project(chmod CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(chmod ${SOURCES}) add_executable(chmod ${SOURCES})
target_compile_options(chmod PUBLIC -O2 -g) banan_link_library(chmod libc)
target_link_libraries(chmod PUBLIC libc)
add_custom_target(chmod-install install(TARGETS chmod)
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/chmod ${BANAN_BIN}/
DEPENDS chmod
)

View File

@ -1,16 +1,9 @@
cmake_minimum_required(VERSION 3.26)
project(cp CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(cp ${SOURCES}) add_executable(cp ${SOURCES})
target_compile_options(cp PUBLIC -O2 -g) banan_include_headers(cp ban)
target_link_libraries(cp PUBLIC libc ban) banan_link_library(cp libc)
add_custom_target(cp-install install(TARGETS cp)
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/cp ${BANAN_BIN}/
DEPENDS cp
)

View File

@ -7,27 +7,22 @@ PROGRAM_NAME=$1
mkdir $PROGRAM_NAME mkdir $PROGRAM_NAME
cat > $PROGRAM_NAME/CMakeLists.txt << EOF cat > $PROGRAM_NAME/CMakeLists.txt << EOF
cmake_minimum_required(VERSION 3.26)
project($PROGRAM_NAME CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable($PROGRAM_NAME \${SOURCES}) add_executable($PROGRAM_NAME \${SOURCES})
target_compile_options($PROGRAM_NAME PUBLIC -O2 -g) banan_link_library($PROGRAM_NAME ban)
target_link_libraries($PROGRAM_NAME PUBLIC libc) banan_link_library($PROGRAM_NAME libc)
add_custom_target($PROGRAM_NAME-install install(TARGETS $PROGRAM_NAME)
COMMAND \${CMAKE_COMMAND} -E copy \${CMAKE_CURRENT_BINARY_DIR}/$PROGRAM_NAME \${BANAN_BIN}/
DEPENDS $PROGRAM_NAME
)
EOF EOF
cat > $PROGRAM_NAME/main.cpp << EOF cat > $PROGRAM_NAME/main.cpp << EOF
#include <stdio.h>
int main() int main()
{ {
printf("Hello World\n");
} }
EOF EOF

View File

@ -1,16 +1,8 @@
cmake_minimum_required(VERSION 3.26)
project(dd CXX)
set(SOURCES set(SOURCES
main.cpp main.cpp
) )
add_executable(dd ${SOURCES}) add_executable(dd ${SOURCES})
target_compile_options(dd PUBLIC -O2 -g) banan_link_library(dd libc)
target_link_libraries(dd PUBLIC libc)
add_custom_target(dd-install install(TARGETS dd)
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/dd ${BANAN_BIN}/
DEPENDS dd
)

Some files were not shown because too many files have changed in this diff Show More