summaryrefslogtreecommitdiff
path: root/cpp11additionstringtointcpp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp11additionstringtointcpp.cpp')
-rw-r--r--cpp11additionstringtointcpp.cpp485
1 files changed, 485 insertions, 0 deletions
diff --git a/cpp11additionstringtointcpp.cpp b/cpp11additionstringtointcpp.cpp
new file mode 100644
index 0000000..50a9d17
--- /dev/null
+++ b/cpp11additionstringtointcpp.cpp
@@ -0,0 +1,485 @@
+#include "cpp11addition.h"
+#include <cstdio>
+#include <stdexcept>
+
+/// \todo, check number validity by http://en.cppreference.com/w/c/string/byte/strtol
+/* to check: bool my_strtol(const std::string &str, long &v) {
+char *end = nullptr;
+v = strtol(str.c_str(), &end, 10);
+return end != nullptr;
+}*/
+
+static const std::regex isaunsignednumber("^[0-9]+$",std::regex::optimize);
+static const std::regex isasignednumber("^-?[0-9]+$",std::regex::optimize);
+static const std::regex isadouble("^-?[0-9]+(\\.[0-9]+)?$",std::regex::optimize);
+
+uint8_t stringtouint8(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ unsigned int tempValue;
+ try {
+ tempValue = std::stoul(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(tempValue<=0xFF))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #else
+ if(Q_LIKELY(std::regex_match(string,isaunsignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoul(string);
+ if(Q_LIKELY(tempValue<=0xFF))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+uint16_t stringtouint16(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ unsigned int tempValue;
+ try {
+ tempValue = std::stoul(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(tempValue<=0xFFFF))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #else
+ if(Q_LIKELY(std::regex_match(string,isaunsignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoul(string);
+ if(Q_LIKELY(tempValue<=0xFFFF))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+uint32_t stringtouint32(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ uint32_t tempValue;
+ try {
+ tempValue = std::stoul(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ #else
+ if(Q_LIKELY(std::regex_match(string,isaunsignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoull(string);
+ if(Q_LIKELY(tempValue<=0xFFFFFFFF))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+bool stringtobool(const std::string &string,bool *ok)
+{
+ if(string=="1")
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return true;
+ }
+ if(string=="0")
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return false;
+ }
+ if(string=="true" || string=="t" /*postgresql*/ || string=="TRUE")
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return true;
+ }
+ if(string=="false" || string=="f" /*postgresql*/ || string=="FALSE")
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return false;
+ }
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return false;
+}
+
+uint64_t stringtouint64(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ uint64_t tempValue;
+ try {
+ tempValue = std::stoull(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ #else
+ if(Q_LIKELY(std::regex_match(string,isaunsignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stoull(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+int8_t stringtoint8(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ int tempValue;
+ try {
+ tempValue = std::stol(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(tempValue<=0x7F && tempValue>=-0x7F))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #else
+ if(Q_LIKELY(std::regex_match(string,isasignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoi(string);
+ if(Q_LIKELY(tempValue<=0x7F))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+int16_t stringtoint16(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ int tempValue;
+ try {
+ tempValue = std::stol(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(tempValue<=0x7FFF && tempValue>=-0x7FFF))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #else
+ if(Q_LIKELY(std::regex_match(string,isasignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoi(string);
+ if(Q_LIKELY(tempValue<=0x7FFF))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+int32_t stringtoint32(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ int32_t tempValue;
+ try {
+ tempValue = std::stol(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ #else
+ if(Q_LIKELY(std::regex_match(string,isasignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stoi(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+int64_t stringtoint64(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ int64_t tempValue;
+ try {
+ tempValue = std::stoll(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ #else
+ if(Q_LIKELY(std::regex_match(string,isasignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stoll(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+float stringtofloat(const std::string &string,bool *ok)
+{
+ if(Q_LIKELY(std::regex_match(string,isadouble)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stof(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+}
+
+double stringtodouble(const std::string &string,bool *ok)
+{
+ if(Q_LIKELY(std::regex_match(string,isadouble)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stod(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+}