mirror of
https://github.com/forth-ev/VolksForth.git
synced 2024-11-29 21:49:17 +00:00
205 lines
12 KiB
Forth
205 lines
12 KiB
Forth
|
\ *** Block No. 0 Hexblock 0
|
|||
|
\\ *** Strings *** 13oct86we
|
|||
|
|
|||
|
Dieses File enth<EFBFBD>lt einige Grundworte zur Stringverarbeitung,
|
|||
|
vor allem ein SEARCH f<EFBFBD>r den Editor. Ebenfalls sind Worte
|
|||
|
zur Umwandlung von counted Strings (Forth) in 0-terminated
|
|||
|
Strings, wie sie z.B. vom Betriebssystem oft benutzt werden,
|
|||
|
vorhanden.
|
|||
|
|
|||
|
Beim SEARCH entscheidet die Variable CAPS , ob Gro<EFBFBD>- und
|
|||
|
Kleinschreibung unterschieden wird oder nicht. Ist CAPS ON,
|
|||
|
so werden gro<EFBFBD>e und kleine Buchstaben gefunden, die Suche dau-
|
|||
|
ert allerdings l<EFBFBD>nger.
|
|||
|
|
|||
|
c>0" wandelt einen String mit f<EFBFBD>hrendem Countbyte in einen
|
|||
|
mit 0 abgschlossenen, wie er vom Betriebssystem oft gebraucht
|
|||
|
wird. 0>c" arbeitet umgekehrt.
|
|||
|
\ *** Block No. 1 Hexblock 1
|
|||
|
\ String Functions Loadscreen 25may86we
|
|||
|
|
|||
|
1 4 +thru
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\ *** Block No. 2 Hexblock 2
|
|||
|
\ -text 13oct86we
|
|||
|
|
|||
|
Variable caps caps off
|
|||
|
|
|||
|
Code -text ( addr0 len addr1 -- n )
|
|||
|
SP )+ D6 move D6 reg) A1 lea
|
|||
|
SP )+ D0 move 0= IF SP ) clr Next THEN 1 D0 subq
|
|||
|
SP )+ D6 move D6 reg) A0 lea
|
|||
|
Label comp
|
|||
|
.b A0 )+ A1 )+ cmpm comp D0 dbne
|
|||
|
.w D0 clr .b A0 -) D0 move A1 -) D0 sub .w D0 ext
|
|||
|
D0 SP -) move Next end-code
|
|||
|
|
|||
|
Label >upper ( D3 -> D3 ) .b Ascii a D3 cmpi
|
|||
|
>= IF Ascii z D3 cmpi <= IF bl D3 subi THEN THEN rts
|
|||
|
|
|||
|
\ *** Block No. 3 Hexblock 3
|
|||
|
\ -capstext compare 13oct86we
|
|||
|
|
|||
|
| Code -capstext ( addr0 len addr1 -- n )
|
|||
|
SP )+ D6 move D6 reg) A1 lea
|
|||
|
SP )+ D0 move 0= IF SP ) clr Next THEN 1 D0 subq
|
|||
|
SP )+ D6 move D6 reg) A0 lea
|
|||
|
Label capscomp
|
|||
|
.b A0 )+ D3 move >upper bsr D3 D1 move
|
|||
|
A1 )+ D3 move >upper bsr D3 D2 move
|
|||
|
D1 D2 cmp capscomp D0 dbne .w D1 clr
|
|||
|
.b A0 -) D3 move >upper bsr D3 D1 move
|
|||
|
A1 -) D3 move >upper bsr D3 D2 move
|
|||
|
.b D2 D1 sub .w D1 SP -) move Next end-code
|
|||
|
|
|||
|
: compare ( addr0 len addr1 -- n )
|
|||
|
caps @ IF -capstext ELSE -text THEN ;
|
|||
|
\ *** Block No. 4 Hexblock 4
|
|||
|
\ search delete insert 10aug86we
|
|||
|
|
|||
|
: search ( text textlen buf buflen -- offset flag )
|
|||
|
over >r 2 pick - 3 pick c@ >r
|
|||
|
BEGIN caps @ 0= IF r@ scan THEN ?dup
|
|||
|
WHILE >r >r 2dup r@ compare
|
|||
|
0= IF 2drop r> rdrop rdrop r> - true exit THEN
|
|||
|
r> r> 1 /string REPEAT -rot 2drop rdrop r> - false ;
|
|||
|
|
|||
|
: delete ( buffer size count -- )
|
|||
|
over min >r r@ - ( left over ) dup 0>
|
|||
|
IF 2dup swap dup r@ + -rot swap cmove THEN
|
|||
|
+ r> bl fill ;
|
|||
|
|
|||
|
: insert ( string length buffer size -- )
|
|||
|
rot over min >r r@ - over dup r@ + rot cmove> r> cmove ;
|
|||
|
\ *** Block No. 5 Hexblock 5
|
|||
|
\ String operators 13oct86we
|
|||
|
|
|||
|
Variable $sum \ pointer to stringsum
|
|||
|
: $add ( addr len -- ) dup >r
|
|||
|
$sum @ count + swap move $sum @ dup c@ r> + swap c! ;
|
|||
|
|
|||
|
: c>0" ( addr -- )
|
|||
|
count >r dup 1- under r@ cmove r> + 0 swap c! ;
|
|||
|
: 0>c" ( addr -- )
|
|||
|
dup >r true false scan nip negate 1-
|
|||
|
r@ dup 1+ 2 pick cmove> r> c! ;
|
|||
|
|
|||
|
: ,0" Ascii " parse 1+ here over allot place
|
|||
|
0 c, align ; restrict
|
|||
|
: 0" state @ IF compile (" ,0" compile 1+ exit THEN
|
|||
|
here 1+ ,0" ; immediate
|
|||
|
\ *** Block No. 6 Hexblock 6
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\ *** Block No. 7 Hexblock 7
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\ *** Block No. 8 Hexblock 8
|
|||
|
\ -text 13oct86we
|
|||
|
|
|||
|
ist CAPS on, wird beim Suchen nicht auf Gro<EFBFBD>- Kleinschreibung
|
|||
|
geachtet.
|
|||
|
addr0 und addr1 sind die Adressen von zwei counted strings, len
|
|||
|
die Anzahl der Zeichen, die verglichen werden sollen. n liefert
|
|||
|
die Differenz der beiden ersten nicht <EFBFBD>bereinstimmenden Zeichen
|
|||
|
Ist n=0, sind beide Strings gleich.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
wandelt das Zeichen im Register D3 in den entsprechenden Gro<EFBFBD>-
|
|||
|
buchstaben.
|
|||
|
|
|||
|
\ *** Block No. 9 Hexblock 9
|
|||
|
\ -capstext compare 13oct86we
|
|||
|
|
|||
|
wie -text, jedoch wird beim Vergleich nicht nach Gro<EFBFBD>- und Klein
|
|||
|
schreibung unterschieden. Dieser Vergleich erfordert erheblich
|
|||
|
mehr Zeit und sollte daher nur in Sonderf<EFBFBD>llen benutzt werden.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
wie -text, in Abh<EFBFBD>ngigkeit von der Variablen caps wird -text
|
|||
|
oder -capstext ausgef<EFBFBD>hrt.
|
|||
|
\ *** Block No. 10 Hexblock A
|
|||
|
\ search delete insert 13oct86we
|
|||
|
|
|||
|
Im Text ab Adresse text wird in der L<EFBFBD>nge textlen nach dem
|
|||
|
String buf mit L<EFBFBD>nge buflen gesucht.
|
|||
|
Zur<EFBFBD>ckgeliefert wird ein Offset in den durchsuchten Text an die
|
|||
|
Stelle, an der der String gefunden wurde sowie ein Flag. Ist
|
|||
|
flag wahr, wurde der String gefunden, sonst nicht.
|
|||
|
search ber<EFBFBD>cksichtigt die Variable caps bei der Suche.
|
|||
|
|
|||
|
Im Buffer der L<EFBFBD>nge size werden count Zeichen entfernt. Der Rest
|
|||
|
des Buffers wird 'heruntergezogen'.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Der string ab Adresse string und der L<EFBFBD>nge length wird in den
|
|||
|
Buffer mit der Gr<EFBFBD><EFBFBD>e size eingef<EFBFBD>gt.
|
|||
|
\ *** Block No. 11 Hexblock B
|
|||
|
\ String operators 13oct86we
|
|||
|
|
|||
|
Ein pointer auf die Adresse des Strings, zu dem ein anderer
|
|||
|
hinzugef<EFBFBD>gt werden soll.
|
|||
|
$ADD h<EFBFBD>ngt den String ab addr und der L<EFBFBD>nge len an den String
|
|||
|
in $sum an. Der Count wird dabei addiert.
|
|||
|
wandelt den counted String ab addr in einen 0-terminated String.
|
|||
|
|
|||
|
wandelt den 0-terminated String ab addr in einen counted String.
|
|||
|
Die L<EFBFBD>nge der Strings bleibt gleich (Countbyte statt 0).
|
|||
|
|
|||
|
|
|||
|
legt einen counted und mit 0 abgeschlossenen String im
|
|||
|
Dictionary ab.
|
|||
|
aufrufendes Wort f<EFBFBD>r ,0"; kompiliert zus<EFBFBD>tzlich (".
|
|||
|
0" ist statesmart.
|