From dfae044f75c532301a596c2b2a42ec4db1ab9994 Mon Sep 17 00:00:00 2001 From: Nanaloveyuki Date: Sun, 14 Jun 2026 13:03:03 +0800 Subject: [PATCH] :hammer: wrap native file ffi symbols locally --- src/utils/file_backend_native.mbt | 23 ++++++++++------ src/utils/stub.c | 46 +++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/utils/file_backend_native.mbt b/src/utils/file_backend_native.mbt index 1a04c10..7589a80 100644 --- a/src/utils/file_backend_native.mbt +++ b/src/utils/file_backend_native.mbt @@ -35,7 +35,7 @@ fn string_to_c_bytes(str : String) -> Bytes { type NativeFileHandle #borrow(path, mode) -extern "C" fn file_open_ffi(path : Bytes, mode : Bytes) -> NativeFileHandle = "fopen" +extern "C" fn file_open_ffi(path : Bytes, mode : Bytes) -> NativeFileHandle = "bitlogger_file_open" extern "C" fn file_is_null_ffi(handle : NativeFileHandle) -> Bool = "bitlogger_pointer_is_null" @@ -45,21 +45,28 @@ extern "C" fn file_write_ffi( size : Int, count : Int, handle : NativeFileHandle, -) -> Int = "fwrite" +) -> Int = "bitlogger_file_write" -extern "C" fn file_flush_ffi(handle : NativeFileHandle) -> Int = "fflush" +extern "C" fn file_flush_ffi(handle : NativeFileHandle) -> Int = "bitlogger_file_flush" -extern "C" fn file_close_ffi(handle : NativeFileHandle) -> Int = "fclose" +extern "C" fn file_close_ffi(handle : NativeFileHandle) -> Int = "bitlogger_file_close" -extern "C" fn file_seek_ffi(handle : NativeFileHandle, offset : Int, origin : Int) -> Int = "fseek" +extern "C" fn file_seek_ffi( + handle : NativeFileHandle, + offset : Int, + origin : Int, +) -> Int = "bitlogger_file_seek" -extern "C" fn file_tell_ffi(handle : NativeFileHandle) -> Int = "ftell" +extern "C" fn file_tell_ffi(handle : NativeFileHandle) -> Int = "bitlogger_file_tell" #borrow(from_path, to_path) -extern "C" fn file_rename_ffi(from_path : Bytes, to_path : Bytes) -> Int = "rename" +extern "C" fn file_rename_ffi( + from_path : Bytes, + to_path : Bytes, +) -> Int = "bitlogger_file_rename" #borrow(path) -extern "C" fn file_remove_ffi(path : Bytes) -> Int = "remove" +extern "C" fn file_remove_ffi(path : Bytes) -> Int = "bitlogger_file_remove" pub struct FileHandle { path : String diff --git a/src/utils/stub.c b/src/utils/stub.c index eeb17c5..c794bfd 100644 --- a/src/utils/stub.c +++ b/src/utils/stub.c @@ -1,5 +1,51 @@ #include +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include + int32_t bitlogger_pointer_is_null(void *ptr) { return ptr == 0; } + +void *bitlogger_file_open(const char *path, const char *mode) { +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + return fopen(path, mode); +#if defined(__clang__) +#pragma clang diagnostic pop +#endif +} + +int32_t bitlogger_file_write(const char *buffer, int32_t size, int32_t count, void *handle) { + return (int32_t)fwrite(buffer, (size_t)size, (size_t)count, (FILE *)handle); +} + +int32_t bitlogger_file_flush(void *handle) { + return fflush((FILE *)handle); +} + +int32_t bitlogger_file_close(void *handle) { + return fclose((FILE *)handle); +} + +int32_t bitlogger_file_seek(void *handle, int32_t offset, int32_t origin) { + return fseek((FILE *)handle, offset, origin); +} + +int32_t bitlogger_file_tell(void *handle) { + long position = ftell((FILE *)handle); + return position < 0 ? -1 : (int32_t)position; +} + +int32_t bitlogger_file_rename(const char *from_path, const char *to_path) { + return rename(from_path, to_path); +} + +int32_t bitlogger_file_remove(const char *path) { + return remove(path); +}