solidc
Robust collection of general-purpose cross-platform C libraries and data structures designed for rapid and safe development in C
Loading...
Searching...
No Matches
file.h
Go to the documentation of this file.
1
5#ifndef SOLIDC_FILE_H
6#define SOLIDC_FILE_H
7
8#if !defined(_POSIX_C_SOURCE) && !defined(_WIN32)
9#define _POSIX_C_SOURCE 200809L // For fstat, fileno, pwrite, pread, fcntl, etc.
10#define _FILE_OFFSET_BITS 64 // Ensure 64-bit off_t on 32-bit POSIX systems
11#endif
12
13#include "platform.h"
14
15#include <stdbool.h>
16#include <stddef.h>
17#include <stdint.h>
18#include <stdio.h>
19
20// Platform detection and feature setup
21#ifdef _WIN32
22#ifndef WIN32_LEAN_AND_MEAN
23#define WIN32_LEAN_AND_MEAN
24#endif
25#include <io.h>
26#include <windows.h>
27
28// Define ssize_t for Windows if not already defined
29#if defined(_MSC_VER) && !defined(_SSIZE_T_DEFINED)
30typedef intptr_t ssize_t;
31#define _SSIZE_T_DEFINED
32#endif
33
34// Windows-specific file handle type
35typedef HANDLE native_handle_t;
36#define INVALID_NATIVE_HANDLE INVALID_HANDLE_VALUE
37
38#else // POSIX systems
39
40#include <fcntl.h>
41#include <sys/mman.h>
42#include <sys/stat.h>
43#include <unistd.h>
44
45// POSIX file handle type
46typedef int native_handle_t;
47
48enum { INVALID_NATIVE_HANDLE = (-1) };
49#endif
50
51#ifdef __cplusplus
52extern "C" {
53#endif
54
56typedef enum FileAttrFlags {
58 FATTR_FILE = 1 << 0,
59 FATTR_DIR = 1 << 1,
60 FATTR_SYMLINK = 1 << 2,
61 FATTR_CHARDEV = 1 << 3,
62 FATTR_BLOCKDEV = 1 << 4,
63 FATTR_FIFO = 1 << 5,
64 FATTR_SOCKET = 1 << 6,
65 FATTR_HIDDEN = 1 << 7,
68
70typedef struct FileAttributes {
72 uint32_t attrs;
73
75 size_t size;
76
78 time_t mtime;
80
87static inline bool fattr_has(const FileAttributes* attr, FileAttrFlags flag) { return (attr->attrs & flag) != 0; }
88
94static inline bool fattr_is_file(const FileAttributes* attr) { return (attr->attrs & FATTR_FILE) != 0; }
95
101static inline bool fattr_is_dir(const FileAttributes* attr) { return (attr->attrs & FATTR_DIR) != 0; }
102
108static inline bool fattr_is_symlink(const FileAttributes* attr) { return (attr->attrs & FATTR_SYMLINK) != 0; }
109
115static inline bool fattr_is_device(const FileAttributes* attr) {
116 return (attr->attrs & (FATTR_CHARDEV | FATTR_BLOCKDEV)) != 0;
117}
118
126int populate_file_attrs(const char* path, FileAttributes* attr);
127
133typedef struct {
134 FILE* stream;
135 FileAttributes attr; // File attributes
136 native_handle_t native_handle;
137} file_t;
138
149
159file_result_t file_open(file_t* file, const char* filename, const char* mode);
160
167void file_close(file_t* file);
168
177file_result_t file_truncate(file_t* file, int64_t length);
178
187file_result_t filesize_tostring(uint64_t size, char* buf, size_t len);
188
198size_t file_read(const file_t* file, void* buffer, size_t size, size_t count);
199
210size_t file_write(file_t* file, const void* buffer, size_t size, size_t count);
211
219size_t file_write_string(file_t* file, const char* str);
220
231ssize_t file_pread(const file_t* file, void* buffer, size_t size, int64_t offset);
232
243ssize_t file_pwrite(file_t* file, const void* buffer, size_t size, int64_t offset);
244
254void* file_readall(file_t* file, size_t* size_out);
255
264file_result_t file_lock(const file_t* file);
265
273file_result_t file_unlock(const file_t* file);
274
284file_result_t file_copy(const file_t* src, file_t* dst);
285
296void* file_mmap(const file_t* file, size_t length, bool read_access, bool write_access);
297
305file_result_t file_munmap(void* addr, size_t length);
306
314
321int64_t file_tell(const file_t* file);
322
331file_result_t file_seek(file_t* file, int64_t offset, int whence);
332
333#ifdef __cplusplus
334}
335#endif
336
337#endif /* SOLIDC_FILE_H */
ssize_t file_pwrite(file_t *file, const void *buffer, size_t size, int64_t offset)
Definition file.c:347
void file_close(file_t *file)
Definition file.c:234
file_result_t filesize_tostring(uint64_t size, char *buf, size_t len)
Definition file.c:268
file_result_t file_truncate(file_t *file, int64_t length)
Definition file.c:242
size_t file_read(const file_t *file, void *buffer, size_t size, size_t count)
Definition file.c:301
file_result_t
Definition file.h:140
@ FILE_ERROR_INVALID_ARGS
Definition file.h:142
@ FILE_ERROR_SYSTEM_ERROR
Definition file.h:147
@ FILE_ERROR_LOCK_FAILED
Definition file.h:145
@ FILE_ERROR_OPEN_FAILED
Definition file.h:143
@ FILE_ERROR_MEMORY_FAILED
Definition file.h:146
@ FILE_SUCCESS
Definition file.h:141
@ FILE_ERROR_IO_FAILED
Definition file.h:144
void * file_readall(file_t *file, size_t *size_out)
Definition file.c:367
ssize_t file_pread(const file_t *file, void *buffer, size_t size, int64_t offset)
Definition file.c:323
file_result_t file_open(file_t *file, const char *filename, const char *mode)
Definition file.c:198
file_result_t file_seek(file_t *file, int64_t offset, int whence)
Definition file.c:561
file_result_t file_flush(file_t *file)
Definition file.c:544
void * file_mmap(const file_t *file, size_t length, bool read_access, bool write_access)
Definition file.c:498
size_t file_write_string(file_t *file, const char *str)
Definition file.c:315
int64_t file_tell(const file_t *file)
Definition file.c:546
FileAttrFlags
Definition file.h:56
@ FATTR_DIR
Definition file.h:59
@ FATTR_HIDDEN
Definition file.h:65
@ FATTR_NONE
Definition file.h:57
@ FATTR_FILE
Definition file.h:58
@ FATTR_BLOCKDEV
Definition file.h:62
@ FATTR_SYMLINK
Definition file.h:60
@ FATTR_FIFO
Definition file.h:63
@ FATTR_SOCKET
Definition file.h:64
@ FATTR_EXECUTABLE
Definition file.h:66
@ FATTR_CHARDEV
Definition file.h:61
file_result_t file_copy(const file_t *src, file_t *dst)
Definition file.c:471
file_result_t file_lock(const file_t *file)
Definition file.c:424
size_t file_write(file_t *file, const void *buffer, size_t size, size_t count)
Definition file.c:308
int populate_file_attrs(const char *path, FileAttributes *attr)
Definition file.c:124
file_result_t file_munmap(void *addr, size_t length)
Definition file.c:531
file_result_t file_unlock(const file_t *file)
Definition file.c:453
Cross-platform compatibility definitions.
time_t mtime
Definition file.h:78
size_t size
Definition file.h:75
uint32_t attrs
Definition file.h:72
Definition file.h:133
FILE * stream
Definition file.h:134
native_handle_t native_handle
Definition file.h:136