(************************************************************************) (* * The Coq Proof Assistant / The Coq Development Team *) (* v * INRIA, CNRS and contributors - Copyright 1999-2018 *) (* GlobRef.equal r gr | _ -> false open Lazy let interp_string ?loc s = let le = String.length s in let rec aux n = if n = le then DAst.make ?loc @@ GRef (force glob_EmptyString, None) else DAst.make ?loc @@ GApp (DAst.make ?loc @@ GRef (force glob_String, None), [interp_ascii ?loc (int_of_char s.[n]); aux (n+1)]) in aux 0 let uninterp_string (AnyGlobConstr r) = try let b = Buffer.create 16 in let rec aux c = match DAst.get c with | GApp (k,[a;s]) when is_gr k (force glob_String) -> (match uninterp_ascii a with | Some c -> Buffer.add_char b (Char.chr c); aux s | _ -> raise Non_closed_string) | GRef (z,_) when GlobRef.equal z (force glob_EmptyString) -> Some (Buffer.contents b) | _ -> raise Non_closed_string in aux r with Non_closed_string -> None let _ = Notation.declare_string_interpreter "string_scope" (string_path,["Coq";"Strings";"String"]) interp_string ([DAst.make @@ GRef (static_glob_String,None); DAst.make @@ GRef (static_glob_EmptyString,None)], uninterp_string, true)