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