diff --git a/re-pcre/re.py b/re-pcre/re.py index c83fc754..d570ccf6 100644 --- a/re-pcre/re.py +++ b/re-pcre/re.py @@ -14,12 +14,19 @@ pcre_compile = pcre.func("p", "pcre_compile", "sipps") # int options, int *ovector, int ovecsize); pcre_exec = pcre.func("i", "pcre_exec", "ppsiiipi") +# int pcre_fullinfo(const pcre *code, const pcre_extra *extra, +# int what, void *where); +pcre_fullinfo = pcre.func("i", "pcre_fullinfo", "ppip") + + IGNORECASE = I = 1 MULTILINE = M = 2 DOTALL = S = 4 VERBOSE = X = 8 PCRE_ANCHORED = 0x10 +PCRE_INFO_CAPTURECOUNT = 2 + class PCREMatch: @@ -38,7 +45,10 @@ class PCREPattern: self.obj = compiled_ptn def search(self, s, _flags=0): - ov = array.array('i', [0, 0, 0] * 2) + buf = bytes(4) + pcre_fullinfo(self.obj, None, PCRE_INFO_CAPTURECOUNT, buf) + cap_count = int.from_bytes(buf) + ov = array.array('i', [0, 0, 0] * (cap_count + 1)) num = pcre_exec(self.obj, None, s, len(s), 0, _flags, ov, len(ov)) if num == -1: # No match