]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/pxp/netstring/netstring_str.ml
Initial revision
[helm.git] / helm / DEVEL / pxp / netstring / netstring_str.ml
diff --git a/helm/DEVEL/pxp/netstring/netstring_str.ml b/helm/DEVEL/pxp/netstring/netstring_str.ml
new file mode 100644 (file)
index 0000000..7353719
--- /dev/null
@@ -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.
+ *
+ * 
+ *)