add some more file fns and a Ctrl-C handler
This commit is contained in:
@@ -288,6 +288,11 @@ typedef u32 b32;
|
|||||||
#define false 0
|
#define false 0
|
||||||
|
|
||||||
// Structs
|
// Structs
|
||||||
|
typedef struct Resulti64 {
|
||||||
|
bool success;
|
||||||
|
i64 value;
|
||||||
|
} Resulti64;
|
||||||
|
|
||||||
typedef struct Arena {
|
typedef struct Arena {
|
||||||
u8* memory;
|
u8* memory;
|
||||||
u64 max;
|
u64 max;
|
||||||
@@ -462,6 +467,7 @@ union Range1f32
|
|||||||
|
|
||||||
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
|
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
|
||||||
#else
|
#else
|
||||||
|
# include <signal.h>
|
||||||
# include <poll.h>
|
# include <poll.h>
|
||||||
# include <sys/socket.h>
|
# include <sys/socket.h>
|
||||||
# include <netinet/in.h>
|
# include <netinet/in.h>
|
||||||
@@ -598,6 +604,7 @@ fn bool isSimplePrintable(u8 c);
|
|||||||
|
|
||||||
///// OS-wrapped apis
|
///// OS-wrapped apis
|
||||||
void osInit();
|
void osInit();
|
||||||
|
void osSetCtrlCCallback(void (*handler)());
|
||||||
void* osThreadContextGet();
|
void* osThreadContextGet();
|
||||||
void osThreadContextSet(void* ctx);
|
void osThreadContextSet(void* ctx);
|
||||||
bool osThreadJoin(Thread handle, u64 endt_us);
|
bool osThreadJoin(Thread handle, u64 endt_us);
|
||||||
@@ -620,6 +627,9 @@ fn String osFileRead(Arena* arena, ptr filepath);
|
|||||||
fn bool osFileCreate(String filename);
|
fn bool osFileCreate(String filename);
|
||||||
fn bool osFileCreateWrite(String filename, String data);
|
fn bool osFileCreateWrite(String filename, String data);
|
||||||
fn bool osFileWrite(String filename, String data);
|
fn bool osFileWrite(String filename, String data);
|
||||||
|
fn Resulti64 osFileOpenForWriting(String filename);
|
||||||
|
fn Resulti64 osFileClose(Resulti64 handle);
|
||||||
|
fn bool osFileWriteOpenFile(Resulti64 handle, String data);
|
||||||
|
|
||||||
fn void osDebugPrint(bool debug_mode, const char* format, ...);
|
fn void osDebugPrint(bool debug_mode, const char* format, ...);
|
||||||
|
|
||||||
|
|||||||
@@ -124,6 +124,33 @@ fn bool osFileWrite(String filename, String data) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn Resulti64 osFileOpenForWriting(String filename) {
|
||||||
|
size_t handle = open((str)filename.bytes, O_WRONLY | O_APPEND, S_IRUSR | S_IRGRP | S_IROTH);
|
||||||
|
Resulti64 result = {
|
||||||
|
.success = handle != -1,
|
||||||
|
.value = (i64)handle,
|
||||||
|
};
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Resulti64 osFileClose(Resulti64 handle) {
|
||||||
|
i32 close_result = close((size_t)handle.value);
|
||||||
|
Resulti64 result = {
|
||||||
|
.success = close_result != -1,
|
||||||
|
.value = (i64)close_result,
|
||||||
|
};
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bool osFileWriteOpenFile(Resulti64 handle, String data) {
|
||||||
|
assert(handle.success == true);
|
||||||
|
i32 wrote_this_round = 0;
|
||||||
|
for (i32 bytes_written = 0; bytes_written < data.length; bytes_written += wrote_this_round) {
|
||||||
|
wrote_this_round = write((size_t)handle.value, data.bytes + bytes_written, data.length - bytes_written);
|
||||||
|
if (wrote_this_round == -1) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
fn void osDebugPrint(bool debug_mode, const char * format, ... ) {
|
fn void osDebugPrint(bool debug_mode, const char * format, ... ) {
|
||||||
|
|||||||
@@ -1,11 +1,23 @@
|
|||||||
#include "all.h"
|
#include "all.h"
|
||||||
|
|
||||||
global pthread_key_t linux_thread_context_key;
|
global pthread_key_t linux_thread_context_key;
|
||||||
|
global void (*_ctrl_c_handler_fn_ptr)() = NULL;
|
||||||
// ThreadContext
|
// ThreadContext
|
||||||
void osInit() {
|
void osInit() {
|
||||||
pthread_key_create(&linux_thread_context_key, NULL);
|
pthread_key_create(&linux_thread_context_key, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _osGenericSignalHandler(i32 signal) {
|
||||||
|
if (signal == SIGINT && _ctrl_c_handler_fn_ptr != NULL) {
|
||||||
|
_ctrl_c_handler_fn_ptr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void osSetCtrlCCallback(void (*handler)()) {
|
||||||
|
_ctrl_c_handler_fn_ptr = handler;
|
||||||
|
signal(SIGINT, _osGenericSignalHandler);
|
||||||
|
}
|
||||||
|
|
||||||
void* osThreadContextGet() {
|
void* osThreadContextGet() {
|
||||||
return pthread_getspecific(linux_thread_context_key);
|
return pthread_getspecific(linux_thread_context_key);
|
||||||
}
|
}
|
||||||
|
|||||||
+29
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
static u64 w32_ticks_per_sec = 1;
|
static u64 w32_ticks_per_sec = 1;
|
||||||
static u32 w32_thread_context_index;
|
static u32 w32_thread_context_index;
|
||||||
|
global void (*_ctrl_c_handler_fn_ptr)() = NULL;
|
||||||
|
|
||||||
void osInit() {
|
void osInit() {
|
||||||
LARGE_INTEGER perf_freq = {0};
|
LARGE_INTEGER perf_freq = {0};
|
||||||
@@ -16,6 +17,19 @@ void osInit() {
|
|||||||
w32_thread_context_index = TlsAlloc();
|
w32_thread_context_index = TlsAlloc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI _osGenericSignalHandler(DWORD event) {
|
||||||
|
if (event == CTRL_C_EVENT && _ctrl_c_handler_fn_ptr != NULL) {
|
||||||
|
_ctrl_c_handler_fn_ptr();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void osSetCtrlCCallback(void (*handler)()) {
|
||||||
|
_ctrl_c_handler_fn_ptr = handler;
|
||||||
|
SetConsoleCtrlHandler(_osGenericSignalHandler, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
void* osThreadContextGet() {
|
void* osThreadContextGet() {
|
||||||
return TlsGetValue(w32_thread_context_index);
|
return TlsGetValue(w32_thread_context_index);
|
||||||
}
|
}
|
||||||
@@ -90,6 +104,21 @@ fn bool osFileWrite(String filename, String data) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn Resulti64 osFileOpenForWriting(String filename) {
|
||||||
|
assert(false && "Not Implemented");
|
||||||
|
return (Resulti64) {};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Resulti64 osFileClose(Resulti64 handle) {
|
||||||
|
assert(false && "Not Implemented");
|
||||||
|
return (Resulti64) {};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bool osFileWriteOpenFile(Resulti64 handle, String data) {
|
||||||
|
assert(false && "Not Implemented");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
fn void osDebugPrint(bool debug_mode, const char * format, ... ) {
|
fn void osDebugPrint(bool debug_mode, const char * format, ... ) {
|
||||||
|
|||||||
Reference in New Issue
Block a user