//----------------------------------------------------------------------------// // GNU GPL OS/K // // // // Authors: spectral` // // NeoX // // // // Desc: Conversion utilities - itoa family // //----------------------------------------------------------------------------// #include // // Digits table for bases <=36 (unused) // #if 0 static const char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; #endif // // Integer to string in any base between 2 and 36 (included) // #if defined(_NEED_ITOA) #define _IL_MIN INT_MIN #define _IL_MIN_STRING "-2147483648" char *itoa(int i, char *str, int base) { int rem; #elif defined(_NEED_LTOA) #define _IL_MIN LONG_MIN #define _IL_MIN_STRING "-9223372036854775808" char *ltoa(long i, char *str, int base) { long rem; #elif defined(_NEED_UTOA) char *utoa(uint i, char *str, int base) { uint rem; #elif defined(_NEED_ULTOA) char *ultoa(ulong i, char *str, int base) { ulong rem; #else #error "What am I supposed to declare?" #endif char *orig = str; #if defined(_NEED_ITOA) || defined(_NEED_LTOA) // // Deal with negatives // int neg = 0; if (i < 0 && base == 10) { // // Handle INT_MIN and LONG_MIN... // if (__builtin_expect(i == _IL_MIN, 0)) { strcpy(orig, _IL_MIN_STRING); goto leave; } else { neg = 1; i = -i; } } #endif // // Only handle base 2 -> 36 // if (base < 2 || base > 36) { __set_errno(EINVAL); *orig = '\0'; goto leave; } // // Deal with zero separately // if (i == 0) { *str++ = '0'; *str = '\0'; goto leave; } // // Compute digits... in reverse order // while (i > 0) { rem = i % base; *str++ = (rem > 9) ? (rem - 10) + 'a' : rem + '0'; i /= base; } #if defined(_NEED_ITOA) || defined(_NEED_LTOA) if (neg) *str++ = '-'; #endif *str = '\0'; // // Reverse the string // orig = strrev2(orig); // // End of conversion // leave: return orig; }