1-- C57003A.ADA
2
3--                             Grant of Unlimited Rights
4--
5--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
7--     unlimited rights in the software and documentation contained herein.
8--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making
9--     this public release, the Government intends to confer upon all
10--     recipients unlimited rights  equal to those held by the Government.
11--     These rights include rights to use, duplicate, release or disclose the
12--     released technical data and computer software in whole or in part, in
13--     any manner and for any purpose whatsoever, and to have or permit others
14--     to do so.
15--
16--                                    DISCLAIMER
17--
18--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
20--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
22--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23--     PARTICULAR PURPOSE OF SAID MATERIAL.
24--*
25-- CHECK THAT THE EXIT STATEMENT IS EVALUATED EACH TIME THROUGH A LOOP,
26--    AND THAT IT IS EVALUATED CORRECTLY WHETHER POSITIONED AT THE
27--    BEGINNING, MIDDLE, OR END OF THE LOOP.
28
29
30
31-- EACH TEST IS A LOOP ON  J  WHERE THE EXIT CONDITIONS ARE TO EVALUATE
32--    TO  'FALSE'  A CERTAIN NUMBER OF TIMES UNTIL, AT THE APPROPRIATE
33--    TIME, ONE OF THEM EVALUATES TO  'TRUE'  AND CAUSES THE LOOP TO BE
34--    EXITED.
35--
36--
37--    THE TEST IS PERFORMED 30 TIMES FOR EACH OF THE FIRST TWO
38--    DATA TYPES CONSIDERED ('INTEGER', USER-DEFINED ENUMERATION)
39--    AND 26 TIMES FOR 'CHARACTER' (THUS 86 TIMES ALTOGETHER).
40--
41--
42--    EACH DATA TYPE HAS ITS OWN SEPARATE SECTION OF CODE.  ALL SECTIONS
43--    FOLLOW THE SAME TESTING ALGORITHM (MUTATIS MUTANDIS).  THE CALCU-
44--    LATIONS WHICH KEEP TRACK OF THE FLOW OF CONTROL ARE ALL DONE IN
45--    INTEGER ARITHMETIC.  THERE ARE THREE DATA TYPES, THUS THREE
46--    SECTIONS.
47--
48--
49--    FOR EACH DATA TYPE, THE 30 TESTS ARE DIVIDED INTO 3 "SEGMENTS"
50--
51--               << NOTE:  THE NUMBER OF SEGMENTS IS WRITTEN  " 3 "    ,
52--                         THE NUMBER OF SECTIONS IS WRITTEN  "THREE" >>
53--
54--    (OF 10 TESTS EACH, EXCEPT 10,10,6 FOR 'CHARACTER'), NUMBERED
55--     0 , 1 , 2  AND CORRESPONDING TO THE 3 SIGNIFICANTLY DIFFERENT
56--    POSITIONS OF AN EXIT STATEMENT WITH RESPECT TO THE LOOP IT IS IN
57--    ( "AT THE VERY TOP" , "AT THE VERY BOTTOM" , "ANYWHERE IN BETWEEN"
58--    ).  AT THE BEGINNING OF EACH TEST, THE VARIABLE  WHICH_SEGMENT
59--    IS UPDATED TO CONTAIN THE NEW VALUE OF THIS IDENTIFYING NUMBER
60--    (FOR THE TEST ABOUT TO BEGIN):
61--
62--             EXIT AT THE TOP      ........   WHICH_SEGMENT = 0
63--             EXIT FROM THE MIDDLE ........   WHICH_SEGMENT = 1
64--             EXIT AT THE BOTTOM   ........   WHICH_SEGMENT = 2   .
65--
66--
67--    WITHIN EACH SECTION, THE TESTS ARE NUMBERED  FROM  1  TO  30
68--    (26 FOR 'CHARACTER').  THIS NUMBER IS STORED IN THE INTEGER
69--    VARIABLE  INT_I  (EQUAL TO THE CURRENT VALUE OF THE OUTER-LOOP
70--    INDEX WHEN THAT INDEX IS OF INTEGER TYPE), WHOSE APPROPRIATE VALUE
71--    FOR EACH TEST IS SET AT THE BEGINNING OF THE TEST.
72--
73--
74--    AS PART OF THE EVALUATION PROCESS, THE PROGRAM COMPUTES FOR EACH
75--    TEST (I.E.  FOR EACH VALUE OF  I , OR OF  INT_I ) THE APPROPRIATE
76--    NUMBER OF INNER-LOOP ITERATIONS REQUIRED BEFORE EXIT; THIS IS
77--    THE EXPECTED VALUE OF  J  (EXPRESSED AS AN INTEGER IN THE RANGE
78--     1..10 ) AND STORES IT IN  EXPECTED_J .  FOR EACH OF THE THREE
79--    SECTIONS, THE TIME SEQUENCE OF THESE 30 VALUES IS
80--
81--             1   2   3   4   5   6   7   8   9  10     << SEGMENT 1 >>
82--             6   6   7   7   8   8   9   9  10  10     << SEGMENT 2 >>
83--             7   8   8   8   9   9   9  10  10  10     << SEGMENT 3 >>
84--
85--    (EACH SECTION GETS ALL 3 ROWS, NOT ONE ROW PER SECTION;
86--    FOR 'CHARACTER', WHERE ONLY 26 VALUES ARE REQUIRED, THE LAST 4
87--    VALUES ARE OMITTED).  THIS NUMBER IS COMPARED WITH THE ACTUAL
88--    VALUE OF  J  (ACTUAL NUMBER OF INNER-LOOP ITERATIONS BEFORE THE
89--    EXECUTION OF THE EXIT STATEMENT) AS SAVED JUST BEFORE THE EXIT
90--    FROM THE LOOP (AGAIN IN THE FORM OF AN INTEGER IN THE RANGE
91--     1..30 , IRRESPECTIVE OF THE DATA TYPE BEING TESTED),  I F
92--    SUCH SAVED VALUE IS AVAILABLE.
93--
94--
95--    THE ACTUAL VALUE OF INNER-LOOP ITERATIONS (AS SAVED IMMEDIATELY
96--    BEFORE THE EXIT, AS OPPOSED TO A VALUE LEFT OVER FROM SOME
97--    PREVIOUS ITERATION) IS AVAILABLE ONLY IF  WHICH_SEGMENT /= 0 ,
98--    AND IS THEN STORED IN  SAVE_J .
99--
100--
101--    FOR THE CASE  WHICH_SEGMENT = 0 , THE ITERATIONS ARE COUNTED IN
102--    THE VARIABLE  COUNT , WHOSE VALUE AT THE COMPLETION OF THE
103--    I-TH TEST ( I IN 1..10 ) MUST BE EQUAL TO  EXPECTED_J - 1 ,
104--    AND THUS TO  I - 1  (METHODOLOGICALLY AS WELL AS COMPUTATIONALLY
105--    THIS IS NO DIFFERENT FROM USING THE MOST RECENT VALUE OF  SAVE_J
106--    WHEN A CURRENT ONE CANNOT BE OBTAINED).  AFTER BEING INCREMENTED
107--    BY  1 ,  COUNT  IS CHECKED AGAINST  EXPECTED_J .
108--
109--
110--    THIS CONCLUDES THE DESCRIPTION OF THE CASE  WHICH_SEGMENT = 0 ,
111--    AND THUS OF THE ALGORITHM.  THE ONLY REASON FOR SPLITTING THE
112--    CASE  WHICH_SEGMENT /= 0  INTO TWO IS THE DESIRE TO PROVIDE FOR
113--    DISTINCT MESSAGES.
114
115
116
117-- RM 04/23/81
118-- SPS 3/7/83
119
120WITH REPORT;
121PROCEDURE  C57003A  IS
122
123     USE  REPORT ;
124
125BEGIN
126
127     TEST( "C57003A" , "TEST THAT THE EXIT STATEMENT IS EVALUATED" &
128                       " EACH TIME THROUGH THE LOOP"               );
129
130     DECLARE
131
132          WHICH_SEGMENT  :  INTEGER RANGE 0..2   ;   -- BOUNDS ARE TIGHT
133          SAVE_J         :  INTEGER RANGE 1..10  ;
134          EXPECTED_J     :  INTEGER RANGE 1..10  ;
135          COUNT          :  INTEGER RANGE 0..100     := 0 ;
136          INT_I          :  INTEGER RANGE 1..30  ;
137
138          TYPE  ENUM  IS    ( CHANGE_THE_ORIGIN_FROM_0_TO_1 ,
139
140               A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 , A10 ,
141               A11, A12, A13, A14, A15, A16, A17, A18, A19, A20 ,
142               A21, A22, A23, A24, A25, A26, A27, A28, A29, A30 );
143
144     BEGIN
145
146
147          --------------------------------------------------------------
148          -----------------------  INTEGER  ----------------------------
149
150
151          FOR  I  IN  INTEGER RANGE 1..30  LOOP
152
153
154               WHICH_SEGMENT  :=  ( I - 1 ) / 10        ;
155               EXPECTED_J     :=  ( I + WHICH_SEGMENT ) /
156                                  ( WHICH_SEGMENT + 1 ) ;
157
158               COUNT  :=  0 ;
159
160
161               FOR  J  IN  INTEGER RANGE 1..10  LOOP
162
163                    --  J  NOT SAVED HERE (SO THAT 'EXIT' BE FIRST STMT)
164
165                    EXIT WHEN  WHICH_SEGMENT = 0  AND
166                               1*J >= I ;--COUNT+:=1 ON NXT LINE INSTEAD
167                    COUNT := COUNT + 1 ;
168
169                    NULL ;
170                    NULL ;
171                    NULL ;
172                    SAVE_J := J ;
173                    EXIT WHEN  WHICH_SEGMENT = 1  AND
174                               2*J >= I ;
175
176                    NULL ;
177                    NULL ;
178                    NULL ;
179                    SAVE_J := J ;
180                    EXIT WHEN  WHICH_SEGMENT = 2  AND
181                               3*J >= I ;
182
183               END LOOP;
184
185
186               COUNT          :=  COUNT + 1             ;  -- SEE HEADER
187
188               CASE  WHICH_SEGMENT  IS
189                    WHEN  0  =>
190                         IF  COUNT  /=  EXPECTED_J  THEN
191                              FAILED( "WRONG COUNT; INT, EXIT AT TOP" );
192                         END IF;
193                    WHEN  1  =>                 -- WOULD WORK ALSO FOR 0
194                         IF  SAVE_J  /=  EXPECTED_J  THEN
195                              FAILED( "WRONG COUNT; I,EXIT AT MIDDLE" );
196                         END IF;
197                    WHEN  2  =>
198                         IF  SAVE_J  /=  EXPECTED_J  THEN
199                              FAILED( "WRONG COUNT; I,EXIT AT BOTTOM" );
200                         END IF;
201               END CASE;
202
203          END LOOP;
204
205
206
207          --------------------------------------------------------------
208          ----------------------  CHARACTER  ---------------------------
209
210
211          FOR  I  IN  CHARACTER RANGE 'A'..'Z'  LOOP
212
213               INT_I  := CHARACTER'POS(I) - CHARACTER'POS('A') + 1;
214
215               WHICH_SEGMENT  :=  ( INT_I - 1 ) / 10        ;
216               EXPECTED_J     :=  ( INT_I + WHICH_SEGMENT ) /
217                                  ( WHICH_SEGMENT + 1 )     ;
218
219               COUNT  :=  0 ;
220
221
222               FOR  J  IN  CHARACTER RANGE 'A'..'J'  LOOP
223
224                    --  J  NOT SAVED HERE (SO THAT 'EXIT' BE FIRST STMT)
225
226                    EXIT WHEN  WHICH_SEGMENT = 0  AND
227                               J >= I ; -- COUNT+:=1 ON NXT LINE INSTEAD
228                    COUNT := COUNT + 1 ;
229
230                    NULL ;
231                    NULL ;
232                    NULL ;
233                    SAVE_J := CHARACTER'POS(J) - CHARACTER'POS('A') + 1;
234                    EXIT WHEN  WHICH_SEGMENT = 1  AND
235                               2 * SAVE_J >= INT_I ;
236
237                    NULL ;
238                    NULL ;
239                    NULL ;
240                    EXIT WHEN  WHICH_SEGMENT = 2  AND
241                               3 * SAVE_J >= INT_I ;
242
243               END LOOP;
244
245
246               COUNT          :=    COUNT + 1               ;
247
248               CASE  WHICH_SEGMENT  IS
249                    WHEN  0  =>
250                         IF  COUNT  /=  EXPECTED_J  THEN
251                              FAILED( "WRONG COUNT;CHAR, EXIT AT TOP" );
252                         END IF;
253                    WHEN  1  =>                 -- WOULD WORK ALSO FOR 0
254                         IF  SAVE_J  /=  EXPECTED_J  THEN
255                              FAILED( "WRONG COUNT; C,EXIT AT MIDDLE" );
256                         END IF;
257                    WHEN  2  =>
258                         IF  SAVE_J  /=  EXPECTED_J  THEN
259                              FAILED( "WRONG COUNT; C,EXIT AT BOTTOM" );
260                         END IF;
261               END CASE;
262
263          END LOOP;
264
265
266
267          --------------------------------------------------------------
268          ---------------------  ENUMERATION  --------------------------
269
270
271          FOR  I  IN  ENUM RANGE A1..A30  LOOP
272
273
274               INT_I          :=    ENUM'POS(I) ;
275
276               WHICH_SEGMENT  :=  ( INT_I - 1 ) / 10        ;
277               EXPECTED_J     :=  ( INT_I + WHICH_SEGMENT ) /
278                                  ( WHICH_SEGMENT + 1 )     ;
279
280               COUNT  :=  0 ;
281
282
283               FOR  J  IN  ENUM RANGE A1..A10  LOOP
284
285                    --  J  NOT SAVED HERE (SO THAT 'EXIT' BE FIRST STMT)
286
287                    EXIT WHEN  WHICH_SEGMENT = 0  AND
288                               J >= I ; -- COUNT+:=1 ON NXT LINE INSTEAD
289                    COUNT := COUNT + 1 ;
290
291                    NULL ;
292                    NULL ;
293                    NULL ;
294                    SAVE_J := ENUM'POS(J) ;
295                    EXIT WHEN  WHICH_SEGMENT = 1  AND
296                               2 * SAVE_J >= INT_I ;
297
298                    NULL ;
299                    NULL ;
300                    NULL ;
301                    EXIT WHEN  WHICH_SEGMENT = 2  AND
302                               3 * SAVE_J >= INT_I ;
303
304               END LOOP;
305
306
307               COUNT          :=    COUNT + 1               ;
308
309               CASE  WHICH_SEGMENT  IS
310                    WHEN  0  =>
311                         IF  COUNT  /=  EXPECTED_J  THEN
312                              FAILED( "WRONG COUNT;ENUM, EXIT AT TOP" );
313                         END IF;
314                    WHEN  1  =>                 -- WOULD WORK ALSO FOR 0
315                         IF  SAVE_J  /=  EXPECTED_J  THEN
316                              FAILED( "WRONG COUNT; E,EXIT AT MIDDLE" );
317                         END IF;
318                    WHEN  2  =>
319                         IF  SAVE_J  /=  EXPECTED_J  THEN
320                              FAILED( "WRONG COUNT; E,EXIT AT BOTTOM" );
321                         END IF;
322               END CASE;
323
324          END LOOP;
325
326          --------------------------------------------------------------
327
328     END ;
329
330
331     RESULT ;
332
333
334END  C57003A ;
335