Hladaci pes Rexo

Rexo

     Tentoraz som si pripravil pre vas nieco prakticke. Tento program vyuziju najme ti, ktori vela programuju v basicu.
     Uz sa vam urcite stala situacia, ze ste mali v pocitaci nejaky rozsiahly program v basicu a potrebovali ste najst vsetky vyskyty nejakeho prikazu - napriklad ste si chceli popozerat a skontrolovat vsetky prikazy POKE - skratka co sa kde "poukuje".
     Neostavalo vam nic ine ako pracne prezerat cely basic. Pritom sa vam mohlo velmi lahko stat, ze ste daco prehliadli. Ti, ktori maju Beta Basic to maju ovela jedoduchsie - mozu pouzit prikaz REF ktory dokaze v basicu najst vsetky vyskyty daneho objektu. Lenze Beta Basic zabera v pameti nieco vyse 18 kB (verzia 3.0) co nie je zrovna malo a preto sa pri dlhsich basicovych programoch do pameti proste nevojde.
     Riesenie tejto situacie vam ponuka nasledujuci program. Tento program spolahlivo "vynucha" aj ten najzasitejsi prikaz alebo znak. Pritom ma iba nieco vyse 1200 bajtov.
     Staci ho len prikazom MERGE nahrat k prehladavanemu basicovemu programu a spustit od riadku 7901. Po spusteni si program sam vypyta potrebne udaje - interval riadkov, v ktorom sa ma prehladavat a potom hladany znak.
     Ako hladany znak mozete zadat prakticky lubovolny znak z celej ASCII tabulky Spektra - teda nielen prikazy, ale aj pismena, znamenka, zatvorky, graficke znaky, riadiace kody...
     Akonahle sa zisti vyskyt hladaneho znaku v hladanom programe, vypise sa na obrazovku cislo riadku, cislo prikazu a potom samotny prikaz aj s parametrami, v ktorom sa hladany znak nasiel.

7901 BORDER 7: POKE 23693,56: CLS
7902 LET f=1: LET n=PEEK 23635+256*PEEK 23636: LET vars=PEEK 23627+256*PEEK 23628
7903 LET k=16383: INPUT CHR$ 8;" LINE start: ";od;" koniec: ";do;AT 0,0;"Hlada sa: ";a$: CLS
7904 LET g=0: IF od<>ABS od OR do<>ABS do THEN LET g=1: LET od=ABS od: LET do=ABS do
7905 IF n>=vars THEN STOP
7906 GO SUB 7917: LET n=n+1: GO SUB 7918: IF l<od THEN LET n=n+b+1: GO TO 7905
7907 IF l>7900 AND l<7930 THEN LET n=n+b+1: GO TO 7907
7908 LET t=n: LET n=n+1: IF l>do THEN STOP : STOP : STOP
7909 LET m=PEEK n
7910 IF m=CODE a$ THEN GO SUB 7919
7911 IF m=CODE """" THEN LET f=1-f
7912 IF f AND (m=CODE ":" OR m=CODE " THEN ") THEN LET s=s+1: LET t=n
7913 IF m=14 THEN LET n=n+5
7914 LET n=n+1
7915 IF m=13 THEN GO TO 7905
7916 GO TO 7909
7917 LET s=1: LET l=PEEK (n+1)+256*PEEK n: LET n=n+1: RETURN
7918 LET b=PEEK n+256*PEEK (n+1): LET n=n+1: RETURN
7919 PRINT PAPER 5;l;",";s;: PRINT TAB 8;: LET f=1: LET n=t
7920 LET n=n+1: LET m=PEEK n
7921 IF m=CODE """" THEN LET f=1-f
7922 IF f AND (m=58 OR m=13) THEN PRINT : RETURN
7923 IF m=14 THEN GO SUB 7926: LET n=n+5: PRINT PAPER 6;"=";c;: GO TO 7920
7924 IF g THEN POKE 23692,255
7925 PRINT CHR$ m;: GO TO 7920
7926 IF NOT PEEK (n+1) THEN LET c=PEEK (n+3)+256*PEEK (n+4): RETURN
7927 LET c=2*(.5+PEEK (n+2)/256+PEEK (n+3)/65536+PEEK (n+4)/16777216+PEEK (n+5)/4.2949673e9)*2^(PEEK (n+1)-129): RETURN

     Tento program dokaze este jednu velmi uzitocnu vec - pri vsetkych ciselnych konstantach v programe vypise ich skutocnu hodnotu danu piatimi bajtami nasledujucimi po kode 14. Pomocu tejto funkcie mozete odhalovat tie zakerne basicy, ktore pri listingu ukazuju ine hodnoty nez v nich skutocne su. Ked zadate prave CHR$ 14 ako hladany znak, tak vam tento program najde vsetky ciselne konstanty v basicu.
     Iste ste si vsimli pomerne nezvycajne cisla riadkov. Tieto cisla riadkov boli volene tak, aby sa dal tento program bez problemov "primergnut" do prehladavaneho basicu. Malo by to byt bez problemov, pretoze pravdepodobnost vyskytu takychto riadkov v inych programoch je velmi mala.
     Na riadku 7907 je test ktory zabezpeci aby pri prehladavani daneho basicu tento program sam seba preskocil. Na poslednych dvoch riadkoch programu je vypocet ciselnej hodnoty z piatich bajtov po kode 14.
     Komu by sa zdalo, ze program pracuje prilis pomaly, moze si ho skompilovat. Cely program pracuje iba s celymi cislami okrem vypoctu hodnoty piatich bajtov po kode 14 na poslednych dvoch riadkoch.
     Na zaver jedna drobna rada: Ak by ste pri zadavani hladaneho znaku nevedeli napisat nejaky prikaz ktory sa pise kurzorom "K" tak najprv napiste THEN - za tymto THEN sa vam objavi kurzor "K" - potom napiste dany prikaz a THEN deletnite.