diff --git a/src/base/base_strings.c b/src/base/base_strings.c index da8a85f6..aa65537d 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -3076,43 +3076,38 @@ str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) //////////////////////////////// -internal int +force_inline int str8_compar(String8 a, String8 b, B32 ignore_case) { - int cmp = 0; U64 size = Min(a.size, b.size); - if (ignore_case) - { - cmp = MemCompareI(a.str, b.str, size); - } - else - { - cmp = MemCompare(a.str, b.str, size); - cmp = cmp > 0 ? 1 : cmp < 0 ? -1 : 0; - } - + int cmp = ignore_case ? MemCompareI(a.str, b.str, size) : MemCompare(a.str, b.str, size); + + // normalize compar result + cmp = cmp > 0 ? 1 : cmp < 0 ? -1 : 0; + // shorter prefix must precede longer prefixes if (cmp == 0) { - cmp = (a.size > b.size) - (b.size - a.size); + cmp = a.size < b.size ? -1 : + a.size > b.size ? +1 : 0; } return cmp; } -internal int +force_inline int str8_compar_ignore_case(const void *a, const void *b) { return str8_compar(*(String8*)a, *(String8*)b, 1); } -internal int +force_inline int str8_compar_case_sensitive(const void *a, const void *b) { return str8_compar(*(String8*)a, *(String8*)b, 0); } -internal int +force_inline int str8_is_before_case_sensitive(const void *a, const void *b) { int cmp = str8_compar_case_sensitive(a, b); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 0c6e5809..be696012 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1845,7 +1845,7 @@ gsi_symbol_is_before(void *raw_a, void *raw_b) return is_before; } -internal int +force_inline int gsi_pub_symbol_is_before(void *raw_a, void *raw_b) { CV_Symbol *a = *(CV_Symbol **)raw_a; @@ -1870,7 +1870,6 @@ gsi_pub_symbol_is_before(void *raw_a, void *raw_b) } } } - is_before = cmp < 0; } @@ -1888,10 +1887,8 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) CV_SymbolList bucket = task->bucket_arr[bucket_idx]; CV_Symbol **symbol_arr = push_array(scratch.arena, CV_Symbol *, bucket.count); - { - U64 i = 0; - for EachNode(n, CV_SymbolNode, bucket.first) { symbol_arr[i++] = &n->data; } - } + U64 symbol_arr_count = 0; + for EachNode(n, CV_SymbolNode, bucket.first) { symbol_arr[symbol_arr_count++] = &n->data; } // sort symbols within bucket radsort(symbol_arr, bucket.count, gsi_pub_symbol_is_before); @@ -1906,10 +1903,10 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) for EachIndex(i, bucket.count) { Assert(symbol_arr[i]->kind == CV_SymKind_PUB32); - CV_SymPub32 *pub32 = (CV_SymPub32 *)symbol_arr[i]->data.str; - U8 *str_ptr = (U8 *)(pub32 + 1); - U64 str_size = symbol_arr[i]->data.size - sizeof(*pub32); - String8 name = str8(str_ptr, str_size); + CV_SymPub32 *pub32 = (CV_SymPub32 *)symbol_arr[i]->data.str; + U8 *str_ptr = (U8 *)(pub32 + 1); + U64 str_cap = symbol_arr[i]->data.size - sizeof(*pub32); + String8 name = str8_cstring_capped(str_ptr, str_ptr + str_cap); // init sort record PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx];