Blame browser/main.ml

Packit bd2e5d
(*************************************************************************)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*                         OCaml LablTk library                          *)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*            Jacques Garrigue, Kyoto University RIMS                    *)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*   Copyright 1999 Institut National de Recherche en Informatique et    *)
Packit bd2e5d
(*   en Automatique and Kyoto University.  All rights reserved.          *)
Packit bd2e5d
(*   This file is distributed under the terms of the GNU Library         *)
Packit bd2e5d
(*   General Public License, with the special exception on linking       *)
Packit bd2e5d
(*   described in file ../../../LICENSE.                                 *)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*************************************************************************)
Packit bd2e5d
Packit bd2e5d
(* $Id$ *)
Packit bd2e5d
Packit bd2e5d
open StdLabels
Packit bd2e5d
module Unix = UnixLabels
Packit bd2e5d
open Tk
Packit bd2e5d
Packit bd2e5d
let fatal_error text =
Packit bd2e5d
  let top = openTk ~clas:"OCamlBrowser" () in
Packit bd2e5d
  let mw = Message.create top ~text ~padx:20 ~pady:10
Packit bd2e5d
      ~width:400 ~justify:`Left ~aspect:400 ~anchor:`W
Packit bd2e5d
  and b = Button.create top ~text:"OK" ~command:(fun () -> destroy top) in
Packit bd2e5d
  pack [mw] ~side:`Top ~fill:`Both;
Packit bd2e5d
  pack [b] ~side:`Bottom;
Packit bd2e5d
  mainLoop ();
Packit bd2e5d
  exit 0
Packit bd2e5d
Packit bd2e5d
let rec get_incr key = function
Packit bd2e5d
    [] -> raise Not_found
Packit bd2e5d
  | (k, c, d) :: rem ->
Packit bd2e5d
      if k = key then
Packit bd2e5d
        match c with Arg.Set _ | Arg.Clear _ | Arg.Unit _ -> false | _ -> true
Packit bd2e5d
      else get_incr key rem
Packit bd2e5d
Packit bd2e5d
let check ~spec argv =
Packit bd2e5d
  let i = ref 1 in
Packit bd2e5d
  while !i < Array.length argv do
Packit bd2e5d
    try
Packit bd2e5d
      let a = get_incr argv.(!i) spec in
Packit bd2e5d
      incr i; if a then incr i
Packit bd2e5d
    with Not_found ->
Packit bd2e5d
      i := Array.length argv + 1
Packit bd2e5d
  done;
Packit bd2e5d
  !i = Array.length argv
Packit bd2e5d
Packit bd2e5d
open Printf
Packit bd2e5d
Packit bd2e5d
let print_version () =
Packit bd2e5d
  printf "The OCaml browser, version %s\n" Sys.ocaml_version;
Packit bd2e5d
  exit 0;
Packit bd2e5d
;;
Packit bd2e5d
Packit bd2e5d
let print_version_num () =
Packit bd2e5d
  printf "%s\n" Sys.ocaml_version;
Packit bd2e5d
  exit 0;
Packit bd2e5d
;;
Packit bd2e5d
Packit bd2e5d
let usage ~spec errmsg =
Packit bd2e5d
  let b = Buffer.create 1024 in
Packit bd2e5d
  bprintf b "%s\n" errmsg;
Packit bd2e5d
  List.iter (function (key, _, doc) -> bprintf b "  %s %s\n" key doc) spec;
Packit bd2e5d
  Buffer.contents b
Packit bd2e5d
Packit bd2e5d
let _ =
Packit bd2e5d
  let is_win32 = Sys.os_type = "Win32" in
Packit bd2e5d
  if is_win32 then
Packit bd2e5d
    Format.pp_set_formatter_output_functions Format.err_formatter
Packit bd2e5d
      (fun _ _ _ -> ()) (fun _ -> ());
Packit bd2e5d
Packit bd2e5d
  let path = ref [] in
Packit bd2e5d
  let st = ref true in
Packit bd2e5d
  let spec =
Packit bd2e5d
    [ "-I", Arg.String (fun s -> path := s :: !path),
Packit bd2e5d
      "<dir>  Add <dir> to the list of include directories";
Packit bd2e5d
      "-labels", Arg.Clear Clflags.classic, " <obsolete>";
Packit bd2e5d
      "-nolabels", Arg.Set Clflags.classic,
Packit bd2e5d
      " Ignore non-optional labels in types";
Packit bd2e5d
      "-oldui", Arg.Clear st, " Revert back to old UI";
Packit bd2e5d
      "-pp", Arg.String (fun s -> Clflags.preprocessor := Some s),
Packit bd2e5d
      "<command>  Pipe sources through preprocessor <command>";
Packit bd2e5d
      "-rectypes", Arg.Set Clflags.recursive_types,
Packit bd2e5d
      " Allow arbitrary recursive types";
Packit bd2e5d
      "-safe-string", Arg.Clear Clflags.unsafe_string,
Packit bd2e5d
      " Make strings immutable";
Packit bd2e5d
      "-short-paths", Arg.Clear Clflags.real_paths, " Shorten paths in types";
Packit bd2e5d
      "-version", Arg.Unit print_version,
Packit bd2e5d
        " Print version and exit";
Packit bd2e5d
      "-vnum", Arg.Unit print_version_num, " Print version number and exit";
Packit bd2e5d
      "-w", Arg.String (fun s -> Shell.warnings := s),
Packit bd2e5d
      "<flags>  Enable or disable warnings according to <flags>"; ]
Packit bd2e5d
  and errmsg = "Command line: ocamlbrowser <options>" in
Packit bd2e5d
  if not (check ~spec Sys.argv) then fatal_error (usage ~spec errmsg);
Packit bd2e5d
  Arg.parse spec
Packit bd2e5d
    (fun name -> raise(Arg.Bad("don't know what to do with " ^ name)))
Packit bd2e5d
    errmsg;
Packit bd2e5d
  Config.load_path :=
Packit bd2e5d
    Sys.getcwd ()
Packit bd2e5d
    :: List.rev_map ~f:(Misc.expand_directory Config.standard_library) !path
Packit bd2e5d
    @ [Config.standard_library];
Packit bd2e5d
  Warnings.parse_options false !Shell.warnings;
Packit bd2e5d
  Unix.putenv "TERM" "noterminal";
Packit bd2e5d
  begin
Packit bd2e5d
    try Searchid.start_env := Compmisc.initial_env ()
Packit bd2e5d
    with _ ->
Packit bd2e5d
      fatal_error
Packit bd2e5d
        (Printf.sprintf "%s\nPlease check that %s %s\nCurrent value is `%s'"
