New interfaces for `usesTrap' and `canUseExtraSlot'.
[dyninst.git] / igen / tests / advancedC.C
1
2 #include <stdio.h>
3 #include "class.xdr.CLNT.h"
4
5 int noSignal=1; 
6
7
8 int intStructEqual (intStruct one, intStruct two)
9 {
10     return (one.style == two.style);
11 }
12
13 int twoStructEqual (twoStruct one, twoStruct two)
14 {
15     return ((one.style == two.style) &&
16             intStructEqual(one.i,two.i));
17 }
18
19 int metricEqual (metric one, metric two)
20 {
21     return ((one.i == two.i) &&
22             (one.j == two.j));
23 }
24
25 int metricAEqual (metricA one, metricA two)
26 {
27   return ((one.x == two.x) &&
28           (one.y == two.y) &&
29           (one.i == two.i) &&
30           (one.j == two.j));
31 }
32
33 int metricAPEqual (metricA *one, metricA *two)
34 {
35   return ((one->x == two->x) &&
36           (one->y == two->y) &&
37           (one->i == two->i) &&
38           (one->j == two->j));
39 }
40
41 int metricBEqual (metricB one, metricB two)
42 {
43   return ((one.a == two.a) &&
44           (one.b == two.b) &&
45           (one.i == two.i) &&
46           (one.j == two.j));
47 }
48
49 main()
50 {
51     int fd, pid;
52     testUser *remote;
53     twoStruct two, resTwo, *ts1, *ts2;
54     intStruct one, resOne, *is1, *is2;
55     metric oneM, twoM, *pM, *qM;
56     metricA A1, A2, *pA, *p2A;
57     metricB B1, B2, *pB;
58
59     one.style = 3;
60     two.style = 4;
61     two.i.style = 5;
62     oneM.i = 3;
63     oneM.j = 'c';
64
65     A1.x = 'c'; A1.y = 'f'; A1.i = 1; A1.j = 7;
66     B1.a = 4; B1.c = 7; B1.b = 16; B1.i = 0; B1.j = 2;
67
68     fd = RPCprocessCreate(pid, "localhost", "", "advS");
69
70     remote = new testUser(fd, NULL, NULL);
71
72     resOne = remote->echoIntStruct(one);
73     printf("echoIntStruct %s\n",
74            intStructEqual(resOne, one) ? "OK" : "FAILS");
75
76     is1 = remote->echoIntStructP(&resOne);
77     printf("echoIntStructP %s\n",
78            intStructEqual(resOne, *is1) ? "OK" : "FAILS");
79     delete is1;
80
81     resTwo = remote->echoTwoStruct(two);
82     printf("echoTwoStruct %s\n",
83            twoStructEqual(resTwo, two) ? "OK" : "FAILS");
84
85     ts1 = remote->echoTwoStructP(&two);
86     printf("echoTwoStructP %s\n",
87            twoStructEqual(*ts1, two) ? "OK" : "FAILS");
88     delete ts1;
89
90     twoM = remote->testClass(oneM);
91     printf("testClass %s\n", metricEqual(oneM, twoM) ? "OK" : "FAILS");
92
93     pM = remote->testClassPtr(&oneM);
94     printf("testClassPtr %s\n", metricEqual(oneM, *pM) ? "OK" : "FAILS");
95     delete(pM); pM = 0;
96
97     A2 = remote->echoMetricA(A1);
98     printf("echoMetricA %s\n", metricAEqual(A1, A2) ? "OK" : "FAILS");
99
100     B2 = remote->echoMetricB(B1);
101     printf("echoMetricB %s\n", metricBEqual(B1, B2) ? "OK" : "FAILS");
102
103     pM = remote->echoMetricPtrStatic(oneM);
104     printf("echoMetricPtrStatic %s\n", metricEqual(*pM, oneM) ? "OK" : "FAILS");
105     delete(pM); pM = 0;
106
107     pM = remote->echoMetricPtrPtr(&oneM);
108     printf("echoMetricPtrPtr %s\n", metricEqual(*pM, oneM)
109                                ? "OK" : "FAILS");
110
111     pA = new metricA;
112     pA->x = (char) 0;
113     pA->y = (char) 1;
114     pA->i = 2;
115     pA->j = (unsigned char) 3;
116
117     
118     printf("0=metric(base), 1=metricA(derived), 2=metricB(derived)\n");
119     printf("pM->do_it() = %d  -- should be 0\n", pM->do_it());
120     printf("pA->do_it() = %d  -- should be 1\n", pA->do_it());
121     qM = pA;
122     printf("qM->do_it() = %d  -- should be 1\n\n", qM->do_it());
123
124     qM = remote->testClassPtr(pM);
125     printf("These should be equal (to 0) \n");
126     printf("pM->do_it() = %d\n", pM->do_it());
127     printf("qM->do_it() = %d\n\n", qM->do_it());
128     delete (qM);
129
130     qM = remote->testClassPtr(pA);
131     printf("These should be equal (to 1) \n");
132     printf("pA->do_it() = %d\n", pA->do_it());
133     printf("qM->do_it() = %d\n\n", qM->do_it());
134
135     delete (qM);
136     delete(pM); pM = 0;
137     delete(pA);
138
139     remote->startUpcalls();
140     while (noSignal)
141       remote->awaitResponce(-1);
142     
143
144     remote->quit();
145     printf("Bye now\n");
146     delete(remote);
147 }
148
149 void testUser::signalUpcallsDone() {
150   noSignal = 0;
151 }
152
153 void testUser::upcallOK() {
154   printf("UPCALL OK\n");
155 }
156
157 void testUser::upcallNotOK() {
158   printf("UPCALL NOT OK\n");
159 }
160
161 metric *testUser::echoMetricP(metric *get) {
162   return get;
163 }
164
165 metric *testUser::echoMetricPF(metric *get) {
166   metric *ret;
167   ret = new metric;
168   ret->i = get->i;
169   ret->j = get->j;
170   return ret;
171 }