file_com.ml 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. (******************************************************************************)
  2. (* Copyright © Joly Clément, 2014-2015 *)
  3. (* *)
  4. (* leowzukw@vmail.me *)
  5. (* *)
  6. (* Ce logiciel est un programme informatique servant à exécuter *)
  7. (* automatiquement des programmes à l'ouverture du terminal. *)
  8. (* *)
  9. (* Ce logiciel est régi par la licence CeCILL soumise au droit français et *)
  10. (* respectant les principes de diffusion des logiciels libres. Vous pouvez *)
  11. (* utiliser, modifier et/ou redistribuer ce programme sous les conditions *)
  12. (* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA *)
  13. (* sur le site "http://www.cecill.info". *)
  14. (* *)
  15. (* En contrepartie de l'accessibilité au code source et des droits de copie, *)
  16. (* de modification et de redistribution accordés par cette licence, il n'est *)
  17. (* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, *)
  18. (* seule une responsabilité restreinte pèse sur l'auteur du programme, le *)
  19. (* titulaire des droits patrimoniaux et les concédants successifs. *)
  20. (* *)
  21. (* A cet égard l'attention de l'utilisateur est attirée sur les risques *)
  22. (* associés au chargement, à l'utilisation, à la modification et/ou au *)
  23. (* développement et à la reproduction du logiciel par l'utilisateur étant *)
  24. (* donné sa spécificité de logiciel libre, qui peut le rendre complexe à *)
  25. (* manipuler et qui le réserve donc à des développeurs et des professionnels *)
  26. (* avertis possédant des connaissances informatiques approfondies. Les *)
  27. (* utilisateurs sont donc invités à charger et tester l'adéquation du *)
  28. (* logiciel à leurs besoins dans des conditions permettant d'assurer la *)
  29. (* sécurité de leurs systèmes et ou de leurs données et, plus généralement, *)
  30. (* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. *)
  31. (* *)
  32. (* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez *)
  33. (* pris connaissance de la licence CeCILL, et que vous en avez accepté les *)
  34. (* termes. *)
  35. (******************************************************************************)
  36. open Core.Std;;
  37. (* Read settings and programs to launch from rc file *)
  38. (* Type of the values *)
  39. type t = Settings_v.rc_file;;
  40. (* Function to write the rc file *)
  41. let write (rc_file:t) =
  42. (* Short name *)
  43. let name = !Const.rc_file in
  44. (* Create string to be written, after removing duplicated commands (and
  45. * newlines) *)
  46. let data = (Unify.prettify rc_file |> Settings_j.string_of_rc_file
  47. |> Yojson.Basic.prettify ~std:true) in
  48. Out_channel.write_all (Lazy.force name) ~data
  49. ;;
  50. (* Return the configuration file template *)
  51. let rc_template () =
  52. Settings_v.create_rc_file ~progs:[] ~settings:[]
  53. ;;
  54. (* Function to create configuration file if it does not
  55. * exist *)
  56. let create_rc_file ~name =
  57. (* Notify that we initialise config file *)
  58. sprintf "Initializing empty configuration file in %s." name |> Messages.warning;
  59. (* Final \n to display newline before showing the licence. *)
  60. Messages.tips "Feedback is welcome at feedback@oclaunch.eu.org.\n\
  61. To get remind for new stable versions, subscribe to our low-traffic (up to 6 \
  62. mail per year) mailing list: announce@oclaunch.eu.org.\n\
  63. See you soon!\n";
  64. (* Display licence information *)
  65. Licencing.print ~cecill:false;
  66. let compact_rc_file = Settings_j.string_of_rc_file (rc_template () ()) in
  67. let readable_rc_file = Yojson.Basic.prettify compact_rc_file in (* Create human readable string for rc file *)
  68. let out_file = Out_channel.create name in
  69. Out_channel.output_string out_file readable_rc_file;
  70. Out_channel.close out_file
  71. ;;
  72. (* Function to read the rc file *)
  73. let rec init_rc ?(rc=(!Const.rc_file)) () =
  74. let rc' = Lazy.force rc in
  75. (* Verify that file exist *)
  76. match (Sys.file_exists rc') with
  77. | `No -> create_rc_file ~name:rc'; init_rc ~rc ();
  78. | `Unknown -> failwith "Error reading configuration file";
  79. | `Yes -> (* Try to read, if there is an error, reset file *)
  80. try
  81. In_channel.read_all rc' |> Settings_j.rc_file_of_string
  82. with
  83. | Yojson.Json_error _ -> (* Invalid file, delete, so that it will be reseted
  84. on next call *) Sys.remove rc'; init_rc ~rc ()
  85. ;;
  86. (* Get the command corresponding to a number *)
  87. let num_cmd2cmd ~rc n =
  88. List.nth rc.Settings_t.progs n
  89. ;;