tools/nolibc/stdlib: move ltoa() to stdlib.h
authorWilly Tarreau <w@1wt.eu>
Mon, 7 Feb 2022 16:23:26 +0000 (17:23 +0100)
committerPaul E. McKenney <paulmck@kernel.org>
Thu, 21 Apr 2022 00:05:43 +0000 (17:05 -0700)
This function is not standard and performs the opposite of atol(). Let's
move it with atol(). It's been split between a reentrant function and one
using a static buffer.

There's no more definition in nolibc.h anymore now.

Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
tools/include/nolibc/nolibc.h
tools/include/nolibc/stdlib.h

index 23fb81414b1bedf731ee0a11b796ba1bbad37b52..a349c88c45ffe3a598b70b78cba6f7888c78fe48 100644 (file)
 /* Used by programs to avoid std includes */
 #define NOLIBC
 
-static __attribute__((unused))
-const char *ltoa(long in)
-{
-       /* large enough for -9223372036854775808 */
-       static char buffer[21];
-       char       *pos = buffer + sizeof(buffer) - 1;
-       int         neg = in < 0;
-       unsigned long n = neg ? -in : in;
-
-       *pos-- = '\0';
-       do {
-               *pos-- = '0' + n % 10;
-               n /= 10;
-               if (pos < buffer)
-                       return pos + 1;
-       } while (n);
-
-       if (neg)
-               *pos-- = '-';
-       return pos + 1;
-}
-
 #endif /* _NOLIBC_H */
index 09a506aadbbe2168ba920a6141e36eea82ce565b..84fc4353fb0138c168ae8d0800fb92fcd0020f71 100644 (file)
@@ -45,6 +45,38 @@ int atoi(const char *s)
        return atol(s);
 }
 
+/* performs the opposite of atol() using a user-fed buffer. The buffer must be
+ * at least 21 bytes long (large enough for "-9223372036854775808").
+ */
+static __attribute__((unused))
+const char *ltoa_r(long in, char *buffer)
+{
+       char       *pos = buffer + 21 - 1;
+       int         neg = in < 0;
+       unsigned long n = neg ? -in : in;
+
+       *pos-- = '\0';
+       do {
+               *pos-- = '0' + n % 10;
+               n /= 10;
+               if (pos < buffer)
+                       return pos + 1;
+       } while (n);
+
+       if (neg)
+               *pos-- = '-';
+       return pos + 1;
+}
+
+/* performs the opposite of atol() using a statically allocated buffer */
+static __attribute__((unused))
+const char *ltoa(long in)
+{
+       /* large enough for -9223372036854775808 */
+       static char buffer[21];
+       return ltoa_r(in, buffer);
+}
+
 static __attribute__((unused))
 int msleep(unsigned int msecs)
 {