shithub: scc

Download patch

ref: 5edec2c057c59886f0641c178b2c2ec8de242060
parent: ad9537bd2daa3be47f01d68f25c034aaab83ed15
parent: a1e3abc209473dd524ec163eca35edfa7ac65b3a
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Mon Sep 3 04:14:39 EDT 2018

Merge branch 'master' of ssh://simple-cc.org:/var/gitrepos/scc

diff: cannot open b/rootdir/include/scc/bits/linux/sys//null: file does not exist: 'b/rootdir/include/scc/bits/linux/sys//null' diff: cannot open b/rootdir/include/scc/bits/linux//null: file does not exist: 'b/rootdir/include/scc/bits/linux//null' diff: cannot open b/rootdir/include/scc/bits/netbsd/sys//null: file does not exist: 'b/rootdir/include/scc/bits/netbsd/sys//null' diff: cannot open b/rootdir/include/scc/bits/netbsd//null: file does not exist: 'b/rootdir/include/scc/bits/netbsd//null' diff: cannot open b/rootdir/include/scc/bits/openbsd/sys//null: file does not exist: 'b/rootdir/include/scc/bits/openbsd/sys//null' diff: cannot open b/rootdir/include/scc/bits/openbsd//null: file does not exist: 'b/rootdir/include/scc/bits/openbsd//null'
--- a/lib/c/_flsbuf.c
+++ b/lib/c/_flsbuf.c
@@ -7,15 +7,17 @@
 _flsbuf(FILE *fp)
 {
 	int lnbuf = fp->flags & _IOLBF;
+	unsigned char *p;
 	size_t cnt;
 
-	cnt = ((lnbuf) ? fp->lp : fp->wp) - fp->buf;
+	p = (lnbuf) ? fp->lp : fp->wp;
+	cnt = p - fp->buf;
 
 	if (_write(fp->fd, fp->buf, cnt) != cnt) {
 		fp->flags |= _IOERR;
 		return EOF;
 	}
-	fp->rp = fp->wp = fp->buf;
+	fp->lp = fp->rp = fp->wp = fp->buf;
 
 	return 0;
 }
--- /dev/null
+++ b/lib/c/errno.c
@@ -1,0 +1,1 @@
+int errno;
--- a/lib/c/putchar.c
+++ b/lib/c/putchar.c
@@ -5,5 +5,5 @@
 int
 putchar(int ch)
 {
-	return putc(ch, stdin);
+	return putc(ch, stdout);
 }
--- a/lib/c/stdio.c
+++ b/lib/c/stdio.c
@@ -9,13 +9,19 @@
 		.fd = 0,
 		.buf = inbuf,
 		.len = BUFSIZ,
