cgrep 6.4.17 → 6.4.18
raw patch · 10 files changed
+95/−124 lines, 10 files
Files
- README.md +1/−1
- cgrep.cabal +1/−1
- src/CGrep/Semantic/Cpp/Token.hs +23/−9
- src/CGrep/Semantic/Generic/Token.hs +18/−15
- src/CGrep/Semantic/Token.hs +3/−2
- src/CGrep/Semantic/WildCard.hs +39/−3
- src/CGrep/Strategy/Cpp/Semantic.hs +4/−50
- src/CGrep/Strategy/Cpp/Tokenizer.hs +1/−1
- src/CGrep/Strategy/Generic/Semantic.hs +4/−41
- src/Config.hs +1/−1
README.md view
@@ -4,7 +4,7 @@ Usage ----- -Cgrep 6.4.17 Usage: cgrep [OPTION] [PATTERN] files...+Cgrep 6.4.18 Usage: cgrep [OPTION] [PATTERN] files... cgrep [OPTIONS] [ITEM]
cgrep.cabal view
@@ -1,6 +1,6 @@ Name: cgrep Description: Cgrep: a context-aware grep for source codes-Version: 6.4.17+Version: 6.4.18 Synopsis: Command line tool Homepage: http://awgn.github.io/cgrep/ License: GPL-2
src/CGrep/Semantic/Cpp/Token.hs view
@@ -33,6 +33,7 @@ import qualified Data.HashMap.Strict as HM import qualified Data.ByteString.Char8 as C +import CGrep.Semantic.Token type TokenizerState = (Source, Offset, CppState) @@ -41,14 +42,14 @@ type Offset = Int -data Token = TokenIdentifier { toString :: String, offset :: Int } |- TokenDirective { toString :: String, offset :: Int } |- TokenKeyword { toString :: String, offset :: Int } |- TokenNumber { toString :: String, offset :: Int } |- TokenHeaderName { toString :: String, offset :: Int } |- TokenString { toString :: String, offset :: Int } |- TokenChar { toString :: String, offset :: Int } |- TokenOperOrPunct { toString :: String, offset :: Int }+data Token = TokenIdentifier { toString :: String, toOffset :: Int } |+ TokenDirective { toString :: String, toOffset :: Int } |+ TokenKeyword { toString :: String, toOffset :: Int } |+ TokenNumber { toString :: String, toOffset :: Int } |+ TokenHeaderName { toString :: String, toOffset :: Int } |+ TokenString { toString :: String, toOffset :: Int } |+ TokenChar { toString :: String, toOffset :: Int } |+ TokenOperOrPunct { toString :: String, toOffset :: Int } deriving (Show, Eq, Ord) @@ -65,6 +66,19 @@ } deriving (Show,Read,Eq) ++instance SemanticToken Token where+ tkIsIdentifier = isIdentifier+ tkIsString = isString+ tkIsChar = isChar+ tkIsNumber = isLiteralNumber+ tkIsKeyword = isKeyword+ tkEquivalent = tokenCompare+ tkToString = toString+ tkToOffset = toOffset+ tkToIdentif = TokenIdentifier++ -- Tokenize the source code in a list of Token -- Precondition: the C++ source code must be well-formed --@@ -206,7 +220,7 @@ len = fromIntegral $ length tstring (xs', w) = dropWhite $ C.drop (fromIntegral len) xs in- (token { offset = off }, (xs', off + len + w, nextCppState tstring state))+ (token { toOffset = off }, (xs', off + len + w, nextCppState tstring state)) getTokenIdOrKeyword, getTokenNumber,
src/CGrep/Semantic/Generic/Token.hs view
@@ -43,13 +43,26 @@ deriving (Eq, Enum, Show) -data Token = TokenAlpha { toString :: String, offset :: Offset } |- TokenDigit { toString :: String, offset :: Offset } |- TokenBracket { toString :: String, offset :: Offset } |- TokenLiteral { toString :: String, offset :: Offset } |- TokenOther { toString :: String, offset :: Offset }+data Token = TokenAlpha { toString :: String, toOffset :: Offset } |+ TokenDigit { toString :: String, toOffset :: Offset } |+ TokenBracket { toString :: String, toOffset :: Offset } |+ TokenLiteral { toString :: String, toOffset :: Offset } |+ TokenOther { toString :: String, toOffset :: Offset } deriving (Show, Eq, Ord) ++instance SemanticToken Token where+ tkIsIdentifier = _isTokenAlpha+ tkIsString = _isTokenLiteral+ tkIsChar = _isTokenLiteral+ tkIsNumber = _isTokenDigit+ tkIsKeyword = const False+ tkEquivalent = tokenCompare+ tkToString = toString+ tkToOffset = toOffset+ tkToIdentif = TokenAlpha++ _isTokenAlpha, _isTokenDigit, _isTokenBracket, _isTokenOther, _isTokenLiteral :: Token -> Bool _isTokenAlpha (TokenAlpha _ _) = True@@ -195,14 +208,4 @@ | x == '\'' -> TokenAccum StateLit1 (off+1) 0 (DL.singleton x) (out `DL.snoc` mkToken TokenBracket off acc) | x == '"' -> TokenAccum StateLit2 (off+1) 0 (DL.singleton x) (out `DL.snoc` mkToken TokenBracket off acc) | otherwise -> TokenAccum StateOther (off+1) 0 (acc `DL.snoc` x) out---instance SemanticToken Token where- tkIsIdentifier = _isTokenAlpha- tkIsString = _isTokenLiteral- tkIsChar = _isTokenLiteral- tkIsNumber = _isTokenDigit- tkIsKeyword = const False- tkToString = toString- tkEquivalent = tokenCompare
src/CGrep/Semantic/Token.hs view
@@ -25,7 +25,8 @@ tkIsChar :: t -> Bool tkIsNumber :: t -> Bool tkIsKeyword :: t -> Bool- tkToString :: t -> String tkEquivalent :: t -> t -> Bool-+ tkToString :: t -> String+ tkToOffset :: t -> Int+ tkToIdentif :: String -> Int -> t
src/CGrep/Semantic/WildCard.hs view
@@ -17,10 +17,12 @@ -- module CGrep.Semantic.WildCard (WildCard(..), MultiCard,+ wildCardMap,+ mkWildCardFromToken,+ combineMultiCard, filterTokensWithMultiCards, wildCardMatch, isWildCardPattern,- rmWildCardEscape, multiCardMatch) where import qualified Data.Map as M@@ -46,9 +48,43 @@ IdentifCard String deriving (Show, Eq, Ord) + type MultiCard a = [WildCard a] +wildCardMap :: M.Map String (WildCard a)+wildCardMap = M.fromList+ [+ ("ANY", AnyCard ),+ ("KEY", KeyWordCard ),+ ("OCT", OctCard ),+ ("HEX", HexCard ),+ ("NUM", NumberCard ),+ ("CHR", CharCard ),+ ("STR", StringCard ),+ ("LIT", StringCard )+ ]+++mkWildCardFromToken :: (SemanticToken a) => a -> WildCard a+mkWildCardFromToken t+ | tkIsIdentifier t = case () of+ _ | Just wc <- M.lookup str wildCardMap -> wc+ | isWildCardPattern str -> IdentifCard str+ | otherwise -> TokenCard $ tkToIdentif (rmWildCardEscape str) (tkToOffset t)+ where str = tkToString t+ | otherwise = TokenCard t+++combineMultiCard :: (SemanticToken a) => [MultiCard a] -> [MultiCard a]+combineMultiCard (m1:r@(m2:m3:ms))+ | [TokenCard b] <- m2, tkToString b == "OR" = combineMultiCard $ (m1++m3):ms+ | otherwise = m1 : combineMultiCard r+combineMultiCard [m1,m2] = [m1,m2]+combineMultiCard [m1] = [m1]+combineMultiCard [] = []++ filterTokensWithMultiCards :: (SemanticToken a) => Options -> [MultiCard a] -> [a] -> [a] filterTokensWithMultiCards opt ws = filterTokensWithMultiCards' opt (spanOptionalCards ws) @@ -84,8 +120,8 @@ isWildCardPattern :: String -> Bool isWildCardPattern s = case () of- _ | (x:y:_) <- s -> wprefix x && not (wprefix y)- | [x] <- s -> wprefix x+ _ | (x:y:_) <- s -> wprefix x && not (wprefix y)+ | [x] <- s -> wprefix x | otherwise -> error "isWildCardPattern" where wprefix x = x == '$' || x == '_'
src/CGrep/Strategy/Cpp/Semantic.hs view
@@ -19,7 +19,6 @@ module CGrep.Strategy.Cpp.Semantic (search) where import qualified Data.ByteString.Char8 as C- import qualified CGrep.Semantic.Cpp.Token as Cpp import CGrep.Filter@@ -27,11 +26,8 @@ import CGrep.Common import CGrep.Output -import CGrep.Semantic.Token import CGrep.Semantic.WildCard -import qualified Data.Map as M- import Data.List import Data.Function import Data.Maybe@@ -39,6 +35,7 @@ import Options import Debug + search :: CgrepFunction search opt ps f = do @@ -55,7 +52,7 @@ -- pre-process patterns patterns = map (Cpp.tokenizer . contextFilter (Just Cpp) filt) ps -- [ [t1,t2,..], [t1,t2...] ]- patterns' = map (map mkWildCard) patterns -- [ [w1,w2,..], [w1,w2,..] ]+ patterns' = map (map mkWildCardFromToken) patterns -- [ [w1,w2,..], [w1,w2,..] ] patterns'' = map (combineMultiCard . map (:[])) patterns' -- [ [m1,m2,..], [m1,m2,..] ] == [ [ [w1], [w2],..], [[w1],[w2],..]] -- quick Search...@@ -94,56 +91,13 @@ -- get matching tokens ... - tokens' = sortBy (compare `on` Cpp.offset) $ nub $ concatMap (\ms -> filterTokensWithMultiCards opt ms tokens) patterns''+ tokens' = sortBy (compare `on` Cpp.toOffset) $ nub $ concatMap (\ms -> filterTokensWithMultiCards opt ms tokens) patterns'' - matches = map (\t -> let n = fromIntegral (Cpp.offset t) in (n, Cpp.toString t)) tokens' :: [(Int, String)]+ matches = map (\t -> let n = fromIntegral (Cpp.toOffset t) in (n, Cpp.toString t)) tokens' :: [(Int, String)] putStrLevel2 (debug opt) $ "tokens : " ++ show tokens' putStrLevel2 (debug opt) $ "matches : " ++ show matches putStrLevel3 (debug opt) $ "---\n" ++ C.unpack text''' ++ "\n---" return $ mkOutput opt filename text text''' matches---instance SemanticToken Cpp.Token where- tkIsIdentifier = Cpp.isIdentifier- tkIsString = Cpp.isString- tkIsChar = Cpp.isChar- tkIsNumber = Cpp.isLiteralNumber- tkIsKeyword = Cpp.isKeyword- tkToString = Cpp.toString- tkEquivalent = Cpp.tokenCompare---wildCardMap :: M.Map String (WildCard a)-wildCardMap = M.fromList- [- ("ANY", AnyCard ),- ("KEY", KeyWordCard ),- ("OCT", OctCard ),- ("HEX", HexCard ),- ("NUM", NumberCard ),- ("CHR", CharCard ),- ("STR", StringCard ),- ("LIT", LiteralCard )- ]--mkWildCard :: Cpp.Token -> WildCard Cpp.Token-mkWildCard t@(Cpp.TokenIdentifier s off) =- case () of- _ | Just wc <- M.lookup str wildCardMap -> wc- | isWildCardPattern s -> IdentifCard str- | otherwise -> TokenCard $ Cpp.TokenIdentifier (rmWildCardEscape s) off- where str = tkToString t-mkWildCard t = TokenCard t---combineMultiCard :: [MultiCard Cpp.Token] -> [MultiCard Cpp.Token]-combineMultiCard (m1:r@(m2:m3:ms))- | [TokenCard (Cpp.TokenIdentifier {Cpp.toString = "OR"})] <- m2 = combineMultiCard $ (m1++m3):ms- | otherwise = m1 : combineMultiCard r-combineMultiCard [m1,m2] = [m1,m2]-combineMultiCard [m1] = [m1]-combineMultiCard [] = []-
src/CGrep/Strategy/Cpp/Tokenizer.hs view
@@ -84,7 +84,7 @@ -- convert Cpp.Tokens to CGrep.Tokens - matches = map (\t -> let off = fromIntegral (Cpp.offset t) in (off, Cpp.toString t)) tokens'' :: [(Int, String)]+ matches = map (\t -> let off = fromIntegral (Cpp.toOffset t) in (off, Cpp.toString t)) tokens'' :: [(Int, String)] putStrLevel2 (debug opt) $ "tokens : " ++ show tokens putStrLevel2 (debug opt) $ "tokens' : " ++ show tokens'
src/CGrep/Strategy/Generic/Semantic.hs view
@@ -19,6 +19,7 @@ module CGrep.Strategy.Generic.Semantic (search) where import qualified Data.ByteString.Char8 as C+import qualified CGrep.Semantic.Generic.Token as Generic import CGrep.Filter import CGrep.Lang@@ -28,8 +29,6 @@ import CGrep.Semantic.Token import CGrep.Semantic.WildCard -import qualified Data.Map as M- import Data.List import Data.Function import Data.Maybe@@ -37,7 +36,6 @@ import Options import Debug -import qualified CGrep.Semantic.Generic.Token as Generic search :: CgrepFunction search opt ps f = do@@ -55,7 +53,7 @@ -- pre-process patterns patterns = map (Generic.tokenizer . contextFilter (getLang opt filename) filt) ps -- [ [t1,t2,..], [t1,t2...] ]- patterns' = map (map mkWildCard) patterns -- [ [w1,w2,..], [w1,w2,..] ]+ patterns' = map (map mkWildCardFromToken) patterns -- [ [w1,w2,..], [w1,w2,..] ] patterns'' = map (combineMultiCard . map (:[])) patterns' -- [ [m1,m2,..], [m1,m2,..] ] == [ [ [w1], [w2],..], [[w1],[w2],..]] -- quickSearch ...@@ -93,48 +91,13 @@ -- get matching tokens ... - tokens' = sortBy (compare `on` Generic.offset) $ nub $ concatMap (\ms -> filterTokensWithMultiCards opt ms tokens) patterns''+ tokens' = sortBy (compare `on` Generic.toOffset) $ nub $ concatMap (\ms -> filterTokensWithMultiCards opt ms tokens) patterns'' - matches = map (\t -> let n = fromIntegral (Generic.offset t) in (n, Generic.toString t)) tokens' :: [(Int, String)]+ matches = map (\t -> let n = fromIntegral (Generic.toOffset t) in (n, Generic.toString t)) tokens' :: [(Int, String)] putStrLevel2 (debug opt) $ "tokens : " ++ show tokens' putStrLevel2 (debug opt) $ "matches : " ++ show matches- putStrLevel3 (debug opt) $ "---\n" ++ C.unpack text''' ++ "\n---" return $ mkOutput opt filename text text''' matches---wildCardMap :: M.Map String (WildCard a)-wildCardMap = M.fromList- [- ("ANY", AnyCard ),- ("KEY", KeyWordCard ),- ("OCT", OctCard ),- ("HEX", HexCard ),- ("NUM", NumberCard ),- ("CHR", CharCard ),- ("STR", StringCard ),- ("LIT", StringCard )- ]---mkWildCard :: Generic.Token -> WildCard Generic.Token-mkWildCard t@(Generic.TokenAlpha s off) =- case () of- _ | Just wc <- M.lookup str wildCardMap -> wc- | isWildCardPattern s -> IdentifCard str- | otherwise -> TokenCard $ Generic.TokenAlpha (rmWildCardEscape s) off- where str = tkToString t-mkWildCard t = TokenCard t---combineMultiCard :: [MultiCard Generic.Token] -> [MultiCard Generic.Token]-combineMultiCard (m1:r@(m2:m3:ms))- | [TokenCard (Generic.TokenAlpha {Generic.toString = "OR"})] <- m2 = combineMultiCard $ (m1++m3):ms- | otherwise = m1 : combineMultiCard r-combineMultiCard [m1,m2] = [m1,m2]-combineMultiCard [m1] = [m1]-combineMultiCard [] = []-
src/Config.hs view
@@ -31,7 +31,7 @@ cgreprc = "cgreprc" version :: String-version = "6.4.17"+version = "6.4.18" data Config = Config