aboutsummaryrefslogtreecommitdiffstats
path: root/src/zstr_length.c
blob: 7554e784f50beb78280b0ca2b632f10642d3b1c4 (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
29
30
/* See LICENSE file for copyright and license details. */
#include "internals.h"

#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;
	if (check(radix < 2))
		libzahl_failure(-ZERROR_INVALID_RADIX);
	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 + (zsignum(a) < 0);
}