OSDN Git Service

Bug ugly formatting update
[uclinux-h8/uClibc.git] / libc / stdlib / strtod.c
1 /*
2  * strtod.c - This file is part of the libc-8086 package for ELKS,
3  * Copyright (C) 1995, 1996 Nat Friedman <ndf@linux.mit.edu>.
4  * 
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Library General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Library General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Library General Public
16  *  License along with this library; if not, write to the Free
17  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  *
19  */
20 #include <stdlib.h>
21 #include <ctype.h>
22
23 float strtod(const char *nptr, char **endptr)
24 {
25         unsigned short negative;
26         float number;
27         float fp_part;
28         int exponent;
29         unsigned short exp_negative;
30
31         /* advance beyond any leading whitespace */
32         while (isspace(*nptr))
33                 nptr++;
34
35         /* check for optional '+' or '-' */
36         negative = 0;
37         if (*nptr == '-') {
38                 negative = 1;
39                 nptr++;
40         } else if (*nptr == '+')
41                 nptr++;
42
43         number = 0;
44         while (isdigit(*nptr)) {
45                 number = number * 10 + (*nptr - '0');
46                 nptr++;
47         }
48
49         if (*nptr == '.') {
50                 nptr++;
51                 fp_part = 0;
52                 while (isdigit(*nptr)) {
53                         fp_part = fp_part / 10.0 + (*nptr - '0') / 10.0;
54                         nptr++;
55                 }
56                 number += fp_part;
57         }
58
59         if (*nptr == 'e' || *nptr == 'E') {
60                 nptr++;
61                 exp_negative = 0;
62                 if (*nptr == '-') {
63                         exp_negative = 1;
64                         nptr++;
65                 } else if (*nptr == '+')
66                         nptr++;
67
68                 exponent = 0;
69                 while (isdigit(*nptr)) {
70                         exponent = exponent * 10 + (*nptr - '0');
71                         exponent++;
72                 }
73         }
74
75         while (exponent) {
76                 if (exp_negative)
77                         number /= 10;
78                 else
79                         number *= 10;
80                 exponent--;
81         }
82         return (negative ? -number : number);
83 }