aboutsummaryrefslogtreecommitdiffstats
path: root/src/zstr_length.c
blob: 4edabb0c3cde38f8bf52353216c09d8c28ee2e06 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/* See LICENSE file for copyright and license details. */
#include "internals"

#define num  libzahl_tmp_str_num
#define mag  libzahl_tmp_str_mag
#define div  libzahl_tmp_str_div


size_t
zstr_length(z_t a, unsigned long long int radix)
{
	size_t size_total = 1, size_temp;
	zset(num, a);
	while (!zzero(num)) {
		zsetu(mag, radix);
		zset(div, mag);
		size_temp = 1;
		while (zcmpmag(mag, num) <= 0) {
			zset(div, mag);
			zsqr(mag, mag);
			size_temp <<= 1;
		}
		size_temp >>= 1;
		size_total += size_temp;
		zdiv(num, num, div);
	}
	return size_total;
}