1
0
Fork
You've already forked zig-sx
0
S-Expression parsing & writing for Zig programs
  • Zig 100%
2026年04月16日 21:58:37 -05:00
.github/workflows workflow update 2026年04月16日 21:58:37 -05:00
test Fix Token_Context.print_for_file 2026年04月14日 15:48:38 -05:00
.gitattributes zig package manager support 2023年06月18日 16:01:13 -05:00
.gitignore zig 0.16 2026年02月21日 14:26:42 -06:00
build.zig zig 0.15.1 2025年09月12日 23:38:38 -05:00
build.zig.zon zig 0.16 2026年04月14日 22:30:17 -05:00
license zig 0.16 2026年02月21日 14:26:42 -06:00
readme.md Fix Token_Context.print_for_file 2026年04月14日 15:48:38 -05:00
sx.zig Fix Token_Context.print_for_file 2026年04月14日 15:48:38 -05:00
tests.zig Fix Token_Context.print_for_file 2026年04月14日 15:48:38 -05:00

Zig-SX

A simple Zig library for reading and writing S-Expressions.

Ideal for human-readable configuration or data files containing lots of compound structures.

Parsing and writing is always done interactively with the user program; there is no intermediate "document" representation.

Reader Example

conststd=@import("std");constsx=@import("sx");varsource=\\(box my-box\\ (dimensions 4.3 7 14)\\ (color red)\\ (contents\\ 42\\ "Big Phil's To Do List:\\ - paint it black\\ - clean up around the house\\")\\)\\;varstring_reader=std.Io.Reader.fixed(source);varreader=sx.reader(std.testing.allocator,&string_reader);deferreader.deinit();tryreader.require_expression("box");_=tryreader.require_any_string();varcolor:[]constu8="";varwidth:f32=0;vardepth:f32=0;varheight:f32=0;while(tryreader.any_expression())|expr|{if(std.mem.eql(u8,expr,"dimensions")){width=tryreader.require_any_float(f32);depth=tryreader.require_any_float(f32);height=tryreader.require_any_float(f32);tryreader.require_close();}elseif(std.mem.eql(u8,expr,"color")){color=trystd.testing.allocator.dupe(u8,tryreader.require_any_string());tryreader.require_close();}elseif(std.mem.eql(u8,expr,"contents")){while(tryreader.any_string())|contents|{std.debug.print("Phil's box contains: {s}\n",.{contents});}tryreader.require_close();}else{tryreader.ignore_remaining_expression();}}tryreader.require_close();tryreader.require_done();

Writer Example

conststd=@import("std");constsx=@import("sx");varstdout_buffer:[64]u8=undefined;varstdout_writer=std.Io.File.stdout.writer(io,&stdout_buffer);varwriter=sx.writer(std.testing.allocator,&stdout_writer.interface);deferwriter.deinit();trywriter.expression("box");trywriter.string("my-box");writer.set_compact(false);trywriter.expression("dimensions");trywriter.float(4.3);trywriter.float(7);trywriter.float(14);_=trywriter.close();trywriter.expression("color");trywriter.string("red");_=trywriter.close();trywriter.expression_expanded("contents");trywriter.int(42,10);trywriter.string(\\Big Phil's To Do List:\\ - paint it black\\ - clean up around the house\\);trywriter.done();

Usage

Add dependency with:

zig fetch --save git+https://codeberg.org/bcrist/zig-sx

Then you can reference it in build.zig with:

b.dependency("sx",.{}).module("sx")