Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
189 changes: 116 additions & 73 deletions code/custom/4coder_base_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,128 +8,171 @@
#define FCODER_BASE_TYPES

////////////////////////////////

#if defined(_MSC_VER)

# define COMPILER_CL 1

# if defined(_WIN32)
# define OS_WINDOWS 1
# else
# error This compiler/platform combo is not supported yet
# error missing OS detection
# endif

# if defined(_M_AMD64)
# define ARCH_X64 1
# elif defined(_M_IX86)
# elif defined(_M_I86)
# define ARCH_X86 1
# elif defined(_M_ARM64)
# define ARCH_ARM64 1
# elif defined(_M_ARM)
# define ARCH_ARM32 1
# else
# error architecture not supported yet
# error missing ARCH detection
# endif

#elif defined(__clang__)

# define COMPILER_CLANG 1
#elif defined(__clang__) || defined(__GNUC__)
# if defined(__clang__)
# define COMPILER_CLANG 1
# elif defined(__GNUC__)
# define COMPILER_GCC 1
# endif

# if defined(__APPLE__) && defined(__MACH__)
# if defined(_WIN32)
# define OS_WINDOWS 1
# elif defined(__gnu_linux__) || defined(__linux__)
# define OS_LINUX 1
# elif defined(__APPLE__) && defined(__MACH__)
# define OS_MAC 1
# else
# error This compiler/platform combo is not supported yet
# error missing OS detection
# endif

# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)
# if defined(__amd64__)
# define ARCH_X64 1
# elif defined(i386) || defined(__i386) || defined(__i386__)
# elif defined(__i386__)
# define ARCH_X86 1
# elif defined(__aarch64__)
# define ARCH_ARM64 1
# elif defined(__arm__)
# define ARCH_ARM32 1
# else
# error architecture not supported yet
# endif

#elif defined(__GNUC__) || defined(__GNUG__)

# define COMPILER_GCC 1

# if defined(__gnu_linux__)
# define OS_LINUX 1
# else
# error This compiler/platform combo is not supported yet
# endif

# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)
# define ARCH_X64 1
# elif defined(i386) || defined(__i386) || defined(__i386__)
# define ARCH_X86 1
# elif defined(__aarch64__)
# define ARCH_ARM64 1
# elif defined(__arm__)
# define ARCH_ARM32 1
# else
# error architecture not supported yet
# error missing ARCH detection
# endif

#else
# error This compiler is not supported yet
# error no context cracking for this compiler
#endif

#if defined(ARCH_X64)
# define ARCH_64BIT 1
#elif defined(ARCH_X86)
# define ARCH_32BIT 1

#if !defined(COMPILER_CL)
# define COMPILER_CL 0
#endif

// zeroify

#if !defined(ARCH_32BIT)
#define ARCH_32BIT 0
#if !defined(COMPILER_CLANG)
# define COMPILER_CLANG 0
#endif
#if !defined(COMPILER_GCC)
# define COMPILER_GCC 0
#endif
#if !defined(OS_WINDOWS)
# define OS_WINDOWS 0
#endif
#if !defined(OS_LINUX)
# define OS_LINUX 0
#endif
#if !defined(ARCH_64BIT)
#define ARCH_64BIT 0
#if !defined(OS_MAC)
# define OS_MAC 0
#endif
#if !defined(ARCH_X64)
#define ARCH_X64 0
# define ARCH_X64 0
#endif
#if !defined(ARCH_X86)
#define ARCH_X86 0
# define ARCH_X86 0
#endif
#if !defined(ARCH_ARM32)
# define ARCH_ARM32 0
#endif
#if !defined(ARCH_ARM64)
#define ARCH_ARM64 0
# define ARCH_ARM64 0
#endif
#if !defined(ARCH_ARM32)
#define ARCH_ARM32 0

// language
#if defined(__cplusplus)
# define LANG_CXX 1
#else
# define LANG_C 1
#endif
#if !defined(COMPILER_CL)
#define COMPILER_CL 0

#if !defined(LANG_CXX)
# define LANG_CXX 0
#endif
#if !defined(COMPILER_GCC)
#define COMPILER_GCC 0
#if !defined(LANG_C)
# define LANG_C 0
#endif
#if !defined(COMPILER_CLANG)
#define COMPILER_CLANG 0

// language version: C
#if LANG_C
# if !defined(__STDC_VERSION__)
# define LANGVER_C90 1
# elif (__STDC_VERSION__ == 199901)
# define LANGVER_C99 1
# elif (__STDC_VERSION__ == 201112)
# define LANGVER_C11 1
# elif (__STDC_VERSION__ == 201710)
# define LANGVER_C17 1
# elif (__STDC_VERSION__ == 202000)
# define LANGVER_C23 1
# else
# error unrecorgnized C version
# endif
#endif
#if !defined(OS_WINDOWS)
#define OS_WINDOWS 0

#if !defined(LANGVER_C90)
# define LANGVER_C90 0
#endif
#if !defined(OS_LINUX)
#define OS_LINUX 0
#if !defined(LANGVER_C99)
# define LANGVER_C99 0
#endif
#if !defined(OS_MAC)
#define OS_MAC 0
#if !defined(LANGVER_C11)
# define LANGVER_C11 0
#endif
#if !defined(LANGVER_C17)
# define LANGVER_C17 0
#endif
#if !defined(LANGVER_C23)
# define LANGVER_C23 0
#endif

