| ... | ... | @@ -299,6 +299,11 @@ fn render_cmake( |
| 299 | 299 | var line_index: u32 = 0; |
| 300 | 300 | var line_it = std.mem.splitScalar(u8, contents, '\n'); |
| 301 | 301 | while (line_it.next()) |line| : (line_index += 1) { |
| 302 | // if we reached the end of the buffer there is nothing worth doing anymore |
| 303 | if (line_it.index == line_it.buffer.len) { |
| 304 | continue; |
| 305 | } |
| 306 | |
| 302 | 307 | if (!std.mem.startsWith(u8, line, "#")) { |
| 303 | 308 | try output.appendSlice(line); |
| 304 | 309 | try output.appendSlice("\n"); |
| ... | ... | @@ -313,6 +318,9 @@ fn render_cmake( |
| 313 | 318 | try output.appendSlice("\n"); |
| 314 | 319 | continue; |
| 315 | 320 | } |
| 321 | |
| 322 | const booldefine = std.mem.eql(u8, cmakedefine, "cmakedefine01"); |
| 323 | |
| 316 | 324 | const name = it.next() orelse { |
| 317 | 325 | try step.addError("{s}:{d}: error: missing define name", .{ |
| 318 | 326 | src_path, line_index + 1, |
| ... | ... | @@ -320,19 +328,66 @@ fn render_cmake( |
| 320 | 328 | any_errors = true; |
| 321 | 329 | continue; |
| 322 | 330 | }; |
| 323 | | const kv = values_copy.fetchSwapRemove(name) orelse { |
| 324 | | try step.addError("{s}:{d}: error: unspecified config header value: '{s}'", .{ |
| 325 | | src_path, line_index + 1, name, |
| 326 | | }); |
| 327 | | any_errors = true; |
| 328 | | continue; |
| 331 | var value = values_copy.get(name) orelse blk: { |
| 332 | if (booldefine) { |
| 333 | break :blk Value{ .int = 0 }; |
| 334 | } |
| 335 | break :blk Value.undef; |
| 329 | 336 | }; |
| 330 | | try renderValueC(output, name, kv.value); |
| 331 | | } |
| 332 | 337 | |
| 333 | | for (values_copy.keys()) |name| { |
| 334 | | try step.addError("{s}: error: config header value unused: '{s}'", .{ src_path, name }); |
| 335 | | any_errors = true; |
| 338 | value = blk: { |
| 339 | switch (value) { |
| 340 | .boolean => |b| { |
| 341 | if (!b) { |
| 342 | break :blk Value.undef; |
| 343 | } |
| 344 | }, |
| 345 | .int => |i| { |
| 346 | if (i == 0) { |
| 347 | break :blk Value.undef; |
| 348 | } |
| 349 | }, |
| 350 | .string => |string| { |
| 351 | if (string.len == 0) { |
| 352 | break :blk Value.undef; |
| 353 | } |
| 354 | }, |
| 355 | |
| 356 | else => { |
| 357 | break :blk value; |
| 358 | }, |
| 359 | } |
| 360 | }; |
| 361 | |
| 362 | if (booldefine) { |
| 363 | value = blk: { |
| 364 | switch (value) { |
| 365 | .undef => { |
| 366 | break :blk Value{ .boolean = false }; |
| 367 | }, |
| 368 | .defined => { |
| 369 | break :blk Value{ .boolean = false }; |
| 370 | }, |
| 371 | .boolean => |b| { |
| 372 | break :blk Value{ .boolean = b }; |
| 373 | }, |
| 374 | .int => |i| { |
| 375 | break :blk Value{ .boolean = i != 0 }; |
| 376 | }, |
| 377 | .string => |string| { |
| 378 | break :blk Value{ .boolean = string.len != 0 }; |
| 379 | }, |
| 380 | |
| 381 | else => { |
| 382 | break :blk Value{ .boolean = false }; |
| 383 | }, |
| 384 | } |
| 385 | }; |
| 386 | } else if (value != Value.undef) { |
| 387 | value = Value{ .ident = it.rest() }; |
| 388 | } |
| 389 | |
| 390 | try renderValueC(output, name, value); |
| 336 | 391 | } |
| 337 | 392 | |
| 338 | 393 | if (any_errors) { |
| ... | ... | @@ -392,8 +447,7 @@ fn renderValueC(output: *std.ArrayList(u8), name: []const u8, value: Value) !voi |
| 392 | 447 | .boolean => |b| { |
| 393 | 448 | try output.appendSlice("#define "); |
| 394 | 449 | try output.appendSlice(name); |
| 395 | | try output.appendSlice(" "); |
| 396 | | try output.appendSlice(if (b) "true\n" else "false\n"); |
| 450 | try output.appendSlice(if (b) " 1\n" else " 0\n"); |
| 397 | 451 | }, |
| 398 | 452 | .int => |i| { |
| 399 | 453 | try output.writer().print("#define {s} {d}\n", .{ name, i }); |