CHANGESTR.REX: Difference between revisions

From Rosetta Code
Content added Content deleted
(added functionality to this version of the CHANGESTR function, changed comments, indentation. -- ~~~~)
m (updated some comments in this version of the BIF. -- ~~~~)
Line 1: Line 1:
This version of the   '''changestr'''   BIF has more functionality than the standard BIF.

<lang rexx>/*REXX program emulates the CHANGESTR built-in function for older REXXes*/
<lang rexx>/*REXX program emulates the CHANGESTR built-in function for older REXXes*/
/*──── This version has more functionality: limit the number of changes.*/
/*──── This version has more functionality: limit the number of changes.*/
/*──── start of change occurance. */
/*──── start of change occurrence#.*/
/*──── start of change position. */
/*──── start of change position. */


/*╔══════════════════════════ CHANGESTR function ══════════════════════╗
/*╔══════════════════════════ CHANGESTR function ══════════════════════╗
╔═╩════════════════════════════════════════════════════════════════════╩═╗
╔═╩════════════════════════════════════════════════════════════════════╩═╗
║ The CHANGESTR function is used to replace some or all occurances of an ║
║ 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 ║
║ (old) string in a haystack with a new string. The changed string is ║
║ returned. If the haystack doesn't contain the old string, the ║
║ returned. If the haystack doesn't contain the old string, the ║
Line 13: Line 15:
║ ║
║ ║
║ new string to be used►──────────┐ ┌─────◄limit of # changes (times).║
║ new string to be used►──────────┐ ┌─────◄limit of # changes (times).║
║ original string (haystack)►──────┐ │ │ [default: ≈ one billian]║
║ original string (haystack)►──────┐ │ │ [default: ≈ one billion]║
║ old string to be replaced►──┐ │ │ │ ┌────◄begin at this occurance #.
║ old string to be replaced►──┐ │ │ │ ┌────◄begin at this occurrence #║
║ {O, H, and N can be null.} │ │ │ │ │ ┌──◄start position (default=1)║
║ {O, H, and N can be null.} │ │ │ │ │ ┌──◄start position (default=1)║
╚═╦════════════════════════════╗ │ │ │ │ │ │ ╔═════════════════════════╦═╝
╚═╦════════════════════════════╗ │ │ │ │ │ │ ╔═════════════════════════╦═╝
Line 40: Line 42:
h=substr(h,p) /*only use this part of H.*/
h=substr(h,p) /*only use this part of H.*/
end /*now, proceed as usual. */
end /*now, proceed as usual. */
#=0 /*# of changed occurances.*/
#=0 /*# of changed occurrences*/
do j=1 while # < t /*keep changing, T times. */
do j=1 while # < t /*keep changing, T times. */
parse var h y (o) _ +(L) h /*parse the haystack ··· */
parse var h y (o) _ +(L) h /*parse the haystack ··· */
Line 46: Line 48:
$=$ || y /*append the residual txt.*/
$=$ || y /*append the residual txt.*/
if j<b then $=$ || o /*append OLD if too soon. */
if j<b then $=$ || o /*append OLD if too soon. */
else do /*met the occurance test. */
else do /*met the occurrence test.*/
$=$ || n /*append the NEW string.*/
$=$ || n /*append the NEW string.*/
#=#+1 /*bump occurance number.*/
#=#+1 /*bump occurrence number.*/
end
end
end /*j*/
end /*j*/ /*Note: most REXX ··· */
/*Note: Most REXX BIFs··· */
/* CHANGESTR BIFs only ···*/
return f || $ || h /* only support 3 options.*/</lang>
return f || $ || h /* support three options. */</lang>

Revision as of 20:53, 20 February 2014

This version of the   changestr   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. */

/*╔══════════════════════════ 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: 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.  */
  1. =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.*/
        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
        end   /*j*/                          /*Note:  most REXX  ···   */
                                             /* CHANGESTR BIFs only ···*/

return f || $ || h /* support three options. */</lang>