summaryrefslogtreecommitdiff
path: root/source/kit/file.h
blob: a02d135d1f3e4ae88ebcbcba6e2c709e66f91e23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#ifndef KIT_FILE_H
#define KIT_FILE_H

#include "dynamic_array.h"
#include "string_builder.h"

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

#if defined(_WIN32) && !defined(__CYGWIN__)
#  define KIT_PATH_DELIM_C '\\'
#  define KIT_PATH_DELIM "\\"
#  define KIT_ENV_HOME "USERPROFILE"
#else
#  define KIT_PATH_DELIM_C '/'
#  define KIT_PATH_DELIM "/"
#  define KIT_ENV_HOME "HOME"
#endif

typedef enum {
  KIT_PATH_NONE,
  KIT_PATH_FILE,
  KIT_PATH_FOLDER
} kit_path_type_t;

typedef struct {
  s32 status;

  i64 time_modified_sec;
  i32 time_modified_nsec;
  i64 size;
} kit_file_info_t;

typedef struct {
  s32 status;
  KIT_DA(kit_str_builder_t) files;
} kit_path_list_t;

enum { KIT_FILE_MAP_PRIVATE, KIT_FILE_MAP_SHARED };

typedef struct {
  s32 status;
  i64 size;
  u8 *bytes;
#if defined(_WIN32) && !defined(__CYGWIN__)
  void *_file;
  void *_map;
#else
  int _fd;
#endif
} kit_mapped_file_t;

kit_str_builder_t kit_get_env(kit_str_t name, kit_allocator_t *alloc);

kit_str_builder_t kit_path_norm(kit_str_t        path,
                                kit_allocator_t *alloc);

kit_str_builder_t kit_path_join(kit_str_t left, kit_str_t right,
                                kit_allocator_t *alloc);

kit_str_builder_t kit_path_user(kit_allocator_t *alloc);

kit_str_builder_t kit_path_cache(kit_allocator_t *alloc);

kit_str_builder_t kit_path_data(kit_allocator_t *alloc);

kit_str_t kit_path_index(kit_str_t path, i64 index);

kit_str_t kit_path_take(kit_str_t path, i64 count);

s32 kit_folder_create(kit_str_t path);

s32 kit_folder_create_recursive(kit_str_t path);

s32 kit_file_remove(kit_str_t path);

s32 kit_folder_remove(kit_str_t path);

s32 kit_file_remove_recursive(kit_str_t path, kit_allocator_t *alloc);

kit_path_type_t kit_path_type(kit_str_t path);

kit_file_info_t kit_file_info(kit_str_t path);

kit_path_list_t kit_folder_enum(kit_str_t        path,
                                kit_allocator_t *alloc);

void kit_path_list_destroy(kit_path_list_t list);

kit_mapped_file_t kit_file_map(kit_str_t path, i64 size, i32 mode);
s32               kit_file_sync(kit_mapped_file_t *mf);
s32               kit_file_unmap(kit_mapped_file_t *mf);

#ifdef __cplusplus
}
#endif

#ifndef KIT_DISABLE_SHORT_NAMES
#  define path_type_t kit_path_type_t
#  define file_info_t kit_file_info_t
#  define path_list_t kit_path_list_t
#  define mapped_file_t kit_mapped_file_t

#  define get_env kit_get_env
#  define path_norm kit_path_norm
#  define path_join kit_path_join
#  define path_user kit_path_user
#  define path_cache kit_path_cache
#  define path_data kit_path_data
#  define path_index kit_path_index
#  define path_take kit_path_take
#  define folder_create kit_folder_create
#  define folder_create_recursive kit_folder_create_recursive
#  define file_remove kit_file_remove
#  define folder_remove kit_folder_remove
#  define file_remove_recursive kit_file_remove_recursive
#  define path_type kit_path_type
#  define file_info kit_file_info
#  define folder_enum kit_folder_enum
#  define path_list_destroy kit_path_list_destroy
#  define file_map kit_file_map
#  define file_sync kit_file_sync
#  define file_unmap kit_file_unmap

#  define FILE_MAP_PRIVATE KIT_FILE_MAP_PRIVATE
#  define FILE_MAP_SHARED KIT_FILE_MAP_SHARED

#  define PATH_DELIM_C KIT_PATH_DELIM_C
#  define PATH_DELIM KIT_PATH_DELIM
#  define ENV_HOME KIT_ENV_HOME

#  define PATH_NONE KIT_PATH_NONE
#  define PATH_FILE KIT_PATH_FILE
#  define PATH_FOLDER KIT_PATH_FOLDER
#endif

#endif