• src/sbbs3/prntfile.cpp sbbs.h

    From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Friday, February 27, 2026 23:16:07
    https://gitlab.synchro.net/main/sbbs/-/commit/9c7f64c78765392e841b28a3
    Modified Files:
    src/sbbs3/prntfile.cpp sbbs.h
    Log Message:
    Pass the print mode to printfile(..., P_SEEK) all the way down to bstrlen()

    So extended color codes (e.g. PCBoard, Wildcat, etc.) are accounted for in
    line lengths calculated for P_SEEK mode.

    Caught during code review with Deuce.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Sunday, April 26, 2026 15:01:46
    https://gitlab.synchro.net/main/sbbs/-/commit/22c55d7dcccee48a9bdd7348
    Modified Files:
    src/sbbs3/prntfile.cpp sbbs.h
    Log Message:
    printfile() now handles files >= 2GiB

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Sunday, June 21, 2026 19:59:10
    https://gitlab.synchro.net/main/sbbs/-/commit/151b9b5ca731ca626b28ceaf
    Modified Files:
    src/sbbs3/prntfile.cpp sbbs.h
    Log Message:
    Fix custom-shell menus showing the stock menu instead of the override-dir file

    When a command shell sets a menu sub-directory override (menu_dir), menu file lookups are supposed to search that subdir before the default text/menu dir. Commit d3123dd1ae (vampire-14-reset) added that default-dir fallback, but implemented it *inside* menu_exists() on a per-extension basis. Because the terminal-type extension priority loop lives one level up in menu() (rip, mon, ans, seq, msg, asc), a higher-priority extension that exists only in the default dir would preempt a customized lower-priority extension in the override subdir: e.g. with menu_dir="errol_", a custom errol_/main.asc was shadowed by the stock text/menu/main.msg, because menu() asked menu_exists(code,"msg") (which fell back to the default dir and matched) before ever trying .asc in the subdir. Result: the stock "classic" menu was displayed while the custom shell's keystroke handling still worked -- as reported by Errol Casey (Amessyroom) on sync_sysops.

    Move the subdir->default fallback out to wrap the *entire* extension search, in both menu() and the NULL-ext path of menu_exists(), so the override subdir is exhausted across all extensions before the default dir is consulted at all. Factor the single-dir, single-extension lookup into a new no-fallback helper menu_exists_in(). Direct callers of menu_exists() (including the JS bbs.menu_exists() binding, str.cpp info-file checks, and random_menu()) keep the two-pass fallback and their existing boolean contract.

    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Sunday, July 05, 2026 16:57:04
    https://gitlab.synchro.net/main/sbbs/-/commit/e0288fcd8fba606945e5ee0e
    Modified Files:
    src/sbbs3/prntfile.cpp sbbs.h
    Log Message:
    Fix mods/text files shadowed by stock files w/ higher-priority extensions

    A mods/text (or mods/text/menu) override file was silently shadowed by a
    stock text/ file whenever the stock file used a higher-priority extension
    for the caller's terminal type: e.g. with mods/text/answer.asc and stock text/answer.msg both present, a CP437 caller was shown the stock .msg file because menu()'s extension priority ladder tried .msg (in both dirs) before ever trying .asc, and the mods-dir preference was applied per-extension
    inside menu_exists_in(). Worse, since the .msg/.asc order flips for ASCII-charset terminals, whether the sysop's customization was honored
    depended on the caller's terminal. Behavior dates to the introduction of mods/text support in 4f66de6561 (holes-3-create). Reported by Accession
    on IRC. Fixes issue #1182.

    Same surgery as 151b9b5ca7 (sports-3-formal), on the mods->stock fallback
    axis instead of the menu-subdir->default axis: give menu_exists_in() an explicit mods/stock tier parameter (with no cross-tier fallback) and nest
    the tier loop between the subdir loop and the extension ladder in both
    menu() and menu_exists(), so the search order is mods/<subdir> ->
    text/<subdir> -> mods/ -> text/, each exhausted across all applicable extensions before the next is consulted.

    This also fixes a latent quirk: width-variant files (e.g. .40col.ans,
    .c80.ans) in the mods dir were only found when a plain same-extension mods
    file also existed, since the old per-extension mods check keyed off the
    plain file's existence before probing width variants.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net