|
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
|