Add _parse_str interface.

Rewrite _set_str to use the _parse_str
This commit is contained in:
Patrick Pelissier committed 2018-05-03 12:59:58 +02:00
1 parent 2ad8ae3451
commit 6b24842704
2 files changed
+19 -7

No files matched your search

+14 -4
View File
@@ -523,22 +523,32 @@ bitset_in_str(bitset_t set, FILE *file)
}
static inline bool
bitset_set_str(bitset_t set, const char str[])
bitset_parse_str(bitset_t set, const char str[], const char **endptr)
{
BITSETI_CONTRACT (set);
assert(str != NULL);
bool success = false;
bitset_clean(set);
char c = *str++;
if (c != '[') return false;
if (c != '[') goto exit;
c = *str++;
do {
if (c != '0' && c != '1') return false;
if (c != '0' && c != '1') goto exit;
const bool b = (c == '1');
bitset_push_back (set, b);
c = *str++;
} while (c != ']' && c != 0);
BITSETI_CONTRACT (set);
return c == ']';
success = (c == ']');
exit:
if (endptr) *endptr = str;
return success;
}
static inline bool
bitset_set_str(bitset_t dest, const char str[])
{
return bitset_parse_str(dest, str, NULL);
}
static inline void
+5 -3
View File
@@ -105,15 +105,17 @@ static void test1(void)
assert (b == false);
assert (bitset_size(set) == 196);
bitset_set_str(set, "[1010101010101010101000000000000000000000000000000000000000000000000000001111]");
bitset_parse_str(set, "[1010101010101010101000000000000000000000000000000000000000000000000000001111]", NULL);
bitset_push_at(set, 23, true);
bitset_t set3;
bitset_init(set3);
bitset_set_str(set3, "[10101010101010101010000100000000000000000000000000000000000000000000000001111]");
bitset_parse_str(set3, "[10101010101010101010000100000000000000000000000000000000000000000000000001111]", NULL);
assert(bitset_equal_p(set, set3));
bitset_push_at(set, 25, true);
bitset_set_str(set3, "[101010101010101010100001010000000000000000000000000000000000000000000000001111]");
const char *sp;
bitset_parse_str(set3, "[101010101010101010100001010000000000000000000000000000000000000000000000001111]", &sp);
assert(bitset_equal_p(set, set3));
assert (*sp == 0);
bitset_clear(set3);
bitset_clean(set);