fix bug MIN_VALUE bug in ltoa and int64toa and add tests

pull/4286/head
Jan Tattermusch 9 years ago
parent f67f071f7e
commit 338ef4aa6c
  1. 26
      src/core/support/string.c
  2. 49
      test/core/support/string_test.c

@ -153,6 +153,7 @@ void gpr_reverse_bytes(char *str, int len) {
}
int gpr_ltoa(long value, char *string) {
unsigned long uval;
int i = 0;
int neg = value < 0;
@ -162,10 +163,14 @@ int gpr_ltoa(long value, char *string) {
return 1;
}
if (neg) value = -value;
while (value) {
string[i++] = (char)('0' + value % 10);
value /= 10;
if (neg) {
uval = -value;
} else {
uval = value;
}
while (uval) {
string[i++] = (char)('0' + uval % 10);
uval /= 10;
}
if (neg) string[i++] = '-';
gpr_reverse_bytes(string, i);
@ -174,6 +179,7 @@ int gpr_ltoa(long value, char *string) {
}
int gpr_int64toa(gpr_int64 value, char *string) {
gpr_uint64 uval;
int i = 0;
int neg = value < 0;
@ -183,10 +189,14 @@ int gpr_int64toa(gpr_int64 value, char *string) {
return 1;
}
if (neg) value = -value;
while (value) {
string[i++] = (char)('0' + value % 10);
value /= 10;
if (neg) {
uval = -value;
} else {
uval = value;
}
while (uval) {
string[i++] = (char)('0' + uval % 10);
uval /= 10;
}
if (neg) string[i++] = '-';
gpr_reverse_bytes(string, i);

@ -286,6 +286,53 @@ static void test_strsplit(void) {
gpr_free(parts);
}
test_ltoa() {
char *str;
char buf[GPR_LTOA_MIN_BUFSIZE];
LOG_TEST_NAME("test_ltoa");
/* zero */
GPR_ASSERT(1 == gpr_ltoa(0, buf));
GPR_ASSERT(0 == strcmp("0", buf));
/* positive number */
GPR_ASSERT(3 == gpr_ltoa(123, buf));
GPR_ASSERT(0 == strcmp("123", buf));
/* negative number */
GPR_ASSERT(6 == gpr_ltoa(-12345, buf));
GPR_ASSERT(0 == strcmp("-12345", buf));
/* large negative - we don't know the size of long in advance */
GPR_ASSERT(gpr_asprintf(&str, "%lld", (long long)LONG_MIN));
GPR_ASSERT(strlen(str) == gpr_ltoa(LONG_MIN, buf));
GPR_ASSERT(0 == strcmp(str, buf));
gpr_free(str);
}
test_int64toa() {
char buf[GPR_INT64TOA_MIN_BUFSIZE];
LOG_TEST_NAME("test_int64toa");
/* zero */
GPR_ASSERT(1 == gpr_int64toa(0, buf));
GPR_ASSERT(0 == strcmp("0", buf));
/* positive */
GPR_ASSERT(3 == gpr_int64toa(123, buf));
GPR_ASSERT(0 == strcmp("123", buf));
/* large positive */
GPR_ASSERT(19 == gpr_int64toa(9223372036854775807LL, buf));
GPR_ASSERT(0 == strcmp("9223372036854775807", buf));
/* large negative */
GPR_ASSERT(20 == gpr_int64toa(-9223372036854775808LL, buf));
GPR_ASSERT(0 == strcmp("-9223372036854775808", buf));
}
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
test_strdup();
@ -296,5 +343,7 @@ int main(int argc, char **argv) {
test_strjoin();
test_strjoin_sep();
test_strsplit();
test_ltoa();
test_int64toa();
return 0;
}

Loading…
Cancel
Save