@@ -324,16 +324,43 @@ void string_constraint_generatort::add_default_axioms(
324
324
if (max_string_length!=std::numeric_limits<size_t >::max ())
325
325
axioms.push_back (s.axiom_for_length_le (max_string_length));
326
326
327
+ const exprt index_zero = from_integer (0 , s.length ().type ());
327
328
if (force_printable_characters)
328
- {
329
- symbol_exprt qvar=fresh_univ_index (" printable" , s.length ().type ());
330
- exprt chr=s[qvar];
331
- and_exprt printable (
332
- binary_relation_exprt (chr, ID_ge, from_integer (' ' , chr.type ())),
333
- binary_relation_exprt (chr, ID_le, from_integer (' ~' , chr.type ())));
334
- string_constraintt sc (qvar, s.length (), printable);
335
- axioms.push_back (sc);
336
- }
329
+ add_constraint_on_characters (s, index_zero, s.length (), " -~" );
330
+ }
331
+
332
+ // / Add constraint on characters of a string.
333
+ // /
334
+ // / This constraint is
335
+ // / \f$ \forall i \in [start, end), low\_char \le s[i] \le high\_char \f$
336
+ // / \param s: a string expression
337
+ // / \param start: index of the first character to constrain
338
+ // / \param end: index at which we stop adding constraints
339
+ // / \param char_set: a string of the form "<low_char>-<high_char>" where
340
+ // / `<low_char>` and `<high_char>` are two characters, which represents
341
+ // / the set of characters that are between `low_char` and `high_char`.
342
+ // / \return a string expression that is linked to the argument through axioms
343
+ // / that are added to the list
344
+ void string_constraint_generatort::add_constraint_on_characters (
345
+ const array_string_exprt &s,
346
+ const exprt &start,
347
+ const exprt &end,
348
+ const std::string &char_set)
349
+ {
350
+ // Parse char_set
351
+ PRECONDITION (char_set.length () == 3 );
352
+ PRECONDITION (char_set[1 ] == ' -' );
353
+ const char &low_char = char_set[0 ];
354
+ const char &high_char = char_set[2 ];
355
+
356
+ // Add constraint
357
+ const symbol_exprt qvar = fresh_univ_index (" char_constr" , s.length ().type ());
358
+ const exprt chr = s[qvar];
359
+ const and_exprt char_in_set (
360
+ binary_relation_exprt (chr, ID_ge, from_integer (low_char, chr.type ())),
361
+ binary_relation_exprt (chr, ID_le, from_integer (high_char, chr.type ())));
362
+ const string_constraintt sc (qvar, start, end, true_exprt (), char_in_set);
363
+ axioms.push_back (sc);
337
364
}
338
365
339
366
// / Adds creates a new array if it does not already exists
0 commit comments