packages feed

cgrep-8.0.0: src/CGrep/Parser/Char.hs

--
-- Copyright (c) 2013-2023 Nicola Bonelli <nicola@larthia.com>
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--

module CGrep.Parser.Char (
        chr
    ,   ord
    ,   isDigit
    ,   isSpace
    ,   isHexDigit
    ,   isCharNumber
    ,   isAlphaNum
    ,   isAlpha
    ,   isAlphaNum_
    ,   isAlpha_
    ,   isAlpha_'
    ,   isAlphaNum_'
    ,   isBracket'
    ,   isAlpha_and
    ,   isAlphaNum_and
) where

import GHC.Exts ( Char(C#), Int(I#), ord# )
import GHC.Base (isTrue#, int2Word#, leWord#, chr#)

ord :: Char -> Int
ord (C# c#) = I# (ord# c#)
{-# INLINE ord #-}


chr :: Int -> Char
chr i@(I# i#)
 | isTrue# (int2Word# i# `leWord#` 0x10FFFF##) = C# (chr# i#)
 | otherwise
    = errorWithoutStackTrace ("CGrep.Char: bad argument: " ++ show i)
{-# INLINE chr #-}


isDigit :: Char -> Bool
isDigit c =  (fromIntegral (ord c - ord '0') :: Word) <= 9
{-# INLINE isDigit #-}


isSpace :: Char -> Bool
isSpace c = uc == 32 || uc == 0xa0 || (uc - 0x9 <= 4) && not ctrl
  where
    uc = ord c
    ctrl = uc == 2 || uc == 3
{-# INLINE isSpace #-}


isHexDigit   :: Char -> Bool
isHexDigit c =  isDigit c ||
                (fromIntegral (ord c - ord 'A')::Word) <= 5 ||
                (fromIntegral (ord c - ord 'a')::Word) <= 5
{-# INLINE isHexDigit #-}


isCharNumber :: Char -> Bool
isCharNumber c = isHexDigit c || c `elem` (".xX" :: String)
{-# INLINE isCharNumber #-}


isAlphaNum :: Char -> Bool
isAlphaNum c = o >= 97 && o <= 122  ||
                o >= 65 && o <= 90  ||
                o >= 48 && o <= 57
    where o = ord c
{-# INLINE isAlphaNum #-}


isAlpha :: Char -> Bool
isAlpha c = o >= 97 && o <= 122 ||
            o >= 65 && o <= 90
    where o = ord c
{-# INLINE isAlpha #-}


isAlphaNum_ :: Char -> Bool
isAlphaNum_ c = o >= 97 && o <= 122 ||
                o >= 65 && o <= 90  ||
                o >= 48 && o <= 57  || c == '_'
    where o = ord c
{-# INLINE isAlphaNum_ #-}


isAlpha_ :: Char -> Bool
isAlpha_ c = o >= 97 && o <= 122 ||
             o >= 65 && o <= 90  || c == '_'
    where o = ord c
{-# INLINE isAlpha_ #-}


isAlpha_' :: Char -> Bool
isAlpha_' c = isAlpha_ c || c == '_' || c == '\''
{-# INLINE isAlpha_' #-}


isAlphaNum_' :: Char -> Bool
isAlphaNum_' c = isAlphaNum_ c || c == '_' || c == '\''
{-# INLINE isAlphaNum_' #-}


isBracket' :: Char -> Bool
isBracket' c = c `elem` ("[]{}()" :: String)
{-# INLINE isBracket' #-}


isAlpha_and :: String -> Char -> Bool
isAlpha_and s c = isAlpha_ c || c == '_' || c `elem` s
{-# INLINE isAlpha_and #-}


isAlphaNum_and :: String -> Char -> Bool
isAlphaNum_and s c = isAlphaNum_ c || c == '_' || c `elem` s
{-# INLINE isAlphaNum_and #-}