summaryrefslogtreecommitdiffstats
path: root/lib/itoa.c
blob: 57f0c22b601f9a3200176ab35de283874dbc3158 (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
31
32
#include "string.h"

int
ltostr(char *s, int size, unsigned long l, bool sign, int radix)
{
    unsigned wsize = 0;
    unsigned digits = 0;
    if((long)l < 0 && sign) {
        l = -((long)l);
        if(size > wsize && s != 0) s[wsize] = '-';
        wsize++;
    }

    for(unsigned long lv = l; lv != 0; lv /= radix) {
        digits++;
    }

    if(digits-- == 0) {
        if(size > wsize && s != 0) s[wsize] = '0';
        wsize++;
    }

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