From 8c8c926f7a76af219cdc6a04010580926755c1b2 Mon Sep 17 00:00:00 2001 From: Chris Hanson Date: Wed, 10 Oct 1990 06:15:56 +0000 Subject: [PATCH] Fix parsing of octal escape sequences in strings. --- v7/src/runtime/parse.scm | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/v7/src/runtime/parse.scm b/v7/src/runtime/parse.scm index 7fa41fc40..1d8f1f1da 100644 --- a/v7/src/runtime/parse.scm +++ b/v7/src/runtime/parse.scm @@ -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) -- 2.25.1