//\r
\r
void os_get_timedate(Arena* a);\r
-\r
+bool os_file_exists(cstr filename);\r
//\r
// Winapi\r
//\r
bool output_strn(cstr text, size_t text_len);\r
cstr winapi_get_last_error_str(void);\r
cstr winapi_get_current_working_directory(Arena* arena);\r
-#endif\r
+#endif // _WIN32\r
+#ifdef linux\r
+#include <sys/stat.h>\r
+#endif // linux\r
//\r
// logging\r
//\r
//\r
\r
// reads entire file and gives back the string holding the contents. (caller must be responsible for freeing the string!)\r
-const char* slurp_file(const char* filename);\r
+const char* slurp_file(const char* filename, bool* success);\r
+void touch_file_if_doesnt_exist(cstr file);\r
\r
//\r
// ### Allocators ###\r
void os_get_timedate(Arena* a) {\r
(void)a;\r
}\r
+\r
+bool os_file_exists(cstr filename) {\r
+ (void) filename;\r
+ return false;\r
+}\r
+\r
#endif // _WIN32\r
#ifdef linux\r
void os_get_timedate(Arena* a) {\r
(void)a;\r
}\r
-#endif // linux\r
\r
+bool os_file_exists(cstr filename) {\r
+ struct stat buf;\r
+ return stat(filename, &buf) == 0;\r
+}\r
+\r
+#endif // linux\r
\r
#ifdef _WIN32\r
// Winapi\r
case C_LOG_INFO: fprintf(file, "INFO: "); break;\r
case C_LOG_ERROR: fprintf(file, "ERROR: "); break;\r
case C_LOG_WARNING: fprintf(file, "WARNING: "); break;\r
+ case C_LOG_COUNT:\r
default: ASSERT(0 && "Unreachable");\r
}\r
\r
while (*fmt != '\0'){\r
-char_jmp:\r
if (*fmt == '%'){\r
fmt++;\r
-/* fmt_jmp: */\r
switch (*fmt){\r
case 's': {\r
- const char* str = va_arg(args, const char*);\r
- fprintf(file, "%s", str);\r
+ const char* str = va_arg(args, const char*);\r
+ fprintf(file, "%s", str);\r
} break;\r
case 'i':\r
case 'd': {\r
int i = va_arg(args, int);\r
- fprintf(file, "%d", i);\r
+ fprintf(file, "%d", i);\r
} break;\r
case 'o': {\r
- int i = va_arg(args, int);\r
- fprintf(file, "%o", i);\r
+ int i = va_arg(args, int);\r
+ fprintf(file, "%o", i);\r
} break;\r
case 'u': {\r
- unsigned int i = va_arg(args, unsigned int);\r
- fprintf(file, "%u", i);\r
+ unsigned int i = va_arg(args, unsigned int);\r
+ fprintf(file, "%u", i);\r
} break;\r
case 'f':\r
case 'F': {\r
- double i = va_arg(args, double);\r
- fprintf(file, "%f", i);\r
+ double i = va_arg(args, double);\r
+ fprintf(file, "%f", i);\r
} break;\r
case 'p': {\r
void* i = va_arg(args, void*);\r
- fprintf(file, "%p", i);\r
+ fprintf(file, "%p", i);\r
} break;\r
case '%': {\r
- fprintf(file, "%%");\r
+ fprintf(file, "%%");\r
} break;\r
- case 'c': {\r
+ case 'c':{\r
int i = va_arg(args, int);\r
- fprintf(file, "%c", i);\r
- } break;\r
- case '.': {\r
- fmt++;\r
- if (fmt[0] == '*' &&\r
- fmt[1] == 's') {\r
- fmt += 1;\r
- int count = va_arg(args, int);\r
- char* str = va_arg(args, char*);\r
- while (count-- > 0) {\r
- fputc(*str++, file);\r
- }\r
- } else {\r
- fputc('%', file);\r
- fputc('.', file);\r
- goto char_jmp;\r
- }\r
- } break;\r
- default: {\r
- fputc(*fmt, file);\r
+ fprintf(file, "%c", i);\r
} break;\r
}\r
} else {\r
fputc(*fmt, file);\r
}\r
- if (*fmt == '\0') { break; };\r
fmt++;\r
}\r
\r
result = ret_val;\\r
goto defer\r
\r
-const char* slurp_file(const char* filename) {\r
+const char* slurp_file(const char* filename, bool* success) {\r
FILE* f = fopen(filename, "rb");\r
char* result = NULL;\r
\r
\r
defer:\r
if (f) fclose(f);\r
+ *success = result != NULL;\r
return result;\r
}\r
\r
+void touch_file_if_doesnt_exist(cstr filename) {\r
+ if (os_file_exists(filename)) return;\r
+ FILE* file = fopen(filename, "w");\r
+ if (file)\r
+ fclose(file);\r
+}\r
\r
//\r
// ### Allocators ###\r