1 /* Processed by ecpg (regression mode) */
2 /* These include files are added by the preprocessor */
3 #include <ecpglib.h>
4 #include <ecpgerrno.h>
5 #include <sqlca.h>
6 /* End of automatic include section */
7 #define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
8
9 #line 1 "num_test2.pgc"
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <pgtypes_numeric.h>
13 #include <pgtypes_error.h>
14 #include <decimal.h>
15
16
17 #line 1 "regression.h"
18
19
20
21
22
23
24 #line 7 "num_test2.pgc"
25
26
27
28 /*
29
30 NOTE: This file has a different expect file for regression tests on MinGW32
31
32 */
33
34
35 char* nums[] = { "2E394", "-2", ".794", "3.44", "592.49E21", "-32.84e4",
36 "2E-394", ".1E-2", "+.0", "-592.49E-07", "+32.84e-4",
37 ".500001", "-.5000001",
38 "1234567890123456789012345678.91", /* 30 digits should fit
39 into decimal */
40 "1234567890123456789012345678.921", /* 31 digits should NOT
41 fit into decimal */
42 "not a number",
43 NULL};
44
45
46 static void
47 check_errno(void);
48
49 int
main(void)50 main(void)
51 {
52 char *text="error\n";
53 char *endptr;
54 numeric *num, *nin;
55 decimal *dec;
56 long l;
57 int i, j, k, q, r, count = 0;
58 double d;
59 numeric **numarr = (numeric **) calloc(1, sizeof(numeric));
60
61 ECPGdebug(1, stderr);
62
63 for (i = 0; nums[i]; i++)
64 {
65 num = PGTYPESnumeric_from_asc(nums[i], &endptr);
66 if (!num) check_errno();
67 if (endptr != NULL)
68 {
69 printf("endptr of %d is not NULL\n", i);
70 if (*endptr != '\0')
71 printf("*endptr of %d is not \\0\n", i);
72 }
73 if (!num) continue;
74
75 numarr = realloc(numarr, sizeof(numeric *) * (count + 1));
76 numarr[count++] = num;
77
78 text = PGTYPESnumeric_to_asc(num, -1);
79 if (!text) check_errno();
80 printf("num[%d,1]: %s\n", i, text); PGTYPESchar_free(text);
81 text = PGTYPESnumeric_to_asc(num, 0);
82 if (!text) check_errno();
83 printf("num[%d,2]: %s\n", i, text); PGTYPESchar_free(text);
84 text = PGTYPESnumeric_to_asc(num, 1);
85 if (!text) check_errno();
86 printf("num[%d,3]: %s\n", i, text); PGTYPESchar_free(text);
87 text = PGTYPESnumeric_to_asc(num, 2);
88 if (!text) check_errno();
89 printf("num[%d,4]: %s\n", i, text); PGTYPESchar_free(text);
90
91 nin = PGTYPESnumeric_new();
92 text = PGTYPESnumeric_to_asc(nin, 2);
93 if (!text) check_errno();
94 printf("num[%d,5]: %s\n", i, text); PGTYPESchar_free(text);
95
96 r = PGTYPESnumeric_to_long(num, &l);
97 if (r) check_errno();
98 printf("num[%d,6]: %ld (r: %d)\n", i, r?0L:l, r);
99 if (r == 0)
100 {
101 r = PGTYPESnumeric_from_long(l, nin);
102 if (r) check_errno();
103 text = PGTYPESnumeric_to_asc(nin, 2);
104 q = PGTYPESnumeric_cmp(num, nin);
105 printf("num[%d,7]: %s (r: %d - cmp: %d)\n", i, text, r, q);
106 PGTYPESchar_free(text);
107 }
108
109 r = PGTYPESnumeric_to_int(num, &k);
110 if (r) check_errno();
111 printf("num[%d,8]: %d (r: %d)\n", i, r?0:k, r);
112 if (r == 0)
113 {
114 r = PGTYPESnumeric_from_int(k, nin);
115 if (r) check_errno();
116 text = PGTYPESnumeric_to_asc(nin, 2);
117 q = PGTYPESnumeric_cmp(num, nin);
118 printf("num[%d,9]: %s (r: %d - cmp: %d)\n", i, text, r, q);
119 PGTYPESchar_free(text);
120 }
121
122 if (i != 6)
123 {
124 /* underflow does not work reliable on several archs, so not testing it here */
125 /* this is a libc problem since we only call strtod() */
126
127 r = PGTYPESnumeric_to_double(num, &d);
128 if (r) check_errno();
129 printf("num[%d,10]: %g (r: %d)\n", i, r?0.0:d, r);
130 }
131
132 /* do not test double to numeric because
133 * - extra digits are different on different architectures
134 * - PGTYPESnumeric_from_double internally calls PGTYPESnumeric_from_asc anyway
135 */
136
137 dec = PGTYPESdecimal_new();
138 r = PGTYPESnumeric_to_decimal(num, dec);
139 if (r) check_errno();
140 /* we have no special routine for outputting decimal, it would
141 * convert to a numeric anyway */
142 printf("num[%d,11]: - (r: %d)\n", i, r);
143 if (r == 0)
144 {
145 r = PGTYPESnumeric_from_decimal(dec, nin);
146 if (r) check_errno();
147 text = PGTYPESnumeric_to_asc(nin, 2);
148 q = PGTYPESnumeric_cmp(num, nin);
149 printf("num[%d,12]: %s (r: %d - cmp: %d)\n", i, text, r, q);
150 PGTYPESchar_free(text);
151 }
152
153 PGTYPESdecimal_free(dec);
154 PGTYPESnumeric_free(nin);
155 printf("\n");
156 }
157
158 for (i = 0; i < count; i++)
159 {
160 for (j = 0; j < count; j++)
161 {
162 numeric* a = PGTYPESnumeric_new();
163 numeric* s = PGTYPESnumeric_new();
164 numeric* m = PGTYPESnumeric_new();
165 numeric* d = PGTYPESnumeric_new();
166 r = PGTYPESnumeric_add(numarr[i], numarr[j], a);
167 if (r)
168 {
169 check_errno();
170 printf("r: %d\n", r);
171 }
172 else
173 {
174 text = PGTYPESnumeric_to_asc(a, 10);
175 printf("num[a,%d,%d]: %s\n", i, j, text);
176 PGTYPESchar_free(text);
177 }
178 r = PGTYPESnumeric_sub(numarr[i], numarr[j], s);
179 if (r)
180 {
181 check_errno();
182 printf("r: %d\n", r);
183 }
184 else
185 {
186 text = PGTYPESnumeric_to_asc(s, 10);
187 printf("num[s,%d,%d]: %s\n", i, j, text);
188 PGTYPESchar_free(text);
189 }
190 r = PGTYPESnumeric_mul(numarr[i], numarr[j], m);
191 if (r)
192 {
193 check_errno();
194 printf("r: %d\n", r);
195 }
196 else
197 {
198 text = PGTYPESnumeric_to_asc(m, 10);
199 printf("num[m,%d,%d]: %s\n", i, j, text);
200 PGTYPESchar_free(text);
201 }
202 r = PGTYPESnumeric_div(numarr[i], numarr[j], d);
203 if (r)
204 {
205 check_errno();
206 printf("r: %d\n", r);
207 }
208 else
209 {
210 text = PGTYPESnumeric_to_asc(d, 10);
211 printf("num[d,%d,%d]: %s\n", i, j, text);
212 PGTYPESchar_free(text);
213 }
214
215 PGTYPESnumeric_free(a);
216 PGTYPESnumeric_free(s);
217 PGTYPESnumeric_free(m);
218 PGTYPESnumeric_free(d);
219 }
220 }
221
222 for (i = 0; i < count; i++)
223 {
224 text = PGTYPESnumeric_to_asc(numarr[i], -1);
225 printf("%d: %s\n", i, text);
226 PGTYPESchar_free(text);
227 PGTYPESnumeric_free(numarr[i]);
228 }
229 free(numarr);
230
231 return (0);
232 }
233
234 static void
check_errno(void)235 check_errno(void)
236 {
237 switch(errno)
238 {
239 case 0:
240 printf("(no errno set) - ");
241 break;
242 case PGTYPES_NUM_OVERFLOW:
243 printf("(errno == PGTYPES_NUM_OVERFLOW) - ");
244 break;
245 case PGTYPES_NUM_UNDERFLOW:
246 printf("(errno == PGTYPES_NUM_UNDERFLOW) - ");
247 break;
248 case PGTYPES_NUM_BAD_NUMERIC:
249 printf("(errno == PGTYPES_NUM_BAD_NUMERIC) - ");
250 break;
251 case PGTYPES_NUM_DIVIDE_ZERO:
252 printf("(errno == PGTYPES_NUM_DIVIDE_ZERO) - ");
253 break;
254 default:
255 printf("(unknown errno (%d))\n", errno);
256 printf("(libc: (%s)) ", strerror(errno));
257 break;
258 }
259
260 }
261