diff --git a/src/oar/main.zig b/src/oar/main.zig index cd40b67..15f5a77 100644 --- a/src/oar/main.zig +++ b/src/oar/main.zig @@ -1,6 +1,13 @@ const core = @import("core"); const std = @import("std"); +/// +/// +/// +pub const Archive = struct { + +}; + /// /// An entry block of an Oar archive file. /// @@ -34,7 +41,7 @@ pub const Entry = extern struct { const origin = try file_access.queryCursor(); if (((try file_access.read(mem.asBytes(&entry))) != @sizeOf(Entry)) and - core.io.equalsBytes(&entry.signature, &signature_magic)) { + core.io.equals(u8, &entry.signature, &signature_magic)) { try file_access.seek(origin); @@ -172,7 +179,7 @@ pub fn main() u8 { const process = std.process; const args = process.argsAlloc(allocator) catch { - try out_writer.print("Failed to allocate args memory", .{}); + out_writer.print("Failed to allocate args memory\n", .{}) catch undefined; return 1; }; @@ -180,19 +187,61 @@ pub fn main() u8 { defer process.argsFree(allocator, args); if (args.len < 2) { - try out_writer.print("Usage: oar [OPTION]... [FILE]...", .{}); - try out_writer.print("Options and arguments", .{}); + out_writer.print("Usage: oar [OPTION]... [FILE]...\n", .{}) catch undefined; + out_writer.print("Options and arguments\n", .{}) catch undefined; return 0; } const arg = std.mem.sliceTo(args[1], 0); - if (core.io.begins(arg, "--create")) { + if (core.io.equals(u8, arg, "--create")) { + if (args.len < 3) { + out_writer.print("Expected output file specified after `--create`\n", .{}) catch undefined; + + return 1; + } + + var archive = Archive.init(allocator, Path.joined(&.{args[2]})) catch { + out_writer.print("Failed to initialize archive for create\n", .{}) catch undefined; + + return 1; + }; + + defer archive.deinit(); + + for (args[3 .. ]) |input_file_path| { + const file = std.fs.cwd().openFile(input_file_path) catch { + out_writer.print("Failed to open {s}\n", .{input_file_path}) catch undefined; + + return 1; + }; + + defer file.close(); + + var entry = archive.open(Path.joined(&.{input_file_path})) catch { + out_writer.print("Failed to open {s}\n", .{input_file_path}) catch undefined; + + return 1; + }; + + defer archive.close(entry); + + var copy_buffer = std.mem.zeroes([4096]u8); + + while (true) { + const read = try file.read(©_buffer); + + if (read == 0) break; + + try entry.write(copy_buffer[read ..]); + } + } + return 0; } - try out_writer.print("Unrecognized command-line option `{s}`", .{arg}); + out_writer.print("Unrecognized command-line option `{s}`\n", .{arg}) catch undefined; return 0; }