Created
July 24, 2022 04:48
-
-
Save jiacai2050/0418ff8e562b864a21b733383da6d080 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//! `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