Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions tools/greet.zig
Original file line number Diff line number Diff line change
@@ -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");
}
}