1;;; 2;;; srfi-185 - Linear adjustable-length strings 3;;; 4;;; Copyright (c) 2020 Shiro Kawai <shiro@acm.org> 5;;; 6;;; Redistribution and use in source and binary forms, with or without 7;;; modification, are permitted provided that the following conditions 8;;; are met: 9;;; 10;;; 1. Redistributions of source code must retain the above copyright 11;;; notice, this list of conditions and the following disclaimer. 12;;; 13;;; 2. Redistributions in binary form must reproduce the above copyright 14;;; notice, this list of conditions and the following disclaimer in the 15;;; documentation and/or other materials provided with the distribution. 16;;; 17;;; 3. Neither the name of the authors nor the names of its contributors 18;;; may be used to endorse or promote products derived from this 19;;; software without specific prior written permission. 20;;; 21;;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22;;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23;;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24;;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25;;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26;;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 27;;; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28;;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29;;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32;;; 33 34;; In Gauche, string bodies are immutable and we just use an extra 35;; indirection to realize mutable strings. Lenght-changing mutation 36;; doesn't give any performance advantage at all. So we chose not to 37;; reuse the argument of linear-update procedures. 38 39(define-module srfi-185 40 (use srfi-13) 41 (export string-append-linear! 42 string-replace-linear! 43 string-append! 44 string-replace!)) 45(select-module srfi-185) 46 47(define (string-append-linear! dst . args) 48 (string-concatenate (cons dst (map (^s (if (char? s) (string s) s)) args)))) 49 50(define (string-replace-linear! dst dst-start dst-end src 51 :optional src-start src-end) 52 (string-replace dst src dst-start dst-end src-start src-end)) 53 54(define-syntax string-append! 55 (syntax-rules () 56 [(_ dst . args) (set! dst (string-append-linear! dst . args))])) 57 58(define-syntax string-replace! 59 (syntax-rules () 60 [(_ dst dstart dend src . opts) 61 (set! dst (string-replace dst src dstart dend . opts))])) 62