Skip to content

Commit b4d4198

Browse files
Add builtin class for string_to_upper_case
1 parent 0eb2e25 commit b4d4198

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

src/solvers/refinement/string_builtin_function.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,23 @@ optionalt<exprt> string_to_lower_case_builtin_functiont::eval(
206206
return make_string(input_opt.value(), type);
207207
}
208208

209+
optionalt<exprt> string_to_upper_case_builtin_functiont::eval(
210+
const std::function<exprt(const exprt &)> &get_value) const
211+
{
212+
auto input_opt = eval_string(input, get_value);
213+
if(!input_opt)
214+
return {};
215+
for(mp_integer &c : input_opt.value())
216+
{
217+
if('a' <= c && c <= 'z')
218+
c -= 0x20;
219+
}
220+
const auto length =
221+
from_integer(input_opt.value().size(), result.length().type());
222+
const array_typet type(result.type().subtype(), length);
223+
return make_string(input_opt.value(), type);
224+
}
225+
209226
std::vector<mp_integer> string_insertion_builtin_functiont::eval(
210227
const std::vector<mp_integer> &input1_value,
211228
const std::vector<mp_integer> &input2_value,

src/solvers/refinement/string_builtin_function.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,37 @@ class string_to_lower_case_builtin_functiont
210210
};
211211
};
212212

213+
class string_to_upper_case_builtin_functiont
214+
: public string_transformation_builtin_functiont
215+
{
216+
public:
217+
string_to_upper_case_builtin_functiont(
218+
const exprt &return_code,
219+
const std::vector<exprt> &fun_args,
220+
array_poolt &array_pool)
221+
: string_transformation_builtin_functiont(return_code, fun_args, array_pool)
222+
{
223+
}
224+
225+
optionalt<exprt>
226+
eval(const std::function<exprt(const exprt &)> &get_value) const override;
227+
228+
std::string name() const override
229+
{
230+
return "to_upper_case";
231+
}
232+
233+
exprt add_constraints(string_constraint_generatort &generator) const override
234+
{
235+
return generator.add_axioms_for_to_upper_case(result, input);
236+
};
237+
238+
exprt length_constraint() const override
239+
{
240+
return equal_exprt(result.length(), input.length());
241+
};
242+
};
243+
213244
/// String inserting a string into another one
214245
class string_insertion_builtin_functiont : public string_builtin_functiont
215246
{

src/solvers/refinement/string_constraint_generator.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ class string_constraint_generatort final
178178
exprt add_axioms_for_to_lower_case(
179179
const array_string_exprt &res,
180180
const array_string_exprt &str);
181+
exprt add_axioms_for_to_upper_case(
182+
const array_string_exprt &res,
183+
const array_string_exprt &expr);
181184

182185
private:
183186
symbol_exprt fresh_boolean(const irep_idt &prefix);
@@ -338,9 +341,6 @@ class string_constraint_generatort final
338341
exprt add_axioms_for_substring(const function_application_exprt &f);
339342
exprt add_axioms_for_to_lower_case(const function_application_exprt &f);
340343
exprt add_axioms_for_to_upper_case(const function_application_exprt &f);
341-
exprt add_axioms_for_to_upper_case(
342-
const array_string_exprt &res,
343-
const array_string_exprt &expr);
344344
exprt add_axioms_for_trim(const function_application_exprt &f);
345345

346346
exprt add_axioms_for_code_point(

src/solvers/refinement/string_refinement_util.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,10 @@ static std::unique_ptr<string_builtin_functiont> to_string_builtin_function(
236236
return util_make_unique<string_to_lower_case_builtin_functiont>(
237237
return_code, fun_app.arguments(), array_pool);
238238

239+
if(id == ID_cprover_string_to_upper_case_func)
240+
return util_make_unique<string_to_upper_case_builtin_functiont>(
241+
return_code, fun_app.arguments(), array_pool);
242+
239243
return util_make_unique<string_builtin_function_with_no_evalt>(
240244
return_code, fun_app, array_pool);
241245
}

0 commit comments

Comments
 (0)