let transcript_receiver (mess : string) : string =
let add mess1 mess2 =
if(not(Hashtbl.mem transcript_table_receiver mess2) && (mess=mess1 || not(Hashtbl.mem transcript_table_receiver mess1)))
then(
Hashtbl.add transcript_table_receiver mess1 mess2;
if(mess1<>mess2) then Hashtbl.add transcript_table_receiver mess2 mess1;
);
mess2
in
let rec aux mess =
if(Hashtbl.mem transcript_table_receiver mess) then Hashtbl.find transcript_table_receiver mess
else(
let l_mess = decompose mess in
(add mess
(if(l_mess=[]) then(
if(is_a_test_var mess) then get_name_of_test_var mess
else if(is_a_var mess) then mess^"'"
else mess
)
else if((car l_mess)="pair") then (list2string "." (List.map (fun e -> aux e) (cdr l_mess)))
else if((car l_mess)="scrypt" || (car l_mess)="crypt") then (
let tmp=decompose (cadr l_mess) in
if(tmp<>[] && (car tmp)="pair")
then "{"^(aux(caddr l_mess))^"}_{"^(aux (cadr l_mess))^"}"
else "{"^(aux(caddr l_mess))^"}_"^(aux (cadr l_mess));
)
else if((car l_mess)="apply") then (aux(cadr l_mess))^"("^ (list2string "," (List.map aux (cddr l_mess)) ) ^")"
else if((car l_mess)="exp") then (car l_mess)^"("^ (list2string "," (List.map aux (cdr l_mess)) ) ^")"
else if((car l_mess)="xor") then (car l_mess)^"("^ (list2string "," (List.map aux (cdr l_mess)) ) ^")"
else if((car l_mess)="inv") then (car l_mess)^"("^ (aux (cadr l_mess)) ^")"
else let tmp = (list2string ","
(List.map (fun s -> add s (aux s))
(cdr l_mess) )
) in
(add (car l_mess) (aux (car l_mess)))^"("^tmp^")";
))
);
in
aux mess