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
--- 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(/\*\//, "")
+}' /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