mes.c: implement string->list.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 13 Aug 2016 16:42:11 +0000 (18:42 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 13 Aug 2016 16:42:11 +0000 (18:42 +0200)
mes.c
scm.mes
test/scm.test

diff --git a/mes.c b/mes.c
index a227f6a0b44c3e3cc1c88e9f3382d27d36342044..f225ba2f0a96c49dd0333eb09684e0779f712d0d 100644 (file)
--- a/mes.c
+++ b/mes.c
@@ -1160,9 +1160,10 @@ readstring ()
   int c = getchar ();
   while (true) {
     if (c == '"') break;
-    *p++ = c;
     if (c == '\\' && peek_char () == '"') *p++ = getchar ();
-    if (c == EOF) assert (!"EOF in string");
+    else if (c == '\\' && peek_char () == 'n') {getchar (); *p++ = '\n';}
+    else if (c == EOF) assert (!"EOF in string");
+    else *p++ = c;
     c = getchar ();
   }
   *p = 0;
diff --git a/scm.mes b/scm.mes
index 5c17a406f53049a934213011aaa01f664771d34a..19d79f4bfe7efbdd4cc4f82c7784d36a5513b5cf 100755 (executable)
--- a/scm.mes
+++ b/scm.mes
       (if (= 0 n) '()
           (cons fill (loop (- n 1)))))))
 
+(define (string->list s)
+  (let ((n (string-length s)))
+    (let loop ((i 0))
+      (if (= i n) '()
+          (cons (string-ref s i) (loop (+ i 1)))))))
+
 (define (vector . rest) (list->vector rest))
 (define (make-vector n . x)
   (list->vector (apply make-list (cons n x))))
index f2511546a0eef92d9928d79da83e0087a0fd9260..4bd39563d5d812582557546e2353760eb1ea917e 100644 (file)
@@ -64,6 +64,7 @@
 (pass-if "string-ref" (seq? (string-ref "hello world" 4) #\o))
 (pass-if "eq?" (not (eq? (string-append "a" "b" "c") "abc")))
 (pass-if "string-length" (seq? (string-length (string-append "a" "b" "c")) 3))
+(pass-if "string->list" (sequal? (string->list "abc\n") '(#\a #\b #\c #\newline)))
 (pass-if "char" (seq? (char->integer #\A) 65))
 (pass-if "char 2" (seq? (char->integer #\101) (char->integer #\A)))
 (pass-if "char 3" (seq? (integer->char 10) #\newline))