Fixed bug 2050 - Obvious bugs in SDL_ltoa and SDL_lltoa pjz SDL_ltoa(-2147483648,s,10) only returns "-" because there is a bug in the code: if ( value < 0 ) { *bufp++ = '-'; value = -value; } but -(-2147483648) is still -2147483648 (0x80000000) as signed int (or long), so the following loop doesn't run at all. Similar bug are also in SDL_lltoa. BTW, there is no sanity check for radix.
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
diff --git a/src/stdlib/SDL_string.c b/src/stdlib/SDL_string.c
index 980f025..f923ae7 100644
--- a/src/stdlib/SDL_string.c
+++ b/src/stdlib/SDL_string.c
@@ -665,23 +665,9 @@ SDL_ltoa(long value, char *string, int radix)
if (value < 0) {
*bufp++ = '-';
- value = -value;
- }
- if (value) {
- while (value > 0) {
- *bufp++ = ntoa_table[value % radix];
- value /= radix;
- }
- } else {
- *bufp++ = '0';
- }
- *bufp = '\0';
-
- /* The numbers went into the string backwards. :) */
- if (*string == '-') {
- SDL_strrev(string + 1);
+ SDL_ultoa(-value, bufp, radix);
} else {
- SDL_strrev(string);
+ SDL_ultoa(value, bufp, radix);
}
return string;
@@ -723,23 +709,9 @@ SDL_lltoa(Sint64 value, char *string, int radix)
if (value < 0) {
*bufp++ = '-';
- value = -value;
- }
- if (value) {
- while (value > 0) {
- *bufp++ = ntoa_table[value % radix];
- value /= radix;
- }
- } else {
- *bufp++ = '0';
- }
- *bufp = '\0';
-
- /* The numbers went into the string backwards. :) */
- if (*string == '-') {
- SDL_strrev(string + 1);
+ SDL_ulltoa(-value, bufp, radix);
} else {
- SDL_strrev(string);
+ SDL_ulltoa(value, bufp, radix);
}
return string;