| ... | ... | @@ -264,8 +264,11 @@ fn render_autoconf( |
| 264 | 264 | values: std.StringArrayHashMap(Value), |
| 265 | 265 | src_path: []const u8, |
| 266 | 266 | ) !void { |
| 267 | | var values_copy = try values.clone(); |
| 268 | | defer values_copy.deinit(); |
| 267 | const build = step.owner; |
| 268 | const allocator = build.allocator; |
| 269 | |
| 270 | var is_used: std.DynamicBitSetUnmanaged = try .initEmpty(allocator, values.count()); |
| 271 | defer is_used.deinit(allocator); |
| 269 | 272 | |
| 270 | 273 | var any_errors = false; |
| 271 | 274 | var line_index: u32 = 0; |
| ... | ... | @@ -284,18 +287,20 @@ fn render_autoconf( |
| 284 | 287 | continue; |
| 285 | 288 | } |
| 286 | 289 | const name = it.rest(); |
| 287 | | const kv = values_copy.fetchSwapRemove(name) orelse { |
| 290 | const index = values.getIndex(name) orelse { |
| 288 | 291 | try step.addError("{s}:{d}: error: unspecified config header value: '{s}'", .{ |
| 289 | 292 | src_path, line_index + 1, name, |
| 290 | 293 | }); |
| 291 | 294 | any_errors = true; |
| 292 | 295 | continue; |
| 293 | 296 | }; |
| 294 | | try renderValueC(output, name, kv.value); |
| 297 | is_used.set(index); |
| 298 | try renderValueC(output, name, values.values()[index]); |
| 295 | 299 | } |
| 296 | 300 | |
| 297 | | for (values_copy.keys()) |name| { |
| 298 | | try step.addError("{s}: error: config header value unused: '{s}'", .{ src_path, name }); |
| 301 | var unused_value_it = is_used.iterator(.{ .kind = .unset }); |
| 302 | while (unused_value_it.next()) |index| { |
| 303 | try step.addError("{s}: error: config header value unused: '{s}'", .{ src_path, values.keys()[index] }); |
| 299 | 304 | any_errors = true; |
| 300 | 305 | } |
| 301 | 306 | |