| ... | ... | @@ -188,34 +188,7 @@ fn render_autoconf( |
| 188 | 188 | any_errors = true; |
| 189 | 189 | continue; |
| 190 | 190 | }; |
| 191 | | switch (kv.value) { |
| 192 | | .undef => { |
| 193 | | try output.appendSlice("/* #undef "); |
| 194 | | try output.appendSlice(name); |
| 195 | | try output.appendSlice(" */\n"); |
| 196 | | }, |
| 197 | | .defined => { |
| 198 | | try output.appendSlice("#define "); |
| 199 | | try output.appendSlice(name); |
| 200 | | try output.appendSlice("\n"); |
| 201 | | }, |
| 202 | | .boolean => |b| { |
| 203 | | try output.appendSlice("#define "); |
| 204 | | try output.appendSlice(name); |
| 205 | | try output.appendSlice(" "); |
| 206 | | try output.appendSlice(if (b) "true\n" else "false\n"); |
| 207 | | }, |
| 208 | | .int => |i| { |
| 209 | | try output.writer().print("#define {s} {d}\n", .{ name, i }); |
| 210 | | }, |
| 211 | | .ident => |ident| { |
| 212 | | try output.writer().print("#define {s} {s}\n", .{ name, ident }); |
| 213 | | }, |
| 214 | | .string => |string| { |
| 215 | | // TODO: use C-specific escaping instead of zig string literals |
| 216 | | try output.writer().print("#define {s} \"{}\"\n", .{ name, std.zig.fmtEscapes(string) }); |
| 217 | | }, |
| 218 | | } |
| 191 | try renderValue(output, name, kv.value); |
| 219 | 192 | } |
| 220 | 193 | |
| 221 | 194 | { |
| ... | ... | @@ -237,9 +210,79 @@ fn render_cmake( |
| 237 | 210 | values_copy: *std.StringHashMap(Value), |
| 238 | 211 | src_path: []const u8, |
| 239 | 212 | ) !void { |
| 240 | | _ = contents; |
| 241 | | _ = output; |
| 242 | | _ = values_copy; |
| 243 | | _ = src_path; |
| 244 | | @panic("TODO: render_cmake is not implemented yet"); |
| 213 | var any_errors = false; |
| 214 | var line_index: u32 = 0; |
| 215 | var line_it = std.mem.split(u8, contents, "\n"); |
| 216 | while (line_it.next()) |line| : (line_index += 1) { |
| 217 | if (!std.mem.startsWith(u8, line, "#")) { |
| 218 | try output.appendSlice(line); |
| 219 | try output.appendSlice("\n"); |
| 220 | continue; |
| 221 | } |
| 222 | var it = std.mem.tokenize(u8, line[1..], " \t\r"); |
| 223 | const cmakedefine = it.next().?; |
| 224 | if (!std.mem.eql(u8, cmakedefine, "cmakedefine")) { |
| 225 | try output.appendSlice(line); |
| 226 | try output.appendSlice("\n"); |
| 227 | continue; |
| 228 | } |
| 229 | const name = it.next() orelse { |
| 230 | std.debug.print("{s}:{d}: error: missing define name\n", .{ |
| 231 | src_path, line_index + 1, |
| 232 | }); |
| 233 | any_errors = true; |
| 234 | continue; |
| 235 | }; |
| 236 | const kv = values_copy.fetchRemove(name) orelse { |
| 237 | std.debug.print("{s}:{d}: error: unspecified config header value: '{s}'\n", .{ |
| 238 | src_path, line_index + 1, name, |
| 239 | }); |
| 240 | any_errors = true; |
| 241 | continue; |
| 242 | }; |
| 243 | try renderValue(output, name, kv.value); |
| 244 | } |
| 245 | |
| 246 | { |
| 247 | var it = values_copy.iterator(); |
| 248 | while (it.next()) |entry| { |
| 249 | const name = entry.key_ptr.*; |
| 250 | std.debug.print("{s}: error: config header value unused: '{s}'\n", .{ src_path, name }); |
| 251 | } |
| 252 | } |
| 253 | |
| 254 | if (any_errors) { |
| 255 | return error.HeaderConfigFailed; |
| 256 | } |
| 257 | } |
| 258 | |
| 259 | fn renderValue(output: *std.ArrayList(u8), name: []const u8, value: Value) !void { |
| 260 | switch (value) { |
| 261 | .undef => { |
| 262 | try output.appendSlice("/* #undef "); |
| 263 | try output.appendSlice(name); |
| 264 | try output.appendSlice(" */\n"); |
| 265 | }, |
| 266 | .defined => { |
| 267 | try output.appendSlice("#define "); |
| 268 | try output.appendSlice(name); |
| 269 | try output.appendSlice("\n"); |
| 270 | }, |
| 271 | .boolean => |b| { |
| 272 | try output.appendSlice("#define "); |
| 273 | try output.appendSlice(name); |
| 274 | try output.appendSlice(" "); |
| 275 | try output.appendSlice(if (b) "true\n" else "false\n"); |
| 276 | }, |
| 277 | .int => |i| { |
| 278 | try output.writer().print("#define {s} {d}\n", .{ name, i }); |
| 279 | }, |
| 280 | .ident => |ident| { |
| 281 | try output.writer().print("#define {s} {s}\n", .{ name, ident }); |
| 282 | }, |
| 283 | .string => |string| { |
| 284 | // TODO: use C-specific escaping instead of zig string literals |
| 285 | try output.writer().print("#define {s} \"{}\"\n", .{ name, std.zig.fmtEscapes(string) }); |
| 286 | }, |
| 287 | } |
| 245 | 288 | } |