-		.flags = _IOREAD
+		.flags = _IOREAD,
+		.lp = inbuf,
+		.rp = inbuf,
+		.wp = inbuf,
 	},
 	{
 		.fd = 1,
 		.buf = outbuf,
 		.len = BUFSIZ,
-		.flags = _IOWRITE | _IOLBF
+		.flags = _IOWRITE | _IOLBF,
+		.lp = outbuf,
+		.rp = outbuf,
+		.wp = outbuf,
 	},
 	{
 		.fd = 2,
--- /dev/null
+++ b/lib/c/strnlen.c
@@ -1,0 +1,9 @@
+#include <string.h>
+
+#undef strnlen
+
+size_t
+strnlen(const char *s, size_t maxlen)
+{
+	return 0;
+}
--- /dev/null
+++ b/lib/c/target/.gitignore
@@ -1,0 +1,1 @@
+_sys_errlist.c
--- a/lib/c/target/amd64-sysv-linux/Makefile
+++ b/lib/c/target/amd64-sysv-linux/Makefile
@@ -3,9 +3,12 @@
 PROJECTDIR = ../../../..
 include $(PROJECTDIR)/rules.mk
 
-SYSNAME    = amd64-sysv-linux
-SCC_CFLAGS = -static -nostdinc -I$(INCDIR) -I$(INCDIR)/bits/amd64-sysv/ -I.
-SYSOBJ = raise.o signal.o
+SYS        = linux
+ARCH       = amd64
+ABI        = sysv
+SYSOBJ     = raise.o signal.o
+SYSERRTBL  = ../posix/linux.e
+MORECFLAGS = -std=c99 -g -static -nostdinc
 
 include syscall.mk
 include ../script/objlst.mk
--- a/lib/c/target/amd64-sysv-netbsd/Makefile
+++ b/lib/c/target/amd64-sysv-netbsd/Makefile
@@ -3,9 +3,12 @@
 PROJECTDIR = ../../../..
 include $(PROJECTDIR)/rules.mk
 
-SYSNAME    = amd64-sysv-netbsd
-SCC_CFLAGS = -static -nostdinc -I$(INCDIR) -I$(INCDIR)/bits/amd64-sysv/ -I.
-SYSOBJ = raise.o signal.o _sigaction.o _sigaction2.o _setcontext.o
+SYS        = netbsd
+ARCH       = amd64
+ABI        = sysv
+SYSOBJ     = raise.o signal.o _sigaction.o _sigaction2.o _setcontext.o
+SYSERRTBL  = ../posix/netbsd.e
+MORECFLAGS = -std=c99 -g -static -nostdinc
 
 include syscall.mk
 include ../script/objlst.mk
--- a/lib/c/target/amd64-sysv-openbsd/Makefile
+++ b/lib/c/target/amd64-sysv-openbsd/Makefile
@@ -3,9 +3,12 @@
 PROJECTDIR = ../../../..
 include $(PROJECTDIR)/rules.mk
 
-SYSNAME    = amd64-sysv-openbsd
-SCC_CFLAGS = -fno-stack-protector -static -nostdinc -I$(INCDIR) -I$(INCDIR)/bits/amd64-sysv/ -I.
+SYS        = openbsd
+ARCH       = amd64
+ABI        = sysv
 SYSOBJ     = raise.o signal.o _sigaction.o
+SYSERRTBL  = ../posix/netbsd.e
+MORECFLAGS = -std=c99 -g -static -nostdinc -fno-stack-protector --freestanding
 
 include syscall.mk
 include ../script/objlst.mk
--- a/lib/c/target/amd64-sysv-openbsd/syscall.mk
+++ b/lib/c/target/amd64-sysv-openbsd/syscall.mk
@@ -1,1 +1,1 @@
-SYSCALL = _Exit.o _read.o _write.o _open.o _close.o _brk.o _getpid.o _kill.o _sigaction.o _lseek.o 
+SYSCALL = _Exit.o _read.o _write.o _open.o _close.o _brk.o _getpid.o _sigaction.o _kill.o _lseek.o 
--- /dev/null
+++ b/lib/c/target/posix/geterrno.sh
@@ -1,0 +1,8 @@
+#!/bin/sh
+
+awk '/define[ 	]*E/ && $3 ~ /[0-9]+/ && $3 > 0 {
+	sub(/\#define[ 	]*/, "")
+	sub(/\/\*/, "")
+	sub(/\*\//, "")
+	print
+}' /usr/include/sys/errno.h
--- /dev/null
+++ b/lib/c/target/posix/linux.e
@@ -1,0 +1,131 @@
+EPERM		 1	 Operation not permitted 
+ENOENT		 2	 No such file or directory 
+ESRCH		 3	 No such process 
+EINTR		 4	 Interrupted system call 
+EIO		 5	 I/O error 
+ENXIO		 6	 No such device or address 
+E2BIG		 7	 Argument list too long 
+ENOEXEC		 8	 Exec format error 
+EBADF		 9	 Bad file number 
+ECHILD		10	 No child processes 
+EAGAIN		11	 Try again 
+ENOMEM		12	 Out of memory 
+EACCES		13	 Permission denied 
+EFAULT		14	 Bad address 
+ENOTBLK		15	 Block device required 
+EBUSY		16	 Device or resource busy 
+EEXIST		17	 File exists 
+EXDEV		18	 Cross-device link 
+ENODEV		19	 No such device 
+ENOTDIR		20	 Not a directory 
+EISDIR		21	 Is a directory 
+EINVAL		22	 Invalid argument 
+ENFILE		23	 File table overflow 
+EMFILE		24	 Too many open files 
+ENOTTY		25	 Not a typewriter 
+ETXTBSY		26	 Text file busy 
+EFBIG		27	 File too large 
+ENOSPC		28	 No space left on device 
+ESPIPE		29	 Illegal seek 
+EROFS		30	 Read-only file system 
+EMLINK		31	 Too many links 
+EPIPE		32	 Broken pipe 
+EDOM		33	 Math argument out of domain of func 
+ERANGE		34	 Math result not representable 
+EDEADLK		35	 Resource deadlock would occur 
+ENAMETOOLONG	36	 File name too long 
+ENOLCK		37	 No record locks available 
+ENOSYS		38	 Invalid system call number 
+ENOTEMPTY	39	 Directory not empty 
+ELOOP		40	 Too many symbolic links encountered 
+ENOMSG		42	 No message of desired type 
+EIDRM		43	 Identifier removed 
+ECHRNG		44	 Channel number out of range 
+EL2NSYNC	45	 Level 2 not synchronized 
+EL3HLT		46	 Level 3 halted 
+EL3RST		47	 Level 3 reset 
+ELNRNG		48	 Link number out of range 
+EUNATCH		49	 Protocol driver not attached 
+ENOCSI		50	 No CSI structure available 
+EL2HLT		51	 Level 2 halted 
+EBADE		52	 Invalid exchange 
+EBADR		53	 Invalid request descriptor 
+EXFULL		54	 Exchange full 
+ENOANO		55	 No anode 
+EBADRQC		56	 Invalid request code 
+EBADSLT		57	 Invalid slot 
+EBFONT		59	 Bad font file format 
+ENOSTR		60	 Device not a stream 
+ENODATA		61	 No data available 
+ETIME		62	 Timer expired 
+ENOSR		63	 Out of streams resources 
+ENONET		64	 Machine is not on the network 
+ENOPKG		65	 Package not installed 
+EREMOTE		66	 Object is remote 
+ENOLINK		67	 Link has been severed 
+EADV		68	 Advertise error 
+ESRMNT		69	 Srmount error 
+ECOMM		70	 Communication error on send 
+EPROTO		71	 Protocol error 
+EMULTIHOP	72	 Multihop attempted 
+EDOTDOT		73	 RFS specific error 
+EBADMSG		74	 Not a data message 
+EOVERFLOW	75	 Value too large for defined data type 
+ENOTUNIQ	76	 Name not unique on network 
+EBADFD		77	 File descriptor in bad state 
+EREMCHG		78	 Remote address changed 
+ELIBACC		79	 Can not access a needed shared library 
+ELIBBAD		80	 Accessing a corrupted shared library 
+ELIBSCN		81	 .lib section in a.out corrupted 
+ELIBMAX		82	 Attempting to link in too many shared libraries 
+ELIBEXEC	83	 Cannot exec a shared library directly 
+EILSEQ		84	 Illegal byte sequence 
+ERESTART	85	 Interrupted system call should be restarted 
+ESTRPIPE	86	 Streams pipe error 
+EUSERS		87	 Too many users 
+ENOTSOCK	88	 Socket operation on non-socket 
+EDESTADDRREQ	89	 Destination address required 
+EMSGSIZE	90	 Message too long 
+EPROTOTYPE	91	 Protocol wrong type for socket 
+ENOPROTOOPT	92	 Protocol not available 
+EPROTONOSUPPORT	93	 Protocol not supported 
+ESOCKTNOSUPPORT	94	 Socket type not supported 
+EOPNOTSUPP	95	 Operation not supported on transport endpoint 
+EPFNOSUPPORT	96	 Protocol family not supported 
+EAFNOSUPPORT	97	 Address family not supported by protocol 
+EADDRINUSE	98	 Address already in use 
+EADDRNOTAVAIL	99	 Cannot assign requested address 
+ENETDOWN	100	 Network is down 
+ENETUNREACH	101	 Network is unreachable 
+ENETRESET	102	 Network dropped connection because of reset 
+ECONNABORTED	103	 Software caused connection abort 
+ECONNRESET	104	 Connection reset by peer 
+ENOBUFS		105	 No buffer space available 
+EISCONN		106	 Transport endpoint is already connected 
+ENOTCONN	107	 Transport endpoint is not connected 
+ESHUTDOWN	108	 Cannot send after transport endpoint shutdown 
+ETOOMANYREFS	109	 Too many references: cannot splice 
+ETIMEDOUT	110	 Connection timed out 
+ECONNREFUSED	111	 Connection refused 
+EHOSTDOWN	112	 Host is down 
+EHOSTUNREACH	113	 No route to host 
+EALREADY	114	 Operation already in progress 
+EINPROGRESS	115	 Operation now in progress 
+ESTALE		116	 Stale file handle 
+EUCLEAN		117	 Structure needs cleaning 
+ENOTNAM		118	 Not a XENIX named type file 
+ENAVAIL		119	 No XENIX semaphores available 
+EISNAM		120	 Is a named type file 
+EREMOTEIO	121	 Remote I/O error 
+EDQUOT		122	 Quota exceeded 
+ENOMEDIUM	123	 No medium found 
+EMEDIUMTYPE	124	 Wrong medium type 
+ECANCELED	125	 Operation Canceled 
+ENOKEY		126	 Required key not available 
+EKEYEXPIRED	127	 Key has expired 
+EKEYREVOKED	128	 Key has been revoked 
+EKEYREJECTED	129	 Key was rejected by service 
+EOWNERDEAD	130	 Owner died 
+ENOTRECOVERABLE	131	 State not recoverable 
+ERFKILL		132	 Operation not possible due to RF-kill 
+EHWPOISON	133	 Memory page has hardware error 
--- /dev/null
+++ b/lib/c/target/posix/netbsd.e
@@ -1,0 +1,98 @@
+EPERM		1		 Operation not permitted 
+ENOENT		2		 No such file or directory 
+ESRCH		3		 No such process 
+EINTR		4		 Interrupted system call 
+EIO		5		 Input/output error 
+ENXIO		6		 Device not configured 
+E2BIG		7		 Argument list too long 
+ENOEXEC		8		 Exec format error 
+EBADF		9		 Bad file descriptor 
+ECHILD		10		 No child processes 
+EDEADLK		11		 Resource deadlock avoided 
+ENOMEM		12		 Cannot allocate memory 
+EACCES		13		 Permission denied 
+EFAULT		14		 Bad address 
+ENOTBLK		15		 Block device required 
+EBUSY		16		 Device busy 
+EEXIST		17		 File exists 
+EXDEV		18		 Cross-device link 
+ENODEV		19		 Operation not supported by device 
+ENOTDIR		20		 Not a directory 
+EISDIR		21		 Is a directory 
+EINVAL		22		 Invalid argument 
+ENFILE		23		 Too many open files in system 
+EMFILE		24		 Too many open files 
+ENOTTY		25		 Inappropriate ioctl for device 
+ETXTBSY		26		 Text file busy 
+EFBIG		27		 File too large 
+ENOSPC		28		 No space left on device 
+ESPIPE		29		 Illegal seek 
+EROFS		30		 Read-only file system 
+EMLINK		31		 Too many links 
+EPIPE		32		 Broken pipe 
+EDOM		33		 Numerical argument out of domain 
+ERANGE		34		 Result too large or too small 
+EAGAIN		35		 Resource temporarily unavailable 
+EWOULDBLOCK	EAGAIN		 Operation would block 
+EINPROGRESS	36		 Operation now in progress 
+EALREADY	37		 Operation already in progress 
+ENOTSOCK	38		 Socket operation on non-socket 
+EDESTADDRREQ	39		 Destination address required 
+EMSGSIZE	40		 Message too long 
+EPROTOTYPE	41		 Protocol wrong type for socket 
+ENOPROTOOPT	42		 Protocol option not available 
+EPROTONOSUPPORT	43		 Protocol not supported 
+ESOCKTNOSUPPORT	44		 Socket type not supported 
+EOPNOTSUPP	45		 Operation not supported 
+EPFNOSUPPORT	46		 Protocol family not supported 
+EAFNOSUPPORT	47		 Address family not supported by protocol family 
+EADDRINUSE	48		 Address already in use 
+EADDRNOTAVAIL	49		 Can't assign requested address 
+ENETDOWN	50		 Network is down 
+ENETUNREACH	51		 Network is unreachable 
+ENETRESET	52		 Network dropped connection on reset 
+ECONNABORTED	53		 Software caused connection abort 
+ECONNRESET	54		 Connection reset by peer 
+ENOBUFS		55		 No buffer space available 
+EISCONN		56		 Socket is already connected 
+ENOTCONN	57		 Socket is not connected 
+ESHUTDOWN	58		 Can't send after socket shutdown 
+ETOOMANYREFS	59		 Too many references: can't splice 
+ETIMEDOUT	60		 Operation timed out 
+ECONNREFUSED	61		 Connection refused 
+ELOOP		62		 Too many levels of symbolic links 
+ENAMETOOLONG	63		 File name too long 
+EHOSTDOWN	64		 Host is down 
+EHOSTUNREACH	65		 No route to host 
+ENOTEMPTY	66		 Directory not empty 
+EPROCLIM	67		 Too many processes 
+EUSERS		68		 Too many users 
+EDQUOT		69		 Disc quota exceeded 
+ESTALE		70		 Stale NFS file handle 
+EREMOTE		71		 Too many levels of remote in path 
+EBADRPC		72		 RPC struct is bad 
+ERPCMISMATCH	73		 RPC version wrong 
+EPROGUNAVAIL	74		 RPC prog. not avail 
+EPROGMISMATCH	75		 Program version wrong 
+EPROCUNAVAIL	76		 Bad procedure for program 
+ENOLCK		77		 No locks available 
+ENOSYS		78		 Function not implemented 
+EFTYPE		79		 Inappropriate file type or format 
+EAUTH		80		 Authentication error 
+ENEEDAUTH	81		 Need authenticator 
+EIDRM		82		 Identifier removed 
+ENOMSG		83		 No message of desired type 
+EOVERFLOW	84		 Value too large to be stored in data type 
+EILSEQ		85		 Illegal byte sequence 
+ENOTSUP		86		 Not supported 
+ECANCELED	87		 Operation canceled 
+EBADMSG		88		 Bad or Corrupt message 
+ENODATA		89		 No message available 
+ENOSR		90		 No STREAM resources 
+ENOSTR		91		 Not a STREAM 
+ETIME		92		 STREAM ioctl timeout 
+ENOATTR		93		 Attribute not found 
+EMULTIHOP	94		 Multihop attempted  
+ENOLINK		95		 Link has been severed 
+EPROTO		96		 Protocol error 
+ELAST		96		 Must equal largest errno 
--- /dev/null
+++ b/lib/c/target/posix/openbsd.e
@@ -1,0 +1,96 @@
+EPERM		1	 Operation not permitted 
+ENOENT		2	 No such file or directory 
+ESRCH		3	 No such process 
+EINTR		4	 Interrupted system call 
+EIO		5	 Input/output error 
+ENXIO		6	 Device not configured 
+E2BIG		7	 Argument list too long 
+ENOEXEC		8	 Exec format error 
+EBADF		9	 Bad file descriptor 
+ECHILD		10	 No child processes 
+EDEADLK		11	 Resource deadlock avoided 
+ENOMEM		12	 Cannot allocate memory 
+EACCES		13	 Permission denied 
+EFAULT		14	 Bad address 
+ENOTBLK		15	 Block device required 
+EBUSY		16	 Device busy 
+EEXIST		17	 File exists 
+EXDEV		18	 Cross-device link 
+ENODEV		19	 Operation not supported by device 
+ENOTDIR		20	 Not a directory 
+EISDIR		21	 Is a directory 
+EINVAL		22	 Invalid argument 
+ENFILE		23	 Too many open files in system 
+EMFILE		24	 Too many open files 
+ENOTTY		25	 Inappropriate ioctl for device 
+ETXTBSY		26	 Text file busy 
+EFBIG		27	 File too large 
+ENOSPC		28	 No space left on device 
+ESPIPE		29	 Illegal seek 
+EROFS		30	 Read-only file system 
+EMLINK		31	 Too many links 
+EPIPE		32	 Broken pipe 
+EDOM		33	 Numerical argument out of domain 
+ERANGE		34	 Result too large 
+EAGAIN		35	 Resource temporarily unavailable 
+EINPROGRESS	36	 Operation now in progress 
+EALREADY	37	 Operation already in progress 
+ENOTSOCK	38	 Socket operation on non-socket 
+EDESTADDRREQ	39	 Destination address required 
+EMSGSIZE	40	 Message too long 
+EPROTOTYPE	41	 Protocol wrong type for socket 
+ENOPROTOOPT	42	 Protocol not available 
+EPROTONOSUPPORT	43	 Protocol not supported 
+ESOCKTNOSUPPORT	44	 Socket type not supported 
+EOPNOTSUPP	45	 Operation not supported 
+EPFNOSUPPORT	46	 Protocol family not supported 
+EAFNOSUPPORT	47	 Address family not supported by protocol family 
+EADDRINUSE	48	 Address already in use 
+EADDRNOTAVAIL	49	 Can't assign requested address 
+ENETDOWN	50	 Network is down 
+ENETUNREACH	51	 Network is unreachable 
+ENETRESET	52	 Network dropped connection on reset 
+ECONNABORTED	53	 Software caused connection abort 
+ECONNRESET	54	 Connection reset by peer 
+ENOBUFS		55	 No buffer space available 
+EISCONN		56	 Socket is already connected 
+ENOTCONN	57	 Socket is not connected 
+ESHUTDOWN	58	 Can't send after socket shutdown 
+ETOOMANYREFS	59	 Too many references: can't splice 
+ETIMEDOUT	60	 Operation timed out 
+ECONNREFUSED	61	 Connection refused 
+ELOOP		62	 Too many levels of symbolic links 
+ENAMETOOLONG	63	 File name too long 
+EHOSTDOWN	64	 Host is down 
+EHOSTUNREACH	65	 No route to host 
+ENOTEMPTY	66	 Directory not empty 
+EPROCLIM	67	 Too many processes 
+EUSERS		68	 Too many users 
+EDQUOT		69	 Disk quota exceeded 
+ESTALE		70	 Stale NFS file handle 
+EREMOTE		71	 Too many levels of remote in path 
+EBADRPC		72	 RPC struct is bad 
+ERPCMISMATCH	73	 RPC version wrong 
+EPROGUNAVAIL	74	 RPC program not available 
+EPROGMISMATCH	75	 Program version wrong 
+EPROCUNAVAIL	76	 Bad procedure for program 
+ENOLCK		77	 No locks available 
+ENOSYS		78	 Function not implemented 
+EFTYPE		79	 Inappropriate file type or format 
+EAUTH		80	 Authentication error 
+ENEEDAUTH	81	 Need authenticator 
+EIPSEC		82	 IPsec processing failure 
+ENOATTR		83	 Attribute not found 
+EILSEQ		84	 Illegal byte sequence 
+ENOMEDIUM	85	 No medium found 
+EMEDIUMTYPE	86	 Wrong medium type 
+EOVERFLOW	87	 Value too large to be stored in data type 
+ECANCELED	88	 Operation canceled 
+EIDRM		89	 Identifier removed 
+ENOMSG		90	 No message of desired type 
+ENOTSUP		91	 Not supported 
+EBADMSG		92	 Bad message 
+ENOTRECOVERABLE	93	 State not recoverable 
+EOWNERDEAD	94	 Previous owner died 
+EPROTO		95	 Protocol error 
+ELAST		95	 Must be equal largest errno 
--- a/lib/c/target/script/common.mk
+++ b/lib/c/target/script/common.mk
@@ -1,14 +1,33 @@
-SYSASM = $(SYSCALL:.o=.s)
-TARGET = $(LIBDIR)/$(SYSNAME)/libc.a
+SYSNAME  = $(ARCH)-$(ABI)-$(SYS)
+SYSASM   = $(SYSCALL:.o=.s)
+TARGET   = $(LIBDIR)/$(SYSNAME)/libc.a
+INCLUDE  = -I$(INCDIR) \
+           -I$(INCDIR)/bits/$(ARCH)-$(ABI) \
+           -I$(INCDIR)/bits/$(SYS) \
+           -I.
+SYSERRNO = $(INCDIR)/bits/$(SYS)/sys/errno.h
+OBJ      = $(LIBOBJ) $(SYSOBJ) $(SYSCALL)
 
+SCC_CFLAGS = $(MORECFLAGS) $(INCLUDE)
+
 all: $(TARGET)
 
-$(TARGET): $(LIBOBJ) $(SYSOBJ) $(SYSCALL)
+$(OBJ): $(SYSERRNO)
+
+$(SYSERRNO): $(SYSERRTBL)
+	trap "rm -f $$$$.tmp" 0 2 3 4; \
+	../script/generrno.sh $(SYSERRTBL) > $$$$.tmp && mv $$$$.tmp $@
+
+_sys_errlist.c: $(SYSERRTBL) $(SYSERRNO)
+	trap "rm -f $$$$.tmp" 0 2 3 4; \
+	../script/generrstr.sh $(SYSERRTBL) > $$$$.tmp && mv $$$$.tmp $@
+
+$(TARGET): $(OBJ)
 	$(AR) $(ARFLAGS) $@ $?
 	ranlib $@
 
 clean:
-	rm -f *.o *.a
+	rm -f *.o *.a _sys_errlist.c $(SYSERRNO)
 	rm -f $(SYSASM)
 	rm -f $(TARGET)
 
--- /dev/null
+++ b/lib/c/target/script/generrno.sh
@@ -1,0 +1,12 @@
+#!/bin/sh
+
+awk '
+/^E/ && $2 > 0 {
+	errno[$1] = $2
+}
+
+END {
+	for (i in errno)
+		print "#define", i, errno[i] | "sort -n -k3"
+	close "sort -n -k3"
+}' $@
--- /dev/null
+++ b/lib/c/target/script/generrstr.sh
@@ -1,0 +1,21 @@
+#!/bin/sh
+
+awk '
+/^E/ && $2 > 0 {
+	str = ""
+	for (i = 3; i <= NF; i++)
+		str = str " " $i
+	sub(/^ /, "", str)
+	errstr[$1] = str
+	if ($2 > max)
+		max = $2;
+}
+
+END {
+	print "#include <errno.h>\n"
+	print "char *_sys_errstr[] = {"
+	for (i in errstr)
+		printf "\t%-20.20s = \"%s\",\n", "[" i "]", errstr[i]
+	print "};"
+	print "int _sys_nerr =", $2 + 1 ";"
+}' $@
--- a/lib/c/target/script/objlst.mk
+++ b/lib/c/target/script/objlst.mk
@@ -19,7 +19,8 @@
          isalnum.o isalpha.o isascii.o isblank.o iscntrl.o isdigit.o \
          isgraph.o islower.o isprint.o ispunct.o isspace.o isupper.o \
          isxdigit.o toupper.o tolower.o ctype.o setlocale.o \
-         localeconv.o atoi.o atol.o atoll.o atexit.o abort.o exit.o
+         localeconv.o atoi.o atol.o atoll.o atexit.o abort.o exit.o \
+         errno.o _sys_errlist.o strnlen.o wcsnlen.o
 
 #rules
 __abs.o: ../../__abs.c
@@ -76,6 +77,9 @@
 ctype.o: ../../ctype.c
 	$(CC) $(SCC_CFLAGS) ../../ctype.c -c
 
+errno.o: ../../errno.c
+	$(CC) $(SCC_CFLAGS) ../../errno.c -c
+
 exit.o: ../../exit.c
 	$(CC) $(SCC_CFLAGS) ../../exit.c -c
 
@@ -271,6 +275,9 @@
 strncpy.o: ../../strncpy.c
 	$(CC) $(SCC_CFLAGS) ../../strncpy.c -c
 
+strnlen.o: ../../strnlen.c
+	$(CC) $(SCC_CFLAGS) ../../strnlen.c -c
+
 strpbrk.o: ../../strpbrk.c
 	$(CC) $(SCC_CFLAGS) ../../strpbrk.c -c
 
@@ -306,4 +313,7 @@
 
 vsprintf.o: ../../vsprintf.c
 	$(CC) $(SCC_CFLAGS) ../../vsprintf.c -c
+
+wcsnlen.o: ../../wcsnlen.c
+	$(CC) $(SCC_CFLAGS) ../../wcsnlen.c -c
 
--- a/lib/c/vfprintf.c
+++ b/lib/c/vfprintf.c
@@ -64,7 +64,7 @@
 		uval = (uintmax_t) va_arg(va, void *);
 	} else {
 		val = va_arg(va, int);
-		uval = (unsigned) uval;
+		uval = (unsigned) val;
 	}
 
 	if ((flags & UNSIGNED) == 0 && val < 0) {
@@ -128,6 +128,7 @@
 	int left = 0, adjust;
 	size_t cnt = 0;
 	wchar_t wc;
+#if 0
 
 	if (width < 0) {
 		left = 1;
@@ -148,7 +149,7 @@
 
 	for ( ; adjust < 0; adjust--)
 		putc(' ', fp);
-
+#endif
 	return cnt;
 }
 
--- /dev/null
+++ b/lib/c/wcsnlen.c
@@ -1,0 +1,10 @@
+#include <stdio.h>
+#include <wchar.h>
+
+#undef wcsnlen
+
+size_t
+wcsnlen(const wchar_t *s, size_t maxlen)
+{
+	return 0;
+}
--- a/rootdir/include/scc/assert.h
+++ b/rootdir/include/scc/assert.h
@@ -1,5 +1,5 @@
 
-void __assert(char *exp, char *file, long line);
+extern void __assert(char *exp, char *file, long line);
 
 #undef assert
 #ifndef NDEBUG
@@ -7,4 +7,3 @@
 #else
 # define assert(exp) ((void)0)
 #endif
-
--- /dev/null
+++ b/rootdir/include/scc/bits/.gitignore
@@ -1,0 +1,1 @@
+errno.h
--- 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
--- /dev/null
+++ b/rootdir/include/scc/bits/linux/sys/README
@@ -1,0 +1,1 @@
+This is a placeholder for VCS
--- /dev/null
+++ b/rootdir/include/scc/bits/netbsd/sys/README
@@ -1,0 +1,1 @@
+This is a placeholder for VCS
--- /dev/null
+++ b/rootdir/include/scc/bits/openbsd/sys/README
@@ -1,0 +1,1 @@
+This is a placeholder for VCS
--- 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/errno.h
+++ b/rootdir/include/scc/errno.h
@@ -1,12 +1,7 @@
 #ifndef _ERRNO_H
 #define _ERRNO_H
 
-#define EDOM   1
-#define EILSEQ 2
-#define ERANGE 3
-#define ENOMEM 4
-#define EBADF  5
-#define EINVAL 6
+#include <sys/errno.h>
 
 extern int errno;
 extern char *_sys_errlist[];
--- /dev/null
+++ b/rootdir/include/scc/float.h
@@ -1,0 +1,4 @@
+#ifndef _FLOAT_H
+#define _FLOAT_H
+#error not supported yet
+#endif
--- 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/rootdir/include/scc/math.h
@@ -1,0 +1,4 @@
+#ifndef _MATH_H
+#define _MATH_H
+#error math.h is not supported yet
+#endif
--- a/tests/libc/execute/0001-abort.c
+++ b/tests/libc/execute/0001-abort.c
@@ -1,18 +1,27 @@
-
+#include <assert.h>
+#include <stdio.h>
 #include <signal.h>
 #include <stdlib.h>
 
+/*
+output:
+aborting
+end:
+*/
+
 void
 handler(int dummy)
 {
-	exit(EXIT_SUCCESS);
+	_Exit(0);
 }
 
 int
 main(void)
 {
-	signal(SIGABRT, handler);
+	printf("aborting\n");
+	assert(signal(SIGABRT, handler) != SIG_ERR);
 	abort();
+	printf("borning\n");
 
-	return 1;
+	return 0;
 }
--- /dev/null
+++ b/tests/libc/execute/0002-assert.c
@@ -1,0 +1,35 @@
+
+#include <assert.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/*
+output:
+First assert
+Second assert, that must fail
+end:
+*/
+
+void
+handler(int dummy)
+{
+	_Exit(0);
+}
+
+int
+main()
+{
+	int i;
+	char c;
+
+	assert(signal(SIGABRT, handler) != SIG_ERR);
+
+	printf("First assert\n");
+	assert(sizeof(i) >= sizeof(c));
+
+	printf("Second assert, that must fail\n");
+	assert(sizeof(i) < sizeof(c));
+
+	return 0;
+}
--- /dev/null
+++ b/tests/libc/execute/0003-assert.c
@@ -1,0 +1,27 @@
+#include <assert.h>
+#include <stdio.h>
+
+/*
+output:
+First assert
+Second assert, that must fail
+end:
+*/
+
+int
+main()
+{
+	int i;
+	char c;
+
+	printf("First assert\n");
+	assert(sizeof(i) >= sizeof(c));
+
+#define NDEBUG
+#include <assert.h>
+
+	printf("Second assert, that must fail\n");
+	assert(sizeof(i) < sizeof(c));
+
+	return 0;
+}
--- /dev/null
+++ b/tests/libc/execute/0004-abort.c
@@ -1,0 +1,21 @@
+#include <assert.h>
+#include <stdio.h>
+#include <signal.h>
+#include <stdlib.h>
+
+/*
+output:
+aborting
+end:
+*/
+
+int
+main(void)
+{
+	printf("aborting\n");
+	assert(signal(SIGABRT, SIG_IGN) != SIG_ERR);
+	abort();
+	printf("borning\n");
+
+	return 0;
+}
--- /dev/null
+++ b/tests/libc/execute/0005-ctype.c
@@ -1,0 +1,572 @@
+#define __USE_MACROS
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <limits.h>
+
+/*
+ * This test assumes an ascii representation
+ */
+
+#define TESTW(f) fputs(#f ":" , stdout); \
+	for (i = 0; i <= UCHAR_MAX; i++)  \
+		if (f(i)) printf(" %d", i); \
+	putchar('\n')
+
+#define TESTC(f) fputs(#f ": " , stdout); \
+	for (i = 0; i <= UCHAR_MAX; i++)  \
+		if (f(i)) putchar(i); \
+	putchar('\n')
+
+#define TESTEOF(f) fputs(#f ": " , stdout); \
+	if (!f(EOF)) putchar('!'); puts("EOF");
+
+#define TESTLU(f) \
+	for (i = 0; i < UCHAR_MAX; i++) { \
+		n = f(i); \
+		if (!isgraph(i)) \
+			continue; \
+		printf("%s: %c <-> %c\n", #f, i, n); \
+	}
+
+void
+test1()
+{
+	int i;
+
+	puts("\ntest1");
+	TESTC(isalnum);
+	TESTC(isalpha);
+	TESTC(isdigit);
+	TESTC(isgraph);
+	TESTC(islower);
+	TESTC(isupper);
+	TESTC(isprint);
+	TESTC(ispunct);
+	TESTC(isxdigit);
+	TESTC(isdigit);
+	TESTW(iscntrl);
+	TESTW(isspace);
+	TESTEOF(isalpha);
+	TESTEOF(isdigit);
+	TESTEOF(isgraph);
+	TESTEOF(islower);
+	TESTEOF(isupper);
+	TESTEOF(isprint);
+	TESTEOF(ispunct);
+	TESTEOF(isxdigit);
+	TESTEOF(isdigit);
+	TESTEOF(iscntrl);
+	TESTEOF(isspace);
+}
+
+#undef isalnum
+#undef isalpha
+#undef isdigit
+#undef isgraph
+#undef islower
+#undef isupper
+#undef isprint
+#undef ispunct
+#undef isxdigit
+#undef isdigit
+
+void
+test2()
+{
+	int i;
+
+	puts("\ntest2");
+	TESTC(isalnum);
+	TESTC(isalpha);
+	TESTC(isdigit);
+	TESTC(isgraph);
+	TESTC(islower);
+	TESTC(isupper);
+	TESTC(isprint);
+	TESTC(ispunct);
+	TESTC(isxdigit);
+	TESTC(isdigit);
+	TESTW(iscntrl);
+	TESTW(isspace);
+	TESTEOF(isalpha);
+	TESTEOF(isdigit);
+	TESTEOF(isgraph);
+	TESTEOF(islower);
+	TESTEOF(isupper);
+	TESTEOF(isprint);
+	TESTEOF(ispunct);
+	TESTEOF(isxdigit);
+	TESTEOF(isdigit);
+	TESTEOF(iscntrl);
+	TESTEOF(isspace);
+}
+
+void test3()
+{
+	int i, n;
+
+	puts("\ntest3");
+	TESTLU(tolower);
+	TESTLU(toupper);
+}	
+
+#undef tolower
+#undef toupper
+
+void test4()
+{
+	int i, n;
+
+	puts("\ntest4");
+	TESTLU(tolower);
+	TESTLU(toupper);
+	assert(tolower(EOF) == EOF);
+	assert(toupper(EOF) == EOF);
+}
+
+int
+main()
+{
+	test1();
+	test2();
+	test3();
+	test4();
+
+	return 0;
+}
+
+/*
+output:
+
+test1
+isalnum: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+isalpha: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+isdigit: 0123456789
+isgraph: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+islower: abcdefghijklmnopqrstuvwxyz
+isupper: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+isprint:  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+ispunct: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
+isxdigit: 0123456789ABCDEFabcdef
+isdigit: 0123456789
+iscntrl: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127
+isspace: 9 10 11 12 13 32
+isalpha: !EOF
+isdigit: !EOF
+isgraph: !EOF
+islower: !EOF
+isupper: !EOF
+isprint: !EOF
+ispunct: !EOF
+isxdigit: !EOF
+isdigit: !EOF
+iscntrl: !EOF
+isspace: !EOF
+
+test2
+isalnum: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+isalpha: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+isdigit: 0123456789
+isgraph: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+islower: abcdefghijklmnopqrstuvwxyz
+isupper: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+isprint:  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+ispunct: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
+isxdigit: 0123456789ABCDEFabcdef
+isdigit: 0123456789
+iscntrl: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127
+isspace: 9 10 11 12 13 32
+isalpha: !EOF
+isdigit: !EOF
+isgraph: !EOF
+islower: !EOF
+isupper: !EOF
+isprint: !EOF
+ispunct: !EOF
+isxdigit: !EOF
+isdigit: !EOF
+iscntrl: !EOF
+isspace: !EOF
+
+test3
+tolower: ! <-> !
+tolower: " <-> "
+tolower: # <-> #
+tolower: $ <-> $
+tolower: % <-> %
+tolower: & <-> &
+tolower: ' <-> '
+tolower: ( <-> (
+tolower: ) <-> )
+tolower: * <-> *
+tolower: + <-> +
+tolower: , <-> ,
+tolower: - <-> -
+tolower: . <-> .
+tolower: / <-> /
+tolower: 0 <-> 0
+tolower: 1 <-> 1
+tolower: 2 <-> 2
+tolower: 3 <-> 3
+tolower: 4 <-> 4
+tolower: 5 <-> 5
+tolower: 6 <-> 6
+tolower: 7 <-> 7
+tolower: 8 <-> 8
+tolower: 9 <-> 9
+tolower: : <-> :
+tolower: ; <-> ;
+tolower: < <-> <
+tolower: = <-> =
+tolower: > <-> >
+tolower: ? <-> ?
+tolower: @ <-> @
+tolower: A <-> a
+tolower: B <-> b
+tolower: C <-> c
+tolower: D <-> d
+tolower: E <-> e
+tolower: F <-> f
+tolower: G <-> g
+tolower: H <-> h
+tolower: I <-> i
+tolower: J <-> j
+tolower: K <-> k
+tolower: L <-> l
+tolower: M <-> m
+tolower: N <-> n
+tolower: O <-> o
+tolower: P <-> p
+tolower: Q <-> q
+tolower: R <-> r
+tolower: S <-> s
+tolower: T <-> t
+tolower: U <-> u
+tolower: V <-> v
+tolower: W <-> w
+tolower: X <-> x
+tolower: Y <-> y
+tolower: Z <-> z
+tolower: [ <-> [
+tolower: \ <-> \
+tolower: ] <-> ]
+tolower: ^ <-> ^
+tolower: _ <-> _
+tolower: ` <-> `
+tolower: a <-> a
+tolower: b <-> b
+tolower: c <-> c
+tolower: d <-> d
+tolower: e <-> e
+tolower: f <-> f
+tolower: g <-> g
+tolower: h <-> h
+tolower: i <-> i
+tolower: j <-> j
+tolower: k <-> k
+tolower: l <-> l
+tolower: m <-> m
+tolower: n <-> n
+tolower: o <-> o
+tolower: p <-> p
+tolower: q <-> q
+tolower: r <-> r
+tolower: s <-> s
+tolower: t <-> t
+tolower: u <-> u
+tolower: v <-> v
+tolower: w <-> w
+tolower: x <-> x
+tolower: y <-> y
+tolower: z <-> z
+tolower: { <-> {
+tolower: | <-> |
+tolower: } <-> }
+tolower: ~ <-> ~
+toupper: ! <-> !
+toupper: " <-> "
+toupper: # <-> #
+toupper: $ <-> $
+toupper: % <-> %
+toupper: & <-> &
+toupper: ' <-> '
+toupper: ( <-> (
+toupper: ) <-> )
+toupper: * <-> *
+toupper: + <-> +
+toupper: , <-> ,
+toupper: - <-> -
+toupper: . <-> .
+toupper: / <-> /
+toupper: 0 <-> 0
+toupper: 1 <-> 1
+toupper: 2 <-> 2
+toupper: 3 <-> 3
+toupper: 4 <-> 4
+toupper: 5 <-> 5
+toupper: 6 <-> 6
+toupper: 7 <-> 7
+toupper: 8 <-> 8
+toupper: 9 <-> 9
+toupper: : <-> :
+toupper: ; <-> ;
+toupper: < <-> <
+toupper: = <-> =
+toupper: > <-> >
+toupper: ? <-> ?
+toupper: @ <-> @
+toupper: A <-> A
+toupper: B <-> B
+toupper: C <-> C
+toupper: D <-> D
+toupper: E <-> E
+toupper: F <-> F
+toupper: G <-> G
+toupper: H <-> H
+toupper: I <-> I
+toupper: J <-> J
+toupper: K <-> K
+toupper: L <-> L
+toupper: M <-> M
+toupper: N <-> N
+toupper: O <-> O
+toupper: P <-> P
+toupper: Q <-> Q
+toupper: R <-> R
+toupper: S <-> S
+toupper: T <-> T
+toupper: U <-> U
+toupper: V <-> V
+toupper: W <-> W
+toupper: X <-> X
+toupper: Y <-> Y
+toupper: Z <-> Z
+toupper: [ <-> [
+toupper: \ <-> \
+toupper: ] <-> ]
+toupper: ^ <-> ^
+toupper: _ <-> _
+toupper: ` <-> `
+toupper: a <-> A
+toupper: b <-> B
+toupper: c <-> C
+toupper: d <-> D
+toupper: e <-> E
+toupper: f <-> F
+toupper: g <-> G
+toupper: h <-> H
+toupper: i <-> I
+toupper: j <-> J
+toupper: k <-> K
+toupper: l <-> L
+toupper: m <-> M
+toupper: n <-> N
+toupper: o <-> O
+toupper: p <-> P
+toupper: q <-> Q
+toupper: r <-> R
+toupper: s <-> S
+toupper: t <-> T
+toupper: u <-> U
+toupper: v <-> V
+toupper: w <-> W
+toupper: x <-> X
+toupper: y <-> Y
+toupper: z <-> Z
+toupper: { <-> {
+toupper: | <-> |
+toupper: } <-> }
+toupper: ~ <-> ~
+
+test4
+tolower: ! <-> !
+tolower: " <-> "
+tolower: # <-> #
+tolower: $ <-> $
+tolower: % <-> %
+tolower: & <-> &
+tolower: ' <-> '
+tolower: ( <-> (
+tolower: ) <-> )
+tolower: * <-> *
+tolower: + <-> +
+tolower: , <-> ,
+tolower: - <-> -
+tolower: . <-> .
+tolower: / <-> /
+tolower: 0 <-> 0
+tolower: 1 <-> 1
+tolower: 2 <-> 2
+tolower: 3 <-> 3
+tolower: 4 <-> 4
+tolower: 5 <-> 5
+tolower: 6 <-> 6
+tolower: 7 <-> 7
+tolower: 8 <-> 8
+tolower: 9 <-> 9
+tolower: : <-> :
+tolower: ; <-> ;
+tolower: < <-> <
+tolower: = <-> =
+tolower: > <-> >
+tolower: ? <-> ?
+tolower: @ <-> @
+tolower: A <-> a
+tolower: B <-> b
+tolower: C <-> c
+tolower: D <-> d
+tolower: E <-> e
+tolower: F <-> f
+tolower: G <-> g
+tolower: H <-> h
+tolower: I <-> i
+tolower: J <-> j
+tolower: K <-> k
+tolower: L <-> l
+tolower: M <-> m
+tolower: N <-> n
+tolower: O <-> o
+tolower: P <-> p
+tolower: Q <-> q
+tolower: R <-> r
+tolower: S <-> s
+tolower: T <-> t
+tolower: U <-> u
+tolower: V <-> v
+tolower: W <-> w
+tolower: X <-> x
+tolower: Y <-> y
+tolower: Z <-> z
+tolower: [ <-> [
+tolower: \ <-> \
+tolower: ] <-> ]
+tolower: ^ <-> ^
+tolower: _ <-> _
+tolower: ` <-> `
+tolower: a <-> a
+tolower: b <-> b
+tolower: c <-> c
+tolower: d <-> d
+tolower: e <-> e
+tolower: f <-> f
+tolower: g <-> g
+tolower: h <-> h
+tolower: i <-> i
+tolower: j <-> j
+tolower: k <-> k
+tolower: l <-> l
+tolower: m <-> m
+tolower: n <-> n
+tolower: o <-> o
+tolower: p <-> p
+tolower: q <-> q
+tolower: r <-> r
+tolower: s <-> s
+tolower: t <-> t
+tolower: u <-> u
+tolower: v <-> v
+tolower: w <-> w
+tolower: x <-> x
+tolower: y <-> y
+tolower: z <-> z
+tolower: { <-> {
+tolower: | <-> |
+tolower: } <-> }
+tolower: ~ <-> ~
+toupper: ! <-> !
+toupper: " <-> "
+toupper: # <-> #
+toupper: $ <-> $
+toupper: % <-> %
+toupper: & <-> &
+toupper: ' <-> '
+toupper: ( <-> (
+toupper: ) <-> )
+toupper: * <-> *
+toupper: + <-> +
+toupper: , <-> ,
+toupper: - <-> -
+toupper: . <-> .
+toupper: / <-> /
+toupper: 0 <-> 0
+toupper: 1 <-> 1
+toupper: 2 <-> 2
+toupper: 3 <-> 3
+toupper: 4 <-> 4
+toupper: 5 <-> 5
+toupper: 6 <-> 6
+toupper: 7 <-> 7
+toupper: 8 <-> 8
+toupper: 9 <-> 9
+toupper: : <-> :
+toupper: ; <-> ;
+toupper: < <-> <
+toupper: = <-> =
+toupper: > <-> >
+toupper: ? <-> ?
+toupper: @ <-> @
+toupper: A <-> A
+toupper: B <-> B
+toupper: C <-> C
+toupper: D <-> D
+toupper: E <-> E
+toupper: F <-> F
+toupper: G <-> G
+toupper: H <-> H
+toupper: I <-> I
+toupper: J <-> J
+toupper: K <-> K
+toupper: L <-> L
+toupper: M <-> M
+toupper: N <-> N
+toupper: O <-> O
+toupper: P <-> P
+toupper: Q <-> Q
+toupper: R <-> R
+toupper: S <-> S
+toupper: T <-> T
+toupper: U <-> U
+toupper: V <-> V
+toupper: W <-> W
+toupper: X <-> X
+toupper: Y <-> Y
+toupper: Z <-> Z
+toupper: [ <-> [
+toupper: \ <-> \
+toupper: ] <-> ]
+toupper: ^ <-> ^
+toupper: _ <-> _
+toupper: ` <-> `
+toupper: a <-> A
+toupper: b <-> B
+toupper: c <-> C
+toupper: d <-> D
+toupper: e <-> E
+toupper: f <-> F
+toupper: g <-> G
+toupper: h <-> H
+toupper: i <-> I
+toupper: j <-> J
+toupper: k <-> K
+toupper: l <-> L
+toupper: m <-> M
+toupper: n <-> N
+toupper: o <-> O
+toupper: p <-> P
+toupper: q <-> Q
+toupper: r <-> R
+toupper: s <-> S
+toupper: t <-> T
+toupper: u <-> U
+toupper: v <-> V
+toupper: w <-> W
+toupper: x <-> X
+toupper: y <-> Y
+toupper: z <-> Z
+toupper: { <-> {
+toupper: | <-> |
+toupper: } <-> }
+toupper: ~ <-> ~
+end:
+*/
--- /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, CHAR_MAX);
+		if (CHAR_MIN != 0)
+			printf("wrong char min %d-%d", c, 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, CHAR_MAX);
+		c = -c - 1;
+		if (c != CHAR_MIN)
+			printf("wrong char min %d-%d", c, 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
@@ -17,6 +17,10 @@
 		sys=$2
 		shift 2
 		;;
+	-o)
+		out=$2
+		shift 2
+		;;
 	-*)
 		echo usage: cc.sh [-t target] file
 		exit 1
@@ -26,6 +30,7 @@
 
 sys=${sys:-`uname | tr 'A-Z' 'a-z'`}
 abi=${abi:-amd64-sysv}
+out=${out:-a.out}
 root=${root:-$SCCPREFIX}
 inc=$root/include/scc
 arch_inc=$root/include/scc/bits/$abi
@@ -32,5 +37,10 @@
 lib=$root/lib/scc/${abi}-${sys}
 obj=${1%.c}.o
 
-gcc -fno-stack-protector -std=c99 -static -nostdinc -I$inc -I$arch_inc -c $1
-ld -z nodefaultlib -static -L$lib $lib/crt.o $obj -lc
+if ! gcc -nopie 2>&1 | grep unrecogn >/dev/null
+then
+	pie=-nopie
+fi
+
+gcc -std=c99 -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/chktest.sh
+++ b/tests/libc/execute/chktest.sh
@@ -1,16 +1,21 @@
 #!/bin/sh
 
 file=${1?' empty input file'}
-trap "rm -f a.out" 0 1 2 3 15
+tmp1=`mktemp`
+tmp2=`mktemp`
+trap "rm -f a.out *.o $tmp1 $tmp2" 0 1 2 3 15
 ulimit -c 0
 rm -f test.log
 
 while read i state
 do
-	echo $i >>test.log
-	rm -f a.out
+	rm -f a.out *.o $tmp1 $tmp2
 
-	(./cc.sh $CFLAGS $i && ./a.out) 2>test.log &&
+	(echo $i
+	 ./cc.sh $CFLAGS $i.c
+	 echo '/^output:$/+;/^end:$/-'w $tmp1 | ed -s $i.c
+	 ./a.out > $tmp2
+	 diff -u $tmp1 $tmp2) >> test.log 2>&1 &&
 	printf '[PASS]' || printf '[FAIL]'
 	printf '%s: %s\n' "$state" "$i"
 done < $file
--- a/tests/libc/execute/libc-tests.lst
+++ b/tests/libc/execute/libc-tests.lst
@@ -1,1 +1,6 @@
-0001-abort.c
+0001-abort
+0002-assert
+0003-assert
+0004-abort
+0005-ctype
+0006-limits
--- a/tests/scc/execute/0172-hexa.c
+++ b/tests/scc/execute/0172-hexa.c
@@ -1,10 +1,13 @@
 int
 main(void)
 {
-        return 0xa == 0xA &&
-               0xb == 0xB &&
-               0xc == 0xC &&
-               0xd == 0xD &&
-               0xe == 0xE &&
-               0xf == 0xF;
+	if (0xa != 0xA ||
+	    0xb != 0xB ||
+	    0xc != 0xC ||
+	    0xd != 0xD ||
+	    0xe != 0xE ||
+	    0xf != 0xF) {
+		return 1;
+	}
+	return 0;
 }
--- a/tests/scc/execute/scc-tests.lst
+++ b/tests/scc/execute/scc-tests.lst
@@ -162,7 +162,7 @@
 0169-string.c [TODO]
 0170-line.c [TODO]
 0171-macros.c [TODO]
-0172-hexa.c [TODO]
+0172-hexa.c
 0173-macro.c
 0174-decay.c [TODO]
 0175-defined.c