| ... | ... | @@ -5,6 +5,7 @@ const assert = debug.assert; |
| 5 | 5 | const testing = std.testing; |
| 6 | 6 | const mem = std.mem; |
| 7 | 7 | const fmt = std.fmt; |
| 8 | const ascii = std.ascii; |
| 8 | 9 | const Allocator = mem.Allocator; |
| 9 | 10 | const math = std.math; |
| 10 | 11 | const windows = std.os.windows; |
| ... | ... | @@ -423,7 +424,7 @@ fn networkShareServersEql(ns1: []const u8, ns2: []const u8) bool { |
| 423 | 424 | var it2 = mem.tokenize(u8, ns2, &[_]u8{sep2}); |
| 424 | 425 | |
| 425 | 426 | // TODO ASCII is wrong, we actually need full unicode support to compare paths. |
| 426 | | return asciiEqlIgnoreCase(it1.next().?, it2.next().?); |
| 427 | return ascii.eqlIgnoreCase(it1.next().?, it2.next().?); |
| 427 | 428 | } |
| 428 | 429 | |
| 429 | 430 | fn compareDiskDesignators(kind: WindowsPath.Kind, p1: []const u8, p2: []const u8) bool { |
| ... | ... | @@ -434,7 +435,7 @@ fn compareDiskDesignators(kind: WindowsPath.Kind, p1: []const u8, p2: []const u8 |
| 434 | 435 | return true; |
| 435 | 436 | }, |
| 436 | 437 | WindowsPath.Kind.Drive => { |
| 437 | | return asciiUpper(p1[0]) == asciiUpper(p2[0]); |
| 438 | return ascii.toUpper(p1[0]) == ascii.toUpper(p2[0]); |
| 438 | 439 | }, |
| 439 | 440 | WindowsPath.Kind.NetworkShare => { |
| 440 | 441 | const sep1 = p1[0]; |
| ... | ... | @@ -444,29 +445,11 @@ fn compareDiskDesignators(kind: WindowsPath.Kind, p1: []const u8, p2: []const u8 |
| 444 | 445 | var it2 = mem.tokenize(u8, p2, &[_]u8{sep2}); |
| 445 | 446 | |
| 446 | 447 | // TODO ASCII is wrong, we actually need full unicode support to compare paths. |
| 447 | | return asciiEqlIgnoreCase(it1.next().?, it2.next().?) and asciiEqlIgnoreCase(it1.next().?, it2.next().?); |
| 448 | return ascii.eqlIgnoreCase(it1.next().?, it2.next().?) and ascii.eqlIgnoreCase(it1.next().?, it2.next().?); |
| 448 | 449 | }, |
| 449 | 450 | } |
| 450 | 451 | } |
| 451 | 452 | |
| 452 | | fn asciiUpper(byte: u8) u8 { |
| 453 | | return switch (byte) { |
| 454 | | 'a'...'z' => 'A' + (byte - 'a'), |
| 455 | | else => byte, |
| 456 | | }; |
| 457 | | } |
| 458 | | |
| 459 | | fn asciiEqlIgnoreCase(s1: []const u8, s2: []const u8) bool { |
| 460 | | if (s1.len != s2.len) |
| 461 | | return false; |
| 462 | | var i: usize = 0; |
| 463 | | while (i < s1.len) : (i += 1) { |
| 464 | | if (asciiUpper(s1[i]) != asciiUpper(s2[i])) |
| 465 | | return false; |
| 466 | | } |
| 467 | | return true; |
| 468 | | } |
| 469 | | |
| 470 | 453 | /// On Windows, this calls `resolveWindows` and on POSIX it calls `resolvePosix`. |
| 471 | 454 | pub fn resolve(allocator: Allocator, paths: []const []const u8) ![]u8 { |
| 472 | 455 | if (native_os == .windows) { |
| ... | ... | @@ -506,7 +489,7 @@ pub fn resolveWindows(allocator: Allocator, paths: []const []const u8) ![]u8 { |
| 506 | 489 | } |
| 507 | 490 | switch (parsed.kind) { |
| 508 | 491 | WindowsPath.Kind.Drive => { |
| 509 | | result_drive_buf[0] = asciiUpper(parsed.disk_designator[0]); |
| 492 | result_drive_buf[0] = ascii.toUpper(parsed.disk_designator[0]); |
| 510 | 493 | result_disk_designator = result_drive_buf[0..]; |
| 511 | 494 | have_drive_kind = WindowsPath.Kind.Drive; |
| 512 | 495 | }, |
| ... | ... | @@ -590,7 +573,7 @@ pub fn resolveWindows(allocator: Allocator, paths: []const []const u8) ![]u8 { |
| 590 | 573 | result_index += parsed_cwd.disk_designator.len; |
| 591 | 574 | result_disk_designator = result[0..parsed_cwd.disk_designator.len]; |
| 592 | 575 | if (parsed_cwd.kind == WindowsPath.Kind.Drive) { |
| 593 | | result[0] = asciiUpper(result[0]); |
| 576 | result[0] = ascii.toUpper(result[0]); |
| 594 | 577 | } |
| 595 | 578 | have_drive_kind = parsed_cwd.kind; |
| 596 | 579 | }, |
| ... | ... | @@ -608,7 +591,7 @@ pub fn resolveWindows(allocator: Allocator, paths: []const []const u8) ![]u8 { |
| 608 | 591 | const parsed_cwd = windowsParsePath(result[0..result_index]); |
| 609 | 592 | result_disk_designator = parsed_cwd.disk_designator; |
| 610 | 593 | if (parsed_cwd.kind == WindowsPath.Kind.Drive) { |
| 611 | | result[0] = asciiUpper(result[0]); |
| 594 | result[0] = ascii.toUpper(result[0]); |
| 612 | 595 | // Remove the trailing slash if present, eg. if the cwd is a root |
| 613 | 596 | // directory. |
| 614 | 597 | if (cwd.len > 0 and cwd[cwd.len - 1] == sep_windows) { |
| ... | ... | @@ -741,7 +724,7 @@ test "resolve" { |
| 741 | 724 | defer testing.allocator.free(cwd); |
| 742 | 725 | if (native_os == .windows) { |
| 743 | 726 | if (windowsParsePath(cwd).kind == WindowsPath.Kind.Drive) { |
| 744 | | cwd[0] = asciiUpper(cwd[0]); |
| 727 | cwd[0] = ascii.toUpper(cwd[0]); |
| 745 | 728 | } |
| 746 | 729 | try testResolveWindows(&[_][]const u8{"."}, cwd); |
| 747 | 730 | } else { |
| ... | ... | @@ -768,7 +751,7 @@ test "resolveWindows" { |
| 768 | 751 | }); |
| 769 | 752 | defer testing.allocator.free(expected); |
| 770 | 753 | if (parsed_cwd.kind == WindowsPath.Kind.Drive) { |
| 771 | | expected[0] = asciiUpper(parsed_cwd.disk_designator[0]); |
| 754 | expected[0] = ascii.toUpper(parsed_cwd.disk_designator[0]); |
| 772 | 755 | } |
| 773 | 756 | try testResolveWindows(&[_][]const u8{ "/usr/local", "lib\\zig\\std\\array_list.zig" }, expected); |
| 774 | 757 | } |
| ... | ... | @@ -779,7 +762,7 @@ test "resolveWindows" { |
| 779 | 762 | }); |
| 780 | 763 | defer testing.allocator.free(expected); |
| 781 | 764 | if (parsed_cwd.kind == WindowsPath.Kind.Drive) { |
| 782 | | expected[0] = asciiUpper(parsed_cwd.disk_designator[0]); |
| 765 | expected[0] = ascii.toUpper(parsed_cwd.disk_designator[0]); |
| 783 | 766 | } |
| 784 | 767 | try testResolveWindows(&[_][]const u8{ "usr/local", "lib\\zig" }, expected); |
| 785 | 768 | } |
| ... | ... | @@ -1110,7 +1093,7 @@ pub fn relativeWindows(allocator: Allocator, from: []const u8, to: []const u8) ! |
| 1110 | 1093 | break :x !networkShareServersEql(parsed_to.disk_designator, parsed_from.disk_designator); |
| 1111 | 1094 | }, |
| 1112 | 1095 | WindowsPath.Kind.Drive => { |
| 1113 | | break :x asciiUpper(parsed_from.disk_designator[0]) != asciiUpper(parsed_to.disk_designator[0]); |
| 1096 | break :x ascii.toUpper(parsed_from.disk_designator[0]) != ascii.toUpper(parsed_to.disk_designator[0]); |
| 1114 | 1097 | }, |
| 1115 | 1098 | else => unreachable, |
| 1116 | 1099 | } |
| ... | ... | @@ -1128,7 +1111,7 @@ pub fn relativeWindows(allocator: Allocator, from: []const u8, to: []const u8) ! |
| 1128 | 1111 | const to_rest = to_it.rest(); |
| 1129 | 1112 | if (to_it.next()) |to_component| { |
| 1130 | 1113 | // TODO ASCII is wrong, we actually need full unicode support to compare paths. |
| 1131 | | if (asciiEqlIgnoreCase(from_component, to_component)) |
| 1114 | if (ascii.eqlIgnoreCase(from_component, to_component)) |
| 1132 | 1115 | continue; |
| 1133 | 1116 | } |
| 1134 | 1117 | var up_count: usize = 1; |