(* $Id$ *) (* Compile a list of variant tags into CPP defines *) (* hash_variant, from ctype.ml *) let hash_variant s = let accu = ref 0 in for i = 0 to String.length s - 1 do accu := 223 * !accu + Char.code s.[i] done; (* reduce to 31 bits *) accu := !accu land (1 lsl 31 - 1); (* make it signed for 64 bits architectures *) if !accu > 0x3FFFFFFF then !accu - (1 lsl 31) else !accu open Genlex let lexer = make_lexer ["`"; "["; "]"; "|"] let main () = let s = lexer (Stream.of_channel stdin) in let tags = Hashtbl.create 57 in while match s with parser [< ' Kwd "`"; ' Ident tag >] -> let hash = hash_variant tag in begin try let tag' = Hashtbl.find tags hash in if tag <> tag' then failwith (String.concat ~sep:" " ["Doublon tag:";tag;"and";tag']) with Not_found -> Hashtbl.add ~key:hash ~data:tag tags; print_string "#define MLTAG_"; print_string tag; print_string "\tVal_int("; print_int hash; print_string ")\n" end; true | [< ' _ >] -> true | [< >] -> false do () done let _ = Printexc.print main ()