X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fhbugs%2Fcommon%2Fhbugs_id_generator.ml;h=f535f473932e01fbb42669d8a8bdcb8a9f4d6926;hb=78cf601fd8b8dbb386b0db315dcbfdbe8256c15f;hp=93d349b74d11d220ebd2e2ce8a1aa672c5e76f3a;hpb=5d7d6bd5090f3f82279bef0b93b4b361a5b1d751;p=helm.git diff --git a/helm/hbugs/common/hbugs_id_generator.ml b/helm/hbugs/common/hbugs_id_generator.ml index 93d349b74..f535f4739 100644 --- a/helm/hbugs/common/hbugs_id_generator.ml +++ b/helm/hbugs/common/hbugs_id_generator.ml @@ -26,12 +26,40 @@ * http://helm.cs.unibo.it/ *) -let new_broker_id () = (* TODO write a real id generator! *) - "FOO BROKER ID!" -let new_client_id () = (* TODO write a real id generator! *) - "FOO CLIENT ID!" -let new_musing_id () = (* TODO write a real id generator! *) - "FOO MUSING ID!" -let new_tutor_id () = (* TODO write a real id generator! *) - "FOO TUTOR ID!" +let _ = Random.self_init () + +let id_length = 32 +let min_ascii = 33 +let max_ascii = 126 + (* characters forbidden inside an XML attribute value. Well, '>' and ''' + aren't really forbidden, but are listed here ... just to be sure *) +let forbidden_chars = (* i.e. [ '"'; '&'; '\''; '<'; '>' ] *) + [ 34; 38; 39; 60; 62 ] (* assumption: is sorted! *) +let chars_range = max_ascii - min_ascii + 1 - (List.length forbidden_chars) + + (* return a random id char c such that + (min_ascii <= Char.code c) && + (Char.code c <= max_ascii) && + (not (List.mem (Char.code c) forbidden_chars)) + *) +let random_id_char () = + let rec nth_char ascii shifts = function + | [] -> Char.chr (ascii + shifts) + | hd::tl when ascii + shifts < hd -> Char.chr (ascii + shifts) + | hd::tl (* when ascii + shifts >= hd *) -> nth_char ascii (shifts + 1) tl + in + nth_char (Random.int chars_range + min_ascii) 0 forbidden_chars + + (* return a random id string which have length id_length *) +let new_id () = + let str = String.create id_length in + for i = 0 to id_length - 1 do + String.set str i (random_id_char ()) + done; + str + +let new_broker_id = new_id +let new_client_id = new_id +let new_musing_id = new_id +let new_tutor_id = new_id