module URLdecode(Query,decodeQuery,decode, -- ** Helper functions fromhex4,fromhex2,fromhex) where import Utils2(aboth,chopList,breakAt) import Data.Char(chr,ord,toUpper) import URLQuery -- | The function 'decodeQuery' undoes the effect of 'URLencode.encodeQuery'. decodeQuery :: String -> Query decodeQuery = map (aboth decode . breakAt '=') . chopList (breakAt '&') -- | The function 'decode' undoes the effect of 'URLencode.encode'. decode :: String->String decode [] = [] decode ('%':'u':d1:d2:d3:d4:cs) = chr(fromhex4 d1 d2 d3 d4):decode cs decode ('%':d1:d2:cs) = chr(fromhex2 d1 d2):decode cs decode ('+':cs) = ' ':decode cs decode (c:cs) = c:decode cs -- ** Helper functions fromhex4 d1 d2 d3 d4 = 256*fromhex2 d1 d2+fromhex2 d3 d4 fromhex2 d1 d2 = 16*fromhex d1+fromhex d2 fromhex c = if '0'<=c && c<='9' then ord c - ord '0' else ord (toUpper c)-(ord 'A'-10)