12c282cdd60240868a116f70c680607c326f5517brobbiew/*
22c282cdd60240868a116f70c680607c326f5517brobbiew *
32c282cdd60240868a116f70c680607c326f5517brobbiew *   Copyright (c) International Business Machines  Corp., 2002
42c282cdd60240868a116f70c680607c326f5517brobbiew *
52c282cdd60240868a116f70c680607c326f5517brobbiew *   This program is free software;  you can redistribute it and/or modify
62c282cdd60240868a116f70c680607c326f5517brobbiew *   it under the terms of the GNU General Public License as published by
72c282cdd60240868a116f70c680607c326f5517brobbiew *   the Free Software Foundation; either version 2 of the License, or
82c282cdd60240868a116f70c680607c326f5517brobbiew *   (at your option) any later version.
92c282cdd60240868a116f70c680607c326f5517brobbiew *
102c282cdd60240868a116f70c680607c326f5517brobbiew *   This program is distributed in the hope that it will be useful,
112c282cdd60240868a116f70c680607c326f5517brobbiew *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
122c282cdd60240868a116f70c680607c326f5517brobbiew *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
132c282cdd60240868a116f70c680607c326f5517brobbiew *   the GNU General Public License for more details.
142c282cdd60240868a116f70c680607c326f5517brobbiew *
152c282cdd60240868a116f70c680607c326f5517brobbiew *   You should have received a copy of the GNU General Public License
162c282cdd60240868a116f70c680607c326f5517brobbiew *   along with this program;  if not, write to the Free Software
174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
182c282cdd60240868a116f70c680607c326f5517brobbiew */
192c282cdd60240868a116f70c680607c326f5517brobbiew
202c282cdd60240868a116f70c680607c326f5517brobbiew/* 01/02/2003	Port to LTP	avenkat@us.ibm.com */
212c282cdd60240868a116f70c680607c326f5517brobbiew/* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */
222c282cdd60240868a116f70c680607c326f5517brobbiew
232c282cdd60240868a116f70c680607c326f5517brobbiew/*
242c282cdd60240868a116f70c680607c326f5517brobbiew * NAME
252c282cdd60240868a116f70c680607c326f5517brobbiew *	atof1 -- ascii to floating point test
262c282cdd60240868a116f70c680607c326f5517brobbiew *
272c282cdd60240868a116f70c680607c326f5517brobbiew * CALLS
282c282cdd60240868a116f70c680607c326f5517brobbiew *	atof(3), sprintf(3), ( doprnt.s )
292c282cdd60240868a116f70c680607c326f5517brobbiew *
302c282cdd60240868a116f70c680607c326f5517brobbiew * ALGORITHM
312c282cdd60240868a116f70c680607c326f5517brobbiew *	Do some checks of floating point to ascii and back, arbitrate
322c282cdd60240868a116f70c680607c326f5517brobbiew *	with a 3rd algorithm written in C.
332c282cdd60240868a116f70c680607c326f5517brobbiew *
342c282cdd60240868a116f70c680607c326f5517brobbiew * RESTRICTIONS
352c282cdd60240868a116f70c680607c326f5517brobbiew */
362c282cdd60240868a116f70c680607c326f5517brobbiew
372c282cdd60240868a116f70c680607c326f5517brobbiew#include <stdio.h>
382c282cdd60240868a116f70c680607c326f5517brobbiew#include <ctype.h>
392c282cdd60240868a116f70c680607c326f5517brobbiew#include <math.h>
402c282cdd60240868a116f70c680607c326f5517brobbiew#include <stdlib.h>
412c282cdd60240868a116f70c680607c326f5517brobbiew#include <errno.h>
422c282cdd60240868a116f70c680607c326f5517brobbiew
432c282cdd60240868a116f70c680607c326f5517brobbiew/**	LTP Port	**/
442c282cdd60240868a116f70c680607c326f5517brobbiew#include "test.h"
452c282cdd60240868a116f70c680607c326f5517brobbiew
462c282cdd60240868a116f70c680607c326f5517brobbiew#define FAILED 0
472c282cdd60240868a116f70c680607c326f5517brobbiew#define PASSED 1
482c282cdd60240868a116f70c680607c326f5517brobbiew
492c282cdd60240868a116f70c680607c326f5517brobbiew/*****		*****/
502c282cdd60240868a116f70c680607c326f5517brobbiew#define ERR		0.0000001
512c282cdd60240868a116f70c680607c326f5517brobbiew
522c282cdd60240868a116f70c680607c326f5517brobbiewdouble pi;
532c282cdd60240868a116f70c680607c326f5517brobbiew
542c282cdd60240868a116f70c680607c326f5517brobbiew/*char progname[]= "atof1()"; */
552c282cdd60240868a116f70c680607c326f5517brobbiew/**	LTP Port	**/
56354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *TCID = "atof01";		/* Test program identifier */
572c282cdd60240868a116f70c680607c326f5517brobbiew
582c282cdd60240868a116f70c680607c326f5517brobbiewint local_flag = PASSED;
592c282cdd60240868a116f70c680607c326f5517brobbiewint block_number;
602c282cdd60240868a116f70c680607c326f5517brobbiewFILE *temp;
612c282cdd60240868a116f70c680607c326f5517brobbiewint TST_TOTAL = 1;
622c282cdd60240868a116f70c680607c326f5517brobbiew
63829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic void setup(void);
64829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic void blenter(void);
65829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic void blexit(void);
66829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic int numin(char *, double *);
67829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic int checkbuf(char *, int, int);
682c282cdd60240868a116f70c680607c326f5517brobbiew
692c282cdd60240868a116f70c680607c326f5517brobbiew/*--------------------------------------------------------------*/
70354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint main(int argc, char *argv[])
712c282cdd60240868a116f70c680607c326f5517brobbiew{
722c282cdd60240868a116f70c680607c326f5517brobbiew	register int i, j;
732c282cdd60240868a116f70c680607c326f5517brobbiew	double r1, r2, x;
742c282cdd60240868a116f70c680607c326f5517brobbiew	char buf[100];
752c282cdd60240868a116f70c680607c326f5517brobbiew
76354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	setup();		/* temp file is now open        */
772c282cdd60240868a116f70c680607c326f5517brobbiew	pi = 4.0 * atan(1.0);
782c282cdd60240868a116f70c680607c326f5517brobbiew
792c282cdd60240868a116f70c680607c326f5517brobbiew/*--------------------------------------------------------------*/
802c282cdd60240868a116f70c680607c326f5517brobbiew	blenter();
812c28215423293e443469a07ae7011135d058b671Garrett Cooper
82354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (i = 0; i < 30; i++)
83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		for (j = 0; j < 30; j++) {
842c282cdd60240868a116f70c680607c326f5517brobbiew			sprintf(buf, "%*.*f", i, j, pi);
852c282cdd60240868a116f70c680607c326f5517brobbiew			if (checkbuf(buf, i, j)) {
862c282cdd60240868a116f70c680607c326f5517brobbiew				fprintf(temp, "output conversion incorrect.");
87354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				fprintf(temp, "%*.*f = '%s'", i, j, pi, buf);
882c282cdd60240868a116f70c680607c326f5517brobbiew				local_flag = FAILED;
892c282cdd60240868a116f70c680607c326f5517brobbiew			}
902c282cdd60240868a116f70c680607c326f5517brobbiew			r1 = atof(buf);
912c282cdd60240868a116f70c680607c326f5517brobbiew			if (numin(buf, &r2)) {
922c282cdd60240868a116f70c680607c326f5517brobbiew				fprintf(temp, "\tnumin('%s') failed\n", buf);
932c282cdd60240868a116f70c680607c326f5517brobbiew				local_flag = FAILED;
942c282cdd60240868a116f70c680607c326f5517brobbiew			}
952c282cdd60240868a116f70c680607c326f5517brobbiew			x = fabs(r1 - r2);
962c282cdd60240868a116f70c680607c326f5517brobbiew			if (x > ERR) {
972c282cdd60240868a116f70c680607c326f5517brobbiew				fprintf(temp, "\tcompare fails, %f vs %f\n",
98354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					r1, r2);
992c282cdd60240868a116f70c680607c326f5517brobbiew				fprintf(temp, "\terr value is %f\n", x);
1002c282cdd60240868a116f70c680607c326f5517brobbiew				local_flag = FAILED;
1012c282cdd60240868a116f70c680607c326f5517brobbiew			}
1022c282cdd60240868a116f70c680607c326f5517brobbiew			if (local_flag == FAILED)
1032c282cdd60240868a116f70c680607c326f5517brobbiew				break;
1042c282cdd60240868a116f70c680607c326f5517brobbiew		}
1052c282cdd60240868a116f70c680607c326f5517brobbiew
1062c282cdd60240868a116f70c680607c326f5517brobbiew	blexit();
1072c282cdd60240868a116f70c680607c326f5517brobbiew/*--------------------------------------------------------------*/
1082c282cdd60240868a116f70c680607c326f5517brobbiew	blenter();
1092c282cdd60240868a116f70c680607c326f5517brobbiew
1102c282cdd60240868a116f70c680607c326f5517brobbiew	x = 1.0 - exp(-100.0);	/* 1.0 - very small number */
1112c282cdd60240868a116f70c680607c326f5517brobbiew	sprintf(buf, "%f", x);
1122c282cdd60240868a116f70c680607c326f5517brobbiew	r1 = atof(buf);
1132c282cdd60240868a116f70c680607c326f5517brobbiew	if (r1 != 1.0) {
1142c282cdd60240868a116f70c680607c326f5517brobbiew		fprintf(temp, "\tsprintf small # failed\n");
1152c282cdd60240868a116f70c680607c326f5517brobbiew		fprintf(temp, "\t printed '%s', expected 1.0\n", buf);
1162c282cdd60240868a116f70c680607c326f5517brobbiew		local_flag = FAILED;
1172c282cdd60240868a116f70c680607c326f5517brobbiew	}
1182c282cdd60240868a116f70c680607c326f5517brobbiew
1192c282cdd60240868a116f70c680607c326f5517brobbiew	blexit();
1202c282cdd60240868a116f70c680607c326f5517brobbiew/*--------------------------------------------------------------*/
1212c282cdd60240868a116f70c680607c326f5517brobbiew	blenter();
1222c282cdd60240868a116f70c680607c326f5517brobbiew
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (i = 1; i < 200; i++) {
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		x = 100.0 / (double)i;
1252c282cdd60240868a116f70c680607c326f5517brobbiew		sprintf(buf, "%f", x);
1262c282cdd60240868a116f70c680607c326f5517brobbiew		r1 = atof(buf);
1272c282cdd60240868a116f70c680607c326f5517brobbiew		if (numin(buf, &r2)) {
1282c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tnumin('%s') failed\n", buf);
1292c282cdd60240868a116f70c680607c326f5517brobbiew			local_flag = FAILED;
1302c282cdd60240868a116f70c680607c326f5517brobbiew		}
1312c282cdd60240868a116f70c680607c326f5517brobbiew		/*
1322c282cdd60240868a116f70c680607c326f5517brobbiew		 * Order subtraction  to produce a positive number.
1332c282cdd60240868a116f70c680607c326f5517brobbiew		 * Then subtrace "fudge" factor which should give us
1342c282cdd60240868a116f70c680607c326f5517brobbiew		 * a negative number, as the result fo subtraction should
1352c282cdd60240868a116f70c680607c326f5517brobbiew		 * always be smaller than the fudge factor.
1362c282cdd60240868a116f70c680607c326f5517brobbiew		 */
1372c282cdd60240868a116f70c680607c326f5517brobbiew		if (r1 > r2)
1382c282cdd60240868a116f70c680607c326f5517brobbiew			x = r1 - r2 - 1e-10;
1392c282cdd60240868a116f70c680607c326f5517brobbiew		else
1402c282cdd60240868a116f70c680607c326f5517brobbiew			x = r2 - r1 - 1e-10;
1412c282cdd60240868a116f70c680607c326f5517brobbiew		if (x > 0.0) {
1422c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tx = %.15f = %e\n", x, x);
1432c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\titeration %d\n", i);
144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fprintf(temp, "\tcompare fails, %f vs %f\n", r1, r2);
1452c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tcompare fails, %.15f vs %.15f\n",
146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				r1, r2);
1472c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tbuf = '%s'\n", buf);
1482c282cdd60240868a116f70c680607c326f5517brobbiew			x = r1 - r2;
1492c282cdd60240868a116f70c680607c326f5517brobbiew			if (x == 0.0)
1502c282cdd60240868a116f70c680607c326f5517brobbiew				fprintf(temp, "\tx == 0.0\n");
1512c282cdd60240868a116f70c680607c326f5517brobbiew			else
1522c282cdd60240868a116f70c680607c326f5517brobbiew				fprintf(temp, "\tx != 0.0\n");
1532c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tx = %.15f = %e\n", x, x);
1542c282cdd60240868a116f70c680607c326f5517brobbiew			local_flag = FAILED;
1552c282cdd60240868a116f70c680607c326f5517brobbiew		}
1562c282cdd60240868a116f70c680607c326f5517brobbiew		if (local_flag == FAILED)
1572c282cdd60240868a116f70c680607c326f5517brobbiew			break;
1582c282cdd60240868a116f70c680607c326f5517brobbiew	}
1592c282cdd60240868a116f70c680607c326f5517brobbiew
1602c282cdd60240868a116f70c680607c326f5517brobbiew	blexit();
1612c282cdd60240868a116f70c680607c326f5517brobbiew/*--------------------------------------------------------------*/
1622c282cdd60240868a116f70c680607c326f5517brobbiew	blenter();
1632c282cdd60240868a116f70c680607c326f5517brobbiew
164354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (i = -1; i > -200; i--) {
165354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		x = 100.0 / (double)i;
1662c282cdd60240868a116f70c680607c326f5517brobbiew		sprintf(buf, "%f", x);
1672c282cdd60240868a116f70c680607c326f5517brobbiew		r1 = atof(buf);
1682c282cdd60240868a116f70c680607c326f5517brobbiew		if (numin(buf, &r2)) {
1692c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tnumin('%s') failed\n", buf);
1702c282cdd60240868a116f70c680607c326f5517brobbiew			local_flag = FAILED;
1712c282cdd60240868a116f70c680607c326f5517brobbiew		}
1722c282cdd60240868a116f70c680607c326f5517brobbiew		/*
1732c282cdd60240868a116f70c680607c326f5517brobbiew		 * Same ordering of subtraction as above.
1742c282cdd60240868a116f70c680607c326f5517brobbiew		 */
1752c282cdd60240868a116f70c680607c326f5517brobbiew		if (r1 > r2)
1762c282cdd60240868a116f70c680607c326f5517brobbiew			x = r1 - r2 - 1e-10;
1772c282cdd60240868a116f70c680607c326f5517brobbiew		else
1782c282cdd60240868a116f70c680607c326f5517brobbiew			x = r2 - r1 - 1e-10;
1792c282cdd60240868a116f70c680607c326f5517brobbiew		if (x > 0.0) {
180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fprintf(temp, "\tcompare fails, %f vs %f\n", r1, r2);
1812c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tcompare fails, %.15f vs %.15f\n",
182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				r1, r2);
1832c282cdd60240868a116f70c680607c326f5517brobbiew			x = r1 - r2;
184df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper			if (x == 0.0)
1852c282cdd60240868a116f70c680607c326f5517brobbiew				fprintf(temp, "\tx == 0.0)\n");
1862c282cdd60240868a116f70c680607c326f5517brobbiew			else
1872c282cdd60240868a116f70c680607c326f5517brobbiew				fprintf(temp, "\tx != 0.0\n");
1882c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tx = %.15f = %e\n", x, x);
1892c282cdd60240868a116f70c680607c326f5517brobbiew			local_flag = FAILED;
1902c282cdd60240868a116f70c680607c326f5517brobbiew		}
1912c282cdd60240868a116f70c680607c326f5517brobbiew		if (local_flag == FAILED)
1922c282cdd60240868a116f70c680607c326f5517brobbiew			break;
1932c282cdd60240868a116f70c680607c326f5517brobbiew	}
1942c282cdd60240868a116f70c680607c326f5517brobbiew
1952c282cdd60240868a116f70c680607c326f5517brobbiew	blexit();
1962c282cdd60240868a116f70c680607c326f5517brobbiew/*--------------------------------------------------------------*/
1974b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	tst_exit();
1982c282cdd60240868a116f70c680607c326f5517brobbiew}
199354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
2002c282cdd60240868a116f70c680607c326f5517brobbiew/* FUNCTIONS GO HERE */
2012c282cdd60240868a116f70c680607c326f5517brobbiew
202829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic int numin(char *str, double *rval)
2032c282cdd60240868a116f70c680607c326f5517brobbiew{
2042c282cdd60240868a116f70c680607c326f5517brobbiew	register int i, v3, e_flag;
2052c282cdd60240868a116f70c680607c326f5517brobbiew	register char c;
2062c282cdd60240868a116f70c680607c326f5517brobbiew	double val, v1, v2, k;
2072c282cdd60240868a116f70c680607c326f5517brobbiew	int neg_flag = 0;
2082c282cdd60240868a116f70c680607c326f5517brobbiew
2092c282cdd60240868a116f70c680607c326f5517brobbiew	val = v1 = v2 = 0.0;
2102c282cdd60240868a116f70c680607c326f5517brobbiew	v3 = 0;
2112c282cdd60240868a116f70c680607c326f5517brobbiew	k = 0.1;
2122c282cdd60240868a116f70c680607c326f5517brobbiew
2132c282cdd60240868a116f70c680607c326f5517brobbiew	while (*str == ' ')	/* scan past white space */
2142c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
2152c282cdd60240868a116f70c680607c326f5517brobbiew
2162c282cdd60240868a116f70c680607c326f5517brobbiew	if (*str == '-') {	/* negitive value test */
2172c282cdd60240868a116f70c680607c326f5517brobbiew		neg_flag++;
2182c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
2192c282cdd60240868a116f70c680607c326f5517brobbiew	}
2202c282cdd60240868a116f70c680607c326f5517brobbiew
2212c282cdd60240868a116f70c680607c326f5517brobbiew	for (;;) {
2222c282cdd60240868a116f70c680607c326f5517brobbiew		c = *str;
2232c282cdd60240868a116f70c680607c326f5517brobbiew		if (!isdigit(c))
2242c282cdd60240868a116f70c680607c326f5517brobbiew			break;
2252c282cdd60240868a116f70c680607c326f5517brobbiew		v1 *= 10.0;
226354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		v1 += (double)(c - '0');
2272c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
2282c282cdd60240868a116f70c680607c326f5517brobbiew	}
2292c282cdd60240868a116f70c680607c326f5517brobbiew
2302c282cdd60240868a116f70c680607c326f5517brobbiew	val = v1;
2312c282cdd60240868a116f70c680607c326f5517brobbiew
2322c282cdd60240868a116f70c680607c326f5517brobbiew#ifdef DEBUG
2332c282cdd60240868a116f70c680607c326f5517brobbiew	printf("First conversion, val = %f = %e\n", val, val);
2342c282cdd60240868a116f70c680607c326f5517brobbiew#endif
2352c282cdd60240868a116f70c680607c326f5517brobbiew
2362c282cdd60240868a116f70c680607c326f5517brobbiew	if (*str == '.') {
2372c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
2382c282cdd60240868a116f70c680607c326f5517brobbiew		for (;;) {
2392c282cdd60240868a116f70c680607c326f5517brobbiew			c = *str;
2402c282cdd60240868a116f70c680607c326f5517brobbiew			if (!isdigit(c))
2412c282cdd60240868a116f70c680607c326f5517brobbiew				break;
242354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			v2 += k * (double)(c - '0');
2432c282cdd60240868a116f70c680607c326f5517brobbiew			k /= 10.0;
2442c282cdd60240868a116f70c680607c326f5517brobbiew			str++;
2452c282cdd60240868a116f70c680607c326f5517brobbiew		}
2462c282cdd60240868a116f70c680607c326f5517brobbiew		val += v2;
2472c282cdd60240868a116f70c680607c326f5517brobbiew	}
2482c282cdd60240868a116f70c680607c326f5517brobbiew#ifdef DEBUG
2492c282cdd60240868a116f70c680607c326f5517brobbiew	printf("Second conversion, val = %f = %e\n", val, val);
2502c282cdd60240868a116f70c680607c326f5517brobbiew#endif
2512c282cdd60240868a116f70c680607c326f5517brobbiew
2522c282cdd60240868a116f70c680607c326f5517brobbiew	if (*str == 'e') {
2532c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
2542c282cdd60240868a116f70c680607c326f5517brobbiew		switch (*str) {
2552c282cdd60240868a116f70c680607c326f5517brobbiew		case '+':
2562c282cdd60240868a116f70c680607c326f5517brobbiew			e_flag = 1;
2572c282cdd60240868a116f70c680607c326f5517brobbiew			break;
2582c282cdd60240868a116f70c680607c326f5517brobbiew		case '-':
2592c282cdd60240868a116f70c680607c326f5517brobbiew			e_flag = -1;
2602c282cdd60240868a116f70c680607c326f5517brobbiew			break;
2612c282cdd60240868a116f70c680607c326f5517brobbiew		default:
2622c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tbad char '%c' after 'e'\n", *str);
2632c282cdd60240868a116f70c680607c326f5517brobbiew			printf("bad char '%c' after 'e'\n", *str);
264354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return (-1);
2652c282cdd60240868a116f70c680607c326f5517brobbiew		}
2662c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
2672c282cdd60240868a116f70c680607c326f5517brobbiew		if (!isdigit(*str)) {
2682c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tbad exponent field\n");
2692c282cdd60240868a116f70c680607c326f5517brobbiew			printf("bad exponent field\n");
270354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return (-1);
2712c282cdd60240868a116f70c680607c326f5517brobbiew		}
272354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		v3 = 10 * (int)(*str - '0');
2732c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
2742c282cdd60240868a116f70c680607c326f5517brobbiew		if (!isdigit(*str)) {
2752c282cdd60240868a116f70c680607c326f5517brobbiew			fprintf(temp, "\tbad exponent field\n");
2762c282cdd60240868a116f70c680607c326f5517brobbiew			printf("bad exponent field\n");
277354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			return (-1);
2782c282cdd60240868a116f70c680607c326f5517brobbiew		}
279354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		v3 += (int)(*str - '0');
2802c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
281354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		for (i = 0; i < v3; i++) {
2822c282cdd60240868a116f70c680607c326f5517brobbiew			if (e_flag > 0)
2832c282cdd60240868a116f70c680607c326f5517brobbiew				val *= 10.0;
2842c282cdd60240868a116f70c680607c326f5517brobbiew			else
2852c282cdd60240868a116f70c680607c326f5517brobbiew				val *= 0.1;
2862c282cdd60240868a116f70c680607c326f5517brobbiew		}
2872c282cdd60240868a116f70c680607c326f5517brobbiew	}
2882c282cdd60240868a116f70c680607c326f5517brobbiew
2892c282cdd60240868a116f70c680607c326f5517brobbiew	if (neg_flag)
2902c282cdd60240868a116f70c680607c326f5517brobbiew		val *= -1.0;
2912c282cdd60240868a116f70c680607c326f5517brobbiew
2922c282cdd60240868a116f70c680607c326f5517brobbiew#ifdef DEBUG
2932c282cdd60240868a116f70c680607c326f5517brobbiew	printf("Third conversion, val = %f = %e\n", val, val);
2942c282cdd60240868a116f70c680607c326f5517brobbiew	printf("v1 = %f, v2 = %f, v3 = %d\n", v1, v2, v3);
2952c282cdd60240868a116f70c680607c326f5517brobbiew#endif
2962c282cdd60240868a116f70c680607c326f5517brobbiew
2972c282cdd60240868a116f70c680607c326f5517brobbiew	switch (*str) {
2982c282cdd60240868a116f70c680607c326f5517brobbiew	case '\0':
2992c282cdd60240868a116f70c680607c326f5517brobbiew	case ' ':
3002c282cdd60240868a116f70c680607c326f5517brobbiew	case '\t':
3012c282cdd60240868a116f70c680607c326f5517brobbiew	case '\n':
3022c282cdd60240868a116f70c680607c326f5517brobbiew		break;
3032c282cdd60240868a116f70c680607c326f5517brobbiew	default:
3042c282cdd60240868a116f70c680607c326f5517brobbiew		printf("unexpected char '%c'\n", *str);
305354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return (-1);
3062c282cdd60240868a116f70c680607c326f5517brobbiew	}
3072c282cdd60240868a116f70c680607c326f5517brobbiew
3082c282cdd60240868a116f70c680607c326f5517brobbiew	*rval = val;
309354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return (0);
3102c282cdd60240868a116f70c680607c326f5517brobbiew}
3112c282cdd60240868a116f70c680607c326f5517brobbiew
312829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic int checkbuf(char *str, int n1, int n2)
3132c282cdd60240868a116f70c680607c326f5517brobbiew{
3142c282cdd60240868a116f70c680607c326f5517brobbiew	register int bd;	/* before decimal point */
3152c282cdd60240868a116f70c680607c326f5517brobbiew	register int ad;	/* after decimal point */
3162c282cdd60240868a116f70c680607c326f5517brobbiew	register int tw;	/* total width */
3172c282cdd60240868a116f70c680607c326f5517brobbiew	register int dp;	/* decimal point */
3182c282cdd60240868a116f70c680607c326f5517brobbiew	char *buf;
3192c282cdd60240868a116f70c680607c326f5517brobbiew
3202c282cdd60240868a116f70c680607c326f5517brobbiew	bd = ad = dp = 0;
3212c282cdd60240868a116f70c680607c326f5517brobbiew	buf = str;
3222c282cdd60240868a116f70c680607c326f5517brobbiew
3232c282cdd60240868a116f70c680607c326f5517brobbiew	while (*str && *str != '.') {
3242c282cdd60240868a116f70c680607c326f5517brobbiew		bd++;
3252c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
3262c282cdd60240868a116f70c680607c326f5517brobbiew	}
3272c282cdd60240868a116f70c680607c326f5517brobbiew	if (*str == '.') {
3282c282cdd60240868a116f70c680607c326f5517brobbiew		dp++;
3292c282cdd60240868a116f70c680607c326f5517brobbiew		str++;
3302c282cdd60240868a116f70c680607c326f5517brobbiew		if (*str) {
3312c282cdd60240868a116f70c680607c326f5517brobbiew			while (*str) {
3322c282cdd60240868a116f70c680607c326f5517brobbiew				ad++;
3332c282cdd60240868a116f70c680607c326f5517brobbiew				str++;
3342c282cdd60240868a116f70c680607c326f5517brobbiew			}
3352c282cdd60240868a116f70c680607c326f5517brobbiew		}
3362c282cdd60240868a116f70c680607c326f5517brobbiew	}
3372c282cdd60240868a116f70c680607c326f5517brobbiew
3382c282cdd60240868a116f70c680607c326f5517brobbiew	tw = bd + dp + ad;
3392c282cdd60240868a116f70c680607c326f5517brobbiew	if (!n1)
3402c282cdd60240868a116f70c680607c326f5517brobbiew		n1++;
3412c282cdd60240868a116f70c680607c326f5517brobbiew	if (tw < n1) {
3422c282cdd60240868a116f70c680607c326f5517brobbiew		fprintf(temp, "\tWidth too small.\n");
3432c282cdd60240868a116f70c680607c326f5517brobbiew		fprintf(temp, "\tn1 = %d, n2 = %d, buf= '%s'\n", n1, n2, buf);
3442c282cdd60240868a116f70c680607c326f5517brobbiew		return (-1);
3452c282cdd60240868a116f70c680607c326f5517brobbiew	}
3462c282cdd60240868a116f70c680607c326f5517brobbiew
3472c282cdd60240868a116f70c680607c326f5517brobbiew	if (ad != n2) {
3482c282cdd60240868a116f70c680607c326f5517brobbiew		fprintf(temp, "\tNumber after decimal wrong.\n");
3492c282cdd60240868a116f70c680607c326f5517brobbiew		fprintf(temp, "\tn1 = %d, n2 = %d, buf= '%s'\n", n1, n2, buf);
3502c282cdd60240868a116f70c680607c326f5517brobbiew		return (-1);
3512c282cdd60240868a116f70c680607c326f5517brobbiew	}
3522c282cdd60240868a116f70c680607c326f5517brobbiew
3532c282cdd60240868a116f70c680607c326f5517brobbiew	if (n2 && !dp) {
3542c282cdd60240868a116f70c680607c326f5517brobbiew		fprintf(temp, "\tMissed decimal point.\n");
3552c282cdd60240868a116f70c680607c326f5517brobbiew		fprintf(temp, "\tn1 = %d, n2 = %d, buf= '%s'\n", n1, n2, buf);
3562c282cdd60240868a116f70c680607c326f5517brobbiew		return (-1);
3572c282cdd60240868a116f70c680607c326f5517brobbiew	}
3582c282cdd60240868a116f70c680607c326f5517brobbiew
359354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return (0);
3602c282cdd60240868a116f70c680607c326f5517brobbiew}
3612c282cdd60240868a116f70c680607c326f5517brobbiew
3622c282cdd60240868a116f70c680607c326f5517brobbiew/**	LTP Port	**/
363829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic void setup(void)
3642c282cdd60240868a116f70c680607c326f5517brobbiew{
3654b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	temp = stderr;
3662c282cdd60240868a116f70c680607c326f5517brobbiew}
3672c282cdd60240868a116f70c680607c326f5517brobbiew
368829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic void blenter(void)
3692c282cdd60240868a116f70c680607c326f5517brobbiew{
3704b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	local_flag = PASSED;
3712c282cdd60240868a116f70c680607c326f5517brobbiew}
3722c282cdd60240868a116f70c680607c326f5517brobbiew
373829ac9d177bb1c713f1fe4266bdc44792b8c556dMike Frysingerstatic void blexit(void)
3742c282cdd60240868a116f70c680607c326f5517brobbiew{
3754b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	if (local_flag == PASSED)
3764b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		tst_resm(TPASS, "Test passed");
3774b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	else
3784b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		tst_resm(TFAIL, "Test failed");
379ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
380