X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fparser%2FCtype.lhs;h=d97d5e0c2121e605f93a9c842fc775d8cf56ff49;hb=423d477bfecd490de1449c59325c8776f91d7aac;hp=414aa4f39ee431dc2136943fc11ce4efafbc6351;hpb=553e90d9a32ee1b1809430f260c401cc4169c6c7;p=ghc-hetmet.git diff --git a/ghc/compiler/parser/Ctype.lhs b/ghc/compiler/parser/Ctype.lhs index 414aa4f..d97d5e0 100644 --- a/ghc/compiler/parser/Ctype.lhs +++ b/ghc/compiler/parser/Ctype.lhs @@ -9,12 +9,16 @@ module Ctype , is_lower -- Char# -> Bool , is_upper -- Char# -> Bool , is_digit -- Char# -> Bool + + , is_hexdigit, is_octdigit + , hexDigit, octDecDigit ) where #include "HsVersions.h" import DATA_INT ( Int32 ) import DATA_BITS ( Bits((.&.)) ) +import Char ( ord, chr ) \end{code} Bit masks @@ -48,6 +52,28 @@ is_upper = is_ctype cUpper is_digit = is_ctype cDigit \end{code} +Utils + +\begin{code} +hexDigit :: Char -> Int +hexDigit c | is_digit c = ord c - ord '0' + | otherwise = ord (to_lower c) - ord 'a' + 10 + +octDecDigit :: Char -> Int +octDecDigit c = ord c - ord '0' + +is_hexdigit c + = is_digit c + || (c >= 'a' && c <= 'f') + || (c >= 'A' && c <= 'F') + +is_octdigit c = c >= '0' && c <= '7' + +to_lower c + | c >= 'A' && c <= 'Z' = chr (ord c - (ord 'A' - ord 'a')) + | otherwise = c +\end{code} + We really mean .|. instead of + below, but GHC currently doesn't do any constant folding with bitops. *sigh*