mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-01 04:10:07 +00:00
Merge branch 'packages' of https://github.com/odin-lang/Odin into packages
This commit is contained in:
@@ -150,8 +150,10 @@ TargetArchKind get_target_arch_from_string(String str) {
|
|||||||
return TargetArch_Invalid;
|
return TargetArch_Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool is_excluded_target_filename(String name) {
|
bool is_excluded_target_filename(String name) {
|
||||||
String const ext = str_lit(".odin");
|
String const ext = str_lit(".odin");
|
||||||
|
String original_name = name;
|
||||||
GB_ASSERT(string_ends_with(name, ext));
|
GB_ASSERT(string_ends_with(name, ext));
|
||||||
name = substring(name, 0, name.len-ext.len);
|
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);
|
str1 = substring(str1, n, str1.len);
|
||||||
|
|
||||||
str2 = str1;
|
str2 = substring(name, 0, gb_max(n-1, 0));
|
||||||
n = str2.len;
|
n = str2.len;
|
||||||
for (isize i = str2.len-1; i >= 0 && str2[i] != '_'; i--) {
|
for (isize i = str2.len-1; i >= 0 && str2[i] != '_'; i--) {
|
||||||
n -= 1;
|
n -= 1;
|
||||||
@@ -177,29 +179,25 @@ bool is_excluded_target_filename(String name) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TargetOsKind os1 = get_target_os_from_string(str1);
|
TargetOsKind os1 = get_target_os_from_string(str1);
|
||||||
TargetArchKind arch1 = get_target_arch_from_string(str1);
|
TargetArchKind arch1 = get_target_arch_from_string(str1);
|
||||||
TargetOsKind os2 = get_target_os_from_string(str2);
|
TargetOsKind os2 = get_target_os_from_string(str2);
|
||||||
TargetArchKind arch2 = get_target_arch_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;
|
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) {
|
} else if (os1 != TargetOs_Invalid) {
|
||||||
return os1 != build_context.metrics.os;
|
return os1 != build_context.metrics.os;
|
||||||
} else if (arch1 != TargetArch_Invalid) {
|
} else if (arch1 != TargetArch_Invalid) {
|
||||||
return arch1 != build_context.metrics.arch;
|
return arch1 != build_context.metrics.arch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct LibraryCollections {
|
struct LibraryCollections {
|
||||||
String name;
|
String name;
|
||||||
String path;
|
String path;
|
||||||
|
|||||||
@@ -822,7 +822,71 @@ ReadDirectoryError read_directory(String path, Array<FileInfo> *fi) {
|
|||||||
|
|
||||||
return ReadDirectory_None;
|
return ReadDirectory_None;
|
||||||
}
|
}
|
||||||
|
#elif defined(GB_SYSTEM_LINUX)
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
|
ReadDirectoryError read_directory(String path, Array<FileInfo> *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
|
#else
|
||||||
#error Implement read_directory
|
#error Implement read_directory
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user