S-Expression parsing & writing for Zig programs
- Zig 100%
| .github/workflows | workflow update | |
| test | Fix Token_Context.print_for_file | |
| .gitattributes | zig package manager support | |
| .gitignore | zig 0.16 | |
| build.zig | zig 0.15.1 | |
| build.zig.zon | zig 0.16 | |
| license | zig 0.16 | |
| readme.md | Fix Token_Context.print_for_file | |
| sx.zig | Fix Token_Context.print_for_file | |
| tests.zig | Fix Token_Context.print_for_file | |
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")