From cc51bcf7c00454ff9ad437bec3fef3aae3d01be1 Mon Sep 17 00:00:00 2001 From: Geert Janssens Date: Sun, 18 Aug 2013 21:21:57 +0000 Subject: [PATCH] Bug 704525 - When you have a mix of chart types (bar charts and pie charts) Add new procedure gnc:substring-replace-from-to Similar to gnc:substring-replace, but offers the possibility to replace substrings in a range of occurances. Author: Carsten Rinke git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@23143 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/scm/string.scm | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/scm/string.scm b/src/scm/string.scm index f75020c064..a21fb4b2d9 100644 --- a/src/scm/string.scm +++ b/src/scm/string.scm @@ -94,6 +94,82 @@ (substring s1 start1))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; gnc:substring-replace-from-to +;; same as gnc:substring-replace extended by: +;; start: from which occurrance onwards the replacement shall start +;; end-after: max. number times the replacement should executed +;; +;; Example: (gnc:substring-replace-from-to "foobarfoobarfoobar" "bar" "xyz" 2 2) +;; returns "foobarfooxyzfoobar". +;; +;; start=1 and end-after<=0 will call gnc:substring-replace (replace all) +;; start>1 and end-after<=0 will the replace from "start" until end of file +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define-public (gnc:substring-replace-from-to s1 s2 s3 start end-after) + (let ( + (s2len (string-length s2)) + ) + + ;; if start<=0 and end<=0 => don't do anything + + (if (and + (<= start 0) + (<= end-after 0) + ) + s1 + ) + + ;; else + (begin + + ;; normalize start + (if (= start 0) + (set! start 1) + ) + ;; start=1 and end<=0 => replace all + ;; call gnc:substring-replace for that + (if (and (= start 1) (<= end-after 0)) + (gnc:substring-replace s1 s2 s3) + + ;; else + (begin + (let loop ( + (start1 0) + (i (string-contains s1 s2)) + ) + (if i + (begin + (set! start (- start 1)) + (if (or + (> start 0) + (and (> end-after 0) + (<= (+ end-after start) 0) + ) + ) + (string-append + (substring s1 start1 i) + s2 ;; means: do not change anything + (loop (+ i s2len) (string-contains s1 s2 (+ i s2len))) + ) + (string-append + (substring s1 start1 i) + s3 + (loop (+ i s2len) (string-contains s1 s2 (+ i s2len))) + ) + ) + ) + ;; else + (substring s1 start1) + ) + ) + ) + ) + ) + ) +) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; gnc:string-replace-char ;;