Files
zeekay a4debdba80 Read a .zap schema the way every other ZAP language reads it
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.
2026-09-15 11:32:12 -07:00

33 lines
993 B
C

/* SPDX-License-Identifier: BSD-3-Clause-Eco */
/*
* rune.h - what counts as a letter or a digit in an identifier, and how a
* UTF-8 byte run decodes into the code point that is asked about.
*
* The tables in rune.c come from Go's unicode package (see rune-gen), so
* an identifier this parser accepts is exactly an identifier the Go
* reference parser accepts.
*/
#ifndef ZAPGEN_RUNE_H
#define ZAPGEN_RUNE_H
#include <stddef.h>
#include <stdint.h>
/* span is one half-open Unicode range with a stride, mirroring the shape
* of a Go unicode.Range16 / Range32 entry. */
struct span {
uint32_t lo, hi, stride;
};
int rune_letter(uint32_t r);
int rune_digit(uint32_t r);
/* rune_read decodes one UTF-8 code point from src[0:len] and stores its
* width in *size. An invalid or truncated sequence decodes to U+FFFD with
* width 1, matching utf8.DecodeRune. Returns 0 with *size 0 at the end of
* the input. */
uint32_t rune_read(const char *src, size_t len, size_t *size);
#endif