]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/common/bits/uClibc_uintmaxtostr.h
update
[l4.git] / l4 / pkg / uclibc / lib / contrib / uclibc / libc / sysdeps / linux / common / bits / uClibc_uintmaxtostr.h
1 /*  Copyright (C) 2003     Manuel Novoa III
2  *
3  *  This library is free software; you can redistribute it and/or
4  *  modify it under the terms of the GNU Lesser General Public
5  *  License as published by the Free Software Foundation; either
6  *  version 2.1 of the License, or (at your option) any later version.
7  *
8  *  The GNU C Library is distributed in the hope that it will be useful,
9  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  *  Lesser General Public License for more details.
12  *
13  *  You should have received a copy of the GNU Lesser General Public
14  *  License along with the GNU C Library; see the file COPYING.LIB.  If
15  *  not, see <http://www.gnu.org/licenses/>.
16  */
17
18 /*  ATTENTION!   ATTENTION!   ATTENTION!   ATTENTION!   ATTENTION!
19  *
20  *  This code is currently under development.  Also, I plan to port
21  *  it to elks which is a 16-bit environment with a fairly limited
22  *  compiler.  Therefore, please refrain from modifying this code
23  *  and, instead, pass any bug-fixes, etc. to me.  Thanks.  Manuel
24  *
25  *  ATTENTION!   ATTENTION!   ATTENTION!   ATTENTION!   ATTENTION! */
26
27 #ifndef _UINTMAXTOSTR_H
28 #define _UINTMAXTOSTR_H 1
29
30 #include <features.h>
31 #include <limits.h>
32 #include <stdint.h>
33
34 #if INTMAX_MAX <= 2147483647L
35 #define __UIM_BUFLEN                    12 /* 10 digits + 1 nul + 1 sign */
36 #elif INTMAX_MAX <= 9223372036854775807LL
37 #define __UIM_BUFLEN                    22 /* 20 digits + 1 nul + 1 sign */
38 #else
39 #error unknown number of digits for intmax_t!
40 #endif
41
42 #ifdef LLONG_MAX                                /* --------------- */
43 #if LLONG_MAX <= 2147483647L
44 #define __UIM_BUFLEN_LLONG              12 /* 10 digits + 1 nul + 1 sign */
45 #elif LLONG_MAX <= 9223372036854775807LL
46 #define __UIM_BUFLEN_LLONG              22 /* 20 digits + 1 nul + 1 sign */
47 #else
48 #error unknown number of digits for long long!
49 #endif
50 #endif /* ULLONG_MAX ----------------------------- */
51
52 #if LONG_MAX <= 2147483647L
53 #define __UIM_BUFLEN_LONG               12 /* 10 digits + 1 nul + 1 sign */
54 #elif LONG_MAX <= 9223372036854775807LL
55 #define __UIM_BUFLEN_LONG               22 /* 20 digits + 1 nul + 1 sign */
56 #else
57 #error unknown number of digits for long!
58 #endif
59
60 #if INT_MAX <= 32767
61 #define __UIM_BUFLEN_INT                7 /* 10 digits + 1 nul + 1 sign */
62 #elif INT_MAX <= 2147483647L
63 #define __UIM_BUFLEN_INT                12 /* 10 digits + 1 nul + 1 sign */
64 #else
65 #error unknown number of digits for int!
66 #endif
67
68 typedef enum {
69         __UIM_DECIMAL = 0,
70         __UIM_GROUP = ',',                      /* Base 10 locale-dependent grouping. */
71         __UIM_LOWER = 'a' - 10,
72         __UIM_UPPER = 'A' - 10,
73 } __UIM_CASE;
74
75 /* Convert the int val to a string in base abs(base).  val is treated as
76  * an unsigned ??? int type if base > 0, and signed if base < 0.  This
77  * is an internal function with _no_ error checking done unless assert()s
78  * are enabled.
79  *
80  * Note: bufend is a pointer to the END of the buffer passed.
81  * Call like this:
82  *     char buf[SIZE], *p;
83  *     p = _xltostr(buf + sizeof(buf) - 1, {unsigned int},  10, __UIM_DECIMAL)
84  *     p = _xltostr(buf + sizeof(buf) - 1,          {int}, -10, __UIM_DECIMAL)
85  *
86  * WARNING: If base > 10, case _must_be_ either __UIM_LOWER or __UIM_UPPER
87  *          for lower and upper case alphas respectively.
88  * WARNING: If val is really a signed type, make sure base is negative!
89  *          Otherwise, you could overflow your buffer.
90  */
91 extern char *_uintmaxtostr(char * __restrict bufend, uintmax_t uval,
92                                         int base, __UIM_CASE alphacase) attribute_hidden;
93
94 /* TODO -- make this either a (possibly inline) function? */
95 #ifndef __BCC__
96 #define _int10tostr(bufend, intval) \
97         _uintmaxtostr((bufend), (intval), -10, __UIM_DECIMAL)
98 #else  /* bcc doesn't do prototypes, we need to explicitly cast */
99 #define _int10tostr(bufend, intval) \
100         _uintmaxtostr((bufend), (uintmax_t)(intval), -10, __UIM_DECIMAL)
101 #endif
102
103 #define __BUFLEN_INT10TOSTR             __UIM_BUFLEN_INT
104
105 #endif /* _UINTMAXTOSTR_H */