-- Copyright (C) 1986  by Xerox Corporation. All rights reserved. 
-- StartState.mesa
-- NFS     30-Jan-86 11:08:35

DIRECTORY
  CString USING [CString],
  MFile USING [Handle, Object],
  MLoader USING [Handle, Object],
  Stream USING [Handle];

StartState: DEFINITIONS = {

  Handle: TYPE = LONG POINTER TO Object;
  Object: TYPE;

  EnumerateProc: TYPE = PROCEDURE [ssh: Handle, mh: MLoader.Handle]
    RETURNS [continue: BOOLEAN ← TRUE];

  normalOutcome: INTEGER = 0;
  abortOutcome: INTEGER = -1;

  zone: UNCOUNTED ZONE;

  -- StartOrRestart, Start and Restart return the value normalOutcome
  -- unless CRuntime.Exit or CRuntime.Abort are called.
  -- If CRuntime.Exit is called, then the value
  -- passed to Exit is returned.  If CRuntime.Abort is called,
  -- then it returns abortOutcome.


  -- StartOrRestart can raise the error LoadError or the signal VersionMismatch.
  StartOrRestart: PROCEDURE [
    file: MFile.Handle, argc: CARDINAL, argv: LONG POINTER TO CString.CString,
    stdin, stdout, stderr: Stream.Handle] RETURNS [outcome: INTEGER];

  -- GetHandle is used to acquire a Handle to pass to Load, Start, and Restart. 
  GetHandle: PROCEDURE [file: MFile.Handle]
    RETURNS [h: Handle, canRestart: BOOLEAN];

  -- Load can raise the error LoadError or the signal VersionMismatch.
  Load: PROCEDURE [h: Handle, fh: MFile.Handle];

  Start: PROCEDURE [
    h: Handle, argc: CARDINAL, argv: LONG POINTER TO CString.CString,
    stdin, stdout, stderr: Stream.Handle] RETURNS [outcome: INTEGER];

  Restart: PROCEDURE [
    h: Handle, argc: CARDINAL, argv: LONG POINTER TO CString.CString,
    stdin, stdout, stderr: Stream.Handle] RETURNS [outcome: INTEGER];

  <<Unload, UnloadFromFile, and UnloadUnstartedProgram 
    can raise the error UnloadError.>>
  Unload: PROCEDURE [h: MLoader.Handle];

  UnloadFromFile: PROCEDURE [file: MFile.Handle]
    RETURNS [instancesUnloaded: CARDINAL];

  UnloadUnstartedProgram: PROCEDURE [h: Handle];

  EnumerateHandles: PROCEDURE [file: MFile.Handle, proc: EnumerateProc];

  GetLoadHandle: PROCEDURE [h: Handle] RETURNS [MLoader.Handle];

  SetLoadHandle: PROCEDURE [h: Handle, lh: MLoader.Handle];

  LoadError: ERROR [message: LONG STRING];

  VersionMismatch: SIGNAL [module: LONG STRING];

  UnloadError: ERROR [message: LONG STRING, instancesAlreadyUnloaded: CARDINAL];

  }.