This is an automated email from the git hooks/post-receive script. glondu pushed a commit to branch master in repository pcre-ocaml.
commit 0d0b646c154ef47685dbab27d6531127d8a02d40 Author: Stephane Glondu <st...@glondu.net> Date: Wed Aug 3 13:44:42 2016 +0200 Imported Upstream version 7.2.0 --- CHANGES.txt | 4 ++++ _oasis | 6 ++--- examples/pcregrep/pcregrep.ml | 5 ++--- lib/META | 4 ++-- lib/pcre.ml | 50 +++++++++++++++--------------------------- lib/pcre.mli | 5 ++--- lib/pcre_stubs.c | 51 +++++++++++++++++++++++-------------------- myocamlbuild.ml | 8 ++++--- setup.ml | 13 ++++++----- 9 files changed, 70 insertions(+), 76 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 072bfc1..21b00c2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,7 @@ +2016-02-22: Fixed a subgroup matching bug. + + Thanks to Cheng Lou for the bug report! + 2015-08-21: Made GC less aggressive reclaiming regexps and chartables. 2014-12-10: Fixed another limit handling bug in the full_split function. diff --git a/_oasis b/_oasis index 0488f46..6d6758d 100644 --- a/_oasis +++ b/_oasis @@ -1,10 +1,10 @@ OASISFormat: 0.4 Name: pcre -Version: 7.1.6 +Version: 7.2.0 Synopsis: pcre-ocaml - bindings to the Perl Compatibility Regular Expressions library Description: pcre-ocaml offers library functions for string pattern matching and substitution, similar to the functionality offered by the Perl language. Authors: Markus Mottl <markus.mo...@gmail.com> -Copyrights: (C) 1999-2015 Markus Mottl <markus.mo...@gmail.com> +Copyrights: (C) 1999-2016 Markus Mottl <markus.mo...@gmail.com> Maintainers: Markus Mottl <markus.mo...@gmail.com> LicenseFile: COPYING.txt License: LGPL-2.1+ with OCaml linking exception @@ -32,7 +32,7 @@ Library pcre BuildDepends: bytes CCOpt: -g -O2 -fPIC -DPIC if flag(strict) && ccomp_type(cc) - CCOpt+: -Wall -pedantic -Wextra -Wunused -Wno-long-long + CCOpt+: -Wall -pedantic -Wextra -Wunused -Wno-long-long -Wno-keyword-macro # Examples diff --git a/examples/pcregrep/pcregrep.ml b/examples/pcregrep/pcregrep.ml index 125ae16..1c31528 100644 --- a/examples/pcregrep/pcregrep.ml +++ b/examples/pcregrep/pcregrep.ml @@ -54,7 +54,7 @@ let _ = let rex, files = parse_args () and rfl = rflags [] in - let subgroups2, ovector = make_ovector rex in + let _, ovector = make_ovector rex in let pcregrep file name = let ret_code = ref 1 @@ -72,8 +72,7 @@ let _ = let try_match line = let matched = try - unsafe_pcre_exec - rfl rex ~pos:0 ~subj_start:0 ~subj:line ~subgroups2 ovector None; + unsafe_pcre_exec rfl rex ~pos:0 ~subj_start:0 ~subj:line ovector None; if !whole_lines && ovector.(1) <> String.length line then false else true with Not_found -> false in diff --git a/lib/META b/lib/META index bb49166..ba54349 100644 --- a/lib/META +++ b/lib/META @@ -1,6 +1,6 @@ # OASIS_START -# DO NOT EDIT (digest: 46f60b1fadbd7e6335f389b0d4471def) -version = "7.1.6" +# DO NOT EDIT (digest: 093107e478c4b229806291bc9be362f2) +version = "7.2.0" description = "pcre-ocaml - bindings to the Perl Compatibility Regular Expressions library" requires = "bytes" diff --git a/lib/pcre.ml b/lib/pcre.ml index 07f162d..8bcd5ef 100644 --- a/lib/pcre.ml +++ b/lib/pcre.ml @@ -384,7 +384,6 @@ external unsafe_pcre_exec : pos : int -> subj_start : int -> subj : string -> - subgroups2 : int -> int array -> callout option -> unit = "pcre_exec_stub_bc" "pcre_exec_stub" @@ -398,9 +397,8 @@ let pcre_exec ?(iflags = 0) ?flags ?(rex = def_rex) ?pat ?(pos = 0) ?callout subj = let rex = match pat with Some str -> regexp str | _ -> rex in let iflags = match flags with Some flags -> rflags flags | _ -> iflags in - let subgroups2, ovector = make_ovector rex in - unsafe_pcre_exec - iflags rex ~pos ~subj_start:0 ~subj ~subgroups2 ovector callout; + let _, ovector = make_ovector rex in + unsafe_pcre_exec iflags rex ~pos ~subj_start:0 ~subj ovector callout; ovector let exec ?iflags ?flags ?rex ?pat ?pos ?callout subj = @@ -581,7 +579,7 @@ let replace ?(iflags = 0) ?flags ?(rex = def_rex) ?pat try unsafe_pcre_exec iflags rex ~pos:cur_pos ~subj_start:0 ~subj - ~subgroups2 ovector callout; + ovector callout; false with Not_found -> true then @@ -625,14 +623,13 @@ let qreplace ?(iflags = 0) ?flags ?(rex = def_rex) ?pat let subj_len = String.length subj in if pos < 0 || pos > subj_len then invalid_arg "Pcre.qreplace: illegal offset"; let templ_len = String.length templ in - let subgroups2, ovector = make_ovector rex in + let _, ovector = make_ovector rex in let rec loop full_len subst_lst cur_pos = if cur_pos > subj_len || try unsafe_pcre_exec - iflags rex ~pos:cur_pos ~subj_start:0 ~subj - ~subgroups2 ovector callout; + iflags rex ~pos:cur_pos ~subj_start:0 ~subj ovector callout; false with Not_found -> true then @@ -674,14 +671,13 @@ let substitute_substrings ?(iflags = 0) ?flags ?(rex = def_rex) ?pat let iflags = match flags with Some flags -> rflags flags | _ -> iflags in let subj_len = String.length subj in if pos < 0 || pos > subj_len then invalid_arg "Pcre.substitute: illegal offset"; - let subgroups2, ovector = make_ovector rex in + let _, ovector = make_ovector rex in let rec loop full_len subst_lst cur_pos = if cur_pos > subj_len || try unsafe_pcre_exec - iflags rex ~pos:cur_pos ~subj_start:0 ~subj - ~subgroups2 ovector callout; + iflags rex ~pos:cur_pos ~subj_start:0 ~subj ovector callout; false with Not_found -> true then @@ -736,9 +732,7 @@ let replace_first ?(iflags = 0) ?flags ?(rex = def_rex) ?pat ?(pos = 0) failwith "Pcre.replace_first: backreference denotes nonexistent subpattern"; if with_lp && nsubs = 0 then failwith "Pcre.replace_first: no backreferences"; try - unsafe_pcre_exec - iflags rex ~pos ~subj_start:0 ~subj - ~subgroups2 ovector callout; + unsafe_pcre_exec iflags rex ~pos ~subj_start:0 ~subj ovector callout; let res_len, trans_lst = calc_trans_lst subgroups2 ovector subj templ subst_lst in let first = Array.unsafe_get ovector 0 in @@ -757,11 +751,9 @@ let qreplace_first ?(iflags = 0) ?flags ?(rex = def_rex) ?pat ?(pos = 0) ?(templ = "") ?callout subj = let rex = match pat with Some str -> regexp str | _ -> rex in let iflags = match flags with Some flags -> rflags flags | _ -> iflags in - let subgroups2, ovector = make_ovector rex in + let _, ovector = make_ovector rex in try - unsafe_pcre_exec - iflags rex ~pos ~subj_start:0 ~subj - ~subgroups2 ovector callout; + unsafe_pcre_exec iflags rex ~pos ~subj_start:0 ~subj ovector callout; let first = Array.unsafe_get ovector 0 in let last = Array.unsafe_get ovector 1 in let len = String.length templ in @@ -778,11 +770,9 @@ let substitute_substrings_first ?(iflags = 0) ?flags ?(rex = def_rex) ?pat ?(pos = 0) ?callout ~subst subj = let rex = match pat with Some str -> regexp str | _ -> rex in let iflags = match flags with Some flags -> rflags flags | _ -> iflags in - let subgroups2, ovector = make_ovector rex in + let _, ovector = make_ovector rex in try - unsafe_pcre_exec - iflags rex ~pos ~subj_start:0 ~subj - ~subgroups2 ovector callout; + unsafe_pcre_exec iflags rex ~pos ~subj_start:0 ~subj ovector callout; let subj_len = String.length subj in let prefix_len = Array.unsafe_get ovector 0 in let last = Array.unsafe_get ovector 1 in @@ -841,8 +831,7 @@ let internal_psplit flags rex max pos callout subj = if prematch && try unsafe_pcre_exec - flags rex ~pos ~subj_start:pos ~subj - ~subgroups2 ovector callout; + flags rex ~pos ~subj_start:pos ~subj ovector callout; true with Not_found -> false then @@ -856,8 +845,7 @@ let internal_psplit flags rex max pos callout subj = if try unsafe_pcre_exec - flags rex ~pos ~subj_start:pos ~subj - ~subgroups2 ovector callout; + flags rex ~pos ~subj_start:pos ~subj ovector callout; false with Not_found -> true then string_unsafe_sub subj pos len :: strs @@ -872,7 +860,7 @@ let internal_psplit flags rex max pos callout subj = try unsafe_pcre_exec (flags lor 0x0410) rex ~pos ~subj_start:pos ~subj - ~subgroups2 ovector callout; + ovector callout; true with Not_found -> false then @@ -964,8 +952,7 @@ let full_split ?(iflags = 0) ?flags ?(rex = def_rex) ?pat if prematch && try unsafe_pcre_exec - iflags rex ~pos ~subj_start:pos ~subj - ~subgroups2 ovector callout; + iflags rex ~pos ~subj_start:pos ~subj ovector callout; true with Not_found -> false then @@ -983,8 +970,7 @@ let full_split ?(iflags = 0) ?flags ?(rex = def_rex) ?pat if try unsafe_pcre_exec - iflags rex ~pos ~subj_start:pos ~subj - ~subgroups2 ovector callout; + iflags rex ~pos ~subj_start:pos ~subj ovector callout; false with Not_found -> true then @@ -1002,7 +988,7 @@ let full_split ?(iflags = 0) ?flags ?(rex = def_rex) ?pat try unsafe_pcre_exec (iflags lor 0x0410) rex ~pos ~subj_start:pos ~subj - ~subgroups2 ovector callout; + ovector callout; true with Not_found -> false then diff --git a/lib/pcre.mli b/lib/pcre.mli index 723f517..b446a4d 100644 --- a/lib/pcre.mli +++ b/lib/pcre.mli @@ -916,12 +916,11 @@ external unsafe_pcre_exec : pos : int -> subj_start : int -> subj : string -> - subgroups2 : int -> int array -> callout option -> unit = "pcre_exec_stub_bc" "pcre_exec_stub" -(** [unsafe_pcre_exec flags rex ~pos ~subj_start ~subj ~subgroups2 - offset_vector]. You should read the C-source to know what happens. +(** [unsafe_pcre_exec flags rex ~pos ~subj_start ~subj offset_vector]. + You should read the C-source to know what happens. If you do not understand it - {b don't use this function!} *) val make_ovector : regexp -> int * int array diff --git a/lib/pcre_stubs.c b/lib/pcre_stubs.c index 68702be..dbee6f6 100644 --- a/lib/pcre_stubs.c +++ b/lib/pcre_stubs.c @@ -70,7 +70,7 @@ typedef const unsigned char *chartables; /* Type of chartable sets */ /* Contents of callout data */ struct cod { - long subj_start; /* Start of subject string */ + long subj_start; /* Start of subject string */ value *v_substrings_p; /* Pointer to substrings matched so far */ value *v_cof_p; /* Pointer to callout function */ value v_exn; /* Possible exception raised by callout function */ @@ -187,7 +187,7 @@ static void pcre_dealloc_regexp(value v_rex) { void *extra = (void *) Field(v_rex, 2); (pcre_free)((void *) Field(v_rex, 1)); - if (extra != NULL) (pcre_free)(extra); + if (extra != NULL) pcre_free_study(extra); } /* Makes OCaml-string from PCRE-version */ @@ -306,7 +306,7 @@ CAMLprim value pcre_set_imp_match_limit_recursion_stub(value v_rex, value v_lim) { pcre_extra *extra = (pcre_extra *) Field(v_rex, 2); if (extra == NULL) { - extra = caml_stat_alloc(sizeof(pcre_extra)); + extra = pcre_malloc(sizeof(pcre_extra)); extra->flags = PCRE_EXTRA_MATCH_LIMIT_RECURSION; Field(v_rex, 2) = (value) extra; } else { @@ -336,7 +336,7 @@ CAMLprim value pcre_set_imp_match_limit_stub(value v_rex, value v_lim) { pcre_extra *extra = (pcre_extra *) Field(v_rex, 2); if (extra == NULL) { - extra = caml_stat_alloc(sizeof(pcre_extra)); + extra = pcre_malloc(sizeof(pcre_extra)); extra->flags = PCRE_EXTRA_MATCH_LIMIT; Field(v_rex, 2) = (value) extra; } else { @@ -496,19 +496,33 @@ static inline void handle_exec_error(char *loc, const int ret) } } +static inline void handle_pcre_exec_result( + value v_ovec, long ovec_len, long subj_start, int ret) +{ + int *ovec = (int *) &Field(v_ovec, 0); + const int subgroups2 = ret * 2; + const int subgroups2_1 = subgroups2 - 1; + const int *ovec_src = ovec + subgroups2_1; + ovec_dst_ptr ovec_clear_stop = (ovec_dst_ptr) ovec + (ovec_len * 2) / 3; + ovec_dst_ptr ovec_dst = (ovec_dst_ptr) ovec + subgroups2_1; + copy_ovector(subj_start, ovec_src, ovec_dst, subgroups2); + while (++ovec_dst < ovec_clear_stop) *ovec_dst = -1; +} + /* Executes a pattern match with runtime options, a regular expression, a matching position, the start of the the subject string, a subject string, a number of subgroup offsets, an offset vector and an optional callout function */ CAMLprim value pcre_exec_stub(value v_opt, value v_rex, value v_pos, value v_subj_start, value v_subj, - value v_subgroups2, value v_ovec, - value v_maybe_cof) + value v_ovec, value v_maybe_cof) { + int ret; long pos = Long_val(v_pos), len = caml_string_length(v_subj), subj_start = Long_val(v_subj_start); + long ovec_len = caml_array_length(v_ovec); if (pos > len || pos < subj_start) caml_invalid_argument("Pcre.pcre_exec_stub: illegal position"); @@ -525,24 +539,16 @@ CAMLprim value pcre_exec_stub(value v_opt, value v_rex, value v_pos, const char *ocaml_subj = String_val(v_subj) + subj_start; /* Subject string */ const int opt = Int_val(v_opt); /* Runtime options */ - int subgroups2 = Int_val(v_subgroups2); - const int subgroups2_1 = subgroups2 - 1; - const int subgroups3 = (subgroups2 >> 1) + subgroups2; /* Special case when no callout functions specified */ if (v_maybe_cof == None) { int *ovec = (int *) &Field(v_ovec, 0); /* Performs the match */ - const int ret = - pcre_exec(code, extra, ocaml_subj, len, pos, opt, ovec, subgroups3); + ret = pcre_exec(code, extra, ocaml_subj, len, pos, opt, ovec, ovec_len); if (ret < 0) handle_exec_error("pcre_exec_stub", ret); - else { - const int *ovec_src = ovec + subgroups2_1; - ovec_dst_ptr ovec_dst = (ovec_dst_ptr) ovec + subgroups2_1; - copy_ovector(subj_start, ovec_src, ovec_dst, subgroups2); - } + else handle_pcre_exec_result(v_ovec, ovec_len, subj_start, ret); } /* There are callout functions */ @@ -550,8 +556,7 @@ CAMLprim value pcre_exec_stub(value v_opt, value v_rex, value v_pos, value v_cof = Field(v_maybe_cof, 0); value v_substrings; char *subj = caml_stat_alloc(sizeof(char) * len); - int *ovec = caml_stat_alloc(sizeof(int) * subgroups3); - int ret; + int *ovec = caml_stat_alloc(sizeof(int) * ovec_len); struct cod cod = { 0, (value *) NULL, (value *) NULL, (value) NULL }; struct pcre_extra new_extra = #ifdef PCRE_EXTRA_MATCH_LIMIT_RECURSION @@ -585,7 +590,7 @@ CAMLprim value pcre_exec_stub(value v_opt, value v_rex, value v_pos, if (extra == NULL) { ret = pcre_exec(code, &new_extra, subj, len, pos, opt, ovec, - subgroups3); + ovec_len); } else { new_extra.flags = PCRE_EXTRA_CALLOUT_DATA | extra->flags; @@ -597,7 +602,7 @@ CAMLprim value pcre_exec_stub(value v_opt, value v_rex, value v_pos, #endif ret = pcre_exec(code, &new_extra, subj, len, pos, opt, ovec, - subgroups3); + ovec_len); } caml_stat_free(subj); @@ -608,9 +613,7 @@ CAMLprim value pcre_exec_stub(value v_opt, value v_rex, value v_pos, if (ret == PCRE_ERROR_CALLOUT) caml_raise(cod.v_exn); else handle_exec_error("pcre_exec_stub(callout)", ret); } else { - int *ovec_src = ovec + subgroups2_1; - ovec_dst_ptr ovec_dst = &Field(v_ovec, 0) + subgroups2_1; - copy_ovector(subj_start, ovec_src, ovec_dst, subgroups2); + handle_pcre_exec_result(v_ovec, ovec_len, subj_start, ret); caml_stat_free(ovec); } } @@ -624,7 +627,7 @@ CAMLprim value pcre_exec_stub(value v_opt, value v_rex, value v_pos, CAMLprim value pcre_exec_stub_bc(value *argv, int __unused argn) { return pcre_exec_stub(argv[0], argv[1], argv[2], argv[3], - argv[4], argv[5], argv[6], argv[7]); + argv[4], argv[5], argv[6]); } /* Generates a new set of chartables for the current locale (see man diff --git a/myocamlbuild.ml b/myocamlbuild.ml index 94937a5..a2a8bd9 100644 --- a/myocamlbuild.ml +++ b/myocamlbuild.ml @@ -1,5 +1,5 @@ (* OASIS_START *) -(* DO NOT EDIT (digest: 0a2bbc688e326d6a5236c3ef397baf42) *) +(* DO NOT EDIT (digest: f0facc1ae39d5d65514819e5e196ebdd) *) module OASISGettext = struct (* # 22 "src/oasis/OASISGettext.ml" *) @@ -647,7 +647,9 @@ let package_default = A "-ccopt"; A "-Wunused"; A "-ccopt"; - A "-Wno-long-long" + A "-Wno-long-long"; + A "-ccopt"; + A "-Wno-keyword-macro" ]) ]) ]; @@ -665,7 +667,7 @@ let conf = {MyOCamlbuildFindlib.no_automatic_syntax = false} let dispatch_default = MyOCamlbuildBase.dispatch_default conf package_default;; -# 669 "myocamlbuild.ml" +# 671 "myocamlbuild.ml" (* OASIS_STOP *) let () = diff --git a/setup.ml b/setup.ml index 340bf63..4f5840e 100644 --- a/setup.ml +++ b/setup.ml @@ -1,7 +1,7 @@ (* setup.ml generated for the first time by OASIS v0.3.0 *) (* OASIS_START *) -(* DO NOT EDIT (digest: 9386999e3424345a63db8a4c91e5ae7d) *) +(* DO NOT EDIT (digest: 60f0fcaadee205d5fbe6f170edbc241e) *) (* Regenerated by OASIS v0.4.5 Visit http://oasis.forge.ocamlcore.org for more information and @@ -6683,7 +6683,7 @@ let setup_t = alpha_features = []; beta_features = []; name = "pcre"; - version = "7.1.6"; + version = "7.2.0"; license = OASISLicense.DEP5License (OASISLicense.DEP5Unit @@ -6694,7 +6694,7 @@ let setup_t = }); license_file = Some "COPYING.txt"; copyrights = - ["(C) 1999-2015 Markus Mottl <markus.mo...@gmail.com>"]; + ["(C) 1999-2016 Markus Mottl <markus.mo...@gmail.com>"]; maintainers = ["Markus Mottl <markus.mo...@gmail.com>"]; authors = ["Markus Mottl <markus.mo...@gmail.com>"]; homepage = Some "http://mmottl.github.io/pcre-ocaml"; @@ -6785,7 +6785,8 @@ let setup_t = "-pedantic"; "-Wextra"; "-Wunused"; - "-Wno-long-long" + "-Wno-long-long"; + "-Wno-keyword-macro" ]) ]; bs_cclib = [(OASISExpr.EBool true, [])]; @@ -6982,7 +6983,7 @@ let setup_t = }; oasis_fn = Some "_oasis"; oasis_version = "0.4.5"; - oasis_digest = Some "�\146�\145\003bTN��J9<�Jc"; + oasis_digest = Some "X\138�7\133-\026��z�\016E�\137�"; oasis_exec = None; oasis_setup_args = []; setup_update = false @@ -6990,7 +6991,7 @@ let setup_t = let setup () = BaseSetup.setup setup_t;; -# 6994 "setup.ml" +# 6995 "setup.ml" (* OASIS_STOP *) let pcre_config = -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ocaml-maint/packages/pcre-ocaml.git _______________________________________________ Pkg-ocaml-maint-commits mailing list Pkg-ocaml-maint-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-ocaml-maint-commits