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