#!/bin/ksh93 FDIR=/tmp SCRATCH=/export/scratch/${LOGNAME}/build #SCRATCH=~/work unset F # NOTE: Most 64bit OS limit the arg stack to 2 MiB. So strlen(args) should be # at least 2 MiB * 0.75. FreeBSD, MacOS use only 256 KiB ... TRUE=${ whence -p true ; } TRUE=/tmp/a.out # HowTo Build #if [[ ${ uname -s; } == 'Darwin' ]]; then # mkdir ${SCRATCH}; cd ${SCRATCH} # wget http://iks.cs.ovgu.de/~elkner/tmp/ksh93/apfel/Makefile # make bin # which basically does a: # LDFLAGS="-Wl,-search_paths_first" CCFLAGS="-DSHOPT_SPAWN=0 -D_ast_int8_t=int64_t -D_lib_memccpy -O3" ./bin/package make SHELL=/bin/bash #else # mkdir ${SCRATCH}; cd ${SCRATCH} # git clone https://github.com/ksh-community/ksh.git # cd ksh #if [[ ${ uname -s; } == 'SunOS' ]]; then # if [[ ${ uname -v; } =~ ^joyent_ ]]: then # ./bin/package make SHELL=/bin/bash \ # CCFLAGS="-D L_tmpnam=25 -m64 -O3" LDFLAGS="-m64 -lm" # else # ./bin/package make SHELL=/bin/bash \ # CCFLAGS="-xc99 -D_XPG6 -m64 -xO3" LDFLAGS="-m64" # fi #else # ./bin/package make #fi #fi # Finally: # export CCFLAGS="-xc99 -D_XPG6 -m64 -g -D DEBUG=1" LDFLAGS="-m64" # touch src/cmd/ksh93/sh/path.c # ./bin/package make SHELL=/bin/bash function doArgvTest { # NOTE: If macro.c was not compiled with optimization, this test takes # hours instead of seconds [on a 3GHz Xeon]. typeset F=${FDIR}/ksh-argv.log print -u2 "Running $0 ..." print "# $$\n# command -x ${TRUE}" \ 'a1 a2 a3 {4..13} a14 {15..150000} ae1 ae2 ae3' >$F command -x ${TRUE} a1 a2 a3 {4..13} a14 {15..150000} ae1 ae2 ae3 >>$F 2>&1 print -u2 "Log: $F" } function doArg1Test { typeset F=${FDIR}/ksh-arg1.log T integer I print -u2 "Running $0 ..." T="1" ; for (( I=1; I < 20; I++ )) ; do T+=" $T"; done print "# $$\n# command -x ${TRUE}" 'a1 a2 a3 $T="1 ..." ae1 ae2 ae3' >$F command -x ${TRUE} a1 a2 a3 $T ae1 ae2 ae3 >>$F 2>&1 print -u2 "Log: $F" } function doArg6Test { typeset F=${FDIR}/ksh-arg6.log T integer I print -u2 "Running $0 ..." T="666666" ; for (( I=1; I < 19; I++ )) ; do T+=" $T"; done print "# $$\n# command -x ${TRUE}" 'a1 a2 a3 $T="666666 ..." ae1 ae2 ae3'>$F command -x ${TRUE} a1 a2 a3 $T ae1 ae2 ae3 >>$F 2>&1 print -u2 "Log: $F" } function doArg100Test { typeset F=${FDIR}/ksh-arg100.log T X integer I print -u2 "Running $0 ..." T= for (( I=0; I < 10; I++ )) ; do T+=".234567890" ; done for (( I=1; I < 16; I++ )) ; do T+=" $T"; done if [[ -n ${CHECK_ENV} ]]; then K='.' for (( I=1; I < 20; I++ )) ; do K+="$K" ; done export K print "${#K}" fi print "# $$\n# command -x ${TRUE}" 'a1 a2 a3 $T=".234567890 ..." ae1 ae2 ae3'>$F command -x ${TRUE} a1 a2 a3 $T ae1 ae2 ae3 >>$F 2>&1 print -u2 "Log: $F" } function doMain { if [[ -z $1 || $1 == 'a' ]]; then doArgvTest ; doArg1Test ; doArg6Test ; doArg100Test else doArg"$1"Test fi } doMain "$@"