From dad75eb4a8d5835ecc795d7a7978e7702e4d5912 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Sat, 13 Jun 2020 12:32:00 +1200 Subject: Have pg_itoa, pg_ltoa and pg_lltoa return the length of the string Core by no means makes excessive use of these functions, but quite a large number of those usages do require the caller to call strlen() on the returned string. This is quite wasteful since these functions do already have a good idea of the length of the string, so we might as well just have them return that. Reviewed-by: Andrew Gierth Discussion: https://postgr.es/m/CAApHDvrm2A5x2uHYxsqriO2cUaGcFvND%2BksC9e7Tjep0t2RK_A%40mail.gmail.com --- src/backend/utils/adt/numutils.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'src/backend/utils/adt/numutils.c') diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c index a9d3fbf758f..412ae361d2c 100644 --- a/src/backend/utils/adt/numutils.c +++ b/src/backend/utils/adt/numutils.c @@ -327,16 +327,17 @@ invalid_syntax: /* * pg_itoa: converts a signed 16-bit integer to its string representation + * and returns strlen(a). * * Caller must ensure that 'a' points to enough memory to hold the result * (at least 7 bytes, counting a leading sign and trailing NUL). * * It doesn't seem worth implementing this separately. */ -void +int pg_itoa(int16 i, char *a) { - pg_ltoa((int32) i, a); + return pg_ltoa((int32) i, a); } /* @@ -404,25 +405,27 @@ pg_ultoa_n(uint32 value, char *a) } /* - * NUL-terminate the output of pg_ultoa_n. + * pg_ltoa: converts a signed 32-bit integer to its string representation and + * returns strlen(a). * * It is the caller's responsibility to ensure that a is at least 12 bytes long, * which is enough room to hold a minus sign, a maximally long int32, and the * above terminating NUL. */ -void +int pg_ltoa(int32 value, char *a) { uint32 uvalue = (uint32) value; - int len; + int len = 0; if (value < 0) { uvalue = (uint32) 0 - uvalue; - *a++ = '-'; + a[len++] = '-'; } - len = pg_ultoa_n(uvalue, a); + len += pg_ultoa_n(uvalue, a + len); a[len] = '\0'; + return len; } /* @@ -510,24 +513,27 @@ pg_ulltoa_n(uint64 value, char *a) } /* - * pg_lltoa: convert a signed 64-bit integer to its string representation + * pg_lltoa: converts a signed 64-bit integer to its string representation and + * returns strlen(a). * * Caller must ensure that 'a' points to enough memory to hold the result * (at least MAXINT8LEN + 1 bytes, counting a leading sign and trailing NUL). */ -void +int pg_lltoa(int64 value, char *a) { - int len; uint64 uvalue = value; + int len = 0; if (value < 0) { - *a++ = '-'; uvalue = (uint64) 0 - uvalue; + a[len++] = '-'; } - len = pg_ulltoa_n(uvalue, a); - a[len] = 0; + + len += pg_ulltoa_n(uvalue, a + len); + a[len] = '\0'; + return len; } -- cgit v1.2.3