diff --git a/libc/Makefile b/libc/Makefile index a471c455..46e97037 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -126,8 +126,11 @@ strrchr.o \ strsignal.o \ strspn.o \ strstr.o \ +strtod.o \ +strtof.o \ strtok.o \ strtok_r.o \ +strtold.o \ strxfrm.o \ time/asctime.o \ time/asctime_r.o \ diff --git a/libc/atof.cpp b/libc/atof.cpp index fa1be629..b3b970e6 100644 --- a/libc/atof.cpp +++ b/libc/atof.cpp @@ -23,59 +23,8 @@ *******************************************************************************/ #include -#include - -// TODO: This horribly hacky code is taken from sdlquake's common.c, which is -// licensed under the GPL. Since most Sortix software is GPL-compatible -// this will do for now. It's a temporary measure until I get around to -// writing a real strtod function - most of them are true horrors. extern "C" double atof(const char* str) { - int sign = *str == '-' ? (str++, -1) : 1; - double val = 0.0; - - if ( str[0] == '0' && (str[1] == 'x' || str[1] == 'X') ) - { - str += 2; - while ( true ) - { - char c = *str++; - if ( '0' <= c && c <= '9' ) - val = val * 16 + c - '0'; - else if ( 'a' <= c && c <= 'f' ) - val = val * 16 + c - 'a' + 10; - else if ( 'A' <= c && c <= 'F' ) - val = val * 16 + c - 'A' + 10; - else - return val * sign; - } - } - - int decimal = -1; - int total = 0; - while ( true ) - { - char c = *str++; - if (c == '.') - { - decimal = total; - continue; - } - if ( c < '0' || c > '9' ) - break; - val = val * 10 + c - '0'; - total++; - } - - if ( decimal == -1 ) - return val * sign; - - while ( decimal < total ) - { - val /= 10; - total--; - } - - return val * sign; + return strtod(str, NULL); } diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 892cb12f..cda18afe 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -95,7 +95,10 @@ void* realloc(void*, size_t); char* realpath(const char* __restrict, char* __restrict); int setenv(const char*, const char*, int); void srand(unsigned); +double strtod(const char* __restrict, char** __restrict); +float strtof(const char* __restrict, char** __restrict); long strtol(const char* __restrict, char** __restrict, int); +long double strtold(const char* __restrict, char** __restrict); unsigned long strtoul(const char* __restrict, char** __restrict, int); unsigned long long strtoull(const char* __restrict, char** __restrict, int); long long strtoll(const char* __restrict, char** __restrict, int); @@ -146,9 +149,6 @@ void setkey(const char*); char* setstate(char*); void srand48(long); void srandom(unsigned); -double strtod(const char* __restrict, char** __restrict); -float strtof(const char* __restrict, char** __restrict); -long double strtold(const char* __restrict, char** __restrict); int unlockpt(int); #if __POSIX_OBSOLETE <= 200801 diff --git a/libc/strtod.cpp b/libc/strtod.cpp new file mode 100644 index 00000000..72c35372 --- /dev/null +++ b/libc/strtod.cpp @@ -0,0 +1,28 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + strtod.cpp + Converts floating numbers represented as strings to binary representation. + +*******************************************************************************/ + +#define FLOAT double +#define STRTOF strtod + +#include "strtof.cpp" diff --git a/libc/strtof.cpp b/libc/strtof.cpp new file mode 100644 index 00000000..2ed84e61 --- /dev/null +++ b/libc/strtof.cpp @@ -0,0 +1,94 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + strtof.cpp + Converts floating numbers represented as strings to binary representation. + +*******************************************************************************/ + +#ifndef FLOAT +#define FLOAT float +#define STRTOF strtof +#endif + +#include +#include + +// TODO: This horribly hacky code is taken from sdlquake's common.c, which is +// licensed under the GPL. Since most Sortix software is GPL-compatible +// this will do for now. It's a temporary measure until I get around to +// writing a real strtod function - most of them are true horrors. + +extern "C" FLOAT STRTOF(const char* str, char** nptr) +{ + int sign = *str == '-' ? (str++, -1) : 1; + FLOAT val = 0.0; + + if ( false ) + { + out: + if ( nptr ) + *nptr = (char*) str; + return val * sign; + } + + if ( str[0] == '0' && (str[1] == 'x' || str[1] == 'X') ) + { + str += 2; + while ( true ) + { + char c = *str++; + if ( '0' <= c && c <= '9' ) + val = val * 16 + c - '0'; + else if ( 'a' <= c && c <= 'f' ) + val = val * 16 + c - 'a' + 10; + else if ( 'A' <= c && c <= 'F' ) + val = val * 16 + c - 'A' + 10; + else + goto out; + } + } + + int decimal = -1; + int total = 0; + while ( true ) + { + char c = *str++; + if (c == '.') + { + decimal = total; + continue; + } + if ( c < '0' || c > '9' ) + break; + val = val * 10 + c - '0'; + total++; + } + + if ( decimal == -1 ) + goto out; + + while ( decimal < total ) + { + val /= 10; + total--; + } + + goto out; +} diff --git a/libc/strtold.cpp b/libc/strtold.cpp new file mode 100644 index 00000000..61f850b2 --- /dev/null +++ b/libc/strtold.cpp @@ -0,0 +1,28 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + strtold.cpp + Converts floating numbers represented as strings to binary representation. + +*******************************************************************************/ + +#define FLOAT long double +#define STRTOF strtold + +#include "strtof.cpp"