changed string conversion routines to return null on null input

In os_process_launch on windows, linker relies on directory string conversion
to return null so CreateProcessW can set work directory itself.
This commit is contained in:
Nikita Smith
2024-11-18 15:38:00 -08:00
parent 33c4c7c883
commit 938be0aa84
+79 -51
View File
@@ -1504,70 +1504,98 @@ utf8_from_utf32_single(U8 *buffer, U32 character){
//~ rjf: Unicode String Conversions //~ rjf: Unicode String Conversions
internal String8 internal String8
str8_from_16(Arena *arena, String16 in){ str8_from_16(Arena *arena, String16 in)
U64 cap = in.size*3; {
U8 *str = push_array_no_zero(arena, U8, cap + 1); String8 result = str8_zero();
U16 *ptr = in.str; if(in.size)
U16 *opl = ptr + in.size; {
U64 size = 0; U64 cap = in.size*3;
UnicodeDecode consume; U8 *str = push_array_no_zero(arena, U8, cap + 1);
for (;ptr < opl; ptr += consume.inc){ U16 *ptr = in.str;
consume = utf16_decode(ptr, opl - ptr); U16 *opl = ptr + in.size;
size += utf8_encode(str + size, consume.codepoint); U64 size = 0;
UnicodeDecode consume;
for(;ptr < opl; ptr += consume.inc)
{
consume = utf16_decode(ptr, opl - ptr);
size += utf8_encode(str + size, consume.codepoint);
}
str[size] = 0;
arena_pop(arena, (cap - size));
result = str8(str, size);
} }
str[size] = 0; return result;
arena_pop(arena, (cap - size));
return(str8(str, size));
} }
internal String16 internal String16
str16_from_8(Arena *arena, String8 in){ str16_from_8(Arena *arena, String8 in)
U64 cap = in.size*2; {
U16 *str = push_array_no_zero(arena, U16, cap + 1); String16 result = str16_zero();
U8 *ptr = in.str; if(in.size)
U8 *opl = ptr + in.size; {
U64 size = 0; U64 cap = in.size*2;
UnicodeDecode consume; U16 *str = push_array_no_zero(arena, U16, cap + 1);
for (;ptr < opl; ptr += consume.inc){ U8 *ptr = in.str;
consume = utf8_decode(ptr, opl - ptr); U8 *opl = ptr + in.size;
size += utf16_encode(str + size, consume.codepoint); U64 size = 0;
UnicodeDecode consume;
for(;ptr < opl; ptr += consume.inc)
{
consume = utf8_decode(ptr, opl - ptr);
size += utf16_encode(str + size, consume.codepoint);
}
str[size] = 0;
arena_pop(arena, (cap - size)*2);
result = str16(str, size);
} }
str[size] = 0; return result;
arena_pop(arena, (cap - size)*2);
return(str16(str, size));
} }
internal String8 internal String8
str8_from_32(Arena *arena, String32 in){ str8_from_32(Arena *arena, String32 in)
U64 cap = in.size*4; {
U8 *str = push_array_no_zero(arena, U8, cap + 1); String8 result = str8_zero();
U32 *ptr = in.str; if(in.size)
U32 *opl = ptr + in.size; {
U64 size = 0; U64 cap = in.size*4;
for (;ptr < opl; ptr += 1){ U8 *str = push_array_no_zero(arena, U8, cap + 1);
size += utf8_encode(str + size, *ptr); U32 *ptr = in.str;
U32 *opl = ptr + in.size;
U64 size = 0;
for(;ptr < opl; ptr += 1)
{
size += utf8_encode(str + size, *ptr);
}
str[size] = 0;
arena_pop(arena, (cap - size));
result = str8(str, size);
} }
str[size] = 0; return result;
arena_pop(arena, (cap - size));
return(str8(str, size));
} }
internal String32 internal String32
str32_from_8(Arena *arena, String8 in){ str32_from_8(Arena *arena, String8 in)
U64 cap = in.size; {
U32 *str = push_array_no_zero(arena, U32, cap + 1); String32 result = str32_zero();
U8 *ptr = in.str; if(in.size)
U8 *opl = ptr + in.size; {
U64 size = 0; U64 cap = in.size;
UnicodeDecode consume; U32 *str = push_array_no_zero(arena, U32, cap + 1);
for (;ptr < opl; ptr += consume.inc){ U8 *ptr = in.str;
consume = utf8_decode(ptr, opl - ptr); U8 *opl = ptr + in.size;
str[size] = consume.codepoint; U64 size = 0;
size += 1; UnicodeDecode consume;
for(;ptr < opl; ptr += consume.inc)
{
consume = utf8_decode(ptr, opl - ptr);
str[size] = consume.codepoint;
size += 1;
}
str[size] = 0;
arena_pop(arena, (cap - size)*4);
result = str32(str, size);
} }
str[size] = 0; return result;
arena_pop(arena, (cap - size)*4);
return(str32(str, size));
} }
//////////////////////////////// ////////////////////////////////