86 lines
2.4 KiB
C
86 lines
2.4 KiB
C
/*
|
|
Copyright (c) 2014 Galois Inc.
|
|
All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions
|
|
are met:
|
|
|
|
* Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
* Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in
|
|
the documentation and/or other materials provided with the
|
|
distribution.
|
|
|
|
* Neither the name of Galois, Inc. nor the names of its contributors
|
|
may be used to endorse or promote products derived from this
|
|
software without specific prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include <errno.h>
|
|
|
|
double atof(const char *s) {
|
|
|
|
// This function stolen from either Rolf Neugebauer or Andrew Tolmach.
|
|
// Probably Rolf.
|
|
double a = 0.0;
|
|
int e = 0;
|
|
int c;
|
|
|
|
while ((c = *s++) != '\0' && isdigit(c)) {
|
|
a = a*10.0 + (c - '0');
|
|
}
|
|
|
|
if (c == '.') {
|
|
while ((c = *s++) != '\0' && isdigit(c)) {
|
|
a = a*10.0 + (c - '0');
|
|
e = e-1;
|
|
}
|
|
}
|
|
|
|
if (c == 'e' || c == 'E') {
|
|
int sign = 1;
|
|
int i = 0;
|
|
c = *s++;
|
|
if (c == '+')
|
|
c = *s++;
|
|
else if (c == '-') {
|
|
c = *s++;
|
|
sign = -1;
|
|
}
|
|
while (isdigit(c)) {
|
|
i = i*10 + (c - '0');
|
|
c = *s++;
|
|
}
|
|
e += i*sign;
|
|
}
|
|
|
|
while (e > 0) {
|
|
a *= 10.0;
|
|
e--;
|
|
}
|
|
|
|
while (e < 0) {
|
|
a *= 0.1;
|
|
e++;
|
|
}
|
|
|
|
return a;
|
|
}
|