diff options
| author | gingerBill <bill@gingerbill.org> | 2025-04-09 13:23:21 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2025-04-09 13:23:21 +0100 |
| commit | 377e4e11edbcddc22bb2ea697aa9de649f7542e2 (patch) | |
| tree | b5c805abf02645a66f57adab8806a9178c990700 /src | |
| parent | a66ea9bf4a0b6435614a6fe5a3386dfbb47c85ce (diff) | |
| parent | d401a089c8a127a2e9404974fdca254144aa0977 (diff) | |
Merge branch 'master' of https://github.com/odin-lang/Odin
Diffstat (limited to 'src')
| -rw-r--r-- | src/gb/gb.h | 26 | ||||
| -rw-r--r-- | src/linker.cpp | 14 |
2 files changed, 28 insertions, 12 deletions
diff --git a/src/gb/gb.h b/src/gb/gb.h index 98c362e93..a1b659637 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -5838,18 +5838,25 @@ gb_inline isize gb_printf_err_va(char const *fmt, va_list va) { gb_inline isize gb_fprintf_va(struct gbFile *f, char const *fmt, va_list va) { char buf[4096]; - isize len = gb_snprintf_va(buf, gb_size_of(buf), fmt, va); + va_list va_save; + va_copy(va_save, va); + isize len = gb_snprintf_va(buf, gb_size_of(buf), fmt, va_save); + va_end(va_save); char *new_buf = NULL; isize n = gb_size_of(buf); while (len < 0) { + va_copy(va_save, va); + defer (va_end(va_save)); n <<= 1; gb_free(gb_heap_allocator(), new_buf); new_buf = gb_alloc_array(gb_heap_allocator(), char, n);; - len = gb_snprintf_va(new_buf, n, fmt, va); + len = gb_snprintf_va(new_buf, n, fmt, va_save); } - gb_file_write(f, buf, len-1); // NOTE(bill): prevent extra whitespace if (new_buf != NULL) { + gb_file_write(f, new_buf, len-1); // NOTE(bill): prevent extra whitespace gb_free(gb_heap_allocator(), new_buf); + } else { + gb_file_write(f, buf, len-1); // NOTE(bill): prevent extra whitespace } return len; } @@ -5912,7 +5919,7 @@ gb_internal isize gb__print_string(char *text, isize max_len, gbprivFmtInfo *inf len = info->precision < len ? info->precision : len; } - res += gb_strlcpy(text, str, len); + res += gb_strlcpy(text, str, gb_min(len, remaining)); if (info->width > res) { isize padding = info->width - len; @@ -5930,7 +5937,7 @@ gb_internal isize gb__print_string(char *text, isize max_len, gbprivFmtInfo *inf } } - res += gb_strlcpy(text, str, len); + res += gb_strlcpy(text, str, gb_min(len, remaining)); } @@ -6066,15 +6073,16 @@ gb_internal isize gb__print_f64(char *text, isize max_len, gbprivFmtInfo *info, gb_no_inline isize gb_snprintf_va(char *text, isize max_len, char const *fmt, va_list va) { char const *text_begin = text; - isize remaining = max_len, res; + isize remaining = max_len - 1, res; - while (*fmt) { + while (*fmt && remaining > 0) { gbprivFmtInfo info = {0}; isize len = 0; info.precision = -1; - while (*fmt && *fmt != '%' && remaining) { + while (remaining > 0 && *fmt && *fmt != '%') { *text++ = *fmt++; + remaining--; } if (*fmt == '%') { @@ -6240,7 +6248,7 @@ gb_no_inline isize gb_snprintf_va(char *text, isize max_len, char const *fmt, va text += len; if (len >= remaining) { - remaining = gb_min(remaining, 1); + remaining = 0; } else { remaining -= len; } diff --git a/src/linker.cpp b/src/linker.cpp index 3ed924ac3..c87727974 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -643,9 +643,10 @@ try_cross_linking:; android_glue_object = concatenate4_strings(temporary_allocator(), temp_dir, str_lit("android_native_app_glue-"), hash, str_lit(".o")); android_glue_static_lib = concatenate4_strings(permanent_allocator(), temp_dir, str_lit("libandroid_native_app_glue-"), hash, str_lit(".a")); - gbString glue = gb_string_make(heap_allocator(), clang_path); + gbString glue = gb_string_make_length(heap_allocator(), ODIN_ANDROID_NDK_TOOLCHAIN.text, ODIN_ANDROID_NDK_TOOLCHAIN.len); defer (gb_string_free(glue)); + glue = gb_string_append_fmt(glue, "bin/clang"); glue = gb_string_append_fmt(glue, " --target=aarch64-linux-android%d ", ODIN_ANDROID_API_LEVEL); glue = gb_string_appendc(glue, "-c \""); glue = gb_string_append_length(glue, ODIN_ANDROID_NDK.text, ODIN_ANDROID_NDK.len); @@ -808,6 +809,9 @@ try_cross_linking:; platform_lib_str = gb_string_append_length(platform_lib_str, ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL.text, ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL.len); platform_lib_str = gb_string_appendc(platform_lib_str, "\" "); + platform_lib_str = gb_string_appendc(platform_lib_str, "-landroid "); + platform_lib_str = gb_string_appendc(platform_lib_str, "-llog "); + platform_lib_str = gb_string_appendc(platform_lib_str, "\"--sysroot="); platform_lib_str = gb_string_append_length(platform_lib_str, ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT.text, ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT.len); platform_lib_str = gb_string_appendc(platform_lib_str, "\" "); @@ -840,12 +844,16 @@ try_cross_linking:; } } - gbString link_command_line = gb_string_make(heap_allocator(), clang_path); + gbString link_command_line = gb_string_make(heap_allocator(), ""); defer (gb_string_free(link_command_line)); if (is_android) { + gbString ndk_bin_directory = gb_string_make_length(temporary_allocator(), ODIN_ANDROID_NDK_TOOLCHAIN.text, ODIN_ANDROID_NDK_TOOLCHAIN.len); + link_command_line = gb_string_appendc(link_command_line, ndk_bin_directory); + link_command_line = gb_string_appendc(link_command_line, "bin/clang"); link_command_line = gb_string_append_fmt(link_command_line, " --target=aarch64-linux-android%d ", ODIN_ANDROID_API_LEVEL); - link_command_line = gb_string_appendc(link_command_line, " -nodefaultlibs"); + } else { + link_command_line = gb_string_appendc(link_command_line, clang_path); } link_command_line = gb_string_appendc(link_command_line, " -Wno-unused-command-line-argument "); link_command_line = gb_string_appendc(link_command_line, object_files); |