ApophisZerg的vulkan游戏引擎的platform平台

发布于:2025-05-10 ⋅ 阅读:(8) ⋅ 点赞:(0)

1.filesystem.h

#pragma once

#include "defines.h"


 

//Hold a handle to a file.

typedef struct file_handle{

    void* handle;  

    b8 is_valid;

}file_handle;


 

typedef enum file_modes{

    FILE_MODE_READ = 0x1,

    FILE_MODE_WRITE = 0x2

}file_modes;



 

KAPI b8 filesystem_exists(const char* path);


 

KAPI b8 filesystem_open(const char* path,file_modes mode,b8 binary,file_handle* out_handle);


 

KAPI void filesystem_close(file_handle* handle);


 

KAPI b8 filesystem_read_line(file_handle* handle,char** line_buf);

KAPI b8 filesystem_write_line(file_handle* handle,const char* text);

KAPI b8 filesystem_read(file_handle* handle,u64 data_size,void* out_data,u64* out_bytes_read);

KAPI b8 filesystem_read_all_bytes(file_handle* handle,u8** out_bytes,u64* out_bytes_read);

KAPI b8 filesystem_write(file_handle* handle,u64 data_size,const void* data,u64* out_bytes_written);

2.filesystem.c

#include "filesystem.h"

//#include "renderer/vulkan/vulkan_types.inl"

#include "core/logger.h"

#include "core/kmemory.h"

#include <stdio.h>

#include <string.h>

#include <sys/stat.h>

b8 filesystem_exists(const char* path)

{

    struct stat buffer;

    return stat(path, &buffer) == 0;



 

}

b8 filesystem_open(const char* path,file_modes mode,b8 binary,file_handle* out_handle)

{

    out_handle->is_valid = false;

    out_handle->handle= 0;

    const char* mode_str;

    if((mode & FILE_MODE_READ)!=0 && (mode & FILE_MODE_WRITE)!=0)

    {

        mode_str = binary ? "w+b" : "w+";


 

    }else if((mode & FILE_MODE_READ)!=0&&(mode & FILE_MODE_WRITE) == 0)

    {

        mode_str = binary ? "rb" : "r";


 

    }else if((mode & FILE_MODE_READ)==0&&(mode & FILE_MODE_WRITE) != 0)

    {

         mode_str = binary ? "wb" : "w";


 

    }

    else

    {

        KERROR("Invalid mode passed while trying to open file: '%s'",path);

        return false;



 

    }

    //Attempt to open the file

    FILE* file = fopen(path,mode_str);

    if(!file)

    {  

        KERROR("Error opening file: '%s'",path);

        return false;

    }

    out_handle->handle = file;

    out_handle->is_valid = true;

    return true;


 

}

void filesystem_close(file_handle* handle)

{

    if(handle->handle)

    {

        fclose((FILE*)handle->handle);

        handle->handle = 0;

        handle->is_valid = false;


 

    }



 

}

b8 filesystem_read_line(file_handle* handle,char** line_buf)

{

    if(handle->handle)

    {

        char buffer[32000];

        if(fgets(buffer,32000,(FILE*)handle->handle)!=0)

        {

            u64 length = strlen(buffer);

            *line_buf = kallocate((sizeof(char)* length)+1,MEMORY_TAG_STRING);

            strcpy(*line_buf,buffer);

            return true;

        }

    }

    return false;

}

b8 filesystem_write_line(file_handle* handle,const char* text)

{

    if(handle->handle)

    {

        i32 result = fputs(text,(FILE*)handle->handle);

        if(result != EOF)

        {

            result = fputc('\n',(FILE*)handle->handle);

        }

        fflush((FILE*)handle->handle);

        return result != EOF;



 

    }

    return false;


 

}


 

b8 filesystem_read(file_handle* handle,u64 data_size,void* out_data,u64* out_bytes_read)

{

    if(handle->handle && out_data)

    {

        *out_bytes_read = fread(out_data,1,data_size,(FILE*)handle->handle);

        if(*out_bytes_read != data_size)

        {

            return false;


 

        }

        return true;

    }

    return false;

}

b8 filesystem_read_all_bytes(file_handle* handle,u8** out_bytes,u64* out_bytes_read)

{

    if(handle->handle)

    {


 

        fseek((FILE*)handle->handle,0,SEEK_END);

        u64 size = ftell((FILE*)handle->handle);

        rewind((FILE*)handle->handle);

        *out_bytes = kallocate(sizeof(u8)* size,MEMORY_TAG_STRING);

        *out_bytes_read = fread(*out_bytes,1,size,(FILE*)handle->handle);

        if(*out_bytes_read != size)

        {

            return false;


 

        }

        return true;

    }


 

    return false;

}

b8 filesystem_write(file_handle* handle,u64 data_size,const void* data,u64* out_bytes_written)

{

    if(handle->handle)

    {

        *out_bytes_written = fwrite(data,1,data_size,(FILE*)handle->handle);

        if(*out_bytes_written != data_size)

        {

            return false;

        }

    return true;


 

    }

    return false;

}


 


网站公告

今日签到

点亮在社区的每一天
去签到