summaryrefslogtreecommitdiffstats
path: root/lib/ltostr.c
blob: e28be31fa80fa8d3eaa9f9fc27c8ed7dc0d4b8b3 (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
#include "format.h"

size_t
ltostr(char *s, size_t limit, unsigned long l, bool sgn, int radix)
{
    size_t si = 0;
    size_t digits = 0;
    if((long)l < 0 && sgn) {
        l = -((long)l);
        s[0] = '-';
    }
    for(unsigned long lv = l; lv != 0; lv /= radix)
        digits++;
    digits = digits > limit ? limit : digits;

    if(digits-- == 0)
        s[si++] = '0'; 
    for(unsigned long lv = l; lv != 0; lv /= radix)
    {
        if(si >= limit) return si;
        int digit = lv % radix;
        s[(digits - si)] = (digit >= 10 ? (digit + 'a' - 10) : digit + '0');
        si++;
    }
    return si;
}