Cthulhu  0.2.10
Cthulhu compiler collection
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
common.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: LGPL-3.0-only
2 
3 #include "common.h"
4 
5 #include "arena/arena.h"
6 #include "os/os.h"
7 
8 #include "std/str.h"
9 
10 #include "base/util.h"
11 #include "base/panic.h"
12 
13 // inode api
14 
16  .type = eOsNodeNone
17 };
18 
19 fs_inode_t *inode_new(fs_t *fs, os_dirent_t type, const char *name, const void *data)
20 {
21  CTASSERT(fs != NULL);
22  CT_ASSERT_RANGE(type, 0, eOsNodeCount - 1);
23 
24  fs_inode_t *inode = ARENA_MALLOC(sizeof(fs_inode_t) + fs->cb->inode_size, name, fs, fs->arena);
25  inode->type = type;
26  inode->name = arena_strdup(name, fs->arena);
27  ctu_memcpy(inode->data, data, fs->cb->inode_size);
28  return inode;
29 }
30 
31 fs_inode_t *inode_file(fs_t *fs, const char *name, const void *data)
32 {
33  return inode_new(fs, eOsNodeFile, name, data);
34 }
35 
36 fs_inode_t *inode_dir(fs_t *fs, const char *name, const void *data)
37 {
38  return inode_new(fs, eOsNodeDir, name, data);
39 }
40 
41 void *inode_data(fs_inode_t *inode)
42 {
43  CTASSERT(inode != NULL);
44 
45  return inode->data;
46 }
47 
48 void *iter_data(fs_iter_t *iter)
49 {
50  CTASSERT(iter != NULL);
51 
52  return iter->data;
53 }
54 
55 bool inode_is(const fs_inode_t *inode, os_dirent_t type)
56 {
57  CTASSERT(inode != NULL);
58  CTASSERT(type < eOsNodeCount);
59 
60  return inode->type == type;
61 }
62 
63 const char *inode_name(const fs_inode_t *inode)
64 {
65  CTASSERT(inode != NULL);
66 
67  return inode->name;
68 }
69 
70 // helpers
71 
72 os_error_t mkdir_recursive(const char *path, arena_t *arena)
73 {
74  CTASSERT(path != NULL);
75 
76  // TODO: we should use normalized paths that always use the OS path separator
77  // or ideally are in an OS independent format.
78  size_t index = str_rfind_any(path, CT_PATH_SEPERATORS);
79  if (index != SIZE_MAX)
80  {
81  // create parent directory
82  char *parent = arena_strndup(path, index, arena);
83  os_error_t result = mkdir_recursive(parent, arena);
84  if (result != eOsSuccess && result != eOsExists) { return result; }
85  }
86 
87  // create this directory
88  return os_dir_create(path);
89 }
90 
91 // fs api
92 
93 fs_t *fs_new(void *root, const fs_callbacks_t *cb, const void *data, size_t size, arena_t *arena)
94 {
95  CTASSERT(root != NULL);
96  CTASSERT(cb != NULL);
97 
98  fs_t *fs = ARENA_MALLOC(sizeof(fs_t) + size, "fs", cb, arena);
99  fs->arena = arena;
100  fs->cb = cb;
101  fs->root = inode_dir(fs, ".", root);
102 
103  ctu_memcpy(fs->data, data, size);
104 
105  return fs;
106 }
107 
108 void *fs_data(fs_t *fs)
109 {
110  CTASSERT(fs != NULL);
111 
112  return fs->data;
113 }
void * fs_data(fs_t *fs)
Definition: common.c:108
fs_inode_t gInvalidFileNode
Definition: common.c:15
const char * inode_name(const fs_inode_t *inode)
Definition: common.c:63
void * inode_data(fs_inode_t *inode)
Definition: common.c:41
os_error_t mkdir_recursive(const char *path, arena_t *arena)
Definition: common.c:72
fs_inode_t * inode_new(fs_t *fs, os_dirent_t type, const char *name, const void *data)
Definition: common.c:19
fs_inode_t * inode_file(fs_t *fs, const char *name, const void *data)
Definition: common.c:31
fs_inode_t * inode_dir(fs_t *fs, const char *name, const void *data)
Definition: common.c:36
fs_t * fs_new(void *root, const fs_callbacks_t *cb, const void *data, size_t size, arena_t *arena)
Definition: common.c:93
bool inode_is(const fs_inode_t *inode, os_dirent_t type)
Definition: common.c:55
void * iter_data(fs_iter_t *iter)
Definition: common.c:48
CT_NODISCARD size_t size
Definition: scan.h:128
os_dirent_t
directory entry type
Definition: core.h:56
@ eOsNodeCount
Definition: core.h:60
CT_NOALIAS CT_BASE_API void * ctu_memcpy(STA_WRITES(size) void *CT_RESTRICT dst, STA_READS(size) const void *CT_RESTRICT src, size_t size)
copy memory from one location to another equivalent to memcpy but with safety checks
#define CT_PATH_SEPERATORS
Definition: compiler.h:89
CT_NODISCARD CT_ARENA_API char * arena_strdup(const char *str, arena_t *arena)
allocate a copy of a string from a custom allocator
Definition: arena.c:95
CT_NODISCARD CT_ARENA_API char * arena_strndup(STA_READS(len) const char *str, size_t len, arena_t *arena)
allocate a copy of a string with a maximum length from a custom allocator
#define ARENA_MALLOC(size, name, parent, arena)
allocate memory from a custom allocator
Definition: arena.h:392
#define CT_ASSERT_RANGE(value, min, max)
assert that a value is in a range inclusive bounds check
Definition: panic.h:148
#define CTASSERT(expr)
assert a condition, prints the condition as a message
Definition: panic.h:130
CT_PUREFN CT_STD_API size_t str_rfind_any(const char *str, const char *letters)
find the first instance of a set of characters in a string
Definition: str.c:137
CT_OS_API os_error_t os_dir_create(const char *path)
check if a directory exists
Definition: fs.c:29
@ eOsExists
Definition: posix.h:26
@ eOsSuccess
Definition: posix.h:24
an allocator object
Definition: arena.h:86
size_t inode_size
Definition: common.h:68
os_dirent_t type
Definition: common.h:14
char data[]
Definition: common.h:16
const char * name
Definition: common.h:15
char data[]
Definition: common.h:24
Definition: common.h:72
arena_t * arena
Definition: common.h:74
const fs_callbacks_t * cb
callbacks
Definition: common.h:73
fs_inode_t * root
root inode
Definition: common.h:75
char data[]
Definition: common.h:77