https://github.com/EasyCrypt/easycrypt
Raw File
Tip revision: a79f9aeb6de046ca12210d26317fab59c175d0dd authored by Pierre-Yves Strub on 08 July 2014, 09:43:21 UTC
Fix bug w.r.t. _tools presence detection.
Tip revision: a79f9ae
ecFortune.ml
(* Copyright (c) - 2012-2014 - IMDEA Software Institute and INRIA
 * Distributed under the terms of the CeCILL-B license *)

(* --------------------------------------------------------------------- *)
open EcUtils

(* --------------------------------------------------------------------- *)
let thepick = ref (fun () -> failwith "fortune-uninit")

(* -------------------------------------------------------------------- *)
let pickfor values : unit -> string option =
  fun () ->
    match Array.length values with
    | n when n <= 0 -> None
    | n -> Some (values.(Random.int n))

(* --------------------------------------------------------------------- *)
let fortune_from_stream : in_channel -> string list =
  let rec aux acc stream =
    try
      let line = input_line stream in
      let line = String.strip line in

        if   String.length line = 0
        then aux acc stream
        else aux (line :: acc) stream

    with End_of_file -> acc

  in fun stream -> aux [] stream

(* --------------------------------------------------------------------- *)
let init () =
  let conffiles =
    XDG.Data.file
      ~exists:true ~appname:"easycrypt" ~mode:`All
      "fortune.conf"
  in

  let values =
    let for1 filename =
      try
        let stream = open_in filename in

          EcUtils.try_finally
            (fun () -> fortune_from_stream stream)
            (fun () -> close_in stream)
      with Sys_error _ ->
        []

    in List.flatten (List.map for1 conffiles)

  in thepick := pickfor (Array.of_list values)

(* --------------------------------------------------------------------- *)
let pick () : string option =
  !thepick ()
back to top