summaryrefslogtreecommitdiff
path: root/libc/misc/internals/ltostr.c
blob: 7e45fec30996add10fda841d6e23b68e693c0e8c (plain)
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
33
34
35
36
37
38
39
/*
 * Copyright (C) 2000 Manuel Novoa III
 *
 * Note: buf is a pointer to the END of the buffer passed.
 * Call like this:
 *     char buf[SIZE], *p;
 *     p = __ltostr(buf + sizeof(buf) - 1, ...)
 *
 * For longs of 32 bits, appropriate buffer sizes are:
 *     base =  2      34  = 1 (possible -) sign + 32 digits + 1 nul
 *     base = 10      12  = 1 (possible -) sign + 10 digits + 1 nul
 *     base = 16      10  = 1 (possible -) sign + 8 hex digits + 1 nul
 */

extern char *__ultostr(char *buf, unsigned long uval, int base, int uppercase);

char *__ltostr(char *buf, long val, int base, int uppercase)
{
	unsigned long uval;
	char *pos;
    int negative;

	negative = 0;
    if (val < 0) {
		negative = 1;
		uval = ((unsigned long)(-(1+val))) + 1;
    } else {
		uval = val;
	}


    pos = __ultostr(buf, uval, base, uppercase);

    if (pos && negative) {
		*--pos = '-';
    }

    return pos;
}