ffa_ch17_peh.kv 1
ffa_ch17_peh.kv 2
ffa_ch17_peh.kv 3
ffa_ch17_peh.kv 4
ffa_ch17_peh.kv 5
ffa_ch17_peh.kv 6
ffa_ch17_peh.kv 7
ffa_ch17_peh.kv 8
ffa_ch17_peh.kv 9
ffa_ch17_peh.kv 10
ffa_ch17_peh.kv 11
ffa_ch17_peh.kv 12
ffa_ch17_peh.kv 13
ffa_ch17_peh.kv 14
ffa_ch17_peh.kv 15
ffa_ch17_peh.kv 16
ffa_ch17_peh.kv 17
ffa_ch17_peh.kv 18
ffa_ch17_peh.kv 19
ffa_ch17_peh.kv 20 with OS; use OS;
ffa_ch17_peh.kv 21 with CmdLine; use CmdLine;
ffa_ch17_peh.kv 22 with FFA_RNG; use FFA_RNG;
ffa_ch17_peh.kv 23 with FFA_Calc; use FFA_Calc;
ffa_ch17_peh.kv 24
ffa_ch17_peh.kv 25
ffa_ch17_peh.kv 26
ffa_ch17_peh.kv 27 procedure Peh is
ffa_ch17_peh.kv 28
ffa_ch17_peh.kv 29 PehDim : Peh_Dimensions;
ffa_ch17_peh.kv 30
ffa_ch17_peh.kv 31 RNG : RNG_Device;
ffa_ch17_peh.kv 32
ffa_ch17_peh.kv 33 begin
ffa_ch17_peh.kv 34
ffa_ch17_peh.kv 35
ffa_ch17_peh.kv 36 if Arg_Count < 5 or Arg_Count > 6 then
ffa_ch17_peh.kv 37 Eggog("Usage: ./peh WIDTH HEIGHT TAPESPACE LIFE [/dev/rng]");
ffa_ch17_peh.kv 38 end if;
ffa_ch17_peh.kv 39
ffa_ch17_peh.kv 40 declare
ffa_ch17_peh.kv 41 Arg1 : CmdLineArg;
ffa_ch17_peh.kv 42 Arg2 : CmdLineArg;
ffa_ch17_peh.kv 43 Arg3 : CmdLineArg;
ffa_ch17_peh.kv 44 Arg4 : CmdLineArg;
ffa_ch17_peh.kv 45 begin
ffa_ch17_peh.kv 46
ffa_ch17_peh.kv 47
ffa_ch17_peh.kv 48 Get_Argument(1, Arg1);
ffa_ch17_peh.kv 49 Get_Argument(2, Arg2);
ffa_ch17_peh.kv 50 Get_Argument(3, Arg3);
ffa_ch17_peh.kv 51 Get_Argument(4, Arg4);
ffa_ch17_peh.kv 52
ffa_ch17_peh.kv 53 if Arg_Count = 6 then
ffa_ch17_peh.kv 54
ffa_ch17_peh.kv 55
ffa_ch17_peh.kv 56 declare
ffa_ch17_peh.kv 57 Arg5 : CmdLineArg;
ffa_ch17_peh.kv 58 begin
ffa_ch17_peh.kv 59 Get_Argument(5, Arg5);
ffa_ch17_peh.kv 60
ffa_ch17_peh.kv 61
ffa_ch17_peh.kv 62
ffa_ch17_peh.kv 63
ffa_ch17_peh.kv 64
ffa_ch17_peh.kv 65 Init_RNG(RNG, Arg5(Arg5'First .. Len_Arg(5)));
ffa_ch17_peh.kv 66 end;
ffa_ch17_peh.kv 67
ffa_ch17_peh.kv 68 else
ffa_ch17_peh.kv 69
ffa_ch17_peh.kv 70
ffa_ch17_peh.kv 71 Init_RNG(RNG);
ffa_ch17_peh.kv 72
ffa_ch17_peh.kv 73
ffa_ch17_peh.kv 74 Achtung("WARNING: The '?' command will use DEFAULT entropy source : "
ffa_ch17_peh.kv 75 & Default_RNG_Path & " !");
ffa_ch17_peh.kv 76
ffa_ch17_peh.kv 77
ffa_ch17_peh.kv 78 end if;
ffa_ch17_peh.kv 79
ffa_ch17_peh.kv 80
ffa_ch17_peh.kv 81 PehDim.Width := Positive'Value( Arg1 );
ffa_ch17_peh.kv 82 PehDim.Height := Positive'Value( Arg2 );
ffa_ch17_peh.kv 83 PehDim.TapeSpace := Peh_Tape_Range'Value( Arg3 );
ffa_ch17_peh.kv 84 PehDim.Life := Natural'Value( Arg4 );
ffa_ch17_peh.kv 85
ffa_ch17_peh.kv 86 exception
ffa_ch17_peh.kv 87
ffa_ch17_peh.kv 88
ffa_ch17_peh.kv 89 when others =>
ffa_ch17_peh.kv 90 Eggog("Invalid arguments!");
ffa_ch17_peh.kv 91
ffa_ch17_peh.kv 92 end;
ffa_ch17_peh.kv 93
ffa_ch17_peh.kv 94
ffa_ch17_peh.kv 95 Validate_Peh_Dimensions(PehDim);
ffa_ch17_peh.kv 96
ffa_ch17_peh.kv 97
ffa_ch17_peh.kv 98 declare
ffa_ch17_peh.kv 99
ffa_ch17_peh.kv 100
ffa_ch17_peh.kv 101 Tape_Read_Char : Character;
ffa_ch17_peh.kv 102
ffa_ch17_peh.kv 103
ffa_ch17_peh.kv 104 TapeSpace : Peh_Tapes(1 .. PehDim.TapeSpace) := (others => ' ');
ffa_ch17_peh.kv 105
ffa_ch17_peh.kv 106
ffa_ch17_peh.kv 107 EOF : Boolean := False;
ffa_ch17_peh.kv 108
ffa_ch17_peh.kv 109
ffa_ch17_peh.kv 110 Verdict : Peh_Verdicts;
ffa_ch17_peh.kv 111
ffa_ch17_peh.kv 112 begin
ffa_ch17_peh.kv 113
ffa_ch17_peh.kv 114
ffa_ch17_peh.kv 115 for TapePosition in TapeSpace'Range loop
ffa_ch17_peh.kv 116
ffa_ch17_peh.kv 117
ffa_ch17_peh.kv 118 if Read_Char(Tape_Read_Char) then
ffa_ch17_peh.kv 119
ffa_ch17_peh.kv 120
ffa_ch17_peh.kv 121 TapeSpace(TapePosition) := Tape_Read_Char;
ffa_ch17_peh.kv 122
ffa_ch17_peh.kv 123 else
ffa_ch17_peh.kv 124
ffa_ch17_peh.kv 125
ffa_ch17_peh.kv 126 EOF := True;
ffa_ch17_peh.kv 127 if TapePosition /= TapeSpace'Length then
ffa_ch17_peh.kv 128 Achtung("WARNING: Short Tape: Tapespace filled to position:" &
ffa_ch17_peh.kv 129 Peh_Tape_Range'Image(TapePosition) & " of" &
ffa_ch17_peh.kv 130 Peh_Tape_Range'Image(TapeSpace'Last) & ".");
ffa_ch17_peh.kv 131 end if;
ffa_ch17_peh.kv 132
ffa_ch17_peh.kv 133 end if;
ffa_ch17_peh.kv 134
ffa_ch17_peh.kv 135 exit when EOF;
ffa_ch17_peh.kv 136
ffa_ch17_peh.kv 137 end loop;
ffa_ch17_peh.kv 138
ffa_ch17_peh.kv 139
ffa_ch17_peh.kv 140 Verdict := Peh_Machine(Dimensions => PehDim,
ffa_ch17_peh.kv 141 Tape => TapeSpace,
ffa_ch17_peh.kv 142 RNG => RNG);
ffa_ch17_peh.kv 143
ffa_ch17_peh.kv 144
ffa_ch17_peh.kv 145
ffa_ch17_peh.kv 146 case Verdict is
ffa_ch17_peh.kv 147
ffa_ch17_peh.kv 148
ffa_ch17_peh.kv 149 when Yes =>
ffa_ch17_peh.kv 150 Quit(Yes_Code);
ffa_ch17_peh.kv 151
ffa_ch17_peh.kv 152
ffa_ch17_peh.kv 153 when No =>
ffa_ch17_peh.kv 154 Quit(No_Code);
ffa_ch17_peh.kv 155
ffa_ch17_peh.kv 156
ffa_ch17_peh.kv 157
ffa_ch17_peh.kv 158
ffa_ch17_peh.kv 159
ffa_ch17_peh.kv 160 when Mu =>
ffa_ch17_peh.kv 161 Achtung("WARNING: Tape terminated without a Verdict.");
ffa_ch17_peh.kv 162 Quit(Mu_Code);
ffa_ch17_peh.kv 163
ffa_ch17_peh.kv 164 end case;
ffa_ch17_peh.kv 165
ffa_ch17_peh.kv 166
ffa_ch17_peh.kv 167
ffa_ch17_peh.kv 168
ffa_ch17_peh.kv 169
ffa_ch17_peh.kv 170
ffa_ch17_peh.kv 171 end;
ffa_ch17_peh.kv 172
ffa_ch17_peh.kv 173 end Peh;