; Orange programmer module v4.2 ; (c) 2001 CnCLab ; HPL Text search ; Пример Search text" демонстрирует поиск текста ; Пример Search вус" демонстрирует поиск и выделение байтов ; содержащих десятичные или цифры. ALLPINS=0 R9=String,S32 R10=Data,L,Byte,Nibble R11=Selection,L,Select,Deselect,Invert @ART=33 ;незаполненый массив для текста (33 символа) [!SETUP] R10=0 R11=0 ["#!Search text"] R9=0 ;array 0 select GET=("Search",R9) RA?0{EXIT} ; получить размер массива R8=@ART ; найти длину текста R5=0 LOOP(R8){ ;string size R0=@ART[I] R0?0{BREAK} ; end of string R5=+1 ; increment } R8=R5 R8?0{EXIT} ;PRINT=("Size=%u",R8) R4=0 ; find counter R7=0 ;address R6=$SIZE,R6=-R8 LOOP(R6){ ;buffer ADR=R7 LOOP(R8){ ;string size R0=DATA R1=@ART[I] R0?!R1{BREAK} ADR=+1 ;increment address } R0?R1{ ;compare Ok ; отмечаем найденное ADR=R7 LOOP(R8){MARK=1,ADR=+1} R4=+1 } R7=+1 } R4?0{PRINT=E("String '%s' not found!",@ART)} ["#!Select ASCII"] ADR=0 R1=0 ;counter init R6=0 ; mark on LOOP($SIZE){ R0=DATA R0?<0x20{R6=0,MARK=0} R0?>0x7F{R6=0,MARK=0} R6?>3{ MARK=1 R6=+1 ;PRINT=L("SEL %04X:%02X (%u)",ADR,R0,R6) } R6?<4{ MARK=0 R0?>0x1F{ R0?<0x80{ R6=+1 ;PRINT=L("FIND %04X:%02X (%u)",ADR,R0,R6) R6?>3{ ; mark text ADR=-3 ;PRINT=L("FILL %04X:%02X (%u)",ADR,R0,R6) LOOP(4){MARK=1,ADR=+1} ADR=-1 } } } } ADR=+1 } ;-------------------------------------- [_XMARK] R11?0{MARK=1} R11?1{MARK=0} R11?2{R0=MARK,R0=^1,MARK=R0} [_SBYTE] LOOP($SIZE){ ;buffer R0=DATA R0?<10{_XMARK} ADR=+1 } [_SNIBBLE] LOOP($SIZE){ ;buffer R1=0; R0=DATA,R0=&0xF, R0?<0x0A{R1=+1} R0=DATA,R0=&0xF0, R0?<0xA0{R1=+1} R1?2{_XMARK} ADR=+1 } ["#!Select Decimal"] GET=("Select",R10,R11) RA?0{EXIT} ADR=0 R10?0{_SBYTE} R10?1{_SNIBBLE}