X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2FDEVEL%2Fpxp%2Fnetstring%2Fnetstring_str.ml;fp=helm%2FDEVEL%2Fpxp%2Fnetstring%2Fnetstring_str.ml;h=7353719dcc7c1dc036996692ca87b8378ed9ee33;hb=c03d2c1fdab8d228cb88aaba5ca0f556318bebc5;hp=0000000000000000000000000000000000000000;hpb=758057e85325f94cd88583feb1fdf6b038e35055;p=helm.git diff --git a/helm/DEVEL/pxp/netstring/netstring_str.ml b/helm/DEVEL/pxp/netstring/netstring_str.ml new file mode 100644 index 000000000..7353719dc --- /dev/null +++ b/helm/DEVEL/pxp/netstring/netstring_str.ml @@ -0,0 +1,241 @@ +(* $Id$ + * ---------------------------------------------------------------------- + * + *) + +let lock = ref (fun () -> ());; +let unlock = ref (fun () -> ());; + +let init_mt new_lock new_unlock = + lock := new_lock; + unlock := new_unlock +;; + +let protect f = + !lock(); + try + let r = f() in + !unlock(); + r + with + x -> + !unlock(); + raise x +;; + +type regexp = Str.regexp;; +type split_result = Str.split_result = Text of string | Delim of string;; + +type result = + { pos : int; + match_beg : int; + match_end : int; + group_beg : int array; + group_end : int array; + } +;; + +let regexp s = + protect + (fun () -> Str.regexp s) +;; + +let regexp_case_fold s = + protect + (fun () -> Str.regexp_case_fold s) +;; + +let quote s = + protect + (fun () -> Str.quote s) +;; + +let regexp_string s = + protect + (fun () -> Str.regexp_string s) +;; + +let regexp_string_case_fold s = + protect + (fun () -> Str.regexp_string_case_fold s) +;; + +let return_result pos n_groups = + let r = + { pos = pos; + match_beg = (try Str.match_beginning() with Not_found -> -1); + match_end = (try Str.match_end() with Not_found -> -1); + group_beg = Array.create n_groups (-1); + group_end = Array.create n_groups (-1); + } + in + for g = 0 to n_groups - 1 do + r.group_beg.(g) <- (try Str.group_beginning (g+1) with Not_found -> -1); + r.group_end.(g) <- (try Str.group_end (g+1) with Not_found -> -1); + done; + r +;; + +let string_match ?(groups = 9) ~pat s ~pos = + protect + (fun () -> + if Str.string_match pat s pos then + Some (return_result pos groups) + else + None + ) +;; + +let string_partial_match ?(groups = 9) ~pat s ~pos = + protect + (fun () -> + if Str.string_partial_match pat s pos then + Some (return_result pos groups) + else + None + ) +;; + +let search_forward ?(groups = 9) ~pat s ~pos = + protect + (fun () -> + let i = Str.search_forward pat s pos in + i, return_result pos groups + ) +;; + +let search_backward ?(groups = 9) ~pat s ~pos = + protect + (fun () -> + let i = Str.search_backward pat s pos in + i, return_result pos groups + ) +;; + +let matched_string result s = + if result.match_beg < 0 or result.match_end < 0 then raise Not_found; + String.sub s result.match_beg (result.match_end - result.match_beg) +;; + +let match_beginning result = + if result.match_beg < 0 then raise Not_found; + result.match_beg +;; + +let match_end result = + if result.match_end < 0 then raise Not_found; + result.match_end +;; + +let matched_group result n s = + if n < 0 || n >= Array.length result.group_beg then raise Not_found; + let gbeg = result.group_beg.(n-1) in + let gend = result.group_end.(n-1) in + if gbeg < 0 or gend < 0 then raise Not_found; + String.sub s gbeg (gend - gbeg) +;; + +let group_beginning result n = + if n < 0 || n >= Array.length result.group_beg then raise Not_found; + let gbeg = result.group_beg.(n-1) in + if gbeg < 0 then raise Not_found else + gbeg +;; + +let group_end result n = + if n < 0 || n >= Array.length result.group_end then raise Not_found; + let gend = result.group_end.(n-1) in + if gend < 0 then raise Not_found else + gend +;; + +let global_replace ~pat ~templ s = + protect + (fun () -> + Str.global_replace pat templ s) +;; + +let replace_first ~pat ~templ s = + protect + (fun () -> + Str.replace_first pat templ s) +;; + +let global_substitute ?(groups = 9) ~pat ~subst s = + protect + (fun () -> + let xsubst s = + let r = return_result 0 groups in + subst r s + in + Str.global_substitute pat xsubst s) +;; + +let substitute_first ?(groups = 9) ~pat ~subst s = + protect + (fun () -> + let xsubst s = + let r = return_result 0 groups in + subst r s + in + Str.substitute_first pat xsubst s) +;; + +(* replace_matched: n/a *) + +let split ~sep s = + protect + (fun () -> + Str.split sep s) +;; + +let bounded_split ~sep s ~max = + protect + (fun () -> + Str.bounded_split sep s max) +;; + +let split_delim ~sep s = + protect + (fun () -> + Str.split_delim sep s) +;; + +let bounded_split_delim ~sep s ~max = + protect + (fun () -> + Str.bounded_split_delim sep s max) +;; + +let full_split ~sep s = + protect + (fun () -> + Str.full_split sep s) +;; + +let bounded_full_split ~sep s ~max = + protect + (fun () -> + Str.bounded_full_split sep s max) +;; + +let string_before = Str.string_before;; +let string_after = Str.string_after;; +let first_chars = Str.first_chars;; +let last_chars = Str.last_chars;; + +(* ====================================================================== + * History: + * + * $Log$ + * Revision 1.1 2000/11/17 09:57:28 lpadovan + * Initial revision + * + * Revision 1.2 2000/06/25 21:15:48 gerd + * Checked thread-safety. + * + * Revision 1.1 2000/06/25 20:48:19 gerd + * Initial revision. + * + * + *)