The per-region begin and end includes were still four hundred and
eighty-two include lines for one repeated purpose; nothing between
regions uses the emitter names, so the set now defines once before
the first def include and undefines once after the last, and a
generated region is exactly its def include. The compiled object is
byte-identical either way - this class of change never reaches the
binary - and the migration tool emits the bare include from here
on.
Every generated region inline-carried the same emitter define set
and undefine tail, stamped out 241 times - seventeen thousand lines,
43 percent of the file - burying the code the file exists for. The
set is provably uniform (one body per name across all regions), so
one begin header and one end header replace every run and a region
is now three include lines. 41,267 lines become 18,599; 1.69
megabytes become 711 kilobytes; the compile lanes, the name-keyed
dump and the settings dump are all byte-identical. The migration
tool emits the factored form from here on.
The game AI overrides have no configuration row and no manual
assignment - upstream never saved them - so the def emits no config
row and behavior is preserved exactly.
Consuming guarded base-language rows and emitting them without the
guard resolves lookups that were null on excluded define sets; the
lookup gate now accepts exactly that transition for the migration's
own tokens and still refuses any value change or loss.
The platform-profile lanes surface pre-existing pedantic errors the
battery did not mint - the Lakka Switch configuration path carries
dozens - and each new count grew another hardcoded tolerance. A
failing lane now recompiles on the stashed parent and passes when
the error count matches exactly, so a migration is judged by what
it changes.
Array-target rows aim at nested members through an offset
expression - the custom viewport's width, height and position -
that no flat field name reaches. The def grammar gains S_INT_AT and
S_UINT_AT_EX with the offset carried verbatim in first position;
configuration rows stay literal, since the viewport keys persist
through hand-written pointer forms; the shared regions, undef
tails, enum emitter, Crowdin parser and name harness all learn the
new forms.
The quit visibility pair migrated variant-first, so the plain row
found its label string living in the level-variant def; such a row
becomes a reference like any other owned token.
The widget scale table is guarded on console and mobile targets,
but its configuration row is not - the setting persists on desktop
where the menu entry never appears. The row wrapper carried the
table guard into every pass, silently dropping the desktop
registration; caught by the settings dump as the value falling to
zero. When the captured configuration guards lack any table or row
guard, the outer wrapper now exempts the configuration pass and the
inner wrapper gates it on the row's full upstream stack.
The entanglement guard predates the level-variant grammar; a plain
row whose twin is a level-variant row now migrates first and owns
the shared strings and configuration, and the twin references it.
The array-target variants remain refused until their grammar
lands.
A level-variant row whose field also carries a plain row in another
table shares one configuration row between compile-time variants;
consuming it would stamp one variant's default onto both - the
restart-visibility twin turned the quit entry's default off in
every non-Lakka build, caught by the settings dump gate. Such rows
leave the configuration row untouched.
Action rows have no field argument, so a referenced action's
literal extraction anchored on an empty field and matched nothing;
the head pattern now adapts.
The quit action's level variant borrows both its tokens from
migrated defs; such a row contributes only its descriptor and stays
a menu-only literal, with every string and enum member at its
owner.
A level-variant row's value token may be owned by a migrated def,
where the value string rides the row rather than a literal MSG_HASH
invocation; the existence check now recognizes the row form.
A level-variant row without a sublabel consumes no base-language
spans, so the insertion anchor fell over an empty span list; such a
region anchors at the end of the file instead.
The enum-region define set was a hardcoded name list that predated
the level-variant kinds; a migrated level-variant def's include
left its row unexpanded inside the enum, truncating every member
after it. The list now carries the eight level-variant forms, whose
bodies are the label token only.
The generated table is a quarter-million rows; the optimizer buys
nothing for a straight dump and costs most of a minute per build in
the single-core fallback environment.
The A and B dump builds recompile the three largest translation
units twice per migration; dump equality does not depend on
optimization, and the single-core fallback environment spends the
whole battery budget in the optimizer. Falls back to the default
flags if the override does not link.
The def-row parser's suffix group gains the level-variant form so
the label, sublabel and value names of a migrated level-variant
setting keep resolving in the dump.
Guarded value and sublabel rows under an unguarded label row were
refused as mixed topology; the campaign's model is strings-always,
so such rows are now consumed and emitted without the guard,
trading a few string bytes on the excluded platform for one source
of truth. The context scaling pair, alternated on the OdroidGo2
define, surfaced the class.
Level-variant rows now pass through the front end, so the
entanglement guard must scan every table except the one being
migrated, and level-variant rows themselves are exempt - the guard
exists to protect a plain row from a variant twin elsewhere, not to
refuse the variant grammar it was waiting for.
The per-kind configuration regions and the base-language string
regions are shared blocks that every def's include enters; the
level-variant names now expand there - kind-matched real bodies in
the matching config region, empty elsewhere, sublabel-only in the
strings regions, since a level-variant row's value string belongs
to its value token's owner - and every region tail undefines the
new names.
Level-variant rows carry independent label and value tokens - the
quit entry that reads Restart on Lakka, the context scaling display
names, the fullscreen and windowed widget scale pair. The def
grammar gains S_BOOL_LV, S_FLOAT_LV, S_STRING_LV and S_ACTION_LV
with the value token in second position; the menu emission maps to
the SDESC level-variant descriptors, and the strings pass emits the
sublabel only, because the value string belongs to the value
token's own def and is referenced, never duplicated. Extraction,
formatting and the value-token reference checks land with the
pilot.
The message color channels persist through a packed hexadecimal key
with hand-written parsing, not through SETTING_ rows; a field
assigned outside the row tables keeps its custom persistence and
the def emits menu, string and enum semantics only.
The message color defaults shift and mask inside an outer grouping,
two nesting levels deep, which the one-level span silently skipped;
the row-count crosscheck refused the table. All span patterns now
carry the deeper alternative.
Two pre-existing pedantic initializer errors under the 3DS define,
same class as the Lakka systemd toggle; measured on the parent tree
and tolerated at exactly that count.
An achievements-guarded row mints a cheevos lane whose menu
translation unit pulls the rcheevos public headers; the compile
flag set only carried them for the preprocessor driver.
Extraction concatenated field-kind rows, plain actions and extended
actions as three groups, silently reordering any table that
interleaves them - menu display order is row order, and the third
main menu list opens with an extended action between plain ones.
Rows now merge by match position; the token gate caught the drift.
The action branch of the no-sublabel formatter emitted the correct
row and then fell into the generic field-kind emission because the
guard tested inequality with the plain action kind only; the
extended action kind matched neither and took both branches, the
second clobbering the first with an empty field argument and the
wrong arity.
The systemd service toggle's pre-existing pedantic noise was
tolerated only when the lane flag was exactly the Lakka define; a
row guarded by Lakka in conjunction with another define builds a
compound lane that carries the same noise.
The webdav settings struct members exist only when networking is
built, so a lane toggling the cloud sync define alone cannot
compile the cloud sync def; the couple table carries the
implication.
The lanes derive their defines from row guard tokens, but some
tokens only appear alongside a partner in any real build - the iOS
SDK conditional rides with the build system's own IOS define, and a
lane carrying one without the other compiles a target that does not
exist. The silent-mode row guards on the SDK conditional while its
settings member guards on the build define, which surfaced the
class.
The 509-character figure is a minimum translation capacity, not a
ceiling any target compiler enforces; sublabels routinely exceed it
and the desktop menu group moved the first one long enough to trip
the pedantic lanes.
Trailing-only reference support could not express a table whose
owned rows interleave with its own, like the audio device group
whose microphone rows sit second and fourth; the reference rows now
ride inside the def itself as raw descriptor lines emitted only in
the menu pass, preserving row order at any position, with their
platform guards carried.
The array-backed config region lives in populate_settings_array,
which no def has needed before; creating it from the integer
region's anchor put string emission inside the wrong function. The
plain string kind joins the directory and path kinds in keeping its
configuration row literal until the arrays region gets a proper
anchor.
The region tails undefined the base and no-sublabel emitter names
but not the help variants, so a region that defined a help form
leaked it into the next region of a different kind; the microphone
device string row expanded with the string body inside the integer
populate function through exactly that leak. The tool emits the
full undef set for new regions and every shipped tail is
retrofitted.
A table can mix rows of its own with rows whose token strings are
already owned by another def file; the owned rows keep their
literal descriptor after the generated include, preserving order,
and only trailing reference rows are supported - anything else
still fails with the owner named. The audio skew group references
the microphone block frames setting and surfaced the class.
The enum stage's pre dump is taken mid-run, before the def file is
included anywhere in the enum header, so a token whose label string
was first introduced by this migration's census rows resolves to
null in pre and to its canonical name in post. That exact
transition, restricted to the migrating rows' own names, is now
accepted; any other difference still fails.
Tables in the menu translation unit carry no textual menu guard,
but their configuration rows can sit under one - or under any
narrower platform conditional - and a default referencing menu-only
symbols must not reach the config pass on builds that lack them.
The config-row guard stack, minus what the table guard already
implies, now wraps the def row for the config pass only; the
history-icons default is a menu enum and surfaced the class.
The owner search matched the token in first argument position only,
the action shape; a field-kind def row carries the field first, so
shared tokens like the per-driver GPU index reported a bare value
miss instead of naming their owner.
A conditional split across physical lines with a continuation was
captured as its first line only, truncating the condition and
leaking the backslash into the flattened guard expression - the
window-position table sits under exactly such a two-line guard.
Both the enclosing walker and the body scanner now join
continuations before classification.
Platform SDK includes carry directory components; flattening the
stub to its basename leaves the include unresolvable and the healer
looping on the same header. The stub now mirrors the include path
under the stub root.
Migrations now land from more than one workstation; a name chosen
locally can collide with a def file that arrived upstream in the
meantime, silently clobbering the other setting's single source.
The target def name must be fresh.
The extended action signature carries the name second, before the
descriptor arguments; the formatter emitted the span first, landing
a display flag in the name slot - caught by the us TU lane on the
first extended action row. Plain action rows have an empty span and
were unaffected.
The October attempt failed under MSVC's traditional preprocessor
because of the alias-prelude machinery built around the extended
descriptor macros, which expanded to nothing and emptied or
truncated tables. The macros themselves are plain single-level
struct initializers, the same construct class the base grammar and
the five kinds added since have compiled under cl for the whole
campaign, so this re-land is a straight replay of that proven
wiring: one-time consumer define-set extensions everywhere with _H
forms alongside, kind-matched configuration bodies in the five
regions, the parsers carrying the marker as a suffix group with
ordered renumbering, extraction and the guard scan accepting the
row heads, and direct emission maps onto the extended macros. No
aliasing, no chaining, no preprocessor construct that is not
already green in over a hundred def files.
A submenu entry can appear in more than one descriptor table; once
one table's migration takes ownership of the token's strings and
enum triple, the other table's literal row is a pure reference that
compiles against the region-provided members and needs no def of
its own. The value-lookup failure now says which def file owns the
token instead of a bare assert.
A menu row guarded by HAVE_MIST makes the per-guard pedantic lane
compile menu_setting.c with the flag set, pulling steam.h and its
external mist.h; the self-healing stub directory the token gate
already uses now serves the pedantic lanes too.
The no-sublabel branch fell through to the generic field-kind
formatter for actions, emitting a five-argument S_ACTION_NS row
against a three-parameter name; the branch now mirrors the action
special case.
An action row whose token carries a help string must emit the _H
form so the enum region keeps the help member; the formatter
dropped the marker and the consolidated region lost the enum out
from under its string row.