]> git.sur5r.net Git - cc65/blob - test/val/ptrfunc.c
remote TABs in doc/ and test/
[cc65] / test / val / ptrfunc.c
1 /*
2   !!DESCRIPTION!!
3   !!ORIGIN!!      SDCC regression tests
4   !!LICENCE!!     GPL, read COPYING.GPL
5 */
6
7 #include <stdio.h>
8
9 #define NO_IMPLICIT_FUNCPTR_CONV
10
11 unsigned char success=0;
12 unsigned char failures=0;
13 unsigned char dummy=0;
14
15 #ifdef SUPPORT_BIT_TYPES
16 bit bit0 = 0;
17 #endif
18 unsigned int uint0 = 0;
19 unsigned int uint1 = 0;
20
21 /*
22  * BUG: if these aren't volatile, an overzealous optimizer or somthing
23  * wreaks havoc with the simple tests like "if(uchar != 3)failures++"
24  */
25
26 #if 0
27 unsigned char uchar0 = 0;
28 unsigned char uchar1 = 0;
29 unsigned char uchar2 = 0;
30 #else
31 volatile unsigned char uchar0 = 0;
32 volatile unsigned char uchar1 = 0;
33 volatile unsigned char uchar2 = 0;
34 #endif
35
36 #ifdef NO_IMPLICIT_FUNCPTR_CONV
37 void (*pfunc)(void);
38 void (*p1func)(void);
39 unsigned char (*pcfunc)(void);
40 #else
41 void (*pfunc)();
42 void (*p1func)();
43 unsigned char (*pcfunc)();
44 #endif
45
46 void done()
47 {
48   dummy++;
49 }
50
51 void call0(void)
52 {
53         uchar0++;
54 }
55
56 void call1(void)
57 {
58         uchar1++;
59 }
60
61 unsigned char call2(void)
62 {
63         return uchar0 + 9;
64 }
65
66 void docall0(void)
67 {
68         pfunc = call0;
69         (pfunc)();
70         if(uchar0 != 1)
71                 failures++;
72 }
73
74 void docall1()
75 {
76         unsigned char i;
77         for(i = 0; i < 3; i++) {
78                 (*p1func)();
79         }
80 }
81
82 #ifdef NO_IMPLICIT_FUNCPTR_CONV
83 void docall2( void(*pf)(void) )
84 #else
85 void docall2( void(*pf)() )
86 #endif
87 {
88         unsigned char i;
89         for(i = 0; i < 2; i++) {
90                 pf();
91         }
92 }
93
94 int  main(void)
95 {
96     docall0();
97
98         p1func = call1;
99         docall1();
100         if(uchar1 != 3)
101                 failures++;
102         if(uchar0 != 1)
103                 failures++;
104
105         p1func = call0;
106         docall1();
107         if(uchar1 != 3)
108                 failures++;
109         if(uchar0 != 4)
110                 failures++;
111
112         docall2(call0);
113         if(uchar1 != 3)
114                 failures++;
115         if(uchar0 != 6)
116                 failures++;
117
118         docall2(call1);
119         if(uchar1 != 5)
120                 failures++;
121         if(uchar0 != 6)
122                 failures++;
123
124         pcfunc = call2;
125         uchar2 = (*pcfunc)();
126         if(uchar2 != 15)
127                 failures++;
128
129         uchar2 += (pcfunc)();
130         uchar2 += pcfunc();
131
132         success = failures;
133         done();
134         printf("failures: %d\n",failures);
135
136         return failures;
137 }