xref: /aosp_15_r20/external/ltp/testcases/misc/math/atof/atof01.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker /*
2*49cdfc7eSAndroid Build Coastguard Worker  *
3*49cdfc7eSAndroid Build Coastguard Worker  *   Copyright (c) International Business Machines  Corp., 2002
4*49cdfc7eSAndroid Build Coastguard Worker  *
5*49cdfc7eSAndroid Build Coastguard Worker  *   This program is free software;  you can redistribute it and/or modify
6*49cdfc7eSAndroid Build Coastguard Worker  *   it under the terms of the GNU General Public License as published by
7*49cdfc7eSAndroid Build Coastguard Worker  *   the Free Software Foundation; either version 2 of the License, or
8*49cdfc7eSAndroid Build Coastguard Worker  *   (at your option) any later version.
9*49cdfc7eSAndroid Build Coastguard Worker  *
10*49cdfc7eSAndroid Build Coastguard Worker  *   This program is distributed in the hope that it will be useful,
11*49cdfc7eSAndroid Build Coastguard Worker  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12*49cdfc7eSAndroid Build Coastguard Worker  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13*49cdfc7eSAndroid Build Coastguard Worker  *   the GNU General Public License for more details.
14*49cdfc7eSAndroid Build Coastguard Worker  *
15*49cdfc7eSAndroid Build Coastguard Worker  *   You should have received a copy of the GNU General Public License
16*49cdfc7eSAndroid Build Coastguard Worker  *   along with this program;  if not, write to the Free Software
17*49cdfc7eSAndroid Build Coastguard Worker  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*49cdfc7eSAndroid Build Coastguard Worker  */
19*49cdfc7eSAndroid Build Coastguard Worker 
20*49cdfc7eSAndroid Build Coastguard Worker /* 01/02/2003	Port to LTP	[email protected] */
21*49cdfc7eSAndroid Build Coastguard Worker /* 06/30/2001	Port to Linux	[email protected] */
22*49cdfc7eSAndroid Build Coastguard Worker 
23*49cdfc7eSAndroid Build Coastguard Worker /*
24*49cdfc7eSAndroid Build Coastguard Worker  * NAME
25*49cdfc7eSAndroid Build Coastguard Worker  *	atof1 -- ascii to floating point test
26*49cdfc7eSAndroid Build Coastguard Worker  *
27*49cdfc7eSAndroid Build Coastguard Worker  * CALLS
28*49cdfc7eSAndroid Build Coastguard Worker  *	atof(3), sprintf(3), ( doprnt.s )
29*49cdfc7eSAndroid Build Coastguard Worker  *
30*49cdfc7eSAndroid Build Coastguard Worker  * ALGORITHM
31*49cdfc7eSAndroid Build Coastguard Worker  *	Do some checks of floating point to ascii and back, arbitrate
32*49cdfc7eSAndroid Build Coastguard Worker  *	with a 3rd algorithm written in C.
33*49cdfc7eSAndroid Build Coastguard Worker  *
34*49cdfc7eSAndroid Build Coastguard Worker  * RESTRICTIONS
35*49cdfc7eSAndroid Build Coastguard Worker  */
36*49cdfc7eSAndroid Build Coastguard Worker 
37*49cdfc7eSAndroid Build Coastguard Worker #include <stdio.h>
38*49cdfc7eSAndroid Build Coastguard Worker #include <ctype.h>
39*49cdfc7eSAndroid Build Coastguard Worker #include <math.h>
40*49cdfc7eSAndroid Build Coastguard Worker #include <stdlib.h>
41*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
42*49cdfc7eSAndroid Build Coastguard Worker 
43*49cdfc7eSAndroid Build Coastguard Worker /**	LTP Port	**/
44*49cdfc7eSAndroid Build Coastguard Worker #include "test.h"
45*49cdfc7eSAndroid Build Coastguard Worker 
46*49cdfc7eSAndroid Build Coastguard Worker #define FAILED 0
47*49cdfc7eSAndroid Build Coastguard Worker #define PASSED 1
48*49cdfc7eSAndroid Build Coastguard Worker 
49*49cdfc7eSAndroid Build Coastguard Worker /*****		*****/
50*49cdfc7eSAndroid Build Coastguard Worker #define ERR		0.0000001
51*49cdfc7eSAndroid Build Coastguard Worker 
52*49cdfc7eSAndroid Build Coastguard Worker double pi;
53*49cdfc7eSAndroid Build Coastguard Worker 
54*49cdfc7eSAndroid Build Coastguard Worker /*char progname[]= "atof1()"; */
55*49cdfc7eSAndroid Build Coastguard Worker /**	LTP Port	**/
56*49cdfc7eSAndroid Build Coastguard Worker char *TCID = "atof01";		/* Test program identifier */
57*49cdfc7eSAndroid Build Coastguard Worker 
58*49cdfc7eSAndroid Build Coastguard Worker int local_flag = PASSED;
59*49cdfc7eSAndroid Build Coastguard Worker int block_number;
60*49cdfc7eSAndroid Build Coastguard Worker FILE *temp;
61*49cdfc7eSAndroid Build Coastguard Worker int TST_TOTAL = 1;
62*49cdfc7eSAndroid Build Coastguard Worker 
63*49cdfc7eSAndroid Build Coastguard Worker static void setup(void);
64*49cdfc7eSAndroid Build Coastguard Worker static void blenter(void);
65*49cdfc7eSAndroid Build Coastguard Worker static void blexit(void);
66*49cdfc7eSAndroid Build Coastguard Worker static int numin(char *, double *);
67*49cdfc7eSAndroid Build Coastguard Worker static int checkbuf(char *, int, int);
68*49cdfc7eSAndroid Build Coastguard Worker 
69*49cdfc7eSAndroid Build Coastguard Worker /*--------------------------------------------------------------*/
main(void)70*49cdfc7eSAndroid Build Coastguard Worker int main(void)
71*49cdfc7eSAndroid Build Coastguard Worker {
72*49cdfc7eSAndroid Build Coastguard Worker 	register int i, j;
73*49cdfc7eSAndroid Build Coastguard Worker 	double r1, r2, x;
74*49cdfc7eSAndroid Build Coastguard Worker 	char buf[100];
75*49cdfc7eSAndroid Build Coastguard Worker 
76*49cdfc7eSAndroid Build Coastguard Worker 	setup();		/* temp file is now open        */
77*49cdfc7eSAndroid Build Coastguard Worker 	pi = 4.0 * atan(1.0);
78*49cdfc7eSAndroid Build Coastguard Worker 
79*49cdfc7eSAndroid Build Coastguard Worker /*--------------------------------------------------------------*/
80*49cdfc7eSAndroid Build Coastguard Worker 	blenter();
81*49cdfc7eSAndroid Build Coastguard Worker 
82*49cdfc7eSAndroid Build Coastguard Worker 	for (i = 0; i < 30; i++)
83*49cdfc7eSAndroid Build Coastguard Worker 		for (j = 0; j < 30; j++) {
84*49cdfc7eSAndroid Build Coastguard Worker 			sprintf(buf, "%*.*f", i, j, pi);
85*49cdfc7eSAndroid Build Coastguard Worker 			if (checkbuf(buf, i, j)) {
86*49cdfc7eSAndroid Build Coastguard Worker 				fprintf(temp, "output conversion incorrect.");
87*49cdfc7eSAndroid Build Coastguard Worker 				fprintf(temp, "%*.*f = '%s'", i, j, pi, buf);
88*49cdfc7eSAndroid Build Coastguard Worker 				local_flag = FAILED;
89*49cdfc7eSAndroid Build Coastguard Worker 			}
90*49cdfc7eSAndroid Build Coastguard Worker 			r1 = atof(buf);
91*49cdfc7eSAndroid Build Coastguard Worker 			if (numin(buf, &r2)) {
92*49cdfc7eSAndroid Build Coastguard Worker 				fprintf(temp, "\tnumin('%s') failed\n", buf);
93*49cdfc7eSAndroid Build Coastguard Worker 				local_flag = FAILED;
94*49cdfc7eSAndroid Build Coastguard Worker 			}
95*49cdfc7eSAndroid Build Coastguard Worker 			x = fabs(r1 - r2);
96*49cdfc7eSAndroid Build Coastguard Worker 			if (x > ERR) {
97*49cdfc7eSAndroid Build Coastguard Worker 				fprintf(temp, "\tcompare fails, %f vs %f\n",
98*49cdfc7eSAndroid Build Coastguard Worker 					r1, r2);
99*49cdfc7eSAndroid Build Coastguard Worker 				fprintf(temp, "\terr value is %f\n", x);
100*49cdfc7eSAndroid Build Coastguard Worker 				local_flag = FAILED;
101*49cdfc7eSAndroid Build Coastguard Worker 			}
102*49cdfc7eSAndroid Build Coastguard Worker 			if (local_flag == FAILED)
103*49cdfc7eSAndroid Build Coastguard Worker 				break;
104*49cdfc7eSAndroid Build Coastguard Worker 		}
105*49cdfc7eSAndroid Build Coastguard Worker 
106*49cdfc7eSAndroid Build Coastguard Worker 	blexit();
107*49cdfc7eSAndroid Build Coastguard Worker /*--------------------------------------------------------------*/
108*49cdfc7eSAndroid Build Coastguard Worker 	blenter();
109*49cdfc7eSAndroid Build Coastguard Worker 
110*49cdfc7eSAndroid Build Coastguard Worker 	x = 1.0 - exp(-100.0);	/* 1.0 - very small number */
111*49cdfc7eSAndroid Build Coastguard Worker 	sprintf(buf, "%f", x);
112*49cdfc7eSAndroid Build Coastguard Worker 	r1 = atof(buf);
113*49cdfc7eSAndroid Build Coastguard Worker 	if (r1 != 1.0) {
114*49cdfc7eSAndroid Build Coastguard Worker 		fprintf(temp, "\tsprintf small # failed\n");
115*49cdfc7eSAndroid Build Coastguard Worker 		fprintf(temp, "\t printed '%s', expected 1.0\n", buf);
116*49cdfc7eSAndroid Build Coastguard Worker 		local_flag = FAILED;
117*49cdfc7eSAndroid Build Coastguard Worker 	}
118*49cdfc7eSAndroid Build Coastguard Worker 
119*49cdfc7eSAndroid Build Coastguard Worker 	blexit();
120*49cdfc7eSAndroid Build Coastguard Worker /*--------------------------------------------------------------*/
121*49cdfc7eSAndroid Build Coastguard Worker 	blenter();
122*49cdfc7eSAndroid Build Coastguard Worker 
123*49cdfc7eSAndroid Build Coastguard Worker 	for (i = 1; i < 200; i++) {
124*49cdfc7eSAndroid Build Coastguard Worker 		x = 100.0 / (double)i;
125*49cdfc7eSAndroid Build Coastguard Worker 		sprintf(buf, "%f", x);
126*49cdfc7eSAndroid Build Coastguard Worker 		r1 = atof(buf);
127*49cdfc7eSAndroid Build Coastguard Worker 		if (numin(buf, &r2)) {
128*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tnumin('%s') failed\n", buf);
129*49cdfc7eSAndroid Build Coastguard Worker 			local_flag = FAILED;
130*49cdfc7eSAndroid Build Coastguard Worker 		}
131*49cdfc7eSAndroid Build Coastguard Worker 		/*
132*49cdfc7eSAndroid Build Coastguard Worker 		 * Order subtraction  to produce a positive number.
133*49cdfc7eSAndroid Build Coastguard Worker 		 * Then subtrace "fudge" factor which should give us
134*49cdfc7eSAndroid Build Coastguard Worker 		 * a negative number, as the result fo subtraction should
135*49cdfc7eSAndroid Build Coastguard Worker 		 * always be smaller than the fudge factor.
136*49cdfc7eSAndroid Build Coastguard Worker 		 */
137*49cdfc7eSAndroid Build Coastguard Worker 		if (r1 > r2)
138*49cdfc7eSAndroid Build Coastguard Worker 			x = r1 - r2 - 1e-10;
139*49cdfc7eSAndroid Build Coastguard Worker 		else
140*49cdfc7eSAndroid Build Coastguard Worker 			x = r2 - r1 - 1e-10;
141*49cdfc7eSAndroid Build Coastguard Worker 		if (x > 0.0) {
142*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tx = %.15f = %e\n", x, x);
143*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\titeration %d\n", i);
144*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tcompare fails, %f vs %f\n", r1, r2);
145*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tcompare fails, %.15f vs %.15f\n",
146*49cdfc7eSAndroid Build Coastguard Worker 				r1, r2);
147*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tbuf = '%s'\n", buf);
148*49cdfc7eSAndroid Build Coastguard Worker 			x = r1 - r2;
149*49cdfc7eSAndroid Build Coastguard Worker 			if (x == 0.0)
150*49cdfc7eSAndroid Build Coastguard Worker 				fprintf(temp, "\tx == 0.0\n");
151*49cdfc7eSAndroid Build Coastguard Worker 			else
152*49cdfc7eSAndroid Build Coastguard Worker 				fprintf(temp, "\tx != 0.0\n");
153*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tx = %.15f = %e\n", x, x);
154*49cdfc7eSAndroid Build Coastguard Worker 			local_flag = FAILED;
155*49cdfc7eSAndroid Build Coastguard Worker 		}
156*49cdfc7eSAndroid Build Coastguard Worker 		if (local_flag == FAILED)
157*49cdfc7eSAndroid Build Coastguard Worker 			break;
158*49cdfc7eSAndroid Build Coastguard Worker 	}
159*49cdfc7eSAndroid Build Coastguard Worker 
160*49cdfc7eSAndroid Build Coastguard Worker 	blexit();
161*49cdfc7eSAndroid Build Coastguard Worker /*--------------------------------------------------------------*/
162*49cdfc7eSAndroid Build Coastguard Worker 	blenter();
163*49cdfc7eSAndroid Build Coastguard Worker 
164*49cdfc7eSAndroid Build Coastguard Worker 	for (i = -1; i > -200; i--) {
165*49cdfc7eSAndroid Build Coastguard Worker 		x = 100.0 / (double)i;
166*49cdfc7eSAndroid Build Coastguard Worker 		sprintf(buf, "%f", x);
167*49cdfc7eSAndroid Build Coastguard Worker 		r1 = atof(buf);
168*49cdfc7eSAndroid Build Coastguard Worker 		if (numin(buf, &r2)) {
169*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tnumin('%s') failed\n", buf);
170*49cdfc7eSAndroid Build Coastguard Worker 			local_flag = FAILED;
171*49cdfc7eSAndroid Build Coastguard Worker 		}
172*49cdfc7eSAndroid Build Coastguard Worker 		/*
173*49cdfc7eSAndroid Build Coastguard Worker 		 * Same ordering of subtraction as above.
174*49cdfc7eSAndroid Build Coastguard Worker 		 */
175*49cdfc7eSAndroid Build Coastguard Worker 		if (r1 > r2)
176*49cdfc7eSAndroid Build Coastguard Worker 			x = r1 - r2 - 1e-10;
177*49cdfc7eSAndroid Build Coastguard Worker 		else
178*49cdfc7eSAndroid Build Coastguard Worker 			x = r2 - r1 - 1e-10;
179*49cdfc7eSAndroid Build Coastguard Worker 		if (x > 0.0) {
180*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tcompare fails, %f vs %f\n", r1, r2);
181*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tcompare fails, %.15f vs %.15f\n",
182*49cdfc7eSAndroid Build Coastguard Worker 				r1, r2);
183*49cdfc7eSAndroid Build Coastguard Worker 			x = r1 - r2;
184*49cdfc7eSAndroid Build Coastguard Worker 			if (x == 0.0)
185*49cdfc7eSAndroid Build Coastguard Worker 				fprintf(temp, "\tx == 0.0)\n");
186*49cdfc7eSAndroid Build Coastguard Worker 			else
187*49cdfc7eSAndroid Build Coastguard Worker 				fprintf(temp, "\tx != 0.0\n");
188*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tx = %.15f = %e\n", x, x);
189*49cdfc7eSAndroid Build Coastguard Worker 			local_flag = FAILED;
190*49cdfc7eSAndroid Build Coastguard Worker 		}
191*49cdfc7eSAndroid Build Coastguard Worker 		if (local_flag == FAILED)
192*49cdfc7eSAndroid Build Coastguard Worker 			break;
193*49cdfc7eSAndroid Build Coastguard Worker 	}
194*49cdfc7eSAndroid Build Coastguard Worker 
195*49cdfc7eSAndroid Build Coastguard Worker 	blexit();
196*49cdfc7eSAndroid Build Coastguard Worker /*--------------------------------------------------------------*/
197*49cdfc7eSAndroid Build Coastguard Worker 	tst_exit();
198*49cdfc7eSAndroid Build Coastguard Worker }
199*49cdfc7eSAndroid Build Coastguard Worker 
200*49cdfc7eSAndroid Build Coastguard Worker /* FUNCTIONS GO HERE */
201*49cdfc7eSAndroid Build Coastguard Worker 
numin(char * str,double * rval)202*49cdfc7eSAndroid Build Coastguard Worker static int numin(char *str, double *rval)
203*49cdfc7eSAndroid Build Coastguard Worker {
204*49cdfc7eSAndroid Build Coastguard Worker 	register int i, v3, e_flag;
205*49cdfc7eSAndroid Build Coastguard Worker 	register char c;
206*49cdfc7eSAndroid Build Coastguard Worker 	double val, v1, v2, k;
207*49cdfc7eSAndroid Build Coastguard Worker 	int neg_flag = 0;
208*49cdfc7eSAndroid Build Coastguard Worker 
209*49cdfc7eSAndroid Build Coastguard Worker 	val = v1 = v2 = 0.0;
210*49cdfc7eSAndroid Build Coastguard Worker 	v3 = 0;
211*49cdfc7eSAndroid Build Coastguard Worker 	k = 0.1;
212*49cdfc7eSAndroid Build Coastguard Worker 
213*49cdfc7eSAndroid Build Coastguard Worker 	while (*str == ' ')	/* scan past white space */
214*49cdfc7eSAndroid Build Coastguard Worker 		str++;
215*49cdfc7eSAndroid Build Coastguard Worker 
216*49cdfc7eSAndroid Build Coastguard Worker 	if (*str == '-') {	/* negitive value test */
217*49cdfc7eSAndroid Build Coastguard Worker 		neg_flag++;
218*49cdfc7eSAndroid Build Coastguard Worker 		str++;
219*49cdfc7eSAndroid Build Coastguard Worker 	}
220*49cdfc7eSAndroid Build Coastguard Worker 
221*49cdfc7eSAndroid Build Coastguard Worker 	for (;;) {
222*49cdfc7eSAndroid Build Coastguard Worker 		c = *str;
223*49cdfc7eSAndroid Build Coastguard Worker 		if (!isdigit(c))
224*49cdfc7eSAndroid Build Coastguard Worker 			break;
225*49cdfc7eSAndroid Build Coastguard Worker 		v1 *= 10.0;
226*49cdfc7eSAndroid Build Coastguard Worker 		v1 += (double)(c - '0');
227*49cdfc7eSAndroid Build Coastguard Worker 		str++;
228*49cdfc7eSAndroid Build Coastguard Worker 	}
229*49cdfc7eSAndroid Build Coastguard Worker 
230*49cdfc7eSAndroid Build Coastguard Worker 	val = v1;
231*49cdfc7eSAndroid Build Coastguard Worker 
232*49cdfc7eSAndroid Build Coastguard Worker #ifdef DEBUG
233*49cdfc7eSAndroid Build Coastguard Worker 	printf("First conversion, val = %f = %e\n", val, val);
234*49cdfc7eSAndroid Build Coastguard Worker #endif
235*49cdfc7eSAndroid Build Coastguard Worker 
236*49cdfc7eSAndroid Build Coastguard Worker 	if (*str == '.') {
237*49cdfc7eSAndroid Build Coastguard Worker 		str++;
238*49cdfc7eSAndroid Build Coastguard Worker 		for (;;) {
239*49cdfc7eSAndroid Build Coastguard Worker 			c = *str;
240*49cdfc7eSAndroid Build Coastguard Worker 			if (!isdigit(c))
241*49cdfc7eSAndroid Build Coastguard Worker 				break;
242*49cdfc7eSAndroid Build Coastguard Worker 			v2 += k * (double)(c - '0');
243*49cdfc7eSAndroid Build Coastguard Worker 			k /= 10.0;
244*49cdfc7eSAndroid Build Coastguard Worker 			str++;
245*49cdfc7eSAndroid Build Coastguard Worker 		}
246*49cdfc7eSAndroid Build Coastguard Worker 		val += v2;
247*49cdfc7eSAndroid Build Coastguard Worker 	}
248*49cdfc7eSAndroid Build Coastguard Worker #ifdef DEBUG
249*49cdfc7eSAndroid Build Coastguard Worker 	printf("Second conversion, val = %f = %e\n", val, val);
250*49cdfc7eSAndroid Build Coastguard Worker #endif
251*49cdfc7eSAndroid Build Coastguard Worker 
252*49cdfc7eSAndroid Build Coastguard Worker 	if (*str == 'e') {
253*49cdfc7eSAndroid Build Coastguard Worker 		str++;
254*49cdfc7eSAndroid Build Coastguard Worker 		switch (*str) {
255*49cdfc7eSAndroid Build Coastguard Worker 		case '+':
256*49cdfc7eSAndroid Build Coastguard Worker 			e_flag = 1;
257*49cdfc7eSAndroid Build Coastguard Worker 			break;
258*49cdfc7eSAndroid Build Coastguard Worker 		case '-':
259*49cdfc7eSAndroid Build Coastguard Worker 			e_flag = -1;
260*49cdfc7eSAndroid Build Coastguard Worker 			break;
261*49cdfc7eSAndroid Build Coastguard Worker 		default:
262*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tbad char '%c' after 'e'\n", *str);
263*49cdfc7eSAndroid Build Coastguard Worker 			printf("bad char '%c' after 'e'\n", *str);
264*49cdfc7eSAndroid Build Coastguard Worker 			return (-1);
265*49cdfc7eSAndroid Build Coastguard Worker 		}
266*49cdfc7eSAndroid Build Coastguard Worker 		str++;
267*49cdfc7eSAndroid Build Coastguard Worker 		if (!isdigit(*str)) {
268*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tbad exponent field\n");
269*49cdfc7eSAndroid Build Coastguard Worker 			printf("bad exponent field\n");
270*49cdfc7eSAndroid Build Coastguard Worker 			return (-1);
271*49cdfc7eSAndroid Build Coastguard Worker 		}
272*49cdfc7eSAndroid Build Coastguard Worker 		v3 = 10 * (int)(*str - '0');
273*49cdfc7eSAndroid Build Coastguard Worker 		str++;
274*49cdfc7eSAndroid Build Coastguard Worker 		if (!isdigit(*str)) {
275*49cdfc7eSAndroid Build Coastguard Worker 			fprintf(temp, "\tbad exponent field\n");
276*49cdfc7eSAndroid Build Coastguard Worker 			printf("bad exponent field\n");
277*49cdfc7eSAndroid Build Coastguard Worker 			return (-1);
278*49cdfc7eSAndroid Build Coastguard Worker 		}
279*49cdfc7eSAndroid Build Coastguard Worker 		v3 += (int)(*str - '0');
280*49cdfc7eSAndroid Build Coastguard Worker 		str++;
281*49cdfc7eSAndroid Build Coastguard Worker 		for (i = 0; i < v3; i++) {
282*49cdfc7eSAndroid Build Coastguard Worker 			if (e_flag > 0)
283*49cdfc7eSAndroid Build Coastguard Worker 				val *= 10.0;
284*49cdfc7eSAndroid Build Coastguard Worker 			else
285*49cdfc7eSAndroid Build Coastguard Worker 				val *= 0.1;
286*49cdfc7eSAndroid Build Coastguard Worker 		}
287*49cdfc7eSAndroid Build Coastguard Worker 	}
288*49cdfc7eSAndroid Build Coastguard Worker 
289*49cdfc7eSAndroid Build Coastguard Worker 	if (neg_flag)
290*49cdfc7eSAndroid Build Coastguard Worker 		val *= -1.0;
291*49cdfc7eSAndroid Build Coastguard Worker 
292*49cdfc7eSAndroid Build Coastguard Worker #ifdef DEBUG
293*49cdfc7eSAndroid Build Coastguard Worker 	printf("Third conversion, val = %f = %e\n", val, val);
294*49cdfc7eSAndroid Build Coastguard Worker 	printf("v1 = %f, v2 = %f, v3 = %d\n", v1, v2, v3);
295*49cdfc7eSAndroid Build Coastguard Worker #endif
296*49cdfc7eSAndroid Build Coastguard Worker 
297*49cdfc7eSAndroid Build Coastguard Worker 	switch (*str) {
298*49cdfc7eSAndroid Build Coastguard Worker 	case '\0':
299*49cdfc7eSAndroid Build Coastguard Worker 	case ' ':
300*49cdfc7eSAndroid Build Coastguard Worker 	case '\t':
301*49cdfc7eSAndroid Build Coastguard Worker 	case '\n':
302*49cdfc7eSAndroid Build Coastguard Worker 		break;
303*49cdfc7eSAndroid Build Coastguard Worker 	default:
304*49cdfc7eSAndroid Build Coastguard Worker 		printf("unexpected char '%c'\n", *str);
305*49cdfc7eSAndroid Build Coastguard Worker 		return (-1);
306*49cdfc7eSAndroid Build Coastguard Worker 	}
307*49cdfc7eSAndroid Build Coastguard Worker 
308*49cdfc7eSAndroid Build Coastguard Worker 	*rval = val;
309*49cdfc7eSAndroid Build Coastguard Worker 	return (0);
310*49cdfc7eSAndroid Build Coastguard Worker }
311*49cdfc7eSAndroid Build Coastguard Worker 
checkbuf(char * str,int n1,int n2)312*49cdfc7eSAndroid Build Coastguard Worker static int checkbuf(char *str, int n1, int n2)
313*49cdfc7eSAndroid Build Coastguard Worker {
314*49cdfc7eSAndroid Build Coastguard Worker 	register int bd;	/* before decimal point */
315*49cdfc7eSAndroid Build Coastguard Worker 	register int ad;	/* after decimal point */
316*49cdfc7eSAndroid Build Coastguard Worker 	register int tw;	/* total width */
317*49cdfc7eSAndroid Build Coastguard Worker 	register int dp;	/* decimal point */
318*49cdfc7eSAndroid Build Coastguard Worker 	char *buf;
319*49cdfc7eSAndroid Build Coastguard Worker 
320*49cdfc7eSAndroid Build Coastguard Worker 	bd = ad = dp = 0;
321*49cdfc7eSAndroid Build Coastguard Worker 	buf = str;
322*49cdfc7eSAndroid Build Coastguard Worker 
323*49cdfc7eSAndroid Build Coastguard Worker 	while (*str && *str != '.') {
324*49cdfc7eSAndroid Build Coastguard Worker 		bd++;
325*49cdfc7eSAndroid Build Coastguard Worker 		str++;
326*49cdfc7eSAndroid Build Coastguard Worker 	}
327*49cdfc7eSAndroid Build Coastguard Worker 	if (*str == '.') {
328*49cdfc7eSAndroid Build Coastguard Worker 		dp++;
329*49cdfc7eSAndroid Build Coastguard Worker 		str++;
330*49cdfc7eSAndroid Build Coastguard Worker 		if (*str) {
331*49cdfc7eSAndroid Build Coastguard Worker 			while (*str) {
332*49cdfc7eSAndroid Build Coastguard Worker 				ad++;
333*49cdfc7eSAndroid Build Coastguard Worker 				str++;
334*49cdfc7eSAndroid Build Coastguard Worker 			}
335*49cdfc7eSAndroid Build Coastguard Worker 		}
336*49cdfc7eSAndroid Build Coastguard Worker 	}
337*49cdfc7eSAndroid Build Coastguard Worker 
338*49cdfc7eSAndroid Build Coastguard Worker 	tw = bd + dp + ad;
339*49cdfc7eSAndroid Build Coastguard Worker 	if (!n1)
340*49cdfc7eSAndroid Build Coastguard Worker 		n1++;
341*49cdfc7eSAndroid Build Coastguard Worker 	if (tw < n1) {
342*49cdfc7eSAndroid Build Coastguard Worker 		fprintf(temp, "\tWidth too small.\n");
343*49cdfc7eSAndroid Build Coastguard Worker 		fprintf(temp, "\tn1 = %d, n2 = %d, buf= '%s'\n", n1, n2, buf);
344*49cdfc7eSAndroid Build Coastguard Worker 		return (-1);
345*49cdfc7eSAndroid Build Coastguard Worker 	}
346*49cdfc7eSAndroid Build Coastguard Worker 
347*49cdfc7eSAndroid Build Coastguard Worker 	if (ad != n2) {
348*49cdfc7eSAndroid Build Coastguard Worker 		fprintf(temp, "\tNumber after decimal wrong.\n");
349*49cdfc7eSAndroid Build Coastguard Worker 		fprintf(temp, "\tn1 = %d, n2 = %d, buf= '%s'\n", n1, n2, buf);
350*49cdfc7eSAndroid Build Coastguard Worker 		return (-1);
351*49cdfc7eSAndroid Build Coastguard Worker 	}
352*49cdfc7eSAndroid Build Coastguard Worker 
353*49cdfc7eSAndroid Build Coastguard Worker 	if (n2 && !dp) {
354*49cdfc7eSAndroid Build Coastguard Worker 		fprintf(temp, "\tMissed decimal point.\n");
355*49cdfc7eSAndroid Build Coastguard Worker 		fprintf(temp, "\tn1 = %d, n2 = %d, buf= '%s'\n", n1, n2, buf);
356*49cdfc7eSAndroid Build Coastguard Worker 		return (-1);
357*49cdfc7eSAndroid Build Coastguard Worker 	}
358*49cdfc7eSAndroid Build Coastguard Worker 
359*49cdfc7eSAndroid Build Coastguard Worker 	return (0);
360*49cdfc7eSAndroid Build Coastguard Worker }
361*49cdfc7eSAndroid Build Coastguard Worker 
362*49cdfc7eSAndroid Build Coastguard Worker /**	LTP Port	**/
setup(void)363*49cdfc7eSAndroid Build Coastguard Worker static void setup(void)
364*49cdfc7eSAndroid Build Coastguard Worker {
365*49cdfc7eSAndroid Build Coastguard Worker 	temp = stderr;
366*49cdfc7eSAndroid Build Coastguard Worker }
367*49cdfc7eSAndroid Build Coastguard Worker 
blenter(void)368*49cdfc7eSAndroid Build Coastguard Worker static void blenter(void)
369*49cdfc7eSAndroid Build Coastguard Worker {
370*49cdfc7eSAndroid Build Coastguard Worker 	local_flag = PASSED;
371*49cdfc7eSAndroid Build Coastguard Worker }
372*49cdfc7eSAndroid Build Coastguard Worker 
blexit(void)373*49cdfc7eSAndroid Build Coastguard Worker static void blexit(void)
374*49cdfc7eSAndroid Build Coastguard Worker {
375*49cdfc7eSAndroid Build Coastguard Worker 	if (local_flag == PASSED)
376*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TPASS, "Test passed");
377*49cdfc7eSAndroid Build Coastguard Worker 	else
378*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Test failed");
379*49cdfc7eSAndroid Build Coastguard Worker }
380