1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <errno.h> 5 6 #ifdef _WIN32 7 # define MINIRENT_IMPLEMENTATION 8 # include <minirent.h> 9 #else 10 # include <dirent.h> 11 # include <sys/types.h> 12 # include <sys/stat.h> 13 # include <unistd.h> 14 #endif // _WIN32 15 16 #include "common.h" 17 #define ARENA_IMPLEMENTATION 18 #include "./arena.h" 19 #define SV_IMPLEMENTATION 20 #include "sv.h" 21 22 static Arena temporary_arena = {0}; 23 24 char *temp_strdup(const char *s) 25 { 26 size_t n = strlen(s); 27 char *ds = arena_alloc(&temporary_arena, n + 1); 28 memcpy(ds, s, n); 29 ds[n] = '\0'; 30 return ds; 31 } 32 33 void temp_reset(void) 34 { 35 arena_reset(&temporary_arena); 36 } 37 38 Errno read_entire_dir(const char *dir_path, Files *files) 39 { 40 Errno result = 0; 41 DIR *dir = NULL; 42 43 dir = opendir(dir_path); 44 if (dir == NULL) { 45 return_defer(errno); 46 } 47 48 errno = 0; 49 struct dirent *ent = readdir(dir); 50 while (ent != NULL) { 51 da_append(files, temp_strdup(ent->d_name)); 52 ent = readdir(dir); 53 } 54 55 if (errno != 0) { 56 return_defer(errno); 57 } 58 59 defer: 60 if (dir) closedir(dir); 61 return result; 62 } 63 64 Errno write_entire_file(const char *file_path, const char *buf, size_t buf_size) 65 { 66 Errno result = 0; 67 FILE *f = NULL; 68 69 f = fopen(file_path, "wb"); 70 if (f == NULL) return_defer(errno); 71 72 fwrite(buf, 1, buf_size, f); 73 if (ferror(f)) return_defer(errno); 74 75 defer: 76 if (f) fclose(f); 77 return result; 78 } 79 80 static Errno file_size(FILE *file, size_t *size) 81 { 82 long saved = ftell(file); 83 if (saved < 0) return errno; 84 if (fseek(file, 0, SEEK_END) < 0) return errno; 85 long result = ftell(file); 86 if (result < 0) return errno; 87 if (fseek(file, saved, SEEK_SET) < 0) return errno; 88 *size = (size_t) result; 89 return 0; 90 } 91 92 Errno read_entire_file(const char *file_path, String_Builder *sb) 93 { 94 Errno result = 0; 95 FILE *f = NULL; 96 97 f = fopen(file_path, "r"); 98 if (f == NULL) return_defer(errno); 99 100 size_t size; 101 Errno err = file_size(f, &size); 102 if (err != 0) return_defer(err); 103 104 if (sb->capacity < size) { 105 sb->capacity = size; 106 sb->items = realloc(sb->items, sb->capacity*sizeof(*sb->items)); 107 assert(sb->items != NULL && "Buy more RAM lol"); 108 } 109 110 fread(sb->items, size, 1, f); 111 if (ferror(f)) return_defer(errno); 112 sb->count = size; 113 114 defer: 115 if (f) fclose(f); 116 return result; 117 } 118 119 Vec4f hex_to_vec4f(uint32_t color) 120 { 121 Vec4f result; 122 uint32_t r = (color>>(3*8))&0xFF; 123 uint32_t g = (color>>(2*8))&0xFF; 124 uint32_t b = (color>>(1*8))&0xFF; 125 uint32_t a = (color>>(0*8))&0xFF; 126 result.x = r/255.0f; 127 result.y = g/255.0f; 128 result.z = b/255.0f; 129 result.w = a/255.0f; 130 return result; 131 } 132 133 Errno type_of_file(const char *file_path, File_Type *ft) 134 { 135 #ifdef _WIN32 136 #error "TODO: type_of_file() is not implemented for Windows" 137 #else 138 struct stat sb = {0}; 139 if (stat(file_path, &sb) < 0) return errno; 140 if (S_ISREG(sb.st_mode)) { 141 *ft = FT_REGULAR; 142 } else if (S_ISDIR(sb.st_mode)) { 143 *ft = FT_DIRECTORY; 144 } else { 145 *ft = FT_OTHER; 146 } 147 #endif 148 return 0; 149 }
