@@ -22,9 +22,10 @@ module Language.PureScript.Pretty.Cpp (
22 prettyPrintCpp,
22 prettyPrintCpp,
25import Data.Char
26import Data.Char
26import Data.List
27import Data.List
27−import Data.Maybe (fromMaybe)
28+import Data.Maybe (catMaybes, fromMaybe)
29#if __GLASGOW_HASKELL__ < 710
30#if __GLASGOW_HASKELL__ < 710
30import Control.Applicative
31import Control.Applicative
@@ -253,8 +254,20 @@ literals = mkPattern' match
253 match _ = mzero
254 match _ = mzero
255string :: String -> String
256string :: String -> String
256−string s = '"' : concatMap encodeChar s ++ "\""
257+string s = '"' : concatMap encodeChar (decodeSurrogates s) ++ "\""
259+ decodeSurrogates :: String -> String
260+ decodeSurrogates [c] = [c]
261+ decodeSurrogates s = catMaybes $ zipWith decodePair s (tail s ++ ['\0'])
263+ decodePair :: Char -> Char -> Maybe Char
265+ | fromEnum a >= 0xD800 && fromEnum a <= 0xDFFF &&
266+ fromEnum b >= 0xD800 && fromEnum b <= 0xDFFF
267+ = Just . chr $ 0x10000 + shiftL (fromEnum a .&. 0x03FF) 10 + (fromEnum b .&. 0x03FF)
269+ | fromEnum a >= 0xD800 && fromEnum a <= 0xDFFF = Nothing
270+ decodePair a _ = Just a
258 encodeChar :: Char -> String
271 encodeChar :: Char -> String
259 encodeChar '\b' = "\\b"
272 encodeChar '\b' = "\\b"
260 encodeChar '\t' = "\\t"
273 encodeChar '\t' = "\\t"
@@ -264,8 +277,14 @@ string s = '"' : concatMap encodeChar s ++ "\""
264 encodeChar '\r' = "\\r"
277 encodeChar '\r' = "\\r"
265 encodeChar '"' = "\\\""
278 encodeChar '"' = "\\\""
266 encodeChar '\\' = "\\\\"
279 encodeChar '\\' = "\\\\"
280+ encodeChar c | fromEnum c > 0xFFFF = "\\U" ++ leading ++ hex
282+ hex = showHex (fromEnum c) ""
283+ leading = replicate (8 - length hex) '0'
267 encodeChar c | fromEnum c > 0xFFF = "\\u" ++ showHex (fromEnum c) ""
284 encodeChar c | fromEnum c > 0xFFF = "\\u" ++ showHex (fromEnum c) ""
268 encodeChar c | fromEnum c > 0xFF = "\\u0" ++ showHex (fromEnum c) ""
285 encodeChar c | fromEnum c > 0xFF = "\\u0" ++ showHex (fromEnum c) ""
286+ encodeChar c | fromEnum c < 0x10 = "\\x0" ++ showHex (fromEnum c) ""
287+ encodeChar c | fromEnum c > 0x7E || fromEnum c < 0x20 = "\\x" ++ showHex (fromEnum c) ""
269 encodeChar c = [c]
288 encodeChar c = [c]
271accessor :: Pattern PrinterState Cpp (String, Cpp)
290accessor :: Pattern PrinterState Cpp (String, Cpp)