diff options
Diffstat (limited to 'src/main.zig')
-rw-r--r-- | src/main.zig | 83 |
1 files changed, 48 insertions, 35 deletions
diff --git a/src/main.zig b/src/main.zig index 7c2ffd7..f8bd7b5 100644 --- a/src/main.zig +++ b/src/main.zig @@ -18,14 +18,14 @@ const STDERR_BUFFER_SIZE: usize = 1024; fn formatPath(allocator: Allocator, path: []const u8) ![]const u8 { // Normalize separators and case first - var normalized = ArrayList(u8).init(allocator); - defer normalized.deinit(); + var normalized = ArrayList(u8){}; + defer normalized.deinit(allocator); for (path) |ch| { if (ch == '/') { - try normalized.append('\\'); + try normalized.append(allocator, '\\'); } else { - try normalized.append(std.ascii.toUpper(ch)); + try normalized.append(allocator, std.ascii.toUpper(ch)); } } @@ -48,12 +48,12 @@ fn formatPath(allocator: Allocator, path: []const u8) ![]const u8 { } // Build result with components converted to 8.3 - var result = ArrayList(u8).init(allocator); - defer result.deinit(); + var result = ArrayList(u8){}; + defer result.deinit(allocator); // If absolute, start with a backslash (after potential drive prefix) if (starts_with_backslash) { - try result.append('\\'); + try result.append(allocator, '\\'); } var it = std.mem.splitScalar(u8, normalized.items[idx..], '\\'); @@ -62,38 +62,38 @@ fn formatPath(allocator: Allocator, path: []const u8) ![]const u8 { if (component.len == 0) continue; if (!first_component and result.items.len > 0 and result.items[result.items.len - 1] != '\\') { - try result.append('\\'); + try result.append(allocator, '\\'); } first_component = false; const short_name = try convertTo83(allocator, component); defer allocator.free(short_name.name); defer allocator.free(short_name.ext); - try result.appendSlice(short_name.name); + try result.appendSlice(allocator, short_name.name); if (short_name.ext.len > 0) { - try result.append('.'); - try result.appendSlice(short_name.ext); + try result.append(allocator, '.'); + try result.appendSlice(allocator, short_name.ext); } } // Prepend drive if present or add default C: - var final_buf = ArrayList(u8).init(allocator); - defer final_buf.deinit(); + var final_buf = ArrayList(u8){}; + defer final_buf.deinit(allocator); if (has_drive) { - try final_buf.append(drive_letter); - try final_buf.append(':'); + try final_buf.append(allocator, drive_letter); + try final_buf.append(allocator, ':'); if (result.items.len > 0 and result.items[0] != '\\') { - try final_buf.append('\\'); + try final_buf.append(allocator, '\\'); } - try final_buf.appendSlice(result.items); + try final_buf.appendSlice(allocator, result.items); } else { // No drive: default to C: - try final_buf.appendSlice("C:"); + try final_buf.appendSlice(allocator, "C:"); if (result.items.len > 0 and result.items[0] != '\\') { - try final_buf.append('\\'); + try final_buf.append(allocator, '\\'); } - try final_buf.appendSlice(result.items); + try final_buf.appendSlice(allocator, result.items); } return allocator.dupe(u8, final_buf.items); @@ -113,19 +113,25 @@ fn parseAndExecute(input: []const u8, allocator: Allocator) !CommandStatus { return try eval.executeCommand(command, allocator); } -fn readLine(allocator: Allocator, prompt_text: []const u8) !?[]const u8 { - const stdin = std.io.getStdIn().reader(); - const stdout = std.io.getStdOut(); +fn readLine(buf: []u8, prompt_text: []const u8) !?[]const u8 { + const stdin = std.fs.File.stdin(); + var stdout_buffer: [1024]u8 = undefined; + var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer); + const stdout = &stdout_writer.interface; try stdout.writeAll(prompt_text); + try stdout.flush(); - if (try stdin.readUntilDelimiterOrEofAlloc(allocator, '\n', 4096)) |input| { - // Remove trailing \r on Windows - if (input.len > 0 and input[input.len - 1] == '\r') { - return input[0 .. input.len - 1]; + var reader = stdin.readerStreaming(buf); + const input = std.io.Reader.takeDelimiterExclusive(&reader.interface, '\n') catch |err| { + switch (err) { + error.EndOfStream => return null, + else => return err, } - return input; + }; + if (input.len > 0 and input[input.len - 1] == '\r') { + return input[0 .. input.len - 1]; } - return null; + return input; } pub fn main() !void { @@ -153,14 +159,16 @@ pub fn main() !void { const final_prompt = try std.mem.replaceOwned(u8, allocator, interpolated_prompt, "$g", ">"); defer allocator.free(final_prompt); - if (try readLine(allocator, final_prompt)) |line| { - defer allocator.free(line); - + var buf: [4096]u8 = undefined; + if (try readLine(&buf, final_prompt)) |line| { const command_result = parseAndExecute(line, allocator) catch |err| { switch (err) { error.ExpectedWord, error.UnexpectedToken => { - const stdout = std.io.getStdOut(); + var stdout_buffer: [1024]u8 = undefined; + var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer); + const stdout = &stdout_writer.interface; try stdout.writeAll("Bad command or file name\n"); + try stdout.flush(); continue; }, else => return err, @@ -178,8 +186,12 @@ pub fn main() !void { } fn printWelcomeMessage() !void { - const stdout = std.io.getStdOut(); - if (!stdout.isTty()) return; + const stdout_file = std.fs.File.stdout(); + if (!stdout_file.isTty()) return; + + var stdout_buffer: [1024]u8 = undefined; + var stdout_writer = stdout_file.writer(&stdout_buffer); + const stdout = &stdout_writer.interface; try stdout.writeAll( \\Starting MB-DOS... @@ -193,4 +205,5 @@ fn printWelcomeMessage() !void { \\ \\ ); + try stdout.flush(); } |