-- Names are obfuscated quite a bit in GHC-Core.
-- This module gives functions to unobfuscate them.
-- Described in the GHC source code in ghc/compiler/basicTypes/OccName.lhs
module UnObfusc(unObfusc) where
import Char(isDigit, chr, digitToInt)
unObfusc :: String -> String
unObfusc s = decode s
decode :: String -> String
decode [] = []
decode ('Z' : rest) = decode_escape rest
decode ('z' : rest) = decode_escape rest
decode (c : rest) = c : decode rest
decode_escape :: String -> String
decode_escape ('L' : rest) = '(' : decode rest
decode_escape ('R' : rest) = ')' : decode rest
decode_escape ('M' : rest) = '[' : decode rest
decode_escape ('N' : rest) = ']' : decode rest
decode_escape ('C' : rest) = ':' : decode rest
decode_escape ('Z' : rest) = 'Z' : decode rest
decode_escape ('z' : rest) = 'z' : decode rest
decode_escape ('a' : rest) = '&' : decode rest
decode_escape ('b' : rest) = '|' : decode rest
decode_escape ('c' : rest) = '^' : decode rest
decode_escape ('d' : rest) = '$' : decode rest
decode_escape ('e' : rest) = '=' : decode rest
decode_escape ('g' : rest) = '>' : decode rest
decode_escape ('h' : rest) = '#' : decode rest
decode_escape ('i' : rest) = '.' : decode rest
decode_escape ('l' : rest) = '<' : decode rest
decode_escape ('m' : rest) = '-' : decode rest
decode_escape ('n' : rest) = '!' : decode rest
decode_escape ('p' : rest) = '+' : decode rest
decode_escape ('q' : rest) = '\'' : decode rest
decode_escape ('r' : rest) = '\\' : decode rest
decode_escape ('s' : rest) = '/' : decode rest
decode_escape ('t' : rest) = '*' : decode rest
decode_escape ('u' : rest) = '_' : decode rest
decode_escape ('v' : rest) = '%' : decode rest
decode_escape (c : rest)
| isDigit c = go (digitToInt c) rest
where
go n (c : rest) | isDigit c = go (10*n + digitToInt c) rest
go 0 ('T' : rest) = "()" ++ (decode rest)
go n ('T' : rest) = '(' : replicate (n-1) ',' ++ ')' :
decode rest
go 1 ('H' : rest) = "(# #)" ++ (decode rest)
go n ('H' : rest) = '(' : '#' : replicate (n-1) ',' ++ '#' :
')' : decode rest
go n ('U' : rest) = chr n : decode rest