From 4742690dec0bef8a720131397ad44c919878d3b5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 21 Jun 2018 08:39:07 +0100 Subject: [PATCH 1/2] Fix `is_excluded_target_filename` --- src/build_settings.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 5b3d846cb..ee4466698 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -150,8 +150,10 @@ TargetArchKind get_target_arch_from_string(String str) { return TargetArch_Invalid; } + bool is_excluded_target_filename(String name) { String const ext = str_lit(".odin"); + String original_name = name; GB_ASSERT(string_ends_with(name, ext)); name = substring(name, 0, name.len-ext.len); @@ -166,7 +168,7 @@ bool is_excluded_target_filename(String name) { } str1 = substring(str1, n, str1.len); - str2 = str1; + str2 = substring(name, 0, gb_max(n-1, 0)); n = str2.len; for (isize i = str2.len-1; i >= 0 && str2[i] != '_'; i--) { n -= 1; @@ -177,29 +179,25 @@ bool is_excluded_target_filename(String name) { return false; } - - TargetOsKind os1 = get_target_os_from_string(str1); TargetArchKind arch1 = get_target_arch_from_string(str1); TargetOsKind os2 = get_target_os_from_string(str2); TargetArchKind arch2 = get_target_arch_from_string(str2); - if (arch1 != TargetArch_Invalid && os2 != TargetOs_Invalid) { + if (os1 != TargetOs_Invalid && arch2 != TargetArch_Invalid) { + return os1 != build_context.metrics.os || arch2 != build_context.metrics.arch; + } else if (arch1 != TargetArch_Invalid && os2 != TargetOs_Invalid) { return arch1 != build_context.metrics.arch || os2 != build_context.metrics.os; - } else if (arch1 != TargetArch_Invalid && os1 != TargetOs_Invalid) { - return arch2 != build_context.metrics.arch || os1 != build_context.metrics.os; } else if (os1 != TargetOs_Invalid) { return os1 != build_context.metrics.os; } else if (arch1 != TargetArch_Invalid) { return arch1 != build_context.metrics.arch; } - return false; } - struct LibraryCollections { String name; String path; From cdf873542b60c7e67d388117f96df87e72140651 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 21 Jun 2018 08:39:52 +0100 Subject: [PATCH 2/2] Add read_directory for linux --- src/common.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/common.cpp b/src/common.cpp index 12c3457ac..ec6ec7798 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -822,7 +822,71 @@ ReadDirectoryError read_directory(String path, Array *fi) { return ReadDirectory_None; } +#elif defined(GB_SYSTEM_LINUX) +#include + +ReadDirectoryError read_directory(String path, Array *fi) { + GB_ASSERT(fi != nullptr); + + gbAllocator a = heap_allocator(); + + char *c_path = alloc_cstring(a, path); + defer (gb_free(a, c_path)); + + DIR *dir = opendir(c_path); + if (!dir) { + return ReadDirectory_NotDir; + } + + array_init(fi, a, 0, 100); + + for (;;) { + struct dirent *entry = readdir(dir); + if (entry == nullptr) { + break; + } + + String name = make_string_c(entry->d_name); + if (name == "." || name == "..") { + continue; + } + + String filepath = {}; + filepath.len = path.len+1+name.len; + filepath.text = gb_alloc_array(a, u8, filepath.len+1); + defer (gb_free(a, filepath.text)); + gb_memmove(filepath.text, path.text, path.len); + gb_memmove(filepath.text+path.len, "/", 1); + gb_memmove(filepath.text+path.len+1, name.text, name.len); + filepath.text[filepath.len] = 0; + + + struct stat dir_stat = {}; + + if (stat((char *)filepath.text, &dir_stat)) { + continue; + } + + if (S_ISDIR(dir_stat.st_mode)) { + continue; + } + + i64 size = dir_stat.st_size; + + FileInfo info = {}; + info.name = name; + info.fullpath = path_to_full_path(a, filepath); + info.size = size; + array_add(fi, info); + } + + if (fi->count == 0) { + return ReadDirectory_Empty; + } + + return ReadDirectory_None; +} #else #error Implement read_directory #endif