aboutsummaryrefslogtreecommitdiff
path: root/Regex.icl
blob: 87ab7035ae66b3afe87ec133f5063d5afa7a9803 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
implementation module Regex

import StdEnv
import StdMaybe
import code from "regex.o"

:: Regex = { ptr :: Int         // pointer to a pcre2_code object
           , str :: String      // string representation
           }

instance toRegex String
where toRegex flags s
      # r         = c_compile s flags
      | r == 0    = Nothing
      | otherwise = Just {ptr=r, str=s}
      where
          c_compile :: !String !Int -> Int
          c_compile reg flags = code {
              ccall cleanregex_pcre2_compile "SI:p"
          }

instance fromRegex String where fromRegex {str} = str

instance toString Regex where toString r = fromRegex r
instance fromString (Maybe Regex) where fromString s = toRegex zero s

instance zero Flags where zero = 0

match :: !Regex !String -> Maybe Int
match {ptr} s
# res       = match` ptr s
| res < 0   = Nothing
| otherwise = Just res
where
    match` :: !Int !String -> Int
    match` _ _ = code {
        ccall cleanregex_match "pS:I"
    }