Packit bd2e5d
           "Couldn't initialize environment."
Packit bd2e5d
           (if is_win32 then "%OCAMLLIB%" else "$OCAMLLIB")
Packit bd2e5d
           "points to the OCaml library."
Packit bd2e5d
           Config.standard_library)
Packit bd2e5d
  end;
Packit bd2e5d
Packit bd2e5d
  Searchpos.view_defined_ref := (fun s ~env -> Viewer.view_defined s ~env);
Packit bd2e5d
  Searchpos.editor_ref := Editor.f;
Packit bd2e5d
Packit bd2e5d
  let top = openTk ~clas:"OCamlBrowser" () in
Packit bd2e5d
  Jg_config.init ();
Packit bd2e5d
Packit bd2e5d
  (* bind top ~events:[`Destroy] ~action:(fun _ -> exit 0); *)
Packit bd2e5d
  at_exit Shell.kill_all;
Packit bd2e5d
Packit bd2e5d
Packit bd2e5d
  if !st then Viewer.st_viewer ~on:top ()
Packit bd2e5d
  else Viewer.f ~on:top ();
Packit bd2e5d
Packit bd2e5d
  while true do
Packit bd2e5d
    try
Packit bd2e5d
      if is_win32 then mainLoop ()
Packit bd2e5d
      else Printexc.print mainLoop ()
Packit bd2e5d
    with Protocol.TkError _ ->
Packit bd2e5d
      if not is_win32 then flush stderr
Packit bd2e5d
  done