cprover
string2int.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Michael Tautschnig, michael.tautschnig@cs.ox.ac.uk
6 
7 \*******************************************************************/
8 
9 #include "string2int.h"
10 
11 #include <cerrno>
12 #include <cstdlib>
13 #include <limits>
14 #include <cassert>
15 
16 template <typename T>
17 inline T str2number(const char *str, int base, bool safe)
18 {
19  int errno_bak=errno;
20  errno=0;
21  char * endptr;
22 // _strtoi64 is available in Visual Studio, but not yet in MINGW
23 #ifdef _MSC_VER
24  const __int64 val=_strtoi64(str, &endptr, base);
25 #else
26  const long long val=strtoll(str, &endptr, base);
27 #endif
28 
29  if(safe)
30  {
31  assert(0 == errno);
32  errno=errno_bak;
33  assert(endptr!=str);
34  if(std::numeric_limits<T>::min()==0)
35  {
36  // unsigned
37  assert(val >= 0);
38  assert((T)val <= std::numeric_limits<T>::max());
39  }
40  else
41  {
42  // signed
43  assert(val <= (long long)std::numeric_limits<T>::max());
44  assert(val >= (long long)std::numeric_limits<T>::min());
45  }
46  }
47 
48  return (T)val;
49 }
50 
51 unsigned safe_string2unsigned(const std::string &str, int base)
52 {
53  return str2number<unsigned>(str.c_str(), base, true);
54 }
55 
56 std::size_t safe_string2size_t(const std::string &str, int base)
57 {
58  return str2number<std::size_t>(str.c_str(), base, true);
59 }
60 
61 int unsafe_string2int(const std::string &str, int base)
62 {
63  return str2number<int>(str.c_str(), base, false);
64 }
65 
66 unsigned unsafe_string2unsigned(const std::string &str, int base)
67 {
68  return str2number<unsigned>(str.c_str(), base, false);
69 }
70 
71 std::size_t unsafe_string2size_t(const std::string &str, int base)
72 {
73  return str2number<std::size_t>(str.c_str(), base, false);
74 }
75 
76 signed long long int unsafe_string2signedlonglong(
77  const std::string &str,
78  int base)
79 {
80  return str2number<signed long long int>(str.c_str(), base, false);
81 }
82 
83 unsigned long long int unsafe_string2unsignedlonglong(
84  const std::string &str,
85  int base)
86 {
87  return str2number<unsigned long long int>(str.c_str(), base, false);
88 }
unsigned unsafe_string2unsigned(const std::string &str, int base)
Definition: string2int.cpp:66
std::size_t safe_string2size_t(const std::string &str, int base)
Definition: string2int.cpp:56
signed long long int unsafe_string2signedlonglong(const std::string &str, int base)
Definition: string2int.cpp:76
T str2number(const char *str, int base, bool safe)
Definition: string2int.cpp:17
unsigned long long int unsafe_string2unsignedlonglong(const std::string &str, int base)
Definition: string2int.cpp:83
std::size_t unsafe_string2size_t(const std::string &str, int base)
Definition: string2int.cpp:71
unsigned safe_string2unsigned(const std::string &str, int base)
Definition: string2int.cpp:51
int unsafe_string2int(const std::string &str, int base)
Definition: string2int.cpp:61