diff --git a/d06/ex00/convert b/d06/ex00/convert index 08780ed..783618f 100755 Binary files a/d06/ex00/convert and b/d06/ex00/convert differ diff --git a/d06/ex00/convert.h b/d06/ex00/convert.h index e81e42c..eb32a59 100644 --- a/d06/ex00/convert.h +++ b/d06/ex00/convert.h @@ -2,9 +2,10 @@ # define CONVERT_H #include +#include #include #include // setw() -#include // isdigit() +#include // isdigit() isprint() #include // numeric_limits #include // strtod() #include // errno @@ -22,6 +23,12 @@ bool checkDouble(std::string str); #define MIN_INT_1 "-2147483649" #define INT_MAX_LENGTH 10 #define MAX_FLOAT_INT_PRECISION "16777216" +#define MAX_FLOAT "340282346638528859811704183484516925440" +#define FLOAT_MAX_LENGTH 39 +#define MAX_DOUBLE "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" +#define DOUBLE_MAX_LENGTH 309 + +// for tests #define MAX_FLOAT_INT_PREC__1 "16777215" #define MAX_FLOAT_INT_PREC__2 "16777214" #define MAX_FLOAT_INT_PREC__3 "16777213" @@ -32,7 +39,6 @@ bool checkDouble(std::string str); #define MAX_FLOAT_INT_PREC_4 "16777220" #define MAX_FLOAT_INT_PREC_5 "16777221" #define MAX_FLOAT_INT_PREC_6 "16777222" -#define MAX_FLOAT "340282346638528859811704183484516925440" #define MAX_F__1 "340282346638528859811704183484516925439" #define MAX_F__2 "340282346638528859811704183484516925438" #define MAX_F__3 "340282346638528859811704183484516925437" @@ -43,7 +49,17 @@ bool checkDouble(std::string str); #define MAX_F_4 "340282346638528859811704183484516925444" #define MAX_F_5 "340282346638528859811704183484516925445" #define MAX_F_6 "340282346638528859811704183484516925446" -#define FLOAT_MAX_LENGTH 56 +#define MIN_DOUBLE "-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" +#define MAX_D__1 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858367" +#define MAX_D__2 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858366" +#define MAX_D__3 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858365" +#define MAX_D__4 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858364" +#define MAX_D_1 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858369" +#define MAX_D_2 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858370" +#define MAX_D_3 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858371" +#define MAX_D_4 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858372" +#define MAX_D_5 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858373" +#define MAX_D_6 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858374" // colors # define GRAY "\e[0;30m" diff --git a/d06/ex00/main.cpp b/d06/ex00/main.cpp index e59b463..b831ceb 100644 --- a/d06/ex00/main.cpp +++ b/d06/ex00/main.cpp @@ -104,6 +104,34 @@ int main(int ac, char **av) { convert("0"); convert("-42"); convert("42"); + convert("-1"); + convert("1"); + convert("2"); + convert("3"); + convert("4"); + convert("5"); + convert("29"); + convert("30"); + convert("31"); + convert("32"); + convert("33"); + convert("34"); + convert("35"); + convert("122"); + convert("123"); + convert("124"); + convert("125"); + convert("126"); + convert("127"); + convert("128"); + convert("129"); + convert("130"); + convert("253"); + convert("254"); + convert("255"); + convert("256"); + convert("257"); + convert("258"); convert(MAX_INT); convert(MIN_INT); convert(MAX_INT_1); @@ -185,6 +213,18 @@ int main(int ac, char **av) { convert(MAX_F_4".0"); convert(MAX_F_5".0"); convert(MAX_F_6".0"); + convert(MAX_DOUBLE".0"); + convert(MIN_DOUBLE".0"); + convert(MAX_D__1".0"); + convert(MAX_D__2".0"); + convert(MAX_D__3".0"); + convert(MAX_D__4".0"); + convert(MAX_D_1".0"); + convert(MAX_D_2".0"); + convert(MAX_D_3".0"); + convert(MAX_D_4".0"); + convert(MAX_D_5".0"); + convert(MAX_D_6".0"); return 0; } diff --git a/d06/ex00/srcs/checkChar.cpp b/d06/ex00/srcs/checkChar.cpp index 67c18c3..eba45de 100644 --- a/d06/ex00/srcs/checkChar.cpp +++ b/d06/ex00/srcs/checkChar.cpp @@ -13,10 +13,6 @@ void fromChar(char c) { std::cout << std::setw(7) << std::left << "double" << B_CYAN << d << RESET "\n"; } -char toChar(std::string str) { - return str[0]; -} - bool isChar(std::string str) { if (str.length() != 1 || isdigit(str[0])) return false; @@ -25,15 +21,12 @@ bool isChar(std::string str) { bool checkChar(std::string str) { char c; -std::cout << "char\n"; if (str.length() != 1 || isdigit(str[0])) return false; + c = str[0]; - c = toChar(str); - std::cout << B_YELLOW << str << RESET " is a char" - << " of value " - << B_CYAN << c << RESET << "\n"; + std::cout << B_CYAN << c << B_YELLOW " char" RESET "\n"; fromChar(c); return true; diff --git a/d06/ex00/srcs/checkDouble.cpp b/d06/ex00/srcs/checkDouble.cpp index aea3ba7..ae37981 100644 --- a/d06/ex00/srcs/checkDouble.cpp +++ b/d06/ex00/srcs/checkDouble.cpp @@ -1,63 +1,65 @@ #include "convert.h" -void fromDouble(double d) { - char c; - int i; - float f; +void fromDouble(double value) { + // char + std::cout << std::setw(7) << std::left << "char"; + if (value < 0 || value > std::numeric_limits::max()) + std::cout << B_RED << "impossible" << RESET "\n"; + else if (!isprint(value)) + std::cout << B_RED << "non displayable" << RESET "\n"; + else + std::cout << B_CYAN << static_cast(value) << RESET "\n"; - c = static_cast(d); - std::cout << std::setw(7) << std::left << "char" << B_CYAN << c << RESET "\n"; - i = static_cast(d); - std::cout << std::setw(7) << std::left << "int" << B_CYAN << i << RESET "\n"; - f = static_cast(d); - std::cout << std::setw(7) << std::left << "float" << B_CYAN << f << RESET "\n"; + // int + std::cout << std::setw(7) << std::left << "int"; + if (value < std::numeric_limits::min() + || value > std::numeric_limits::max() ) + std::cout << B_RED << "impossible" << RESET "\n"; + else + std::cout << B_CYAN << static_cast(value) << RESET "\n"; + + // float + std::cout << std::setw(7) << std::left << "float"; + if (value < std::numeric_limits::min() + || value > std::numeric_limits::max() ) + std::cout << B_RED << "impossible" << RESET "\n"; + else + std::cout << B_CYAN << static_cast(value) << RESET "\n"; } -//Char toChar(str) { -// char c; - -// std::istringstream(str) >> c; -// return c; -//} - bool isDouble(std::string str) { - size_t l; - std::string neg = ""; - if (str[0] == '-') - neg = "-"; + size_t l; + if (str[0] == '+' || str[0] == '-') str.erase(str.begin()); - if (!str.length()) + if (str.length() == 0) return false; if (!str.compare("inf") || !str.compare("nan")) return true; l = str.find_first_not_of("0123456789"); - if (l == std::string::npos || str[l] != '.') + if (l == std::string::npos || str[l] != '.' || l > DOUBLE_MAX_LENGTH) return false; - str.erase(0,l + 1); - if (str.find_first_not_of("0123456789") != std::string::npos) + if (str.find_first_not_of("0123456789", l + 1) != std::string::npos) + return false; + if (l < DOUBLE_MAX_LENGTH) + return true; + if (str.compare(0, l, MAX_DOUBLE) > 0) return false; - str.insert(0, neg); - strtod(str.c_str(), NULL); - if (errno == ERANGE) - return false; return true; } bool checkDouble(std::string str) { - -// double d; - -std::cout << "double\n"; + double d; if (!isDouble(str)) return false; -// d = toDouble(str); -// std::cout << "double"RESET" equal to : "B_CYAN << d << RESET << "\n"; -// fromDouble(d); + std::istringstream(str) >> d; + std::cout << B_CYAN << d << B_YELLOW " double" RESET "\n"; + fromDouble(d); + return true; } diff --git a/d06/ex00/srcs/checkFloat.cpp b/d06/ex00/srcs/checkFloat.cpp index 019fcf4..0db73d9 100644 --- a/d06/ex00/srcs/checkFloat.cpp +++ b/d06/ex00/srcs/checkFloat.cpp @@ -1,50 +1,61 @@ #include "convert.h" -//Char toChar(str) { -// -//} +void fromFloat(float value) { + // char + std::cout << std::setw(7) << std::left << "char"; + if (value < 0 || value > std::numeric_limits::max()) + std::cout << B_RED << "impossible" << RESET "\n"; + else if (!isprint(value)) + std::cout << B_RED << "non displayable" << RESET "\n"; + else + std::cout << B_CYAN << static_cast(value) << RESET "\n"; + + // int + std::cout << std::setw(7) << std::left << "int"; + if (value < std::numeric_limits::min() + || value > std::numeric_limits::max() ) + std::cout << B_RED << "impossible" << RESET "\n"; + else + std::cout << B_CYAN << static_cast(value) << RESET "\n"; + + // double + std::cout << std::setw(7) << std::left << "double"; + std::cout << B_CYAN << static_cast(value) << RESET "\n"; +} bool isFloat(std::string str) { size_t l; -// std::string float_xtrem = MAX_FLOAT; + size_t l2; if (str[0] == '+' || str[0] == '-') str.erase(str.begin()); -// if (str.length() == 0 || str.length() > FLOAT_MAX_LENGTH) if (str.length() == 0) return false; if (!str.compare("inff") || !str.compare("nanf")) return true; l = str.find_first_not_of("0123456789"); - if (l == std::string::npos || str[l] != '.') + if (l == std::string::npos || str[l] != '.' || l > FLOAT_MAX_LENGTH) return false; - str.erase(0,l + 1); - l = str.find_first_not_of("0123456789"); - if (l == std::string::npos || str[l] != 'f') + l2 = str.find_first_not_of("0123456789", l + 1); + if (l2 == std::string::npos || l2 != str.length() - 1 || str[l2] != 'f') + return false; + if (l < FLOAT_MAX_LENGTH) + return true; + if (str.compare(0, l, MAX_FLOAT) > 0) return false; - -// to work, one should check the decimal and the integer part -// str.erase(str.end() - 1); -// if (str.length() < FLOAT_MAX_LENGTH) -// return true; -// if (str.compare(float_xtrem) > 0) -// return false; return true; } bool checkFloat(std::string str) { - -// float f; - -std::cout << "float\n"; + float f; if (!isFloat(str)) return false; -// f = toFloat(str); -// std::cout << "float"RESET" equal to : "B_CYAN << f << RESET << "\n"; -// fromFloat(f); + std::istringstream(str) >> f; + std::cout << B_CYAN << f << B_YELLOW " float" RESET "\n"; + fromFloat(f); return true; } diff --git a/d06/ex00/srcs/checkInt.cpp b/d06/ex00/srcs/checkInt.cpp index 828eecb..4585c50 100644 --- a/d06/ex00/srcs/checkInt.cpp +++ b/d06/ex00/srcs/checkInt.cpp @@ -1,8 +1,23 @@ #include "convert.h" -//Char toInt(str) { -// -//} +void fromInt(int value) { + // char + std::cout << std::setw(7) << std::left << "char"; + if (value < 0 || value > std::numeric_limits::max()) + std::cout << B_RED << "impossible" << RESET "\n"; + else if (!isprint(value)) + std::cout << B_RED << "non displayable" << RESET "\n"; + else + std::cout << B_CYAN << static_cast(value) << RESET "\n"; + + // float + std::cout << std::setw(7) << std::left << "float" << B_CYAN + << static_cast(value) << RESET "\n"; + + // double + std::cout << std::setw(7) << std::left << "double" << B_CYAN + << static_cast(value) << RESET "\n"; +} bool isInt(std::string str) { std::string int_xtrem = MAX_INT; @@ -24,17 +39,14 @@ bool isInt(std::string str) { } bool checkInt(std::string str) { - -// int i; - -std::cout << "int\n"; + int i; if (!isInt(str)) return false; -// i = toInt(str); -// std::cout << "int"RESET" equal to : "B_CYAN << i << RESET << "\n"; -// fromInt(i); + std::istringstream(str) >> i; + std::cout << B_CYAN << i << B_YELLOW " int" RESET "\n"; + fromInt(i); return true; } diff --git a/d06/ex00/srcs/convert.cpp b/d06/ex00/srcs/convert.cpp index 655b190..ba1c1d7 100644 --- a/d06/ex00/srcs/convert.cpp +++ b/d06/ex00/srcs/convert.cpp @@ -2,27 +2,21 @@ #include #include "convert.h" -bool isElse(std::string str) { - std::cout << B_RED << str << CYAN " is not valid type for this exercise" RESET "\n"; - return true; -} - bool (*checkFunc[])(std::string str) = { checkChar, checkInt, checkFloat, checkDouble, - isElse }; void convert(std::string str) { - std::cout << B_BLUE << str << RESET "\n"; + std::cout << "\n" B_BLUE << str << RESET "\n"; int size = sizeof(checkFunc) / sizeof(checkFunc[0]); for (int it = 0; it < size; it++) if ((*checkFunc[it])(str)) - break; - std::cout << "\n"; + return ; + std::cout << B_RED "is not valid type for this exercise" RESET "\n"; }