aebad3a67702370f659f0a54b040607c79196680
[jscl.git] / src / string.lisp
1 ;;; string.lisp
2
3 ;; JSCL is free software: you can redistribute it and/or
4 ;; modify it under the terms of the GNU General Public License as
5 ;; published by the Free Software Foundation, either version 3 of the
6 ;; License, or (at your option) any later version.
7 ;;
8 ;; JSCL is distributed in the hope that it will be useful, but
9 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 ;; General Public License for more details.
12 ;;
13 ;; You should have received a copy of the GNU General Public License
14 ;; along with JSCL.  If not, see <http://www.gnu.org/licenses/>.
15
16 (defun string (x)
17   (cond ((stringp x) x)
18         ((symbolp x) (symbol-name x))
19         (t (char-to-string x))))
20
21 (defun string= (s1 s2)
22   (let ((n (length s1)))
23     (when (= (length s2) n)
24       (dotimes (i n t)
25         (unless (char= (char s1 i) (char s2 i))
26           (return-from string= nil))))))
27
28 (defun string< (s1 s2)
29   (let ((len-1 (length s1))
30                 (len-2 (length s2)))
31         (cond ((= len-2 0) nil)
32                   ((= len-1 0) 0)
33                   (t (dotimes (i len-1 nil)
34                            (when (char< (char s1 i) (char s2 i))
35                                  (return-from string< i)))))))
36                 
37 (define-setf-expander char (string index)
38   (let ((g!string (gensym))
39         (g!index (gensym))
40         (g!value (gensym)))
41     (values (list g!string g!index)
42             (list string index)
43             (list g!value)
44             `(aset ,g!string ,g!index ,g!value)
45             `(char ,g!string ,g!index))))