open Printf let () = let k = ref 65536 in let n = ref 10000 in let c = ref 1 in Arg.parse [ "-k", Arg.Set_int k, " set number of different keys"; "-n", Arg.Set_int n, " set number of lines (each 100 bytes)"; "-c", Arg.Set_int c, " repeat the same line this number of times"; ] (fun arg -> raise(Arg.Bad("Unexpected arg: " ^ arg))) "usage: gendata [options]"; Random.self_init(); let bits = ref 0 in let bits_cnt = ref 0 in let get7() = (* get 7 random bits 0..127 *) let k1 = !bits land 127 in let k1_cnt = min !bits_cnt 7 in bits := !bits lsr k1_cnt; bits_cnt := !bits_cnt - k1_cnt; let k2 = if k1_cnt < 7 then ( bits := Random.bits(); let k2_cnt = 7 - k1_cnt in let k2_mask = (1 lsl k2_cnt) - 1 in (* k2_cnt times one bit *) let k2_bits = !bits land k2_mask in bits := !bits lsr k2_cnt; bits_cnt := 30 - k2_cnt; k2_bits lsl k1_cnt ) else 0 in k1 lor k2 in let q1 = Queue.create() in let q2 = Queue.create() in let r = ref 0 in let get_line() = if Queue.is_empty q1 then ( if Queue.is_empty q2 || !r = !c then ( let data = String.create 90 in for line = 1 to 145 do let key = Random.int !k in for i=0 to String.length data - 1 do let x = (get7() lsl 23) mod 94 in (* old: Random.int 94 *) String.unsafe_set data i (Char.unsafe_chr(33 + x)) done; let s = sprintf "%08x\t%s\n" key data in Queue.add s q1; done; Queue.clear q2; r := 1 ) else ( Queue.transfer q2 q1; incr r ) ); let line = Queue.take q1 in Queue.add line q2; line in for line = 1 to !n do print_string(get_line()) done