xref: /aosp_15_r20/external/bc/tests/bcl.c (revision 5a6e848804d15c18a0125914844ee4eb0bda4fcf)
1*5a6e8488SAndroid Build Coastguard Worker /*
2*5a6e8488SAndroid Build Coastguard Worker  * *****************************************************************************
3*5a6e8488SAndroid Build Coastguard Worker  *
4*5a6e8488SAndroid Build Coastguard Worker  * SPDX-License-Identifier: BSD-2-Clause
5*5a6e8488SAndroid Build Coastguard Worker  *
6*5a6e8488SAndroid Build Coastguard Worker  * Copyright (c) 2018-2024 Gavin D. Howard and contributors.
7*5a6e8488SAndroid Build Coastguard Worker  *
8*5a6e8488SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*5a6e8488SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions are met:
10*5a6e8488SAndroid Build Coastguard Worker  *
11*5a6e8488SAndroid Build Coastguard Worker  * * Redistributions of source code must retain the above copyright notice, this
12*5a6e8488SAndroid Build Coastguard Worker  *   list of conditions and the following disclaimer.
13*5a6e8488SAndroid Build Coastguard Worker  *
14*5a6e8488SAndroid Build Coastguard Worker  * * Redistributions in binary form must reproduce the above copyright notice,
15*5a6e8488SAndroid Build Coastguard Worker  *   this list of conditions and the following disclaimer in the documentation
16*5a6e8488SAndroid Build Coastguard Worker  *   and/or other materials provided with the distribution.
17*5a6e8488SAndroid Build Coastguard Worker  *
18*5a6e8488SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*5a6e8488SAndroid Build Coastguard Worker  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*5a6e8488SAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*5a6e8488SAndroid Build Coastguard Worker  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*5a6e8488SAndroid Build Coastguard Worker  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*5a6e8488SAndroid Build Coastguard Worker  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*5a6e8488SAndroid Build Coastguard Worker  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*5a6e8488SAndroid Build Coastguard Worker  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*5a6e8488SAndroid Build Coastguard Worker  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*5a6e8488SAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*5a6e8488SAndroid Build Coastguard Worker  * POSSIBILITY OF SUCH DAMAGE.
29*5a6e8488SAndroid Build Coastguard Worker  *
30*5a6e8488SAndroid Build Coastguard Worker  * *****************************************************************************
31*5a6e8488SAndroid Build Coastguard Worker  *
32*5a6e8488SAndroid Build Coastguard Worker  * Tests for bcl(3).
33*5a6e8488SAndroid Build Coastguard Worker  *
34*5a6e8488SAndroid Build Coastguard Worker  */
35*5a6e8488SAndroid Build Coastguard Worker 
36*5a6e8488SAndroid Build Coastguard Worker #include <stdlib.h>
37*5a6e8488SAndroid Build Coastguard Worker #include <stdbool.h>
38*5a6e8488SAndroid Build Coastguard Worker #include <string.h>
39*5a6e8488SAndroid Build Coastguard Worker 
40*5a6e8488SAndroid Build Coastguard Worker #include <bcl.h>
41*5a6e8488SAndroid Build Coastguard Worker 
42*5a6e8488SAndroid Build Coastguard Worker /**
43*5a6e8488SAndroid Build Coastguard Worker  * Takes an error code and aborts if it actually is an error.
44*5a6e8488SAndroid Build Coastguard Worker  * @param e  The error code.
45*5a6e8488SAndroid Build Coastguard Worker  */
46*5a6e8488SAndroid Build Coastguard Worker static void
err(BclError e)47*5a6e8488SAndroid Build Coastguard Worker err(BclError e)
48*5a6e8488SAndroid Build Coastguard Worker {
49*5a6e8488SAndroid Build Coastguard Worker 	if (e != BCL_ERROR_NONE) abort();
50*5a6e8488SAndroid Build Coastguard Worker }
51*5a6e8488SAndroid Build Coastguard Worker 
52*5a6e8488SAndroid Build Coastguard Worker int
main(void)53*5a6e8488SAndroid Build Coastguard Worker main(void)
54*5a6e8488SAndroid Build Coastguard Worker {
55*5a6e8488SAndroid Build Coastguard Worker 	BclError e;
56*5a6e8488SAndroid Build Coastguard Worker 	BclContext ctxt;
57*5a6e8488SAndroid Build Coastguard Worker 	size_t scale;
58*5a6e8488SAndroid Build Coastguard Worker 	BclNumber n, n2, n3, n4, n5, n6, n7;
59*5a6e8488SAndroid Build Coastguard Worker 	char* res;
60*5a6e8488SAndroid Build Coastguard Worker 	BclBigDig b = 0;
61*5a6e8488SAndroid Build Coastguard Worker 
62*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_start();
63*5a6e8488SAndroid Build Coastguard Worker 	err(e);
64*5a6e8488SAndroid Build Coastguard Worker 
65*5a6e8488SAndroid Build Coastguard Worker 	// We do this twice to test the reference counting code.
66*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_init();
67*5a6e8488SAndroid Build Coastguard Worker 	err(e);
68*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_init();
69*5a6e8488SAndroid Build Coastguard Worker 	err(e);
70*5a6e8488SAndroid Build Coastguard Worker 
71*5a6e8488SAndroid Build Coastguard Worker 	// If bcl is set to abort on fatal error, that is a bug because it should
72*5a6e8488SAndroid Build Coastguard Worker 	// default to off.
73*5a6e8488SAndroid Build Coastguard Worker 	if (bcl_abortOnFatalError()) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
74*5a6e8488SAndroid Build Coastguard Worker 
75*5a6e8488SAndroid Build Coastguard Worker 	bcl_setAbortOnFatalError(true);
76*5a6e8488SAndroid Build Coastguard Worker 
77*5a6e8488SAndroid Build Coastguard Worker 	// Now it *should* be set.
78*5a6e8488SAndroid Build Coastguard Worker 	if (!bcl_abortOnFatalError()) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
79*5a6e8488SAndroid Build Coastguard Worker 
80*5a6e8488SAndroid Build Coastguard Worker 	// We do this twice to test the context stack.
81*5a6e8488SAndroid Build Coastguard Worker 	ctxt = bcl_ctxt_create();
82*5a6e8488SAndroid Build Coastguard Worker 	bcl_pushContext(ctxt);
83*5a6e8488SAndroid Build Coastguard Worker 	ctxt = bcl_ctxt_create();
84*5a6e8488SAndroid Build Coastguard Worker 	bcl_pushContext(ctxt);
85*5a6e8488SAndroid Build Coastguard Worker 
86*5a6e8488SAndroid Build Coastguard Worker 	// Ensure that the scale is properly set.
87*5a6e8488SAndroid Build Coastguard Worker 	scale = 10;
88*5a6e8488SAndroid Build Coastguard Worker 	bcl_ctxt_setScale(ctxt, scale);
89*5a6e8488SAndroid Build Coastguard Worker 	scale = bcl_ctxt_scale(ctxt);
90*5a6e8488SAndroid Build Coastguard Worker 	if (scale != 10) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
91*5a6e8488SAndroid Build Coastguard Worker 
92*5a6e8488SAndroid Build Coastguard Worker 	scale = 16;
93*5a6e8488SAndroid Build Coastguard Worker 	bcl_ctxt_setIbase(ctxt, scale);
94*5a6e8488SAndroid Build Coastguard Worker 	scale = bcl_ctxt_ibase(ctxt);
95*5a6e8488SAndroid Build Coastguard Worker 	if (scale != 16) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
96*5a6e8488SAndroid Build Coastguard Worker 
97*5a6e8488SAndroid Build Coastguard Worker 	// Now the obase.
98*5a6e8488SAndroid Build Coastguard Worker 	bcl_ctxt_setObase(ctxt, scale);
99*5a6e8488SAndroid Build Coastguard Worker 	scale = bcl_ctxt_obase(ctxt);
100*5a6e8488SAndroid Build Coastguard Worker 	if (scale != 16) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
101*5a6e8488SAndroid Build Coastguard Worker 
102*5a6e8488SAndroid Build Coastguard Worker 	// Set the back for the tests
103*5a6e8488SAndroid Build Coastguard Worker 	bcl_ctxt_setIbase(ctxt, 10);
104*5a6e8488SAndroid Build Coastguard Worker 	scale = bcl_ctxt_ibase(ctxt);
105*5a6e8488SAndroid Build Coastguard Worker 	if (scale != 10) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
106*5a6e8488SAndroid Build Coastguard Worker 	bcl_ctxt_setObase(ctxt, 10);
107*5a6e8488SAndroid Build Coastguard Worker 	scale = bcl_ctxt_obase(ctxt);
108*5a6e8488SAndroid Build Coastguard Worker 	if (scale != 10) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
109*5a6e8488SAndroid Build Coastguard Worker 
110*5a6e8488SAndroid Build Coastguard Worker 	// Ensure that creating, duping, and copying works.
111*5a6e8488SAndroid Build Coastguard Worker 	n = bcl_num_create();
112*5a6e8488SAndroid Build Coastguard Worker 	n2 = bcl_dup(n);
113*5a6e8488SAndroid Build Coastguard Worker 	bcl_copy(n, n2);
114*5a6e8488SAndroid Build Coastguard Worker 
115*5a6e8488SAndroid Build Coastguard Worker 	// Ensure that parsing works.
116*5a6e8488SAndroid Build Coastguard Worker 	n3 = bcl_parse("2938");
117*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n3));
118*5a6e8488SAndroid Build Coastguard Worker 	n4 = bcl_parse("-28390.9108273");
119*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n4));
120*5a6e8488SAndroid Build Coastguard Worker 
121*5a6e8488SAndroid Build Coastguard Worker 	// We also want to be sure that negatives work. This is a special case
122*5a6e8488SAndroid Build Coastguard Worker 	// because bc and dc generate a negative instruction; they don't actually
123*5a6e8488SAndroid Build Coastguard Worker 	// parse numbers as negative.
124*5a6e8488SAndroid Build Coastguard Worker 	if (!bcl_num_neg(n4)) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
125*5a6e8488SAndroid Build Coastguard Worker 
126*5a6e8488SAndroid Build Coastguard Worker 	// Add them and check the result.
127*5a6e8488SAndroid Build Coastguard Worker 	n5 = bcl_add_keep(n3, n4);
128*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n5));
129*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(n5);
130*5a6e8488SAndroid Build Coastguard Worker 	if (res == NULL) err(BCL_ERROR_FATAL_ALLOC_ERR);
131*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-25452.9108273")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
132*5a6e8488SAndroid Build Coastguard Worker 
133*5a6e8488SAndroid Build Coastguard Worker 	// We want to ensure all memory gets freed because we run this under
134*5a6e8488SAndroid Build Coastguard Worker 	// Valgrind.
135*5a6e8488SAndroid Build Coastguard Worker 	free(res);
136*5a6e8488SAndroid Build Coastguard Worker 
137*5a6e8488SAndroid Build Coastguard Worker 	// Add them and check the result.
138*5a6e8488SAndroid Build Coastguard Worker 	n3 = bcl_add(n3, n4);
139*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n3));
140*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string_keep(n3);
141*5a6e8488SAndroid Build Coastguard Worker 	if (res == NULL) err(BCL_ERROR_FATAL_ALLOC_ERR);
142*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-25452.9108273")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
143*5a6e8488SAndroid Build Coastguard Worker 
144*5a6e8488SAndroid Build Coastguard Worker 	// We want to ensure all memory gets freed because we run this under
145*5a6e8488SAndroid Build Coastguard Worker 	// Valgrind.
146*5a6e8488SAndroid Build Coastguard Worker 	free(res);
147*5a6e8488SAndroid Build Coastguard Worker 
148*5a6e8488SAndroid Build Coastguard Worker 	// Ensure that divmod, a special case, works.
149*5a6e8488SAndroid Build Coastguard Worker 	n4 = bcl_parse("8937458902.2890347");
150*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n4));
151*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_divmod_keep(n4, n3, &n5, &n6);
152*5a6e8488SAndroid Build Coastguard Worker 	err(e);
153*5a6e8488SAndroid Build Coastguard Worker 
154*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(n5);
155*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-351137.0060159482")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
156*5a6e8488SAndroid Build Coastguard Worker 	free(res);
157*5a6e8488SAndroid Build Coastguard Worker 
158*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(n6);
159*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, ".00000152374405414")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
160*5a6e8488SAndroid Build Coastguard Worker 	free(res);
161*5a6e8488SAndroid Build Coastguard Worker 
162*5a6e8488SAndroid Build Coastguard Worker 	// Ensure that divmod, a special case, works.
163*5a6e8488SAndroid Build Coastguard Worker 	n4 = bcl_parse("8937458902.2890347");
164*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n4));
165*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_divmod(bcl_dup(n4), n3, &n5, &n6);
166*5a6e8488SAndroid Build Coastguard Worker 	err(e);
167*5a6e8488SAndroid Build Coastguard Worker 
168*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(n5);
169*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-351137.0060159482")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
170*5a6e8488SAndroid Build Coastguard Worker 	free(res);
171*5a6e8488SAndroid Build Coastguard Worker 
172*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(n6);
173*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, ".00000152374405414")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
174*5a6e8488SAndroid Build Coastguard Worker 	free(res);
175*5a6e8488SAndroid Build Coastguard Worker 
176*5a6e8488SAndroid Build Coastguard Worker 	// Ensure that sqrt works. This is also a special case. The reason is
177*5a6e8488SAndroid Build Coastguard Worker 	// because it is a one-argument function. Since all binary operators go
178*5a6e8488SAndroid Build Coastguard Worker 	// through the same code (basically), we can test add and be done. However,
179*5a6e8488SAndroid Build Coastguard Worker 	// sqrt does not, so we want to specifically test it.
180*5a6e8488SAndroid Build Coastguard Worker 	n4 = bcl_sqrt(n4);
181*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n4));
182*5a6e8488SAndroid Build Coastguard Worker 
183*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n4));
184*5a6e8488SAndroid Build Coastguard Worker 
185*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "94538.1346457028")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
186*5a6e8488SAndroid Build Coastguard Worker 
187*5a6e8488SAndroid Build Coastguard Worker 	free(res);
188*5a6e8488SAndroid Build Coastguard Worker 
189*5a6e8488SAndroid Build Coastguard Worker 	// We want to check that numbers are properly extended...
190*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_num_setScale(n4, 20);
191*5a6e8488SAndroid Build Coastguard Worker 	err(e);
192*5a6e8488SAndroid Build Coastguard Worker 
193*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n4));
194*5a6e8488SAndroid Build Coastguard Worker 
195*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "94538.13464570280000000000"))
196*5a6e8488SAndroid Build Coastguard Worker 		err(BCL_ERROR_FATAL_UNKNOWN_ERR);
197*5a6e8488SAndroid Build Coastguard Worker 
198*5a6e8488SAndroid Build Coastguard Worker 	free(res);
199*5a6e8488SAndroid Build Coastguard Worker 
200*5a6e8488SAndroid Build Coastguard Worker 	// ...and truncated.
201*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_num_setScale(n4, 0);
202*5a6e8488SAndroid Build Coastguard Worker 	err(e);
203*5a6e8488SAndroid Build Coastguard Worker 
204*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n4));
205*5a6e8488SAndroid Build Coastguard Worker 
206*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "94538")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
207*5a6e8488SAndroid Build Coastguard Worker 
208*5a6e8488SAndroid Build Coastguard Worker 	free(res);
209*5a6e8488SAndroid Build Coastguard Worker 
210*5a6e8488SAndroid Build Coastguard Worker 	// Check conversion to hardware integers...
211*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_bigdig(n4, &b);
212*5a6e8488SAndroid Build Coastguard Worker 	err(e);
213*5a6e8488SAndroid Build Coastguard Worker 
214*5a6e8488SAndroid Build Coastguard Worker 	if (b != 94538) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
215*5a6e8488SAndroid Build Coastguard Worker 
216*5a6e8488SAndroid Build Coastguard Worker 	// ...and back.
217*5a6e8488SAndroid Build Coastguard Worker 	n4 = bcl_bigdig2num(b);
218*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n4));
219*5a6e8488SAndroid Build Coastguard Worker 
220*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n4));
221*5a6e8488SAndroid Build Coastguard Worker 
222*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "94538")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
223*5a6e8488SAndroid Build Coastguard Worker 
224*5a6e8488SAndroid Build Coastguard Worker 	free(res);
225*5a6e8488SAndroid Build Coastguard Worker 
226*5a6e8488SAndroid Build Coastguard Worker 	// Check rand.
227*5a6e8488SAndroid Build Coastguard Worker 	n4 = bcl_frand(10);
228*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n4));
229*5a6e8488SAndroid Build Coastguard Worker 
230*5a6e8488SAndroid Build Coastguard Worker 	// Check that no asserts fire in shifting.
231*5a6e8488SAndroid Build Coastguard Worker 	n4 = bcl_lshift(n4, bcl_bigdig2num(10));
232*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n4));
233*5a6e8488SAndroid Build Coastguard Worker 
234*5a6e8488SAndroid Build Coastguard Worker 	// Repeat.
235*5a6e8488SAndroid Build Coastguard Worker 	n3 = bcl_irand(n4);
236*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n3));
237*5a6e8488SAndroid Build Coastguard Worker 
238*5a6e8488SAndroid Build Coastguard Worker 	// Repeat.
239*5a6e8488SAndroid Build Coastguard Worker 	n2 = bcl_ifrand_keep(n3, 10);
240*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n2));
241*5a6e8488SAndroid Build Coastguard Worker 
242*5a6e8488SAndroid Build Coastguard Worker 	// Repeat.
243*5a6e8488SAndroid Build Coastguard Worker 	n2 = bcl_ifrand(bcl_dup(n3), 10);
244*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n2));
245*5a6e8488SAndroid Build Coastguard Worker 
246*5a6e8488SAndroid Build Coastguard Worker 	// Still checking asserts.
247*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_rand_seedWithNum_keep(n3);
248*5a6e8488SAndroid Build Coastguard Worker 	err(e);
249*5a6e8488SAndroid Build Coastguard Worker 
250*5a6e8488SAndroid Build Coastguard Worker 	// Still checking asserts.
251*5a6e8488SAndroid Build Coastguard Worker 	e = bcl_rand_seedWithNum(n3);
252*5a6e8488SAndroid Build Coastguard Worker 	err(e);
253*5a6e8488SAndroid Build Coastguard Worker 
254*5a6e8488SAndroid Build Coastguard Worker 	// Still checking asserts.
255*5a6e8488SAndroid Build Coastguard Worker 	n4 = bcl_rand_seed2num();
256*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n4));
257*5a6e8488SAndroid Build Coastguard Worker 
258*5a6e8488SAndroid Build Coastguard Worker 	// Finally, check modexp, yet another special case.
259*5a6e8488SAndroid Build Coastguard Worker 	n5 = bcl_parse("10");
260*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n5));
261*5a6e8488SAndroid Build Coastguard Worker 
262*5a6e8488SAndroid Build Coastguard Worker 	n6 = bcl_modexp_keep(n5, n5, n5);
263*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n6));
264*5a6e8488SAndroid Build Coastguard Worker 
265*5a6e8488SAndroid Build Coastguard Worker 	n7 = bcl_modexp(bcl_dup(n5), bcl_dup(n5), bcl_dup(n5));
266*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n7));
267*5a6e8488SAndroid Build Coastguard Worker 
268*5a6e8488SAndroid Build Coastguard Worker 	// Clean up.
269*5a6e8488SAndroid Build Coastguard Worker 	bcl_num_free(n);
270*5a6e8488SAndroid Build Coastguard Worker 
271*5a6e8488SAndroid Build Coastguard Worker 	// Test leading zeroes.
272*5a6e8488SAndroid Build Coastguard Worker 	if (bcl_leadingZeroes()) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
273*5a6e8488SAndroid Build Coastguard Worker 
274*5a6e8488SAndroid Build Coastguard Worker 	n = bcl_parse("0.01");
275*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n));
276*5a6e8488SAndroid Build Coastguard Worker 
277*5a6e8488SAndroid Build Coastguard Worker 	n2 = bcl_parse("-0.01");
278*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n2));
279*5a6e8488SAndroid Build Coastguard Worker 
280*5a6e8488SAndroid Build Coastguard Worker 	n3 = bcl_parse("1.01");
281*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n3));
282*5a6e8488SAndroid Build Coastguard Worker 
283*5a6e8488SAndroid Build Coastguard Worker 	n4 = bcl_parse("-1.01");
284*5a6e8488SAndroid Build Coastguard Worker 	err(bcl_err(n4));
285*5a6e8488SAndroid Build Coastguard Worker 
286*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string_keep(n);
287*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, ".01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
288*5a6e8488SAndroid Build Coastguard Worker 
289*5a6e8488SAndroid Build Coastguard Worker 	free(res);
290*5a6e8488SAndroid Build Coastguard Worker 
291*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n));
292*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, ".01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
293*5a6e8488SAndroid Build Coastguard Worker 
294*5a6e8488SAndroid Build Coastguard Worker 	free(res);
295*5a6e8488SAndroid Build Coastguard Worker 
296*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n2));
297*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
298*5a6e8488SAndroid Build Coastguard Worker 
299*5a6e8488SAndroid Build Coastguard Worker 	free(res);
300*5a6e8488SAndroid Build Coastguard Worker 
301*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n3));
302*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "1.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
303*5a6e8488SAndroid Build Coastguard Worker 
304*5a6e8488SAndroid Build Coastguard Worker 	free(res);
305*5a6e8488SAndroid Build Coastguard Worker 
306*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n4));
307*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-1.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
308*5a6e8488SAndroid Build Coastguard Worker 
309*5a6e8488SAndroid Build Coastguard Worker 	free(res);
310*5a6e8488SAndroid Build Coastguard Worker 
311*5a6e8488SAndroid Build Coastguard Worker 	bcl_setLeadingZeroes(true);
312*5a6e8488SAndroid Build Coastguard Worker 
313*5a6e8488SAndroid Build Coastguard Worker 	if (!bcl_leadingZeroes()) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
314*5a6e8488SAndroid Build Coastguard Worker 
315*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n));
316*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "0.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
317*5a6e8488SAndroid Build Coastguard Worker 
318*5a6e8488SAndroid Build Coastguard Worker 	free(res);
319*5a6e8488SAndroid Build Coastguard Worker 
320*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n2));
321*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-0.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
322*5a6e8488SAndroid Build Coastguard Worker 
323*5a6e8488SAndroid Build Coastguard Worker 	free(res);
324*5a6e8488SAndroid Build Coastguard Worker 
325*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n3));
326*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "1.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
327*5a6e8488SAndroid Build Coastguard Worker 
328*5a6e8488SAndroid Build Coastguard Worker 	free(res);
329*5a6e8488SAndroid Build Coastguard Worker 
330*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(bcl_dup(n4));
331*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-1.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
332*5a6e8488SAndroid Build Coastguard Worker 
333*5a6e8488SAndroid Build Coastguard Worker 	free(res);
334*5a6e8488SAndroid Build Coastguard Worker 
335*5a6e8488SAndroid Build Coastguard Worker 	bcl_setLeadingZeroes(false);
336*5a6e8488SAndroid Build Coastguard Worker 
337*5a6e8488SAndroid Build Coastguard Worker 	if (bcl_leadingZeroes()) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
338*5a6e8488SAndroid Build Coastguard Worker 
339*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(n);
340*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, ".01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
341*5a6e8488SAndroid Build Coastguard Worker 
342*5a6e8488SAndroid Build Coastguard Worker 	free(res);
343*5a6e8488SAndroid Build Coastguard Worker 
344*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(n2);
345*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
346*5a6e8488SAndroid Build Coastguard Worker 
347*5a6e8488SAndroid Build Coastguard Worker 	free(res);
348*5a6e8488SAndroid Build Coastguard Worker 
349*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(n3);
350*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "1.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
351*5a6e8488SAndroid Build Coastguard Worker 
352*5a6e8488SAndroid Build Coastguard Worker 	free(res);
353*5a6e8488SAndroid Build Coastguard Worker 
354*5a6e8488SAndroid Build Coastguard Worker 	res = bcl_string(n4);
355*5a6e8488SAndroid Build Coastguard Worker 	if (strcmp(res, "-1.01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
356*5a6e8488SAndroid Build Coastguard Worker 
357*5a6e8488SAndroid Build Coastguard Worker 	free(res);
358*5a6e8488SAndroid Build Coastguard Worker 
359*5a6e8488SAndroid Build Coastguard Worker 	bcl_ctxt_freeNums(ctxt);
360*5a6e8488SAndroid Build Coastguard Worker 
361*5a6e8488SAndroid Build Coastguard Worker 	bcl_gc();
362*5a6e8488SAndroid Build Coastguard Worker 
363*5a6e8488SAndroid Build Coastguard Worker 	// We need to pop both contexts and free them.
364*5a6e8488SAndroid Build Coastguard Worker 	bcl_popContext();
365*5a6e8488SAndroid Build Coastguard Worker 
366*5a6e8488SAndroid Build Coastguard Worker 	bcl_ctxt_free(ctxt);
367*5a6e8488SAndroid Build Coastguard Worker 
368*5a6e8488SAndroid Build Coastguard Worker 	ctxt = bcl_context();
369*5a6e8488SAndroid Build Coastguard Worker 
370*5a6e8488SAndroid Build Coastguard Worker 	bcl_popContext();
371*5a6e8488SAndroid Build Coastguard Worker 
372*5a6e8488SAndroid Build Coastguard Worker 	bcl_ctxt_free(ctxt);
373*5a6e8488SAndroid Build Coastguard Worker 
374*5a6e8488SAndroid Build Coastguard Worker 	// Decrement the reference counter to ensure all is freed.
375*5a6e8488SAndroid Build Coastguard Worker 	bcl_free();
376*5a6e8488SAndroid Build Coastguard Worker 
377*5a6e8488SAndroid Build Coastguard Worker 	bcl_free();
378*5a6e8488SAndroid Build Coastguard Worker 
379*5a6e8488SAndroid Build Coastguard Worker 	bcl_end();
380*5a6e8488SAndroid Build Coastguard Worker 
381*5a6e8488SAndroid Build Coastguard Worker 	return 0;
382*5a6e8488SAndroid Build Coastguard Worker }
383