-- Character classification
{-# LANGUAGE CPP #-}
module Ctype
        ( is_ident      -- Char# -> Bool
        , is_symbol     -- Char# -> Bool
        , is_any        -- Char# -> Bool
        , is_space      -- Char# -> Bool
        , is_lower      -- Char# -> Bool
        , is_upper      -- Char# -> Bool
        , is_digit      -- Char# -> Bool
        , is_alphanum   -- Char# -> Bool

        , is_decdigit, is_hexdigit, is_octdigit, is_bindigit
        , hexDigit, octDecDigit
        ) where

#include "GhclibHsVersions.h"

import GhcPrelude

import Data.Bits        ( Bits((.&.),(.|.)) )
import Data.Char        ( ord, chr )
import Data.Word
import Panic

-- Bit masks

cIdent, cSymbol, cAny, cSpace, cLower, cUpper, cDigit :: Word8
cIdent :: Word8
cIdent  =  1
cSymbol :: Word8
cSymbol =  2
cAny :: Word8
cAny    =  4
cSpace :: Word8
cSpace  =  8
cLower :: Word8
cLower  = 16
cUpper :: Word8
cUpper  = 32
cDigit :: Word8
cDigit  = 64

-- | The predicates below look costly, but aren't, GHC+GCC do a great job
-- at the big case below.

{-# INLINABLE is_ctype #-}
is_ctype :: Word8 -> Char -> Bool
is_ctype :: Word8 -> Char -> Bool
is_ctype mask :: Word8
mask c :: Char
c = (Char -> Word8
charType Char
c Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. Word8
mask) Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= 0

is_ident, is_symbol, is_any, is_space, is_lower, is_upper, is_digit,
    is_alphanum :: Char -> Bool
is_ident :: Char -> Bool
is_ident  = Word8 -> Char -> Bool
is_ctype Word8
cIdent
is_symbol :: Char -> Bool
is_symbol = Word8 -> Char -> Bool
is_ctype Word8
cSymbol
is_any :: Char -> Bool
is_any    = Word8 -> Char -> Bool
is_ctype Word8
cAny
is_space :: Char -> Bool
is_space  = Word8 -> Char -> Bool
is_ctype Word8
cSpace
is_lower :: Char -> Bool
is_lower  = Word8 -> Char -> Bool
is_ctype Word8
cLower
is_upper :: Char -> Bool
is_upper  = Word8 -> Char -> Bool
is_ctype Word8
cUpper
is_digit :: Char -> Bool
is_digit  = Word8 -> Char -> Bool
is_ctype Word8
cDigit
is_alphanum :: Char -> Bool
is_alphanum = Word8 -> Char -> Bool
is_ctype (Word8
cLowerWord8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+Word8
cUpperWord8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+Word8
cDigit)

-- Utils

hexDigit :: Char -> Int
hexDigit :: Char -> Int
hexDigit c :: Char
c | Char -> Bool
is_decdigit Char
c = Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord '0'
           | Bool
otherwise     = Char -> Int
ord (Char -> Char
to_lower Char
c) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord 'a' Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 10

octDecDigit :: Char -> Int
octDecDigit :: Char -> Int
octDecDigit c :: Char
c = Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord '0'

is_decdigit :: Char -> Bool
is_decdigit :: Char -> Bool
is_decdigit c :: Char
c
        =  Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= '0' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= '9'

is_hexdigit :: Char -> Bool
is_hexdigit :: Char -> Bool
is_hexdigit c :: Char
c
        =  Char -> Bool
is_decdigit Char
c
        Bool -> Bool -> Bool
|| (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= 'a' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= 'f')
        Bool -> Bool -> Bool
|| (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= 'A' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= 'F')

is_octdigit :: Char -> Bool
is_octdigit :: Char -> Bool
is_octdigit c :: Char
c = Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= '0' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= '7'

is_bindigit :: Char -> Bool
is_bindigit :: Char -> Bool
is_bindigit c :: Char
c = Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '0' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '1'

to_lower :: Char -> Char
to_lower :: Char -> Char
to_lower c :: Char
c
  | Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>=  'A' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= 'Z' = Int -> Char
chr (Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- (Char -> Int
ord 'A' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord 'a'))
  | Bool
otherwise = Char
c

charType :: Char -> Word8
charType :: Char -> Word8
charType c :: Char
c = case Char
c of
   '\0'   -> 0                             -- \000
   '\1'   -> 0                             -- \001
   '\2'   -> 0                             -- \002
   '\3'   -> 0                             -- \003
   '\4'   -> 0                             -- \004
   '\5'   -> 0                             -- \005
   '\6'   -> 0                             -- \006
   '\7'   -> 0                             -- \007
   '\8'   -> 0                             -- \010
   '\9'   -> Word8
cSpace                        -- \t  (not allowed in strings, so !cAny)
   '\10'  -> Word8
cSpace                        -- \n  (ditto)
   '\11'  -> Word8
cSpace                        -- \v  (ditto)
   '\12'  -> Word8
cSpace                        -- \f  (ditto)
   '\13'  -> Word8
cSpace                        --  ^M (ditto)
   '\14'  -> 0                             -- \016
   '\15'  -> 0                             -- \017
   '\16'  -> 0                             -- \020
   '\17'  -> 0                             -- \021
   '\18'  -> 0                             -- \022
   '\19'  -> 0                             -- \023
   '\20'  -> 0                             -- \024
   '\21'  -> 0                             -- \025
   '\22'  -> 0                             -- \026
   '\23'  -> 0                             -- \027
   '\24'  -> 0                             -- \030
   '\25'  -> 0                             -- \031
   '\26'  -> 0                             -- \032
   '\27'  -> 0                             -- \033
   '\28'  -> 0                             -- \034
   '\29'  -> 0                             -- \035
   '\30'  -> 0                             -- \036
   '\31'  -> 0                             -- \037
   '\32'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSpace               --
   '\33'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- !
   '\34'  -> Word8
cAny                          -- "
   '\35'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              --  #
   '\36'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              --  $
   '\37'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- %
   '\38'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- &
   '\39'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent               -- '
   '\40'  -> Word8
cAny                          -- (
   '\41'  -> Word8
cAny                          -- )
   '\42'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              --  *
   '\43'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- +
   '\44'  -> Word8
cAny                          -- ,
   '\45'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- -
   '\46'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- .
   '\47'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              --  /
   '\48'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 0
   '\49'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 1
   '\50'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 2
   '\51'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 3
   '\52'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 4
   '\53'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 5
   '\54'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 6
   '\55'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 7
   '\56'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 8
   '\57'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cDigit   -- 9
   '\58'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- :
   '\59'  -> Word8
cAny                          -- ;
   '\60'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- <
   '\61'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- =
   '\62'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- >
   '\63'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- ?
   '\64'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- @
   '\65'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- A
   '\66'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- B
   '\67'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- C
   '\68'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- D
   '\69'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- E
   '\70'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- F
   '\71'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- G
   '\72'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- H
   '\73'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- I
   '\74'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- J
   '\75'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- K
   '\76'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- L
   '\77'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- M
   '\78'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- N
   '\79'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- O
   '\80'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- P
   '\81'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- Q
   '\82'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- R
   '\83'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- S
   '\84'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- T
   '\85'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- U
   '\86'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- V
   '\87'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- W
   '\88'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- X
   '\89'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- Y
   '\90'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cUpper   -- Z
   '\91'  -> Word8
cAny                          -- [
   '\92'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- backslash
   '\93'  -> Word8
cAny                          -- ]
   '\94'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              --  ^
   '\95'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- _
   '\96'  -> Word8
cAny                          -- `
   '\97'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- a
   '\98'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- b
   '\99'  -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- c
   '\100' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- d
   '\101' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- e
   '\102' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- f
   '\103' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- g
   '\104' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- h
   '\105' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- i
   '\106' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- j
   '\107' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- k
   '\108' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- l
   '\109' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- m
   '\110' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- n
   '\111' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- o
   '\112' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- p
   '\113' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- q
   '\114' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- r
   '\115' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- s
   '\116' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- t
   '\117' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- u
   '\118' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- v
   '\119' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- w
   '\120' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- x
   '\121' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- y
   '\122' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cIdent  Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cLower   -- z
   '\123' -> Word8
cAny                          -- {
   '\124' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              --  |
   '\125' -> Word8
cAny                          -- }
   '\126' -> Word8
cAny Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
cSymbol              -- ~
   '\127' -> 0                             -- \177
   _ -> String -> Word8
forall a. String -> a
panic ("charType: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Char -> String
forall a. Show a => a -> String
show Char
c)