From 69bce6fc97afb32718dfd94f77ed68963e68eef3 Mon Sep 17 00:00:00 2001 From: Mark Fox Date: Sat, 7 Mar 2026 06:59:02 -0800 Subject: [PATCH] Add standalone greet tool A simple Zig CLI utility that demonstrates standalone tool compilation. Supports --version, --help, and greeting with custom names. Generated by Attractor pipeline. --- tools/greet.zig | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 tools/greet.zig diff --git a/tools/greet.zig b/tools/greet.zig new file mode 100644 index 0000000..0ed10ab --- /dev/null +++ b/tools/greet.zig @@ -0,0 +1,70 @@ +const std = @import("std"); + +pub fn main() !void { + const allocator = std.heap.page_allocator; + + const args = try std.process.argsAlloc(allocator); + defer std.process.argsFree(allocator, args); + + const stdout = std.fs.File.stdout(); + const stderr = std.fs.File.stderr(); + _ = stderr; + + // args[0] is the program name, args[1..] are the actual arguments + const user_args = if (args.len > 1) args[1..] else &[_][]const u8{}; + + if (user_args.len > 0) { + const first = user_args[0]; + + if (std.mem.eql(u8, first, "--version")) { + try stdout.writeAll("greet 1.0.0\n"); + return; + } + + if (std.mem.eql(u8, first, "--help")) { + try stdout.writeAll("Usage: greet [OPTIONS] [NAME...]\n\nOptions:\n --version Print version information and exit\n --help Print this help message and exit\n\nArguments:\n NAME... One or more names to greet\n\nIf no arguments are given, greets the world.\n"); + return; + } + + // Join all args with spaces + // First calculate total length needed + var total_len: usize = 0; + for (user_args, 0..) |arg, i| { + total_len += arg.len; + if (i < user_args.len - 1) { + total_len += 1; // space + } + } + + // "Hello, " + joined + "!\n" + const prefix = "Hello, "; + const suffix = "!\n"; + const buf_size = prefix.len + total_len + suffix.len; + + var buf: [4096]u8 = undefined; + if (buf_size > buf.len) { + try stdout.writeAll("Hello, World!\n"); + return; + } + + var pos: usize = 0; + @memcpy(buf[pos .. pos + prefix.len], prefix); + pos += prefix.len; + + for (user_args, 0..) |arg, i| { + @memcpy(buf[pos .. pos + arg.len], arg); + pos += arg.len; + if (i < user_args.len - 1) { + buf[pos] = ' '; + pos += 1; + } + } + + @memcpy(buf[pos .. pos + suffix.len], suffix); + pos += suffix.len; + + try stdout.writeAll(buf[0..pos]); + } else { + try stdout.writeAll("Hello, World!\n"); + } +}