CHANGESTR.REX: Difference between revisions
Walterpachl (talk | contribs) m (another one :-)) |
(added functionality to this version of the CHANGESTR function, changed comments, indentation. -- ~~~~) |
||
Line 1: | Line 1: | ||
<lang rexx>/*REXX program emulates the CHANGESTR built-in function for older REXXes*/ |
|||
<lang rexx>/*╔══════════════════════════════╗ CHANGESTR ╔═════════════════════════╗ |
|||
/*──── This version has more functionality: limit the number of changes.*/ |
|||
╔═╩══════════════════════════════╝ function ╚═════════════════════════╩═╗ |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
/*╔══════════════════════════ CHANGESTR function ══════════════════════╗ |
|||
⚫ | |||
╔═╩════════════════════════════════════════════════════════════════════╩═╗ |
|||
⚫ | |||
║ The CHANGESTR function is used to replace some or all occurances of an ║ |
|||
⚫ | |||
║ (old) string in a haystack with a new string. The changed string is ║ |
|||
changestr: procedure; parse arg o,h,n,t,b /* T and B are optional.*/ |
|||
║ returned. If the haystack doesn't contain the old string, the ║ |
|||
⚫ | |||
║ original haystack is returned. If the old string is a null string, ║ |
|||
⚫ | |||
║ then the original string is prefixed with the new string. ║ |
|||
⚫ | |||
║ ║ |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
↓ ↓ ↓ ↓ ↓ ↓ */ |
|||
changestr: parse arg o,h,n,t,b,p /* T, B, & P are optional.*/ |
|||
$='' /*$: the returned string.*/ |
|||
/*optional arguments ··· */ |
|||
t=word(t 999999999 , 1) /*maybe use the default? */ |
|||
b=word(b 1 , 1) /* " " " " */ |
|||
p=word(p 1 , 1) /* " " " " */ |
|||
if arg() < 3 then signal syntax /*not enough arguments. */ |
|||
if arg() > 6 then signal syntax /*too many arguments. */ |
|||
if \datatype(t,'W') then signal syntax /*4th arg not an integer. */ |
|||
if \datatype(b,'W') then signal syntax /*5th " " " " */ |
|||
if \datatype(p,'W') then signal syntax /*5th arg " " " */ |
|||
if t<0 then signal syntax /*4th arg not non-negative*/ |
|||
if b<1 then signal syntax /*5th arg not positive. */ |
|||
if p<1 then signal syntax /*6th " " " */ |
|||
L=length(o) /*length of OLD string. */ |
|||
⚫ | |||
f='' /*first part of H if P>1. */ |
|||
if p\=1 then do /*if P ¬= 1, adjust F & H.*/ |
|||
f=left(h, min(p-1, length(h))) /*keep first part intact. */ |
|||
h=substr(h,p) /*only use this part of H.*/ |
|||
end /*now, proceed as usual. */ |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
else do /*met the occurance test. */ |
|||
$=$ || n /*append the NEW string.*/ |
|||
#=#+1 /*bump occurance number.*/ |
|||
end |
|||
end /*j*/ |
|||
/*Note: Most REXX BIFs··· */ |
|||
return f || $ || h /* only support 3 options.*/</lang> |
Revision as of 20:40, 19 February 2014
<lang rexx>/*REXX program emulates the CHANGESTR built-in function for older REXXes*/ /*──── This version has more functionality: limit the number of changes.*/ /*──── start of change occurance. */ /*──── start of change position. */
/*╔══════════════════════════ CHANGESTR function ══════════════════════╗ ╔═╩════════════════════════════════════════════════════════════════════╩═╗ ║ The CHANGESTR function is used to replace some or all occurances of an ║ ║ (old) string in a haystack with a new string. The changed string is ║ ║ returned. If the haystack doesn't contain the old string, the ║ ║ original haystack is returned. If the old string is a null string, ║ ║ then the original string is prefixed with the new string. ║ ║ ║ ║ new string to be used►──────────┐ ┌─────◄limit of # changes (times).║ ║ original string (haystack)►──────┐ │ │ [default: ≈ one billian]║ ║ old string to be replaced►──┐ │ │ │ ┌────◄begin at this occurance #.║ ║ {O, H, and N can be null.} │ │ │ │ │ ┌──◄start position (default=1)║ ╚═╦════════════════════════════╗ │ │ │ │ │ │ ╔═════════════════════════╦═╝
╚════════════════════════════╝ │ │ │ │ │ │ ╚═════════════════════════╝ ↓ ↓ ↓ ↓ ↓ ↓ */
changestr: parse arg o,h,n,t,b,p /* T, B, & P are optional.*/ $= /*$: the returned string.*/
/*optional arguments ··· */
t=word(t 999999999 , 1) /*maybe use the default? */ b=word(b 1 , 1) /* " " " " */ p=word(p 1 , 1) /* " " " " */ if arg() < 3 then signal syntax /*not enough arguments. */ if arg() > 6 then signal syntax /*too many arguments. */ if \datatype(t,'W') then signal syntax /*4th arg not an integer. */ if \datatype(b,'W') then signal syntax /*5th " " " " */ if \datatype(p,'W') then signal syntax /*5th arg " " " */ if t<0 then signal syntax /*4th arg not non-negative*/ if b<1 then signal syntax /*5th arg not positive. */ if p<1 then signal syntax /*6th " " " */ L=length(o) /*length of OLD string. */ if L==0 & t\=0 then return n || h /*changing a null char? */ f= /*first part of H if P>1. */ if p\=1 then do /*if P ¬= 1, adjust F & H.*/
f=left(h, min(p-1, length(h))) /*keep first part intact. */ h=substr(h,p) /*only use this part of H.*/ end /*now, proceed as usual. */
- =0 /*# of changed occurances.*/
do j=1 while # < t /*keep changing, T times. */ parse var h y (o) _ +(L) h /*parse the haystack ··· */ if _== then return f || $ || y /*no more left, return. */ $=$ || y /*append the residual txt.*/ if j<b then $=$ || o /*append OLD if too soon. */ else do /*met the occurance test. */ $=$ || n /*append the NEW string.*/ #=#+1 /*bump occurance number.*/ end end /*j*/ /*Note: Most REXX BIFs··· */
return f || $ || h /* only support 3 options.*/</lang>