Skip to content

Commit e943cfe

Browse files
committed
refactor(ASTLib): simplify decodeEscapes
1 parent 766a836 commit e943cfe

1 file changed

Lines changed: 8 additions & 21 deletions

File tree

src/ShellCheck/ASTLib.hs

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import Data.List
3333
import Data.Maybe
3434
import qualified Data.List.NonEmpty as NE
3535
import qualified Data.Map as Map
36-
import Numeric (showHex)
36+
import Numeric (readHex, readOct, showHex)
3737

3838
import 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

Comments
 (0)