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