@@ -33,7 +33,7 @@ import Data.List
3333import Data.Maybe
3434import qualified Data.List.NonEmpty as NE
3535import qualified Data.Map as Map
36- import Numeric (showHex )
36+ import Numeric (readHex , readOct , showHex )
3737
3838import Test.QuickCheck
3939
@@ -418,28 +418,15 @@ getLiteralStringExt more = g
418418 ' "' -> ' "' : rest
419419 ' \\ ' -> ' \\ ' : rest
420420 ' x' ->
421- case cs of
422- (x: y: more) | isHexDigit x && isHexDigit y ->
423- chr (16 * (digitToInt x) + (digitToInt y)) : decodeEscapes more
424- (x: more) | isHexDigit x ->
425- chr (digitToInt x) : decodeEscapes more
426- more -> ' \\ ' : ' x' : decodeEscapes more
427- _ | isOctDigit c ->
428- let (digits, more) = spanMax isOctDigit 3 (c: cs)
429- num = (parseOct digits) `mod` 256
430- in (chr num) : decodeEscapes more
431- _ -> ' \\ ' : c : rest
421+ case readHex (take 2 cs) of
422+ [(n, s)] -> chr n : s ++ decodeEscapes (drop 2 cs)
423+ _ -> ' \\ ' : ' x' : rest
424+ _ ->
425+ case readOct (c: take 2 cs) of
426+ [(n, s)] -> chr n : s ++ decodeEscapes (drop 2 cs)
427+ _ -> ' \\ ' : c : rest
432428 where
433429 rest = decodeEscapes cs
434- parseOct = f 0
435- where
436- f n " " = n
437- f n (c: rest) = f (n * 8 + digitToInt c) rest
438- spanMax f n list =
439- let (first, second) = span f list
440- (prefix, suffix) = splitAt n first
441- in
442- (prefix, suffix ++ second)
443430 decodeEscapes (c: cs) = c : decodeEscapes cs
444431 decodeEscapes [] = []
445432
0 commit comments