Plasma GitLab Archive
Projects Blog Knowledge

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

This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml