\ 4tH library - REPLACE - Copyright 2004 J.L. Bezemer
\ You can redistribute this file and/or modify it under
\ the terms of the GNU General Public License
[UNDEFINED] search [IF]
[needs lib/search.4th]
[THEN]
[UNDEFINED] replaceall [IF]
\ Delete string a2/n2 from string a1/n1
\ Return the resulting string in a1/n3 and the remainder of the
\ line after the delete in string a2/n4
\ If the deletion was made, f is 1 otherwise 0
: delete ( a1 n1 a2 n2 -- a1 n3 a2 n4 f)
2>r 2dup 2r> dup >r search
dup r> swap >r >r ( a1 n1 a2 n2 f)
if ( a1 n1 a2 n2)
2swap r@ - 2swap r@ - ( a1 n3 a2 n4)
2dup over r@ chars + ( a1 n3 a2 n4 a3)
-rot cmove ( a1 n3 a2 n4)
then
r> drop r>
;
\ Delete all occurences of string a2/n2 in string a1/n1
\ Return the resulting string in a1/n3
: deleteall ( a1 n1 a2 n2 -- a1 n3)
2>r swap dup rot ( a1 a1 n1)
begin ( a1 a1 n1)
2r> 2dup 2>r delete ( a1 a1 n3 a2 n4 f)
while ( a1 a1 n3 a2 n4)
2swap 2drop ( a1 a2 n4)
repeat ( a1 a2 n4)
2drop chars + over - ( a1 n5)
2r> 2drop ( a1 n5)
;
\ Spread string a1/n1 at position n2 by n3 characters
\ Return the resulting string in a1/n4 and the opened up
\ space in string a2 n3
: spread ( a1 n1 n2 n3 -- a1 n4 a2 n3)
rot >r >r ( a1 n2)
over over chars + swap ( a1 a2 n2)
over dup r@ + rot ( a1 a2 a2 a3 n2)
r> swap r@ swap - swap >r ( a1 a2 a2 a3 n1-n2)
cmove r@ rot r> r> + ( a2 n3 a1 n4)
2swap ( a1 n4 a2 n3)
;
\ Insert string a2/n2 into string a1/n1 at position n3
\ Return the resulting string in a1/n3 and the remainder of
\ the line after the insertion in a3/n4
: insert ( a1 n1 a2 n2 n3 -- a1 n3 a3 n4)
-rot 2dup 2>r ( a1 n1 n3 a2 n2)
nip spread ( a1 n3 a3 n2)
over 2r> ( a1 n3 a3 n2 a3 a2 n2)
rot swap cmove chars + ( a1 n3 a4)
>r 2dup chars + r@ - ( a1 n3 n4)
r> swap
;
\ Replace string a2/n2 in string a1/n1 by string a3/n3
\ Return the resulting string in a1/n4 and the remainder of the
\ line after the delete in string a4/n5
\ If the replacement was made, f is 1 otherwise 0
: replace ( a1 n1 a2 n2 a3 n3 -- a1 n4 a4 n5 f)
2>r delete dup 2r> rot >r 2>r
if
nip over swap - 2r> rot insert
else
2r> 2drop
then
r>
;
\ Replace all occurences of string a2/n2 in string a1/n1 by string a3/n3
\ Return the resulting string in a1/n4
: replaceall ( a1 n1 a2 n2 a3 n3 -- a1 n4)
2>r 2>r swap dup rot
begin
2r> 2dup 2r> 2dup 2>r 2swap 2>r replace
while
2swap 2drop
repeat
2drop chars + over -
2r> 2r> 2drop 2drop
;
[THEN]
|