summaryrefslogtreecommitdiff
path: root/src/regress/lib/libc
diff options
context:
space:
mode:
authorcvs2svn <admin@example.com>2019-11-19 19:57:05 +0000
committercvs2svn <admin@example.com>2019-11-19 19:57:05 +0000
commite9f9eb6198f1757b7c0dfef043fadf1fa8243022 (patch)
treeb5a648f6ccaf6c1cd9915ddb45503d1fccfeba0e /src/regress/lib/libc
parentab72e3a6f7e8d5c71bbba034410468781d5923b6 (diff)
downloadopenbsd-bluhm_20191119.tar.gz
openbsd-bluhm_20191119.tar.bz2
openbsd-bluhm_20191119.zip
This commit was manufactured by cvs2git to create tag 'bluhm_20191119'.bluhm_20191119
Diffstat (limited to 'src/regress/lib/libc')
-rw-r--r--src/regress/lib/libc/Makefile35
-rw-r--r--src/regress/lib/libc/_setjmp/Makefile11
-rw-r--r--src/regress/lib/libc/alloca/Makefile5
-rw-r--r--src/regress/lib/libc/alloca/alloca.c21
-rw-r--r--src/regress/lib/libc/arc4random-fork/Makefile25
-rw-r--r--src/regress/lib/libc/arc4random-fork/arc4random-fork.c171
-rw-r--r--src/regress/lib/libc/arch/alpha/Makefile9
-rw-r--r--src/regress/lib/libc/arch/alpha/divremtest/Makefile30
-rw-r--r--src/regress/lib/libc/arch/alpha/divremtest/divremtest.c184
-rw-r--r--src/regress/lib/libc/arch/alpha/divremtest/mkcases.c64
-rw-r--r--src/regress/lib/libc/arch/alpha/divremtest/mktestcases.c68
-rw-r--r--src/regress/lib/libc/asr/Makefile52
-rw-r--r--src/regress/lib/libc/asr/bin/Makefile10
-rw-r--r--src/regress/lib/libc/asr/bin/Makefile.inc8
-rw-r--r--src/regress/lib/libc/asr/bin/common.c693
-rw-r--r--src/regress/lib/libc/asr/bin/common.h138
-rw-r--r--src/regress/lib/libc/asr/bin/getaddrinfo.c138
-rw-r--r--src/regress/lib/libc/asr/bin/getaddrinfo/Makefile8
-rw-r--r--src/regress/lib/libc/asr/bin/gethostnamadr.c116
-rw-r--r--src/regress/lib/libc/asr/bin/gethostnamadr/Makefile8
-rw-r--r--src/regress/lib/libc/asr/bin/getnameinfo.c115
-rw-r--r--src/regress/lib/libc/asr/bin/getnameinfo/Makefile8
-rw-r--r--src/regress/lib/libc/asr/bin/getnetnamadr.c88
-rw-r--r--src/regress/lib/libc/asr/bin/getnetnamadr/Makefile8
-rw-r--r--src/regress/lib/libc/asr/bin/getrrsetbyname.c91
-rw-r--r--src/regress/lib/libc/asr/bin/getrrsetbyname/Makefile8
-rw-r--r--src/regress/lib/libc/asr/bin/res_mkquery.c322
-rw-r--r--src/regress/lib/libc/asr/bin/res_mkquery/Makefile8
-rw-r--r--src/regress/lib/libc/asr/bin/res_query.c358
-rw-r--r--src/regress/lib/libc/asr/bin/res_query/Makefile8
-rw-r--r--src/regress/lib/libc/asr/bin/threads.c140
-rw-r--r--src/regress/lib/libc/asr/bin/threads/Makefile10
-rw-r--r--src/regress/lib/libc/asr/regress.sh111
-rw-r--r--src/regress/lib/libc/asr/regress.subr122
-rw-r--r--src/regress/lib/libc/atexit/Makefile16
-rw-r--r--src/regress/lib/libc/atexit/atexit_test.c144
-rw-r--r--src/regress/lib/libc/atexit/invalid.ok4
-rw-r--r--src/regress/lib/libc/atexit/valid.ok5
-rw-r--r--src/regress/lib/libc/basename/Makefile3
-rw-r--r--src/regress/lib/libc/basename/basename_test.c79
-rw-r--r--src/regress/lib/libc/cephes/Makefile7
-rw-r--r--src/regress/lib/libc/cephes/drand.c174
-rw-r--r--src/regress/lib/libc/cephes/econst.c114
-rw-r--r--src/regress/lib/libc/cephes/eexp.c86
-rw-r--r--src/regress/lib/libc/cephes/ehead.h59
-rw-r--r--src/regress/lib/libc/cephes/elog.c110
-rw-r--r--src/regress/lib/libc/cephes/epow.c187
-rw-r--r--src/regress/lib/libc/cephes/etanh.c70
-rw-r--r--src/regress/lib/libc/cephes/etodec.c199
-rw-r--r--src/regress/lib/libc/cephes/ieee.c4153
-rw-r--r--src/regress/lib/libc/cephes/ieetst.c881
-rw-r--r--src/regress/lib/libc/cephes/mconf.h189
-rw-r--r--src/regress/lib/libc/cephes/mtherr.c114
-rw-r--r--src/regress/lib/libc/cxa-atexit/Makefile7
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd1/Makefile9
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd1/gd1.C32
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd1/shlib_version2
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd2/Makefile9
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd2/gd2.C32
-rw-r--r--src/regress/lib/libc/cxa-atexit/libgd2/shlib_version2
-rw-r--r--src/regress/lib/libc/cxa-atexit/test1/Makefile29
-rw-r--r--src/regress/lib/libc/cxa-atexit/test1/test1.C63
-rw-r--r--src/regress/lib/libc/db/Makefile22
-rw-r--r--src/regress/lib/libc/db/README69
-rw-r--r--src/regress/lib/libc/db/dbtest.c731
-rw-r--r--src/regress/lib/libc/db/run.test707
-rw-r--r--src/regress/lib/libc/dirname/Makefile3
-rw-r--r--src/regress/lib/libc/dirname/dirname_test.c83
-rw-r--r--src/regress/lib/libc/env/Makefile5
-rw-r--r--src/regress/lib/libc/env/envtest.c125
-rw-r--r--src/regress/lib/libc/explicit_bzero/Makefile5
-rw-r--r--src/regress/lib/libc/explicit_bzero/explicit_bzero.c197
-rw-r--r--src/regress/lib/libc/fmemopen/Makefile5
-rw-r--r--src/regress/lib/libc/fmemopen/fmemopentest.c212
-rw-r--r--src/regress/lib/libc/fnmatch/Makefile10
-rw-r--r--src/regress/lib/libc/fnmatch/fnm_test.c62
-rw-r--r--src/regress/lib/libc/fnmatch/fnm_test.in260
-rw-r--r--src/regress/lib/libc/fpclassify/Makefile5
-rw-r--r--src/regress/lib/libc/fpclassify/fpclassify.c76
-rw-r--r--src/regress/lib/libc/fread/Makefile5
-rw-r--r--src/regress/lib/libc/fread/fread.c153
-rw-r--r--src/regress/lib/libc/gcvt/Makefile5
-rw-r--r--src/regress/lib/libc/gcvt/gcvt_test.c120
-rw-r--r--src/regress/lib/libc/getaddrinfo/Makefile10
-rw-r--r--src/regress/lib/libc/getaddrinfo/answer110
-rw-r--r--src/regress/lib/libc/getaddrinfo/gaitest.c195
-rw-r--r--src/regress/lib/libc/getaddrinfo/testsuite.sh89
-rw-r--r--src/regress/lib/libc/getcap/Makefile10
-rw-r--r--src/regress/lib/libc/getcap/getcaptest.c26
-rw-r--r--src/regress/lib/libc/getcap/shortcap.in1
-rw-r--r--src/regress/lib/libc/getopt_long/Makefile32
-rw-r--r--src/regress/lib/libc/getopt_long/getopt_long_test.c114
-rw-r--r--src/regress/lib/libc/getopt_long/test.ok84
-rw-r--r--src/regress/lib/libc/glob/Makefile16
-rw-r--r--src/regress/lib/libc/glob/files47
-rw-r--r--src/regress/lib/libc/glob/globtest.c142
-rw-r--r--src/regress/lib/libc/glob/globtest.in116
-rw-r--r--src/regress/lib/libc/hsearch/Makefile5
-rw-r--r--src/regress/lib/libc/hsearch/hsearchtest.c122
-rw-r--r--src/regress/lib/libc/ieeefp/Makefile8
-rw-r--r--src/regress/lib/libc/ieeefp/except/Makefile19
-rw-r--r--src/regress/lib/libc/ieeefp/except/except.c110
-rw-r--r--src/regress/lib/libc/ieeefp/inf/Makefile9
-rw-r--r--src/regress/lib/libc/ieeefp/inf/inf.c16
-rw-r--r--src/regress/lib/libc/ieeefp/infinity/Makefile22
-rw-r--r--src/regress/lib/libc/ieeefp/infinity/infinity.c77
-rw-r--r--src/regress/lib/libc/ieeefp/round/Makefile5
-rw-r--r--src/regress/lib/libc/ieeefp/round/round.c45
-rw-r--r--src/regress/lib/libc/ifnameindex/Makefile12
-rw-r--r--src/regress/lib/libc/ifnameindex/ifnitest.c32
-rw-r--r--src/regress/lib/libc/ldexp/Makefile5
-rw-r--r--src/regress/lib/libc/ldexp/ldexp_test.c75
-rw-r--r--src/regress/lib/libc/locale/Makefile5
-rw-r--r--src/regress/lib/libc/locale/check_isw/Makefile8
-rw-r--r--src/regress/lib/libc/locale/check_isw/check_isw.c147
-rw-r--r--src/regress/lib/libc/locale/mbrtowc/Makefile5
-rw-r--r--src/regress/lib/libc/locale/mbrtowc/test_mbrtowc.c85
-rw-r--r--src/regress/lib/libc/locale/setlocale/Makefile8
-rw-r--r--src/regress/lib/libc/locale/setlocale/setlocale.c125
-rw-r--r--src/regress/lib/libc/locale/uselocale/Makefile10
-rw-r--r--src/regress/lib/libc/locale/uselocale/uselocale.c482
-rw-r--r--src/regress/lib/libc/locale/wcrtomb/Makefile5
-rw-r--r--src/regress/lib/libc/locale/wcrtomb/test_wcrtomb.c85
-rw-r--r--src/regress/lib/libc/longjmp/Makefile13
-rw-r--r--src/regress/lib/libc/longjmp/longjmp.c71
-rw-r--r--src/regress/lib/libc/malloc/Makefile8
-rw-r--r--src/regress/lib/libc/malloc/malloc0test/Makefile11
-rw-r--r--src/regress/lib/libc/malloc/malloc0test/malloc0test.c120
-rw-r--r--src/regress/lib/libc/malloc/malloc_errno/Makefile5
-rw-r--r--src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c49
-rw-r--r--src/regress/lib/libc/malloc/malloc_general/Makefile27
-rw-r--r--src/regress/lib/libc/malloc/malloc_general/malloc_general.c123
-rw-r--r--src/regress/lib/libc/malloc/malloc_threaderr/Makefile13
-rw-r--r--src/regress/lib/libc/malloc/malloc_threaderr/malloc_threaderr.c58
-rw-r--r--src/regress/lib/libc/malloc/malloc_ulimit1/Makefile5
-rw-r--r--src/regress/lib/libc/malloc/malloc_ulimit1/malloc_ulimit1.c48
-rw-r--r--src/regress/lib/libc/malloc/malloc_ulimit2/Makefile5
-rw-r--r--src/regress/lib/libc/malloc/malloc_ulimit2/malloc_ulimit2.c46
-rw-r--r--src/regress/lib/libc/mkstemp/Makefile19
-rw-r--r--src/regress/lib/libc/mkstemp/mkstemp_test.c165
-rw-r--r--src/regress/lib/libc/modf/Makefile3
-rw-r--r--src/regress/lib/libc/modf/modf_test.c35
-rw-r--r--src/regress/lib/libc/netdb/Makefile5
-rw-r--r--src/regress/lib/libc/netdb/netdb.c183
-rw-r--r--src/regress/lib/libc/open_memstream/Makefile5
-rw-r--r--src/regress/lib/libc/open_memstream/open_memstreamtest.c186
-rw-r--r--src/regress/lib/libc/orientation/Makefile10
-rw-r--r--src/regress/lib/libc/orientation/orientation_test.c264
-rw-r--r--src/regress/lib/libc/popen/Makefile5
-rw-r--r--src/regress/lib/libc/popen/popen.c98
-rw-r--r--src/regress/lib/libc/printf/Makefile5
-rw-r--r--src/regress/lib/libc/printf/fp.c217
-rw-r--r--src/regress/lib/libc/qsort/Makefile13
-rw-r--r--src/regress/lib/libc/qsort/antiqsort.c58
-rw-r--r--src/regress/lib/libc/qsort/qsort_test.c777
-rw-r--r--src/regress/lib/libc/regex/Makefile27
-rw-r--r--src/regress/lib/libc/regex/debug.c245
-rw-r--r--src/regress/lib/libc/regex/debug.ih17
-rw-r--r--src/regress/lib/libc/regex/main.c519
-rw-r--r--src/regress/lib/libc/regex/main.ih22
-rw-r--r--src/regress/lib/libc/regex/split.c317
-rw-r--r--src/regress/lib/libc/regex/t_exhaust.c184
-rw-r--r--src/regress/lib/libc/regex/tests594
-rw-r--r--src/regress/lib/libc/setjmp-fpu/Makefile8
-rw-r--r--src/regress/lib/libc/setjmp-fpu/_setjmp.c7
-rw-r--r--src/regress/lib/libc/setjmp-fpu/main.c12
-rw-r--r--src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c46
-rw-r--r--src/regress/lib/libc/setjmp-fpu/setjmp.c7
-rw-r--r--src/regress/lib/libc/setjmp-fpu/sigsetjmp.c7
-rw-r--r--src/regress/lib/libc/setjmp-signal/Makefile5
-rw-r--r--src/regress/lib/libc/setjmp-signal/setjmp-signal.c26
-rw-r--r--src/regress/lib/libc/setjmp/Makefile9
-rw-r--r--src/regress/lib/libc/setjmp/jmptest.c136
-rw-r--r--src/regress/lib/libc/sigsetjmp/Makefile19
-rw-r--r--src/regress/lib/libc/sigthr/Makefile5
-rw-r--r--src/regress/lib/libc/sigthr/sigthr_test.c66
-rw-r--r--src/regress/lib/libc/sleep/Makefile13
-rw-r--r--src/regress/lib/libc/sleep/sleep_test.c85
-rw-r--r--src/regress/lib/libc/sprintf/Makefile7
-rw-r--r--src/regress/lib/libc/sprintf/sprintf_test.c102
-rw-r--r--src/regress/lib/libc/stdio_threading/Makefile3
-rw-r--r--src/regress/lib/libc/stdio_threading/fgetln/Makefile6
-rwxr-xr-xsrc/regress/lib/libc/stdio_threading/fgetln/fgetln_test.c70
-rw-r--r--src/regress/lib/libc/stdio_threading/fgets/Makefile6
-rwxr-xr-xsrc/regress/lib/libc/stdio_threading/fgets/fgets_test.c69
-rw-r--r--src/regress/lib/libc/stdio_threading/fopen/Makefile6
-rwxr-xr-xsrc/regress/lib/libc/stdio_threading/fopen/fopen_test.c49
-rw-r--r--src/regress/lib/libc/stdio_threading/fputs/Makefile6
-rwxr-xr-xsrc/regress/lib/libc/stdio_threading/fputs/fputs_test.c67
-rw-r--r--src/regress/lib/libc/stdio_threading/fread/Makefile6
-rwxr-xr-xsrc/regress/lib/libc/stdio_threading/fread/fread_test.c71
-rw-r--r--src/regress/lib/libc/stdio_threading/fwrite/Makefile6
-rwxr-xr-xsrc/regress/lib/libc/stdio_threading/fwrite/fwrite_test.c67
-rw-r--r--src/regress/lib/libc/stdio_threading/include/local.h83
-rw-r--r--src/regress/lib/libc/stpncpy/Makefile3
-rw-r--r--src/regress/lib/libc/stpncpy/stpncpy_test.c24
-rw-r--r--src/regress/lib/libc/strerror/Makefile12
-rw-r--r--src/regress/lib/libc/strerror/strerror_test.c65
-rw-r--r--src/regress/lib/libc/strerror/valid.ok65
-rw-r--r--src/regress/lib/libc/strlcat/Makefile5
-rw-r--r--src/regress/lib/libc/strlcat/strlcattest.c174
-rw-r--r--src/regress/lib/libc/strlcpy/Makefile5
-rw-r--r--src/regress/lib/libc/strlcpy/strlcpytest.c170
-rw-r--r--src/regress/lib/libc/strnlen/Makefile5
-rw-r--r--src/regress/lib/libc/strnlen/strnlentest.c69
-rw-r--r--src/regress/lib/libc/strtod/Makefile5
-rw-r--r--src/regress/lib/libc/strtod/strtodtest.c23
-rw-r--r--src/regress/lib/libc/strtol/Makefile5
-rw-r--r--src/regress/lib/libc/strtol/strtoltest.c81
-rw-r--r--src/regress/lib/libc/strtonum/Makefile5
-rw-r--r--src/regress/lib/libc/strtonum/strtonumtest.c64
-rw-r--r--src/regress/lib/libc/telldir/Makefile9
-rw-r--r--src/regress/lib/libc/telldir/main.c14
-rw-r--r--src/regress/lib/libc/telldir/shortseek.c91
-rw-r--r--src/regress/lib/libc/telldir/telldir.c71
-rw-r--r--src/regress/lib/libc/telldir/utils.c53
-rw-r--r--src/regress/lib/libc/telldir/utils.h6
-rw-r--r--src/regress/lib/libc/time/Makefile5
-rw-r--r--src/regress/lib/libc/time/strptime/Makefile12
-rw-r--r--src/regress/lib/libc/time/strptime/expected346
-rw-r--r--src/regress/lib/libc/time/strptime/main.c110
-rw-r--r--src/regress/lib/libc/time/strptime/tests267
-rw-r--r--src/regress/lib/libc/timingsafe/Makefile5
-rw-r--r--src/regress/lib/libc/timingsafe/timingsafe.c68
-rw-r--r--src/regress/lib/libc/vis/Makefile10
-rw-r--r--src/regress/lib/libc/vis/valid.ok2
-rw-r--r--src/regress/lib/libc/vis/vis_test.c113
-rw-r--r--src/regress/lib/libc/wprintf/Makefile5
-rw-r--r--src/regress/lib/libc/wprintf/wfp.c218
229 files changed, 0 insertions, 23184 deletions
diff --git a/src/regress/lib/libc/Makefile b/src/regress/lib/libc/Makefile
deleted file mode 100644
index 40288cf5f1..0000000000
--- a/src/regress/lib/libc/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
1# $OpenBSD: Makefile,v 1.52 2018/12/16 15:36:27 millert Exp $
2
3SUBDIR+= _setjmp
4SUBDIR+= alloca arc4random-fork atexit
5SUBDIR+= basename
6SUBDIR+= cephes cxa-atexit
7SUBDIR+= db dirname
8SUBDIR+= env explicit_bzero
9SUBDIR+= fmemopen fnmatch fpclassify fread
10SUBDIR+= getaddrinfo getcap getopt_long glob
11SUBDIR+= hsearch
12SUBDIR+= ieeefp ifnameindex
13SUBDIR+= ldexp longjmp locale
14SUBDIR+= malloc mkstemp modf
15SUBDIR+= netdb
16SUBDIR+= open_memstream orientation
17SUBDIR+= popen printf
18SUBDIR+= qsort
19SUBDIR+= regex
20SUBDIR+= setjmp setjmp-signal sigsetjmp sprintf stdio_threading
21SUBDIR+= stpncpy strerror strlcat strlcpy strnlen strtod strtol strtonum
22SUBDIR+= telldir time timingsafe
23SUBDIR+= vis
24
25.if defined(REGRESS_FULL) || make(clean) || make(cleandir) || make(obj)
26SUBDIR+= setjmp-fpu
27.endif
28
29.if exists(arch/${MACHINE_ARCH})
30SUBDIR+= arch/${MACHINE_ARCH}
31.endif
32
33install:
34
35.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/_setjmp/Makefile b/src/regress/lib/libc/_setjmp/Makefile
deleted file mode 100644
index 5d58242523..0000000000
--- a/src/regress/lib/libc/_setjmp/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
1# $OpenBSD: Makefile,v 1.3 2002/01/01 23:00:51 art Exp $
2# $NetBSD: Makefile,v 1.2 1995/04/20 22:38:44 cgd Exp $
3
4PROG= _setjmptest
5SRCS= jmptest.c
6
7CFLAGS+= -DTEST_U_SETJMP
8
9.PATH: ${.CURDIR}/../setjmp
10
11.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/alloca/Makefile b/src/regress/lib/libc/alloca/Makefile
deleted file mode 100644
index f31417cda7..0000000000
--- a/src/regress/lib/libc/alloca/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2003/02/12 06:49:04 mickey Exp $
2
3PROG= alloca
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/alloca/alloca.c b/src/regress/lib/libc/alloca/alloca.c
deleted file mode 100644
index 54fa90edae..0000000000
--- a/src/regress/lib/libc/alloca/alloca.c
+++ /dev/null
@@ -1,21 +0,0 @@
1/* $OpenBSD: alloca.c,v 1.7 2004/03/10 01:17:45 deraadt Exp $ */
2
3/* Written by Michael Shalayeff, 2003, Public Domain. */
4
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8
9int
10main(int argc, char *argv[])
11{
12 char *q, *p;
13
14 p = alloca(41);
15 strlcpy(p, "hellow world", 41);
16
17 q = alloca(53);
18 strlcpy(q, "hellow world", 53);
19
20 exit(strcmp(p, q));
21}
diff --git a/src/regress/lib/libc/arc4random-fork/Makefile b/src/regress/lib/libc/arc4random-fork/Makefile
deleted file mode 100644
index 05762e33ff..0000000000
--- a/src/regress/lib/libc/arc4random-fork/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2014/06/18 08:24:00 matthew Exp $
2
3PROG= arc4random-fork
4
5REGRESS_TARGETS= \
6 run \
7 run-buf \
8 run-prefork \
9 run-buf-prefork
10
11run: ${PROG}
12 ./${PROG}
13
14run-buf: ${PROG}
15 ./${PROG} -b
16
17run-prefork: ${PROG}
18 ./${PROG} -p
19
20run-buf-prefork: ${PROG}
21 ./${PROG} -bp
22
23.PHONY: ${REGRESS_TARGETS}
24
25.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/arc4random-fork/arc4random-fork.c b/src/regress/lib/libc/arc4random-fork/arc4random-fork.c
deleted file mode 100644
index 4bc9c634f1..0000000000
--- a/src/regress/lib/libc/arc4random-fork/arc4random-fork.c
+++ /dev/null
@@ -1,171 +0,0 @@
1/*
2 * Copyright (c) 2014 Google Inc.
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <sys/mman.h>
18#include <sys/wait.h>
19#include <assert.h>
20#include <err.h>
21#include <errno.h>
22#include <signal.h>
23#include <stdlib.h>
24#include <string.h>
25#include <unistd.h>
26#include <stdint.h>
27
28#define CHECK(x) assert(x)
29#define CHECK_EQ(a, b) assert((a) == (b))
30#define CHECK_NE(a, b) assert((a) != (b))
31#define CHECK_GE(a, b) assert((a) >= (b))
32#define CHECK_LE(a, b) assert((a) <= (b))
33
34/* Test arc4random_buf(3) instead of arc4random(3). */
35static int flagbuf;
36
37/* Initialize arc4random(3) before forking. */
38static int flagprefork;
39
40enum {
41 N = 4096
42};
43
44typedef struct {
45 uint32_t x[N];
46} Buf;
47
48static int
49isfullbuf(const Buf *buf)
50{
51 size_t i;
52 for (i = 0; i < N; i++)
53 if (buf->x[i])
54 return (1);
55 return (0);
56}
57
58static void
59fillbuf(Buf *buf)
60{
61 if (flagbuf) {
62 arc4random_buf(buf->x, sizeof(buf->x));
63 } else {
64 size_t i;
65 for (i = 0; i < N; i++)
66 buf->x[i] = arc4random();
67 }
68}
69
70static void
71usage()
72{
73 errx(1, "usage: arc4random-fork [-bp]");
74}
75
76static pid_t
77safewaitpid(pid_t pid, int *status, int options)
78{
79 pid_t ret;
80 do {
81 ret = waitpid(pid, status, options);
82 } while (ret == -1 && errno == EINTR);
83 return (ret);
84}
85
86int
87main(int argc, char *argv[])
88{
89 int opt, status;
90 Buf *bufparent, *bufchildone, *bufchildtwo;
91 pid_t pidone, pidtwo;
92 size_t i, countone = 0, counttwo = 0, countkids = 0;
93
94 /* Ensure SIGCHLD isn't set to SIG_IGN. */
95 const struct sigaction sa = {
96 .sa_handler = SIG_DFL,
97 };
98 CHECK_EQ(0, sigaction(SIGCHLD, &sa, NULL));
99
100 while ((opt = getopt(argc, argv, "bp")) != -1) {
101 switch (opt) {
102 case 'b':
103 flagbuf = 1;
104 break;
105 case 'p':
106 flagprefork = 1;
107 break;
108 default:
109 usage();
110 }
111 }
112
113 if (flagprefork)
114 arc4random();
115
116 bufparent = mmap(NULL, sizeof(Buf), PROT_READ|PROT_WRITE,
117 MAP_ANON|MAP_PRIVATE, -1, 0);
118 CHECK_NE(MAP_FAILED, bufparent);
119
120 bufchildone = mmap(NULL, sizeof(Buf), PROT_READ|PROT_WRITE,
121 MAP_ANON|MAP_SHARED, -1, 0);
122 CHECK_NE(MAP_FAILED, bufchildone);
123
124 bufchildtwo = mmap(NULL, sizeof(Buf), PROT_READ|PROT_WRITE,
125 MAP_ANON|MAP_SHARED, -1, 0);
126 CHECK_NE(MAP_FAILED, bufchildtwo);
127
128 pidone = fork();
129 CHECK_GE(pidone, 0);
130 if (pidone == 0) {
131 fillbuf(bufchildone);
132 _exit(0);
133 }
134
135 pidtwo = fork();
136 CHECK_GE(pidtwo, 0);
137 if (pidtwo == 0) {
138 fillbuf(bufchildtwo);
139 _exit(0);
140 }
141
142 fillbuf(bufparent);
143
144 CHECK_EQ(pidone, safewaitpid(pidone, &status, 0));
145 CHECK(WIFEXITED(status));
146 CHECK_EQ(0, WEXITSTATUS(status));
147
148 CHECK_EQ(pidtwo, safewaitpid(pidtwo, &status, 0));
149 CHECK(WIFEXITED(status));
150 CHECK_EQ(0, WEXITSTATUS(status));
151
152 CHECK(isfullbuf(bufchildone));
153 CHECK(isfullbuf(bufchildtwo));
154
155 for (i = 0; i < N; i++) {
156 countone += bufparent->x[i] == bufchildone->x[i];
157 counttwo += bufparent->x[i] == bufchildtwo->x[i];
158 countkids += bufchildone->x[i] == bufchildtwo->x[i];
159 }
160
161 /*
162 * These checks are inherently probabilistic and theoretically risk
163 * flaking, but there's less than a 1 in 2^40 chance of more than
164 * one pairwise match between two vectors of 4096 32-bit integers.
165 */
166 CHECK_LE(countone, 1);
167 CHECK_LE(counttwo, 1);
168 CHECK_LE(countkids, 1);
169
170 return (0);
171}
diff --git a/src/regress/lib/libc/arch/alpha/Makefile b/src/regress/lib/libc/arch/alpha/Makefile
deleted file mode 100644
index 8c4dfb735c..0000000000
--- a/src/regress/lib/libc/arch/alpha/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
1# $OpenBSD: Makefile,v 1.3 2002/02/23 01:25:11 art Exp $
2# $NetBSD: Makefile,v 1.1 1995/04/24 05:53:31 cgd Exp $
3
4# do nothing here; none of the tests here can be run automatically
5SUBDIR=
6
7install:
8
9.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/arch/alpha/divremtest/Makefile b/src/regress/lib/libc/arch/alpha/divremtest/Makefile
deleted file mode 100644
index 1da3ac8494..0000000000
--- a/src/regress/lib/libc/arch/alpha/divremtest/Makefile
+++ /dev/null
@@ -1,30 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2001/01/29 02:05:39 niklas Exp $
2# $NetBSD: Makefile,v 1.1 1995/04/24 05:53:34 cgd Exp $
3
4PROG= divremtest
5NOMAN=
6
7CLEANFILES+= mkcases cases.c mktestcases testcases
8
9divremtest.c: cases.c
10
11cases.c: mkcases
12 /bin/rm -f cases.c
13 mkcases > cases.c
14
15# a typical strategy to use this:
16# compile a NetBSD divremtest binary, an OSF/1 divremtest binary, and an
17# OSF/1 mktestcases binary. You then run mktestecases | divremtest -g
18# on an OSF/1 machine, and pipe the output to an rsh to a NetBSD machine
19# which then runs divremtest. You can test an infinite number of random
20# values that way; I like to put a 'dd' in, so I can see how much I've done.
21
22testcases: mktestcases divremtest
23 /bin/rm -f testcases
24 mktestcases | divremtest -g > testcases
25
26regress:
27 @echo THIS TEST CANNOT BE RUN AUTOMATICALLY.
28 @false
29
30.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/arch/alpha/divremtest/divremtest.c b/src/regress/lib/libc/arch/alpha/divremtest/divremtest.c
deleted file mode 100644
index 3d9e8a6de2..0000000000
--- a/src/regress/lib/libc/arch/alpha/divremtest/divremtest.c
+++ /dev/null
@@ -1,184 +0,0 @@
1/* $OpenBSD: divremtest.c,v 1.2 2001/01/29 02:05:39 niklas Exp $ */
2/* $NetBSD: divremtest.c,v 1.1 1995/04/24 05:53:35 cgd Exp $ */
3
4/*
5 * Copyright (c) 1995 Christopher G. Demetriou
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Christopher G. Demetriou
19 * for the NetBSD Project.
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#include <stdio.h>
36#include <unistd.h>
37#include <signal.h>
38
39void testfile();
40void usage();
41
42int generate;
43
44int
45main(argc, argv)
46 int argc;
47 char **argv;
48{
49 int c;
50
51 signal(SIGFPE, SIG_IGN);
52
53 while ((c = getopt(argc, argv, "g")) != -1)
54 switch (c) {
55 case 'g':
56 generate = 1;
57 break;
58
59 default:
60 usage();
61 break;
62 }
63
64 argc -= optind;
65 argv += optind;
66
67 if (argc == 0)
68 testfile();
69 else
70 for (; argc != 0; argc--, argv++) {
71 if (freopen(argv[0], "r", stdin) == NULL) {
72 fprintf(stderr,
73 "divremtest: couldn't open %s\n",
74 argv[0]);
75 exit(1);
76 }
77
78 testfile();
79 }
80
81 exit(0);
82}
83
84void
85testfile()
86{
87 union operand {
88 unsigned long input;
89 int op_int;
90 unsigned int op_u_int;
91 long op_long;
92 unsigned long op_u_long;
93 } op1, op2, divres, modres, divwant, modwant;
94 char opspec[6];
95 int encoded, i;
96
97 while (scanf("%6c %lx %lx %lx %lx\n", opspec, &op1.input,
98 &op2.input, &divwant.input, &modwant.input) != EOF) {
99
100 encoded = 0;
101
102 for (i = 0; i < 6; i += 2) {
103 int posval;
104
105 switch (opspec[i]) {
106 case '.':
107 posval = 0;
108 break;
109 case '-':
110 posval = 1;
111 break;
112 default:
113 fprintf(stderr,
114 "unknown signedness spec %c\n",
115 opspec[i]);
116 exit(1);
117 }
118 encoded |= posval << ((5 - i) * 4);
119 }
120
121 for (i = 1; i < 6; i += 2) {
122 int posval;
123
124 switch (opspec[i]) {
125 case 'i':
126 posval = 0;
127 break;
128 case 'l':
129 posval = 1;
130 break;
131 default:
132 fprintf(stderr, "unknown length spec %c\n",
133 opspec[i]);
134 exit(1);
135 }
136 encoded |= posval << ((5 - i) * 4);
137 }
138
139 /* KILL ME!!! */
140 switch (encoded) {
141
142#define TRY_IT(a, b, c) \
143 divres.a = op1.b / op2.c; \
144 modres.a = op1.b % op2.c; \
145 if (generate) { \
146 printf("%6s 0x%016lx 0x%016lx 0x%016lx 0x%016lx\n", \
147 opspec, op1.input, op2.input, \
148 divres.a, modres.a); \
149 } else { \
150 if ((divres.a != divwant.a) || \
151 (modres.a != modwant.a)) { \
152 fprintf(stderr, "%6s 0x%016lx 0x%016lx\n", \
153 opspec, op1.input, op2.input); \
154 fprintf(stderr, "FAILED:\n"); \
155 fprintf(stderr, \
156 "div:\twanted 0x%16lx, got 0x%16lx\n", \
157 divwant.a, divres.a); \
158 fprintf(stderr, \
159 "mod:\twanted 0x%16lx, got 0x%16lx\n", \
160 modwant.a, modres.a); \
161 \
162 exit(1); \
163 } \
164 }
165
166#include "cases.c"
167
168#undef TRY_IT
169
170 default:
171 fprintf(stderr,
172 "INTERNAL ERROR: unknown encoding %x\n", encoded);
173 exit(1);
174 }
175 }
176}
177
178void
179usage()
180{
181
182 fprintf(stderr, "usage: divremtest [-v] [testfile ...]\n");
183 exit(1);
184}
diff --git a/src/regress/lib/libc/arch/alpha/divremtest/mkcases.c b/src/regress/lib/libc/arch/alpha/divremtest/mkcases.c
deleted file mode 100644
index fcb4765b8c..0000000000
--- a/src/regress/lib/libc/arch/alpha/divremtest/mkcases.c
+++ /dev/null
@@ -1,64 +0,0 @@
1/* $OpenBSD: mkcases.c,v 1.2 2001/01/29 02:05:39 niklas Exp $ */
2/* $NetBSD: mkcases.c,v 1.1 1995/04/24 05:53:36 cgd Exp $ */
3
4/*
5 * Copyright (c) 1995 Christopher G. Demetriou
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Christopher G. Demetriou
19 * for the NetBSD Project.
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35char *tab[4] = { "u_int", "int", "u_long", "long" };
36
37int
38main()
39{
40 int i;
41
42 for (i = 0; i < 64; i++) {
43 printf(
44" case 0x%d%d%d%d%d%d: /* %s <= %s op %s */\n",
45 (i >> 5) & 1,
46 (i >> 4) & 1,
47 (i >> 3) & 1,
48 (i >> 2) & 1,
49 (i >> 1) & 1,
50 (i >> 0) & 1,
51 tab[(i >> 4) & 0x3],
52 tab[(i >> 2) & 0x3],
53 tab[(i >> 0) & 0x3]);
54 printf(
55" TRY_IT(op_%s, op_%s, op_%s);\n",
56 tab[(i >> 4) & 0x3],
57 tab[(i >> 2) & 0x3],
58 tab[(i >> 0) & 0x3]);
59 printf(
60" break;\n\n");
61 }
62
63 exit(0);
64}
diff --git a/src/regress/lib/libc/arch/alpha/divremtest/mktestcases.c b/src/regress/lib/libc/arch/alpha/divremtest/mktestcases.c
deleted file mode 100644
index 3b01653f32..0000000000
--- a/src/regress/lib/libc/arch/alpha/divremtest/mktestcases.c
+++ /dev/null
@@ -1,68 +0,0 @@
1/* $OpenBSD: mktestcases.c,v 1.2 2001/01/29 02:05:40 niklas Exp $ */
2/* $NetBSD: mktestcases.c,v 1.1 1995/04/24 05:53:37 cgd Exp $ */
3
4/*
5 * Copyright (c) 1995 Christopher G. Demetriou
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Christopher G. Demetriou
19 * for the NetBSD Project.
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#include <stdio.h>
36
37int
38main()
39{
40 int i, j;
41 unsigned long n1, n2;
42
43 srandom(time(NULL));
44
45 for (i = 1; /* i < 10240 */ 1; i++) {
46 n1 = (unsigned)
47 (random() & ((random() & random()) | 0x80000000));
48 n1 <<= 32;
49 n1 |= (unsigned)(random() & random() & random());
50
51 n2 = (unsigned)
52 (random() & ((random() & random()) | 0x80000000));
53 n2 <<= 32;
54 n2 |= (unsigned)(random() & random() & random());
55
56 for (j = 0; j < 64; j++) {
57 char *tab[] = { ".i", ".l", "-i", "-l" };
58
59 printf("%s%s%s 0x%lx 0x%lx 0 0\n",
60 tab[(j >> 4) & 0x3],
61 tab[(j >> 2) & 0x3],
62 tab[(j >> 0) & 0x3],
63 n1, n2);
64 }
65 }
66
67 exit(0);
68}
diff --git a/src/regress/lib/libc/asr/Makefile b/src/regress/lib/libc/asr/Makefile
deleted file mode 100644
index 12e59536e0..0000000000
--- a/src/regress/lib/libc/asr/Makefile
+++ /dev/null
@@ -1,52 +0,0 @@
1# $OpenBSD: Makefile,v 1.4 2017/03/10 17:23:48 eric Exp $
2
3#
4# Notes on building and running the regression tests
5#
6# The regress suite builds two sets of static executables: the former linked
7# against the system libc, and the latter against the libc found in /usr/obj
8# The idea is to compare the output of all programs with internal changes in
9# the libc (more specifically the resolver). They will be run in a chrooted
10# environment to test various /etc configurations without touching the local
11# machine config files.
12#
13# First, build a libc that needs testing, then:
14#
15# $ make
16# $ doas make install
17# $ doas make regress
18#
19# Tests output goes into a $REGRESSDIR/tmp.XXXXXXXXXX directory, and a digest
20# is displayed at the end.
21#
22
23REGRESSDIR?= /tmp/regress-asr
24REGRESS?= regress.sh
25
26A?= .a
27B?= .b
28
29DIRA?= /usr/lib
30DIRB?= /usr/obj/lib/libc
31
32
33all: build
34
35build:
36 cd bin && EXT=${A} LDFLAGS=-L${DIRA} make
37 cd bin && EXT=${B} LDFLAGS=-L${DIRB} make
38
39clean:
40 cd bin && EXT=${A} make clean
41 cd bin && EXT=${B} make clean
42
43install:
44 mkdir -p ${REGRESSDIR}/bin
45 cd bin && BINDIR=${REGRESSDIR}/bin EXT=${A} make install
46 cd bin && BINDIR=${REGRESSDIR}/bin EXT=${B} make install
47
48uninstall:
49 rm -rf ${REGRESSDIR}
50
51regress:
52 RUNDIR=${REGRESSDIR} A=${A} B=${B} sh ${.CURDIR}/${REGRESS}
diff --git a/src/regress/lib/libc/asr/bin/Makefile b/src/regress/lib/libc/asr/bin/Makefile
deleted file mode 100644
index 1f986a8e69..0000000000
--- a/src/regress/lib/libc/asr/bin/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
1SUBDIR= res_mkquery
2SUBDIR+= res_query
3SUBDIR+= gethostnamadr
4SUBDIR+= getnetnamadr
5SUBDIR+= getrrsetbyname
6SUBDIR+= getnameinfo
7SUBDIR+= getaddrinfo
8SUBDIR+= threads
9
10.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/asr/bin/Makefile.inc b/src/regress/lib/libc/asr/bin/Makefile.inc
deleted file mode 100644
index 80b4805136..0000000000
--- a/src/regress/lib/libc/asr/bin/Makefile.inc
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile.inc,v 1.2 2012/09/05 21:21:13 eric Exp $
2
3NOMAN= noman
4
5SRCS+= common.c
6CFLAGS+= -Wall -Wstrict-prototypes -Werror -Wundef -g
7LDSTATIC= ${STATIC}
8PROG:= ${PROG}${EXT}
diff --git a/src/regress/lib/libc/asr/bin/common.c b/src/regress/lib/libc/asr/bin/common.c
deleted file mode 100644
index 08a7bccbb7..0000000000
--- a/src/regress/lib/libc/asr/bin/common.c
+++ /dev/null
@@ -1,693 +0,0 @@
1/* $OpenBSD: common.c,v 1.4 2018/12/15 15:16:12 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17#include <sys/types.h>
18#include <sys/socket.h>
19#include <netinet/in.h>
20#include <arpa/inet.h>
21#include <arpa/nameser.h>
22
23#include <err.h>
24#include <errno.h>
25#include <inttypes.h>
26#include <netdb.h>
27#include <resolv.h>
28#include <stdio.h>
29#include <string.h>
30
31#include "common.h"
32
33int long_err;
34int gai_errno;
35int rrset_errno;
36
37
38char *
39gethostarg(char *n)
40{
41 if (n == NULL)
42 return (n);
43 if (!strcmp(n, "NULL"))
44 return (NULL);
45 if (!strcmp(n, "EMPTY"))
46 return ("");
47 return (n);
48}
49
50const char *rrsetstrerror(int);
51char * print_addr(const struct sockaddr *, char *, size_t);
52
53struct kv { int code; const char *name; };
54
55struct kv kv_family[] = {
56 { AF_UNIX, "unix" },
57 { AF_INET, "inet" },
58 { AF_INET6, "inet6" },
59 { 0, NULL, }
60};
61struct kv kv_socktype[] = {
62 { SOCK_STREAM, "stream" },
63 { SOCK_DGRAM, "dgram" },
64 { SOCK_RAW, "raw" },
65 { SOCK_SEQPACKET, "seqpacket" },
66 { 0, NULL, }
67};
68struct kv kv_protocol[] = {
69 { IPPROTO_UDP, "udp" },
70 { IPPROTO_TCP, "tcp" },
71 { IPPROTO_ICMP, "icmp" },
72 { IPPROTO_ICMPV6, "icmpv6" },
73 { 0, NULL, }
74};
75
76static const char *
77kv_lookup_name(struct kv *kv, int code, char *buf, size_t sz)
78{
79 while (kv->name) {
80 if (kv->code == code)
81 return (kv->name);
82 kv++;
83 }
84 snprintf(buf, sz, "%i", code);
85 return (buf);
86}
87
88struct keyval {
89 const char *key;
90 int value;
91};
92
93static struct keyval kv_class[] = {
94 { "IN", C_IN },
95 { "CHAOS", C_CHAOS },
96 { "HS", C_HS },
97 { "ANY", C_ANY },
98 { NULL, 0 },
99};
100
101static struct keyval kv_type[] = {
102 { "A", T_A },
103 { "NS", T_NS },
104 { "MD", T_MD },
105 { "MF", T_MF },
106 { "CNAME", T_CNAME },
107 { "SOA", T_SOA },
108 { "MB", T_MB },
109 { "MG", T_MG },
110 { "MR", T_MR },
111 { "NULL", T_NULL },
112 { "WKS", T_WKS },
113 { "PTR", T_PTR },
114 { "HINFO", T_HINFO },
115 { "MINFO", T_MINFO },
116 { "MX", T_MX },
117 { "TXT", T_TXT },
118
119 { "AAAA", T_AAAA },
120
121 { "AXFR", T_AXFR },
122 { "MAILB", T_MAILB },
123 { "MAILA", T_MAILA },
124 { "ANY", T_ANY },
125 { NULL, 0 },
126};
127
128static struct keyval kv_rcode[] = {
129 { "NOERROR", NOERROR },
130 { "FORMERR", FORMERR },
131 { "SERVFAIL", SERVFAIL },
132 { "NXDOMAIN", NXDOMAIN },
133 { "NOTIMP", NOTIMP },
134 { "REFUSED", REFUSED },
135 { NULL, 0 },
136};
137
138static struct keyval kv_resopt[] = {
139 { "DEBUG", RES_DEBUG },
140 { "AAONLY", RES_AAONLY },
141 { "USEVC", RES_USEVC },
142 { "PRIMARY", RES_PRIMARY },
143 { "IGNTC", RES_IGNTC },
144 { "RECURSE", RES_RECURSE },
145 { "DEFNAMES", RES_DEFNAMES },
146 { "STAYOPEN", RES_STAYOPEN },
147 { "DNSRCH", RES_DNSRCH },
148 { "INSECURE1", RES_INSECURE1 },
149 { "INSECURE2", RES_INSECURE2 },
150 { "NOALIASES", RES_NOALIASES },
151 { "USE_INET6", RES_USE_INET6 },
152 { "USE_EDNS0", RES_USE_EDNS0 },
153 { "USE_DNSSEC", RES_USE_DNSSEC },
154 { NULL, 0 },
155};
156
157const char *
158rcodetostr(uint16_t v)
159{
160 static char buf[16];
161 size_t i;
162
163 for(i = 0; kv_rcode[i].key; i++)
164 if (kv_rcode[i].value == v)
165 return (kv_rcode[i].key);
166
167 snprintf(buf, sizeof buf, "%"PRIu16"?", v);
168
169 return (buf);
170}
171
172const char *
173typetostr(uint16_t v)
174{
175 static char buf[16];
176 size_t i;
177
178 for(i = 0; kv_type[i].key; i++)
179 if (kv_type[i].value == v)
180 return (kv_type[i].key);
181
182 snprintf(buf, sizeof buf, "%"PRIu16"?", v);
183
184 return (buf);
185}
186
187const char *
188classtostr(uint16_t v)
189{
190 static char buf[16];
191 size_t i;
192
193 for(i = 0; kv_class[i].key; i++)
194 if (kv_class[i].value == v)
195 return (kv_class[i].key);
196
197 snprintf(buf, sizeof buf, "%"PRIu16"?", v);
198
199 return (buf);
200}
201
202uint16_t
203strtotype(const char *name)
204{
205 size_t i;
206
207 for(i = 0; kv_type[i].key; i++)
208 if (!strcasecmp(kv_type[i].key, name))
209 return (kv_type[i].value);
210
211 return (0);
212}
213
214uint16_t
215strtoclass(const char *name)
216{
217 size_t i;
218
219 for(i = 0; kv_class[i].key; i++)
220 if (!strcasecmp(kv_class[i].key, name))
221 return (kv_class[i].value);
222
223 return (0);
224}
225
226int
227strtoresopt(const char *name)
228{
229 size_t i;
230
231 for(i = 0; kv_resopt[i].key; i++)
232 if (!strcasecmp(kv_resopt[i].key, name))
233 return (kv_resopt[i].value);
234
235 return (0);
236}
237
238void
239parseresopt(const char *name)
240{
241 static int init = 0;
242 int flag, neg = 0;
243
244 if (init == 0) {
245 res_init();
246 init = 1;
247 }
248
249 if (name[0] == '-') {
250 neg = 1;
251 name++;
252 }
253 else if (name[0] == '+')
254 name++;
255
256 flag = strtoresopt(name);
257 if (flag == 0)
258 errx(1, "unknown reslover option %s", name);
259
260 if (neg)
261 _res.options &= ~flag;
262 else
263 _res.options |= flag;
264}
265
266void
267print_hostent(struct hostent *e)
268{
269 char buf[256], **c;
270
271 printf("name = \"%s\"\n", e->h_name);
272 printf("aliases =");
273 for(c = e->h_aliases; *c; c++)
274 printf(" \"%s\"", *c);
275 printf("\n");
276 printf("addrtype = %i\n", e->h_addrtype);
277 printf("addrlength = %i\n", e->h_length);
278 printf("addr_list =");
279 for(c = e->h_addr_list; *c; c++) {
280 printf(" %s", inet_ntop(e->h_addrtype, *c, buf, sizeof buf));
281 }
282 printf("\n");
283}
284
285void
286print_netent(struct netent *e)
287{
288 char buf[256], **c;
289 uint32_t addr;
290
291 /* network number are given in host order */
292 addr = htonl(e->n_net);
293
294 printf("name = \"%s\"\n", e->n_name);
295 printf("aliases =");
296 for (c = e->n_aliases; *c; c++)
297 printf(" \"%s\"", *c);
298 printf("\n");
299 printf("addrtype = %i\n", e->n_addrtype);
300 printf("net = %s\n", inet_ntop(e->n_addrtype, &addr, buf, sizeof buf));
301}
302
303void
304print_addrinfo(struct addrinfo *ai)
305{
306 char buf[256], bf[64], bt[64], bp[64];
307
308 printf("family=%s socktype=%s protocol=%s addr=%s canonname=%s\n",
309 kv_lookup_name(kv_family, ai->ai_family, bf, sizeof bf),
310 kv_lookup_name(kv_socktype, ai->ai_socktype, bt, sizeof bt),
311 kv_lookup_name(kv_protocol, ai->ai_protocol, bp, sizeof bp),
312 print_addr(ai->ai_addr, buf, sizeof buf),
313 ai->ai_canonname);
314}
315
316const char *
317rrsetstrerror(int e)
318{
319 switch (e) {
320 case 0:
321 return "OK";
322 case ERRSET_NONAME:
323 return "ERRSET_NONAME";
324 case ERRSET_NODATA:
325 return "ERRSET_NODATA";
326 case ERRSET_NOMEMORY:
327 return "ERRSET_NOMEMORY";
328 case ERRSET_INVAL:
329 return "ERRSET_INVAL";
330 case ERRSET_FAIL:
331 return "ERRSET_FAIL";
332 default:
333 return "???";
334 }
335}
336
337void
338print_rrsetinfo(struct rrsetinfo * rrset)
339{
340 printf("rri_flags=%u\n", rrset->rri_flags);
341 printf("rri_rdclass=%u\n", rrset->rri_rdclass);
342 printf("rri_rdtype=%u\n", rrset->rri_rdtype);
343 printf("rri_ttl=%u\n", rrset->rri_ttl);
344 printf("rri_nrdatas=%u\n", rrset->rri_nrdatas);
345 printf("rri_nsigs=%u\n", rrset->rri_nsigs);
346 printf("rri_name=\"%s\"\n", rrset->rri_name);
347}
348
349void
350print_errors(void)
351{
352 switch (long_err) {
353 case 0:
354 return;
355 case 1:
356 printf(" => errno %i, h_errno %i", errno, h_errno);
357 printf(", rrset_errno %i", rrset_errno);
358 printf(", gai_errno %i", gai_errno);
359 printf ("\n");
360 return;
361 default:
362 printf(" => errno %i: %s\n => h_errno %i: %s\n => rrset_errno %i: %s\n",
363 errno, errno ? strerror(errno) : "ok",
364 h_errno, h_errno ? hstrerror(h_errno) : "ok",
365 rrset_errno, rrset_errno ? rrsetstrerror(rrset_errno) : "ok");
366 printf(" => gai_errno %i: %s\n",
367 gai_errno, gai_errno ? gai_strerror(gai_errno) : "ok");
368 }
369}
370
371
372static char *
373print_host(const struct sockaddr *sa, char *buf, size_t len)
374{
375 switch (sa->sa_family) {
376 case AF_INET:
377 inet_ntop(AF_INET, &((struct sockaddr_in*)sa)->sin_addr,
378 buf, len);
379 break;
380 case AF_INET6:
381 inet_ntop(AF_INET6, &((struct sockaddr_in6*)sa)->sin6_addr,
382 buf, len);
383 break;
384 default:
385 buf[0] = '\0';
386 }
387 return (buf);
388}
389
390
391char *
392print_addr(const struct sockaddr *sa, char *buf, size_t len)
393{
394 char h[256];
395
396 print_host(sa, h, sizeof h);
397
398 switch (sa->sa_family) {
399 case AF_INET:
400 snprintf(buf, len, "%s:%i", h,
401 ntohs(((struct sockaddr_in*)(sa))->sin_port));
402 break;
403 case AF_INET6:
404 snprintf(buf, len, "[%s]:%i", h,
405 ntohs(((struct sockaddr_in6*)(sa))->sin6_port));
406 break;
407 default:
408 snprintf(buf, len, "?");
409 break;
410 }
411
412 return (buf);
413}
414
415void
416packed_init(struct packed *pack, char *data, size_t len)
417{
418 pack->data = data;
419 pack->len = len;
420 pack->offset = 0;
421 pack->err = NULL;
422}
423
424
425static ssize_t
426dname_expand(const unsigned char *data, size_t len, size_t offset,
427 size_t *newoffset, char *dst, size_t max)
428{
429 size_t n, count, end, ptr, start;
430 ssize_t res;
431
432 if (offset >= len)
433 return (-1);
434
435 res = 0;
436 end = start = offset;
437
438 for(; (n = data[offset]); ) {
439 if ((n & 0xc0) == 0xc0) {
440 if (offset + 2 > len)
441 return (-1);
442 ptr = 256 * (n & ~0xc0) + data[offset + 1];
443 if (ptr >= start)
444 return (-1);
445 if (end < offset + 2)
446 end = offset + 2;
447 offset = ptr;
448 continue;
449 }
450 if (offset + n + 1 > len)
451 return (-1);
452
453
454 /* copy n + at offset+1 */
455 if (dst != NULL && max != 0) {
456 count = (max < n + 1) ? (max) : (n + 1);
457 memmove(dst, data + offset, count);
458 dst += count;
459 max -= count;
460 }
461 res += n + 1;
462 offset += n + 1;
463 if (end < offset)
464 end = offset;
465 }
466 if (end < offset + 1)
467 end = offset + 1;
468
469 if (dst != NULL && max != 0)
470 dst[0] = 0;
471 if (newoffset)
472 *newoffset = end;
473 return (res + 1);
474}
475
476static int
477unpack_data(struct packed *p, void *data, size_t len)
478{
479 if (p->err)
480 return (-1);
481
482 if (p->len - p->offset < len) {
483 p->err = "too short";
484 return (-1);
485 }
486
487 memmove(data, p->data + p->offset, len);
488 p->offset += len;
489
490 return (0);
491}
492
493static int
494unpack_u16(struct packed *p, uint16_t *u16)
495{
496 if (unpack_data(p, u16, 2) == -1)
497 return (-1);
498
499 *u16 = ntohs(*u16);
500
501 return (0);
502}
503
504static int
505unpack_u32(struct packed *p, uint32_t *u32)
506{
507 if (unpack_data(p, u32, 4) == -1)
508 return (-1);
509
510 *u32 = ntohl(*u32);
511
512 return (0);
513}
514
515static int
516unpack_inaddr(struct packed *p, struct in_addr *a)
517{
518 return (unpack_data(p, a, 4));
519}
520
521static int
522unpack_in6addr(struct packed *p, struct in6_addr *a6)
523{
524 return (unpack_data(p, a6, 16));
525}
526
527static int
528unpack_dname(struct packed *p, char *dst, size_t max)
529{
530 ssize_t e;
531
532 if (p->err)
533 return (-1);
534
535 e = dname_expand(p->data, p->len, p->offset, &p->offset, dst, max);
536 if (e == -1) {
537 p->err = "bad domain name";
538 return (-1);
539 }
540 if (e < 0 || e > MAXDNAME) {
541 p->err = "domain name too long";
542 return (-1);
543 }
544
545 return (0);
546}
547
548int
549unpack_header(struct packed *p, struct header *h)
550{
551 if (unpack_data(p, h, HFIXEDSZ) == -1)
552 return (-1);
553
554 h->flags = ntohs(h->flags);
555 h->qdcount = ntohs(h->qdcount);
556 h->ancount = ntohs(h->ancount);
557 h->nscount = ntohs(h->nscount);
558 h->arcount = ntohs(h->arcount);
559
560 return (0);
561}
562
563int
564unpack_query(struct packed *p, struct query *q)
565{
566 unpack_dname(p, q->q_dname, sizeof(q->q_dname));
567 unpack_u16(p, &q->q_type);
568 unpack_u16(p, &q->q_class);
569
570 return (p->err) ? (-1) : (0);
571}
572
573int
574unpack_rr(struct packed *p, struct rr *rr)
575{
576 uint16_t rdlen;
577 size_t save_offset;
578
579 unpack_dname(p, rr->rr_dname, sizeof(rr->rr_dname));
580 unpack_u16(p, &rr->rr_type);
581 unpack_u16(p, &rr->rr_class);
582 unpack_u32(p, &rr->rr_ttl);
583 unpack_u16(p, &rdlen);
584
585 if (p->err)
586 return (-1);
587
588 if (p->len - p->offset < rdlen) {
589 p->err = "too short";
590 return (-1);
591 }
592
593 save_offset = p->offset;
594
595 switch(rr->rr_type) {
596
597 case T_CNAME:
598 unpack_dname(p, rr->rr.cname.cname, sizeof(rr->rr.cname.cname));
599 break;
600
601 case T_MX:
602 unpack_u16(p, &rr->rr.mx.preference);
603 unpack_dname(p, rr->rr.mx.exchange, sizeof(rr->rr.mx.exchange));
604 break;
605
606 case T_NS:
607 unpack_dname(p, rr->rr.ns.nsname, sizeof(rr->rr.ns.nsname));
608 break;
609
610 case T_PTR:
611 unpack_dname(p, rr->rr.ptr.ptrname, sizeof(rr->rr.ptr.ptrname));
612 break;
613
614 case T_SOA:
615 unpack_dname(p, rr->rr.soa.mname, sizeof(rr->rr.soa.mname));
616 unpack_dname(p, rr->rr.soa.rname, sizeof(rr->rr.soa.rname));
617 unpack_u32(p, &rr->rr.soa.serial);
618 unpack_u32(p, &rr->rr.soa.refresh);
619 unpack_u32(p, &rr->rr.soa.retry);
620 unpack_u32(p, &rr->rr.soa.expire);
621 unpack_u32(p, &rr->rr.soa.minimum);
622 break;
623
624 case T_A:
625 if (rr->rr_class != C_IN)
626 goto other;
627 unpack_inaddr(p, &rr->rr.in_a.addr);
628 break;
629
630 case T_AAAA:
631 if (rr->rr_class != C_IN)
632 goto other;
633 unpack_in6addr(p, &rr->rr.in_aaaa.addr6);
634 break;
635 default:
636 other:
637 rr->rr.other.rdata = p->data + p->offset;
638 rr->rr.other.rdlen = rdlen;
639 p->offset += rdlen;
640 }
641
642 if (p->err)
643 return (-1);
644
645 /* make sure that the advertised rdlen is really ok */
646 if (p->offset - save_offset != rdlen)
647 p->err = "bad dlen";
648
649 return (p->err) ? (-1) : (0);
650}
651
652int
653sockaddr_from_str(struct sockaddr *sa, int family, const char *str)
654{
655 struct in_addr ina;
656 struct in6_addr in6a;
657 struct sockaddr_in *sin;
658 struct sockaddr_in6 *sin6;
659
660 switch (family) {
661 case PF_UNSPEC:
662 if (sockaddr_from_str(sa, PF_INET, str) == 0)
663 return (0);
664 return sockaddr_from_str(sa, PF_INET6, str);
665
666 case PF_INET:
667 if (inet_pton(PF_INET, str, &ina) != 1)
668 return (-1);
669
670 sin = (struct sockaddr_in *)sa;
671 memset(sin, 0, sizeof *sin);
672 sin->sin_len = sizeof(struct sockaddr_in);
673 sin->sin_family = PF_INET;
674 sin->sin_addr.s_addr = ina.s_addr;
675 return (0);
676
677 case PF_INET6:
678 if (inet_pton(PF_INET6, str, &in6a) != 1)
679 return (-1);
680
681 sin6 = (struct sockaddr_in6 *)sa;
682 memset(sin6, 0, sizeof *sin6);
683 sin6->sin6_len = sizeof(struct sockaddr_in6);
684 sin6->sin6_family = PF_INET6;
685 sin6->sin6_addr = in6a;
686 return (0);
687
688 default:
689 break;
690 }
691
692 return (-1);
693}
diff --git a/src/regress/lib/libc/asr/bin/common.h b/src/regress/lib/libc/asr/bin/common.h
deleted file mode 100644
index 6a6b90a34f..0000000000
--- a/src/regress/lib/libc/asr/bin/common.h
+++ /dev/null
@@ -1,138 +0,0 @@
1/* $OpenBSD: common.h,v 1.2 2018/12/15 15:16:12 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17#include <sys/types.h>
18#include <sys/socket.h>
19
20#include <arpa/nameser.h>
21
22#include <netinet/in.h>
23
24#include <netdb.h>
25
26
27#define unpack_rr __unpack_rr
28#define unpack_header __unpack_header
29#define packed_init __packed_init
30#define unpack_query __unpack_query
31#define sockaddr_from_str __sockaddr_from_str
32#define print_addr __print_addr
33
34extern int long_err;
35extern int gai_errno;
36extern int rrset_errno;
37
38const char *classtostr(uint16_t);
39const char *typetostr(uint16_t);
40const char *rcodetostr(uint16_t);
41
42uint16_t strtotype(const char*);
43uint16_t strtoclass(const char*);
44int strtoresopt(const char*);
45void parseresopt(const char*);
46
47void print_rrsetinfo(struct rrsetinfo *);
48void print_addrinfo(struct addrinfo *);
49void print_errors(void);
50void print_hostent(struct hostent *);
51void print_netent(struct netent *);
52
53int sockaddr_from_str(struct sockaddr *, int, const char *);
54int addr_from_str(char *, int *, int *, const char *);
55char* gethostarg(char *);
56
57#define QR_MASK (0x1 << 15)
58#define OPCODE_MASK (0xf << 11)
59#define AA_MASK (0x1 << 10)
60#define TC_MASK (0x1 << 9)
61#define RD_MASK (0x1 << 8)
62#define RA_MASK (0x1 << 7)
63#define Z_MASK (0x7 << 4)
64#define RCODE_MASK (0xf)
65
66#define OPCODE(v) ((v) & OPCODE_MASK)
67#define RCODE(v) ((v) & RCODE_MASK)
68
69
70struct packed {
71 char *data;
72 size_t len;
73 size_t offset;
74 const char *err;
75};
76
77struct header {
78 uint16_t id;
79 uint16_t flags;
80 uint16_t qdcount;
81 uint16_t ancount;
82 uint16_t nscount;
83 uint16_t arcount;
84};
85
86struct query {
87 char q_dname[MAXDNAME];
88 uint16_t q_type;
89 uint16_t q_class;
90};
91
92struct rr {
93 char rr_dname[MAXDNAME];
94 uint16_t rr_type;
95 uint16_t rr_class;
96 uint32_t rr_ttl;
97 union {
98 struct {
99 char cname[MAXDNAME];
100 } cname;
101 struct {
102 uint16_t preference;
103 char exchange[MAXDNAME];
104 } mx;
105 struct {
106 char nsname[MAXDNAME];
107 } ns;
108 struct {
109 char ptrname[MAXDNAME];
110 } ptr;
111 struct {
112 char mname[MAXDNAME];
113 char rname[MAXDNAME];
114 uint32_t serial;
115 uint32_t refresh;
116 uint32_t retry;
117 uint32_t expire;
118 uint32_t minimum;
119 } soa;
120 struct {
121 struct in_addr addr;
122 } in_a;
123 struct {
124 struct in6_addr addr6;
125 } in_aaaa;
126 struct {
127 uint16_t rdlen;
128 const void *rdata;
129 } other;
130 } rr;
131};
132
133void packed_init(struct packed*, char*, size_t);
134int pack_header(struct packed*, const struct header*);
135int pack_query(struct packed*, uint16_t, uint16_t, const char*);
136int unpack_header(struct packed*, struct header*);
137int unpack_query(struct packed*, struct query*);
138int unpack_rr(struct packed*, struct rr*);
diff --git a/src/regress/lib/libc/asr/bin/getaddrinfo.c b/src/regress/lib/libc/asr/bin/getaddrinfo.c
deleted file mode 100644
index 6605a00c1b..0000000000
--- a/src/regress/lib/libc/asr/bin/getaddrinfo.c
+++ /dev/null
@@ -1,138 +0,0 @@
1/* $OpenBSD: getaddrinfo.c,v 1.3 2018/12/15 15:16:12 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17#include <sys/types.h>
18#include <sys/socket.h>
19
20#include <netinet/in.h>
21
22#include <err.h>
23#include <errno.h>
24#include <getopt.h>
25#include <netdb.h>
26#include <stdio.h>
27#include <stdlib.h>
28#include <string.h>
29
30#include "common.h"
31
32static void
33usage(void)
34{
35 extern const char * __progname;
36
37 fprintf(stderr, "usage: %s [-CHSPe] [-f family] [-p proto] "
38 "[-s servname]\n [-t socktype] <host...>\n", __progname);
39 exit(1);
40}
41
42int
43main(int argc, char *argv[])
44{
45 struct addrinfo *ai, *res, hints;
46 char *servname = NULL, *host;
47 int i, ch;
48
49 memset(&hints, 0, sizeof hints);
50
51 while((ch = getopt(argc, argv, "CFHPR:Sef:p:s:t:")) != -1) {
52 switch(ch) {
53 case 'C':
54 hints.ai_flags |= AI_CANONNAME;
55 break;
56 case 'F':
57 hints.ai_flags |= AI_FQDN;
58 break;
59 case 'H':
60 hints.ai_flags |= AI_NUMERICHOST;
61 break;
62 case 'P':
63 hints.ai_flags |= AI_PASSIVE;
64 break;
65 case 'R':
66 parseresopt(optarg);
67 break;
68 case 'S':
69 hints.ai_flags |= AI_NUMERICSERV;
70 break;
71 case 'e':
72 long_err += 1;
73 break;
74 case 'f':
75 if (!strcmp(optarg, "inet"))
76 hints.ai_family = AF_INET;
77 else if (!strcmp(optarg, "inet6"))
78 hints.ai_family = AF_INET6;
79 else
80 usage();
81 break;
82 case 'p':
83 if (!strcmp(optarg, "udp"))
84 hints.ai_protocol = IPPROTO_UDP;
85 else if (!strcmp(optarg, "tcp"))
86 hints.ai_protocol = IPPROTO_TCP;
87 else if (!strcmp(optarg, "icmp"))
88 hints.ai_protocol = IPPROTO_ICMP;
89 else if (!strcmp(optarg, "icmpv6"))
90 hints.ai_protocol = IPPROTO_ICMPV6;
91 else
92 usage();
93 break;
94 case 's':
95 servname = optarg;
96 break;
97 case 't':
98 if (!strcmp(optarg, "stream"))
99 hints.ai_socktype = SOCK_STREAM;
100 else if (!strcmp(optarg, "dgram"))
101 hints.ai_socktype = SOCK_DGRAM;
102 else if (!strcmp(optarg, "raw"))
103 hints.ai_socktype = SOCK_RAW;
104 else
105 usage();
106 break;
107 default:
108 usage();
109 /* NOTREACHED */
110 }
111 }
112 argc -= optind;
113 argv += optind;
114
115 for(i = 0; i < argc; i++) {
116
117 if (i)
118 printf("\n");
119 printf("===> \"%s\"\n", argv[i]);
120 host = gethostarg(argv[i]);
121
122 errno = 0;
123 h_errno = 0;
124 gai_errno = 0;
125 rrset_errno = 0;
126
127 gai_errno = getaddrinfo(host, servname, &hints, &ai);
128
129 print_errors();
130 if (gai_errno == 0) {
131 for (res = ai; res; res = res->ai_next)
132 print_addrinfo(res);
133 freeaddrinfo(ai);
134 }
135 }
136
137 return (0);
138}
diff --git a/src/regress/lib/libc/asr/bin/getaddrinfo/Makefile b/src/regress/lib/libc/asr/bin/getaddrinfo/Makefile
deleted file mode 100644
index ec2f104ec7..0000000000
--- a/src/regress/lib/libc/asr/bin/getaddrinfo/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.1.1.1 2012/07/13 17:49:54 eric Exp $
2
3.PATH: ${.CURDIR}/..
4
5PROG= getaddrinfo
6SRCS+= getaddrinfo.c
7
8.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/asr/bin/gethostnamadr.c b/src/regress/lib/libc/asr/bin/gethostnamadr.c
deleted file mode 100644
index 9cdf7ed448..0000000000
--- a/src/regress/lib/libc/asr/bin/gethostnamadr.c
+++ /dev/null
@@ -1,116 +0,0 @@
1/* $OpenBSD: gethostnamadr.c,v 1.3 2018/12/15 15:16:12 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17#include <sys/types.h>
18#include <sys/socket.h>
19#include <netinet/in.h>
20#include <arpa/inet.h>
21
22#include <err.h>
23#include <errno.h>
24#include <getopt.h>
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include "common.h"
30
31static void
32usage(void)
33{
34 extern const char * __progname;
35
36 fprintf(stderr, "usage: %s [-46e] <host...>\n", __progname);
37 exit(1);
38}
39
40int
41main(int argc, char *argv[])
42{
43 int i, ch, aflag, family = AF_INET;
44 struct hostent *h;
45 char *host;
46 char addr[16];
47 int addrlen;
48
49 aflag = 0;
50 while((ch = getopt(argc, argv, "46R:ae")) != -1) {
51 switch(ch) {
52 case '4':
53 family = AF_INET;
54 break;
55 case '6':
56 family = AF_INET6;
57 break;
58 case 'R':
59 parseresopt(optarg);
60 break;
61 case 'a':
62 aflag = 1;
63 break;
64 case 'e':
65 long_err += 1;
66 break;
67 default:
68 usage();
69 /* NOTREACHED */
70 }
71 }
72 argc -= optind;
73 argv += optind;
74
75 for(i = 0; i < argc; i++) {
76
77 if (i)
78 printf("\n");
79 printf("===> \"%s\"\n", argv[i]);
80 host = gethostarg(argv[i]);
81
82 if (aflag && addr_from_str(addr, &family, &addrlen, host) == -1)
83 errx(1, "bad address");
84
85 errno = 0;
86 h_errno = 0;
87 gai_errno = 0;
88 rrset_errno = 0;
89
90 if (aflag == 0)
91 h = gethostbyname2(host, family);
92 else
93 h = gethostbyaddr(addr, addrlen, family);
94 if (h)
95 print_hostent(h);
96 print_errors();
97 }
98
99 return (0);
100}
101
102int
103addr_from_str(char *addr, int *family, int *len, const char *src)
104{
105 if (inet_pton(AF_INET6, src, addr) == 1) {
106 *family = AF_INET6;
107 *len = 16;
108 return (0);
109 }
110 if (inet_pton(AF_INET, src, addr) == 1) {
111 *family = AF_INET;
112 *len = 4;
113 return (0);
114 }
115 return (-1);
116}
diff --git a/src/regress/lib/libc/asr/bin/gethostnamadr/Makefile b/src/regress/lib/libc/asr/bin/gethostnamadr/Makefile
deleted file mode 100644
index 84906ffbbd..0000000000
--- a/src/regress/lib/libc/asr/bin/gethostnamadr/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.1.1.1 2012/07/13 17:49:54 eric Exp $
2
3.PATH: ${.CURDIR}/..
4
5PROG= gethostnamadr
6SRCS+= gethostnamadr.c
7
8.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/asr/bin/getnameinfo.c b/src/regress/lib/libc/asr/bin/getnameinfo.c
deleted file mode 100644
index bd0fbe224f..0000000000
--- a/src/regress/lib/libc/asr/bin/getnameinfo.c
+++ /dev/null
@@ -1,115 +0,0 @@
1/* $OpenBSD: getnameinfo.c,v 1.2 2018/12/15 15:16:12 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <err.h>
19#include <errno.h>
20#include <getopt.h>
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24
25#include "common.h"
26
27static void
28usage(void)
29{
30 extern const char * __progname;
31
32 fprintf(stderr, "usage: %s [-DFHNSe] [-p portno] <addr...>\n", __progname);
33 exit(1);
34}
35
36int
37main(int argc, char *argv[])
38{
39 char serv[1024];
40 char host[1024];
41 const char *e;
42 int i, ch, flags = 0, port = 0;
43 struct sockaddr_storage ss;
44 struct sockaddr *sa;
45
46 sa = (struct sockaddr*)&ss;
47
48 while((ch = getopt(argc, argv, "DFHNR:Saep:")) != -1) {
49 switch(ch) {
50 case 'D':
51 flags |= NI_DGRAM;
52 break;
53 case 'F':
54 flags |= NI_NOFQDN;
55 break;
56 case 'H':
57 flags |= NI_NUMERICHOST;
58 break;
59 case 'N':
60 flags |= NI_NAMEREQD;
61 break;
62 case 'R':
63 parseresopt(optarg);
64 break;
65 case 'S':
66 flags |= NI_NUMERICSERV;
67 break;
68 case 'e':
69 long_err += 1;
70 break;
71 case 'p':
72 port = strtonum(optarg, 0, 65535, &e);
73 if (e)
74 usage();
75 break;
76 default:
77 usage();
78 /* NOTREACHED */
79 }
80 }
81 argc -= optind;
82 argv += optind;
83
84 for(i = 0; i < argc; i++) {
85
86 if (i)
87 printf("\n");
88 printf("===> \"%s\"\n", argv[i]);
89
90 if (sockaddr_from_str(sa, AF_UNSPEC, argv[i]) == -1) {
91 printf(" => invalid address\n");
92 continue;
93 }
94
95 if (sa->sa_family == PF_INET)
96 ((struct sockaddr_in *)sa)->sin_port = htons(port);
97 else if (sa->sa_family == PF_INET6)
98 ((struct sockaddr_in6 *)sa)->sin6_port = htons(port);
99
100 errno = 0;
101 h_errno = 0;
102 gai_errno = 0;
103 rrset_errno = 0;
104
105 gai_errno = getnameinfo(sa, sa->sa_len, host, sizeof host, serv,
106 sizeof serv, flags);
107
108 if (gai_errno == 0)
109 printf(" %s:%s\n", host, serv);
110 print_errors();
111
112 }
113
114 return (0);
115}
diff --git a/src/regress/lib/libc/asr/bin/getnameinfo/Makefile b/src/regress/lib/libc/asr/bin/getnameinfo/Makefile
deleted file mode 100644
index 4927ee9486..0000000000
--- a/src/regress/lib/libc/asr/bin/getnameinfo/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.1.1.1 2012/07/13 17:49:54 eric Exp $
2
3.PATH: ${.CURDIR}/..
4
5PROG= getnameinfo
6SRCS+= getnameinfo.c
7
8.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/asr/bin/getnetnamadr.c b/src/regress/lib/libc/asr/bin/getnetnamadr.c
deleted file mode 100644
index e615e8663f..0000000000
--- a/src/regress/lib/libc/asr/bin/getnetnamadr.c
+++ /dev/null
@@ -1,88 +0,0 @@
1/* $OpenBSD: getnetnamadr.c,v 1.2 2018/12/15 15:16:12 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17#include <sys/types.h>
18#include <sys/socket.h>
19#include <netinet/in.h>
20#include <arpa/inet.h>
21
22#include <err.h>
23#include <errno.h>
24#include <getopt.h>
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include "common.h"
30
31static void
32usage(void)
33{
34 extern const char * __progname;
35
36 fprintf(stderr, "usage: %s [-aen] [host...]\n", __progname);
37 exit(1);
38}
39
40int
41main(int argc, char *argv[])
42{
43 int i, ch, nflag = 0;
44 struct netent *n;
45 char *host;
46
47 while((ch = getopt(argc, argv, "R:en")) != -1) {
48 switch(ch) {
49 case 'R':
50 parseresopt(optarg);
51 break;
52 case 'e':
53 long_err += 1;
54 break;
55 case 'n':
56 nflag = 1;
57 break;
58 default:
59 usage();
60 /* NOTREACHED */
61 }
62 }
63 argc -= optind;
64 argv += optind;
65
66 for(i = 0; i < argc; i++) {
67
68 if (i)
69 printf("\n");
70 printf("===> \"%s\"\n", argv[i]);
71 host = gethostarg(argv[i]);
72
73 errno = 0;
74 h_errno = 0;
75 gai_errno = 0;
76 rrset_errno = 0;
77
78 if (nflag)
79 n = getnetbyname(host);
80 else
81 n = getnetbyaddr(inet_network(host), AF_INET);
82 if (n)
83 print_netent(n);
84 print_errors();
85 }
86
87 return (0);
88}
diff --git a/src/regress/lib/libc/asr/bin/getnetnamadr/Makefile b/src/regress/lib/libc/asr/bin/getnetnamadr/Makefile
deleted file mode 100644
index 521bf8eb7e..0000000000
--- a/src/regress/lib/libc/asr/bin/getnetnamadr/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.1.1.1 2012/07/13 17:49:54 eric Exp $
2
3.PATH: ${.CURDIR}/..
4
5PROG= getnetnamadr
6SRCS+= getnetnamadr.c
7
8.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/asr/bin/getrrsetbyname.c b/src/regress/lib/libc/asr/bin/getrrsetbyname.c
deleted file mode 100644
index 8f48501a3f..0000000000
--- a/src/regress/lib/libc/asr/bin/getrrsetbyname.c
+++ /dev/null
@@ -1,91 +0,0 @@
1/* $OpenBSD: getrrsetbyname.c,v 1.2 2018/12/15 15:16:12 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <sys/types.h>
19
20#include <netinet/in.h>
21#include <arpa/nameser.h>
22
23#include <err.h>
24#include <errno.h>
25#include <getopt.h>
26#include <resolv.h>
27#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30
31#include "common.h"
32
33static void
34usage(void)
35{
36 extern const char * __progname;
37
38 fprintf(stderr, "usage: %s [-e] [-t type] [host...]\n",
39 __progname);
40 exit(1);
41}
42
43int
44main(int argc, char *argv[])
45{
46 int ch, i;
47 uint16_t type = T_A;
48 char *host;
49 struct rrsetinfo *rrset;
50
51 while((ch = getopt(argc, argv, "R:et:")) != -1) {
52 switch(ch) {
53 case 'R':
54 parseresopt(optarg);
55 break;
56 case 'e':
57 long_err += 1;
58 break;
59 case 't':
60 if ((type = strtotype(optarg)) == 0)
61 usage();
62 break;
63 default:
64 usage();
65 /* NOTREACHED */
66 }
67 }
68 argc -= optind;
69 argv += optind;
70
71 for (i = 0; i < argc; i++) {
72
73 if (i)
74 printf("\n");
75 printf("===> \"%s\"\n", argv[i]);
76 host = gethostarg(argv[i]);
77
78 errno = 0;
79 h_errno = 0;
80 gai_errno = 0;
81 rrset_errno = 0;
82
83 rrset_errno = getrrsetbyname(host, C_IN, type, 0, &rrset);
84
85 if (rrset_errno == 0)
86 print_rrsetinfo(rrset);
87 print_errors();
88 }
89
90 return (0);
91}
diff --git a/src/regress/lib/libc/asr/bin/getrrsetbyname/Makefile b/src/regress/lib/libc/asr/bin/getrrsetbyname/Makefile
deleted file mode 100644
index 131403bea1..0000000000
--- a/src/regress/lib/libc/asr/bin/getrrsetbyname/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.1.1.1 2012/07/13 17:49:54 eric Exp $
2
3.PATH: ${.CURDIR}/..
4
5PROG= getrrsetbyname
6SRCS+= getrrsetbyname.c
7
8.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/asr/bin/res_mkquery.c b/src/regress/lib/libc/asr/bin/res_mkquery.c
deleted file mode 100644
index b32f471cdf..0000000000
--- a/src/regress/lib/libc/asr/bin/res_mkquery.c
+++ /dev/null
@@ -1,322 +0,0 @@
1/* $OpenBSD: res_mkquery.c,v 1.2 2018/12/15 15:16:12 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <sys/types.h>
19#include <sys/socket.h>
20
21#include <netinet/in.h>
22#include <arpa/nameser.h>
23#include <arpa/inet.h>
24
25#include <err.h>
26#include <errno.h>
27#include <getopt.h>
28#include <inttypes.h>
29#include <resolv.h>
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
33
34#include "common.h"
35
36/* in asr.c but we don't want them exposed right now */
37static void dump_packet(const void *, size_t);
38
39static char *print_query(struct query *, char *, size_t);
40static char *print_rr(struct rr *, char *, size_t);
41static char *print_host(const struct sockaddr *, char *, size_t);
42static char* print_dname(const char *, char *, size_t);
43
44
45static void
46usage(void)
47{
48 extern const char * __progname;
49
50 fprintf(stderr, "usage: %s [-deq] [-t type] [host...]\n",
51 __progname);
52 exit(1);
53}
54
55int
56main(int argc, char *argv[])
57{
58 int ch, i, r;
59 uint16_t type = T_A;
60 char buf[1024], *host;
61
62 while((ch = getopt(argc, argv, "R:et:")) != -1) {
63 switch(ch) {
64 case 'R':
65 parseresopt(optarg);
66 break;
67 case 'e':
68 long_err += 1;
69 break;
70 case 't':
71 if ((type = strtotype(optarg)) == 0)
72 usage();
73 break;
74 default:
75 usage();
76 /* NOTREACHED */
77 }
78 }
79 argc -= optind;
80 argv += optind;
81
82 for (i = 0; i < argc; i++) {
83
84 if (i)
85 printf("\n");
86
87 printf("===> \"%s\"\n", argv[i]);
88 host = gethostarg(argv[i]);
89
90 errno = 0;
91 h_errno = 0;
92 gai_errno = 0;
93 rrset_errno = 0;
94
95 r = res_mkquery(QUERY, host, C_IN, type, NULL, 0, NULL, buf, sizeof(buf));
96 if (r != -1) {
97 dump_packet(buf, r);
98 printf(";; MSG SIZE %i\n", r);
99 }
100 print_errors();
101 }
102
103 return (0);
104}
105
106#define OPCODE_SHIFT 11
107#define Z_SHIFT 4
108
109static char*
110print_header(struct header *h, char *buf, size_t max)
111{
112 snprintf(buf, max,
113 "id:0x.... %s op:%i %s %s %s %s z:%i r:%s qd:%i an:%i ns:%i ar:%i",
114 (h->flags & QR_MASK) ? "QR":" ",
115 (int)(OPCODE(h->flags) >> OPCODE_SHIFT),
116 (h->flags & AA_MASK) ? "AA":" ",
117 (h->flags & TC_MASK) ? "TC":" ",
118 (h->flags & RD_MASK) ? "RD":" ",
119 (h->flags & RA_MASK) ? "RA":" ",
120 ((h->flags & Z_MASK) >> Z_SHIFT),
121 rcodetostr(RCODE(h->flags)),
122 h->qdcount, h->ancount, h->nscount, h->arcount);
123
124 return buf;
125}
126
127static void
128dump_packet(const void *data, size_t len)
129{
130 char buf[1024];
131 struct packed p;
132 struct header h;
133 struct query q;
134 struct rr rr;
135 int i, an, ns, ar, n;
136
137 packed_init(&p, (char *)data, len);
138
139 if (unpack_header(&p, &h) == -1) {
140 printf(";; BAD PACKET: %s\n", p.err);
141 return;
142 }
143
144 printf(";; HEADER %s\n", print_header(&h, buf, sizeof buf));
145
146 if (h.qdcount)
147 printf(";; QUERY SECTION:\n");
148 for (i = 0; i < h.qdcount; i++) {
149 if (unpack_query(&p, &q) == -1)
150 goto error;
151 printf("%s\n", print_query(&q, buf, sizeof buf));
152 }
153
154 an = 0;
155 ns = an + h.ancount;
156 ar = ns + h.nscount;
157 n = ar + h.arcount;
158
159 for (i = 0; i < n; i++) {
160 if (i == an)
161 printf("\n;; ANSWER SECTION:\n");
162 if (i == ns)
163 printf("\n;; AUTHORITY SECTION:\n");
164 if (i == ar)
165 printf("\n;; ADDITIONAL SECTION:\n");
166
167 if (unpack_rr(&p, &rr) == -1)
168 goto error;
169 printf("%s\n", print_rr(&rr, buf, sizeof buf));
170 }
171
172 if (p.offset != len)
173 printf(";; REMAINING GARBAGE %zu\n", len - p.offset);
174
175 error:
176 if (p.err)
177 printf(";; ERROR AT OFFSET %zu/%zu: %s\n", p.offset, p.len,
178 p.err);
179}
180
181static const char *
182inet6_ntoa(struct in6_addr a)
183{
184 static char buf[256];
185 struct sockaddr_in6 si;
186
187 si.sin6_len = sizeof(si);
188 si.sin6_family = PF_INET6;
189 si.sin6_addr = a;
190
191 return print_host((struct sockaddr*)&si, buf, sizeof buf);
192}
193
194static char*
195print_rr(struct rr *rr, char *buf, size_t max)
196{
197 char *res;
198 char tmp[256];
199 char tmp2[256];
200 int r;
201
202 res = buf;
203
204 r = snprintf(buf, max, "%s %u %s %s ",
205 print_dname(rr->rr_dname, tmp, sizeof tmp),
206 rr->rr_ttl,
207 classtostr(rr->rr_class),
208 typetostr(rr->rr_type));
209 if (r == -1) {
210 buf[0] = '\0';
211 return buf;
212 }
213
214 if ((size_t)r >= max)
215 return buf;
216
217 max -= r;
218 buf += r;
219
220 switch(rr->rr_type) {
221 case T_CNAME:
222 print_dname(rr->rr.cname.cname, buf, max);
223 break;
224 case T_MX:
225 snprintf(buf, max, "%"PRIu32" %s",
226 rr->rr.mx.preference,
227 print_dname(rr->rr.mx.exchange, tmp, sizeof tmp));
228 break;
229 case T_NS:
230 print_dname(rr->rr.ns.nsname, buf, max);
231 break;
232 case T_PTR:
233 print_dname(rr->rr.ptr.ptrname, buf, max);
234 break;
235 case T_SOA:
236 snprintf(buf, max,
237 "%s %s %" PRIu32 " %" PRIu32 " %" PRIu32 " %" PRIu32 " %" PRIu32,
238 print_dname(rr->rr.soa.rname, tmp, sizeof tmp),
239 print_dname(rr->rr.soa.mname, tmp2, sizeof tmp2),
240 rr->rr.soa.serial,
241 rr->rr.soa.refresh,
242 rr->rr.soa.retry,
243 rr->rr.soa.expire,
244 rr->rr.soa.minimum);
245 break;
246 case T_A:
247 if (rr->rr_class != C_IN)
248 goto other;
249 snprintf(buf, max, "%s", inet_ntoa(rr->rr.in_a.addr));
250 break;
251 case T_AAAA:
252 if (rr->rr_class != C_IN)
253 goto other;
254 snprintf(buf, max, "%s", inet6_ntoa(rr->rr.in_aaaa.addr6));
255 break;
256 default:
257 other:
258 snprintf(buf, max, "(rdlen=%"PRIu16 ")", rr->rr.other.rdlen);
259 break;
260 }
261
262 return (res);
263}
264
265static char*
266print_query(struct query *q, char *buf, size_t max)
267{
268 char b[256];
269
270 snprintf(buf, max, "%s %s %s",
271 print_dname(q->q_dname, b, sizeof b),
272 classtostr(q->q_class), typetostr(q->q_type));
273
274 return (buf);
275}
276
277
278static char *
279print_host(const struct sockaddr *sa, char *buf, size_t len)
280{
281 switch (sa->sa_family) {
282 case AF_INET:
283 inet_ntop(AF_INET, &((struct sockaddr_in*)sa)->sin_addr, buf, len);
284 break;
285 case AF_INET6:
286 inet_ntop(AF_INET6, &((struct sockaddr_in6*)sa)->sin6_addr, buf, len);
287 break;
288 default:
289 buf[0] = '\0';
290 }
291 return (buf);
292}
293
294static char*
295print_dname(const char *_dname, char *buf, size_t max)
296{
297 const unsigned char *dname = _dname;
298 char *res;
299 size_t left, n, count;
300
301 if (_dname[0] == 0) {
302 strlcpy(buf, ".", max);
303 return buf;
304 }
305
306 res = buf;
307 left = max - 1;
308 for (n = 0; dname[0] && left; n += dname[0]) {
309 count = (dname[0] < (left - 1)) ? dname[0] : (left - 1);
310 memmove(buf, dname + 1, count);
311 dname += dname[0] + 1;
312 left -= count;
313 buf += count;
314 if (left) {
315 left -= 1;
316 *buf++ = '.';
317 }
318 }
319 buf[0] = 0;
320
321 return (res);
322}
diff --git a/src/regress/lib/libc/asr/bin/res_mkquery/Makefile b/src/regress/lib/libc/asr/bin/res_mkquery/Makefile
deleted file mode 100644
index 4ae259e45d..0000000000
--- a/src/regress/lib/libc/asr/bin/res_mkquery/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2017/03/09 08:26:42 eric Exp $
2
3.PATH: ${.CURDIR}/..
4
5PROG= res_mkquery
6SRCS+= res_mkquery.c
7
8.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/asr/bin/res_query.c b/src/regress/lib/libc/asr/bin/res_query.c
deleted file mode 100644
index ca95a89a7c..0000000000
--- a/src/regress/lib/libc/asr/bin/res_query.c
+++ /dev/null
@@ -1,358 +0,0 @@
1/* $OpenBSD: res_query.c,v 1.3 2018/12/15 15:16:12 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <sys/types.h>
19#include <sys/socket.h>
20#include <sys/time.h>
21
22#include <netinet/in.h>
23#include <arpa/nameser.h>
24#include <arpa/inet.h>
25
26#include <err.h>
27#include <errno.h>
28#include <getopt.h>
29#include <inttypes.h>
30#include <resolv.h>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34
35#include "common.h"
36
37/* in asr.c but we don't want them exposed right now */
38static void dump_packet(const void *, size_t);
39
40static char *print_query(struct query *, char *, size_t);
41static char *print_rr(struct rr *, char *, size_t);
42static char *print_host(const struct sockaddr *, char *, size_t);
43static char* print_dname(const char *, char *, size_t);
44
45
46static int
47msec(struct timeval start, struct timeval end)
48{
49 return (int)((end.tv_sec - start.tv_sec) * 1000
50 + (end.tv_usec - start.tv_usec) / 1000);
51}
52
53static void
54usage(void)
55{
56 extern const char * __progname;
57
58 fprintf(stderr, "usage: %s [-deq] [-t type] [host...]\n",
59 __progname);
60 exit(1);
61}
62
63int
64main(int argc, char *argv[])
65{
66 struct timeval start, end;
67 time_t when;
68 int ch, i, qflag, dflag, r;
69 uint16_t type = T_A;
70 char buf[1024], *host;
71
72 dflag = 0;
73 qflag = 0;
74
75 while((ch = getopt(argc, argv, "R:deqt:")) != -1) {
76 switch(ch) {
77 case 'R':
78 parseresopt(optarg);
79 break;
80 case 'd':
81 dflag = 1;
82 break;
83 case 'e':
84 long_err += 1;
85 break;
86 case 'q':
87 qflag = 1;
88 break;
89 case 't':
90 if ((type = strtotype(optarg)) == 0)
91 usage();
92 break;
93 default:
94 usage();
95 /* NOTREACHED */
96 }
97 }
98 argc -= optind;
99 argv += optind;
100
101 for (i = 0; i < argc; i++) {
102
103 if (i)
104 printf("\n");
105
106 printf("===> \"%s\"\n", argv[i]);
107 host = gethostarg(argv[i]);
108
109 errno = 0;
110 h_errno = 0;
111 gai_errno = 0;
112 rrset_errno = 0;
113
114 if (gettimeofday(&start, NULL) != 0)
115 err(1, "gettimeofday");
116
117 if (qflag)
118 r = res_query(host, C_IN, type, buf, sizeof(buf));
119 else
120 r = res_search(host, C_IN, type, buf, sizeof(buf));
121
122 if (gettimeofday(&end, NULL) != 0)
123 err(1, "gettimeofday");
124
125 if (r != -1) {
126 dump_packet(buf, r);
127 printf("\n");
128 if (dflag) {
129 printf(";; Query time: %d msec\n",
130 msec(start, end));
131 when = time(NULL);
132 printf(";; WHEN: %s", ctime(&when));
133 }
134 printf(";; MSG SIZE rcvd: %i\n", r);
135 }
136 print_errors();
137 }
138
139 return (0);
140}
141
142#define OPCODE_SHIFT 11
143#define Z_SHIFT 4
144
145static char*
146print_header(struct header *h, char *buf, size_t max)
147{
148 snprintf(buf, max,
149 "id:0x.... %s op:%i %s %s %s %s z:%i r:%s qd:%i an:%i ns:%i ar:%i",
150 (h->flags & QR_MASK) ? "QR":" ",
151 (int)(OPCODE(h->flags) >> OPCODE_SHIFT),
152 (h->flags & AA_MASK) ? "AA":" ",
153 (h->flags & TC_MASK) ? "TC":" ",
154 (h->flags & RD_MASK) ? "RD":" ",
155 (h->flags & RA_MASK) ? "RA":" ",
156 ((h->flags & Z_MASK) >> Z_SHIFT),
157 rcodetostr(RCODE(h->flags)),
158 h->qdcount, h->ancount, h->nscount, h->arcount);
159
160 return buf;
161}
162
163static void
164dump_packet(const void *data, size_t len)
165{
166 char buf[1024];
167 struct packed p;
168 struct header h;
169 struct query q;
170 struct rr rr;
171 int i, an, ns, ar, n;
172
173 packed_init(&p, (char *)data, len);
174
175 if (unpack_header(&p, &h) == -1) {
176 printf(";; BAD PACKET: %s\n", p.err);
177 return;
178 }
179
180 printf(";; HEADER %s\n", print_header(&h, buf, sizeof buf));
181
182 if (h.qdcount)
183 printf(";; QUERY SECTION:\n");
184 for (i = 0; i < h.qdcount; i++) {
185 if (unpack_query(&p, &q) == -1)
186 goto error;
187 printf("%s\n", print_query(&q, buf, sizeof buf));
188 }
189
190 an = 0;
191 ns = an + h.ancount;
192 ar = ns + h.nscount;
193 n = ar + h.arcount;
194
195 for (i = 0; i < n; i++) {
196 if (i == an)
197 printf("\n;; ANSWER SECTION:\n");
198 if (i == ns)
199 printf("\n;; AUTHORITY SECTION:\n");
200 if (i == ar)
201 printf("\n;; ADDITIONAL SECTION:\n");
202
203 if (unpack_rr(&p, &rr) == -1)
204 goto error;
205 printf("%s\n", print_rr(&rr, buf, sizeof buf));
206 }
207
208 if (p.offset != len)
209 printf(";; REMAINING GARBAGE %zu\n", len - p.offset);
210
211 error:
212 if (p.err)
213 printf(";; ERROR AT OFFSET %zu/%zu: %s\n", p.offset, p.len,
214 p.err);
215}
216
217static const char *
218inet6_ntoa(struct in6_addr a)
219{
220 static char buf[256];
221 struct sockaddr_in6 si;
222
223 si.sin6_len = sizeof(si);
224 si.sin6_family = PF_INET6;
225 si.sin6_addr = a;
226
227 return print_host((struct sockaddr*)&si, buf, sizeof buf);
228}
229
230static char*
231print_rr(struct rr *rr, char *buf, size_t max)
232{
233 char *res;
234 char tmp[256];
235 char tmp2[256];
236 int r;
237
238 res = buf;
239
240 r = snprintf(buf, max, "%s %u %s %s ",
241 print_dname(rr->rr_dname, tmp, sizeof tmp),
242 rr->rr_ttl,
243 classtostr(rr->rr_class),
244 typetostr(rr->rr_type));
245 if (r == -1) {
246 buf[0] = '\0';
247 return buf;
248 }
249
250 if ((size_t)r >= max)
251 return buf;
252
253 max -= r;
254 buf += r;
255
256 switch(rr->rr_type) {
257 case T_CNAME:
258 print_dname(rr->rr.cname.cname, buf, max);
259 break;
260 case T_MX:
261 snprintf(buf, max, "%"PRIu32" %s",
262 rr->rr.mx.preference,
263 print_dname(rr->rr.mx.exchange, tmp, sizeof tmp));
264 break;
265 case T_NS:
266 print_dname(rr->rr.ns.nsname, buf, max);
267 break;
268 case T_PTR:
269 print_dname(rr->rr.ptr.ptrname, buf, max);
270 break;
271 case T_SOA:
272 snprintf(buf, max,
273 "%s %s %" PRIu32 " %" PRIu32 " %" PRIu32 " %" PRIu32 " %" PRIu32,
274 print_dname(rr->rr.soa.rname, tmp, sizeof tmp),
275 print_dname(rr->rr.soa.mname, tmp2, sizeof tmp2),
276 rr->rr.soa.serial,
277 rr->rr.soa.refresh,
278 rr->rr.soa.retry,
279 rr->rr.soa.expire,
280 rr->rr.soa.minimum);
281 break;
282 case T_A:
283 if (rr->rr_class != C_IN)
284 goto other;
285 snprintf(buf, max, "%s", inet_ntoa(rr->rr.in_a.addr));
286 break;
287 case T_AAAA:
288 if (rr->rr_class != C_IN)
289 goto other;
290 snprintf(buf, max, "%s", inet6_ntoa(rr->rr.in_aaaa.addr6));
291 break;
292 default:
293 other:
294 snprintf(buf, max, "(rdlen=%"PRIu16 ")", rr->rr.other.rdlen);
295 break;
296 }
297
298 return (res);
299}
300
301static char*
302print_query(struct query *q, char *buf, size_t max)
303{
304 char b[256];
305
306 snprintf(buf, max, "%s %s %s",
307 print_dname(q->q_dname, b, sizeof b),
308 classtostr(q->q_class), typetostr(q->q_type));
309
310 return (buf);
311}
312
313
314static char *
315print_host(const struct sockaddr *sa, char *buf, size_t len)
316{
317 switch (sa->sa_family) {
318 case AF_INET:
319 inet_ntop(AF_INET, &((struct sockaddr_in*)sa)->sin_addr, buf, len);
320 break;
321 case AF_INET6:
322 inet_ntop(AF_INET6, &((struct sockaddr_in6*)sa)->sin6_addr, buf, len);
323 break;
324 default:
325 buf[0] = '\0';
326 }
327 return (buf);
328}
329
330static char*
331print_dname(const char *_dname, char *buf, size_t max)
332{
333 const unsigned char *dname = _dname;
334 char *res;
335 size_t left, n, count;
336
337 if (_dname[0] == 0) {
338 strlcpy(buf, ".", max);
339 return buf;
340 }
341
342 res = buf;
343 left = max - 1;
344 for (n = 0; dname[0] && left; n += dname[0]) {
345 count = (dname[0] < (left - 1)) ? dname[0] : (left - 1);
346 memmove(buf, dname + 1, count);
347 dname += dname[0] + 1;
348 left -= count;
349 buf += count;
350 if (left) {
351 left -= 1;
352 *buf++ = '.';
353 }
354 }
355 buf[0] = 0;
356
357 return (res);
358}
diff --git a/src/regress/lib/libc/asr/bin/res_query/Makefile b/src/regress/lib/libc/asr/bin/res_query/Makefile
deleted file mode 100644
index 6f4d83392b..0000000000
--- a/src/regress/lib/libc/asr/bin/res_query/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2017/03/09 08:26:42 eric Exp $
2
3.PATH: ${.CURDIR}/..
4
5PROG= res_query
6SRCS+= res_query.c
7
8.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/asr/bin/threads.c b/src/regress/lib/libc/asr/bin/threads.c
deleted file mode 100644
index f296f1d6f7..0000000000
--- a/src/regress/lib/libc/asr/bin/threads.c
+++ /dev/null
@@ -1,140 +0,0 @@
1/* $OpenBSD: threads.c,v 1.1.1.1 2012/07/13 17:49:53 eric Exp $ */
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17#include <sys/time.h>
18#include <sys/resource.h>
19
20#include <assert.h>
21#include <err.h>
22#include <getopt.h>
23#include <pthread.h>
24#include <stdio.h>
25#include <stdlib.h>
26#include <time.h>
27
28#include <netdb.h>
29
30#define MAX_THREADS 50
31
32int ac;
33char **av;
34int loop;
35int nthreads;
36
37int long_err;
38int gai_errno;
39int rrset_errno;
40
41void async_resolver_done(void *);
42
43void stats(void)
44{
45 struct rusage ru;
46
47 getrusage(RUSAGE_SELF, &ru);
48 printf("%li\n", ru.ru_maxrss);
49}
50
51void*
52task(void *arg)
53{
54 int id, i, j, c;
55 struct addrinfo *ai, *n;
56
57 id = *((int*) arg);
58
59 n = NULL; c =0;
60
61 for(j = 0; j < loop; j++)
62 for(i = 0; i < ac; i++) {
63 if (getaddrinfo(av[i], NULL, NULL, &ai) == 0) {
64/*
65 for (c = 0, n = ai; n; c++, n = n->ai_next);
66 printf("%i:%s: ok: %i\n", id, av[i], c);
67*/
68 freeaddrinfo(ai);
69 } else {
70/*
71 printf("%i:%s: fail\n", id, av[i]);
72*/
73 }
74 }
75 return (NULL);
76}
77
78void
79usage(void)
80{
81 extern const char *__progname;
82 fprintf(stderr, "usage: %s [-L loop] [-l loop] [-t threads] <host> ...\n",
83 __progname);
84}
85
86int
87main(int argc, char **argv)
88{
89 pthread_t th[MAX_THREADS];
90 int th_args[MAX_THREADS], r, i, ch;
91 int n, LOOP;
92
93 nthreads = 1;
94 loop = 1;
95 LOOP = 1;
96
97 while ((ch = getopt(argc, argv, "L:l:t:")) != -1) {
98 switch (ch) {
99 case 'L':
100 LOOP = atoi(optarg);
101 break;
102 case 'l':
103 loop = atoi(optarg);
104 break;
105 case 't':
106 nthreads = atoi(optarg);
107 if (nthreads > MAX_THREADS)
108 nthreads = MAX_THREADS;
109 break;
110 default:
111 usage();
112 /* NOTREACHED */
113 }
114 }
115
116 argc -= optind;
117 argv += optind;
118
119 ac = argc;
120 av = argv;
121
122 printf("%i %i %i\n", LOOP, nthreads, loop);
123 for (n = 0; n < LOOP; n ++) {
124 for (i = 0; i < nthreads; i++) {
125 th_args[i] = i;
126 r = pthread_create(&th[i], NULL, task, (void *) &th_args[i]);
127 if (r == -1)
128 errx(1, "pthread_create");
129 }
130 for (i = 0; i < nthreads; i++)
131 pthread_join(th[i], NULL);
132
133 if (nthreads == 0)
134 task(&n);
135
136 stats();
137 }
138
139 return (0);
140}
diff --git a/src/regress/lib/libc/asr/bin/threads/Makefile b/src/regress/lib/libc/asr/bin/threads/Makefile
deleted file mode 100644
index 3252511cd1..0000000000
--- a/src/regress/lib/libc/asr/bin/threads/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
1# $OpenBSD: Makefile,v 1.1.1.1 2012/07/13 17:49:54 eric Exp $
2
3.PATH: ${.CURDIR}/..
4
5PROG= threads
6SRCS+= threads.c
7
8LDADD= -lpthread
9
10.include <bsd.prog.mk>
diff --git a/src/regress/lib/libc/asr/regress.sh b/src/regress/lib/libc/asr/regress.sh
deleted file mode 100644
index a0950cefde..0000000000
--- a/src/regress/lib/libc/asr/regress.sh
+++ /dev/null
@@ -1,111 +0,0 @@
1# $OpenBSD: regress.sh,v 1.7 2017/03/10 17:23:48 eric Exp $
2
3. regress.subr
4
5test_res_mkquery()
6{
7 for i in $@; do
8 regress res_mkquery $i
9 done
10}
11
12test_res_query()
13{
14 for i in $@; do
15 regress res_query $i
16 regress res_query -q $i
17 done
18}
19
20test_getrrsetbyname()
21{
22 for i in $@; do
23 regress getrrsetbyname $i
24 regress getrrsetbyname -t MX $i
25 regress getrrsetbyname -t AAAA $i
26 done
27}
28
29test_gethostbyname()
30{
31 for i in $@; do
32 regress gethostnamadr $i
33 regress gethostnamadr -4 $i
34 regress gethostnamadr -6 $i
35 done
36}
37
38test_gethostbyaddr()
39{
40 for i in $@; do
41 regress gethostnamadr -a $i
42 done
43}
44
45test_getaddrinfo()
46{
47 for i in $@; do
48 regress getaddrinfo $i
49 regress getaddrinfo -C $i
50 regress getaddrinfo -F $i
51 regress getaddrinfo -CF $i
52 regress getaddrinfo -P $i
53 regress getaddrinfo -PF $i
54 regress getaddrinfo -PC $i
55 regress getaddrinfo -H $i
56 regress getaddrinfo -p tcp $i
57 regress getaddrinfo -p udp $i
58 regress getaddrinfo -s www $i
59 regress getaddrinfo -s bad $i
60 regress getaddrinfo -S -s 8081 $i
61 regress getaddrinfo -S -s bad $i
62 regress getaddrinfo -P -s syslog $i
63 regress getaddrinfo -P -s syslog -p tcp $i
64 regress getaddrinfo -P -s syslog -p udp $i
65 done
66}
67
68test_getaddrinfo2()
69{
70 for i in $@; do
71 regress getaddrinfo -f inet6 -t raw -p icmpv6 $i
72 done
73}
74
75test_getnameinfo()
76{
77 for i in $@; do
78 regress getnameinfo $i
79 regress getnameinfo -D $i
80 regress getnameinfo -F $i
81 regress getnameinfo -H $i
82 regress getnameinfo -N $i
83 regress getnameinfo -S $i
84 regress getnameinfo -p 80 $i
85 regress getnameinfo -p 514 $i
86 regress getnameinfo -p 514 -D $i
87 regress getnameinfo -p 5566 $i
88 done
89}
90
91WEIRD="EMPTY . .. ..."
92BASIC="localhost $(hostname -s) $(hostname)"
93EXTRA="undeadly.org www.openbsd.org cvs.openbsd.org www.google.com www.bing.com"
94
95ADDRS="0.0.0.0 :: 127.0.0.1 ::1 212.227.193.194"
96
97for e in file bind local; do
98 regress_setenv $e
99
100 test_res_mkquery $WEIRD $BASIC
101 test_res_query $WEIRD $BASIC $EXTRA
102 test_getrrsetbyname $WEIRD $BASIC $EXTRA
103 test_gethostbyname $WEIRD $BASIC $EXTRA
104 test_gethostbyaddr $ADDRS
105 test_getaddrinfo NULL $WEIRD $BASIC $EXTRA
106 test_getaddrinfo2 undeadly.org www.kame.net
107 test_getnameinfo $ADDRS
108 test_gethostbyname $ADDRS
109done
110
111regress_digest
diff --git a/src/regress/lib/libc/asr/regress.subr b/src/regress/lib/libc/asr/regress.subr
deleted file mode 100644
index 6ce645bc33..0000000000
--- a/src/regress/lib/libc/asr/regress.subr
+++ /dev/null
@@ -1,122 +0,0 @@
1#!/bin/sh
2# $OpenBSD: regress.subr,v 1.4 2017/03/14 20:22:06 eric Exp $
3
4set -e
5
6fail()
7{
8 echo "*** ERROR: $@"
9 exit 1
10}
11
12regress()
13{
14 local cmd="$1"
15 local bin0="/bin/${cmd}${A}"
16 local bin1="/bin/${cmd}${B}"
17 local out="${OUTDIR}/test-${COUNT}.out"
18 local out0="${OUTDIR}/test-${COUNT}${A}.out"
19 local out1="${OUTDIR}/test-${COUNT}${B}.out"
20 local err0="${OUTDIR}/test-${COUNT}${A}.err"
21 local err1="${OUTDIR}/test-${COUNT}${B}.err"
22 local outdiff="${OUTDIR}/test-${COUNT}${A}${B}.diff"
23 shift
24
25 test -x "${ROOTDIR}${bin0}" || fail "${ROOTDIR}${bin0}" not executable
26 test -x "${ROOTDIR}${bin1}" || fail "${ROOTDIR}${bin1}" not executable
27
28 echo -n "${cmd} $@ ."
29
30 set +e
31 chroot -u bin "${ROOTDIR}" ${bin0} $@ > ${out0}
32 echo -n .
33 chroot -u bin "${ROOTDIR}" ${bin1} $@ > ${out1}
34 echo -n "."
35
36 diff -u ${out0} ${out1} > ${outdiff}
37 set -e
38 if test -s ${outdiff}; then
39 FAIL=$((FAIL+1))
40 echo fail
41 echo "### FAIL [#${COUNT} env=${REGRESSENV}] ${cmd} $@" >> $ERR
42 cat ${outdiff} >> $ERR
43 echo >> $ERR
44 else
45 rm ${outdiff}
46 rm ${out1}
47 mv ${out0} ${out}
48 OK=$((OK+1))
49 echo ok
50 echo "### OK [#${COUNT} env=$REGRESSENV] ${cmd} $@" >> $OUT
51 cat ${out} >> $OUT
52 echo >> $OUT
53 fi
54
55 COUNT=$((COUNT+1))
56}
57
58regress_setenv()
59{
60 local _name="$1"
61
62 echo "==> using env $_name"
63
64 mkdir -p "${ROOTDIR}/etc/"
65 cp /etc/hosts "${ROOTDIR}/etc/"
66 cp /etc/resolv.conf "${ROOTDIR}/etc/"
67 cp /etc/protocols "${ROOTDIR}/etc/"
68 cp /etc/networks "${ROOTDIR}/etc/"
69 cp /etc/services "${ROOTDIR}/etc/"
70
71 case $_name in
72 empty)
73 rm -f "${ROOTDIR}/etc/*"
74 ;;
75 local)
76 ;;
77 file)
78 grep -v lookup /etc/resolv.conf > "${ROOTDIR}/etc/resolv.conf"
79 echo "lookup file" >> "${ROOTDIR}/etc/resolv.conf"
80 ;;
81 bind)
82 grep -v lookup /etc/resolv.conf > "${ROOTDIR}/etc/resolv.conf"
83 echo "lookup bind" >> "${ROOTDIR}/etc/resolv.conf"
84 ;;
85 *)
86 fail unknown env $_name
87 ;;
88 esac
89 REGRESSENV=$_name
90}
91
92regress_digest()
93{
94 echo "===> done"
95 test -f $ERR && (echo; cat $ERR; echo "===> errfile=$ERR")
96 echo "===> logfile=$OUT"
97 echo "===> run=$COUNT ok=$OK fail=$FAIL error=$ERROR"
98
99}
100
101# needed for chroot
102test "$(id -u)" -ne 0 && fail need root privileges to run this script
103
104# we really really want to avoid erasing /etc later
105test "${RUNDIR}" || fail RUNDIR is not set
106
107ROOTDIR=$(readlink -fn ${RUNDIR})
108test "${ROOTDIR}" == "/" && fail RUNDIR is root dir: ${RUNDIR}
109
110COUNT=0
111OK=0
112FAIL=0
113ERROR=0
114A=${A:=.a}
115B=${B:=.b}
116
117OUTDIR=$(mktemp -d -p $ROOTDIR)
118chmod a+rx ${OUTDIR}
119echo "===> ${OUTDIR}"
120
121OUT=$OUTDIR/regress.log
122ERR=$OUTDIR/regress.err
diff --git a/src/regress/lib/libc/atexit/Makefile b/src/regress/lib/libc/atexit/Makefile
deleted file mode 100644
index eb8c55e91e..0000000000
--- a/src/regress/lib/libc/atexit/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
1# $OpenBSD: Makefile,v 1.7 2017/07/27 15:08:37 bluhm Exp $
2
3PROG = atexit_test
4CPPFLAGS = -I${.CURDIR}/../../../../lib/libc
5CLEANFILES = invalid.out valid.out
6LDADD = -static
7
8run-regress-${PROG}: ${PROG}
9 ./${PROG} -valid 2>${.OBJDIR}/valid.out
10 cmp -s ${.OBJDIR}/valid.out ${.CURDIR}/valid.ok
11 ./${PROG} -invalid-atexit 2>${.OBJDIR}/invalid.out
12 cmp -s ${.OBJDIR}/invalid.out ${.CURDIR}/invalid.ok
13 ./${PROG} -invalid-cleanup 2>${.OBJDIR}/invalid.out
14 cmp -s ${.OBJDIR}/invalid.out ${.CURDIR}/invalid.ok
15
16.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/atexit/atexit_test.c b/src/regress/lib/libc/atexit/atexit_test.c
deleted file mode 100644
index b060a9b341..0000000000
--- a/src/regress/lib/libc/atexit/atexit_test.c
+++ /dev/null
@@ -1,144 +0,0 @@
1/* $OpenBSD: atexit_test.c,v 1.9 2017/07/27 15:08:37 bluhm Exp $ */
2
3/*
4 * Copyright (c) 2002 Daniel Hartmeier
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 * Effort sponsored in part by the Defense Advanced Research Projects
32 * Agency (DARPA) and Air Force Research Laboratory, Air Force
33 * Materiel Command, USAF, under agreement number F30602-01-2-0537.
34 *
35 */
36
37#include <stdio.h>
38#include <stdlib.h>
39#include <string.h>
40#include <signal.h>
41#include <unistd.h>
42
43#include "include/namespace.h"
44#include "hidden/stdlib.h"
45#include "stdlib/atexit.h"
46
47void handle_first(void);
48void handle_middle(void);
49void handle_last(void);
50void handle_invalid(void *);
51void handle_cleanup(void);
52void handle_signal(int);
53
54static int counter;
55
56int
57main(int argc, char *argv[])
58{
59 int i;
60
61 if (argc != 2 || (strcmp(argv[1], "-valid") &&
62 strcmp(argv[1], "-invalid-atexit") &&
63 strcmp(argv[1], "-invalid-cleanup"))) {
64 fprintf(stderr, "%s -valid/-invalid-atexit/-invalid-cleanup\n",
65 argv[0]);
66 return (1);
67 }
68 fprintf(stderr, "main()\n");
69 if (atexit(handle_last)) {
70 perror("atexit(handle_last) failed");
71 return (1);
72 }
73 for (i = 0; i < 65535; ++i) {
74 if (atexit(handle_middle)) {
75 perror("atexit(handle_middle) failed");
76 return (1);
77 }
78 }
79 if (atexit(handle_first)) {
80 perror("atexit(handle_first) failed");
81 return (1);
82 }
83 /* this is supposed to segfault */
84 if (!strcmp(argv[1], "-invalid-atexit")) {
85 signal(SIGSEGV, handle_signal);
86 __atexit->fns[0].fn_ptr = handle_invalid;
87 } else if (!strcmp(argv[1], "-invalid-cleanup")) {
88 struct atexit *p = __atexit;
89
90 signal(SIGSEGV, handle_signal);
91 while (p != NULL && p->next != NULL)
92 p = p->next;
93 if (p == NULL)
94 fprintf(stderr, "p == NULL, no page found\n");
95 p->fns[0].fn_ptr = handle_invalid;
96 }
97 __atexit_register_cleanup(handle_cleanup);
98 counter = 0;
99 fprintf(stderr, "main() returns\n");
100 return (0);
101}
102
103void
104handle_first(void)
105{
106 fprintf(stderr, "handle_first() counter == %i\n", counter);
107}
108
109void
110handle_middle(void)
111{
112 counter++;
113}
114
115void
116handle_last(void)
117{
118 fprintf(stderr, "handle_last() counter == %i\n", counter);
119}
120
121void
122handle_cleanup(void)
123{
124 fprintf(stderr, "handle_cleanup()\n");
125}
126
127void
128handle_invalid(void *arg)
129{
130 fprintf(stderr, "handle_invalid() THIS SHOULD HAVE SEGFAULTED INSTEAD!\n");
131}
132
133void
134handle_signal(int sigraised)
135{
136 switch (sigraised) {
137 case SIGSEGV:
138 dprintf(STDERR_FILENO, "SIGSEGV\n");
139 exit(0);
140 default:
141 dprintf(STDERR_FILENO, "unexpected signal caught\n");
142 exit(1);
143 }
144}
diff --git a/src/regress/lib/libc/atexit/invalid.ok b/src/regress/lib/libc/atexit/invalid.ok
deleted file mode 100644
index 98cbf8c1de..0000000000
--- a/src/regress/lib/libc/atexit/invalid.ok
+++ /dev/null
@@ -1,4 +0,0 @@
1main()
2SIGSEGV
3handle_first() counter == 0
4handle_last() counter == 65535
diff --git a/src/regress/lib/libc/atexit/valid.ok b/src/regress/lib/libc/atexit/valid.ok
deleted file mode 100644
index 6509e827a7..0000000000
--- a/src/regress/lib/libc/atexit/valid.ok
+++ /dev/null
@@ -1,5 +0,0 @@
1main()
2main() returns
3handle_first() counter == 0
4handle_last() counter == 65535
5handle_cleanup()
diff --git a/src/regress/lib/libc/basename/Makefile b/src/regress/lib/libc/basename/Makefile
deleted file mode 100644
index 958b06fd11..0000000000
--- a/src/regress/lib/libc/basename/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
1PROG=basename_test
2
3.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/basename/basename_test.c b/src/regress/lib/libc/basename/basename_test.c
deleted file mode 100644
index 34e138c726..0000000000
--- a/src/regress/lib/libc/basename/basename_test.c
+++ /dev/null
@@ -1,79 +0,0 @@
1/*
2 * Copyright (c) 2007 Bret S. Lambert <blambert@gsipt.net>
3 *
4 * Public domain.
5 */
6
7#include <sys/param.h>
8
9#include <libgen.h>
10#include <stdio.h>
11#include <string.h>
12#include <limits.h>
13#include <errno.h>
14
15int
16main(void)
17{
18 char path[2 * MAXPATHLEN];
19 const char *dir = "junk/";
20 const char *fname = "file.name.ext";
21 char *str;
22 int i;
23
24 /* Test normal functioning */
25 strlcpy(path, "/", sizeof(path));
26 strlcat(path, dir, sizeof(path));
27 strlcat(path, fname, sizeof(path));
28 str = basename(path);
29 if (strcmp(str, fname) != 0)
30 goto fail;
31
32 /*
33 * There are four states that require special handling:
34 *
35 * 1) path is NULL
36 * 2) path is the empty string
37 * 3) path is composed entirely of slashes
38 * 4) the resulting name is larger than MAXPATHLEN
39 *
40 * The first two cases require that a pointer
41 * to the string "." be returned.
42 *
43 * The third case requires that a pointer
44 * to the string "/" be returned.
45 *
46 * The final case requires that NULL be returned
47 * and errno * be set to ENAMETOOLONG.
48 */
49 /* Case 1 */
50 str = basename(NULL);
51 if (strcmp(str, ".") != 0)
52 goto fail;
53
54 /* Case 2 */
55 strlcpy(path, "", sizeof(path));
56 str = basename(path);
57 if (strcmp(str, ".") != 0)
58 goto fail;
59
60 /* Case 3 */
61 for (i = 0; i < MAXPATHLEN - 1; i++)
62 strlcat(path, "/", sizeof(path)); /* path cleared above */
63 str = basename(path);
64 if (strcmp(str, "/") != 0)
65 goto fail;
66
67 /* Case 4 */
68 strlcpy(path, "/", sizeof(path));
69 strlcat(path, dir, sizeof(path));
70 for (i = 0; i <= MAXPATHLEN; i += sizeof(fname))
71 strlcat(path, fname, sizeof(path));
72 str = basename(path);
73 if (str != NULL || errno != ENAMETOOLONG)
74 goto fail;
75
76 return (0);
77fail:
78 return (1);
79}
diff --git a/src/regress/lib/libc/cephes/Makefile b/src/regress/lib/libc/cephes/Makefile
deleted file mode 100644
index 75cc85f4a8..0000000000
--- a/src/regress/lib/libc/cephes/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2011/07/02 18:11:01 martynas Exp $
2
3PROG = ieetst
4SRCS = drand.c econst.c eexp.c elog.c epow.c etanh.c etodec.c ieee.c \
5 ieetst.c mtherr.c
6
7.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/cephes/drand.c b/src/regress/lib/libc/cephes/drand.c
deleted file mode 100644
index 7f7000b4e8..0000000000
--- a/src/regress/lib/libc/cephes/drand.c
+++ /dev/null
@@ -1,174 +0,0 @@
1/* $OpenBSD: drand.c,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* drand.c
20 *
21 * Pseudorandom number generator
22 *
23 *
24 *
25 * SYNOPSIS:
26 *
27 * double y, drand();
28 *
29 * drand( &y );
30 *
31 *
32 *
33 * DESCRIPTION:
34 *
35 * Yields a random number 1.0 <= y < 2.0.
36 *
37 * The three-generator congruential algorithm by Brian
38 * Wichmann and David Hill (BYTE magazine, March, 1987,
39 * pp 127-8) is used. The period, given by them, is
40 * 6953607871644.
41 *
42 * Versions invoked by the different arithmetic compile
43 * time options DEC, IBMPC, and MIEEE, produce
44 * approximately the same sequences, differing only in the
45 * least significant bits of the numbers. The UNK option
46 * implements the algorithm as recommended in the BYTE
47 * article. It may be used on all computers. However,
48 * the low order bits of a double precision number may
49 * not be adequately random, and may vary due to arithmetic
50 * implementation details on different computers.
51 *
52 * The other compile options generate an additional random
53 * integer that overwrites the low order bits of the double
54 * precision number. This reduces the period by a factor of
55 * two but tends to overcome the problems mentioned.
56 *
57 */
58
59#include "mconf.h"
60
61
62/* Three-generator random number algorithm
63 * of Brian Wichmann and David Hill
64 * BYTE magazine, March, 1987 pp 127-8
65 *
66 * The period, given by them, is (p-1)(q-1)(r-1)/4 = 6.95e12.
67 */
68
69static int sx = 1;
70static int sy = 10000;
71static int sz = 3000;
72
73static union {
74 double d;
75 unsigned short s[4];
76} unkans;
77
78/* This function implements the three
79 * congruential generators.
80 */
81
82static int ranwh()
83{
84int r, s;
85
86/* sx = sx * 171 mod 30269 */
87r = sx/177;
88s = sx - 177 * r;
89sx = 171 * s - 2 * r;
90if( sx < 0 )
91 sx += 30269;
92
93
94/* sy = sy * 172 mod 30307 */
95r = sy/176;
96s = sy - 176 * r;
97sy = 172 * s - 35 * r;
98if( sy < 0 )
99 sy += 30307;
100
101/* sz = 170 * sz mod 30323 */
102r = sz/178;
103s = sz - 178 * r;
104sz = 170 * s - 63 * r;
105if( sz < 0 )
106 sz += 30323;
107/* The results are in static sx, sy, sz. */
108return 0;
109}
110
111/* drand.c
112 *
113 * Random double precision floating point number between 1 and 2.
114 *
115 * C callable:
116 * drand( &x );
117 */
118
119int drand( a )
120double *a;
121{
122unsigned short r;
123#ifdef DEC
124unsigned short s, t;
125#endif
126
127/* This algorithm of Wichmann and Hill computes a floating point
128 * result:
129 */
130ranwh();
131unkans.d = sx/30269.0 + sy/30307.0 + sz/30323.0;
132r = unkans.d;
133unkans.d -= r;
134unkans.d += 1.0;
135
136/* if UNK option, do nothing further.
137 * Otherwise, make a random 16 bit integer
138 * to overwrite the least significant word
139 * of unkans.
140 */
141#ifdef UNK
142/* do nothing */
143#else
144ranwh();
145r = sx * sy + sz;
146#endif
147
148#ifdef DEC
149/* To make the numbers as similar as possible
150 * in all arithmetics, the random integer has
151 * to be inserted 3 bits higher up in a DEC number.
152 * An alternative would be put it 3 bits lower down
153 * in all the other number types.
154 */
155s = unkans.s[2];
156t = s & 07; /* save these bits to put in at the bottom */
157s &= 0177770;
158s |= (r >> 13) & 07;
159unkans.s[2] = s;
160t |= r << 3;
161unkans.s[3] = t;
162#endif
163
164#ifdef IBMPC
165unkans.s[0] = r;
166#endif
167
168#ifdef MIEEE
169unkans.s[3] = r;
170#endif
171
172*a = unkans.d;
173return 0;
174}
diff --git a/src/regress/lib/libc/cephes/econst.c b/src/regress/lib/libc/cephes/econst.c
deleted file mode 100644
index 4232059e4c..0000000000
--- a/src/regress/lib/libc/cephes/econst.c
+++ /dev/null
@@ -1,114 +0,0 @@
1/* $OpenBSD: econst.c,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* econst.c */
20/* e type constants used by high precision check routines */
21
22#include "ehead.h"
23
24
25#if NE == 10
26/* 0.0 */
27unsigned short ezero[NE] =
28 {0x0000, 0x0000, 0x0000, 0x0000,
29 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,};
30
31/* 5.0E-1 */
32unsigned short ehalf[NE] =
33 {0x0000, 0x0000, 0x0000, 0x0000,
34 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3ffe,};
35
36/* 1.0E0 */
37unsigned short eone[NE] =
38 {0x0000, 0x0000, 0x0000, 0x0000,
39 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,};
40
41/* 2.0E0 */
42unsigned short etwo[NE] =
43 {0x0000, 0x0000, 0x0000, 0x0000,
44 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4000,};
45
46/* 3.2E1 */
47unsigned short e32[NE] =
48 {0x0000, 0x0000, 0x0000, 0x0000,
49 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x4004,};
50
51/* 6.93147180559945309417232121458176568075500134360255E-1 */
52unsigned short elog2[NE] =
53 {0x40f3, 0xf6af, 0x03f2, 0xb398,
54 0xc9e3, 0x79ab, 0150717, 0013767, 0130562, 0x3ffe,};
55
56/* 1.41421356237309504880168872420969807856967187537695E0 */
57unsigned short esqrt2[NE] =
58 {0x1d6f, 0xbe9f, 0x754a, 0x89b3,
59 0x597d, 0x6484, 0174736, 0171463, 0132404, 0x3fff,};
60
61/* 3.14159265358979323846264338327950288419716939937511E0 */
62unsigned short epi[NE] =
63 {0x2902, 0x1cd1, 0x80dc, 0x628b,
64 0xc4c6, 0xc234, 0020550, 0155242, 0144417, 0040000,};
65
66/* 5.7721566490153286060651209008240243104215933593992E-1 */
67unsigned short eeul[NE] = {
680xd1be,0xc7a4,0076660,0063743,0111704,0x3ffe,};
69
70#else
71
72/* 0.0 */
73unsigned short ezero[NE] = {
740, 0000000,0000000,0000000,0000000,0000000,};
75/* 5.0E-1 */
76unsigned short ehalf[NE] = {
770, 0000000,0000000,0000000,0100000,0x3ffe,};
78/* 1.0E0 */
79unsigned short eone[NE] = {
800, 0000000,0000000,0000000,0100000,0x3fff,};
81/* 2.0E0 */
82unsigned short etwo[NE] = {
830, 0000000,0000000,0000000,0100000,0040000,};
84/* 3.2E1 */
85unsigned short e32[NE] = {
860, 0000000,0000000,0000000,0100000,0040004,};
87/* 6.93147180559945309417232121458176568075500134360255E-1 */
88unsigned short elog2[NE] = {
890xc9e4,0x79ab,0150717,0013767,0130562,0x3ffe,};
90/* 1.41421356237309504880168872420969807856967187537695E0 */
91unsigned short esqrt2[NE] = {
920x597e,0x6484,0174736,0171463,0132404,0x3fff,};
93/* 2/sqrt(PI) =
94 * 1.12837916709551257389615890312154517168810125865800E0 */
95unsigned short eoneopi[NE] = {
960x71d5,0x688d,0012333,0135202,0110156,0x3fff,};
97/* 3.14159265358979323846264338327950288419716939937511E0 */
98unsigned short epi[NE] = {
990xc4c6,0xc234,0020550,0155242,0144417,0040000,};
100/* 5.7721566490153286060651209008240243104215933593992E-1 */
101unsigned short eeul[NE] = {
1020xd1be,0xc7a4,0076660,0063743,0111704,0x3ffe,};
103#endif
104extern unsigned short ezero[];
105extern unsigned short ehalf[];
106extern unsigned short eone[];
107extern unsigned short etwo[];
108extern unsigned short e32[];
109extern unsigned short elog2[];
110extern unsigned short esqrt2[];
111extern unsigned short eoneopi[];
112extern unsigned short epi[];
113extern unsigned short eeul[];
114
diff --git a/src/regress/lib/libc/cephes/eexp.c b/src/regress/lib/libc/cephes/eexp.c
deleted file mode 100644
index 74f0d6adb3..0000000000
--- a/src/regress/lib/libc/cephes/eexp.c
+++ /dev/null
@@ -1,86 +0,0 @@
1/* $OpenBSD: eexp.c,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* xexp.c */
20/* exponential function check routine */
21/* by Stephen L. Moshier. */
22
23
24#include "ehead.h"
25
26void eexp( x, y )
27unsigned short *x, *y;
28{
29unsigned short num[NE], den[NE], x2[NE];
30long i;
31unsigned short sign, expchk;
32
33/* range reduction theory: x = i + f, 0<=f<1;
34 * e**x = e**i * e**f
35 * e**i = 2**(i/log 2).
36 * Let i/log2 = i1 + f1, 0<=f1<1.
37 * Then e**i = 2**i1 * 2**f1, so
38 * e**x = 2**i1 * e**(log 2 * f1) * e**f.
39 */
40if( ecmp(x, ezero) == 0 )
41 {
42 emov( eone, y );
43 return;
44 }
45emov(x, x2);
46expchk = x2[NE-1];
47sign = expchk & 0x8000;
48x2[NE-1] &= 0x7fff;
49
50/* Test for excessively large argument */
51expchk &= 0x7fff;
52if( expchk > (EXONE + 15) )
53 {
54 eclear( y );
55 if( sign == 0 )
56 einfin( y );
57 return;
58 }
59
60eifrac( x2, &i, num ); /* x = i + f */
61
62if( i != 0 )
63 {
64 ltoe( &i, den ); /* floating point i */
65 ediv( elog2, den, den ); /* i/log 2 */
66 eifrac( den, &i, den ); /* i/log 2 = i1 + f1 */
67 emul( elog2, den, den ); /* log 2 * f1 */
68 eadd( den, num, x2 ); /* log 2 * f1 + f */
69 }
70
71/*x2[NE-1] -= 1;*/
72eldexp( x2, -1L, x2 ); /* divide by 2 */
73etanh( x2, x2 ); /* tanh( x/2 ) */
74eadd( x2, eone, num ); /* 1 + tanh */
75eneg( x2 );
76eadd( x2, eone, den ); /* 1 - tanh */
77ediv( den, num, y ); /* (1 + tanh)/(1 - tanh) */
78
79/*y[NE-1] += i;*/
80if( sign )
81 {
82 ediv( y, eone, y );
83 i = -i;
84 }
85eldexp( y, i, y ); /* multiply by 2**i */
86}
diff --git a/src/regress/lib/libc/cephes/ehead.h b/src/regress/lib/libc/cephes/ehead.h
deleted file mode 100644
index 009bcf89cc..0000000000
--- a/src/regress/lib/libc/cephes/ehead.h
+++ /dev/null
@@ -1,59 +0,0 @@
1/* $OpenBSD: ehead.h,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* Include file for extended precision arithmetic programs.
20 */
21
22/* Number of 16 bit words in external x type format */
23#define NE 10
24
25/* Number of 16 bit words in internal format */
26#define NI (NE+3)
27
28/* Array offset to exponent */
29#define E 1
30
31/* Array offset to high guard word */
32#define M 2
33
34/* Number of bits of precision */
35#define NBITS ((NI-4)*16)
36
37/* Maximum number of decimal digits in ASCII conversion
38 * = NBITS*log10(2)
39 */
40#define NDEC (NBITS*8/27)
41
42/* The exponent of 1.0 */
43#define EXONE (0x3fff)
44
45void eadd(), esub(), emul(), ediv();
46int ecmp(), enormlz(), eshift();
47void eshup1(), eshup8(), eshup6(), eshdn1(), eshdn8(), eshdn6();
48void eabs(), eneg(), emov(), eclear(), einfin(), efloor();
49void eldexp(), efrexp(), eifrac(), ltoe();
50void esqrt(), elog(), eexp(), etanh(), epow();
51void asctoe(), asctoe24(), asctoe53(), asctoe64();
52void etoasc(), e24toasc(), e53toasc(), e64toasc();
53void etoe64(), etoe53(), etoe24(), e64toe(), e53toe(), e24toe();
54int mtherr();
55extern unsigned short ezero[], ehalf[], eone[], etwo[];
56extern unsigned short elog2[], esqrt2[];
57
58
59/* by Stephen L. Moshier. */
diff --git a/src/regress/lib/libc/cephes/elog.c b/src/regress/lib/libc/cephes/elog.c
deleted file mode 100644
index 079cc754f4..0000000000
--- a/src/regress/lib/libc/cephes/elog.c
+++ /dev/null
@@ -1,110 +0,0 @@
1/* $OpenBSD: elog.c,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* xlog.c */
20/* natural logarithm */
21/* by Stephen L. Moshier. */
22
23#include "mconf.h"
24#include "ehead.h"
25
26
27
28void elog( x, y )
29unsigned short *x, *y;
30{
31unsigned short xx[NE], z[NE], a[NE], b[NE], t[NE], qj[NE];
32long ex;
33int fex;
34
35
36if( x[NE-1] & (unsigned short )0x8000 )
37 {
38 eclear(y);
39 mtherr( "elog", DOMAIN );
40 return;
41 }
42if( ecmp( x, ezero ) == 0 )
43 {
44 einfin( y );
45 eneg(y);
46 mtherr( "elog", SING );
47 return;
48 }
49if( ecmp( x, eone ) == 0 )
50 {
51 eclear( y );
52 return;
53 }
54
55/* range reduction: log x = log( 2**ex * m ) = ex * log2 + log m */
56efrexp( x, &fex, xx );
57/*
58emov(x, xx );
59ex = xx[NX-1] & 0x7fff;
60ex -= 0x3ffe;
61xx[NX-1] = 0x3ffe;
62*/
63
64/* Adjust range to 1/sqrt(2), sqrt(2) */
65esqrt2[NE-1] -= 1;
66if( ecmp( xx, esqrt2 ) < 0 )
67 {
68 fex -= 1;
69 emul( xx, etwo, xx );
70 }
71esqrt2[NE-1] += 1;
72
73esub( eone, xx, a );
74if( a[NE-1] == 0 )
75 {
76 eclear( y );
77 goto logdon;
78 }
79eadd( eone, xx, b );
80ediv( b, a, y ); /* store (x-1)/(x+1) in y */
81
82emul( y, y, z );
83
84emov( eone, a );
85emov( eone, b );
86emov( eone, qj );
87do
88 {
89 eadd( etwo, qj, qj ); /* 2 * i + 1 */
90 emul( z, a, a );
91 ediv( qj, a, t );
92 eadd( t, b, b );
93 }
94while( ((b[NE-1] & 0x7fff) - (t[NE-1] & 0x7fff)) < NBITS );
95
96
97emul( b, y, y );
98emul( y, etwo, y );
99
100logdon:
101
102/* now add log of 2**ex */
103if( fex != 0 )
104 {
105 ex = fex;
106 ltoe( &ex, b );
107 emul( elog2, b, b );
108 eadd( b, y, y );
109 }
110}
diff --git a/src/regress/lib/libc/cephes/epow.c b/src/regress/lib/libc/cephes/epow.c
deleted file mode 100644
index 646268fce7..0000000000
--- a/src/regress/lib/libc/cephes/epow.c
+++ /dev/null
@@ -1,187 +0,0 @@
1/* $OpenBSD: epow.c,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* epow.c */
20/* power function: z = x**y */
21/* by Stephen L. Moshier. */
22
23
24#include "ehead.h"
25
26extern int rndprc;
27void epowi();
28
29void epow( x, y, z )
30unsigned short *x, *y, *z;
31{
32unsigned short w[NE];
33int rndsav;
34long li;
35
36efloor( y, w );
37if( ecmp(y,w) == 0 )
38 {
39 eifrac( y, &li, w );
40 if( li < 0 )
41 li = -li;
42 if( (li < 0x7fffffff) && (li != 0x80000000) )
43 {
44 epowi( x, y, z );
45 return;
46 }
47 }
48/* z = exp( y * log(x) ) */
49rndsav = rndprc;
50rndprc = NBITS;
51elog( x, w );
52emul( y, w, w );
53eexp( w, z );
54rndprc = rndsav;
55emul( eone, z, z );
56}
57
58
59/* y is integer valued. */
60
61void epowi( x, y, z )
62unsigned short x[], y[], z[];
63{
64unsigned short w[NE];
65long li, lx;
66unsigned long lu;
67int rndsav;
68unsigned short signx;
69/* unsigned short signy; */
70
71rndsav = rndprc;
72eifrac( y, &li, w );
73if( li < 0 )
74 lx = -li;
75else
76 lx = li;
77
78if( (lx == 0x7fffffff) || (lx == 0x80000000) )
79 {
80 epow( x, y, z );
81 goto done;
82 }
83
84if( (x[NE-1] & (unsigned short )0x7fff) == 0 )
85 {
86 if( li == 0 )
87 {
88 emov( eone, z );
89 return;
90 }
91 else if( li < 0 )
92 {
93 einfin( z );
94 return;
95 }
96 else
97 {
98 eclear( z );
99 return;
100 }
101 }
102
103if( li == 0L )
104 {
105 emov( eone, z );
106 return;
107 }
108
109emov( x, w );
110signx = w[NE-1] & (unsigned short )0x8000;
111w[NE-1] &= (unsigned short )0x7fff;
112
113/* Overflow detection */
114/*
115lx = li * (w[NE-1] - 0x3fff);
116if( lx > 16385L )
117 {
118 einfin( z );
119 mtherr( "epowi", OVERFLOW );
120 goto done;
121 }
122if( lx < -16450L )
123 {
124 eclear( z );
125 return;
126 }
127*/
128rndprc = NBITS;
129
130if( li < 0 )
131 {
132 lu = (unsigned int )( -li );
133/* signy = 0xffff;*/
134 ediv( w, eone, w );
135 }
136else
137 {
138 lu = (unsigned int )li;
139/* signy = 0;*/
140 }
141
142/* First bit of the power */
143if( lu & 1 )
144 {
145 emov( w, z );
146 }
147else
148 {
149 emov( eone, z );
150 signx = 0;
151 }
152
153
154lu >>= 1;
155while( lu != 0L )
156 {
157 emul( w, w, w ); /* arg to the 2-to-the-kth power */
158 if( lu & 1L ) /* if that bit is set, then include in product */
159 emul( w, z, z );
160 lu >>= 1;
161 }
162
163
164done:
165
166if( signx )
167 eneg( z ); /* odd power of negative number */
168
169/*
170if( signy )
171 {
172 if( ecmp( z, ezero ) != 0 )
173 {
174 ediv( z, eone, z );
175 }
176 else
177 {
178 einfin( z );
179 printf( "epowi OVERFLOW\n" );
180 }
181 }
182*/
183rndprc = rndsav;
184emul( eone, z, z );
185}
186
187
diff --git a/src/regress/lib/libc/cephes/etanh.c b/src/regress/lib/libc/cephes/etanh.c
deleted file mode 100644
index 4ac5ff1c21..0000000000
--- a/src/regress/lib/libc/cephes/etanh.c
+++ /dev/null
@@ -1,70 +0,0 @@
1/* $OpenBSD: etanh.c,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* xtanh.c */
20/* hyperbolic tangent check routine */
21/* this subroutine is used by the exponential function routine */
22/* by Stephen L. Moshier. */
23
24
25
26#include "ehead.h"
27
28
29void etanh( x, y )
30unsigned short *x, *y;
31{
32unsigned short e[NE], r[NE], j[NE], xx[NE], m2[NE];
33short i, n;
34long lj;
35
36emov( x, r );
37r[NE-1] &= (unsigned short )0x7fff;
38if( ecmp(r, eone) >= 0 )
39 {
40/* tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))
41 * Note eexp() calls xtanh, but with an argument less than (1 + log 2)/2.
42 */
43 eexp( r, e );
44 ediv( e, eone, r );
45 esub( r, e, xx );
46 eadd( r, e, j );
47 ediv( j, xx, y );
48 return;
49 }
50
51emov( etwo, m2 );
52eneg( m2 );
53
54n = NBITS/8; /* Number of terms to do in the continued fraction */
55lj = 2 * n + 1;
56ltoe( &lj, j );
57
58emov( j, e );
59emul( x, x, xx );
60
61/* continued fraction */
62for( i=0; i<n; i++)
63 {
64 ediv( e, xx, r );
65 eadd( m2, j, j );
66 eadd( r, j, e );
67 }
68
69ediv( e, x, y );
70}
diff --git a/src/regress/lib/libc/cephes/etodec.c b/src/regress/lib/libc/cephes/etodec.c
deleted file mode 100644
index a15845efb6..0000000000
--- a/src/regress/lib/libc/cephes/etodec.c
+++ /dev/null
@@ -1,199 +0,0 @@
1/* $OpenBSD: etodec.c,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include "ehead.h"
20void emovi(), emovo(), ecleaz(), eshdn8(), emdnorm();
21void todec();
22/*
23; convert DEC double precision to e type
24; double d;
25; short e[NE];
26; dectoe( &d, e );
27*/
28void dectoe( d, e )
29unsigned short *d;
30unsigned short *e;
31{
32unsigned short y[NI];
33register unsigned short r, *p;
34
35ecleaz(y); /* start with a zero */
36p = y; /* point to our number */
37r = *d; /* get DEC exponent word */
38if( *d & (unsigned int )0x8000 )
39 *p = 0xffff; /* fill in our sign */
40++p; /* bump pointer to our exponent word */
41r &= 0x7fff; /* strip the sign bit */
42if( r == 0 ) /* answer = 0 if high order DEC word = 0 */
43 goto done;
44
45
46r >>= 7; /* shift exponent word down 7 bits */
47r += EXONE - 0201; /* subtract DEC exponent offset */
48 /* add our e type exponent offset */
49*p++ = r; /* to form our exponent */
50
51r = *d++; /* now do the high order mantissa */
52r &= 0177; /* strip off the DEC exponent and sign bits */
53r |= 0200; /* the DEC understood high order mantissa bit */
54*p++ = r; /* put result in our high guard word */
55
56*p++ = *d++; /* fill in the rest of our mantissa */
57*p++ = *d++;
58*p = *d;
59
60eshdn8(y); /* shift our mantissa down 8 bits */
61done:
62emovo( y, e );
63}
64
65
66
67/*
68; convert e type to DEC double precision
69; double d;
70; short e[NE];
71; etodec( e, &d );
72*/
73#if 0
74static unsigned short decbit[NI] = {0,0,0,0,0,0,0200,0};
75void etodec( x, d )
76unsigned short *x, *d;
77{
78unsigned short xi[NI];
79register unsigned short r;
80int i, j;
81
82emovi( x, xi );
83*d = 0;
84if( xi[0] != 0 )
85 *d = 0100000;
86r = xi[E];
87if( r < (EXONE - 128) )
88 goto zout;
89i = xi[M+4];
90if( (i & 0200) != 0 )
91 {
92 if( (i & 0377) == 0200 )
93 {
94 if( (i & 0400) != 0 )
95 {
96 /* check all less significant bits */
97 for( j=M+5; j<NI; j++ )
98 {
99 if( xi[j] != 0 )
100 goto yesrnd;
101 }
102 }
103 goto nornd;
104 }
105yesrnd:
106 eaddm( decbit, xi );
107 r -= enormlz(xi);
108 }
109
110nornd:
111
112r -= EXONE;
113r += 0201;
114if( r < 0 )
115 {
116zout:
117 *d++ = 0;
118 *d++ = 0;
119 *d++ = 0;
120 *d++ = 0;
121 return;
122 }
123if( r >= 0377 )
124 {
125 *d++ = 077777;
126 *d++ = -1;
127 *d++ = -1;
128 *d++ = -1;
129 return;
130 }
131r &= 0377;
132r <<= 7;
133eshup8( xi );
134xi[M] &= 0177;
135r |= xi[M];
136*d++ |= r;
137*d++ = xi[M+1];
138*d++ = xi[M+2];
139*d++ = xi[M+3];
140}
141#else
142
143extern int rndprc;
144
145void etodec( x, d )
146unsigned short *x, *d;
147{
148unsigned short xi[NI];
149long exp;
150int rndsav;
151
152emovi( x, xi );
153exp = (long )xi[E] - (EXONE - 0201); /* adjust exponent for offsets */
154/* round off to nearest or even */
155rndsav = rndprc;
156rndprc = 56;
157emdnorm( xi, 0, 0, exp, 64 );
158rndprc = rndsav;
159todec( xi, d );
160}
161
162void todec( x, y )
163unsigned short *x, *y;
164{
165unsigned short i;
166unsigned short *p;
167
168p = x;
169*y = 0;
170if( *p++ )
171 *y = 0100000;
172i = *p++;
173if( i == 0 )
174 {
175 *y++ = 0;
176 *y++ = 0;
177 *y++ = 0;
178 *y++ = 0;
179 return;
180 }
181if( i > 0377 )
182 {
183 *y++ |= 077777;
184 *y++ = 0xffff;
185 *y++ = 0xffff;
186 *y++ = 0xffff;
187 return;
188 }
189i &= 0377;
190i <<= 7;
191eshup8( x );
192x[M] &= 0177;
193i |= x[M];
194*y++ |= i;
195*y++ = x[M+1];
196*y++ = x[M+2];
197*y++ = x[M+3];
198}
199#endif
diff --git a/src/regress/lib/libc/cephes/ieee.c b/src/regress/lib/libc/cephes/ieee.c
deleted file mode 100644
index e2b8aa7b99..0000000000
--- a/src/regress/lib/libc/cephes/ieee.c
+++ /dev/null
@@ -1,4153 +0,0 @@
1/* $OpenBSD: ieee.c,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* ieee.c
20 *
21 * Extended precision IEEE binary floating point arithmetic routines
22 *
23 * Numbers are stored in C language as arrays of 16-bit unsigned
24 * short integers. The arguments of the routines are pointers to
25 * the arrays.
26 *
27 *
28 * External e type data structure, simulates Intel 8087 chip
29 * temporary real format but possibly with a larger significand:
30 *
31 * NE-1 significand words (least significant word first,
32 * most significant bit is normally set)
33 * exponent (value = EXONE for 1.0,
34 * top bit is the sign)
35 *
36 *
37 * Internal data structure of a number (a "word" is 16 bits):
38 *
39 * ei[0] sign word (0 for positive, 0xffff for negative)
40 * ei[1] biased exponent (value = EXONE for the number 1.0)
41 * ei[2] high guard word (always zero after normalization)
42 * ei[3]
43 * to ei[NI-2] significand (NI-4 significand words,
44 * most significant word first,
45 * most significant bit is set)
46 * ei[NI-1] low guard word (0x8000 bit is rounding place)
47 *
48 *
49 *
50 * Routines for external format numbers
51 *
52 * asctoe( string, e ) ASCII string to extended double e type
53 * asctoe64( string, &d ) ASCII string to long double
54 * asctoe53( string, &d ) ASCII string to double
55 * asctoe24( string, &f ) ASCII string to single
56 * asctoeg( string, e, prec ) ASCII string to specified precision
57 * e24toe( &f, e ) IEEE single precision to e type
58 * e53toe( &d, e ) IEEE double precision to e type
59 * e64toe( &d, e ) IEEE long double precision to e type
60 * eabs(e) absolute value
61 * eadd( a, b, c ) c = b + a
62 * eclear(e) e = 0
63 * ecmp (a, b) Returns 1 if a > b, 0 if a == b,
64 * -1 if a < b, -2 if either a or b is a NaN.
65 * ediv( a, b, c ) c = b / a
66 * efloor( a, b ) truncate to integer, toward -infinity
67 * efrexp( a, exp, s ) extract exponent and significand
68 * eifrac( e, &l, frac ) e to long integer and e type fraction
69 * euifrac( e, &l, frac ) e to unsigned long integer and e type fraction
70 * einfin( e ) set e to infinity, leaving its sign alone
71 * eldexp( a, n, b ) multiply by 2**n
72 * emov( a, b ) b = a
73 * emul( a, b, c ) c = b * a
74 * eneg(e) e = -e
75 * eround( a, b ) b = nearest integer value to a
76 * esub( a, b, c ) c = b - a
77 * e24toasc( &f, str, n ) single to ASCII string, n digits after decimal
78 * e53toasc( &d, str, n ) double to ASCII string, n digits after decimal
79 * e64toasc( &d, str, n ) long double to ASCII string
80 * etoasc( e, str, n ) e to ASCII string, n digits after decimal
81 * etoe24( e, &f ) convert e type to IEEE single precision
82 * etoe53( e, &d ) convert e type to IEEE double precision
83 * etoe64( e, &d ) convert e type to IEEE long double precision
84 * ltoe( &l, e ) long (32 bit) integer to e type
85 * ultoe( &l, e ) unsigned long (32 bit) integer to e type
86 * eisneg( e ) 1 if sign bit of e != 0, else 0
87 * eisinf( e ) 1 if e has maximum exponent (non-IEEE)
88 * or is infinite (IEEE)
89 * eisnan( e ) 1 if e is a NaN
90 * esqrt( a, b ) b = square root of a
91 *
92 *
93 * Routines for internal format numbers
94 *
95 * eaddm( ai, bi ) add significands, bi = bi + ai
96 * ecleaz(ei) ei = 0
97 * ecleazs(ei) set ei = 0 but leave its sign alone
98 * ecmpm( ai, bi ) compare significands, return 1, 0, or -1
99 * edivm( ai, bi ) divide significands, bi = bi / ai
100 * emdnorm(ai,l,s,exp) normalize and round off
101 * emovi( a, ai ) convert external a to internal ai
102 * emovo( ai, a ) convert internal ai to external a
103 * emovz( ai, bi ) bi = ai, low guard word of bi = 0
104 * emulm( ai, bi ) multiply significands, bi = bi * ai
105 * enormlz(ei) left-justify the significand
106 * eshdn1( ai ) shift significand and guards down 1 bit
107 * eshdn8( ai ) shift down 8 bits
108 * eshdn6( ai ) shift down 16 bits
109 * eshift( ai, n ) shift ai n bits up (or down if n < 0)
110 * eshup1( ai ) shift significand and guards up 1 bit
111 * eshup8( ai ) shift up 8 bits
112 * eshup6( ai ) shift up 16 bits
113 * esubm( ai, bi ) subtract significands, bi = bi - ai
114 *
115 *
116 * The result is always normalized and rounded to NI-4 word precision
117 * after each arithmetic operation.
118 *
119 * Exception flags are NOT fully supported.
120 *
121 * Define INFINITY in mconf.h for support of infinity; otherwise a
122 * saturation arithmetic is implemented.
123 *
124 * Define NANS for support of Not-a-Number items; otherwise the
125 * arithmetic will never produce a NaN output, and might be confused
126 * by a NaN input.
127 * If NaN's are supported, the output of ecmp(a,b) is -2 if
128 * either a or b is a NaN. This means asking if(ecmp(a,b) < 0)
129 * may not be legitimate. Use if(ecmp(a,b) == -1) for less-than
130 * if in doubt.
131 * Signaling NaN's are NOT supported; they are treated the same
132 * as quiet NaN's.
133 *
134 * Denormals are always supported here where appropriate (e.g., not
135 * for conversion to DEC numbers).
136 */
137
138/*
139 * Revision history:
140 *
141 * 5 Jan 84 PDP-11 assembly language version
142 * 2 Mar 86 fixed bug in asctoq()
143 * 6 Dec 86 C language version
144 * 30 Aug 88 100 digit version, improved rounding
145 * 15 May 92 80-bit long double support
146 *
147 * Author: S. L. Moshier.
148 */
149
150#include <stdio.h>
151#include "mconf.h"
152#include "ehead.h"
153
154/* Change UNK into something else. */
155#ifdef UNK
156#undef UNK
157#if BIGENDIAN
158#define MIEEE 1
159#else
160#define IBMPC 1
161#endif
162#endif
163
164/* NaN's require infinity support. */
165#ifdef NANS
166#ifndef INFINITY
167#define INFINITY
168#endif
169#endif
170
171/* This handles 64-bit long ints. */
172#define LONGBITS (8 * sizeof(long))
173
174/* Control register for rounding precision.
175 * This can be set to 80 (if NE=6), 64, 56, 53, or 24 bits.
176 */
177int rndprc = NBITS;
178extern int rndprc;
179
180void eaddm(), esubm(), emdnorm(), asctoeg(), enan();
181static void toe24(), toe53(), toe64(), toe113();
182void eremain(), einit(), eiremain();
183int ecmpm(), edivm(), emulm(), eisneg(), eisinf();
184void emovi(), emovo(), emovz(), ecleaz(), eadd1();
185void etodec(), todec(), dectoe();
186int eisnan(), eiisnan();
187
188
189
190void einit()
191{
192}
193
194/*
195; Clear out entire external format number.
196;
197; unsigned short x[];
198; eclear( x );
199*/
200
201void eclear( x )
202register unsigned short *x;
203{
204register int i;
205
206for( i=0; i<NE; i++ )
207 *x++ = 0;
208}
209
210
211
212/* Move external format number from a to b.
213 *
214 * emov( a, b );
215 */
216
217void emov( a, b )
218register unsigned short *a, *b;
219{
220register int i;
221
222for( i=0; i<NE; i++ )
223 *b++ = *a++;
224}
225
226
227/*
228; Absolute value of external format number
229;
230; short x[NE];
231; eabs( x );
232*/
233
234void eabs(x)
235unsigned short x[]; /* x is the memory address of a short */
236{
237
238x[NE-1] &= 0x7fff; /* sign is top bit of last word of external format */
239}
240
241
242
243
244/*
245; Negate external format number
246;
247; unsigned short x[NE];
248; eneg( x );
249*/
250
251void eneg(x)
252unsigned short x[];
253{
254
255#ifdef NANS
256if( eisnan(x) )
257 return;
258#endif
259x[NE-1] ^= 0x8000; /* Toggle the sign bit */
260}
261
262
263
264/* Return 1 if external format number is negative,
265 * else return zero.
266 */
267int eisneg(x)
268unsigned short x[];
269{
270
271#ifdef NANS
272if( eisnan(x) )
273 return( 0 );
274#endif
275if( x[NE-1] & 0x8000 )
276 return( 1 );
277else
278 return( 0 );
279}
280
281
282/* Return 1 if external format number has maximum possible exponent,
283 * else return zero.
284 */
285int eisinf(x)
286unsigned short x[];
287{
288
289if( (x[NE-1] & 0x7fff) == 0x7fff )
290 {
291#ifdef NANS
292 if( eisnan(x) )
293 return( 0 );
294#endif
295 return( 1 );
296 }
297else
298 return( 0 );
299}
300
301/* Check if e-type number is not a number.
302 */
303int eisnan(x)
304unsigned short x[];
305{
306
307#ifdef NANS
308int i;
309/* NaN has maximum exponent */
310if( (x[NE-1] & 0x7fff) != 0x7fff )
311 return (0);
312/* ... and non-zero significand field. */
313for( i=0; i<NE-1; i++ )
314 {
315 if( *x++ != 0 )
316 return (1);
317 }
318#endif
319return (0);
320}
321
322/*
323; Fill entire number, including exponent and significand, with
324; largest possible number. These programs implement a saturation
325; value that is an ordinary, legal number. A special value
326; "infinity" may also be implemented; this would require tests
327; for that value and implementation of special rules for arithmetic
328; operations involving inifinity.
329*/
330
331void einfin(x)
332register unsigned short *x;
333{
334register int i;
335
336#ifdef INFINITY
337for( i=0; i<NE-1; i++ )
338 *x++ = 0;
339*x |= 32767;
340#else
341for( i=0; i<NE-1; i++ )
342 *x++ = 0xffff;
343*x |= 32766;
344if( rndprc < NBITS )
345 {
346 if (rndprc == 113)
347 {
348 *(x - 9) = 0;
349 *(x - 8) = 0;
350 }
351 if( rndprc == 64 )
352 {
353 *(x-5) = 0;
354 }
355 if( rndprc == 53 )
356 {
357 *(x-4) = 0xf800;
358 }
359 else
360 {
361 *(x-4) = 0;
362 *(x-3) = 0;
363 *(x-2) = 0xff00;
364 }
365 }
366#endif
367}
368
369
370
371/* Move in external format number,
372 * converting it to internal format.
373 */
374void emovi( a, b )
375unsigned short *a, *b;
376{
377register unsigned short *p, *q;
378int i;
379
380q = b;
381p = a + (NE-1); /* point to last word of external number */
382/* get the sign bit */
383if( *p & 0x8000 )
384 *q++ = 0xffff;
385else
386 *q++ = 0;
387/* get the exponent */
388*q = *p--;
389*q++ &= 0x7fff; /* delete the sign bit */
390#ifdef INFINITY
391if( (*(q-1) & 0x7fff) == 0x7fff )
392 {
393#ifdef NANS
394 if( eisnan(a) )
395 {
396 *q++ = 0;
397 for( i=3; i<NI; i++ )
398 *q++ = *p--;
399 return;
400 }
401#endif
402 for( i=2; i<NI; i++ )
403 *q++ = 0;
404 return;
405 }
406#endif
407/* clear high guard word */
408*q++ = 0;
409/* move in the significand */
410for( i=0; i<NE-1; i++ )
411 *q++ = *p--;
412/* clear low guard word */
413*q = 0;
414}
415
416
417/* Move internal format number out,
418 * converting it to external format.
419 */
420void emovo( a, b )
421unsigned short *a, *b;
422{
423register unsigned short *p, *q;
424unsigned short i;
425
426p = a;
427q = b + (NE-1); /* point to output exponent */
428/* combine sign and exponent */
429i = *p++;
430if( i )
431 *q-- = *p++ | 0x8000;
432else
433 *q-- = *p++;
434#ifdef INFINITY
435if( *(p-1) == 0x7fff )
436 {
437#ifdef NANS
438 if( eiisnan(a) )
439 {
440 enan( b, NBITS );
441 return;
442 }
443#endif
444 einfin(b);
445 return;
446 }
447#endif
448/* skip over guard word */
449++p;
450/* move the significand */
451for( i=0; i<NE-1; i++ )
452 *q-- = *p++;
453}
454
455
456
457
458/* Clear out internal format number.
459 */
460
461void ecleaz( xi )
462register unsigned short *xi;
463{
464register int i;
465
466for( i=0; i<NI; i++ )
467 *xi++ = 0;
468}
469
470/* same, but don't touch the sign. */
471
472void ecleazs( xi )
473register unsigned short *xi;
474{
475register int i;
476
477++xi;
478for(i=0; i<NI-1; i++)
479 *xi++ = 0;
480}
481
482
483
484
485/* Move internal format number from a to b.
486 */
487void emovz( a, b )
488register unsigned short *a, *b;
489{
490register int i;
491
492for( i=0; i<NI-1; i++ )
493 *b++ = *a++;
494/* clear low guard word */
495*b = 0;
496}
497
498/* Return nonzero if internal format number is a NaN.
499 */
500
501int eiisnan (x)
502unsigned short x[];
503{
504int i;
505
506if( (x[E] & 0x7fff) == 0x7fff )
507 {
508 for( i=M+1; i<NI; i++ )
509 {
510 if( x[i] != 0 )
511 return(1);
512 }
513 }
514return(0);
515}
516
517#ifdef INFINITY
518/* Return nonzero if internal format number is infinite. */
519
520static int
521eiisinf (x)
522 unsigned short x[];
523{
524
525#ifdef NANS
526 if (eiisnan (x))
527 return (0);
528#endif
529 if ((x[E] & 0x7fff) == 0x7fff)
530 return (1);
531 return (0);
532}
533#endif
534
535/*
536; Compare significands of numbers in internal format.
537; Guard words are included in the comparison.
538;
539; unsigned short a[NI], b[NI];
540; cmpm( a, b );
541;
542; for the significands:
543; returns +1 if a > b
544; 0 if a == b
545; -1 if a < b
546*/
547int ecmpm( a, b )
548register unsigned short *a, *b;
549{
550int i;
551
552a += M; /* skip up to significand area */
553b += M;
554for( i=M; i<NI; i++ )
555 {
556 if( *a++ != *b++ )
557 goto difrnt;
558 }
559return(0);
560
561difrnt:
562if( *(--a) > *(--b) )
563 return(1);
564else
565 return(-1);
566}
567
568
569/*
570; Shift significand down by 1 bit
571*/
572
573void eshdn1(x)
574register unsigned short *x;
575{
576register unsigned short bits;
577int i;
578
579x += M; /* point to significand area */
580
581bits = 0;
582for( i=M; i<NI; i++ )
583 {
584 if( *x & 1 )
585 bits |= 1;
586 *x >>= 1;
587 if( bits & 2 )
588 *x |= 0x8000;
589 bits <<= 1;
590 ++x;
591 }
592}
593
594
595
596/*
597; Shift significand up by 1 bit
598*/
599
600void eshup1(x)
601register unsigned short *x;
602{
603register unsigned short bits;
604int i;
605
606x += NI-1;
607bits = 0;
608
609for( i=M; i<NI; i++ )
610 {
611 if( *x & 0x8000 )
612 bits |= 1;
613 *x <<= 1;
614 if( bits & 2 )
615 *x |= 1;
616 bits <<= 1;
617 --x;
618 }
619}
620
621
622
623/*
624; Shift significand down by 8 bits
625*/
626
627void eshdn8(x)
628register unsigned short *x;
629{
630register unsigned short newbyt, oldbyt;
631int i;
632
633x += M;
634oldbyt = 0;
635for( i=M; i<NI; i++ )
636 {
637 newbyt = *x << 8;
638 *x >>= 8;
639 *x |= oldbyt;
640 oldbyt = newbyt;
641 ++x;
642 }
643}
644
645/*
646; Shift significand up by 8 bits
647*/
648
649void eshup8(x)
650register unsigned short *x;
651{
652int i;
653register unsigned short newbyt, oldbyt;
654
655x += NI-1;
656oldbyt = 0;
657
658for( i=M; i<NI; i++ )
659 {
660 newbyt = *x >> 8;
661 *x <<= 8;
662 *x |= oldbyt;
663 oldbyt = newbyt;
664 --x;
665 }
666}
667
668/*
669; Shift significand up by 16 bits
670*/
671
672void eshup6(x)
673register unsigned short *x;
674{
675int i;
676register unsigned short *p;
677
678p = x + M;
679x += M + 1;
680
681for( i=M; i<NI-1; i++ )
682 *p++ = *x++;
683
684*p = 0;
685}
686
687/*
688; Shift significand down by 16 bits
689*/
690
691void eshdn6(x)
692register unsigned short *x;
693{
694int i;
695register unsigned short *p;
696
697x += NI-1;
698p = x + 1;
699
700for( i=M; i<NI-1; i++ )
701 *(--p) = *(--x);
702
703*(--p) = 0;
704}
705
706/*
707; Add significands
708; x + y replaces y
709*/
710
711void eaddm( x, y )
712unsigned short *x, *y;
713{
714register unsigned long a;
715int i;
716unsigned int carry;
717
718x += NI-1;
719y += NI-1;
720carry = 0;
721for( i=M; i<NI; i++ )
722 {
723 a = (unsigned long )(*x) + (unsigned long )(*y) + carry;
724 if( a & 0x10000 )
725 carry = 1;
726 else
727 carry = 0;
728 *y = (unsigned short )a;
729 --x;
730 --y;
731 }
732}
733
734/*
735; Subtract significands
736; y - x replaces y
737*/
738
739void esubm( x, y )
740unsigned short *x, *y;
741{
742unsigned long a;
743int i;
744unsigned int carry;
745
746x += NI-1;
747y += NI-1;
748carry = 0;
749for( i=M; i<NI; i++ )
750 {
751 a = (unsigned long )(*y) - (unsigned long )(*x) - carry;
752 if( a & 0x10000 )
753 carry = 1;
754 else
755 carry = 0;
756 *y = (unsigned short )a;
757 --x;
758 --y;
759 }
760}
761
762
763/* Divide significands */
764
765static unsigned short equot[NI] = {0}; /* was static */
766
767#if 0
768int edivm( den, num )
769unsigned short den[], num[];
770{
771int i;
772register unsigned short *p, *q;
773unsigned short j;
774
775p = &equot[0];
776*p++ = num[0];
777*p++ = num[1];
778
779for( i=M; i<NI; i++ )
780 {
781 *p++ = 0;
782 }
783
784/* Use faster compare and subtraction if denominator
785 * has only 15 bits of significance.
786 */
787p = &den[M+2];
788if( *p++ == 0 )
789 {
790 for( i=M+3; i<NI; i++ )
791 {
792 if( *p++ != 0 )
793 goto fulldiv;
794 }
795 if( (den[M+1] & 1) != 0 )
796 goto fulldiv;
797 eshdn1(num);
798 eshdn1(den);
799
800 p = &den[M+1];
801 q = &num[M+1];
802
803 for( i=0; i<NBITS+2; i++ )
804 {
805 if( *p <= *q )
806 {
807 *q -= *p;
808 j = 1;
809 }
810 else
811 {
812 j = 0;
813 }
814 eshup1(equot);
815 equot[NI-2] |= j;
816 eshup1(num);
817 }
818 goto divdon;
819 }
820
821/* The number of quotient bits to calculate is
822 * NBITS + 1 scaling guard bit + 1 roundoff bit.
823 */
824fulldiv:
825
826p = &equot[NI-2];
827for( i=0; i<NBITS+2; i++ )
828 {
829 if( ecmpm(den,num) <= 0 )
830 {
831 esubm(den, num);
832 j = 1; /* quotient bit = 1 */
833 }
834 else
835 j = 0;
836 eshup1(equot);
837 *p |= j;
838 eshup1(num);
839 }
840
841divdon:
842
843eshdn1( equot );
844eshdn1( equot );
845
846/* test for nonzero remainder after roundoff bit */
847p = &num[M];
848j = 0;
849for( i=M; i<NI; i++ )
850 {
851 j |= *p++;
852 }
853if( j )
854 j = 1;
855
856
857for( i=0; i<NI; i++ )
858 num[i] = equot[i];
859return( (int )j );
860}
861
862/* Multiply significands */
863int emulm( a, b )
864unsigned short a[], b[];
865{
866unsigned short *p, *q;
867int i, j, k;
868
869equot[0] = b[0];
870equot[1] = b[1];
871for( i=M; i<NI; i++ )
872 equot[i] = 0;
873
874p = &a[NI-2];
875k = NBITS;
876while( *p == 0 ) /* significand is not supposed to be all zero */
877 {
878 eshdn6(a);
879 k -= 16;
880 }
881if( (*p & 0xff) == 0 )
882 {
883 eshdn8(a);
884 k -= 8;
885 }
886
887q = &equot[NI-1];
888j = 0;
889for( i=0; i<k; i++ )
890 {
891 if( *p & 1 )
892 eaddm(b, equot);
893/* remember if there were any nonzero bits shifted out */
894 if( *q & 1 )
895 j |= 1;
896 eshdn1(a);
897 eshdn1(equot);
898 }
899
900for( i=0; i<NI; i++ )
901 b[i] = equot[i];
902
903/* return flag for lost nonzero bits */
904return(j);
905}
906
907#else
908
909/* Multiply significand of e-type number b
910by 16-bit quantity a, e-type result to c. */
911
912void m16m( a, b, c )
913unsigned short a;
914unsigned short b[], c[];
915{
916register unsigned short *pp;
917register unsigned long carry;
918unsigned short *ps;
919unsigned short p[NI];
920unsigned long aa, m;
921int i;
922
923aa = a;
924pp = &p[NI-2];
925*pp++ = 0;
926*pp = 0;
927ps = &b[NI-1];
928
929for( i=M+1; i<NI; i++ )
930 {
931 if( *ps == 0 )
932 {
933 --ps;
934 --pp;
935 *(pp-1) = 0;
936 }
937 else
938 {
939 m = (unsigned long) aa * *ps--;
940 carry = (m & 0xffff) + *pp;
941 *pp-- = (unsigned short )carry;
942 carry = (carry >> 16) + (m >> 16) + *pp;
943 *pp = (unsigned short )carry;
944 *(pp-1) = carry >> 16;
945 }
946 }
947for( i=M; i<NI; i++ )
948 c[i] = p[i];
949}
950
951
952/* Divide significands. Neither the numerator nor the denominator
953is permitted to have its high guard word nonzero. */
954
955
956int edivm( den, num )
957unsigned short den[], num[];
958{
959int i;
960register unsigned short *p;
961unsigned long tnum;
962unsigned short j, tdenm, tquot;
963unsigned short tprod[NI+1];
964
965p = &equot[0];
966*p++ = num[0];
967*p++ = num[1];
968
969for( i=M; i<NI; i++ )
970 {
971 *p++ = 0;
972 }
973eshdn1( num );
974tdenm = den[M+1];
975for( i=M; i<NI; i++ )
976 {
977 /* Find trial quotient digit (the radix is 65536). */
978 tnum = (((unsigned long) num[M]) << 16) + num[M+1];
979
980 /* Do not execute the divide instruction if it will overflow. */
981 if( (tdenm * 0xffffL) < tnum )
982 tquot = 0xffff;
983 else
984 tquot = tnum / tdenm;
985
986 /* Prove that the divide worked. */
987/*
988 tcheck = (unsigned long )tquot * tdenm;
989 if( tnum - tcheck > tdenm )
990 tquot = 0xffff;
991*/
992 /* Multiply denominator by trial quotient digit. */
993 m16m( tquot, den, tprod );
994 /* The quotient digit may have been overestimated. */
995 if( ecmpm( tprod, num ) > 0 )
996 {
997 tquot -= 1;
998 esubm( den, tprod );
999 if( ecmpm( tprod, num ) > 0 )
1000 {
1001 tquot -= 1;
1002 esubm( den, tprod );
1003 }
1004 }
1005/*
1006 if( ecmpm( tprod, num ) > 0 )
1007 {
1008 eshow( "tprod", tprod );
1009 eshow( "num ", num );
1010 printf( "tnum = %08lx, tden = %04x, tquot = %04x\n",
1011 tnum, den[M+1], tquot );
1012 }
1013*/
1014 esubm( tprod, num );
1015/*
1016 if( ecmpm( num, den ) >= 0 )
1017 {
1018 eshow( "num ", num );
1019 eshow( "den ", den );
1020 printf( "tnum = %08lx, tden = %04x, tquot = %04x\n",
1021 tnum, den[M+1], tquot );
1022 }
1023*/
1024 equot[i] = tquot;
1025 eshup6(num);
1026 }
1027/* test for nonzero remainder after roundoff bit */
1028p = &num[M];
1029j = 0;
1030for( i=M; i<NI; i++ )
1031 {
1032 j |= *p++;
1033 }
1034if( j )
1035 j = 1;
1036
1037for( i=0; i<NI; i++ )
1038 num[i] = equot[i];
1039
1040return( (int )j );
1041}
1042
1043
1044
1045/* Multiply significands */
1046int emulm( a, b )
1047unsigned short a[], b[];
1048{
1049unsigned short *p, *q;
1050unsigned short pprod[NI];
1051unsigned short j;
1052int i;
1053
1054equot[0] = b[0];
1055equot[1] = b[1];
1056for( i=M; i<NI; i++ )
1057 equot[i] = 0;
1058
1059j = 0;
1060p = &a[NI-1];
1061q = &equot[NI-1];
1062for( i=M+1; i<NI; i++ )
1063 {
1064 if( *p == 0 )
1065 {
1066 --p;
1067 }
1068 else
1069 {
1070 m16m( *p--, b, pprod );
1071 eaddm(pprod, equot);
1072 }
1073 j |= *q;
1074 eshdn6(equot);
1075 }
1076
1077for( i=0; i<NI; i++ )
1078 b[i] = equot[i];
1079
1080/* return flag for lost nonzero bits */
1081return( (int)j );
1082}
1083
1084
1085/*
1086eshow(str, x)
1087char *str;
1088unsigned short *x;
1089{
1090int i;
1091
1092printf( "%s ", str );
1093for( i=0; i<NI; i++ )
1094 printf( "%04x ", *x++ );
1095printf( "\n" );
1096}
1097*/
1098#endif
1099
1100
1101
1102/*
1103 * Normalize and round off.
1104 *
1105 * The internal format number to be rounded is "s".
1106 * Input "lost" indicates whether the number is exact.
1107 * This is the so-called sticky bit.
1108 *
1109 * Input "subflg" indicates whether the number was obtained
1110 * by a subtraction operation. In that case if lost is nonzero
1111 * then the number is slightly smaller than indicated.
1112 *
1113 * Input "exp" is the biased exponent, which may be negative.
1114 * the exponent field of "s" is ignored but is replaced by
1115 * "exp" as adjusted by normalization and rounding.
1116 *
1117 * Input "rcntrl" is the rounding control.
1118 */
1119
1120static int rlast = -1;
1121static int rw = 0;
1122static unsigned short rmsk = 0;
1123static unsigned short rmbit = 0;
1124static unsigned short rebit = 0;
1125static int re = 0;
1126static unsigned short rbit[NI] = {0,0,0,0,0,0,0,0};
1127
1128void emdnorm( s, lost, subflg, exp, rcntrl )
1129unsigned short s[];
1130int lost;
1131int subflg;
1132long exp;
1133int rcntrl;
1134{
1135int i, j;
1136unsigned short r;
1137
1138/* Normalize */
1139j = enormlz( s );
1140
1141/* a blank significand could mean either zero or infinity. */
1142#ifndef INFINITY
1143if( j > NBITS )
1144 {
1145 ecleazs( s );
1146 return;
1147 }
1148#endif
1149exp -= j;
1150#ifndef INFINITY
1151if( exp >= 32767L )
1152 goto overf;
1153#else
1154if( (j > NBITS) && (exp < 32767L) )
1155 {
1156 ecleazs( s );
1157 return;
1158 }
1159#endif
1160if( exp < 0L )
1161 {
1162 if( exp > (long )(-NBITS-1) )
1163 {
1164 j = (int )exp;
1165 i = eshift( s, j );
1166 if( i )
1167 lost = 1;
1168 }
1169 else
1170 {
1171 ecleazs( s );
1172 return;
1173 }
1174 }
1175/* Round off, unless told not to by rcntrl. */
1176if( rcntrl == 0 )
1177 goto mdfin;
1178/* Set up rounding parameters if the control register changed. */
1179if( rndprc != rlast )
1180 {
1181 ecleaz( rbit );
1182 switch( rndprc )
1183 {
1184 default:
1185 case NBITS:
1186 rw = NI-1; /* low guard word */
1187 rmsk = 0xffff;
1188 rmbit = 0x8000;
1189 rebit = 1;
1190 re = rw - 1;
1191 break;
1192 case 113:
1193 rw = 10;
1194 rmsk = 0x7fff;
1195 rmbit = 0x4000;
1196 rebit = 0x8000;
1197 re = rw;
1198 break;
1199 case 64:
1200 rw = 7;
1201 rmsk = 0xffff;
1202 rmbit = 0x8000;
1203 rebit = 1;
1204 re = rw-1;
1205 break;
1206/* For DEC arithmetic */
1207 case 56:
1208 rw = 6;
1209 rmsk = 0xff;
1210 rmbit = 0x80;
1211 rebit = 0x100;
1212 re = rw;
1213 break;
1214 case 53:
1215 rw = 6;
1216 rmsk = 0x7ff;
1217 rmbit = 0x0400;
1218 rebit = 0x800;
1219 re = rw;
1220 break;
1221 case 24:
1222 rw = 4;
1223 rmsk = 0xff;
1224 rmbit = 0x80;
1225 rebit = 0x100;
1226 re = rw;
1227 break;
1228 }
1229 rbit[re] = rebit;
1230 rlast = rndprc;
1231 }
1232
1233/* Shift down 1 temporarily if the data structure has an implied
1234 * most significant bit and the number is denormal.
1235 * For rndprc = 64 or NBITS, there is no implied bit.
1236 * But Intel long double denormals lose one bit of significance even so.
1237 */
1238#ifdef IBMPC
1239if( (exp <= 0) && (rndprc != NBITS) )
1240#else
1241if( (exp <= 0) && (rndprc != 64) && (rndprc != NBITS) )
1242#endif
1243 {
1244 lost |= s[NI-1] & 1;
1245 eshdn1(s);
1246 }
1247/* Clear out all bits below the rounding bit,
1248 * remembering in r if any were nonzero.
1249 */
1250r = s[rw] & rmsk;
1251if( rndprc < NBITS )
1252 {
1253 i = rw + 1;
1254 while( i < NI )
1255 {
1256 if( s[i] )
1257 r |= 1;
1258 s[i] = 0;
1259 ++i;
1260 }
1261 }
1262s[rw] &= ~rmsk;
1263if( (r & rmbit) != 0 )
1264 {
1265 if( r == rmbit )
1266 {
1267 if( lost == 0 )
1268 { /* round to even */
1269 if( (s[re] & rebit) == 0 )
1270 goto mddone;
1271 }
1272 else
1273 {
1274 if( subflg != 0 )
1275 goto mddone;
1276 }
1277 }
1278 eaddm( rbit, s );
1279 }
1280mddone:
1281#ifdef IBMPC
1282if( (exp <= 0) && (rndprc != NBITS) )
1283#else
1284if( (exp <= 0) && (rndprc != 64) && (rndprc != NBITS) )
1285#endif
1286 {
1287 eshup1(s);
1288 }
1289if( s[2] != 0 )
1290 { /* overflow on roundoff */
1291 eshdn1(s);
1292 exp += 1;
1293 }
1294mdfin:
1295s[NI-1] = 0;
1296if( exp >= 32767L )
1297 {
1298#ifndef INFINITY
1299overf:
1300#endif
1301#ifdef INFINITY
1302 s[1] = 32767;
1303 for( i=2; i<NI-1; i++ )
1304 s[i] = 0;
1305#else
1306 s[1] = 32766;
1307 s[2] = 0;
1308 for( i=M+1; i<NI-1; i++ )
1309 s[i] = 0xffff;
1310 s[NI-1] = 0;
1311 if( (rndprc < 64) || (rndprc == 113) )
1312 {
1313 s[rw] &= ~rmsk;
1314 if( rndprc == 24 )
1315 {
1316 s[5] = 0;
1317 s[6] = 0;
1318 }
1319 }
1320#endif
1321 return;
1322 }
1323if( exp < 0 )
1324 s[1] = 0;
1325else
1326 s[1] = (unsigned short )exp;
1327}
1328
1329
1330
1331/*
1332; Subtract external format numbers.
1333;
1334; unsigned short a[NE], b[NE], c[NE];
1335; esub( a, b, c ); c = b - a
1336*/
1337
1338static int subflg = 0;
1339
1340void esub( a, b, c )
1341unsigned short *a, *b, *c;
1342{
1343
1344#ifdef NANS
1345if( eisnan(a) )
1346 {
1347 emov (a, c);
1348 return;
1349 }
1350if( eisnan(b) )
1351 {
1352 emov(b,c);
1353 return;
1354 }
1355/* Infinity minus infinity is a NaN.
1356 * Test for subtracting infinities of the same sign.
1357 */
1358if( eisinf(a) && eisinf(b) && ((eisneg (a) ^ eisneg (b)) == 0))
1359 {
1360 mtherr( "esub", DOMAIN );
1361 enan( c, NBITS );
1362 return;
1363 }
1364#endif
1365subflg = 1;
1366eadd1( a, b, c );
1367}
1368
1369
1370/*
1371; Add.
1372;
1373; unsigned short a[NE], b[NE], c[NE];
1374; eadd( a, b, c ); c = b + a
1375*/
1376void eadd( a, b, c )
1377unsigned short *a, *b, *c;
1378{
1379
1380#ifdef NANS
1381/* NaN plus anything is a NaN. */
1382if( eisnan(a) )
1383 {
1384 emov(a,c);
1385 return;
1386 }
1387if( eisnan(b) )
1388 {
1389 emov(b,c);
1390 return;
1391 }
1392/* Infinity minus infinity is a NaN.
1393 * Test for adding infinities of opposite signs.
1394 */
1395if( eisinf(a) && eisinf(b)
1396 && ((eisneg(a) ^ eisneg(b)) != 0) )
1397 {
1398 mtherr( "eadd", DOMAIN );
1399 enan( c, NBITS );
1400 return;
1401 }
1402#endif
1403subflg = 0;
1404eadd1( a, b, c );
1405}
1406
1407void eadd1( a, b, c )
1408unsigned short *a, *b, *c;
1409{
1410unsigned short ai[NI], bi[NI], ci[NI];
1411int i, lost, j, k;
1412long lt, lta, ltb;
1413
1414#ifdef INFINITY
1415if( eisinf(a) )
1416 {
1417 emov(a,c);
1418 if( subflg )
1419 eneg(c);
1420 return;
1421 }
1422if( eisinf(b) )
1423 {
1424 emov(b,c);
1425 return;
1426 }
1427#endif
1428emovi( a, ai );
1429emovi( b, bi );
1430if( subflg )
1431 ai[0] = ~ai[0];
1432
1433/* compare exponents */
1434lta = ai[E];
1435ltb = bi[E];
1436lt = lta - ltb;
1437if( lt > 0L )
1438 { /* put the larger number in bi */
1439 emovz( bi, ci );
1440 emovz( ai, bi );
1441 emovz( ci, ai );
1442 ltb = bi[E];
1443 lt = -lt;
1444 }
1445lost = 0;
1446if( lt != 0L )
1447 {
1448 if( lt < (long )(-NBITS-1) )
1449 goto done; /* answer same as larger addend */
1450 k = (int )lt;
1451 lost = eshift( ai, k ); /* shift the smaller number down */
1452 }
1453else
1454 {
1455/* exponents were the same, so must compare significands */
1456 i = ecmpm( ai, bi );
1457 if( i == 0 )
1458 { /* the numbers are identical in magnitude */
1459 /* if different signs, result is zero */
1460 if( ai[0] != bi[0] )
1461 {
1462 eclear(c);
1463 return;
1464 }
1465 /* if same sign, result is double */
1466 /* double denomalized tiny number */
1467 if( (bi[E] == 0) && ((bi[3] & 0x8000) == 0) )
1468 {
1469 eshup1( bi );
1470 goto done;
1471 }
1472 /* add 1 to exponent unless both are zero! */
1473 for( j=1; j<NI-1; j++ )
1474 {
1475 if( bi[j] != 0 )
1476 {
1477 ltb += 1;
1478 if( ltb >= 0x7fff )
1479 {
1480 eclear(c);
1481 einfin(c);
1482 if( ai[0] != 0 )
1483 eneg(c);
1484 return;
1485 }
1486 break;
1487 }
1488 }
1489 bi[E] = (unsigned short )ltb;
1490 goto done;
1491 }
1492 if( i > 0 )
1493 { /* put the larger number in bi */
1494 emovz( bi, ci );
1495 emovz( ai, bi );
1496 emovz( ci, ai );
1497 }
1498 }
1499if( ai[0] == bi[0] )
1500 {
1501 eaddm( ai, bi );
1502 subflg = 0;
1503 }
1504else
1505 {
1506 esubm( ai, bi );
1507 subflg = 1;
1508 }
1509emdnorm( bi, lost, subflg, ltb, 64 );
1510
1511done:
1512emovo( bi, c );
1513}
1514
1515
1516
1517/*
1518; Divide.
1519;
1520; unsigned short a[NE], b[NE], c[NE];
1521; ediv( a, b, c ); c = b / a
1522*/
1523void ediv( a, b, c )
1524unsigned short *a, *b, *c;
1525{
1526unsigned short ai[NI], bi[NI];
1527int i, sign;
1528long lt, lta, ltb;
1529
1530/* IEEE says if result is not a NaN, the sign is "-" if and only if
1531 operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
1532sign = eisneg(a) ^ eisneg(b);
1533
1534#ifdef NANS
1535/* Return any NaN input. */
1536if( eisnan(a) )
1537 {
1538 emov(a,c);
1539 return;
1540 }
1541if( eisnan(b) )
1542 {
1543 emov(b,c);
1544 return;
1545 }
1546/* Zero over zero, or infinity over infinity, is a NaN. */
1547if( ((ecmp(a,ezero) == 0) && (ecmp(b,ezero) == 0))
1548 || (eisinf (a) && eisinf (b)) )
1549 {
1550 mtherr( "ediv", DOMAIN );
1551 enan( c, NBITS );
1552 return;
1553 }
1554#endif
1555/* Infinity over anything else is infinity. */
1556#ifdef INFINITY
1557if( eisinf(b) )
1558 {
1559 einfin(c);
1560 goto divsign;
1561 }
1562if( eisinf(a) )
1563 {
1564 eclear(c);
1565 goto divsign;
1566 }
1567#endif
1568emovi( a, ai );
1569emovi( b, bi );
1570lta = ai[E];
1571ltb = bi[E];
1572if( bi[E] == 0 )
1573 { /* See if numerator is zero. */
1574 for( i=1; i<NI-1; i++ )
1575 {
1576 if( bi[i] != 0 )
1577 {
1578 ltb -= enormlz( bi );
1579 goto dnzro1;
1580 }
1581 }
1582 eclear(c);
1583 goto divsign;
1584 }
1585dnzro1:
1586
1587if( ai[E] == 0 )
1588 { /* possible divide by zero */
1589 for( i=1; i<NI-1; i++ )
1590 {
1591 if( ai[i] != 0 )
1592 {
1593 lta -= enormlz( ai );
1594 goto dnzro2;
1595 }
1596 }
1597 einfin(c);
1598 mtherr( "ediv", SING );
1599 goto divsign;
1600 }
1601dnzro2:
1602
1603i = edivm( ai, bi );
1604/* calculate exponent */
1605lt = ltb - lta + EXONE;
1606emdnorm( bi, i, 0, lt, 64 );
1607emovo( bi, c );
1608
1609divsign:
1610
1611if( sign )
1612 *(c+(NE-1)) |= 0x8000;
1613else
1614 *(c+(NE-1)) &= ~0x8000;
1615}
1616
1617
1618
1619/*
1620; Multiply.
1621;
1622; unsigned short a[NE], b[NE], c[NE];
1623; emul( a, b, c ); c = b * a
1624*/
1625void emul( a, b, c )
1626unsigned short *a, *b, *c;
1627{
1628unsigned short ai[NI], bi[NI];
1629int i, j, sign;
1630long lt, lta, ltb;
1631
1632/* IEEE says if result is not a NaN, the sign is "-" if and only if
1633 operands have opposite signs -- but flush -0 to 0 later if not IEEE. */
1634sign = eisneg(a) ^ eisneg(b);
1635
1636#ifdef NANS
1637/* NaN times anything is the same NaN. */
1638if( eisnan(a) )
1639 {
1640 emov(a,c);
1641 return;
1642 }
1643if( eisnan(b) )
1644 {
1645 emov(b,c);
1646 return;
1647 }
1648/* Zero times infinity is a NaN. */
1649if( (eisinf(a) && (ecmp(b,ezero) == 0))
1650 || (eisinf(b) && (ecmp(a,ezero) == 0)) )
1651 {
1652 mtherr( "emul", DOMAIN );
1653 enan( c, NBITS );
1654 return;
1655 }
1656#endif
1657/* Infinity times anything else is infinity. */
1658#ifdef INFINITY
1659if( eisinf(a) || eisinf(b) )
1660 {
1661 einfin(c);
1662 goto mulsign;
1663 }
1664#endif
1665emovi( a, ai );
1666emovi( b, bi );
1667lta = ai[E];
1668ltb = bi[E];
1669if( ai[E] == 0 )
1670 {
1671 for( i=1; i<NI-1; i++ )
1672 {
1673 if( ai[i] != 0 )
1674 {
1675 lta -= enormlz( ai );
1676 goto mnzer1;
1677 }
1678 }
1679 eclear(c);
1680 goto mulsign;
1681 }
1682mnzer1:
1683
1684if( bi[E] == 0 )
1685 {
1686 for( i=1; i<NI-1; i++ )
1687 {
1688 if( bi[i] != 0 )
1689 {
1690 ltb -= enormlz( bi );
1691 goto mnzer2;
1692 }
1693 }
1694 eclear(c);
1695 goto mulsign;
1696 }
1697mnzer2:
1698
1699/* Multiply significands */
1700j = emulm( ai, bi );
1701/* calculate exponent */
1702lt = lta + ltb - (EXONE - 1);
1703emdnorm( bi, j, 0, lt, 64 );
1704emovo( bi, c );
1705/* IEEE says sign is "-" if and only if operands have opposite signs. */
1706mulsign:
1707if( sign )
1708 *(c+(NE-1)) |= 0x8000;
1709else
1710 *(c+(NE-1)) &= ~0x8000;
1711}
1712
1713
1714
1715
1716/*
1717; Convert IEEE double precision to e type
1718; double d;
1719; unsigned short x[N+2];
1720; e53toe( &d, x );
1721*/
1722void e53toe( pe, y )
1723unsigned short *pe, *y;
1724{
1725#ifdef DEC
1726
1727dectoe( pe, y ); /* see etodec.c */
1728
1729#else
1730
1731register unsigned short r;
1732register unsigned short *p, *e;
1733unsigned short yy[NI];
1734int denorm, k;
1735
1736e = pe;
1737denorm = 0; /* flag if denormalized number */
1738ecleaz(yy);
1739#ifdef IBMPC
1740e += 3;
1741#endif
1742r = *e;
1743yy[0] = 0;
1744if( r & 0x8000 )
1745 yy[0] = 0xffff;
1746yy[M] = (r & 0x0f) | 0x10;
1747r &= ~0x800f; /* strip sign and 4 significand bits */
1748#ifdef INFINITY
1749if( r == 0x7ff0 )
1750 {
1751#ifdef NANS
1752#ifdef IBMPC
1753 if( ((pe[3] & 0xf) != 0) || (pe[2] != 0)
1754 || (pe[1] != 0) || (pe[0] != 0) )
1755 {
1756 enan( y, NBITS );
1757 return;
1758 }
1759#else
1760 if( ((pe[0] & 0xf) != 0) || (pe[1] != 0)
1761 || (pe[2] != 0) || (pe[3] != 0) )
1762 {
1763 enan( y, NBITS );
1764 return;
1765 }
1766#endif
1767#endif /* NANS */
1768 eclear( y );
1769 einfin( y );
1770 if( yy[0] )
1771 eneg(y);
1772 return;
1773 }
1774#endif
1775r >>= 4;
1776/* If zero exponent, then the significand is denormalized.
1777 * So, take back the understood high significand bit. */
1778if( r == 0 )
1779 {
1780 denorm = 1;
1781 yy[M] &= ~0x10;
1782 }
1783r += EXONE - 01777;
1784yy[E] = r;
1785p = &yy[M+1];
1786#ifdef IBMPC
1787*p++ = *(--e);
1788*p++ = *(--e);
1789*p++ = *(--e);
1790#endif
1791#ifdef MIEEE
1792++e;
1793*p++ = *e++;
1794*p++ = *e++;
1795*p++ = *e++;
1796#endif
1797(void )eshift( yy, -5 );
1798if( denorm )
1799 { /* if zero exponent, then normalize the significand */
1800 if( (k = enormlz(yy)) > NBITS )
1801 ecleazs(yy);
1802 else
1803 yy[E] -= (unsigned short )(k-1);
1804 }
1805emovo( yy, y );
1806#endif /* not DEC */
1807}
1808
1809void e64toe( pe, y )
1810unsigned short *pe, *y;
1811{
1812unsigned short yy[NI];
1813unsigned short *p, *q, *e;
1814int i;
1815
1816e = pe;
1817p = yy;
1818for( i=0; i<NE-5; i++ )
1819 *p++ = 0;
1820#ifdef IBMPC
1821for( i=0; i<5; i++ )
1822 *p++ = *e++;
1823#endif
1824#ifdef DEC
1825for( i=0; i<5; i++ )
1826 *p++ = *e++;
1827#endif
1828#ifdef MIEEE
1829p = &yy[0] + (NE-1);
1830*p-- = *e++;
1831++e;
1832for( i=0; i<4; i++ )
1833 *p-- = *e++;
1834#endif
1835
1836#ifdef IBMPC
1837/* For Intel long double, shift denormal significand up 1
1838 -- but only if the top significand bit is zero. */
1839if((yy[NE-1] & 0x7fff) == 0 && (yy[NE-2] & 0x8000) == 0)
1840 {
1841 unsigned short temp[NI+1];
1842 emovi(yy, temp);
1843 eshup1(temp);
1844 emovo(temp,y);
1845 return;
1846 }
1847#endif
1848#ifdef INFINITY
1849/* Point to the exponent field. */
1850p = &yy[NE-1];
1851if ((*p & 0x7fff) == 0x7fff)
1852 {
1853#ifdef NANS
1854#ifdef IBMPC
1855 for( i=0; i<4; i++ )
1856 {
1857 if((i != 3 && pe[i] != 0)
1858 /* Check for Intel long double infinity pattern. */
1859 || (i == 3 && pe[i] != 0x8000))
1860 {
1861 enan( y, NBITS );
1862 return;
1863 }
1864 }
1865#else
1866 /* In Motorola extended precision format, the most significant
1867 bit of an infinity mantissa could be either 1 or 0. It is
1868 the lower order bits that tell whether the value is a NaN. */
1869 if ((pe[2] & 0x7fff) != 0)
1870 goto bigend_nan;
1871
1872 for( i=3; i<=5; i++ )
1873 {
1874 if( pe[i] != 0 )
1875 {
1876bigend_nan:
1877 enan( y, NBITS );
1878 return;
1879 }
1880 }
1881#endif
1882#endif /* NANS */
1883 eclear( y );
1884 einfin( y );
1885 if( *p & 0x8000 )
1886 eneg(y);
1887 return;
1888 }
1889#endif
1890p = yy;
1891q = y;
1892for( i=0; i<NE; i++ )
1893 *q++ = *p++;
1894}
1895
1896void e113toe(pe,y)
1897unsigned short *pe, *y;
1898{
1899register unsigned short r;
1900unsigned short *e, *p;
1901unsigned short yy[NI];
1902int denorm, i;
1903
1904e = pe;
1905denorm = 0;
1906ecleaz(yy);
1907#ifdef IBMPC
1908e += 7;
1909#endif
1910r = *e;
1911yy[0] = 0;
1912if( r & 0x8000 )
1913 yy[0] = 0xffff;
1914r &= 0x7fff;
1915#ifdef INFINITY
1916if( r == 0x7fff )
1917 {
1918#ifdef NANS
1919#ifdef IBMPC
1920 for( i=0; i<7; i++ )
1921 {
1922 if( pe[i] != 0 )
1923 {
1924 enan( y, NBITS );
1925 return;
1926 }
1927 }
1928#else
1929 for( i=1; i<8; i++ )
1930 {
1931 if( pe[i] != 0 )
1932 {
1933 enan( y, NBITS );
1934 return;
1935 }
1936 }
1937#endif
1938#endif /* NANS */
1939 eclear( y );
1940 einfin( y );
1941 if( *e & 0x8000 )
1942 eneg(y);
1943 return;
1944 }
1945#endif /* INFINITY */
1946yy[E] = r;
1947p = &yy[M + 1];
1948#ifdef IBMPC
1949for( i=0; i<7; i++ )
1950 *p++ = *(--e);
1951#endif
1952#ifdef MIEEE
1953++e;
1954for( i=0; i<7; i++ )
1955 *p++ = *e++;
1956#endif
1957/* If denormal, remove the implied bit; else shift down 1. */
1958if( r == 0 )
1959 {
1960 yy[M] = 0;
1961 }
1962else
1963 {
1964 yy[M] = 1;
1965 eshift( yy, -1 );
1966 }
1967emovo(yy,y);
1968}
1969
1970
1971/*
1972; Convert IEEE single precision to e type
1973; float d;
1974; unsigned short x[N+2];
1975; dtox( &d, x );
1976*/
1977void e24toe( pe, y )
1978unsigned short *pe, *y;
1979{
1980register unsigned short r;
1981register unsigned short *p, *e;
1982unsigned short yy[NI];
1983int denorm, k;
1984
1985e = pe;
1986denorm = 0; /* flag if denormalized number */
1987ecleaz(yy);
1988#ifdef IBMPC
1989e += 1;
1990#endif
1991#ifdef DEC
1992e += 1;
1993#endif
1994r = *e;
1995yy[0] = 0;
1996if( r & 0x8000 )
1997 yy[0] = 0xffff;
1998yy[M] = (r & 0x7f) | 0200;
1999r &= ~0x807f; /* strip sign and 7 significand bits */
2000#ifdef INFINITY
2001if( r == 0x7f80 )
2002 {
2003#ifdef NANS
2004#ifdef MIEEE
2005 if( ((pe[0] & 0x7f) != 0) || (pe[1] != 0) )
2006 {
2007 enan( y, NBITS );
2008 return;
2009 }
2010#else
2011 if( ((pe[1] & 0x7f) != 0) || (pe[0] != 0) )
2012 {
2013 enan( y, NBITS );
2014 return;
2015 }
2016#endif
2017#endif /* NANS */
2018 eclear( y );
2019 einfin( y );
2020 if( yy[0] )
2021 eneg(y);
2022 return;
2023 }
2024#endif
2025r >>= 7;
2026/* If zero exponent, then the significand is denormalized.
2027 * So, take back the understood high significand bit. */
2028if( r == 0 )
2029 {
2030 denorm = 1;
2031 yy[M] &= ~0200;
2032 }
2033r += EXONE - 0177;
2034yy[E] = r;
2035p = &yy[M+1];
2036#ifdef IBMPC
2037*p++ = *(--e);
2038#endif
2039#ifdef DEC
2040*p++ = *(--e);
2041#endif
2042#ifdef MIEEE
2043++e;
2044*p++ = *e++;
2045#endif
2046(void )eshift( yy, -8 );
2047if( denorm )
2048 { /* if zero exponent, then normalize the significand */
2049 if( (k = enormlz(yy)) > NBITS )
2050 ecleazs(yy);
2051 else
2052 yy[E] -= (unsigned short )(k-1);
2053 }
2054emovo( yy, y );
2055}
2056
2057void etoe113(x,e)
2058unsigned short *x, *e;
2059{
2060unsigned short xi[NI];
2061long exp;
2062int rndsav;
2063
2064#ifdef NANS
2065if( eisnan(x) )
2066 {
2067 enan( e, 113 );
2068 return;
2069 }
2070#endif
2071emovi( x, xi );
2072exp = (long )xi[E];
2073#ifdef INFINITY
2074if( eisinf(x) )
2075 goto nonorm;
2076#endif
2077/* round off to nearest or even */
2078rndsav = rndprc;
2079rndprc = 113;
2080emdnorm( xi, 0, 0, exp, 64 );
2081rndprc = rndsav;
2082nonorm:
2083toe113 (xi, e);
2084}
2085
2086/* move out internal format to ieee long double */
2087static void toe113(a,b)
2088unsigned short *a, *b;
2089{
2090register unsigned short *p, *q;
2091unsigned short i;
2092
2093#ifdef NANS
2094if( eiisnan(a) )
2095 {
2096 enan( b, 113 );
2097 return;
2098 }
2099#endif
2100p = a;
2101#ifdef MIEEE
2102q = b;
2103#else
2104q = b + 7; /* point to output exponent */
2105#endif
2106
2107/* If not denormal, delete the implied bit. */
2108if( a[E] != 0 )
2109 {
2110 eshup1 (a);
2111 }
2112/* combine sign and exponent */
2113i = *p++;
2114#ifdef MIEEE
2115if( i )
2116 *q++ = *p++ | 0x8000;
2117else
2118 *q++ = *p++;
2119#else
2120if( i )
2121 *q-- = *p++ | 0x8000;
2122else
2123 *q-- = *p++;
2124#endif
2125/* skip over guard word */
2126++p;
2127/* move the significand */
2128#ifdef MIEEE
2129for (i = 0; i < 7; i++)
2130 *q++ = *p++;
2131#else
2132for (i = 0; i < 7; i++)
2133 *q-- = *p++;
2134#endif
2135}
2136
2137
2138void etoe64( x, e )
2139unsigned short *x, *e;
2140{
2141unsigned short xi[NI];
2142long exp;
2143int rndsav;
2144
2145#ifdef NANS
2146if( eisnan(x) )
2147 {
2148 enan( e, 64 );
2149 return;
2150 }
2151#endif
2152emovi( x, xi );
2153exp = (long )xi[E]; /* adjust exponent for offset */
2154#ifdef INFINITY
2155if( eisinf(x) )
2156 goto nonorm;
2157#endif
2158/* round off to nearest or even */
2159rndsav = rndprc;
2160rndprc = 64;
2161emdnorm( xi, 0, 0, exp, 64 );
2162rndprc = rndsav;
2163nonorm:
2164toe64( xi, e );
2165}
2166
2167/* move out internal format to ieee long double */
2168static void toe64( a, b )
2169unsigned short *a, *b;
2170{
2171register unsigned short *p, *q;
2172unsigned short i;
2173
2174#ifdef NANS
2175if( eiisnan(a) )
2176 {
2177 enan( b, 64 );
2178 return;
2179 }
2180#endif
2181#ifdef IBMPC
2182/* Shift Intel denormal significand down 1. */
2183if( a[E] == 0 )
2184 eshdn1(a);
2185#endif
2186p = a;
2187#ifdef MIEEE
2188q = b;
2189#else
2190q = b + 4; /* point to output exponent */
2191#if 1
2192/* NOTE: if data type is 96 bits wide, clear the last word here. */
2193*(q+1)= 0;
2194#endif
2195#endif
2196
2197/* combine sign and exponent */
2198i = *p++;
2199#ifdef MIEEE
2200if( i )
2201 *q++ = *p++ | 0x8000;
2202else
2203 *q++ = *p++;
2204*q++ = 0;
2205#else
2206if( i )
2207 *q-- = *p++ | 0x8000;
2208else
2209 *q-- = *p++;
2210#endif
2211/* skip over guard word */
2212++p;
2213/* move the significand */
2214#ifdef MIEEE
2215for( i=0; i<4; i++ )
2216 *q++ = *p++;
2217#else
2218#ifdef INFINITY
2219if (eiisinf (a))
2220 {
2221 /* Intel long double infinity. */
2222 *q-- = 0x8000;
2223 *q-- = 0;
2224 *q-- = 0;
2225 *q = 0;
2226 return;
2227 }
2228#endif
2229for( i=0; i<4; i++ )
2230 *q-- = *p++;
2231#endif
2232}
2233
2234
2235/*
2236; e type to IEEE double precision
2237; double d;
2238; unsigned short x[NE];
2239; etoe53( x, &d );
2240*/
2241
2242#ifdef DEC
2243
2244void etoe53( x, e )
2245unsigned short *x, *e;
2246{
2247etodec( x, e ); /* see etodec.c */
2248}
2249
2250static void toe53( x, y )
2251unsigned short *x, *y;
2252{
2253todec( x, y );
2254}
2255
2256#else
2257
2258void etoe53( x, e )
2259unsigned short *x, *e;
2260{
2261unsigned short xi[NI];
2262long exp;
2263int rndsav;
2264
2265#ifdef NANS
2266if( eisnan(x) )
2267 {
2268 enan( e, 53 );
2269 return;
2270 }
2271#endif
2272emovi( x, xi );
2273exp = (long )xi[E] - (EXONE - 0x3ff); /* adjust exponent for offsets */
2274#ifdef INFINITY
2275if( eisinf(x) )
2276 goto nonorm;
2277#endif
2278/* round off to nearest or even */
2279rndsav = rndprc;
2280rndprc = 53;
2281emdnorm( xi, 0, 0, exp, 64 );
2282rndprc = rndsav;
2283nonorm:
2284toe53( xi, e );
2285}
2286
2287
2288static void toe53( x, y )
2289unsigned short *x, *y;
2290{
2291unsigned short i;
2292unsigned short *p;
2293
2294
2295#ifdef NANS
2296if( eiisnan(x) )
2297 {
2298 enan( y, 53 );
2299 return;
2300 }
2301#endif
2302p = &x[0];
2303#ifdef IBMPC
2304y += 3;
2305#endif
2306*y = 0; /* output high order */
2307if( *p++ )
2308 *y = 0x8000; /* output sign bit */
2309
2310i = *p++;
2311if( i >= (unsigned int )2047 )
2312 { /* Saturate at largest number less than infinity. */
2313#ifdef INFINITY
2314 *y |= 0x7ff0;
2315#ifdef IBMPC
2316 *(--y) = 0;
2317 *(--y) = 0;
2318 *(--y) = 0;
2319#endif
2320#ifdef MIEEE
2321 ++y;
2322 *y++ = 0;
2323 *y++ = 0;
2324 *y++ = 0;
2325#endif
2326#else
2327 *y |= (unsigned short )0x7fef;
2328#ifdef IBMPC
2329 *(--y) = 0xffff;
2330 *(--y) = 0xffff;
2331 *(--y) = 0xffff;
2332#endif
2333#ifdef MIEEE
2334 ++y;
2335 *y++ = 0xffff;
2336 *y++ = 0xffff;
2337 *y++ = 0xffff;
2338#endif
2339#endif
2340 return;
2341 }
2342if( i == 0 )
2343 {
2344 (void )eshift( x, 4 );
2345 }
2346else
2347 {
2348 i <<= 4;
2349 (void )eshift( x, 5 );
2350 }
2351i |= *p++ & (unsigned short )0x0f; /* *p = xi[M] */
2352*y |= (unsigned short )i; /* high order output already has sign bit set */
2353#ifdef IBMPC
2354*(--y) = *p++;
2355*(--y) = *p++;
2356*(--y) = *p;
2357#endif
2358#ifdef MIEEE
2359++y;
2360*y++ = *p++;
2361*y++ = *p++;
2362*y++ = *p++;
2363#endif
2364}
2365
2366#endif /* not DEC */
2367
2368
2369
2370/*
2371; e type to IEEE single precision
2372; float d;
2373; unsigned short x[N+2];
2374; xtod( x, &d );
2375*/
2376void etoe24( x, e )
2377unsigned short *x, *e;
2378{
2379long exp;
2380unsigned short xi[NI];
2381int rndsav;
2382
2383#ifdef NANS
2384if( eisnan(x) )
2385 {
2386 enan( e, 24 );
2387 return;
2388 }
2389#endif
2390emovi( x, xi );
2391exp = (long )xi[E] - (EXONE - 0177); /* adjust exponent for offsets */
2392#ifdef INFINITY
2393if( eisinf(x) )
2394 goto nonorm;
2395#endif
2396/* round off to nearest or even */
2397rndsav = rndprc;
2398rndprc = 24;
2399emdnorm( xi, 0, 0, exp, 64 );
2400rndprc = rndsav;
2401nonorm:
2402toe24( xi, e );
2403}
2404
2405static void toe24( x, y )
2406unsigned short *x, *y;
2407{
2408unsigned short i;
2409unsigned short *p;
2410
2411#ifdef NANS
2412if( eiisnan(x) )
2413 {
2414 enan( y, 24 );
2415 return;
2416 }
2417#endif
2418p = &x[0];
2419#ifdef IBMPC
2420y += 1;
2421#endif
2422#ifdef DEC
2423y += 1;
2424#endif
2425*y = 0; /* output high order */
2426if( *p++ )
2427 *y = 0x8000; /* output sign bit */
2428
2429i = *p++;
2430if( i >= 255 )
2431 { /* Saturate at largest number less than infinity. */
2432#ifdef INFINITY
2433 *y |= (unsigned short )0x7f80;
2434#ifdef IBMPC
2435 *(--y) = 0;
2436#endif
2437#ifdef DEC
2438 *(--y) = 0;
2439#endif
2440#ifdef MIEEE
2441 ++y;
2442 *y = 0;
2443#endif
2444#else
2445 *y |= (unsigned short )0x7f7f;
2446#ifdef IBMPC
2447 *(--y) = 0xffff;
2448#endif
2449#ifdef DEC
2450 *(--y) = 0xffff;
2451#endif
2452#ifdef MIEEE
2453 ++y;
2454 *y = 0xffff;
2455#endif
2456#endif
2457 return;
2458 }
2459if( i == 0 )
2460 {
2461 (void )eshift( x, 7 );
2462 }
2463else
2464 {
2465 i <<= 7;
2466 (void )eshift( x, 8 );
2467 }
2468i |= *p++ & (unsigned short )0x7f; /* *p = xi[M] */
2469*y |= i; /* high order output already has sign bit set */
2470#ifdef IBMPC
2471*(--y) = *p;
2472#endif
2473#ifdef DEC
2474*(--y) = *p;
2475#endif
2476#ifdef MIEEE
2477++y;
2478*y = *p;
2479#endif
2480}
2481
2482
2483/* Compare two e type numbers.
2484 *
2485 * unsigned short a[NE], b[NE];
2486 * ecmp( a, b );
2487 *
2488 * returns +1 if a > b
2489 * 0 if a == b
2490 * -1 if a < b
2491 * -2 if either a or b is a NaN.
2492 */
2493int ecmp( a, b )
2494unsigned short *a, *b;
2495{
2496unsigned short ai[NI], bi[NI];
2497register unsigned short *p, *q;
2498register int i;
2499int msign;
2500
2501#ifdef NANS
2502if (eisnan (a) || eisnan (b))
2503 return( -2 );
2504#endif
2505emovi( a, ai );
2506p = ai;
2507emovi( b, bi );
2508q = bi;
2509
2510if( *p != *q )
2511 { /* the signs are different */
2512/* -0 equals + 0 */
2513 for( i=1; i<NI-1; i++ )
2514 {
2515 if( ai[i] != 0 )
2516 goto nzro;
2517 if( bi[i] != 0 )
2518 goto nzro;
2519 }
2520 return(0);
2521nzro:
2522 if( *p == 0 )
2523 return( 1 );
2524 else
2525 return( -1 );
2526 }
2527/* both are the same sign */
2528if( *p == 0 )
2529 msign = 1;
2530else
2531 msign = -1;
2532i = NI-1;
2533do
2534 {
2535 if( *p++ != *q++ )
2536 {
2537 goto diff;
2538 }
2539 }
2540while( --i > 0 );
2541
2542return(0); /* equality */
2543
2544
2545
2546diff:
2547
2548if( *(--p) > *(--q) )
2549 return( msign ); /* p is bigger */
2550else
2551 return( -msign ); /* p is littler */
2552}
2553
2554
2555
2556
2557/* Find nearest integer to x = floor( x + 0.5 )
2558 *
2559 * unsigned short x[NE], y[NE]
2560 * eround( x, y );
2561 */
2562void eround( x, y )
2563unsigned short *x, *y;
2564{
2565
2566eadd( ehalf, x, y );
2567efloor( y, y );
2568}
2569
2570
2571
2572
2573/*
2574; convert long (32-bit) integer to e type
2575;
2576; long l;
2577; unsigned short x[NE];
2578; ltoe( &l, x );
2579; note &l is the memory address of l
2580*/
2581void ltoe( lp, y )
2582long *lp; /* lp is the memory address of a long integer */
2583unsigned short *y; /* y is the address of a short */
2584{
2585unsigned short yi[NI];
2586unsigned long ll;
2587int k;
2588
2589ecleaz( yi );
2590if( *lp < 0 )
2591 {
2592 ll = (unsigned long )( -(*lp) ); /* make it positive */
2593 yi[0] = 0xffff; /* put correct sign in the e type number */
2594 }
2595else
2596 {
2597 ll = (unsigned long )( *lp );
2598 }
2599/* move the long integer to yi significand area */
2600if( sizeof(long) == 8 )
2601 {
2602 yi[M] = (unsigned short) (ll >> (LONGBITS - 16));
2603 yi[M + 1] = (unsigned short) (ll >> (LONGBITS - 32));
2604 yi[M + 2] = (unsigned short) (ll >> 16);
2605 yi[M + 3] = (unsigned short) ll;
2606 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
2607 }
2608else
2609 {
2610 yi[M] = (unsigned short )(ll >> 16);
2611 yi[M+1] = (unsigned short )ll;
2612 yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */
2613 }
2614if( (k = enormlz( yi )) > NBITS ) /* normalize the significand */
2615 ecleaz( yi ); /* it was zero */
2616else
2617 yi[E] -= (unsigned short )k; /* subtract shift count from exponent */
2618emovo( yi, y ); /* output the answer */
2619}
2620
2621/*
2622; convert unsigned long (32-bit) integer to e type
2623;
2624; unsigned long l;
2625; unsigned short x[NE];
2626; ltox( &l, x );
2627; note &l is the memory address of l
2628*/
2629void ultoe( lp, y )
2630unsigned long *lp; /* lp is the memory address of a long integer */
2631unsigned short *y; /* y is the address of a short */
2632{
2633unsigned short yi[NI];
2634unsigned long ll;
2635int k;
2636
2637ecleaz( yi );
2638ll = *lp;
2639
2640/* move the long integer to ayi significand area */
2641if( sizeof(long) == 8 )
2642 {
2643 yi[M] = (unsigned short) (ll >> (LONGBITS - 16));
2644 yi[M + 1] = (unsigned short) (ll >> (LONGBITS - 32));
2645 yi[M + 2] = (unsigned short) (ll >> 16);
2646 yi[M + 3] = (unsigned short) ll;
2647 yi[E] = EXONE + 47; /* exponent if normalize shift count were 0 */
2648 }
2649else
2650 {
2651 yi[M] = (unsigned short )(ll >> 16);
2652 yi[M+1] = (unsigned short )ll;
2653 yi[E] = EXONE + 15; /* exponent if normalize shift count were 0 */
2654 }
2655if( (k = enormlz( yi )) > NBITS ) /* normalize the significand */
2656 ecleaz( yi ); /* it was zero */
2657else
2658 yi[E] -= (unsigned short )k; /* subtract shift count from exponent */
2659emovo( yi, y ); /* output the answer */
2660}
2661
2662
2663/*
2664; Find long integer and fractional parts
2665
2666; long i;
2667; unsigned short x[NE], frac[NE];
2668; xifrac( x, &i, frac );
2669
2670 The integer output has the sign of the input. The fraction is
2671 the positive fractional part of abs(x).
2672*/
2673void eifrac( x, i, frac )
2674unsigned short *x;
2675long *i;
2676unsigned short *frac;
2677{
2678unsigned short xi[NI];
2679int j, k;
2680unsigned long ll;
2681
2682emovi( x, xi );
2683k = (int )xi[E] - (EXONE - 1);
2684if( k <= 0 )
2685 {
2686/* if exponent <= 0, integer = 0 and real output is fraction */
2687 *i = 0L;
2688 emovo( xi, frac );
2689 return;
2690 }
2691if( k > (8 * sizeof(long) - 1) )
2692 {
2693/*
2694; long integer overflow: output large integer
2695; and correct fraction
2696*/
2697 j = 8 * sizeof(long) - 1;
2698 if( xi[0] )
2699 *i = (long) ((unsigned long) 1) << j;
2700 else
2701 *i = (long) (((unsigned long) (~(0L))) >> 1);
2702 (void )eshift( xi, k );
2703 }
2704if( k > 16 )
2705 {
2706/*
2707 Shift more than 16 bits: shift up k-16 mod 16
2708 then shift by 16's.
2709*/
2710 j = k - ((k >> 4) << 4);
2711 eshift (xi, j);
2712 ll = xi[M];
2713 k -= j;
2714 do
2715 {
2716 eshup6 (xi);
2717 ll = (ll << 16) | xi[M];
2718 }
2719 while ((k -= 16) > 0);
2720 *i = ll;
2721 if (xi[0])
2722 *i = -(*i);
2723 }
2724else
2725 {
2726/* shift not more than 16 bits */
2727 eshift( xi, k );
2728 *i = (long )xi[M] & 0xffff;
2729 if( xi[0] )
2730 *i = -(*i);
2731 }
2732xi[0] = 0;
2733xi[E] = EXONE - 1;
2734xi[M] = 0;
2735if( (k = enormlz( xi )) > NBITS )
2736 ecleaz( xi );
2737else
2738 xi[E] -= (unsigned short )k;
2739
2740emovo( xi, frac );
2741}
2742
2743
2744/*
2745; Find unsigned long integer and fractional parts
2746
2747; unsigned long i;
2748; unsigned short x[NE], frac[NE];
2749; xifrac( x, &i, frac );
2750
2751 A negative e type input yields integer output = 0
2752 but correct fraction.
2753*/
2754void euifrac( x, i, frac )
2755unsigned short *x;
2756unsigned long *i;
2757unsigned short *frac;
2758{
2759unsigned short xi[NI];
2760int j, k;
2761unsigned long ll;
2762
2763emovi( x, xi );
2764k = (int )xi[E] - (EXONE - 1);
2765if( k <= 0 )
2766 {
2767/* if exponent <= 0, integer = 0 and argument is fraction */
2768 *i = 0L;
2769 emovo( xi, frac );
2770 return;
2771 }
2772if( k > (8 * sizeof(long)) )
2773 {
2774/*
2775; long integer overflow: output large integer
2776; and correct fraction
2777*/
2778 *i = ~(0L);
2779 (void )eshift( xi, k );
2780 }
2781else if( k > 16 )
2782 {
2783/*
2784 Shift more than 16 bits: shift up k-16 mod 16
2785 then shift up by 16's.
2786*/
2787 j = k - ((k >> 4) << 4);
2788 eshift (xi, j);
2789 ll = xi[M];
2790 k -= j;
2791 do
2792 {
2793 eshup6 (xi);
2794 ll = (ll << 16) | xi[M];
2795 }
2796 while ((k -= 16) > 0);
2797 *i = ll;
2798 }
2799else
2800 {
2801/* shift not more than 16 bits */
2802 eshift( xi, k );
2803 *i = (long )xi[M] & 0xffff;
2804 }
2805
2806if( xi[0] ) /* A negative value yields unsigned integer 0. */
2807 *i = 0L;
2808
2809xi[0] = 0;
2810xi[E] = EXONE - 1;
2811xi[M] = 0;
2812if( (k = enormlz( xi )) > NBITS )
2813 ecleaz( xi );
2814else
2815 xi[E] -= (unsigned short )k;
2816
2817emovo( xi, frac );
2818}
2819
2820
2821
2822/*
2823; Shift significand
2824;
2825; Shifts significand area up or down by the number of bits
2826; given by the variable sc.
2827*/
2828int eshift( x, sc )
2829unsigned short *x;
2830int sc;
2831{
2832unsigned short lost;
2833unsigned short *p;
2834
2835if( sc == 0 )
2836 return( 0 );
2837
2838lost = 0;
2839p = x + NI-1;
2840
2841if( sc < 0 )
2842 {
2843 sc = -sc;
2844 while( sc >= 16 )
2845 {
2846 lost |= *p; /* remember lost bits */
2847 eshdn6(x);
2848 sc -= 16;
2849 }
2850
2851 while( sc >= 8 )
2852 {
2853 lost |= *p & 0xff;
2854 eshdn8(x);
2855 sc -= 8;
2856 }
2857
2858 while( sc > 0 )
2859 {
2860 lost |= *p & 1;
2861 eshdn1(x);
2862 sc -= 1;
2863 }
2864 }
2865else
2866 {
2867 while( sc >= 16 )
2868 {
2869 eshup6(x);
2870 sc -= 16;
2871 }
2872
2873 while( sc >= 8 )
2874 {
2875 eshup8(x);
2876 sc -= 8;
2877 }
2878
2879 while( sc > 0 )
2880 {
2881 eshup1(x);
2882 sc -= 1;
2883 }
2884 }
2885if( lost )
2886 lost = 1;
2887return( (int )lost );
2888}
2889
2890
2891
2892/*
2893; normalize
2894;
2895; Shift normalizes the significand area pointed to by argument
2896; shift count (up = positive) is returned.
2897*/
2898int enormlz(x)
2899unsigned short x[];
2900{
2901register unsigned short *p;
2902int sc;
2903
2904sc = 0;
2905p = &x[M];
2906if( *p != 0 )
2907 goto normdn;
2908++p;
2909if( *p & 0x8000 )
2910 return( 0 ); /* already normalized */
2911while( *p == 0 )
2912 {
2913 eshup6(x);
2914 sc += 16;
2915/* With guard word, there are NBITS+16 bits available.
2916 * return true if all are zero.
2917 */
2918 if( sc > NBITS )
2919 return( sc );
2920 }
2921/* see if high byte is zero */
2922while( (*p & 0xff00) == 0 )
2923 {
2924 eshup8(x);
2925 sc += 8;
2926 }
2927/* now shift 1 bit at a time */
2928while( (*p & 0x8000) == 0)
2929 {
2930 eshup1(x);
2931 sc += 1;
2932 if( sc > (NBITS+16) )
2933 {
2934 mtherr( "enormlz", UNDERFLOW );
2935 return( sc );
2936 }
2937 }
2938return( sc );
2939
2940/* Normalize by shifting down out of the high guard word
2941 of the significand */
2942normdn:
2943
2944if( *p & 0xff00 )
2945 {
2946 eshdn8(x);
2947 sc -= 8;
2948 }
2949while( *p != 0 )
2950 {
2951 eshdn1(x);
2952 sc -= 1;
2953
2954 if( sc < -NBITS )
2955 {
2956 mtherr( "enormlz", OVERFLOW );
2957 return( sc );
2958 }
2959 }
2960return( sc );
2961}
2962
2963
2964
2965
2966/* Convert e type number to decimal format ASCII string.
2967 * The constants are for 64 bit precision.
2968 */
2969
2970#define NTEN 12
2971#define MAXP 4096
2972
2973#if NE == 10
2974static unsigned short etens[NTEN + 1][NE] =
2975{
2976 {0x6576, 0x4a92, 0x804a, 0x153f,
2977 0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
2978 {0x6a32, 0xce52, 0x329a, 0x28ce,
2979 0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
2980 {0x526c, 0x50ce, 0xf18b, 0x3d28,
2981 0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
2982 {0x9c66, 0x58f8, 0xbc50, 0x5c54,
2983 0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
2984 {0x851e, 0xeab7, 0x98fe, 0x901b,
2985 0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
2986 {0x0235, 0x0137, 0x36b1, 0x336c,
2987 0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
2988 {0x50f8, 0x25fb, 0xc76b, 0x6b71,
2989 0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
2990 {0x0000, 0x0000, 0x0000, 0x0000,
2991 0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
2992 {0x0000, 0x0000, 0x0000, 0x0000,
2993 0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
2994 {0x0000, 0x0000, 0x0000, 0x0000,
2995 0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
2996 {0x0000, 0x0000, 0x0000, 0x0000,
2997 0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
2998 {0x0000, 0x0000, 0x0000, 0x0000,
2999 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
3000 {0x0000, 0x0000, 0x0000, 0x0000,
3001 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
3002};
3003
3004static unsigned short emtens[NTEN + 1][NE] =
3005{
3006 {0x2030, 0xcffc, 0xa1c3, 0x8123,
3007 0x2de3, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */
3008 {0x8264, 0xd2cb, 0xf2ea, 0x12d4,
3009 0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */
3010 {0xf53f, 0xf698, 0x6bd3, 0x0158,
3011 0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,},
3012 {0xe731, 0x04d4, 0xe3f2, 0xd332,
3013 0x7132, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,},
3014 {0xa23e, 0x5308, 0xfefb, 0x1155,
3015 0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,},
3016 {0xe26d, 0xdbde, 0xd05d, 0xb3f6,
3017 0xac7c, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,},
3018 {0x2a20, 0x6224, 0x47b3, 0x98d7,
3019 0x3f23, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,},
3020 {0x0b5b, 0x4af2, 0xa581, 0x18ed,
3021 0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,},
3022 {0xbf71, 0xa9b3, 0x7989, 0xbe68,
3023 0x4c2e, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,},
3024 {0x3d4d, 0x7c3d, 0x36ba, 0x0d2b,
3025 0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,},
3026 {0xc155, 0xa4a8, 0x404e, 0x6113,
3027 0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,},
3028 {0xd70a, 0x70a3, 0x0a3d, 0xa3d7,
3029 0x3d70, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,},
3030 {0xcccd, 0xcccc, 0xcccc, 0xcccc,
3031 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */
3032};
3033#else
3034static unsigned short etens[NTEN+1][NE] = {
3035{0xc94c,0x979a,0x8a20,0x5202,0xc460,0x7525,},/* 10**4096 */
3036{0xa74d,0x5de4,0xc53d,0x3b5d,0x9e8b,0x5a92,},/* 10**2048 */
3037{0x650d,0x0c17,0x8175,0x7586,0xc976,0x4d48,},
3038{0xcc65,0x91c6,0xa60e,0xa0ae,0xe319,0x46a3,},
3039{0xddbc,0xde8d,0x9df9,0xebfb,0xaa7e,0x4351,},
3040{0xc66f,0x8cdf,0x80e9,0x47c9,0x93ba,0x41a8,},
3041{0x3cbf,0xa6d5,0xffcf,0x1f49,0xc278,0x40d3,},
3042{0xf020,0xb59d,0x2b70,0xada8,0x9dc5,0x4069,},
3043{0x0000,0x0000,0x0400,0xc9bf,0x8e1b,0x4034,},
3044{0x0000,0x0000,0x0000,0x2000,0xbebc,0x4019,},
3045{0x0000,0x0000,0x0000,0x0000,0x9c40,0x400c,},
3046{0x0000,0x0000,0x0000,0x0000,0xc800,0x4005,},
3047{0x0000,0x0000,0x0000,0x0000,0xa000,0x4002,}, /* 10**1 */
3048};
3049
3050static unsigned short emtens[NTEN+1][NE] = {
3051{0x2de4,0x9fde,0xd2ce,0x04c8,0xa6dd,0x0ad8,}, /* 10**-4096 */
3052{0x4925,0x2de4,0x3436,0x534f,0xceae,0x256b,}, /* 10**-2048 */
3053{0x87a6,0xc0bd,0xda57,0x82a5,0xa2a6,0x32b5,},
3054{0x7133,0xd21c,0xdb23,0xee32,0x9049,0x395a,},
3055{0xfa91,0x1939,0x637a,0x4325,0xc031,0x3cac,},
3056{0xac7d,0xe4a0,0x64bc,0x467c,0xddd0,0x3e55,},
3057{0x3f24,0xe9a5,0xa539,0xea27,0xa87f,0x3f2a,},
3058{0x67de,0x94ba,0x4539,0x1ead,0xcfb1,0x3f94,},
3059{0x4c2f,0xe15b,0xc44d,0x94be,0xe695,0x3fc9,},
3060{0xfdc2,0xcefc,0x8461,0x7711,0xabcc,0x3fe4,},
3061{0xd3c3,0x652b,0xe219,0x1758,0xd1b7,0x3ff1,},
3062{0x3d71,0xd70a,0x70a3,0x0a3d,0xa3d7,0x3ff8,},
3063{0xcccd,0xcccc,0xcccc,0xcccc,0xcccc,0x3ffb,}, /* 10**-1 */
3064};
3065#endif
3066
3067void e24toasc( x, string, ndigs )
3068unsigned short x[];
3069char *string;
3070int ndigs;
3071{
3072unsigned short w[NI];
3073
3074e24toe( x, w );
3075etoasc( w, string, ndigs );
3076}
3077
3078
3079void e53toasc( x, string, ndigs )
3080unsigned short x[];
3081char *string;
3082int ndigs;
3083{
3084unsigned short w[NI];
3085
3086e53toe( x, w );
3087etoasc( w, string, ndigs );
3088}
3089
3090
3091void e64toasc( x, string, ndigs )
3092unsigned short x[];
3093char *string;
3094int ndigs;
3095{
3096unsigned short w[NI];
3097
3098e64toe( x, w );
3099etoasc( w, string, ndigs );
3100}
3101
3102void e113toasc (x, string, ndigs)
3103unsigned short x[];
3104char *string;
3105int ndigs;
3106{
3107unsigned short w[NI];
3108
3109e113toe (x, w);
3110etoasc (w, string, ndigs);
3111}
3112
3113
3114void etoasc( x, string, ndigs )
3115unsigned short x[];
3116char *string;
3117int ndigs;
3118{
3119long digit;
3120unsigned short y[NI], t[NI], u[NI], w[NI];
3121unsigned short *p, *r, *ten;
3122unsigned short sign;
3123int i, j, k, expon, rndsav;
3124char *s, *ss;
3125unsigned short m;
3126
3127rndsav = rndprc;
3128#ifdef NANS
3129if( eisnan(x) )
3130 {
3131 sprintf( string, " NaN " );
3132 goto bxit;
3133 }
3134#endif
3135rndprc = NBITS; /* set to full precision */
3136emov( x, y ); /* retain external format */
3137if( y[NE-1] & 0x8000 )
3138 {
3139 sign = 0xffff;
3140 y[NE-1] &= 0x7fff;
3141 }
3142else
3143 {
3144 sign = 0;
3145 }
3146expon = 0;
3147ten = &etens[NTEN][0];
3148emov( eone, t );
3149/* Test for zero exponent */
3150if( y[NE-1] == 0 )
3151 {
3152 for( k=0; k<NE-1; k++ )
3153 {
3154 if( y[k] != 0 )
3155 goto tnzro; /* denormalized number */
3156 }
3157 goto isone; /* legal all zeros */
3158 }
3159tnzro:
3160
3161/* Test for infinity.
3162 */
3163if( y[NE-1] == 0x7fff )
3164 {
3165 if( sign )
3166 sprintf( string, " -Infinity " );
3167 else
3168 sprintf( string, " Infinity " );
3169 goto bxit;
3170 }
3171
3172/* Test for exponent nonzero but significand denormalized.
3173 * This is an error condition.
3174 */
3175if( (y[NE-1] != 0) && ((y[NE-2] & 0x8000) == 0) )
3176 {
3177 mtherr( "etoasc", DOMAIN );
3178 sprintf( string, "NaN" );
3179 goto bxit;
3180 }
3181
3182/* Compare to 1.0 */
3183i = ecmp( eone, y );
3184if( i == 0 )
3185 goto isone;
3186
3187if( i < 0 )
3188 { /* Number is greater than 1 */
3189/* Convert significand to an integer and strip trailing decimal zeros. */
3190 emov( y, u );
3191 u[NE-1] = EXONE + NBITS - 1;
3192
3193 p = &etens[NTEN-4][0];
3194 m = 16;
3195do
3196 {
3197 ediv( p, u, t );
3198 efloor( t, w );
3199 for( j=0; j<NE-1; j++ )
3200 {
3201 if( t[j] != w[j] )
3202 goto noint;
3203 }
3204 emov( t, u );
3205 expon += (int )m;
3206noint:
3207 p += NE;
3208 m >>= 1;
3209 }
3210while( m != 0 );
3211
3212/* Rescale from integer significand */
3213 u[NE-1] += y[NE-1] - (unsigned int )(EXONE + NBITS - 1);
3214 emov( u, y );
3215/* Find power of 10 */
3216 emov( eone, t );
3217 m = MAXP;
3218 p = &etens[0][0];
3219 while( ecmp( ten, u ) <= 0 )
3220 {
3221 if( ecmp( p, u ) <= 0 )
3222 {
3223 ediv( p, u, u );
3224 emul( p, t, t );
3225 expon += (int )m;
3226 }
3227 m >>= 1;
3228 if( m == 0 )
3229 break;
3230 p += NE;
3231 }
3232 }
3233else
3234 { /* Number is less than 1.0 */
3235/* Pad significand with trailing decimal zeros. */
3236 if( y[NE-1] == 0 )
3237 {
3238 while( (y[NE-2] & 0x8000) == 0 )
3239 {
3240 emul( ten, y, y );
3241 expon -= 1;
3242 }
3243 }
3244 else
3245 {
3246 emovi( y, w );
3247 for( i=0; i<NDEC+1; i++ )
3248 {
3249 if( (w[NI-1] & 0x7) != 0 )
3250 break;
3251/* multiply by 10 */
3252 emovz( w, u );
3253 eshdn1( u );
3254 eshdn1( u );
3255 eaddm( w, u );
3256 u[1] += 3;
3257 while( u[2] != 0 )
3258 {
3259 eshdn1(u);
3260 u[1] += 1;
3261 }
3262 if( u[NI-1] != 0 )
3263 break;
3264 if( eone[NE-1] <= u[1] )
3265 break;
3266 emovz( u, w );
3267 expon -= 1;
3268 }
3269 emovo( w, y );
3270 }
3271 k = -MAXP;
3272 p = &emtens[0][0];
3273 r = &etens[0][0];
3274 emov( y, w );
3275 emov( eone, t );
3276 while( ecmp( eone, w ) > 0 )
3277 {
3278 if( ecmp( p, w ) >= 0 )
3279 {
3280 emul( r, w, w );
3281 emul( r, t, t );
3282 expon += k;
3283 }
3284 k /= 2;
3285 if( k == 0 )
3286 break;
3287 p += NE;
3288 r += NE;
3289 }
3290 ediv( t, eone, t );
3291 }
3292isone:
3293/* Find the first (leading) digit. */
3294emovi( t, w );
3295emovz( w, t );
3296emovi( y, w );
3297emovz( w, y );
3298eiremain( t, y );
3299digit = equot[NI-1];
3300while( (digit == 0) && (ecmp(y,ezero) != 0) )
3301 {
3302 eshup1( y );
3303 emovz( y, u );
3304 eshup1( u );
3305 eshup1( u );
3306 eaddm( u, y );
3307 eiremain( t, y );
3308 digit = equot[NI-1];
3309 expon -= 1;
3310 }
3311s = string;
3312if( sign )
3313 *s++ = '-';
3314else
3315 *s++ = ' ';
3316/* Examine number of digits requested by caller. */
3317if( ndigs < 0 )
3318 ndigs = 0;
3319if( ndigs > NDEC )
3320 ndigs = NDEC;
3321if( digit == 10 )
3322 {
3323 *s++ = '1';
3324 *s++ = '.';
3325 if( ndigs > 0 )
3326 {
3327 *s++ = '0';
3328 ndigs -= 1;
3329 }
3330 expon += 1;
3331 }
3332else
3333 {
3334 *s++ = (char )digit + '0';
3335 *s++ = '.';
3336 }
3337/* Generate digits after the decimal point. */
3338for( k=0; k<=ndigs; k++ )
3339 {
3340/* multiply current number by 10, without normalizing */
3341 eshup1( y );
3342 emovz( y, u );
3343 eshup1( u );
3344 eshup1( u );
3345 eaddm( u, y );
3346 eiremain( t, y );
3347 *s++ = (char )equot[NI-1] + '0';
3348 }
3349digit = equot[NI-1];
3350--s;
3351ss = s;
3352/* round off the ASCII string */
3353if( digit > 4 )
3354 {
3355/* Test for critical rounding case in ASCII output. */
3356 if( digit == 5 )
3357 {
3358 emovo( y, t );
3359 if( ecmp(t,ezero) != 0 )
3360 goto roun; /* round to nearest */
3361 if( (*(s-1) & 1) == 0 )
3362 goto doexp; /* round to even */
3363 }
3364/* Round up and propagate carry-outs */
3365roun:
3366 --s;
3367 k = *s & 0x7f;
3368/* Carry out to most significant digit? */
3369 if( k == '.' )
3370 {
3371 --s;
3372 k = *s;
3373 k += 1;
3374 *s = (char )k;
3375/* Most significant digit carries to 10? */
3376 if( k > '9' )
3377 {
3378 expon += 1;
3379 *s = '1';
3380 }
3381 goto doexp;
3382 }
3383/* Round up and carry out from less significant digits */
3384 k += 1;
3385 *s = (char )k;
3386 if( k > '9' )
3387 {
3388 *s = '0';
3389 goto roun;
3390 }
3391 }
3392doexp:
3393/*
3394if( expon >= 0 )
3395 sprintf( ss, "e+%d", expon );
3396else
3397 sprintf( ss, "e%d", expon );
3398*/
3399 sprintf( ss, "E%d", expon );
3400bxit:
3401rndprc = rndsav;
3402}
3403
3404
3405
3406
3407/*
3408; ASCTOQ
3409; ASCTOQ.MAC LATEST REV: 11 JAN 84
3410; SLM, 3 JAN 78
3411;
3412; Convert ASCII string to quadruple precision floating point
3413;
3414; Numeric input is free field decimal number
3415; with max of 15 digits with or without
3416; decimal point entered as ASCII from teletype.
3417; Entering E after the number followed by a second
3418; number causes the second number to be interpreted
3419; as a power of 10 to be multiplied by the first number
3420; (i.e., "scientific" notation).
3421;
3422; Usage:
3423; asctoq( string, q );
3424*/
3425
3426/* ASCII to single */
3427void asctoe24( s, y )
3428char *s;
3429unsigned short *y;
3430{
3431asctoeg( s, y, 24 );
3432}
3433
3434
3435/* ASCII to double */
3436void asctoe53( s, y )
3437char *s;
3438unsigned short *y;
3439{
3440#ifdef DEC
3441asctoeg( s, y, 56 );
3442#else
3443asctoeg( s, y, 53 );
3444#endif
3445}
3446
3447
3448/* ASCII to long double */
3449void asctoe64( s, y )
3450char *s;
3451unsigned short *y;
3452{
3453asctoeg( s, y, 64 );
3454}
3455
3456/* ASCII to 128-bit long double */
3457void asctoe113 (s, y)
3458char *s;
3459unsigned short *y;
3460{
3461asctoeg( s, y, 113 );
3462}
3463
3464/* ASCII to super double */
3465void asctoe( s, y )
3466char *s;
3467unsigned short *y;
3468{
3469asctoeg( s, y, NBITS );
3470}
3471
3472/* Space to make a copy of the input string: */
3473static char lstr[82] = {0};
3474
3475void asctoeg( ss, y, oprec )
3476char *ss;
3477unsigned short *y;
3478int oprec;
3479{
3480unsigned short yy[NI], xt[NI], tt[NI];
3481int esign, decflg, sgnflg, nexp, exp, prec, lost;
3482int k, trail, c, rndsav;
3483long lexp;
3484unsigned short nsign, *p;
3485char *sp, *s;
3486
3487/* Copy the input string. */
3488s = ss;
3489while( *s == ' ' ) /* skip leading spaces */
3490 ++s;
3491sp = lstr;
3492for( k=0; k<79; k++ )
3493 {
3494 if( (*sp++ = *s++) == '\0' )
3495 break;
3496 }
3497*sp = '\0';
3498s = lstr;
3499
3500rndsav = rndprc;
3501rndprc = NBITS; /* Set to full precision */
3502lost = 0;
3503nsign = 0;
3504decflg = 0;
3505sgnflg = 0;
3506nexp = 0;
3507exp = 0;
3508prec = 0;
3509ecleaz( yy );
3510trail = 0;
3511
3512nxtcom:
3513k = *s - '0';
3514if( (k >= 0) && (k <= 9) )
3515 {
3516/* Ignore leading zeros */
3517 if( (prec == 0) && (decflg == 0) && (k == 0) )
3518 goto donchr;
3519/* Identify and strip trailing zeros after the decimal point. */
3520 if( (trail == 0) && (decflg != 0) )
3521 {
3522 sp = s;
3523 while( (*sp >= '0') && (*sp <= '9') )
3524 ++sp;
3525/* Check for syntax error */
3526 c = *sp & 0x7f;
3527 if( (c != 'e') && (c != 'E') && (c != '\0')
3528 && (c != '\n') && (c != '\r') && (c != ' ')
3529 && (c != ',') )
3530 goto error;
3531 --sp;
3532 while( *sp == '0' )
3533 *sp-- = 'z';
3534 trail = 1;
3535 if( *s == 'z' )
3536 goto donchr;
3537 }
3538/* If enough digits were given to more than fill up the yy register,
3539 * continuing until overflow into the high guard word yy[2]
3540 * guarantees that there will be a roundoff bit at the top
3541 * of the low guard word after normalization.
3542 */
3543 if( yy[2] == 0 )
3544 {
3545 if( decflg )
3546 nexp += 1; /* count digits after decimal point */
3547 eshup1( yy ); /* multiply current number by 10 */
3548 emovz( yy, xt );
3549 eshup1( xt );
3550 eshup1( xt );
3551 eaddm( xt, yy );
3552 ecleaz( xt );
3553 xt[NI-2] = (unsigned short )k;
3554 eaddm( xt, yy );
3555 }
3556 else
3557 {
3558 /* Mark any lost non-zero digit. */
3559 lost |= k;
3560 /* Count lost digits before the decimal point. */
3561 if (decflg == 0)
3562 nexp -= 1;
3563 }
3564 prec += 1;
3565 goto donchr;
3566 }
3567
3568switch( *s )
3569 {
3570 case 'z':
3571 break;
3572 case 'E':
3573 case 'e':
3574 goto expnt;
3575 case '.': /* decimal point */
3576 if( decflg )
3577 goto error;
3578 ++decflg;
3579 break;
3580 case '-':
3581 nsign = 0xffff;
3582 if( sgnflg )
3583 goto error;
3584 ++sgnflg;
3585 break;
3586 case '+':
3587 if( sgnflg )
3588 goto error;
3589 ++sgnflg;
3590 break;
3591 case ',':
3592 case ' ':
3593 case '\0':
3594 case '\n':
3595 case '\r':
3596 goto daldone;
3597 case 'i':
3598 case 'I':
3599 goto infinite;
3600 default:
3601 error:
3602#ifdef NANS
3603 enan( yy, NI*16 );
3604#else
3605 mtherr( "asctoe", DOMAIN );
3606 ecleaz(yy);
3607#endif
3608 goto aexit;
3609 }
3610donchr:
3611++s;
3612goto nxtcom;
3613
3614/* Exponent interpretation */
3615expnt:
3616
3617esign = 1;
3618exp = 0;
3619++s;
3620/* check for + or - */
3621if( *s == '-' )
3622 {
3623 esign = -1;
3624 ++s;
3625 }
3626if( *s == '+' )
3627 ++s;
3628while( (*s >= '0') && (*s <= '9') )
3629 {
3630 exp *= 10;
3631 exp += *s++ - '0';
3632 if (exp > 4977)
3633 {
3634 if (esign < 0)
3635 goto zero;
3636 else
3637 goto infinite;
3638 }
3639 }
3640if( esign < 0 )
3641 exp = -exp;
3642if( exp > 4932 )
3643 {
3644infinite:
3645 ecleaz(yy);
3646 yy[E] = 0x7fff; /* infinity */
3647 goto aexit;
3648 }
3649if( exp < -4977 )
3650 {
3651zero:
3652 ecleaz(yy);
3653 goto aexit;
3654 }
3655
3656daldone:
3657nexp = exp - nexp;
3658/* Pad trailing zeros to minimize power of 10, per IEEE spec. */
3659while( (nexp > 0) && (yy[2] == 0) )
3660 {
3661 emovz( yy, xt );
3662 eshup1( xt );
3663 eshup1( xt );
3664 eaddm( yy, xt );
3665 eshup1( xt );
3666 if( xt[2] != 0 )
3667 break;
3668 nexp -= 1;
3669 emovz( xt, yy );
3670 }
3671if( (k = enormlz(yy)) > NBITS )
3672 {
3673 ecleaz(yy);
3674 goto aexit;
3675 }
3676lexp = (EXONE - 1 + NBITS) - k;
3677emdnorm( yy, lost, 0, lexp, 64 );
3678/* convert to external format */
3679
3680
3681/* Multiply by 10**nexp. If precision is 64 bits,
3682 * the maximum relative error incurred in forming 10**n
3683 * for 0 <= n <= 324 is 8.2e-20, at 10**180.
3684 * For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947.
3685 * For 0 >= n >= -999, it is -1.55e-19 at 10**-435.
3686 */
3687lexp = yy[E];
3688if( nexp == 0 )
3689 {
3690 k = 0;
3691 goto expdon;
3692 }
3693esign = 1;
3694if( nexp < 0 )
3695 {
3696 nexp = -nexp;
3697 esign = -1;
3698 if( nexp > 4096 )
3699 { /* Punt. Can't handle this without 2 divides. */
3700 emovi( etens[0], tt );
3701 lexp -= tt[E];
3702 k = edivm( tt, yy );
3703 lexp += EXONE;
3704 nexp -= 4096;
3705 }
3706 }
3707p = &etens[NTEN][0];
3708emov( eone, xt );
3709exp = 1;
3710do
3711 {
3712 if( exp & nexp )
3713 emul( p, xt, xt );
3714 p -= NE;
3715 exp = exp + exp;
3716 }
3717while( exp <= MAXP );
3718
3719emovi( xt, tt );
3720if( esign < 0 )
3721 {
3722 lexp -= tt[E];
3723 k = edivm( tt, yy );
3724 lexp += EXONE;
3725 }
3726else
3727 {
3728 lexp += tt[E];
3729 k = emulm( tt, yy );
3730 lexp -= EXONE - 1;
3731 }
3732
3733expdon:
3734
3735/* Round and convert directly to the destination type */
3736if( oprec == 53 )
3737 lexp -= EXONE - 0x3ff;
3738else if( oprec == 24 )
3739 lexp -= EXONE - 0177;
3740#ifdef DEC
3741else if( oprec == 56 )
3742 lexp -= EXONE - 0201;
3743#endif
3744rndprc = oprec;
3745emdnorm( yy, k, 0, lexp, 64 );
3746
3747aexit:
3748
3749rndprc = rndsav;
3750yy[0] = nsign;
3751switch( oprec )
3752 {
3753#ifdef DEC
3754 case 56:
3755 todec( yy, y ); /* see etodec.c */
3756 break;
3757#endif
3758 case 53:
3759 toe53( yy, y );
3760 break;
3761 case 24:
3762 toe24( yy, y );
3763 break;
3764 case 64:
3765 toe64( yy, y );
3766 break;
3767 case 113:
3768 toe113( yy, y );
3769 break;
3770 case NBITS:
3771 emovo( yy, y );
3772 break;
3773 }
3774}
3775
3776
3777
3778/* y = largest integer not greater than x
3779 * (truncated toward minus infinity)
3780 *
3781 * unsigned short x[NE], y[NE]
3782 *
3783 * efloor( x, y );
3784 */
3785static unsigned short bmask[] = {
37860xffff,
37870xfffe,
37880xfffc,
37890xfff8,
37900xfff0,
37910xffe0,
37920xffc0,
37930xff80,
37940xff00,
37950xfe00,
37960xfc00,
37970xf800,
37980xf000,
37990xe000,
38000xc000,
38010x8000,
38020x0000,
3803};
3804
3805void efloor( x, y )
3806unsigned short x[], y[];
3807{
3808register unsigned short *p;
3809int e, expon, i;
3810unsigned short f[NE];
3811
3812emov( x, f ); /* leave in external format */
3813expon = (int )f[NE-1];
3814e = (expon & 0x7fff) - (EXONE - 1);
3815if( e <= 0 )
3816 {
3817 eclear(y);
3818 goto isitneg;
3819 }
3820/* number of bits to clear out */
3821e = NBITS - e;
3822emov( f, y );
3823if( e <= 0 )
3824 return;
3825
3826p = &y[0];
3827while( e >= 16 )
3828 {
3829 *p++ = 0;
3830 e -= 16;
3831 }
3832/* clear the remaining bits */
3833*p &= bmask[e];
3834/* truncate negatives toward minus infinity */
3835isitneg:
3836
3837if( (unsigned short )expon & (unsigned short )0x8000 )
3838 {
3839 for( i=0; i<NE-1; i++ )
3840 {
3841 if( f[i] != y[i] )
3842 {
3843 esub( eone, y, y );
3844 break;
3845 }
3846 }
3847 }
3848}
3849
3850
3851/* unsigned short x[], s[];
3852 * long *exp;
3853 *
3854 * efrexp( x, exp, s );
3855 *
3856 * Returns s and exp such that s * 2**exp = x and .5 <= s < 1.
3857 * For example, 1.1 = 0.55 * 2**1
3858 * Handles denormalized numbers properly using long integer exp.
3859 */
3860void efrexp( x, exp, s )
3861unsigned short x[];
3862long *exp;
3863unsigned short s[];
3864{
3865unsigned short xi[NI];
3866long li;
3867
3868emovi( x, xi );
3869li = (long )((short )xi[1]);
3870
3871if( li == 0 )
3872 {
3873 li -= enormlz( xi );
3874 }
3875xi[1] = 0x3ffe;
3876emovo( xi, s );
3877*exp = li - 0x3ffe;
3878}
3879
3880
3881
3882/* unsigned short x[], y[];
3883 * long pwr2;
3884 *
3885 * eldexp( x, pwr2, y );
3886 *
3887 * Returns y = x * 2**pwr2.
3888 */
3889void eldexp( x, pwr2, y )
3890unsigned short x[];
3891long pwr2;
3892unsigned short y[];
3893{
3894unsigned short xi[NI];
3895long li;
3896int i;
3897
3898emovi( x, xi );
3899li = xi[1];
3900li += pwr2;
3901i = 0;
3902emdnorm( xi, i, i, li, 64 );
3903emovo( xi, y );
3904}
3905
3906
3907/* c = remainder after dividing b by a
3908 * Least significant integer quotient bits left in equot[].
3909 */
3910void eremain( a, b, c )
3911unsigned short a[], b[], c[];
3912{
3913unsigned short den[NI], num[NI];
3914
3915#ifdef NANS
3916if( eisinf(b) || (ecmp(a,ezero) == 0) || eisnan(a) || eisnan(b))
3917 {
3918 enan( c, NBITS );
3919 return;
3920 }
3921#endif
3922if( ecmp(a,ezero) == 0 )
3923 {
3924 mtherr( "eremain", SING );
3925 eclear( c );
3926 return;
3927 }
3928emovi( a, den );
3929emovi( b, num );
3930eiremain( den, num );
3931/* Sign of remainder = sign of quotient */
3932if( a[0] == b[0] )
3933 num[0] = 0;
3934else
3935 num[0] = 0xffff;
3936emovo( num, c );
3937}
3938
3939
3940void eiremain( den, num )
3941unsigned short den[], num[];
3942{
3943long ld, ln;
3944unsigned short j;
3945
3946ld = den[E];
3947ld -= enormlz( den );
3948ln = num[E];
3949ln -= enormlz( num );
3950ecleaz( equot );
3951while( ln >= ld )
3952 {
3953 if( ecmpm(den,num) <= 0 )
3954 {
3955 esubm(den, num);
3956 j = 1;
3957 }
3958 else
3959 {
3960 j = 0;
3961 }
3962 eshup1(equot);
3963 equot[NI-1] |= j;
3964 eshup1(num);
3965 ln -= 1;
3966 }
3967emdnorm( num, 0, 0, ln, 0 );
3968}
3969
3970/* NaN bit patterns
3971 */
3972#ifdef MIEEE
3973unsigned short nan113[8] = {
3974 0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
3975unsigned short nan64[6] = {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
3976unsigned short nan53[4] = {0x7fff, 0xffff, 0xffff, 0xffff};
3977unsigned short nan24[2] = {0x7fff, 0xffff};
3978#endif
3979
3980#ifdef IBMPC
3981unsigned short nan113[8] = {0, 0, 0, 0, 0, 0, 0xc000, 0xffff};
3982unsigned short nan64[6] = {0, 0, 0, 0xc000, 0xffff, 0};
3983unsigned short nan53[4] = {0, 0, 0, 0xfff8};
3984unsigned short nan24[2] = {0, 0xffc0};
3985#endif
3986
3987
3988void enan (nan, size)
3989unsigned short *nan;
3990int size;
3991{
3992int i, n;
3993unsigned short *p;
3994
3995switch( size )
3996 {
3997#ifndef DEC
3998 case 113:
3999 n = 8;
4000 p = nan113;
4001 break;
4002
4003 case 64:
4004 n = 6;
4005 p = nan64;
4006 break;
4007
4008 case 53:
4009 n = 4;
4010 p = nan53;
4011 break;
4012
4013 case 24:
4014 n = 2;
4015 p = nan24;
4016 break;
4017
4018 case NBITS:
4019 for( i=0; i<NE-2; i++ )
4020 *nan++ = 0;
4021 *nan++ = 0xc000;
4022 *nan++ = 0x7fff;
4023 return;
4024
4025 case NI*16:
4026 *nan++ = 0;
4027 *nan++ = 0x7fff;
4028 *nan++ = 0;
4029 *nan++ = 0xc000;
4030 for( i=4; i<NI; i++ )
4031 *nan++ = 0;
4032 return;
4033#endif
4034 default:
4035 mtherr( "enan", DOMAIN );
4036 return;
4037 }
4038for (i=0; i < n; i++)
4039 *nan++ = *p++;
4040}
4041
4042
4043
4044/* Longhand square root. */
4045
4046static int esqinited = 0;
4047static unsigned short sqrndbit[NI];
4048
4049void esqrt( x, y )
4050short *x, *y;
4051{
4052unsigned short temp[NI], num[NI], sq[NI], xx[NI];
4053int i, j, k, n, nlups;
4054long m, exp;
4055
4056if( esqinited == 0 )
4057 {
4058 ecleaz( sqrndbit );
4059 sqrndbit[NI-2] = 1;
4060 esqinited = 1;
4061 }
4062/* Check for arg <= 0 */
4063i = ecmp( x, ezero );
4064if( i <= 0 )
4065 {
4066#ifdef NANS
4067 if (i == -2)
4068 {
4069 enan (y, NBITS);
4070 return;
4071 }
4072#endif
4073 eclear(y);
4074 if( i < 0 )
4075 mtherr( "esqrt", DOMAIN );
4076 return;
4077 }
4078
4079#ifdef INFINITY
4080if( eisinf(x) )
4081 {
4082 eclear(y);
4083 einfin(y);
4084 return;
4085 }
4086#endif
4087/* Bring in the arg and renormalize if it is denormal. */
4088emovi( x, xx );
4089m = (long )xx[1]; /* local long word exponent */
4090if( m == 0 )
4091 m -= enormlz( xx );
4092
4093/* Divide exponent by 2 */
4094m -= 0x3ffe;
4095exp = (unsigned short )( (m / 2) + 0x3ffe );
4096
4097/* Adjust if exponent odd */
4098if( (m & 1) != 0 )
4099 {
4100 if( m > 0 )
4101 exp += 1;
4102 eshdn1( xx );
4103 }
4104
4105ecleaz( sq );
4106ecleaz( num );
4107n = 8; /* get 8 bits of result per inner loop */
4108nlups = rndprc;
4109j = 0;
4110
4111while( nlups > 0 )
4112 {
4113/* bring in next word of arg */
4114 if( j < NE )
4115 num[NI-1] = xx[j+3];
4116/* Do additional bit on last outer loop, for roundoff. */
4117 if( nlups <= 8 )
4118 n = nlups + 1;
4119 for( i=0; i<n; i++ )
4120 {
4121/* Next 2 bits of arg */
4122 eshup1( num );
4123 eshup1( num );
4124/* Shift up answer */
4125 eshup1( sq );
4126/* Make trial divisor */
4127 for( k=0; k<NI; k++ )
4128 temp[k] = sq[k];
4129 eshup1( temp );
4130 eaddm( sqrndbit, temp );
4131/* Subtract and insert answer bit if it goes in */
4132 if( ecmpm( temp, num ) <= 0 )
4133 {
4134 esubm( temp, num );
4135 sq[NI-2] |= 1;
4136 }
4137 }
4138 nlups -= n;
4139 j += 1;
4140 }
4141
4142/* Adjust for extra, roundoff loop done. */
4143exp += (NBITS - 1) - rndprc;
4144
4145/* Sticky bit = 1 if the remainder is nonzero. */
4146k = 0;
4147for( i=3; i<NI; i++ )
4148 k |= (int )num[i];
4149
4150/* Renormalize and round off. */
4151emdnorm( sq, k, 0, exp, 64 );
4152emovo( sq, y );
4153}
diff --git a/src/regress/lib/libc/cephes/ieetst.c b/src/regress/lib/libc/cephes/ieetst.c
deleted file mode 100644
index 974fb65c13..0000000000
--- a/src/regress/lib/libc/cephes/ieetst.c
+++ /dev/null
@@ -1,881 +0,0 @@
1/* $OpenBSD: ieetst.c,v 1.3 2017/07/27 15:08:37 bluhm Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* Floating point to ASCII input and output string test program.
20 *
21 * Numbers in the native machine data structure are converted
22 * to e type, then to and from decimal ASCII strings. Native
23 * printf() and scanf() functions are also used to produce
24 * and read strings. The resulting e type binary values
25 * are compared, with diagnostic printouts of any discrepancies.
26 *
27 * Steve Moshier, 16 Dec 88
28 * last revision: 16 May 92
29 */
30
31#include <float.h>
32#include <stdio.h>
33
34#include "mconf.h"
35#include "ehead.h"
36
37/* Include tests of 80-bit long double precision: */
38#if LDBL_MANT_DIG == 64
39#define LDOUBLE 1
40#else /* LDBL_MANT_DIG == 64 */
41#define LDOUBLE 0
42#endif /* LDBL_MANT_DIG == 64 */
43/* Abort subtest after getting this many errors: */
44#define MAXERR 5
45/* Number of random arguments to try (set as large as you have
46 * patience for): */
47#define NRAND 100
48/* Perform internal consistency test: */
49#define CHKINTERNAL 0
50
51static unsigned short fullp[NE], rounded[NE];
52float prec24, sprec24, ssprec24;
53double prec53, sprec53, ssprec53;
54#if LDOUBLE
55long double prec64, sprec64, ssprec64;
56#endif
57
58static unsigned short rprint[NE], rscan[NE];
59static unsigned short q1[NE], q2[NE], q5[NE];
60static unsigned short e1[NE], e2[NE], e3[NE];
61static double d1, d2;
62static int errprint = 0;
63static int errscan = 0;
64static int identerr = 0;
65static int errtot = 0;
66static int count = 0;
67static char str0[80], str1[80], str2[80], str3[80];
68static unsigned short eten[NE], maxm[NE];
69
70int m, n, k2, mprec, SPREC;
71
72char *Ten = "10.0";
73char tformat[10];
74char *format24 = "%.8e";
75#ifdef DEC
76char *format53 = "%.17e";
77#else
78char *format53 = "%.16e";
79#endif
80char *fformat24 = "%e";
81char *fformat53 = "%le";
82char *pct = "%";
83char *quo = "\042";
84#if LDOUBLE
85char *format64 = "%.20Le";
86char *fformat64 = "%Le";
87#endif
88char *format;
89char *fformat;
90char *toomany = "Too many errors; aborting this test.\n";
91
92static int mnrflag;
93static int etrflag;
94void chkit(), printerr(), mnrand(), etrand(), shownoncrit();
95void chkid(), pvec();
96
97int
98main()
99{
100int i, iprec, retval = 0;
101
102printf( "Steve Moshier's printf/scanf tester, version 0.2.\n\n" );
103#ifdef DEC
104 /* DEC PDP-11/VAX single precision not yet implemented */
105for( iprec = 1; iprec<2; iprec++ )
106#else
107for( iprec = 0; iprec<3; iprec++ )
108/*for( iprec = 2; iprec<3; iprec++ )*/
109#endif
110 {
111 errscan = 0;
112 identerr = 0;
113 errprint = 0;
114 eclear( rprint );
115 eclear( rscan );
116
117switch( iprec )
118 {
119 case 0:
120 SPREC = 8; /* # digits after the decimal point */
121 mprec = 24; /* # bits in the significand */
122 m = 9; /* max # decimal digits for correct rounding */
123 n = 13; /* max power of ten for correct rounding */
124 k2 = -125; /* underflow beyond 2^-k2 */
125 format = format24; /* printf format string */
126 fformat = fformat24; /* scanf format string */
127 mnrflag = 1; /* sets interval for random numbers */
128 etrflag = 1;
129 printf( "Testing FLOAT precision.\n" );
130 break;
131
132 case 1:
133#ifdef DEC
134 SPREC = 17;
135 mprec = 56;
136 m = 17;
137 n = 27;
138 k2 = -125;
139 format = format53;
140 fformat = fformat53;
141 mnrflag = 2;
142 etrflag = 1;
143 printf( "Testing DEC DOUBLE precision.\n" );
144 break;
145#else
146 SPREC = 16;
147 mprec = 53;
148 m = 17;
149 n = 27;
150 k2 = -1021;
151 format = format53;
152 fformat = fformat53;
153 mnrflag = 2;
154 etrflag = 2;
155 printf( "Testing DOUBLE precision.\n" );
156 break;
157#endif
158 case 2:
159#if LDOUBLE
160 SPREC = 20;
161 mprec = 64;
162 m = 20;
163 n = 34;
164 k2 = -16382;
165 format = format64;
166 fformat = fformat64;
167 mnrflag = 3;
168 etrflag = 3;
169 printf( "Testing LONG DOUBLE precision.\n" );
170 break;
171#else
172 goto nodenorm;
173#endif
174 }
175
176 asctoe( Ten, eten );
177/* 10^m - 1 */
178 d2 = m;
179 e53toe( &d2, e1 );
180 epow( eten, e1, maxm );
181 esub( eone, maxm, maxm );
182
183/* test 1 */
184 printf( "1. Checking 10^n - 1 for n = %d to %d.\n", -m, m );
185 emov( eone, q5 );
186 for( count=0; count<=m; count++ )
187 {
188 esub( eone, q5, fullp );
189 chkit( 1 );
190 ediv( q5, eone, q2 );
191 esub( eone, q2, fullp );
192 chkit( 1 );
193 emul( eten, q5, q5 );
194 if( errtot >= MAXERR )
195 {
196 printf( "%s", toomany );
197 goto end1;
198 }
199 }
200end1:
201 printerr();
202
203
204/* test 2 */
205 printf( "2. Checking powers of 10 from 10^-%d to 10^%d.\n", n, n );
206 emov( eone, q5 );
207 for( count=0; count<=n; count++ )
208 {
209 emov( q5, fullp );
210 chkit( 2 );
211 ediv( q5, eone, fullp );
212 chkit( 2 );
213 emul( eten, q5, q5 );
214 if( errtot >= MAXERR )
215 {
216 printf( "%s", toomany );
217 goto end2;
218 }
219 }
220end2:
221 printerr();
222
223/* test 3 */
224 printf( "3. Checking (10^%d-1)*10^n from n = -%d to %d.\n", m, n, n );
225 emov( eone, q5 );
226 for( count= -n; count<=n; count++ )
227 {
228 emul( maxm, q5, fullp );
229 chkit( 3 );
230 emov( q5, fullp );
231 ediv( fullp, eone, fullp );
232 emul( maxm, fullp, fullp );
233 chkit( 3 );
234 emul( eten, q5, q5 );
235 if( errtot >= MAXERR )
236 {
237 printf( "%s", toomany );
238 goto end3;
239 }
240 }
241end3:
242 printerr();
243
244
245
246/* test 4 */
247 printf( "4. Checking powers of 2 from 2^-24 to 2^+56.\n" );
248 d1 = -24.0;
249 e53toe( &d1, q1 );
250 epow( etwo, q1, q5 );
251
252 for( count = -24; count <= 56; count++ )
253 {
254 emov( q5, fullp );
255 chkit( 4 );
256 emul( etwo, q5, q5 );
257 if( errtot >= MAXERR )
258 {
259 printf( "%s", toomany );
260 goto end4;
261 }
262 }
263end4:
264 printerr();
265
266
267/* test 5 */
268 printf( "5. Checking 2^n - 1 for n = 0 to %d.\n", mprec );
269 emov( eone, q5 );
270 for( count=0; count<=mprec; count++ )
271 {
272 esub( eone, q5, fullp );
273 chkit( 5 );
274 emul( etwo, q5, q5 );
275 if( errtot >= MAXERR )
276 {
277 printf( "%s", toomany );
278 goto end5;
279 }
280 }
281end5:
282 printerr();
283
284/* test 6 */
285 printf( "6. Checking 2^n + 1 for n = 0 to %d.\n", mprec );
286 emov( eone, q5 );
287 for( count=0; count<=mprec; count++ )
288 {
289 eadd( eone, q5, fullp );
290 chkit( 6 );
291 emul( etwo, q5, q5 );
292 if( errtot >= MAXERR )
293 {
294 printf( "%s", toomany );
295 goto end6;
296 }
297 }
298end6:
299 printerr();
300
301/* test 7 */
302 printf(
303 "7. Checking %d values M * 10^N with random integer M and N,\n",
304 NRAND );
305 printf(" 1 <= M <= 10^%d - 1 and -%d <= N <= +%d.\n", m, n, n );
306 for( i=0; i<NRAND; i++ )
307 {
308 mnrand( fullp );
309 chkit( 7 );
310 if( errtot >= MAXERR )
311 {
312 printf( "%s", toomany );
313 goto end7;
314 }
315 }
316end7:
317 printerr();
318
319/* test 8 */
320 printf("8. Checking critical rounding cases.\n" );
321 for( i=0; i<20; i++ )
322 {
323 mnrand( fullp );
324 eabs( fullp );
325 if( ecmp( fullp, eone ) < 0 )
326 ediv( fullp, eone, fullp );
327 efloor( fullp, fullp );
328 eadd( ehalf, fullp, fullp );
329 chkit( 8 );
330 if( errtot >= MAXERR )
331 {
332 printf( "%s", toomany );
333 goto end8;
334 }
335 }
336end8:
337 printerr();
338
339
340
341/* test 9 */
342 printf("9. Testing on %d random non-denormal values.\n", NRAND );
343 for( i=0; i<NRAND; i++ )
344 {
345 etrand( fullp );
346 chkit( 9 );
347 }
348 printerr();
349 shownoncrit();
350
351/* test 10 */
352#if 0
353 printf(
354 "Do you want to check denormal numbers in this precision ? (y/n) " );
355 gets( str0 );
356 if( str0[0] != 'y' )
357 goto nodenorm;
358#endif
359
360 printf( "10. Checking denormal numbers.\n" );
361
362/* Form 2^-starting power */
363 d1 = k2;
364 e53toe( &d1, q1 );
365 epow( etwo, q1, e1 );
366
367/* Find 2^-mprec less than starting power */
368 d1 = -mprec + 4;
369 e53toe( &d1, q1 );
370 epow( etwo, q1, e3 );
371 emul( e1, e3, e3 );
372 emov( e3, e2 );
373 ediv( etwo, e2, e2 );
374
375 while( ecmp(e1,e2) != 0 )
376 {
377 eadd( e1, e2, fullp );
378 switch( mprec )
379 {
380#if LDOUBLE
381 case 64:
382 etoe64( e1, &sprec64 );
383 e64toe( &sprec64, q1 );
384 etoe64( fullp, &prec64 );
385 e64toe( &prec64, q2 );
386 break;
387#endif
388#ifdef DEC
389 case 56:
390#endif
391 case 53:
392 etoe53( e1, &sprec53 );
393 e53toe( &sprec53, q1 );
394 etoe53( fullp, &prec53 );
395 e53toe( &prec53, q2 );
396 break;
397
398 case 24:
399 etoe24( e1, &sprec24 );
400 e24toe( &sprec24, q1 );
401 etoe24( fullp, &prec24 );
402 e24toe( &prec24, q2 );
403 break;
404 }
405 if( ecmp( q2, ezero ) == 0 )
406 goto maxden;
407 chkit(10);
408 if( ecmp(q1,q2) == 0 )
409 {
410 ediv( etwo, e1, e1 );
411 emov( e3, e2 );
412 }
413 if( errtot >= MAXERR )
414 {
415 printf( "%s", toomany );
416 goto maxden;
417 }
418 ediv( etwo, e2, e2 );
419 }
420maxden:
421 printerr();
422nodenorm:
423 printf( "\n" );
424 retval |= errscan | identerr | errprint;
425 } /* loop on precision */
426printf( "End of test.\n" );
427return (retval);
428}
429
430#if CHKINTERNAL
431long double xprec64;
432double xprec53;
433float xprec24;
434
435/* Check binary -> printf -> scanf -> binary identity
436 * of internal routines
437 */
438void chkinternal( ref, tst, string )
439unsigned short ref[], tst[];
440char *string;
441{
442
443if( ecmp(ref,tst) != 0 )
444 {
445 printf( "internal identity compare error!\n" );
446 chkid( ref, tst, string );
447 }
448}
449#endif
450
451
452/* Check binary -> printf -> scanf -> binary identity
453 */
454void chkid( print, scan, string )
455unsigned short print[], scan[];
456char *string;
457{
458/* Test printf-scanf identity */
459if( ecmp( print, scan ) != 0 )
460 {
461 pvec( print, NE );
462 printf( " ->printf-> %s ->scanf->\n", string );
463 pvec( scan, NE );
464 printf( " is not an identity.\n" );
465 ++identerr;
466 }
467}
468
469
470/* Check scanf result
471 */
472void chkscan( ref, tst, string )
473unsigned short ref[], tst[];
474char *string;
475{
476/* Test scanf() */
477if( ecmp( ref, tst ) != 0 )
478 {
479 printf( "scanf(%s) -> ", string );
480 pvec( tst, NE );
481 printf( "\n should be " );
482 pvec( ref, NE );
483 printf( ".\n" );
484 ++errscan;
485 ++errtot;
486 }
487}
488
489
490/* Test printf() result
491 */
492void chkprint( ref, tst, string )
493unsigned short ref[], tst[];
494char *string;
495{
496if( ecmp(ref, tst) != 0 )
497 {
498 printf( "printf( ");
499 pvec( ref, NE );
500 printf( ") -> %s\n", string );
501 printf( " = " );
502 pvec( tst, NE );
503 printf( ".\n" );
504 ++errprint;
505 ++errtot;
506 }
507}
508
509
510/* Print array of n 16-bit shorts
511 */
512void pvec( x, n )
513unsigned short x[];
514int n;
515{
516int i;
517
518for( i=0; i<n; i++ )
519 {
520 printf( "%04x ", x[i] );
521 }
522}
523
524/* Measure worst case printf rounding error
525 */
526void cmpprint( ref, tst )
527unsigned short ref[], tst[];
528{
529unsigned short e[NE];
530
531if( ecmp( ref, ezero ) != 0 )
532 {
533 esub( ref, tst, e );
534 ediv( ref, e, e );
535 eabs( e );
536 if( ecmp( e, rprint ) > 0 )
537 emov( e, rprint );
538 }
539}
540
541/* Measure worst case scanf rounding error
542 */
543void cmpscan( ref, tst )
544unsigned short ref[], tst[];
545{
546unsigned short er[NE];
547
548if( ecmp( ref, ezero ) != 0 )
549 {
550 esub( ref, tst, er );
551 ediv( ref, er, er );
552 eabs( er );
553 if( ecmp( er, rscan ) > 0 )
554 emov( er, rscan );
555 if( ecmp( er, ehalf ) > 0 )
556 {
557 etoasc( tst, str1, 21 );
558 printf( "Bad error: scanf(%s) = %s !\n", str0, str1 );
559 }
560 }
561}
562
563/* Check rounded-down decimal string output of printf
564 */
565void cmptrunc( ref, tst )
566unsigned short ref[], tst[];
567{
568if( ecmp( ref, tst ) != 0 )
569 {
570 printf( "printf(%s%s%s, %s) -> %s\n", quo, tformat, quo, str1, str2 );
571 printf( "should be %s .\n", str3 );
572 errprint += 1;
573 }
574}
575
576
577void shownoncrit()
578{
579
580etoasc( rprint, str0, 3 );
581printf( "Maximum relative printf error found = %s .\n", str0 );
582etoasc( rscan, str0, 3 );
583printf( "Maximum relative scanf error found = %s .\n", str0 );
584}
585
586
587
588/* Produce arguments and call comparison subroutines.
589 */
590void chkit( testno )
591int testno;
592{
593unsigned short t[NE], u[NE], v[NE];
594int j;
595
596switch( mprec )
597 {
598#if LDOUBLE
599 case 64:
600 etoe64( fullp, &prec64 );
601 e64toe( &prec64, rounded );
602#if CHKINTERNAL
603 e64toasc( &prec64, str1, SPREC );
604 asctoe64( str1, &xprec64 );
605 e64toe( &xprec64, t );
606 chkinternal( rounded, t, str1 );
607#endif
608/* check printf and scanf */
609 sprintf( str2, format, prec64 );
610 sscanf( str2, fformat, &sprec64 );
611 e64toe( &sprec64, u );
612 chkid( rounded, u, str2 );
613 asctoe64( str2, &ssprec64 );
614 e64toe( &ssprec64, v );
615 chkscan( v, u, str2 );
616 chkprint( rounded, v, str2 );
617 if( testno < 8 )
618 break;
619/* rounding error measurement */
620 etoasc( fullp, str0, 24 );
621 etoe64( fullp, &ssprec64 );
622 e64toe( &ssprec64, u );
623 sprintf( str2, format, ssprec64 );
624 asctoe( str2, t );
625 cmpprint( u, t );
626 sscanf( str0, fformat, &sprec64 );
627 e64toe( &sprec64, t );
628 cmpscan( fullp, t );
629 if( testno < 8 )
630 break;
631/* strings rounded to less than maximum precision */
632 e64toasc( &ssprec64, str1, 24 );
633 for( j=SPREC-1; j>0; j-- )
634 {
635 e64toasc( &ssprec64, str3, j );
636 asctoe( str3, v );
637 sprintf( tformat, "%s.%dLe", pct, j );
638 sprintf( str2, tformat, ssprec64 );
639 asctoe( str2, t );
640 cmptrunc( v, t );
641 }
642 break;
643#endif
644#ifdef DEC
645 case 56:
646#endif
647 case 53:
648 etoe53( fullp, &prec53 );
649 e53toe( &prec53, rounded );
650#if CHKINTERNAL
651 e53toasc( &prec53, str1, SPREC );
652 asctoe53( str1, &xprec53 );
653 e53toe( &xprec53, t );
654 chkinternal( rounded, t, str1 );
655#endif
656 sprintf( str2, format, prec53 );
657 sscanf( str2, fformat, &sprec53 );
658 e53toe( &sprec53, u );
659 chkid( rounded, u, str2 );
660 asctoe53( str2, &ssprec53 );
661 e53toe( &ssprec53, v );
662 chkscan( v, u, str2 );
663 chkprint( rounded, v, str2 );
664 if( testno < 8 )
665 break;
666/* rounding error measurement */
667 etoasc( fullp, str0, 24 );
668 etoe53( fullp, &ssprec53 );
669 e53toe( &ssprec53, u );
670 sprintf( str2, format, ssprec53 );
671 asctoe( str2, t );
672 cmpprint( u, t );
673 sscanf( str0, fformat, &sprec53 );
674 e53toe( &sprec53, t );
675 cmpscan( fullp, t );
676 if( testno < 8 )
677 break;
678 e53toasc( &ssprec53, str1, 24 );
679 for( j=SPREC-1; j>0; j-- )
680 {
681 e53toasc( &ssprec53, str3, j );
682 asctoe( str3, v );
683 sprintf( tformat, "%s.%de", pct, j );
684 sprintf( str2, tformat, ssprec53 );
685 asctoe( str2, t );
686 cmptrunc( v, t );
687 }
688 break;
689
690 case 24:
691 etoe24( fullp, &prec24 );
692 e24toe( &prec24, rounded );
693#if CHKINTERNAL
694 e24toasc( &prec24, str1, SPREC );
695 asctoe24( str1, &xprec24 );
696 e24toe( &xprec24, t );
697 chkinternal( rounded, t, str1 );
698#endif
699 sprintf( str2, format, prec24 );
700 sscanf( str2, fformat, &sprec24 );
701 e24toe( &sprec24, u );
702 chkid( rounded, u, str2 );
703 asctoe24( str2, &ssprec24 );
704 e24toe( &ssprec24, v );
705 chkscan( v, u, str2 );
706 chkprint( rounded, v, str2 );
707 if( testno < 8 )
708 break;
709/* rounding error measurement */
710 etoasc( fullp, str0, 24 );
711 etoe24( fullp, &ssprec24 );
712 e24toe( &ssprec24, u );
713 sprintf( str2, format, ssprec24 );
714 asctoe( str2, t );
715 cmpprint( u, t );
716 sscanf( str0, fformat, &sprec24 );
717 e24toe( &sprec24, t );
718 cmpscan( fullp, t );
719/*
720 if( testno < 8 )
721 break;
722*/
723 e24toasc( &ssprec24, str1, 24 );
724 for( j=SPREC-1; j>0; j-- )
725 {
726 e24toasc( &ssprec24, str3, j );
727 asctoe( str3, v );
728 sprintf( tformat, "%s.%de", pct, j );
729 sprintf( str2, tformat, ssprec24 );
730 asctoe( str2, t );
731 cmptrunc( v, t );
732 }
733 break;
734 }
735}
736
737
738void printerr()
739{
740if( (errscan == 0) && (identerr == 0) && (errprint == 0) )
741 printf( "No errors found.\n" );
742else
743 {
744 printf( "%d binary -> decimal errors found.\n", errprint );
745 printf( "%d decimal -> binary errors found.\n", errscan );
746 }
747errscan = 0; /* reset for next test */
748identerr = 0;
749errprint = 0;
750errtot = 0;
751}
752
753
754/* Random number generator
755 * in the range M * 10^N, where 1 <= M <= 10^17 - 1
756 * and -27 <= N <= +27. Test values of M are logarithmically distributed
757 * random integers; test values of N are uniformly distributed random integers.
758 */
759
760static char *fwidth = "1.036163291797320557783096e1"; /* log(sqrt(10^9-1)) */
761static char *dwidth = "1.957197329044938830915E1"; /* log(sqrt(10^17-1)) */
762static char *ldwidth = "2.302585092994045684017491e1"; /* log(sqrt(10^20-1)) */
763
764static char *a13 = "13.0";
765static char *a27 = "27.0";
766static char *a34 = "34.0";
767static char *a10m13 = "1.0e-13";
768static unsigned short LOW[ NE ], WIDTH[NE], e27[NE], e10m13[NE];
769
770
771void mnrand( erand )
772unsigned short erand[];
773{
774unsigned short ea[NE], em[NE], en[NE], ex[NE];
775double x, a;
776
777if( mnrflag )
778 {
779 if( mnrflag == 3 )
780 {
781 asctoe( ldwidth, WIDTH );
782 asctoe( a34, e27 );
783 }
784 if( mnrflag == 2 )
785 {
786 asctoe( dwidth, WIDTH );
787 asctoe( a27, e27 );
788 }
789 if( mnrflag == 1 )
790 {
791 asctoe( fwidth, WIDTH );
792 asctoe( a13, e27 );
793 }
794 asctoe( a10m13, e10m13 );
795 mnrflag = 0;
796 }
797drand( &x );
798e53toe( &x, ex ); /* x = WIDTH * ( x - 1.0 ) + LOW; */
799esub( eone, ex, ex );
800emul( WIDTH, ex, ex );
801eexp( ex, ex ); /* x = exp(x); */
802
803drand( &a );
804e53toe( &a, ea );
805emul( ea, ex, ea ); /* a = 1.0e-13 * x * a; */
806emul( e10m13, ea, ea );
807eabs( ea );
808eadd( ea, ex, ex ); /* add fuzz */
809emul( ex, ex, ex ); /* square it, to get range to 10^17 - 1 */
810efloor( ex, em ); /* this is M */
811
812/* Random power of 10 */
813drand( &a );
814e53toe( &a, ex );
815esub( eone, ex, ex ); /* y3 = 54.0 * ( y3 - 1.0 ) + 0.5; */
816emul( e27, ex, ex );
817eadd( ex, ex, ex );
818eadd( ehalf, ex, ex );
819efloor( ex, ex ); /* y3 = floor( y3 ) - 27.0; */
820esub( e27, ex, en ); /* this is N */
821epow( eten, en, ex );
822emul( ex, em, erand );
823}
824
825/* -ln 2^16382 */
826char *ldemin = "-1.1355137111933024058873097E4";
827char *ldewid = "2.2710274223866048117746193E4";
828/* -ln 2^1022 */
829char *demin = "-7.0839641853226410622441123E2";
830char *dewid = "1.4167928370645282124488225E3";
831/* -ln 2^125 */
832char *femin = "-8.6643397569993163677154015E1";
833char *fewid = "1.7328679513998632735430803E2";
834
835void etrand( erand )
836unsigned short erand[];
837{
838unsigned short ea[NE], ex[NE];
839double x, a;
840
841if( etrflag )
842 {
843 if( etrflag == 3 )
844 {
845 asctoe( ldemin, LOW );
846 asctoe( ldewid, WIDTH );
847 asctoe( a34, e27 );
848 }
849 if( etrflag == 2 )
850 {
851 asctoe( demin, LOW );
852 asctoe( dewid, WIDTH );
853 asctoe( a27, e27 );
854 }
855 if( etrflag == 1 )
856 {
857 asctoe( femin, LOW );
858 asctoe( fewid, WIDTH );
859 asctoe( a13, e27 );
860 }
861 asctoe( a10m13, e10m13 );
862 etrflag = 0;
863 }
864drand( &x );
865e53toe( &x, ex ); /* x = WIDTH * ( x - 1.0 ) + LOW; */
866esub( eone, ex, ex );
867emul( WIDTH, ex, ex );
868eadd( LOW, ex, ex );
869eexp( ex, ex ); /* x = exp(x); */
870
871/* add fuzz
872 */
873drand( &a );
874e53toe( &a, ea );
875emul( ea, ex, ea ); /* a = 1.0e-13 * x * a; */
876emul( e10m13, ea, ea );
877if( ecmp( ex, ezero ) > 0 )
878 eneg( ea );
879eadd( ea, ex, erand );
880}
881
diff --git a/src/regress/lib/libc/cephes/mconf.h b/src/regress/lib/libc/cephes/mconf.h
deleted file mode 100644
index 410849c355..0000000000
--- a/src/regress/lib/libc/cephes/mconf.h
+++ /dev/null
@@ -1,189 +0,0 @@
1/* $OpenBSD: mconf.h,v 1.3 2017/07/27 15:08:37 bluhm Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* mconf.h
20 *
21 * Common include file for math routines
22 *
23 *
24 *
25 * SYNOPSIS:
26 *
27 * #include "mconf.h"
28 *
29 *
30 *
31 * DESCRIPTION:
32 *
33 * This file contains definitions for error codes that are
34 * passed to the common error handling routine mtherr()
35 * (which see).
36 *
37 * The file also includes a conditional assembly definition
38 * for the type of computer arithmetic (IEEE, DEC, Motorola
39 * IEEE, or UNKnown).
40 *
41 * For Digital Equipment PDP-11 and VAX computers, certain
42 * IBM systems, and others that use numbers with a 56-bit
43 * significand, the symbol DEC should be defined. In this
44 * mode, most floating point constants are given as arrays
45 * of octal integers to eliminate decimal to binary conversion
46 * errors that might be introduced by the compiler.
47 *
48 * For little-endian computers, such as IBM PC, that follow the
49 * IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE
50 * Std 754-1985), the symbol IBMPC should be defined. These
51 * numbers have 53-bit significands. In this mode, constants
52 * are provided as arrays of hexadecimal 16 bit integers.
53 *
54 * Big-endian IEEE format is denoted MIEEE. On some RISC
55 * systems such as Sun SPARC, double precision constants
56 * must be stored on 8-byte address boundaries. Since integer
57 * arrays may be aligned differently, the MIEEE configuration
58 * may fail on such machines.
59 *
60 * To accommodate other types of computer arithmetic, all
61 * constants are also provided in a normal decimal radix
62 * which one can hope are correctly converted to a suitable
63 * format by the available C language compiler. To invoke
64 * this mode, define the symbol UNK.
65 *
66 * An important difference among these modes is a predefined
67 * set of machine arithmetic constants for each. The numbers
68 * MACHEP (the machine roundoff error), MAXNUM (largest number
69 * represented), and several other parameters are preset by
70 * the configuration symbol. Check the file const.c to
71 * ensure that these values are correct for your computer.
72 *
73 * Configurations NANS, INFINITIES, MINUSZERO, and DENORMAL
74 * may fail on many systems. Verify that they are supposed
75 * to work on your computer.
76 */
77
78#include <sys/types.h>
79#include <endian.h>
80
81/* Constant definitions for math error conditions
82 */
83
84#define DOMAIN 1 /* argument domain error */
85#define SING 2 /* argument singularity */
86#define OVERFLOW 3 /* overflow range error */
87#define UNDERFLOW 4 /* underflow range error */
88#define TLOSS 5 /* total loss of precision */
89#define PLOSS 6 /* partial loss of precision */
90
91#define EDOM 33
92#define ERANGE 34
93
94/* Complex numeral. */
95typedef struct
96 {
97 double r;
98 double i;
99 } cmplx;
100
101/* Long double complex numeral. */
102typedef struct
103 {
104 double r;
105 double i;
106 } cmplxl;
107
108/* Type of computer arithmetic */
109
110/* PDP-11, Pro350, VAX:
111 */
112#ifdef __vax__
113#define DEC 1
114#endif /* __vax__ */
115
116/* Intel IEEE, low order words come first:
117 */
118/* #define IBMPC 1 */
119
120/* Motorola IEEE, high order words come first
121 * (Sun 680x0 workstation):
122 */
123/* #define MIEEE 1 */
124
125/* UNKnown arithmetic, invokes coefficients given in
126 * normal decimal format. Beware of range boundary
127 * problems (MACHEP, MAXLOG, etc. in const.c) and
128 * roundoff problems in pow.c:
129 * (Sun SPARCstation)
130 */
131#ifndef __vax__
132#define UNK 1
133#endif /* !__vax__ */
134
135/* If you define UNK, then be sure to set BIGENDIAN properly. */
136#if BYTE_ORDER == BIG_ENDIAN
137#define BIGENDIAN 1
138#endif /* BYTE_ORDER == BIG_ENDIAN */
139
140/* Define this `volatile' if your compiler thinks
141 * that floating point arithmetic obeys the associative
142 * and distributive laws. It will defeat some optimizations
143 * (but probably not enough of them).
144 *
145 * #define VOLATILE volatile
146 */
147#define VOLATILE
148
149/* For 12-byte long doubles on an i386, pad a 16-bit short 0
150 * to the end of real constants initialized by integer arrays.
151 *
152 * #define XPD 0,
153 *
154 * Otherwise, the type is 10 bytes long and XPD should be
155 * defined blank (e.g., Microsoft C).
156 *
157 * #define XPD
158 */
159#define XPD 0,
160
161/* Define to support tiny denormal numbers, else undefine. */
162#ifndef __vax__
163#define DENORMAL 1
164#endif /* !__vax__ */
165
166/* Define to ask for infinity support, else undefine. */
167#ifndef __vax__
168#define INFINITIES 1
169#endif /* !__vax__ */
170
171/* Define to ask for support of numbers that are Not-a-Number,
172 else undefine. This may automatically define INFINITIES in some files. */
173#ifndef __vax__
174#define NANS 1
175#endif /* !__vax__ */
176
177/* Define to distinguish between -0.0 and +0.0. */
178#define MINUSZERO 1
179
180/* Define 1 for ANSI C atan2() function
181 See atan.c and clog.c. */
182#define ANSIC 1
183
184int mtherr();
185
186/* Variable for error reporting. See mtherr.c. */
187extern int merror;
188
189int drand(double *);
diff --git a/src/regress/lib/libc/cephes/mtherr.c b/src/regress/lib/libc/cephes/mtherr.c
deleted file mode 100644
index 9a47a198bd..0000000000
--- a/src/regress/lib/libc/cephes/mtherr.c
+++ /dev/null
@@ -1,114 +0,0 @@
1/* $OpenBSD: mtherr.c,v 1.1 2011/07/02 18:11:01 martynas Exp $ */
2
3/*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* mtherr.c
20 *
21 * Library common error handling routine
22 *
23 *
24 *
25 * SYNOPSIS:
26 *
27 * char *fctnam;
28 * int code;
29 * int mtherr();
30 *
31 * mtherr( fctnam, code );
32 *
33 *
34 *
35 * DESCRIPTION:
36 *
37 * This routine may be called to report one of the following
38 * error conditions (in the include file mconf.h).
39 *
40 * Mnemonic Value Significance
41 *
42 * DOMAIN 1 argument domain error
43 * SING 2 function singularity
44 * OVERFLOW 3 overflow range error
45 * UNDERFLOW 4 underflow range error
46 * TLOSS 5 total loss of precision
47 * PLOSS 6 partial loss of precision
48 * EDOM 33 Unix domain error code
49 * ERANGE 34 Unix range error code
50 *
51 * The default version of the file prints the function name,
52 * passed to it by the pointer fctnam, followed by the
53 * error condition. The display is directed to the standard
54 * output device. The routine then returns to the calling
55 * program. Users may wish to modify the program to abort by
56 * calling exit() under severe error conditions such as domain
57 * errors.
58 *
59 * Since all error conditions pass control to this function,
60 * the display may be easily changed, eliminated, or directed
61 * to an error logging device.
62 *
63 * SEE ALSO:
64 *
65 * mconf.h
66 *
67 */
68
69#include <stdio.h>
70#include "mconf.h"
71
72int merror = 0;
73
74/* Notice: the order of appearance of the following
75 * messages is bound to the error codes defined
76 * in mconf.h.
77 */
78static char *ermsg[7] = {
79"unknown", /* error code 0 */
80"domain", /* error code 1 */
81"singularity", /* et seq. */
82"overflow",
83"underflow",
84"total loss of precision",
85"partial loss of precision"
86};
87
88
89int mtherr( name, code )
90char *name;
91int code;
92{
93
94/* Display string passed by calling program,
95 * which is supposed to be the name of the
96 * function in which the error occurred:
97 */
98printf( "\n%s ", name );
99
100/* Set global error message word */
101merror = code;
102
103/* Display error message defined
104 * by the code argument.
105 */
106if( (code <= 0) || (code >= 7) )
107 code = 0;
108printf( "%s error\n", ermsg[code] );
109
110/* Return to calling
111 * program
112 */
113return( 0 );
114}
diff --git a/src/regress/lib/libc/cxa-atexit/Makefile b/src/regress/lib/libc/cxa-atexit/Makefile
deleted file mode 100644
index a2821e01d3..0000000000
--- a/src/regress/lib/libc/cxa-atexit/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
1# $OpenBSD: Makefile,v 1.3 2013/08/06 19:11:53 miod Exp $
2
3SUBDIR+= libgd1 libgd2 test1
4
5install:
6
7.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/cxa-atexit/libgd1/Makefile b/src/regress/lib/libc/cxa-atexit/libgd1/Makefile
deleted file mode 100644
index 958b726d28..0000000000
--- a/src/regress/lib/libc/cxa-atexit/libgd1/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2007/09/03 14:42:44 millert Exp $
2
3LIB=gd1
4SRCS= gd1.C
5NOPROFILE=yes
6
7regress: all
8
9.include <bsd.lib.mk>
diff --git a/src/regress/lib/libc/cxa-atexit/libgd1/gd1.C b/src/regress/lib/libc/cxa-atexit/libgd1/gd1.C
deleted file mode 100644
index b3ecd56d91..0000000000
--- a/src/regress/lib/libc/cxa-atexit/libgd1/gd1.C
+++ /dev/null
@@ -1,32 +0,0 @@
1/* $OpenBSD: gd1.C,v 1.1 2007/09/03 14:42:44 millert Exp $ */
2
3/*
4 * Copyright (c) 2007 Kurt Miller <kurt@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <stdio.h>
20
21extern int check1;
22
23struct global_destructor_test_obj1 {
24 inline ~global_destructor_test_obj1() {
25 check1 = 0;
26 }
27};
28
29extern "C" void gd_test1()
30{
31 static global_destructor_test_obj1 gdt;
32}
diff --git a/src/regress/lib/libc/cxa-atexit/libgd1/shlib_version b/src/regress/lib/libc/cxa-atexit/libgd1/shlib_version
deleted file mode 100644
index 97c9f92d6b..0000000000
--- a/src/regress/lib/libc/cxa-atexit/libgd1/shlib_version
+++ /dev/null
@@ -1,2 +0,0 @@
1major=0
2minor=0
diff --git a/src/regress/lib/libc/cxa-atexit/libgd2/Makefile b/src/regress/lib/libc/cxa-atexit/libgd2/Makefile
deleted file mode 100644
index 7ca21d8bd2..0000000000
--- a/src/regress/lib/libc/cxa-atexit/libgd2/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2007/09/03 14:42:44 millert Exp $
2
3LIB=gd2
4SRCS= gd2.C
5NOPROFILE=yes
6
7regress: all
8
9.include <bsd.lib.mk>
diff --git a/src/regress/lib/libc/cxa-atexit/libgd2/gd2.C b/src/regress/lib/libc/cxa-atexit/libgd2/gd2.C
deleted file mode 100644
index 69e7ffb220..0000000000
--- a/src/regress/lib/libc/cxa-atexit/libgd2/gd2.C
+++ /dev/null
@@ -1,32 +0,0 @@
1/* $OpenBSD: gd2.C,v 1.1 2007/09/03 14:42:44 millert Exp $ */
2
3/*
4 * Copyright (c) 2007 Kurt Miller <kurt@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <stdio.h>
20
21extern int check2;
22
23struct global_destructor_test_obj2 {
24 inline ~global_destructor_test_obj2() {
25 check2 = 0;
26 }
27};
28
29extern "C" void gd_test2()
30{
31 static global_destructor_test_obj2 gdt;
32}
diff --git a/src/regress/lib/libc/cxa-atexit/libgd2/shlib_version b/src/regress/lib/libc/cxa-atexit/libgd2/shlib_version
deleted file mode 100644
index 97c9f92d6b..0000000000
--- a/src/regress/lib/libc/cxa-atexit/libgd2/shlib_version
+++ /dev/null
@@ -1,2 +0,0 @@
1major=0
2minor=0
diff --git a/src/regress/lib/libc/cxa-atexit/test1/Makefile b/src/regress/lib/libc/cxa-atexit/test1/Makefile
deleted file mode 100644
index 162922b35a..0000000000
--- a/src/regress/lib/libc/cxa-atexit/test1/Makefile
+++ /dev/null
@@ -1,29 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2015/05/29 04:17:11 miod Exp $
2
3.include <bsd.obj.mk>
4
5GD1_DIR=${.CURDIR}/../libgd1
6GD1_OBJDIR!= if [ -d $(GD1_DIR)/${__objdir} ]; then \
7 echo "$(GD1_DIR)/${__objdir}"; \
8 else \
9 echo "$(GD1_DIR)"; \
10 fi
11
12GD2_DIR=${.CURDIR}/../libgd2
13GD2_OBJDIR!= if [ -d $(GD2_DIR)/${__objdir} ]; then \
14 echo "$(GD2_DIR)/${__objdir}"; \
15 else \
16 echo "$(GD2_DIR)"; \
17 fi
18
19PROG= test1
20
21SRCS= test1.C
22
23CXXFLAGS+= -DLIBGD1="\"$(GD1_OBJDIR)/libgd1.so\""
24CXXFLAGS+= -DLIBGD2="\"$(GD2_OBJDIR)/libgd2.so\""
25LDFLAGS+= -Wl,-E
26
27NOMAN=
28
29.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/cxa-atexit/test1/test1.C b/src/regress/lib/libc/cxa-atexit/test1/test1.C
deleted file mode 100644
index 75fb967a90..0000000000
--- a/src/regress/lib/libc/cxa-atexit/test1/test1.C
+++ /dev/null
@@ -1,63 +0,0 @@
1/* $OpenBSD: test1.C,v 1.1 2007/09/03 14:42:44 millert Exp $ */
2
3/*
4 * Copyright (c) 2007 Kurt Miller <kurt@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <dlfcn.h>
20#include <err.h>
21#include <stdio.h>
22
23int check1, check2;
24
25int
26main()
27{
28 void *libgd1, *libgd2;
29 void (*gd_test)();
30 int i;
31
32 for (i=0; i < 50; i++) {
33 check1 = check2 = 1;
34
35 libgd1 = dlopen(LIBGD1, RTLD_LAZY);
36 if (libgd1 == NULL)
37 errx(1, "dlopen(%s, RTLD_LAZY) FAILED\n", LIBGD1);
38
39 gd_test = (void (*)())dlsym(libgd1, "gd_test1");
40 if (gd_test == NULL)
41 errx(1, "dlsym(libgd1, \"gd_test1\") FAILED\n");
42
43 (*gd_test)();
44
45 libgd2 = dlopen(LIBGD2, RTLD_LAZY);
46 if (libgd2 == NULL)
47 errx(1, "dlopen(%s, RTLD_LAZY) FAILED\n", LIBGD2);
48
49 gd_test = (void (*)())dlsym(libgd2, "gd_test2");
50 if (gd_test == NULL)
51 errx(1, "dlsym(libgd2, \"gd_test2\") FAILED\n");
52
53 (*gd_test)();
54
55 dlclose(libgd1);
56 dlclose(libgd2);
57
58 if (check1 || check2)
59 errx(1, "global destructors not called\n");
60 }
61
62 return (0);
63}
diff --git a/src/regress/lib/libc/db/Makefile b/src/regress/lib/libc/db/Makefile
deleted file mode 100644
index 7d2882594d..0000000000
--- a/src/regress/lib/libc/db/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
1# $OpenBSD: Makefile,v 1.10 2002/09/02 20:01:43 avsm Exp $
2# $NetBSD: Makefile,v 1.11 1995/12/12 01:54:15 cgd Exp $
3
4PROG= dbtest
5
6# add -DSTATISTICS to CFLAGS to get usage statistics. Note that
7# for this to work, libc must be compiled with -DSTATISTICS as well
8CFLAGS+= -g -D__DBINTERFACE_PRIVATE -DDEBUG
9CLEANFILES+= t1 t2 t3 log
10
11DBTARGETS=1 2 3 4 5 6 7 8 9 10 11 12 13 20
12
13.for DT in ${DBTARGETS}
14db-${DT}: ${PROG}
15 sh ${.CURDIR}/run.test ${DT}
16REGRESS_TARGETS+=db-${DT}
17.PHONY: db-${DT}
18.endfor
19
20REGRESS_SLOW_TARGETS+=db-3 db-12 db-20
21
22.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/db/README b/src/regress/lib/libc/db/README
deleted file mode 100644
index 23a1b77221..0000000000
--- a/src/regress/lib/libc/db/README
+++ /dev/null
@@ -1,69 +0,0 @@
1# $OpenBSD: README,v 1.3 2001/01/29 02:05:40 niklas Exp $
2# $NetBSD: README,v 1.5 1996/05/03 21:54:19 cgd Exp $
3# @(#)README 8.8 (Berkeley) 7/31/94
4
5To run the tests, enter "make regress".
6
7Fairly large files (the command files) are built in this directory during
8the test runs, and even larger files (the database files) are created in
9"/var/tmp". If the latter directory doesn't exist, set the environmental
10variable TMPDIR to a directory where the files can be built.
11
12=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
13The script file consists of lines with an initial character which is
14the command for that line, or an initial character indicating a key
15or data entry for a previous command.
16
17Legal command characters are as follows:
18
19c: compare a record
20 + must be followed by [kK][dD]; the data value in the database
21 associated with the specified key is compared to the specified
22 data value.
23e: echo a string
24 + writes out the rest of the line into the output file; if the
25 last character is not a carriage-return, a newline is appended.
26f: set the flags for the next command
27 + no value zero's the flags
28g: do a get command
29 + must be followed by [kK]
30 + writes out the retrieved data DBT.
31o [r]: dump [reverse]
32 + dump the database out, if 'r' is set, in reverse order.
33p: do a put command
34 + must be followed by [kK][dD]
35r: do a del command
36 + must be followed by [kK] unless R_CURSOR flag set.
37S: sync the database
38s: do a seq command
39 + must be followed by [kK] if R_CURSOR flag set.
40 + writes out the retrieved data DBT.
41
42Legal key/data characters are as follows:
43
44D [file]: data file
45 + set the current data value to the contents of the file
46d [data]:
47 + set the current key value to the contents of the line.
48K [file]: key file
49 + set the current key value to the contents of the file
50k [data]:
51 + set the current key value to the contents of the line.
52
53Blank lines, lines with leading white space, and lines with leading
54hash marks (#) are ignored.
55
56Options to dbtest are as follows:
57
58 -d: Set the DB_LOCK flag.
59 -f: Use the file argument as the database file.
60 -i: Use the rest of the argument to set elements in the info
61 structure. If the type is btree, then "-i cachesize=10240"
62 will set BTREEINFO.cachesize to 10240.
63 -o: The rest of the argument is the output file instead of
64 using stdout.
65 -s: Don't delete the database file before opening it, i.e.
66 use the database file from a previous run.
67
68Dbtest requires two arguments, the type of access "hash", "recno"
69or "btree", and the script name or "-" to indicate stdin.
diff --git a/src/regress/lib/libc/db/dbtest.c b/src/regress/lib/libc/db/dbtest.c
deleted file mode 100644
index 6a79e4c187..0000000000
--- a/src/regress/lib/libc/db/dbtest.c
+++ /dev/null
@@ -1,731 +0,0 @@
1/* $OpenBSD: dbtest.c,v 1.16 2017/07/27 15:08:37 bluhm Exp $ */
2/* $NetBSD: dbtest.c,v 1.8 1996/05/03 21:57:48 cgd Exp $ */
3
4/*-
5 * Copyright (c) 1992, 1993, 1994
6 * The Regents of the University of California. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <sys/param.h>
34#include <sys/stat.h>
35
36#include <ctype.h>
37#include <errno.h>
38#include <fcntl.h>
39#include <stdint.h>
40#include <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43#include <stdarg.h>
44#include <unistd.h>
45
46#include <db.h>
47
48enum S { COMMAND, COMPARE, GET, PUT, REMOVE, SEQ, SEQFLAG, KEY, DATA };
49
50void compare(DBT *, DBT *);
51DBTYPE dbtype(char *);
52void dump(DB *, int);
53void __dead dberr(const char *, ...);
54void get(DB *, DBT *);
55void getdata(DB *, DBT *, DBT *);
56void put(DB *, DBT *, DBT *);
57void rem(DB *, DBT *);
58char *sflags(int);
59void synk(DB *);
60void *rfile(char *, size_t *);
61void seq(DB *, DBT *);
62u_int setflags(char *);
63void *setinfo(DBTYPE, char *);
64void __dead usage(void);
65void *xmalloc(char *, size_t);
66
67DBTYPE type; /* Database type. */
68void *infop; /* Iflags. */
69u_long lineno; /* Current line in test script. */
70u_int flags; /* Current DB flags. */
71int ofd = STDOUT_FILENO; /* Standard output fd. */
72
73DB *XXdbp; /* Global for gdb. */
74int XXlineno; /* Fast breakpoint for gdb. */
75
76int
77main(int argc, char *argv[])
78{
79 extern int optind;
80 extern char *optarg;
81 enum S command, state;
82 DB *dbp;
83 DBT data, key, keydata;
84 size_t len;
85 int ch, oflags, sflag;
86 char *fname, *infoarg, *p, *t, buf[8 * 1024];
87
88 infoarg = NULL;
89 fname = NULL;
90 oflags = O_CREAT | O_RDWR;
91 sflag = 0;
92 while ((ch = getopt(argc, argv, "f:i:lo:s")) != -1)
93 switch (ch) {
94 case 'f':
95 fname = optarg;
96 break;
97 case 'i':
98 infoarg = optarg;
99 break;
100 case 'l':
101 oflags |= DB_LOCK;
102 break;
103 case 'o':
104 if ((ofd = open(optarg,
105 O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
106 dberr("%s: %s", optarg, strerror(errno));
107 break;
108 case 's':
109 sflag = 1;
110 break;
111 case '?':
112 default:
113 usage();
114 }
115 argc -= optind;
116 argv += optind;
117
118 if (argc != 2)
119 usage();
120
121 /* Set the type. */
122 type = dbtype(*argv++);
123
124 /* Open the descriptor file. */
125 if (strcmp(*argv, "-") && freopen(*argv, "r", stdin) == NULL)
126 dberr("%s: %s", *argv, strerror(errno));
127
128 /* Set up the db structure as necessary. */
129 if (infoarg == NULL)
130 infop = NULL;
131 else
132 for (p = strtok(infoarg, ",\t "); p != NULL;
133 p = strtok(0, ",\t "))
134 if (*p != '\0')
135 infop = setinfo(type, p);
136
137 /*
138 * Open the DB. Delete any preexisting copy, you almost never
139 * want it around, and it often screws up tests.
140 */
141 if (fname == NULL) {
142 p = getenv("TMPDIR");
143 if (p == NULL)
144 p = "/var/tmp";
145 (void)snprintf(buf, sizeof buf, "%s/__dbtest", p);
146 fname = buf;
147 (void)unlink(buf);
148 } else if (!sflag)
149 (void)unlink(fname);
150
151 if ((dbp = dbopen(fname,
152 oflags, S_IRUSR | S_IWUSR, type, infop)) == NULL)
153 dberr("dbopen: %s", strerror(errno));
154 XXdbp = dbp;
155
156 state = COMMAND;
157 for (lineno = 1;
158 (p = fgets(buf, sizeof(buf), stdin)) != NULL; ++lineno) {
159 /* Delete the newline, displaying the key/data is easier. */
160 if (ofd == STDOUT_FILENO && (t = strchr(p, '\n')) != NULL)
161 *t = '\0';
162 if ((len = strlen(buf)) == 0 || isspace((unsigned char)*p) || *p == '#')
163 continue;
164
165 /* Convenient gdb break point. */
166 if (XXlineno == lineno)
167 XXlineno = 1;
168 switch (*p) {
169 case 'c': /* compare */
170 if (state != COMMAND)
171 dberr("line %lu: not expecting command",
172 lineno);
173 state = KEY;
174 command = COMPARE;
175 break;
176 case 'e': /* echo */
177 if (state != COMMAND)
178 dberr("line %lu: not expecting command",
179 lineno);
180 /* Don't display the newline, if CR at EOL. */
181 if (p[len - 2] == '\r')
182 --len;
183 if (write(ofd, p + 1, len - 1) != len - 1 ||
184 write(ofd, "\n", 1) != 1)
185 dberr("write: %s", strerror(errno));
186 break;
187 case 'g': /* get */
188 if (state != COMMAND)
189 dberr("line %lu: not expecting command",
190 lineno);
191 state = KEY;
192 command = GET;
193 break;
194 case 'p': /* put */
195 if (state != COMMAND)
196 dberr("line %lu: not expecting command",
197 lineno);
198 state = KEY;
199 command = PUT;
200 break;
201 case 'r': /* remove */
202 if (state != COMMAND)
203 dberr("line %lu: not expecting command",
204 lineno);
205 if (flags == R_CURSOR) {
206 rem(dbp, &key);
207 state = COMMAND;
208 } else {
209 state = KEY;
210 command = REMOVE;
211 }
212 break;
213 case 'S': /* sync */
214 if (state != COMMAND)
215 dberr("line %lu: not expecting command",
216 lineno);
217 synk(dbp);
218 state = COMMAND;
219 break;
220 case 's': /* seq */
221 if (state != COMMAND)
222 dberr("line %lu: not expecting command",
223 lineno);
224 if (flags == R_CURSOR) {
225 state = KEY;
226 command = SEQ;
227 } else
228 seq(dbp, &key);
229 break;
230 case 'f':
231 flags = setflags(p + 1);
232 break;
233 case 'D': /* data file */
234 if (state != DATA)
235 dberr("line %lu: not expecting data", lineno);
236 data.data = rfile(p + 1, &data.size);
237 goto ldata;
238 case 'd': /* data */
239 if (state != DATA)
240 dberr("line %lu: not expecting data", lineno);
241 data.data = xmalloc(p + 1, len - 1);
242 data.size = len - 1;
243ldata: switch (command) {
244 case COMPARE:
245 compare(&keydata, &data);
246 break;
247 case PUT:
248 put(dbp, &key, &data);
249 break;
250 default:
251 dberr("line %lu: command doesn't take data",
252 lineno);
253 }
254 if (type != DB_RECNO)
255 free(key.data);
256 free(data.data);
257 state = COMMAND;
258 break;
259 case 'K': /* key file */
260 if (state != KEY)
261 dberr("line %lu: not expecting a key", lineno);
262 if (type == DB_RECNO)
263 dberr("line %lu: 'K' not available for recno",
264 lineno);
265 key.data = rfile(p + 1, &key.size);
266 goto lkey;
267 case 'k': /* key */
268 if (state != KEY)
269 dberr("line %lu: not expecting a key", lineno);
270 if (type == DB_RECNO) {
271 static recno_t recno;
272 recno = atoi(p + 1);
273 key.data = &recno;
274 key.size = sizeof(recno);
275 } else {
276 key.data = xmalloc(p + 1, len - 1);
277 key.size = len - 1;
278 }
279lkey: switch (command) {
280 case COMPARE:
281 getdata(dbp, &key, &keydata);
282 state = DATA;
283 break;
284 case GET:
285 get(dbp, &key);
286 if (type != DB_RECNO)
287 free(key.data);
288 state = COMMAND;
289 break;
290 case PUT:
291 state = DATA;
292 break;
293 case REMOVE:
294 rem(dbp, &key);
295 if ((type != DB_RECNO) && (flags != R_CURSOR))
296 free(key.data);
297 state = COMMAND;
298 break;
299 case SEQ:
300 seq(dbp, &key);
301 if ((type != DB_RECNO) && (flags != R_CURSOR))
302 free(key.data);
303 state = COMMAND;
304 break;
305 default:
306 dberr("line %lu: command doesn't take a key",
307 lineno);
308 }
309 break;
310 case 'o':
311 dump(dbp, p[1] == 'r');
312 break;
313 default:
314 dberr("line %lu: %s: unknown command character",
315 lineno, p);
316 }
317 }
318#ifdef STATISTICS
319 /*
320 * -l must be used (DB_LOCK must be set) for this to be
321 * used, otherwise a page will be locked and it will fail.
322 */
323 if (type == DB_BTREE && oflags & DB_LOCK)
324 __bt_stat(dbp);
325#endif
326 if (dbp->close(dbp))
327 dberr("db->close: %s", strerror(errno));
328 (void)close(ofd);
329 exit(0);
330}
331
332#define NOOVERWRITE "put failed, would overwrite key\n"
333
334void
335compare(db1, db2)
336 DBT *db1, *db2;
337{
338 register size_t len;
339 register u_char *p1, *p2;
340
341 if (db1->size != db2->size)
342 printf("compare failed: key->data len %lu != data len %lu\n",
343 db1->size, db2->size);
344
345 len = MIN(db1->size, db2->size);
346 for (p1 = db1->data, p2 = db2->data; len--;)
347 if (*p1++ != *p2++) {
348 printf("compare failed at offset %ld\n",
349 p1 - (u_char *)db1->data);
350 break;
351 }
352}
353
354void
355get(dbp, kp)
356 DB *dbp;
357 DBT *kp;
358{
359 DBT data;
360
361 switch (dbp->get(dbp, kp, &data, flags)) {
362 case 0:
363 (void)write(ofd, data.data, data.size);
364 if (ofd == STDOUT_FILENO)
365 (void)write(ofd, "\n", 1);
366 break;
367 case -1:
368 dberr("line %lu: get: %s", lineno, strerror(errno));
369 /* NOTREACHED */
370 case 1:
371#define NOSUCHKEY "get failed, no such key\n"
372 if (ofd != STDOUT_FILENO)
373 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
374 else
375 (void)fprintf(stderr, "%lu: %.*s: %s", lineno,
376 MIN((int)kp->size, 20), kp->data, NOSUCHKEY);
377#undef NOSUCHKEY
378 break;
379 }
380}
381
382void
383getdata(dbp, kp, dp)
384 DB *dbp;
385 DBT *kp, *dp;
386{
387 switch (dbp->get(dbp, kp, dp, flags)) {
388 case 0:
389 return;
390 case -1:
391 dberr("line %lu: getdata: %s", lineno, strerror(errno));
392 /* NOTREACHED */
393 case 1:
394 dberr("line %lu: getdata failed, no such key", lineno);
395 /* NOTREACHED */
396 }
397}
398
399void
400put(dbp, kp, dp)
401 DB *dbp;
402 DBT *kp, *dp;
403{
404 switch (dbp->put(dbp, kp, dp, flags)) {
405 case 0:
406 break;
407 case -1:
408 dberr("line %lu: put: %s", lineno, strerror(errno));
409 /* NOTREACHED */
410 case 1:
411 (void)write(ofd, NOOVERWRITE, sizeof(NOOVERWRITE) - 1);
412 break;
413 }
414}
415
416void
417rem(dbp, kp)
418 DB *dbp;
419 DBT *kp;
420{
421 switch (dbp->del(dbp, kp, flags)) {
422 case 0:
423 break;
424 case -1:
425 dberr("line %lu: rem: %s", lineno, strerror(errno));
426 /* NOTREACHED */
427 case 1:
428#define NOSUCHKEY "rem failed, no such key\n"
429 if (ofd != STDOUT_FILENO)
430 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
431 else if (flags != R_CURSOR)
432 (void)fprintf(stderr, "%lu: %.*s: %s", lineno,
433 MIN((int)kp->size, 20), kp->data, NOSUCHKEY);
434 else
435 (void)fprintf(stderr,
436 "%lu: rem of cursor failed\n", lineno);
437#undef NOSUCHKEY
438 break;
439 }
440}
441
442void
443synk(dbp)
444 DB *dbp;
445{
446 switch (dbp->sync(dbp, flags)) {
447 case 0:
448 break;
449 case -1:
450 dberr("line %lu: synk: %s", lineno, strerror(errno));
451 /* NOTREACHED */
452 }
453}
454
455void
456seq(dbp, kp)
457 DB *dbp;
458 DBT *kp;
459{
460 DBT data;
461
462 switch (dbp->seq(dbp, kp, &data, flags)) {
463 case 0:
464 (void)write(ofd, data.data, data.size);
465 if (ofd == STDOUT_FILENO)
466 (void)write(ofd, "\n", 1);
467 break;
468 case -1:
469 dberr("line %lu: seq: %s", lineno, strerror(errno));
470 /* NOTREACHED */
471 case 1:
472#define NOSUCHKEY "seq failed, no such key\n"
473 if (ofd != STDOUT_FILENO)
474 (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
475 else if (flags == R_CURSOR)
476 (void)fprintf(stderr, "%lu: %.*s: %s", lineno,
477 MIN((int)kp->size, 20), kp->data, NOSUCHKEY);
478 else
479 (void)fprintf(stderr,
480 "%lu: seq (%s) failed\n", lineno, sflags(flags));
481#undef NOSUCHKEY
482 break;
483 }
484}
485
486void
487dump(dbp, rev)
488 DB *dbp;
489 int rev;
490{
491 DBT key, data;
492 int flags, nflags;
493
494 if (rev) {
495 flags = R_LAST;
496 nflags = R_PREV;
497 } else {
498 flags = R_FIRST;
499 nflags = R_NEXT;
500 }
501 for (;; flags = nflags)
502 switch (dbp->seq(dbp, &key, &data, flags)) {
503 case 0:
504 (void)write(ofd, data.data, data.size);
505 if (ofd == STDOUT_FILENO)
506 (void)write(ofd, "\n", 1);
507 break;
508 case 1:
509 goto done;
510 case -1:
511 dberr("line %lu: (dump) seq: %s",
512 lineno, strerror(errno));
513 /* NOTREACHED */
514 }
515done: return;
516}
517
518u_int
519setflags(s)
520 char *s;
521{
522 char *p;
523
524 for (; isspace((unsigned char)*s); ++s);
525 if (*s == '\n' || *s == '\0')
526 return (0);
527 if ((p = strchr(s, '\n')) != NULL)
528 *p = '\0';
529 if (!strcmp(s, "R_CURSOR")) return (R_CURSOR);
530 if (!strcmp(s, "R_FIRST")) return (R_FIRST);
531 if (!strcmp(s, "R_IAFTER")) return (R_IAFTER);
532 if (!strcmp(s, "R_IBEFORE")) return (R_IBEFORE);
533 if (!strcmp(s, "R_LAST")) return (R_LAST);
534 if (!strcmp(s, "R_NEXT")) return (R_NEXT);
535 if (!strcmp(s, "R_NOOVERWRITE")) return (R_NOOVERWRITE);
536 if (!strcmp(s, "R_PREV")) return (R_PREV);
537 if (!strcmp(s, "R_SETCURSOR")) return (R_SETCURSOR);
538
539 dberr("line %lu: %s: unknown flag", lineno, s);
540 /* NOTREACHED */
541}
542
543char *
544sflags(flags)
545 int flags;
546{
547 switch (flags) {
548 case R_CURSOR: return ("R_CURSOR");
549 case R_FIRST: return ("R_FIRST");
550 case R_IAFTER: return ("R_IAFTER");
551 case R_IBEFORE: return ("R_IBEFORE");
552 case R_LAST: return ("R_LAST");
553 case R_NEXT: return ("R_NEXT");
554 case R_NOOVERWRITE: return ("R_NOOVERWRITE");
555 case R_PREV: return ("R_PREV");
556 case R_SETCURSOR: return ("R_SETCURSOR");
557 }
558
559 return ("UNKNOWN!");
560}
561
562DBTYPE
563dbtype(s)
564 char *s;
565{
566 if (!strcmp(s, "btree"))
567 return (DB_BTREE);
568 if (!strcmp(s, "hash"))
569 return (DB_HASH);
570 if (!strcmp(s, "recno"))
571 return (DB_RECNO);
572 dberr("%s: unknown type (use btree, hash or recno)", s);
573 /* NOTREACHED */
574}
575
576void *
577setinfo(type, s)
578 DBTYPE type;
579 char *s;
580{
581 static BTREEINFO ib;
582 static HASHINFO ih;
583 static RECNOINFO rh;
584 char *eq;
585
586 if ((eq = strchr(s, '=')) == NULL)
587 dberr("%s: illegal structure set statement", s);
588 *eq++ = '\0';
589 if (!isdigit((unsigned char)*eq))
590 dberr("%s: structure set statement must be a number", s);
591
592 switch (type) {
593 case DB_BTREE:
594 if (!strcmp("flags", s)) {
595 ib.flags = atoi(eq);
596 return (&ib);
597 }
598 if (!strcmp("cachesize", s)) {
599 ib.cachesize = atoi(eq);
600 return (&ib);
601 }
602 if (!strcmp("maxkeypage", s)) {
603 ib.maxkeypage = atoi(eq);
604 return (&ib);
605 }
606 if (!strcmp("minkeypage", s)) {
607 ib.minkeypage = atoi(eq);
608 return (&ib);
609 }
610 if (!strcmp("lorder", s)) {
611 ib.lorder = atoi(eq);
612 return (&ib);
613 }
614 if (!strcmp("psize", s)) {
615 ib.psize = atoi(eq);
616 return (&ib);
617 }
618 break;
619 case DB_HASH:
620 if (!strcmp("bsize", s)) {
621 ih.bsize = atoi(eq);
622 return (&ih);
623 }
624 if (!strcmp("ffactor", s)) {
625 ih.ffactor = atoi(eq);
626 return (&ih);
627 }
628 if (!strcmp("nelem", s)) {
629 ih.nelem = atoi(eq);
630 return (&ih);
631 }
632 if (!strcmp("cachesize", s)) {
633 ih.cachesize = atoi(eq);
634 return (&ih);
635 }
636 if (!strcmp("lorder", s)) {
637 ih.lorder = atoi(eq);
638 return (&ih);
639 }
640 break;
641 case DB_RECNO:
642 if (!strcmp("flags", s)) {
643 rh.flags = atoi(eq);
644 return (&rh);
645 }
646 if (!strcmp("cachesize", s)) {
647 rh.cachesize = atoi(eq);
648 return (&rh);
649 }
650 if (!strcmp("lorder", s)) {
651 rh.lorder = atoi(eq);
652 return (&rh);
653 }
654 if (!strcmp("reclen", s)) {
655 rh.reclen = atoi(eq);
656 return (&rh);
657 }
658 if (!strcmp("bval", s)) {
659 rh.bval = atoi(eq);
660 return (&rh);
661 }
662 if (!strcmp("psize", s)) {
663 rh.psize = atoi(eq);
664 return (&rh);
665 }
666 break;
667 }
668 dberr("%s: unknown structure value", s);
669 /* NOTREACHED */
670}
671
672void *
673rfile(name, lenp)
674 char *name;
675 size_t *lenp;
676{
677 struct stat sb;
678 void *p;
679 int fd;
680 char *np;
681
682 for (; isspace((unsigned char)*name); ++name);
683 if ((np = strchr(name, '\n')) != NULL)
684 *np = '\0';
685 if ((fd = open(name, O_RDONLY, 0)) < 0 ||
686 fstat(fd, &sb))
687 dberr("%s: %s\n", name, strerror(errno));
688 if (sb.st_size > (off_t)INT_MAX)
689 dberr("%s: %s\n", name, strerror(E2BIG));
690 if ((p = (void *)malloc((u_int)sb.st_size)) == NULL)
691 dberr("%s", strerror(errno));
692 (void)read(fd, p, (int)sb.st_size);
693 *lenp = sb.st_size;
694 (void)close(fd);
695 return (p);
696}
697
698void *
699xmalloc(text, len)
700 char *text;
701 size_t len;
702{
703 void *p;
704
705 if ((p = (void *)malloc(len)) == NULL)
706 dberr("%s", strerror(errno));
707 memmove(p, text, len);
708 return (p);
709}
710
711void __dead
712usage()
713{
714 (void)fprintf(stderr,
715 "usage: dbtest [-l] [-f file] [-i info] [-o file] type script\n");
716 exit(1);
717}
718
719void __dead
720dberr(const char *fmt, ...)
721{
722 va_list ap;
723
724 va_start(ap, fmt);
725 (void)fprintf(stderr, "dbtest: ");
726 (void)vfprintf(stderr, fmt, ap);
727 va_end(ap);
728 (void)fprintf(stderr, "\n");
729 exit(1);
730 /* NOTREACHED */
731}
diff --git a/src/regress/lib/libc/db/run.test b/src/regress/lib/libc/db/run.test
deleted file mode 100644
index 0d6837e360..0000000000
--- a/src/regress/lib/libc/db/run.test
+++ /dev/null
@@ -1,707 +0,0 @@
1#!/bin/sh -
2#
3# $OpenBSD: run.test,v 1.3 2001/01/29 02:05:41 niklas Exp $
4# $NetBSD: run.test,v 1.8 1996/05/03 21:57:51 cgd Exp $
5# @(#)run.test 8.10 (Berkeley) 7/26/94
6#
7
8# db regression tests
9main()
10{
11
12 PROG=./dbtest
13 TMP1=t1
14 TMP2=t2
15 TMP3=t3
16
17 if [ -f /usr/share/dict/words ]; then
18 DICT=/usr/share/dict/words
19 elif [ -f /usr/dict/words ]; then
20 DICT=/usr/dict/words
21 else
22 echo 'run.test: no dictionary'
23 exit 1
24 fi
25
26 if [ $# -eq 0 ]; then
27 for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do
28 test$t
29 done
30 else
31 while [ $# -gt 0 ]
32 do case "$1" in
33 test*)
34 $1;;
35 [0-9]*)
36 test$1;;
37 btree)
38 for t in 1 2 3 7 8 9 10 12 13; do
39 test$t
40 done;;
41 hash)
42 for t in 1 2 3 8 13 20; do
43 test$t
44 done;;
45 recno)
46 for t in 1 2 3 4 5 6 7 10 11; do
47 test$t
48 done;;
49 *)
50 echo "run.test: unknown test $1"
51 echo "usage: run.test test# | type"
52 exit 1
53 esac
54 shift
55 done
56 fi
57 rm -f $TMP1 $TMP2 $TMP3
58 exit 0
59}
60
61# Take the first hundred entries in the dictionary, and make them
62# be key/data pairs.
63test1()
64{
65 echo "Test 1: btree, hash: small key, small data pairs"
66 sed 200q $DICT > $TMP1
67 for type in btree hash; do
68 rm -f $TMP2 $TMP3
69 for i in `sed 200q $DICT`; do
70 echo p
71 echo k$i
72 echo d$i
73 echo g
74 echo k$i
75 done > $TMP2
76 $PROG -o $TMP3 $type $TMP2
77 if (cmp -s $TMP1 $TMP3) ; then :
78 else
79 echo "test1: type $type: failed"
80 exit 1
81 fi
82 done
83 echo "Test 1: recno: small key, small data pairs"
84 rm -f $TMP2 $TMP3
85 sed 200q $DICT |
86 awk '{
87 ++i;
88 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
89 }' > $TMP2
90 $PROG -o $TMP3 recno $TMP2
91 if (cmp -s $TMP1 $TMP3) ; then :
92 else
93 echo "test1: type recno: failed"
94 exit 1
95 fi
96}
97
98# Take the first 200 entries in the dictionary, and give them
99# each a medium size data entry.
100test2()
101{
102 echo "Test 2: btree, hash: small key, medium data pairs"
103 mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
104 echo $mdata |
105 awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
106 for type in hash btree; do
107 rm -f $TMP2 $TMP3
108 for i in `sed 200q $DICT`; do
109 echo p
110 echo k$i
111 echo d$mdata
112 echo g
113 echo k$i
114 done > $TMP2
115 $PROG -o $TMP3 $type $TMP2
116 if (cmp -s $TMP1 $TMP3) ; then :
117 else
118 echo "test2: type $type: failed"
119 exit 1
120 fi
121 done
122 echo "Test 2: recno: small key, medium data pairs"
123 rm -f $TMP2 $TMP3
124 echo $mdata |
125 awk '{ for (i = 1; i < 201; ++i)
126 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
127 }' > $TMP2
128 $PROG -o $TMP3 recno $TMP2
129 if (cmp -s $TMP1 $TMP3) ; then :
130 else
131 echo "test2: type recno: failed"
132 exit 1
133 fi
134}
135
136# Insert the programs in /bin with their paths as their keys.
137test3()
138{
139 echo "Test 3: hash: small key, big data pairs"
140 rm -f $TMP1
141 (find /bin -type f -print | xargs cat) > $TMP1
142 for type in hash; do
143 rm -f $TMP2 $TMP3
144 for i in `find /bin -type f -print`; do
145 echo p
146 echo k$i
147 echo D$i
148 echo g
149 echo k$i
150 done > $TMP2
151 $PROG -o $TMP3 $type $TMP2
152 if (cmp -s $TMP1 $TMP3) ; then :
153 else
154 echo "test3: $type: failed"
155 exit 1
156 fi
157 done
158 echo "Test 3: btree: small key, big data pairs"
159 for psize in 512 16384 65536; do
160 echo " page size $psize"
161 for type in btree; do
162 rm -f $TMP2 $TMP3
163 for i in `find /bin -type f -print`; do
164 echo p
165 echo k$i
166 echo D$i
167 echo g
168 echo k$i
169 done > $TMP2
170 $PROG -i psize=$psize -o $TMP3 $type $TMP2
171 if (cmp -s $TMP1 $TMP3) ; then :
172 else
173 echo "test3: $type: page size $psize: failed"
174 exit 1
175 fi
176 done
177 done
178 echo "Test 3: recno: big data pairs"
179 rm -f $TMP2 $TMP3
180 find /bin -type f -print |
181 awk '{
182 ++i;
183 printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
184 }' > $TMP2
185 for psize in 512 16384 65536; do
186 echo " page size $psize"
187 $PROG -i psize=$psize -o $TMP3 recno $TMP2
188 if (cmp -s $TMP1 $TMP3) ; then :
189 else
190 echo "test3: recno: page size $psize: failed"
191 exit 1
192 fi
193 done
194}
195
196# Do random recno entries.
197test4()
198{
199 echo "Test 4: recno: random entries"
200 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
201 awk '{
202 for (i = 37; i <= 37 + 88 * 17; i += 17) {
203 if (i % 41)
204 s = substr($0, 1, i % 41);
205 else
206 s = substr($0, 1);
207 printf("input key %d: %s\n", i, s);
208 }
209 for (i = 1; i <= 15; ++i) {
210 if (i % 41)
211 s = substr($0, 1, i % 41);
212 else
213 s = substr($0, 1);
214 printf("input key %d: %s\n", i, s);
215 }
216 for (i = 19234; i <= 19234 + 61 * 27; i += 27) {
217 if (i % 41)
218 s = substr($0, 1, i % 41);
219 else
220 s = substr($0, 1);
221 printf("input key %d: %s\n", i, s);
222 }
223 exit
224 }' > $TMP1
225 rm -f $TMP2 $TMP3
226 cat $TMP1 |
227 awk 'BEGIN {
228 i = 37;
229 incr = 17;
230 }
231 {
232 printf("p\nk%d\nd%s\n", i, $0);
233 if (i == 19234 + 61 * 27)
234 exit;
235 if (i == 37 + 88 * 17) {
236 i = 1;
237 incr = 1;
238 } else if (i == 15) {
239 i = 19234;
240 incr = 27;
241 } else
242 i += incr;
243 }
244 END {
245 for (i = 37; i <= 37 + 88 * 17; i += 17)
246 printf("g\nk%d\n", i);
247 for (i = 1; i <= 15; ++i)
248 printf("g\nk%d\n", i);
249 for (i = 19234; i <= 19234 + 61 * 27; i += 27)
250 printf("g\nk%d\n", i);
251 }' > $TMP2
252 $PROG -o $TMP3 recno $TMP2
253 if (cmp -s $TMP1 $TMP3) ; then :
254 else
255 echo "test4: type recno: failed"
256 exit 1
257 fi
258}
259
260# Do reverse order recno entries.
261test5()
262{
263 echo "Test 5: recno: reverse order entries"
264 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
265 awk ' {
266 for (i = 1500; i; --i) {
267 if (i % 34)
268 s = substr($0, 1, i % 34);
269 else
270 s = substr($0, 1);
271 printf("input key %d: %s\n", i, s);
272 }
273 exit;
274 }' > $TMP1
275 rm -f $TMP2 $TMP3
276 cat $TMP1 |
277 awk 'BEGIN {
278 i = 1500;
279 }
280 {
281 printf("p\nk%d\nd%s\n", i, $0);
282 --i;
283 }
284 END {
285 for (i = 1500; i; --i)
286 printf("g\nk%d\n", i);
287 }' > $TMP2
288 $PROG -o $TMP3 recno $TMP2
289 if (cmp -s $TMP1 $TMP3) ; then :
290 else
291 echo "test5: type recno: failed"
292 exit 1
293 fi
294}
295
296# Do alternating order recno entries.
297test6()
298{
299 echo "Test 6: recno: alternating order entries"
300 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
301 awk ' {
302 for (i = 1; i < 1200; i += 2) {
303 if (i % 34)
304 s = substr($0, 1, i % 34);
305 else
306 s = substr($0, 1);
307 printf("input key %d: %s\n", i, s);
308 }
309 for (i = 2; i < 1200; i += 2) {
310 if (i % 34)
311 s = substr($0, 1, i % 34);
312 else
313 s = substr($0, 1);
314 printf("input key %d: %s\n", i, s);
315 }
316 exit;
317 }' > $TMP1
318 rm -f $TMP2 $TMP3
319 cat $TMP1 |
320 awk 'BEGIN {
321 i = 1;
322 even = 0;
323 }
324 {
325 printf("p\nk%d\nd%s\n", i, $0);
326 i += 2;
327 if (i >= 1200) {
328 if (even == 1)
329 exit;
330 even = 1;
331 i = 2;
332 }
333 }
334 END {
335 for (i = 1; i < 1200; ++i)
336 printf("g\nk%d\n", i);
337 }' > $TMP2
338 $PROG -o $TMP3 recno $TMP2
339 sort -o $TMP1 $TMP1
340 sort -o $TMP3 $TMP3
341 if (cmp -s $TMP1 $TMP3) ; then :
342 else
343 echo "test6: type recno: failed"
344 exit 1
345 fi
346}
347
348# Delete cursor record
349test7()
350{
351 echo "Test 7: btree, recno: delete cursor record"
352 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
353 awk '{
354 for (i = 1; i <= 120; ++i)
355 printf("%05d: input key %d: %s\n", i, i, $0);
356 printf("%05d: input key %d: %s\n", 120, 120, $0);
357 printf("seq failed, no such key\n");
358 printf("%05d: input key %d: %s\n", 1, 1, $0);
359 printf("%05d: input key %d: %s\n", 2, 2, $0);
360 exit;
361 }' > $TMP1
362 rm -f $TMP2 $TMP3
363
364 for type in btree recno; do
365 cat $TMP1 |
366 awk '{
367 if (i == 120)
368 exit;
369 printf("p\nk%d\nd%s\n", ++i, $0);
370 }
371 END {
372 printf("fR_NEXT\n");
373 for (i = 1; i <= 120; ++i)
374 printf("s\n");
375 printf("fR_CURSOR\ns\nk120\n");
376 printf("r\n");
377 printf("fR_NEXT\ns\n");
378 printf("fR_CURSOR\ns\nk1\n");
379 printf("r\n");
380 printf("fR_FIRST\ns\n");
381 }' > $TMP2
382 $PROG -o $TMP3 recno $TMP2
383 if (cmp -s $TMP1 $TMP3) ; then :
384 else
385 echo "test7: type $type: failed"
386 exit 1
387 fi
388 done
389}
390
391# Make sure that overflow pages are reused.
392test8()
393{
394 echo "Test 8: btree, hash: repeated small key, big data pairs"
395 rm -f $TMP1
396 echo "" |
397 awk 'BEGIN {
398 for (i = 1; i <= 10; ++i) {
399 printf("p\nkkey1\nD/bin/sh\n");
400 printf("p\nkkey2\nD/bin/csh\n");
401 if (i % 8 == 0) {
402 printf("c\nkkey2\nD/bin/csh\n");
403 printf("c\nkkey1\nD/bin/sh\n");
404 printf("e\t%d of 10 (comparison)\n", i);
405 } else
406 printf("e\t%d of 10 \n", i);
407 printf("r\nkkey1\nr\nkkey2\n");
408 }
409 }' > $TMP1
410 $PROG btree $TMP1
411# $PROG hash $TMP1
412 # No explicit test for success.
413}
414
415# Test btree duplicate keys
416test9()
417{
418 echo "Test 9: btree: duplicate keys"
419 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
420 awk '{
421 for (i = 1; i <= 543; ++i)
422 printf("%05d: input key %d: %s\n", i, i, $0);
423 exit;
424 }' > $TMP1
425 rm -f $TMP2 $TMP3
426
427 for type in btree; do
428 cat $TMP1 |
429 awk '{
430 if (i++ % 2)
431 printf("p\nkduplicatekey\nd%s\n", $0);
432 else
433 printf("p\nkunique%dkey\nd%s\n", i, $0);
434 }
435 END {
436 printf("o\n");
437 }' > $TMP2
438 $PROG -iflags=1 -o $TMP3 $type $TMP2
439 sort -o $TMP3 $TMP3
440 if (cmp -s $TMP1 $TMP3) ; then :
441 else
442 echo "test9: type $type: failed"
443 exit 1
444 fi
445 done
446}
447
448# Test use of cursor flags without initialization
449test10()
450{
451 echo "Test 10: btree, recno: test cursor flag use"
452 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
453 awk '{
454 for (i = 1; i <= 20; ++i)
455 printf("%05d: input key %d: %s\n", i, i, $0);
456 exit;
457 }' > $TMP1
458 rm -f $TMP2 $TMP3
459
460 # Test that R_CURSOR doesn't succeed before cursor initialized
461 for type in btree recno; do
462 cat $TMP1 |
463 awk '{
464 if (i == 10)
465 exit;
466 printf("p\nk%d\nd%s\n", ++i, $0);
467 }
468 END {
469 printf("fR_CURSOR\nr\n");
470 printf("eR_CURSOR SHOULD HAVE FAILED\n");
471 }' > $TMP2
472 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
473 if [ -s $TMP3 ] ; then
474 echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED"
475 exit 1
476 fi
477 done
478 for type in btree recno; do
479 cat $TMP1 |
480 awk '{
481 if (i == 10)
482 exit;
483 printf("p\nk%d\nd%s\n", ++i, $0);
484 }
485 END {
486 printf("fR_CURSOR\np\nk1\ndsome data\n");
487 printf("eR_CURSOR SHOULD HAVE FAILED\n");
488 }' > $TMP2
489 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
490 if [ -s $TMP3 ] ; then
491 echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED"
492 exit 1
493 fi
494 done
495}
496
497# Test insert in reverse order.
498test11()
499{
500 echo "Test 11: recno: reverse order insert"
501 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
502 awk '{
503 for (i = 1; i <= 779; ++i)
504 printf("%05d: input key %d: %s\n", i, i, $0);
505 exit;
506 }' > $TMP1
507 rm -f $TMP2 $TMP3
508
509 for type in recno; do
510 cat $TMP1 |
511 awk '{
512 if (i == 0) {
513 i = 1;
514 printf("p\nk1\nd%s\n", $0);
515 printf("%s\n", "fR_IBEFORE");
516 } else
517 printf("p\nk1\nd%s\n", $0);
518 }
519 END {
520 printf("or\n");
521 }' > $TMP2
522 $PROG -o $TMP3 $type $TMP2
523 if (cmp -s $TMP1 $TMP3) ; then :
524 else
525 echo "test11: type $type: failed"
526 exit 1
527 fi
528 done
529}
530
531# Take the first 20000 entries in the dictionary, reverse them, and give
532# them each a small size data entry. Use a small page size to make sure
533# the btree split code gets hammered.
534test12()
535{
536 echo "Test 12: btree: lots of keys, small page size"
537 mdata=abcdefghijklmnopqrstuvwxy
538 echo $mdata |
539 awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
540 for type in btree; do
541 rm -f $TMP2 $TMP3
542 for i in `sed 20000q $DICT | rev`; do
543 echo p
544 echo k$i
545 echo d$mdata
546 echo g
547 echo k$i
548 done > $TMP2
549 $PROG -i psize=512 -o $TMP3 $type $TMP2
550 if (cmp -s $TMP1 $TMP3) ; then :
551 else
552 echo "test12: type $type: failed"
553 exit 1
554 fi
555 done
556}
557
558# Test different byte orders.
559test13()
560{
561 echo "Test 13: btree, hash: differing byte orders"
562 sed 50q $DICT > $TMP1
563 for order in 1234 4321; do
564 for type in btree hash; do
565 rm -f byte.file $TMP2 $TMP3
566 for i in `sed 50q $DICT`; do
567 echo p
568 echo k$i
569 echo d$i
570 echo g
571 echo k$i
572 done > $TMP2
573 $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
574 if (cmp -s $TMP1 $TMP3) ; then :
575 else
576 echo "test13: $type/$order put failed"
577 exit 1
578 fi
579 for i in `sed 50q $DICT`; do
580 echo g
581 echo k$i
582 done > $TMP2
583 $PROG -s \
584 -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
585 if (cmp -s $TMP1 $TMP3) ; then :
586 else
587 echo "test13: $type/$order get failed"
588 exit 1
589 fi
590 done
591 done
592 rm -f byte.file
593}
594
595# Try a variety of bucketsizes and fill factors for hashing
596test20()
597{
598 echo\
599 "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536"
600 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
601 awk '{
602 for (i = 1; i <= 10000; ++i) {
603 if (i % 34)
604 s = substr($0, 1, i % 34);
605 else
606 s = substr($0, 1);
607 printf("%s\n", s);
608 }
609 exit;
610 }' > $TMP1
611 sed 10000q $DICT |
612 awk 'BEGIN {
613 ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"
614 }
615 {
616 if (++i % 34)
617 s = substr(ds, 1, i % 34);
618 else
619 s = substr(ds, 1);
620 printf("p\nk%s\nd%s\n", $0, s);
621 }' > $TMP2
622 sed 10000q $DICT |
623 awk '{
624 ++i;
625 printf("g\nk%s\n", $0);
626 }' >> $TMP2
627 bsize=256
628 for ffactor in 11 14 21; do
629 echo " bucketsize $bsize, fill factor $ffactor"
630 $PROG -o$TMP3 \
631 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
632 hash $TMP2
633 if (cmp -s $TMP1 $TMP3) ; then :
634 else
635 echo "test20: type hash:\
636bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
637 exit 1
638 fi
639 done
640 bsize=512
641 for ffactor in 21 28 43; do
642 echo " bucketsize $bsize, fill factor $ffactor"
643 $PROG -o$TMP3 \
644 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
645 hash $TMP2
646 if (cmp -s $TMP1 $TMP3) ; then :
647 else
648 echo "test20: type hash:\
649bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
650 exit 1
651 fi
652 done
653 bsize=1024
654 for ffactor in 43 57 85; do
655 echo " bucketsize $bsize, fill factor $ffactor"
656 $PROG -o$TMP3 \
657 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
658 hash $TMP2
659 if (cmp -s $TMP1 $TMP3) ; then :
660 else
661 echo "test20: type hash:\
662bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
663 exit 1
664 fi
665 done
666 bsize=2048
667 for ffactor in 85 114 171; do
668 echo " bucketsize $bsize, fill factor $ffactor"
669 $PROG -o$TMP3 \
670 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
671 hash $TMP2
672 if (cmp -s $TMP1 $TMP3) ; then :
673 else
674 echo "test20: type hash:\
675bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
676 exit 1
677 fi
678 done
679 bsize=4096
680 for ffactor in 171 228 341; do
681 echo " bucketsize $bsize, fill factor $ffactor"
682 $PROG -o$TMP3 \
683 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
684 hash $TMP2
685 if (cmp -s $TMP1 $TMP3) ; then :
686 else
687 echo "test20: type hash:\
688bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
689 exit 1
690 fi
691 done
692 bsize=8192
693 for ffactor in 341 455 683; do
694 echo " bucketsize $bsize, fill factor $ffactor"
695 $PROG -o$TMP3 \
696 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
697 hash $TMP2
698 if (cmp -s $TMP1 $TMP3) ; then :
699 else
700 echo "test20: type hash:\
701bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
702 exit 1
703 fi
704 done
705}
706
707main $*
diff --git a/src/regress/lib/libc/dirname/Makefile b/src/regress/lib/libc/dirname/Makefile
deleted file mode 100644
index fc152df954..0000000000
--- a/src/regress/lib/libc/dirname/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
1PROG=dirname_test
2
3.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/dirname/dirname_test.c b/src/regress/lib/libc/dirname/dirname_test.c
deleted file mode 100644
index 27d32b6eda..0000000000
--- a/src/regress/lib/libc/dirname/dirname_test.c
+++ /dev/null
@@ -1,83 +0,0 @@
1/*
2 * Copyright (c) 2007 Bret S. Lambert <blambert@gsipt.net>
3 *
4 * Public domain.
5 */
6
7#include <sys/param.h>
8
9#include <libgen.h>
10#include <stdio.h>
11#include <string.h>
12#include <limits.h>
13#include <errno.h>
14#include <err.h>
15
16int
17main(void)
18{
19 char path[2 * MAXPATHLEN];
20 char dname[128];
21 const char *dir = "junk";
22 const char *fname = "/file.name.ext";
23 char *str;
24 int i;
25
26 /* Test normal functioning */
27 strlcpy(path, "/", sizeof(path));
28 strlcpy(dname, "/", sizeof(dname));
29 strlcat(path, dir, sizeof(path));
30 strlcat(dname, dir, sizeof(dname));
31 strlcat(path, fname, sizeof(path));
32 str = dirname(path);
33 if (strcmp(str, dname) != 0)
34 errx(1, "0: dirname(%s) = %s != %s", path, str, dname);
35
36 /*
37 * There are four states that require special handling:
38 *
39 * 1) path is NULL
40 * 2) path is the empty string
41 * 3) path is composed entirely of slashes
42 * 4) the resulting name is larger than MAXPATHLEN
43 *
44 * The first two cases require that a pointer
45 * to the string "." be returned.
46 *
47 * The third case requires that a pointer
48 * to the string "/" be returned.
49 *
50 * The final case requires that NULL be returned
51 * and errno * be set to ENAMETOOLONG.
52 */
53 /* Case 1 */
54 str = dirname(NULL);
55 if (strcmp(str, ".") != 0)
56 errx(1, "1: dirname(NULL) = %s != .", str);
57
58 /* Case 2 */
59 strlcpy(path, "", sizeof(path));
60 str = dirname(path);
61 if (strcmp(str, ".") != 0)
62 errx(1, "2: dirname(%s) = %s != .", path, str);
63
64 /* Case 3 */
65 for (i = 0; i < MAXPATHLEN - 1; i++)
66 strlcat(path, "/", sizeof(path)); /* path cleared above */
67 str = dirname(path);
68 if (strcmp(str, "/") != 0)
69 errx(1, "3: dirname(%s) = %s != /", path, str);
70
71 /* Case 4 */
72 strlcpy(path, "/", sizeof(path)); /* reset path */
73 for (i = 0; i <= MAXPATHLEN; i += strlen(dir))
74 strlcat(path, dir, sizeof(path));
75 strlcat(path, fname, sizeof(path));
76 str = dirname(path);
77 if (str != NULL)
78 errx(1, "4: dirname(%s) = %s != NULL", path, str);
79 if (errno != ENAMETOOLONG)
80 errx(1, "4: dirname(%s) sets errno to %d", path, errno);
81
82 return (0);
83}
diff --git a/src/regress/lib/libc/env/Makefile b/src/regress/lib/libc/env/Makefile
deleted file mode 100644
index 92e04369f4..0000000000
--- a/src/regress/lib/libc/env/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2010/08/23 22:34:37 millert Exp $
2
3PROG= envtest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/env/envtest.c b/src/regress/lib/libc/env/envtest.c
deleted file mode 100644
index f145ecbd14..0000000000
--- a/src/regress/lib/libc/env/envtest.c
+++ /dev/null
@@ -1,125 +0,0 @@
1/* $OpenBSD: envtest.c,v 1.2 2019/01/25 00:19:26 millert Exp $ */
2
3/*
4 * Copyright (c) 2010 Todd C. Miller <millert@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <sys/types.h>
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <unistd.h>
25
26extern char **environ;
27
28static int
29count_instances(const char *name)
30{
31 int count = 0;
32 size_t namelen;
33 char **ep;
34
35 namelen = strlen(name);
36 for (ep = environ; *ep != NULL; ep++) {
37 if (strncmp(name, *ep, namelen) == 0 && (*ep)[namelen] == '=')
38 count++;
39 }
40
41 return count;
42}
43
44static void
45fake_env(void)
46{
47 static char *fakenv[7];
48
49 fakenv[0] = "HOME=/root";
50 fakenv[1] = "USER=root";
51 fakenv[2] = "LOGNAME=root";
52 fakenv[3] = "SHELL=/bin/sh";
53 fakenv[4] = "USER=root";
54 fakenv[5] = NULL;
55
56 environ = fakenv;
57}
58
59int
60main(int argc, char *argv[])
61{
62 char *buf;
63 int n, failures = 0;
64 size_t len, bufsize;
65
66 /* Enable malloc security options. */
67 setenv("MALLOC_OPTIONS", "S", 0);
68
69 fake_env();
70 n = count_instances("USER");
71 if (n != 2) {
72 fprintf(stderr, "initial: %d instances of USER, expected %d\n",
73 n, 2);
74 failures++;
75 }
76
77 if (unsetenv("USER") != 0) {
78 fprintf(stderr, "unsetenv: failed to remove USER\n");
79 failures++;
80 }
81 n = count_instances("USER");
82 if (n != 0) {
83 fprintf(stderr, "unsetenv: %d instances of USER, expected %d\n",
84 n, 0);
85 failures++;
86 }
87
88 fake_env();
89 if (setenv("USER", "nobody", 0) != 0) {
90 fprintf(stderr, "setenv: failed to set USER\n");
91 failures++;
92 }
93 n = count_instances("USER");
94 if (n != 2) {
95 fprintf(stderr, "setenv: %d instances of USER, expected %d\n",
96 n, 2);
97 failures++;
98 }
99
100 fake_env();
101 if (setenv("USER", "nobody", 1) != 0) {
102 fprintf(stderr, "setenv: failed to set USER\n");
103 failures++;
104 }
105 n = count_instances("USER");
106 if (n != 1) {
107 fprintf(stderr, "setenv: %d instances of USER, expected %d\n",
108 n, 1);
109 failures++;
110 }
111
112 fake_env();
113 if (putenv("USER=nobody") != 0) {
114 fprintf(stderr, "putenv: failed to set USER\n");
115 failures++;
116 }
117 n = count_instances("USER");
118 if (n != 1) {
119 fprintf(stderr, "putenv: %d instances of USER, expected %d\n",
120 n, 1);
121 failures++;
122 }
123
124 return failures;
125}
diff --git a/src/regress/lib/libc/explicit_bzero/Makefile b/src/regress/lib/libc/explicit_bzero/Makefile
deleted file mode 100644
index cd514a43a1..0000000000
--- a/src/regress/lib/libc/explicit_bzero/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2014/06/12 22:01:55 matthew Exp $
2
3PROG= explicit_bzero
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/explicit_bzero/explicit_bzero.c b/src/regress/lib/libc/explicit_bzero/explicit_bzero.c
deleted file mode 100644
index 34c60baa8a..0000000000
--- a/src/regress/lib/libc/explicit_bzero/explicit_bzero.c
+++ /dev/null
@@ -1,197 +0,0 @@
1/* $OpenBSD: explicit_bzero.c,v 1.6 2014/07/11 01:10:35 matthew Exp $ */
2/*
3 * Copyright (c) 2014 Google Inc.
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <assert.h>
19#include <errno.h>
20#include <signal.h>
21#include <string.h>
22#include <unistd.h>
23
24#define ASSERT_EQ(a, b) assert((a) == (b))
25#define ASSERT_NE(a, b) assert((a) != (b))
26#define ASSERT_GE(a, b) assert((a) >= (b))
27
28/* 128 bits of random data. */
29static const char secret[16] = {
30 0xa0, 0x6c, 0x0c, 0x81, 0xba, 0xd8, 0x5b, 0x0c,
31 0xb0, 0xd6, 0xd4, 0xe3, 0xeb, 0x52, 0x5f, 0x96,
32};
33
34enum {
35 SECRETCOUNT = 64,
36 SECRETBYTES = SECRETCOUNT * sizeof(secret)
37};
38
39static char altstack[SIGSTKSZ + SECRETBYTES];
40
41static void
42setup_stack(void)
43{
44 const stack_t sigstk = {
45 .ss_sp = altstack,
46 .ss_size = sizeof(altstack),
47 };
48
49 ASSERT_EQ(0, sigaltstack(&sigstk, NULL));
50}
51
52static void
53assert_on_stack(void)
54{
55 stack_t cursigstk;
56 ASSERT_EQ(0, sigaltstack(NULL, &cursigstk));
57 ASSERT_EQ(SS_ONSTACK, cursigstk.ss_flags & (SS_DISABLE|SS_ONSTACK));
58}
59
60static void
61call_on_stack(void (*fn)(int))
62{
63 /*
64 * This is a bit more complicated than strictly necessary, but
65 * it ensures we don't have any flaky test failures due to
66 * inherited signal masks/actions/etc.
67 *
68 * On systems where SA_ONSTACK is not supported, this could
69 * alternatively be implemented using makecontext() or
70 * pthread_attr_setstack().
71 */
72
73 const struct sigaction sigact = {
74 .sa_handler = fn,
75 .sa_flags = SA_ONSTACK,
76 };
77 struct sigaction oldsigact;
78 sigset_t sigset, oldsigset;
79
80 /* First, block all signals. */
81 ASSERT_EQ(0, sigemptyset(&sigset));
82 ASSERT_EQ(0, sigfillset(&sigset));
83 ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &sigset, &oldsigset));
84
85 /* Next setup the signal handler for SIGUSR1. */
86 ASSERT_EQ(0, sigaction(SIGUSR1, &sigact, &oldsigact));
87
88 /* Raise SIGUSR1 and momentarily unblock it to run the handler. */
89 ASSERT_EQ(0, raise(SIGUSR1));
90 ASSERT_EQ(0, sigdelset(&sigset, SIGUSR1));
91 ASSERT_EQ(-1, sigsuspend(&sigset));
92 ASSERT_EQ(EINTR, errno);
93
94 /* Restore the original signal action, stack, and mask. */
95 ASSERT_EQ(0, sigaction(SIGUSR1, &oldsigact, NULL));
96 ASSERT_EQ(0, sigprocmask(SIG_SETMASK, &oldsigset, NULL));
97}
98
99static void
100populate_secret(char *buf, size_t len)
101{
102 int i, fds[2];
103 ASSERT_EQ(0, pipe(fds));
104
105 for (i = 0; i < SECRETCOUNT; i++)
106 ASSERT_EQ(sizeof(secret), write(fds[1], secret, sizeof(secret)));
107 ASSERT_EQ(0, close(fds[1]));
108
109 ASSERT_EQ(len, read(fds[0], buf, len));
110 ASSERT_EQ(0, close(fds[0]));
111}
112
113static int
114count_secrets(const char *buf)
115{
116 int res = 0;
117 size_t i;
118 for (i = 0; i < SECRETCOUNT; i++) {
119 if (memcmp(buf + i * sizeof(secret), secret,
120 sizeof(secret)) == 0)
121 res += 1;
122 }
123 return (res);
124}
125
126static char *
127test_without_bzero()
128{
129 char buf[SECRETBYTES];
130 assert_on_stack();
131 populate_secret(buf, sizeof(buf));
132 char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
133 ASSERT_NE(NULL, res);
134 return (res);
135}
136
137static char *
138test_with_bzero()
139{
140 char buf[SECRETBYTES];
141 assert_on_stack();
142 populate_secret(buf, sizeof(buf));
143 char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
144 ASSERT_NE(NULL, res);
145 explicit_bzero(buf, sizeof(buf));
146 return (res);
147}
148
149static void
150do_test_without_bzero(int signo)
151{
152 char *buf = test_without_bzero();
153 ASSERT_GE(count_secrets(buf), 1);
154}
155
156static void
157do_test_with_bzero(int signo)
158{
159 char *buf = test_with_bzero();
160 ASSERT_EQ(count_secrets(buf), 0);
161}
162
163int
164main()
165{
166 setup_stack();
167
168 /*
169 * Solaris and OS X clobber the signal stack after returning to the
170 * normal stack, so we need to inspect altstack while we're still
171 * running on it. Unfortunately, this means we risk clobbering the
172 * buffer ourselves.
173 *
174 * To minimize this risk, test_with{,out}_bzero() are responsible for
175 * locating the offset of their buf variable within altstack, and
176 * and returning that address. Then we can simply memcmp() repeatedly
177 * to count how many instances of secret we found.
178 */
179
180 /*
181 * First, test that if we *don't* call explicit_bzero, that we
182 * *are* able to find at least one instance of the secret data still
183 * on the stack. This sanity checks that call_on_stack() and
184 * populate_secret() work as intended.
185 */
186 memset(altstack, 0, sizeof(altstack));
187 call_on_stack(do_test_without_bzero);
188
189 /*
190 * Now test with a call to explicit_bzero() and check that we
191 * *don't* find any instances of the secret data.
192 */
193 memset(altstack, 0, sizeof(altstack));
194 call_on_stack(do_test_with_bzero);
195
196 return (0);
197}
diff --git a/src/regress/lib/libc/fmemopen/Makefile b/src/regress/lib/libc/fmemopen/Makefile
deleted file mode 100644
index 9cfbfaa99c..0000000000
--- a/src/regress/lib/libc/fmemopen/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2013/01/01 17:43:07 mpi Exp $
2
3PROG= fmemopentest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/fmemopen/fmemopentest.c b/src/regress/lib/libc/fmemopen/fmemopentest.c
deleted file mode 100644
index 203c93be65..0000000000
--- a/src/regress/lib/libc/fmemopen/fmemopentest.c
+++ /dev/null
@@ -1,212 +0,0 @@
1/* $OpenBSD: fmemopentest.c,v 1.3 2013/03/28 09:35:58 mpi Exp $ */
2
3/*
4 * Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <err.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23#include <unistd.h>
24
25int
26simpletest(void)
27{
28 FILE *s1, *s2;
29 char string[] = "fmemopen test string!";
30 char buffer[1024], *buf = NULL;
31 size_t len;
32 int c, failures = 0;
33
34 s1 = fmemopen(string, strlen(string) + 1, "r");
35 if (s1 == NULL) {
36 warn("unable to open a stream s1");
37 return (1);
38 }
39
40 s2 = fmemopen(buf, 22, "w+");
41 if (s2 == NULL) {
42 warn("unable to create a stream s2");
43 fclose(s1);
44 return (1);
45 }
46
47 while ((c = fgetc(s1)) != EOF)
48 fputc(c, s2);
49
50 if (ftell(s2) != strlen(string) + 1) {
51 warnx("failed copy test (1)");
52 failures++;
53 }
54 fclose(s1);
55
56 fseek(s2, 0, SEEK_SET);
57 if (ftell(s2) != 0) {
58 warnx("failed seek test (2)");
59 failures++;
60 }
61
62 len = fread(buffer, 1, sizeof(buffer) - 1, s2);
63 if (len != strlen(string) + 1) {
64 warnx("failed read test (3) %zu != %zu",
65 len, strlen(string) + 1);
66 failures++;
67 }
68
69 return (failures);
70}
71
72int
73updatetest(void)
74{
75 FILE *s1;
76 char string[] = "hello\0 test number 2";
77 char buffer[256];
78 size_t len;
79 int failures = 0;
80
81 s1 = fmemopen(string, 19, "a+");
82 if (s1 == NULL)
83 return (1);
84
85 len = fwrite(" world", 1, 6, s1);
86 if (len != 6) {
87 warnx("failed write test (4)");
88 failures++;
89 }
90
91 fseek(s1, 0, SEEK_SET);
92 if (ftell(s1) != 0) {
93 warnx("failed seek test (5)");
94 failures++;
95 }
96
97 len = fread(buffer, 1, sizeof(buffer) - 1, s1);
98 if (strncmp(string, buffer, len)) {
99 warnx("failed compare test (6)");
100 failures++;
101 }
102
103 if (strcmp(string, "hello world")) {
104 warnx("failed compare test (7)");
105 failures++;
106 }
107
108 if (strcmp(string + strlen(string) + 1, "number 2")) {
109 warnx("failed compare test (8)");
110 failures++;
111 }
112
113 return (failures);
114}
115
116int
117writetest(void)
118{
119 FILE *s1;
120 char string[] = "super test number 3";
121 char buffer[256];
122 size_t len, slen;
123 int failures = 0;
124
125 slen = strlen(string) + 1;
126
127 s1 = fmemopen(string, slen, "w");
128 if (s1 == NULL)
129 return (1);
130
131 len = fwrite("short", 1, 5, s1);
132 if (len != strlen("short")) {
133 warnx("failed write test (9)");
134 failures++;
135 }
136 fclose(s1);
137
138 s1 = fmemopen(string, slen, "r");
139 if (s1 == NULL) {
140 warnx("failed open test (10)");
141 failures++;
142 }
143
144 len = fread(buffer, 1, sizeof(buffer) - 1, s1);
145 if (strncmp(string, buffer, len)) {
146 warnx("failed compare test (11)");
147 failures++;
148 }
149
150 if (strcmp(string, "short")) {
151 warnx("failed compare test (12)");
152 failures++;
153 }
154
155 if (strcmp(string + strlen(string) + 1, "test number 3")) {
156 warnx("failed compare test (13)");
157 failures++;
158 }
159
160 return (failures);
161}
162
163int
164seektest(void)
165{
166 FILE *s1;
167 char string[] = "long string for testing seek";
168 size_t len, slen;
169 int failures = 0;
170
171 slen = strlen(string) + 1;
172
173 s1 = fmemopen(string, slen, "r");
174 if (s1 == NULL)
175 return (1);
176
177 if (fseek(s1, 8, SEEK_SET) != 0) {
178 warnx("failed to fseek. (14)");
179 failures++;
180 }
181
182 if (ftell(s1) != 8) {
183 warnx("failed seek test. (15)");
184 failures++;
185 }
186
187 /* Try to seek backward */
188 if (fseek(s1, -1, SEEK_CUR) != 0) {
189 warnx("failed to fseek. (16)");
190 failures++;
191 }
192
193 if (ftell(s1) != 7) {
194 warnx("failed seeking backward. (17)");
195 failures++;
196 }
197
198 return (failures);
199}
200
201int
202main(void)
203{
204 int failures = 0;
205
206 failures += simpletest();
207 failures += updatetest();
208 failures += writetest();
209 failures += seektest();
210
211 return (failures);
212}
diff --git a/src/regress/lib/libc/fnmatch/Makefile b/src/regress/lib/libc/fnmatch/Makefile
deleted file mode 100644
index 4acdd351bc..0000000000
--- a/src/regress/lib/libc/fnmatch/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2011/09/17 15:12:38 stsp Exp $
2
3PROG= fnm_test
4LDADD+= -lutil
5DPADD+= ${LIBUTIL}
6
7run-regress-${PROG}:
8 ./${PROG} ${.CURDIR}/${PROG}.in
9
10.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/fnmatch/fnm_test.c b/src/regress/lib/libc/fnmatch/fnm_test.c
deleted file mode 100644
index ee04f6335e..0000000000
--- a/src/regress/lib/libc/fnmatch/fnm_test.c
+++ /dev/null
@@ -1,62 +0,0 @@
1/* $OpenBSD: fnm_test.c,v 1.3 2019/01/25 00:19:26 millert Exp $ */
2
3/*
4 * Public domain, 2008, Todd C. Miller <millert@openbsd.org>
5 */
6
7#include <err.h>
8#include <fnmatch.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <util.h>
12
13int
14main(int argc, char **argv)
15{
16 FILE *fp = stdin;
17 char pattern[1024], string[1024];
18 char *line;
19 const char delim[3] = {'\0', '\0', '#'};
20 int errors = 0, flags, got, want;
21
22 if (argc > 1) {
23 if ((fp = fopen(argv[1], "r")) == NULL)
24 err(1, "%s", argv[1]);
25 }
26
27 /*
28 * Read in test file, which is formatted thusly:
29 *
30 * pattern string flags expected_result
31 *
32 * lines starting with '#' are comments
33 */
34 for (;;) {
35 line = fparseln(fp, NULL, NULL, delim, 0);
36 if (!line)
37 break;
38 got = sscanf(line, "%s %s 0x%x %d", pattern, string, &flags,
39 &want);
40 if (got == EOF) {
41 free(line);
42 break;
43 }
44 if (pattern[0] == '#') {
45 free(line);
46 continue;
47 }
48 if (got == 4) {
49 got = fnmatch(pattern, string, flags);
50 if (got != want) {
51 warnx("%s %s %d: want %d, got %d", pattern,
52 string, flags, want, got);
53 errors++;
54 }
55 } else {
56 warnx("unrecognized line '%s'\n", line);
57 errors++;
58 }
59 free(line);
60 }
61 exit(errors);
62}
diff --git a/src/regress/lib/libc/fnmatch/fnm_test.in b/src/regress/lib/libc/fnmatch/fnm_test.in
deleted file mode 100644
index c2f218ae1b..0000000000
--- a/src/regress/lib/libc/fnmatch/fnm_test.in
+++ /dev/null
@@ -1,260 +0,0 @@
1/bin/[[:alpha:][:alnum:]]* /bin/ls 0x2 0
2/bin/[[:upper:]][[:alnum:]] /bin/ls 0x10 0
3/bin/[[:opper:][:alnum:]]* /bin/ls 0x0 1
4[[:alpha:][:alnum:]]*.c foo1.c 0x4 0
5[[:upper:]]* FOO 0x0 0
6[![:space:]]* bar 0x0 0
7# 'te\st' 'test'; no match if FNM_NOESCAPE
8te\st test 0x0 0
9te\st test 0x1 1
10te\st test 0x1e 0
11# 'te\\st' 'te\st'; no match if FNM_NOESCAPE
12te\\st te\st 0x0 0
13te\\st te\st 0x1 1
14te\\st te\st 0x1e 0
15# 'te\*t' 'te*t'; no match if FNM_NOESCAPE
16te\*t te*t 0x0 0
17te\*t te*t 0x1 1
18te\*t te*t 0x1e 0
19# 'te\*t' 'test'; no match
20te\*t test 0x0 1
21te\*t test 0x1f 1
22# 'te\?t' 'te?t'; no match if FNM_NOESCAPE
23te\?t te?t 0x0 0
24te\?t te?t 0x1 1
25te\?t te?t 0x1e 0
26# 'te\?t' 'test'; no match
27te\?t test 0x0 1
28te\?t test 0x1f 1
29# 'tesT' 'test'; match if FNM_CASEFOLD
30tesT test 0x0 1
31tesT test 0xf 1
32tesT test 0x10 0
33# 'test' 'Test'; match if FNM_CASEFOLD
34test Test 0x0 1
35test Test 0xf 1
36test Test 0x10 0
37# 'tEst' 'teSt'; match if FNM_CASEFOLD
38tEst teSt 0x0 1
39tEst teSt 0xf 1
40tEst teSt 0x10 0
41# '?est' 'test'; match always
42?est test 0x0 0
43?est test 0x1f 0
44# 'te?t' 'test'; match always
45te?t test 0x0 0
46te?t test 0x1f 0
47# 'tes?' 'test'; match always
48tes? test 0x0 0
49tes? test 0x1f 0
50# 'test?' 'test'; no match
51test? test 0x0 1
52test? test 0x1f 1
53# '*' always matches anything
54* test 0x0 0
55* test 0x1f 0
56# '*test' 'test'; match always
57*test test 0x0 0
58*test test 0x1f 0
59# '*est' 'test'; match always
60*est test 0x0 0
61*est test 0x1f 0
62# '*st' 'test'; match always
63*st test 0x0 0
64*st test 0x1f 0
65# 't*t' 'test'; match always
66t*t test 0x0 0
67t*t test 0x1f 0
68# 'te*t' 'test'; match always
69te*t test 0x0 0
70te*t test 0x1f 0
71# 'te*st' 'test'; match always
72te*st test 0x0 0
73te*st test 0x1f 0
74# 'te*' 'test'; match always
75te* test 0x0 0
76te* test 0x1f 0
77# 'tes*' 'test'; match always
78tes* test 0x0 0
79tes* test 0x1f 0
80# 'test*' 'test'; match always
81test* test 0x0 0
82test* test 0x1f 0
83# '.[\-\t]' '.t'; match always
84.[\-\t] .t 0x0 0
85.[\-\t] .t 0x1f 0
86# 'test*?*[a-z]*' 'testgoop'; match always
87test*?*[a-z]* testgoop 0x0 0
88test*?*[a-z]* testgoop 0x1f 0
89# 'te[^abc]t' 'test'; match always
90te[^abc]t test 0x0 0
91te[^abc]t test 0x1f 0
92# 'te[^x]t' 'test'; match always
93te[^x]t test 0x0 0
94te[^x]t test 0x1f 0
95# 'te[!x]t' 'test'; match always
96te[!x]t test 0x0 0
97te[^x]t test 0x1f 0
98# 'te[^x]t' 'text'; no match
99te[^x]t text 0x0 1
100te[^x]t text 0x1f 1
101# 'te[^\x]t' 'text'; no match
102te[^\x]t text 0x0 1
103te[^\x]t text 0x1f 1
104# 'te[^\x' 'text'; no match
105te[^\x text 0x0 1
106te[^\x text 0x1f 1
107# 'te[/]t' 'text'; no match
108te[/]t text 0x0 1
109te[/]t text 0x1f 1
110# 'te[S]t' 'test'; match if FNM_CASEFOLD
111te[S]t test 0x0 1
112te[S]t test 0xf 1
113te[S]t test 0x10 0
114# 'te[r-t]t' 'test'; match always
115te[r-t]t test 0x0 0
116te[r-t]t test 0x1f 0
117# 'te[r-t]t' 'teSt'; match if FNM_CASEFOLD
118te[r-t]t teSt 0x0 1
119te[r-t]t teSt 0xf 1
120te[r-t]t teSt 0x10 0
121# 'te[r-T]t' 'test'; match if FNM_CASEFOLD
122te[r-T]t test 0x0 1
123te[r-T]t test 0xf 1
124te[r-T]t test 0x10 0
125# 'te[R-T]t' 'test'; match if FNM_CASEFOLD
126te[R-T]t test 0x0 1
127te[R-T]t test 0xf 1
128te[R-T]t test 0x10 0
129# 'te[r-Tz]t' 'tezt'; match always
130te[r-Tz]t tezt 0x0 0
131te[r-Tz]t tezt 0x1f 0
132# 'te[R-T]t' 'tent'; no match
133te[R-T]t tent 0x0 1
134te[R-T]t tent 0x1f 1
135# 'tes[]t]' 'test'; match always
136tes[]t] test 0x0 0
137tes[]t] test 0x1f 0
138# 'tes[t-]' 'test'; match always
139tes[t-] test 0x0 0
140tes[t-] test 0x1f 0
141# 'tes[t-]]' 'test]'; match always
142tes[t-]] test] 0x0 0
143tes[t-]] test] 0x1f 0
144# 'tes[t-]]' 'test'; no match
145tes[t-]] test 0x0 1
146tes[t-]] test 0x1f 1
147# 'tes[u-]' 'test'; no match
148tes[u-] test 0x0 1
149tes[u-] test 0x1f 1
150# 'tes[t-]' 'tes[t-]'; no match
151tes[t-] test[t-] 0x0 1
152tes[t-] test[t-] 0x1f 1
153# 'test[/-/]' 'test[/-/]'; no match
154test[/-/] test/-/ 0x0 1
155test[/-/] test/-/ 0x1f 1
156# 'test[\/-/]' 'test[/-/]'; no match
157test[\/-/] test/-/ 0x0 1
158test[\/-/] test/-/ 0x1f 1
159# 'test[/-\/]' 'test[/-/]'; no match
160test[/-\/] test/-/ 0x0 1
161test[/-\/] test/-/ 0x1f 1
162# 'test[/-/]' 'test/'; no match if APR_FNM_PATHNAME
163test[/-/] test/ 0x0 0
164test[/-/] test/ 0x2 1
165test[/-/] test/ 0x1d 0
166# 'test[\/-/]' 'test/'; no match if APR_FNM_PATHNAME
167test[\/-/] test/ 0x0 0
168test[\/-/] test/ 0x2 1
169test[\/-/] test/ 0x1d 0
170# 'test[/-\/]' 'test/'; no match if APR_FNM_PATHNAME
171test[/-\/] test/ 0x0 0
172test[/-\/] test/ 0x2 1
173test[/-\/] test/ 0x1d 0
174# '/test' 'test'; no match
175/test test 0x0 1
176/test test 0x1f 1
177# 'test' '/test'; no match
178test /test 0x0 1
179test /test 0x1f 1
180# 'test/' 'test'; no match
181test/ test 0x0 1
182test/ test 0x1f 1
183# 'test' 'test/'; match if FNM_LEADING_DIR
184test test/ 0x0 1
185test test/ 0x17 1
186test test/ 0x8 0
187# '\/test' '/test'; match unless FNM_NOESCAPE
188\/test /test 0x0 0
189\/test /test 0x1 1
190\/test /test 0x1e 0
191# '*test' '/test'; match unless FNM_PATHNAME
192*test /test 0x0 0
193*test /test 0x2 1
194*test /test 0x1d 0
195# '/*/test' '/test'; no match
196/*/test /test 0x0 1
197/*/test /test 0x1f 1
198# '/*/test' '/test/test'; match always
199/*/test /test/test 0x0 0
200/*/test /test/test 0x1f 0
201# 'test/this' 'test/'; match never
202test/this test/ 0x0 1
203test/this test/ 0x1f 1
204# 'test/' 'test/this'; match never
205test/ test/this 0x0 1
206test/ test/this 0x1f 1
207# 'test*/this' 'test/this'; match always
208test*/this test/this 0x0 0
209test*/this test/this 0x1f 0
210# 'test*/this' 'test/that'; match never
211test*/this test/that 0x0 1
212test*/this test/that 0x1f 1
213# 'test/*this' 'test/this'; match always
214test/*this test/this 0x0 0
215test/*this test/this 0x1f 0
216# '.*' '.this'; match always
217.* .this 0x0 0
218.* .this 0x1f 0
219# '*' '.this'; fails if FNM_PERIOD
220* .this 0x0 0
221* .this 0x4 1
222* .this 0x1b 0
223# '?this' '.this'; fails if FNM_PERIOD
224?this .this 0x0 0
225?this .this 0x4 1
226?this .this 0x1b 0
227# '[.]this' '.this'; fails if FNM_PERIOD
228[.]this .this 0x0 0
229[.]this .this 0x4 1
230[.]this .this 0x1b 0
231# 'test/this' 'test/this'; match always
232test/this test/this 0x0 0
233test/this test/this 0x1f 0
234# 'test?this' 'test/this'; fails if FNM_PATHNAME
235test?this test/this 0x0 0
236test?this test/this 0x2 1
237test?this test/this 0x1d 0
238# 'test*this' 'test/this'; fails if FNM_PATHNAME
239test*this test/this 0x0 0
240test*this test/this 0x2 1
241test*this test/this 0x1d 0
242# 'test[/]this' 'test/this'; fails if FNM_PATHNAME
243test[/]this test/this 0x0 0
244test[/]this test/this 0x2 1
245test[/]this test/this 0x1d 0
246# 'test/.*' 'test/.this'; match always
247test/.* test/.this 0x0 0
248test/.* test/.this 0x1f 0
249# 'test/*' 'test/.this'; fails if FNM_PERIOD and FNM_PATHNAME
250test/* test/.this 0x0 0
251test/* test/.this 0x6 1
252test/* test/.this 0x19 0
253# 'test/?' 'test/.this'; fails if FNM_PERIOD and FNM_PATHNAME
254test/?this test/.this 0x0 0
255test/?this test/.this 0x6 1
256test/?this test/.this 0x19 0
257# 'test/[.]this' 'test/.this'; fails if FNM_PERIOD and FNM_PATHNAME
258test/[.]this test/.this 0x0 0
259test/[.]this test/.this 0x6 1
260test/[.]this test/.this 0x19 0
diff --git a/src/regress/lib/libc/fpclassify/Makefile b/src/regress/lib/libc/fpclassify/Makefile
deleted file mode 100644
index 96916d20e7..0000000000
--- a/src/regress/lib/libc/fpclassify/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2008/09/07 20:36:10 martynas Exp $
2
3PROG= fpclassify
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/fpclassify/fpclassify.c b/src/regress/lib/libc/fpclassify/fpclassify.c
deleted file mode 100644
index 174c04d983..0000000000
--- a/src/regress/lib/libc/fpclassify/fpclassify.c
+++ /dev/null
@@ -1,76 +0,0 @@
1/* $OpenBSD: fpclassify.c,v 1.1 2008/09/07 20:36:10 martynas Exp $ */
2/*-
3 * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 * $FreeBSD: src/tools/regression/lib/libc/gen/test-fpclassify.c,v 1.3 2003/03/27 05:32:28 das Exp $
28 */
29
30#include <assert.h>
31#include <float.h>
32#include <math.h>
33#include <stdlib.h>
34
35int
36main(void)
37{
38
39 assert(fpclassify((float)0) == FP_ZERO);
40 assert(fpclassify((float)-0.0) == FP_ZERO);
41 assert(fpclassify((float)1) == FP_NORMAL);
42 assert(fpclassify((float)1000) == FP_NORMAL);
43#ifndef __alpha__
44 assert(fpclassify(0x1.2p-150f) == FP_SUBNORMAL);
45#endif /* !__alpha__ */
46 assert(fpclassify(HUGE_VALF) == FP_INFINITE);
47 assert(fpclassify((float)HUGE_VAL) == FP_INFINITE);
48 assert(fpclassify((float)HUGE_VALL) == FP_INFINITE);
49 assert(fpclassify(NAN) == FP_NAN);
50
51 assert(fpclassify((double)0) == FP_ZERO);
52 assert(fpclassify((double)-0) == FP_ZERO);
53 assert(fpclassify((double)1) == FP_NORMAL);
54 assert(fpclassify((double)1000) == FP_NORMAL);
55#ifndef __alpha__
56 assert(fpclassify(0x1.2p-1075) == FP_SUBNORMAL);
57#endif /* !__alpha__ */
58 assert(fpclassify(HUGE_VAL) == FP_INFINITE);
59 assert(fpclassify((double)HUGE_VALF) == FP_INFINITE);
60 assert(fpclassify((double)HUGE_VALL) == FP_INFINITE);
61 assert(fpclassify((double)NAN) == FP_NAN);
62
63 assert(fpclassify((long double)0) == FP_ZERO);
64 assert(fpclassify((long double)-0.0) == FP_ZERO);
65 assert(fpclassify((long double)1) == FP_NORMAL);
66 assert(fpclassify((long double)1000) == FP_NORMAL);
67#if (LDBL_MANT_DIG > DBL_MANT_DIG)
68 assert(fpclassify(0x1.2p-16383L) == FP_SUBNORMAL);
69#endif /* (LDBL_MANT_DIG > DBL_MANT_DIG) */
70 assert(fpclassify(HUGE_VALL) == FP_INFINITE);
71 assert(fpclassify((long double)HUGE_VALF) == FP_INFINITE);
72 assert(fpclassify((long double)HUGE_VAL) == FP_INFINITE);
73 assert(fpclassify((long double)NAN) == FP_NAN);
74
75 return (0);
76}
diff --git a/src/regress/lib/libc/fread/Makefile b/src/regress/lib/libc/fread/Makefile
deleted file mode 100644
index fddc3b853a..0000000000
--- a/src/regress/lib/libc/fread/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2018/12/16 15:36:27 millert Exp $
2
3PROG= fread
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/fread/fread.c b/src/regress/lib/libc/fread/fread.c
deleted file mode 100644
index 84e0ba0f65..0000000000
--- a/src/regress/lib/libc/fread/fread.c
+++ /dev/null
@@ -1,153 +0,0 @@
1/*
2 * Copyright (c) 2018 Todd C. Miller <millert@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <sys/socket.h>
18#include <sys/wait.h>
19
20#include <err.h>
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <unistd.h>
25
26/*
27 * Test reading from a socket until EOF with multiple writes on
28 * the other end. The send and receive buffer sizes are reduced
29 * to force multiple read(2) and write(2) calls to happen.
30 *
31 * Tests unbuffered, line buffered and fully-buffers.
32 *
33 * This test catches bugs in stdio/fread.c revs 1.13 and 1.17.
34 */
35
36static char test_string[] =
37 "Now is the time for all good men to come to the aid of the party\n"
38 "The quick brown fox jumps over the lazy dog\n"
39 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n"
40 "Insert test text here..\n";
41
42static char *
43iomode2str(int iomode)
44{
45 switch (iomode) {
46 case _IOFBF:
47 return "fully buffered";
48 case _IOLBF:
49 return "line buffered";
50 case _IONBF:
51 return "unbuffered";
52 default:
53 return "unknown";
54 }
55}
56
57static void
58dochild(int fd)
59{
60 size_t left;
61 ssize_t nwritten;
62 char *ts = test_string;
63
64 left = strlen(test_string);
65 while (left != 0) {
66 nwritten = write(fd, ts, left);
67 if (nwritten == -1)
68 err(1, "write");
69 left -= nwritten;
70 ts += nwritten;
71 }
72 close(fd);
73 _exit(0);
74}
75
76int
77dotest(int iomode, char *iobuf, size_t iolen)
78{
79 char *ts = test_string;
80 size_t nread, total = 0, off = 0;
81 int sv[2], val;
82 char buf[21];
83 pid_t child;
84 FILE *fp;
85
86 if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1)
87 err(1, "socketpair");
88 val = 16;
89 if (setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)) == -1)
90 err(1, "setsockopt(sv[0], SOL_SOCKET, SO_SNDBUF)");
91 if (setsockopt(sv[0], SOL_SOCKET, SO_RCVBUF, &val, sizeof(val)) == -1)
92 err(1, "setsockopt(sv[0], SOL_SOCKET, SO_RCVBUF)");
93 if (setsockopt(sv[1], SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)) == -1)
94 err(1, "setsockopt(sv[1], SOL_SOCKET, SO_SNDBUF)");
95 if (setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF, &val, sizeof(val)) == -1)
96 err(1, "setsockopt(sv[1], SOL_SOCKET, SO_RCVBUF)");
97
98 if ((fp = fdopen(sv[0], "r")) == NULL)
99 err(1, "fdopen");
100
101 setvbuf(fp, iobuf, iomode, iolen);
102
103 switch ((child = fork())) {
104 case -1:
105 err(1, "fork");
106 case 0:
107 close(sv[0]);
108 dochild(sv[1]);
109 default:
110 close(sv[1]);
111 break;
112 }
113
114 while ((nread = fread(buf, 1, sizeof(buf), fp)) != 0) {
115 if (nread > sizeof(buf)) {
116 warnx("%s: max %zu bytes but got %zu",
117 iomode2str(iomode), sizeof(buf), nread);
118 return 1;
119 }
120 if (strncmp(buf, test_string + off, nread) != 0) {
121 warnx("%s: mismatch: expected %.*s, got %.*s",
122 iomode2str(iomode), (int)nread, test_string + off,
123 (int)nread, buf);
124 return 1;
125 }
126 total += nread;
127 off += nread;
128 }
129 if (!feof(fp)) {
130 if (ferror(fp))
131 warn("%s: read error", iomode2str(iomode));
132 else
133 warnx("%s: missing EOF", iomode2str(iomode));
134 return 1;
135 }
136 fclose(fp);
137 waitpid(child, NULL, 0);
138
139 return 0;
140}
141
142int
143main(int argc, char *argv[])
144{
145 char iobuf[4096];
146 int errors = 0;
147
148 errors += dotest(_IOFBF, iobuf, sizeof(iobuf));
149 errors += dotest(_IOLBF, iobuf, sizeof(iobuf));
150 errors += dotest(_IONBF, NULL, 0);
151
152 return errors;
153}
diff --git a/src/regress/lib/libc/gcvt/Makefile b/src/regress/lib/libc/gcvt/Makefile
deleted file mode 100644
index d8efaa9362..0000000000
--- a/src/regress/lib/libc/gcvt/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2010/09/17 19:51:38 millert Exp $
2
3PROG= gcvt_test
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/gcvt/gcvt_test.c b/src/regress/lib/libc/gcvt/gcvt_test.c
deleted file mode 100644
index d687cb8063..0000000000
--- a/src/regress/lib/libc/gcvt/gcvt_test.c
+++ /dev/null
@@ -1,120 +0,0 @@
1/* $OpenBSD: gcvt_test.c,v 1.5 2019/01/25 00:19:26 millert Exp $ */
2
3/*
4 * Public domain, 2010, Todd C. Miller <millert@openbsd.org>
5 */
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10
11static struct test_vector {
12 double d;
13 int ndig;
14 char *expect;
15} test_vectors[] = {
16 /* adapted from perl's Configure test */
17 { 0.1, 8, "0.1" },
18 { 0.01, 8, "0.01" },
19 { 0.001, 8, "0.001" },
20 { 0.0001, 8, "0.0001" },
21 { 0.00009, 8, "9e-05" },
22 { 1.0, 8, "1" },
23 { 1.1, 8, "1.1" },
24 { 1.01, 8, "1.01" },
25 { 1.001, 8, "1.001" },
26 { 1.0001, 8, "1.0001" },
27 { 1.00001, 8, "1.00001" },
28 { 1.000001, 8, "1.000001" },
29 { 0.0, 8, "0" },
30 { -1.0, 8, "-1" },
31 { 100000.0, 8, "100000" },
32 { -100000.0, 8, "-100000" },
33 { 123.456, 8, "123.456" },
34 { 1e34, 8, "1e+34" },
35 /* adapted from emx */
36 { 0.0, -1, "0" },
37 { 0.0, 0, "0" },
38 { 0.0, 1, "0" },
39 { 0.0, 2, "0" },
40 { 1.0, -1, "1" },
41 { 1.0, 0, "1" },
42 { 1.0, 2, "1" },
43 { 1.0, 10, "1" },
44 { 1.236, -1, "1.236" },
45 { 1.236, 0, "1" },
46 { 1.236, 1, "1" },
47 { 1.236, 2, "1.2" },
48 { 1.236, 3, "1.24" },
49 { 1.236, 4, "1.236" },
50 { 1.236, 5, "1.236" },
51 { 1.236, 6, "1.236" },
52 { 12.36, -1, "12.36" },
53 { 12.36, 0, "1e+01" },
54 { 12.36, 1, "1e+01" },
55 { 12.36, 2, "12" },
56 { 12.36, 3, "12.4" },
57 { 12.36, 4, "12.36" },
58 { 12.36, 5, "12.36" },
59 { 12.36, 6, "12.36" },
60 { 123.6, -1, "123.6" },
61 { 123.6, 0, "1e+02" },
62 { 123.6, 1, "1e+02" },
63 { 123.6, 2, "1.2e+02" },
64 { 123.6, 3, "124" },
65 { 123.6, 4, "123.6" },
66 { 123.6, 5, "123.6" },
67 { 123.6, 6, "123.6" },
68 { 1236.0, -1, "1236" },
69 { 1236.0, 0, "1e+03" },
70 { 1236.0, 1, "1e+03" },
71 { 1236.0, 2, "1.2e+03" },
72 { 1236.0, 3, "1.24e+03" },
73 { 1236.0, 4, "1236" },
74 { 1236.0, 5, "1236" },
75 { 1236.0, 6, "1236" },
76 { 1e100, 10, "1e+100" },
77 { 1e100, 20, "1.0000000000000000159e+100" },
78 { 0.01236, -1, "0.01236" },
79 { 0.01236, 0, "0.01" },
80 { 0.01236, 1, "0.01" },
81 { 0.01236, 2, "0.012" },
82 { 0.01236, 3, "0.0124" },
83 { 0.01236, 4, "0.01236" },
84 { 1e-100, 20, "1.00000000000000002e-100" },
85 { 1e-100, -1, "1e-100" },
86 { -1.2, 5, "-1.2" },
87 { -0.03, 5, "-0.03" },
88 { 0.1, 1, "0.1" },
89 { 0.1, 0, "0.1" },
90 { 0.099999, 10, "0.099999" },
91 { 0.99999, 10, "0.99999" },
92};
93
94#define NTESTVEC (sizeof(test_vectors) / sizeof(test_vectors[0]))
95
96static int
97dotest(struct test_vector *tv)
98{
99 char buf[256], *got;
100
101 got = gcvt(tv->d, tv->ndig, buf);
102 if (strcmp(tv->expect, got) != 0) {
103 fprintf(stderr, "%g @ %d: expected %s, got %s\n",
104 tv->d, tv->ndig, tv->expect, got);
105 return 1;
106 }
107 return 0;
108}
109
110int
111main(int argc, char *argv[])
112{
113 int i, failures = 0;
114
115 for (i = 0; i < NTESTVEC; i++) {
116 failures += dotest(&test_vectors[i]);
117 }
118
119 return failures;
120}
diff --git a/src/regress/lib/libc/getaddrinfo/Makefile b/src/regress/lib/libc/getaddrinfo/Makefile
deleted file mode 100644
index 7a78438a12..0000000000
--- a/src/regress/lib/libc/getaddrinfo/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
1# $OpenBSD: Makefile,v 1.5 2017/07/27 17:43:24 bluhm Exp $
2
3PROG = gaitest
4CLEANFILES = out
5
6run-regress-${PROG}: ${PROG}
7 sh ${.CURDIR}/testsuite.sh >out 2>&1
8 diff -u10 out ${.CURDIR}/answer
9
10.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/getaddrinfo/answer b/src/regress/lib/libc/getaddrinfo/answer
deleted file mode 100644
index af6d069bbe..0000000000
--- a/src/regress/lib/libc/getaddrinfo/answer
+++ /dev/null
@@ -1,110 +0,0 @@
1== basic ones
2arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv http
3ai1: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 80
4arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv http
5ai1: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 80
6arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv http
7ai1: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 80
8ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 80
9arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv tftp
10ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 69
11arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv tftp
12ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 69
13arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv tftp
14ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 69
15ai2: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 69
16arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv echo
17ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 7
18ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 7
19arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv echo
20ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 7
21ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 7
22arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv echo
23ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 7
24ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 7
25ai3: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 7
26ai4: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 7
27
28== specific address family
29arg: flags 0x2 family 2 socktype 0 protocol 0 addrlen 0 host localhost serv http
30ai1: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 80
31arg: flags 0x2 family 24 socktype 0 protocol 0 addrlen 0 host localhost serv http
32ai1: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 80
33
34== empty hostname
35arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv http
36ai1: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 80
37ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 80
38arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv echo
39ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 7
40ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 7
41ai3: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 7
42ai4: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 7
43arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv tftp
44ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 69
45ai2: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 69
46arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv 80
47ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 80
48ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 80
49ai3: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 80
50ai4: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 80
51arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv http
52ai1: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv 80
53ai2: flags 0x3 family 24 socktype 1 protocol 6 addrlen 28 host :: serv 80
54arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv echo
55ai1: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv 7
56ai2: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv 7
57ai3: flags 0x3 family 24 socktype 2 protocol 17 addrlen 28 host :: serv 7
58ai4: flags 0x3 family 24 socktype 1 protocol 6 addrlen 28 host :: serv 7
59arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv tftp
60ai1: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv 69
61ai2: flags 0x3 family 24 socktype 2 protocol 17 addrlen 28 host :: serv 69
62arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv 80
63ai1: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv 80
64ai2: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv 80
65ai3: flags 0x3 family 24 socktype 2 protocol 17 addrlen 28 host :: serv 80
66ai4: flags 0x3 family 24 socktype 1 protocol 6 addrlen 28 host :: serv 80
67arg: flags 0x2 family 0 socktype 1 protocol 0 addrlen 0 host (empty) serv 80
68ai1: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 80
69ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 80
70arg: flags 0x2 family 0 socktype 2 protocol 0 addrlen 0 host (empty) serv 80
71ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 80
72ai2: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 80
73
74== empty servname
75arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv (empty)
76ai1: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 0
77ai2: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 0
78arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv (empty)
79ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 0
80ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 0
81arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv (empty)
82ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 0
83ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 0
84ai3: flags 0x2 family 24 socktype 2 protocol 17 addrlen 28 host ::1 serv 0
85ai4: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host ::1 serv 0
86arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv (empty)
87name or service is not known
88
89== sock_raw
90arg: flags 0x2 family 0 socktype 3 protocol 0 addrlen 0 host localhost serv (empty)
91ai1: flags 0x2 family 2 socktype 3 protocol 0 addrlen 16 host 127.0.0.1 serv 0
92ai2: flags 0x2 family 24 socktype 3 protocol 0 addrlen 28 host ::1 serv 0
93arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv (empty)
94ai1: flags 0x2 family 2 socktype 3 protocol 59 addrlen 16 host 127.0.0.1 serv 0
95ai2: flags 0x2 family 24 socktype 3 protocol 59 addrlen 28 host ::1 serv 0
96arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv 80
97service not supported for ai_socktype
98arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv www
99service not supported for ai_socktype
100arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host ::1 serv (empty)
101ai1: flags 0x2 family 24 socktype 3 protocol 59 addrlen 28 host ::1 serv 0
102
103== unsupported family
104arg: flags 0x2 family 99 socktype 0 protocol 0 addrlen 0 host localhost serv (empty)
105ai_family not supported
106
107== the following items are specified in jinmei scopeaddr format doc.
108arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host fe80::1%lo0 serv http
109ai1: flags 0x2 family 24 socktype 1 protocol 6 addrlen 28 host fe80::1%lo0 serv 80
110
diff --git a/src/regress/lib/libc/getaddrinfo/gaitest.c b/src/regress/lib/libc/getaddrinfo/gaitest.c
deleted file mode 100644
index 12a4498459..0000000000
--- a/src/regress/lib/libc/getaddrinfo/gaitest.c
+++ /dev/null
@@ -1,195 +0,0 @@
1/* $OpenBSD: gaitest.c,v 1.6 2009/06/09 18:15:08 phessler Exp $ */
2/* $NetBSD: gaitest.c,v 1.3 2002/07/05 15:47:43 itojun Exp $ */
3
4/*
5 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, and 2002 WIDE Project.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the project nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33/*
34 * Please note: the order of the responses (and the regress test)
35 * is dependent on the "family" keywords in resolv.conf.
36 *
37 * This expects the default behaviour of "family inet4 inet6"
38 */
39
40#include <sys/types.h>
41#include <sys/socket.h>
42#include <netinet/in.h>
43#include <arpa/inet.h>
44#include <netdb.h>
45#include <stdio.h>
46#include <stdlib.h>
47#include <string.h>
48#include <unistd.h>
49
50struct addrinfo ai;
51
52char host[NI_MAXHOST];
53char serv[NI_MAXSERV];
54int vflag = 0;
55
56static void usage(void);
57static void print1(const char *, const struct addrinfo *, char *, char *);
58int main(int, char *[]);
59
60static void
61usage()
62{
63 fprintf(stderr, "usage: test [-f family] [-s socktype] [-p proto] [-DPRSv46] host serv\n");
64}
65
66static void
67print1(title, res, h, s)
68 const char *title;
69 const struct addrinfo *res;
70 char *h;
71 char *s;
72{
73 char *start, *end;
74 int error;
75 const int niflag = NI_NUMERICHOST | NI_NUMERICSERV;
76
77 if (res->ai_addr) {
78 error = getnameinfo(res->ai_addr, res->ai_addr->sa_len,
79 host, sizeof(host), serv, sizeof(serv),
80 niflag);
81 h = host;
82 s = serv;
83 } else
84 error = 0;
85
86 if (vflag) {
87 start = "\t";
88 end = "\n";
89 } else {
90 start = " ";
91 end = "";
92 }
93 printf("%s%s", title, end);
94 printf("%sflags 0x%x%s", start, res->ai_flags, end);
95 printf("%sfamily %d%s", start, res->ai_family, end);
96 printf("%ssocktype %d%s", start, res->ai_socktype, end);
97 printf("%sprotocol %d%s", start, res->ai_protocol, end);
98 printf("%saddrlen %d%s", start, res->ai_addrlen, end);
99 if (error)
100 printf("%serror %d%s", start, error, end);
101 else {
102 printf("%shost %s%s", start, h, end);
103 printf("%sserv %s%s", start, s, end);
104 }
105#if 0
106 if (res->ai_canonname)
107 printf("%scname \"%s\"%s", start, res->ai_canonname, end);
108#endif
109 if (!vflag)
110 printf("\n");
111
112}
113
114int
115main(argc, argv)
116 int argc;
117 char *argv[];
118{
119 struct addrinfo *res;
120 int error, i;
121 char *p, *q;
122 extern int optind;
123 extern char *optarg;
124 int c;
125 char nbuf[10];
126
127 memset(&ai, 0, sizeof(ai));
128 ai.ai_family = PF_UNSPEC;
129 ai.ai_flags |= AI_CANONNAME;
130 while ((c = getopt(argc, argv, "Df:p:PRs:Sv46")) != -1) {
131 switch (c) {
132 case 'D':
133 ai.ai_socktype = SOCK_DGRAM;
134 break;
135 case 'f':
136 ai.ai_family = atoi(optarg);
137 break;
138 case 'p':
139 ai.ai_protocol = atoi(optarg);
140 break;
141 case 'P':
142 ai.ai_flags |= AI_PASSIVE;
143 break;
144 case 'R':
145 ai.ai_socktype = SOCK_RAW;
146 break;
147 case 's':
148 ai.ai_socktype = atoi(optarg);
149 break;
150 case 'S':
151 ai.ai_socktype = SOCK_STREAM;
152 break;
153 case 'v':
154 vflag++;
155 break;
156 case '4':
157 ai.ai_family = PF_INET;
158 break;
159 case '6':
160 ai.ai_family = PF_INET6;
161 break;
162 default:
163 usage();
164 exit(1);
165 }
166 }
167 argc -= optind;
168 argv += optind;
169
170 if (argc != 2){
171 usage();
172 exit(1);
173 }
174
175 p = *argv[0] ? argv[0] : NULL;
176 q = *argv[1] ? argv[1] : NULL;
177
178 print1("arg:", &ai, p ? p : "(empty)", q ? q : "(empty)");
179
180 error = getaddrinfo(p, q, &ai, &res);
181 if (error) {
182 printf("%s\n", gai_strerror(error));
183 exit(1);
184 }
185
186 i = 1;
187 do {
188 snprintf(nbuf, sizeof(nbuf), "ai%d:", i);
189 print1(nbuf, res, NULL, NULL);
190
191 i++;
192 } while ((res = res->ai_next) != NULL);
193
194 exit(0);
195}
diff --git a/src/regress/lib/libc/getaddrinfo/testsuite.sh b/src/regress/lib/libc/getaddrinfo/testsuite.sh
deleted file mode 100644
index 1e4e524054..0000000000
--- a/src/regress/lib/libc/getaddrinfo/testsuite.sh
+++ /dev/null
@@ -1,89 +0,0 @@
1# $OpenBSD: testsuite.sh,v 1.1 2002/07/05 15:54:30 itojun Exp $
2# $NetBSD: testsuite.sh,v 1.3 2002/07/05 15:49:11 itojun Exp $
3
4#
5# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, and 2002 WIDE Project.
6# All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11# 1. Redistributions of source code must retain the above copyright
12# notice, this list of conditions and the following disclaimer.
13# 2. Redistributions in binary form must reproduce the above copyright
14# notice, this list of conditions and the following disclaimer in the
15# documentation and/or other materials provided with the distribution.
16# 3. Neither the name of the project nor the names of its contributors
17# may be used to endorse or promote products derived from this software
18# without specific prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23# ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30# SUCH DAMAGE.
31#
32
33TEST=./gaitest
34#TEST='./test -v'
35#IF=`ifconfig -a | grep -v '^ ' | sed -e 's/:.*//' | head -1 | awk '{print $1}'`
36
37echo '== basic ones'
38$TEST ::1 http
39$TEST 127.0.0.1 http
40$TEST localhost http
41$TEST ::1 tftp
42$TEST 127.0.0.1 tftp
43$TEST localhost tftp
44$TEST ::1 echo
45$TEST 127.0.0.1 echo
46$TEST localhost echo
47echo
48
49echo '== specific address family'
50$TEST -4 localhost http
51$TEST -6 localhost http
52echo
53
54echo '== empty hostname'
55$TEST '' http
56$TEST '' echo
57$TEST '' tftp
58$TEST '' 80
59$TEST -P '' http
60$TEST -P '' echo
61$TEST -P '' tftp
62$TEST -P '' 80
63$TEST -S '' 80
64$TEST -D '' 80
65echo
66
67echo '== empty servname'
68$TEST ::1 ''
69$TEST 127.0.0.1 ''
70$TEST localhost ''
71$TEST '' ''
72echo
73
74echo '== sock_raw'
75$TEST -R -p 0 localhost ''
76$TEST -R -p 59 localhost ''
77$TEST -R -p 59 localhost 80
78$TEST -R -p 59 localhost www
79$TEST -R -p 59 ::1 ''
80echo
81
82echo '== unsupported family'
83$TEST -f 99 localhost ''
84echo
85
86echo '== the following items are specified in jinmei scopeaddr format doc.'
87$TEST fe80::1%lo0 http
88#$TEST fe80::1%$IF http
89echo
diff --git a/src/regress/lib/libc/getcap/Makefile b/src/regress/lib/libc/getcap/Makefile
deleted file mode 100644
index 7b7ae394ff..0000000000
--- a/src/regress/lib/libc/getcap/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2009/06/09 18:16:40 phessler Exp $
2
3PROG= getcaptest
4
5REGRESS_TARGETS=shortcap
6
7shortcap: getcaptest
8 ./getcaptest ${.CURDIR}/shortcap.in
9
10.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/getcap/getcaptest.c b/src/regress/lib/libc/getcap/getcaptest.c
deleted file mode 100644
index 0f4464b6c5..0000000000
--- a/src/regress/lib/libc/getcap/getcaptest.c
+++ /dev/null
@@ -1,26 +0,0 @@
1/* $OpenBSD: getcaptest.c,v 1.1 2006/03/10 05:28:57 ray Exp $ */
2
3/*
4 * Written by Raymond Lai <ray@cyth.net>.
5 * Public domain.
6 */
7
8#include <stdio.h>
9#include <stdlib.h>
10
11int
12main(int argc, char *argv[])
13{
14 char *buf, *db_array[2];
15
16 if (argc != 2)
17 return (1);
18
19 db_array[0] = argv[1];
20 db_array[1] = NULL;
21
22 while (cgetnext(&buf, db_array) > 0)
23 puts(buf);
24
25 return (0);
26}
diff --git a/src/regress/lib/libc/getcap/shortcap.in b/src/regress/lib/libc/getcap/shortcap.in
deleted file mode 100644
index 573541ac97..0000000000
--- a/src/regress/lib/libc/getcap/shortcap.in
+++ /dev/null
@@ -1 +0,0 @@
10
diff --git a/src/regress/lib/libc/getopt_long/Makefile b/src/regress/lib/libc/getopt_long/Makefile
deleted file mode 100644
index 13a187e190..0000000000
--- a/src/regress/lib/libc/getopt_long/Makefile
+++ /dev/null
@@ -1,32 +0,0 @@
1# $OpenBSD: Makefile,v 1.4 2002/12/08 19:25:08 millert Exp $
2
3NOMAN=
4PROG=getopt_long_test
5CLEANFILES+=test.out
6
7# test getopt_long and getopt_long_only
8run-regress-${PROG}: ${PROG}
9 @( test -n "$$POSIXLY_CORRECT" && unset POSIXLY_CORRECT; \
10 test -n "$$LONG_ONLY" && unset LONG_ONLY; \
11 ./${PROG} myfile --force -f infile -9 ; \
12 ./${PROG} onefile twofile --best -Williterate -i foo.in threefile ; \
13 ./${PROG} -1bfast - ; \
14 ./${PROG} --fast --drinking=guiness -i foo.in somefile ; \
15 export POSIXLY_CORRECT=1 ; \
16 ./${PROG} myfile --force -f infile -9 ; \
17 ./${PROG} onefile twofile --best -Williterate -i foo.in threefile ; \
18 ./${PROG} -1bfast - ; \
19 ./${PROG} --fast --drinking=guiness -i foo.in somefile ; \
20 unset POSIXLY_CORRECT ; export LONG_ONLY=1 ; \
21 ./${PROG} myfile -force -f infile -9 ; \
22 ./${PROG} onefile twofile -best -Williterate -i foo.in threefile ; \
23 ./${PROG} -1bfast - ; \
24 ./${PROG} --fast -drinking=guiness -i foo.in somefile ; \
25 export POSIXLY_CORRECT=1 ; \
26 ./${PROG} myfile -force -f infile -9 ; \
27 ./${PROG} onefile twofile -best -Williterate -i foo.in threefile ; \
28 ./${PROG} -1bfast - ; \
29 ./${PROG} --fast -drinking=guiness -i foo.in somefile ) >test.out 2>&1
30 cmp -s ${.OBJDIR}/test.out ${.CURDIR}/test.ok
31
32.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/getopt_long/getopt_long_test.c b/src/regress/lib/libc/getopt_long/getopt_long_test.c
deleted file mode 100644
index 9e32f94501..0000000000
--- a/src/regress/lib/libc/getopt_long/getopt_long_test.c
+++ /dev/null
@@ -1,114 +0,0 @@
1/*
2 * Copyright (c) 2002 Todd C. Miller <millert@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 *
16 * Sponsored in part by the Defense Advanced Research Projects
17 * Agency (DARPA) and Air Force Research Laboratory, Air Force
18 * Materiel Command, USAF, under agreement number F39502-99-1-0512.
19 */
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <getopt.h>
24
25/*
26 * Simple getopt_long() and getopt_long_only() excerciser.
27 * ENVIRONMENT:
28 * LONG_ONLY : use getopt_long_only() (default is getopt_long())
29 * POSIXLY_CORRECT : don't permute args
30 */
31
32int
33main(int argc, char **argv)
34{
35 int ch, idx, goggles;
36 int (*gl)(int, char * const *, const char *, const struct option *, int *);
37 struct option longopts[] = {
38 { "force", no_argument, 0, 0 },
39 { "fast", no_argument, 0, '1' },
40 { "best", no_argument, 0, '9' },
41 { "input", required_argument, 0, 'i' },
42 { "illiterate", no_argument, 0, 0 },
43 { "drinking", required_argument, &goggles, 42 },
44 { "help", no_argument, 0, 'h' },
45 { 0, 0, 0, 0 },
46 };
47
48 if (getenv("LONG_ONLY")) {
49 gl = getopt_long_only;
50 printf("getopt_long_only");
51 } else {
52 gl = getopt_long;
53 printf("getopt_long");
54 }
55 if (getenv("POSIXLY_CORRECT"))
56 printf(" (POSIXLY_CORRECT)");
57 printf(": ");
58 for (idx = 1; idx < argc; idx++)
59 printf("%s ", argv[idx]);
60 printf("\n");
61
62 goggles = 0;
63 for (;;) {
64 idx = -1;
65 ch = gl(argc, argv, "19bf:i:hW;-", longopts, &idx);
66 if (ch == -1)
67 break;
68 switch (ch) {
69 case 0:
70 case '1':
71 case '9':
72 case 'h':
73 case 'b':
74 case '-':
75 if (idx != -1) {
76 if (goggles == 42)
77 printf("option %s, arg %s\n",
78 longopts[idx].name, optarg);
79 else
80 printf("option %s\n",
81 longopts[idx].name);
82 } else
83 printf("option %c\n", ch);
84 break;
85 case 'f':
86 case 'i':
87 if (idx != -1)
88 printf("option %s, arg %s\n",
89 longopts[idx].name, optarg);
90 else
91 printf("option %c, arg %s\n", ch, optarg);
92 break;
93
94 case '?':
95 break;
96
97 default:
98 printf("unexpected return value: %c\n", ch);
99 break;
100 }
101 }
102 argc -= optind;
103 argv += optind;
104
105 if (argc > 0) {
106 printf("remaining ARGV: ");
107 while (argc--)
108 printf("%s ", *argv++);
109 printf("\n");
110 }
111 printf("\n");
112
113 exit (0);
114}
diff --git a/src/regress/lib/libc/getopt_long/test.ok b/src/regress/lib/libc/getopt_long/test.ok
deleted file mode 100644
index 9782087f40..0000000000
--- a/src/regress/lib/libc/getopt_long/test.ok
+++ /dev/null
@@ -1,84 +0,0 @@
1getopt_long: myfile --force -f infile -9
2option force
3option f, arg infile
4option 9
5remaining ARGV: myfile
6
7getopt_long: onefile twofile --best -Williterate -i foo.in threefile
8option best
9option illiterate
10option i, arg foo.in
11remaining ARGV: onefile twofile threefile
12
13getopt_long: -1bfast -
14option 1
15option b
16option f, arg ast
17option -
18
19getopt_long: --fast --drinking=guiness -i foo.in somefile
20option fast
21option drinking, arg guiness
22option i, arg foo.in
23remaining ARGV: somefile
24
25getopt_long (POSIXLY_CORRECT): myfile --force -f infile -9
26remaining ARGV: myfile --force -f infile -9
27
28getopt_long (POSIXLY_CORRECT): onefile twofile --best -Williterate -i foo.in threefile
29remaining ARGV: onefile twofile --best -Williterate -i foo.in threefile
30
31getopt_long (POSIXLY_CORRECT): -1bfast -
32option 1
33option b
34option f, arg ast
35option -
36
37getopt_long (POSIXLY_CORRECT): --fast --drinking=guiness -i foo.in somefile
38option fast
39option drinking, arg guiness
40option i, arg foo.in
41remaining ARGV: somefile
42
43getopt_long_only: myfile -force -f infile -9
44option force
45option f, arg infile
46option 9
47remaining ARGV: myfile
48
49getopt_long_only: onefile twofile -best -Williterate -i foo.in threefile
50option best
51option illiterate
52option i, arg foo.in
53remaining ARGV: onefile twofile threefile
54
55getopt_long_only: -1bfast -
56option 1
57option b
58option fast
59option -
60
61getopt_long_only: --fast -drinking=guiness -i foo.in somefile
62option fast
63option drinking, arg guiness
64option i, arg foo.in
65remaining ARGV: somefile
66
67getopt_long_only (POSIXLY_CORRECT): myfile -force -f infile -9
68remaining ARGV: myfile -force -f infile -9
69
70getopt_long_only (POSIXLY_CORRECT): onefile twofile -best -Williterate -i foo.in threefile
71remaining ARGV: onefile twofile -best -Williterate -i foo.in threefile
72
73getopt_long_only (POSIXLY_CORRECT): -1bfast -
74option 1
75option b
76option fast
77option -
78
79getopt_long_only (POSIXLY_CORRECT): --fast -drinking=guiness -i foo.in somefile
80option fast
81option drinking, arg guiness
82option i, arg foo.in
83remaining ARGV: somefile
84
diff --git a/src/regress/lib/libc/glob/Makefile b/src/regress/lib/libc/glob/Makefile
deleted file mode 100644
index b3f9567833..0000000000
--- a/src/regress/lib/libc/glob/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
1# $OpenBSD: Makefile,v 1.4 2011/05/01 04:25:40 guenther Exp $
2
3PROG= globtest
4
5run-regress-${PROG}:
6 mkdir -m 755 -p `sed 's@/[^/]*$$@@' ${.CURDIR}/files | sort -u`
7 umask 022; touch `cat ${.CURDIR}/files`
8 chmod 0755 `grep '/r[^/]*$$' ${.CURDIR}/files`
9 chmod 0444 `grep '/s[^/]*$$' ${.CURDIR}/files`
10 chmod 0711 `grep '/t[^/]*$$' ${.CURDIR}/files`
11 ./${PROG} ${.CURDIR}/${PROG}.in
12
13clean:
14 rm -rf fake ${PROG} ${OBJS} *.core
15
16.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/glob/files b/src/regress/lib/libc/glob/files
deleted file mode 100644
index c5e92aacd5..0000000000
--- a/src/regress/lib/libc/glob/files
+++ /dev/null
@@ -1,47 +0,0 @@
1fake/bin/[
2fake/bin/cat
3fake/bin/chgrp
4fake/bin/chio
5fake/bin/chmod
6fake/bin/cksum
7fake/bin/cp
8fake/bin/cpio
9fake/bin/csh
10fake/bin/date
11fake/bin/dd
12fake/bin/df
13fake/bin/domainname
14fake/bin/echo
15fake/bin/ed
16fake/bin/eject
17fake/bin/expr
18fake/bin/hostname
19fake/bin/kill
20fake/bin/ksh
21fake/bin/ln
22fake/bin/ls
23fake/bin/md5
24fake/bin/mkdir
25fake/bin/mt
26fake/bin/mv
27fake/bin/pax
28fake/bin/ps
29fake/bin/pwd
30fake/bin/rcp
31fake/bin/rksh
32fake/bin/rm
33fake/bin/rmail
34fake/bin/rmd160
35fake/bin/rmdir
36fake/bin/sh
37fake/bin/sha1
38fake/bin/sha256
39fake/bin/sha384
40fake/bin/sha512
41fake/bin/sleep
42fake/bin/stty
43fake/bin/sum
44fake/bin/sync
45fake/bin/systrace
46fake/bin/tar
47fake/bin/test
diff --git a/src/regress/lib/libc/glob/globtest.c b/src/regress/lib/libc/glob/globtest.c
deleted file mode 100644
index 1f6037d5bc..0000000000
--- a/src/regress/lib/libc/glob/globtest.c
+++ /dev/null
@@ -1,142 +0,0 @@
1/* $OpenBSD: globtest.c,v 1.4 2019/01/25 00:19:26 millert Exp $ */
2
3/*
4 * Public domain, 2008, Todd C. Miller <millert@openbsd.org>
5 */
6
7#include <err.h>
8#include <glob.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12
13#define MAX_RESULTS 256
14
15struct gl_entry {
16 int flags;
17 int nresults;
18 char pattern[1024];
19 char *results[MAX_RESULTS];
20 mode_t modes[MAX_RESULTS];
21};
22
23int test_glob(struct gl_entry *);
24
25int
26main(int argc, char **argv)
27{
28 FILE *fp = stdin;
29 char *buf, *cp;
30 int errors = 0, lineno, mode;
31 struct gl_entry entry;
32 size_t len;
33
34 if (argc > 1) {
35 if ((fp = fopen(argv[1], "r")) == NULL)
36 err(1, "%s", argv[1]);
37 }
38
39 /*
40 * Read in test file, which is formatted thusly:
41 *
42 * [pattern] <flags>
43 * result1 [mode]
44 * result2 [mode]
45 * result3 [mode]
46 * ...
47 *
48 */
49 lineno = 0;
50 memset(&entry, 0, sizeof(entry));
51 while ((buf = fgetln(fp, &len)) != NULL) {
52 lineno++;
53 if (buf[len - 1] != '\n')
54 errx(1, "missing newline at EOF");
55 buf[--len] = '\0';
56 if (len == 0)
57 continue; /* blank line */
58
59 if (buf[0] == '[') {
60 /* check previous pattern */
61 if (entry.pattern[0])
62 errors += test_glob(&entry);
63
64 /* start new entry */
65 if ((cp = strrchr(buf + 1, ']')) == NULL)
66 errx(1, "invalid entry on line %d", lineno);
67 len = cp - buf - 1;
68 if (len >= sizeof(entry.pattern))
69 errx(1, "pattern too big on line %d", lineno);
70 memcpy(entry.pattern, buf + 1, len);
71 entry.pattern[len] = '\0';
72
73 buf = cp + 2;
74 if (*buf++ != '<')
75 errx(1, "invalid entry on line %d", lineno);
76 if ((cp = strchr(buf, '>')) == NULL)
77 errx(1, "invalid entry on line %d", lineno);
78 entry.flags = (int)strtol(buf, &cp, 0);
79 if (*cp != '>' || entry.flags < 0 || entry.flags > 0x4000)
80 errx(1, "invalid flags: %s", buf);
81 entry.nresults = 0;
82 continue;
83 }
84 if (!entry.pattern[0])
85 errx(1, "missing entry on line %d", lineno);
86
87 if (entry.nresults + 1 > MAX_RESULTS) {
88 errx(1, "too many results for %s, max %d",
89 entry.pattern, MAX_RESULTS);
90 }
91 if ((cp = strchr(buf, ' ')) != NULL) {
92 *cp++ = '\0';
93 mode = strtol(cp, NULL, 8);
94 } else
95 mode = -1;
96 entry.modes[entry.nresults] = (mode_t)mode;
97 entry.results[entry.nresults++] = strdup(buf);
98 }
99 if (entry.pattern[0])
100 errors += test_glob(&entry); /* test last pattern */
101 exit(errors);
102}
103
104int test_glob(struct gl_entry *entry)
105{
106 glob_t gl;
107 int i = 0;
108
109 if (glob(entry->pattern, entry->flags, NULL, &gl) != 0)
110 errx(1, "glob failed: %s", entry->pattern);
111
112 if (gl.gl_matchc != entry->nresults)
113 goto mismatch;
114
115 for (i = 0; i < gl.gl_matchc; i++) {
116 if (strcmp(gl.gl_pathv[i], entry->results[i]) != 0)
117 goto mismatch;
118 if ((entry->flags & GLOB_KEEPSTAT) != 0) {
119 if (entry->modes[i] == -1 ||
120 gl.gl_statv[i] == NULL ||
121 entry->modes[i] != gl.gl_statv[i]->st_mode)
122 goto badmode;
123 }
124 free(entry->results[i]);
125 }
126 return (0);
127 badmode:
128 warnx("mismatch mode for pattern %s, flags 0x%x, file \"%s\" "
129 "(found %07o, expected %07o)", entry->pattern, entry->flags,
130 gl.gl_pathv[i], gl.gl_statv[i] ? gl.gl_statv[i]->st_mode : 0,
131 entry->modes[i]);
132 goto cleanup;
133 mismatch:
134 warnx("mismatch for pattern %s, flags 0x%x "
135 "(found \"%s\", expected \"%s\")", entry->pattern, entry->flags,
136 gl.gl_pathv[i], entry->results[i]);
137 cleanup:
138 while (i < gl.gl_matchc) {
139 free(entry->results[i++]);
140 }
141 return (1);
142}
diff --git a/src/regress/lib/libc/glob/globtest.in b/src/regress/lib/libc/glob/globtest.in
deleted file mode 100644
index 2ae3b4dfb2..0000000000
--- a/src/regress/lib/libc/glob/globtest.in
+++ /dev/null
@@ -1,116 +0,0 @@
1[fake/bin/[[:alpha:]]*] <0x0>
2fake/bin/cat
3fake/bin/chgrp
4fake/bin/chio
5fake/bin/chmod
6fake/bin/cksum
7fake/bin/cp
8fake/bin/cpio
9fake/bin/csh
10fake/bin/date
11fake/bin/dd
12fake/bin/df
13fake/bin/domainname
14fake/bin/echo
15fake/bin/ed
16fake/bin/eject
17fake/bin/expr
18fake/bin/hostname
19fake/bin/kill
20fake/bin/ksh
21fake/bin/ln
22fake/bin/ls
23fake/bin/md5
24fake/bin/mkdir
25fake/bin/mt
26fake/bin/mv
27fake/bin/pax
28fake/bin/ps
29fake/bin/pwd
30fake/bin/rcp
31fake/bin/rksh
32fake/bin/rm
33fake/bin/rmail
34fake/bin/rmd160
35fake/bin/rmdir
36fake/bin/sh
37fake/bin/sha1
38fake/bin/sha256
39fake/bin/sha384
40fake/bin/sha512
41fake/bin/sleep
42fake/bin/stty
43fake/bin/sum
44fake/bin/sync
45fake/bin/systrace
46fake/bin/tar
47fake/bin/test
48
49[fake/bin/[[:alpha:]]*] <0x4000>
50fake/bin/cat 0100644
51fake/bin/chgrp 0100644
52fake/bin/chio 0100644
53fake/bin/chmod 0100644
54fake/bin/cksum 0100644
55fake/bin/cp 0100644
56fake/bin/cpio 0100644
57fake/bin/csh 0100644
58fake/bin/date 0100644
59fake/bin/dd 0100644
60fake/bin/df 0100644
61fake/bin/domainname 0100644
62fake/bin/echo 0100644
63fake/bin/ed 0100644
64fake/bin/eject 0100644
65fake/bin/expr 0100644
66fake/bin/hostname 0100644
67fake/bin/kill 0100644
68fake/bin/ksh 0100644
69fake/bin/ln 0100644
70fake/bin/ls 0100644
71fake/bin/md5 0100644
72fake/bin/mkdir 0100644
73fake/bin/mt 0100644
74fake/bin/mv 0100644
75fake/bin/pax 0100644
76fake/bin/ps 0100644
77fake/bin/pwd 0100644
78fake/bin/rcp 0100755
79fake/bin/rksh 0100755
80fake/bin/rm 0100755
81fake/bin/rmail 0100755
82fake/bin/rmd160 0100755
83fake/bin/rmdir 0100755
84fake/bin/sh 0100444
85fake/bin/sha1 0100444
86fake/bin/sha256 0100444
87fake/bin/sha384 0100444
88fake/bin/sha512 0100444
89fake/bin/sleep 0100444
90fake/bin/stty 0100444
91fake/bin/sum 0100444
92fake/bin/sync 0100444
93fake/bin/systrace 0100444
94fake/bin/tar 0100711
95fake/bin/test 0100711
96
97[fake/bin/rm{,dir,ail}] <0x80>
98fake/bin/rm
99fake/bin/rmdir
100fake/bin/rmail
101
102[fake/bin/sha[[:digit:]]] <0x0>
103fake/bin/sha1
104
105[fake/bin/sha[[:digit:]]*] <0x0>
106fake/bin/sha1
107fake/bin/sha256
108fake/bin/sha384
109fake/bin/sha512
110
111[fake/bin/ca[a-z]] <0x0>
112fake/bin/cat
113
114[fake/b[a-z]*] <0x4000>
115fake/bin 0040755
116
diff --git a/src/regress/lib/libc/hsearch/Makefile b/src/regress/lib/libc/hsearch/Makefile
deleted file mode 100644
index cddc8ac0c4..0000000000
--- a/src/regress/lib/libc/hsearch/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2004/06/24 04:33:07 millert Exp $
2
3PROG= hsearchtest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/hsearch/hsearchtest.c b/src/regress/lib/libc/hsearch/hsearchtest.c
deleted file mode 100644
index 8659ef7e77..0000000000
--- a/src/regress/lib/libc/hsearch/hsearchtest.c
+++ /dev/null
@@ -1,122 +0,0 @@
1/* $OpenBSD: hsearchtest.c,v 1.2 2009/10/27 23:59:32 deraadt Exp $ */
2/* $NetBSD: hsearchtest.c,v 1.5 2003/07/26 19:38:46 salo Exp $ */
3
4/*
5 * Copyright (c) 2001 Christopher G. Demetriou
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed for the
19 * NetBSD Project. See http://www.NetBSD.org/ for
20 * information about NetBSD.
21 * 4. The name of the author may not be used to endorse or promote products
22 * derived from this software without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 *
35 * <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>>
36 */
37
38/*
39 * Test program for hsearch() et al.
40 */
41
42#include <search.h>
43#include <stdlib.h>
44#include <stdio.h>
45#include <string.h>
46
47#define TEST(e) ((e) ? (void)0 : testfail(__FILE__, __LINE__, #e))
48
49static void
50testfail(const char *file, unsigned long line, const char *expression)
51{
52
53 fprintf(stderr, "TEST FAILED: %s: file %s, line %ld\n",
54 expression, file, line);
55 exit(1);
56}
57
58int
59main(int argc, char *argv[])
60{
61 ENTRY e, *ep, *ep2;
62 int created_ok;
63 char ch[2];
64 int i;
65
66 created_ok = hcreate(16);
67 TEST(created_ok);
68
69 /* ch[1] should be constant from here on down. */
70 ch[1] = '\0';
71
72 /* Basic insertions. Check enough that there'll be collisions. */
73 for (i = 0; i < 26; i++) {
74 ch[0] = 'a' + i;
75 e.key = strdup(ch); /* ptr to provided key is kept! */
76 TEST(e.key != NULL);
77 e.data = (void *)(long)i;
78 ep = hsearch(e, ENTER);
79 TEST(ep != NULL);
80 TEST(strcmp(ep->key, ch) == 0);
81 TEST((long)ep->data == i);
82 }
83
84 /* e.key should be constant from here on down. */
85 e.key = ch;
86
87 /* Basic lookups. */
88 for (i = 0; i < 26; i++) {
89 ch[0] = 'a' + i;
90 ep = hsearch(e, FIND);
91 TEST(ep != NULL);
92 TEST(strcmp(ep->key, ch) == 0);
93 TEST((long)ep->data == i);
94 }
95
96 /* Check duplicate entry. Should _not_ overwrite existing data. */
97 ch[0] = 'a';
98 e.data = (void *)(long)12345;
99 ep = hsearch(e, FIND);
100 TEST(ep != NULL);
101 TEST(strcmp(ep->key, ch) == 0);
102 TEST((long)ep->data == 0);
103
104 /* Check for something that's not there. */
105 ch[0] = 'A';
106 ep = hsearch(e, FIND);
107 TEST(ep == NULL);
108
109 /* Check two at once. */
110 ch[0] = 'a';
111 ep = hsearch(e, FIND);
112 ch[0] = 'b';
113 ep2 = hsearch(e, FIND);
114 TEST(ep != NULL);
115 TEST(strcmp(ep->key, "a") == 0 && (long)ep->data == 0);
116 TEST(ep2 != NULL);
117 TEST(strcmp(ep2->key, "b") == 0 && (long)ep2->data == 1);
118
119 hdestroy();
120
121 exit(0);
122}
diff --git a/src/regress/lib/libc/ieeefp/Makefile b/src/regress/lib/libc/ieeefp/Makefile
deleted file mode 100644
index 89ff51a2e7..0000000000
--- a/src/regress/lib/libc/ieeefp/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.6 2004/01/15 18:53:23 miod Exp $
2# $NetBSD: Makefile,v 1.5 1996/04/09 16:54:18 phil Exp $
3
4SUBDIR+= except inf infinity round
5
6install:
7
8.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/ieeefp/except/Makefile b/src/regress/lib/libc/ieeefp/except/Makefile
deleted file mode 100644
index 205331548f..0000000000
--- a/src/regress/lib/libc/ieeefp/except/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
1# $OpenBSD: Makefile,v 1.5 2004/07/22 19:29:42 kettenis Exp $
2
3PROG=except
4
5REGRESS_TARGETS+= fltdiv fltinv fltovf fltund
6
7fltdiv: ${PROG}
8 ./${PROG} fltdiv
9
10fltinv: ${PROG}
11 ./${PROG} fltinv
12
13fltovf: ${PROG}
14 ./${PROG} fltovf
15
16fltund: ${PROG}
17 ./${PROG} fltund
18
19.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ieeefp/except/except.c b/src/regress/lib/libc/ieeefp/except/except.c
deleted file mode 100644
index cc3dcf8e44..0000000000
--- a/src/regress/lib/libc/ieeefp/except/except.c
+++ /dev/null
@@ -1,110 +0,0 @@
1/* $OpenBSD: except.c,v 1.12 2010/05/08 19:16:33 naddy Exp $ */
2
3#include <sys/types.h>
4#include <unistd.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8#include <signal.h>
9#include <assert.h>
10#include <ieeefp.h>
11#include <float.h>
12#include <err.h>
13
14volatile sig_atomic_t signal_status;
15
16volatile const double one = 1.0;
17volatile const double zero = 0.0;
18volatile const double huge = DBL_MAX;
19volatile const double tiny = DBL_MIN;
20
21void
22sigfpe(int sig, siginfo_t *si, void *v)
23{
24 char buf[132];
25
26 if (si) {
27 snprintf(buf, sizeof(buf), "sigfpe: addr=%p, code=%d\n",
28 si->si_addr, si->si_code);
29 write(1, buf, strlen(buf));
30 }
31 _exit(signal_status);
32}
33
34
35int
36main(int argc, char *argv[])
37{
38 struct sigaction sa;
39 volatile double x;
40
41 if (argc != 2) {
42 fprintf(stderr, "usage: %s condition\n", argv[0]);
43 exit(1);
44 }
45
46 /*
47 * check to make sure that all exceptions are masked and
48 * that the accumulated exception status is clear.
49 */
50 assert(fpgetmask() == 0);
51 assert(fpgetsticky() == 0);
52
53 memset(&sa, 0, sizeof(sa));
54 sa.sa_sigaction = sigfpe;
55 sa.sa_flags = SA_SIGINFO;
56 sigaction(SIGFPE, &sa, NULL);
57 signal_status = 1;
58
59 if (strcmp(argv[1], "fltdiv") == 0) {
60 /* trip divide by zero */
61 x = one / zero;
62 assert(fpgetsticky() & FP_X_DZ);
63 fpsetsticky(0);
64
65 /* and now unmask to get a signal */
66 signal_status = 0;
67 fpsetmask(FP_X_DZ);
68 x = one / zero;
69 } else if (strcmp(argv[1], "fltinv") == 0) {
70 /* trip invalid operation */
71 x = zero / zero;
72 assert(fpgetsticky() & FP_X_INV);
73 fpsetsticky(0);
74
75 /* and now unmask to get a signal */
76 signal_status = 0;
77 fpsetmask(FP_X_INV);
78 x = zero / zero;
79 } else if (strcmp(argv[1], "fltovf") == 0) {
80 /* trip overflow */
81 x = huge * huge;
82 assert(fpgetsticky() & FP_X_OFL);
83 fpsetsticky(0);
84
85 /* and now unmask to get a signal */
86 signal_status = 0;
87 fpsetmask(FP_X_OFL);
88 x = huge * huge;
89 } else if (strcmp(argv[1], "fltund") == 0) {
90 /* trip underflow */
91 x = tiny * tiny;
92 assert(fpgetsticky() & FP_X_UFL);
93 fpsetsticky(0);
94
95 /* and now unmask to get a signal */
96 signal_status = 0;
97 fpsetmask(FP_X_UFL);
98 x = tiny * tiny;
99 } else {
100 errx(1, "unrecognized condition %s", argv[1]);
101 }
102
103 /*
104 * attempt to trigger the exception on machines where
105 * floating-point exceptions are deferred.
106 */
107 x = one * one;
108
109 errx(1, "signal wasn't caught");
110}
diff --git a/src/regress/lib/libc/ieeefp/inf/Makefile b/src/regress/lib/libc/ieeefp/inf/Makefile
deleted file mode 100644
index b9a50e0ce6..0000000000
--- a/src/regress/lib/libc/ieeefp/inf/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2002/02/16 17:22:16 pvalchev Exp $
2
3PROG= inf
4SRCS= inf.c
5
6LDADD+= -lm
7DPADD+= ${LIBM}
8
9.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ieeefp/inf/inf.c b/src/regress/lib/libc/ieeefp/inf/inf.c
deleted file mode 100644
index a1956145a6..0000000000
--- a/src/regress/lib/libc/ieeefp/inf/inf.c
+++ /dev/null
@@ -1,16 +0,0 @@
1/* $OpenBSD: inf.c,v 1.3 2003/07/31 21:48:03 deraadt Exp $ */
2
3/*
4 * Peter Valchev <pvalchev@openbsd.org> Public Domain, 2002.
5 */
6
7#include <math.h>
8
9int
10main(int argc, char *argv[])
11{
12 if (isinf(HUGE_VAL))
13 return 0;
14
15 return 1;
16}
diff --git a/src/regress/lib/libc/ieeefp/infinity/Makefile b/src/regress/lib/libc/ieeefp/infinity/Makefile
deleted file mode 100644
index ac102d8a63..0000000000
--- a/src/regress/lib/libc/ieeefp/infinity/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2004/01/16 19:34:37 miod Exp $
2
3PROG= infinity
4
5DPADD+= ${LIBM}
6LDADD+= -lm
7
8REGRESS_TARGETS+= add mult neg pumpkin
9
10add: ${PROG}
11 ./${PROG} -a
12
13mult: ${PROG}
14 ./${PROG} -m
15
16neg: ${PROG}
17 ./${PROG} -n
18
19pumpkin: ${PROG}
20 ./${PROG} -p
21
22.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ieeefp/infinity/infinity.c b/src/regress/lib/libc/ieeefp/infinity/infinity.c
deleted file mode 100644
index 3b1b71ec90..0000000000
--- a/src/regress/lib/libc/ieeefp/infinity/infinity.c
+++ /dev/null
@@ -1,77 +0,0 @@
1/* $OpenBSD: infinity.c,v 1.2 2004/01/16 19:34:37 miod Exp $ */
2/*
3 * Written by Miodrag Vallat, 2004 - Public Domain
4 * Inspired from Perl's t/op/arith test #134
5 */
6
7#include <math.h>
8#include <signal.h>
9#include <unistd.h>
10
11void
12sigfpe(int signum)
13{
14 /* looks like we don't handle fp overflow correctly... */
15 _exit(1);
16}
17
18int
19main(int argc, char *argv[])
20{
21 int opt;
22 double d, two;
23 int i;
24 char method = 'a';
25
26 while ((opt = getopt(argc, argv, "amnp")) != -1)
27 method = (char)opt;
28
29 signal(SIGFPE, sigfpe);
30
31 switch (method) {
32 case 'a':
33 /* try to produce +Inf through addition */
34 d = 1.0;
35 for (i = 2000; i != 0; i--) {
36 d = d + d;
37 }
38 /* result should be _positive_ infinity */
39 if (!isinf(d) || copysign(1.0, d) < 0.0)
40 return (1);
41 break;
42 case 'm':
43 /* try to produce +Inf through multiplication */
44 d = 1.0;
45 two = 2.0;
46 for (i = 2000; i != 0; i--) {
47 d = d * two;
48 }
49 /* result should be _positive_ infinity */
50 if (!isinf(d) || copysign(1.0, d) < 0.0)
51 return (1);
52 break;
53 case 'n':
54 /* try to produce -Inf through subtraction */
55 d = -1.0;
56 for (i = 2000; i != 0; i--) {
57 d = d + d;
58 }
59 /* result should be _negative_ infinity */
60 if (!isinf(d) || copysign(1.0, d) > 0.0)
61 return (1);
62 break;
63 case 'p':
64 /* try to produce -Inf through multiplication */
65 d = -1.0;
66 two = 2.0;
67 for (i = 2000; i != 0; i--) {
68 d = d * two;
69 }
70 /* result should be _negative_ infinity */
71 if (!isinf(d) || copysign(1.0, d) > 0.0)
72 return (1);
73 break;
74 }
75
76 return (0);
77}
diff --git a/src/regress/lib/libc/ieeefp/round/Makefile b/src/regress/lib/libc/ieeefp/round/Makefile
deleted file mode 100644
index 9ea6dd8c39..0000000000
--- a/src/regress/lib/libc/ieeefp/round/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.4 2002/02/18 11:25:34 art Exp $
2
3PROG= round
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ieeefp/round/round.c b/src/regress/lib/libc/ieeefp/round/round.c
deleted file mode 100644
index 807941ea56..0000000000
--- a/src/regress/lib/libc/ieeefp/round/round.c
+++ /dev/null
@@ -1,45 +0,0 @@
1/* $OpenBSD: round.c,v 1.3 2003/07/31 21:48:03 deraadt Exp $ */
2/* $NetBSD: round.c,v 1.1 1995/04/26 00:27:28 jtc Exp $ */
3
4/*
5 * Written by J.T. Conklin, Apr 18, 1995
6 * Public domain.
7 */
8
9#include <assert.h>
10#include <stdlib.h>
11#include <ieeefp.h>
12#include <float.h>
13
14int
15main(int argc, char *argv[])
16{
17 /*
18 * This test would be better if it actually performed some
19 * calculations to verify the selected rounding mode. But
20 * this is probably acceptable since the fp{get,set}round
21 * functions usually just get or set the processors fpu
22 * control word.
23 */
24
25 assert(fpgetround() == FP_RN);
26 assert(FLT_ROUNDS == 1);
27
28 assert(fpsetround(FP_RP) == FP_RN);
29 assert(fpgetround() == FP_RP);
30 assert(FLT_ROUNDS == 2);
31
32 assert(fpsetround(FP_RM) == FP_RP);
33 assert(fpgetround() == FP_RM);
34 assert(FLT_ROUNDS == 3);
35
36 assert(fpsetround(FP_RZ) == FP_RM);
37 assert(fpgetround() == FP_RZ);
38 assert(FLT_ROUNDS == 0);
39
40 assert(fpsetround(FP_RN) == FP_RZ);
41 assert(fpgetround() == FP_RN);
42 assert(FLT_ROUNDS == 1);
43
44 exit(0);
45}
diff --git a/src/regress/lib/libc/ifnameindex/Makefile b/src/regress/lib/libc/ifnameindex/Makefile
deleted file mode 100644
index 1f21973a10..0000000000
--- a/src/regress/lib/libc/ifnameindex/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2015/10/22 15:47:00 claudio Exp $
2
3PROG= ifnitest
4SRCS= ifnitest.c
5NOMAN= # defined
6
7REGRESS_TARGETS=do-test
8
9do-test: ${PROG}
10 ./${PROG}
11
12.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ifnameindex/ifnitest.c b/src/regress/lib/libc/ifnameindex/ifnitest.c
deleted file mode 100644
index fb7ed3704f..0000000000
--- a/src/regress/lib/libc/ifnameindex/ifnitest.c
+++ /dev/null
@@ -1,32 +0,0 @@
1/* $OpenBSD: ifnitest.c,v 1.3 2017/02/25 07:28:32 jsg Exp $ */
2
3/* Public domain. 2015, Claudio Jeker */
4
5#include <sys/types.h>
6#include <sys/socket.h>
7#include <net/if.h>
8#include <err.h>
9#include <stdio.h>
10#include <string.h>
11
12int
13main(int argc, char *argv[])
14{
15 char name[IF_NAMESIZE], *ifname;
16 unsigned int lo0index;
17
18 lo0index = if_nametoindex("lo0");
19 if (lo0index == 0)
20 err(1, "if_nametoindex(lo0)");
21 ifname = if_indextoname(lo0index, name);
22 if (ifname == NULL || strcmp("lo0", ifname) != 0)
23 err(1, "if_indextoname(%u)", lo0index);
24
25 /* test failures */
26 if (if_nametoindex("4kingbula") != 0)
27 err(1, "if_nametoindex(4kingbula)");
28 if (if_indextoname(65536, name) != NULL)
29 err(1, "if_indextoname(%u)", 65536);
30
31 return 0;
32}
diff --git a/src/regress/lib/libc/ldexp/Makefile b/src/regress/lib/libc/ldexp/Makefile
deleted file mode 100644
index bfe79ac679..0000000000
--- a/src/regress/lib/libc/ldexp/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2017/10/15 12:15:30 visa Exp $
2
3PROG=ldexp_test
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/ldexp/ldexp_test.c b/src/regress/lib/libc/ldexp/ldexp_test.c
deleted file mode 100644
index 75031e3083..0000000000
--- a/src/regress/lib/libc/ldexp/ldexp_test.c
+++ /dev/null
@@ -1,75 +0,0 @@
1/* $OpenBSD: ldexp_test.c,v 1.1 2017/10/15 12:15:30 visa Exp $ */
2
3/*
4 * Copyright (c) 2017 Visa Hankala
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <assert.h>
20#include <math.h>
21
22int
23main(int argc, char *argv[])
24{
25 double f;
26
27 /*
28 * Test that the result has the correct sign.
29 * Assumes IEEE 754 double-precision arithmetics.
30 */
31
32 assert(ldexp(1.0, -1022) > 0.0); /* IEEE 754 minimum normal positive */
33 assert(ldexp(1.0, -1023) > 0.0); /* subnormal positive */
34 assert(ldexp(1.0, -1024) > 0.0); /* subnormal positive */
35 assert(ldexp(1.0, -1074) > 0.0); /* minimum subnormal positive */
36 assert(ldexp(1.0, -1075) >= 0.0); /* zero */
37 assert(ldexp(ldexp(1.0, -1022), -53) >= 0.0); /* zero */
38
39 assert(ldexp(1.0, 1023) > 0.0); /* normal positive */
40
41 f = ldexp(1.0, 1024); /* infinite positive */
42 assert(isinf(f));
43 assert(!signbit(f));
44
45 f = ldexp(ldexp(1.0, 1023), 1); /* infinite positive */
46 assert(isinf(f));
47 assert(!signbit(f));
48
49 assert(ldexp(-1.0, -1022) < 0.0); /* IEEE 754 maximum normal negative */
50 assert(ldexp(-1.0, -1023) < 0.0); /* subnormal negative */
51 assert(ldexp(-1.0, -1024) < 0.0); /* subnormal negative */
52 assert(ldexp(-1.0, -1074) < 0.0); /* maximum subnormal negative */
53 assert(ldexp(-1.0, -1075) <= 0.0); /* zero */
54 assert(ldexp(ldexp(-1.0, -1022), -53) <= 0.0); /* zero */
55
56 assert(ldexp(-1.0, 1023) < 0.0); /* normal negative */
57
58 f = ldexp(-1.0, 1024); /* infinite negative */
59 assert(isinf(f));
60 assert(signbit(f));
61
62 f = ldexp(ldexp(-1.0, 1023), 1); /* infinite negative */
63 assert(isinf(f));
64 assert(signbit(f));
65
66 f = ldexp(NAN, 0);
67 assert(isnan(f));
68 assert(!signbit(f));
69
70 f = ldexp(-NAN, 0);
71 assert(isnan(f));
72 assert(signbit(f));
73
74 return 0;
75}
diff --git a/src/regress/lib/libc/locale/Makefile b/src/regress/lib/libc/locale/Makefile
deleted file mode 100644
index b3ca6bad85..0000000000
--- a/src/regress/lib/libc/locale/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.6 2017/07/27 15:08:37 bluhm Exp $
2
3SUBDIR = check_isw mbrtowc setlocale wcrtomb
4
5.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/locale/check_isw/Makefile b/src/regress/lib/libc/locale/check_isw/Makefile
deleted file mode 100644
index cd79d6cb7f..0000000000
--- a/src/regress/lib/libc/locale/check_isw/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2017/07/27 15:08:37 bluhm Exp $
2
3PROG = check_isw
4
5run-regress-${PROG}: ${PROG}
6 ./${PROG} >/dev/null
7
8.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/locale/check_isw/check_isw.c b/src/regress/lib/libc/locale/check_isw/check_isw.c
deleted file mode 100644
index 718f387883..0000000000
--- a/src/regress/lib/libc/locale/check_isw/check_isw.c
+++ /dev/null
@@ -1,147 +0,0 @@
1/* $OpenBSD: check_isw.c,v 1.2 2017/07/27 15:08:37 bluhm Exp $ */
2/*
3 * Copyright (c) 2005 Marc Espie <espie@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* This checks consistency of the isw* functions with the default <ctype>
19 * functions.
20 */
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <ctype.h>
25#include <wchar.h>
26#include <wctype.h>
27
28int bad = 0;
29
30void
31check_bool(int v1, int v2, char msg)
32{
33 if (!v1 != !v2) {
34 printf("%c", msg);
35 bad++;
36 }
37}
38
39void
40check_value(int v1, int v2, char msg)
41{
42 if (v1 != v2) {
43 printf("%c", msg);
44 bad++;
45 }
46}
47
48void
49test1()
50{
51 int i;
52
53 for (i = 0; i < 256; i++) {
54 printf(" %02x: ", i);
55 check_bool(isalnum(i), iswalnum(i), '1');
56 check_bool(isalpha(i), iswalpha(i), '2');
57 check_bool(isblank(i), iswblank(i), '3');
58 check_bool(iscntrl(i), iswcntrl(i), '4');
59 check_bool(isdigit(i), iswdigit(i), '5');
60 check_bool(isgraph(i), iswgraph(i), '6');
61 check_bool(islower(i), iswlower(i), '6');
62 check_bool(isprint(i), iswprint(i), '7');
63 check_bool(ispunct(i), iswpunct(i), '8');
64 check_bool(isspace(i), iswspace(i), '9');
65 check_bool(isupper(i), iswupper(i), 'a');
66 check_bool(isxdigit(i), iswxdigit(i), 'b');
67 check_value(tolower(i), towlower(i), 'c');
68 check_value(toupper(i), towupper(i), 'd');
69 if (i % 8 == 7)
70 printf("\n");
71 }
72 printf("\n");
73}
74
75void
76test2()
77{
78 unsigned char *s;
79 unsigned char *buf;
80 int i, j;
81 size_t n;
82 wchar_t c, d;
83 mbstate_t state;
84
85 s = malloc(256);
86 if (!s) {
87 bad++;
88 return;
89 }
90 buf = malloc(MB_CUR_MAX);
91 if (!buf) {
92 bad++;
93 free(s);
94 return;
95 }
96 for (i = 0; i < 256; i++)
97 s[i] = i+1;
98
99 j = 0;
100 mbrtowc(NULL, NULL, 1, &state);
101 printf(" %02x: ", 0);
102
103 while ((n = mbrtowc(&c, s+j, 256-j, &state)) == 1) {
104 printf(" %02x: ", s[j]);
105 check_bool(isalnum(s[j]), iswalnum(c), '1');
106 check_bool(isalpha(s[j]), iswalpha(c), '2');
107 check_bool(isblank(s[j]), iswblank(c), '3');
108 check_bool(iscntrl(s[j]), iswcntrl(c), '4');
109 check_bool(isdigit(s[j]), iswdigit(c), '5');
110 check_bool(isgraph(s[j]), iswgraph(c), '6');
111 check_bool(islower(s[j]), iswlower(c), '6');
112 check_bool(isprint(s[j]), iswprint(c), '7');
113 check_bool(ispunct(s[j]), iswpunct(c), '8');
114 check_bool(isspace(s[j]), iswspace(c), '9');
115 check_bool(isupper(s[j]), iswupper(c), 'a');
116 check_bool(isxdigit(s[j]), iswxdigit(c), 'b');
117 d = towlower(c);
118 if (wctomb(buf, d) == 1) {
119 check_value(tolower(s[j]), buf[0], 'c');
120 } else {
121 bad++;
122 }
123 d = towupper(c);
124 if (wctomb(buf, d) == 1) {
125 check_value(toupper(s[j]), buf[0], 'c');
126 } else {
127 bad++;
128 }
129 if (s[j] % 8 == 7)
130 printf("\n");
131 j++;
132 }
133 if (n != 0 || j != 255) {
134 bad++;
135 }
136 free(s);
137 free(buf);
138}
139
140
141int
142main()
143{
144 test1();
145 test2();
146 return bad !=0;
147}
diff --git a/src/regress/lib/libc/locale/mbrtowc/Makefile b/src/regress/lib/libc/locale/mbrtowc/Makefile
deleted file mode 100644
index 5436383911..0000000000
--- a/src/regress/lib/libc/locale/mbrtowc/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2017/07/27 15:08:37 bluhm Exp $
2
3PROG = test_mbrtowc
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/locale/mbrtowc/test_mbrtowc.c b/src/regress/lib/libc/locale/mbrtowc/test_mbrtowc.c
deleted file mode 100644
index 5926d25fd0..0000000000
--- a/src/regress/lib/libc/locale/mbrtowc/test_mbrtowc.c
+++ /dev/null
@@ -1,85 +0,0 @@
1/* $OpenBSD: test_mbrtowc.c,v 1.2 2017/07/27 15:08:37 bluhm Exp $ */
2/*
3 * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <sys/types.h>
19#include <err.h>
20#include <errno.h>
21#include <locale.h>
22#include <stdlib.h>
23#include <string.h>
24#include <wchar.h>
25
26static mbstate_t mbs;
27
28void
29onetest(const char *name, const char *in, size_t insz,
30 int outerr, size_t outsz, wint_t out)
31{
32 wchar_t wc;
33 size_t sz;
34
35 sz = mbrtowc(&wc, in, insz, &mbs);
36 if (errno != outerr)
37 err(1, "%zu %s(%zd)", MB_CUR_MAX, name, insz);
38 if (sz != outsz || (out != WEOF && wc != out))
39 errx(1, "%zu %s(%zd) = (%zd, %d) != (%zd, %d)",
40 MB_CUR_MAX, name, insz, sz, wc, outsz, out);
41 if (mbsinit(&mbs) == (insz && outsz == (size_t)-2))
42 errx(1, "%zu %s(%zd) mbsinit", MB_CUR_MAX, name, insz);
43 if (errno == 0 && outerr == 0)
44 return;
45 errno = 0;
46 memset(&mbs, 0, sizeof(mbs));
47}
48
49int
50main(void)
51{
52 onetest("NUL", "", 0, 0, -2, WEOF);
53 onetest("NUL", "", 2, 0, 0, L'\0');
54 onetest("BEL", "\a", 2, 0, 1, L'\a');
55 onetest("A", "A", 2, 0, 1, L'A');
56 onetest("DEL", "\177", 2, 0, 1, L'\177');
57 onetest("CSI", "\233", 2, 0, 1, L'\233');
58
59 if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL)
60 errx(1, "setlocale(UTF-8) failed"),
61
62 onetest("NUL", "", 0, 0, -2, WEOF);
63 onetest("NUL", "", 8, 0, 0, L'\0');
64 onetest("BEL", "\a", 8, 0, 1, L'\a');
65 onetest("A", "A", 8, 0, 1, L'A');
66 onetest("DEL", "\177", 8, 0, 1, L'\177');
67 onetest("0x80", "\200", 8, EILSEQ, -1, WEOF);
68 onetest("0xc3", "\303", 1, 0, -2, WEOF);
69 onetest("U+00E9", "\251", 8, 0, 1, 0xe9);
70 onetest("0xec", "\354", 1, 0, -2, WEOF);
71 onetest("0xecbf", "\277", 1, 0, -2, WEOF);
72 onetest("U+CFFF", "\277", 8, 0, 1, 0xcfff);
73
74 if (setlocale(LC_CTYPE, "POSIX") == NULL)
75 errx(1, "setlocale(POSIX) failed"),
76
77 onetest("0xff", "\277", 2, 0, 1, L'\277');
78
79 if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL)
80 errx(1, "second setlocale(UTF-8) failed"),
81
82 onetest("U+13000", "\360\223\200\200", 8, 0, 4, 0x13000);
83
84 return 0;
85}
diff --git a/src/regress/lib/libc/locale/setlocale/Makefile b/src/regress/lib/libc/locale/setlocale/Makefile
deleted file mode 100644
index 966f7926e5..0000000000
--- a/src/regress/lib/libc/locale/setlocale/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2017/07/27 15:08:37 bluhm Exp $
2
3PROG = setlocale
4
5run-regress-${PROG}: ${PROG}
6 env -i LC_ALL=fr_FR.UTF-8 ./${PROG}
7
8.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/locale/setlocale/setlocale.c b/src/regress/lib/libc/locale/setlocale/setlocale.c
deleted file mode 100644
index 82245df5c5..0000000000
--- a/src/regress/lib/libc/locale/setlocale/setlocale.c
+++ /dev/null
@@ -1,125 +0,0 @@
1/* $OpenBSD: setlocale.c,v 1.4 2018/03/29 16:34:25 schwarze Exp $ */
2/*
3 * Copyright (c) 2015 Sebastien Marie <semarie@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <err.h>
19#include <locale.h>
20#include <stdlib.h>
21#include <stdio.h>
22#include <string.h>
23#include <ctype.h>
24
25/*
26 * test helpers for __LINE__
27 */
28#define test_setlocale(_e, _c, _l) _test_setlocale(_e, _c, _l, __LINE__)
29#define test_MB_CUR_MAX(_e) _test_MB_CUR_MAX(_e, __LINE__)
30#define test_isalpha(_e, _c) _test_isalpha(_e, _c, __LINE__)
31
32
33static void
34_test_setlocale(char *expected, int category, char *locale, int line)
35{
36 char *result = setlocale(category, locale);
37
38 if ((expected == NULL) || (result == NULL)) {
39 if (expected == result)
40 return;
41
42 errx(1, "[%d] setlocale(%d, \"%s\")=\"%s\" [expected: \"%s\"]",
43 line, category, locale, result, expected);
44 }
45
46 if (strcmp(expected, result) != 0)
47 errx(1, "[%d] setlocale(%d, \"%s\")=\"%s\" [expected: \"%s\"]",
48 line, category, locale, result, expected);
49}
50
51static void
52_test_MB_CUR_MAX(size_t expected, int line)
53{
54 if (MB_CUR_MAX != expected)
55 errx(1, "[%d] MB_CUR_MAX=%ld [expected %ld]",
56 line, MB_CUR_MAX, expected);
57}
58
59static void
60_test_isalpha(int expected, int c, int line)
61{
62 int result = isalpha(c);
63 if (!!result != expected)
64 errx(1, "[%d] isalpha(%d)=%d [expected %d]",
65 line, c, result, expected);
66}
67
68int
69main(int argc, char *argv[])
70{
71 /* check initial state (should be "C") */
72 test_setlocale("C", LC_ALL, NULL); /* check */
73 test_MB_CUR_MAX(1);
74 test_isalpha(0, 0xe9); /* iso-8859-1 eacute */
75
76 /* load from env */
77 /* NOTE: we don't support non-C locales for some categories */
78 test_setlocale("fr_FR.UTF-8", LC_CTYPE, ""); /* set */
79 test_setlocale("fr_FR.UTF-8", LC_MESSAGES, ""); /* set */
80 test_MB_CUR_MAX(4);
81 test_isalpha(0, 0xe9); /* iso-8859-1 eacute */
82
83 test_setlocale("C", LC_MESSAGES, "C"); /* set */
84 test_MB_CUR_MAX(4);
85 test_setlocale("C/fr_FR.UTF-8/C/C/C/C", LC_ALL, NULL); /* check */
86
87 test_setlocale("C", LC_CTYPE, "C"); /* set */
88 test_MB_CUR_MAX(1);
89 test_setlocale("C", LC_ALL, NULL); /* check */
90
91 /* check for errors on checking */
92 test_setlocale("C", LC_ALL, "C"); /* reset */
93 test_setlocale(NULL, -1, NULL);
94 test_setlocale(NULL, _LC_LAST, NULL);
95 test_setlocale(NULL, _LC_LAST+0xff, NULL);
96 test_setlocale("C", LC_ALL, NULL); /* check */
97
98 /* check for errors on setting */
99 test_setlocale(NULL, -1, "");
100 test_setlocale(NULL, _LC_LAST, "");
101 test_setlocale(NULL, _LC_LAST+0xff, "");
102 test_setlocale("C", LC_ALL, NULL); /* check */
103
104 /* no codeset, fallback to ASCII */
105 test_setlocale("C", LC_ALL, "C"); /* reset */
106 test_setlocale("invalid", LC_CTYPE, "invalid"); /* set */
107 test_setlocale("invalid", LC_CTYPE, NULL);
108 test_MB_CUR_MAX(1);
109 test_isalpha(0, 0xe9); /* iso-8859-1 eacute */
110
111 /* with codeset */
112 test_setlocale("C", LC_ALL, "C"); /* reset */
113 test_setlocale("invalid.UTF-8", LC_CTYPE, "invalid.UTF-8"); /* set */
114 test_setlocale("invalid.UTF-8", LC_CTYPE, NULL);
115 test_setlocale("C/invalid.UTF-8/C/C/C/C", LC_ALL, NULL);
116 test_MB_CUR_MAX(4);
117
118 /* with invalid codeset (is an error) */
119 test_setlocale("C", LC_ALL, "C"); /* reset */
120 test_setlocale(NULL, LC_CTYPE, "fr_FR.invalid"); /* set */
121 test_setlocale("C", LC_CTYPE, NULL);
122 test_MB_CUR_MAX(1);
123
124 return (EXIT_SUCCESS);
125}
diff --git a/src/regress/lib/libc/locale/uselocale/Makefile b/src/regress/lib/libc/locale/uselocale/Makefile
deleted file mode 100644
index a10471bcf6..0000000000
--- a/src/regress/lib/libc/locale/uselocale/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
1# $OpenBSD: Makefile,v 1.3 2017/08/16 01:40:30 schwarze Exp $
2
3PROG = uselocale
4CFLAGS += -Wno-macro-redefined -Wno-int-to-pointer-cast
5LDFLAGS += -pthread
6
7run-regress-${PROG}: ${PROG}
8 ./${PROG}
9
10.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/locale/uselocale/uselocale.c b/src/regress/lib/libc/locale/uselocale/uselocale.c
deleted file mode 100644
index 445bb64876..0000000000
--- a/src/regress/lib/libc/locale/uselocale/uselocale.c
+++ /dev/null
@@ -1,482 +0,0 @@
1/* $OpenBSD: uselocale.c,v 1.5 2017/08/16 13:52:50 schwarze Exp $ */
2/*
3 * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <ctype.h>
19#include <err.h>
20#include <errno.h>
21#include <langinfo.h>
22#include <locale.h>
23#include <pthread.h>
24#include <stdlib.h>
25#include <string.h>
26#include <wchar.h>
27#include <wctype.h>
28
29/* Keep in sync with /usr/src/lib/libc/locale/rune.h. */
30#define _LOCALE_NONE (locale_t)0
31#define _LOCALE_C (locale_t)1
32#define _LOCALE_UTF8 (locale_t)2
33#define _LOCALE_BAD (locale_t)3
34
35/* Options for switch_thread() below. */
36#define SWITCH_SIGNAL 1 /* Call pthread_cond_signal(3). */
37#define SWITCH_WAIT 2 /* Call pthread_cond_timedwait(3). */
38
39/* Options for TESTFUNC(). */
40#define TOPT_ERR (1 << 0)
41#define TOPT_STR (1 << 1)
42
43/*
44 * Generate one test function for a specific interface.
45 * Fn = function name
46 * Ft = function return type
47 * FUNCPARA = function parameter list with types and names
48 * FUNCARGS = function argument list, names only, no types
49 * Af = format string to print the arguments
50 * Rf = format string to print the return value
51 * Op = options for the test function, see above
52 * line = source code line number in this test file
53 * ee = expected error number
54 * er = expected return value
55 * ar = actual return value
56 * errno = actual error number (global)
57 */
58#define TESTFUNC(Fn, Ft, Af, Rf, Op) \
59static void \
60_test_##Fn(int line, int ee, Ft er, FUNCPARA) \
61{ \
62 Ft ar; \
63 errno = 0; \
64 ar = Fn(FUNCARGS); \
65 if (Op & TOPT_STR) { \
66 if (er == (Ft)NULL) \
67 er = (Ft)"NULL"; \
68 if (ar == (Ft)NULL) \
69 ar = (Ft)"NULL"; \
70 } \
71 if (Op & TOPT_STR ? strcmp((const char *)er, (const char *)ar) \
72 : ar != er) \
73 errx(1, "[%d] %s(" Af ")=" Rf " [exp: " Rf "]", \
74 line, #Fn, FUNCARGS, ar, er); \
75 if (Op & TOPT_ERR && errno != ee) \
76 errx(1, "[%d] %s(" Af ") errno=%d [exp: %d]", \
77 line, #Fn, FUNCARGS, errno, ee); \
78}
79
80/*
81 * Test functions for all tested interfaces.
82 */
83#define FUNCPARA int mask, const char *locname
84#define FUNCARGS mask, locname, _LOCALE_NONE
85TESTFUNC(newlocale, locale_t, "%d, %s, %p", "%p", TOPT_ERR)
86
87#define FUNCPARA locale_t locale
88#define FUNCARGS locale
89TESTFUNC(duplocale, locale_t, "%p", "%p", TOPT_ERR)
90TESTFUNC(uselocale, locale_t, "%p", "%p", TOPT_ERR)
91
92#define FUNCPARA int category, char *locname
93#define FUNCARGS category, locname
94TESTFUNC(setlocale, const char *, "%d, %s", "%s", TOPT_STR)
95
96#define FUNCPARA nl_item item
97#define FUNCARGS item
98TESTFUNC(nl_langinfo, const char *, "%ld", "%s", TOPT_STR)
99
100#define FUNCPARA nl_item item, locale_t locale
101#define FUNCARGS item, locale
102TESTFUNC(nl_langinfo_l, const char *, "%ld, %p", "%s", TOPT_STR)
103
104#define FUNCPARA int c
105#define FUNCARGS c
106TESTFUNC(isalpha, int, "0x%.2x", "%d", 0)
107TESTFUNC(tolower, int, "0x%.2x", "0x%.2x", 0)
108
109#define FUNCPARA int c, locale_t locale
110#define FUNCARGS c, locale
111TESTFUNC(isalpha_l, int, "0x%.2x, %p", "%d", 0)
112TESTFUNC(tolower_l, int, "0x%.2x, %p", "0x%.2x", 0)
113
114#define FUNCPARA wint_t wc
115#define FUNCARGS wc
116TESTFUNC(iswalpha, int, "U+%.4X", "%d", 0)
117TESTFUNC(towupper, wint_t, "U+%.4X", "U+%.4X", 0)
118
119#define FUNCPARA wint_t wc, locale_t locale
120#define FUNCARGS wc, locale
121TESTFUNC(iswalpha_l, int, "U+%.4X, %p", "%d", 0)
122TESTFUNC(towupper_l, wint_t, "U+%.4X, %p", "U+%.4X", 0)
123
124#define FUNCPARA wint_t wc, wctype_t charclass
125#define FUNCARGS wc, charclass
126TESTFUNC(iswctype, int, "U+%.4X, %p", "%d", 0)
127
128#define FUNCPARA wint_t wc, wctype_t charclass, locale_t locale
129#define FUNCARGS wc, charclass, locale
130TESTFUNC(iswctype_l, int, "U+%.4X, %p, %p", "%d", 0)
131
132#define FUNCPARA wint_t wc, wctrans_t charmap
133#define FUNCARGS wc, charmap
134TESTFUNC(towctrans, wint_t, "U+%.4X, %p", "U+%.4X", 0)
135
136#define FUNCPARA wint_t wc, wctrans_t charmap, locale_t locale
137#define FUNCARGS wc, charmap, locale
138TESTFUNC(towctrans_l, wint_t, "U+%.4X, %p, %p", "U+%.4X", 0)
139
140#define FUNCPARA const wchar_t *s1, const wchar_t *s2
141#define FUNCARGS s1, s2
142TESTFUNC(wcscasecmp, int, "%ls, %ls", "%d", 0)
143
144#define FUNCPARA const wchar_t *s1, const wchar_t *s2, locale_t locale
145#define FUNCARGS s1, s2, locale
146TESTFUNC(wcscasecmp_l, int, "%ls, %ls, %p", "%d", 0)
147
148#define FUNCPARA const wchar_t *s1, const wchar_t *s2, size_t len
149#define FUNCARGS s1, s2, len
150TESTFUNC(wcsncasecmp, int, "%ls, %ls, %zu", "%d", 0)
151
152#define FUNCPARA const wchar_t *s1, const wchar_t *s2, size_t len, \
153 locale_t locale
154#define FUNCARGS s1, s2, len, locale
155TESTFUNC(wcsncasecmp_l, int, "%ls, %ls, %zu, %p", "%d", 0)
156
157static void
158_test_MB_CUR_MAX(int line, int ee, size_t ar)
159{
160 if (MB_CUR_MAX != ar)
161 errx(1, "[%d] MB_CUR_MAX=%zd [exp: %zd]",
162 line, MB_CUR_MAX, ar);
163}
164
165/*
166 * Test macros:
167 * TEST_R(funcname, er, arguments) if you expect errno == 0.
168 * TEST_ER(funcname, ee, er, arguments) otherwise.
169 */
170#define TEST_R(Fn, ...) _test_##Fn(__LINE__, 0, __VA_ARGS__)
171#define TEST_ER(Fn, ...) _test_##Fn(__LINE__, __VA_ARGS__)
172
173/*
174 * SWITCH_SIGNAL wakes the other thread.
175 * SWITCH_WAIT goes to sleep.
176 * Both can be combined.
177 * The step argument is used for error reporting only.
178 */
179static void
180switch_thread(int step, int flags)
181{
182 static pthread_mutexattr_t ma;
183 static struct timespec t;
184 static pthread_cond_t *c;
185 static pthread_mutex_t *m;
186 int irc;
187
188 if (m == NULL) {
189 if ((m = malloc(sizeof(*m))) == NULL)
190 err(1, NULL);
191 if ((irc = pthread_mutexattr_init(&ma)) != 0)
192 errc(1, irc, "pthread_mutexattr_init");
193 if ((irc = pthread_mutexattr_settype(&ma,
194 PTHREAD_MUTEX_STRICT_NP)) != 0)
195 errc(1, irc, "pthread_mutexattr_settype");
196 if ((irc = pthread_mutex_init(m, &ma)) != 0)
197 errc(1, irc, "pthread_mutex_init");
198 }
199 if (c == NULL) {
200 if ((c = malloc(sizeof(*c))) == NULL)
201 err(1, NULL);
202 if ((irc = pthread_cond_init(c, NULL)) != 0)
203 errc(1, irc, "pthread_cond_init");
204 }
205 if (flags & SWITCH_SIGNAL) {
206 if ((irc = pthread_cond_signal(c)) != 0)
207 errc(1, irc, "pthread_cond_signal(%d)", step);
208 }
209 if (flags & SWITCH_WAIT) {
210 if ((irc = pthread_mutex_trylock(m)) != 0)
211 errc(1, irc, "pthread_mutex_trylock(%d)", step);
212 t.tv_sec = time(NULL) + 2;
213 if ((irc = pthread_cond_timedwait(c, m, &t)) != 0)
214 errc(1, irc, "pthread_cond_timedwait(%d)", step);
215 if ((irc = pthread_mutex_unlock(m)) != 0)
216 errc(1, irc, "pthread_mutex_unlock(%d)", step);
217 }
218}
219
220static void *
221child_func(void *arg)
222{
223 const wchar_t s1[] = { 0x00C7, 0x00E0, 0x0000 };
224 const wchar_t s2[] = { 0x00E7, 0x00C0, 0x0000 };
225 const wchar_t s3[] = { 0x00C9, 0x0074, 0x00C9, 0x0000 };
226 const wchar_t s4[] = { 0x00E9, 0x0054, 0x00CC, 0x0000 };
227 wctype_t wctyg, wctyu, wctyc;
228 wctrans_t wctrg, wctru, wctrc;
229 char *sego, *segc, *selo, *selc;
230
231 /* Test invalid newlocale(3) arguments. */
232 TEST_ER(newlocale, EINVAL, _LOCALE_NONE, LC_CTYPE_MASK, NULL);
233 TEST_R(MB_CUR_MAX, 1);
234 TEST_ER(newlocale, EINVAL, _LOCALE_NONE, LC_ALL_MASK + 1, "C.UTF-8");
235 TEST_R(MB_CUR_MAX, 1);
236 TEST_ER(newlocale, ENOENT, _LOCALE_NONE, LC_COLLATE_MASK, "C.INV");
237 TEST_R(MB_CUR_MAX, 1);
238 setenv("LC_TIME", "C.INV", 1);
239 TEST_ER(newlocale, ENOENT, _LOCALE_NONE, LC_TIME_MASK, "");
240 unsetenv("LC_TIME");
241 TEST_R(MB_CUR_MAX, 1);
242 setenv("LC_CTYPE", "C.INV", 1);
243 TEST_ER(newlocale, ENOENT, _LOCALE_NONE, LC_CTYPE_MASK, "");
244 TEST_R(MB_CUR_MAX, 1);
245
246 /* Test duplocale(3). */
247 TEST_ER(duplocale, EINVAL, _LOCALE_NONE, _LOCALE_UTF8);
248 TEST_R(duplocale, _LOCALE_C, _LOCALE_C);
249 TEST_R(duplocale, _LOCALE_C, LC_GLOBAL_LOCALE);
250
251 /* Test premature UTF-8 uselocale(3). */
252 TEST_ER(uselocale, EINVAL, _LOCALE_NONE, _LOCALE_UTF8);
253 TEST_R(MB_CUR_MAX, 1);
254 TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_NONE);
255
256 /* Test UTF-8 initialization. */
257 setenv("LC_CTYPE", "C.UTF-8", 1);
258 TEST_R(newlocale, _LOCALE_UTF8, LC_CTYPE_MASK, "");
259 unsetenv("LC_CTYPE");
260 TEST_R(MB_CUR_MAX, 1);
261 TEST_R(duplocale, _LOCALE_UTF8, _LOCALE_UTF8);
262
263 /* Test invalid uselocale(3) argument. */
264 TEST_ER(uselocale, EINVAL, _LOCALE_NONE, _LOCALE_BAD);
265 TEST_R(MB_CUR_MAX, 1);
266 TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_NONE);
267 TEST_R(nl_langinfo, "US-ASCII", CODESET);
268 TEST_R(nl_langinfo_l, "UTF-8", CODESET, _LOCALE_UTF8);
269 TEST_R(iswalpha, 0, 0x00E9);
270 TEST_R(iswalpha_l, 1, 0x00E9, _LOCALE_UTF8);
271 TEST_R(towupper, 0x00E9, 0x00E9);
272 TEST_R(towupper_l, 0x00C9, 0x00E9, _LOCALE_UTF8);
273 TEST_R(wcscasecmp, *s1 - *s2, s1, s2);
274 TEST_R(wcscasecmp_l, 0, s1, s2, _LOCALE_UTF8);
275
276 /* Test switching the thread locale. */
277 TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_UTF8);
278 TEST_R(MB_CUR_MAX, 4);
279 TEST_R(uselocale, _LOCALE_UTF8, _LOCALE_NONE);
280 TEST_R(nl_langinfo, "UTF-8", CODESET);
281 TEST_R(nl_langinfo_l, "UTF-8", CODESET, _LOCALE_UTF8);
282 TEST_R(nl_langinfo_l, "US-ASCII", CODESET, _LOCALE_C);
283 TEST_R(isalpha, _L, 0x65); /* e */
284 TEST_R(isalpha_l, _L, 0x65, _LOCALE_UTF8);
285 TEST_R(isalpha_l, _L, 0x65, _LOCALE_C);
286 TEST_R(isalpha_l, _L, 0x65, _LOCALE_C);
287 TEST_R(isalpha, 0, 0x30); /* 0 */
288 TEST_R(isalpha_l, 0, 0x30, _LOCALE_UTF8);
289 TEST_R(isalpha_l, 0, 0x30, _LOCALE_C);
290 TEST_R(tolower, 0x61, 0x41); /* A */
291 TEST_R(tolower_l, 0x61, 0x41, _LOCALE_UTF8);
292 TEST_R(tolower_l, 0x61, 0x41, _LOCALE_C);
293 TEST_R(tolower, 0x40, 0x40); /* @ */
294 TEST_R(tolower_l, 0x40, 0x40, _LOCALE_UTF8);
295 TEST_R(tolower_l, 0x40, 0x40, _LOCALE_C);
296 TEST_R(iswalpha, 1, 0x00E9); /* e accent aigu */
297 TEST_R(iswalpha_l, 1, 0x00E9, _LOCALE_UTF8);
298 TEST_R(iswalpha_l, 0, 0x00E9, _LOCALE_C);
299 TEST_R(iswalpha, 1, 0x0153); /* ligature oe */
300 TEST_R(iswalpha_l, 1, 0x0153, _LOCALE_UTF8);
301 TEST_R(iswalpha_l, 0, 0x0153, _LOCALE_C);
302 TEST_R(iswalpha, 0, 0x2200); /* for all */
303 TEST_R(iswalpha_l, 0, 0x2200, _LOCALE_UTF8);
304 TEST_R(iswalpha_l, 0, 0x2200, _LOCALE_C);
305 TEST_R(towupper, 0x00C9, 0x00E9);
306 TEST_R(towupper_l, 0x00C9, 0x00E9, _LOCALE_UTF8);
307 TEST_R(towupper_l, 0x00E9, 0x00E9, _LOCALE_C);
308 TEST_R(towupper, 0x0152, 0x0153);
309 TEST_R(towupper_l, 0x0152, 0x0153, _LOCALE_UTF8);
310 TEST_R(towupper_l, 0x0153, 0x0153, _LOCALE_C);
311 TEST_R(towupper, 0x2205, 0x2205);
312 TEST_R(towupper_l, 0x2205, 0x2205, _LOCALE_UTF8);
313 TEST_R(towupper_l, 0x2205, 0x2205, _LOCALE_C);
314 wctyg = wctype("upper");
315 if (wctyg == NULL)
316 errx(1, "wctype(upper) == NULL");
317 wctyu = wctype_l("upper", _LOCALE_UTF8);
318 if (wctyu == NULL)
319 errx(1, "wctype_l(upper, UTF-8) == NULL");
320 if (wctyg != wctyu)
321 errx(1, "wctype global != UTF-8");
322 wctyc = wctype_l("upper", _LOCALE_C);
323 if (wctyc == NULL)
324 errx(1, "wctype_l(upper, C) == NULL");
325 if (wctyg == wctyc)
326 errx(1, "wctype global == C");
327 TEST_R(iswctype, 1, 0x00D0, wctyg); /* Eth */
328 TEST_R(iswctype_l, 1, 0x00D0, wctyu, _LOCALE_UTF8);
329 TEST_R(iswctype_l, 0, 0x00D0, wctyc, _LOCALE_C);
330 TEST_R(iswctype, 1, 0x0393, wctyg); /* Gamma */
331 TEST_R(iswctype_l, 1, 0x0393, wctyu, _LOCALE_UTF8);
332 TEST_R(iswctype_l, 0, 0x0393, wctyc, _LOCALE_C);
333 TEST_R(iswctype, 0, 0x2205, wctyg); /* empty set */
334 TEST_R(iswctype_l, 0, 0x2205, wctyu, _LOCALE_UTF8);
335 TEST_R(iswctype_l, 0, 0x2205, wctyc, _LOCALE_C);
336 wctrg = wctrans("tolower");
337 if (wctrg == NULL)
338 errx(1, "wctrans(tolower) == NULL");
339 wctru = wctrans_l("tolower", _LOCALE_UTF8);
340 if (wctru == NULL)
341 errx(1, "wctrans(tolower, UTF-8) == NULL");
342 if (wctrg != wctru)
343 errx(1, "wctrans global != UTF-8");
344 wctrc = wctrans_l("tolower", _LOCALE_C);
345 if (wctrc == NULL)
346 errx(1, "wctrans(tolower, C) == NULL");
347 if (wctrg == wctrc)
348 errx(1, "wctrans global == C");
349 TEST_R(towctrans, 0x00FE, 0x00DE, wctrg); /* Thorn */
350 TEST_R(towctrans_l, 0x00FE, 0x00DE, wctru, _LOCALE_UTF8);
351 TEST_R(towctrans_l, 0x00DE, 0x00DE, wctrc, _LOCALE_C);
352 TEST_R(towctrans, 0x03C6, 0x03A6, wctrg); /* Phi */
353 TEST_R(towctrans_l, 0x03C6, 0x03A6, wctru, _LOCALE_UTF8);
354 TEST_R(towctrans_l, 0x03A6, 0x03A6, wctrc, _LOCALE_C);
355 TEST_R(towctrans, 0x2207, 0x2207, wctrg); /* Nabla */
356 TEST_R(towctrans_l, 0x2207, 0x2207, wctru, _LOCALE_UTF8);
357 TEST_R(towctrans_l, 0x2207, 0x2207, wctrc, _LOCALE_C);
358 TEST_R(wcscasecmp, 0, s1, s2);
359 TEST_R(wcscasecmp_l, 0, s1, s2, _LOCALE_UTF8);
360 TEST_R(wcscasecmp_l, *s1 - *s2, s1, s2, _LOCALE_C);
361 TEST_R(wcsncasecmp, 0, s3, s4, 2);
362 TEST_R(wcsncasecmp_l, 0, s3, s4, 2, _LOCALE_UTF8);
363 TEST_R(wcsncasecmp_l, *s3 - *s4, s3, s4, 2, _LOCALE_C);
364
365 /* Test non-ctype newlocale(3). */
366 TEST_R(newlocale, _LOCALE_C, LC_MESSAGES_MASK, "en_US.UTF-8");
367
368 /* Test strerror(3). */
369 sego = strerror(EPERM);
370 segc = strdup(sego);
371 selo = strerror_l(ENOENT, _LOCALE_C);
372 selc = strdup(selo);
373 if (strcmp(sego, segc) != 0)
374 errx(1, "child: strerror_l clobbered strerror");
375 free(segc);
376 sego = strerror(ESRCH);
377 if (strcmp(selo, selc) != 0)
378 errx(1, "child: strerror clobbered strerror_l");
379
380 /* Temporarily switch to the main thread. */
381 switch_thread(2, SWITCH_SIGNAL | SWITCH_WAIT);
382 if (strcmp(selo, selc) != 0)
383 errx(1, "child: main clobbered strerror_l");
384 free(selc);
385
386 /* Check that the C locale works even while all is set to UTF-8. */
387 TEST_R(nl_langinfo_l, "US-ASCII", CODESET, _LOCALE_C);
388 TEST_R(iswalpha_l, 0, 0x00E9, _LOCALE_C);
389 TEST_R(towupper_l, 0x00E9, 0x00E9, _LOCALE_C);
390 TEST_R(wcscasecmp_l, *s1 - *s2, s1, s2, _LOCALE_C);
391
392 /* Test displaying the global locale while a local one is set. */
393 TEST_R(setlocale, "C/C.UTF-8/C/C/C/C", LC_ALL, NULL);
394
395 /* Test switching the thread locale back. */
396 TEST_R(MB_CUR_MAX, 4);
397 TEST_R(duplocale, _LOCALE_UTF8, LC_GLOBAL_LOCALE);
398 TEST_R(uselocale, _LOCALE_UTF8, _LOCALE_C);
399 TEST_R(MB_CUR_MAX, 1);
400 TEST_R(uselocale, _LOCALE_C, _LOCALE_NONE);
401
402 /* Check that UTF-8 works even with a C thread locale. */
403 TEST_R(nl_langinfo, "US-ASCII", CODESET);
404 TEST_R(nl_langinfo_l, "UTF-8", CODESET, _LOCALE_UTF8);
405 TEST_R(iswalpha, 0, 0x0153);
406 TEST_R(iswalpha_l, 1, 0x0153, _LOCALE_UTF8);
407 TEST_R(towupper, 0x0153, 0x0153);
408 TEST_R(towupper_l, 0x0152, 0x0153, _LOCALE_UTF8);
409 TEST_R(wcsncasecmp, *s3 - *s4, s3, s4, 2);
410 TEST_R(wcsncasecmp_l, 0, s3, s4, 2, _LOCALE_UTF8);
411
412 /* Test switching back to the global locale. */
413 TEST_R(uselocale, _LOCALE_C, LC_GLOBAL_LOCALE);
414 TEST_R(MB_CUR_MAX, 4);
415 TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_NONE);
416
417 /* Check that the global locale takes effect even in a thread. */
418 TEST_R(nl_langinfo, "UTF-8", CODESET);
419 TEST_R(iswalpha, 1, 0x0153);
420 TEST_R(towupper, 0x0152, 0x0153);
421 TEST_R(wcscasecmp, 0, s1, s2);
422
423 /* Hand control back to the main thread. */
424 switch_thread(4, SWITCH_SIGNAL);
425 return NULL;
426}
427
428int
429main(void)
430{
431 pthread_t child_thread;
432 char *sego, *segc, *selo, *selc;
433 int irc;
434
435 /* Initialize environment. */
436 unsetenv("LC_ALL");
437 unsetenv("LC_COLLATE");
438 unsetenv("LC_CTYPE");
439 unsetenv("LC_MONETARY");
440 unsetenv("LC_NUMERIC");
441 unsetenv("LC_TIME");
442 unsetenv("LC_MESSAGES");
443 unsetenv("LANG");
444
445 /* First let the child do some tests. */
446 if ((irc = pthread_create(&child_thread, NULL, child_func, NULL)) != 0)
447 errc(1, irc, "pthread_create");
448 switch_thread(1, SWITCH_WAIT);
449
450 /* Check that the global locale is undisturbed. */
451 TEST_R(setlocale, "C", LC_ALL, NULL);
452 TEST_R(MB_CUR_MAX, 1);
453
454 /* Check that *_l(3) works without any locale installed. */
455 TEST_R(nl_langinfo_l, "UTF-8", CODESET, _LOCALE_UTF8);
456 TEST_R(iswalpha_l, 1, 0x00E9, _LOCALE_UTF8);
457 TEST_R(towupper_l, 0x00C9, 0x00E9, _LOCALE_UTF8);
458
459 /* Test setting the globale locale. */
460 TEST_R(setlocale, "C.UTF-8", LC_CTYPE, "C.UTF-8");
461 TEST_R(MB_CUR_MAX, 4);
462 TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_NONE);
463
464 /* Test strerror(3). */
465 sego = strerror(EINTR);
466 segc = strdup(sego);
467 selo = strerror_l(EIO, _LOCALE_C);
468 selc = strdup(selo);
469 if (strcmp(sego, segc) != 0)
470 errx(1, "main: strerror_l clobbered strerror");
471 free(segc);
472 sego = strerror(ENXIO);
473 if (strcmp(selo, selc) != 0)
474 errx(1, "main: strerror clobbered strerror_l");
475 free(selc);
476
477 /* Let the child do some more tests, then clean up. */
478 switch_thread(3, SWITCH_SIGNAL);
479 if ((irc = pthread_join(child_thread, NULL)) != 0)
480 errc(1, irc, "pthread_join");
481 return 0;
482}
diff --git a/src/regress/lib/libc/locale/wcrtomb/Makefile b/src/regress/lib/libc/locale/wcrtomb/Makefile
deleted file mode 100644
index b09cecc454..0000000000
--- a/src/regress/lib/libc/locale/wcrtomb/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2017/07/27 15:08:37 bluhm Exp $
2
3PROG = test_wcrtomb
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/locale/wcrtomb/test_wcrtomb.c b/src/regress/lib/libc/locale/wcrtomb/test_wcrtomb.c
deleted file mode 100644
index 26b21fdd5b..0000000000
--- a/src/regress/lib/libc/locale/wcrtomb/test_wcrtomb.c
+++ /dev/null
@@ -1,85 +0,0 @@
1/* $OpenBSD: test_wcrtomb.c,v 1.2 2017/07/27 15:08:37 bluhm Exp $ */
2/*
3 * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <sys/types.h>
19#include <err.h>
20#include <errno.h>
21#include <limits.h>
22#include <locale.h>
23#include <stdlib.h>
24#include <string.h>
25#include <wchar.h>
26
27static mbstate_t mbs;
28
29void
30onetest(const char *name, const wchar_t wcin, int outerr, const char *out)
31{
32 char buf[MB_LEN_MAX];
33 size_t sz, outsz;
34
35 memset(buf, 0, MB_LEN_MAX);
36 outsz = out == NULL ? (size_t)-1 : *out == '\0' ? 1 : strlen(out);
37 sz = wcrtomb(buf, wcin, &mbs);
38 if (errno != outerr)
39 err(1, "%zu %s U+%04X", MB_CUR_MAX, name, wcin);
40 if (sz != outsz || (out != NULL && strncmp(buf, out, sz)))
41 errx(1, "%zu %s U+%04X: %4.4s(%zd) != %4.4s(%zd)",
42 MB_CUR_MAX, name, wcin, buf, sz,
43 out == NULL ? "(NULL)" : out, outsz);
44 if (mbsinit(&mbs) == 0)
45 errx(1, "%zu %s U+%04X mbsinit", MB_CUR_MAX, name, wcin);
46 if (errno == 0 && outerr == 0)
47 return;
48 errno = 0;
49 memset(&mbs, 0, sizeof(mbs));
50}
51
52int
53main(void)
54{
55 onetest("NUL", L'\0', 0, "");
56 onetest("BEL", L'\a', 0, "\a");
57 onetest("A", L'A', 0, "A");
58 onetest("DEL", L'\177', 0, "\177");
59 onetest("CSI", L'\233', 0, "\233");
60 onetest("0x100", 0x100, EILSEQ, NULL);
61
62 if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL)
63 errx(1, "setlocale(UTF-8) failed"),
64
65 onetest("NUL", L'\0', 0, "");
66 onetest("BEL", L'\a', 0, "\a");
67 onetest("A", L'A', 0, "A");
68 onetest("DEL", L'\177', 0, "\177");
69 onetest("CSI", L'\233', 0, "\302\233");
70 onetest("0xe9", 0xe9, 0, "\303\251");
71 onetest("0xcfff", 0xcfff, 0, "\354\277\277");
72 onetest("0xd800", 0xd800, EILSEQ, NULL);
73
74 if (setlocale(LC_CTYPE, "POSIX") == NULL)
75 errx(1, "setlocale(POSIX) failed"),
76
77 onetest("0xff", L'\377', 0, "\377");
78
79 if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL)
80 errx(1, "second setlocale(UTF-8) failed"),
81
82 onetest("U+13000", 0x13000, 0, "\360\223\200\200");
83
84 return 0;
85}
diff --git a/src/regress/lib/libc/longjmp/Makefile b/src/regress/lib/libc/longjmp/Makefile
deleted file mode 100644
index 825e0f86d9..0000000000
--- a/src/regress/lib/libc/longjmp/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
1# $OpenBSD: Makefile,v 1.4 2002/09/02 20:01:43 avsm Exp $
2PROG= longjmp
3
4do-longjmp: ${PROG}
5 ./longjmp
6
7do-_longjmp: ${PROG}
8 ./longjmp -_
9
10REGRESS_TARGETS=do-longjmp do-_longjmp
11.PHONY: ${REGRESS_TARGETS}
12
13.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/longjmp/longjmp.c b/src/regress/lib/libc/longjmp/longjmp.c
deleted file mode 100644
index 7dea5bd97c..0000000000
--- a/src/regress/lib/libc/longjmp/longjmp.c
+++ /dev/null
@@ -1,71 +0,0 @@
1/* $OpenBSD: longjmp.c,v 1.4 2002/02/18 11:27:45 art Exp $ */
2/*
3 * Artur Grabowski <art@openbsd.org>, 2002 Public Domain.
4 */
5
6#include <stdio.h>
7#include <stdlib.h>
8#include <unistd.h>
9#include <setjmp.h>
10#include <err.h>
11#include <sys/types.h>
12#include <sys/time.h>
13#include <sys/resource.h>
14
15
16jmp_buf buf;
17
18/*
19 * When longjmp is passed the incorrect arg (0), it should translate it into
20 * something better.
21 *
22 * The rlimit is here in case we start spinning.
23 */
24int
25main(int argc, char **argv)
26{
27 struct rlimit rl;
28 volatile int i, expect;
29 int (*sj)(jmp_buf);
30 void (*lj)(jmp_buf, int);
31 int ch;
32 extern char *__progname;
33
34 sj = setjmp;
35 lj = longjmp;
36
37 while ((ch = getopt(argc, argv, "_")) != -1) {
38 switch (ch) {
39 case '_':
40 sj = _setjmp;
41 lj = _longjmp;
42 break;
43 default:
44 fprintf(stderr, "Usage: %s [-_]\n", __progname);
45 exit(1);
46 }
47 }
48
49 rl.rlim_cur = 2;
50 rl.rlim_max = 2;
51 if (setrlimit(RLIMIT_CPU, &rl) < 0)
52 err(1, "setrlimit");
53
54 expect = 0;
55 i = (*sj)(buf);
56 if (i == 0 && expect != 0)
57 errx(1, "setjmp returns 0 on longjmp(.., 0)");
58 if (expect == 0) {
59 expect = -1;
60 (*lj)(buf, 0);
61 }
62
63 expect = 0;
64 i = (*sj)(buf);
65 if (i != expect)
66 errx(1, "bad return from setjmp %d/%d", expect, i);
67 if (expect < 1000)
68 (*lj)(buf, expect += 2);
69
70 return 0;
71}
diff --git a/src/regress/lib/libc/malloc/Makefile b/src/regress/lib/libc/malloc/Makefile
deleted file mode 100644
index 7eb84f6a6c..0000000000
--- a/src/regress/lib/libc/malloc/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.7 2018/01/28 13:42:17 otto Exp $
2
3SUBDIR+= malloc_general malloc0test malloc_errno malloc_ulimit1 malloc_ulimit2
4SUBDIR+= malloc_threaderr
5
6install:
7
8.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/malloc/malloc0test/Makefile b/src/regress/lib/libc/malloc/malloc0test/Makefile
deleted file mode 100644
index fc2295c091..0000000000
--- a/src/regress/lib/libc/malloc/malloc0test/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2017/07/08 00:08:26 bluhm Exp $
2
3PROG= malloc0test
4
5.for m in C D F G J j R S U X << >>>
6REGRESS_TARGETS += run-regress-${PROG}-${m:S/</-/g:S/>/+/g}
7run-regress-${PROG}-${m:S/</-/g:S/>/+/g}: ${PROG}
8 MALLOC_OPTIONS='${m}' ./${PROG}
9.endfor
10
11.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/malloc/malloc0test/malloc0test.c b/src/regress/lib/libc/malloc/malloc0test/malloc0test.c
deleted file mode 100644
index 06ff0996ee..0000000000
--- a/src/regress/lib/libc/malloc/malloc0test/malloc0test.c
+++ /dev/null
@@ -1,120 +0,0 @@
1/* $OpenBSD: malloc0test.c,v 1.5 2008/04/13 00:22:17 djm Exp $ */
2/*
3 * Public domain. 2001, Theo de Raadt
4 */
5#include <sys/types.h>
6#include <sys/signal.h>
7#include <stdio.h>
8#include <unistd.h>
9#include <stdlib.h>
10#include <setjmp.h>
11#include <limits.h>
12#include <errno.h>
13
14volatile sig_atomic_t got;
15jmp_buf jmp;
16
17static void
18catch(int signo)
19{
20 got++;
21 longjmp(jmp, 1);
22}
23
24static int
25test(char *p, int size)
26{
27 signal(SIGSEGV, catch);
28 got = 0;
29 if (setjmp(jmp) == 0)
30 *p = 0;
31 if (setjmp(jmp) == 0)
32 *(p+size-1) = 0;
33 return (got);
34}
35
36char *prot_table[] = {
37 "unprotected",
38 "fuckup",
39 "protected"
40};
41
42#define SIZE 10
43
44/*
45 * Do random memory allocations.
46 *
47 * For each one, ensure that it is at least 16 bytes in size (that
48 * being what our current malloc returns for the minsize of an
49 * object, alignment wise);
50 *
51 * For zero-byte allocations, check that they are still aligned.
52 *
53 * For each object, ensure that they are correctly protected or not
54 * protected.
55 *
56 * Does not regress test malloc + free combinations ... it should.
57 */
58int
59main(int argc, char *argv[])
60{
61 caddr_t blob;
62 int size, tsize;
63 int prot;
64 int rval = 0, fuckup = 0;
65 long limit = 200000, count;
66 int ch, silent = 0;
67 char *ep;
68 extern char *__progname;
69
70 while ((ch = getopt(argc, argv, "sn:")) != -1) {
71 switch (ch) {
72 case 's':
73 silent = 1;
74 break;
75 case 'n':
76 errno = 0;
77 limit = strtol(optarg, &ep, 10);
78 if (optarg[0] == '\0' || *ep != '\0' ||
79 (errno == ERANGE &&
80 (limit == LONG_MAX || limit == LONG_MIN)))
81 goto usage;
82 break;
83 default:
84usage:
85 fprintf(stderr, "Usage: %s [-s][-n <count>]\n",
86 __progname);
87 exit(1);
88 }
89 }
90
91 if (limit == 0)
92 limit = LONG_MAX;
93
94 for (count = 0; count < limit; count++) {
95 size = arc4random_uniform(SIZE);
96 blob = malloc(size);
97 if (blob == NULL) {
98 fprintf(stderr, "success: out of memory\n");
99 exit(rval);
100 }
101
102 tsize = size == 0 ? 16 : size;
103 fuckup = 0;
104 prot = test(blob, tsize);
105
106 if (size == 0 && prot < 2)
107 fuckup = 1;
108
109 if (fuckup) {
110 printf("%8p %6d %20s %10s\n", blob, size,
111 prot_table[prot], fuckup ? "fuckup" : "");
112 rval = 1;
113 }
114
115 if (!silent && count % 100000 == 0 && count != 0)
116 fprintf(stderr, "count = %ld\n", count);
117 }
118
119 return rval;
120}
diff --git a/src/regress/lib/libc/malloc/malloc_errno/Makefile b/src/regress/lib/libc/malloc/malloc_errno/Makefile
deleted file mode 100644
index 73ebe37491..0000000000
--- a/src/regress/lib/libc/malloc/malloc_errno/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2003/07/15 10:06:31 otto Exp $
2
3PROG= malloc_errno
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c b/src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c
deleted file mode 100644
index 1759291f38..0000000000
--- a/src/regress/lib/libc/malloc/malloc_errno/malloc_errno.c
+++ /dev/null
@@ -1,49 +0,0 @@
1/* $OpenBSD: malloc_errno.c,v 1.5 2019/06/11 22:16:13 bluhm Exp $ */
2/*
3 * Public domain. 2003, Otto Moerbeek
4 */
5#include <err.h>
6#include <errno.h>
7#include <stdio.h>
8#include <stdlib.h>
9
10/* On arm64 with 2G of memory this test hangs while junking. */
11char *malloc_options = "jj";
12
13static void
14testerrno(size_t sz)
15{
16 void *p;
17
18 errno = -1;
19 p = malloc(sz);
20
21 if (p == NULL && errno != ENOMEM)
22 errx(1, "fail: %lx %p %d", (unsigned long)sz, p, errno);
23
24 /* if alloc succeeded, test if errno did not change */
25 if (p != NULL && errno != -1)
26 errx(1, "fail: %lx %p %d", (unsigned long)sz, p, errno);
27
28 free(p);
29}
30
31/*
32 * Provide some (silly) arguments to malloc(), and check if ERRNO is set
33 * correctly.
34 */
35int
36main(int argc, char *argv[])
37{
38 size_t i;
39
40 testerrno(1);
41 testerrno(100000);
42 testerrno(-1);
43 testerrno(-1000);
44 testerrno(-10000);
45 testerrno(-10000000);
46 for (i = 0; i < 0x10; i++)
47 testerrno(i * 0x10000000);
48 return 0;
49}
diff --git a/src/regress/lib/libc/malloc/malloc_general/Makefile b/src/regress/lib/libc/malloc/malloc_general/Makefile
deleted file mode 100644
index ddc3220854..0000000000
--- a/src/regress/lib/libc/malloc/malloc_general/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
1# $OpenBSD: Makefile,v 1.4 2019/06/04 05:30:39 otto Exp $
2
3REGRESS_TARGETS= t1 t2 t3 t4 t5 t6 t7
4PROG= malloc_general
5
6.include <bsd.regress.mk>
7
8t1: malloc_general
9 MALLOC_OPTIONS=cfgju ${.OBJDIR}/malloc_general
10
11t2: malloc_general
12 MALLOC_OPTIONS=cfgjuC ${.OBJDIR}//malloc_general
13
14t3: malloc_general
15 MALLOC_OPTIONS=cfgjuJ ${.OBJDIR}//malloc_general
16
17t4: malloc_general
18 MALLOC_OPTIONS=cfgjuF ${.OBJDIR}//malloc_general
19
20t5: malloc_general
21 MALLOC_OPTIONS=cfgjuG ${.OBJDIR}//malloc_general
22
23t6: malloc_general
24 MALLOC_OPTIONS=cfgjuS ${.OBJDIR}//malloc_general
25
26t7: malloc_general
27 MALLOC_OPTIONS=cfgjuFGJ ${.OBJDIR}//malloc_general
diff --git a/src/regress/lib/libc/malloc/malloc_general/malloc_general.c b/src/regress/lib/libc/malloc/malloc_general/malloc_general.c
deleted file mode 100644
index 7dbaf5d8aa..0000000000
--- a/src/regress/lib/libc/malloc/malloc_general/malloc_general.c
+++ /dev/null
@@ -1,123 +0,0 @@
1/* $OpenBSD */
2/*
3 * Copyright (c) 2017 Otto Moerbeek <otto@drijf.net>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <err.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22
23/* $define VERBOSE */
24
25#define N 1000
26
27size_t
28size(void)
29{
30 int p = arc4random_uniform(13) + 3;
31 return arc4random_uniform(1 << p);
32}
33
34struct { void *p; size_t sz; } a[N];
35
36void
37fill(u_char *p, size_t sz)
38{
39 size_t i;
40
41 for (i = 0; i < sz; i++)
42 p[i] = i % 256;
43}
44
45void
46check(u_char *p, size_t sz)
47{
48 size_t i;
49
50 for (i = 0; i < sz; i++)
51 if (p[i] != i % 256)
52 errx(1, "check");
53}
54
55int
56main(int argc, char *argv[])
57{
58 int count, p, r, i;
59 void * q;
60 size_t sz;
61
62 for (count = 0; count < 800000; count++) {
63 if (count % 10000 == 0) {
64 printf(".");
65 fflush(stdout);
66 }
67 p = arc4random_uniform(2);
68 i = arc4random_uniform(N);
69 switch (p) {
70 case 0:
71 if (a[i].p) {
72#ifdef VERBOSE
73 printf("F %p\n", a[i].p);
74#endif
75 if (a[i].p)
76 check(a[i].p, a[i].sz);
77 free(a[i].p);
78 a[i].p = NULL;
79 }
80 sz = size();
81#ifdef VERBOSE
82 printf("M %zu=", sz);
83#endif
84 r = arc4random_uniform(2);
85 a[i].p = r == 0 ? malloc_conceal(sz) : malloc(sz);
86 a[i].sz = sz;
87#ifdef VERBOSE
88 printf("%p\n", a[i].p);
89#endif
90 if (a[i].p)
91 fill(a[i].p, sz);
92 break;
93 case 1:
94 sz = size();
95#ifdef VERBOSE
96 printf("R %p %zu=", a[i].p, sz);
97#endif
98 q = realloc(a[i].p, sz);
99#ifdef VERBOSE
100 printf("%p\n", q);
101#endif
102 if (a[i].p && q)
103 check(q, a[i].sz < sz ? a[i].sz : sz);
104 if (q) {
105 a[i].p = q;
106 a[i].sz = sz;
107 fill(a[i].p, sz);
108 }
109 break;
110 }
111 }
112 for (i = 0; i < N; i++) {
113 if (a[i].p)
114 check(a[i].p, a[i].sz);
115 r = arc4random_uniform(2);
116 if (r)
117 free(a[i].p);
118 else
119 freezero(a[i].p, a[i].sz);
120 }
121 printf("\n");
122 return 0;
123}
diff --git a/src/regress/lib/libc/malloc/malloc_threaderr/Makefile b/src/regress/lib/libc/malloc/malloc_threaderr/Makefile
deleted file mode 100644
index 2d715af58b..0000000000
--- a/src/regress/lib/libc/malloc/malloc_threaderr/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2018/01/28 14:55:24 otto Exp $
2
3# This test is supposed to print a malloc error and create a core dump
4
5REGRESS_TARGETS= t1
6PROG= malloc_threaderr
7LDADD+= -pthread
8DPADD+= ${LIBPTHREAD}
9
10.include <bsd.regress.mk>
11
12t1: malloc_threaderr
13 ${.OBJDIR}/malloc_threaderr 2>&1 | fgrep 'in free(): bogus pointer (double free?)'
diff --git a/src/regress/lib/libc/malloc/malloc_threaderr/malloc_threaderr.c b/src/regress/lib/libc/malloc/malloc_threaderr/malloc_threaderr.c
deleted file mode 100644
index f34f37fc93..0000000000
--- a/src/regress/lib/libc/malloc/malloc_threaderr/malloc_threaderr.c
+++ /dev/null
@@ -1,58 +0,0 @@
1/*
2 * Copyright (c) 2018 Otto Moerbeek <otto@drijf.net>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <err.h>
18#include <stdio.h>
19#include <stdlib.h>
20#include <pthread.h>
21
22pthread_cond_t cond;
23pthread_mutex_t mutex;
24
25void *p;
26
27void *m(void *arg)
28{
29 p = malloc(100000);
30 if (p == NULL)
31 err(1, NULL);
32 return NULL;
33}
34
35void *f(void *arg)
36{
37 free(p);
38 free(p);
39 return NULL;
40}
41
42int
43main(void)
44{
45 pthread_t t1, t2;
46
47 printf("This test is supposed to print a malloc error and create a core dump\n");
48
49 if (pthread_create(&t1, NULL, m, NULL))
50 err(1, "pthread_create");
51 pthread_join(t1, NULL);
52
53 if (pthread_create(&t2, NULL, f, NULL))
54 err(1, "pthread_create");
55 pthread_join(t2, NULL);
56
57 return 0;
58}
diff --git a/src/regress/lib/libc/malloc/malloc_ulimit1/Makefile b/src/regress/lib/libc/malloc/malloc_ulimit1/Makefile
deleted file mode 100644
index 46ced27a98..0000000000
--- a/src/regress/lib/libc/malloc/malloc_ulimit1/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2006/04/18 19:03:30 otto Exp $
2
3PROG= malloc_ulimit1
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/malloc/malloc_ulimit1/malloc_ulimit1.c b/src/regress/lib/libc/malloc/malloc_ulimit1/malloc_ulimit1.c
deleted file mode 100644
index 799d2b9117..0000000000
--- a/src/regress/lib/libc/malloc/malloc_ulimit1/malloc_ulimit1.c
+++ /dev/null
@@ -1,48 +0,0 @@
1/* $OpenBSD: malloc_ulimit1.c,v 1.5 2019/06/12 11:31:36 bluhm Exp $ */
2
3/* Public Domain, 2006, Otto Moerbeek <otto@drijf.net> */
4
5#include <sys/types.h>
6#include <sys/time.h>
7#include <sys/resource.h>
8#include <err.h>
9#include <stdlib.h>
10#include <stdio.h>
11
12/*
13 * This code tries to trigger the case present in -current as of April
14 * 2006) where the allocation of the region itself succeeds, but the
15 * page dir entry pages fails.
16 * This in turn trips a "hole in directories" error.
17 * Having a large (512M) ulimit -m helps a lot in triggering the
18 * problem. Note that you may need to run this test multiple times to
19 * see the error.
20*/
21
22#define STARTI 1300
23#define FACTOR 1024
24
25/* This test takes forever with junking turned on. */
26char *malloc_options = "jj";
27
28int
29main()
30{
31 struct rlimit lim;
32 size_t sz;
33 int i;
34 void *p;
35
36 if (getrlimit(RLIMIT_DATA, &lim) == -1)
37 err(1, "getrlimit");
38
39 sz = lim.rlim_cur / FACTOR;
40
41 for (i = STARTI; i >= 0; i--) {
42 size_t len = (sz-i) * FACTOR;
43 p = malloc(len);
44 free(p);
45 free(malloc(4096));
46 }
47 return (0);
48}
diff --git a/src/regress/lib/libc/malloc/malloc_ulimit2/Makefile b/src/regress/lib/libc/malloc/malloc_ulimit2/Makefile
deleted file mode 100644
index bc83666415..0000000000
--- a/src/regress/lib/libc/malloc/malloc_ulimit2/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2006/04/18 19:04:03 otto Exp $
2
3PROG= malloc_ulimit2
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/malloc/malloc_ulimit2/malloc_ulimit2.c b/src/regress/lib/libc/malloc/malloc_ulimit2/malloc_ulimit2.c
deleted file mode 100644
index 5d9e3774e7..0000000000
--- a/src/regress/lib/libc/malloc/malloc_ulimit2/malloc_ulimit2.c
+++ /dev/null
@@ -1,46 +0,0 @@
1/* $OpenBSD: malloc_ulimit2.c,v 1.5 2019/06/12 11:31:36 bluhm Exp $ */
2
3/* Public Domain, 2006, Otto Moerbeek <otto@drijf.net> */
4
5#include <sys/types.h>
6#include <sys/time.h>
7#include <sys/resource.h>
8#include <err.h>
9#include <stdlib.h>
10#include <stdio.h>
11
12#define FACTOR 1024
13
14/* This test takes forever with junking turned on. */
15char *malloc_options = "jj";
16
17int
18main()
19{
20 struct rlimit lim;
21 size_t sz;
22 int i;
23 void *p;
24
25 if (getrlimit(RLIMIT_DATA, &lim) == -1)
26 err(1, "getrlimit");
27
28 sz = lim.rlim_cur / FACTOR;
29
30 for (i = 0; ; i++) {
31 size_t len = (sz-i) * FACTOR;
32 p = malloc(len);
33 if (p != NULL) {
34 free(p);
35 break;
36 }
37 }
38 i += 10;
39 for (; i >= 0; i--) {
40 size_t len = (sz-i) * FACTOR;
41 p = malloc(len);
42 free(p);
43 free(malloc(4096));
44 }
45 return (0);
46}
diff --git a/src/regress/lib/libc/mkstemp/Makefile b/src/regress/lib/libc/mkstemp/Makefile
deleted file mode 100644
index dc7eb281a9..0000000000
--- a/src/regress/lib/libc/mkstemp/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2010/02/11 07:35:38 guenther Exp $
2
3PROG=mkstemp_test
4CLEANFILES+= ; rm -rf output
5
6O = output
7
8# The ktrace/kdump/perl combo verifies that all open() calls that
9# were passed O_CREAT were also passed O_EXCL
10run-regress-${PROG}: ${PROG}
11 mkdir -p $O && cd $O && ktrace ../${PROG}
12 cd $O && kdump | perl -mFcntl -nl \
13 -e '/ open\([^,]*,([^,]+)/ or next;' \
14 -e '$$f = oct($$1);' \
15 -e 'if ($$f & O_CREAT && !($$f & O_EXCL)) {' \
16 -e ' print "FAIL"; exit 1' \
17 -e '}'
18
19.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/mkstemp/mkstemp_test.c b/src/regress/lib/libc/mkstemp/mkstemp_test.c
deleted file mode 100644
index c1c05eae39..0000000000
--- a/src/regress/lib/libc/mkstemp/mkstemp_test.c
+++ /dev/null
@@ -1,165 +0,0 @@
1/*
2 * Copyright (c) 2010 Philip Guenther <guenther@openbsd.org>
3 *
4 * Public domain.
5 *
6 * Verify that mkstemp() and mkstemps() doesn't overrun or underrun
7 * the template buffer and that it can generate names that don't
8 * contain any X's
9 */
10
11#include <sys/param.h>
12#include <sys/mman.h>
13#include <sys/stat.h>
14
15#include <err.h>
16#include <errno.h>
17#include <stdio.h>
18#include <stdlib.h>
19#include <string.h>
20#include <unistd.h>
21
22#define MAX_TEMPLATE_LEN 10
23#define MAX_TRIES 100
24#define MIN_Xs 6
25
26#define SUFFIX ".suff"
27#define SLEN (sizeof SUFFIX - 1)
28
29long pg;
30
31/*
32 * verify that a path generated by mkstemp() or mkstemp() looks like a
33 * reasonable expansion of the template and matches the fd. Returns true
34 * if all the X's were replaced with non-X's
35 */
36int
37check(int fd, char const *path, char const *prefix, size_t plen,
38 char const *suffix, size_t slen, int tlen)
39{
40 struct stat sb, fsb;
41 char const *p;
42
43 if (tlen < MIN_Xs) {
44 if (fd >= 0)
45 errx(1, "mkstemp(%s) succeed with too few Xs", path);
46 if (errno != EINVAL)
47 err(1, "mkstemp(%s) failed with wrong errno", path);
48 return 1;
49 }
50 if (fd < 0)
51 err(1, "mkstemp(%s)", path);
52 if (stat(path, &sb))
53 err(1, "stat(%s)", path);
54 if (fstat(fd, &fsb))
55 err(1, "fstat(%d==%s)", fd, path);
56 if (sb.st_dev != fsb.st_dev || sb.st_ino != fsb.st_ino)
57 errx(1, "stat mismatch");
58 close(fd);
59 if (memcmp(path, prefix, plen) != 0)
60 errx(1, "prefix changed! %s vs %s", prefix, path);
61 if (memcmp(path + plen + tlen, suffix, slen + 1) != 0)
62 errx(1, "suffix changed! %s vs %s", suffix, path);
63 for (p = path + plen; p < path + plen + tlen; p++)
64 if (*p == '\0')
65 errx(1, "unexpected truncation");
66 else if (*p == 'X')
67 return 0;
68 return 1;
69}
70
71
72void
73try_mkstemp(char *p, char const *prefix, int len)
74{
75 char *q;
76 size_t plen = strlen(prefix);
77 int tries, fd;
78
79 for (tries = 0; tries < MAX_TRIES; tries++) {
80 memcpy(p, prefix, plen);
81 memset(p + plen, 'X', len);
82 p[plen + len] = '\0';
83 fd = mkstemp(p);
84 if (check(fd, p, prefix, plen, "", 0, len))
85 return;
86 }
87 errx(1, "exceeded MAX_TRIES");
88}
89
90void
91try_mkstemps(char *p, char const *prefix, int len, char const *suffix)
92{
93 char *q;
94 size_t plen = strlen(prefix);
95 size_t slen = strlen(suffix);
96 int tries, fd;
97
98 for (tries = 0; tries < MAX_TRIES; tries++) {
99 memcpy(p, prefix, plen);
100 memset(p + plen, 'X', len);
101 memcpy(p + plen + len, suffix, slen + 1);
102 fd = mkstemps(p, slen);
103 if (check(fd, p, prefix, plen, suffix, slen, len))
104 return;
105 }
106 errx(1, "exceeded MAX_TRIES");
107}
108
109int
110main(void)
111{
112 struct stat sb, fsb;
113 char cwd[MAXPATHLEN + 1];
114 char *p;
115 size_t clen;
116 int i;
117
118 pg = sysconf(_SC_PAGESIZE);
119 if (getcwd(cwd, sizeof cwd - 1) == NULL)
120 err(1, "getcwd");
121 clen = strlen(cwd);
122 cwd[clen++] = '/';
123 cwd[clen] = '\0';
124 p = mmap(NULL, pg * 3, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0);
125 if (p == MAP_FAILED)
126 err(1, "mmap");
127 if (mprotect(p, pg, PROT_NONE) || mprotect(p + pg * 2, pg, PROT_NONE))
128 err(1, "mprotect");
129 p += pg;
130
131 i = MAX_TEMPLATE_LEN + 1;
132 while (i-- > 0) {
133 /* try first at the start of a page, no prefix */
134 try_mkstemp(p, "", i);
135 /* now at the end of the page, no prefix */
136 try_mkstemp(p + pg - i - 1, "", i);
137 /* start of the page, prefixed with the cwd */
138 try_mkstemp(p, cwd, i);
139 /* how about at the end of the page, prefixed with cwd? */
140 try_mkstemp(p + pg - clen - i - 1, cwd, i);
141
142 /* again, with mkstemps() and an empty suffix */
143 /* try first at the start of a page, no prefix */
144 try_mkstemps(p, "", i, "");
145 /* now at the end of the page, no prefix */
146 try_mkstemps(p + pg - i - 1, "", i, "");
147 /* start of the page, prefixed with the cwd */
148 try_mkstemps(p, cwd, i, "");
149 /* how about at the end of the page, prefixed with cwd? */
150 try_mkstemps(p + pg - clen - i - 1, cwd, i, "");
151
152 /* mkstemps() and a non-empty suffix */
153 /* try first at the start of a page, no prefix */
154 try_mkstemps(p, "", i, SUFFIX);
155 /* now at the end of the page, no prefix */
156 try_mkstemps(p + pg - i - SLEN - 1, "", i, SUFFIX);
157 /* start of the page, prefixed with the cwd */
158 try_mkstemps(p, cwd, i, SUFFIX);
159 /* how about at the end of the page, prefixed with cwd? */
160 try_mkstemps(p + pg - clen - i - SLEN - 1, cwd, i, SUFFIX);
161
162 }
163
164 return 0;
165}
diff --git a/src/regress/lib/libc/modf/Makefile b/src/regress/lib/libc/modf/Makefile
deleted file mode 100644
index 587c595f12..0000000000
--- a/src/regress/lib/libc/modf/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
1PROG=modf_test
2
3.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/modf/modf_test.c b/src/regress/lib/libc/modf/modf_test.c
deleted file mode 100644
index f732533635..0000000000
--- a/src/regress/lib/libc/modf/modf_test.c
+++ /dev/null
@@ -1,35 +0,0 @@
1/* Public domain, 2014, Tobias Ulmer <tobiasu@tmux.org> */
2
3/* Test for bug introduced in 4.4BSD modf() on sparc */
4
5#include <math.h>
6
7#define BIGFLOAT (5e15) /* Number large enough to trigger the "big" case */
8
9int
10main(void)
11{
12 double f, i;
13
14 f = modf(BIGFLOAT, &i);
15 if (i != BIGFLOAT)
16 return 1;
17 if (f != 0.0)
18 return 1;
19
20 /* Repeat, maybe we were lucky */
21 f = modf(BIGFLOAT, &i);
22 if (i != BIGFLOAT)
23 return 1;
24 if (f != 0.0)
25 return 1;
26
27 /* With negative number, for good measure */
28 f = modf(-BIGFLOAT, &i);
29 if (i != -BIGFLOAT)
30 return 1;
31 if (f != 0.0)
32 return 1;
33
34 return 0;
35}
diff --git a/src/regress/lib/libc/netdb/Makefile b/src/regress/lib/libc/netdb/Makefile
deleted file mode 100644
index 8254607227..0000000000
--- a/src/regress/lib/libc/netdb/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2004/10/25 15:10:36 otto Exp $
2
3PROG= netdb
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/netdb/netdb.c b/src/regress/lib/libc/netdb/netdb.c
deleted file mode 100644
index fabb3ee4e1..0000000000
--- a/src/regress/lib/libc/netdb/netdb.c
+++ /dev/null
@@ -1,183 +0,0 @@
1/* $OpenBSD: netdb.c,v 1.2 2011/05/01 04:27:07 guenther Exp $ */
2
3/*
4 * Public domain, 2004, Otto Moerbeek <otto@drijf.net>
5 */
6
7#include <err.h>
8#include <netdb.h>
9#include <stdarg.h>
10#include <string.h>
11
12int ret = 0;
13
14void
15checkp(int n, struct protoent *p, int proto, const char *name, ...)
16{
17 va_list va;
18 char *a;
19 int i;
20
21 if (p == NULL) {
22 warnx("%d proto struct is NULL", n);
23 ret = 1;
24 return;
25 }
26 if (p->p_proto != proto) {
27 warnx("%d proto num mismatch %d %d", n, p->p_proto, proto);
28 ret = 1;
29 }
30 if (strcmp(p->p_name, name) != 0) {
31 warnx("%d proto name mismatch %s %s", n, p->p_name, name);
32 ret = 1;
33 }
34 va_start(va, name);
35 a = va_arg(va, char *);
36 i = 0;
37 while (a != NULL) {
38 if (strcmp(p->p_aliases[i], a) != 0) {
39 warnx("%d proto alias mismatch %s %s", n,
40 p->p_aliases[i], a);
41 ret = 1;
42 }
43 i++;
44 a = va_arg(va, char *);
45 }
46 if (p->p_aliases[i] != NULL) {
47 warnx("%d proto alias list does not end with NULL", n);
48 ret = 1;
49 }
50 va_end(va);
51}
52
53
54void
55checks(int n, struct servent *s, int port, const char *proto,
56 const char *name, ...)
57{
58 va_list va;
59 char *a;
60 int i;
61
62 if (s == NULL) {
63 warnx("%d serv struct is NULL", n);
64 ret = 1;
65 return;
66 }
67 if (s->s_port != ntohs(port)) {
68 warnx("%d port num mismatch %d %d", n, s->s_port, port);
69 ret = 1;
70 }
71 if (strcmp(s->s_name, name) != 0) {
72 warnx("%d serv name mismatch %s %s", n, s->s_name, name);
73 ret = 1;
74 }
75 if (strcmp(s->s_proto, proto) != 0) {
76 warnx("%d serv proto mismatch %s %s", n, s->s_proto, proto);
77 ret = 1;
78 }
79 va_start(va, name);
80 a = va_arg(va, char *);
81 i = 0;
82 while (a != NULL) {
83 if (strcmp(s->s_aliases[i], a) != 0) {
84 warnx("%d serv alias mismatch %s %s", n,
85 s->s_aliases[i], a);
86 ret = 1;
87 }
88 i++;
89 a = va_arg(va, char *);
90 }
91 if (s->s_aliases[i] != NULL) {
92 warnx("%d serv alias list does not end with NULL", n);
93 ret = 1;
94 }
95 va_end(va);
96}
97
98int
99main()
100{
101 struct protoent *p;
102 struct protoent protoent;
103 struct protoent_data protoent_data;
104 struct servent *s;
105 struct servent servent;
106 struct servent_data servent_data;
107 int r;
108
109 p = getprotobynumber(35);
110 checkp(1, p, 35, "idpr", "IDPR", (char *)NULL);
111
112 p = getprotobyname("igp");
113 checkp(2, p, 9, "igp", "IGP", (char *) NULL);
114
115 p = getprotobyname("RDP");
116 checkp(3, p, 27, "rdp", "RDP", (char *) NULL);
117
118 p = getprotobyname("vrrp");
119 checkp(4, p, 112, "carp", "CARP", "vrrp", (char *) NULL);
120
121 p = getprotobyname("nonexistent");
122 if (p != NULL)
123 err(1, "nonexistent proto found");
124
125 memset(&protoent_data, 0, sizeof(protoent_data));
126 r = getprotobynumber_r(35, &protoent, &protoent_data);
127 if (r != 0)
128 err(1, "proto not found");
129
130 checkp(5, &protoent, 35, "idpr", "IDPR", (char *)NULL);
131
132 r = getprotobyname_r("vrrp", &protoent, &protoent_data);
133 if (r != 0)
134 err(1, "proto not found");
135 checkp(6, &protoent, 112, "carp", "CARP", "vrrp", (char *) NULL);
136
137 r = getprotobyname_r("nonexistent", &protoent, &protoent_data);
138 if (r != -1)
139 err(1, "nonexistent proto found");
140
141 r = getprotobyname_r("", &protoent, &protoent_data);
142 if (r != -1)
143 err(1, "nonexistent proto found");
144
145
146 r = getprotobynumber_r(256, &protoent, &protoent_data);
147 if (r != -1)
148 err(1, "nonexistent proto found");
149
150 s = getservbyname("zip", NULL);
151 checks(7, s, 6, "ddp", "zip", (char *)NULL);
152
153 s = getservbyname("nicname", "tcp");
154 checks(8, s, 43, "tcp", "whois", "nicname", (char *)NULL);
155
156 s = getservbyport(htons(42), "tcp");
157 checks(9, s, 42, "tcp", "nameserver", "name", (char *)NULL);
158
159 memset(&servent_data, 0, sizeof(servent_data));
160 r = getservbyname_r("zip", "ddp", &servent, &servent_data);
161 if (r != 0)
162 err(1, "servent not found");
163 checks(10, &servent, 6, "ddp", "zip", (char *)NULL);
164
165 r = getservbyport_r(htons(520), NULL, &servent, &servent_data);
166 if (r != 0)
167 err(1, "servent not found");
168 checks(11, &servent, 520, "udp", "route", "router", "routed", (char *)NULL);
169
170 r = getservbyname_r("nonexistent", NULL, &servent, &servent_data);
171 if (r != -1)
172 err(1, "nonexiststent servent found");
173
174 r = getservbyport_r(htons(50000), NULL, &servent, &servent_data);
175 if (r != -1)
176 err(1, "nonexistent servent found");
177
178 r = getservbyport_r(htons(520), "tcp", &servent, &servent_data);
179 if (r != -1)
180 err(1, "nonexistent servent found");
181
182 return ret;
183}
diff --git a/src/regress/lib/libc/open_memstream/Makefile b/src/regress/lib/libc/open_memstream/Makefile
deleted file mode 100644
index ab7d194232..0000000000
--- a/src/regress/lib/libc/open_memstream/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2013/06/02 15:33:53 dtucker Exp $
2
3PROG= open_memstreamtest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/open_memstream/open_memstreamtest.c b/src/regress/lib/libc/open_memstream/open_memstreamtest.c
deleted file mode 100644
index e8da0e03b2..0000000000
--- a/src/regress/lib/libc/open_memstream/open_memstreamtest.c
+++ /dev/null
@@ -1,186 +0,0 @@
1/* $OpenBSD: open_memstreamtest.c,v 1.6 2019/05/13 02:54:54 bluhm Exp $ */
2
3/*
4 * Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <err.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23#include <unistd.h>
24
25#define OFFSET 16384
26
27const char start[] = "start";
28const char hello[] = "hello";
29
30int
31main(void)
32{
33 FILE *fp;
34 char *buf = (char *)0xff;
35 size_t size = 0;
36 off_t off;
37 int i, failures = 0;
38
39 if ((fp = open_memstream(&buf, &size)) == NULL) {
40 warn("open_memstream failed");
41 return (1);
42 }
43
44 off = ftello(fp);
45 if (off != 0) {
46 warnx("ftello failed. (1)");
47 failures++;
48 }
49
50 if (fflush(fp) != 0) {
51 warnx("fflush failed. (2)");
52 failures++;
53 }
54
55 if (size != 0) {
56 warnx("string should be empty. (3)");
57 failures++;
58 }
59
60 if (buf == (char *)0xff) {
61 warnx("buf not updated. (4)");
62 failures++;
63 }
64
65 if (fseek(fp, OFFSET, SEEK_SET) != 0) {
66 warnx("failed to fseek. (5)");
67 failures++;
68 }
69
70 if (fprintf(fp, hello) == EOF) {
71 warnx("fprintf failed. (6)");
72 failures++;
73 }
74
75 if (fflush(fp) == EOF) {
76 warnx("fflush failed. (7)");
77 failures++;
78 }
79
80 if (size != OFFSET + sizeof(hello)-1) {
81 warnx("failed, size %zu should be %zu. (8)",
82 size, OFFSET + sizeof(hello)-1);
83 failures++;
84 }
85
86 if (fseek(fp, 0, SEEK_SET) != 0) {
87 warnx("failed to fseek. (9)");
88 failures++;
89 }
90
91 if (fprintf(fp, start) == EOF) {
92 warnx("fprintf failed. (10)");
93 failures++;
94 }
95
96 if (fflush(fp) == EOF) {
97 warnx("fflush failed. (11)");
98 failures++;
99 }
100
101 if (size != sizeof(start)-1) {
102 warnx("failed, size %zu should be %zu. (12)",
103 size, sizeof(start)-1);
104 failures++;
105 }
106
107 /* Needed for sparse files */
108 if (strncmp(buf, start, sizeof(start)-1) != 0) {
109 warnx("failed, buffer didn't start with '%s'. (13)", start);
110 failures++;
111 }
112 for (i = sizeof(start)-1; i < OFFSET; i++)
113 if (buf[i] != '\0') {
114 warnx("failed, buffer non zero (offset %d). (14)", i);
115 failures++;
116 break;
117 }
118
119 if (memcmp(buf + OFFSET, hello, sizeof(hello)-1) != 0) {
120 warnx("written string incorrect. (15)");
121 failures++;
122 }
123
124 /* verify that simply seeking past the end doesn't increase the size */
125 if (fseek(fp, 100, SEEK_END) != 0) {
126 warnx("failed to fseek. (16)");
127 failures++;
128 }
129
130 if (fflush(fp) == EOF) {
131 warnx("fflush failed. (17)");
132 failures++;
133 }
134
135 if (size != OFFSET + sizeof(hello)-1) {
136 warnx("failed, size %zu should be %zu. (18)",
137 size, OFFSET + sizeof(hello)-1);
138 failures++;
139 }
140
141 if (fseek(fp, -1, SEEK_END) != 0) {
142 warnx("failed to fseek. (19)");
143 failures++;
144 }
145
146 if (fseek(fp, 8, SEEK_SET) != 0) {
147 warnx("failed to fseek. (20)");
148 failures++;
149 }
150
151 if (ftell(fp) != 8) {
152 warnx("failed seek test. (21)");
153 failures++;
154 }
155
156 /* Try to seek backward */
157 if (fseek(fp, -1, SEEK_CUR) != 0) {
158 warnx("failed to fseek. (22)");
159 failures++;
160 }
161
162 if (ftell(fp) != 7) {
163 warnx("failed seeking backward. (23)");
164 failures++;
165 }
166
167 if (fseek(fp, 5, SEEK_CUR) != 0) {
168 warnx("failed to fseek. (24)");
169 failures++;
170 }
171
172 if (fclose(fp) == EOF) {
173 warnx("fclose failed. (25)");
174 failures++;
175 }
176
177 if (size != 12) {
178 warnx("failed, size %zu should be %u. (26)",
179 size, 12);
180 failures++;
181 }
182
183 free(buf);
184
185 return (failures);
186}
diff --git a/src/regress/lib/libc/orientation/Makefile b/src/regress/lib/libc/orientation/Makefile
deleted file mode 100644
index 5c73702abe..0000000000
--- a/src/regress/lib/libc/orientation/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2010/06/29 16:20:28 guenther Exp $
2
3NOMAN=
4PROG=orientation_test
5CPPFLAGS+=-I${.CURDIR}/../../../../lib/libc
6
7run-regress-${PROG}: ${PROG}
8 ./${PROG}
9
10.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/orientation/orientation_test.c b/src/regress/lib/libc/orientation/orientation_test.c
deleted file mode 100644
index 4d713f80bf..0000000000
--- a/src/regress/lib/libc/orientation/orientation_test.c
+++ /dev/null
@@ -1,264 +0,0 @@
1/* $OpenBSD: orientation_test.c,v 1.5 2014/04/22 02:29:52 lteo Exp $ */
2
3/*
4 * Copyright (c) 2009 Philip Guenther
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/*
33 * Test whether the various stdio functions set the stream orientation
34 * ("width") as they should
35 */
36
37#include <sys/types.h>
38#include <err.h>
39#include <stddef.h>
40#include <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43#include <unistd.h>
44#include <wchar.h>
45
46char filename[] = "/tmp/fwide.XXXXXXXXXX";
47
48FILE *dup_stdout = NULL;
49int failures = 0;
50
51void
52fail(int line, int r, char const *expect, char const *test)
53{
54 failures++;
55 fprintf(dup_stdout,
56 "FAIL: %d: fwide returned %d, expected %s 0 after %s\n",
57 line, r, expect, test);
58}
59
60FILE *
61setup(int line)
62{
63 FILE *f;
64 int r;
65
66 if ((f = fopen(filename, "r+")) == NULL)
67 err(2, "fopen");
68 if ((r = fwide(f, 0)) != 0)
69 fail(line, r, "==", "fopen");
70 return (f);
71}
72
73FILE *
74setup_std(FILE *std, int line)
75{
76 int r;
77
78 if (freopen(filename, "r+", std) == NULL)
79 err(2, "freopen");
80 if ((r = fwide(std, 0)) != 0)
81 fail(line, r, "==", "freopen");
82 return (std);
83}
84
85#define TEST_(x, op) \
86 do { \
87 f = setup(__LINE__); \
88 x; \
89 if (!((r = fwide(f, 0)) op 0)) \
90 fail(__LINE__, r, #op, #x); \
91 fclose(f); \
92 } while (0)
93
94#define TEST_STD_(std, x, op) \
95 do { \
96 f = setup_std(std, __LINE__); \
97 x; \
98 if (!((r = fwide(f, 0)) op 0)) \
99 fail(__LINE__, r, #op, #x); \
100 } while (0)
101
102#define TEST_UNCHANGED(x) TEST_(x, ==)
103#define TEST_NARROW(x) TEST_(x, <)
104#define TEST_WIDE(x) TEST_(x, >)
105#define TEST_UNCHANGED_STD(std, x) TEST_STD_(std, x, ==)
106#define TEST_NARROW_STD(std, x) TEST_STD_(std, x, <)
107#define TEST_WIDE_STD(std, x) TEST_STD_(std, x, >)
108
109int
110main(int argc, char *argv[])
111{
112 char buffer[BUFSIZ];
113 wchar_t wbuffer[BUFSIZ];
114 char *buf;
115 wchar_t *wbuf;
116 FILE *f;
117 off_t off;
118 fpos_t pos;
119 size_t size;
120 int fd, r;
121 char c;
122 wchar_t wc;
123
124 if ((fd = dup(1)) == -1)
125 err(2, "dup");
126 if ((dup_stdout = fdopen(fd, "w")) == NULL)
127 err(2, "fdopen");
128 if ((fd = mkstemp(filename)) == -1)
129 err(2, "mkstemp");
130 if (write(fd, "0123456789\n\n", 12) != 12 || close(fd))
131 err(2, "write + close");
132
133 /* status */
134 TEST_UNCHANGED(fwide(f, 0));
135 TEST_NARROW(fwide(f, -1));
136 TEST_WIDE(fwide(f, 1));
137 TEST_UNCHANGED(feof(f));
138 TEST_UNCHANGED(ferror(f));
139 TEST_UNCHANGED(fileno(f));
140 TEST_UNCHANGED(clearerr(f));
141
142 /* flush and purge */
143 TEST_UNCHANGED(fflush(f));
144 TEST_UNCHANGED(fpurge(f));
145
146 /* positioning */
147 TEST_UNCHANGED(fgetpos(f, &pos));
148 TEST_UNCHANGED(fgetpos(f, &pos); fsetpos(f, &pos));
149 TEST_UNCHANGED(ftell(f));
150 TEST_UNCHANGED(ftello(f));
151 TEST_UNCHANGED(fseek(f, 1, SEEK_CUR));
152 TEST_UNCHANGED(fseek(f, 1, SEEK_SET));
153 TEST_UNCHANGED(fseek(f, 1, SEEK_END));
154 TEST_UNCHANGED(fseeko(f, 1, SEEK_CUR));
155 TEST_UNCHANGED(fseeko(f, 1, SEEK_SET));
156 TEST_UNCHANGED(fseeko(f, 1, SEEK_END));
157 TEST_UNCHANGED(rewind(f));
158
159 /* buffering */
160 TEST_UNCHANGED(setbuf(f, NULL));
161 TEST_UNCHANGED(setbuf(f, buffer));
162 TEST_UNCHANGED(setvbuf(f, buffer, _IONBF, BUFSIZ));
163 TEST_UNCHANGED(setvbuf(f, buffer, _IOLBF, BUFSIZ));
164 TEST_UNCHANGED(setvbuf(f, buffer, _IOFBF, BUFSIZ));
165 TEST_UNCHANGED(setvbuf(f, NULL, _IONBF, 0));
166 TEST_UNCHANGED(setvbuf(f, NULL, _IOLBF, 0));
167 TEST_UNCHANGED(setvbuf(f, NULL, _IOFBF, 0));
168 TEST_UNCHANGED(setbuffer(f, NULL, 0));
169 TEST_UNCHANGED(setbuffer(f, buffer, BUFSIZ));
170 TEST_UNCHANGED(setlinebuf(f));
171
172 /* locking */
173 TEST_UNCHANGED(flockfile(f);funlockfile(f));
174 TEST_UNCHANGED(ftrylockfile(f);funlockfile(f));
175
176 /* input */
177 TEST_NARROW(getc(f));
178 TEST_NARROW(getc_unlocked(f));
179 TEST_NARROW(fgetc(f));
180 TEST_NARROW(c = fgetc(f); ungetc(c, f));
181 TEST_NARROW(fgets(buffer, BUFSIZ, f));
182 TEST_NARROW(fscanf(f, "%s\n", buffer));
183 TEST_NARROW(fgetln(f, &size));
184
185 /* output */
186 TEST_NARROW(putc('c', f));
187 TEST_NARROW(putc_unlocked('c', f));
188 TEST_NARROW(fputc('c', f));
189 TEST_NARROW(fputs("foo", f));
190 TEST_NARROW(fprintf(f, "%s\n", "foo"));
191
192 /* input from stdin */
193 TEST_NARROW_STD(stdin, getchar());
194 TEST_NARROW_STD(stdin, getchar_unlocked());
195 TEST_NARROW_STD(stdin, scanf("%s\n", buffer));
196
197 /* output to stdout */
198 TEST_NARROW_STD(stdout, putchar('c'));
199 TEST_NARROW_STD(stdout, putchar_unlocked('c'));
200 TEST_NARROW_STD(stdout, puts("foo"));
201 TEST_NARROW_STD(stdout, printf("foo"));
202
203 /* word-size ops */
204 /*
205 * fread and fwrite are specified as being implemented in
206 * terms of fgetc() and fputc() and therefore must set the
207 * stream orientation to narrow.
208 */
209 TEST_NARROW(fread(buffer, 4, BUFSIZ / 4, f));
210 TEST_NARROW(fwrite(buffer, 4, BUFSIZ / 4, f));
211
212 /*
213 * getw() and putw() aren't specified anywhere but logically
214 * should behave the same as fread/fwrite. Not all OSes agree:
215 * Solaris 10 has them not changing the orientation.
216 */
217 TEST_NARROW(getw(f));
218 TEST_NARROW(putw(1234, f));
219
220
221 /* WIDE CHAR TIME! */
222
223 /* input */
224 TEST_WIDE(getwc(f));
225 TEST_WIDE(fgetwc(f));
226 TEST_WIDE(wc = fgetwc(f); ungetwc(wc, f));
227 TEST_WIDE(fgetws(wbuffer, BUFSIZ, f));
228 TEST_WIDE(fwscanf(f, L"%s\n", wbuffer));
229
230 /* output */
231 TEST_WIDE(putwc(L'c', f));
232 TEST_WIDE(fputwc(L'c', f));
233 TEST_WIDE(fputws(L"foo", f));
234 TEST_WIDE(fwprintf(f, L"%s\n", L"foo"));
235
236 /* input from stdin */
237 TEST_WIDE_STD(stdin, getwchar());
238 TEST_WIDE_STD(stdin, wscanf(L"%s\n", wbuffer));
239
240 /* output to stdout */
241 TEST_WIDE_STD(stdout, putwchar(L'c'));
242 TEST_WIDE_STD(stdout, wprintf(L"foo"));
243
244
245 /* memory streams */
246 f = open_memstream(&buf, &size);
247 if (!((r = fwide(f, 0)) < 0))
248 fail(__LINE__, r, "<", "open_memstream()");
249 fclose(f);
250 f = open_wmemstream(&wbuf, &size);
251 if (!((r = fwide(f, 0)) > 0))
252 fail(__LINE__, r, ">", "open_wmemstream()");
253 fclose(f);
254
255
256 /* random stuff? */
257 TEST_UNCHANGED_STD(stderr, perror("foo"));
258
259 remove(filename);
260 if (failures)
261 exit(1);
262 exit(0);
263}
264
diff --git a/src/regress/lib/libc/popen/Makefile b/src/regress/lib/libc/popen/Makefile
deleted file mode 100644
index 25b8668a7a..0000000000
--- a/src/regress/lib/libc/popen/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2002/02/16 01:55:09 art Exp $
2
3PROG=popen
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/popen/popen.c b/src/regress/lib/libc/popen/popen.c
deleted file mode 100644
index 916cb71b03..0000000000
--- a/src/regress/lib/libc/popen/popen.c
+++ /dev/null
@@ -1,98 +0,0 @@
1/* $NetBSD: popen.c,v 1.1 1999/09/30 09:23:23 tron Exp $ */
2
3/*-
4 * Copyright (c) 1999 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matthias Scheler.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <sys/param.h>
33
34#include <err.h>
35#include <errno.h>
36#include <paths.h>
37#include <stdio.h>
38#include <stdlib.h>
39#include <time.h>
40#include <unistd.h>
41
42#define _PATH_CAT "/bin/cat"
43#define BUFSIZE (640*1024)
44 /* 640KB ought to be enough for everyone. */
45#define DATAFILE "popen.data"
46
47int
48main(int argc, char **argv)
49{
50 char *buffer, command[MAXPATHLEN];
51 int index, in;
52 FILE *pipe;
53
54 if ((buffer = malloc(BUFSIZE*sizeof(char))) == NULL)
55 err(1, NULL);
56
57 for (index=0; index<BUFSIZE; index++)
58 buffer[index]=arc4random();
59
60 (void)snprintf(command, sizeof(command), "%s >%s",
61 _PATH_CAT, DATAFILE);
62 if ((pipe = popen(command, "w")) == NULL)
63 err(1, "popen write");
64
65 if (fwrite(buffer, sizeof(char), BUFSIZE, pipe) != BUFSIZE)
66 err(1, "write");
67
68 if (pclose(pipe) == -1)
69 err(1, "pclose");
70
71 (void)snprintf(command, sizeof(command), "%s %s",
72 _PATH_CAT, DATAFILE);
73 if ((pipe = popen(command, "r")) == NULL)
74 err(1, "popen read");
75
76 index = 0;
77 while ((in = fgetc(pipe)) != EOF)
78 if (index == BUFSIZE) {
79 errno = EFBIG;
80 err(1, "read");
81 }
82 else
83 if ((char)in != buffer[index++]) {
84 errno = EINVAL;
85 err(1, "read");
86 }
87
88 if (index < BUFSIZE) {
89 errno = EIO;
90 err(1, "read");
91 }
92
93 if (pclose(pipe) == -1)
94 err(1, "pclose");
95
96 (void)unlink(DATAFILE);
97 return 0;
98}
diff --git a/src/regress/lib/libc/printf/Makefile b/src/regress/lib/libc/printf/Makefile
deleted file mode 100644
index c2e2732d6e..0000000000
--- a/src/regress/lib/libc/printf/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2008/09/07 20:36:10 martynas Exp $
2
3PROG= fp
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/printf/fp.c b/src/regress/lib/libc/printf/fp.c
deleted file mode 100644
index 6ed52fdb49..0000000000
--- a/src/regress/lib/libc/printf/fp.c
+++ /dev/null
@@ -1,217 +0,0 @@
1/* $OpenBSD: fp.c,v 1.1 2008/09/07 20:36:10 martynas Exp $ */
2/*-
3 * Copyright (c) 2002, 2005 David Schultz <das@FreeBSD.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28/*
29 * Test for printf() floating point formats.
30 */
31
32#include <assert.h>
33#include <err.h>
34#include <float.h>
35#include <math.h>
36#include <stdio.h>
37#include <stdarg.h>
38#include <stdint.h>
39#include <stdlib.h>
40#include <string.h>
41
42#define testfmt(result, fmt, ...) \
43 _testfmt((result), __LINE__, #__VA_ARGS__, fmt, __VA_ARGS__)
44void _testfmt(const char *, int, const char *, const char *, ...);
45void smash_stack(void);
46
47int
48main(int argc, char *argv[])
49{
50 /*
51 * Basic tests of decimal output functionality.
52 */
53 testfmt(" 1.000000E+00", "%13E", 1.0);
54 testfmt(" 1.000000", "%13f", 1.0);
55 testfmt(" 1", "%13G", 1.0);
56 testfmt(" 1.000000E+00", "%13LE", 1.0L);
57 testfmt(" 1.000000", "%13Lf", 1.0L);
58 testfmt(" 1", "%13LG", 1.0L);
59
60 testfmt("2.718282", "%.*f", -2, 2.7182818);
61
62 testfmt("1.234568e+06", "%e", 1234567.8);
63 testfmt("1234567.800000", "%f", 1234567.8);
64 testfmt("1.23457E+06", "%G", 1234567.8);
65 testfmt("1.234568e+06", "%Le", 1234567.8L);
66 testfmt("1234567.800000", "%Lf", 1234567.8L);
67 testfmt("1.23457E+06", "%LG", 1234567.8L);
68
69#if (LDBL_MANT_DIG > DBL_MANT_DIG) && !defined(__i386__)
70 testfmt("123456789.864210", "%Lf", 123456789.8642097531L);
71 testfmt("-1.23457E+08", "%LG", -123456789.8642097531L);
72 testfmt("123456789.8642097531", "%.10Lf", 123456789.8642097531L);
73 testfmt(" 3.141592653589793238e-4000", "%L27.18Le",
74 3.14159265358979323846e-4000L);
75#endif /* (LDBL_MANT_DIG > DBL_MANT_DIG) && !defined(__i386__) */
76
77 /*
78 * Infinities and NaNs
79 */
80#ifdef NAN
81 testfmt("nan", "%e", NAN);
82 testfmt("NAN", "%F", NAN);
83 testfmt("nan", "%g", NAN);
84 testfmt("NAN", "%LE", (long double)NAN);
85 testfmt(" nan", "%05e", NAN);
86#endif /* NAN */
87
88 testfmt("INF", "%E", HUGE_VAL);
89 testfmt("-inf", "%f", -HUGE_VAL);
90 testfmt("+inf", "%+g", HUGE_VAL);
91 testfmt(" inf", "%4.2Le", HUGE_VALL);
92 testfmt("-inf", "%Lf", -HUGE_VALL);
93 testfmt(" inf", "%05e", HUGE_VAL);
94 testfmt(" -inf", "%05e", -HUGE_VAL);
95
96 /*
97 * Padding
98 */
99 testfmt("0.000000e+00", "%e", 0.0);
100 testfmt("0.000000", "%F", (double)0.0);
101 testfmt("0", "%G", 0.0);
102 testfmt(" 0", "%3.0Lg", 0.0L);
103 testfmt(" 0", "%5.0f", 0.001);
104
105 /*
106 * Precision specifiers
107 */
108 testfmt("1.0123e+00", "%.4e", 1.0123456789);
109 testfmt("1.0123", "%.4f", 1.0123456789);
110 testfmt("1.012", "%.4g", 1.0123456789);
111 testfmt("1.2346e-02", "%.4e", 0.0123456789);
112 testfmt("0.0123", "%.4f", 0.0123456789);
113 testfmt("0.01235", "%.4g", 0.0123456789);
114
115 /*
116 * Signed conversions
117 */
118 testfmt("+2.500000e-01", "%+e", 0.25);
119 testfmt("+0.000000", "%+F", 0.0);
120 testfmt("-1", "%+g", -1.0);
121
122 testfmt("-1.000000e+00", "% e", -1.0);
123 testfmt("+1.000000", "% +f", 1.0);
124 testfmt(" 1", "% g", 1.0);
125 testfmt(" 0", "% g", 0.0);
126
127 /*
128 * ``Alternate form''
129 */
130 testfmt("1.250e+00", "%#.3e", 1.25);
131 testfmt("123.000000", "%#f", 123.0);
132 testfmt(" 12345.", "%#7.5g", 12345.0);
133 testfmt(" 1.00000", "%#8g", 1.0);
134 testfmt("0.0", "%#.2g", 0.0);
135
136 /*
137 * Padding and decimal point placement
138 */
139 testfmt("03.2E+00", "%08.1E", 3.25);
140 testfmt("003.25", "%06.2F", 3.25);
141 testfmt("0003.25", "%07.4G", 3.25);
142
143 testfmt("3.14159e-05", "%g", 3.14159e-5);
144 testfmt("0.000314159", "%g", 3.14159e-4);
145 testfmt("3.14159e+06", "%g", 3.14159e6);
146 testfmt("314159", "%g", 3.14159e5);
147 testfmt("314159.", "%#g", 3.14159e5);
148
149 testfmt(" 9.000000e+03", "%13e", 9000.0);
150 testfmt(" 9000.000000", "%12f", 9000.0);
151 testfmt(" 9000", "%5g", 9000.0);
152 testfmt(" 900000.", "%#8g", 900000.0);
153 testfmt(" 9e+06", "%6g", 9000000.0);
154 testfmt(" 9.000000e-04", "%13e", 0.0009);
155 testfmt(" 0.000900", "%9f", 0.0009);
156 testfmt(" 0.0009", "%7g", 0.0009);
157 testfmt(" 9e-05", "%6g", 0.00009);
158 testfmt(" 9.00000e-05", "%#12g", 0.00009);
159 testfmt(" 9.e-05", "%#7.1g", 0.00009);
160
161 testfmt(" 0.0", "%4.1f", 0.0);
162 testfmt("90.0", "%4.1f", 90.0);
163 testfmt(" 100", "%4.0f", 100.0);
164 testfmt("9.0e+01", "%4.1e", 90.0);
165 testfmt("1e+02", "%4.0e", 100.0);
166
167 /*
168 * Hexadecimal floating point (%a, %A) tests. Some of these
169 * are only valid if the implementation converts to hex digits
170 * on nibble boundaries.
171 */
172 testfmt("0x0p+0", "%a", 0x0.0p0);
173 testfmt("0X0.P+0", "%#LA", 0x0.0p0L);
174#ifdef NAN
175 testfmt("inf", "%La", (long double)INFINITY);
176 testfmt("+INF", "%+A", INFINITY);
177 testfmt("nan", "%La", (long double)NAN);
178 testfmt("NAN", "%A", NAN);
179#endif /* NAN */
180
181 testfmt(" 0x1.23p+0", "%10a", 0x1.23p0);
182 testfmt(" 0x1.23p-500", "%12a", 0x1.23p-500);
183 testfmt(" 0x1.2p+40", "%10.1a", 0x1.23p40);
184 testfmt(" 0X1.230000000000000000000000P-4", "%32.24A", 0x1.23p-4);
185 testfmt("0x1p-1074", "%a", 0x1p-1074);
186 testfmt("0x1.2345p-1024", "%a", 0x1.2345p-1024);
187
188 return (0);
189}
190
191void
192smash_stack(void)
193{
194 static uint32_t junk = 0xdeadbeef;
195 uint32_t buf[512];
196 int i;
197
198 for (i = 0; i < sizeof(buf) / sizeof(buf[0]); i++)
199 buf[i] = junk;
200}
201
202void
203_testfmt(const char *result, int line, const char *argstr, const char *fmt,...)
204{
205 char s[100];
206 va_list ap;
207
208 va_start(ap, fmt);
209 smash_stack();
210 vsnprintf(s, sizeof(s), fmt, ap);
211 if (strcmp(result, s) != 0) {
212 fprintf(stderr,
213 "%d: printf(\"%s\", %s) ==> [%s], expected [%s]\n",
214 line, fmt, argstr, s, result);
215 abort();
216 }
217}
diff --git a/src/regress/lib/libc/qsort/Makefile b/src/regress/lib/libc/qsort/Makefile
deleted file mode 100644
index 473432f423..0000000000
--- a/src/regress/lib/libc/qsort/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
1# $OpenBSD: Makefile,v 1.3 2017/05/22 17:16:43 millert Exp $
2
3PROG= qsort_test
4SRCS= qsort_test.c antiqsort.c
5CFLAGS+=-Wall
6
7qsort-regress: ${PROG}
8 ./${PROG}
9
10REGRESS_TARGETS=qsort-regress
11.PHONY: ${REGRESS_TARGETS}
12
13.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/qsort/antiqsort.c b/src/regress/lib/libc/qsort/antiqsort.c
deleted file mode 100644
index cb3b7b2525..0000000000
--- a/src/regress/lib/libc/qsort/antiqsort.c
+++ /dev/null
@@ -1,58 +0,0 @@
1/*
2 * A Killer Adversary for Quicksort
3 * M. D. MCILROY
4 * http://www.cs.dartmouth.edu/~doug/mdmspe.pdf
5 *
6 * For comparison:
7 * Bentley & McIlroy: 4096 items, 1645585 compares
8 * random pivot: 4096 items, 8388649 compares
9 * introsort: 4096 items, 151580 compares
10 * heapsort: 4096 items, 48233 compares
11 */
12
13#include <stdio.h>
14#include <stdlib.h>
15
16static int *val; /* item values */
17static int ncmp; /* number of comparisons */
18static int nsolid; /* number of solid items */
19static int candidate; /* pivot candidate */
20static int gas; /* gas value */
21
22#define freeze(x) (val[(x)] = nsolid++)
23
24static int
25cmp(const void *px, const void *py)
26{
27 const int x = *(const int *)px;
28 const int y = *(const int *)py;
29
30 ncmp++;
31 if (val[x] == gas && val[y] == gas) {
32 if (x == candidate)
33 freeze(x);
34 else
35 freeze(y);
36 }
37 if (val[x] == gas)
38 candidate = x;
39 else if (val[y] == gas)
40 candidate = y;
41 return val[x] > val[y] ? 1 : val[x] < val[y] ? -1 : 0;
42}
43
44int
45antiqsort(int n, int *a, int *ptr)
46{
47 int i;
48
49 val = a;
50 gas = n - 1;
51 nsolid = ncmp = candidate = 0;
52 for (i = 0; i < n; i++) {
53 ptr[i] = i;
54 val[i] = gas;
55 }
56 qsort(ptr, n, sizeof(*ptr), cmp);
57 return ncmp;
58}
diff --git a/src/regress/lib/libc/qsort/qsort_test.c b/src/regress/lib/libc/qsort/qsort_test.c
deleted file mode 100644
index 352c707718..0000000000
--- a/src/regress/lib/libc/qsort/qsort_test.c
+++ /dev/null
@@ -1,777 +0,0 @@
1/*
2 * Copyright (c) 2017 Todd C. Miller <millert@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <sys/time.h>
18
19#include <stdbool.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23#include <setjmp.h>
24#include <time.h>
25#include <unistd.h>
26#include <err.h>
27
28/*
29 * Test program based on Bentley & McIlroy's "Engineering a Sort Function".
30 * Uses mergesort(3) to check the results.
31 *
32 * Additional "killer" input taken from:
33 * David R. Musser's "Introspective Sorting and Selection Algorithms"
34 * http://calmerthanyouare.org/2014/06/11/algorithmic-complexity-attacks-and-libc-qsort.html
35 * M. D. McIlroy's "A Killer Adversary for Quicksort"
36 */
37
38/*
39 * TODO:
40 * test with unaligned elements (char[]?)
41 */
42struct test_distribution {
43 const char *name;
44 void (*fill)(void *x, int n, int m);
45 int (*test)(struct test_distribution *d, int n, void *x, void *y, void *z);
46 int (*cmp)(const void *v1, const void *v2);
47 int (*cmp_checked)(const void *v1, const void *v2);
48};
49
50#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
51#define MAXIMUM(a, b) (((a) > (b)) ? (a) : (b))
52
53static size_t compares;
54static size_t max_compares;
55static size_t abrt_compares;
56static sigjmp_buf cmpjmp;
57static bool dump_table, timing, verbose;
58
59extern int antiqsort(int n, int *a, int *ptr);
60
61static int
62cmp_i(const void *v1, const void *v2)
63{
64 const int a = *(const int *)v1;
65 const int b = *(const int *)v2;
66
67 return a > b ? 1 : a < b ? -1 : 0;
68}
69
70static int
71cmp_checked_i(const void *v1, const void *v2)
72{
73 const int a = *(const int *)v1;
74 const int b = *(const int *)v2;
75
76 compares++;
77 if (compares > abrt_compares)
78 siglongjmp(cmpjmp, 1);
79 return a > b ? 1 : a < b ? -1 : 0;
80}
81
82static int
83cmp_ll(const void *v1, const void *v2)
84{
85 const long long a = *(const long long *)v1;
86 const long long b = *(const long long *)v2;
87
88 return a > b ? 1 : a < b ? -1 : 0;
89}
90
91static int
92cmp_checked_ll(const void *v1, const void *v2)
93{
94 const long long a = *(const long long *)v1;
95 const long long b = *(const long long *)v2;
96
97 compares++;
98 if (compares > abrt_compares)
99 siglongjmp(cmpjmp, 1);
100 return a > b ? 1 : a < b ? -1 : 0;
101}
102
103static int
104cmp_d(const void *v1, const void *v2)
105{
106 const double a = *(const double *)v1;
107 const double b = *(const double *)v2;
108
109 return a > b ? 1 : a < b ? -1 : 0;
110}
111
112static int
113cmp_checked_d(const void *v1, const void *v2)
114{
115 const double a = *(const double *)v1;
116 const double b = *(const double *)v2;
117
118 compares++;
119 if (compares > abrt_compares)
120 siglongjmp(cmpjmp, 1);
121 return a > b ? 1 : a < b ? -1 : 0;
122}
123
124static int
125check_result(char *sub, size_t es, char *got, char *expected, struct test_distribution *d,
126 int m, int n)
127{
128 int i;
129
130 if (verbose || compares > max_compares) {
131 if (sub != NULL) {
132 if (m != 0) {
133 warnx("%s (%s): m: %d, n: %d, %zu compares, "
134 "max %zu(%zu)", d->name, sub, m, n,
135 compares, max_compares, abrt_compares);
136 } else {
137 warnx("%s (%s): n: %d, %zu compares, "
138 "max %zu(%zu)", d->name, sub, n,
139 compares, max_compares, abrt_compares);
140 }
141 } else {
142 if (m != 0) {
143 warnx("%s: m: %d, n: %d, %zu compares, "
144 "max %zu(%zu)", d->name, m, n,
145 compares, max_compares, abrt_compares);
146 } else {
147 warnx("%s: n: %d, %zu compares, "
148 "max %zu(%zu)", d->name, n,
149 compares, max_compares, abrt_compares);
150 }
151 }
152 }
153
154 for (i = 0; i < n; i++) {
155 if (memcmp(got, expected, es) != 0)
156 break;
157 got += es;
158 expected += es;
159 }
160 if (i == n)
161 return 0;
162
163 if (sub != NULL) {
164 warnx("%s (%s): failure at %d, m: %d, n: %d",
165 d->name, sub, i, m, n);
166 } else {
167 warnx("%s: failure at %d, m: %d, n: %d",
168 d->name, i, m, n);
169 }
170 return 1;
171}
172
173#define FILL_SAWTOOTH(x, n, m) do { \
174 int i; \
175 \
176 for (i = 0; i < n; i++) \
177 x[i] = i % m; \
178} while (0)
179
180static void
181fill_sawtooth_i(void *v, int n, int m)
182{
183 int *x = v;
184 FILL_SAWTOOTH(x, n, m);
185}
186
187static void
188fill_sawtooth_ll(void *v, int n, int m)
189{
190 long long *x = v;
191 FILL_SAWTOOTH(x, n, m);
192}
193
194static void
195fill_sawtooth_double(void *v, int n, int m)
196{
197 double *x = v;
198 FILL_SAWTOOTH(x, n, m);
199}
200
201#define FILL_RANDOM(x, n, m) do { \
202 int i; \
203 \
204 for (i = 0; i < n; i++) \
205 x[i] = arc4random_uniform(m); \
206} while (0)
207
208
209static void
210fill_random_i(void *v, int n, int m)
211{
212 int *x = v;
213 FILL_RANDOM(x, n, m);
214}
215
216static void
217fill_random_ll(void *v, int n, int m)
218{
219 long long *x = v;
220 FILL_RANDOM(x, n, m);
221}
222
223static void
224fill_random_double(void *v, int n, int m)
225{
226 double *x = v;
227 FILL_RANDOM(x, n, m);
228}
229
230#define FILL_STAGGER(x, n, m) do { \
231 int i; \
232 \
233 for (i = 0; i < n; i++) \
234 x[i] = (i * m + i) % n; \
235} while (0)
236
237
238static void
239fill_stagger_i(void *v, int n, int m)
240{
241 int *x = v;
242 FILL_STAGGER(x, n, m);
243}
244
245static void
246fill_stagger_ll(void *v, int n, int m)
247{
248 long long *x = v;
249 FILL_STAGGER(x, n, m);
250}
251
252static void
253fill_stagger_double(void *v, int n, int m)
254{
255 double *x = v;
256 FILL_STAGGER(x, n, m);
257}
258
259#define FILL_PLATEAU(x, n, m) do { \
260 int i; \
261 \
262 for (i = 0; i < n; i++) \
263 x[i] = MINIMUM(i, m); \
264} while (0)
265
266static void
267fill_plateau_i(void *v, int n, int m)
268{
269 int *x = v;
270 FILL_PLATEAU(x, n, m);
271}
272
273static void
274fill_plateau_ll(void *v, int n, int m)
275{
276 long long *x = v;
277 FILL_PLATEAU(x, n, m);
278}
279
280static void
281fill_plateau_double(void *v, int n, int m)
282{
283 double *x = v;
284 FILL_PLATEAU(x, n, m);
285}
286
287#define FILL_SHUFFLE(x, n, m) do { \
288 int i, j, k; \
289 \
290 for (i = 0, j = 0, k = 1; i < n; i++) \
291 x[i] = arc4random_uniform(m) ? (j += 2) : (k += 2); \
292} while (0)
293
294static void
295fill_shuffle_i(void *v, int n, int m)
296{
297 int *x = v;
298 FILL_SHUFFLE(x, n, m);
299}
300
301static void
302fill_shuffle_ll(void *v, int n, int m)
303{
304 long long *x = v;
305 FILL_SHUFFLE(x, n, m);
306}
307
308static void
309fill_shuffle_double(void *v, int n, int m)
310{
311 double *x = v;
312 FILL_SHUFFLE(x, n, m);
313}
314
315#define FILL_BSD_KILLER(x, n, m) do { \
316 int i, k; \
317 \
318 /* 4.4BSD insertion sort optimization killer, Mats Linander */ \
319 k = n / 2; \
320 for (i = 0; i < n; i++) { \
321 if (i < k) \
322 x[i] = k - i; \
323 else if (i > k) \
324 x[i] = n + k + 1 - i; \
325 else \
326 x[i] = k + 1; \
327 } \
328} while (0)
329
330static void
331fill_bsd_killer_i(void *v, int n, int m)
332{
333 int *x = v;
334 FILL_BSD_KILLER(x, n, m);
335
336}
337
338static void
339fill_bsd_killer_ll(void *v, int n, int m)
340{
341 long long *x = v;
342 FILL_BSD_KILLER(x, n, m);
343
344}
345
346static void
347fill_bsd_killer_double(void *v, int n, int m)
348{
349 double *x = v;
350 FILL_BSD_KILLER(x, n, m);
351
352}
353
354#define FILL_MED3_KILLER(x, n, m) do { \
355 int i, k; \
356 \
357 /* \
358 * Median of 3 killer, as seen in David R Musser's \
359 * "Introspective Sorting and Selection Algorithms" \
360 */ \
361 if (n & 1) { \
362 /* odd size, store last at end and make even. */ \
363 x[n - 1] = n; \
364 n--; \
365 } \
366 k = n / 2; \
367 for (i = 0; i < n; i++) { \
368 if (i & 1) { \
369 x[i] = k + x[i - 1]; \
370 } else { \
371 x[i] = i + 1; \
372 } \
373 } \
374} while (0)
375
376static void
377fill_med3_killer_i(void *v, int n, int m)
378{
379 int *x = v;
380 FILL_MED3_KILLER(x, n, m);
381}
382
383static void
384fill_med3_killer_ll(void *v, int n, int m)
385{
386 long long *x = v;
387 FILL_MED3_KILLER(x, n, m);
388}
389
390static void
391fill_med3_killer_double(void *v, int n, int m)
392{
393 double *x = v;
394 FILL_MED3_KILLER(x, n, m);
395}
396
397static void
398print_timing(struct test_distribution *d, char *sub, int m, int n, double elapsed)
399{
400 if (sub != NULL) {
401 if (m != 0) {
402 warnx("%s (%s): m: %d, n: %d, %f seconds",
403 d->name, sub, m, n, elapsed);
404 } else {
405 warnx("%s (%s): n: %d, %f seconds",
406 d->name, sub, n, elapsed);
407 }
408 } else {
409 if (m != 0) {
410 warnx("%s: m: %d, n: %d, %f seconds",
411 d->name, m, n, elapsed);
412 } else {
413 warnx("%s: n: %d, %f seconds",
414 d->name, n, elapsed);
415 }
416 }
417}
418
419static int
420do_test(struct test_distribution *d, char *sub, int m, int n, size_t es, void *y, void *z)
421{
422 int ret = 0;
423 struct timespec before, after;
424
425 compares = 0;
426 if (sigsetjmp(cmpjmp, 1) != 0) {
427 if (sub != NULL) {
428 warnx("%s (%s): qsort aborted after %zu compares, m: %d, n: %d",
429 d->name, sub, compares, m, n);
430 } else {
431 warnx("%s: qsort aborted after %zu compares, m: %d, n: %d",
432 d->name, compares, m, n);
433 }
434 ret = 1;
435 } else {
436 if (timing)
437 clock_gettime(CLOCK_MONOTONIC, &before);
438 qsort(y, n, es, d->cmp_checked);
439 if (timing) {
440 double elapsed;
441 clock_gettime(CLOCK_MONOTONIC, &after);
442 timespecsub(&after, &before, &after);
443 elapsed = after.tv_sec + after.tv_nsec / 1000000000.0;
444 print_timing(d, sub, m, n, elapsed);
445 }
446 if (check_result(sub, es, y, z, d, m, n) != 0)
447 ret = 1;
448 }
449 return ret;
450}
451
452#define TEST_PERTURBED(d, n, x, y, z) do { \
453 int i, j, m; \
454 const int es = sizeof(x[0]); \
455 \
456 for (m = 1; m < 2 * n; m *= 2) { \
457 /* Fill in x[n] modified by m */ \
458 d->fill(x, n, m); \
459 \
460 /* Test on copy of x[] */ \
461 for (i = 0; i < n; i++) \
462 y[i] = z[i] = x[i]; \
463 if (mergesort(z, n, es, d->cmp) != 0) \
464 err(1, NULL); \
465 if (do_test(d, "copy", m, n, es, y, z) != 0) \
466 ret = 1; \
467 \
468 /* Test on reversed copy of x[] */ \
469 for (i = 0, j = n - 1; i < n; i++, j--) \
470 y[i] = z[i] = x[j]; \
471 if (mergesort(z, n, es, d->cmp) != 0) \
472 err(1, NULL); \
473 if (do_test(d, "reversed", m, n, es, y, z) != 0) \
474 ret = 1; \
475 \
476 /* Test with front half of x[] reversed */ \
477 for (i = 0, j = (n / 2) - 1; i < n / 2; i++, j--) \
478 y[i] = z[i] = x[j]; \
479 for (; i < n; i++) \
480 y[i] = z[i] = x[i]; \
481 if (mergesort(z, n, es, d->cmp) != 0) \
482 err(1, NULL); \
483 if (do_test(d, "front reversed", m, n, es, y, z) != 0) \
484 ret = 1; \
485 \
486 /* Test with back half of x[] reversed */ \
487 for (i = 0; i < n / 2; i++) \
488 y[i] = z[i] = x[i]; \
489 for (j = n - 1; i < n; i++, j--) \
490 y[i] = z[i] = x[j]; \
491 if (mergesort(z, n, es, d->cmp) != 0) \
492 err(1, NULL); \
493 if (do_test(d, "back reversed", m, n, es, y, z) != 0) \
494 ret = 1; \
495 \
496 /* Test on sorted copy of x[] */ \
497 if (mergesort(x, n, es, d->cmp) != 0) \
498 err(1, NULL); \
499 for (i = 0; i < n; i++) \
500 y[i] = x[i]; \
501 if (do_test(d, "sorted", m, n, es, y, x) != 0) \
502 ret = 1; \
503 \
504 /* Test with i%5 added to x[i] (dither) */ \
505 for (i = 0, j = n - 1; i < n; i++, j--) \
506 y[i] = z[i] = x[j] + (i % 5); \
507 if (mergesort(z, n, es, d->cmp) != 0) \
508 err(1, NULL); \
509 if (do_test(d, "dithered", m, n, es, y, z) != 0) \
510 ret = 1; \
511 } \
512} while (0)
513
514static int
515test_perturbed_i(struct test_distribution *d, int n, void *vx, void *vy, void *vz)
516{
517 int *x = vx;
518 int *y = vx;
519 int *z = vz;
520 int ret = 0;
521
522 TEST_PERTURBED(d, n, x, y, z);
523 return ret;
524}
525
526static int
527test_perturbed_ll(struct test_distribution *d, int n, void *vx, void *vy, void *vz)
528{
529 long long *x = vx;
530 long long *y = vx;
531 long long *z = vz;
532 int ret = 0;
533
534 TEST_PERTURBED(d, n, x, y, z);
535 return ret;
536}
537
538static int
539test_perturbed_double(struct test_distribution *d, int n, void *vx, void *vy, void *vz)
540{
541 double *x = vx;
542 double *y = vx;
543 double *z = vz;
544 int ret = 0;
545
546 TEST_PERTURBED(d, n, x, y, z);
547 return ret;
548}
549
550/*
551 * Like TEST_PERTURBED but because the input is tailored to cause
552 * quicksort to go quadratic we don't perturb the input.
553 */
554#define TEST_SIMPLE(d, n, x, y, z) do { \
555 int i, ret = 0; \
556 \
557 /* Fill in x[n] */ \
558 d->fill(x, n, 0); \
559 \
560 /* Make a copy of x[] */ \
561 for (i = 0; i < n; i++) \
562 y[i] = z[i] = x[i]; \
563 if (mergesort(z, n, sizeof(z[0]), d->cmp) != 0) \
564 err(1, NULL); \
565 if (do_test(d, NULL, 0, n, sizeof(x[0]), y, z) != 0) \
566 ret = 1; \
567} while (0)
568
569static int
570test_simple_i(struct test_distribution *d, int n, void *vx, void *vy, void *vz)
571{
572 int *x = vx;
573 int *y = vx;
574 int *z = vz;
575 int ret = 0;
576
577 TEST_SIMPLE(d, n, x, y, z);
578 return ret;
579}
580
581static int
582test_simple_ll(struct test_distribution *d, int n, void *vx, void *vy, void *vz)
583{
584 long long *x = vx;
585 long long *y = vx;
586 long long *z = vz;
587 int ret = 0;
588
589 TEST_SIMPLE(d, n, x, y, z);
590 return ret;
591}
592
593static int
594test_simple_double(struct test_distribution *d, int n, void *vx, void *vy, void *vz)
595{
596 double *x = vx;
597 double *y = vx;
598 double *z = vz;
599 int ret = 0;
600
601 TEST_SIMPLE(d, n, x, y, z);
602 return ret;
603}
604
605/*
606 * Use D. McIlroy's "Killer Adversary for Quicksort"
607 * We don't compare the results in this case.
608 */
609static int
610test_antiqsort(struct test_distribution *d, int n, void *vx, void *vy, void *vz)
611{
612 struct timespec before, after;
613 int *x = vx;
614 int *y = vx;
615 int i, ret = 0;
616
617 /*
618 * We expect antiqsort to generate > 1.5 * nlgn compares.
619 * If introspection is not used, it will be > 10 * nlgn compares.
620 */
621 if (timing)
622 clock_gettime(CLOCK_MONOTONIC, &before);
623 i = antiqsort(n, x, y);
624 if (timing)
625 clock_gettime(CLOCK_MONOTONIC, &after);
626 if (i > abrt_compares)
627 ret = 1;
628 if (dump_table) {
629 printf("/* %d items, %d compares */\n", n, i);
630 printf("static const int table_%d[] = {", n);
631 for (i = 0; i < n - 1; i++) {
632 if ((i % 12) == 0)
633 printf("\n\t");
634 printf("%4d, ", x[i]);
635 }
636 printf("%4d\n};\n", x[i]);
637 } else {
638 if (timing) {
639 double elapsed;
640 timespecsub(&after, &before, &after);
641 elapsed = after.tv_sec + after.tv_nsec / 1000000000.0;
642 print_timing(d, NULL, 0, n, elapsed);
643 }
644 if (verbose || ret != 0) {
645 warnx("%s: n: %d, %d compares, max %zu(%zu)",
646 d->name, n, i, max_compares, abrt_compares);
647 }
648 }
649
650 return ret;
651}
652
653static struct test_distribution distributions[] = {
654 { "sawtooth_i", fill_sawtooth_i, test_perturbed_i, cmp_i, cmp_checked_i },
655 { "sawtooth_ll", fill_sawtooth_ll, test_perturbed_ll, cmp_ll, cmp_checked_ll },
656 { "sawtooth_d", fill_sawtooth_double, test_perturbed_double, cmp_d, cmp_checked_d },
657 { "random_i", fill_random_i, test_perturbed_i, cmp_i, cmp_checked_i },
658 { "random_ll", fill_random_ll, test_perturbed_ll, cmp_ll, cmp_checked_ll },
659 { "random_d", fill_random_double, test_perturbed_double, cmp_d, cmp_checked_d },
660 { "stagger_i", fill_stagger_i, test_perturbed_i, cmp_i, cmp_checked_i },
661 { "stagger_ll", fill_stagger_ll, test_perturbed_ll, cmp_ll, cmp_checked_ll },
662 { "stagger_d", fill_stagger_double, test_perturbed_double, cmp_d, cmp_checked_d },
663 { "plateau_i", fill_plateau_i, test_perturbed_i, cmp_i, cmp_checked_i },
664 { "plateau_ll", fill_plateau_ll, test_perturbed_ll, cmp_ll, cmp_checked_ll },
665 { "plateau_d", fill_plateau_double, test_perturbed_double, cmp_d, cmp_checked_d },
666 { "shuffle_i", fill_shuffle_i, test_perturbed_i, cmp_i, cmp_checked_i },
667 { "shuffle_ll", fill_shuffle_ll, test_perturbed_ll, cmp_ll, cmp_checked_ll },
668 { "shuffle_d", fill_shuffle_double, test_perturbed_double, cmp_d, cmp_checked_d },
669 { "bsd_killer_i", fill_bsd_killer_i, test_simple_i, cmp_i, cmp_checked_i },
670 { "bsd_killer_ll", fill_bsd_killer_ll, test_simple_ll, cmp_ll, cmp_checked_ll },
671 { "bsd_killer_d", fill_bsd_killer_double, test_simple_double, cmp_d, cmp_checked_d },
672 { "med3_killer_i", fill_med3_killer_i, test_simple_i, cmp_i, cmp_checked_i },
673 { "med3_killer_ll", fill_med3_killer_ll, test_simple_ll, cmp_ll, cmp_checked_ll },
674 { "med3_killer_d", fill_med3_killer_double, test_simple_double, cmp_d, cmp_checked_d },
675 { "antiqsort", NULL, test_antiqsort, cmp_i, cmp_checked_i },
676 { NULL }
677};
678
679static int
680run_tests(int n, const char *name)
681{
682 void *x, *y, *z;
683 int i, nlgn = 0;
684 int ret = 0;
685 size_t es;
686 struct test_distribution *d;
687
688 /*
689 * We expect A*n*lg(n) compares where A is between 1 and 2.
690 * For A > 1.5, print a warning.
691 * For A > 10 abort the test since qsort has probably gone quadratic.
692 */
693 for (i = n - 1; i > 0; i >>= 1)
694 nlgn++;
695 nlgn *= n;
696 max_compares = nlgn * 1.5;
697 abrt_compares = nlgn * 10;
698
699 /* Allocate enough space to store ints or doubles. */
700 es = MAXIMUM(sizeof(int), sizeof(double));
701 x = reallocarray(NULL, n, es);
702 y = reallocarray(NULL, n, es);
703 z = reallocarray(NULL, n, es);
704 if (x == NULL || y == NULL || z == NULL)
705 err(1, NULL);
706
707 for (d = distributions; d->name != NULL; d++) {
708 if (name != NULL && strncmp(name, d->name, strlen(name)) != 0)
709 continue;
710 if (d->test(d, n, x, y, z) != 0)
711 ret = 1;
712 }
713
714 free(x);
715 free(y);
716 free(z);
717 return ret;
718}
719
720__dead void
721usage(void)
722{
723 fprintf(stderr, "usage: qsort_test [-dvt] [-n test_name] [num ...]\n");
724 exit(1);
725}
726
727int
728main(int argc, char *argv[])
729{
730 char *nums[] = { "100", "1023", "1024", "1025", "4095", "4096", "4097" };
731 struct test_distribution *d;
732 int ch, n, ret = 0;
733 char *name = NULL;
734
735 while ((ch = getopt(argc, argv, "dn:tv")) != -1) {
736 switch (ch) {
737 case 'd':
738 dump_table = true;
739 break;
740 case 'n':
741 for (d = distributions; d->name != NULL; d++) {
742 if (strncmp(optarg, d->name, strlen(optarg)) == 0)
743 break;
744 }
745 if (d->name == NULL)
746 errx(1, "unknown test %s", optarg);
747 name = optarg;
748 break;
749 case 't':
750 timing = true;
751 break;
752 case 'v':
753 verbose = true;
754 break;
755 default:
756 usage();
757 break;
758 }
759 }
760 argc -= optind;
761 argv += optind;
762
763 if (argc == 0) {
764 argv = nums;
765 argc = sizeof(nums) / sizeof(nums[0]);
766 }
767
768 while (argc > 0) {
769 n = atoi(*argv);
770 if (run_tests(n, name) != 0)
771 ret = 1;
772 argc--;
773 argv++;
774 }
775
776 return ret;
777}
diff --git a/src/regress/lib/libc/regex/Makefile b/src/regress/lib/libc/regex/Makefile
deleted file mode 100644
index 5b9a080209..0000000000
--- a/src/regress/lib/libc/regex/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
1# $OpenBSD: Makefile,v 1.11 2017/04/16 16:01:05 kettenis Exp $
2# $NetBSD: Makefile,v 1.2 1995/02/16 19:38:45 cgd Exp $
3
4PROG= re
5SRCS= main.c split.c debug.c regcomp.c regerror.c regexec.c regfree.c
6.PATH: ${.CURDIR}/../../../../lib/libc/regex
7CLEANFILES += t_exhaust
8
9CFLAGS+= -I${.CURDIR}/../../../../lib/libc/regex -DREDEBUG -DPOSIX_MISTAKE
10CFLAGS+= -D'DEF_WEAK(x)=asm("")'
11
12TESTS= ${.CURDIR}/tests
13
14REGRESS_TARGETS = do-reg do-reg-long do-reg-backref
15# cannot run with large limits
16#REGRESS_TARGETS += do-t_exhaust
17
18do-reg: ${PROG}
19 ./re < ${TESTS}
20do-reg-long: ${PROG}
21 ./re -el < ${TESTS}
22do-reg-backref: ${PROG}
23 ./re -er < ${TESTS}
24#do-t_exhaust: t_exhaust
25# ./t_exhaust
26
27.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/regex/debug.c b/src/regress/lib/libc/regex/debug.c
deleted file mode 100644
index 11129e7249..0000000000
--- a/src/regress/lib/libc/regex/debug.c
+++ /dev/null
@@ -1,245 +0,0 @@
1/* $OpenBSD: debug.c,v 1.4 2003/07/31 21:48:03 deraadt Exp $ */
2/* $NetBSD: debug.c,v 1.2 1995/04/20 22:39:42 cgd Exp $ */
3
4#include <stdio.h>
5#include <string.h>
6#include <ctype.h>
7#include <limits.h>
8#include <stdlib.h>
9#include <sys/types.h>
10#include <regex.h>
11
12#include "utils.h"
13#include "regex2.h"
14#include "debug.ih"
15
16/*
17 - regprint - print a regexp for debugging
18 == void regprint(regex_t *r, FILE *d);
19 */
20void
21regprint(r, d)
22regex_t *r;
23FILE *d;
24{
25 register struct re_guts *g = r->re_g;
26 register int i;
27 register int c;
28 register int last;
29 int nincat[NC];
30
31 fprintf(d, "%ld states, %d categories", (long)g->nstates,
32 g->ncategories);
33 fprintf(d, ", first %ld last %ld", (long)g->firststate,
34 (long)g->laststate);
35 if (g->iflags&USEBOL)
36 fprintf(d, ", USEBOL");
37 if (g->iflags&USEEOL)
38 fprintf(d, ", USEEOL");
39 if (g->iflags&BAD)
40 fprintf(d, ", BAD");
41 if (g->nsub > 0)
42 fprintf(d, ", nsub=%ld", (long)g->nsub);
43 if (g->must != NULL)
44 fprintf(d, ", must(%ld) `%*s'", (long)g->mlen, (int)g->mlen,
45 g->must);
46 if (g->backrefs)
47 fprintf(d, ", backrefs");
48 if (g->nplus > 0)
49 fprintf(d, ", nplus %ld", (long)g->nplus);
50 fprintf(d, "\n");
51 s_print(g, d);
52 for (i = 0; i < g->ncategories; i++) {
53 nincat[i] = 0;
54 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
55 if (g->categories[c] == i)
56 nincat[i]++;
57 }
58 fprintf(d, "cc0#%d", nincat[0]);
59 for (i = 1; i < g->ncategories; i++)
60 if (nincat[i] == 1) {
61 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
62 if (g->categories[c] == i)
63 break;
64 fprintf(d, ", %d=%s", i, regchar(c));
65 }
66 fprintf(d, "\n");
67 for (i = 1; i < g->ncategories; i++)
68 if (nincat[i] != 1) {
69 fprintf(d, "cc%d\t", i);
70 last = -1;
71 for (c = CHAR_MIN; c <= CHAR_MAX+1; c++) /* +1 does flush */
72 if (c <= CHAR_MAX && g->categories[c] == i) {
73 if (last < 0) {
74 fprintf(d, "%s", regchar(c));
75 last = c;
76 }
77 } else {
78 if (last >= 0) {
79 if (last != c-1)
80 fprintf(d, "-%s",
81 regchar(c-1));
82 last = -1;
83 }
84 }
85 fprintf(d, "\n");
86 }
87}
88
89/*
90 - s_print - print the strip for debugging
91 == static void s_print(register struct re_guts *g, FILE *d);
92 */
93static void
94s_print(g, d)
95register struct re_guts *g;
96FILE *d;
97{
98 register sop *s;
99 register cset *cs;
100 register int i;
101 register int done = 0;
102 register sop opnd;
103 register int col = 0;
104 register int last;
105 register sopno offset = 2;
106# define GAP() { if (offset % 5 == 0) { \
107 if (col > 40) { \
108 fprintf(d, "\n\t"); \
109 col = 0; \
110 } else { \
111 fprintf(d, " "); \
112 col++; \
113 } \
114 } else \
115 col++; \
116 offset++; \
117 }
118
119 if (OP(g->strip[0]) != OEND)
120 fprintf(d, "missing initial OEND!\n");
121 for (s = &g->strip[1]; !done; s++) {
122 opnd = OPND(*s);
123 switch (OP(*s)) {
124 case OEND:
125 fprintf(d, "\n");
126 done = 1;
127 break;
128 case OCHAR:
129 if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL)
130 fprintf(d, "\\%c", (char)opnd);
131 else
132 fprintf(d, "%s", regchar((char)opnd));
133 break;
134 case OBOL:
135 fprintf(d, "^");
136 break;
137 case OEOL:
138 fprintf(d, "$");
139 break;
140 case OBOW:
141 fprintf(d, "\\{");
142 break;
143 case OEOW:
144 fprintf(d, "\\}");
145 break;
146 case OANY:
147 fprintf(d, ".");
148 break;
149 case OANYOF:
150 fprintf(d, "[(%ld)", (long)opnd);
151 cs = &g->sets[opnd];
152 last = -1;
153 for (i = 0; i < g->csetsize+1; i++) /* +1 flushes */
154 if (CHIN(cs, i) && i < g->csetsize) {
155 if (last < 0) {
156 fprintf(d, "%s", regchar(i));
157 last = i;
158 }
159 } else {
160 if (last >= 0) {
161 if (last != i-1)
162 fprintf(d, "-%s",
163 regchar(i-1));
164 last = -1;
165 }
166 }
167 fprintf(d, "]");
168 break;
169 case OBACK_:
170 fprintf(d, "(\\<%ld>", (long)opnd);
171 break;
172 case O_BACK:
173 fprintf(d, "<%ld>\\)", (long)opnd);
174 break;
175 case OPLUS_:
176 fprintf(d, "(+");
177 if (OP(*(s+opnd)) != O_PLUS)
178 fprintf(d, "<%ld>", (long)opnd);
179 break;
180 case O_PLUS:
181 if (OP(*(s-opnd)) != OPLUS_)
182 fprintf(d, "<%ld>", (long)opnd);
183 fprintf(d, "+)");
184 break;
185 case OQUEST_:
186 fprintf(d, "(?");
187 if (OP(*(s+opnd)) != O_QUEST)
188 fprintf(d, "<%ld>", (long)opnd);
189 break;
190 case O_QUEST:
191 if (OP(*(s-opnd)) != OQUEST_)
192 fprintf(d, "<%ld>", (long)opnd);
193 fprintf(d, "?)");
194 break;
195 case OLPAREN:
196 fprintf(d, "((<%ld>", (long)opnd);
197 break;
198 case ORPAREN:
199 fprintf(d, "<%ld>))", (long)opnd);
200 break;
201 case OCH_:
202 fprintf(d, "<");
203 if (OP(*(s+opnd)) != OOR2)
204 fprintf(d, "<%ld>", (long)opnd);
205 break;
206 case OOR1:
207 if (OP(*(s-opnd)) != OOR1 && OP(*(s-opnd)) != OCH_)
208 fprintf(d, "<%ld>", (long)opnd);
209 fprintf(d, "|");
210 break;
211 case OOR2:
212 fprintf(d, "|");
213 if (OP(*(s+opnd)) != OOR2 && OP(*(s+opnd)) != O_CH)
214 fprintf(d, "<%ld>", (long)opnd);
215 break;
216 case O_CH:
217 if (OP(*(s-opnd)) != OOR1)
218 fprintf(d, "<%ld>", (long)opnd);
219 fprintf(d, ">");
220 break;
221 default:
222 fprintf(d, "!%ld(%ld)!", (long)OP(*s), (long)opnd);
223 break;
224 }
225 if (!done)
226 GAP();
227 }
228}
229
230/*
231 - regchar - make a character printable
232 == static char *regchar(int ch);
233 */
234static char * /* -> representation */
235regchar(ch)
236int ch;
237{
238 static char buf[10];
239
240 if (isprint(ch) || ch == ' ')
241 snprintf(buf, sizeof buf, "%c", ch);
242 else
243 snprintf(buf, sizeof buf, "\\%o", ch);
244 return(buf);
245}
diff --git a/src/regress/lib/libc/regex/debug.ih b/src/regress/lib/libc/regex/debug.ih
deleted file mode 100644
index 9eb313af23..0000000000
--- a/src/regress/lib/libc/regex/debug.ih
+++ /dev/null
@@ -1,17 +0,0 @@
1/* $OpenBSD: debug.ih,v 1.3 2002/02/16 21:27:32 millert Exp $ */
2/* $NetBSD: debug.ih,v 1.2 1995/04/20 22:39:47 cgd Exp $ */
3
4/* ========= begin header generated by ./mkh ========= */
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9/* === debug.c === */
10void regprint(regex_t *r, FILE *d);
11static void s_print(register struct re_guts *g, FILE *d);
12static char *regchar(int ch);
13
14#ifdef __cplusplus
15}
16#endif
17/* ========= end header generated by ./mkh ========= */
diff --git a/src/regress/lib/libc/regex/main.c b/src/regress/lib/libc/regex/main.c
deleted file mode 100644
index d6787d88fc..0000000000
--- a/src/regress/lib/libc/regex/main.c
+++ /dev/null
@@ -1,519 +0,0 @@
1/* $OpenBSD: main.c,v 1.10 2016/07/13 06:17:11 guenther Exp $ */
2/* $NetBSD: main.c,v 1.2 1995/04/20 22:39:51 cgd Exp $ */
3
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7#include <sys/types.h>
8#include <regex.h>
9#include <assert.h>
10#include <unistd.h>
11
12#include "main.ih"
13
14char *progname;
15int debug = 0;
16int line = 0;
17int status = 0;
18
19int copts = REG_EXTENDED;
20int eopts = 0;
21regoff_t startoff = 0;
22regoff_t endoff = 0;
23
24
25extern int split(char *, char *[], int, char *);
26extern void regprint(regex_t *, FILE *);
27
28/*
29 - main - do the simple case, hand off to regress() for regression
30 */
31int
32main(int argc, char *argv[])
33
34{
35 regex_t re;
36# define NS 10
37 regmatch_t subs[NS];
38 char erbuf[100];
39 int err;
40 size_t len;
41 int c;
42 int errflg = 0;
43 register int i;
44 extern int optind;
45 extern char *optarg;
46
47 progname = argv[0];
48
49 while ((c = getopt(argc, argv, "c:E:e:S:x")) != -1)
50 switch (c) {
51 case 'c': /* compile options */
52 copts = options('c', optarg);
53 break;
54 case 'E': /* end offset */
55 endoff = (regoff_t)atoi(optarg);
56 break;
57 case 'e': /* execute options */
58 eopts = options('e', optarg);
59 break;
60 case 'S': /* start offset */
61 startoff = (regoff_t)atoi(optarg);
62 break;
63 case 'x': /* Debugging. */
64 debug++;
65 break;
66 case '?':
67 default:
68 errflg++;
69 break;
70 }
71 if (errflg) {
72 fprintf(stderr, "usage: %s ", progname);
73 fprintf(stderr, "[-x] [-c copt] [-E endoff] [-e eopt] [-S startoff] [re]\n");
74 exit(2);
75 }
76
77 if (optind >= argc) {
78 regress(stdin);
79 exit(status);
80 }
81
82 err = regcomp(&re, argv[optind++], copts);
83 if (err) {
84 len = regerror(err, &re, erbuf, sizeof(erbuf));
85 fprintf(stderr, "error %s, %zu/%zu `%s'\n",
86 eprint(err), len, sizeof(erbuf), erbuf);
87 exit(status);
88 }
89 regprint(&re, stdout);
90
91 if (optind >= argc) {
92 regfree(&re);
93 exit(status);
94 }
95
96 if (eopts&REG_STARTEND) {
97 subs[0].rm_so = startoff;
98 subs[0].rm_eo = strlen(argv[optind]) - endoff;
99 }
100 err = regexec(&re, argv[optind], (size_t)NS, subs, eopts);
101 if (err) {
102 len = regerror(err, &re, erbuf, sizeof(erbuf));
103 fprintf(stderr, "error %s, %zu/%zu `%s'\n",
104 eprint(err), len, sizeof(erbuf), erbuf);
105 exit(status);
106 }
107 if (!(copts&REG_NOSUB)) {
108 len = (size_t)(subs[0].rm_eo - subs[0].rm_so);
109 if (subs[0].rm_so != -1) {
110 if (len != 0)
111 printf("match `%.*s'\n", (int)len,
112 argv[optind] + subs[0].rm_so);
113 else
114 printf("match `'@%.1s\n",
115 argv[optind] + subs[0].rm_so);
116 }
117 for (i = 1; i < NS; i++)
118 if (subs[i].rm_so != -1)
119 printf("(%d) `%.*s'\n", i,
120 (int)(subs[i].rm_eo - subs[i].rm_so),
121 argv[optind] + subs[i].rm_so);
122 }
123 exit(status);
124}
125
126/*
127 - regress - main loop of regression test
128 == void regress(FILE *in);
129 */
130void
131regress(in)
132FILE *in;
133{
134 char inbuf[1000];
135# define MAXF 10
136 char *f[MAXF];
137 int nf;
138 int i;
139 char erbuf[100];
140 size_t ne;
141 char *badpat = "invalid regular expression";
142# define SHORT 10
143 char *bpname = "REG_BADPAT";
144 regex_t re;
145
146 while (fgets(inbuf, sizeof(inbuf), in) != NULL) {
147 line++;
148 if (inbuf[0] == '#' || inbuf[0] == '\n')
149 continue; /* NOTE CONTINUE */
150 inbuf[strcspn(inbuf, "\n")] = '\0'; /* get rid of stupid \n */
151 if (debug)
152 fprintf(stdout, "%d:\n", line);
153 nf = split(inbuf, f, MAXF, "\t\t");
154 if (nf < 3) {
155 fprintf(stderr, "bad input, line %d\n", line);
156 exit(1);
157 }
158 for (i = 0; i < nf; i++)
159 if (strcmp(f[i], "\"\"") == 0)
160 f[i] = "";
161 if (nf <= 3)
162 f[3] = NULL;
163 if (nf <= 4)
164 f[4] = NULL;
165 try(f[0], f[1], f[2], f[3], f[4], options('c', f[1]));
166 if (opt('&', f[1])) /* try with either type of RE */
167 try(f[0], f[1], f[2], f[3], f[4],
168 options('c', f[1]) &~ REG_EXTENDED);
169 }
170
171 ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf));
172 if (strcmp(erbuf, badpat) != 0 || ne != strlen(badpat)+1) {
173 fprintf(stderr, "end: regerror() test gave `%s' not `%s'\n",
174 erbuf, badpat);
175 status = 1;
176 }
177 ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, (size_t)SHORT);
178 if (strncmp(erbuf, badpat, SHORT-1) != 0 || erbuf[SHORT-1] != '\0' ||
179 ne != strlen(badpat)+1) {
180 fprintf(stderr, "end: regerror() short test gave `%s' not `%.*s'\n",
181 erbuf, SHORT-1, badpat);
182 status = 1;
183 }
184 ne = regerror(REG_ITOA|REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf));
185 if (strcmp(erbuf, bpname) != 0 || ne != strlen(bpname)+1) {
186 fprintf(stderr, "end: regerror() ITOA test gave `%s' not `%s'\n",
187 erbuf, bpname);
188 status = 1;
189 }
190 re.re_endp = bpname;
191 ne = regerror(REG_ATOI, &re, erbuf, sizeof(erbuf));
192 if (atoi(erbuf) != (int)REG_BADPAT) {
193 fprintf(stderr, "end: regerror() ATOI test gave `%s' not `%ld'\n",
194 erbuf, (long)REG_BADPAT);
195 status = 1;
196 } else if (ne != strlen(erbuf)+1) {
197 fprintf(stderr, "end: regerror() ATOI test len(`%s') = %ld\n",
198 erbuf, (long)REG_BADPAT);
199 status = 1;
200 }
201}
202
203/*
204 - try - try it, and report on problems
205 == void try(char *f0, char *f1, char *f2, char *f3, char *f4, int opts);
206 */
207void
208try(f0, f1, f2, f3, f4, opts)
209char *f0;
210char *f1;
211char *f2;
212char *f3;
213char *f4;
214int opts; /* may not match f1 */
215{
216 regex_t re;
217# define NSUBS 10
218 regmatch_t subs[NSUBS];
219# define NSHOULD 15
220 char *should[NSHOULD];
221 int nshould;
222 char erbuf[100];
223 int err;
224 int len;
225 char *type = (opts & REG_EXTENDED) ? "ERE" : "BRE";
226 register int i;
227 char *grump;
228 char f0copy[1000];
229 char f2copy[1000];
230
231 strlcpy(f0copy, f0, sizeof f0copy);
232 re.re_endp = (opts&REG_PEND) ? f0copy + strlen(f0copy) : NULL;
233 fixstr(f0copy);
234 err = regcomp(&re, f0copy, opts);
235 if (err != 0 && (!opt('C', f1) || err != efind(f2))) {
236 /* unexpected error or wrong error */
237 len = regerror(err, &re, erbuf, sizeof(erbuf));
238 fprintf(stderr, "%d: %s error %s, %d/%zu `%s'\n",
239 line, type, eprint(err), len,
240 sizeof(erbuf), erbuf);
241 status = 1;
242 } else if (err == 0 && opt('C', f1)) {
243 /* unexpected success */
244 fprintf(stderr, "%d: %s should have given REG_%s\n",
245 line, type, f2);
246 status = 1;
247 err = 1; /* so we won't try regexec */
248 }
249
250 if (err != 0) {
251 regfree(&re);
252 return;
253 }
254
255 strlcpy(f2copy, f2, sizeof f2copy);
256 fixstr(f2copy);
257
258 if (options('e', f1)&REG_STARTEND) {
259 if (strchr(f2, '(') == NULL || strchr(f2, ')') == NULL)
260 fprintf(stderr, "%d: bad STARTEND syntax\n", line);
261 subs[0].rm_so = strchr(f2, '(') - f2 + 1;
262 subs[0].rm_eo = strchr(f2, ')') - f2;
263 /* the preceding character is relevant with REG_NOTBOL */
264 f2copy[subs[0].rm_so - 1] = subs[0].rm_so > 1 ?
265 f2copy[subs[0].rm_so - 2] : 'X';
266 }
267 err = regexec(&re, f2copy, NSUBS, subs, options('e', f1));
268
269 if (err != 0 && (f3 != NULL || err != REG_NOMATCH)) {
270 /* unexpected error or wrong error */
271 len = regerror(err, &re, erbuf, sizeof(erbuf));
272 fprintf(stderr, "%d: %s exec error %s, %d/%zu `%s'\n",
273 line, type, eprint(err), len,
274 sizeof(erbuf), erbuf);
275 status = 1;
276 } else if (err != 0) {
277 /* nothing more to check */
278 } else if (f3 == NULL) {
279 /* unexpected success */
280 fprintf(stderr, "%d: %s exec should have failed\n",
281 line, type);
282 status = 1;
283 err = 1; /* just on principle */
284 } else if (opts&REG_NOSUB) {
285 /* nothing more to check */
286 } else if ((grump = check(f2, subs[0], f3)) != NULL) {
287 fprintf(stderr, "%d: %s %s\n", line, type, grump);
288 status = 1;
289 err = 1;
290 }
291
292 if (err != 0 || f4 == NULL) {
293 regfree(&re);
294 return;
295 }
296
297 for (i = 1; i < NSHOULD; i++)
298 should[i] = NULL;
299 nshould = split(f4, should+1, NSHOULD-1, ",");
300 if (nshould == 0) {
301 nshould = 1;
302 should[1] = "";
303 }
304 for (i = 1; i < NSUBS; i++) {
305 grump = check(f2, subs[i], should[i]);
306 if (grump != NULL) {
307 fprintf(stderr, "%d: %s $%d %s\n", line,
308 type, i, grump);
309 status = 1;
310 err = 1;
311 }
312 }
313
314 regfree(&re);
315}
316
317/*
318 - options - pick options out of a regression-test string
319 == int options(int type, char *s);
320 */
321int
322options(type, s)
323int type; /* 'c' compile, 'e' exec */
324char *s;
325{
326 register char *p;
327 register int o = (type == 'c') ? copts : eopts;
328 register char *legal = (type == 'c') ? "bisnmp" : "^$#tl";
329
330 for (p = s; *p != '\0'; p++)
331 if (strchr(legal, *p) != NULL)
332 switch (*p) {
333 case 'b':
334 o &= ~REG_EXTENDED;
335 break;
336 case 'i':
337 o |= REG_ICASE;
338 break;
339 case 's':
340 o |= REG_NOSUB;
341 break;
342 case 'n':
343 o |= REG_NEWLINE;
344 break;
345 case 'm':
346 o &= ~REG_EXTENDED;
347 o |= REG_NOSPEC;
348 break;
349 case 'p':
350 o |= REG_PEND;
351 break;
352 case '^':
353 o |= REG_NOTBOL;
354 break;
355 case '$':
356 o |= REG_NOTEOL;
357 break;
358 case '#':
359 o |= REG_STARTEND;
360 break;
361 case 't': /* trace */
362 o |= REG_TRACE;
363 break;
364 case 'l': /* force long representation */
365 o |= REG_LARGE;
366 break;
367 case 'r': /* force backref use */
368 o |= REG_BACKR;
369 break;
370 }
371 return(o);
372}
373
374/*
375 - opt - is a particular option in a regression string?
376 == int opt(int c, char *s);
377 */
378int /* predicate */
379opt(c, s)
380int c;
381char *s;
382{
383 return(strchr(s, c) != NULL);
384}
385
386/*
387 - fixstr - transform magic characters in strings
388 == void fixstr(register char *p);
389 */
390void
391fixstr(p)
392register char *p;
393{
394 if (p == NULL)
395 return;
396
397 for (; *p != '\0'; p++)
398 if (*p == 'N')
399 *p = '\n';
400 else if (*p == 'T')
401 *p = '\t';
402 else if (*p == 'S')
403 *p = ' ';
404 else if (*p == 'Z')
405 *p = '\0';
406}
407
408/*
409 - check - check a substring match
410 == char *check(char *str, regmatch_t sub, char *should);
411 */
412char * /* NULL or complaint */
413check(str, sub, should)
414char *str;
415regmatch_t sub;
416char *should;
417{
418 register int len;
419 register int shlen;
420 register char *p;
421 static char grump[500];
422 register char *at = NULL;
423
424 if (should != NULL && strcmp(should, "-") == 0)
425 should = NULL;
426 if (should != NULL && should[0] == '@') {
427 at = should + 1;
428 should = "";
429 }
430
431 /* check rm_so and rm_eo for consistency */
432 if (sub.rm_so > sub.rm_eo || (sub.rm_so == -1 && sub.rm_eo != -1) ||
433 (sub.rm_so != -1 && sub.rm_eo == -1) ||
434 (sub.rm_so != -1 && sub.rm_so < 0) ||
435 (sub.rm_eo != -1 && sub.rm_eo < 0) ) {
436 snprintf(grump, sizeof grump,
437 "start %ld end %ld", (long)sub.rm_so,
438 (long)sub.rm_eo);
439 return(grump);
440 }
441
442 /* check for no match */
443 if (sub.rm_so == -1 && should == NULL)
444 return(NULL);
445 if (sub.rm_so == -1)
446 return("did not match");
447
448 /* check for in range */
449 if (sub.rm_eo > strlen(str)) {
450 snprintf(grump, sizeof grump,
451 "start %ld end %ld, past end of string",
452 (long)sub.rm_so, (long)sub.rm_eo);
453 return(grump);
454 }
455
456 len = (int)(sub.rm_eo - sub.rm_so);
457 p = str + sub.rm_so;
458
459 /* check for not supposed to match */
460 if (should == NULL) {
461 snprintf(grump, sizeof grump, "matched `%.*s'", len, p);
462 return(grump);
463 }
464
465 /* check for wrong match */
466 shlen = (int)strlen(should);
467 if (len != shlen || strncmp(p, should, (size_t)shlen) != 0) {
468 snprintf(grump, sizeof grump, "matched `%.*s' instead", len, p);
469 return(grump);
470 }
471 if (shlen > 0)
472 return(NULL);
473
474 /* check null match in right place */
475 if (at == NULL)
476 return(NULL);
477 shlen = strlen(at);
478 if (shlen == 0)
479 shlen = 1; /* force check for end-of-string */
480 if (strncmp(p, at, shlen) != 0) {
481 snprintf(grump, sizeof grump, "matched null at `%.20s'", p);
482 return(grump);
483 }
484 return(NULL);
485}
486
487/*
488 - eprint - convert error number to name
489 == static char *eprint(int err);
490 */
491static char *
492eprint(err)
493int err;
494{
495 static char epbuf[100];
496 size_t len;
497
498 len = regerror(REG_ITOA|err, (regex_t *)NULL, epbuf, sizeof(epbuf));
499 assert(len <= sizeof(epbuf));
500 return(epbuf);
501}
502
503/*
504 - efind - convert error name to number
505 == static int efind(char *name);
506 */
507static int
508efind(name)
509char *name;
510{
511 static char efbuf[100];
512 regex_t re;
513
514 snprintf(efbuf, sizeof efbuf, "REG_%s", name);
515 assert(strlen(efbuf) < sizeof(efbuf));
516 re.re_endp = efbuf;
517 (void) regerror(REG_ATOI, &re, efbuf, sizeof(efbuf));
518 return(atoi(efbuf));
519}
diff --git a/src/regress/lib/libc/regex/main.ih b/src/regress/lib/libc/regex/main.ih
deleted file mode 100644
index 0860e26333..0000000000
--- a/src/regress/lib/libc/regex/main.ih
+++ /dev/null
@@ -1,22 +0,0 @@
1/* $OpenBSD: main.ih,v 1.3 2002/02/16 21:27:32 millert Exp $ */
2/* $NetBSD: main.ih,v 1.2 1995/04/20 22:39:55 cgd Exp $ */
3
4/* ========= begin header generated by ./mkh ========= */
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9/* === main.c === */
10void regress(FILE *in);
11void try(char *f0, char *f1, char *f2, char *f3, char *f4, int opts);
12int options(int type, char *s);
13int opt(int c, char *s);
14void fixstr(register char *p);
15char *check(char *str, regmatch_t sub, char *should);
16static char *eprint(int err);
17static int efind(char *name);
18
19#ifdef __cplusplus
20}
21#endif
22/* ========= end header generated by ./mkh ========= */
diff --git a/src/regress/lib/libc/regex/split.c b/src/regress/lib/libc/regex/split.c
deleted file mode 100644
index fcd81a3503..0000000000
--- a/src/regress/lib/libc/regex/split.c
+++ /dev/null
@@ -1,317 +0,0 @@
1/* $OpenBSD: split.c,v 1.5 2007/09/09 23:25:12 chl Exp $ */
2/* $NetBSD: split.c,v 1.2 1995/04/20 22:39:57 cgd Exp $ */
3
4#include <stdio.h>
5#include <string.h>
6
7int split(char *string, char *fields[], int nfields, char *sep);
8
9/*
10 - split - divide a string into fields, like awk split()
11 = int split(char *string, char *fields[], int nfields, char *sep);
12 */
13int /* number of fields, including overflow */
14split(char *string, char *fields[], int nfields, char *sep)
15{
16 register char *p = string;
17 register char c; /* latest character */
18 register char sepc = sep[0];
19 register char sepc2;
20 register int fn;
21 register char **fp = fields;
22 register char *sepp;
23 register int trimtrail;
24
25 /* white space */
26 if (sepc == '\0') {
27 while ((c = *p++) == ' ' || c == '\t')
28 continue;
29 p--;
30 trimtrail = 1;
31 sep = " \t"; /* note, code below knows this is 2 long */
32 sepc = ' ';
33 } else
34 trimtrail = 0;
35 sepc2 = sep[1]; /* now we can safely pick this up */
36
37 /* catch empties */
38 if (*p == '\0')
39 return(0);
40
41 /* single separator */
42 if (sepc2 == '\0') {
43 fn = nfields;
44 for (;;) {
45 *fp++ = p;
46 fn--;
47 if (fn == 0)
48 break;
49 while ((c = *p++) != sepc)
50 if (c == '\0')
51 return(nfields - fn);
52 *(p-1) = '\0';
53 }
54 /* we have overflowed the fields vector -- just count them */
55 fn = nfields;
56 for (;;) {
57 while ((c = *p++) != sepc)
58 if (c == '\0')
59 return(fn);
60 fn++;
61 }
62 /* not reached */
63 }
64
65 /* two separators */
66 if (sep[2] == '\0') {
67 fn = nfields;
68 for (;;) {
69 *fp++ = p;
70 fn--;
71 while ((c = *p++) != sepc && c != sepc2)
72 if (c == '\0') {
73 if (trimtrail && **(fp-1) == '\0')
74 fn++;
75 return(nfields - fn);
76 }
77 if (fn == 0)
78 break;
79 *(p-1) = '\0';
80 while ((c = *p++) == sepc || c == sepc2)
81 continue;
82 p--;
83 }
84 /* we have overflowed the fields vector -- just count them */
85 fn = nfields;
86 while (c != '\0') {
87 while ((c = *p++) == sepc || c == sepc2)
88 continue;
89 p--;
90 fn++;
91 while ((c = *p++) != '\0' && c != sepc && c != sepc2)
92 continue;
93 }
94 /* might have to trim trailing white space */
95 if (trimtrail) {
96 p--;
97 while ((c = *--p) == sepc || c == sepc2)
98 continue;
99 p++;
100 if (*p != '\0') {
101 if (fn == nfields+1)
102 *p = '\0';
103 fn--;
104 }
105 }
106 return(fn);
107 }
108
109 /* n separators */
110 fn = 0;
111 for (;;) {
112 if (fn < nfields)
113 *fp++ = p;
114 fn++;
115 for (;;) {
116 c = *p++;
117 if (c == '\0')
118 return(fn);
119 sepp = sep;
120 while ((sepc = *sepp++) != '\0' && sepc != c)
121 continue;
122 if (sepc != '\0') /* it was a separator */
123 break;
124 }
125 if (fn < nfields)
126 *(p-1) = '\0';
127 for (;;) {
128 c = *p++;
129 sepp = sep;
130 while ((sepc = *sepp++) != '\0' && sepc != c)
131 continue;
132 if (sepc == '\0') /* it wasn't a separator */
133 break;
134 }
135 p--;
136 }
137
138 /* not reached */
139}
140
141#ifdef TEST_SPLIT
142
143
144/*
145 * test program
146 * pgm runs regression
147 * pgm sep splits stdin lines by sep
148 * pgm str sep splits str by sep
149 * pgm str sep n splits str by sep n times
150 */
151int
152main(argc, argv)
153int argc;
154char *argv[];
155{
156 char buf[512];
157 register int n;
158# define MNF 10
159 char *fields[MNF];
160
161 if (argc > 4)
162 for (n = atoi(argv[3]); n > 0; n--) {
163 (void) strlcpy(buf, argv[1], sizeof buf);
164 }
165 else if (argc > 3)
166 for (n = atoi(argv[3]); n > 0; n--) {
167 (void) strlcpy(buf, argv[1], sizeof buf);
168 (void) split(buf, fields, MNF, argv[2]);
169 }
170 else if (argc > 2)
171 dosplit(argv[1], argv[2]);
172 else if (argc > 1)
173 while (fgets(buf, sizeof(buf), stdin) != NULL) {
174 buf[strcspn(buf, "\n")] = '\0'; /* stomp newline */
175 dosplit(buf, argv[1]);
176 }
177 else
178 regress();
179
180 exit(0);
181}
182
183dosplit(string, seps)
184char *string;
185char *seps;
186{
187# define NF 5
188 char *fields[NF];
189 register int nf;
190
191 nf = split(string, fields, NF, seps);
192 print(nf, NF, fields);
193}
194
195print(nf, nfp, fields)
196int nf;
197int nfp;
198char *fields[];
199{
200 register int fn;
201 register int bound;
202
203 bound = (nf > nfp) ? nfp : nf;
204 printf("%d:\t", nf);
205 for (fn = 0; fn < bound; fn++)
206 printf("\"%s\"%s", fields[fn], (fn+1 < nf) ? ", " : "\n");
207}
208
209#define RNF 5 /* some table entries know this */
210struct {
211 char *str;
212 char *seps;
213 int nf;
214 char *fi[RNF];
215} tests[] = {
216 "", " ", 0, { "" },
217 " ", " ", 2, { "", "" },
218 "x", " ", 1, { "x" },
219 "xy", " ", 1, { "xy" },
220 "x y", " ", 2, { "x", "y" },
221 "abc def g ", " ", 5, { "abc", "def", "", "g", "" },
222 " a bcd", " ", 4, { "", "", "a", "bcd" },
223 "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" },
224 " a b c d ", " ", 6, { "", "a", "b", "c", "d " },
225
226 "", " _", 0, { "" },
227 " ", " _", 2, { "", "" },
228 "x", " _", 1, { "x" },
229 "x y", " _", 2, { "x", "y" },
230 "ab _ cd", " _", 2, { "ab", "cd" },
231 " a_b c ", " _", 5, { "", "a", "b", "c", "" },
232 "a b c_d e f", " _", 6, { "a", "b", "c", "d", "e f" },
233 " a b c d ", " _", 6, { "", "a", "b", "c", "d " },
234
235 "", " _~", 0, { "" },
236 " ", " _~", 2, { "", "" },
237 "x", " _~", 1, { "x" },
238 "x y", " _~", 2, { "x", "y" },
239 "ab _~ cd", " _~", 2, { "ab", "cd" },
240 " a_b c~", " _~", 5, { "", "a", "b", "c", "" },
241 "a b_c d~e f", " _~", 6, { "a", "b", "c", "d", "e f" },
242 "~a b c d ", " _~", 6, { "", "a", "b", "c", "d " },
243
244 "", " _~-", 0, { "" },
245 " ", " _~-", 2, { "", "" },
246 "x", " _~-", 1, { "x" },
247 "x y", " _~-", 2, { "x", "y" },
248 "ab _~- cd", " _~-", 2, { "ab", "cd" },
249 " a_b c~", " _~-", 5, { "", "a", "b", "c", "" },
250 "a b_c-d~e f", " _~-", 6, { "a", "b", "c", "d", "e f" },
251 "~a-b c d ", " _~-", 6, { "", "a", "b", "c", "d " },
252
253 "", " ", 0, { "" },
254 " ", " ", 2, { "", "" },
255 "x", " ", 1, { "x" },
256 "xy", " ", 1, { "xy" },
257 "x y", " ", 2, { "x", "y" },
258 "abc def g ", " ", 4, { "abc", "def", "g", "" },
259 " a bcd", " ", 3, { "", "a", "bcd" },
260 "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" },
261 " a b c d ", " ", 6, { "", "a", "b", "c", "d " },
262
263 "", "", 0, { "" },
264 " ", "", 0, { "" },
265 "x", "", 1, { "x" },
266 "xy", "", 1, { "xy" },
267 "x y", "", 2, { "x", "y" },
268 "abc def g ", "", 3, { "abc", "def", "g" },
269 "\t a bcd", "", 2, { "a", "bcd" },
270 " a \tb\t c ", "", 3, { "a", "b", "c" },
271 "a b c d e ", "", 5, { "a", "b", "c", "d", "e" },
272 "a b\tc d e f", "", 6, { "a", "b", "c", "d", "e f" },
273 " a b c d e f ", "", 6, { "a", "b", "c", "d", "e f " },
274
275 NULL, NULL, 0, { NULL },
276};
277
278regress()
279{
280 char buf[512];
281 register int n;
282 char *fields[RNF+1];
283 register int nf;
284 register int i;
285 register int printit;
286 register char *f;
287
288 for (n = 0; tests[n].str != NULL; n++) {
289 (void) strlcpy(buf, tests[n].str, sizeof buf);
290 fields[RNF] = NULL;
291 nf = split(buf, fields, RNF, tests[n].seps);
292 printit = 0;
293 if (nf != tests[n].nf) {
294 printf("split `%s' by `%s' gave %d fields, not %d\n",
295 tests[n].str, tests[n].seps, nf, tests[n].nf);
296 printit = 1;
297 } else if (fields[RNF] != NULL) {
298 printf("split() went beyond array end\n");
299 printit = 1;
300 } else {
301 for (i = 0; i < nf && i < RNF; i++) {
302 f = fields[i];
303 if (f == NULL)
304 f = "(NULL)";
305 if (strcmp(f, tests[n].fi[i]) != 0) {
306 printf("split `%s' by `%s', field %d is `%s', not `%s'\n",
307 tests[n].str, tests[n].seps,
308 i, fields[i], tests[n].fi[i]);
309 printit = 1;
310 }
311 }
312 }
313 if (printit)
314 print(nf, RNF, fields);
315 }
316}
317#endif
diff --git a/src/regress/lib/libc/regex/t_exhaust.c b/src/regress/lib/libc/regex/t_exhaust.c
deleted file mode 100644
index 58ac8007f2..0000000000
--- a/src/regress/lib/libc/regex/t_exhaust.c
+++ /dev/null
@@ -1,184 +0,0 @@
1/* $OpenBSD: t_exhaust.c,v 1.3 2012/12/05 23:20:07 deraadt Exp $ */
2/* $NetBSD: t_exhaust.c,v 1.2 2011/10/21 00:41:34 christos Exp $ */
3
4/*-
5 * Copyright (c) 2011 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Christos Zoulas.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgement:
21 * This product includes software developed by the NetBSD
22 * Foundation, Inc. and its contributors.
23 * 4. Neither the name of The NetBSD Foundation nor the names of its
24 * contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 */
39
40#include <stdio.h>
41#include <regex.h>
42#include <string.h>
43#include <stdlib.h>
44#include <err.h>
45//#include <atf-c.h>
46
47
48static char *
49mkstr(const char *str, size_t len)
50{
51 size_t i, slen = strlen(str);
52 char *p = malloc(slen * len + 1);
53 if (p == NULL)
54 err(1, "malloc");
55 for (i = 0; i < len; i++)
56 strlcpy(&p[i * slen], str, slen * len + 1 - (i * slen));
57 return p;
58}
59
60static char *
61concat(const char *d, const char *s)
62{
63 size_t dlen = strlen(d);
64 size_t slen = strlen(s);
65 char *p = malloc(dlen + slen + 1);
66 strlcpy(p, d, dlen + slen + 1);
67 strlcat(p, s, dlen + slen + 1);
68 return p;
69}
70
71static char *
72p0(size_t len)
73{
74 char *d, *s1, *s2;
75 s1 = mkstr("\\(", len);
76 s2 = concat(s1, ")");
77 free(s1);
78 d = concat("(", s2);
79 free(s2);
80 return d;
81}
82
83static char *
84p1(size_t len)
85{
86 char *d, *s1, *s2, *s3;
87 s1 = mkstr("\\(", 60);
88 s2 = mkstr("(.*)", len);
89 s3 = concat(s1, s2);
90 free(s2);
91 free(s1);
92 s1 = concat(s3, ")");
93 free(s3);
94 d = concat("(", s1);
95 free(s1);
96 return d;
97}
98
99static char *
100ps(const char *m, const char *s, size_t len)
101{
102 char *d, *s1, *s2, *s3;
103 s1 = mkstr(m, len);
104 s2 = mkstr(s, len);
105 s3 = concat(s1, s2);
106 free(s2);
107 free(s1);
108 d = concat("(.?)", s3);
109 free(s3);
110 return d;
111}
112
113static char *
114p2(size_t len)
115{
116 return ps("((.*){0,255}", ")", len);
117}
118
119static char *
120p3(size_t len)
121{
122 return ps("(.\\{0,}", ")", len);
123}
124
125static char *
126p4(size_t len)
127{
128 return ps("((.*){1,255}", ")", len);
129}
130
131static char *
132p5(size_t len)
133{
134 return ps("(", "){1,100}", len);
135}
136
137static char *
138p6(size_t len)
139{
140 char *d, *s1, *s2;
141 s1 = mkstr("(?:(.*)|", len);
142 s2 = concat(s1, "(.*)");
143 free(s1);
144 s1 = mkstr(")", len);
145 d = concat(s2, s1);
146 free(s1);
147 free(s2);
148 return d;
149}
150
151static char *(*patterns[])(size_t) = {
152 p0,
153 p1,
154 p2,
155 p3,
156 p4,
157 p5,
158 p6,
159};
160
161
162main()
163{
164 regex_t re;
165 int e, ret = 0;
166 size_t i;
167
168 for (i = 0; i < sizeof(patterns) / sizeof(patterns[0]); i++) {
169 char *d = (*patterns[i])(9999);
170 e = regcomp(&re, d, i == 6 ? REG_BASIC : REG_EXTENDED);
171 free(d);
172 if (e) {
173 if (e != REG_ESPACE) {
174 printf("regcomp returned %d for pattern %zu", e, i);
175 ret = 1;
176 }
177 continue;
178 }
179 (void)regexec(&re, "aaaaaaaa", 0, NULL, 0);
180 regfree(&re);
181 }
182 return ret;
183}
184
diff --git a/src/regress/lib/libc/regex/tests b/src/regress/lib/libc/regex/tests
deleted file mode 100644
index ee019f0a04..0000000000
--- a/src/regress/lib/libc/regex/tests
+++ /dev/null
@@ -1,594 +0,0 @@
1# $OpenBSD: tests,v 1.8 2016/05/26 14:23:55 schwarze Exp $
2# $NetBSD: tests,v 1.5 1995/04/20 22:40:00 cgd Exp $
3
4# regular expression test set
5# Lines are at least three fields, separated by one or more tabs. "" stands
6# for an empty field. First field is an RE. Second field is flags. If
7# C flag given, regcomp() is expected to fail, and the third field is the
8# error name (minus the leading REG_).
9#
10# Otherwise it is expected to succeed, and the third field is the string to
11# try matching it against. If there is no fourth field, the match is
12# expected to fail. If there is a fourth field, it is the substring that
13# the RE is expected to match. If there is a fifth field, it is a comma-
14# separated list of what the subexpressions should match, with - indicating
15# no match for that one. In both the fourth and fifth fields, a (sub)field
16# starting with @ indicates that the (sub)expression is expected to match
17# a null string followed by the stuff after the @; this provides a way to
18# test where null strings match. The character `N' in REs and strings
19# is newline, `S' is space, `T' is tab, `Z' is NUL.
20#
21# The full list of flags:
22# - placeholder, does nothing
23# b RE is a BRE, not an ERE
24# & try it as both an ERE and a BRE
25# C regcomp() error expected, third field is error name
26# i REG_ICASE
27# m ("mundane") REG_NOSPEC
28# s REG_NOSUB (not really testable)
29# n REG_NEWLINE
30# ^ REG_NOTBOL
31# $ REG_NOTEOL
32# # REG_STARTEND (see below)
33# p REG_PEND
34#
35# For REG_STARTEND, the start/end offsets are those of the substring
36# enclosed in ().
37
38# basics
39a & a a
40abc & abc abc
41abc|de - abc abc
42a|b|c - abc a
43
44# parentheses and perversions thereof
45a(b)c - abc abc
46a\(b\)c b abc abc
47a( C EPAREN
48a( b a( a(
49a\( - a( a(
50a\( bC EPAREN
51a\(b bC EPAREN
52a(b C EPAREN
53a(b b a(b a(b
54# gag me with a right parenthesis -- 1003.2 goofed here (my fault, partly)
55a) - a) a)
56) - ) )
57# end gagging (in a just world, those *should* give EPAREN)
58a) b a) a)
59a\) bC EPAREN
60\) bC EPAREN
61a()b - ab ab
62a\(\)b b ab ab
63
64# anchoring and REG_NEWLINE
65^abc$ & abc abc
66^b & abc
67a^b - a^b
68a^b b a^b a^b
69a$b - a$b
70a$b b a$b a$b
71^ & abc @abc
72$ & abc @
73^$ & "" @
74$^ - "" @
75\($\)\(^\) b "" @
76# stop retching, those are legitimate (although disgusting)
77^^ - "" @
78$$ - "" @
79b$ & abNc
80b$ &n abNc b
81^b & aNbNc
82b$ & aNbNc
83^a &n aNb a
84^b &n abc
85^b$ &n aNbNc b
86^$ &n aNNb @Nb
87^$ n abc
88^$ n abcN @
89$^ n aNNb @Nb
90\($\)\(^\) bn aNNb @Nb
91^^ n^ aNNb @Nb
92$$ n aNNb @NN
93^a &^ a
94a$ &$ a
95^b &^ abc
96^b &^ aNb
97^a &^n aNb
98^b &^n abc
99^b &^n aNb b
100a$ &$n bNa
101b$ &$n bNa b
102a*(^b$)c* - b b
103a*\(^b$\)c* b b b
104
105# certain syntax errors and non-errors
106| C EMPTY
107| b | |
108* C BADRPT
109* b * *
110+ C BADRPT
111? C BADRPT
112"" &C EMPTY
113() - abc @abc
114\(\) b abc @abc
115a||b C EMPTY
116|ab C EMPTY
117ab| C EMPTY
118(|a)b C EMPTY
119(a|)b C EMPTY
120(*a) C BADRPT
121(+a) C BADRPT
122(?a) C BADRPT
123({1}a) C BADRPT
124\(\{1\}a\) bC BADRPT
125(a|*b) C BADRPT
126(a|+b) C BADRPT
127(a|?b) C BADRPT
128(a|{1}b) C BADRPT
129^* C BADRPT
130^* b * *
131^+ C BADRPT
132^? C BADRPT
133^{1} C BADRPT
134^\{1\} bC BADRPT
135
136# metacharacters, backslashes
137a.c & abc abc
138a[bc]d & abd abd
139a\*c & a*c a*c
140a\\b & a\b a\b
141a\\\*b & a\*b a\*b
142a\bc & abc abc
143a\ &C EESCAPE
144a\\bc & a\bc a\bc
145\{ bC BADRPT
146a\[b & a[b a[b
147a[b &C EBRACK
148# trailing $ is a peculiar special case for the BRE code
149a$ & a a
150a$ & a$
151a\$ & a
152a\$ & a$ a$
153a\\$ & a
154a\\$ & a$
155a\\$ & a\$
156a\\$ & a\ a\
157
158# back references, ugh
159a\(b\)\2c bC ESUBREG
160a\(b\1\)c bC ESUBREG
161a\(b*\)c\1d b abbcbbd abbcbbd bb
162a\(b*\)c\1d b abbcbd
163a\(b*\)c\1d b abbcbbbd
164^\(.\)\1 b abc
165a\([bc]\)\1d b abcdabbd abbd b
166a\(\([bc]\)\2\)*d b abbccd abbccd
167a\(\([bc]\)\2\)*d b abbcbd
168# actually, this next one probably ought to fail, but the spec is unclear
169a\(\(b\)*\2\)*d b abbbd abbbd
170# here is a case that no NFA implementation does right
171\(ab*\)[ab]*\1 b ababaaa ababaaa a
172# check out normal matching in the presence of back refs
173\(a\)\1bcd b aabcd aabcd
174\(a\)\1bc*d b aabcd aabcd
175\(a\)\1bc*d b aabd aabd
176\(a\)\1bc*d b aabcccd aabcccd
177\(a\)\1bc*[ce]d b aabcccd aabcccd
178^\(a\)\1b\(c\)*cd$ b aabcccd aabcccd
179\(b*\)\(a*\1\)* b ab a
180\([^_]*\)\(_*\1\)* b foo_foo_bar_bar_bar_baz foo_foo foo,_foo
181\([^_]*\)\(_*\1\)* b bar_bar_bar_baz bar_bar_bar bar,_bar
182\([^_]*\)\(_*\1\)* b foo_bar_baz foo foo
183\(.*\)\1 b "" ""
184\(.*\)\1 b a ""
185\(.*\)\1 b aa aa
186\(.*\)\1 b aaa aa
187\(.*\)\1 b aaaa aaaa
188\([^_]*\)\1 b "" ""
189\([^_]*\)\1 b a ""
190\([^_]*\)\1 b aa aa
191\([^_]*\)\1 b aaa aa
192\([^_]*\)\1 b aaaa aaaa
193foo\(.*\)bar\1 b foolbarl foolbarl l
194foo\(.*\)bar\1 b foobar foobar ""
195\(\(.\)b\)*\1 b aba
196\(\(.\)b\)*\1 b abba
197\(\(.\)b\)*\1 b abbba
198\(\(.\)b\)*\1 b abbbba bbbb bb,b
199\(\(.\)b\)*\1 b abbbbba abbbbb bb,b
200\(\(.\)b\)*\1 b abbbbbba abbbbb bb,b
201\(\(.\)b\)*\1 b abbbbbbbbbbbbbba abbbbbbbbbbbbb bb,b
202\(\(.\)b\)*\1 b abbbbbbbbbbbbbbba abbbbbbbbbbbbbbb bb,b
203# these used to segfault, buffer underflow in engine.c, backref()
204\(^a\)*\(b.\)\2 b^ sbxbxe bxbx -,bx
205\([[:<:]]a\)*\(b.\)\2 b^ sbxbxe bxbx -,bx
206
207# ordinary repetitions
208ab*c & abc abc
209ab+c - abc abc
210ab?c - abc abc
211a\(*\)b b a*b a*b
212a\(**\)b b ab ab
213a\(***\)b bC BADRPT
214*a b *a *a
215**a b a a
216***a bC BADRPT
217
218# the dreaded bounded repetitions
219{ & { {
220{abc & {abc {abc
221{1 C BADRPT
222{1} C BADRPT
223a{b & a{b a{b
224a{1}b - ab ab
225a\{1\}b b ab ab
226a{1,}b - ab ab
227a\{1,\}b b ab ab
228a{1,2}b - aab aab
229a\{1,2\}b b aab aab
230a{1 C EBRACE
231a\{1 bC EBRACE
232a{1a C EBRACE
233a\{1a bC EBRACE
234a{1a} C BADBR
235a\{1a\} bC BADBR
236a{,2} - a{,2} a{,2}
237a\{,2\} bC BADBR
238a{,} - a{,} a{,}
239a\{,\} bC BADBR
240a{1,x} C BADBR
241a\{1,x\} bC BADBR
242a{1,x C EBRACE
243a\{1,x bC EBRACE
244a{300} C BADBR
245a\{300\} bC BADBR
246a{1,0} C BADBR
247a\{1,0\} bC BADBR
248ab{0,0}c - abcac ac
249ab\{0,0\}c b abcac ac
250ab{0,1}c - abcac abc
251ab\{0,1\}c b abcac abc
252ab{0,3}c - abbcac abbc
253ab\{0,3\}c b abbcac abbc
254ab{1,1}c - acabc abc
255ab\{1,1\}c b acabc abc
256ab{1,3}c - acabc abc
257ab\{1,3\}c b acabc abc
258ab{2,2}c - abcabbc abbc
259ab\{2,2\}c b abcabbc abbc
260ab{2,4}c - abcabbc abbc
261ab\{2,4\}c b abcabbc abbc
262((a{1,10}){1,10}){1,10} - a a a,a
263
264# multiple repetitions
265a** &C BADRPT
266a++ C BADRPT
267a?? C BADRPT
268a*+ C BADRPT
269a*? C BADRPT
270a+* C BADRPT
271a+? C BADRPT
272a?* C BADRPT
273a?+ C BADRPT
274a{1}{1} C BADRPT
275a*{1} C BADRPT
276a+{1} C BADRPT
277a?{1} C BADRPT
278a{1}* C BADRPT
279a{1}+ C BADRPT
280a{1}? C BADRPT
281a*{b} - a{b} a{b}
282a\{1\}\{1\} bC BADRPT
283a*\{1\} bC BADRPT
284a\{1\}* bC BADRPT
285
286# brackets, and numerous perversions thereof
287a[b]c & abc abc
288a[ab]c & abc abc
289a[^ab]c & adc adc
290a[]b]c & a]c a]c
291a[[b]c & a[c a[c
292a[-b]c & a-c a-c
293a[^]b]c & adc adc
294a[^-b]c & adc adc
295a[b-]c & a-c a-c
296a[b &C EBRACK
297a[] &C EBRACK
298a[1-3]c & a2c a2c
299a[3-1]c &C ERANGE
300a[1-3-5]c &C ERANGE
301a[[.-.]--]c & a-c a-c
302a[1- &C ERANGE
303a[[. &C EBRACK
304a[[.x &C EBRACK
305a[[.x. &C EBRACK
306a[[.x.] &C EBRACK
307a[[.x.]] & ax ax
308a[[.x,.]] &C ECOLLATE
309a[[.one.]]b & a1b a1b
310a[[.notdef.]]b &C ECOLLATE
311a[[.].]]b & a]b a]b
312a[[:alpha:]]c & abc abc
313a[[:notdef:]]c &C ECTYPE
314a[[: &C EBRACK
315a[[:alpha &C EBRACK
316a[[:alpha:] &C EBRACK
317a[[:alpha,:] &C ECTYPE
318a[[:]:]]b &C ECTYPE
319a[[:-:]]b &C ECTYPE
320a[[:alph:]] &C ECTYPE
321a[[:alphabet:]] &C ECTYPE
322[[:alnum:]]+ - -%@a0X- a0X
323[[:alpha:]]+ - -%@aX0- aX
324[[:blank:]]+ - aSSTb SST
325[[:cntrl:]]+ - aNTb NT
326[[:digit:]]+ - a019b 019
327[[:graph:]]+ - Sa%bS a%b
328[[:lower:]]+ - AabC ab
329[[:print:]]+ - NaSbN aSb
330[[:punct:]]+ - S%-&T %-&
331[[:space:]]+ - aSNTb SNT
332[[:upper:]]+ - aBCd BC
333[[:xdigit:]]+ - p0f3Cq 0f3C
334a[[=b=]]c & abc abc
335a[[= &C EBRACK
336a[[=b &C EBRACK
337a[[=b= &C EBRACK
338a[[=b=] &C EBRACK
339a[[=b,=]] &C ECOLLATE
340a[[=one=]]b & a1b a1b
341
342# complexities
343a(((b)))c - abc abc
344a(b|(c))d - abd abd
345a(b*|c)d - abbd abbd
346# just gotta have one DFA-buster, of course
347a[ab]{20} - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
348# and an inline expansion in case somebody gets tricky
349a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab] - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
350# and in case somebody just slips in an NFA...
351a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab](wee|week)(knights|night) - aaaaabaaaabaaaabaaaabweeknights aaaaabaaaabaaaabaaaabweeknights
352# fish for anomalies as the number of states passes 32
35312345678901234567890123456789 - a12345678901234567890123456789b 12345678901234567890123456789
354123456789012345678901234567890 - a123456789012345678901234567890b 123456789012345678901234567890
3551234567890123456789012345678901 - a1234567890123456789012345678901b 1234567890123456789012345678901
35612345678901234567890123456789012 - a12345678901234567890123456789012b 12345678901234567890123456789012
357123456789012345678901234567890123 - a123456789012345678901234567890123b 123456789012345678901234567890123
358# and one really big one, beyond any plausible word width
3591234567890123456789012345678901234567890123456789012345678901234567890 - a1234567890123456789012345678901234567890123456789012345678901234567890b 1234567890123456789012345678901234567890123456789012345678901234567890
360# fish for problems as brackets go past 8
361[ab][cd][ef][gh][ij][kl][mn] - xacegikmoq acegikm
362[ab][cd][ef][gh][ij][kl][mn][op] - xacegikmoq acegikmo
363[ab][cd][ef][gh][ij][kl][mn][op][qr] - xacegikmoqy acegikmoq
364[ab][cd][ef][gh][ij][kl][mn][op][q] - xacegikmoqy acegikmoq
365
366# subtleties of matching
367abc & xabcy abc
368a\(b\)?c\1d b acd
369aBc i Abc Abc
370a[Bc]*d i abBCcd abBCcd
3710[[:upper:]]1 &i 0a1 0a1
3720[[:lower:]]1 &i 0A1 0A1
373a[^b]c &i abc
374a[^b]c &i aBc
375a[^b]c &i adc adc
376[a]b[c] - abc abc
377[a]b[a] - aba aba
378[abc]b[abc] - abc abc
379[abc]b[abd] - abd abd
380a(b?c)+d - accd accd
381(wee|week)(knights|night) - weeknights weeknights
382(we|wee|week|frob)(knights|night|day) - weeknights weeknights
383a[bc]d - xyzaaabcaababdacd abd
384a[ab]c - aaabc abc
385abc s abc abc
386a* & b @b
387
388# Let's have some fun -- try to match a C comment.
389# first the obvious, which looks okay at first glance...
390/\*.*\*/ - /*x*/ /*x*/
391# but...
392/\*.*\*/ - /*x*/y/*z*/ /*x*/y/*z*/
393# okay, we must not match */ inside; try to do that...
394/\*([^*]|\*[^/])*\*/ - /*x*/ /*x*/
395/\*([^*]|\*[^/])*\*/ - /*x*/y/*z*/ /*x*/
396# but...
397/\*([^*]|\*[^/])*\*/ - /*x**/y/*z*/ /*x**/y/*z*/
398# and a still fancier version, which does it right (I think)...
399/\*([^*]|\*+[^*/])*\*+/ - /*x*/ /*x*/
400/\*([^*]|\*+[^*/])*\*+/ - /*x*/y/*z*/ /*x*/
401/\*([^*]|\*+[^*/])*\*+/ - /*x**/y/*z*/ /*x**/
402/\*([^*]|\*+[^*/])*\*+/ - /*x****/y/*z*/ /*x****/
403/\*([^*]|\*+[^*/])*\*+/ - /*x**x*/y/*z*/ /*x**x*/
404/\*([^*]|\*+[^*/])*\*+/ - /*x***x/y/*z*/ /*x***x/y/*z*/
405
406# subexpressions
407a(b)(c)d - abcd abcd b,c
408a(((b)))c - abc abc b,b,b
409a(b|(c))d - abd abd b,-
410a(b*|c|e)d - abbd abbd bb
411a(b*|c|e)d - acd acd c
412a(b*|c|e)d - ad ad @d
413a(b?)c - abc abc b
414a(b?)c - ac ac @c
415a(b+)c - abc abc b
416a(b+)c - abbbc abbbc bbb
417a(b*)c - ac ac @c
418(a|ab)(bc([de]+)f|cde) - abcdef abcdef a,bcdef,de
419# the regression tester only asks for 9 subexpressions
420a(b)(c)(d)(e)(f)(g)(h)(i)(j)k - abcdefghijk abcdefghijk b,c,d,e,f,g,h,i,j
421a(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)l - abcdefghijkl abcdefghijkl b,c,d,e,f,g,h,i,j,k
422a([bc]?)c - abc abc b
423a([bc]?)c - ac ac @c
424a([bc]+)c - abc abc b
425a([bc]+)c - abcc abcc bc
426a([bc]+)bc - abcbc abcbc bc
427a(bb+|b)b - abb abb b
428a(bbb+|bb+|b)b - abb abb b
429a(bbb+|bb+|b)b - abbb abbb bb
430a(bbb+|bb+|b)bb - abbb abbb b
431(.*).* - abcdef abcdef abcdef
432(a*)* - bc @b @b
433
434# do we get the right subexpression when it is used more than once?
435a(b|c)*d - ad ad -
436a(b|c)*d - abcd abcd c
437a(b|c)+d - abd abd b
438a(b|c)+d - abcd abcd c
439a(b|c?)+d - ad ad @d
440a(b|c?)+d - abcd abcd @d
441a(b|c){0,0}d - ad ad -
442a(b|c){0,1}d - ad ad -
443a(b|c){0,1}d - abd abd b
444a(b|c){0,2}d - ad ad -
445a(b|c){0,2}d - abcd abcd c
446a(b|c){0,}d - ad ad -
447a(b|c){0,}d - abcd abcd c
448a(b|c){1,1}d - abd abd b
449a(b|c){1,1}d - acd acd c
450a(b|c){1,2}d - abd abd b
451a(b|c){1,2}d - abcd abcd c
452a(b|c){1,}d - abd abd b
453a(b|c){1,}d - abcd abcd c
454a(b|c){2,2}d - acbd acbd b
455a(b|c){2,2}d - abcd abcd c
456a(b|c){2,4}d - abcd abcd c
457a(b|c){2,4}d - abcbd abcbd b
458a(b|c){2,4}d - abcbcd abcbcd c
459a(b|c){2,}d - abcd abcd c
460a(b|c){2,}d - abcbd abcbd b
461a(b+|((c)*))+d - abd abd @d,@d,-
462a(b+|((c)*))+d - abcd abcd @d,@d,-
463
464# check out the STARTEND option
465^[abc] &# a(b)c b
466^[abc] &# a(xb)c
467^[abc] &# aN(b)c b
468^[abc] &n# a(b)c b
469^[abc] &n# a(xb)c
470^[abc] &n# aN(b)c b
471^[abc] &^# a(b)c
472^[abc] &^# a(xb)c
473^[abc] &^# aN(b)c
474^[abc] &n^# a(b)c
475^[abc] &n^# a(xb)c
476^[abc] &n^# aN(b)c b
477[abc] &# a(d)c
478[abc] &# a(bc)d b
479[abc] &# a(dc)d c
480. &# a()c
481b.*c &# b(bc)c bc
482b.* &# b(bc)c bc
483.*c &# b(bc)c bc
484
485# plain strings, with the NOSPEC flag
486abc m abc abc
487abc m xabcy abc
488abc m xyz
489a*b m aba*b a*b
490a*b m ab
491"" mC EMPTY
492
493# cases involving NULs
494aZb & a a
495aZb &p a
496aZb &p# (aZb) aZb
497aZ*b &p# (ab) ab
498a.b &# (aZb) aZb
499a.* &# (aZb)c aZb
500
501# word boundaries (ick)
502[[:<:]]a & a a
503\<a & a a
504[[:<:]]a & ba
505\<a & ba
506[[:<:]]a & -a a
507\<a & -a a
508[[:<:]]a & Na a
509\<a & Na a
510[[:<:]]a &n a a
511\<a &n a a
512[[:<:]]a &n ba
513\<a &n ba
514[[:<:]]a &n -a a
515\<a &n -a a
516[[:<:]]a &n Na a
517\<a &n Na a
518[[:<:]]a &^ a
519\<a &^ a
520[[:<:]]a &^ ba
521\<a &^ ba
522[[:<:]]a &^ -a a
523\<a &^ -a a
524[[:<:]]a &^ Na a
525\<a &^ Na a
526[[:<:]]a &n^ a
527\<a &n^ a
528[[:<:]]a &n^ ba
529\<a &n^ ba
530[[:<:]]a &n^ -a a
531\<a &n^ -a a
532[[:<:]]a &n^ Na a
533\<a &n^ Na a
534[[:<:]]b &# a(b)c b
535\<b &# a(b)c b
536[[:<:]]b &# a(xb)c
537\<b &# a(xb)c
538[[:<:]]b &# -(b)c b
539\<b &# -(b)c b
540[[:<:]]b &# aN(b)c b
541\<b &# aN(b)c b
542[[:<:]]b &n# a(b)c b
543\<b &n# a(b)c b
544[[:<:]]b &n# a(xb)c
545\<b &n# a(xb)c
546[[:<:]]b &n# -(b)c b
547\<b &n# -(b)c b
548[[:<:]]b &n# aN(b)c b
549\<b &n# aN(b)c b
550[[:<:]]b &^# a(b)c
551\<b &^# a(b)c
552[[:<:]]b &^# a(xb)c
553\<b &^# a(xb)c
554[[:<:]]b &^# -(b)c b
555\<b &^# -(b)c b
556[[:<:]]b &^# aN(b)c b
557\<b &^# aN(b)c b
558[[:<:]]b &n^# a(b)c
559\<b &n^# a(b)c
560[[:<:]]b &n^# a(xb)c
561\<b &n^# a(xb)c
562[[:<:]]b &n^# -(b)c b
563\<b &n^# -(b)c b
564[[:<:]]b &n^# aN(b)c b
565\<b &n^# aN(b)c b
566a[[:>:]] & a a
567a\> & a a
568a[[:>:]] & ab
569a\> & ab
570a[[:>:]] & a- a
571a\> & a- a
572[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc abc
573\<a.c\> & axcd-dayc-dazce-abc abc
574[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc-q abc
575\<a.c\> & axcd-dayc-dazce-abc-q abc
576[[:<:]]a.c[[:>:]] & axc-dayc-dazce-abc axc
577\<a.c\> & axc-dayc-dazce-abc axc
578[[:<:]]b.c[[:>:]] & a_bxc-byc_d-bzc-q bzc
579\<b.c\> & a_bxc-byc_d-bzc-q bzc
580[[:<:]].x..[[:>:]] & y_xa_-_xb_y-_xc_-axdc _xc_
581\<.x..\> & y_xa_-_xb_y-_xc_-axdc _xc_
582[[:<:]]a_b[[:>:]] & x_a_b
583\<a_b\> & x_a_b
584
585# past problems, and suspected problems
586(A[1])|(A[2])|(A[3])|(A[4])|(A[5])|(A[6])|(A[7])|(A[8])|(A[9])|(A[A]) - A1 A1
587abcdefghijklmnop i abcdefghijklmnop abcdefghijklmnop
588abcdefghijklmnopqrstuv i abcdefghijklmnopqrstuv abcdefghijklmnopqrstuv
589(ALAK)|(ALT[AB])|(CC[123]1)|(CM[123]1)|(GAMC)|(LC[23][EO ])|(SEM[1234])|(SL[ES][12])|(SLWW)|(SLF )|(SLDT)|(VWH[12])|(WH[34][EW])|(WP1[ESN]) - CC11 CC11
590CC[13]1|a{21}[23][EO][123][Es][12]a{15}aa[34][EW]aaaaaaa[X]a - CC11 CC11
591Char \([a-z0-9_]*\)\[.* b Char xyz[k Char xyz[k xyz
592a?b - ab ab
593-\{0,1\}[0-9]*$ b -5 -5
594
diff --git a/src/regress/lib/libc/setjmp-fpu/Makefile b/src/regress/lib/libc/setjmp-fpu/Makefile
deleted file mode 100644
index 33d0f7e88a..0000000000
--- a/src/regress/lib/libc/setjmp-fpu/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2013/12/29 05:46:43 martynas Exp $
2
3PROG= setjmp-fpu
4SRCS= _setjmp.c main.c setjmp.c sigsetjmp.c
5
6LDADD= -lm
7
8.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/setjmp-fpu/_setjmp.c b/src/regress/lib/libc/setjmp-fpu/_setjmp.c
deleted file mode 100644
index a2195a5ff8..0000000000
--- a/src/regress/lib/libc/setjmp-fpu/_setjmp.c
+++ /dev/null
@@ -1,7 +0,0 @@
1/* $OpenBSD: _setjmp.c,v 1.3 2015/11/08 18:10:14 miod Exp $ */
2#define SETJMP(env, savemask) _setjmp(env)
3#define LONGJMP(env, val) _longjmp(env, val)
4#define TEST_SETJMP test__setjmp
5#define JMP_BUF jmp_buf
6
7#include "setjmp-fpu.c"
diff --git a/src/regress/lib/libc/setjmp-fpu/main.c b/src/regress/lib/libc/setjmp-fpu/main.c
deleted file mode 100644
index 5050fee855..0000000000
--- a/src/regress/lib/libc/setjmp-fpu/main.c
+++ /dev/null
@@ -1,12 +0,0 @@
1/* $OpenBSD: main.c,v 1.2 2015/01/20 04:41:01 krw Exp $ */
2int test__setjmp(void);
3int test_setjmp(void);
4int test_sigsetjmp(void);
5
6int
7main(int argc, char *argv[])
8{
9 return (test__setjmp()
10 | test_setjmp()
11 | test_sigsetjmp());
12}
diff --git a/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c b/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c
deleted file mode 100644
index 694061dcbb..0000000000
--- a/src/regress/lib/libc/setjmp-fpu/setjmp-fpu.c
+++ /dev/null
@@ -1,46 +0,0 @@
1#include <fenv.h>
2#include <setjmp.h>
3
4int
5TEST_SETJMP(int argc, char *argv[])
6{
7 JMP_BUF env;
8 int rv;
9
10 /* Set up the FPU control word register. */
11 fesetround(FE_UPWARD);
12 fedisableexcept(FE_ALL_EXCEPT);
13 feenableexcept(FE_DIVBYZERO);
14
15 rv = SETJMP(env, 0);
16
17 if (rv == 0) {
18 fexcept_t flag = FE_OVERFLOW;
19
20 /* Mess with the FPU control word. */
21 fesetround(FE_DOWNWARD);
22 fedisableexcept(FE_DIVBYZERO);
23
24 /* Set the FPU exception flags. */
25 fesetexceptflag(&flag, FE_ALL_EXCEPT);
26
27 LONGJMP(env, 1);
28 } else if (rv == 1) {
29 fexcept_t flag = 0;
30
31 /* Verify that the FPU control word is preserved. */
32 if (fegetround() != FE_UPWARD
33 || fegetexcept() != FE_DIVBYZERO)
34 return (1);
35
36 /* Verify that the FPU exception flags weren't clobbered. */
37 fegetexceptflag(&flag, FE_ALL_EXCEPT);
38 if (flag != FE_OVERFLOW)
39 return (1);
40
41 return (0);
42 }
43
44 /* This is not supposed to happen. */
45 return (1);
46}
diff --git a/src/regress/lib/libc/setjmp-fpu/setjmp.c b/src/regress/lib/libc/setjmp-fpu/setjmp.c
deleted file mode 100644
index 48d72056d0..0000000000
--- a/src/regress/lib/libc/setjmp-fpu/setjmp.c
+++ /dev/null
@@ -1,7 +0,0 @@
1/* $OpenBSD: setjmp.c,v 1.3 2015/11/08 18:10:14 miod Exp $ */
2#define SETJMP(env, savemask) setjmp(env)
3#define LONGJMP(env, val) longjmp(env, val)
4#define TEST_SETJMP test_setjmp
5#define JMP_BUF jmp_buf
6
7#include "setjmp-fpu.c"
diff --git a/src/regress/lib/libc/setjmp-fpu/sigsetjmp.c b/src/regress/lib/libc/setjmp-fpu/sigsetjmp.c
deleted file mode 100644
index 158fd83296..0000000000
--- a/src/regress/lib/libc/setjmp-fpu/sigsetjmp.c
+++ /dev/null
@@ -1,7 +0,0 @@
1/* $OpenBSD: sigsetjmp.c,v 1.3 2015/11/08 18:10:14 miod Exp $ */
2#define SETJMP(env, savemask) sigsetjmp(env, savemask)
3#define LONGJMP(env, val) siglongjmp(env, val)
4#define TEST_SETJMP test_sigsetjmp
5#define JMP_BUF sigjmp_buf
6
7#include "setjmp-fpu.c"
diff --git a/src/regress/lib/libc/setjmp-signal/Makefile b/src/regress/lib/libc/setjmp-signal/Makefile
deleted file mode 100644
index a9649a8abe..0000000000
--- a/src/regress/lib/libc/setjmp-signal/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2002/07/31 05:18:24 art Exp $
2
3PROG= setjmp-signal
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/setjmp-signal/setjmp-signal.c b/src/regress/lib/libc/setjmp-signal/setjmp-signal.c
deleted file mode 100644
index b50f6b27c5..0000000000
--- a/src/regress/lib/libc/setjmp-signal/setjmp-signal.c
+++ /dev/null
@@ -1,26 +0,0 @@
1/* $OpenBSD: setjmp-signal.c,v 1.4 2017/07/27 12:31:09 bluhm Exp $ */
2/*
3 * Written by Artur Grabowski <art@openbsd.org> 2002 Public Domain.
4 */
5
6#include <setjmp.h>
7#include <signal.h>
8
9jmp_buf jb;
10
11void
12segv_handler(int signum)
13{
14 longjmp(jb, 1);
15}
16
17int
18main()
19{
20 signal(SIGSEGV, segv_handler);
21 if (setjmp(jb) == 0) {
22 *((volatile int *)0L) = 0;
23 return (1);
24 }
25 return (0);
26}
diff --git a/src/regress/lib/libc/setjmp/Makefile b/src/regress/lib/libc/setjmp/Makefile
deleted file mode 100644
index fc68e8d44c..0000000000
--- a/src/regress/lib/libc/setjmp/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
1# $OpenBSD: Makefile,v 1.3 2002/01/01 23:00:51 art Exp $
2# $NetBSD: Makefile,v 1.2 1995/04/20 22:40:13 cgd Exp $
3
4PROG= setjmptest
5SRCS= jmptest.c
6
7CFLAGS+= -DTEST_SETJMP
8
9.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/setjmp/jmptest.c b/src/regress/lib/libc/setjmp/jmptest.c
deleted file mode 100644
index 9512c9ee34..0000000000
--- a/src/regress/lib/libc/setjmp/jmptest.c
+++ /dev/null
@@ -1,136 +0,0 @@
1/* $OpenBSD: jmptest.c,v 1.7 2003/09/02 23:52:16 david Exp $ */
2/* $NetBSD: jmptest.c,v 1.2 1995/01/01 20:55:35 jtc Exp $ */
3
4/*
5 * Copyright (c) 1994 Christopher G. Demetriou
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Christopher G. Demetriou
19 * for the NetBSD Project.
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#include <sys/types.h>
36#include <err.h>
37#include <setjmp.h>
38#include <signal.h>
39#include <stdio.h>
40#include <stdlib.h>
41#include <string.h>
42#include <unistd.h>
43
44#if (TEST_SETJMP + TEST_U_SETJMP + TEST_SIGSETJMP) != 1
45#error one of TEST_SETJMP, TEST_U_SETJMP, or TEST_SIGSETJMP must be defined
46#endif
47
48#ifdef TEST_SETJMP
49#define BUF jmp_buf
50#define SET(b, m) setjmp(b)
51#define JMP(b, v) longjmp(b, v)
52#endif
53
54#ifdef TEST_U_SETJMP
55#define BUF jmp_buf
56#define SET(b, m) _setjmp(b)
57#define JMP(b, v) _longjmp(b, v)
58#endif
59
60#ifdef TEST_SIGSETJMP
61#define BUF sigjmp_buf
62#define SET(b, m) sigsetjmp(b, m)
63#define JMP(b, v) siglongjmp(b, v)
64#endif
65
66int expectsignal;
67
68static void
69aborthandler(int signo)
70{
71
72 if (expectsignal)
73 _exit(0);
74 else {
75 warnx("kill(SIGABRT) succeeded");
76 _exit(1);
77 }
78}
79
80int
81main(int argc, char *argv[])
82{
83 struct sigaction sa;
84 BUF jb;
85 sigset_t ss;
86 int i, x;
87
88 i = getpid();
89
90#ifdef TEST_SETJMP
91 expectsignal = 0;
92#endif
93#ifdef TEST_U_SETJMP
94 expectsignal = 1;
95#endif
96#ifdef TEST_SIGSETJMP
97 if (argc != 2 ||
98 (strcmp(argv[1], "save") && strcmp(argv[1], "nosave"))) {
99 fprintf(stderr, "usage: %s [save|nosave]\n", argv[0]);
100 exit(1);
101 }
102 expectsignal = (strcmp(argv[1], "save") != 0);
103#endif
104
105 sa.sa_handler = aborthandler;
106 sigemptyset(&sa.sa_mask);
107 sa.sa_flags = 0;
108 if (sigaction(SIGABRT, &sa, NULL) == -1)
109 err(1, "sigaction failed");
110
111 if (sigemptyset(&ss) == -1)
112 err(1, "sigemptyset failed");
113 if (sigaddset(&ss, SIGABRT) == -1)
114 err(1, "sigaddset failed");
115 if (sigprocmask(SIG_BLOCK, &ss, NULL) == -1)
116 err(1, "sigprocmask (1) failed");
117
118 x = SET(jb, !expectsignal);
119 if (x != 0) {
120 if (x != i)
121 errx(1, "setjmp returned wrong value");
122
123 kill(i, SIGABRT);
124 if (expectsignal)
125 errx(1, "kill(SIGABRT) failed");
126 else
127 exit(0);
128 }
129
130 if (sigprocmask(SIG_UNBLOCK, &ss, NULL) == -1)
131 err(1, "sigprocmask (2) failed");
132
133 JMP(jb, i);
134
135 errx(1, "jmp failed");
136}
diff --git a/src/regress/lib/libc/sigsetjmp/Makefile b/src/regress/lib/libc/sigsetjmp/Makefile
deleted file mode 100644
index f88bea3b47..0000000000
--- a/src/regress/lib/libc/sigsetjmp/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
1# $OpenBSD: Makefile,v 1.5 2002/09/02 20:01:43 avsm Exp $
2
3PROG= sigsetjmptest
4SRCS= jmptest.c
5
6CFLAGS+= -DTEST_SIGSETJMP
7
8.PATH: ${.CURDIR}/../setjmp
9
10REGRESS_TARGETS=sigsetjmp-save sigsetjmp-nosave
11
12sigsetjmp-save: ${PROG}
13 ./${PROG} save
14sigsetjmp-nosave: ${PROG}
15 ./${PROG} nosave
16
17.PHONY: ${REGRESS_TARGETS}
18
19.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/sigthr/Makefile b/src/regress/lib/libc/sigthr/Makefile
deleted file mode 100644
index 8ae4643e1e..0000000000
--- a/src/regress/lib/libc/sigthr/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2015/10/22 05:30:18 guenther Exp $
2
3PROG=sigthr_test
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/sigthr/sigthr_test.c b/src/regress/lib/libc/sigthr/sigthr_test.c
deleted file mode 100644
index c2eaa1f779..0000000000
--- a/src/regress/lib/libc/sigthr/sigthr_test.c
+++ /dev/null
@@ -1,66 +0,0 @@
1/*
2 * Copyright (c) 2015 Philip Guenther <guenther@openbsd.org>
3 *
4 * Public domain.
5 *
6 * Verify that SIGTHR can't be blocked or caught by applications.
7 */
8
9#include <err.h>
10#include <errno.h>
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14#include <signal.h>
15
16void sighandler(int sig) { }
17
18int
19main(void)
20{
21 struct sigaction sa;
22 sigset_t set, oset;
23
24 /*
25 * check sigprocmask
26 */
27 if (sigprocmask(SIG_BLOCK, NULL, &set))
28 err(1, "sigprocmask");
29 if (sigismember(&set, SIGTHR))
30 errx(1, "SIGTHR already blocked");
31 sigaddset(&set, SIGTHR);
32 if (sigprocmask(SIG_BLOCK, &set, NULL))
33 err(1, "sigprocmask");
34 if (sigprocmask(SIG_SETMASK, &set, &oset))
35 err(1, "sigprocmask");
36 if (sigismember(&oset, SIGTHR))
37 errx(1, "SIGTHR blocked with SIG_BLOCK");
38 if (sigprocmask(SIG_BLOCK, NULL, &oset))
39 err(1, "sigprocmask");
40 if (sigismember(&oset, SIGTHR))
41 errx(1, "SIGTHR blocked with SIG_SETMASK");
42
43 /*
44 * check sigaction
45 */
46 if (sigaction(SIGTHR, NULL, &sa) == 0)
47 errx(1, "sigaction(SIGTHR) succeeded");
48 else if (errno != EINVAL)
49 err(1, "sigaction(SIGTHR) didn't fail with EINVAL");
50 memset(&sa, 0, sizeof sa);
51 sa.sa_handler = sighandler;
52 sigfillset(&sa.sa_mask);
53 sa.sa_flags = 0;
54 if (sigaction(SIGTHR, &sa, NULL) == 0)
55 errx(1, "sigaction(SIGTHR) succeeded");
56 else if (errno != EINVAL)
57 err(1, "sigaction(SIGTHR) didn't fail with EINVAL");
58 if (sigaction(SIGUSR1, &sa, NULL))
59 err(1, "sigaction(SIGUSR1)");
60 if (sigaction(SIGUSR1, NULL, &sa))
61 err(1, "sigaction(SIGUSR1)");
62 if (sigismember(&sa.sa_mask, SIGTHR))
63 errx(1, "SIGTHR blocked with sigaction");
64
65 return 0;
66}
diff --git a/src/regress/lib/libc/sleep/Makefile b/src/regress/lib/libc/sleep/Makefile
deleted file mode 100644
index 3700b1662a..0000000000
--- a/src/regress/lib/libc/sleep/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2009/12/14 05:08:19 guenther Exp $
2
3NOMAN=
4PROG=sleep_test
5CPPFLAGS+=-I${.CURDIR}/../../../../lib/libc
6
7run-regress-${PROG}: ${PROG}
8 [ x$$(./${PROG} 1) = x0 ] || exit 1
9 file=$$(mktemp -t sleep.XXXXXXXXXX); ./${PROG} 4 >$$file & pid=$$!; \
10 sleep 1; kill $$pid; sleep 1; v=$$(cat $$file); rm -f $$file; \
11 { [ $$v -gt 0 ] && [ $$v -lt 4 ] ; } || exit 2
12
13.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/sleep/sleep_test.c b/src/regress/lib/libc/sleep/sleep_test.c
deleted file mode 100644
index 4c7764375d..0000000000
--- a/src/regress/lib/libc/sleep/sleep_test.c
+++ /dev/null
@@ -1,85 +0,0 @@
1/* $OpenBSD: sleep_test.c,v 1.2 2015/10/18 23:27:43 guenther Exp $ */
2
3/*
4 * Copyright (c) 2009 Philip Guenther
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/*
33 * Test whether sleep returns the correct value
34 */
35
36#include <sys/types.h>
37#include <err.h>
38#include <errno.h>
39#include <limits.h>
40#include <signal.h>
41#include <stddef.h>
42#include <stdio.h>
43#include <stdlib.h>
44#include <string.h>
45#include <unistd.h>
46
47static void
48handler(int sig)
49{
50 return;
51}
52
53static void *
54garbage(void)
55{
56 char buf[20];
57 strlcpy(buf, "012354678901235467890123546789", sizeof buf);
58 return buf;
59}
60
61int
62main(int argc, char *argv[])
63{
64 struct sigaction sa;
65 char const *errstr;
66 int i;
67
68 if (argc != 2)
69 return (1);
70 errno = 0;
71 i = strtonum(argv[1], 0, INT_MAX, &errstr);
72 if (i == 0 && errno != 0) {
73 fprintf(stderr, "%s\n", errstr);
74 return (1);
75 }
76
77 memset(&sa, 0, sizeof sa);
78 sa.sa_handler = &handler;
79 if (sigaction(SIGTERM, &sa, NULL))
80 err(3, "sigaction");
81 garbage();
82 printf("%d\n", sleep(i));
83 return (0);
84}
85
diff --git a/src/regress/lib/libc/sprintf/Makefile b/src/regress/lib/libc/sprintf/Makefile
deleted file mode 100644
index 514d795f2f..0000000000
--- a/src/regress/lib/libc/sprintf/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2017/07/27 15:08:37 bluhm Exp $
2
3PROG = sprintf_test
4CFLAGS = -Wno-format
5CPPFLAGS = -I${.CURDIR}/../../../../lib/libc
6
7.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/sprintf/sprintf_test.c b/src/regress/lib/libc/sprintf/sprintf_test.c
deleted file mode 100644
index 61c58f2f09..0000000000
--- a/src/regress/lib/libc/sprintf/sprintf_test.c
+++ /dev/null
@@ -1,102 +0,0 @@
1/* $OpenBSD: sprintf_test.c,v 1.4 2004/09/18 19:31:32 otto Exp $ */
2
3/*
4 * Copyright (c) 2003 Theo de Raadt
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <stddef.h>
33#include <stdio.h>
34#include <stdlib.h>
35#include <string.h>
36#include <signal.h>
37
38char correct[] =
39 "|xx 01 02 03 04\n"
40 "|xx 05 06 07 08\n"
41 "|xx 09 10 11 12\n"
42 "|xx 13 14 15 16\n"
43 "|xx 17 18 19 20\n"
44 "|xx 21 22 23 24\n"
45 "|xx 25 26 27 28\n"
46 "|xx 29 30 31 32\n"
47 "|xx 33 34 35 36\n"
48 "|xx 37 38 39 40\n"
49 "|xx 41 42 43 44\n"
50 "|xx 45 -1 1 -1 1\n";
51
52char correct2[] =
53 "1 0 -1 1 1 2 1 3 -1 4 1 \n"
54 "1 -1 1 1 -1 1 \n";
55
56int
57main(int argc, char *argv[])
58{
59 char buf[1024];
60 size_t sz1, sz2, sz3, sz4;
61 ptrdiff_t p1, p2, p3, p4;
62
63 /* Test positional arguments */
64 snprintf(buf, sizeof buf,
65 "|xx %1$s %2$s %3$s %4$s\n"
66 "|xx %5$s %6$s %7$s %8$s\n"
67 "|xx %9$s %10$s %11$s %12$s\n"
68 "|xx %13$s %14$s %15$s %16$s\n"
69 "|xx %17$s %18$s %19$s %20$s\n"
70 "|xx %21$s %22$s %23$s %24$s\n"
71 "|xx %25$s %26$s %27$s %28$s\n"
72 "|xx %29$s %30$s %31$s %32$s\n"
73 "|xx %33$s %34$s %35$s %36$s\n"
74 "|xx %37$s %38$s %39$s %40$s\n"
75 "|xx %41$s %42$s %43$s %44$s\n"
76 "|xx %45$d %46$ld %47$lld %48$d %49$lld\n",
77 "01", "02", "03", "04", "05", "06",
78 "07", "08", "09", "10", "11", "12",
79 "13", "14", "15", "16", "17", "18",
80 "19", "20", "21", "22", "23", "24",
81 "25", "26", "27", "28", "29", "30",
82 "31", "32", "33", "34", "35", "36",
83 "37", "38", "39", "40", "41", "42",
84 "43", "44", 45, -1L, 1LL, -1, 1LL
85 );
86
87 if (strcmp(buf, correct) != 0)
88 exit(1);
89
90 sz1 = (size_t)1;
91 sz2 = (size_t)-1;
92 p1 = (ptrdiff_t)1;
93 p2 = (ptrdiff_t)-1;
94 snprintf(buf, sizeof buf,
95 "%zx %d %zd %d %zu %d %tx %d %td %d %tu %zn %tn\n"
96 "%1$zx %3$zd %5$zu %7$tx %9$td %11$tu %14$zn %15$tn\n",
97 sz1, 0, sz2, 1, sz1, 2, p1, 3, p2, 4, p1, &sz3, &p3, &sz4, &p4);
98 if (strcmp(buf, correct2) != 0 || sz3 != 24 || p3 != 25 ||
99 sz4 != 40 || p4 != 41)
100 exit(1);
101 exit(0);
102}
diff --git a/src/regress/lib/libc/stdio_threading/Makefile b/src/regress/lib/libc/stdio_threading/Makefile
deleted file mode 100644
index e42481afc2..0000000000
--- a/src/regress/lib/libc/stdio_threading/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
1SUBDIR += fopen fread fwrite fgetln fgets fputs
2
3.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/stdio_threading/fgetln/Makefile b/src/regress/lib/libc/stdio_threading/fgetln/Makefile
deleted file mode 100644
index cad51e2b23..0000000000
--- a/src/regress/lib/libc/stdio_threading/fgetln/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
1TOPDIR=${.CURDIR}
2PROG=fgetln_test
3CFLAGS+=-I${TOPDIR}/../include/
4LDFLAGS+=-lpthread
5
6.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/stdio_threading/fgetln/fgetln_test.c b/src/regress/lib/libc/stdio_threading/fgetln/fgetln_test.c
deleted file mode 100755
index 76d154bb2a..0000000000
--- a/src/regress/lib/libc/stdio_threading/fgetln/fgetln_test.c
+++ /dev/null
@@ -1,70 +0,0 @@
1/*
2 * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include "local.h"
18
19void
20fgetln_thread(void *v)
21{
22 FILE *file = v;
23 size_t len;
24 char *buf;
25 int i;
26
27 for (i = 0; i < 4096; i++) {
28 if ((buf = fgetln(file, &len)) == NULL) {
29
30 if (feof(file))
31 break;
32
33 printf("OMG!!!\n");
34 fflush(stdout);
35 break;
36 }
37 if (strncmp(buf, TEXT_N, sizeof(TEXT_N)))
38 err(1, "fgetln not atomic!!!");
39 }
40}
41
42int
43main(void)
44{
45 char sfn[24];
46 FILE *sfp;
47 int fd, i;
48
49 strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
50 if ((fd = mkstemp(sfn)) == -1 ||
51 (sfp = fdopen(fd, "w+")) == NULL) {
52 int saved_errno = errno;
53 if (fd != -1) {
54 unlink(sfn);
55 close(fd);
56 }
57 errc(1, saved_errno, "could not open temporary file");
58 }
59
60 for (i = 0; i < 4096 * THREAD_COUNT; i++)
61 if (fwrite(TEXT_N, sizeof(char), strlen(TEXT_N), sfp) == 0)
62 err(1, "Could not populate test file");
63
64 run_threads(fgetln_thread, sfp);
65
66 unlink(sfn);
67 close(fd);
68
69 exit(0);
70}
diff --git a/src/regress/lib/libc/stdio_threading/fgets/Makefile b/src/regress/lib/libc/stdio_threading/fgets/Makefile
deleted file mode 100644
index 52310fd429..0000000000
--- a/src/regress/lib/libc/stdio_threading/fgets/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
1TOPDIR=${.CURDIR}
2PROG=fgets_test
3CFLAGS+=-I${TOPDIR}/../include/
4LDFLAGS+=-lpthread
5
6.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/stdio_threading/fgets/fgets_test.c b/src/regress/lib/libc/stdio_threading/fgets/fgets_test.c
deleted file mode 100755
index 7c5008e2ad..0000000000
--- a/src/regress/lib/libc/stdio_threading/fgets/fgets_test.c
+++ /dev/null
@@ -1,69 +0,0 @@
1/*
2 * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include "local.h"
18
19void
20fgets_thread(void *v)
21{
22 char buf[sizeof(TEXT_N) + 1];
23 FILE *file = v;
24 int i;
25
26 for (i = 0; i < 4096; i++) {
27 if (fgets(buf, sizeof(buf), file) == NULL) {
28
29 if (feof(file))
30 break;
31
32 printf("OMG!!!\n");
33 fflush(stdout);
34 break;
35 }
36 if (strncmp(buf, TEXT, sizeof(TEXT)))
37 err(1, "Read not atomic!!!");
38 }
39}
40
41int
42main(void)
43{
44 char sfn[24];
45 FILE *sfp;
46 int fd, i;
47
48 strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
49 if ((fd = mkstemp(sfn)) == -1 ||
50 (sfp = fdopen(fd, "w+")) == NULL) {
51 int saved_errno = errno;
52 if (fd != -1) {
53 unlink(sfn);
54 close(fd);
55 }
56 errc(1, saved_errno, "could not open temporary file");
57 }
58
59 for (i = 0; i < 4096 * THREAD_COUNT; i++)
60 if (fwrite(TEXT_N, sizeof(char), strlen(TEXT_N), sfp) == 0)
61 err(1, "Could not populate test file");
62
63 run_threads(fgets_thread, sfp);
64
65 unlink(sfn);
66 close(fd);
67
68 exit(0);
69}
diff --git a/src/regress/lib/libc/stdio_threading/fopen/Makefile b/src/regress/lib/libc/stdio_threading/fopen/Makefile
deleted file mode 100644
index e51deeff1d..0000000000
--- a/src/regress/lib/libc/stdio_threading/fopen/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
1TOPDIR=${.CURDIR}
2PROG=fopen_test
3CFLAGS+=-I${TOPDIR}/../include/
4LDFLAGS+=-lpthread
5
6.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/stdio_threading/fopen/fopen_test.c b/src/regress/lib/libc/stdio_threading/fopen/fopen_test.c
deleted file mode 100755
index 89172d9fb7..0000000000
--- a/src/regress/lib/libc/stdio_threading/fopen/fopen_test.c
+++ /dev/null
@@ -1,49 +0,0 @@
1/* $OpenBSD: fopen_test.c,v 1.2 2015/01/20 04:41:01 krw Exp $ */
2/*
3 * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <stdio.h>
19#include <pthread.h>
20#include "local.h"
21
22int
23writefn(void *cookie, const char *buf, int size)
24{
25 return 0;
26}
27
28void
29fopen_thread(void *v)
30{
31 FILE *file;
32 int i;
33
34 for (i = 0; i < 4096; i++) {
35 file = fwopen(&i, writefn);
36 if (file != NULL) {
37 fputc('0', file);
38 pthread_yield();
39 fclose(file);
40 }
41 }
42}
43
44int
45main(void)
46{
47 run_threads(fopen_thread, NULL);
48 exit(0);
49}
diff --git a/src/regress/lib/libc/stdio_threading/fputs/Makefile b/src/regress/lib/libc/stdio_threading/fputs/Makefile
deleted file mode 100644
index e561745581..0000000000
--- a/src/regress/lib/libc/stdio_threading/fputs/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
1TOPDIR=${.CURDIR}
2PROG=fputs_test
3CFLAGS+=-I${TOPDIR}/../include/
4LDFLAGS+=-lpthread
5
6.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/stdio_threading/fputs/fputs_test.c b/src/regress/lib/libc/stdio_threading/fputs/fputs_test.c
deleted file mode 100755
index 93d0f0b6c7..0000000000
--- a/src/regress/lib/libc/stdio_threading/fputs/fputs_test.c
+++ /dev/null
@@ -1,67 +0,0 @@
1/*
2 * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include "local.h"
18
19void
20fputs_thread(void *v)
21{
22 FILE *file = v;
23 int i;
24
25 for (i = 0; i < 4096; i++) {
26 if (fputs(TEXT, file) != 0) {
27
28 if (feof(file))
29 break;
30
31 printf("OMG!!!\n");
32 fflush(stdout);
33 break;
34 }
35 }
36}
37
38int
39main(void)
40{
41 char sfn[24];
42 char buf[sizeof(TEXT)];
43 FILE *sfp;
44 int fd;
45
46 strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
47 if ((fd = mkstemp(sfn)) == -1 ||
48 (sfp = fdopen(fd, "w+")) == NULL) {
49 int saved_errno = errno;
50 if (fd != -1) {
51 unlink(sfn);
52 close(fd);
53 }
54 errc(1, saved_errno, "could not open temporary file");
55 }
56
57 run_threads(fputs_thread, sfp);
58
59 while (fgets(buf, sizeof(buf), sfp) != NULL) /* verify */
60 if (strcmp(buf, TEXT))
61 err(1, "Thread writes were not atomic!!!");
62
63 unlink(sfn);
64 close(fd);
65
66 exit(0);
67}
diff --git a/src/regress/lib/libc/stdio_threading/fread/Makefile b/src/regress/lib/libc/stdio_threading/fread/Makefile
deleted file mode 100644
index 25196dd7ab..0000000000
--- a/src/regress/lib/libc/stdio_threading/fread/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
1TOPDIR=${.CURDIR}
2PROG=fread_test
3CFLAGS+=-I${TOPDIR}/../include/
4LDFLAGS+=-lpthread
5
6.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/stdio_threading/fread/fread_test.c b/src/regress/lib/libc/stdio_threading/fread/fread_test.c
deleted file mode 100755
index 6bd734b470..0000000000
--- a/src/regress/lib/libc/stdio_threading/fread/fread_test.c
+++ /dev/null
@@ -1,71 +0,0 @@
1/*
2 * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <stdio.h>
18#include <pthread.h>
19#include "local.h"
20
21void
22fread_thread(void *v)
23{
24 char buf[sizeof(TEXT)];
25 FILE *file = v;
26 int i;
27
28 for (i = 0; i < 4096; i++) {
29 if (fread(buf, sizeof(char), strlen(TEXT), file) == 0) {
30
31 if (feof(file))
32 break;
33
34 printf("OMG!!!\n");
35 fflush(stdout);
36 break;
37 }
38 if (strncmp(buf, TEXT, sizeof(TEXT)))
39 err(1, "Read not atomic!!!");
40 }
41}
42
43int
44main(void)
45{
46 char sfn[24];
47 FILE *sfp;
48 int fd, i;
49
50 strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
51 if ((fd = mkstemp(sfn)) == -1 ||
52 (sfp = fdopen(fd, "w+")) == NULL) {
53 int saved_errno = errno;
54 if (fd != -1) {
55 unlink(sfn);
56 close(fd);
57 }
58 errc(1, saved_errno, "could not open temporary file");
59 }
60
61 for (i = 0; i < 4096 * THREAD_COUNT; i++)
62 if (fwrite(TEXT, sizeof(char), strlen(TEXT), sfp) == 0)
63 err(1, "Could not populate test file");
64
65 run_threads(fread_thread, sfp);
66
67 unlink(sfn);
68 close(fd);
69
70 exit(0);
71}
diff --git a/src/regress/lib/libc/stdio_threading/fwrite/Makefile b/src/regress/lib/libc/stdio_threading/fwrite/Makefile
deleted file mode 100644
index e79899c475..0000000000
--- a/src/regress/lib/libc/stdio_threading/fwrite/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
1TOPDIR=${.CURDIR}
2PROG=fwrite_test
3CFLAGS+=-I${TOPDIR}/../include/
4LDFLAGS+=-lpthread
5
6.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/stdio_threading/fwrite/fwrite_test.c b/src/regress/lib/libc/stdio_threading/fwrite/fwrite_test.c
deleted file mode 100755
index 86c450cbc9..0000000000
--- a/src/regress/lib/libc/stdio_threading/fwrite/fwrite_test.c
+++ /dev/null
@@ -1,67 +0,0 @@
1/*
2 * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include "local.h"
18
19void
20fwrite_thread(void *v)
21{
22 FILE *file = v;
23 int i;
24
25 for (i = 0; i < 4096; i++) {
26 if (fwrite(TEXT, sizeof(char), strlen(TEXT), file) == 0) {
27
28 if (feof(file))
29 break;
30
31 printf("OMG!!!\n");
32 fflush(stdout);
33 break;
34 }
35 }
36}
37
38int
39main(void)
40{
41 char sfn[24];
42 char buf[sizeof(TEXT)];
43 FILE *sfp;
44 int fd;
45
46 strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn));
47 if ((fd = mkstemp(sfn)) == -1 ||
48 (sfp = fdopen(fd, "w+")) == NULL) {
49 int saved_errno = errno;
50 if (fd != -1) {
51 unlink(sfn);
52 close(fd);
53 }
54 errc(1, saved_errno, "could not open temporary file");
55 }
56
57 run_threads(fwrite_thread, sfp);
58
59 while (fread(buf, sizeof(char), strlen(TEXT), sfp)) /* verify */
60 if (strncmp(buf, TEXT, sizeof(TEXT)))
61 err(1, "Thread writes were not atomic!!!");
62
63 unlink(sfn);
64 close(fd);
65
66 exit(0);
67}
diff --git a/src/regress/lib/libc/stdio_threading/include/local.h b/src/regress/lib/libc/stdio_threading/include/local.h
deleted file mode 100644
index 7a7822a452..0000000000
--- a/src/regress/lib/libc/stdio_threading/include/local.h
+++ /dev/null
@@ -1,83 +0,0 @@
1/*
2 * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <err.h>
18#include <errno.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22#include <unistd.h>
23#include <pthread.h>
24
25#define THREAD_COUNT 64
26
27#define TEXT "barnacles"
28#define TEXT_N "barnacles\n"
29
30void run_threads(void (*)(void *), void *);
31
32static pthread_rwlock_t start;
33static void (*real_func)(void *);
34
35static void *
36thread(void *arg)
37{
38 int r;
39
40 if ((r = pthread_rwlock_rdlock(&start)))
41 errc(1, r, "could not obtain lock in thread");
42 real_func(arg);
43 if ((r = pthread_rwlock_unlock(&start)))
44 errc(1, r, "could not release lock in thread");
45 return NULL;
46}
47
48void
49run_threads(void (*func)(void *), void *arg)
50{
51 pthread_t self, pthread[THREAD_COUNT];
52 int i, r;
53
54 self = pthread_self();
55 real_func = func;
56 if ((r = pthread_rwlock_init(&start, NULL)))
57 errc(1, r, "could not initialize lock");
58
59 if ((r = pthread_rwlock_wrlock(&start))) /* block */
60 errc(1, r, "could not lock lock");
61
62 for (i = 0; i < THREAD_COUNT; i++)
63 if ((r = pthread_create(&pthread[i], NULL, thread, arg))) {
64 warnc(r, "could not create thread");
65 pthread[i] = self;
66 }
67
68
69 if ((r = pthread_rwlock_unlock(&start))) /* unleash */
70 errc(1, r, "could not release lock");
71
72 sleep(1);
73
74 if ((r = pthread_rwlock_wrlock(&start))) /* sync */
75 errx(1, "parent could not sync with children: %s",
76 strerror(r));
77
78 for (i = 0; i < THREAD_COUNT; i++)
79 if (! pthread_equal(pthread[i], self) &&
80 (r = pthread_join(pthread[i], NULL)))
81 warnc(r, "could not join thread");
82}
83
diff --git a/src/regress/lib/libc/stpncpy/Makefile b/src/regress/lib/libc/stpncpy/Makefile
deleted file mode 100644
index 9333934da6..0000000000
--- a/src/regress/lib/libc/stpncpy/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
1PROG=stpncpy_test
2
3.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/stpncpy/stpncpy_test.c b/src/regress/lib/libc/stpncpy/stpncpy_test.c
deleted file mode 100644
index 63b7d25e53..0000000000
--- a/src/regress/lib/libc/stpncpy/stpncpy_test.c
+++ /dev/null
@@ -1,24 +0,0 @@
1/* $OpenBSD: stpncpy_test.c,v 1.1 2012/07/11 10:46:23 naddy Exp $ */
2
3/*
4 * Public domain, 2012, Christian Weisgerber <naddy@openbsd.org>
5 */
6
7#include <string.h>
8
9int main(void)
10{
11 char dst[8];
12 char *src = "abcdef";
13
14 if (stpncpy(dst, src, 5) != dst + 5)
15 return 1;
16 if (stpncpy(dst, src, 6) != dst + 6)
17 return 1;
18 if (stpncpy(dst, src, 7) != dst + 6)
19 return 1;
20 if (stpncpy(dst, src, 8) != dst + 6)
21 return 1;
22
23 return 0;
24}
diff --git a/src/regress/lib/libc/strerror/Makefile b/src/regress/lib/libc/strerror/Makefile
deleted file mode 100644
index 448b6da903..0000000000
--- a/src/regress/lib/libc/strerror/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2004/04/30 17:15:12 espie Exp $
2
3NOMAN=
4PROG=strerror_test
5CPPFLAGS+=-I${.CURDIR}/../../../../lib/libc
6CLEANFILES+= invalid.out valid.out
7
8run-regress-strerror_test: ${PROG}
9 ./${PROG} >${.OBJDIR}/valid.out
10 cmp -s ${.OBJDIR}/valid.out ${.CURDIR}/valid.ok
11
12.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strerror/strerror_test.c b/src/regress/lib/libc/strerror/strerror_test.c
deleted file mode 100644
index 23b542f1ee..0000000000
--- a/src/regress/lib/libc/strerror/strerror_test.c
+++ /dev/null
@@ -1,65 +0,0 @@
1/* $OpenBSD: strerror_test.c,v 1.5 2015/09/14 06:31:25 guenther Exp $ */
2/*
3 * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17#include <signal.h>
18#include <string.h>
19#include <stdio.h>
20#include <limits.h>
21#include <errno.h>
22
23void
24check_strerror_r(int val)
25{
26 char buffer[NL_TEXTMAX + 1];
27 int i, r;
28
29 memset(buffer, 'X', sizeof(buffer) - 1);
30 buffer[sizeof(buffer) - 1] = '\0';
31 (void)strerror_r(val, NULL, 0); /* XXX */
32 for (i = 0; i < 25; i++) {
33 r = strerror_r(val, buffer, i);
34 printf("%d %d %zu: %s\n", i, r, strlen(buffer), buffer);
35 }
36}
37
38void
39check_strsignal(int val)
40{
41 printf("%s\n", strsignal(val));
42}
43
44int
45main()
46{
47 printf("%s\n", strerror(21345));
48 printf("%s\n", strerror(-21345));
49 printf("%s\n", strerror(0));
50 printf("%s\n", strerror(INT_MAX));
51 printf("%s\n", strerror(INT_MIN));
52 printf("%s\n", strerror(EPERM));
53 check_strerror_r(EPERM);
54 check_strerror_r(21345);
55 check_strsignal(-1);
56 check_strsignal(0);
57 check_strsignal(10);
58 check_strsignal(NSIG-1);
59 check_strsignal(NSIG);
60 check_strsignal(100);
61 check_strsignal(INT_MAX);
62 check_strsignal(INT_MIN);
63 check_strsignal(UINT_MAX);
64 return 0;
65}
diff --git a/src/regress/lib/libc/strerror/valid.ok b/src/regress/lib/libc/strerror/valid.ok
deleted file mode 100644
index cbc365c598..0000000000
--- a/src/regress/lib/libc/strerror/valid.ok
+++ /dev/null
@@ -1,65 +0,0 @@
1Unknown error: 21345
2Unknown error: -21345
3Undefined error: 0
4Unknown error: 2147483647
5Unknown error: -2147483648
6Operation not permitted
70 34 255: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
81 34 0:
92 34 1: O
103 34 2: Op
114 34 3: Ope
125 34 4: Oper
136 34 5: Opera
147 34 6: Operat
158 34 7: Operati
169 34 8: Operatio
1710 34 9: Operation
1811 34 10: Operation
1912 34 11: Operation n
2013 34 12: Operation no
2114 34 13: Operation not
2215 34 14: Operation not
2316 34 15: Operation not p
2417 34 16: Operation not pe
2518 34 17: Operation not per
2619 34 18: Operation not perm
2720 34 19: Operation not permi
2821 34 20: Operation not permit
2922 34 21: Operation not permitt
3023 34 22: Operation not permitte
3124 0 23: Operation not permitted
320 34 255: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
331 34 0:
342 34 1: U
353 34 2: Un
364 34 3: Unk
375 34 4: Unkn
386 34 5: Unkno
397 34 6: Unknow
408 34 7: Unknown
419 34 8: Unknown
4210 34 9: Unknown e
4311 34 10: Unknown er
4412 34 11: Unknown err
4513 34 12: Unknown erro
4614 34 13: Unknown error
4715 34 14: Unknown error:
4816 34 15: Unknown error:
4917 34 15: Unknown error:
5018 34 15: Unknown error:
5119 34 15: Unknown error:
5220 34 15: Unknown error:
5321 22 20: Unknown error: 21345
5422 22 20: Unknown error: 21345
5523 22 20: Unknown error: 21345
5624 22 20: Unknown error: 21345
57Unknown signal: 4294967295
58Signal 0
59Bus error
60Thread AST
61Unknown signal: 33
62Unknown signal: 100
63Unknown signal: 2147483647
64Unknown signal: 2147483648
65Unknown signal: 4294967295
diff --git a/src/regress/lib/libc/strlcat/Makefile b/src/regress/lib/libc/strlcat/Makefile
deleted file mode 100644
index 858cb22696..0000000000
--- a/src/regress/lib/libc/strlcat/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2014/12/02 17:48:34 millert Exp $
2
3PROG= strlcattest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strlcat/strlcattest.c b/src/regress/lib/libc/strlcat/strlcattest.c
deleted file mode 100644
index 86896ff987..0000000000
--- a/src/regress/lib/libc/strlcat/strlcattest.c
+++ /dev/null
@@ -1,174 +0,0 @@
1/* $OpenBSD: strlcattest.c,v 1.3 2019/01/25 00:19:26 millert Exp $ */
2
3/*
4 * Copyright (c) 2014 Todd C. Miller <millert@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <sys/types.h>
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <setjmp.h>
25#include <signal.h>
26#include <unistd.h>
27
28volatile sig_atomic_t got_signal;
29sigjmp_buf jmpenv;
30
31void
32handler(int signo)
33{
34 got_signal = signo;
35 siglongjmp(jmpenv, 1);
36}
37
38int
39main(int argc, char *argv[])
40{
41 char *buf, *cp, *ep;
42 struct sigaction sa;
43 size_t len, bufsize;
44 int failures = 0;
45
46 /* Enable malloc security options. */
47 setenv("MALLOC_OPTIONS", "S", 0);
48
49 bufsize = getpagesize(); /* trigger guard pages easily */
50 buf = malloc(bufsize);
51 if (buf == NULL) {
52 fprintf(stderr, "unable to allocate memory\n");
53 return 1;
54 }
55 memset(buf, 'z', bufsize);
56 ep = buf + bufsize;
57
58 /* Test appending to an unterminated string. */
59 len = strlcat(buf, "abcd", bufsize);
60 if (len != 4 + bufsize) {
61 fprintf(stderr,
62 "strlcat: failed unterminated buffer test (1a)\n");
63 failures++;
64 }
65 /* Make sure we only wrote where expected. */
66 for (cp = buf; cp < ep; cp++) {
67 if (*cp != 'z') {
68 fprintf(stderr,
69 "strlcat: failed unterminated buffer test (1b)\n");
70 failures++;
71 break;
72 }
73 }
74
75 /* Test appending to a full string. */
76 ep[-1] = '\0';
77 len = strlcat(buf, "abcd", bufsize);
78 if (len != 4 + bufsize - 1) {
79 fprintf(stderr, "strlcat: failed full buffer test (2a)\n");
80 failures++;
81 }
82 /* Make sure we only wrote where expected. */
83 for (cp = buf; cp < ep - 1; cp++) {
84 if (*cp != 'z') {
85 fprintf(stderr,
86 "strlcat: failed full buffer test (2b)\n");
87 failures++;
88 break;
89 }
90 }
91
92 /* Test appending to an empty string. */
93 ep[-1] = 'z';
94 buf[0] = '\0';
95 len = strlcat(buf, "abcd", bufsize);
96 if (len != 4) {
97 fprintf(stderr, "strlcat: failed empty buffer test (3a)\n");
98 failures++;
99 }
100 /* Make sure we only wrote where expected. */
101 if (memcmp(buf, "abcd", sizeof("abcd")) != 0) {
102 fprintf(stderr, "strlcat: failed empty buffer test (3b)\n");
103 failures++;
104 }
105 for (cp = buf + len + 1; cp < ep; cp++) {
106 if (*cp != 'z') {
107 fprintf(stderr,
108 "strlcat: failed empty buffer test (3c)\n");
109 failures++;
110 break;
111 }
112 }
113
114 /* Test appending to a NUL-terminated string. */
115 memcpy(buf, "abcd", sizeof("abcd"));
116 len = strlcat(buf, "efgh", bufsize);
117 if (len != 8) {
118 fprintf(stderr, "strlcat: failed empty buffer test (4a)\n");
119 failures++;
120 }
121 /* Make sure we only wrote where expected. */
122 if (memcmp(buf, "abcdefgh", sizeof("abcdefgh")) != 0) {
123 fprintf(stderr, "strlcat: failed empty buffer test (4b)\n");
124 failures++;
125 }
126 for (cp = buf + len + 1; cp < ep; cp++) {
127 if (*cp != 'z') {
128 fprintf(stderr,
129 "strlcat: failed empty buffer test (4c)\n");
130 failures++;
131 break;
132 }
133 }
134
135 /*
136 * The following tests should result in SIGSEGV, however some
137 * systems may erroneously report SIGBUS.
138 * These tests assume that strlcat() is signal-safe.
139 */
140 memset(&sa, 0, sizeof(sa));
141 sigemptyset(&sa.sa_mask);
142 sa.sa_handler = handler;
143 sigaction(SIGSEGV, &sa, NULL);
144 sigaction(SIGBUS, &sa, NULL);
145
146 /* Test copying to a NULL buffer with non-zero size. */
147 got_signal = 0;
148 if (sigsetjmp(jmpenv, 1) == 0) {
149 len = strlcat(NULL, "abcd", sizeof(buf));
150 fprintf(stderr, "strlcat: failed NULL dst test (5a), "
151 "expected signal %d, got len %zu\n", SIGSEGV, len);
152 failures++;
153 } else if (got_signal != SIGSEGV) {
154 fprintf(stderr, "strlcat: failed NULL dst test (5b), "
155 "expected signal %d, got %d\n", SIGSEGV, got_signal);
156 failures++;
157 }
158
159 /* Test copying from a NULL src. */
160 memcpy(buf, "abcd", sizeof("abcd"));
161 got_signal = 0;
162 if (sigsetjmp(jmpenv, 1) == 0) {
163 len = strlcat(buf, NULL, sizeof(buf));
164 fprintf(stderr, "strlcat: failed NULL src test (6a), "
165 "expected signal %d, got len %zu\n", SIGSEGV, len);
166 failures++;
167 } else if (got_signal != SIGSEGV) {
168 fprintf(stderr, "strlcat: failed NULL src test (6b), "
169 "expected signal %d, got %d\n", SIGSEGV, got_signal);
170 failures++;
171 }
172
173 return failures;
174}
diff --git a/src/regress/lib/libc/strlcpy/Makefile b/src/regress/lib/libc/strlcpy/Makefile
deleted file mode 100644
index 921354432b..0000000000
--- a/src/regress/lib/libc/strlcpy/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2014/12/02 20:23:05 millert Exp $
2
3PROG= strlcpytest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strlcpy/strlcpytest.c b/src/regress/lib/libc/strlcpy/strlcpytest.c
deleted file mode 100644
index e2151aea74..0000000000
--- a/src/regress/lib/libc/strlcpy/strlcpytest.c
+++ /dev/null
@@ -1,170 +0,0 @@
1/* $OpenBSD: strlcpytest.c,v 1.3 2019/01/25 00:19:26 millert Exp $ */
2
3/*
4 * Copyright (c) 2014 Todd C. Miller <millert@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <sys/types.h>
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <signal.h>
25#include <setjmp.h>
26#include <unistd.h>
27
28volatile sig_atomic_t got_signal;
29sigjmp_buf jmpenv;
30
31void
32handler(int signo)
33{
34 got_signal = signo;
35 siglongjmp(jmpenv, 1);
36}
37
38int
39main(int argc, char *argv[])
40{
41 char *buf, *buf2, *cp, *ep;
42 struct sigaction sa;
43 size_t len, bufsize;
44 int failures = 0;
45
46 /* Enable malloc security options. */
47 setenv("MALLOC_OPTIONS", "S", 0);
48
49 bufsize = getpagesize(); /* trigger guard pages easily */
50 buf = malloc(bufsize);
51 buf2 = malloc(bufsize);
52 if (buf == NULL || buf2 == NULL) {
53 fprintf(stderr, "unable to allocate memory\n");
54 return 1;
55 }
56 memset(buf, 'z', bufsize);
57 ep = buf + bufsize;
58
59 /* Test copying to a zero-length NULL buffer. */
60 len = strlcpy(NULL, "abcd", 0);
61 if (len != 4) {
62 fprintf(stderr,
63 "strlcpy: failed zero-length buffer test (1a)\n");
64 failures++;
65 }
66
67 /* Test copying small string to a large buffer. */
68 len = strlcpy(buf, "abcd", bufsize);
69 if (len != 4) {
70 fprintf(stderr, "strlcpy: failed large buffer test (2a)\n");
71 failures++;
72 }
73 /* Make sure we only wrote where expected. */
74 if (memcmp(buf, "abcd", sizeof("abcd")) != 0) {
75 fprintf(stderr, "strlcpy: failed large buffer test (2b)\n");
76 failures++;
77 }
78 for (cp = buf + len + 1; cp < ep; cp++) {
79 if (*cp != 'z') {
80 fprintf(stderr,
81 "strlcpy: failed large buffer test (2c)\n");
82 failures++;
83 break;
84 }
85 }
86
87 /* Test copying large string to a small buffer. */
88 memset(buf, 'z', bufsize);
89 memset(buf2, 'x', bufsize - 1);
90 buf2[bufsize - 1] = '\0';
91 len = strlcpy(buf, buf2, bufsize / 2);
92 if (len != bufsize - 1) {
93 fprintf(stderr, "strlcpy: failed small buffer test (3a)\n");
94 failures++;
95 }
96 /* Make sure we only wrote where expected. */
97 len = (bufsize / 2) - 1;
98 if (memcmp(buf, buf2, len) != 0 || buf[len] != '\0') {
99 fprintf(stderr, "strlcpy: failed small buffer test (3b)\n");
100 failures++;
101 }
102 for (cp = buf + len + 1; cp < ep; cp++) {
103 if (*cp != 'z') {
104 fprintf(stderr,
105 "strlcpy: failed small buffer test (3c)\n");
106 failures++;
107 break;
108 }
109 }
110
111 /* Test copying to a 1-byte buffer. */
112 memset(buf, 'z', bufsize);
113 len = strlcpy(buf, "abcd", 1);
114 if (len != 4) {
115 fprintf(stderr, "strlcpy: failed 1-byte buffer test (4a)\n");
116 failures++;
117 }
118 /* Make sure we only wrote where expected. */
119 if (buf[0] != '\0') {
120 fprintf(stderr, "strlcpy: failed 1-byte buffer test (4b)\n");
121 failures++;
122 }
123 for (cp = buf + 1; cp < ep; cp++) {
124 if (*cp != 'z') {
125 fprintf(stderr,
126 "strlcpy: failed 1-byte buffer test (4c)\n");
127 failures++;
128 break;
129 }
130 }
131
132 /*
133 * The following tests should result in SIGSEGV, however some
134 * systems may erroneously report SIGBUS.
135 * These tests assume that strlcpy() is signal-safe.
136 */
137 memset(&sa, 0, sizeof(sa));
138 sigemptyset(&sa.sa_mask);
139 sa.sa_handler = handler;
140 sigaction(SIGSEGV, &sa, NULL);
141 sigaction(SIGBUS, &sa, NULL);
142
143 /* Test copying to a NULL buffer with non-zero size. */
144 got_signal = 0;
145 if (sigsetjmp(jmpenv, 1) == 0) {
146 len = strlcpy(NULL, "abcd", sizeof(buf));
147 fprintf(stderr, "strlcpy: failed NULL dst test (5a), "
148 "expected signal %d, got len %zu\n", SIGSEGV, len);
149 failures++;
150 } else if (got_signal != SIGSEGV) {
151 fprintf(stderr, "strlcpy: failed NULL dst test (5b), "
152 "expected signal %d, got %d\n", SIGSEGV, got_signal);
153 failures++;
154 }
155
156 /* Test copying from a NULL src. */
157 got_signal = 0;
158 if (sigsetjmp(jmpenv, 1) == 0) {
159 len = strlcpy(buf, NULL, sizeof(buf));
160 fprintf(stderr, "strlcpy: failed NULL src test (6a), "
161 "expected signal %d, got len %zu\n", SIGSEGV, len);
162 failures++;
163 } else if (got_signal != SIGSEGV) {
164 fprintf(stderr, "strlcpy: failed NULL src test (6b), "
165 "expected signal %d, got %d\n", SIGSEGV, got_signal);
166 failures++;
167 }
168
169 return failures;
170}
diff --git a/src/regress/lib/libc/strnlen/Makefile b/src/regress/lib/libc/strnlen/Makefile
deleted file mode 100644
index e7c74972e1..0000000000
--- a/src/regress/lib/libc/strnlen/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2010/06/02 12:20:47 millert Exp $
2
3PROG= strnlentest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strnlen/strnlentest.c b/src/regress/lib/libc/strnlen/strnlentest.c
deleted file mode 100644
index 045b258bf1..0000000000
--- a/src/regress/lib/libc/strnlen/strnlentest.c
+++ /dev/null
@@ -1,69 +0,0 @@
1/* $OpenBSD: strnlentest.c,v 1.2 2019/01/25 00:19:26 millert Exp $ */
2
3/*
4 * Copyright (c) 2010 Todd C. Miller <millert@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <sys/types.h>
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <unistd.h>
25
26int main(int argc, char *argv[])
27{
28 char *buf;
29 int failures = 0;
30 size_t len, bufsize;
31
32 /* Enable malloc security options. */
33 setenv("MALLOC_OPTIONS", "S", 0);
34
35 bufsize = getpagesize(); /* trigger guard pages easily */
36 buf = malloc(bufsize);
37 if (buf == NULL) {
38 fprintf(stderr, "unable to allocate memory\n");
39 return 1;
40 }
41 memset(buf, 'a', bufsize);
42
43 len = strnlen(buf, bufsize);
44 if (len != bufsize) {
45 fprintf(stderr, "strnlen: failed unterminated buffer test (1)");
46 failures++;
47 }
48
49 len = strnlen(buf, bufsize / 2);
50 if (len != bufsize / 2) {
51 fprintf(stderr, "strnlen: failed unterminated buffer test (2)");
52 failures++;
53 }
54
55 buf[bufsize - 1] = '\0';
56 len = strnlen(buf, bufsize);
57 if (len != bufsize - 1) {
58 fprintf(stderr, "strnlen: failed NUL-terminated buffer test (1)");
59 failures++;
60 }
61
62 len = strnlen(buf, (size_t)-1);
63 if (len != bufsize - 1) {
64 fprintf(stderr, "strnlen: failed NUL-terminated buffer test (2)");
65 failures++;
66 }
67
68 return failures;
69}
diff --git a/src/regress/lib/libc/strtod/Makefile b/src/regress/lib/libc/strtod/Makefile
deleted file mode 100644
index 030c0e7f56..0000000000
--- a/src/regress/lib/libc/strtod/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2006/09/29 11:00:24 otto Exp $
2
3PROG= strtodtest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strtod/strtodtest.c b/src/regress/lib/libc/strtod/strtodtest.c
deleted file mode 100644
index 570a002b18..0000000000
--- a/src/regress/lib/libc/strtod/strtodtest.c
+++ /dev/null
@@ -1,23 +0,0 @@
1/* $OpenBSD: strtodtest.c,v 1.2 2017/02/25 07:28:32 jsg Exp $ */
2/* Public domain, Otto Moerbeek <otto@drijf.net>, 2006. */
3
4#include <stdio.h>
5#include <stdlib.h>
6#include <errno.h>
7#include <err.h>
8
9/*
10 * Checks if strtod() reports underflow.
11 */
12
13int
14main()
15{
16 char *tmp="0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002";
17 double d;
18
19 d = strtod(tmp, NULL);
20 if (errno != ERANGE)
21 errx(1, "errno = %d", errno);
22 return (0);
23}
diff --git a/src/regress/lib/libc/strtol/Makefile b/src/regress/lib/libc/strtol/Makefile
deleted file mode 100644
index 3e2f4c746d..0000000000
--- a/src/regress/lib/libc/strtol/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2012/11/18 04:11:09 jsing Exp $
2
3PROG= strtoltest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strtol/strtoltest.c b/src/regress/lib/libc/strtol/strtoltest.c
deleted file mode 100644
index 2efd7b3ad1..0000000000
--- a/src/regress/lib/libc/strtol/strtoltest.c
+++ /dev/null
@@ -1,81 +0,0 @@
1/* $OpenBSD: strtoltest.c,v 1.4 2017/07/15 17:08:26 jsing Exp $ */
2/*
3 * Copyright (c) 2012 Joel Sing <jsing@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <errno.h>
19#include <limits.h>
20#include <stdlib.h>
21#include <stdio.h>
22#include <string.h>
23
24struct strtol_test {
25 char *input;
26 long output;
27 char end;
28 int base;
29 int err;
30};
31
32struct strtol_test strtol_tests[] = {
33 {"1234567890", 1234567890L, '\0', 0, 0},
34 {"0755", 493L, '\0', 0, 0},
35 {"0x7fFFffFf", 2147483647L, '\0', 0, 0},
36 {"1234567890", 0L, '1', 1, EINVAL},
37 {"10101010", 170L, '\0', 2, 0},
38 {"755", 493L, '\0', 8, 0},
39 {"1234567890", 1234567890L, '\0', 10, 0},
40 {"abc", 0L, 'a', 10, 0},
41 {"123xyz", 123L, 'x', 10, 0},
42 {"-080000000", -2147483648L, '\0', 16, 0},
43 {"deadbeefdeadbeef", LONG_MAX, '\0', 16, ERANGE},
44 {"deadzbeef", 57005L, 'z', 16, 0},
45 {"0xy", 0L, 'x', 16, 0},
46 {"-quitebigmchuge", LONG_MIN, '\0', 32, ERANGE},
47 {"zzz", 46655L, '\0', 36, 0},
48 {"1234567890", 0L, '1', 37, EINVAL},
49 {"1234567890", 0L, '1', 123, EINVAL},
50};
51
52int
53main(int argc, char **argv)
54{
55 struct strtol_test *test;
56 int failure = 0;
57 char *end;
58 u_int i;
59 long n;
60
61 for (i = 0; i < (sizeof(strtol_tests) / sizeof(strtol_tests[0])); i++) {
62 test = &strtol_tests[i];
63 errno = 0;
64 n = strtol(test->input, &end, test->base);
65 if (n != test->output) {
66 fprintf(stderr, "TEST %i FAILED: %s base %i: %li\n",
67 i, test->input, test->base, n);
68 failure = 1;
69 } else if (*end != test->end) {
70 fprintf(stderr, "TEST %i FAILED: end is not %c: %c\n",
71 i, test->end, *end);
72 failure = 1;
73 } else if (errno != test->err) {
74 fprintf(stderr, "TEST %i FAILED: errno is not %i: %i\n",
75 i, test->err, errno);
76 failure = 1;
77 }
78 }
79
80 return failure;
81}
diff --git a/src/regress/lib/libc/strtonum/Makefile b/src/regress/lib/libc/strtonum/Makefile
deleted file mode 100644
index e0e8ecd139..0000000000
--- a/src/regress/lib/libc/strtonum/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2004/08/03 20:38:36 otto Exp $
2
3PROG= strtonumtest
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/strtonum/strtonumtest.c b/src/regress/lib/libc/strtonum/strtonumtest.c
deleted file mode 100644
index 7e82a007fe..0000000000
--- a/src/regress/lib/libc/strtonum/strtonumtest.c
+++ /dev/null
@@ -1,64 +0,0 @@
1/* $OpenBSD: strtonumtest.c,v 1.1 2004/08/03 20:38:36 otto Exp $ */
2/*
3 * Copyright (c) 2004 Otto Moerbeek <otto@drijf.net>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <limits.h>
19#include <stdio.h>
20#include <stdlib.h>
21
22int fail;
23
24void
25test(const char *p, long long lb, long long ub, int ok)
26{
27 long long val;
28 const char *q;
29
30 val = strtonum(p, lb, ub, &q);
31 if (ok && q != NULL) {
32 fprintf(stderr, "%s [%lld-%lld] ", p, lb, ub);
33 fprintf(stderr, "NUMBER NOT ACCEPTED %s\n", q);
34 fail = 1;
35 } else if (!ok && q == NULL) {
36 fprintf(stderr, "%s [%lld-%lld] %lld ", p, lb, ub, val);
37 fprintf(stderr, "NUMBER ACCEPTED\n");
38 fail = 1;
39 }
40}
41
42int main(int argc, char *argv[])
43{
44 test("1", 0, 10, 1);
45 test("0", -2, 5, 1);
46 test("0", 2, 5, 0);
47 test("0", 2, LLONG_MAX, 0);
48 test("-2", 0, LLONG_MAX, 0);
49 test("0", -5, LLONG_MAX, 1);
50 test("-3", -3, LLONG_MAX, 1);
51 test("-9223372036854775808", LLONG_MIN, LLONG_MAX, 1);
52 test("9223372036854775807", LLONG_MIN, LLONG_MAX, 1);
53 test("-9223372036854775809", LLONG_MIN, LLONG_MAX, 0);
54 test("9223372036854775808", LLONG_MIN, LLONG_MAX, 0);
55 test("1000000000000000000000000", LLONG_MIN, LLONG_MAX, 0);
56 test("-1000000000000000000000000", LLONG_MIN, LLONG_MAX, 0);
57 test("-2", 10, -1, 0);
58 test("-2", -10, -1, 1);
59 test("-20", -10, -1, 0);
60 test("20", -10, -1, 0);
61
62 return (fail);
63}
64
diff --git a/src/regress/lib/libc/telldir/Makefile b/src/regress/lib/libc/telldir/Makefile
deleted file mode 100644
index 728ae90e1e..0000000000
--- a/src/regress/lib/libc/telldir/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
1# $OpenBSD: Makefile,v 1.2 2013/11/03 00:20:24 schwarze Exp $
2
3PROG = telldir
4SRCS = utils.c shortseek.c telldir.c main.c
5
6cleandir:
7 rm -rf d
8
9.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/telldir/main.c b/src/regress/lib/libc/telldir/main.c
deleted file mode 100644
index 23ffa65dbf..0000000000
--- a/src/regress/lib/libc/telldir/main.c
+++ /dev/null
@@ -1,14 +0,0 @@
1/* $OpenBSD: main.c,v 1.1 2013/11/03 00:20:24 schwarze Exp $ */
2
3/* Written by Ingo Schwarze, 2013, Public domain. */
4
5void shortseek(void);
6void longseek(void);
7
8int
9main(void)
10{
11 shortseek();
12 longseek();
13 return(0);
14}
diff --git a/src/regress/lib/libc/telldir/shortseek.c b/src/regress/lib/libc/telldir/shortseek.c
deleted file mode 100644
index 9b2141ab4c..0000000000
--- a/src/regress/lib/libc/telldir/shortseek.c
+++ /dev/null
@@ -1,91 +0,0 @@
1/* $OpenBSD: shortseek.c,v 1.1 2013/11/03 00:20:24 schwarze Exp $ */
2
3/* Written by Otto Moerbeek, 2006, Public domain. */
4/* Modified by Ingo Schwarze, 2013, Public domain. */
5
6#include <sys/types.h>
7#include <dirent.h>
8#include <err.h>
9#include <limits.h>
10#include <stdio.h>
11#include <string.h>
12
13#include "utils.h"
14
15#define NFILES 5
16
17static void
18shortloop(DIR *dp, int iend, int iback)
19{
20 struct dirent *f;
21 char fend[PATH_MAX], fback[PATH_MAX];
22 long pos, t, remember = -1;
23 int i;
24
25 rewinddir(dp);
26 snprintf(fend, sizeof fend, "%d", iend);
27 snprintf(fback, sizeof fback, "%d", iback);
28
29 /* Scan to iend, remember where iback is. */
30
31 for (;;) {
32 pos = telldir(dp);
33 f = readdir(dp);
34 if (f == NULL)
35 errx(1, "file %s not found", fend);
36 if (strcmp(fback, f->d_name) == 0)
37 remember = pos;
38 if (strcmp(fend, f->d_name) == 0)
39 break;
40 }
41 if (remember == -1)
42 errx(1, "file %s not found", fback);
43
44 /* Go back to iback, checking seekdir, telldir and readdir. */
45
46 seekdir(dp, remember);
47 if ((t = telldir(dp)) != remember)
48 errx(1, "tell after seek %s %ld != %ld", fback, t, remember);
49 if ((t = telldir(dp)) != remember)
50 errx(1, "tell after tell %s %ld != %ld", fback, t, remember);
51 f = readdir(dp);
52 if (f == NULL)
53 errx(1, "readdir %s at %ld", fback, remember);
54
55 if (strcmp(f->d_name, fback))
56 errx(1, "name mismatch: %s != %s", f->d_name, fback);
57
58 /* Check that readdir can iterate the remaining files. */
59
60 for (i = iback + 1; i < NFILES; i++) {
61 f = readdir(dp);
62 if (f == NULL)
63 errx(1, "readdir %i failed", i);
64 }
65
66 /* Check that readdir stops at the right place. */
67
68 f = readdir(dp);
69 if (f != NULL)
70 errx(1, "readdir %i returned %s", NFILES, f->d_name);
71}
72
73void
74shortseek(void)
75{
76 DIR *dp;
77 int iend, iback;
78
79 createfiles(NFILES);
80
81 dp = opendir("d");
82 if (dp == NULL)
83 err(1, "shortseek: opendir");
84
85 for (iend = 0; iend < NFILES; iend++)
86 for (iback = 0; iback <= iend; iback++)
87 shortloop(dp, iend, iback);
88
89 closedir(dp);
90 delfiles();
91}
diff --git a/src/regress/lib/libc/telldir/telldir.c b/src/regress/lib/libc/telldir/telldir.c
deleted file mode 100644
index d2879cc701..0000000000
--- a/src/regress/lib/libc/telldir/telldir.c
+++ /dev/null
@@ -1,71 +0,0 @@
1/* $OpenBSD: telldir.c,v 1.4 2013/11/03 00:20:24 schwarze Exp $ */
2
3/* Written by Otto Moerbeek, 2006, Public domain. */
4
5#include <sys/types.h>
6#include <dirent.h>
7#include <err.h>
8#include <limits.h>
9#include <stdio.h>
10#include <string.h>
11
12#include "utils.h"
13
14#define NFILES 1000
15
16static void
17longloop(DIR *dp, int i)
18{
19 struct dirent *f;
20 char file[PATH_MAX];
21 long pos, t, remember = -1;
22
23 rewinddir(dp);
24 snprintf(file, sizeof file, "%d", i);
25
26 /* Scan through all files, remember where file i is. */
27
28 for (;;) {
29 pos = telldir(dp);
30 f = readdir(dp);
31 if (f == NULL)
32 break;
33 if (strcmp(file, f->d_name) == 0)
34 remember = pos;
35 }
36 if (remember == -1)
37 errx(1, "remember %s", file);
38
39 /* Go back to i, checking seekdir, telldir and readdir. */
40
41 seekdir(dp, remember);
42 if ((t = telldir(dp)) != remember)
43 errx(1, "tell after seek %s %ld != %ld", file, t, remember);
44 if ((t = telldir(dp)) != remember)
45 errx(1, "tell after tell %s %ld != %ld", file, t, remember);
46 f = readdir(dp);
47 if (f == NULL)
48 errx(1, "readdir %s at %ld", file, remember);
49
50 if (strcmp(f->d_name, file) != 0)
51 errx(1, "name mismatch: %s != %s", f->d_name, file);
52}
53
54void
55longseek(void)
56{
57 DIR *dp;
58 int i;
59
60 createfiles(NFILES);
61
62 dp = opendir("d");
63 if (dp == NULL)
64 err(1, "longseek: opendir");
65
66 for (i = 0; i < NFILES; i++)
67 longloop(dp, (i + NFILES/2) % NFILES);
68
69 closedir(dp);
70 delfiles();
71}
diff --git a/src/regress/lib/libc/telldir/utils.c b/src/regress/lib/libc/telldir/utils.c
deleted file mode 100644
index 7fb0401d70..0000000000
--- a/src/regress/lib/libc/telldir/utils.c
+++ /dev/null
@@ -1,53 +0,0 @@
1/* $OpenBSD: utils.c,v 1.2 2017/07/27 15:08:37 bluhm Exp $ */
2
3/* Written by Otto Moerbeek, 2006, Public domain. */
4
5#include <sys/types.h>
6#include <sys/stat.h>
7#include <dirent.h>
8#include <err.h>
9#include <fcntl.h>
10#include <limits.h>
11#include <stdio.h>
12#include <string.h>
13#include <unistd.h>
14
15#include "utils.h"
16
17void
18createfiles(int nfiles)
19{
20 int i, fd;
21 char file[PATH_MAX];
22
23 mkdir("d", 0755);
24 for (i = 0; i < nfiles; i++) {
25 snprintf(file, sizeof file, "d/%d", i);
26 if ((fd = open(file, O_CREAT | O_WRONLY, 0600)) == -1)
27 err(1, "open %s", file);
28 close(fd);
29 }
30}
31
32void
33delfiles(void)
34{
35 DIR *dp;
36 struct dirent *f;
37 char file[PATH_MAX];
38
39 dp = opendir("d");
40 if (dp == NULL)
41 err(1, "opendir");
42 while ((f = readdir(dp))) {
43 if (strcmp(f->d_name, ".") == 0 ||
44 strcmp(f->d_name, "..") == 0)
45 continue;
46 snprintf(file, sizeof file, "d/%s", f->d_name);
47 if (unlink(file) == -1)
48 err(1, "unlink %s", f->d_name);
49 }
50 closedir(dp);
51 if (rmdir("d") == -1)
52 err(1, "rmdir");
53}
diff --git a/src/regress/lib/libc/telldir/utils.h b/src/regress/lib/libc/telldir/utils.h
deleted file mode 100644
index 74ffcd4641..0000000000
--- a/src/regress/lib/libc/telldir/utils.h
+++ /dev/null
@@ -1,6 +0,0 @@
1/* $OpenBSD: utils.h,v 1.1 2013/11/03 00:20:24 schwarze Exp $ */
2
3/* Written by Ingo Schwarze, 2013, Public domain. */
4
5void createfiles(int);
6void delfiles(void);
diff --git a/src/regress/lib/libc/time/Makefile b/src/regress/lib/libc/time/Makefile
deleted file mode 100644
index 28b5556027..0000000000
--- a/src/regress/lib/libc/time/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2004/01/20 16:47:55 millert Exp $
2
3SUBDIR+=strptime
4
5.include <bsd.subdir.mk>
diff --git a/src/regress/lib/libc/time/strptime/Makefile b/src/regress/lib/libc/time/strptime/Makefile
deleted file mode 100644
index 1e1565ced4..0000000000
--- a/src/regress/lib/libc/time/strptime/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
1# $OpenBSD: Makefile,v 1.3 2012/12/16 18:28:53 jasper Exp $
2
3PROG= strptime_test
4SRCS= main.c
5CLEANFILES+= got
6
7REGRESS_TARGETS=do-reg
8do-reg: ${PROG}
9 ./${PROG} < ${.CURDIR}/tests > got
10 diff -u ${.CURDIR}/expected got
11
12.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/time/strptime/expected b/src/regress/lib/libc/time/strptime/expected
deleted file mode 100644
index 21c95de7f9..0000000000
--- a/src/regress/lib/libc/time/strptime/expected
+++ /dev/null
@@ -1,346 +0,0 @@
1--- ctime --- 1
2succeeded
346 27 23 20 0 98 2 19
4
5--- ctime --- 2
6succeeded
746 27 23 20 0 98 2 19
8
9--- ctime --- 3
10succeeded
1146 27 23 20 0 98 2 19
12
13--- %a --- 1
14succeeded
15-1 -1 -1 -1 -1 -1 0 -1
16
17--- %a --- 2
18succeeded
19-1 -1 -1 -1 -1 -1 0 -1
20
21--- %a --- 3
22succeeded
23-1 -1 -1 -1 -1 -1 1 -1
24
25--- %a --- 4
26succeeded
27-1 -1 -1 -1 -1 -1 1 -1
28
29--- %a --- 5
30succeeded
31-1 -1 -1 -1 -1 -1 2 -1
32
33--- %a --- 6
34succeeded
35-1 -1 -1 -1 -1 -1 2 -1
36
37--- %a --- 7
38succeeded
39-1 -1 -1 -1 -1 -1 3 -1
40
41--- %a --- 8
42succeeded
43-1 -1 -1 -1 -1 -1 3 -1
44
45--- %a --- 9
46succeeded
47-1 -1 -1 -1 -1 -1 4 -1
48
49--- %a --- 10
50succeeded
51-1 -1 -1 -1 -1 -1 4 -1
52
53--- %a --- 11
54succeeded
55-1 -1 -1 -1 -1 -1 5 -1
56
57--- %a --- 12
58succeeded
59-1 -1 -1 -1 -1 -1 5 -1
60
61--- %a --- 13
62succeeded
63-1 -1 -1 -1 -1 -1 6 -1
64
65--- %a --- 14
66succeeded
67-1 -1 -1 -1 -1 -1 6 -1
68
69--- %a --- 15
70succeeded
71-1 -1 -1 -1 -1 -1 6 -1
72urn
73
74--- %a --- 16
75failed
76--- %A --- 1
77succeeded
78-1 -1 -1 -1 -1 -1 0 -1
79
80--- %A --- 2
81succeeded
82-1 -1 -1 -1 -1 -1 0 -1
83
84--- %A --- 3
85succeeded
86-1 -1 -1 -1 -1 -1 1 -1
87
88--- %A --- 4
89succeeded
90-1 -1 -1 -1 -1 -1 1 -1
91
92--- %A --- 5
93succeeded
94-1 -1 -1 -1 -1 -1 2 -1
95
96--- %A --- 6
97succeeded
98-1 -1 -1 -1 -1 -1 2 -1
99
100--- %A --- 7
101succeeded
102-1 -1 -1 -1 -1 -1 3 -1
103
104--- %A --- 8
105succeeded
106-1 -1 -1 -1 -1 -1 3 -1
107
108--- %A --- 9
109succeeded
110-1 -1 -1 -1 -1 -1 4 -1
111
112--- %A --- 10
113succeeded
114-1 -1 -1 -1 -1 -1 4 -1
115
116--- %A --- 11
117succeeded
118-1 -1 -1 -1 -1 -1 5 -1
119
120--- %A --- 12
121succeeded
122-1 -1 -1 -1 -1 -1 5 -1
123
124--- %A --- 13
125succeeded
126-1 -1 -1 -1 -1 -1 6 -1
127
128--- %A --- 14
129succeeded
130-1 -1 -1 -1 -1 -1 6 -1
131
132--- %A --- 15
133succeeded
134-1 -1 -1 -1 -1 -1 6 -1
135urn
136
137--- %A --- 16
138failed
139--- %b --- 1
140succeeded
141-1 -1 -1 -1 0 -1 -1 -1
142
143--- %b --- 2
144succeeded
145-1 -1 -1 -1 0 -1 -1 -1
146
147--- %b --- 3
148succeeded
149-1 -1 -1 -1 1 -1 -1 -1
150
151--- %b --- 4
152succeeded
153-1 -1 -1 -1 1 -1 -1 -1
154
155--- %b --- 5
156succeeded
157-1 -1 -1 -1 2 -1 -1 -1
158
159--- %b --- 6
160succeeded
161-1 -1 -1 -1 2 -1 -1 -1
162
163--- %b --- 7
164succeeded
165-1 -1 -1 -1 3 -1 -1 -1
166
167--- %b --- 8
168succeeded
169-1 -1 -1 -1 3 -1 -1 -1
170
171--- %b --- 9
172succeeded
173-1 -1 -1 -1 4 -1 -1 -1
174
175--- %b --- 10
176succeeded
177-1 -1 -1 -1 5 -1 -1 -1
178
179--- %b --- 11
180succeeded
181-1 -1 -1 -1 5 -1 -1 -1
182
183--- %b --- 12
184succeeded
185-1 -1 -1 -1 6 -1 -1 -1
186
187--- %b --- 13
188succeeded
189-1 -1 -1 -1 6 -1 -1 -1
190
191--- %b --- 14
192succeeded
193-1 -1 -1 -1 7 -1 -1 -1
194
195--- %b --- 15
196succeeded
197-1 -1 -1 -1 7 -1 -1 -1
198
199--- %b --- 16
200succeeded
201-1 -1 -1 -1 8 -1 -1 -1
202
203--- %b --- 17
204succeeded
205-1 -1 -1 -1 8 -1 -1 -1
206
207--- %b --- 18
208succeeded
209-1 -1 -1 -1 9 -1 -1 -1
210
211--- %b --- 19
212succeeded
213-1 -1 -1 -1 9 -1 -1 -1
214
215--- %b --- 20
216succeeded
217-1 -1 -1 -1 10 -1 -1 -1
218
219--- %b --- 21
220succeeded
221-1 -1 -1 -1 10 -1 -1 -1
222
223--- %b --- 22
224succeeded
225-1 -1 -1 -1 11 -1 -1 -1
226
227--- %b --- 23
228succeeded
229-1 -1 -1 -1 11 -1 -1 -1
230
231--- %b --- 25
232succeeded
233-1 -1 -1 -1 4 -1 -1 -1
234or
235
236--- %b --- 24
237succeeded
238-1 -1 -1 -1 2 -1 -1 -1
239s
240
241--- %b --- 26
242failed
243--- %B --- 1
244succeeded
245-1 -1 -1 -1 0 -1 -1 -1
246
247--- %B --- 2
248succeeded
249-1 -1 -1 -1 0 -1 -1 -1
250
251--- %B --- 3
252succeeded
253-1 -1 -1 -1 1 -1 -1 -1
254
255--- %B --- 4
256succeeded
257-1 -1 -1 -1 1 -1 -1 -1
258
259--- %B --- 5
260succeeded
261-1 -1 -1 -1 2 -1 -1 -1
262
263--- %B --- 6
264succeeded
265-1 -1 -1 -1 2 -1 -1 -1
266
267--- %B --- 7
268succeeded
269-1 -1 -1 -1 3 -1 -1 -1
270
271--- %B --- 8
272succeeded
273-1 -1 -1 -1 3 -1 -1 -1
274
275--- %B --- 9
276succeeded
277-1 -1 -1 -1 4 -1 -1 -1
278
279--- %B --- 10
280succeeded
281-1 -1 -1 -1 5 -1 -1 -1
282
283--- %B --- 11
284succeeded
285-1 -1 -1 -1 5 -1 -1 -1
286
287--- %B --- 12
288succeeded
289-1 -1 -1 -1 6 -1 -1 -1
290
291--- %B --- 13
292succeeded
293-1 -1 -1 -1 6 -1 -1 -1
294
295--- %B --- 14
296succeeded
297-1 -1 -1 -1 7 -1 -1 -1
298
299--- %B --- 15
300succeeded
301-1 -1 -1 -1 7 -1 -1 -1
302
303--- %B --- 16
304succeeded
305-1 -1 -1 -1 8 -1 -1 -1
306
307--- %B --- 17
308succeeded
309-1 -1 -1 -1 8 -1 -1 -1
310
311--- %B --- 18
312succeeded
313-1 -1 -1 -1 9 -1 -1 -1
314
315--- %B --- 19
316succeeded
317-1 -1 -1 -1 9 -1 -1 -1
318
319--- %B --- 20
320succeeded
321-1 -1 -1 -1 10 -1 -1 -1
322
323--- %B --- 21
324succeeded
325-1 -1 -1 -1 10 -1 -1 -1
326
327--- %B --- 22
328succeeded
329-1 -1 -1 -1 11 -1 -1 -1
330
331--- %B --- 23
332succeeded
333-1 -1 -1 -1 11 -1 -1 -1
334
335--- %B --- 25
336succeeded
337-1 -1 -1 -1 4 -1 -1 -1
338or
339
340--- %B --- 24
341succeeded
342-1 -1 -1 -1 2 -1 -1 -1
343s
344
345--- %B --- 26
346failed
diff --git a/src/regress/lib/libc/time/strptime/main.c b/src/regress/lib/libc/time/strptime/main.c
deleted file mode 100644
index c4e06a9b59..0000000000
--- a/src/regress/lib/libc/time/strptime/main.c
+++ /dev/null
@@ -1,110 +0,0 @@
1/* $OpenBSD: main.c,v 1.2 2008/06/26 05:42:05 ray Exp $ */
2/* $NetBSD: main.c,v 1.4 2002/02/21 07:38:18 itojun Exp $ */
3
4/*-
5 * Copyright (c) 1998 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 */
29#include <err.h>
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
33#include <time.h>
34
35int main(int, char *[]);
36void die(void);
37
38void
39die(void)
40{
41
42 if (ferror(stdin))
43 err(1, "fgetln");
44 else
45 errx(1, "input is truncated");
46}
47
48int
49main(int argc, char *argv[])
50{
51 char *p, *title, *buf, *format;
52 size_t len;
53 struct tm tm;
54
55 for (;;) {
56 p = fgetln(stdin, &len);
57 if (p == 0)
58 die();
59 title = malloc(len + 1);
60 memcpy(title, p, len);
61 title[len] = '\0';
62
63 if (!strcmp(title, "EOF\n"))
64 return(0);
65 if (title[0] == '#' || title[0] == '\n') {
66 free(title);
67 continue;
68 }
69
70 p = fgetln(stdin, &len);
71 if (p == 0)
72 die();
73 buf = malloc(len + 1);
74 memcpy(buf, p, len);
75 buf[len] = '\0';
76
77 p = fgetln(stdin, &len);
78 if (p == 0)
79 die();
80 format = malloc(len + 1);
81 memcpy(format, p, len);
82 format[len] = '\0';
83
84 tm.tm_sec = -1;
85 tm.tm_min = -1;
86 tm.tm_hour = -1;
87 tm.tm_mday = -1;
88 tm.tm_mon = -1;
89 tm.tm_year = -1;
90 tm.tm_wday = -1;
91 tm.tm_yday = -1;
92
93 p = strptime(buf, format, &tm);
94
95 printf("%s", title);
96 if (p) {
97 printf("succeeded\n");
98 printf("%d %d %d %d %d %d %d %d\n",
99 tm.tm_sec, tm.tm_min, tm.tm_hour, tm.tm_mday,
100 tm.tm_mon, tm.tm_year, tm.tm_wday, tm.tm_yday);
101 printf("%s\n", p);
102 } else {
103 printf("failed\n");
104 }
105
106 free(title);
107 free(buf);
108 free(format);
109 }
110}
diff --git a/src/regress/lib/libc/time/strptime/tests b/src/regress/lib/libc/time/strptime/tests
deleted file mode 100644
index d96393b2b7..0000000000
--- a/src/regress/lib/libc/time/strptime/tests
+++ /dev/null
@@ -1,267 +0,0 @@
1# some intial checks to make sure common things work
2--- ctime --- 1
3Tue Jan 20 23:27:46 1998
4%a %b %d %T %Y
5--- ctime --- 2
6Tue Jan 20 23:27:46 1998
7%a %b %d %H:%M:%S %Y
8--- ctime --- 3
9Tue Jan 20 23:27:46 1998
10%c
11
12# test some valid and invalid day names
13--- %a --- 1
14Sun
15%a
16--- %a --- 2
17Sunday
18%a
19--- %a --- 3
20Mon
21%a
22--- %a --- 4
23Monday
24%a
25--- %a --- 5
26Tue
27%a
28--- %a --- 6
29Tuesday
30%a
31--- %a --- 7
32Wed
33%a
34--- %a --- 8
35Wednesday
36%a
37--- %a --- 9
38Thu
39%a
40--- %a --- 10
41Thursday
42%a
43--- %a --- 11
44Fri
45%a
46--- %a --- 12
47Friday
48%a
49--- %a --- 13
50Sat
51%a
52--- %a --- 14
53Saturday
54%a
55--- %a --- 15
56Saturn
57%a
58--- %a --- 16
59Moon
60%a
61--- %A --- 1
62Sun
63%A
64--- %A --- 2
65Sunday
66%A
67--- %A --- 3
68Mon
69%A
70--- %A --- 4
71Monday
72%A
73--- %A --- 5
74Tue
75%A
76--- %A --- 6
77Tuesday
78%A
79--- %A --- 7
80Wed
81%A
82--- %A --- 8
83Wednesday
84%A
85--- %A --- 9
86Thu
87%A
88--- %A --- 10
89Thursday
90%A
91--- %A --- 11
92Fri
93%A
94--- %A --- 12
95Friday
96%A
97--- %A --- 13
98Sat
99%A
100--- %A --- 14
101Saturday
102%A
103--- %A --- 15
104Saturn
105%A
106--- %A --- 16
107Moon
108%A
109
110# test some valid and invalid month names
111--- %b --- 1
112Jan
113%b
114--- %b --- 2
115January
116%b
117--- %b --- 3
118Feb
119%b
120--- %b --- 4
121February
122%b
123--- %b --- 5
124Mar
125%b
126--- %b --- 6
127March
128%b
129--- %b --- 7
130Apr
131%b
132--- %b --- 8
133April
134%b
135--- %b --- 9
136May
137%b
138--- %b --- 10
139Jun
140%b
141--- %b --- 11
142June
143%b
144--- %b --- 12
145Jul
146%b
147--- %b --- 13
148July
149%b
150--- %b --- 14
151Aug
152%b
153--- %b --- 15
154August
155%b
156--- %b --- 16
157Sep
158%b
159--- %b --- 17
160September
161%b
162--- %b --- 18
163Oct
164%b
165--- %b --- 19
166October
167%b
168--- %b --- 20
169Nov
170%b
171--- %b --- 21
172November
173%b
174--- %b --- 22
175Dec
176%b
177--- %b --- 23
178December
179%b
180--- %b --- 25
181Mayor
182%b
183--- %b --- 24
184Mars
185%b
186--- %b --- 26
187Rover
188%b
189--- %B --- 1
190Jan
191%B
192--- %B --- 2
193January
194%B
195--- %B --- 3
196Feb
197%B
198--- %B --- 4
199February
200%B
201--- %B --- 5
202Mar
203%B
204--- %B --- 6
205March
206%B
207--- %B --- 7
208Apr
209%B
210--- %B --- 8
211April
212%B
213--- %B --- 9
214May
215%B
216--- %B --- 10
217Jun
218%B
219--- %B --- 11
220June
221%B
222--- %B --- 12
223Jul
224%B
225--- %B --- 13
226July
227%B
228--- %B --- 14
229Aug
230%B
231--- %B --- 15
232August
233%B
234--- %B --- 16
235Sep
236%B
237--- %B --- 17
238September
239%B
240--- %B --- 18
241Oct
242%B
243--- %B --- 19
244October
245%B
246--- %B --- 20
247Nov
248%B
249--- %B --- 21
250November
251%B
252--- %B --- 22
253Dec
254%B
255--- %B --- 23
256December
257%B
258--- %B --- 25
259Mayor
260%B
261--- %B --- 24
262Mars
263%B
264--- %B --- 26
265Rover
266%B
267EOF
diff --git a/src/regress/lib/libc/timingsafe/Makefile b/src/regress/lib/libc/timingsafe/Makefile
deleted file mode 100644
index 9a679b61f8..0000000000
--- a/src/regress/lib/libc/timingsafe/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2014/06/13 01:55:02 matthew Exp $
2
3PROG= timingsafe
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/timingsafe/timingsafe.c b/src/regress/lib/libc/timingsafe/timingsafe.c
deleted file mode 100644
index f6605f8696..0000000000
--- a/src/regress/lib/libc/timingsafe/timingsafe.c
+++ /dev/null
@@ -1,68 +0,0 @@
1/* $OpenBSD: timingsafe.c,v 1.3 2014/06/21 22:57:15 tedu Exp $ */
2/*
3 * Copyright (c) 2014 Google Inc.
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <assert.h>
19#include <stdlib.h>
20#include <string.h>
21
22#define ASSERT_EQ(a, b) assert((a) == (b))
23
24enum {
25 N = 8
26};
27
28static unsigned char bufone[N], buftwo[N];
29
30void
31check()
32{
33 int cmp = memcmp(bufone, buftwo, N);
34
35 /* Check for reflexivity. */
36 ASSERT_EQ(0, timingsafe_bcmp(bufone, bufone, N));
37 ASSERT_EQ(0, timingsafe_bcmp(buftwo, buftwo, N));
38 ASSERT_EQ(0, timingsafe_memcmp(bufone, bufone, N));
39 ASSERT_EQ(0, timingsafe_memcmp(buftwo, buftwo, N));
40
41 /* Check that timingsafe_bcmp returns 0 iff memcmp returns 0. */
42 ASSERT_EQ(cmp == 0, timingsafe_bcmp(bufone, buftwo, N) == 0);
43
44 /* Check that timingsafe_memcmp returns cmp... */
45 ASSERT_EQ(cmp < 0, timingsafe_memcmp(bufone, buftwo, N) < 0);
46
47 /* ... or -cmp if the argument order is swapped. */
48 ASSERT_EQ(-cmp < 0, timingsafe_memcmp(buftwo, bufone, N) < 0);
49}
50
51int
52main()
53{
54 int i, j;
55
56 for (i = 0; i < 10000; i++) {
57 arc4random_buf(bufone, N);
58 arc4random_buf(buftwo, N);
59
60 check();
61 for (j = 0; j < N; j++) {
62 buftwo[j] = bufone[j];
63 check();
64 }
65 }
66
67 return (0);
68}
diff --git a/src/regress/lib/libc/vis/Makefile b/src/regress/lib/libc/vis/Makefile
deleted file mode 100644
index 13e560bbf7..0000000000
--- a/src/regress/lib/libc/vis/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2005/08/29 18:41:56 otto Exp $
2
3PROG= vis_test
4CLEANFILES+= valid.out
5
6run-regress-vis_test: ${PROG}
7 ./${PROG} >${.OBJDIR}/valid.out
8 cmp -s ${.OBJDIR}/valid.out ${.CURDIR}/valid.ok
9
10.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/vis/valid.ok b/src/regress/lib/libc/vis/valid.ok
deleted file mode 100644
index f8c0efa503..0000000000
--- a/src/regress/lib/libc/vis/valid.ok
+++ /dev/null
@@ -1,2 +0,0 @@
1\^@\^A\^B\^C\^D\^E\^F\^G\^H
2\^K\^L\^M\^N\^O\^P\^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z\^[\^\\^]\^^\^_ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\^?\M^@\M^A\M^B\M^C\M^D\M^E\M^F\M^G\M^H\M^I\M^J\M^K\M^L\M^M\M^N\M^O\M^P\M^Q\M^R\M^S\M^T\M^U\M^V\M^W\M^X\M^Y\M^Z\M^[\M^\\M^]\M^^\M^_\240\M-!\M-"\M-#\M-$\M-%\M-&\M-'\M-(\M-)\M-*\M-+\M-,\M--\M-.\M-/\M-0\M-1\M-2\M-3\M-4\M-5\M-6\M-7\M-8\M-9\M-:\M-;\M-<\M-=\M->\M-?\M-@\M-A\M-B\M-C\M-D\M-E\M-F\M-G\M-H\M-I\M-J\M-K\M-L\M-M\M-N\M-O\M-P\M-Q\M-R\M-S\M-T\M-U\M-V\M-W\M-X\M-Y\M-Z\M-[\M-\\M-]\M-^\M-_\M-`\M-a\M-b\M-c\M-d\M-e\M-f\M-g\M-h\M-i\M-j\M-k\M-l\M-m\M-n\M-o\M-p\M-q\M-r\M-s\M-t\M-u\M-v\M-w\M-x\M-y\M-z\M-{\M-|\M-}\M-~\M^?
diff --git a/src/regress/lib/libc/vis/vis_test.c b/src/regress/lib/libc/vis/vis_test.c
deleted file mode 100644
index 92f2cee32d..0000000000
--- a/src/regress/lib/libc/vis/vis_test.c
+++ /dev/null
@@ -1,113 +0,0 @@
1/* $OpenBSD: vis_test.c,v 1.5 2017/07/27 15:08:37 bluhm Exp $ */
2
3/* Public domain. 2005, Otto Moerbeek */
4
5#include <limits.h>
6#include <stdlib.h>
7#include <string.h>
8#include <stdio.h>
9#include <vis.h>
10
11#define NTESTS 8000
12#define NCH 800
13
14char ibuf[NCH];
15char obuf[NCH * 4];
16char rbuf[NCH * 4];
17
18int flags[] = {
19 VIS_ALL,
20 VIS_GLOB,
21 VIS_TAB,
22 VIS_NL,
23 VIS_DQ,
24 VIS_WHITE,
25 VIS_SAFE
26};
27
28char *flagname[] = {
29 "VIS_ALL",
30 "VIS_GLOB",
31 "VIS_TAB",
32 "VIS_NL",
33 "VIS_DQ",
34 "VIS_WHITE",
35 "VIS_SAFE"
36};
37
38int title;
39
40void
41dotitle(int i, int j)
42{
43 if (title == 0)
44 printf("%d %s:", i, flagname[j]);
45 title = 1;
46}
47
48int
49main(int argc, char *argv[])
50{
51
52 char inp[UCHAR_MAX + 1];
53 char out[4 * UCHAR_MAX + 1];
54 int i, j, fail = 0;
55 ssize_t owant, o, r;
56
57 for (i = 0; i <= UCHAR_MAX; i++) {
58 inp[i] = i;
59 }
60 strvisx(out, inp, UCHAR_MAX + 1, 0);
61 printf("%s\n", out);
62
63 for (i = 0; i < NTESTS; i++) {
64 arc4random_buf(ibuf, sizeof(ibuf) - 1);
65 ibuf[sizeof(ibuf) - 1] = '\0';
66 title = 0;
67
68 for (j = 0; j < sizeof(flags)/sizeof(flags[0]); j++) {
69 owant = sizeof(ibuf);
70 o = strnvis(obuf, ibuf, owant, flags[j]);
71 if (o >= owant) {
72 owant = o + 1;
73 o = strnvis(obuf, ibuf, owant, flags[j]);
74 if (o > owant) {
75 dotitle(i, j);
76 printf("HUGE overflow\n");
77 }
78 if (o < owant - 1) {
79 dotitle(i, j);
80 printf("over-estimate of overflow\n");
81 }
82 } else if (o > strlen(ibuf) * 4) {
83 dotitle(i, j);
84 printf("wants too much %zd %zu\n",
85 o, strlen(ibuf) * 4);
86 continue;
87 }
88
89 r = strnunvis(rbuf, obuf, sizeof rbuf);
90
91 if (r == -1) {
92 dotitle(i, j);
93 printf("cannot decode\n");
94 printf("%s\n", obuf);
95 fail = 1;
96 } else if (r != strlen(ibuf)) {
97 dotitle(i, j);
98 printf("rlen %zd != inlen %zu\n",
99 r, strlen(ibuf));
100 printf("%s\n", obuf);
101 printf("%s\n", rbuf);
102 fail = 1;
103 } else if (bcmp(ibuf, rbuf, r)) {
104 dotitle(i, j);
105 printf("strings are different\n");
106 printf("%s\n", ibuf);
107 printf("%s\n", rbuf);
108 fail = 1;
109 }
110 }
111 }
112 exit(fail);
113}
diff --git a/src/regress/lib/libc/wprintf/Makefile b/src/regress/lib/libc/wprintf/Makefile
deleted file mode 100644
index 7b1897f2c4..0000000000
--- a/src/regress/lib/libc/wprintf/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
1# $OpenBSD: Makefile,v 1.1 2011/04/24 08:00:22 stsp Exp $
2
3PROG= wfp
4
5.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/wprintf/wfp.c b/src/regress/lib/libc/wprintf/wfp.c
deleted file mode 100644
index fc3120b53c..0000000000
--- a/src/regress/lib/libc/wprintf/wfp.c
+++ /dev/null
@@ -1,218 +0,0 @@
1/* $OpenBSD: wfp.c,v 1.1 2011/04/24 08:00:22 stsp Exp $ */
2/*-
3 * Copyright (c) 2002, 2005 David Schultz <das@FreeBSD.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28/*
29 * Test for wprintf() floating point formats.
30 */
31
32#include <assert.h>
33#include <err.h>
34#include <float.h>
35#include <math.h>
36#include <stdio.h>
37#include <stdarg.h>
38#include <stdint.h>
39#include <stdlib.h>
40#include <string.h>
41#include <wchar.h>
42
43#define testfmt(result, fmt, ...) \
44 _testfmt((result), __LINE__, #__VA_ARGS__, fmt, __VA_ARGS__)
45void _testfmt(const wchar_t *, int, const char *, const wchar_t *, ...);
46void smash_stack(void);
47
48int
49main(int argc, char *argv[])
50{
51 /*
52 * Basic tests of decimal output functionality.
53 */
54 testfmt(L" 1.000000E+00", L"%13E", 1.0);
55 testfmt(L" 1.000000", L"%13f", 1.0);
56 testfmt(L" 1", L"%13G", 1.0);
57 testfmt(L" 1.000000E+00", L"%13LE", 1.0L);
58 testfmt(L" 1.000000", L"%13Lf", 1.0L);
59 testfmt(L" 1", L"%13LG", 1.0L);
60
61 testfmt(L"2.718282", L"%.*f", -2, 2.7182818);
62
63 testfmt(L"1.234568e+06", L"%e", 1234567.8);
64 testfmt(L"1234567.800000", L"%f", 1234567.8);
65 testfmt(L"1.23457E+06", L"%G", 1234567.8);
66 testfmt(L"1.234568e+06", L"%Le", 1234567.8L);
67 testfmt(L"1234567.800000", L"%Lf", 1234567.8L);
68 testfmt(L"1.23457E+06", L"%LG", 1234567.8L);
69
70#if (LDBL_MANT_DIG > DBL_MANT_DIG) && !defined(__i386__)
71 testfmt(L"123456789.864210", L"%Lf", 123456789.8642097531L);
72 testfmt(L"-1.23457E+08", L"%LG", -123456789.8642097531L);
73 testfmt(L"123456789.8642097531", L"%.10Lf", 123456789.8642097531L);
74 testfmt(L" 3.141592653589793238e-4000", L"%L27.18Le",
75 3.14159265358979323846e-4000L);
76#endif /* (LDBL_MANT_DIG > DBL_MANT_DIG) && !defined(__i386__) */
77
78 /*
79 * Infinities and NaNs
80 */
81#ifdef NAN
82 testfmt(L"nan", L"%e", NAN);
83 testfmt(L"NAN", L"%F", NAN);
84 testfmt(L"nan", L"%g", NAN);
85 testfmt(L"NAN", L"%LE", (long double)NAN);
86 testfmt(L" nan", L"%05e", NAN);
87#endif /* NAN */
88
89 testfmt(L"INF", L"%E", HUGE_VAL);
90 testfmt(L"-inf", L"%f", -HUGE_VAL);
91 testfmt(L"+inf", L"%+g", HUGE_VAL);
92 testfmt(L" inf", L"%4.2Le", HUGE_VALL);
93 testfmt(L"-inf", L"%Lf", -HUGE_VALL);
94 testfmt(L" inf", L"%05e", HUGE_VAL);
95 testfmt(L" -inf", L"%05e", -HUGE_VAL);
96
97 /*
98 * Padding
99 */
100 testfmt(L"0.000000e+00", L"%e", 0.0);
101 testfmt(L"0.000000", L"%F", (double)0.0);
102 testfmt(L"0", L"%G", 0.0);
103 testfmt(L" 0", L"%3.0Lg", 0.0L);
104 testfmt(L" 0", L"%5.0f", 0.001);
105
106 /*
107 * Precision specifiers
108 */
109 testfmt(L"1.0123e+00", L"%.4e", 1.0123456789);
110 testfmt(L"1.0123", L"%.4f", 1.0123456789);
111 testfmt(L"1.012", L"%.4g", 1.0123456789);
112 testfmt(L"1.2346e-02", L"%.4e", 0.0123456789);
113 testfmt(L"0.0123", L"%.4f", 0.0123456789);
114 testfmt(L"0.01235", L"%.4g", 0.0123456789);
115
116 /*
117 * Signed conversions
118 */
119 testfmt(L"+2.500000e-01", L"%+e", 0.25);
120 testfmt(L"+0.000000", L"%+F", 0.0);
121 testfmt(L"-1", L"%+g", -1.0);
122
123 testfmt(L"-1.000000e+00", L"% e", -1.0);
124 testfmt(L"+1.000000", L"% +f", 1.0);
125 testfmt(L" 1", L"% g", 1.0);
126 testfmt(L" 0", L"% g", 0.0);
127
128 /*
129 * ``Alternate form''
130 */
131 testfmt(L"1.250e+00", L"%#.3e", 1.25);
132 testfmt(L"123.000000", L"%#f", 123.0);
133 testfmt(L" 12345.", L"%#7.5g", 12345.0);
134 testfmt(L" 1.00000", L"%#8g", 1.0);
135 testfmt(L"0.0", L"%#.2g", 0.0);
136
137 /*
138 * Padding and decimal point placement
139 */
140 testfmt(L"03.2E+00", L"%08.1E", 3.25);
141 testfmt(L"003.25", L"%06.2F", 3.25);
142 testfmt(L"0003.25", L"%07.4G", 3.25);
143
144 testfmt(L"3.14159e-05", L"%g", 3.14159e-5);
145 testfmt(L"0.000314159", L"%g", 3.14159e-4);
146 testfmt(L"3.14159e+06", L"%g", 3.14159e6);
147 testfmt(L"314159", L"%g", 3.14159e5);
148 testfmt(L"314159.", L"%#g", 3.14159e5);
149
150 testfmt(L" 9.000000e+03", L"%13e", 9000.0);
151 testfmt(L" 9000.000000", L"%12f", 9000.0);
152 testfmt(L" 9000", L"%5g", 9000.0);
153 testfmt(L" 900000.", L"%#8g", 900000.0);
154 testfmt(L" 9e+06", L"%6g", 9000000.0);
155 testfmt(L" 9.000000e-04", L"%13e", 0.0009);
156 testfmt(L" 0.000900", L"%9f", 0.0009);
157 testfmt(L" 0.0009", L"%7g", 0.0009);
158 testfmt(L" 9e-05", L"%6g", 0.00009);
159 testfmt(L" 9.00000e-05", L"%#12g", 0.00009);
160 testfmt(L" 9.e-05", L"%#7.1g", 0.00009);
161
162 testfmt(L" 0.0", L"%4.1f", 0.0);
163 testfmt(L"90.0", L"%4.1f", 90.0);
164 testfmt(L" 100", L"%4.0f", 100.0);
165 testfmt(L"9.0e+01", L"%4.1e", 90.0);
166 testfmt(L"1e+02", L"%4.0e", 100.0);
167
168 /*
169 * Hexadecimal floating point (%a, %A) tests. Some of these
170 * are only valid if the implementation converts to hex digits
171 * on nibble boundaries.
172 */
173 testfmt(L"0x0p+0", L"%a", 0x0.0p0);
174 testfmt(L"0X0.P+0", L"%#LA", 0x0.0p0L);
175#ifdef NAN
176 testfmt(L"inf", L"%La", (long double)INFINITY);
177 testfmt(L"+INF", L"%+A", INFINITY);
178 testfmt(L"nan", L"%La", (long double)NAN);
179 testfmt(L"NAN", L"%A", NAN);
180#endif /* NAN */
181
182 testfmt(L" 0x1.23p+0", L"%10a", 0x1.23p0);
183 testfmt(L" 0x1.23p-500", L"%12a", 0x1.23p-500);
184 testfmt(L" 0x1.2p+40", L"%10.1a", 0x1.23p40);
185 testfmt(L" 0X1.230000000000000000000000P-4", L"%32.24A", 0x1.23p-4);
186 testfmt(L"0x1p-1074", L"%a", 0x1p-1074);
187 testfmt(L"0x1.2345p-1024", L"%a", 0x1.2345p-1024);
188
189 return (0);
190}
191
192void
193smash_stack(void)
194{
195 static uint32_t junk = 0xdeadbeef;
196 uint32_t buf[512];
197 int i;
198
199 for (i = 0; i < sizeof(buf) / sizeof(buf[0]); i++)
200 buf[i] = junk;
201}
202
203void
204_testfmt(const wchar_t *result, int line, const char *argstr, const wchar_t *fmt,...)
205{
206 wchar_t s[100];
207 va_list ap;
208
209 va_start(ap, fmt);
210 smash_stack();
211 vswprintf(s, sizeof(s), fmt, ap);
212 if (wcscmp(result, s) != 0) {
213 fprintf(stderr,
214 "%d: printf(\"%s\", %s) ==> [%s], expected [%s]\n",
215 line, (char*)fmt, argstr, s, result);
216 abort();
217 }
218}