]> git.sur5r.net Git - cc65/blob - test/val/nestfor.c
All regression-tests subdirectories are cleaned before the first test starts, so...
[cc65] / test / val / nestfor.c
1 /*
2   !!DESCRIPTION!!
3   !!ORIGIN!!      SDCC regression tests
4   !!LICENCE!!     GPL, read COPYING.GPL
5 */
6
7 #include <stdio.h>
8 #include <limits.h>
9
10 unsigned char success=0;
11 unsigned char failures=0;
12 unsigned char dummy=0;
13
14 #ifdef SUPPORT_BIT_TYPES
15 bit bit0 = 0;
16 #endif
17 unsigned int uint0 = 0;
18 unsigned int uint1 = 0;
19 unsigned char uchar0 = 0;
20 unsigned char uchar1 = 0;
21
22 void dput(unsigned char val)
23 {
24         /*PORTB = val;
25         PORTA = 0x01;
26         PORTA = 0x00;
27         */
28 }
29
30 void done()
31 {
32   dummy++;
33 }
34
35 /* both loops use the loop variable inside the inner loop */
36 void for1(void)
37 {
38         unsigned char i, j;
39
40         uchar0 = 0;
41         uchar1 = 0;
42         for(i = 0; i < 3; i++) {
43                 uchar0++;
44                 for(j = 0; j < 4; j++) {
45                         uchar1++;
46                         dput(i);
47                         dput(j);
48                 }
49         }
50         if(uchar0 != 3)
51                 failures++;
52         if(uchar1 != 12)
53                 failures++;
54 }
55
56 /* only the outer loop's variable is used inside, inner can be optimized into a repeat-loop */
57 void for2(void)
58 {
59         unsigned char i, j;
60
61         uchar0 = 0;
62         uchar1 = 0;
63         for(i = 0; i < 3; i++) {
64                 uchar0++;
65                 for(j = 0; j < 4; j++) {
66                         uchar1++;
67                         dput(i);
68                 }
69         }
70         if(uchar0 != 3)
71                 failures++;
72         if(uchar1 != 12)
73                 failures++;
74 }
75
76 /* only the inner loop's variable is used inside */
77 void for3(void)
78 {
79         unsigned char i, j;
80
81         uchar0 = 0;
82         uchar1 = 0;
83         for(i = 0; i < 3; i++) {
84                 uchar0++;
85                 for(j = 0; j < 4; j++) {
86                         uchar1++;
87                         dput(j);
88                 }
89         }
90         if(uchar0 != 3)
91                 failures++;
92         if(uchar1 != 12)
93                 failures++;
94 }
95
96 /* neither loop variable used inside the loops */
97 void for4(void)
98 {
99         unsigned char i, j;
100
101         uchar0 = 0;
102         uchar1 = 0;
103         for(i = 0; i < 3; i++) {
104                 uchar0++;
105                 for(j = 0; j < 4; j++) {
106                         uchar1++;
107                         dput(uchar0);
108                         dput(uchar1);
109                 }
110         }
111         if(uchar0 != 3)
112                 failures++;
113         if(uchar1 != 12)
114                 failures++;
115 }
116
117 /* like for1 but different condition in inner loop */
118 void for5(void)
119 {
120         unsigned char i, j;
121
122         uchar0 = 0;
123         uchar1 = 0;
124         for(i = 0; i < 3; i++) {
125                 uchar0++;
126                 for(j = 10; j >= 5; j--) {
127                         uchar1++;
128                         dput(i);
129                         dput(j);
130                 }
131         }
132         if(uchar0 != 3)
133                 failures++;
134         if(uchar1 != 18)
135                 failures++;
136 }
137
138 int  main(void)
139 {
140   for1();
141   for2();
142   for3();
143   for4();
144   for5();
145
146   success = failures;
147   done();
148   printf("failures: %d\n",failures);
149
150   return failures;
151 }