Steve Tell wrote this test program to test function pointers (note that
[fw/sdcc] / src / regression / ptrfunc.c
1 #define __16F873
2 #include "p16f873.h"
3 //#include "p16c84.h"
4
5 unsigned char success=0;
6 unsigned char failures=0;
7 unsigned char dummy=0;
8
9 bit bit0 = 0;
10 unsigned int uint0 = 0;
11 unsigned int uint1 = 0;
12
13 /* 
14  * BUG: if these aren't volatile, an overzealous optimizer or somthing
15  * wreaks havoc with the simple tests like "if(uchar != 3)failures++"
16  */
17 volatile unsigned char uchar0 = 0;
18 volatile unsigned char uchar1 = 0;
19 volatile unsigned char uchar2 = 0;
20
21 void (*pfunc)();
22 void (*p1func)();
23 unsigned char (*pcfunc)();
24
25 void done()
26 {
27
28   dummy++;
29
30 }
31
32 void call0(void)
33 {
34         uchar0++;
35 }
36
37 void call1(void)
38 {
39         uchar1++;
40 }
41
42 unsigned char call2(void)
43 {
44         return uchar0 + 9;
45 }
46
47 void docall0(void)
48 {
49         pfunc = call0;
50         (pfunc)();
51         if(uchar0 != 1)
52                 failures++;
53 }
54
55 void docall1()
56 {
57         unsigned char i;
58         for(i = 0; i < 3; i++) {
59                 (*p1func)();
60         }
61 }
62
63 void docall2( void(*pf)() )
64 {
65         unsigned char i;
66         for(i = 0; i < 2; i++) {
67                 pf();
68         }
69 }
70
71 void main(void)
72 {
73         docall0();
74
75
76         p1func = call1;
77         docall1();
78         if(uchar1 != 3)
79                 failures++;
80         if(uchar0 != 1)
81                 failures++;
82
83         p1func = call0;
84         docall1();
85         if(uchar1 != 3)
86                 failures++;
87         if(uchar0 != 4)
88                 failures++;
89
90         docall2(call0);
91         if(uchar1 != 3)
92                 failures++;
93         if(uchar0 != 6)
94                 failures++;
95
96         docall2(call1);
97         if(uchar1 != 5)
98                 failures++;
99         if(uchar0 != 6)
100                 failures++;
101
102         pcfunc = call2;
103         uchar2 = (*pcfunc)();
104         if(uchar2 != 15)
105                 failures++;
106 /**/
107 /*      uchar2 += (pcfunc)(); */ /* FRONT-END BUG? - type-mismatch error */
108 /*      uchar2 += pcfunc(); */ /* FRONT-END BUG? - type-mismatch error */
109
110         success = failures;
111         done();
112 }