-- XXDebugCommands.mesa  
-- Edited by Bruce,  Oct 14, 1980 11:38 AM

DIRECTORY
  FormSW,
  Ascii USING [CR, SP, TAB],
  Inline USING [LongNumber],
  MsgSW,
  Put,
  RESOut,
  Selection,
  STDebugDefs USING [
    NextSe, PutAsBti, PutAsCti, PutAsHti, PutAsLti, PutAsMdi, PutAsSei,
    PutAsTree, PutAsVariousRep],
  String USING [InvalidNumber],
  UserInput USING [ResetUserAbort, userAbort],
  XXDebugCommandDefs USING [ParamIndex],
  XXDebugDefs;
  
XXDebugCommands: PROGRAM 
  IMPORTS
    MsgSW, Put, RESOut, Selection, STDebugDefs, String, UserInput, XXDebugDefs
  EXPORTS RESOut, XXDebugDefs =
  BEGIN OPEN XXDebugDefs, RESOut;
  
  handle: PUBLIC RESOut.WindowsHandle ← NIL;
  
  cancelAction: PUBLIC ERROR [endLine: BOOLEAN ← FALSE] = CODE;
  
  ParamNotify: PUBLIC FormSW.ProcType =
    BEGIN OPEN STDebugDefs, XXDebugCommandDefs, XXDebugDefs;
    ENABLE cancelAction =>  
      BEGIN
      IF endLine THEN Put.Text[handle.fileSW, " XXX"L];
      GO TO done;
      END;
    Complain[""L]; UserInput.ResetUserAbort[];
    SELECT LOOPHOLE[index, ParamIndex] FROM
      foo => PutAsFoo[GetSelectionValue[]];
      topctx => PutTopCtx[];
      tos => PutTos[];
      brk => PutAsBB[GetSelectionValue[]];
      ctx => PutAsContext[GetSelectionValue[]];
      stk => PutAsStack[GetSelectionValue[]];
      lti => PutAsLti[GetSelectionValue[]];
      tree => PutAsTree[GetSelectionValue[]];
      sei => PutAsSei[GetSelectionValue[]];
      nextse => NextSe[];
      hti => PutAsHti[GetSelectionValue[]];
      cti => PutAsCti[GetSelectionValue[]];
      bti => PutAsBti[GetSelectionValue[]];
      mdi => PutAsMdi[GetSelectionValue[]];
      rep => PutAsVariousRep[GetSelectionValue[]];
      user => UserOctalRead[GetLongSelectionValue[]];
      pc => PrintPCCache[];
      nxpc => PrintNextCacheItem[];
      pcci => PrintCacheItem[GetSelectionValue[]];
      list => PrintListNode[GetSelectionValue[]];
      nxlist => PrintNextListNode[];
      ENDCASE;
    EXITS
      done => NULL;
    END;
    
  GetSelectionValue: PUBLIC PROCEDURE RETURNS [val: UNSPECIFIED] =
    BEGIN
    num: Inline.LongNumber;
    num.lc ← GetLongSelectionValue[];
    SELECT num.highbits FROM
      0, 177777B => NULL;
      ENDCASE => {Complain["number too big"L]; ERROR cancelAction};
    RETURN[num.lowbits];
    END;
    
  GetLongSelectionValue: PUBLIC PROCEDURE RETURNS [val: LONG UNSPECIFIED] =
    BEGIN
    val ← Selection.LongNumber[radix: 10 !
	String.InvalidNumber => GO TO noNumber];
    RETURN;
    EXITS
      noNumber =>
	BEGIN
	Complain["Select a number first"L];
	ERROR cancelAction;
	END;
    END;
    
  Complain: PUBLIC PROCEDURE [msg: STRING, clear: BOOLEAN ← TRUE] =
    BEGIN
    IF handle.msgSW = NIL THEN RETURN;
    IF clear THEN MsgSW.Clear[handle.msgSW];
    MsgSW.Post[sw: handle.msgSW, string: msg, endOfMsg: FALSE];
    END;
    
-- log writing procedures

  charsOnLine: CARDINAL ← 0;
  
  PChar: PUBLIC PROCEDURE [c: CHARACTER] =
    BEGIN
    IF UserInput.userAbort THEN ERROR cancelAction[TRUE];
    Put.Char[handle.fileSW, c];
    charsOnLine ← SELECT c FROM
      Ascii.TAB  => ((charsOnLine+8)/8)*8,
      Ascii.CR => 0,
      ENDCASE => charsOnLine + 1;
    END;
    
  MakeRoom: PUBLIC PROCEDURE [chars, indent: CARDINAL] 
      RETURNS [was: BOOLEAN]=
    BEGIN
    charsPerLine: CARDINAL = handle.fileSW.box.dims.w/7-4;
    IF charsOnLine + chars <= charsPerLine THEN RETURN [TRUE];
    PCr[];
    THROUGH [0..indent/8) DO PChar[Ascii.TAB]; ENDLOOP;
    THROUGH [0..indent MOD 8) DO PChar[Ascii.SP]; ENDLOOP;
    RETURN[FALSE];
    END;
    
  END.