From 230e404a98a02740daf0f6df9b32268644e90b6a Mon Sep 17 00:00:00 2001 From: boreddevnl Date: Sat, 9 May 2026 01:11:29 +0200 Subject: [PATCH] feature: added third_party TCC into userland --- Makefile | 23 ++ src/fs/fat32.c | 2 +- src/userland/Makefile | 29 ++- src/userland/cli/boredos_install.c | 7 +- src/userland/crt1.asm | 26 +++ src/userland/crti.asm | 3 + src/userland/crtn.asm | 3 + src/userland/gui/browser.c | 20 -- src/userland/libc/assert.h | 4 + src/userland/libc/dlfcn.h | 9 + src/userland/libc/empty.asm | 1 + src/userland/libc/inttypes.h | 7 + src/userland/libc/libmath.c | 12 + src/userland/libc/math.h | 1 + src/userland/libc/posix_io.c | 19 ++ src/userland/libc/runtime.c | 9 + src/userland/libc/stdint.h | 22 ++ src/userland/libc/stdio.c | 17 ++ src/userland/libc/stdio.h | 2 + src/userland/libc/stdlib.c | 71 ++++++ src/userland/libc/stdlib.h | 8 + src/userland/libc/sys/mman.h | 14 ++ src/userland/libc/sys/time.h | 6 + src/userland/libc/sys/ucontext.h | 3 + src/userland/libc/time.c | 11 + src/userland/sdk/include/assert.h | 4 + src/userland/sdk/include/ctype.h | 18 ++ src/userland/sdk/include/dlfcn.h | 9 + src/userland/sdk/include/errno.h | 27 +++ src/userland/sdk/include/fcntl.h | 27 +++ src/userland/sdk/include/input.h | 19 ++ src/userland/sdk/include/inttypes.h | 7 + src/userland/sdk/include/libui.h | 78 +++++++ src/userland/sdk/include/limits.h | 22 ++ src/userland/sdk/include/locale.h | 30 +++ src/userland/sdk/include/math.h | 46 ++++ src/userland/sdk/include/setjmp.h | 20 ++ src/userland/sdk/include/signal.h | 37 +++ src/userland/sdk/include/stdint.h | 22 ++ src/userland/sdk/include/stdio.h | 61 +++++ src/userland/sdk/include/stdlib.h | 47 ++++ src/userland/sdk/include/string.h | 28 +++ src/userland/sdk/include/sys/mman.h | 14 ++ src/userland/sdk/include/sys/stat.h | 47 ++++ src/userland/sdk/include/sys/time.h | 6 + src/userland/sdk/include/sys/types.h | 11 + src/userland/sdk/include/sys/ucontext.h | 3 + src/userland/sdk/include/sys/wait.h | 15 ++ src/userland/sdk/include/syscall.h | 292 ++++++++++++++++++++++++ src/userland/sdk/include/syscall_user.h | 11 + src/userland/sdk/include/time.h | 30 +++ src/userland/sdk/include/unistd.h | 30 +++ src/userland/sdk/include/utf-8.h | 25 ++ src/userland/sdk/lib/libboredos.a | Bin 0 -> 112474 bytes src/userland/sdk/lib/libc.a | Bin 0 -> 112474 bytes src/userland/sdk/lib/libm.a | Bin 0 -> 112474 bytes src/userland/sdk/lib/libui.a | Bin 0 -> 4646 bytes 57 files changed, 1289 insertions(+), 26 deletions(-) create mode 100644 src/userland/crt1.asm create mode 100644 src/userland/crti.asm create mode 100644 src/userland/crtn.asm create mode 100644 src/userland/libc/assert.h create mode 100644 src/userland/libc/dlfcn.h create mode 100644 src/userland/libc/empty.asm create mode 100644 src/userland/libc/inttypes.h create mode 100644 src/userland/libc/stdint.h create mode 100644 src/userland/libc/sys/mman.h create mode 100644 src/userland/libc/sys/time.h create mode 100644 src/userland/libc/sys/ucontext.h create mode 100644 src/userland/sdk/include/assert.h create mode 100644 src/userland/sdk/include/ctype.h create mode 100644 src/userland/sdk/include/dlfcn.h create mode 100644 src/userland/sdk/include/errno.h create mode 100644 src/userland/sdk/include/fcntl.h create mode 100644 src/userland/sdk/include/input.h create mode 100644 src/userland/sdk/include/inttypes.h create mode 100644 src/userland/sdk/include/libui.h create mode 100644 src/userland/sdk/include/limits.h create mode 100644 src/userland/sdk/include/locale.h create mode 100644 src/userland/sdk/include/math.h create mode 100644 src/userland/sdk/include/setjmp.h create mode 100644 src/userland/sdk/include/signal.h create mode 100644 src/userland/sdk/include/stdint.h create mode 100644 src/userland/sdk/include/stdio.h create mode 100644 src/userland/sdk/include/stdlib.h create mode 100644 src/userland/sdk/include/string.h create mode 100644 src/userland/sdk/include/sys/mman.h create mode 100644 src/userland/sdk/include/sys/stat.h create mode 100644 src/userland/sdk/include/sys/time.h create mode 100644 src/userland/sdk/include/sys/types.h create mode 100644 src/userland/sdk/include/sys/ucontext.h create mode 100644 src/userland/sdk/include/sys/wait.h create mode 100644 src/userland/sdk/include/syscall.h create mode 100644 src/userland/sdk/include/syscall_user.h create mode 100644 src/userland/sdk/include/time.h create mode 100644 src/userland/sdk/include/unistd.h create mode 100644 src/userland/sdk/include/utf-8.h create mode 100644 src/userland/sdk/lib/libboredos.a create mode 100644 src/userland/sdk/lib/libc.a create mode 100644 src/userland/sdk/lib/libm.a create mode 100644 src/userland/sdk/lib/libui.a diff --git a/Makefile b/Makefile index 318f1cb..d90341e 100644 --- a/Makefile +++ b/Makefile @@ -213,6 +213,12 @@ $(BUILD_DIR)/initrd.tar: $(KERNEL_ELF) mkdir -p $(BUILD_DIR)/initrd/root/Pictures mkdir -p $(BUILD_DIR)/initrd/root/Documents mkdir -p $(BUILD_DIR)/initrd/root/Downloads + mkdir -p $(BUILD_DIR)/initrd/etc + mkdir -p $(BUILD_DIR)/initrd/usr/lib/tcc/include + mkdir -p $(BUILD_DIR)/initrd/usr/local/include + mkdir -p $(BUILD_DIR)/initrd/usr/include/sys + mkdir -p $(BUILD_DIR)/initrd/usr/include/libc + mkdir -p $(BUILD_DIR)/initrd/usr/lib @printf "$(YELLOW)[COPY]$(RESET) Limine binaries + kernel for installer..." @if [ -f limine/BOOTX64.EFI ]; then cp limine/BOOTX64.EFI $(BUILD_DIR)/initrd/boot/; fi @@ -228,6 +234,22 @@ $(BUILD_DIR)/initrd.tar: $(KERNEL_ELF) fi \ done + @printf "$(YELLOW)[COPY]$(RESET) TCC support files..." + @cp $(SRC_DIR)/userland/cli/third_party/tcc/libtcc1.a $(BUILD_DIR)/initrd/usr/lib/tcc/ + @cp $(SRC_DIR)/userland/cli/third_party/tcc/libtcc1.a $(BUILD_DIR)/initrd/usr/lib/ + @cp $(SRC_DIR)/userland/cli/third_party/tcc/include/*.h $(BUILD_DIR)/initrd/usr/lib/tcc/include/ + @cp $(SRC_DIR)/userland/sdk/lib/libboredos.a $(BUILD_DIR)/initrd/usr/lib/ + @cp $(SRC_DIR)/userland/sdk/lib/libc.a $(BUILD_DIR)/initrd/usr/lib/ + @cp $(SRC_DIR)/userland/sdk/lib/libm.a $(BUILD_DIR)/initrd/usr/lib/ + @cp $(SRC_DIR)/userland/bin/crt0.o $(BUILD_DIR)/initrd/usr/lib/crt0.o + @cp $(SRC_DIR)/userland/bin/crt0.o $(BUILD_DIR)/initrd/usr/lib/crt1.o + @cp $(SRC_DIR)/userland/bin/empty.o $(BUILD_DIR)/initrd/usr/lib/crti.o + @cp $(SRC_DIR)/userland/bin/empty.o $(BUILD_DIR)/initrd/usr/lib/crtn.o + @cp $(SRC_DIR)/userland/libc/*.h $(BUILD_DIR)/initrd/usr/include/ + @cp $(SRC_DIR)/userland/libc/sys/*.h $(BUILD_DIR)/initrd/usr/include/sys/ + @cp $(SRC_DIR)/userland/libc/*.h $(BUILD_DIR)/initrd/usr/include/libc/ + @cp $(SRC_DIR)/userland/libc/*.h $(BUILD_DIR)/initrd/usr/local/include/ + @printf "$(YELLOW)[COPY]$(RESET) Wallpapers..." @for f in $(SRC_DIR)/images/wallpapers/*; do \ if [ -f "$$f" ]; then \ @@ -291,6 +313,7 @@ $(BUILD_DIR)/initrd.tar: $(KERNEL_ELF) @if [ -f README.md ]; then printf " -> README.md"; cp README.md $(BUILD_DIR)/initrd/; fi @if [ -f LICENSE ]; then printf " -> LICENSE"; cp LICENSE $(BUILD_DIR)/initrd/; fi @if [ -f limine.conf ]; then printf " -> limine.conf"; cp limine.conf $(BUILD_DIR)/initrd/; fi + @if [ -f $(SRC_DIR)/userland/gui/about.c ]; then printf " -> about.c"; cp $(SRC_DIR)/userland/gui/about.c $(BUILD_DIR)/initrd/; fi @printf "$(YELLOW)[TAR]$(RESET) Creating initrd.tar..." cd $(BUILD_DIR)/initrd && COPYFILE_DISABLE=1 tar --exclude="._*" -cf ../initrd.tar * diff --git a/src/fs/fat32.c b/src/fs/fat32.c index c66c51f..daaee95 100644 --- a/src/fs/fat32.c +++ b/src/fs/fat32.c @@ -15,7 +15,7 @@ static spinlock_t ramfs_lock = SPINLOCK_INIT; // Protects the RAM-based filesystem (/) -#define MAX_CLUSTERS 8192 +#define MAX_CLUSTERS 32768 #define MAX_OPEN_HANDLES 32 // In-memory FAT table diff --git a/src/userland/Makefile b/src/userland/Makefile index 41822b1..c4b8179 100644 --- a/src/userland/Makefile +++ b/src/userland/Makefile @@ -16,7 +16,7 @@ APP_METADATA_SOURCE_LUA = cli/third_party/lua/boredos_onelua.c APP_SOURCE_DIRS = . cli gui sys games net cli/third_party define app_source_for -$(if $(filter doom,$1),$(APP_METADATA_SOURCE_DOOM),$(if $(filter lua,$1),$(APP_METADATA_SOURCE_LUA),$(firstword $(foreach d,$(APP_SOURCE_DIRS),$(wildcard $(d)/$1.c))))) +$(if $(filter doom,$1),$(APP_METADATA_SOURCE_DOOM),$(if $(filter lua,$1),$(APP_METADATA_SOURCE_LUA),$(if $(filter tcc,$1),cli/third_party/tcc/tcc.c,$(firstword $(foreach d,$(APP_SOURCE_DIRS),$(wildcard $(d)/$1.c)))))) endef LIBC_SOURCES = $(wildcard libc/*.c) @@ -38,7 +38,7 @@ DOOM_OBJS = $(patsubst games/doom/%.c, $(BIN_DIR)/%.o, $(DOOM_SOURCES)) LUA_DIR = cli/third_party/lua LUA_CFLAGS = -std=gnu11 -ffreestanding -O2 -fno-stack-protector -fno-stack-check -fno-lto -fno-pie -m64 -march=x86-64 -mno-red-zone -isystem $(LUA_DIR)/sysinclude -I. -Ilibc -I$(LUA_DIR) -DLUA_USE_C89 -Wno-conversion -Wno-sign-conversion -Wno-double-promotion -Wno-unused-parameter -Wno-missing-declarations -Wno-shadow -Wno-undef -Wno-redundant-decls -Wno-old-style-definition -Wno-missing-prototypes -Wno-implicit-fallthrough -Wno-type-limits -all: $(BIN_DIR) $(APP_ELFS) $(BIN_DIR)/doom.elf $(BIN_DIR)/lua.elf +all: $(BIN_DIR) $(APP_ELFS) $(BIN_DIR)/doom.elf $(BIN_DIR)/lua.elf $(BIN_DIR)/tcc.elf $(BIN_DIR)/empty.o $(BIN_DIR): mkdir -p $(BIN_DIR) @@ -55,6 +55,11 @@ $(BIN_DIR)/libwidget.o: ../wm/libwidget.c | $(BIN_DIR) $(BIN_DIR)/stb_image.o: stb_image.c | $(BIN_DIR) $(CC) $(CFLAGS) -c $< -o $@ +$(BIN_DIR)/empty.o: | $(BIN_DIR) + echo "section .text" > $(BIN_DIR)/empty.asm + $(AS) -f elf64 $(BIN_DIR)/empty.asm -o $@ + rm $(BIN_DIR)/empty.asm + $(BIN_DIR)/%.note.c: $(APP_METADATA_TOOL) | $(BIN_DIR) src="$(call app_source_for,$*)"; \ if [ -z "$$src" ] || [ ! -f "$$src" ]; then \ @@ -97,5 +102,23 @@ $(BIN_DIR)/lua_onelua.o: $(LUA_DIR)/boredos_onelua.c | $(BIN_DIR) $(BIN_DIR)/lua.elf: $(LIBC_OBJS) $(BIN_DIR)/lua_onelua.o $(BIN_DIR)/lua.note.o $(LD) $(LDFLAGS) $^ -o $@ +# TCC - Tiny C Compiler +TCC_DIR = cli/third_party/tcc +$(BIN_DIR)/tcc.elf: $(LIBC_OBJS) $(BIN_DIR)/tcc.note.o sdk $(TCC_DIR)/tcc.c $(TCC_DIR)/config.h $(TCC_DIR)/tcc.h + cd $(TCC_DIR) && x86_64-elf-gcc -O2 -m64 -march=x86-64 -fno-stack-protector -fno-stack-check -fno-lto -fno-pie -ffreestanding -nostdlib -static -no-pie -DONE_SOURCE=1 -DTARGETOS_BoredOS=1 -I. -I../../../sdk/include -Ttext=0x40000000 tcc.c -o tcc.elf ../../../sdk/lib/libboredos.a + cp $(TCC_DIR)/tcc.elf $(BIN_DIR)/tcc.elf + cd $(TCC_DIR) && sh build_libtcc1.sh + +# SDK target +SDK_DIR = sdk +sdk: $(LIBC_OBJS) $(BIN_DIR)/libui.o + mkdir -p $(SDK_DIR)/lib $(SDK_DIR)/include/sys + cp libc/*.h $(SDK_DIR)/include/ + cp libc/sys/*.h $(SDK_DIR)/include/sys/ + x86_64-elf-ar rcs $(SDK_DIR)/lib/libboredos.a $(LIBC_OBJS) + cp $(SDK_DIR)/lib/libboredos.a $(SDK_DIR)/lib/libc.a + cp $(SDK_DIR)/lib/libboredos.a $(SDK_DIR)/lib/libm.a + x86_64-elf-ar rcs $(SDK_DIR)/lib/libui.a $(BIN_DIR)/libui.o + clean: - rm -rf $(BIN_DIR) + rm -rf $(BIN_DIR) $(SDK_DIR) diff --git a/src/userland/cli/boredos_install.c b/src/userland/cli/boredos_install.c index f7af24b..d843923 100644 --- a/src/userland/cli/boredos_install.c +++ b/src/userland/cli/boredos_install.c @@ -337,6 +337,8 @@ int main(int argc, char **argv) { if (copy_tree("/Library", "/mnt/Library") != 0) { serial_printf("[ERROR] copy /Library failed\n"); return 1; } if (copy_tree("/docs", "/mnt/docs") != 0) { serial_printf("[ERROR] copy /docs failed\n"); return 1; } if (copy_tree("/root", "/mnt/root") != 0) { serial_printf("[ERROR] copy /root failed\n"); return 1; } + if (copy_tree("/usr", "/mnt/usr") != 0) { serial_printf("[ERROR] copy /usr failed\n"); return 1; } + if (copy_tree("/etc", "/mnt/etc") != 0) { serial_printf("[ERROR] copy /etc failed\n"); return 1; } serial_printf("Copying kernel and initrd...\n"); if (copy_file("/boot/boredos.elf", "/mnt/boot/boredos.elf") != 0) { @@ -357,8 +359,9 @@ int main(int argc, char **argv) { serial_printf("[WARNING] initrd.tar not found in live system (checked /boot/ and /)!\n"); } - copy_file_optional("README.md", "/mnt/README.md"); - copy_file_optional("LICENSE", "/mnt/LICENSE"); + copy_file_optional("/README.md", "/mnt/README.md"); + copy_file_optional("/LICENSE", "/mnt/LICENSE"); + copy_file_optional("/about.c", "/mnt/about.c"); uint64_t t1 = get_ticks(); serial_printf("Files copied (%llu ticks).\n", (unsigned long long)(t1 - t0)); } diff --git a/src/userland/crt1.asm b/src/userland/crt1.asm new file mode 100644 index 0000000..f77284b --- /dev/null +++ b/src/userland/crt1.asm @@ -0,0 +1,26 @@ +; Copyright (c) 2023-2026 Chris (boreddevnl) +; This software is released under the GNU General Public License v3.0. See LICENSE file for details. +; This header needs to maintain in any file it is present in, as per the GPL license terms. +; userland/crt0.asm +global _start +extern main +extern sys_exit + +section .text +_start: + ; The kernel loads the ELF and jumps here. + ; RSP should point to the 0x800000 stack. + + ; Align the stack to 16 bytes for C functions (System V ABI) + and rsp, -16 + + ; Call main(argc, argv) + call main + + ; If main returns, call exit(status) + mov rdi, rax ; Pass main's return value to exit syscall + call sys_exit + + ; Fallback halt if exit miraculously returns +.hang: + jmp .hang diff --git a/src/userland/crti.asm b/src/userland/crti.asm new file mode 100644 index 0000000..16eaa3b --- /dev/null +++ b/src/userland/crti.asm @@ -0,0 +1,3 @@ +global _init +section .init +_init: diff --git a/src/userland/crtn.asm b/src/userland/crtn.asm new file mode 100644 index 0000000..a84d4e1 --- /dev/null +++ b/src/userland/crtn.asm @@ -0,0 +1,3 @@ +global _fini +section .fini +_fini: diff --git a/src/userland/gui/browser.c b/src/userland/gui/browser.c index 60d20af..1a73daa 100644 --- a/src/userland/gui/browser.c +++ b/src/userland/gui/browser.c @@ -52,26 +52,6 @@ static char* str_istrstr(const char* haystack, const char* needle) { return NULL; } -static long strtol(const char* nptr, char** endptr, int base) { - long res = 0; - while (*nptr == ' ' || *nptr == '\t' || *nptr == '\n' || *nptr == '\r') nptr++; - bool neg = false; - if (*nptr == '-') { neg = true; nptr++; } - else if (*nptr == '+') nptr++; - - while (*nptr) { - int v = -1; - if (*nptr >= '0' && *nptr <= '9') v = *nptr - '0'; - else if (*nptr >= 'a' && *nptr <= 'z') v = *nptr - 'a' + 10; - else if (*nptr >= 'A' && *nptr <= 'Z') v = *nptr - 'A' + 10; - if (v < 0 || v >= base) break; - res = res * base + v; - nptr++; - } - if (endptr) *endptr = (char*)nptr; - return neg ? -res : res; -} - #define TAG_NONE 0 #define TAG_IMG 1 #define TAG_INPUT 2 diff --git a/src/userland/libc/assert.h b/src/userland/libc/assert.h new file mode 100644 index 0000000..e26808b --- /dev/null +++ b/src/userland/libc/assert.h @@ -0,0 +1,4 @@ +#ifndef _ASSERT_H +#define _ASSERT_H +#define assert(x) ((void)0) +#endif diff --git a/src/userland/libc/dlfcn.h b/src/userland/libc/dlfcn.h new file mode 100644 index 0000000..a4532b8 --- /dev/null +++ b/src/userland/libc/dlfcn.h @@ -0,0 +1,9 @@ +#ifndef _DLFCN_H +#define _DLFCN_H +#define RTLD_LAZY 0x00001 +#define RTLD_NOW 0x00002 +void *dlopen(const char *filename, int flag); +char *dlerror(void); +void *dlsym(void *handle, const char *symbol); +int dlclose(void *handle); +#endif diff --git a/src/userland/libc/empty.asm b/src/userland/libc/empty.asm new file mode 100644 index 0000000..e007d42 --- /dev/null +++ b/src/userland/libc/empty.asm @@ -0,0 +1 @@ +section .text diff --git a/src/userland/libc/inttypes.h b/src/userland/libc/inttypes.h new file mode 100644 index 0000000..112de7e --- /dev/null +++ b/src/userland/libc/inttypes.h @@ -0,0 +1,7 @@ +#ifndef _INTTYPES_H +#define _INTTYPES_H +#include +#define PRId64 "lld" +#define PRIu64 "llu" +#define PRIx64 "llx" +#endif diff --git a/src/userland/libc/libmath.c b/src/userland/libc/libmath.c index ac19b40..f404979 100644 --- a/src/userland/libc/libmath.c +++ b/src/userland/libc/libmath.c @@ -157,3 +157,15 @@ double fclamp(double x, double lo, double hi) { if (x > hi) return hi; return x; } + +double ldexp(double x, int exp) { + if (exp >= 0) { while (exp--) x *= 2.0; } + else { while (exp++) x /= 2.0; } + return x; +} + +long double ldexpl(long double x, int exp) { + if (exp >= 0) { while (exp--) x *= 2.0L; } + else { while (exp++) x /= 2.0L; } + return x; +} diff --git a/src/userland/libc/math.h b/src/userland/libc/math.h index 25d91ab..b5a6945 100644 --- a/src/userland/libc/math.h +++ b/src/userland/libc/math.h @@ -29,6 +29,7 @@ double log2(double x); double log10(double x); double exp(double x); double ldexp(double x, int expn); +long double ldexpl(long double x, int expn); double frexp(double x, int *expn); double pow(double base, double exponent); double atan2(double y, double x); diff --git a/src/userland/libc/posix_io.c b/src/userland/libc/posix_io.c index d970590..b71065d 100644 --- a/src/userland/libc/posix_io.c +++ b/src/userland/libc/posix_io.c @@ -3,6 +3,25 @@ #include #include "errno.h" +#include "sys/mman.h" + +void *mmap(void *addr, unsigned long length, int prot, int flags, int fd, long offset) { + (void)addr; (void)length; (void)prot; (void)flags; (void)fd; (void)offset; + errno = ENOSYS; + return MAP_FAILED; +} + +int munmap(void *addr, unsigned long length) { + (void)addr; (void)length; + errno = ENOSYS; + return -1; +} + +int mprotect(void *addr, unsigned long length, int prot) { + (void)addr; (void)length; (void)prot; + errno = ENOSYS; + return -1; +} #include "fcntl.h" #include "stdlib.h" #include "string.h" diff --git a/src/userland/libc/runtime.c b/src/userland/libc/runtime.c index 9d21b32..0a17cde 100644 --- a/src/userland/libc/runtime.c +++ b/src/userland/libc/runtime.c @@ -1,4 +1,5 @@ #include "stdlib.h" +char **environ = 0; #include "string.h" #include "errno.h" #include "syscall.h" @@ -176,3 +177,11 @@ __attribute__((weak)) double strtod(const char *nptr, char **endptr) { } return sign * value; } + +__attribute__((weak)) float strtof(const char *nptr, char **endptr) { + return (float)strtod(nptr, endptr); +} + +__attribute__((weak)) long double strtold(const char *nptr, char **endptr) { + return (long double)strtod(nptr, endptr); +} diff --git a/src/userland/libc/stdint.h b/src/userland/libc/stdint.h new file mode 100644 index 0000000..d6b9125 --- /dev/null +++ b/src/userland/libc/stdint.h @@ -0,0 +1,22 @@ +#ifndef _STDINT_H +#define _STDINT_H +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned int uint32_t; +typedef long int64_t; +typedef unsigned long uint64_t; + +#ifndef _INTPTR_T +#define _INTPTR_T +typedef long intptr_t; +#endif + +#ifndef _UINTPTR_T +#define _UINTPTR_T +typedef unsigned long uintptr_t; +#endif + +#endif diff --git a/src/userland/libc/stdio.c b/src/userland/libc/stdio.c index 9003df9..96020ef 100644 --- a/src/userland/libc/stdio.c +++ b/src/userland/libc/stdio.c @@ -76,6 +76,19 @@ FILE *fopen(const char *path, const char *mode) { return f; } +FILE *fdopen(int fd, const char *mode) { + (void)mode; + if (fd < 0) return NULL; + FILE *f = (FILE *)malloc(sizeof(FILE)); + if (!f) return NULL; + f->fd = fd; + f->eof = 0; + f->err = 0; + f->has_ungetc = 0; + f->ungetc_char = 0; + return f; +} + FILE *freopen(const char *path, const char *mode, FILE *stream) { int fd; if (!stream) { @@ -193,6 +206,10 @@ int getc(FILE *stream) { return (int)ch; } +int fgetc(FILE *stream) { + return getc(stream); +} + int ungetc(int c, FILE *stream) { if (!stream || c == EOF) { return EOF; diff --git a/src/userland/libc/stdio.h b/src/userland/libc/stdio.h index 9c4b9b0..114e6ad 100644 --- a/src/userland/libc/stdio.h +++ b/src/userland/libc/stdio.h @@ -25,8 +25,10 @@ extern FILE *stderr; #define TMP_MAX 32 FILE *fopen(const char *path, const char *mode); +FILE *fdopen(int fd, const char *mode); FILE *freopen(const char *path, const char *mode, FILE *stream); int fclose(FILE *stream); +int fgetc(FILE *stream); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); int fseek(FILE *stream, long offset, int whence); diff --git a/src/userland/libc/stdlib.c b/src/userland/libc/stdlib.c index c3d317b..68b747b 100644 --- a/src/userland/libc/stdlib.c +++ b/src/userland/libc/stdlib.c @@ -234,6 +234,70 @@ int atoi(const char *nptr) { return sign * res; } +long strtol(const char *nptr, char **endptr, int base) { + long res = 0; + int sign = 1; + while (*nptr == ' ' || *nptr == '\t' || *nptr == '\n' || *nptr == '\r') nptr++; + if (*nptr == '-') { sign = -1; nptr++; } + else if (*nptr == '+') nptr++; + + if (base == 0) { + if (*nptr == '0') { + if (*(nptr+1) == 'x' || *(nptr+1) == 'X') { base = 16; nptr += 2; } + else base = 8; + } else base = 10; + } else if (base == 16) { + if (*nptr == '0' && (*(nptr+1) == 'x' || *(nptr+1) == 'X')) nptr += 2; + } + + while (1) { + int val = -1; + if (*nptr >= '0' && *nptr <= '9') val = *nptr - '0'; + else if (*nptr >= 'a' && *nptr <= 'f') val = *nptr - 'a' + 10; + else if (*nptr >= 'A' && *nptr <= 'F') val = *nptr - 'A' + 10; + + if (val == -1 || val >= base) break; + res = res * base + val; + nptr++; + } + if (endptr) *endptr = (char *)nptr; + return sign * res; +} + +unsigned long strtoul(const char *nptr, char **endptr, int base) { + return (unsigned long)strtol(nptr, endptr, base); +} + +unsigned long long strtoull(const char *nptr, char **endptr, int base) { + return (unsigned long long)strtol(nptr, endptr, base); +} + +static void swap(void *a, void *b, size_t size) { + char *ca = a, *cb = b; + while (size--) { char t = *ca; *ca++ = *cb; *cb++ = t; } +} + +void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { + if (nmemb < 2) return; + char *pivot = (char *)base + (nmemb / 2) * size; + char *left = base; + char *right = (char *)base + (nmemb - 1) * size; + + while (left <= right) { + while (compar(left, pivot) < 0) left += size; + while (compar(right, pivot) > 0) right -= size; + if (left <= right) { + swap(left, right, size); + if (pivot == left) pivot = right; + else if (pivot == right) pivot = left; + left += size; + right -= size; + } + } + if (base < (void*)right) qsort(base, (right - (char *)base) / size + 1, size, compar); + if ((void*)left < (char *)base + nmemb * size) qsort(left, ((char *)base + nmemb * size - left) / size, size, compar); +} + void itoa(int n, char *buf) { if (n == 0) { buf[0] = '0'; buf[1] = 0; return; @@ -265,6 +329,13 @@ char* getcwd(char *buf, int size) { return NULL; } +char *realpath(const char *path, char *resolved_path) { + if (!resolved_path) resolved_path = malloc(1024); + if (!resolved_path) return NULL; + strcpy(resolved_path, path); + return resolved_path; +} + void sleep(int ms) { sys_system(SYSTEM_CMD_SLEEP, ms, 0, 0, 0); } diff --git a/src/userland/libc/stdlib.h b/src/userland/libc/stdlib.h index 8e87f46..fa4065d 100644 --- a/src/userland/libc/stdlib.h +++ b/src/userland/libc/stdlib.h @@ -3,6 +3,7 @@ #include #include +extern char **environ; void* malloc(size_t size); void free(void* ptr); @@ -18,6 +19,12 @@ int atoi(const char *nptr); void itoa(int n, char *buf); int abs(int x); double strtod(const char *nptr, char **endptr); +float strtof(const char *nptr, char **endptr); +long double strtold(const char *nptr, char **endptr); +long strtol(const char *nptr, char **endptr, int base); +unsigned long strtoul(const char *nptr, char **endptr, int base); +unsigned long long strtoull(const char *nptr, char **endptr, int base); +void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); // IO functions void puts(const char *s); @@ -31,6 +38,7 @@ void abort(void); // System/Process functions int chdir(const char *path); char* getcwd(char *buf, int size); +char *realpath(const char *path, char *resolved_path); int access(const char *pathname, int mode); void sleep(int ms); void exit(int status); diff --git a/src/userland/libc/sys/mman.h b/src/userland/libc/sys/mman.h new file mode 100644 index 0000000..b5027ed --- /dev/null +++ b/src/userland/libc/sys/mman.h @@ -0,0 +1,14 @@ +#ifndef _SYS_MMAN_H +#define _SYS_MMAN_H +#define PROT_READ 0x1 +#define PROT_WRITE 0x2 +#define PROT_EXEC 0x4 +#define MAP_SHARED 0x01 +#define MAP_PRIVATE 0x02 +#define MAP_FIXED 0x10 +#define MAP_ANONYMOUS 0x20 +#define MAP_FAILED ((void *)-1) +void *mmap(void *addr, unsigned long length, int prot, int flags, int fd, long offset); +int munmap(void *addr, unsigned long length); +int mprotect(void *addr, unsigned long length, int prot); +#endif diff --git a/src/userland/libc/sys/time.h b/src/userland/libc/sys/time.h new file mode 100644 index 0000000..86e1e4b --- /dev/null +++ b/src/userland/libc/sys/time.h @@ -0,0 +1,6 @@ +#ifndef _SYS_TIME_H +#define _SYS_TIME_H +struct timeval { long tv_sec; long tv_usec; }; +struct timezone { int tz_minuteswest; int tz_dsttime; }; +int gettimeofday(struct timeval *tv, void *tz); +#endif diff --git a/src/userland/libc/sys/ucontext.h b/src/userland/libc/sys/ucontext.h new file mode 100644 index 0000000..03a085a --- /dev/null +++ b/src/userland/libc/sys/ucontext.h @@ -0,0 +1,3 @@ +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H +#endif diff --git a/src/userland/libc/time.c b/src/userland/libc/time.c index 6bb1248..00ade94 100644 --- a/src/userland/libc/time.c +++ b/src/userland/libc/time.c @@ -3,6 +3,7 @@ #include "time.h" #include "stdio.h" #include "syscall.h" +#include "sys/time.h" static int _b_is_leap(int year) { return ((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0); @@ -164,3 +165,13 @@ __attribute__((weak)) time_t mktime(struct tm *tm) { tm->tm_min, tm->tm_sec); } + +int gettimeofday(struct timeval *tv, void *tz) { + (void)tz; + if (tv) { + time_t t = time(NULL); + tv->tv_sec = (long)t; + tv->tv_usec = 0; + } + return 0; +} diff --git a/src/userland/sdk/include/assert.h b/src/userland/sdk/include/assert.h new file mode 100644 index 0000000..e26808b --- /dev/null +++ b/src/userland/sdk/include/assert.h @@ -0,0 +1,4 @@ +#ifndef _ASSERT_H +#define _ASSERT_H +#define assert(x) ((void)0) +#endif diff --git a/src/userland/sdk/include/ctype.h b/src/userland/sdk/include/ctype.h new file mode 100644 index 0000000..4960be3 --- /dev/null +++ b/src/userland/sdk/include/ctype.h @@ -0,0 +1,18 @@ +#ifndef BOREDOS_LIBC_CTYPE_H +#define BOREDOS_LIBC_CTYPE_H + +int isdigit(int c); +int isalpha(int c); +int isalnum(int c); +int isspace(int c); +int isupper(int c); +int islower(int c); +int isxdigit(int c); +int iscntrl(int c); +int ispunct(int c); +int isprint(int c); +int isgraph(int c); +int tolower(int c); +int toupper(int c); + +#endif diff --git a/src/userland/sdk/include/dlfcn.h b/src/userland/sdk/include/dlfcn.h new file mode 100644 index 0000000..a4532b8 --- /dev/null +++ b/src/userland/sdk/include/dlfcn.h @@ -0,0 +1,9 @@ +#ifndef _DLFCN_H +#define _DLFCN_H +#define RTLD_LAZY 0x00001 +#define RTLD_NOW 0x00002 +void *dlopen(const char *filename, int flag); +char *dlerror(void); +void *dlsym(void *handle, const char *symbol); +int dlclose(void *handle); +#endif diff --git a/src/userland/sdk/include/errno.h b/src/userland/sdk/include/errno.h new file mode 100644 index 0000000..396ca00 --- /dev/null +++ b/src/userland/sdk/include/errno.h @@ -0,0 +1,27 @@ +#ifndef BOREDOS_LIBC_ERRNO_H +#define BOREDOS_LIBC_ERRNO_H + +extern int errno; + +#define EDOM 33 +#define E2BIG 7 +#define ERANGE 34 +#define EINVAL 22 +#define EISDIR 21 +#define ENOENT 2 +#define ENOMEM 12 +#define EACCES 13 +#define EBADF 9 +#define EIO 5 +#define EEXIST 17 +#define EAGAIN 11 +#define EINTR 4 +#define ECHILD 10 +#define ENOTSUP 95 +#define EPIPE 32 +#define ENOTDIR 20 +#define EBUSY 16 +#define ESPIPE 29 +#define ENOSYS 38 + +#endif diff --git a/src/userland/sdk/include/fcntl.h b/src/userland/sdk/include/fcntl.h new file mode 100644 index 0000000..6bb56c1 --- /dev/null +++ b/src/userland/sdk/include/fcntl.h @@ -0,0 +1,27 @@ +#ifndef BOREDOS_LIBC_FCNTL_H +#define BOREDOS_LIBC_FCNTL_H + +#include "sys/types.h" + +#define O_RDONLY 0x0000 +#define O_WRONLY 0x0001 +#define O_RDWR 0x0002 +#define O_ACCMODE 0x0003 +#define O_CREAT 0x0040 +#define O_EXCL 0x0080 +#define O_TRUNC 0x0200 +#define O_APPEND 0x0400 +#define O_NONBLOCK 0x0800 + +#define F_GETFL 3 +#define F_SETFL 4 + +#define FD_CLOEXEC 1 + +int open(const char *pathname, int flags, ...); +int fcntl(int fd, int cmd, ...); +int dup(int oldfd); +int dup2(int oldfd, int newfd); +int pipe(int pipefd[2]); + +#endif diff --git a/src/userland/sdk/include/input.h b/src/userland/sdk/include/input.h new file mode 100644 index 0000000..e5c05b6 --- /dev/null +++ b/src/userland/sdk/include/input.h @@ -0,0 +1,19 @@ +#ifndef INPUT_H +#define INPUT_H + +// Arrow keys +#define KEY_UP 17 +#define KEY_DOWN 18 +#define KEY_LEFT 19 +#define KEY_RIGHT 20 + +// controls +#define KEY_ENTER 10 +#define KEY_BACKSPACE 8 +#define KEY_ESCAPE 27 +#define KEY_SPACE 32 +#define KEY_ALT 22 +#define KEY_CTRL_L 21 +#define KEY_TAB 9 + +#endif diff --git a/src/userland/sdk/include/inttypes.h b/src/userland/sdk/include/inttypes.h new file mode 100644 index 0000000..112de7e --- /dev/null +++ b/src/userland/sdk/include/inttypes.h @@ -0,0 +1,7 @@ +#ifndef _INTTYPES_H +#define _INTTYPES_H +#include +#define PRId64 "lld" +#define PRIu64 "llu" +#define PRIx64 "llx" +#endif diff --git a/src/userland/sdk/include/libui.h b/src/userland/sdk/include/libui.h new file mode 100644 index 0000000..38d92e4 --- /dev/null +++ b/src/userland/sdk/include/libui.h @@ -0,0 +1,78 @@ +#ifndef LIBUI_H +#define LIBUI_H + +#include +#include + +// GUI Command IDs +#define GUI_CMD_WINDOW_CREATE 1 +#define GUI_CMD_DRAW_RECT 2 +#define GUI_CMD_DRAW_STRING 3 +#define GUI_CMD_MARK_DIRTY 4 +#define GUI_CMD_GET_EVENT 5 +#define GUI_CMD_DRAW_ROUNDED_RECT_FILLED 6 +#define GUI_CMD_DRAW_IMAGE 7 +#define GUI_CMD_GET_STRING_WIDTH 8 +#define GUI_CMD_GET_FONT_HEIGHT 9 +#define GUI_CMD_WINDOW_SET_RESIZABLE 14 +#define GUI_CMD_DRAW_STRING_BITMAP 10 +#define GUI_CMD_DRAW_STRING_SCALED 11 +#define GUI_CMD_GET_STRING_WIDTH_SCALED 12 +#define GUI_CMD_GET_FONT_HEIGHT_SCALED 13 +#define GUI_CMD_WINDOW_SET_TITLE 15 +#define GUI_CMD_SET_FONT 16 +#define GUI_CMD_DRAW_STRING_SCALED_SLOPED 18 +#define GUI_CMD_GET_SCREEN_SIZE 50 +#define GUI_CMD_GET_SCREENBUFFER 51 +#define GUI_CMD_SHOW_NOTIFICATION 52 +#define GUI_CMD_GET_DATETIME 53 + +// Event Types +#define GUI_EVENT_NONE 0 +#define GUI_EVENT_PAINT 1 +#define GUI_EVENT_CLICK 2 +#define GUI_EVENT_RIGHT_CLICK 3 +#define GUI_EVENT_CLOSE 4 +#define GUI_EVENT_KEY 5 +#define GUI_EVENT_KEYUP 10 + +#define GUI_EVENT_MOUSE_DOWN 6 +#define GUI_EVENT_MOUSE_UP 7 +#define GUI_EVENT_MOUSE_MOVE 8 +#define GUI_EVENT_MOUSE_WHEEL 9 +#define GUI_EVENT_RESIZE 11 + +typedef struct { + int type; + int arg1; // CLICK: x / KEY: legacy char-or-compat key + int arg2; // CLICK: y / KEY: keycode + int arg3; // CLICK: button state / KEY: modifier mask + int arg4; // KEY: Unicode codepoint (0 if none) +} gui_event_t; + +// Window Handle +typedef uint64_t ui_window_t; + +// libui API +ui_window_t ui_window_create(const char *title, int x, int y, int w, int h); +bool ui_get_event(ui_window_t win, gui_event_t *ev); + +void ui_draw_rect(ui_window_t win, int x, int y, int w, int h, uint32_t color); +void ui_draw_rounded_rect_filled(ui_window_t win, int x, int y, int w, int h, int radius, uint32_t color); +void ui_draw_string(ui_window_t win, int x, int y, const char *str, uint32_t color); +void ui_mark_dirty(ui_window_t win, int x, int y, int w, int h); +void ui_draw_image(ui_window_t win, int x, int y, int w, int h, uint32_t *image_data); +uint32_t ui_get_string_width(const char *str); +uint32_t ui_get_font_height(void); +void ui_get_screen_size(uint64_t *out_w, uint64_t *out_h); +void ui_draw_string_bitmap(ui_window_t win, int x, int y, const char *str, uint32_t color); + +void ui_draw_string_scaled(ui_window_t win, int x, int y, const char *str, uint32_t color, float scale); +void ui_draw_string_scaled_sloped(ui_window_t win, int x, int y, const char *str, uint32_t color, float scale, float slope); +uint32_t ui_get_string_width_scaled(const char *str, float scale); +uint32_t ui_get_font_height_scaled(float scale); +void ui_window_set_title(ui_window_t win, const char *title); +void ui_window_set_resizable(ui_window_t win, bool resizable); +void ui_set_font(ui_window_t win, const char *path); + +#endif diff --git a/src/userland/sdk/include/limits.h b/src/userland/sdk/include/limits.h new file mode 100644 index 0000000..760f213 --- /dev/null +++ b/src/userland/sdk/include/limits.h @@ -0,0 +1,22 @@ +#ifndef BOREDOS_LIBC_LIMITS_H +#define BOREDOS_LIBC_LIMITS_H + +#define CHAR_BIT 8 +#define SCHAR_MIN (-128) +#define SCHAR_MAX 127 +#define UCHAR_MAX 255 +#define SHRT_MIN (-32768) +#define SHRT_MAX 32767 +#define USHRT_MAX 65535 +#define INT_MIN (-2147483647 - 1) +#define INT_MAX 2147483647 +#define UINT_MAX 4294967295U +#define LONG_MIN (-9223372036854775807L - 1) +#define LONG_MAX 9223372036854775807L +#define ULONG_MAX 18446744073709551615UL +#define LLONG_MIN (-9223372036854775807LL - 1) +#define LLONG_MAX 9223372036854775807LL +#define ULLONG_MAX 18446744073709551615ULL +#define DBL_MAX 1.7976931348623157e+308 + +#endif diff --git a/src/userland/sdk/include/locale.h b/src/userland/sdk/include/locale.h new file mode 100644 index 0000000..46158da --- /dev/null +++ b/src/userland/sdk/include/locale.h @@ -0,0 +1,30 @@ +#ifndef BOREDOS_LIBC_LOCALE_H +#define BOREDOS_LIBC_LOCALE_H + +struct lconv { + char *decimal_point; + char *thousands_sep; + char *grouping; + char *int_curr_symbol; + char *currency_symbol; + char *mon_decimal_point; + char *mon_thousands_sep; + char *mon_grouping; + char *positive_sign; + char *negative_sign; + char int_frac_digits; + char frac_digits; + char p_cs_precedes; + char p_sep_by_space; + char n_cs_precedes; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; +}; + +#define LC_ALL 0 + +char *setlocale(int category, const char *locale); +struct lconv *localeconv(void); + +#endif diff --git a/src/userland/sdk/include/math.h b/src/userland/sdk/include/math.h new file mode 100644 index 0000000..b5a6945 --- /dev/null +++ b/src/userland/sdk/include/math.h @@ -0,0 +1,46 @@ +// Copyright (c) 2023-2026 Chris (boreddevnl) +// This software is released under the GNU General Public License v3.0. See LICENSE file for details. +// This header needs to maintain in any file it is present in, as per the GPL license terms. + +#ifndef MATH_H +#define MATH_H + +#define M_PI 3.14159265358979323846 +#define M_E 2.71828182845904523536 +#define M_LN2 0.69314718055994530942 +#define M_SQRT2 1.41421356237309504880 +#define HUGE_VAL (1e300 * 1e300) + +double fabs(double x); + +double fmod(double x, double y); + +double floor(double x); + +double ceil(double x); + +double sin(double x); +double cos(double x); +double tan(double x); +double sqrt(double x); + +double log(double x); +double log2(double x); +double log10(double x); +double exp(double x); +double ldexp(double x, int expn); +long double ldexpl(long double x, int expn); +double frexp(double x, int *expn); +double pow(double base, double exponent); +double atan2(double y, double x); +double asin(double x); +double acos(double x); +double sinh(double x); +double cosh(double x); +double tanh(double x); +double hypot(double x, double y); +double fmin(double a, double b); +double fmax(double a, double b); +double fclamp(double x, double lo, double hi); + +#endif /* MATH_H */ diff --git a/src/userland/sdk/include/setjmp.h b/src/userland/sdk/include/setjmp.h new file mode 100644 index 0000000..4bbc400 --- /dev/null +++ b/src/userland/sdk/include/setjmp.h @@ -0,0 +1,20 @@ +#ifndef BOREDOS_LIBC_SETJMP_H +#define BOREDOS_LIBC_SETJMP_H + +#include + +typedef struct boredos_jmp_buf_s { + uint64_t rbx; + uint64_t rbp; + uint64_t r12; + uint64_t r13; + uint64_t r14; + uint64_t r15; + uint64_t rsp; + uint64_t rip; +} jmp_buf[1]; + +int setjmp(jmp_buf env) __attribute__((returns_twice, noinline)); +void longjmp(jmp_buf env, int val) __attribute__((noreturn, noinline)); + +#endif diff --git a/src/userland/sdk/include/signal.h b/src/userland/sdk/include/signal.h new file mode 100644 index 0000000..671f8c1 --- /dev/null +++ b/src/userland/sdk/include/signal.h @@ -0,0 +1,37 @@ +#ifndef BOREDOS_LIBC_SIGNAL_H +#define BOREDOS_LIBC_SIGNAL_H + +#include "sys/types.h" + +typedef void (*sighandler_t)(int); +typedef unsigned long sigset_t; + +struct sigaction { + sighandler_t sa_handler; + sigset_t sa_mask; + int sa_flags; +}; + +#define SIG_DFL ((sighandler_t)0) +#define SIG_IGN ((sighandler_t)1) +#define SIG_ERR ((sighandler_t)-1) +#define SIGKILL 9 +#define SIGTERM 15 +#define SIGINT 2 + +#define SIG_BLOCK 0 +#define SIG_UNBLOCK 1 +#define SIG_SETMASK 2 + +#define SA_RESTART 0x10000000 +#define SA_NODEFER 0x40000000 +#define SA_RESETHAND 0x80000000 + +sighandler_t signal(int sig, sighandler_t handler); +int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact); +int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); +int sigpending(sigset_t *set); +int raise(int sig); +int kill(pid_t pid, int sig); + +#endif diff --git a/src/userland/sdk/include/stdint.h b/src/userland/sdk/include/stdint.h new file mode 100644 index 0000000..d6b9125 --- /dev/null +++ b/src/userland/sdk/include/stdint.h @@ -0,0 +1,22 @@ +#ifndef _STDINT_H +#define _STDINT_H +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned int uint32_t; +typedef long int64_t; +typedef unsigned long uint64_t; + +#ifndef _INTPTR_T +#define _INTPTR_T +typedef long intptr_t; +#endif + +#ifndef _UINTPTR_T +#define _UINTPTR_T +typedef unsigned long uintptr_t; +#endif + +#endif diff --git a/src/userland/sdk/include/stdio.h b/src/userland/sdk/include/stdio.h new file mode 100644 index 0000000..114e6ad --- /dev/null +++ b/src/userland/sdk/include/stdio.h @@ -0,0 +1,61 @@ +#ifndef BOREDOS_LIBC_STDIO_H +#define BOREDOS_LIBC_STDIO_H + +#include +#include + +typedef struct BOREDOS_FILE { + int fd; + int eof; + int err; + int has_ungetc; + int ungetc_char; +} FILE; + +extern FILE *stdin; +extern FILE *stdout; +extern FILE *stderr; + +#define EOF (-1) +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#define BUFSIZ 1024 +#define FILENAME_MAX 260 +#define TMP_MAX 32 + +FILE *fopen(const char *path, const char *mode); +FILE *fdopen(int fd, const char *mode); +FILE *freopen(const char *path, const char *mode, FILE *stream); +int fclose(FILE *stream); +int fgetc(FILE *stream); +size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); +size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); +int fseek(FILE *stream, long offset, int whence); +long ftell(FILE *stream); +int getc(FILE *stream); +int ungetc(int c, FILE *stream); +char *fgets(char *s, int n, FILE *stream); +int fputs(const char *s, FILE *stream); +int feof(FILE *stream); +int ferror(FILE *stream); +void clearerr(FILE *stream); +int fflush(FILE *stream); +int fputc(int c, FILE *stream); +int putchar(int c); +int fprintf(FILE *stream, const char *fmt, ...); +int vfprintf(FILE *stream, const char *fmt, va_list ap); +long filelength(FILE *f); +int vsnprintf(char *str, size_t size, const char *fmt, va_list ap); +int snprintf(char *str, size_t size, const char *fmt, ...); +int sprintf(char *str, const char *fmt, ...); +int sscanf(const char *str, const char *fmt, ...); +int remove(const char *path); +int rename(const char *oldpath, const char *newpath); +FILE *tmpfile(void); +char *tmpnam(char *s); + +void puts(const char *s); +void printf(const char *fmt, ...); + +#endif diff --git a/src/userland/sdk/include/stdlib.h b/src/userland/sdk/include/stdlib.h new file mode 100644 index 0000000..fa4065d --- /dev/null +++ b/src/userland/sdk/include/stdlib.h @@ -0,0 +1,47 @@ +#ifndef STDLIB_H +#define STDLIB_H + +#include +#include +extern char **environ; + +void* malloc(size_t size); +void free(void* ptr); +void* calloc(size_t nmemb, size_t size); +void* realloc(void* ptr, size_t size); +void *memset(void *s, int c, size_t n); +void *memcpy(void *dest, const void *src, size_t n); + +#include "string.h" + +// Math/Utility functions +int atoi(const char *nptr); +void itoa(int n, char *buf); +int abs(int x); +double strtod(const char *nptr, char **endptr); +float strtof(const char *nptr, char **endptr); +long double strtold(const char *nptr, char **endptr); +long strtol(const char *nptr, char **endptr, int base); +unsigned long strtoul(const char *nptr, char **endptr, int base); +unsigned long long strtoull(const char *nptr, char **endptr, int base); +void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); + +// IO functions +void puts(const char *s); +void printf(const char *fmt, ...); + +// Runtime stubs +int system(const char *command); +char *getenv(const char *name); +void abort(void); + +// System/Process functions +int chdir(const char *path); +char* getcwd(char *buf, int size); +char *realpath(const char *path, char *resolved_path); +int access(const char *pathname, int mode); +void sleep(int ms); +void exit(int status); +void _exit(int status); + +#endif diff --git a/src/userland/sdk/include/string.h b/src/userland/sdk/include/string.h new file mode 100644 index 0000000..a5eab52 --- /dev/null +++ b/src/userland/sdk/include/string.h @@ -0,0 +1,28 @@ +#ifndef BOREDOS_LIBC_STRING_H +#define BOREDOS_LIBC_STRING_H + +#include + +void *memmove(void *dest, const void *src, size_t n); +int memcmp(const void *s1, const void *s2, size_t n); +void *memcpy(void *dest, const void *src, size_t n); +void *memset(void *s, int c, size_t n); +void *memchr(const void *s, int c, size_t n); +char *strchr(const char *s, int c); +char *strrchr(const char *s, int c); +char *strpbrk(const char *s, const char *accept); +char *strstr(const char *haystack, const char *needle); +size_t strspn(const char *s, const char *accept); +size_t strcspn(const char *s, const char *reject); +size_t strlen(const char *s); +int strcmp(const char *s1, const char *s2); +int strncmp(const char *s1, const char *s2, size_t n); +int strncasecmp(const char *s1, const char *s2, size_t n); +int strcasecmp(const char *s1, const char *s2); +int strcoll(const char *s1, const char *s2); +char* strcpy(char *dest, const char *src); +char* strcat(char *dest, const char *src); +char *strdup(const char *s); +char *strerror(int errnum); + +#endif diff --git a/src/userland/sdk/include/sys/mman.h b/src/userland/sdk/include/sys/mman.h new file mode 100644 index 0000000..b5027ed --- /dev/null +++ b/src/userland/sdk/include/sys/mman.h @@ -0,0 +1,14 @@ +#ifndef _SYS_MMAN_H +#define _SYS_MMAN_H +#define PROT_READ 0x1 +#define PROT_WRITE 0x2 +#define PROT_EXEC 0x4 +#define MAP_SHARED 0x01 +#define MAP_PRIVATE 0x02 +#define MAP_FIXED 0x10 +#define MAP_ANONYMOUS 0x20 +#define MAP_FAILED ((void *)-1) +void *mmap(void *addr, unsigned long length, int prot, int flags, int fd, long offset); +int munmap(void *addr, unsigned long length); +int mprotect(void *addr, unsigned long length, int prot); +#endif diff --git a/src/userland/sdk/include/sys/stat.h b/src/userland/sdk/include/sys/stat.h new file mode 100644 index 0000000..e3cfdb8 --- /dev/null +++ b/src/userland/sdk/include/sys/stat.h @@ -0,0 +1,47 @@ +#ifndef BOREDOS_LIBC_SYS_STAT_H +#define BOREDOS_LIBC_SYS_STAT_H + +#include "types.h" + +typedef long time_t; + +struct stat { + unsigned long st_dev; + unsigned long st_ino; + mode_t st_mode; + unsigned long st_nlink; + uid_t st_uid; + gid_t st_gid; + unsigned long st_rdev; + int st_size; + long st_blksize; + long st_blocks; + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +}; + +#define S_IFMT 0170000 +#define S_IFIFO 0010000 +#define S_IFCHR 0020000 +#define S_IFDIR 0040000 +#define S_IFREG 0100000 + +#define S_IRUSR 0400 +#define S_IWUSR 0200 +#define S_IXUSR 0100 +#define S_IRGRP 0040 +#define S_IWGRP 0020 +#define S_IXGRP 0010 +#define S_IROTH 0004 +#define S_IWOTH 0002 +#define S_IXOTH 0001 + +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) + +int stat(const char *pathname, struct stat *statbuf); +int fstat(int fd, struct stat *statbuf); +int mkdir(const char *pathname, int mode); + +#endif diff --git a/src/userland/sdk/include/sys/time.h b/src/userland/sdk/include/sys/time.h new file mode 100644 index 0000000..86e1e4b --- /dev/null +++ b/src/userland/sdk/include/sys/time.h @@ -0,0 +1,6 @@ +#ifndef _SYS_TIME_H +#define _SYS_TIME_H +struct timeval { long tv_sec; long tv_usec; }; +struct timezone { int tz_minuteswest; int tz_dsttime; }; +int gettimeofday(struct timeval *tv, void *tz); +#endif diff --git a/src/userland/sdk/include/sys/types.h b/src/userland/sdk/include/sys/types.h new file mode 100644 index 0000000..da5815b --- /dev/null +++ b/src/userland/sdk/include/sys/types.h @@ -0,0 +1,11 @@ +#ifndef BOREDOS_LIBC_SYS_TYPES_H +#define BOREDOS_LIBC_SYS_TYPES_H + +typedef long ssize_t; +typedef long off_t; +typedef unsigned int mode_t; +typedef int pid_t; +typedef unsigned int uid_t; +typedef unsigned int gid_t; + +#endif diff --git a/src/userland/sdk/include/sys/ucontext.h b/src/userland/sdk/include/sys/ucontext.h new file mode 100644 index 0000000..03a085a --- /dev/null +++ b/src/userland/sdk/include/sys/ucontext.h @@ -0,0 +1,3 @@ +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H +#endif diff --git a/src/userland/sdk/include/sys/wait.h b/src/userland/sdk/include/sys/wait.h new file mode 100644 index 0000000..6e0133c --- /dev/null +++ b/src/userland/sdk/include/sys/wait.h @@ -0,0 +1,15 @@ +#ifndef BOREDOS_LIBC_SYS_WAIT_H +#define BOREDOS_LIBC_SYS_WAIT_H + +#include "../sys/types.h" + +#define WNOHANG 1 + +#define WEXITSTATUS(status) (((status) >> 8) & 0xff) +#define WIFEXITED(status) ((((status) & 0x7f) == 0) ? 1 : 0) +#define WTERMSIG(status) ((status) & 0x7f) +#define WIFSIGNALED(status) (((status) & 0x7f) != 0) + +pid_t waitpid(pid_t pid, int *status, int options); + +#endif diff --git a/src/userland/sdk/include/syscall.h b/src/userland/sdk/include/syscall.h new file mode 100644 index 0000000..135f2f0 --- /dev/null +++ b/src/userland/sdk/include/syscall.h @@ -0,0 +1,292 @@ +#ifndef SYSCALL_H +#define SYSCALL_H + +#include +#include +#include + +// Standard syscalls available from Kernel mode +#define SYS_EXIT 0 +#define SYS_WRITE 1 +#define SYS_GUI 3 +#define SYS_FS 4 +#define SYS_SYSTEM 5 +#define SYS_KILL 10 +#define SYS_SBRK 9 + +// FS Commands +#define FS_CMD_OPEN 1 +#define FS_CMD_READ 2 +#define FS_CMD_WRITE 3 +#define FS_CMD_CLOSE 4 +#define FS_CMD_SEEK 5 +#define FS_CMD_TELL 6 +#define FS_CMD_LIST 7 +#define FS_CMD_DELETE 8 +#define FS_CMD_SIZE 9 +#define FS_CMD_MKDIR 10 +#define FS_CMD_EXISTS 11 +#define FS_CMD_GETCWD 12 +#define FS_CMD_CHDIR 13 +#define FS_CMD_GET_INFO 14 +#define FS_CMD_DUP 15 +#define FS_CMD_DUP2 16 +#define FS_CMD_PIPE 17 +#define FS_CMD_FCNTL 18 + +// System Commands (via SYS_SYSTEM) +#define SYSTEM_CMD_SET_BG_COLOR 1 +#define SYSTEM_CMD_SET_BG_PATTERN 2 +#define SYSTEM_CMD_SET_WALLPAPER 3 +#define SYSTEM_CMD_SET_DESKTOP_PROP 4 +#define SYSTEM_CMD_SET_MOUSE_SPEED 5 +#define SYSTEM_CMD_NETWORK_INIT 6 +#define SYSTEM_CMD_GET_DESKTOP_PROP 7 +#define SYSTEM_CMD_GET_MOUSE_SPEED 8 +#define SYSTEM_CMD_GET_WALLPAPER_THUMB 9 +#define SYSTEM_CMD_CLEAR_SCREEN 10 +#define SYSTEM_CMD_RTC_GET 11 +#define SYSTEM_CMD_REBOOT 12 +#define SYSTEM_CMD_SHUTDOWN 13 +#define SYSTEM_CMD_BEEP 14 +#define SYSTEM_CMD_GET_MEM_INFO 15 +#define SYSTEM_CMD_GET_TICKS 16 +#define SYSTEM_CMD_PCI_LIST 17 +#define SYSTEM_CMD_NETWORK_DHCP 18 +#define SYSTEM_CMD_NETWORK_GET_MAC 19 +#define SYSTEM_CMD_NETWORK_GET_IP 20 +#define SYSTEM_CMD_NETWORK_SET_IP 21 +#define SYSTEM_CMD_UDP_SEND 22 +#define SYSTEM_CMD_NETWORK_GET_STATS 23 +#define SYSTEM_CMD_NETWORK_GET_GATEWAY 24 +#define SYSTEM_CMD_NETWORK_GET_DNS 25 +#define SYSTEM_CMD_ICMP_PING 26 +#define SYSTEM_CMD_NETWORK_IS_INIT 27 +#define SYSTEM_CMD_NETWORK_HAS_IP 30 +#define SYSTEM_CMD_GET_SHELL_CONFIG 28 +#define SYSTEM_CMD_NETWORK_GET_NIC_NAME 48 +#define SYSTEM_CMD_SET_KEYBOARD_LAYOUT 49 +#define SYSTEM_CMD_GET_KEYBOARD_LAYOUT 51 +#define SYSTEM_CMD_SET_TEXT_COLOR 29 +#define SYSTEM_CMD_SET_WALLPAPER_PATH 31 +#define SYSTEM_CMD_RTC_SET 32 +#define SYSTEM_CMD_TCP_CONNECT 33 +#define SYSTEM_CMD_TCP_SEND 34 +#define SYSTEM_CMD_TCP_RECV 35 +#define SYSTEM_CMD_TCP_CLOSE 36 +#define SYSTEM_CMD_DNS_LOOKUP 37 +#define SYSTEM_CMD_SET_DNS 38 +#define SYSTEM_CMD_NET_UNLOCK 39 +#define SYSTEM_CMD_SET_FONT 40 +#define SYSTEM_CMD_SLEEP 46 +#define SYSTEM_CMD_SET_RAW_MODE 41 +#define SYSTEM_CMD_TCP_RECV_NB 42 +#define SYSTEM_CMD_YIELD 43 +#define SYSTEM_CMD_SET_RESOLUTION 47 +#define SYSTEM_CMD_PARALLEL_RUN 50 +#define SYSTEM_CMD_TTY_CREATE 60 +#define SYSTEM_CMD_TTY_READ_OUT 61 +#define SYSTEM_CMD_TTY_WRITE_IN 62 +#define SYSTEM_CMD_TTY_READ_IN 63 +#define SYSTEM_CMD_SPAWN 64 +#define SYSTEM_CMD_TTY_SET_FG 65 +#define SYSTEM_CMD_TTY_GET_FG 66 +#define SYSTEM_CMD_TTY_KILL_FG 67 +#define SYSTEM_CMD_TTY_KILL_ALL 68 +#define SYSTEM_CMD_TTY_DESTROY 69 +#define SYSTEM_CMD_EXEC 70 +#define SYSTEM_CMD_WAITPID 71 +#define SYSTEM_CMD_KILL_SIGNAL 72 +#define SYSTEM_CMD_SIGACTION 73 +#define SYSTEM_CMD_SIGPROCMASK 74 +#define SYSTEM_CMD_SIGPENDING 75 +#define SYSTEM_CMD_GET_ELF_METADATA 76 +#define SYSTEM_CMD_GET_ELF_PRIMARY_IMAGE 77 + +#define SPAWN_FLAG_TERMINAL 0x1 +#define SPAWN_FLAG_INHERIT_TTY 0x2 +#define SPAWN_FLAG_TTY_ID 0x4 +#define SPAWN_FLAG_BACKGROUND 0x8 + +// ELF app metadata (mirrors src/sys/elf.h, kept in sync manually) +#define BOREDOS_APP_METADATA_MAX_APP_NAME 64 +#define BOREDOS_APP_METADATA_MAX_DESCRIPTION 192 +#define BOREDOS_APP_METADATA_MAX_IMAGES 4 +#define BOREDOS_APP_METADATA_MAX_IMAGE_PATH 160 + +typedef struct __attribute__((packed)) { + uint32_t magic; + uint16_t version; + uint16_t image_count; + uint16_t reserved; + char app_name[BOREDOS_APP_METADATA_MAX_APP_NAME]; + char description[BOREDOS_APP_METADATA_MAX_DESCRIPTION]; + char images[BOREDOS_APP_METADATA_MAX_IMAGES][BOREDOS_APP_METADATA_MAX_IMAGE_PATH]; +} boredos_app_metadata_t; + +// Internal assembly entry into Ring 0 +extern uint64_t syscall0(uint64_t sys_num); +extern uint64_t syscall1(uint64_t sys_num, uint64_t arg1); +extern uint64_t syscall2(uint64_t sys_num, uint64_t arg1, uint64_t arg2); +extern uint64_t syscall3(uint64_t sys_num, uint64_t arg1, uint64_t arg2, uint64_t arg3); +extern uint64_t syscall4(uint64_t sys_num, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4); +extern uint64_t syscall5(uint64_t sys_num, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5); + +// Public API +void sys_exit(int status); +int sys_write(int fd, const char *buf, int len); +void *sys_sbrk(int incr); +void sys_kill(int pid); +int sys_system(int cmd, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4); + +typedef struct { + char os_name[64]; + char os_version[64]; + char os_codename[64]; + char kernel_name[64]; + char kernel_version[64]; + char build_date[64]; + char build_time[64]; + char build_arch[64]; +} os_info_t; + +int sys_get_os_info(os_info_t *info); + +// FS API +int sys_open(const char *path, const char *mode); +int sys_read(int fd, void *buf, uint32_t len); +int sys_write_fs(int fd, const void *buf, uint32_t len); +void sys_close(int fd); +int sys_seek(int fd, int offset, int whence); +uint32_t sys_tell(int fd); +uint32_t sys_size(int fd); +int sys_delete(const char *path); +int sys_mkdir(const char *path); +int sys_exists(const char *path); +int sys_getcwd(char *buf, int size); +int sys_chdir(const char *path); +int sys_dup(int oldfd); +int sys_dup2(int oldfd, int newfd); +int sys_pipe(int pipefd[2]); +int sys_fcntl(int fd, int cmd, int val); + +int sys_tty_create(void); +int sys_tty_read_out(int tty_id, char *buf, int len); +int sys_tty_write_in(int tty_id, const char *buf, int len); +int sys_tty_read_in(char *buf, int len); +int sys_spawn(const char *path, const char *args, uint64_t flags, uint64_t tty_id); +int sys_exec(const char *path, const char *args); +int sys_waitpid(int pid, int *status, int options); +int sys_kill_signal(int pid, int sig); +int sys_sigaction(int sig, const void *act, void *oldact); +int sys_sigprocmask(int how, const unsigned long *set, unsigned long *oldset); +int sys_sigpending(unsigned long *set); +int sys_tty_set_fg(int tty_id, int pid); +int sys_tty_get_fg(int tty_id); +int sys_tty_kill_fg(int tty_id); +int sys_tty_kill_all(int tty_id); +int sys_tty_destroy(int tty_id); + +typedef struct { + char name[256]; + uint32_t size; + uint8_t is_directory; + uint32_t start_cluster; + uint16_t write_date; + uint16_t write_time; +} FAT32_FileInfo; + +int sys_list(const char *path, FAT32_FileInfo *entries, int max_entries); +int sys_get_file_info(const char *path, FAT32_FileInfo *info); + +typedef struct { + uint32_t pid; + char name[64]; + uint64_t ticks; + size_t used_memory; + uint32_t is_idle; +} ProcessInfo; + +// Network API +typedef struct { uint8_t bytes[6]; } net_mac_address_t; +typedef struct { uint8_t bytes[4]; } net_ipv4_address_t; + +int sys_network_init(void); +int sys_network_dhcp_acquire(void); +int sys_network_get_mac(net_mac_address_t *mac); +int sys_network_get_nic_name(char *name_out); +int sys_network_get_ip(net_ipv4_address_t *ip); +int sys_network_set_ip(const net_ipv4_address_t *ip); +int sys_network_get_stat(int stat_type); +int sys_network_get_gateway(net_ipv4_address_t *ip); +int sys_network_get_dns(net_ipv4_address_t *ip); +int sys_get_dns_server(net_ipv4_address_t *ip); +int sys_udp_send(const net_ipv4_address_t *dest_ip, uint16_t dest_port, uint16_t src_port, const void *data, size_t data_len); +int sys_icmp_ping(const net_ipv4_address_t *dest_ip); +int sys_network_is_initialized(void); +int sys_network_has_ip(void); +uint64_t sys_get_shell_config(const char *key); +void sys_set_text_color(uint32_t color); + +int sys_tcp_connect(const net_ipv4_address_t *ip, uint16_t port); +int sys_tcp_send(const void *data, size_t len); +int sys_tcp_recv(void *buf, size_t max_len); +int sys_tcp_recv_nb(void *buf, size_t max_len); +int sys_tcp_close(void); +int sys_dns_lookup(const char *name, net_ipv4_address_t *out_ip); +int sys_set_dns_server(const net_ipv4_address_t *ip); +void sys_network_force_unlock(void); +void sys_yield(void); + +// ELF metadata API +int sys_get_elf_metadata(const char *path, boredos_app_metadata_t *out_metadata); +int sys_get_elf_primary_image(const char *path, char *out_path, size_t out_path_size); + +// Disk Management Syscalls + +#define SYSTEM_CMD_DISK_GET_COUNT 100 +#define SYSTEM_CMD_DISK_GET_INFO 101 +#define SYSTEM_CMD_DISK_MOUNT 105 +#define SYSTEM_CMD_DISK_UMOUNT 106 +#define SYSTEM_CMD_DISK_RESCAN 107 +#define SYSTEM_CMD_DISK_SYNC 109 + +#define SYSTEM_CMD_DISK_WRITE_GPT 102 +#define SYSTEM_CMD_DISK_WRITE_MBR 103 +#define SYSTEM_CMD_DISK_MKFS_FAT32 104 +#define SYSTEM_CMD_DISK_REPLACE_KERNEL 108 + +typedef struct { + char devname[16]; + char label[32]; + uint32_t type; + uint32_t total_sectors; + bool is_partition; + bool is_fat32; + bool is_esp; + uint32_t lba_offset; +} disk_info_t; + +typedef struct { + uint32_t lba_start; + uint32_t sector_count; + uint8_t part_type; + uint8_t flags; + char label[36]; +} partition_spec_t; + +#define PART_FLAG_ESP 0x01 +#define MIN_INSTALL_SECTORS 2097152 + +int sys_disk_get_count(void); +int sys_disk_get_info(int index, disk_info_t *out); +int sys_disk_write_gpt(const char *devname, partition_spec_t *parts, int count); +int sys_disk_write_mbr(const char *devname, partition_spec_t *parts, int count); +int sys_disk_mkfs_fat32(const char *devname, const char *label); +int sys_disk_mount(const char *devname, const char *mountpoint); +int sys_disk_umount(const char *mountpoint); +int sys_disk_sync(const char *mountpoint); +int sys_disk_rescan(const char *devname); +int sys_disk_replace_kernel(const char *src_path, const char *esp_mountpoint); + +#endif diff --git a/src/userland/sdk/include/syscall_user.h b/src/userland/sdk/include/syscall_user.h new file mode 100644 index 0000000..892e4f2 --- /dev/null +++ b/src/userland/sdk/include/syscall_user.h @@ -0,0 +1,11 @@ +#ifndef SYSCALL_USER_H +#define SYSCALL_USER_H + +#include "syscall.h" +#include + +static inline void sys_serial_write(const char *str) { + syscall2(8, 0, (uint64_t)str); +} + +#endif diff --git a/src/userland/sdk/include/time.h b/src/userland/sdk/include/time.h new file mode 100644 index 0000000..b3e7c3c --- /dev/null +++ b/src/userland/sdk/include/time.h @@ -0,0 +1,30 @@ +#ifndef BOREDOS_LIBC_TIME_H +#define BOREDOS_LIBC_TIME_H + +#include + +typedef long long time_t; +typedef unsigned long long clock_t; + +#define CLOCKS_PER_SEC 3000000000ULL + +struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +}; + +time_t time(time_t *out); +clock_t clock(void); +struct tm *localtime(const time_t *timer); +struct tm *gmtime(const time_t *timer); +size_t strftime(char *s, size_t max, const char *fmt, const struct tm *tm); +time_t mktime(struct tm *tm); + +#endif diff --git a/src/userland/sdk/include/unistd.h b/src/userland/sdk/include/unistd.h new file mode 100644 index 0000000..36d7081 --- /dev/null +++ b/src/userland/sdk/include/unistd.h @@ -0,0 +1,30 @@ +#ifndef BOREDOS_LIBC_UNISTD_H +#define BOREDOS_LIBC_UNISTD_H + +#include +#include "sys/types.h" + +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + +#define F_OK 0 +#define X_OK 1 +#define W_OK 2 +#define R_OK 4 + +int close(int fd); +ssize_t read(int fd, void *buf, size_t count); +ssize_t write(int fd, const void *buf, size_t count); +off_t lseek(int fd, off_t offset, int whence); +int unlink(const char *pathname); +int isatty(int fd); +int execv(const char *path, char *const argv[]); +int execve(const char *path, char *const argv[], char *const envp[]); +int execvp(const char *file, char *const argv[]); +int execl(const char *path, const char *arg, ...); +int execlp(const char *file, const char *arg, ...); +int execle(const char *path, const char *arg, ...); +pid_t waitpid(pid_t pid, int *status, int options); + +#endif diff --git a/src/userland/sdk/include/utf-8.h b/src/userland/sdk/include/utf-8.h new file mode 100644 index 0000000..1af7b36 --- /dev/null +++ b/src/userland/sdk/include/utf-8.h @@ -0,0 +1,25 @@ +#ifndef UTF_8_H +#define UTF_8_H + +#include + +// Decode one UTF-8 codepoint +// s: input string +// advance: number of bytes consumed +uint32_t text_decode_utf8(const char *s, int *advance); + +// Encode one codepoint into UTF-8 +// out must be at least 4 bytes +// return: number of bytes written +int text_encode_utf8(uint32_t cp, char *out); + +// Move to next UTF-8 character +const char* text_next_utf8(const char *s); + +// Move to previous UTF-8 character +const char* text_prev_utf8(const char *start, const char *s); + +// Count characters (not bytes) +int text_strlen_utf8(const char *s); + +#endif \ No newline at end of file diff --git a/src/userland/sdk/lib/libboredos.a b/src/userland/sdk/lib/libboredos.a new file mode 100644 index 0000000000000000000000000000000000000000..394888f0b4742bb27398e667c1cc58cc412a6dc1 GIT binary patch literal 112474 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 z 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 literal 0 HcmV?d00001 diff --git a/src/userland/sdk/lib/libc.a b/src/userland/sdk/lib/libc.a new file mode 100644 index 0000000000000000000000000000000000000000..394888f0b4742bb27398e667c1cc58cc412a6dc1 GIT binary patch literal 112474 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 z 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 literal 0 HcmV?d00001 diff --git a/src/userland/sdk/lib/libm.a b/src/userland/sdk/lib/libm.a new file mode 100644 index 0000000000000000000000000000000000000000..394888f0b4742bb27398e667c1cc58cc412a6dc1 GIT binary patch literal 112474 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 z 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 literal 0 HcmV?d00001 diff --git a/src/userland/sdk/lib/libui.a b/src/userland/sdk/lib/libui.a new file mode 100644 index 0000000000000000000000000000000000000000..57109b15a72fd5bae21116a81f8fc7adca05256b GIT binary patch literal 4646 zcmd5<-H#Jh6u$*rc7df8KO#c10}_LYsqM1tZU|sEP?$}&ikJpsFx_rD-8QscY-i;o z21yX&M2&qhk;EAO03P;%_*lDQ%+?rF@Wsc)fLRkCy2co?F~M{0oHKK|v`V56p0soC z{hhDhJ@?Mcoo##5l}vvBx|fUxB|0)PIyf2~8i^PN{6N&JVGQkZ$A&SvP6)9{h`?|E z#ecStI$bDdXHKUw6)SC90)T1DPFZhTWg7?CO8RuFVr7)U%xpPpWhI!(6^cbG>ls$< zN})Wh4O3GEyOchKXenJenaUO__F2!SP)bjGXo91u-ai!-NOwlaz&>n0OF3#9~G*LK(#gDB-#`w7aVvGtZ+&T=KN2FvmAHk&AyxC z4orHbjuVtq_yuihxm@_~?ePZdY~OXhYry4^>dBKG&omN1R#}p@T|$`tlGJcLqRo0Q z69j*EIc`7+4hoTsHlw%deGjXH0~Y`UivDsA!dMnWsYh-sczzy=7Ok>C&X%T_`rcZ z#?Hg9BwsM1yTgOwh5c`r$#Nx|is0EV?ij=DSt0NTe$VNi>8Lwu6Pa_ykM5B{Cv90DBeuR@C=_Y|~K z@JGCjAPDc9x1irC&N;x*-k=(>eU0!Vg!8;UCmin?6y|vi`WUB0xZGQSH3)ALF835* zKM)?m_YDZI;m^>=I1$1lQY*xtgijJaM)+ok+i70g0mnFVWH0v^`0OLRMY!BsfFC2g zO*r#8Nq7ifMIgMdE)pIgobBn*kip}~gU7S#Sv<-Vckw}`!#RyihS0=4z5VlnjeK@{ zK6IM;zn$EO=P*xSJufN;HSO4_Xq4mHqaWeKu)AzU!^g(9KTKYb!r(ms4fc{euQv& z4gww9*9h;Wmhl#icWQW>#-@gc&=KT>hDQiLrQ!TMj_l_&`xfCX4Q~_9`;+7F zbMKyJ&(A#(uAVK~=_zRKireP7SFwueux*{OML3(b(;_@ot%`7Frc}Z&)UZ@r`Bbiw zE?MrZ|NYf~5J+up4{#61*nryi@kI~9^@Jm#%!4h;Gj1cEhZgf| zX~ZQRAbTn+jf8j+dKgnTe^mb{_+m_cZ$eiJ`{Of270%BszR$5w+rcyalnC`|3Z6e3 z?txCH`iLK6Lp7juGE#y W<8ak$kBTMyr~w&w8}F)x6Mq3AwU5>S literal 0 HcmV?d00001