All 84 bindings migrated, so the package is raylib.flan and link and no C at all. Two keep a wrapper and both wrappers are Flan, not C: collision-point-poly? takes a slice and collision-lines answers with an Option, and neither is raylib's signature. A slice in a declare-c is refused by name — the length crosses as i64 and the type of the C count parameter beside the pointer is not recoverable from [T] — so that one declares (Ptr Vector2) with an explicit count and the Flan wrapper hands over (addr (at points 0)) and (len points), answering an empty polygon itself rather than reading out of bounds. What this buys and what it costs, stated rather than assumed. Guaranteed: the C typedef and the Flan struct are made from one defstruct, so they cannot disagree — permute the defstruct and both permute. Trusted: that the defstruct is raylib's real struct and that the declare-c is raylib's real signature. No header is read, on purpose, so the build needs libraylib linkable and not raylib-devel, and nothing here can check either half. A _Static_assert on sizeof and offsetof would have both sides coming from the same field list, so it was left out rather than mistaken for evidence. The sharper edge is the prototype: it is generated from the declaration now, so f64 where raylib says float emits double and raylib reads garbage, where before clang narrowed it at the hand-written call site. Every one of the 84 was diffed against the prototypes in the shim.c being deleted, which was the ground truth, and they agree. Strings are sized here and not per call site, because a generator has no call site to look at. 256 bytes on the stack, the heap past that, freed after the call; the only truncation left is on malloc failure. The old wrappers truncated at 256, PATH_MAX and 512 by hand.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%