Usecode pseudocode
This commit is contained in:
parent
f92d1504fa
commit
c12bb39437
1362 changed files with 71072 additions and 38056 deletions
|
|
@ -24,6 +24,7 @@ from dataclasses import asdict, dataclass
|
|||
|
||||
DEFAULT_INPUT = pathlib.Path(r"k:\ghidra\Crusader_Decomp\USECODE\EUSECODE.FLX")
|
||||
DEFAULT_OUTPUT = pathlib.Path(r"k:\ghidra\Crusader_Decomp\USECODE\EUSECODE_extracted")
|
||||
DEFAULT_VALIDATION_PROFILE = "auto"
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
|
|
@ -258,6 +259,29 @@ def classify_event_family(chunk: ExtractedChunk) -> str:
|
|||
return "environmental-event"
|
||||
if "typeNpc" in chunk.field_names:
|
||||
return "npc-trigger"
|
||||
|
||||
|
||||
def normalize_validation_profile(value: str | None) -> str:
|
||||
if value is None:
|
||||
return DEFAULT_VALIDATION_PROFILE
|
||||
normalized = value.strip().lower()
|
||||
if normalized not in {"auto", "remorse", "regret", "none"}:
|
||||
raise ValueError(f"unsupported validation profile: {value}")
|
||||
return normalized
|
||||
|
||||
|
||||
def infer_validation_profile(input_path: pathlib.Path, output_path: pathlib.Path) -> str:
|
||||
combined_parts = [part.upper() for part in (*input_path.parts, *output_path.parts)]
|
||||
if "REGRET" in combined_parts:
|
||||
return "regret"
|
||||
return "remorse"
|
||||
|
||||
|
||||
def resolve_validation_profile(input_path: pathlib.Path, output_path: pathlib.Path, requested: str | None) -> str:
|
||||
normalized = normalize_validation_profile(requested)
|
||||
if normalized == "auto":
|
||||
return infer_validation_profile(input_path, output_path)
|
||||
return normalized
|
||||
return "specialized-event"
|
||||
|
||||
|
||||
|
|
@ -549,44 +573,59 @@ IMMORTALITY_BODY_MOTIFS: tuple[tuple[str, bytes], ...] = (
|
|||
)
|
||||
|
||||
|
||||
VERIFIED_REPEATED_FAMILY_ROW_EXPECTATIONS: tuple[RepeatedFamilyRowExpectation, ...] = (
|
||||
RepeatedFamilyRowExpectation("JELYHACK", 0x01, 0x002A, 0x00000001, 0x00D4, 0x00FE, 42, "referent-anchor-twin/shared-slot-0x01/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("JELYH2", 0x01, 0x002A, 0x00000001, 0x00D4, 0x00FE, 42, "referent-anchor-twin/shared-slot-0x01/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("AND_BOOT", 0x0A, 0x0253, 0x00000001, 0x00D4, 0x0327, 595, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("AND_BOOT", 0x0F, 0x0237, 0x00000254, 0x0327, 0x055E, 567, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("AND_BOOT", 0x10, 0x003B, 0x0000048B, 0x055E, 0x0599, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("BRO_BOOT", 0x0A, 0x02D5, 0x00000001, 0x00D4, 0x03A9, 725, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("BRO_BOOT", 0x0F, 0x024C, 0x000002D6, 0x03A9, 0x05F5, 588, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("BRO_BOOT", 0x10, 0x003B, 0x00000522, 0x05F5, 0x0630, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("COR_BOOT", 0x0A, 0x0227, 0x00000001, 0x00D4, 0x02FB, 551, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("COR_BOOT", 0x0F, 0x0234, 0x00000228, 0x02FB, 0x052F, 564, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("COR_BOOT", 0x10, 0x003B, 0x0000045C, 0x052F, 0x056A, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("REE_BOOT", 0x0A, 0x034B, 0x00000001, 0x00D4, 0x041F, 843, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("REE_BOOT", 0x0F, 0x025C, 0x0000034C, 0x041F, 0x067B, 604, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("REE_BOOT", 0x10, 0x003B, 0x000005A8, 0x067B, 0x06B6, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("VAR_BOOT", 0x0A, 0x029A, 0x00000001, 0x00D4, 0x036E, 666, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("VAR_BOOT", 0x0F, 0x0244, 0x0000029B, 0x036E, 0x05B2, 580, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("VAR_BOOT", 0x10, 0x003B, 0x000004DF, 0x05B2, 0x05ED, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x01, 0x0051, 0x000000D2, 0x01B7, 0x0208, 81, "callback-eventtrigger/shared-slot-0x01/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x0A, 0x00D1, 0x00000001, 0x00E6, 0x01B7, 209, "callback-eventtrigger/shared-slot-0x0A/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x20, 0x02BA, 0x00000123, 0x0208, 0x04C2, 698, "callback-eventtrigger/shared-slot-0x20/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x21, 0x0709, 0x000003DD, 0x04C2, 0x0BCB, 1801, "callback-eventtrigger/shared-slot-0x21/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x22, 0x01A3, 0x00000AE6, 0x0BCB, 0x0D6E, 419, "callback-eventtrigger/shared-slot-0x22/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x01, 0x00F7, 0x000000D2, 0x01B7, 0x02AE, 247, "callback-eventtrigger/shared-slot-0x01/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x0A, 0x00D1, 0x00000001, 0x00E6, 0x01B7, 209, "callback-eventtrigger/shared-slot-0x0A/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x20, 0x02BA, 0x000001C9, 0x02AE, 0x0568, 698, "callback-eventtrigger/shared-slot-0x20/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x21, 0x0655, 0x00000483, 0x0568, 0x0BBD, 1621, "callback-eventtrigger/shared-slot-0x21/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x22, 0x01A3, 0x00000AD8, 0x0BBD, 0x0D60, 419, "callback-eventtrigger/shared-slot-0x22/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("FLAMEBOX", 0x0A, 0x026A, 0x00000001, 0x00E0, 0x034A, 618, "environmental-event/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("FLAMEBOX", 0x20, 0x01AC, 0x0000026B, 0x034A, 0x04F6, 428, "environmental-event/shared-slot-0x20/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("FLAMEBOX", 0x21, 0x029A, 0x00000417, 0x04F6, 0x0790, 666, "environmental-event/shared-slot-0x21/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("NOSTRIL", 0x0A, 0x00C0, 0x00000001, 0x00E0, 0x01A0, 192, "environmental-event/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("NOSTRIL", 0x20, 0x0129, 0x000000C1, 0x01A0, 0x02C9, 297, "environmental-event/shared-slot-0x20/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("NOSTRIL", 0x21, 0x01BE, 0x000001EA, 0x02C9, 0x0487, 446, "environmental-event/shared-slot-0x21/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("STEAMBOX", 0x0A, 0x0266, 0x00000001, 0x00E0, 0x0346, 614, "environmental-event/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("STEAMBOX", 0x20, 0x01F6, 0x00000267, 0x0346, 0x053C, 502, "environmental-event/shared-slot-0x20/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("STEAMBOX", 0x21, 0x02A7, 0x0000045D, 0x053C, 0x07E3, 679, "environmental-event/shared-slot-0x21/shared-slot-template"),
|
||||
)
|
||||
VERIFIED_REPEATED_FAMILY_ROW_EXPECTATIONS_BY_PROFILE: dict[str, tuple[RepeatedFamilyRowExpectation, ...]] = {
|
||||
"remorse": (
|
||||
RepeatedFamilyRowExpectation("JELYHACK", 0x01, 0x002A, 0x00000001, 0x00D4, 0x00FE, 42, "referent-anchor-twin/shared-slot-0x01/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("JELYH2", 0x01, 0x002A, 0x00000001, 0x00D4, 0x00FE, 42, "referent-anchor-twin/shared-slot-0x01/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("AND_BOOT", 0x0A, 0x0253, 0x00000001, 0x00D4, 0x0327, 595, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("AND_BOOT", 0x0F, 0x0237, 0x00000254, 0x0327, 0x055E, 567, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("AND_BOOT", 0x10, 0x003B, 0x0000048B, 0x055E, 0x0599, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("BRO_BOOT", 0x0A, 0x02D5, 0x00000001, 0x00D4, 0x03A9, 725, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("BRO_BOOT", 0x0F, 0x024C, 0x000002D6, 0x03A9, 0x05F5, 588, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("BRO_BOOT", 0x10, 0x003B, 0x00000522, 0x05F5, 0x0630, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("COR_BOOT", 0x0A, 0x0227, 0x00000001, 0x00D4, 0x02FB, 551, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("COR_BOOT", 0x0F, 0x0234, 0x00000228, 0x02FB, 0x052F, 564, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("COR_BOOT", 0x10, 0x003B, 0x0000045C, 0x052F, 0x056A, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("REE_BOOT", 0x0A, 0x034B, 0x00000001, 0x00D4, 0x041F, 843, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("REE_BOOT", 0x0F, 0x025C, 0x0000034C, 0x041F, 0x067B, 604, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("REE_BOOT", 0x10, 0x003B, 0x000005A8, 0x067B, 0x06B6, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("VAR_BOOT", 0x0A, 0x029A, 0x00000001, 0x00D4, 0x036E, 666, "boot-event-core/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("VAR_BOOT", 0x0F, 0x0244, 0x0000029B, 0x036E, 0x05B2, 580, "boot-event-core/shared-slot-0x0F/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("VAR_BOOT", 0x10, 0x003B, 0x000004DF, 0x05B2, 0x05ED, 59, "boot-event-core/shared-slot-0x10/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x01, 0x0051, 0x000000D2, 0x01B7, 0x0208, 81, "callback-eventtrigger/shared-slot-0x01/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x0A, 0x00D1, 0x00000001, 0x00E6, 0x01B7, 209, "callback-eventtrigger/shared-slot-0x0A/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x20, 0x02BA, 0x00000123, 0x0208, 0x04C2, 698, "callback-eventtrigger/shared-slot-0x20/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x21, 0x0709, 0x000003DD, 0x04C2, 0x0BCB, 1801, "callback-eventtrigger/shared-slot-0x21/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMNS", 0x22, 0x01A3, 0x00000AE6, 0x0BCB, 0x0D6E, 419, "callback-eventtrigger/shared-slot-0x22/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x01, 0x00F7, 0x000000D2, 0x01B7, 0x02AE, 247, "callback-eventtrigger/shared-slot-0x01/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x0A, 0x00D1, 0x00000001, 0x00E6, 0x01B7, 209, "callback-eventtrigger/shared-slot-0x0A/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x20, 0x02BA, 0x000001C9, 0x02AE, 0x0568, 698, "callback-eventtrigger/shared-slot-0x20/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x21, 0x0655, 0x00000483, 0x0568, 0x0BBD, 1621, "callback-eventtrigger/shared-slot-0x21/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("SURCAMEW", 0x22, 0x01A3, 0x00000AD8, 0x0BBD, 0x0D60, 419, "callback-eventtrigger/shared-slot-0x22/same-length-template"),
|
||||
RepeatedFamilyRowExpectation("FLAMEBOX", 0x0A, 0x026A, 0x00000001, 0x00E0, 0x034A, 618, "environmental-event/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("FLAMEBOX", 0x20, 0x01AC, 0x0000026B, 0x034A, 0x04F6, 428, "environmental-event/shared-slot-0x20/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("FLAMEBOX", 0x21, 0x029A, 0x00000417, 0x04F6, 0x0790, 666, "environmental-event/shared-slot-0x21/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("NOSTRIL", 0x0A, 0x00C0, 0x00000001, 0x00E0, 0x01A0, 192, "environmental-event/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("NOSTRIL", 0x20, 0x0129, 0x000000C1, 0x01A0, 0x02C9, 297, "environmental-event/shared-slot-0x20/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("NOSTRIL", 0x21, 0x01BE, 0x000001EA, 0x02C9, 0x0487, 446, "environmental-event/shared-slot-0x21/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("STEAMBOX", 0x0A, 0x0266, 0x00000001, 0x00E0, 0x0346, 614, "environmental-event/shared-slot-0x0A/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("STEAMBOX", 0x20, 0x01F6, 0x00000267, 0x0346, 0x053C, 502, "environmental-event/shared-slot-0x20/shared-slot-template"),
|
||||
RepeatedFamilyRowExpectation("STEAMBOX", 0x21, 0x02A7, 0x0000045D, 0x053C, 0x07E3, 679, "environmental-event/shared-slot-0x21/shared-slot-template"),
|
||||
),
|
||||
"regret": (
|
||||
RepeatedFamilyRowExpectation("JELYHACK", 0x01, 0x000D, 0x00000001, 0x00D4, 0x00E1, 13, ""),
|
||||
RepeatedFamilyRowExpectation("JELYH2", 0x01, 0x000D, 0x00000001, 0x00D4, 0x00E1, 13, ""),
|
||||
RepeatedFamilyRowExpectation("FLAMEBOX", 0x0A, 0x01D8, 0x00000001, 0x00E0, 0x02B8, 472, ""),
|
||||
RepeatedFamilyRowExpectation("FLAMEBOX", 0x20, 0x011D, 0x000001D9, 0x02B8, 0x03D5, 285, ""),
|
||||
RepeatedFamilyRowExpectation("FLAMEBOX", 0x21, 0x01BD, 0x000002F6, 0x03D5, 0x0592, 445, ""),
|
||||
RepeatedFamilyRowExpectation("NOSTRIL", 0x0A, 0x007B, 0x00000001, 0x00E0, 0x015B, 123, ""),
|
||||
RepeatedFamilyRowExpectation("NOSTRIL", 0x20, 0x00BE, 0x0000007C, 0x015B, 0x0219, 190, ""),
|
||||
RepeatedFamilyRowExpectation("NOSTRIL", 0x21, 0x013B, 0x0000013A, 0x0219, 0x0354, 315, ""),
|
||||
RepeatedFamilyRowExpectation("STEAMBOX", 0x0A, 0x01D7, 0x00000001, 0x00E0, 0x02B7, 471, ""),
|
||||
RepeatedFamilyRowExpectation("STEAMBOX", 0x20, 0x014F, 0x000001D8, 0x02B7, 0x0406, 335, ""),
|
||||
RepeatedFamilyRowExpectation("STEAMBOX", 0x21, 0x01CD, 0x00000327, 0x0406, 0x05D3, 461, ""),
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
def scummvm_event_name_hint(slot: int) -> str | None:
|
||||
|
|
@ -936,19 +975,28 @@ def validate_verified_repeated_family_regressions(
|
|||
parsed_class_chunks: list[ExtractedChunk],
|
||||
rows_by_entry: dict[int, list[ClassEventRow]],
|
||||
repeated_status_by_row: dict[tuple[int, int], str],
|
||||
validation_profile: str,
|
||||
) -> list[str]:
|
||||
chunk_by_label = {
|
||||
chunk.primary_label: chunk
|
||||
for chunk in parsed_class_chunks
|
||||
if chunk.primary_label
|
||||
}
|
||||
expected_slots_by_class: dict[str, set[int]] = {}
|
||||
for expectation in VERIFIED_REPEATED_FAMILY_ROW_EXPECTATIONS:
|
||||
expected_slots_by_class.setdefault(expectation.class_name, set()).add(expectation.slot)
|
||||
|
||||
report_lines = [
|
||||
"record_type\tclass_name\tslot\texpected\tactual\tstatus"
|
||||
]
|
||||
expectations = VERIFIED_REPEATED_FAMILY_ROW_EXPECTATIONS_BY_PROFILE.get(validation_profile)
|
||||
if not expectations:
|
||||
report_lines.append(
|
||||
f"meta\t*\t*\tprofile-baseline\t{validation_profile}\tskipped"
|
||||
)
|
||||
return report_lines
|
||||
|
||||
chunk_by_label: dict[str, ExtractedChunk] = {}
|
||||
for chunk in parsed_class_chunks:
|
||||
if chunk.primary_label:
|
||||
chunk_by_label.setdefault(chunk.primary_label, chunk)
|
||||
if chunk.class_name_hint:
|
||||
chunk_by_label.setdefault(chunk.class_name_hint, chunk)
|
||||
expected_slots_by_class: dict[str, set[int]] = {}
|
||||
for expectation in expectations:
|
||||
expected_slots_by_class.setdefault(expectation.class_name, set()).add(expectation.slot)
|
||||
|
||||
errors: list[str] = []
|
||||
|
||||
for class_name, expected_slots in sorted(expected_slots_by_class.items()):
|
||||
|
|
@ -974,7 +1022,7 @@ def validate_verified_repeated_family_regressions(
|
|||
f"{class_name}: expected non-zero slots {sorted(expected_slots)}, found {sorted(actual_slots)}"
|
||||
)
|
||||
|
||||
for expectation in VERIFIED_REPEATED_FAMILY_ROW_EXPECTATIONS:
|
||||
for expectation in expectations:
|
||||
chunk = chunk_by_label.get(expectation.class_name)
|
||||
if chunk is None:
|
||||
errors.append(f"missing repeated-family class {expectation.class_name}")
|
||||
|
|
@ -2686,9 +2734,17 @@ def extract_candidates(data: bytes, out_dir: pathlib.Path, entries: list[Candida
|
|||
return extracted
|
||||
|
||||
|
||||
def write_summary(out_dir: pathlib.Path, input_path: pathlib.Path, data: bytes, entries: list[CandidateEntry], chunks: list[ExtractedChunk]) -> None:
|
||||
def write_summary(
|
||||
out_dir: pathlib.Path,
|
||||
input_path: pathlib.Path,
|
||||
data: bytes,
|
||||
entries: list[CandidateEntry],
|
||||
chunks: list[ExtractedChunk],
|
||||
validation_profile: str,
|
||||
) -> None:
|
||||
summary = {
|
||||
"input_path": str(input_path),
|
||||
"validation_profile": validation_profile,
|
||||
"file_size": len(data),
|
||||
"header_preview_hex": data[:128].hex(),
|
||||
"header_preview_ascii": ascii_preview(data[:128], 128),
|
||||
|
|
@ -2767,6 +2823,7 @@ def write_summary(out_dir: pathlib.Path, input_path: pathlib.Path, data: bytes,
|
|||
parsed_class_chunks,
|
||||
rows_by_entry,
|
||||
repeated_status_by_row,
|
||||
validation_profile,
|
||||
)
|
||||
for chunk in parsed_class_chunks:
|
||||
class_layout_lines.append(
|
||||
|
|
@ -3021,21 +3078,30 @@ def parse_args() -> argparse.Namespace:
|
|||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("input", nargs="?", type=pathlib.Path, default=DEFAULT_INPUT)
|
||||
parser.add_argument("output", nargs="?", type=pathlib.Path, default=DEFAULT_OUTPUT)
|
||||
parser.add_argument(
|
||||
"--validation-profile",
|
||||
choices=["auto", "remorse", "regret", "none"],
|
||||
default=DEFAULT_VALIDATION_PROFILE,
|
||||
help="Repeated-family regression baseline to enforce (default: auto)",
|
||||
)
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main() -> int:
|
||||
args = parse_args()
|
||||
validation_profile = resolve_validation_profile(args.input, args.output, args.validation_profile)
|
||||
data = args.input.read_bytes()
|
||||
args.output.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
flx_table = parse_flx_table(data)
|
||||
entries = flx_table.entries
|
||||
chunks = extract_candidates(data, args.output, entries)
|
||||
write_summary(args.output, args.input, data, entries, chunks)
|
||||
write_summary(args.output, args.input, data, entries, chunks, validation_profile)
|
||||
|
||||
print(
|
||||
f"Parsed {flx_table.entry_count} table slots with {len(chunks)} non-zero entries; extracted to {args.output}"
|
||||
"Parsed "
|
||||
f"{flx_table.entry_count} table slots with {len(chunks)} non-zero entries; "
|
||||
f"validation profile {validation_profile}; extracted to {args.output}"
|
||||
)
|
||||
return 0
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue