| author | |
| committer | |
| log | 063d87132a779d912a7db59872a586a6c331f154 |
| tree | c9c1956ca63b2fbcad12a6c894ad068ee869f4a6 |
| parent | 4395f512c932826360ed9efa1564f4f22693394b |
Just enough to get things working correctly again4 files changed, 32 insertions(+), 37 deletions(-)
lib/compiler/resinator/cli.zig+7-5| ... | @@ -1141,6 +1141,8 @@ pub fn parse(allocator: Allocator, args: []const []const u8, diagnostics: *Diagn | ... | @@ -1141,6 +1141,8 @@ pub fn parse(allocator: Allocator, args: []const []const u8, diagnostics: *Diagn |
| 1141 | } | 1141 | } |
| 1142 | output_format = .res; | 1142 | output_format = .res; |
| 1143 | } | 1143 | } |
| 1144 | } else { | ||
| 1145 | output_format_source = .output_format_arg; | ||
| 1144 | } | 1146 | } |
| 1145 | options.output_source = .{ .filename = try filepathWithExtension(allocator, options.input_source.filename, output_format.?.extension()) }; | 1147 | options.output_source = .{ .filename = try filepathWithExtension(allocator, options.input_source.filename, output_format.?.extension()) }; |
| 1146 | } else { | 1148 | } else { |
| ... | @@ -1529,21 +1531,21 @@ fn testParseOutput(args: []const []const u8, expected_output: []const u8) !?Opti | ... | @@ -1529,21 +1531,21 @@ fn testParseOutput(args: []const []const u8, expected_output: []const u8) !?Opti |
| 1529 | var diagnostics = Diagnostics.init(std.testing.allocator); | 1531 | var diagnostics = Diagnostics.init(std.testing.allocator); |
| 1530 | defer diagnostics.deinit(); | 1532 | defer diagnostics.deinit(); |
| 1531 | 1533 | ||
| 1532 | var output = std.ArrayList(u8).init(std.testing.allocator); | 1534 | var output: std.io.Writer.Allocating = .init(std.testing.allocator); |
| 1533 | defer output.deinit(); | 1535 | defer output.deinit(); |
| 1534 | 1536 | ||
| 1535 | var options = parse(std.testing.allocator, args, &diagnostics) catch |err| switch (err) { | 1537 | var options = parse(std.testing.allocator, args, &diagnostics) catch |err| switch (err) { |
| 1536 | error.ParseError => { | 1538 | error.ParseError => { |
| 1537 | try diagnostics.renderToWriter(args, output.writer(), .no_color); | 1539 | try diagnostics.renderToWriter(args, &output.writer, .no_color); |
| 1538 | try std.testing.expectEqualStrings(expected_output, output.items); | 1540 | try std.testing.expectEqualStrings(expected_output, output.getWritten()); |
| 1539 | return null; | 1541 | return null; |
| 1540 | }, | 1542 | }, |
| 1541 | else => |e| return e, | 1543 | else => |e| return e, |
| 1542 | }; | 1544 | }; |
| 1543 | errdefer options.deinit(); | 1545 | errdefer options.deinit(); |
| 1544 | 1546 | ||
| 1545 | try diagnostics.renderToWriter(args, output.writer(), .no_color); | 1547 | try diagnostics.renderToWriter(args, &output.writer, .no_color); |
| 1546 | try std.testing.expectEqualStrings(expected_output, output.items); | 1548 | try std.testing.expectEqualStrings(expected_output, output.getWritten()); |
| 1547 | return options; | 1549 | return options; |
| 1548 | } | 1550 | } |
| 1549 | 1551 |
lib/compiler/resinator/cvtres.zig+20-27| ... | @@ -65,7 +65,7 @@ pub const ParseResOptions = struct { | ... | @@ -65,7 +65,7 @@ pub const ParseResOptions = struct { |
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | /// The returned ParsedResources should be freed by calling its `deinit` function. | 67 | /// The returned ParsedResources should be freed by calling its `deinit` function. |
| 68 | pub fn parseRes(allocator: Allocator, reader: anytype, options: ParseResOptions) !ParsedResources { | 68 | pub fn parseRes(allocator: Allocator, reader: *std.Io.Reader, options: ParseResOptions) !ParsedResources { |
| 69 | var resources = ParsedResources.init(allocator); | 69 | var resources = ParsedResources.init(allocator); |
| 70 | errdefer resources.deinit(); | 70 | errdefer resources.deinit(); |
| 71 | 71 | ||
| ... | @@ -74,7 +74,7 @@ pub fn parseRes(allocator: Allocator, reader: anytype, options: ParseResOptions) | ... | @@ -74,7 +74,7 @@ pub fn parseRes(allocator: Allocator, reader: anytype, options: ParseResOptions) |
| 74 | return resources; | 74 | return resources; |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | pub fn parseResInto(resources: *ParsedResources, reader: anytype, options: ParseResOptions) !void { | 77 | pub fn parseResInto(resources: *ParsedResources, reader: *std.Io.Reader, options: ParseResOptions) !void { |
| 78 | const allocator = resources.allocator; | 78 | const allocator = resources.allocator; |
| 79 | var bytes_remaining: u64 = options.max_size; | 79 | var bytes_remaining: u64 = options.max_size; |
| 80 | { | 80 | { |
| ... | @@ -103,45 +103,38 @@ pub const ResourceAndSize = struct { | ... | @@ -103,45 +103,38 @@ pub const ResourceAndSize = struct { |
| 103 | total_size: u64, | 103 | total_size: u64, |
| 104 | }; | 104 | }; |
| 105 | 105 | ||
| 106 | pub fn parseResource(allocator: Allocator, reader: anytype, max_size: u64) !ResourceAndSize { | 106 | pub fn parseResource(allocator: Allocator, reader: *std.Io.Reader, max_size: u64) !ResourceAndSize { |
| 107 | var header_counting_reader = std.io.countingReader(reader); | 107 | const data_size = try reader.takeInt(u32, .little); |
| 108 | var buffer: [1024]u8 = undefined; | 108 | const header_size = try reader.takeInt(u32, .little); |
| 109 | var header_reader_adapter = header_counting_reader.reader().adaptToNewApi(&buffer); | ||
| 110 | const header_reader = &header_reader_adapter.new_interface; | ||
| 111 | const data_size = try header_reader.takeInt(u32, .little); | ||
| 112 | const header_size = try header_reader.takeInt(u32, .little); | ||
| 113 | const total_size: u64 = @as(u64, header_size) + data_size; | 109 | const total_size: u64 = @as(u64, header_size) + data_size; |
| 114 | if (total_size > max_size) return error.ImpossibleSize; | 110 | if (total_size > max_size) return error.ImpossibleSize; |
| 115 | 111 | ||
| 116 | var header_bytes_available = header_size -| 8; | 112 | const remaining_header_bytes = try reader.take(header_size -| 8); |
| 117 | var type_reader: std.Io.Reader = .fixed(try header_reader.take(header_bytes_available)); | 113 | var remaining_header_reader: std.Io.Reader = .fixed(remaining_header_bytes); |
| 118 | const type_value = try parseNameOrOrdinal(allocator, &type_reader); | 114 | const type_value = try parseNameOrOrdinal(allocator, &remaining_header_reader); |
| 119 | errdefer type_value.deinit(allocator); | 115 | errdefer type_value.deinit(allocator); |
| 120 | 116 | ||
| 121 | header_bytes_available -|= @intCast(type_value.byteLen()); | 117 | const name_value = try parseNameOrOrdinal(allocator, &remaining_header_reader); |
| 122 | var name_reader: std.Io.Reader = .fixed(try header_reader.take(header_bytes_available)); | ||
| 123 | const name_value = try parseNameOrOrdinal(allocator, &name_reader); | ||
| 124 | errdefer name_value.deinit(allocator); | 118 | errdefer name_value.deinit(allocator); |
| 125 | 119 | ||
| 126 | const padding_after_name = numPaddingBytesNeeded(@intCast(header_counting_reader.bytes_read)); | 120 | const padding_after_name = numPaddingBytesNeeded(@intCast(remaining_header_reader.seek)); |
| 127 | try header_reader.discardAll(padding_after_name); | 121 | try remaining_header_reader.discardAll(padding_after_name); |
| 128 | 122 | ||
| 129 | std.debug.assert(header_counting_reader.bytes_read % 4 == 0); | 123 | std.debug.assert(remaining_header_reader.seek % 4 == 0); |
| 130 | const data_version = try header_reader.takeInt(u32, .little); | 124 | const data_version = try remaining_header_reader.takeInt(u32, .little); |
| 131 | const memory_flags: MemoryFlags = @bitCast(try header_reader.takeInt(u16, .little)); | 125 | const memory_flags: MemoryFlags = @bitCast(try remaining_header_reader.takeInt(u16, .little)); |
| 132 | const language: Language = @bitCast(try header_reader.takeInt(u16, .little)); | 126 | const language: Language = @bitCast(try remaining_header_reader.takeInt(u16, .little)); |
| 133 | const version = try header_reader.takeInt(u32, .little); | 127 | const version = try remaining_header_reader.takeInt(u32, .little); |
| 134 | const characteristics = try header_reader.takeInt(u32, .little); | 128 | const characteristics = try remaining_header_reader.takeInt(u32, .little); |
| 135 | 129 | ||
| 136 | const header_bytes_read = header_counting_reader.bytes_read; | 130 | if (remaining_header_reader.seek != remaining_header_reader.end) return error.HeaderSizeMismatch; |
| 137 | if (header_size != header_bytes_read) return error.HeaderSizeMismatch; | ||
| 138 | 131 | ||
| 139 | const data = try allocator.alloc(u8, data_size); | 132 | const data = try allocator.alloc(u8, data_size); |
| 140 | errdefer allocator.free(data); | 133 | errdefer allocator.free(data); |
| 141 | try reader.readNoEof(data); | 134 | try reader.readSliceAll(data); |
| 142 | 135 | ||
| 143 | const padding_after_data = numPaddingBytesNeeded(@intCast(data_size)); | 136 | const padding_after_data = numPaddingBytesNeeded(@intCast(data_size)); |
| 144 | try reader.skipBytes(padding_after_data, .{ .buf_size = 3 }); | 137 | try reader.discardAll(padding_after_data); |
| 145 | 138 | ||
| 146 | return .{ | 139 | return .{ |
| 147 | .resource = .{ | 140 | .resource = .{ |
lib/compiler/resinator/ico.zig+3-3| ... | @@ -14,12 +14,12 @@ pub fn read(allocator: std.mem.Allocator, reader: anytype, max_size: u64) ReadEr | ... | @@ -14,12 +14,12 @@ pub fn read(allocator: std.mem.Allocator, reader: anytype, max_size: u64) ReadEr |
| 14 | // Some Reader implementations have an empty ReadError error set which would | 14 | // Some Reader implementations have an empty ReadError error set which would |
| 15 | // cause 'unreachable else' if we tried to use an else in the switch, so we | 15 | // cause 'unreachable else' if we tried to use an else in the switch, so we |
| 16 | // need to detect this case and not try to translate to ReadError | 16 | // need to detect this case and not try to translate to ReadError |
| 17 | const anyerror_reader_errorset = @TypeOf(reader).Error == anyerror; | ||
| 17 | const empty_reader_errorset = @typeInfo(@TypeOf(reader).Error).error_set == null or @typeInfo(@TypeOf(reader).Error).error_set.?.len == 0; | 18 | const empty_reader_errorset = @typeInfo(@TypeOf(reader).Error).error_set == null or @typeInfo(@TypeOf(reader).Error).error_set.?.len == 0; |
| 18 | if (empty_reader_errorset) { | 19 | if (empty_reader_errorset and !anyerror_reader_errorset) { |
| 19 | return readAnyError(allocator, reader, max_size) catch |err| switch (err) { | 20 | return readAnyError(allocator, reader, max_size) catch |err| switch (err) { |
| 20 | error.EndOfStream => error.UnexpectedEOF, | 21 | error.EndOfStream => error.UnexpectedEOF, |
| 21 | error.OutOfMemory, error.InvalidHeader, error.InvalidImageType, error.ImpossibleDataSize, error.UnexpectedEOF, error.ReadError => |e| return e, | 22 | else => |e| return e, |
| 22 | else => return error.ReadError, | ||
| 23 | }; | 23 | }; |
| 24 | } else { | 24 | } else { |
| 25 | return readAnyError(allocator, reader, max_size) catch |err| switch (err) { | 25 | return readAnyError(allocator, reader, max_size) catch |err| switch (err) { |
lib/compiler/resinator/main.zig+2-2| ... | @@ -325,8 +325,8 @@ pub fn main() !void { | ... | @@ -325,8 +325,8 @@ pub fn main() !void { |
| 325 | std.debug.assert(options.output_format == .coff); | 325 | std.debug.assert(options.output_format == .coff); |
| 326 | 326 | ||
| 327 | // TODO: Maybe use a buffered file reader instead of reading file into memory -> fbs | 327 | // TODO: Maybe use a buffered file reader instead of reading file into memory -> fbs |
| 328 | var fbs = std.io.fixedBufferStream(res_data.bytes); | 328 | var res_reader: std.Io.Reader = .fixed(res_data.bytes); |
| 329 | break :resources cvtres.parseRes(allocator, fbs.reader(), .{ .max_size = res_data.bytes.len }) catch |err| { | 329 | break :resources cvtres.parseRes(allocator, &res_reader, .{ .max_size = res_data.bytes.len }) catch |err| { |
| 330 | // TODO: Better errors | 330 | // TODO: Better errors |
| 331 | try error_handler.emitMessage(allocator, .err, "unable to parse res from '{s}': {s}", .{ res_stream.name, @errorName(err) }); | 331 | try error_handler.emitMessage(allocator, .err, "unable to parse res from '{s}': {s}", .{ res_stream.name, @errorName(err) }); |
| 332 | std.process.exit(1); | 332 | std.process.exit(1); |