diff --git a/iris/proofmode/string_ident.v b/iris/proofmode/string_ident.v index de2c577653602562bbb0317be6d0ea508ce5d367..27130890f36e36a1e54431fc726136abcddbc24e 100644 --- a/iris/proofmode/string_ident.v +++ b/iris/proofmode/string_ident.v @@ -1,6 +1,6 @@ From Ltac2 Require Ltac2. From Coq Require Import Strings.String. -From Coq Require Import Init.Byte. +From Coq Require Import Init.Byte Ascii. From iris.prelude Require Import options. Import List.ListNotations. @@ -77,26 +77,26 @@ End StringToIdent. Module IdentToString. Import Ltac2. - Ltac2 char_to_coq_byte (c : char) : constr := - let (ind, inst) := - match Constr.Unsafe.kind constr:(byte) with - | Constr.Unsafe.Ind ind inst => (ind, inst) - | _ => Control.zero (Invalid_argument None) - end - in - let c := Constr.Unsafe.constructor ind (Char.to_int c) in - Constr.Unsafe.make (Constr.Unsafe.Constructor c inst). + Ltac2 get_bit (n : int) (i : int) : bool := + Int.equal (Int.land (Int.lsr n i) 1) 1. + + Ltac2 get_bit_coq_bool (n : int) (i : int) : constr := + if get_bit n i then constr:(true) else constr:(false). + + Ltac2 char_to_coq_ascii (c : char) : constr := + let i := Char.to_int c in + let bs := Array.init 8 (get_bit_coq_bool i) in + Constr.Unsafe.make (Constr.Unsafe.App constr:(Ascii) bs). Ltac2 string_to_coq_string (s : string) : constr := let len := String.length s in - let rec to_string acc i := - if Int.equal i -1 then acc else - let c := String.get s i in - let byte := char_to_coq_byte c in - let a := compute constr:(Ascii.ascii_of_byte $byte) in - to_string constr:(String $a $acc) (Int.sub i 1) + let rec to_string i := + if Int.equal i len then constr:(EmptyString) else + let tail := to_string (Int.add i 1) in + let head := char_to_coq_ascii (String.get s i) in + constr:(String $head $tail) in - to_string constr:(EmptyString) (Int.sub len 1). + to_string 0. Ltac2 ident_to_string (id : ident) : constr := string_to_coq_string (Ident.to_string id).