CHANGESTR.REX: Difference between revisions

m
moved a category to TOF.
(added comments to the section header.)
m (moved a category to TOF.)
 
(9 intermediate revisions by 2 users not shown)
Line 1:
[[Category:REXX_library_routines]]
This a RYO version of the REXX function   '''changestr'''   (CHANGE STRing).
 
== the CHANGESTR function ==
This a RYO version of the REXX function &nbsp; '''changestr''' &nbsp; (<u>change</u> <u>str</u>ing).
 
It is included in some of the more modern Classic REXXes, but older versions of
<br>Classic REXX don't have this function as a &nbsp; BIF &nbsp; ('''<u>B'''</u>uilt-'''<u>I'''</u>n '''-<u>F'''</u>unction).
 
 
Line 8 ⟶ 11:
This version of the &nbsp; '''changestr''' &nbsp; BIF has more functionality than the standard BIF.
 
<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 occurrence#.*/
/*──── start of change position. */
 
__TOC__
/*╔══════════════════════════ CHANGESTR function ══════════════════════╗
 
╔═╩════════════════════════════════════════════════════════════════════╩═╗
 
║ The CHANGESTR function is used to replace some or all occurrences of an║
 
║ (old) string in a haystack with a new string. The changed string is ║
===the CHANGESTR (external) program source===
║ returned. If the haystack doesn't contain the old string, the ║
The following &nbsp; CHANGESTR &nbsp; program can be coded as is when the intention is to be an external routine (function).
║ original haystack is returned. If the old string is a null string, ║
<lang rexx>/*REXX program emulates the CHANGESTR BIF (built-in function) for older REXXes.*/
║ then the original string is prefixed with the new string. ║
/*──────────── This version has more functionality: limit the number of changes. */
║ ║
/*──────────── start of change occurrence#. */
║ new string to be used►──────────┐ ┌─────◄limit of # changes (times).║
/*──────────── start of change position. */
║ original string (haystack)►──────┐ │ │ [default: ≈ one billion]║
 
║ old string to be replaced►──┐ │ │ │ ┌────◄begin at this occurrence #║
/* ╔═══════════════════════════ CHANGESTR function ════════════════════════╗
║ {O, H, and N can be null.} │ │ │ │ │ ┌──◄start position (default=1)║
╔═╩═══════════════════════════════════════════════════════════════════════╩═╗
╚═╦════════════════════════════╗ │ │ │ │ │ │ ╔═════════════════════════╦═╝
║ The CHANGESTR function is used to replace some or all occurrences 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 ║
changestr: parse arg o,h,n,t,b,p,$ f /*T,B,P are optional.*/
║ original haystack is returned. If the old string is a null string, ║
t=word(t 999999999 , 1) /*maybe use the default? */
b=word(b 1 then the original string is , prefixed 1) with the new string. /* " " " " */
p=word(p 1 , 1) /* " " " " */
║ new string to be used ►──────┐ ┌──────◄ limit of # changes (times).║
if arg() < 3 then signal syntax /*not enough arguments. */
║ original string (haystack) ►────┐ │ │ [default: ≈ one billion] ║
if arg() > 6 then signal syntax /*too many arguments. */
║ old string to be replaced ►──┐ │ │ │ ┌────◄ begin at this occurrence # ║
if \datatype(t,'W') then signal syntax /*4th arg not an integer. */
║ {O, H, and N can be null.} │ │ │ │ │ ┌──◄ start position (default=1) ║
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 /*6thparse arg " " "o,h,n,t,b,p, ,$ f /* ◄────────────────────┐*/
L=length(o) /*length ofT, B, OLDP are string.optional ►─┘*/
if L==0 & t\=0word(t 999999999, 1) then return n || h /*changingmaybe ause nullthe chardefault? */
if p\ b=word(b 1 then do , 1) /*if P ¬=" " " " 1, adjust F & H.*/
fp=left(h, minword(p- 1 , length(h))1) /*keep first part" " " " intact. */
if h=substrarg(h,p) < 3 then signal syntax /*onlynot useenough thisarguments. part of H.*/
if arg() > end 6 then signal syntax /*now,too proceed asmany usual arguments. */
#=0 if \datatype(t, 'W') then signal syntax /*4th arg not an integer. /*# of changed occurrences*/
do j=1 if \datatype(b, while'W') # < t then signal syntax /*5th " " " /*keep changing, T" times. */
parse var if h\datatype(p, y'W') (o) _ +(L)then hsignal syntax /*6th " /*parse the" " " haystack ··· */
if _==''t<0 then return f || $ || y then signal syntax /*no4th more left," return. " non-negative.*/
$=$ || yif b<1 then signal syntax /*5th " /*append the" residual txt positive. */
if jp<b1 then $=$ || o then signal syntax /*append6th " " " OLD if too soon. */
L=length(o) else do /*metlength theof occurrence testOLD string. */
if L==0 & $t\=$0 || n then return n || h /*append thechanging a NEW[null] char? string.*/
#=#+1 /*bump [↓] check occurrencefor number.position*/
if p\=1 then do end /*P¬=1? Then ajust F & H.*/
end /*j*/ f=left(h, min(p-1, length(h))) /*Note: most REXX keep ···first part intact. */
h=substr(h, p) /*only CHANGESTRuse BIFsthis onlypart of ···H.*/
return f || $ || h end /*now, supportproceed threeas optionsusual. */</lang>
#=0 /*# of changed occurrences*/
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.*/
/* [↓] check if too soon.*/
if j<b then $=$ || o /*append OLD if too soon. */
else do /*met the occurrence test.*/
$=$ || n /*append the NEW string.*/
#=#+1 /*bump occurrence number. */
end /* [↑] append new string.*/
end /*j*/ /*Note: most REXX ··· */
/* CHANGESTR BIFs only ···*/
return f || $ || h /* support three options. */</lang>
 
=== the CHANGESTR (internal) procedure source ===
The following CHANGESTR program can be coded as is when the intention is to be an internal routine (function).
 
Only the '''changestr:''' statement is changed &nbsp; (by adding a &nbsp; '''procedure''' &nbsp; to the label).
<lang rexx>/*REXX program emulates the CHANGESTR BIF (built-in function) for older REXXes.*/
/*──────────── This version has more functionality: limit the number of changes. */
/*──────────── start of change occurrence#. */
/*──────────── start of change position. */
 
/* ╔═══════════════════════════ CHANGESTR function ════════════════════════╗
╔═╩═══════════════════════════════════════════════════════════════════════╩═╗
║ The CHANGESTR function is used to replace some or all occurrences 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 billion] ║
║ old string to be replaced ►──┐ │ │ │ ┌────◄ begin at this occurrence # ║
║ {O, H, and N can be null.} │ │ │ │ │ ┌──◄ start position (default=1) ║
╚═╦═════════════════════════════╗ │ │ │ │ │ │ ╔═══════════════════════════╦═╝
╚═════════════════════════════╝ │ │ │ │ │ │ ╚═══════════════════════════╝
↓ ↓ ↓ ↓ ↓ ↓ */
changestr: procedure; parse arg o,h,n,t,b,p, ,$ f /* ◄────────────────────┐*/
/*T, B, P are optional ►─┘*/
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 /*6th " " " " */
if t<0 then signal syntax /*4th " " non-negative.*/
if b<1 then signal syntax /*5th " " 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? */
/* [↓] check for position*/
if p\=1 then do /*P¬=1? Then ajust 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 occurrences*/
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.*/
/* [↓] check if too soon.*/
if j<b then $=$ || o /*append OLD if too soon. */
else do /*met the occurrence test.*/
$=$ || n /*append the NEW string.*/
#=#+1 /*bump occurrence number. */
end /* [↑] append new string.*/
end /*j*/ /*Note: most REXX ··· */
/* CHANGESTR BIFs only ···*/
return f || $ || h /* support three options. */</lang>