-- RapunzelDescription.mesa
-- Willie-Sue	13-Oct-86 13:33:17 PDT

DIRECTORY Courier, RapunzelCourier, Rapunzel;

RapunzelDescription: PROGRAM
  EXPORTS RapunzelCourier = PUBLIC {

  DescribeShort: Courier.Description = {
    p: LONG POINTER TO Rapunzel.Short = notes.noteSize[
      SIZE[Rapunzel.Short]];
    };

  DescribeLong: Courier.Description = {
    p: LONG POINTER TO Rapunzel.Long = notes.noteSize[
      SIZE[Rapunzel.Long]];
    notes.noteLongCardinal[p];
    };

  DescribeSeqShort: Courier.Description = {
    p: LONG POINTER TO Rapunzel.SeqShort = notes.noteSize[
      SIZE[Rapunzel.SeqShort]];
    notes.noteArrayDescriptor[p, SIZE[Rapunzel.Short], CARDINAL.LAST];
    FOR i:Rapunzel.SeqShortIndex IN [0..LENGTH[p↑]) DO 
      notes.noteParameters[@p[i], DescribeShort];
      ENDLOOP;
    };

  DescribeAddress: Courier.Description = {
    p: LONG POINTER TO Rapunzel.Address = notes.noteSize[
      SIZE[Rapunzel.Address]];
    notes.noteLongCardinal[p];
    };

  DescribePeekShortCmd: Courier.Description = {
    p: LONG POINTER TO Rapunzel.PeekShortCmd = notes.noteSize[
      SIZE[Rapunzel.PeekShortCmd]];
    notes.noteParameters[@p.address, DescribeAddress];
    };

  DescribePokeShortCmd: Courier.Description = {
    p: LONG POINTER TO Rapunzel.PokeShortCmd = notes.noteSize[
      SIZE[Rapunzel.PokeShortCmd]];
    notes.noteParameters[@p.address, DescribeAddress];
    notes.noteParameters[@p.value, DescribeShort];
    };

  DescribeOpCode: Courier.Description = {
    p: LONG POINTER TO Rapunzel.OpCode = notes.noteSize[
      SIZE[Rapunzel.OpCode]];
    };

  DescribeCmd: Courier.Description = {
    p: LONG POINTER TO Rapunzel.Cmd = notes.noteSize[
      SIZE[Rapunzel.Cmd]];
    sizes: ARRAY [0..2) OF CARDINAL ← [
      SIZE[Rapunzel.PeekShortCmd] + 1, SIZE[Rapunzel.PokeShortCmd] + 1];
    notes.noteChoice[p, SIZE[Rapunzel.Cmd], LONG[DESCRIPTOR[sizes]]];
    WITH variant: p↑ SELECT FROM
      peekShort =>     notes.noteParameters[@variant.peekShort, DescribePeekShortCmd];
      pokeShort =>     notes.noteParameters[@variant.pokeShort, DescribePokeShortCmd];
      ENDCASE;
    };

  DescribeSeqCmd: Courier.Description = {
    p: LONG POINTER TO Rapunzel.SeqCmd = notes.noteSize[
      SIZE[Rapunzel.SeqCmd]];
    notes.noteArrayDescriptor[p, SIZE[Rapunzel.Cmd], CARDINAL.LAST];
    FOR i:Rapunzel.SeqCmdIndex IN [0..LENGTH[p↑]) DO 
      notes.noteParameters[@p[i], DescribeCmd];
      ENDLOOP;
    };

  DescribePeekShortResult: Courier.Description = {
    p: LONG POINTER TO Rapunzel.PeekShortResult = notes.noteSize[
      SIZE[Rapunzel.PeekShortResult]];
    notes.noteParameters[@p.value, DescribeShort];
    };

  DescribePokeShortResult: Courier.Description = {
    p: LONG POINTER TO Rapunzel.PokeShortResult = notes.noteSize[
      SIZE[Rapunzel.PokeShortResult]];
    };

  DescribeResult: Courier.Description = {
    p: LONG POINTER TO Rapunzel.Result = notes.noteSize[
      SIZE[Rapunzel.Result]];
    sizes: ARRAY [0..2) OF CARDINAL ← [
      SIZE[Rapunzel.PeekShortResult] + 1, SIZE[Rapunzel.PokeShortResult] + 1];
    notes.noteChoice[p, SIZE[Rapunzel.Result], LONG[DESCRIPTOR[sizes]]];
    WITH variant: p↑ SELECT FROM
      peekShort =>     notes.noteParameters[@variant.peekShort, DescribePeekShortResult];
      pokeShort =>     notes.noteParameters[@variant.pokeShort, NIL];
      ENDCASE;
    };

  DescribeSeqResult: Courier.Description = {
    p: LONG POINTER TO Rapunzel.SeqResult = notes.noteSize[
      SIZE[Rapunzel.SeqResult]];
    notes.noteArrayDescriptor[p, SIZE[Rapunzel.Result], CARDINAL.LAST];
    FOR i:Rapunzel.SeqResultIndex IN [0..LENGTH[p↑]) DO 
      notes.noteParameters[@p[i], DescribeResult];
      ENDLOOP;
    };

  DescribeFaultArgs: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.FaultArgs = notes.noteSize[
      SIZE[RapunzelCourier.FaultArgs]];
    notes.noteParameters[@p.code, DescribeFaultCode];
    notes.noteParameters[@p.address, DescribeAddress];
    };

  DescribeFaultCode: Courier.Description = {
    p: LONG POINTER TO Rapunzel.FaultCode = notes.noteSize[
      SIZE[Rapunzel.FaultCode]];
    };

  DescribeDoCmdsArgs: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.DoCmdsArgs = notes.noteSize[
      SIZE[RapunzelCourier.DoCmdsArgs]];
    notes.noteDisjointData[@p.cmdSeq, DescribeSeqCmd];
    };

  DescribeDoCmdsRes: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.DoCmdsRes = notes.noteSize[
      SIZE[RapunzelCourier.DoCmdsRes]];
    notes.noteDisjointData[@p.resultSeq, DescribeSeqResult];
    };

  DescribePeekShortArgs: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.PeekShortArgs = notes.noteSize[
      SIZE[RapunzelCourier.PeekShortArgs]];
    notes.noteParameters[@p.address, DescribeAddress];
    };

  DescribePeekShortRes: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.PeekShortRes = notes.noteSize[
      SIZE[RapunzelCourier.PeekShortRes]];
    notes.noteParameters[@p.result, DescribeShort];
    };

  DescribePokeShortArgs: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.PokeShortArgs = notes.noteSize[
      SIZE[RapunzelCourier.PokeShortArgs]];
    notes.noteParameters[@p.address, DescribeAddress];
    notes.noteParameters[@p.value, DescribeShort];
    };

  DescribePeekSeqShortArgs: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.PeekSeqShortArgs = notes.noteSize[
      SIZE[RapunzelCourier.PeekSeqShortArgs]];
    notes.noteParameters[@p.address, DescribeAddress];
    };

  DescribePeekSeqShortRes: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.PeekSeqShortRes = notes.noteSize[
      SIZE[RapunzelCourier.PeekSeqShortRes]];
    notes.noteDisjointData[@p.resultSeq, DescribeSeqShort];
    };

  DescribePokeSeqShortArgs: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.PokeSeqShortArgs = notes.noteSize[
      SIZE[RapunzelCourier.PokeSeqShortArgs]];
    notes.noteParameters[@p.address, DescribeAddress];
    notes.noteDisjointData[@p.valueSeq, DescribeSeqShort];
    };

  DescribePeekLongArgs: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.PeekLongArgs = notes.noteSize[
      SIZE[RapunzelCourier.PeekLongArgs]];
    notes.noteParameters[@p.address, DescribeAddress];
    };

  DescribePeekLongRes: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.PeekLongRes = notes.noteSize[
      SIZE[RapunzelCourier.PeekLongRes]];
    notes.noteParameters[@p.result, DescribeLong];
    };

  DescribePokeLongArgs: Courier.Description = {
    p: LONG POINTER TO RapunzelCourier.PokeLongArgs = notes.noteSize[
      SIZE[RapunzelCourier.PokeLongArgs]];
    notes.noteParameters[@p.address, DescribeAddress];
    notes.noteParameters[@p.value, DescribeLong];
    };



  }.