3static bool base_valid(
const int base,
const struct clod_string alphabet) {
4 return 2 <= base && base <= 64 && base <= alphabet.
len;
7static int digit_count(uintmax_t value,
const int base) {
10 value /= (uintmax_t)base;
17 const struct clod_string alphabet,
const unsigned char base,
const unsigned char min_digits,
const unsigned char max_digits) {
18 if (!base_valid(base, alphabet)) {
32 if (!str->
ptr || str->
len < 2 || !base_valid(base, alphabet)) {
36 if (str->
ptr[0] !=
'+' && str->
ptr[0] !=
'-') {
44 if (str->
ptr[0] ==
'+') {
51 const struct clod_string alphabet,
const unsigned char base,
const unsigned char min_digits,
const unsigned char max_digits) {
52 if (!dst->
ptr || !base_valid(base, alphabet)) {
56 int size = digit_count(val, base);
57 if (max_digits && size > max_digits) size = max_digits;
58 if (size < min_digits) size = min_digits;
60 for (
int i = size - 1; i >= 0; i--) {
61 if (dst->
cap - dst->
len - i > 0) {
62 dst->
ptr[dst->
len + i] = alphabet.
ptr[val % (uintmax_t)base];
64 val /= (uintmax_t)base;
71 if (!str->
ptr || str->
len < 1 || !base_valid(base, alphabet)) {
76 while (str->
len > 0) {
78 if (!digit.
ptr || digit.
ptr - alphabet.
ptr >= base)
break;
80 result *= (uintmax_t)base;
81 result += (uintmax_t)(digit.
ptr - alphabet.
ptr);
CLOD_API size_t clod_string_put_int(struct clod_string *dst, intmax_t val, struct clod_string alphabet, unsigned char base, unsigned char min_digits, unsigned char max_digits)
CLOD_API size_t clod_string_put_uint(struct clod_string *dst, uintmax_t val, struct clod_string alphabet, unsigned char base, unsigned char min_digits, unsigned char max_digits)
CLOD_API struct clod_string clod_string_find(struct clod_string str, char elem, int occurrence)
CLOD_API uintmax_t clod_string_get_uint(struct clod_string *str, struct clod_string alphabet, unsigned char base)
void clod_string_put_char(struct clod_string *str, char c)
Append a single char to the end of the string.
CLOD_API intmax_t clod_string_get_int(struct clod_string *str, struct clod_string alphabet, unsigned char base)