summaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig83
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();
}