diff --git a/core/os/stat_windows.odin b/core/os/stat_windows.odin index 48f193cdb..132cad155 100644 --- a/core/os/stat_windows.odin +++ b/core/os/stat_windows.odin @@ -5,12 +5,14 @@ import win32 "core:sys/windows" @(private) full_path_from_name :: proc(name: string, allocator := context.allocator) -> (path: string, err: Errno) { + context.allocator = allocator + name := name if name == "" { name = "." } p := win32.utf8_to_utf16(name, context.temp_allocator) - buf := make([dynamic]u16, 100, allocator) + buf := make([dynamic]u16, 100) defer delete(buf) for { n := win32.GetFullPathNameW(raw_data(p), u32(len(buf)), raw_data(buf), nil) diff --git a/core/path/filepath/path_windows.odin b/core/path/filepath/path_windows.odin index db8fb547c..25b2ae500 100644 --- a/core/path/filepath/path_windows.odin +++ b/core/path/filepath/path_windows.odin @@ -91,13 +91,15 @@ abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { join :: proc(elems: ..string, allocator := context.allocator) -> string { for e, i in elems { if e != "" { - return join_non_empty(elems[i:]) + return join_non_empty(elems[i:], allocator) } } return "" } -join_non_empty :: proc(elems: []string) -> string { +join_non_empty :: proc(elems: []string, allocator := context.allocator) -> string { + context.allocator = allocator + if len(elems[0]) == 2 && elems[0][1] == ':' { i := 1 for ; i < len(elems); i += 1 { @@ -110,8 +112,7 @@ join_non_empty :: proc(elems: []string) -> string { return clean(s) } - s := strings.join(elems, SEPARATOR_STRING, context.temp_allocator) - p := clean(s) + p := clean(strings.join(elems, SEPARATOR_STRING, context.temp_allocator)) if !is_UNC(p) { return p } diff --git a/core/strconv/strconv.odin b/core/strconv/strconv.odin index 7881f094a..3bd1769d4 100644 --- a/core/strconv/strconv.odin +++ b/core/strconv/strconv.odin @@ -680,10 +680,11 @@ unquote_string :: proc(lit: string, allocator := context.allocator) -> (res: str return s, false, true } } - + + context.allocator = allocator buf_len := 3*len(s) / 2 - buf := make([]byte, buf_len, allocator) + buf := make([]byte, buf_len) offset := 0 for len(s) > 0 { r, multiple_bytes, tail_string, ok := unquote_char(s, byte(quote)) diff --git a/core/sys/win32/comdlg32.odin b/core/sys/win32/comdlg32.odin index 4f74e8299..1e0d5c3ca 100644 --- a/core/sys/win32/comdlg32.odin +++ b/core/sys/win32/comdlg32.odin @@ -84,7 +84,11 @@ _open_file_dialog :: proc(title: string, dir: string, filters: []string, default_filter: u32, flags: u32, default_ext: string, mode: Open_Save_Mode, allocator := context.temp_allocator) -> (path: string, ok: bool = true) { - file_buf := make([]u16, MAX_PATH_WIDE, allocator) + context.allocator = allocator + file_buf := make([]u16, MAX_PATH_WIDE) + defer if !ok { + delete(file_buf) + } // Filters need to be passed as a pair of strings (title, filter) filter_len := u32(len(filters)) @@ -118,9 +122,9 @@ _open_file_dialog :: proc(title: string, dir: string, } if !ok { - delete(file_buf) - return "", false + return } + file_name := utf16_to_utf8(file_buf[:], allocator) path = strings.trim_right_null(file_name)