Skip to content

Instantly share code, notes, and snippets.

@jiacai2050
Created July 24, 2022 04:48
Show Gist options
  • Save jiacai2050/0418ff8e562b864a21b733383da6d080 to your computer and use it in GitHub Desktop.
Save jiacai2050/0418ff8e562b864a21b733383da6d080 to your computer and use it in GitHub Desktop.
//! `yes` unix command in Zig, optimized for speed
//! Reference to: https://github.com/cgati/yes
const std = @import("std");
const BUFFER_CAP = 64 * 1024;
fn fill_up_buffer(buf: *[BUFFER_CAP]u8, word: []const u8) []const u8 {
if (word.len > buf.len / 2) {
return word;
}
std.mem.copy(u8, buf, word);
var buffer_size = word.len;
while (buffer_size < buf.len / 2) {
std.mem.copy(u8, buf[buffer_size..], buf[0..buffer_size]);
buffer_size *= 2;
}
return buf[0..buffer_size];
}
/// Reference to: https://doc.rust-lang.org/std/borrow/enum.Cow.html
const Cow = union(enum) {
owned: std.ArrayList(u8),
ref: []const u8,
fn as_slice(self: Cow) []const u8 {
return switch (self) {
.owned => |o| o.items,
.ref => |r| r,
};
}
fn deinit(self: Cow) void {
return switch (self) {
.owned => |o| o.deinit(),
.ref => {},
};
}
};
pub fn main() !void {
const argv = std.os.argv;
const word = if (argv.len > 1) x: {
var list = std.ArrayList(u8).init(std.heap.page_allocator);
try list.appendSlice(argv.ptr[1][0..std.mem.len(argv.ptr[1])]);
try list.append('\n');
break :x Cow{ .owned = list };
} else Cow{ .ref = "y\n" };
defer word.deinit();
var buffer: [BUFFER_CAP]u8 = undefined;
const body = fill_up_buffer(&buffer, word.as_slice());
const stdout = std.io.getStdOut();
var writer = stdout.writer();
while (true) {
try writer.writeAll(body);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment