diff options
| author | Nate Cox <nate@natecox.dev> | 2026-06-17 18:37:14 -0700 |
|---|---|---|
| committer | Nate Cox <nate@natecox.dev> | 2026-06-17 18:37:14 -0700 |
| commit | 1aa1c0231c9129d2b361d6c21558a8dd1d508e82 (patch) | |
| tree | 5124ceded3f00e6c6d9114bd19a861b8297b218a /hello_world/src | |
| download | zig-book-1aa1c0231c9129d2b361d6c21558a8dd1d508e82.tar.bz2 zig-book-1aa1c0231c9129d2b361d6c21558a8dd1d508e82.zip | |
Chapter one
Diffstat (limited to 'hello_world/src')
| -rw-r--r-- | hello_world/src/main.zig | 71 | ||||
| -rw-r--r-- | hello_world/src/root.zig | 18 |
2 files changed, 89 insertions, 0 deletions
diff --git a/hello_world/src/main.zig b/hello_world/src/main.zig new file mode 100644 index 0000000..5ce2da9 --- /dev/null +++ b/hello_world/src/main.zig @@ -0,0 +1,71 @@ +const std = @import("std"); +const Io = std.Io; + +const hello_world = @import("hello_world"); + +pub fn main(init: std.process.Init) !void { + // Prints to stderr, unbuffered, ignoring potential errors. + std.debug.print("All your {s} are belong to us.\n", .{"codebase"}); + + // This is appropriate for anything that lives as long as the process. + const arena: std.mem.Allocator = init.arena.allocator(); + + // Accessing command line arguments: + const args = try init.minimal.args.toSlice(arena); + for (args) |arg| { + std.log.info("arg: {s}", .{arg}); + } + + // In order to do I/O operations need an `Io` instance. + const io = init.io; + + // Stdout is for the actual output of your application, for example if you + // are implementing gzip, then only the compressed bytes should be sent to + // stdout, not any debugging messages. + var stdout_buffer: [1024]u8 = undefined; + var stdout_file_writer: Io.File.Writer = .init(.stdout(), io, &stdout_buffer); + const stdout_writer = &stdout_file_writer.interface; + + try hello_world.printAnotherMessage(stdout_writer); + + try stdout_writer.flush(); // Don't forget to flush! +} + +test "simple test" { + const gpa = std.testing.allocator; + var list: std.ArrayList(i32) = .empty; + defer list.deinit(gpa); // Try commenting this out and see if zig detects the memory leak! + try list.append(gpa, 42); + try std.testing.expectEqual(@as(i32, 42), list.pop()); +} + +test "fuzz example" { + try std.testing.fuzz({}, testOne, .{}); +} + +fn testOne(context: void, smith: *std.testing.Smith) !void { + _ = context; + // Try passing `--fuzz` to `zig build test` and see if it manages to fail this test case! + + const gpa = std.testing.allocator; + var list: std.ArrayList(u8) = .empty; + defer list.deinit(gpa); + while (!smith.eos()) switch (smith.value(enum { add_data, dup_data })) { + .add_data => { + const slice = try list.addManyAsSlice(gpa, smith.value(u4)); + smith.bytes(slice); + }, + .dup_data => { + if (list.items.len == 0) continue; + if (list.items.len > std.math.maxInt(u32)) return error.SkipZigTest; + const len = smith.valueRangeAtMost(u32, 1, @min(32, list.items.len)); + const off = smith.valueRangeAtMost(u32, 0, @intCast(list.items.len - len)); + try list.appendSlice(gpa, list.items[off..][0..len]); + try std.testing.expectEqualSlices( + u8, + list.items[off..][0..len], + list.items[list.items.len - len ..], + ); + }, + }; +} diff --git a/hello_world/src/root.zig b/hello_world/src/root.zig new file mode 100644 index 0000000..5a71250 --- /dev/null +++ b/hello_world/src/root.zig @@ -0,0 +1,18 @@ +//! By convention, root.zig is the root source file when making a package. +const std = @import("std"); +const Io = std.Io; + +/// This is a documentation comment to explain the `printAnotherMessage` function below. +/// +/// Accepting an `Io.Writer` instance is a handy way to write reusable code. +pub fn printAnotherMessage(writer: *Io.Writer) Io.Writer.Error!void { + try writer.print("Run `zig build test` to run the tests.\n", .{}); +} + +pub fn add(a: i32, b: i32) i32 { + return a + b; +} + +test "basic add functionality" { + try std.testing.expect(add(3, 7) == 10); +} |
