@@ -0,0 +1,60 @@
1+-----------------------------------------------------------------------------
2+--
3+-- Module : Language.PureScript.CodeGen.Unicode
4+-- Copyright : (c) 2016 Andy Arvanitis
5+-- License : MIT
6+--
7+-- Maintainer : Andy Arvanitis <andy.arvanitis@gmail.com>
8+-- Stability : experimental
9+-- Portability :
10+--
11+-- |
12+-- Unicode support functions
13+--
14+-----------------------------------------------------------------------------
15+{-# LANGUAGE PatternGuards #-}
16+
17+module Language.PureScript.CodeGen.Cpp.Unicode
18+ ( unicodeToUCNs
19+ ) where
20+
21+import Prelude.Compat
22+import Data.Char (isAscii, ord)
23+import Text.Printf (printf)
24+
25+import Language.PureScript.CodeGen.Cpp.AST
26+
27+---------------------------------------------------------------------------------------------------
28+unicodeToUCNs :: Cpp -> Cpp
29+---------------------------------------------------------------------------------------------------
30+unicodeToUCNs (CppVar s) =
31+ CppVar (toUcns s)
32+unicodeToUCNs (CppSymbol s) =
33+ CppSymbol (toUcns s)
34+unicodeToUCNs (CppFunction s ss rty qs cpp) =
35+ CppFunction (toUcns s) ((\(a,t) -> (toUcns a, t)) <$> ss) rty qs cpp
36+unicodeToUCNs (CppLambda cps ss rty cpp) =
37+ CppLambda cps ((\(a,t) -> (toUcns a, t)) <$> ss) rty cpp
38+unicodeToUCNs (CppVariableIntroduction (ss,t) qs cpp) =
39+ CppVariableIntroduction (toUcns ss, t) qs cpp
40+unicodeToUCNs (CppEnum s t ss) =
41+ CppEnum (toUcns <$> s) t (toUcns <$> ss)
42+unicodeToUCNs (CppStruct s cpps) =
43+ CppStruct (toUcns s) cpps
44+unicodeToUCNs (CppNamespace s cpps) =
45+ CppNamespace (toUcns s) cpps
46+unicodeToUCNs (CppUseNamespace s) =
47+ CppUseNamespace (toUcns s)
48+unicodeToUCNs (CppTypeAlias (s1,ss) t s2) =
49+ CppTypeAlias (toUcns s1, (\(a,n) -> (toUcns a, n)) <$> ss) t (toUcns s2)
50+unicodeToUCNs cpp = cpp
51+
52+---------------------------------------------------------------------------------------------------
53+toUcns :: String -> String
54+---------------------------------------------------------------------------------------------------
55+toUcns s | any (not . isAscii) s = concatMap toUcn s
56+ where
57+ toUcn :: Char -> String
58+ toUcn c | isAscii c = [c]
59+ toUcn c = printf "\\U%08x" $ ord c
60+toUcns s = s