#if !defined(SHIP_MODE)
#define SHIP_MODE 0
#else
#undef SHIP_MODE
#define SHIP_MODE 1
// language version: C++
#if LANG_CXX
# if (__cplusplus == 199711)
# define LANGVER_CXX98 1
# elif (__cplusplus == 201103)
# define LANGVER_CXX11 1
# elif (__cplusplus == 201402)
# define LANGVER_CXX14 1
# elif (__cplusplus == 201703)
# define LANGVER_CXX17 1
# elif (__cplusplus == 202002)
# define LANGVER_CXX20 1
# elif (__cplusplus == 202302)
# define LANGVER_CXX23 1
# else
# error unrecorgnized C++ version
# endif
#endif

#if !defined(LANGVER_CXX98)
# define LANGVER_CXX98 0
#endif
#if !defined(LANGVER_CXX11)
# define LANGVER_CXX11 0
#endif
#if !defined(LANGVER_CXX14)
# define LANGVER_CXX14 0
#endif
#if !defined(LANGVER_CXX17)
# define LANGVER_CXX17 0
#endif
#if !defined(LANGVER_CXX20)
# define LANGVER_CXX20 0
#endif
#if !defined(LANGVER_CXX23)
# define LANGVER_CXX23 0
#endif

// names
Expand Down
71 changes: 21 additions & 50 deletions code/platform_linux/linux_4ed_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,67 +64,37 @@ system_get_path(Arena* arena, System_Path_Code path_code){

internal String_Const_u8
system_get_canonical(Arena* arena, String_Const_u8 name){
Assert(name.size < PATH_MAX - 1);
char tmp[PATH_MAX] = { 0 };
strncpy(tmp, (const char *)name.str, name.size);

char real[PATH_MAX] = { 0 };
realpath(tmp, real);

// first remove redundant ../, //, ./ parts

const u8* input = (u8*) strndupa((char*)name.str, name.size);
u8* output = push_array(arena, u8, name.size + 1);

const u8* p = input;
u8* q = output;

while(*p) {

// not a slash - copy char
if(p[0] != '/') {
*q++ = *p++;
continue;
}

// two slashes in a row, skip one.
if(p[1] == '/') {
++p;
}
else if(p[1] == '.') {

// skip "/./" or trailing "/."
if(p[2] == '/' || p[2] == '\0') {
p += 2;
}

// if we encounter "/../" or trailing "/..", remove last directory instead
else if(p[2] == '.' && (p[3] == '/' || p[3] == '\0')) {
while(q > output && *--q != '/'){};
p += 3;
}

else {
*q++ = *p++;
}
}
else {
*q++ = *p++;
}
}

String_Const_u8 result = push_string_copy(arena,
SCu8((u8*)real, cstring_length(real)));
#ifdef INSO_DEBUG
if(name.size != q - output) {
LINUX_FN_DEBUG("[%.*s] -> [%.*s]", (int)name.size, name.str, (int)(q - output), output);
if(name.size != result.size) {
LINUX_FN_DEBUG("[%.*s] -> [%.*s]",
(int)name.size, name.str,
(int)result.size, result.str);
}
#endif

// TODO: use realpath at this point to resolve symlinks?
return SCu8(output, q - output);
return result;
}

internal File_List
system_get_file_list(Arena* arena, String_Const_u8 directory){
Assert(directory.size < PATH_MAX - 1);
//LINUX_FN_DEBUG("%.*s", (int)directory.size, directory.str);
File_List result = {};

char* path = strndupa((char*)directory.str, directory.size);
char path[PATH_MAX] = { 0 };
strncpy(path, (const char *)directory.str, directory.size);

int fd = open(path, O_RDONLY | O_DIRECTORY);
if(fd == -1) {
LINUX_FN_DEBUG("Failed to open directory: %.*s", (int)directory.size, directory.str);
perror("open");
return result;
}
Expand Down Expand Up @@ -168,7 +138,7 @@ system_get_file_list(Arena* arena, String_Const_u8 directory){
*fip++ = f;
}

qsort(result.infos, result.count, sizeof(File_Info*), (__compar_fn_t)&linux_compare_file_infos);
qsort(result.infos, result.count, sizeof(File_Info*), (int(*)(const void*, const void*))&linux_compare_file_infos);

for(u32 i = 0; i < result.count - 1; ++i) {
result.infos[i]->next = result.infos[i+1];
Expand Down Expand Up @@ -252,6 +222,7 @@ system_save_file(Arena* scratch, char* file_name, String_Const_u8 data){
}
close(fd);
} else {
LINUX_FN_DEBUG("Failed to open file: %s", file_name);
perror("open");
}

Expand Down Expand Up @@ -334,7 +305,7 @@ function
system_universal_date_time_from_local_sig(){
struct tm local_tm = {};
linux_tm_from_date_time(&local_tm, date_time);
time_t loc_time = timelocal(&local_tm);
time_t loc_time = mktime(&local_tm);
struct tm *utc_tm = gmtime(&loc_time);
Date_Time result = {};
linux_date_time_from_tm(&result, utc_tm);
Expand Down