(*-------------------------------------------------------------------------*)
(*                                                                         *)
(*  Amiga Oberon Interface Module: OberonSupport      Date: 02-Nov-92      *)
(*                                                                         *)
(*   © 1992 by Fridtjof Siebert                                            *)
(*                                                                         *)
(*-------------------------------------------------------------------------*)

MODULE OberonSupport;

IMPORT e   * := Exec,
(* $IF Internal (internal version for compiler authors :-) *)
       ot    := OberonTypes,
(* $END *)
       avl * := UntracedAVL,
       I     := Intuition,
              Dos,
       rx  * := Rexx,
       s     := SYSTEM;

TYPE
  Error* = STRUCT
    num-, line-, column-: INTEGER;
  END;
  ErrorHeaderPtr* = UNTRACED POINTER TO ErrorHeader;
  ErrorHeader* = STRUCT
    numErrors-: INTEGER;
    error-: ARRAY MAX (INTEGER) OF Error;
    (* really: ARRAY numErrors OF Error !! *)
  END;

CONST

(* $IF Internal *)

(* Results of LoadSyms() *)

  ok * = 0;
  readerr * = 1;
  notfound * = 2;
  formaterr * = 3;
  namewrong * = 4;
  oom * = 5;
  versconfl * = 6;

(* $END *)

  name * = "oberonsupport.library";
  version * = 3;

VAR
  base * : e.LibraryPtr;

PROCEDURE ARexxQuery         * {base,- 30} (RxMsg{8}   : rx.RexxMsgPtr): LONGINT;

PROCEDURE FreeErrorFile      * {base,- 36} (errors{8}  : ErrorHeaderPtr);
PROCEDURE ReadErrorFile      * {base,- 42} (name{8}    : e.STRPTR): ErrorHeaderPtr;
PROCEDURE GetErrorText       * {base,- 48} (num{0}     : INTEGER): e.STRPTR;

(* $IF Internal   private routines, do not use! *)
PROCEDURE GetSymID           * {base,- 54} (): INTEGER;
PROCEDURE FreeSymID          * {base,- 60} (id{3}      : INTEGER);
PROCEDURE LoadSyms           * {base,- 66} (VAR namePtr: ot.String;
                                            VAR syms   : ot.SymbolFilePtr;
                                            outH       : Dos.FileHandlePtr): INTEGER;
PROCEDURE FreeSyms           * {base,- 72} (syms{8}    : ot.SymbolFilePtr);
(* $END *)


PROCEDURE MarkChanged        * {base,- 78} (VAR name{8}: avl.String);
(* mark resident symbol file of module name invalid. It's memory will be freed
 * ASAP (when its usecount reached zero) and it will be reloaded the next time
 * it's used (even if the old version's usecount is > 0)
 *)


(* $IF Internal   private routines, do not use! *)
PROCEDURE GetStdTypes        * {base,- 84} (): ot.StdTypesPtr;
(* $END *)


PROCEDURE RemoveAllResidents * {base,- 90};
(* mark all resident symbol files as invalid (see MarkChanged) and clear the
 * list of files to be kept resident.
 *)

PROCEDURE AllResident        * {base,- 96};
(* tells oberonsupport.library to keep all symbol files resident
 *)

PROCEDURE AddResident        * {base,-102} (VAR name   : avl.String);
(* tells oberonsupport.library to keep the symbol file of module name resident
 *)


BEGIN

  base := e.OpenLibrary(name,version);
  IF base=NIL THEN
    s.SETREG(0,I.DisplayAlert(0,"\x00\x64\x14missing oberonsupport.library V3.0\o\o",50));
    HALT(0)
  END;

CLOSE

  IF base#NIL THEN e.CloseLibrary(base) END;

END OberonSupport.


