string-replace! Donald Welsh 24 Oct 1999 06:12 UTC

Should have specified string-replace!, the destructive counterpart to
string-replace.  Also a minor change to string-copy!; my implementation now
makes the endpoints optional.

; replacement, destructive version
; reuses storage of s1 if the result is not longer than s1
; returns the new version of s1, whether storage is reused
(define (string-replace! s1 start end s2)
  (if (> (string-length s2) (- end start))
      (string-replace s1 start end s2)
      (begin
        ; copy s2 into s1 starting at start
        (string-copy! s1 start s2 0 (string-length s2))
        ; the next line depends on string-copy! copying chars in ascending
order
        (string-copy! s1 (+ start (string-length s2)) s1 end (string-length
s1))
        ; the return value:  if string length has changed, should return a
        ; shared substring
        (if (= (string-length s2) (- end start))
            s1
            (substring s1 0 (+ (string-length s1) (- start end)
(string-length s2)))))))

; string-copy!, needed for efficient version of replacement
(define (string-copy! target tstart s . endpoints)
  (let ((start 0)
        (end (string-length s)))
    (if (not (null? endpoints))
        (begin
          (set! start (car endpoints))
          (set! end (cadr endpoints))))
    (do ((i tstart (+ i 1))
         (j start (+ j 1)))
      ((= j end) 'ok)
      (string-set! target i (string-ref s j)))))