| ... | @@ -550,7 +550,7 @@ pub const Compiler = struct { | ... | @@ -550,7 +550,7 @@ pub const Compiler = struct { |
| 550 | // so get it here to simplify future usage. | 550 | // so get it here to simplify future usage. |
| 551 | const filename_token = node.filename.getFirstToken(); | 551 | const filename_token = node.filename.getFirstToken(); |
| 552 | | 552 | |
| 553 | const file = self.searchForFile(filename_utf8) catch |err| switch (err) { | 553 | const file_handle = self.searchForFile(filename_utf8) catch |err| switch (err) { |
| 554 | error.OutOfMemory => |e| return e, | 554 | error.OutOfMemory => |e| return e, |
| 555 | else => |e| { | 555 | else => |e| { |
| 556 | const filename_string_index = try self.diagnostics.putString(filename_utf8); | 556 | const filename_string_index = try self.diagnostics.putString(filename_utf8); |
| ... | @@ -564,13 +564,15 @@ pub const Compiler = struct { | ... | @@ -564,13 +564,15 @@ pub const Compiler = struct { |
| 564 | }); | 564 | }); |
| 565 | }, | 565 | }, |
| 566 | }; | 566 | }; |
| 567 | defer file.close(); | 567 | defer file_handle.close(); |
| | 568 | var file_buffer: [2048]u8 = undefined; |
| | 569 | var file_reader = file_handle.reader(&file_buffer); |
| 568 | | 570 | |
| 569 | if (maybe_predefined_type) |predefined_type| { | 571 | if (maybe_predefined_type) |predefined_type| { |
| 570 | switch (predefined_type) { | 572 | switch (predefined_type) { |
| 571 | .GROUP_ICON, .GROUP_CURSOR => { | 573 | .GROUP_ICON, .GROUP_CURSOR => { |
| 572 | // Check for animated icon first | 574 | // Check for animated icon first |
| 573 | if (ani.isAnimatedIcon(file.deprecatedReader())) { | 575 | if (ani.isAnimatedIcon(file_reader.interface.adaptToOldInterface())) { |
| 574 | // Animated icons are just put into the resource unmodified, | 576 | // Animated icons are just put into the resource unmodified, |
| 575 | // and the resource type changes to ANIICON/ANICURSOR | 577 | // and the resource type changes to ANIICON/ANICURSOR |
| 576 | | 578 | |
| ... | @@ -582,18 +584,18 @@ pub const Compiler = struct { | ... | @@ -582,18 +584,18 @@ pub const Compiler = struct { |
| 582 | header.type_value.ordinal = @intFromEnum(new_predefined_type); | 584 | header.type_value.ordinal = @intFromEnum(new_predefined_type); |
| 583 | header.memory_flags = MemoryFlags.defaults(new_predefined_type); | 585 | header.memory_flags = MemoryFlags.defaults(new_predefined_type); |
| 584 | header.applyMemoryFlags(node.common_resource_attributes, self.source); | 586 | header.applyMemoryFlags(node.common_resource_attributes, self.source); |
| 585 | header.data_size = @intCast(try file.getEndPos()); | 587 | header.data_size = @intCast(try file_reader.getSize()); |
| 586 | | 588 | |
| 587 | try header.write(writer, self.errContext(node.id)); | 589 | try header.write(writer, self.errContext(node.id)); |
| 588 | try file.seekTo(0); | 590 | try file_reader.seekTo(0); |
| 589 | try writeResourceData(writer, file.deprecatedReader(), header.data_size); | 591 | try writeResourceData(writer, &file_reader.interface, header.data_size); |
| 590 | return; | 592 | return; |
| 591 | } | 593 | } |
| 592 | | 594 | |
| 593 | // isAnimatedIcon moved the file cursor so reset to the start | 595 | // isAnimatedIcon moved the file cursor so reset to the start |
| 594 | try file.seekTo(0); | 596 | try file_reader.seekTo(0); |
| 595 | | 597 | |
| 596 | const icon_dir = ico.read(self.allocator, file.deprecatedReader(), try file.getEndPos()) catch |err| switch (err) { | 598 | const icon_dir = ico.read(self.allocator, file_reader.interface.adaptToOldInterface(), try file_reader.getSize()) catch |err| switch (err) { |
| 597 | error.OutOfMemory => |e| return e, | 599 | error.OutOfMemory => |e| return e, |
| 598 | else => |e| { | 600 | else => |e| { |
| 599 | return self.iconReadError( | 601 | return self.iconReadError( |
| ... | @@ -671,15 +673,15 @@ pub const Compiler = struct { | ... | @@ -671,15 +673,15 @@ pub const Compiler = struct { |
| 671 | try writer.writeInt(u16, entry.type_specific_data.cursor.hotspot_y, .little); | 673 | try writer.writeInt(u16, entry.type_specific_data.cursor.hotspot_y, .little); |
| 672 | } | 674 | } |
| 673 | | 675 | |
| 674 | try file.seekTo(entry.data_offset_from_start_of_file); | 676 | try file_reader.seekTo(entry.data_offset_from_start_of_file); |
| 675 | var header_bytes = file.deprecatedReader().readBytesNoEof(16) catch { | 677 | var header_bytes = (file_reader.interface.takeArray(16) catch { |
| 676 | return self.iconReadError( | 678 | return self.iconReadError( |
| 677 | error.UnexpectedEOF, | 679 | error.UnexpectedEOF, |
| 678 | filename_utf8, | 680 | filename_utf8, |
| 679 | filename_token, | 681 | filename_token, |
| 680 | predefined_type, | 682 | predefined_type, |
| 681 | ); | 683 | ); |
| 682 | }; | 684 | }).*; |
| 683 | | 685 | |
| 684 | const image_format = ico.ImageFormat.detect(&header_bytes); | 686 | const image_format = ico.ImageFormat.detect(&header_bytes); |
| 685 | if (!image_format.validate(&header_bytes)) { | 687 | if (!image_format.validate(&header_bytes)) { |
| ... | @@ -802,8 +804,8 @@ pub const Compiler = struct { | ... | @@ -802,8 +804,8 @@ pub const Compiler = struct { |
| 802 | }, | 804 | }, |
| 803 | } | 805 | } |
| 804 | | 806 | |
| 805 | try file.seekTo(entry.data_offset_from_start_of_file); | 807 | try file_reader.seekTo(entry.data_offset_from_start_of_file); |
| 806 | try writeResourceDataNoPadding(writer, file.deprecatedReader(), entry.data_size_in_bytes); | 808 | try writeResourceDataNoPadding(writer, &file_reader.interface, entry.data_size_in_bytes); |
| 807 | try writeDataPadding(writer, full_data_size); | 809 | try writeDataPadding(writer, full_data_size); |
| 808 | | 810 | |
| 809 | if (self.state.icon_id == std.math.maxInt(u16)) { | 811 | if (self.state.icon_id == std.math.maxInt(u16)) { |
| ... | @@ -857,9 +859,9 @@ pub const Compiler = struct { | ... | @@ -857,9 +859,9 @@ pub const Compiler = struct { |
| 857 | }, | 859 | }, |
| 858 | .BITMAP => { | 860 | .BITMAP => { |
| 859 | header.applyMemoryFlags(node.common_resource_attributes, self.source); | 861 | header.applyMemoryFlags(node.common_resource_attributes, self.source); |
| 860 | const file_size = try file.getEndPos(); | 862 | const file_size = try file_reader.getSize(); |
| 861 | | 863 | |
| 862 | const bitmap_info = bmp.read(file.deprecatedReader(), file_size) catch |err| { | 864 | const bitmap_info = bmp.read(file_reader.interface.adaptToOldInterface(), file_size) catch |err| { |
| 863 | const filename_string_index = try self.diagnostics.putString(filename_utf8); | 865 | const filename_string_index = try self.diagnostics.putString(filename_utf8); |
| 864 | return self.addErrorDetailsAndFail(.{ | 866 | return self.addErrorDetailsAndFail(.{ |
| 865 | .err = .bmp_read_error, | 867 | .err = .bmp_read_error, |
| ... | @@ -921,18 +923,17 @@ pub const Compiler = struct { | ... | @@ -921,18 +923,17 @@ pub const Compiler = struct { |
| 921 | | 923 | |
| 922 | header.data_size = bmp_bytes_to_write; | 924 | header.data_size = bmp_bytes_to_write; |
| 923 | try header.write(writer, self.errContext(node.id)); | 925 | try header.write(writer, self.errContext(node.id)); |
| 924 | try file.seekTo(bmp.file_header_len); | 926 | try file_reader.seekTo(bmp.file_header_len); |
| 925 | const file_reader = file.deprecatedReader(); | 927 | try writeResourceDataNoPadding(writer, &file_reader.interface, bitmap_info.dib_header_size); |
| 926 | try writeResourceDataNoPadding(writer, file_reader, bitmap_info.dib_header_size); | | |
| 927 | if (bitmap_info.getBitmasksByteLen() > 0) { | 928 | if (bitmap_info.getBitmasksByteLen() > 0) { |
| 928 | try writeResourceDataNoPadding(writer, file_reader, bitmap_info.getBitmasksByteLen()); | 929 | try writeResourceDataNoPadding(writer, &file_reader.interface, bitmap_info.getBitmasksByteLen()); |
| 929 | } | 930 | } |
| 930 | if (bitmap_info.getExpectedPaletteByteLen() > 0) { | 931 | if (bitmap_info.getExpectedPaletteByteLen() > 0) { |
| 931 | try writeResourceDataNoPadding(writer, file_reader, @intCast(bitmap_info.getActualPaletteByteLen())); | 932 | try writeResourceDataNoPadding(writer, &file_reader.interface, @intCast(bitmap_info.getActualPaletteByteLen())); |
| 932 | } | 933 | } |
| 933 | try file.seekTo(bitmap_info.pixel_data_offset); | 934 | try file_reader.seekTo(bitmap_info.pixel_data_offset); |
| 934 | const pixel_bytes: u32 = @intCast(file_size - bitmap_info.pixel_data_offset); | 935 | const pixel_bytes: u32 = @intCast(file_size - bitmap_info.pixel_data_offset); |
| 935 | try writeResourceDataNoPadding(writer, file_reader, pixel_bytes); | 936 | try writeResourceDataNoPadding(writer, &file_reader.interface, pixel_bytes); |
| 936 | try writeDataPadding(writer, bmp_bytes_to_write); | 937 | try writeDataPadding(writer, bmp_bytes_to_write); |
| 937 | return; | 938 | return; |
| 938 | }, | 939 | }, |
| ... | @@ -956,7 +957,7 @@ pub const Compiler = struct { | ... | @@ -956,7 +957,7 @@ pub const Compiler = struct { |
| 956 | return; | 957 | return; |
| 957 | } | 958 | } |
| 958 | header.applyMemoryFlags(node.common_resource_attributes, self.source); | 959 | header.applyMemoryFlags(node.common_resource_attributes, self.source); |
| 959 | const file_size = try file.getEndPos(); | 960 | const file_size = try file_reader.getSize(); |
| 960 | if (file_size > std.math.maxInt(u32)) { | 961 | if (file_size > std.math.maxInt(u32)) { |
| 961 | return self.addErrorDetailsAndFail(.{ | 962 | return self.addErrorDetailsAndFail(.{ |
| 962 | .err = .resource_data_size_exceeds_max, | 963 | .err = .resource_data_size_exceeds_max, |
| ... | @@ -968,8 +969,9 @@ pub const Compiler = struct { | ... | @@ -968,8 +969,9 @@ pub const Compiler = struct { |
| 968 | header.data_size = @intCast(file_size); | 969 | header.data_size = @intCast(file_size); |
| 969 | try header.write(writer, self.errContext(node.id)); | 970 | try header.write(writer, self.errContext(node.id)); |
| 970 | | 971 | |
| 971 | var header_slurping_reader = headerSlurpingReader(148, file.deprecatedReader()); | 972 | var header_slurping_reader = headerSlurpingReader(148, file_reader.interface.adaptToOldInterface()); |
| 972 | try writeResourceData(writer, header_slurping_reader.reader(), header.data_size); | 973 | var adapter = header_slurping_reader.reader().adaptToNewApi(&.{}); |
| | 974 | try writeResourceData(writer, &adapter.new_interface, header.data_size); |
| 973 | | 975 | |
| 974 | try self.state.font_dir.add(self.arena, FontDir.Font{ | 976 | try self.state.font_dir.add(self.arena, FontDir.Font{ |
| 975 | .id = header.name_value.ordinal, | 977 | .id = header.name_value.ordinal, |
| ... | @@ -992,7 +994,7 @@ pub const Compiler = struct { | ... | @@ -992,7 +994,7 @@ pub const Compiler = struct { |
| 992 | } | 994 | } |
| 993 | | 995 | |
| 994 | // Fallback to just writing out the entire contents of the file | 996 | // Fallback to just writing out the entire contents of the file |
| 995 | const data_size = try file.getEndPos(); | 997 | const data_size = try file_reader.getSize(); |
| 996 | if (data_size > std.math.maxInt(u32)) { | 998 | if (data_size > std.math.maxInt(u32)) { |
| 997 | return self.addErrorDetailsAndFail(.{ | 999 | return self.addErrorDetailsAndFail(.{ |
| 998 | .err = .resource_data_size_exceeds_max, | 1000 | .err = .resource_data_size_exceeds_max, |
| ... | @@ -1002,7 +1004,7 @@ pub const Compiler = struct { | ... | @@ -1002,7 +1004,7 @@ pub const Compiler = struct { |
| 1002 | // We now know that the data size will fit in a u32 | 1004 | // We now know that the data size will fit in a u32 |
| 1003 | header.data_size = @intCast(data_size); | 1005 | header.data_size = @intCast(data_size); |
| 1004 | try header.write(writer, self.errContext(node.id)); | 1006 | try header.write(writer, self.errContext(node.id)); |
| 1005 | try writeResourceData(writer, file.deprecatedReader(), header.data_size); | 1007 | try writeResourceData(writer, &file_reader.interface, header.data_size); |
| 1006 | } | 1008 | } |
| 1007 | | 1009 | |
| 1008 | fn iconReadError( | 1010 | fn iconReadError( |
| ... | @@ -1250,8 +1252,8 @@ pub const Compiler = struct { | ... | @@ -1250,8 +1252,8 @@ pub const Compiler = struct { |
| 1250 | const data_len: u32 = @intCast(data_buffer.items.len); | 1252 | const data_len: u32 = @intCast(data_buffer.items.len); |
| 1251 | try self.writeResourceHeader(writer, node.id, node.type, data_len, node.common_resource_attributes, self.state.language); | 1253 | try self.writeResourceHeader(writer, node.id, node.type, data_len, node.common_resource_attributes, self.state.language); |
| 1252 | | 1254 | |
| 1253 | var data_fbs = std.io.fixedBufferStream(data_buffer.items); | 1255 | var data_fbs: std.Io.Reader = .fixed(data_buffer.items); |
| 1254 | try writeResourceData(writer, data_fbs.reader(), data_len); | 1256 | try writeResourceData(writer, &data_fbs, data_len); |
| 1255 | } | 1257 | } |
| 1256 | | 1258 | |
| 1257 | pub fn writeResourceHeader(self: *Compiler, writer: anytype, id_token: Token, type_token: Token, data_size: u32, common_resource_attributes: []Token, language: res.Language) !void { | 1259 | pub fn writeResourceHeader(self: *Compiler, writer: anytype, id_token: Token, type_token: Token, data_size: u32, common_resource_attributes: []Token, language: res.Language) !void { |
| ... | @@ -1266,15 +1268,15 @@ pub const Compiler = struct { | ... | @@ -1266,15 +1268,15 @@ pub const Compiler = struct { |
| 1266 | try header.write(writer, self.errContext(id_token)); | 1268 | try header.write(writer, self.errContext(id_token)); |
| 1267 | } | 1269 | } |
| 1268 | | 1270 | |
| 1269 | pub fn writeResourceDataNoPadding(writer: anytype, data_reader: anytype, data_size: u32) !void { | 1271 | pub fn writeResourceDataNoPadding(writer: anytype, data_reader: *std.Io.Reader, data_size: u32) !void { |
| 1270 | var limited_reader = std.io.limitedReader(data_reader, data_size); | 1272 | var adapted = writer.adaptToNewApi(); |
| 1271 | | 1273 | var buffer: [128]u8 = undefined; |
| 1272 | const FifoBuffer = std.fifo.LinearFifo(u8, .{ .Static = 4096 }); | 1274 | adapted.new_interface.buffer = &buffer; |
| 1273 | var fifo = FifoBuffer.init(); | 1275 | try data_reader.streamExact(&adapted.new_interface, data_size); |
| 1274 | try fifo.pump(limited_reader.reader(), writer); | 1276 | try adapted.new_interface.flush(); |
| 1275 | } | 1277 | } |
| 1276 | | 1278 | |
| 1277 | pub fn writeResourceData(writer: anytype, data_reader: anytype, data_size: u32) !void { | 1279 | pub fn writeResourceData(writer: anytype, data_reader: *std.Io.Reader, data_size: u32) !void { |
| 1278 | try writeResourceDataNoPadding(writer, data_reader, data_size); | 1280 | try writeResourceDataNoPadding(writer, data_reader, data_size); |
| 1279 | try writeDataPadding(writer, data_size); | 1281 | try writeDataPadding(writer, data_size); |
| 1280 | } | 1282 | } |
| ... | @@ -1339,8 +1341,8 @@ pub const Compiler = struct { | ... | @@ -1339,8 +1341,8 @@ pub const Compiler = struct { |
| 1339 | | 1341 | |
| 1340 | try header.write(writer, self.errContext(node.id)); | 1342 | try header.write(writer, self.errContext(node.id)); |
| 1341 | | 1343 | |
| 1342 | var data_fbs = std.io.fixedBufferStream(data_buffer.items); | 1344 | var data_fbs: std.Io.Reader = .fixed(data_buffer.items); |
| 1343 | try writeResourceData(writer, data_fbs.reader(), data_size); | 1345 | try writeResourceData(writer, &data_fbs, data_size); |
| 1344 | } | 1346 | } |
| 1345 | | 1347 | |
| 1346 | /// Expects `data_writer` to be a LimitedWriter limited to u32, meaning all writes to | 1348 | /// Expects `data_writer` to be a LimitedWriter limited to u32, meaning all writes to |
| ... | @@ -1732,8 +1734,8 @@ pub const Compiler = struct { | ... | @@ -1732,8 +1734,8 @@ pub const Compiler = struct { |
| 1732 | | 1734 | |
| 1733 | try header.write(writer, self.errContext(node.id)); | 1735 | try header.write(writer, self.errContext(node.id)); |
| 1734 | | 1736 | |
| 1735 | var data_fbs = std.io.fixedBufferStream(data_buffer.items); | 1737 | var data_fbs: std.Io.Reader = .fixed(data_buffer.items); |
| 1736 | try writeResourceData(writer, data_fbs.reader(), data_size); | 1738 | try writeResourceData(writer, &data_fbs, data_size); |
| 1737 | } | 1739 | } |
| 1738 | | 1740 | |
| 1739 | fn writeDialogHeaderAndStrings( | 1741 | fn writeDialogHeaderAndStrings( |
| ... | @@ -2046,8 +2048,8 @@ pub const Compiler = struct { | ... | @@ -2046,8 +2048,8 @@ pub const Compiler = struct { |
| 2046 | | 2048 | |
| 2047 | try header.write(writer, self.errContext(node.id)); | 2049 | try header.write(writer, self.errContext(node.id)); |
| 2048 | | 2050 | |
| 2049 | var data_fbs = std.io.fixedBufferStream(data_buffer.items); | 2051 | var data_fbs: std.Io.Reader = .fixed(data_buffer.items); |
| 2050 | try writeResourceData(writer, data_fbs.reader(), data_size); | 2052 | try writeResourceData(writer, &data_fbs, data_size); |
| 2051 | } | 2053 | } |
| 2052 | | 2054 | |
| 2053 | /// Weight and italic carry over from previous FONT statements within a single resource, | 2055 | /// Weight and italic carry over from previous FONT statements within a single resource, |
| ... | @@ -2121,8 +2123,8 @@ pub const Compiler = struct { | ... | @@ -2121,8 +2123,8 @@ pub const Compiler = struct { |
| 2121 | | 2123 | |
| 2122 | try header.write(writer, self.errContext(node.id)); | 2124 | try header.write(writer, self.errContext(node.id)); |
| 2123 | | 2125 | |
| 2124 | var data_fbs = std.io.fixedBufferStream(data_buffer.items); | 2126 | var data_fbs: std.Io.Reader = .fixed(data_buffer.items); |
| 2125 | try writeResourceData(writer, data_fbs.reader(), data_size); | 2127 | try writeResourceData(writer, &data_fbs, data_size); |
| 2126 | } | 2128 | } |
| 2127 | | 2129 | |
| 2128 | /// Expects `data_writer` to be a LimitedWriter limited to u32, meaning all writes to | 2130 | /// Expects `data_writer` to be a LimitedWriter limited to u32, meaning all writes to |
| ... | @@ -2386,8 +2388,8 @@ pub const Compiler = struct { | ... | @@ -2386,8 +2388,8 @@ pub const Compiler = struct { |
| 2386 | | 2388 | |
| 2387 | try header.write(writer, self.errContext(node.id)); | 2389 | try header.write(writer, self.errContext(node.id)); |
| 2388 | | 2390 | |
| 2389 | var data_fbs = std.io.fixedBufferStream(data_buffer.items); | 2391 | var data_fbs: std.Io.Reader = .fixed(data_buffer.items); |
| 2390 | try writeResourceData(writer, data_fbs.reader(), data_size); | 2392 | try writeResourceData(writer, &data_fbs, data_size); |
| 2391 | } | 2393 | } |
| 2392 | | 2394 | |
| 2393 | /// Expects writer to be a LimitedWriter limited to u16, meaning all writes to | 2395 | /// Expects writer to be a LimitedWriter limited to u16, meaning all writes to |
| ... | @@ -3321,8 +3323,8 @@ pub const StringTable = struct { | ... | @@ -3321,8 +3323,8 @@ pub const StringTable = struct { |
| 3321 | // we fully control and know are numbers, so they have a fixed size. | 3323 | // we fully control and know are numbers, so they have a fixed size. |
| 3322 | try header.writeAssertNoOverflow(writer); | 3324 | try header.writeAssertNoOverflow(writer); |
| 3323 | | 3325 | |
| 3324 | var data_fbs = std.io.fixedBufferStream(data_buffer.items); | 3326 | var data_fbs: std.Io.Reader = .fixed(data_buffer.items); |
| 3325 | try Compiler.writeResourceData(writer, data_fbs.reader(), data_size); | 3327 | try Compiler.writeResourceData(writer, &data_fbs, data_size); |
| 3326 | } | 3328 | } |
| 3327 | }; | 3329 | }; |
| 3328 | | 3330 | |