-- UmbrellaPack.mesa  last edit, Bruce  Sep 29, 1980 5:02 PM

DIRECTORY
  BP USING [Fail],
  Commands USING [DoExp, Options, UDS, UProcess, WriteError],
  Copier USING [FileProblem, FileVersion, FileVersionMix],
  DebugOps USING [
    InvalidAddress, InvalidCharacter, InvalidNumber, NonExistentMemoryPage,
    NotImplemented, ParseError, SyntaxError, UserAborted, WriteProtected],
  DLoadState USING [Invalid],
  DOutput USING [Blanks, Char, EOL, LongOctal, Octal, Text],
  DPsb USING [Invalid],
  Dump USING [HtiVal, PrintUCS],
  Frames USING [Invalid],
  Lf USING [Clobbered, Handle, NoAccessLink, NoPrevious],
  Lookup USING [Fail],
  MachineDefs USING [OutOfMemory, Unknown],
  Pc USING [NotInAnyProcedure],
  Source USING [FileMissing],
  State USING [GetGS, GSHandle],
  String USING [InvalidNumber],
  TajoOps USING [Notifier],
  UserInput USING [ResetUserAbort];
  
UmbrellaPack: PROGRAM
  IMPORTS
    BP, Commands, Copier, DebugOps, DLoadState, DPsb, DOutput, Dump, Frames, Lf, Lookup,
    MachineDefs, Pc, Source, State, String, TajoOps, UserInput 
  EXPORTS Commands =
  BEGIN OPEN Commands;
  
  stateData: State.GSHandle ← State.GetGS[];
  
  PutOctal: PROC [n: UNSPECIFIED] = {DOutput.Char[' ]; DOutput.Octal[n]};
  
  Umbrella: PUBLIC PROC [op: Commands.Options, data: UNSPECIFIED] = {
      ENABLE
	BEGIN
	Source.FileMissing =>
	  BEGIN
	  WriteError[file];
	  IF name # NIL THEN DOutput.Text[name]
	  ELSE WriteError[compress];
	  CONTINUE
	  END;
	Lookup.Fail =>
	  BEGIN OPEN DOutput;
	  EOL[]; Text[s]; WriteError[notFound,FALSE];
	  CONTINUE
	  END;
	Copier.FileProblem =>
	  BEGIN OPEN DOutput;
	  Blanks[1]; Dump.HtiVal[hti]; WriteError[notFound,FALSE];
	  RESUME[TRUE]
	  END;
	Copier.FileVersionMix =>
	  BEGIN OPEN DOutput;
	  Blanks[1]; Dump.HtiVal[hti]; WriteError[diffver,FALSE];
	  CONTINUE
	  END;
	Copier.FileVersion =>
	  BEGIN OPEN DOutput;
	  Blanks[1]; Dump.HtiVal[hti]; WriteError[diffver,FALSE];
	  RESUME[TRUE]
	  END;
	Pc.NotInAnyProcedure => {WriteError[invalidPc]; RESUME};
	String.InvalidNumber => {WriteError[num]; CONTINUE};
	DebugOps.InvalidNumber => {WriteError[num]; CONTINUE};
	DebugOps.SyntaxError => {WriteError[badSyntax]; CONTINUE};
	DebugOps.InvalidCharacter => {WriteError[badChar]; CONTINUE};
	DebugOps.ParseError => {WriteError[badParse]; CONTINUE};
	DebugOps.NotImplemented =>
	  BEGIN DOutput.Text[msg]; WriteError[notImpl,FALSE]; CONTINUE END;
	DebugOps.UserAborted =>
	  {UserInput.ResetUserAbort[]; WriteError[aborted]; CONTINUE};
	DebugOps.InvalidAddress =>
	  BEGIN
	  WriteError[badAddress,FALSE];
	  DOutput.LongOctal[address];
	  DOutput.Char[']];
	  CONTINUE;
	  END;
	DebugOps.WriteProtected => {
	  WriteError[writeProtect,FALSE]; DOutput.Octal[page]; DOutput.Char[']]; CONTINUE};
	DebugOps.NonExistentMemoryPage => {
	  WriteError[noPage,FALSE]; DOutput.Octal[page]; DOutput.Char[']]; CONTINUE};
	DLoadState.Invalid => {WriteError[nAllowed]; CONTINUE};
	BP.Fail => CONTINUE;
--	TrapDefs.ResumeError => {WriteError[resume]; CONTINUE};
	Lf.Clobbered => {PutOctal[f]; WriteError[cFrame,FALSE]; CONTINUE};
	Lf.NoPrevious =>
	  {PutOctal[f]; WriteError[nReturnlink,FALSE]; CONTINUE};
	Frames.Invalid => {PutOctal[f]; WriteError[nGframe,FALSE]; CONTINUE};
	Lf.NoAccessLink =>
	  {PutOctal[f]; WriteError[nAccesslink,FALSE]; CONTINUE};
	DPsb.Invalid => {PutOctal[psb]; WriteError[nPsb,FALSE]; CONTINUE};
	MachineDefs.Unknown[] => {
	  WriteError[badDir]; IF ~stateData.debugging THEN CONTINUE};
	MachineDefs.OutOfMemory[] =>
	  BEGIN
	  WriteError[insufficientVM];
	  DOutput.Octal[needed];
	  DOutput.Char[']];
	  IF ~stateData.debugging THEN CONTINUE
	  END
	END;
    SELECT op FROM
      stack => Commands.UDS[data];
      process => Commands.UProcess[data];
      notifier => TajoOps.Notifier[FALSE];
      exp => Commands.DoExp[data];
      ucs => Dump.PrintUCS[];
      spare1 => NULL;
      spare2 => NULL;
      spare3 => NULL;
      ENDCASE};
      
      
  END.