98 lines
4.6 KiB
C
98 lines
4.6 KiB
C
|
// -----------------------------------------------------------------------------
|
||
|
// files, cache and virtual filesystem (registered directories and/or compressed zip archives).
|
||
|
// - rlyeh, public domain.
|
||
|
//
|
||
|
// - note: vfs_mount() order matters (last mounts have higher priority).
|
||
|
// - note: directory/with/trailing/slash/ as mount_point, or zip/tar/pak archive otherwise.
|
||
|
//
|
||
|
// @todo: file_mmap
|
||
|
// @todo: file_find() from first file_scan()
|
||
|
|
||
|
// physical filesystem. files
|
||
|
|
||
|
API const char** file_list(const char *path, const char *masks); // **.png;*.c
|
||
|
API bool file_write( const char *file, const void *ptr, int len );
|
||
|
API bool file_append( const char *file, const void *ptr, int len );
|
||
|
API char * file_read(const char *filename);
|
||
|
API char * file_load(const char *filename, int *len);
|
||
|
API uint64_t file_size(const char *pathfile);
|
||
|
API bool file_directory(const char *pathfile);
|
||
|
|
||
|
API char * file_pathabs(const char *pathfile); // ../dir/./file.ext -> c:/prj/dir/file.ext
|
||
|
API char * file_path(const char *pathfile); // c:/prj/dir/file.ext -> c:/prj/dir/
|
||
|
API char * file_name(const char *pathfile); // c:/prj/dir/file.ext -> file.ext
|
||
|
API char * file_base(const char *pathfile); // c:/prj/dir/file.ext -> file
|
||
|
API char * file_ext(const char *pathfile); // c:/prj/dir/file.ext -> .ext
|
||
|
API char * file_id(const char *pathfile); // c:/prj/dir/file.ext -> file/dir/prj (name then alphabetical)
|
||
|
API char * file_normalize(const char *pathfile); // c:/prj/dir/file.ext -> c/prj/dir/file_ext
|
||
|
//API char * file_normalize_with_folder(const char *pathfile); // c:/prj/dir/file.ext -> dir/file_ext
|
||
|
API char * file_counter(const char *pathfile); // in: v4k.ini -> out: v4k(001).ini -> out: v4k(002).ini [-> etc...]
|
||
|
|
||
|
API uint64_t file_stamp(const char *pathfile); // 20210319113316 (datetime in base10)
|
||
|
API uint64_t file_stamp_epoch(const char *pathfile); // 1616153596 (seconds since unix epoch)
|
||
|
|
||
|
API bool file_exist(const char *pathfile);
|
||
|
API bool file_delete(const char *pathfile);
|
||
|
API bool file_copy(const char *src, const char *dst);
|
||
|
API bool file_move(const char *src, const char *dst);
|
||
|
|
||
|
API FILE* file_temp();
|
||
|
API char* file_tempname();
|
||
|
|
||
|
API void* file_md5(const char *file); // 16 bytes
|
||
|
API void* file_sha1(const char *file); // 20 bytes
|
||
|
API void* file_crc32(const char *file); // 4 bytes
|
||
|
|
||
|
// compressed files
|
||
|
|
||
|
API array(char*) file_zip_list(const char *zipfile);
|
||
|
API array(char) file_zip_extract(const char *zipfile, const char *filename);
|
||
|
API bool file_zip_append(const char *zipfile, const char *filename, int clevel);
|
||
|
API bool file_zip_appendmem(const char *zipfile, const char *entryname, const void *ptr, unsigned len, int clevel);
|
||
|
|
||
|
// storage (emscripten only)
|
||
|
|
||
|
// Mounts local storage folder for writing. Useful for Emscripten only. @path_folder: "/save" for example
|
||
|
// Reads local storage to memory. Usually call it one time only, after mount. Useful for Emscripten only.
|
||
|
// Writes memory contents to local storage. Usually call it after all fclose
|
||
|
API void storage_mount(const char* folder);
|
||
|
API void storage_read();
|
||
|
API void storage_flush();
|
||
|
|
||
|
// virtual filesystem
|
||
|
|
||
|
API bool vfs_mount(const char *mount_point);
|
||
|
API const char** vfs_list(const char *masks); // **.png;*.c
|
||
|
|
||
|
API char * vfs_read(const char *pathfile);
|
||
|
API char * vfs_load(const char *pathfile, int *size);
|
||
|
API int vfs_size(const char *pathfile);
|
||
|
|
||
|
API const char * vfs_resolve(const char *fuzzyname); // guess best match. @todo: fuzzy path
|
||
|
//API const char*vfs_extract(const char *pathfile); // extracts vfs file into local filesystem (temporary file), so it can be read by foreign/3rd party libs
|
||
|
API FILE* vfs_handle(const char *pathfile); // same as above, but returns file handle instead. preferred way, will clean descriptors at exit
|
||
|
|
||
|
// cache
|
||
|
|
||
|
API void * cache_insert(const char *key, void *value, int size);
|
||
|
API void * cache_lookup(const char *key, int *size);
|
||
|
|
||
|
// ini
|
||
|
|
||
|
// @todo: evaluate alt api #1
|
||
|
// char *ini(filename, section.key, default);
|
||
|
// float inif(filename, section.key, default);
|
||
|
// @todo: evaluate alt api #2
|
||
|
// char *val = ini(filename, section_key);
|
||
|
// int count = ini_count(filename);
|
||
|
// char *key = ini_key_id(filename, id);
|
||
|
// char *val = ini_val_id(filename, id);
|
||
|
|
||
|
typedef map(char*,char*) ini_t;
|
||
|
|
||
|
API ini_t ini(const char *filename);
|
||
|
API ini_t ini_from_mem(const char *data);
|
||
|
API void ini_destroy(ini_t);
|
||
|
|
||
|
API bool ini_write(const char *filename, const char *section, const char *key, const char *value);
|