ref: vendor harec checker sources (#20)
ref/hare/ ships only ast/lex/parse/module/unparse — no checker. Every bail-fix landing in A.6.2.1 (helper bail audit, N_IDENT bail audit, enum fold) needs a `ref/harec/...` cite anchor so divergence rationale isn't claimed against memory. PLAN.md L16, L35. Snapshot of upstream commit ee640c6b2c17f57e8014d277a3028b262ffb7952 (`rt/+openbsd/start.ha: remove outdated comment about crt0`). 20 files: 5 src (check.c, eval.c, scope.c, types.c, type_store.c), 14 transitive include/ headers (no parser/codegen surface), and COPYING. License GPLv3 (COPYING included). Vendored as read-only reference per CLAUDE.md rule 6 — no redistribution as binary, no edits.
This commit is contained in:
53
ref/harec/include/identifier.h
Normal file
53
ref/harec/include/identifier.h
Normal file
@@ -0,0 +1,53 @@
|
||||
#ifndef HARE_IDENTIFIER_H
|
||||
#define HARE_IDENTIFIER_H
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
// Maximum length of an identifier, as the sum of the lengths (excluding NUL
|
||||
// terminators) of its parts plus one for each namespace deliniation.
|
||||
//
|
||||
// In other words, the length of "a::b::c" is 5.
|
||||
#define IDENT_MAX 255
|
||||
|
||||
// Minimum buffer size needed to store an unparsed identifier, including the
|
||||
// terminating NUL byte.
|
||||
#define IDENT_BUFSIZ (IDENT_MAX / 2 + IDENT_MAX + 1)
|
||||
|
||||
struct ident {
|
||||
const char *name;
|
||||
struct ident *ns;
|
||||
};
|
||||
|
||||
struct identifiers {
|
||||
struct ident *ident;
|
||||
struct identifiers *next;
|
||||
};
|
||||
|
||||
struct bucket {
|
||||
void **ids;
|
||||
size_t sz;
|
||||
size_t cap;
|
||||
};
|
||||
|
||||
struct intern_table {
|
||||
struct bucket *sbuckets;
|
||||
struct bucket *ibuckets;
|
||||
};
|
||||
|
||||
bool ident_equal(const struct ident *a, const struct ident *b);
|
||||
uint32_t ident_hash(uint32_t init, const struct ident *ident);
|
||||
char *ident_unparse(const struct ident *ident);
|
||||
int ident_unparse_static(const struct ident *ident, char *buf);
|
||||
const char *ident_to_sym(struct intern_table *itbl, const struct ident *ident);
|
||||
|
||||
void intern_init(struct intern_table *itbl);
|
||||
|
||||
const char *intern_copy(struct intern_table *itbl, const char *s);
|
||||
const char *intern_owned(struct intern_table *itbl, char *s);
|
||||
|
||||
struct ident *intern_ident(struct intern_table *itbl,
|
||||
const char *name, struct ident *ns);
|
||||
struct ident *intern_name(struct intern_table *itbl, const char *name);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user