╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ migrate_langref.zig ──────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
334 const end_tag_name = tokenizer.buffer[end_code_tag.start..end_code_tag.end]; 335 if (mem.eql(u8, end_tag_name, "code_release_fast")) { 336 mode = .fast; 337 } else if (mem.eql(u8, end_tag_name, "code_release_safe")) { 338 mode = .safe; 339 } else if (mem.eql(u8, end_tag_name, "code_disable_cache")) { 340 disable_cache = true; 341 } else if (mem.eql(u8, end_tag_name, "code_link_object")) { 342 _ = try eatToken(tokenizer, .separator); 343 const obj_tok = try eatToken(tokenizer, .tag_content); 344 try link_objects.append(tokenizer.buffer[obj_tok.start..obj_tok.end]); 345 } else if (mem.eql(u8, end_tag_name, "target_windows")) { 346 target_str = "x86_64-windows"; 347 } else if (mem.eql(u8, end_tag_name, "target_linux_x86_64")) { 348 target_str = "x86_64-linux"; 349 } else if (mem.eql(u8, end_tag_name, "target_linux_riscv64")) { 350 target_str = "riscv64-linux"; 351 } else if (mem.eql(u8, end_tag_name, "target_wasm")) { 352 target_str = "wasm32-freestanding"; 353 } else if (mem.eql(u8, end_tag_name, "target_wasi")) { 354 target_str = "wasm32-wasi"; 355 } else if (mem.eql(u8, end_tag_name, "link_libc")) { 356 link_libc = true; 357 } else if (mem.eql(u8, end_tag_name, "link_mode_dynamic")) { 358 link_mode = .dynamic; 359 } else if (mem.eql(u8, end_tag_name, "additonal_option")) { 360 _ = try eatToken(tokenizer, .separator); 361 const option = try eatToken(tokenizer, .tag_content); 362 try additional_options.append(tokenizer.buffer[option.start..option.end]); 363 } else if (mem.eql(u8, end_tag_name, "code_end")) { 364 _ = try eatToken(tokenizer, .bracket_close); 365 break content_tok; 366 } else { 367 return parseError( 368 tokenizer, 369 end_code_tag, 370 "invalid token inside code_begin: {s}", 371 .{end_tag_name}, 372 ); 373 } 374 _ = try eatToken(tokenizer, .bracket_close); 375 }; 376 377 const basename = try std.fmt.allocPrint(arena, "{s}.zig", .{name}); 378 379 var file = out_dir.createFile(io, basename, .{ .exclusive = true }) catch |err| { 380 fatal("unable to create file '{s}': {s}", .{ name, @errorName(err) }); 381 }; 382 defer file.close(io); 383 var file_buffer: [1024]u8 = undefined; 384 var file_writer = file.writer(io, &file_buffer); 385 const code = &file_writer.interface; 386 387 const source = tokenizer.buffer[source_token.start..source_token.end]; 388 try code.writeAll(std.mem.trim(u8, source[1..], " \t\r\n")); 389 try code.writeAll("\n\n"); 390 391 if (just_check_syntax) { 392 try code.print("// syntax\n", .{}); 393 } else switch (code_kind_id) { 394 .@"test" => try code.print("// test\n", .{}), 395 .lib => try code.print("// lib\n", .{}), 396 .test_error => |s| try code.print("// test_error={s}\n", .{s}), 397 .test_safety => |s| try code.print("// test_safety={s}\n", .{s}), 398 .exe => |s| try code.print("// exe={s}\n", .{@tagName(s)}), 399 .obj => |opt| if (opt) |s| { 400 try code.print("// obj={s}\n", .{s}); 401 } else { 402 try code.print("// obj\n", .{}); 403 }, 404 } 405 406 if (mode != .debug) 407 try code.print("// optimize={s}\n", .{@tagName(mode)}); 408 409 for (link_objects.items) |link_object| { 410 try code.print("// link_object={s}\n", .{link_object}); 411 } 412 413 if (target_str) |s| 414 try code.print("// target={s}\n", .{s}); 415 416 if (link_libc) try code.print("// link_libc\n", .{}); 417 if (disable_cache) try code.print("// disable_cache\n", .{}); 418 419 if (link_mode) |m| 420 try code.print("// link_mode={s}\n", .{@tagName(m)}); 421 422 for (additional_options.items) |o| { 423 try code.print("// additional_option={s}\n", .{o}); 424 } 425 try code.flush(); 426 try w.print("{{#code|{s}#}}\n", .{basename}); 427 } else { 428 const close_bracket = while (true) { 429 const next = tokenizer.next(); 430 if (next.id == .bracket_close) break next; 431 }; 432 try w.writeAll(tokenizer.buffer[token.start..close_bracket.end]); 433 } 434 }, 435 else => return parseError(tokenizer, token, "invalid token", .{}), 436 } 437 } 438 } 439 440 fn urlize(allocator: Allocator, input: []const u8) ![]u8 { 441 var buf = std.array_list.Managed(u8).init(allocator); 442 defer buf.deinit(); 443 444 const out = buf.writer(); 445 for (input) |c| { 446 switch (c) { 447 'a'...'z', 'A'...'Z', '_', '-', '0'...'9' => { 448 try out.writeByte(c); 449 }, 450 ' ' => { 451 try out.writeByte('-'); 452 }, 453 else => {}, 454 } 455 } 456 return try buf.toOwnedSlice(); 457 } 458