https://github.com/EasyCrypt/easycrypt
Tip revision: 846710a2a656834065e745d19416ebdc83158f55 authored by Benjamin Gregoire on 14 July 2019, 06:50:07 UTC
Start restructuration of the code to be able to avant mutual dependency between type and mpath
Start restructuration of the code to be able to avant mutual dependency between type and mpath
Tip revision: 846710a
ecFortune.ml
(* --------------------------------------------------------------------
* Copyright (c) - 2012--2016 - IMDEA Software Institute
* Copyright (c) - 2012--2018 - Inria
* Copyright (c) - 2012--2018 - Ecole Polytechnique
*
* Distributed under the terms of the CeCILL-C-V1 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:EcVersion.app ~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 ()