Fix parsing of octal escape sequences in strings.
authorChris Hanson <org/chris-hanson/cph>
Wed, 10 Oct 1990 06:15:56 +0000 (06:15 +0000)
committerChris Hanson <org/chris-hanson/cph>
Wed, 10 Oct 1990 06:15:56 +0000 (06:15 +0000)
v7/src/runtime/parse.scm

index 7fa41fc40cdc406c8735d49465341728869d8472..1d8f1f1dad6e2f3d6dcf1e51c2b16f35b479af30 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/parse.scm,v 14.10 1990/09/07 00:27:35 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/parse.scm,v 14.11 1990/10/10 06:15:56 cph Exp $
 
 Copyright (c) 1988, 1989, 1990 Massachusetts Institute of Technology
 
@@ -56,8 +56,6 @@ MIT in each case. |#
        (char-set-difference char-set/atom-constituents
                             (char-set #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9
                                       #\+ #\- #\. #\#)))
-  (set! char-set/not-octal
-       (char-set-invert (char-set #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7)))
 
   (set! lambda-optional-tag (intern "#!optional"))
   (set! lambda-rest-tag (intern "#!rest"))
@@ -83,7 +81,6 @@ MIT in each case. |#
 (define char-set/atom-constituents)
 (define char-set/char-delimiters)
 (define char-set/symbol-leaders)
-(define char-set/not-octal)
 
 (define lambda-optional-tag)
 (define lambda-rest-tag)
@@ -429,29 +426,21 @@ MIT in each case. |#
                         ((char-ci=? char #\n) #\Newline)
                         ((char-ci=? char #\f) #\Page)
                         ((char->digit char 8)
-                         (octal->char
-                          (string-append (string char)
-                                         (read-string char-set/not-octal))))
+                         (let ((c2 (read-char)))
+                           (octal->char char c2 (read-char))))
                         (else char)))))
            (string-append head
                           (string char)
                           (loop)))))))
 
-(define (octal->char string)
-  (let ((end (string-length string))
-       (loser
-        (lambda (message)
-          (error (string-append "Octal string escape " message ":") string))))
-    (if (> end 3)
-       (loser "too long"))
-    (let loop ((index 0) (sum 0))
-      (if (= index end)
-         (begin
-           (if (>= sum 256)
-               (loser "exceeds ASCII range"))
-           (ascii->char sum))
-         (loop (1+ index)
-               (+ (* sum 8) (char->digit (string-ref string index) 8)))))))
+(define (octal->char c1 c2 c3)
+  (let ((sum
+        (+ (* #o100 (char->digit c1 8))
+           (* #o10 (char->digit c2 8))
+           (char->digit c3 8))))
+    (if (>= sum 256)
+       (error "Octal string escape exceeds ASCII range:" (string c1 c2 c3)))
+    (ascii->char sum)))
 
 (define (parse-object/char-quote)
   (discard-char)