REM List Variables utility v0.31 for use with SDLIDE.bbc REM R.T.Russell, http://www.rtrussell.co.uk/ 23-Jun-2021 Darkmode% = INSTR(@cmd$, "-dark") <> 0 *ESC OFF VDU 23,22,320;500;8,16,16,128+8 - (128 AND Darkmode%) IF INKEY(-256) = &57 THEN SYS "SetWindowText", @hwnd%, "List Variables" SYS "ShowWindow", @hwnd%, 5 *FONT Courier New,11,B ELSE SYS "SDL_SetWindowTitle", @hwnd%, "List Variables", @memhdc% SYS "SDL_ShowWindow", @hwnd%, @memhdc% OSCLI "FONT """ + @lib$ + "DejaVuSansMono"",10" ENDIF OFF Resize% = FALSE ON ERROR ERROR 0, REPORT$ : QUIT ON MOVE Resize% OR= (@msg%=5) : RETURN INSTALL @lib$ + "dlglib" INSTALL @lib$ + "sortlib" Sort%% = FN_sortinit(0,2) REM!WC Constants WS_VSCROLL = &200000 DIM ListVar$(1000), xVDU&(31), Click%(2) xVDU&() = 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,5,0,0,1,9,8,5,0,1,4,4,0,2 IF Darkmode% THEN COLOR 0, &FF, &FF, &FF COLOR 7, &40, &40, &40 COLOR 8, &80, &80, &80 COLOR 9, &7F, &7F, &7F COLOR 10, &60, &60, &60 COLOR 11, &FF, &FF, &FF COLOR 12, &00, &7F, &7F COLOR 13, &00, &7F, &FF COLOR 14, &C0, &C0, &00 COLOR 15, &10, &10, &10 ELSE PROC_setdialogpalette ENDIF Dlg% = FN_newdialog("", 0, 0) PROC_listbox(Dlg%, "", 101, 0, 0, 2 * @vdu%!208, 2 * @vdu%!212, \ \ WS_VSCROLL OR (Darkmode% AND &80000000)) ON MOUSE Click%() = @msg% AND (@wparam%<>2), @wparam%, @lparam% : RETURN IF FN_polldialog(Dlg%, 9, Click%()) REPEAT PROCtimer IF Click%(1) = 2 Click%(1) = 0 : PROC_setlistboxselect(Dlg%, 101, 0) UNTIL FN_polldialog(Dlg%, INKEY(5), Click%()) = TRUE QUIT DEF PROCtimer PRIVATE C%, S%, T%, W% IF S% ENDPROC S% = TRUE IF C% = 0 C% = 15 IF W% = 0 T% = 20 LOCAL F%, I%, L%, a$, s$ IF Resize% Resize% = FALSE : PROCresize F% = OPENIN(@tmp$ + "sdldebug.dat") IF F% THEN PTR#F% = 8 : REM Skip trace pointers L% = BGET#F% OR 1 : REM Telltale (non-zero) IF L% <> W% W% = L% : T% = 20 IF (BGET#F% AND 1) = FALSE IF NOT EOF#F% THEN s$ = GET$#F% BY (27*4) ListVar$(1) = "@% = &" + RIGHT$("0000000" + STR$~!PTR(s$), 8) FOR I% = 0 TO 12 ListVar$(I%+2) = CHR$(&41 + 2*I%) + "% = " + STR$!(I%*8+PTR(s$)+4) ListVar$(I%+2) += STRING$(18 - LEN(ListVar$(I%+2)), " ") ListVar$(I%+2) += CHR$(&42 + 2*I%) + "% = " + STR$!(I%*8+PTR(s$)+8) NEXT WHILE NOT EOF#F% AND C% < DIM(ListVar$(),1) INPUT #F%, a$ : IF ASCa$ < &41 EXIT WHILE L% = INSTR(a$, "=") IF L% = 0 L% = LEN(a$) FOR I% = 15 TO C% IF LEFT$(a$,L%) = LEFT$(ListVar$(I%),L%) THEN EXIT FOR NEXT ListVar$(I%) = a$ IF I% > C% C% = I% ENDWHILE CLOSE #F% : REM Close as soon as possible FOR I% = 0 TO C%-1 PROCfilter(ListVar$(I%)) NEXT C% -= 14 CALL Sort%%, ListVar$(15) C% += 14 I% = FN_getlistboxselect(Dlg%, 101) s$ = ListVar$(I%) *REFRESH OFF L% = FN_getlistboxscroll(Dlg%, 101) PROC_setlistboxarray(Dlg%, 101, ListVar$(), C%) PROC_setlistboxscroll(Dlg%, 101, L%) L% = INSTR(s$, "=") IF L% THEN s$ = LEFT$(s$, L%) FOR I% = 1 TO C% IF LEFT$(ListVar$(I%), L%) = s$ THEN PROC_setlistboxselect(Dlg%, 101, I%) EXIT FOR ENDIF NEXT I% ENDIF PROC_refreshdialog(Dlg%) *REFRESH ELSE CLOSE #F% ENDIF ENDIF IF T% T% -= 1 ELSE PROC_closedialog(Dlg%) : QUIT S% = FALSE ENDPROC DEF PROCfilter(RETURN a$) LOCAL L%,o%%,p%% IF a$="" ENDPROC FOR p%% = PTR(a$) TO PTR(a$) + LENa$ - 1 IF ?p%%<&20 L%=xVDU&(?p%%) : o%%=p%% : p%%+=L% : MID$(a$,o%%-PTR(a$)+1,L%+1) = "??????????" NEXT ENDPROC DEF PROCresize PRIVATE S% IF S% ENDPROC S% = TRUE VDU 26 IF POS : REM SDL thread sync Dlg% = FN_newdialog("", 0, 0) PROC_listbox(Dlg%, "", 101, 0, 0, 2 * @vdu%!208, 2 * @vdu%!212, WS_VSCROLL) S% = FALSE ENDPROC