shithub: scc

Download patch

ref: 42f557fa3b371ba28d45169f4c1371f482d43b6b
parent: 37572f48d83ede616d0e47006d52b750f0048a8d
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sun Sep 2 15:08:47 EDT 2018

[tests/libc] Add limits.h test

This test checks if limits.h is correct. The test assumes a 2
complement representation.

--- a/rootdir/include/scc/bits/amd64-sysv/arch/limits.h
+++ b/rootdir/include/scc/bits/amd64-sysv/arch/limits.h
@@ -1,5 +1,6 @@
+#define CHAR_BIT   8
 #define SCHAR_MAX  0x7F
-#define SCHAR_MIN  (-SCHAR_MIN-1)
+#define SCHAR_MIN  (-SCHAR_MAX-1)
 #define CHAR_MAX   0x7F
 #define CHAR_MIN   (-CHAR_MAX-1)
 #define UCHAR_MAX  0xFF
--- a/rootdir/include/scc/bits/i386-sysv/arch/limits.h
+++ b/rootdir/include/scc/bits/i386-sysv/arch/limits.h
@@ -1,3 +1,4 @@
+#define CHAR_BIT   8
 #define SCHAR_MAX  0x7F
 #define SCHAR_MIN  (-SCHAR_MIN-1)
 #define CHAR_MAX   0x7F
--- a/rootdir/include/scc/bits/z80-dos/arch/limits.h
+++ b/rootdir/include/scc/bits/z80-dos/arch/limits.h
@@ -1,3 +1,4 @@
+#define CHAR_BIT   8
 #define SCHAR_MAX  0x7F
 #define SCHAR_MIN  (-SCHAR_MIN-1)
 #define CHAR_MAX   0xFF
--- a/rootdir/include/scc/limits.h
+++ b/rootdir/include/scc/limits.h
@@ -3,7 +3,6 @@
 
 #include <arch/limits.h>
 
-#define CHAR_BIT   8
 #define MB_LEN_MAX 1
 
 #endif
