(*
 Oukseh Lee, The LET Project, KAIST

 Copyright(c) 2000-2002 Research On Program Analysis System
 National Creative Research Initiative Center
 Korea Advanced Institute of Science & Technology
 http://ropas.kaist.ac.kr

 All rights reserved. This file is distributed under the terms of
 an Open Source License.
*)

module Gc = struct
  open Gc

  type stat = int * int * int * int * int * int * int * int *
              int * int * float * int * float * float
  type control = int * int * int * int * int * int

  let stat() = 
    let x = Gc.stat()
    in  x.compactions, x.fragments, x.free_blocks, x.free_words,
        x.heap_chunks, x.heap_words, x.largest_free, x.live_blocks,
        x.live_words, x.major_collections, x.major_words,
        x.minor_collections, x.minor_words, x.promoted_words
  let print_stat = Gc.print_stat

  let get () = 
    let x = Gc.get()
    in  x.major_heap_increment, x.max_overhead, x.minor_heap_size,
        x.space_overhead, x.stack_limit, x.verbose

  let set (x1,x2,x3,x4,x5,x6) = 
        Gc.set {major_heap_increment = x1; max_overhead = x2; minor_heap_size = x3;
                space_overhead = x4; stack_limit = x5; verbose = x6}

  let minor = Gc.minor
  let major = Gc.major
  let full_major = Gc.full_major
  let compact = Gc.compact
end

module Lexing = struct
  type lexbuf = Lexing.lexbuf
  let from_channel = Lexing.from_channel
  let from_string = Lexing.from_string
  let from_function = Lexing.from_function
  let lexeme = Lexing.lexeme
  let lexeme_char = Lexing.lexeme_char
  let lexeme_start = Lexing.lexeme_start
  let lexeme_end = Lexing.lexeme_end
  type lex_tables = string * string * string * string * string
  let engine (x1,x2,x3,x4,x5) = 
    Lexing.engine {Lexing.lex_backtrk = x1;
                   Lexing.lex_base = x2;
                   Lexing.lex_check = x3;
                   Lexing.lex_default = x4;
                   Lexing.lex_trans = x5}
end

module Parsing = struct
  let symbol_start = Parsing.symbol_start
  let symbol_end = Parsing.symbol_end
  let rhs_start = Parsing.rhs_start
  let rhs_end = Parsing.rhs_end
  let clear_parser = Parsing.clear_parser
  exception Parse_error = Parsing.Parse_error
  type parser_env = Parsing.parser_env
  type parse_tables = 
    (parser_env -> Obj.t) array * string * string * string *
    (string -> unit) * string * string * string * string * string * string *
    int * int array * int array
  exception YYexit = Parsing.YYexit
 let yyparse (a, c, de, dg, e, g, le, lh, nb, nc, r, s, t, ts, tb, tc) =
      Parsing.yyparse 
        {Parsing.actions = a; Parsing.check = c; Parsing.defred = de; Parsing.dgoto = dg;
         Parsing.error_function = e;
         Parsing.gindex = g; Parsing.len = le; Parsing.lhs = lh; 
		 Parsing.names_block = nb;
		 Parsing.names_const = nc; 
         Parsing.rindex = r; Parsing.sindex = s;
         Parsing.table = t; Parsing.tablesize = ts; 
         Parsing.transl_block = tb; Parsing.transl_const = tc}
 let peek_val = Parsing.peek_val
 let is_current_lookahead = Parsing.is_current_lookahead
 let parse_error = Parsing.parse_error
end

module Interop = struct
  let lexing_to_lex_tables (s1,s2,s3,s4,s5) = (s2,s1,s5,s3,s4)
  let lexing_field_refill_buff = Interop.lexing_field_refill_buff
  let lexing_field_lex_buffer = Interop.lexing_field_lex_buffer
  let lexing_field_lex_buffer_len = Interop.lexing_field_lex_buffer_len 
  let lexing_field_lex_abs_pos = Interop.lexing_field_lex_abs_pos 
  let lexing_field_lex_start_pos = Interop.lexing_field_lex_start_pos 
  let lexing_field_lex_curr_pos = Interop.lexing_field_lex_curr_pos 
  let lexing_field_lex_last_pos = Interop.lexing_field_lex_last_pos 
  let lexing_field_lex_last_action = Interop.lexing_field_lex_last_action
  let lexing_field_lex_eof_reached = Interop.lexing_field_lex_eof_reached 

  let lexing_field_update_lex_buffer = Interop.lexing_field_update_lex_buffer 
  let lexing_field_update_lex_buffer_len = Interop.lexing_field_update_lex_buffer_len
  let lexing_field_update_lex_abs_pos = Interop.lexing_field_update_lex_abs_pos 
  let lexing_field_update_lex_start_pos = Interop.lexing_field_update_lex_start_pos 
  let lexing_field_update_lex_curr_pos = Interop.lexing_field_update_lex_curr_pos 
  let lexing_field_update_lex_last_pos = Interop.lexing_field_update_lex_last_pos 
  let lexing_field_update_lex_last_action = Interop.lexing_field_update_lex_last_action 
  let lexing_field_update_lex_eof_reached = Interop.lexing_field_update_lex_eof_reached
end
