CBMC
format_specifier.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Format specifiers for String.format
4 
5 Author: Romain Brenguier, Joel Allred
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_SOLVERS_STRINGS_FORMAT_SPECIFIER_H
13 #define CPROVER_SOLVERS_STRINGS_FORMAT_SPECIFIER_H
14 
15 #include <string>
16 #include <util/invariant.h>
17 #include <vector>
18 
19 // Format specifier describes how a value should be printed.
23 {
24 public:
25  // Constants describing the meaning of characters in format specifiers.
26  static const char DECIMAL_INTEGER = 'd';
27  static const char OCTAL_INTEGER = 'o';
28  static const char HEXADECIMAL_INTEGER = 'x';
29  static const char HEXADECIMAL_INTEGER_UPPER = 'X';
30  static const char SCIENTIFIC = 'e';
31  static const char SCIENTIFIC_UPPER = 'E';
32  static const char GENERAL = 'g';
33  static const char GENERAL_UPPER = 'G';
34  static const char DECIMAL_FLOAT = 'f';
35  static const char HEXADECIMAL_FLOAT = 'a';
36  static const char HEXADECIMAL_FLOAT_UPPER = 'A';
37  static const char CHARACTER = 'c';
38  static const char CHARACTER_UPPER = 'C';
39  static const char DATE_TIME = 't';
40  static const char DATE_TIME_UPPER = 'T';
41  static const char BOOLEAN = 'b';
42  static const char BOOLEAN_UPPER = 'B';
43  static const char STRING = 's';
44  static const char STRING_UPPER = 'S';
45  static const char HASHCODE = 'h';
46  static const char HASHCODE_UPPER = 'H';
47  static const char LINE_SEPARATOR = 'n';
48  static const char PERCENT_SIGN = '%';
49 
50  int index = -1;
51  std::string flag;
52  int width;
53  int precision;
54  // date/time
55  bool dt = false;
56  char conversion;
57 
59  int _index,
60  std::string _flag,
61  int _width,
62  int _precision,
63  bool _dt,
64  char conversion)
65  : index(_index),
66  flag(_flag),
67  width(_width),
68  precision(_precision),
69  dt(_dt),
71  {
72  }
73 };
74 
75 // Format text represent a constant part of a format string.
77 {
78 public:
79  format_textt() = default;
80 
81  explicit format_textt(std::string _content) : content(_content)
82  {
83  }
84 
86  {
87  }
88 
89  std::string get_content() const
90  {
91  return content;
92  }
93 
94 private:
95  std::string content;
96 };
97 
98 // A format element is either a specifier or text.
100 {
101 public:
102  typedef enum
103  {
106  } format_typet;
107 
108  explicit format_elementt(format_typet _type) : type(_type)
109  {
110  }
111 
112  explicit format_elementt(std::string s) : type(TEXT), fstring(s)
113  {
114  }
115 
117  {
118  fspec.push_back(fs);
119  }
120 
121  bool is_format_specifier() const
122  {
123  return type == SPECIFIER;
124  }
125 
126  bool is_format_text() const
127  {
128  return type == TEXT;
129  }
130 
132  {
134  return fspec.back();
135  }
136 
138  {
140  return fstring;
141  }
142 
144  {
146  return fstring;
147  }
148 
149 private:
152  std::vector<format_specifiert> fspec;
153 };
154 
160 std::vector<format_elementt> parse_format_string(std::string s);
161 
162 #endif // CPROVER_SOLVERS_STRINGS_FORMAT_SPECIFIER_H
format_textt::content
std::string content
Definition: format_specifier.h:95
format_specifiert::LINE_SEPARATOR
static const char LINE_SEPARATOR
Definition: format_specifier.h:47
format_specifiert::BOOLEAN
static const char BOOLEAN
Definition: format_specifier.h:41
format_specifiert::DECIMAL_FLOAT
static const char DECIMAL_FLOAT
Definition: format_specifier.h:34
format_specifiert::HEXADECIMAL_FLOAT
static const char HEXADECIMAL_FLOAT
Definition: format_specifier.h:35
format_specifiert::CHARACTER
static const char CHARACTER
Definition: format_specifier.h:37
format_specifiert::PERCENT_SIGN
static const char PERCENT_SIGN
Definition: format_specifier.h:48
format_specifiert::conversion
char conversion
Definition: format_specifier.h:56
invariant.h
format_specifiert::DATE_TIME_UPPER
static const char DATE_TIME_UPPER
Definition: format_specifier.h:40
format_specifiert::format_specifiert
format_specifiert(int _index, std::string _flag, int _width, int _precision, bool _dt, char conversion)
Definition: format_specifier.h:58
format_specifiert::STRING_UPPER
static const char STRING_UPPER
Definition: format_specifier.h:44
format_elementt::get_format_text
const format_textt & get_format_text() const
Definition: format_specifier.h:143
format_specifiert::HEXADECIMAL_FLOAT_UPPER
static const char HEXADECIMAL_FLOAT_UPPER
Definition: format_specifier.h:36
format_elementt
Definition: format_specifier.h:99
format_specifiert::STRING
static const char STRING
Definition: format_specifier.h:43
format_specifiert::HASHCODE_UPPER
static const char HASHCODE_UPPER
Definition: format_specifier.h:46
format_specifiert::HEXADECIMAL_INTEGER_UPPER
static const char HEXADECIMAL_INTEGER_UPPER
Definition: format_specifier.h:29
format_specifiert::HASHCODE
static const char HASHCODE
Definition: format_specifier.h:45
format_elementt::get_format_specifier
format_specifiert get_format_specifier() const
Definition: format_specifier.h:131
format_specifiert::index
int index
Definition: format_specifier.h:50
format_elementt::is_format_specifier
bool is_format_specifier() const
Definition: format_specifier.h:121
format_specifiert::DATE_TIME
static const char DATE_TIME
Definition: format_specifier.h:39
format_specifiert::precision
int precision
Definition: format_specifier.h:53
format_elementt::fspec
std::vector< format_specifiert > fspec
Definition: format_specifier.h:152
format_elementt::SPECIFIER
@ SPECIFIER
Definition: format_specifier.h:104
format_elementt::format_elementt
format_elementt(std::string s)
Definition: format_specifier.h:112
format_elementt::format_typet
format_typet
Definition: format_specifier.h:102
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
format_specifiert::GENERAL
static const char GENERAL
Definition: format_specifier.h:32
format_specifiert::DECIMAL_INTEGER
static const char DECIMAL_INTEGER
Definition: format_specifier.h:26
format_specifiert::dt
bool dt
Definition: format_specifier.h:55
format_specifiert::SCIENTIFIC_UPPER
static const char SCIENTIFIC_UPPER
Definition: format_specifier.h:31
format_textt::format_textt
format_textt(const format_textt &fs)
Definition: format_specifier.h:85
format_specifiert::GENERAL_UPPER
static const char GENERAL_UPPER
Definition: format_specifier.h:33
format_specifiert::OCTAL_INTEGER
static const char OCTAL_INTEGER
Definition: format_specifier.h:27
format_specifiert::width
int width
Definition: format_specifier.h:52
format_textt::format_textt
format_textt(std::string _content)
Definition: format_specifier.h:81
format_textt
Definition: format_specifier.h:76
format_specifiert
Field names follow the OpenJDK implementation: http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f9...
Definition: format_specifier.h:22
format_elementt::TEXT
@ TEXT
Definition: format_specifier.h:105
format_elementt::is_format_text
bool is_format_text() const
Definition: format_specifier.h:126
format_specifiert::SCIENTIFIC
static const char SCIENTIFIC
Definition: format_specifier.h:30
format_elementt::type
format_typet type
Definition: format_specifier.h:150
format_elementt::get_format_text
format_textt & get_format_text()
Definition: format_specifier.h:137
format_textt::get_content
std::string get_content() const
Definition: format_specifier.h:89
format_elementt::format_elementt
format_elementt(format_typet _type)
Definition: format_specifier.h:108
format_elementt::fstring
format_textt fstring
Definition: format_specifier.h:151
format_specifiert::CHARACTER_UPPER
static const char CHARACTER_UPPER
Definition: format_specifier.h:38
format_specifiert::BOOLEAN_UPPER
static const char BOOLEAN_UPPER
Definition: format_specifier.h:42
format_specifiert::HEXADECIMAL_INTEGER
static const char HEXADECIMAL_INTEGER
Definition: format_specifier.h:28
parse_format_string
std::vector< format_elementt > parse_format_string(std::string s)
Parse the given string into format specifiers and text.
Definition: format_specifier.cpp:48
format_textt::format_textt
format_textt()=default
format_specifiert::flag
std::string flag
Definition: format_specifier.h:51
format_elementt::format_elementt
format_elementt(format_specifiert fs)
Definition: format_specifier.h:116