ded

Dramatic EDitor
Index Commits Files Refs README LICENSE
src/common.c (3147B)
   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 }