• v1.21 18057456f9

    v1.21 Stable

    sylvain released this 2026-03-28 17:38:22 +00:00 | 0 commits to main since this release

    Version 1.20

    New features

    • Added xxHash32 integrity checksum: every compressed G3Z file now stores a 32-bit hash of the original uncompressed data, verified automatically on decompression
    • Checksum is algorithm-agnostic: works identically for zlib and LZ4 compressed files
    • Old G3Z files (versions 1.10--1.13) without a checksum are still decompressed normally (flag 0x00 skips verification)
    • Named constants for algorithm byte codes (ALGO_BYTE_ZLIB_MAX/FAST, ALGO_BYTE_LZ4_MAX/FAST) replacing bare character literals in the file format layer
    • Checksum value in the file information popup is now displayed in hexadecimal (e.g. 0xA3F2C1B0) consistent with how hash values are conventionally represented

    Bug fixes

    • Fixed use-after-free: partial .g3z output is now correctly deleted before the path buffer is freed when compression is aborted
    • Fixed jpopup_add_empty_line(): empty separator lines were allocated but never inserted into the list and never displayed
    • Fixed popup widget used before NULL guard: jpopup_set_size() and jpopup_set_font() were called before the NULL check in init_app()
    • Fixed missing FileData argument in the non-FXCG100 build path of SquishIt_GetFileInformation() (crash / undefined behaviour on simulator)
    • Fixed buffer overflow in getfileinformation(): name_len read from file was not clamped before fread() into the 256-byte originalfilename field
    • Fixed delete_file() returning the raw remove() value (-1 on failure) instead of a defined SQUISHIT_* error code
    • Fixed unchecked fwrite() in LZ4 compression and decompression loops: write failures now propagate as SQUISHIT_WRITE_ERROR
    • Fixed unchecked fwrite() when writing the filename into the G3Z header
    • Fixed LZ4 chunk size stored/read as platform-dependent int; now explicitly uint32_t (no format change on SH4 where int is 32 bits, but correct by specification)
    • Fixed strcpy() without bounds check on FileData->filename; replaced with strncpy()

    Code quality

    • Refactored event_handling() (~215 lines) into three focused static helpers: handle_compress(), handle_decompress(), handle_info_popup()
    • Removed stale TODO comment from read_checksum() (error handling was already complete)
    • Removed dead commented-out decompress_file_zlib() function
    • Added static to clamp() in jprogressbar.c to avoid link-scope name pollution
    • Removed dead l = NULL assignment after free(l) in jpopup_poly_destroy()
    • Corrected misleading copy-paste header comment in jpopup.h (was describing a progress bar)
    • Replaced unexplained commented-out jwidget_emit() calls with an explanatory comment
    • Updated G3Z file format to version 1.20

    Version 1.21

    New features in 1.21

    • Multi-language support (English / French): all user-facing strings are now fully translated; the active language is selectable from the Settings menu
    • Persistent user settings: language, CPU overclock level and default compression algorithm are saved automatically to SquishIt.ini on the calculator storage and restored on the next launch
    • INI configuration file (SquishIt.ini): plain-text format with [Key] value entries and # comment lines; human-readable and hand-editable directly on a PC; a default file with full comments is provided and auto-created on first launch if absent
    • CPU overclock is now accessible from the Settings menu (SHIFT+MENU), allowing the user to select speeds F1 (default) through F5 without leaving the application
    • Default compression algorithm is now remembered across sessions and pre-selected on startup

    Code quality in 1.21

    • Introduced src/lang/ subsystem: lang.h (string ID enum + API), lang_en.h, lang_fr.h (translation tables), lang.c (runtime dispatch); adding a new language requires only a new lang_XX.h file
    • Introduced src/core/ini_file.h / ini_file.c: self-contained INI parser and writer; all filesystem calls are wrapped in gint_world_switch for safe OS-world access
    • Widget strings (jpopup title, jjackintheboxmenu hint bar, jfileselect empty-folder and save-as labels) are now configurable at runtime via dedicated setters, enabling live language switching without rebuilding the widget tree
    Downloads