| ... | ... | @@ -535,16 +535,12 @@ test isUnderscore { |
| 535 | 535 | try std.testing.expect(!isUnderscore("\\x5f")); |
| 536 | 536 | } |
| 537 | 537 | |
| 538 | | pub fn readSourceFileToEndAlloc( |
| 539 | | allocator: Allocator, |
| 540 | | input: std.fs.File, |
| 541 | | size_hint: ?usize, |
| 542 | | ) ![:0]u8 { |
| 538 | pub fn readSourceFileToEndAlloc(gpa: Allocator, input: std.fs.File, size_hint: ?usize) ![:0]u8 { |
| 543 | 539 | const source_code = input.readToEndAllocOptions( |
| 544 | | allocator, |
| 540 | gpa, |
| 545 | 541 | max_src_size, |
| 546 | 542 | size_hint, |
| 547 | | @alignOf(u16), |
| 543 | @alignOf(u8), |
| 548 | 544 | 0, |
| 549 | 545 | ) catch |err| switch (err) { |
| 550 | 546 | error.ConnectionResetByPeer => unreachable, |
| ... | ... | @@ -552,7 +548,7 @@ pub fn readSourceFileToEndAlloc( |
| 552 | 548 | error.NotOpenForReading => unreachable, |
| 553 | 549 | else => |e| return e, |
| 554 | 550 | }; |
| 555 | | errdefer allocator.free(source_code); |
| 551 | errdefer gpa.free(source_code); |
| 556 | 552 | |
| 557 | 553 | // Detect unsupported file types with their Byte Order Mark |
| 558 | 554 | const unsupported_boms = [_][]const u8{ |
| ... | ... | @@ -568,15 +564,19 @@ pub fn readSourceFileToEndAlloc( |
| 568 | 564 | |
| 569 | 565 | // If the file starts with a UTF-16 little endian BOM, translate it to UTF-8 |
| 570 | 566 | if (std.mem.startsWith(u8, source_code, "\xff\xfe")) { |
| 571 | | const source_code_utf16_le = std.mem.bytesAsSlice(u16, source_code); |
| 572 | | const source_code_utf8 = std.unicode.utf16LeToUtf8AllocZ(allocator, source_code_utf16_le) catch |err| switch (err) { |
| 567 | if (source_code.len % 2 != 0) return error.InvalidEncoding; |
| 568 | // TODO: after wrangle-writer-buffering branch is merged, |
| 569 | // avoid this unnecessary allocation |
| 570 | const aligned_copy = try gpa.alloc(u16, source_code.len / 2); |
| 571 | defer gpa.free(aligned_copy); |
| 572 | @memcpy(std.mem.sliceAsBytes(aligned_copy), source_code); |
| 573 | const source_code_utf8 = std.unicode.utf16LeToUtf8AllocZ(gpa, aligned_copy) catch |err| switch (err) { |
| 573 | 574 | error.DanglingSurrogateHalf => error.UnsupportedEncoding, |
| 574 | 575 | error.ExpectedSecondSurrogateHalf => error.UnsupportedEncoding, |
| 575 | 576 | error.UnexpectedSecondSurrogateHalf => error.UnsupportedEncoding, |
| 576 | 577 | else => |e| return e, |
| 577 | 578 | }; |
| 578 | | |
| 579 | | allocator.free(source_code); |
| 579 | gpa.free(source_code); |
| 580 | 580 | return source_code_utf8; |
| 581 | 581 | } |
| 582 | 582 | |