Add os_file_exists() and touch_file_if_doesnt_exist()
authorahmedsamyh <ahmedsamyh10@gmail.com>
Wed, 25 Sep 2024 13:30:25 +0000 (18:30 +0500)
committerahmedsamyh <ahmedsamyh10@gmail.com>
Wed, 25 Sep 2024 13:30:25 +0000 (18:30 +0500)
- @TODO: Also tweaked the log_print() function. Don't remember what tho.

commonlib.h

index 5b34ac3f287a089abf2a90bcb364e5e5a6608cda..d4a316d4041051e8d091f804c7176b0fa673f0d1 100644 (file)
@@ -1005,7 +1005,7 @@ void panic_assertion(cstr msg, FILE* file, cstr filename, int line);
 //\r
 \r
 void os_get_timedate(Arena* a);\r
-\r
+bool os_file_exists(cstr filename);\r
 //\r
 // Winapi\r
 //\r
@@ -1019,7 +1019,10 @@ bool output_str(cstr text);
 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
@@ -1044,7 +1047,8 @@ void log_file(Log_type type, FILE* file, cstr fmt, ...);
 //\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
@@ -4010,13 +4014,24 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 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
@@ -4167,72 +4182,51 @@ void log_file(Log_type type, FILE* file, cstr fmt, ...) {
   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
@@ -4248,7 +4242,7 @@ char_jmp:
   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
@@ -4291,9 +4285,16 @@ const char* slurp_file(const char* filename) {
 \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