commit 64c3541416d9c33137663bdefebb6928caff9841 Author: Der Teufel Date: Thu Dec 30 18:22:02 2021 +0100 Initial commit; Readline with history, simple input-echo; Temporary name BYOL diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8bc911a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +zig-out/ +zig-cache/ \ No newline at end of file diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..00f3c06 --- /dev/null +++ b/build.zig @@ -0,0 +1,36 @@ +const std = @import("std"); + +pub fn build(b: *std.build.Builder) void { + // Standard target options allows the person running `zig build` to choose + // what target to build for. Here we do not override the defaults, which + // means any target is allowed, and the default is native. Other options + // for restricting supported target set are available. + const target = b.standardTargetOptions(.{}); + + // Standard release options allow the person running `zig build` to select + // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. + const mode = b.standardReleaseOptions(); + + const exe = b.addExecutable("tokiponalisp", "src/main.zig"); + exe.setTarget(target); + exe.setBuildMode(mode); + exe.linkLibC(); + exe.linkSystemLibrary("libeditline"); + exe.install(); + + const run_cmd = exe.run(); + run_cmd.step.dependOn(b.getInstallStep()); + if (b.args) |args| { + run_cmd.addArgs(args); + } + + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); + + const exe_tests = b.addTest("src/main.zig"); + exe_tests.setTarget(target); + exe_tests.setBuildMode(mode); + + const test_step = b.step("test", "Run unit tests"); + test_step.dependOn(&exe_tests.step); +} diff --git a/src/main.zig b/src/main.zig new file mode 100644 index 0000000..3af8d4a --- /dev/null +++ b/src/main.zig @@ -0,0 +1,18 @@ +const std = @import("std"); +const prompt = @import("prompt.zig"); + +pub fn main() anyerror!void { + const stdout = std.io.getStdOut().writer(); + try stdout.writeAll("BYOL Lispy - ver. 0.0.1\n"); + + prompt.init(); + defer prompt.deinit(); + + while (true) { + + var input = prompt.readline("BYOL> ") orelse break; + defer std.c.free(&input); + + try stdout.print("Echo> {s}\n", .{input}); + } +} diff --git a/src/prompt.zig b/src/prompt.zig new file mode 100644 index 0000000..e97e8a2 --- /dev/null +++ b/src/prompt.zig @@ -0,0 +1,23 @@ +const ceditline = @cImport({ + @cInclude("stdio.h"); + @cInclude("editline.h"); +}); +const std = @import("std"); +const io = std.io; + +pub fn readline(prompt: [*c]const u8) ?[]u8 { + var line = ceditline.readline(@as([*c]const u8, prompt)); + if (line == 0) { + std.c.free(line); + return null; + } + return std.mem.sliceTo(line, 0); +} + +pub fn init() void { + ceditline.rl_initialize(); +} + +pub fn deinit() void { + ceditline.rl_uninitialize(); +} \ No newline at end of file