aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/libc/test/run-snprintf.c
diff options
context:
space:
mode:
authorAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
committerAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
commitaf1a266670d040d2f4083ff309d732d648afba2a (patch)
tree2fc46203448ddcc6f81546d379abfaeb323575e9 /roms/skiboot/libc/test/run-snprintf.c
parente02cda008591317b1625707ff8e115a4841aa889 (diff)
Add submodule dependency filesHEADmaster
Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
Diffstat (limited to 'roms/skiboot/libc/test/run-snprintf.c')
-rw-r--r--roms/skiboot/libc/test/run-snprintf.c246
1 files changed, 246 insertions, 0 deletions
diff --git a/roms/skiboot/libc/test/run-snprintf.c b/roms/skiboot/libc/test/run-snprintf.c
new file mode 100644
index 000000000..946d446fa
--- /dev/null
+++ b/roms/skiboot/libc/test/run-snprintf.c
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+/*
+ * Copyright 2013-2015 IBM Corp.
+ */
+
+#define BUFSZ 50
+
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+int test1(void);
+int skiboot_snprintf(char *buf, size_t bufsz, size_t l, const char* format, ...);
+
+static void test_printf_0u(int n)
+{
+ char *buf, *buf2;
+ int blen;
+ unsigned int i;
+
+ for(i=1; i<10; i++)
+ {
+ blen = i+1;
+ if (n<0)
+ blen++;
+
+ buf = (char*)malloc(blen);
+ buf2 = (char*)malloc(blen);
+ skiboot_snprintf(buf, blen, blen, "%08u", n);
+ snprintf(buf2, blen, "%08u", n);
+ n = n * 10;
+ assert(0 == strncmp(buf, buf2, blen));
+ free(buf);
+ free(buf2);
+ }
+}
+
+static void test_printf_u(int n)
+{
+ char *buf, *buf2;
+ int blen;
+ unsigned int r;
+ unsigned int i;
+
+ for(i=1; i<10; i++)
+ {
+ blen = i+1;
+ if (n<0)
+ blen++;
+
+ buf = (char*)malloc(blen);
+ buf2 = (char*)malloc(blen);
+ r = skiboot_snprintf(buf, blen, blen, "%u", n);
+ snprintf(buf2, blen, "%u", n);
+ n = n * 10;
+ if (n<0)
+ assert(i+1 == r);
+ else
+ assert(i == r);
+ assert(0 == strncmp(buf, buf2, blen));
+ free(buf);
+ free(buf2);
+ }
+}
+
+static void test_printf_d(int n)
+{
+ char *buf, *buf2;
+ int blen;
+ int r;
+ int i;
+
+ for(i=1; i<10; i++)
+ {
+ blen = i+1;
+ if (n<0)
+ blen++;
+
+ buf = (char*)malloc(blen);
+ buf2 = (char*)malloc(blen);
+ r = skiboot_snprintf(buf, blen, blen, "%d", n);
+ snprintf(buf2, blen, "%d", n);
+ n = n * 10;
+ if (n<0)
+ assert(i+1 == r);
+ else
+ assert(i == r);
+ assert(0 == strncmp(buf, buf2, blen));
+ free(buf);
+ free(buf2);
+ }
+}
+
+static void test_printf_x(const char* f)
+{
+ char *buf, *buf2;
+ int blen;
+ int i, r;
+ unsigned int n=0x1;
+
+ for (i=0; i<8; i++)
+ {
+ blen = i+2;
+ buf = (char*)malloc(blen);
+ buf2 = (char*)malloc(blen);
+ r = skiboot_snprintf(buf, blen, blen, f, n);
+ snprintf(buf2, blen, f, n);
+ assert(i+1 == r);
+ assert(0 == strncmp(buf, buf2, blen));
+ free(buf);
+ free(buf2);
+ n = n << 4;
+ }
+}
+
+static void test_printf_c(void)
+{
+ char *buf= (char*)malloc(2);
+ char buf2[2];
+ unsigned char i= 0xff;
+ int r;
+ while(i)
+ {
+ r = skiboot_snprintf(buf, 2, 2, "%c", i);
+ snprintf(buf2, 2, "%c", i);
+ assert(r==1);
+ assert(0 == strncmp(buf, buf2, 2));
+ i--;
+ }
+ free(buf);
+}
+
+static void test_printf_p(void)
+{
+ char *buf= (char*)malloc(32);
+ char buf2[32];
+ skiboot_snprintf(buf, 32, 32, "%p", buf);
+ snprintf(buf2, 32, "%p", buf);
+ assert(0 == strncmp(buf, buf2, 32));
+ free(buf);
+}
+
+static void test_printf_o(void)
+{
+ char *buf= (char*)malloc(32);
+ char buf2[32];
+ skiboot_snprintf(buf, 32, 32, "%o", 0x12345678);
+ snprintf(buf2, 32, "%o", 0x12345678);
+ assert(0 == strncmp(buf, buf2, 32));
+ free(buf);
+}
+
+static void test_printf_h(short i)
+{
+ char *buf= (char*)malloc(32);
+ char buf2[32];
+ skiboot_snprintf(buf, 32, 32, "%hd", i);
+ snprintf(buf2, 32, "%hd", i);
+ assert(0 == strncmp(buf, buf2, 32));
+ free(buf);
+}
+
+static void test_printf_z(size_t i)
+{
+ char *buf= (char*)malloc(32);
+ char buf2[32];
+ skiboot_snprintf(buf, 32, 32, "%zu", i);
+ snprintf(buf2, 32, "%zu", i);
+ assert(0 == strncmp(buf, buf2, 32));
+ free(buf);
+}
+
+int main(void)
+{
+ char *buf;
+ int r;
+
+ buf = (char*)malloc(BUFSZ);
+ memset(buf, 0, BUFSZ);
+
+ assert(-1 == test1());
+
+ r = skiboot_snprintf(buf, BUFSZ, 2, "%%");
+ assert(r==1);
+ assert(buf[0] == '%' && buf[1] == 0);
+
+ r = skiboot_snprintf(buf, BUFSZ, 2, "%d", 137);
+ /* BUG/FIXME:
+ * skiboot libc does NOT return the length of the buffer you'd need
+ * Instead, it'll return something random, possibly zero (as here)
+ * but as you'll see in test_in_buf_len2, sometimes not.
+ *
+ * Basically, we're not POSIX printf and this is some day going to
+ * cause things to be awful.
+ */
+ assert(0 == r); // BUG, should be 3
+ assert(0 == strncmp(buf, "", 3));
+
+ r = skiboot_snprintf(buf, BUFSZ, 4, "%d", 137);
+ assert(3 == r);
+ assert(0 == strncmp(buf, "137", 3));
+ assert(buf[3] == 0);
+
+ /* Now we test the strange behaviour of our printf.
+ * For strings, we get partial prints going, but if we whack an
+ * integer on the end, we may or may not get that integer, depending
+ * on if we have enough size. We should test that though */
+
+ r = skiboot_snprintf(buf, BUFSZ, 4, "Hello %d", 137);
+ assert(3 == r);
+ assert(0 == strncmp(buf, "Hel", 3));
+ assert(buf[3] == 0);
+ r = skiboot_snprintf(buf, BUFSZ, 7, "Hello %d", 137);
+ assert(6 == r);
+ assert(0 == strncmp(buf, "Hello ", 6));
+ assert(buf[6] == 0);
+ r = skiboot_snprintf(buf, BUFSZ, 10, "Hello %d", 137);
+ assert(9 == r);
+ assert(0 == strncmp(buf, "Hello 137", 10));
+ assert(buf[9] == 0);
+ free(buf);
+
+ test_printf_u(1);
+ test_printf_0u(1);
+ test_printf_d(1);
+ test_printf_d(-1);
+ test_printf_x("%x");
+ test_printf_x("%X");
+ test_printf_c();
+ test_printf_p();
+ test_printf_o();
+ test_printf_h(0);
+ test_printf_h(128);
+ test_printf_h(256);
+ test_printf_h(-1);
+ test_printf_h(32767);
+ test_printf_h(32768);
+ test_printf_h(65535);
+ test_printf_z(0);
+ test_printf_z(-1);
+ test_printf_z(12345);
+ test_printf_z(128000000);
+
+ return 0;
+}