mirror of
https://github.com/zap-proto/c.git
synced 2026-10-30 15:05:52 +00:00
C had no front end for the schema language at all. The compiler directory holds a code generator plugin, which is handed a request by another tool and never sees schema text, so a .zap file could not be read here in either form -- indentation or braces. zapgen reads it. Whitespace-significant source is rewritten into the brace form BEFORE the parser, exactly as the Go reference does it: a near identity that only adds the two tokens the brace grammar requires where the indented form leaves them out. A file already in braces comes back byte for byte, so one grammar reads both styles and neither is a dialect of the other. The identifier grammar is not restated. Its Unicode ranges are taken from Go's own tables by gen/table, so a name this parser accepts is a name the Go parser accepts, and a Go release that moves Unicode moves both. The generated header gives each struct a view over the message bytes and one reader per field at a fixed offset. Reading is in place and total: a field past the end reads zero, a pointer into the head or out of the message reads null. zap_view.h is the one place that says so. Checked against the Go front end on every .zap in the estate plus 55 adversarial cases and 15000 random ones: the brace form each writes is byte-identical, the layout each reads is field-for-field the same, and they accept and refuse the same files for the same stated reason. A message built by the Go runtime reads back through these bindings with every field equal.
42 lines
1.0 KiB
Plaintext
42 lines
1.0 KiB
Plaintext
# The schema this generator is checked against, written the way schemas
|
|
# are written: no braces, no offsets. Indentation opens a block, and each
|
|
# field takes the next free byte after the one before it.
|
|
#
|
|
# It names every type the dialect has, so the header generated from it
|
|
# exercises every reader.
|
|
package echo
|
|
|
|
type id32 = bytes_fixed[32]
|
|
|
|
# What one peer says.
|
|
struct Ping
|
|
# The sequence number the reply must carry back.
|
|
Seq u64
|
|
Sender id32
|
|
Note text
|
|
Payload bytes
|
|
Hops u16
|
|
Live bool
|
|
Drift f64
|
|
Trail list<Ping>
|
|
Origin Site
|
|
|
|
# Where a message came from.
|
|
struct Site
|
|
Host u32
|
|
Port u16
|
|
|
|
# What the other peer says back.
|
|
struct Pong
|
|
Seq u64
|
|
Delay f32
|
|
|
|
# Echo answers what it is told, and says how long it took.
|
|
interface Echo
|
|
# Say something and wait to hear it back.
|
|
ping(req: Ping) returns (resp: Pong)
|
|
# Say something and do not wait.
|
|
notify(req: Ping)
|
|
# Ask whether the other side is there at all.
|
|
health() returns (resp: Pong)
|