--- /dev/null
+++ b/tests/libc/execute/0006-limits.c
@@ -1,0 +1,180 @@
+#include <limits.h>
+#include <stdio.h>
+
+/*
+ * This test assumes that CHAR_BIT is the size of every
+ * unit returned by sizeof. It also assumes 2 complement.
+ */
+
+/*
+output:
+test1
+test2
+test3
+end:
+*/
+
+void
+test1()
+{
+	puts("test1");
+
+	if (CHAR_BIT < 8 ||
+	    CHAR_MAX < 127 || CHAR_MIN > 0 ||
+	    CHAR_MAX != SCHAR_MAX && CHAR_MAX != UCHAR_MAX)
+		puts("wrong char definition");
+
+	if (SCHAR_MAX < 127 || CHAR_MIN > -127)
+		puts("wrong signed char definition");
+
+	if (UCHAR_MAX < 255 || UCHAR_MAX <= 0)
+		puts("wrong unsigned char definition");
+
+	if (SHRT_MAX < 32767 ||
+	    SHRT_MIN > -32767 ||
+	    USHRT_MAX < 65535 || USHRT_MAX <= 0)
+		puts("wrong short definition");
+
+	if (INT_MAX < 32767 ||
+	    INT_MIN > -32767 ||
+	    UINT_MAX < 65535 || UINT_MAX <= 0 ||
+	    INT_MAX < SCHAR_MAX || INT_MIN > SCHAR_MIN ||
+	    UINT_MAX < UCHAR_MAX ||
+	    INT_MAX < SHRT_MAX || INT_MIN > SHRT_MIN ||
+	    UINT_MAX < USHRT_MAX)
+		puts("wrong int definition");
+
+	if (LONG_MAX < 2147483647 ||
+	    LONG_MIN > -2147483647 ||
+	    ULONG_MAX < 4294967295 || ULONG_MAX <= 0 ||
+	    LONG_MAX < SCHAR_MAX || LONG_MIN > SCHAR_MIN ||
+	    ULONG_MAX < UCHAR_MAX ||
+	    LONG_MAX < SHRT_MAX || LONG_MIN > SHRT_MIN ||
+	    ULONG_MAX < USHRT_MAX ||
+	    LONG_MAX < INT_MAX || LONG_MIN > INT_MIN ||
+	    ULONG_MAX < UINT_MAX)
+		puts("wrong long definition");
+
+	if (LONG_MAX < 9223372036854775807 ||
+	    LONG_MIN > -9223372036854775807 ||
+	    ULONG_MAX < 18446744073709551615 || ULONG_MAX <= 0 ||
+	    LONG_MAX < SCHAR_MAX || LONG_MIN > SCHAR_MIN ||
+	    ULONG_MAX < UCHAR_MAX ||
+	    LONG_MAX < SHRT_MAX || LONG_MIN > SHRT_MIN ||
+	    ULONG_MAX < USHRT_MAX ||
+	    LONG_MAX < LONG_MAX || LONG_MIN > LONG_MIN ||
+	    ULONG_MAX < ULONG_MAX)
+		puts("wrong long definition");
+
+	if (LLONG_MAX < 9223372036854775807 ||
+	    LLONG_MIN > -9223372036854775807 ||
+	    ULLONG_MAX < 18446744073709551615 || ULLONG_MAX <= 0 ||
+	    LLONG_MAX < SCHAR_MAX || LLONG_MIN > SCHAR_MIN ||
+	    ULLONG_MAX < UCHAR_MAX ||
+	    LLONG_MAX < SHRT_MAX || LLONG_MIN > SHRT_MIN ||
+	    ULLONG_MAX < USHRT_MAX ||
+	    LLONG_MAX < LONG_MAX || LLONG_MIN > LONG_MIN ||
+	    ULLONG_MAX < ULONG_MAX)
+		puts("wrong long long definition");
+}
+
+
+void
+test2()
+{
+	char c;
+	int i;
+
+	puts("test2");
+	if ('\xff' > 0) {
+		for (c = i = 0; i < CHAR_BIT; i++) {
+			c <<= 1;
+			c |= 1;
+		}
+		if (c != CHAR_MAX)
+			printf("wrong char max %d-%d", c & 0xFF, CHAR_MAX);
+		if (CHAR_MIN != 0)
+			printf("wrong char min %d-%d", c & 0xFF, CHAR_MIN);
+	} else {
+		for (c = i = 0; i < CHAR_BIT -1; i++) {
+			c <<= 1;
+			c |= 1;
+		}
+		if (c != CHAR_MAX)
+			printf("wrong char max %d-%d", c & 0xFF, CHAR_MAX);
+		c = -c - 1;
+		if (c != CHAR_MIN)
+			printf("wrong char min %d-%d", c & 0xFF, CHAR_MIN);
+	}
+}
+
+#define SMAX(t) for (t = n = 0; n < sizeof(t)*CHAR_BIT -1; n++) {t <<= 1; t |= 1;}
+#define UMAX(t) for (t = n = 0; n < sizeof(t)*CHAR_BIT; n++) {t <<= 1; t |= 1;}
+
+void
+test3()
+{
+	signed char sc;
+	unsigned char uc;
+	int i, n;
+	unsigned u;
+	long l;
+	unsigned long ul;
+	long long ll;
+	unsigned long long ull;
+
+	puts("test3");
+	SMAX(sc);
+	if (sc != SCHAR_MAX)
+		printf("wrong signed char max %d %d\n", sc, SCHAR_MAX);
+	sc = -sc - 1;
+	if (sc != SCHAR_MIN)
+		printf("wrong signed char min %d %d\n", sc, SCHAR_MIN);
+
+	UMAX(uc);
+	if (uc != UCHAR_MAX)
+		printf("wrong unsigned char max %u %u", uc, UCHAR_MAX);
+
+	SMAX(i);
+	if (i != INT_MAX)
+		printf("wrong int max %d %d\n", i, INT_MAX);
+	i = -i - 1;
+	if (i != INT_MIN)
+		printf("wrong int min %d %d\n", i, INT_MIN);
+
+	UMAX(u);
+	if (u != UINT_MAX)
+		printf("wrong unsigned int max %u %u\n", u, UINT_MAX);
+
+	SMAX(l);
+	if (l != LONG_MAX)
+		printf("wrong long max %ld %ld\n", l, (long) LONG_MAX);
+	l = -l - 1;
+	if (l != LONG_MIN)
+		printf("wrong long max %ld %ld\n", l, (long) LONG_MIN);
+
+	UMAX(ul);
+	if (ul != ULONG_MAX)
+		printf("wrong int max %lu %lu\n", ul, (unsigned long) ULONG_MAX);
+
+	SMAX(ll);
+	if (ll != LLONG_MAX)
+		printf("wrong llong max %lld %lld\n", ll, (long long) LLONG_MAX);
+	ll = -ll - 1;
+	if (ll != LLONG_MIN)
+		printf("wrong llong min %lld %lld\n", ll, (long long) LLONG_MIN);
+
+	UMAX(ull);
+	if (ull != ULLONG_MAX)
+		printf("wrong ullong max %llu %llu\n", ull, (unsigned long long) ULLONG_MAX);
+}
+
+int
+main()
+{
+	test1();
+	test2();
+	test3();
+
+	return 0;
+}
--- a/tests/libc/execute/cc.sh
+++ b/tests/libc/execute/cc.sh
@@ -42,5 +42,5 @@
 	pie=-nopie
 fi
 
-gcc -g $pie -fno-stack-protector --freestanding -std=c99 -static -nostdinc -I$inc -I$arch_inc -c $1
+gcc -g -w $pie -fno-stack-protector --freestanding -std=c99 -static -nostdinc -I$inc -I$arch_inc -c $1
 ld -g $pie -z nodefaultlib -static -L$lib $lib/crt.o $obj -lc -o $out
--- a/tests/libc/execute/libc-tests.lst
+++ b/tests/libc/execute/libc-tests.lst
@@ -3,3 +3,4 @@
 0003-assert
 0004-abort
 0005-ctype
+0006-limits