[comp.sources.misc] v18i032: perl - The perl programming language, Part14/36

lwall@netlabs.com (Larry Wall) (04/16/91)

Submitted-by: Larry Wall <lwall@netlabs.com>
Posting-number: Volume 18, Issue 32
Archive-name: perl/part14

[There are 36 kits for perl version 4.0.]

#! /bin/sh

# Make a new directory for the perl sources, cd to it, and run kits 1
# thru 36 through sh.  When all 36 kits have been run, read README.

echo "This is perl 4.0 kit 14 (of 36).  If kit 14 is complete, the line"
echo '"'"End of kit 14 (of 36)"'" will echo at the end.'
echo ""
export PATH || (echo "You didn't use sh, you clunch." ; kill $$)
mkdir t t/op usub 2>/dev/null
echo Extracting Configure:AB
sed >Configure:AB <<'!STUFFY!FUNK!' -e 's/X//'
Xval=$D_dirnamlen;	set d_dirnamlen;	eval $setvar
Xval=$I_dirent;		set i_dirent;		eval $setvar
Xval=$I_sys_dir;		set i_sys_dir;		eval $setvar
Xval=$I_my_dir;		set i_my_dir;		eval $setvar
Xval=$I_ndir;		set i_ndir;		eval $setvar
Xval=$I_sys_ndir;	set i_sys_ndir;		eval $setvar
X
X: now see if they want to do setuid emulation
Xcase "$d_dosuid" in
X'') dflt=n;;
X*undef*) dflt=n;;
X*) dflt=y;;
Xesac
Xcat <<EOM
X 
XSome sites have disabled setuid #! scripts because of a bug in the kernel
Xthat prevents them from being secure.  If you are on such a system, the
Xsetuid/setgid bits on scripts are currently useless.  It is possible for
X$package to detect those bits and emulate setuid/setgid in a secure fashion
Xuntil a better solution is devised for the kernel problem.
X
XEOM
Xrp="Do you want to do setuid/setgid emulation? [$dflt]"
X$echo $n "$rp $c"
X. myread
Xcase "$ans" in
X'') $ans="$dflt";;
Xesac
Xcase "$ans" in
Xy*)  d_dosuid="$define";;
X*) d_dosuid="$undef";;
Xesac
X
X: see if dup2 exists
Xset dup2 d_dup2
Xeval $inlibc
X
X: see if fchmod exists
Xset fchmod d_fchmod
Xeval $inlibc
X
X: see if fchown exists
Xset fchown d_fchown
Xeval $inlibc
X
X: see if this is an fcntl system
Xset fcntl d_fcntl
Xeval $inlibc
X
X: see if we can have long filenames
Xecho " "
Xrm -f 123456789abcde
Xif (echo hi >123456789abcdef) 2>/dev/null; then
X    : not version 8
X    if test -f 123456789abcde; then
X	echo 'You cannot have filenames longer than 14 characters.  Sigh.'
X	val="$undef"
X    else
X	echo 'You can have filenames longer than 14 characters.'
X	val="$define"
X    fi
Xelse
X    : version 8 probably
X    echo "You can't have filenames longer than 14 chars.  You can't even think about them!"
X    val="$undef"
Xfi 
Xset d_flexfnam
Xeval $setvar
X
X: see if flock exists
Xset flock d_flock
Xeval $inlibc
X
X: see if getgroups exists
Xset getgroups d_getgrps
Xeval $inlibc
X
X: see if gethostent exists
Xset gethostent d_gethent
Xeval $inlibc
X
X: see if getpgrp exists
Xset getpgrp d_getpgrp
Xeval $inlibc
X
X: see if getpgrp2 exists
Xset getpgrp2 d_getpgrp2
Xeval $inlibc
X
X: see if getpriority exists
Xset getpriority d_getprior
Xeval $inlibc
X
X: see if htonl exists
Xset htonl d_htonl
Xeval $inlibc
X
X: index or strcpy
Xecho " "
Xcase "$d_index" in
Xn) dflt=n;;
X*)  if $test -f /unix; then
X	dflt=n
X    else
X	dflt=y
X    fi
X    ;;
Xesac
Xif $contains '^index$' libc.list >/dev/null 2>&1 ; then
X    if $contains '^strchr$' libc.list >/dev/null 2>&1 ; then
X	echo "Your system has both index() and strchr().  Shall I use"
X	rp="index() rather than strchr()? [$dflt]"
X	$echo $n "$rp $c"
X	. myread
X	case "$ans" in
X	    n*) d_index="$define" ;;
X	    *)  d_index="$undef" ;;
X	esac
X    else
X	d_index="$undef"
X	echo "index() found."
X    fi
Xelse
X    if $contains '^strchr$' libc.list >/dev/null 2>&1 ; then
X	d_index="$define"
X	echo "strchr() found."
X    else
X	echo "No index() or strchr() found!"
X	d_index="$undef"
X    fi
Xfi
X
X: see if killpg exists
Xset killpg d_killpg
Xeval $inlibc
X
X: see if lstat exists
Xset lstat d_lstat
Xeval $inlibc
X
X: see if memcmp exists
Xset memcmp d_memcmp
Xeval $inlibc
X
X: see if memcpy exists
Xset memcpy d_memcpy
Xeval $inlibc
X
X: see if mkdir exists
Xset mkdir d_mkdir
Xeval $inlibc
X
X: see if msgctl exists
Xset msgctl d_msgctl
Xeval $inlibc
X
X: see if msgget exists
Xset msgget d_msgget
Xeval $inlibc
X
X: see if msgsnd exists
Xset msgsnd d_msgsnd
Xeval $inlibc
X
X: see if msgrcv exists
Xset msgrcv d_msgrcv
Xeval $inlibc
X
X: see how much of the 'msg*(2)' library is present.
Xh_msg=true
Xecho " "
Xcase "$d_msgctl$d_msgget$d_msgsnd$d_msgrcv" in
X*undef*) h_msg=false;;
Xesac
X: we could also check for sys/ipc.h ...
Xif $h_msg && $test -r $usrinclude/sys/msg.h; then
X    echo "You have the full msg*(2) library."
X    val="$define"
Xelse
X    echo "You don't have the full msg*(2) library."
X    val="$undef"
Xfi
Xset d_msg
Xeval $setvar
X
X: see if ndbm is available
Xecho " "
Xxxx=`./loc ndbm.h x $usrinclude /usr/local/include $inclwanted`
Xif test -f $xxx; then
X    val="$define"
X    echo "ndbm.h found."
Xelse
X    val="$undef"
X    echo "ndbm.h not found."
Xfi
Xset d_ndbm
Xeval $setvar
X
X: see if we have the old dbm
Xecho " "
Xxxx=`./loc dbm.h x $usrinclude /usr/local/include $inclwanted`
Xif test -f $xxx; then
X    val="$define"
X    echo "dbm.h found."
Xelse
X    val="$undef"
X    echo "dbm.h not found."
Xfi
Xset d_odbm
Xeval $setvar
X
X: see whether socket exists
Xecho " "
Xsocketlib=''
Xif $contains socket libc.list >/dev/null 2>&1; then
X    echo "Looks like you have Berkeley networking support."
X    val="$define"
X    : now check for advanced features
X    if $contains setsockopt libc.list >/dev/null 2>&1; then
X	val2="$undef"
X    else
X	echo "...but it uses the old 4.1c interface, rather than 4.2"
X	val2="$define"
X    fi
Xelse
X    : hpux, for one, puts all the socket stuff in socklib.o
X    if $contains socklib libc.list >/dev/null 2>&1; then
X	echo "Looks like you have Berkeley networking support."
X	val="$define"
X	: we will have to assume that it supports the 4.2 BSD interface
X	val2="$undef"
X    else
X	echo "Hmmm...you don't have Berkeley networking in libc.a..."
X	: look for an optional networking library
X	if test -f /usr/lib/libnet.a; then
X	    (ar t /usr/lib/libnet.a ||
X		nm -g /usr/lib/libnet.a) 2>/dev/null >> libc.list
X	    if $contains socket libc.list >/dev/null 2>&1; then
X		echo "but the Wollongong group seems to have hacked it in."
X		socketlib="-lnet -lnsl_s"
X		val="$define"
X		: now check for advanced features
X		if $contains setsockopt libc.list >/dev/null 2>&1; then
X		    val2="$undef"
X		else
X		    echo "...using the old 4.1c interface, rather than 4.2"
X		    val2="$define"
X		fi
X	    else
X		echo "or even in libnet.a, which is peculiar."
X		val="$undef"
X		val2="$undef"
X	    fi
X	else
X	    echo "or anywhere else I see."
X	    val="$undef"
X	    val2="$undef"
X	fi
X    fi
Xfi
Xset d_socket
Xeval $setvar
X
Xif $contains socketpair libc.list >/dev/null 2>&1; then
X    val="$define"
Xelse
X    val="$undef"
Xfi
Xset d_sockpair
Xeval $setvar
Xval=$val2
Xset d_oldsock
Xeval $setvar
X
X: Locate the flags for 'open()'
Xecho " "
X$cat >open3.c <<'EOCP'
X#include <sys/types.h>
X#ifdef I_FCNTL
X#include <fcntl.h>
X#endif
X#ifdef I_SYS_FILE
X#include <sys/file.h>
X#endif
Xmain() {
X
X	if(O_RDONLY);
X
X#ifdef O_TRUNC
X	exit(0);
X#else
X	exit(1);
X#endif
X}
XEOCP
X: check sys/file.h first to get FREAD on Sun
Xif $test -r $usrinclude/sys/file.h && \
X   $cc $cppflags "-DI_SYS_FILE" open3.c -o open3 >/dev/null 2>&1 ; then
X    h_sys_file=true;
X    echo "sys/file.h defines the O_* constants..."
X    if ./open3; then
X	echo "and you have the 3 argument form of open()."
X	val="$define"
X    else
X	echo "but not the 3 argument form of open().  Oh, well."
X	val="$undef"
X    fi
Xelif $test -r $usrinclude/fcntl.h && \
X   $cc "-DI_FCNTL" open3.c -o open3 >/dev/null 2>&1 ; then
X    h_fcntl=true;
X    echo "fcntl.h defines the O_* constants..."
X    if ./open3; then
X	echo "and you have the 3 argument form of open()."
X	val="$define"
X    else
X	echo "but not the 3 argument form of open().  Oh, well."
X	val="$undef"
X    fi
Xelse
X    val="$undef"
X    echo "I can't find the O_* constant definitions!  You got problems."
Xfi
Xset d_open3
Xeval $setvar
X
X: see if how pwd stuff is defined
Xecho " "
Xif $test -r $usrinclude/pwd.h ; then
X    i_pwd="$define"
X    echo "pwd.h found."
X    $cppstdin $cppflags $cppminus <$usrinclude/pwd.h >pwd.txt
X    if $contains 'pw_quota' pwd.txt >/dev/null 2>&1; then
X	d_pwquota="$define"
X    else
X	d_pwquota="$undef"
X    fi
X    if $contains 'pw_age' pwd.txt >/dev/null 2>&1; then
X	d_pwage="$define"
X    else
X	d_pwage="$undef"
X    fi
X    if $contains 'pw_change' pwd.txt >/dev/null 2>&1; then
X	d_pwchange="$define"
X    else
X	d_pwchange="$undef"
X    fi
X    if $contains 'pw_class' pwd.txt >/dev/null 2>&1; then
X	d_pwclass="$define"
X    else
X	d_pwclass="$undef"
X    fi
X    if $contains 'pw_expire' pwd.txt >/dev/null 2>&1; then
X	d_pwexpire="$define"
X    else
X	d_pwexpire="$undef"
X    fi
X    if $contains 'pw_comment' pwd.txt >/dev/null 2>&1; then
X	d_pwcomment="$define"
X    else
X	d_pwcomment="$undef"
X    fi
Xelse
X    i_pwd="$undef"
X    d_pwquota="$undef"
X    d_pwage="$undef"
X    d_pwchange="$undef"
X    d_pwclass="$undef"
X    d_pwexpire="$undef"
X    d_pwcomment="$undef"
X    echo "No pwd.h found."
Xfi
X
X: see if rename exists
Xset rename d_rename
Xeval $inlibc
X
X: see if rmdir exists
Xset rmdir d_rmdir
Xeval $inlibc
X
X: see if select exists
Xset select d_select
Xeval $inlibc
X
X: see if semctl exists
Xset semctl d_semctl
Xeval $inlibc
X
X: see if semget exists
Xset semget d_semget
Xeval $inlibc
X
X: see if semop exists
Xset semop d_semop
Xeval $inlibc
X
X: see how much of the 'sem*(2)' library is present.
Xh_sem=true
Xecho " "
Xcase "$d_semctl$d_semget$d_semop" in
X*undef*) h_sem=false;;
Xesac
X: we could also check for sys/ipc.h ...
Xif $h_sem && $test -r $usrinclude/sys/sem.h; then
X    echo "You have the full sem*(2) library."
X    val="$define"
Xelse
X    echo "You don't have the full sem*(2) library."
X    val="$undef"
Xfi
Xset d_sem
Xeval $setvar
X
X: see if setegid exists
Xset setegid d_setegid
Xeval $inlibc
X
X: see if seteuid exists
Xset seteuid d_seteuid
Xeval $inlibc
X
X: see if setpgrp exists
Xset setpgrp d_setpgrp
Xeval $inlibc
X
X: see if setpgrp2 exists
Xset setpgrp2 d_setpgrp2
Xeval $inlibc
X
X: see if setpriority exists
Xset setpriority d_setprior
Xeval $inlibc
X
X: see if setregid exists
Xset setregid d_setregid
Xeval $inlibc
Xset setresgid d_setresgid
Xeval $inlibc
X
X: see if setreuid exists
Xset setreuid d_setreuid
Xeval $inlibc
Xset setresuid d_setresuid
Xeval $inlibc
X
X: see if setrgid exists
Xset setrgid d_setrgid
Xeval $inlibc
X
X: see if setruid exists
Xset setruid d_setruid
Xeval $inlibc
X
X: see if shmctl exists
Xset shmctl d_shmctl
Xeval $inlibc
X
X: see if shmget exists
Xset shmget d_shmget
Xeval $inlibc
X
X: see if shmat exists
Xset shmat d_shmat
Xeval $inlibc
X
X: see if shmdt exists
Xset shmdt d_shmdt
Xeval $inlibc
X
X: see how much of the 'shm*(2)' library is present.
Xh_shm=true
Xecho " "
Xcase "$d_shmctl$d_shmget$d_shmat$d_shmdt" in
X*undef*) h_shm=false;;
Xesac
X: we could also check for sys/ipc.h ...
Xif $h_shm && $test -r $usrinclude/sys/shm.h; then
X    echo "You have the full shm*(2) library."
X    val="$define"
Xelse
X    echo "You don't have the full shm*(2) library."
X    val="$undef"
Xfi
Xset d_shm
Xeval $setvar
X
X: see if stat knows about block sizes
Xecho " "
Xif $contains 'st_blocks;' $usrinclude/sys/stat.h >/dev/null 2>&1 ; then
X    if $contains 'st_blksize;' $usrinclude/sys/stat.h >/dev/null 2>&1 ; then
X	echo "Your stat knows about block sizes."
X	val="$define"
X    else
X	echo "Your stat doesn't know about block sizes."
X	val="$undef"
X    fi
Xelse
X    echo "Your stat doesn't know about block sizes."
X    val="$undef"
Xfi
Xset d_statblks
Xeval $setvar
X
X: see if stdio is really std
Xecho " "
Xif $contains 'char.*_ptr.*;' $usrinclude/stdio.h >/dev/null 2>&1 ; then
X    if $contains '_cnt;' $usrinclude/stdio.h >/dev/null 2>&1 ; then
X	echo "Your stdio is pretty std."
X	val="$define"
X    else
X	echo "Your stdio isn't very std."
X	val="$undef"
X    fi
Xelse
X    echo "Your stdio isn't very std."
X    val="$undef"
Xfi
Xset d_stdstdio
Xeval $setvar
X
X: check for structure copying
Xecho " "
Xecho "Checking to see if your C compiler can copy structs..."
X$cat >strctcpy.c <<'EOCP'
Xmain()
X{
X	struct blurfl {
X	    int dyick;
X	} foo, bar;
X
X	foo = bar;
X}
XEOCP
Xif $cc -c strctcpy.c >/dev/null 2>&1 ; then
X    val="$define"
X    echo "Yup, it can."
Xelse
X    val="$undef"
X    echo "Nope, it can't."
Xfi
Xset d_strctcpy
Xeval $setvar
X
X: see if strerror exists
Xset strerror d_strerror
Xeval $inlibc
X
X: see if symlink exists
Xset symlink d_symlink
Xeval $inlibc
X
X: see if syscall exists
Xset syscall d_syscall
Xeval $inlibc
X
X: set if package uses struct tm
Xw_s_tm=1
X
X: set if package uses struct timeval
Xcase "$d_select" in
Xdefine) w_s_timevl=1 ;;
Xesac
X
X: set if package uses localtime function
Xw_localtim=1
X
X: see which of time.h, sys/time.h, and sys/select should be included.
Xidefs=''
Xcat <<'EOM'
X  
XTesting to see which of <time.h>, <sys/time.h>, and <sys/select.h>
Xshould be included, because this application wants:
X
XEOM
Xcase "$w_s_itimer" in
X1)
X    echo "	struct itimerval"
X    idefs="-DS_ITIMERVAL $idefs"
X    ;;
Xesac
Xcase "$w_s_timevl" in
X1)
X    echo "	struct timeval"
X    idefs="-DS_TIMEVAL $idefs"
X    ;;
Xesac
Xcase "$w_s_tm" in
X1)
X    echo "	struct tm"
X    idefs="-DS_TM $idefs"
X    ;;
Xesac
Xcase "$w_localtim" in
X1)
X    echo "	ctime(3) declarations"
X    idefs="-DD_CTIME $idefs"
X    ;;
Xesac
Xcase "$idefs" in
X'')
X    echo "	(something I don't know about)"
X    ;;
Xesac
Xecho " "
Xecho "I'm now running the test program..."
X$cat >i_time.c <<'EOCP'
X#include <sys/types.h>
X#ifdef I_TIME
X#include <time.h>
X#endif
X#ifdef I_SYS_TIME
X#ifdef SYSTIMEKERNEL
X#define KERNEL
X#endif
X#include <sys/time.h>
X#endif
X#ifdef I_SYS_SELECT
X#include <sys/select.h>
X#endif
Xmain()
X{
X    struct tm foo;
X    struct tm *tmp;
X#ifdef S_TIMEVAL
X    struct timeval bar;
X#endif
X#ifdef S_ITIMERVAL
X    struct itimerval baz;
X#endif
X
X    if (foo.tm_sec == foo.tm_sec)
X	exit(0);
X#ifdef S_TIMEVAL
X    if (bar.tv_sec == bar.tv_sec)
X	exit(0);
X#endif
X#ifdef S_ITIMERVAL
X    if (baz.it_interval == baz.it_interval)
X	exit(0);
X#endif
X#ifdef S_TIMEVAL
X    if (bar.tv_sec == bar.tv_sec)
X	exit(0);
X#endif
X#ifdef D_CTIME
X    /* this might not do anything for us... */
X    tmp = localtime((time_t *)0);
X#endif
X    exit(1);
X}
XEOCP
Xflags=''
Xfor i_sys_select in '' '-DI_SYS_SELECT'; do
X    for d_systimekernel in '' '-DSYSTIMEKERNEL'; do
X	for i_time in '' '-DI_TIME'; do
X	    for i_systime in '-DI_SYS_TIME' ''; do
X		case "$flags" in
X		'') echo Trying $i_time $i_systime $d_systimekernel $i_sys_select
X		    if $cc $ccflags $idefs \
X			    $i_time $i_systime $d_systimekernel $i_sys_select \
X			    i_time.c -o i_time >/dev/null 2>&1 ; then
X			set X $i_time $i_systime $d_systimekernel $i_sys_select
X			shift
X			flags="$*"
X			echo Succeeded with $flags
X		    fi
X		    ;;
X		esac
X	    done
X	done
X    done
Xdone
Xcase "$flags" in
X*SYSTIMEKERNEL*) val="$define";;
X*) val="$undef";;
Xesac
Xset d_systimekernel
Xeval $setvar
Xcase "$flags" in
X*I_TIME*) val="$define";;
X*) val="$undef";;
Xesac
Xset i_time
Xeval $setvar
Xcase "$flags" in
X*I_SYS_SELECT*) val="$define";;
X*) val="$undef";;
Xesac
Xset i_sys_select
Xeval $setvar
Xcase "$flags" in
X*I_SYS_TIME*) val="$define";;
X*) val="$undef";;
Xesac
Xset i_sys_time
Xeval $setvar
Xcase "$flags$i_sys_time$i_time" in
Xundefundef) i_sys_time="$define"; i_time="$define";
X    echo "ICK, NOTHING WORKED!!!  You may have to diddle the includes.";;
Xesac
X
X: see if signal is declared as pointer to function returning int or void
Xecho " "
X$cppstdin $cppflags $cppminus < $usrinclude/signal.h >d_voidsig.txt
Xif $contains 'int.*signal' d_voidsig.txt >/dev/null 2>&1 ; then
X    echo "You have int (*signal())() instead of void."
X    val="$undef"
X    d_tosignal=int
Xelse
X    echo "You have void (*signal())() instead of int."
X    val="$define"
X    d_tosignal=void
Xfi
Xset d_voidsig
Xeval $setvar
X
X: see if truncate exists
Xset truncate d_truncate
Xeval $inlibc
X
X: see if there is a vfork
Xset vfork d_vfork
Xeval $inlibc
X
X: check for volatile keyword
Xecho " "
Xecho 'Checking to see if your C compiler knows about "volatile"...'
X$cat >try.c <<'EOCP'
Xmain()
X{
X	typedef unsigned short foo_t;
X	char *volatile foo;
X	volatile int bar;
X	volatile foo_t blech;
X	foo = foo;
X}
XEOCP
Xif $cc -c $ccflags try.c >/dev/null 2>&1 ; then
X    val="$define"
X    echo "Yup, it does."
Xelse
X    val="$undef"
X    echo "Nope, it doesn't."
Xfi
Xset d_volatile
Xeval $setvar
X$rm -f try.*
X
X: see if there is a wait4
Xset wait4 d_wait4
Xeval $inlibc
X
X: see if there is a waitpid
Xset waitpid d_waitpid
Xeval $inlibc
X
X: see what type gids are declared as in the kernel
Xcase "$gidtype" in
X'')
X    if $contains 'gid_t;' $usrinclude/sys/types.h >/dev/null 2>&1 ; then
X	dflt='gid_t';
X    else
X	set `grep '_rgid;' $usrinclude/sys/user.h 2>/dev/null` unsigned short
X	case $1 in
X	unsigned) dflt="$1 $2" ;;
X	*) dflt="$1" ;;
X	esac
X    fi
X    ;;
X*)  dflt="$gidtype"
X    ;;
Xesac
Xcont=true
Xecho " "
Xrp="What type are groups ids returned by getgid(), etc.? [$dflt]"
X$echo $n "$rp $c"
X. myread
Xgidtype="$ans"
X
X: check for length of integer
Xecho " "
Xcase "$intsize" in
X'')
X    echo "Checking to see how big your integers are..."
X    $cat >intsize.c <<'EOCP'
X#include <stdio.h>
Xmain()
X{
X    printf("%d\n", sizeof(int));
X}
XEOCP
X    if $cc intsize.c -o intsize >/dev/null 2>&1 ; then
X	dflt=`./intsize`
X    else
X	dflt='4'
X	echo "(I can't seem to compile the test program.  Guessing...)"
X    fi
X    ;;
X*)
X    dflt="$intsize"
X    ;;
Xesac
Xrp="What is the size of an integer (in bytes)? [$dflt]"
X$echo $n "$rp $c"
X. myread
Xintsize="$ans"
X
X: determine which malloc to compile in
Xecho " "
Xcase "$usemymalloc" in
X'')
X    if bsd || v7; then
X	dflt='y'
X    else
X	dflt='n'
X    fi
X    ;;
X*)  dflt="$usemymalloc"
X    ;;
Xesac
Xrp="Do you wish to attempt to use the malloc that comes with $package? [$dflt]"
X$echo $n "$rp $c"
X. myread
Xcase "$ans" in
X'') ans=$dflt;;
Xesac
Xusemymalloc="$ans"
Xcase "$ans" in
Xy*) mallocsrc='malloc.c'; mallocobj='malloc.o'
X    libs=`echo $libs | sed 's/-lmalloc//'`
X    case "$mallocptrtype" in
X    '')
X	cat >usemymalloc.c <<'END'
X#include <malloc.h>
Xvoid *malloc();
XEND
X	if $cc $ccflags -c usemymalloc.c >/dev/null 2>&1; then
X	    mallocptrtype=void
X	else
X	    mallocptrtype=char
X	fi
X	;;
X    esac
X    echo " "
X    echo "Your system wants malloc to return $mallocptrtype*, it would seem."
X    ;;
X*) mallocsrc=''; mallocobj=''; mallocptrtype=void;;
Xesac
X
X: determine where private executables go
Xcase "$privlib" in
X'')
X    dflt=/usr/lib/$package
X    test -d /usr/local/lib && dflt=/usr/local/lib/$package
X    ;;
X*)  dflt="$privlib"
X    ;;
Xesac
X$cat <<EOM
X
XThe $package package has some auxiliary files that should be reside in a library
Xthat is accessible by everyone.  Where should these "private" but accessible
XEOM
X$echo $n "files reside? (~name ok) [$dflt] $c"
Xrp="Private files will reside where? [$dflt]"
X. myread
Xprivlib=`./filexp "$ans"`
X
Xcase "$installprivlib" in
X'')
X    dflt=`echo $privlib | sed 's#^/afs/#/afs/.#'`
X    ;;
X*)  dflt="$installprivlib"
X    ;;
Xesac
X$cat <<EOM
X
XOn some systems (such as afs) you have to install the library files in a
Xdifferent directory to get them to go to the right place.  Where should the
XEOM
X$echo $n "library files be installed? (~name ok) [$dflt] $c"
Xrp="Install private files where? [$dflt]"
X. myread
Xinstallprivlib=`./filexp "$ans"`
X
X: check for size of random number generator
Xecho " "
Xcase "$randbits" in
X'')
X    echo "Checking to see how many bits your rand function produces..."
X    $cat >randbits.c <<'EOCP'
X#include <stdio.h>
Xmain()
X{
X    register int i;
X    register unsigned long tmp;
X    register unsigned long max = 0L;
X
X    for (i=1000; i; i--) {
X	tmp = (unsigned long)rand();
X	if (tmp > max) max = tmp;
X    }
X    for (i=0; max; i++)
X	max /= 2;
X    printf("%d\n",i);
X}
XEOCP
X    if $cc randbits.c -o randbits >/dev/null 2>&1 ; then
X	dflt=`./randbits`
X    else
X	dflt='?'
X	echo "(I can't seem to compile the test program...)"
X    fi
X    ;;
X*)
X    dflt="$randbits"
X    ;;
Xesac
Xrp="How many bits does your rand() function produce? [$dflt]"
X$echo $n "$rp $c"
X. myread
Xrandbits="$ans"
X
X: determine where public executables go
Xcase "$scriptdir" in
X'')
X    dflt="$bin"
X    : guess some guesses
X    test -d /usr/share/scripts && dflt=/usr/share/scripts
X    test -d /usr/share/bin && dflt=/usr/share/bin
X    ;;
X*)  dflt="$scriptdir"
X    ;;
Xesac
Xcont=true
X$cat <<EOM
X 
XSome installations have a separate directory just for executable scripts so
Xthat they can mount it across multiple architectures but keep the scripts in
Xone spot.  You might, for example, have a subdirectory of /usr/share for this.
XOr you might just lump your scripts in with all your other executables.
X 
XEOM
Xwhile $test "$cont" ; do
X    rp="Where do you keep publicly executable scripts (~name ok)? [$dflt]"
X    $echo $n "$rp $c"
X    . myread
X    scriptdir="$ans"
X    scriptdir=`./filexp "$scriptdir"`
X    if test -d $scriptdir; then
X	cont=''
X    else
X	case "$fastread" in
X	yes) dflt=y;;
X	*) dflt=n;;
X	esac
X	rp="Directory $scriptdir doesn't exist.  Use that name anyway? [$dflt]"
X	$echo $n "$rp $c"
X	. myread
X	dflt=''
X	case "$ans" in
X	y*) cont='';;
X	esac
X    fi
Xdone
X
X: generate list of signal names
Xecho " "
Xcase "$sig_name" in
X'')
X    echo "Generating a list of signal names..."
X    set X `cat $usrinclude/signal.h $usrinclude/sys/signal.h 2>&1 | awk '
X$1 ~ /^#define$/ && $2 ~ /^SIG[A-Z0-9]*$/ && $3 ~ /^[1-9][0-9]*$/ {
X    sig[$3] = substr($2,4,20)
X    if (max < $3 && $3 < 60) {
X	max = $3
X    }
X}
X
XEND {
X    for (i=1; i<=max; i++) {
X	if (sig[i] == "")
X	    printf "%d", i
X	else
X	    printf "%s", sig[i]
X	if (i < max)
X	    printf " "
X    }
X    printf "\n"
X}
X'`
X    shift
X    case $# in
X    0)  echo 'kill -l' >/tmp/foo$$
X	set X `$csh -f </tmp/foo$$`
X	shift
X	case $# in
X	0)set HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM
X	    ;;
X	esac
X	;;
X    esac
X    sig_name="ZERO $*"
X    ;;
Xesac
Xecho "Signals are: $sig_name"
X
X: see what type of char stdio uses.
Xecho " "
Xif $contains 'unsigned.*char.*_ptr;' $usrinclude/stdio.h >/dev/null 2>&1 ; then
X    echo "Your stdio uses unsigned chars."
X    stdchar="unsigned char"
Xelse
X    echo "Your stdio uses signed chars."
X    stdchar="char"
Xfi
X
X: see what type uids are declared as in the kernel
Xcase "$uidtype" in
X'')
X    if $contains 'uid_t;' $usrinclude/sys/types.h >/dev/null 2>&1 ; then
X	dflt='uid_t';
X    else
X	set `grep '_ruid;' $usrinclude/sys/user.h 2>/dev/null` unsigned short
X	case $1 in
X	unsigned) dflt="$1 $2" ;;
X	*) dflt="$1" ;;
X	esac
X    fi
X    ;;
X*)  dflt="$uidtype"
X    ;;
Xesac
Xcont=true
Xecho " "
Xrp="What type are user ids returned by getuid(), etc.? [$dflt]"
X$echo $n "$rp $c"
X. myread
Xuidtype="$ans"
X
X: check for void type
Xecho " "
X$cat <<EOM
XChecking to see how well your C compiler groks the void type...
X
X  Support flag bits are:
X    1: basic void declarations.
X    2: arrays of pointers to functions returning void.
X    4: operations between pointers to and addresses of void functions.
X
XEOM
Xcase "$voidhave" in
X'')
X    $cat >void.c <<'EOCP'
X#if TRY & 1
Xvoid main() {
X#else
Xmain() {
X#endif
X	extern void moo();	/* function returning void */
X	void (*goo)();		/* ptr to func returning void */
X#if TRY & 2
X	void (*foo[10])();
X#endif
X
X#if TRY & 4
X	if(goo == moo) {
X		exit(0);
X	}
X#endif
X	exit(0);
X}
XEOCP
X    if $cc -S -DTRY=$voidwant void.c >void.out 2>&1 ; then
X	voidhave=$voidwant
X	echo "It appears to support void to the level $package wants ($voidwant)."
X	if $contains warning void.out >/dev/null 2>&1; then
X	    echo "However, you might get some warnings that look like this:"
X	    $cat void.out
X	fi
X    else
X	echo "Hmm, your compiler has some difficulty with void.  Checking further..."
X	if $cc -S -DTRY=1 void.c >/dev/null 2>&1 ; then
X	    echo "It supports 1..."
X	    if $cc -S -DTRY=3 void.c >/dev/null 2>&1 ; then
X		voidhave=3
X		echo "And it supports 2 but not 4."
X	    else
X		echo "It doesn't support 2..."
X		if $cc -S -DTRY=5 void.c >/dev/null 2>&1 ; then
X		    voidhave=5
X		    echo "But it supports 4."
X		else
X		    voidhave=1
X		    echo "And it doesn't support 4."
X		fi
X	    fi
X	else
X	    echo "There is no support at all for void."
X	    voidhave=0
X	fi
X    fi
Xesac
Xdflt="$voidhave";
Xrp="Your void support flags add up to what? [$dflt]"
X$echo $n "$rp $c"
X. myread
Xvoidhave="$ans"
X
X: preserve RCS keywords in files with variable substitution, grrr
XLog='$Log'
XHeader='$Header'
XId='$Id'
XAuthor='$Author'
XDate='$Date'
XLocker='$Locker'
XRCSfile='$RCSfile'
XRevision='$Revision'
XSource='$Source'
XState='$State'
X
X
X: determine compiler compiler
Xcase "$yacc" in
X'') if xenix; then
X	dflt=yacc
X    else
X	dflt='yacc -Sm25000'
X    fi
X    ;;
X*)  dflt="$yacc";;
Xesac
Xcont=true
X    echo " "
Xrp="Which compiler compiler (yacc or bison -y) will you use? [$dflt]"
X$echo $n "$rp $c"
X. myread
Xcase "$ans" in
X'') ans="$dflt";;
Xesac
Xyacc="$ans"
X
X: see what type gids are returned by getgroups
Xecho " "
Xcase "$groupstype" in
X'')
X    if $contains 'getgroups.*short' /usr/lib/lint/llib-lc >/dev/null 2>&1; then
X	dflt='short'
X    elif $contains 'getgroups.*int' /usr/lib/lint/llib-lc >/dev/null 2>&1; then
X	dflt='int'
X    elif $contains 'getgroups.*short' /usr/lib/lint/llib-lbsd >/dev/null 2>&1; then
X	dflt='short'
X    elif $contains 'getgroups.*int' /usr/lib/lint/llib-lbsd >/dev/null 2>&1; then
X	dflt='int'
X    elif $contains 'int gidset' /usr/man/man2/getgroups.2 >/dev/null 2>&1 ; then
X	dflt='int'
X    elif $contains 'gid_t;' $usrinclude/sys/types.h >/dev/null 2>&1 ; then
X	dflt='gid_t'
X    else
X	set `grep 'groups\[NGROUPS\];' $usrinclude/sys/user.h 2>/dev/null` unsigned short
X	case $1 in
X	unsigned) dflt="$1 $2" ;;
X	*) dflt="$1" ;;
X	esac
X    fi
X    ;;
X*)  dflt="$groupstype"
X    ;;
Xesac
Xcont=true
Xecho "(The following only matters if you have getgroups().)"
Xrp="What type are the group ids returned by getgroups()? [$dflt]"
X$echo $n "$rp $c"
X. myread
Xgroupstype="$ans"
X
X: see if we can include fcntl.h
Xecho " "
Xif $h_fcntl; then
X    val="$define"
X    echo "We'll be including <fcntl.h>."
Xelse
X    val="$undef"
X    if $h_sys_file; then
X	echo "We don't need to <fcntl.h> if we include <sys/file.h>."
X    else
X	echo "We won't be including <fcntl.h>."
X    fi
Xfi
Xset i_fcntl
Xeval $setvar
X
X: see if gdbm is available
Xecho " "
Xxxx=`./loc gdbm.h x $usrinclude /usr/local/include $inclwanted`
Xif test -f $xxx; then
X    val="$define"
X    echo "gdbm.h found."
Xelse
X    val="$undef"
X    echo "gdbm.h not found."
Xfi
Xset i_gdbm
Xeval $setvar
X
X: see if this is an grp system
Xecho " "
Xif $test -r $usrinclude/grp.h ; then
X    val="$define"
X    echo "grp.h found."
Xelse
X    val="$undef"
X    echo "No grp.h found."
Xfi
Xset i_grp
Xeval $setvar
X
X: see if this is a netinet/in.h or sys/in.h system
Xecho " "
Xxxx=`./loc netinet/in.h x $usrinclude /usr/local/include $inclwanted`
Xif test -f $xxx; then
X    val="$define"
X    val2="$undef"
X    echo "netinet/in.h found."
Xelse
X    val="$undef"
X    echo "No netinet/in.h found, ..."
X    xxx=`./loc sys/in.h x $usrinclude /usr/local/include $inclwanted`
X    if test -f $xxx; then
X	val2="$define"
X	echo "but I found sys/in.h instead."
X    else
X	val2="$undef"
X	echo "and I didn't find sys/in.h either."
X    fi
Xfi
Xset i_niin
Xeval $setvar
Xval=$val2
Xset i_sysin
Xeval $setvar
X
X: Do we need to #include <sys/file.h> ?
Xecho " "
Xif $h_sys_file; then
X    val="$define"
X    echo "We'll be including <sys/file.h>."
Xelse
X    val="$undef"
X    echo "We won't be including <sys/file.h>."
Xfi
Xset i_sys_file
Xeval $setvar
X
X: see if ioctl defs are in sgtty/termio or sys/ioctl
Xecho " "
Xif $test -r $usrinclude/sys/ioctl.h ; then
X    val="$define"
X    echo "sys/ioctl.h found."
Xelse
X    val="$undef"
X    echo "sys/ioctl.h not found, assuming ioctl args are defined in sgtty.h."
Xfi
Xset i_sysioctl
Xeval $setvar
X
X: see if we should include utime.h
Xecho " "
Xif $test -r $usrinclude/utime.h ; then
X    val="$define"
X    echo "utime.h found."
Xelse
X    val="$undef"
X    echo "No utime.h found, but that's ok."
Xfi
Xset i_utime
Xeval $setvar
X
X: see if this is a varargs system
Xecho " "
Xif $test -r $usrinclude/varargs.h ; then
X    val="$define"
X    echo "varargs.h found."
Xelse
X    val="$undef"
X    echo "No varargs.h found, but that's ok (I hope)."
Xfi
Xset i_varargs
Xeval $setvar
X
X: see if this is a vfork system
Xecho " "
Xif $test -r $usrinclude/vfork.h ; then
X    val="$define"
X    echo "vfork.h found."
Xelse
X    val="$undef"
X    echo "No vfork.h found."
Xfi
Xset i_vfork
Xeval $setvar
X
X: end of configuration questions
Xecho " "
Xecho "End of configuration questions."
Xecho " "
X
X: create config.sh file
Xecho " "
Xif test -d ../UU; then
X    cd ..
Xfi
Xecho "Creating config.sh..."
X$spitshell <<EOT >config.sh
X$startsh
X# config.sh
X# This file was produced by running the Configure script.
X
Xd_eunice='$d_eunice'
Xdefine='$define'
Xeunicefix='$eunicefix'
Xloclist='$loclist'
Xexpr='$expr'
Xsed='$sed'
Xecho='$echo'
Xcat='$cat'
Xrm='$rm'
Xmv='$mv'
Xcp='$cp'
Xtail='$tail'
Xtr='$tr'
Xmkdir='$mkdir'
Xsort='$sort'
Xuniq='$uniq'
Xgrep='$grep'
Xtrylist='$trylist'
Xtest='$test'
Xinews='$inews'
Xegrep='$egrep'
Xmore='$more'
Xpg='$pg'
XMcc='$Mcc'
Xvi='$vi'
Xmailx='$mailx'
Xmail='$mail'
Xcpp='$cpp'
Xperl='$perl'
Xemacs='$emacs'
Xls='$ls'
Xrmail='$rmail'
Xsendmail='$sendmail'
Xshar='$shar'
Xsmail='$smail'
Xtbl='$tbl'
Xtroff='$troff'
Xnroff='$nroff'
Xuname='$uname'
Xuuname='$uuname'
Xline='$line'
Xchgrp='$chgrp'
Xchmod='$chmod'
Xlint='$lint'
Xsleep='$sleep'
Xpr='$pr'
Xtar='$tar'
Xln='$ln'
Xlpr='$lpr'
Xlp='$lp'
Xtouch='$touch'
Xmake='$make'
Xdate='$date'
Xcsh='$csh'
Xbash='$bash'
Xksh='$ksh'
Xlex='$lex'
Xflex='$flex'
Xbison='$bison'
XLog='$Log'
XHeader='$Header'
XId='$Id'
Xlastuname='$lastuname'
Xalignbytes='$alignbytes'
Xbin='$bin'
Xinstallbin='$installbin'
Xbyteorder='$byteorder'
Xcontains='$contains'
Xcppstdin='$cppstdin'
Xcppminus='$cppminus'
Xd_bcmp='$d_bcmp'
Xd_bcopy='$d_bcopy'
Xd_bzero='$d_bzero'
Xd_castneg='$d_castneg'
Xcastflags='$castflags'
Xd_charsprf='$d_charsprf'
Xd_chsize='$d_chsize'
Xd_crypt='$d_crypt'
Xcryptlib='$cryptlib'
Xd_csh='$d_csh'
Xd_dosuid='$d_dosuid'
Xd_dup2='$d_dup2'
Xd_fchmod='$d_fchmod'
Xd_fchown='$d_fchown'
Xd_fcntl='$d_fcntl'
Xd_flexfnam='$d_flexfnam'
Xd_flock='$d_flock'
Xd_getgrps='$d_getgrps'
Xd_gethent='$d_gethent'
Xd_getpgrp='$d_getpgrp'
Xd_getpgrp2='$d_getpgrp2'
Xd_getprior='$d_getprior'
Xd_htonl='$d_htonl'
Xd_index='$d_index'
Xd_killpg='$d_killpg'
Xd_lstat='$d_lstat'
Xd_memcmp='$d_memcmp'
Xd_memcpy='$d_memcpy'
Xd_mkdir='$d_mkdir'
Xd_msg='$d_msg'
Xd_msgctl='$d_msgctl'
Xd_msgget='$d_msgget'
Xd_msgrcv='$d_msgrcv'
Xd_msgsnd='$d_msgsnd'
Xd_ndbm='$d_ndbm'
Xd_odbm='$d_odbm'
Xd_open3='$d_open3'
Xd_readdir='$d_readdir'
Xd_rename='$d_rename'
Xd_rmdir='$d_rmdir'
Xd_select='$d_select'
Xd_sem='$d_sem'
Xd_semctl='$d_semctl'
Xd_semget='$d_semget'
Xd_semop='$d_semop'
Xd_setegid='$d_setegid'
Xd_seteuid='$d_seteuid'
Xd_setpgrp='$d_setpgrp'
Xd_setpgrp2='$d_setpgrp2'
Xd_setprior='$d_setprior'
Xd_setregid='$d_setregid'
Xd_setresgid='$d_setresgid'
Xd_setreuid='$d_setreuid'
Xd_setresuid='$d_setresuid'
Xd_setrgid='$d_setrgid'
Xd_setruid='$d_setruid'
Xd_shm='$d_shm'
Xd_shmat='$d_shmat'
Xd_shmctl='$d_shmctl'
Xd_shmdt='$d_shmdt'
Xd_shmget='$d_shmget'
Xd_socket='$d_socket'
Xd_sockpair='$d_sockpair'
Xd_oldsock='$d_oldsock'
Xsocketlib='$socketlib'
Xd_statblks='$d_statblks'
Xd_stdstdio='$d_stdstdio'
Xd_strctcpy='$d_strctcpy'
Xd_strerror='$d_strerror'
Xd_symlink='$d_symlink'
Xd_syscall='$d_syscall'
Xd_truncate='$d_truncate'
Xd_vfork='$d_vfork'
Xd_voidsig='$d_voidsig'
Xd_tosignal='$d_tosignal'
Xd_volatile='$d_volatile'
Xd_vprintf='$d_vprintf'
Xd_charvspr='$d_charvspr'
Xd_wait4='$d_wait4'
Xd_waitpid='$d_waitpid'
Xgidtype='$gidtype'
Xgroupstype='$groupstype'
Xi_fcntl='$i_fcntl'
Xi_gdbm='$i_gdbm'
Xi_grp='$i_grp'
Xi_niin='$i_niin'
Xi_sysin='$i_sysin'
Xi_pwd='$i_pwd'
Xd_pwquota='$d_pwquota'
Xd_pwage='$d_pwage'
Xd_pwchange='$d_pwchange'
Xd_pwclass='$d_pwclass'
Xd_pwexpire='$d_pwexpire'
Xd_pwcomment='$d_pwcomment'
Xi_sys_file='$i_sys_file'
Xi_sysioctl='$i_sysioctl'
Xi_time='$i_time'
Xi_sys_time='$i_sys_time'
Xi_sys_select='$i_sys_select'
Xd_systimekernel='$d_systimekernel'
Xi_utime='$i_utime'
Xi_varargs='$i_varargs'
Xi_vfork='$i_vfork'
Xintsize='$intsize'
Xlibc='$libc'
Xnm_opts='$nm_opts'
Xlibndir='$libndir'
Xi_my_dir='$i_my_dir'
Xi_ndir='$i_ndir'
Xi_sys_ndir='$i_sys_ndir'
Xi_dirent='$i_dirent'
Xi_sys_dir='$i_sys_dir'
Xd_dirnamlen='$d_dirnamlen'
Xndirc='$ndirc'
Xndiro='$ndiro'
Xmallocsrc='$mallocsrc'
Xmallocobj='$mallocobj'
Xusemymalloc='$usemymalloc'
Xmallocptrtype='$mallocptrtype'
Xmansrc='$mansrc'
Xmanext='$manext'
Xmodels='$models'
Xsplit='$split'
Xsmall='$small'
Xmedium='$medium'
Xlarge='$large'
Xhuge='$huge'
Xoptimize='$optimize'
Xccflags='$ccflags'
Xcppflags='$cppflags'
Xldflags='$ldflags'
Xcc='$cc'
Xlibs='$libs'
Xn='$n'
Xc='$c'
Xpackage='$package'
Xrandbits='$randbits'
Xscriptdir='$scriptdir'
Xsig_name='$sig_name'
Xspitshell='$spitshell'
Xshsharp='$shsharp'
Xsharpbang='$sharpbang'
Xstartsh='$startsh'
Xstdchar='$stdchar'
Xuidtype='$uidtype'
Xusrinclude='$usrinclude'
XinclPath='$inclPath'
Xvoid='$void'
Xvoidhave='$voidhave'
Xvoidwant='$voidwant'
Xw_localtim='$w_localtim'
Xw_s_timevl='$w_s_timevl'
Xw_s_tm='$w_s_tm'
Xyacc='$yacc'
Xlib='$lib'
Xprivlib='$privlib'
Xinstallprivlib='$installprivlib'
XCONFIG=true
XEOT
X
X: Finish up
XCONFIG=true
X
Xecho " "
Xtest -f patchlevel.h && awk '{printf "%s=%s\n",$2,$3}' patchlevel.h >>config.sh
Xdflt=''
Xfastread=''
Xecho "If you didn't make any mistakes, then just type a carriage return here."
Xrp="If you need to edit config.sh, do it as a shell escape here:"
X$echo $n "$rp $c"
X. UU/myread
Xcase "$ans" in
X'') ;;
X*) : in case they cannot read
X    eval $ans;;
Xesac
X: if this fails, just run all the .SH files by hand
X. ./config.sh
X
Xecho " "
Xecho "Doing variable substitutions on .SH files..."
Xset x `awk '{print $1}' <MANIFEST | $grep '\.SH'`
Xshift
Xcase $# in
X0) set x *.SH; shift;;
Xesac
Xif test ! -f $1; then
X    shift
Xfi
Xfor file in $*; do
X    set X
X    shift
X    chmod +x $file
X    case "$file" in
X    */*)
X	dir=`$expr X$file : 'X\(.*\)/'`
X	file=`$expr X$file : 'X.*/\(.*\)'`
X	(cd $dir && . $file)
X	;;
X    *)
X	. $file
X	;;
X    esac
Xdone
Xif test -f config.h.SH; then
X    if test ! -f config.h; then
X	: oops, they left it out of MANIFEST, probably, so do it anyway.
X	. config.h.SH
X    fi
Xfi
X
Xif $contains '^depend:' [Mm]akefile >/dev/null 2>&1; then
X    dflt=n
X    $cat <<EOM
X
XNow you need to generate make dependencies by running "make depend".
XYou might prefer to run it in background: "make depend > makedepend.out &"
XIt can take a while, so you might not want to run it right now.
X
XEOM
X    rp="Run make depend now? [$dflt]"
X    $echo $n "$rp $c"
X    . UU/myread
X    case "$ans" in
X    y*) make depend && echo "Now you must run a make."
X	;;
X    *)  echo "You must run 'make depend' then 'make'."
X	;;
X    esac
Xelif test -f [Mm]akefile; then
X    echo " "
X    echo "Now you must run a make."
Xelse
X    echo "Done."
Xfi
X
X$rm -f kit*isdone
Xcd .. && $rm -rf UU
X: end of Configure
!STUFFY!FUNK!
echo Extracting usub/curses.mus
sed >usub/curses.mus <<'!STUFFY!FUNK!' -e 's/X//'
X/* $Header: curses.mus,v 4.0 91/03/20 01:56:13 lwall Locked $
X *
X * $Log:	curses.mus,v $
X * Revision 4.0  91/03/20  01:56:13  lwall
X * 4.0 baseline.
X * 
X * Revision 3.0.1.1  90/08/09  04:05:21  lwall
X * patch19: Initial revision
X * 
X */
X
X#include "EXTERN.h"
X#include "perl.h"
Xextern int wantarray;
X
Xchar *savestr();
X
X#include <curses.h>
X
Xstatic enum uservars {
X    UV_curscr,
X    UV_stdscr,
X    UV_Def_term,
X    UV_My_term,
X    UV_ttytype,
X    UV_LINES,
X    UV_COLS,
X    UV_ERR,
X    UV_OK,
X};
X
Xstatic enum usersubs {
X    US_addch,
X    US_waddch,
X    US_addstr,
X    US_waddstr,
X    US_box,
X    US_clear,
X    US_wclear,
X    US_clearok,
X    US_clrtobot,
X    US_wclrtobot,
X    US_clrtoeol,
X    US_wclrtoeol,
X    US_delch,
X    US_wdelch,
X    US_deleteln,
X    US_wdeleteln,
X    US_erase,
X    US_werase,
X    US_flushok,
X    US_idlok,
X    US_insch,
X    US_winsch,
X    US_insertln,
X    US_winsertln,
X    US_move,
X    US_wmove,
X    US_overlay,
X    US_overwrite,
X    US_printw,
X    US_wprintw,
X    US_refresh,
X    US_wrefresh,
X    US_standout,
X    US_wstandout,
X    US_standend,
X    US_wstandend,
X    US_cbreak,
X    US_nocbreak,
X    US_echo,
X    US_noecho,
X    US_getch,
X    US_wgetch,
X    US_getstr,
X    US_wgetstr,
X    US_raw,
X    US_noraw,
X    US_scanw,
X    US_wscanw,
X    US_baudrate,
X    US_delwin,
X    US_endwin,
X    US_erasechar,
X    US_getcap,
X    US_getyx,
X    US_inch,
X    US_winch,
X    US_initscr,
X    US_killchar,
X    US_leaveok,
X    US_longname,
X    US_fullname,
X    US_mvwin,
X    US_newwin,
X    US_nl,
X    US_nonl,
X    US_scrollok,
X    US_subwin,
X    US_touchline,
X    US_touchoverlap,
X    US_touchwin,
X    US_unctrl,
X    US_gettmode,
X    US_mvcur,
X    US_scroll,
X    US_savetty,
X    US_resetty,
X    US_setterm,
X    US_tstp,
X    US__putchar,
X};
X
Xstatic int usersub();
Xstatic int userset();
Xstatic int userval();
X
Xint
Xinit_curses()
X{
X    struct ufuncs uf;
X    char *filename = "curses.c";
X
X    uf.uf_set = userset;
X    uf.uf_val = userval;
X
X#define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
X
X    MAGICVAR("curscr",	UV_curscr);
X    MAGICVAR("stdscr",	UV_stdscr);
X    MAGICVAR("Def_term",UV_Def_term);
X    MAGICVAR("My_term",	UV_My_term);
X    MAGICVAR("ttytype",	UV_ttytype);
X    MAGICVAR("LINES",	UV_LINES);
X    MAGICVAR("COLS",	UV_COLS);
X    MAGICVAR("ERR",	UV_ERR);
X    MAGICVAR("OK",	UV_OK);
X
X    make_usub("addch",		US_addch,	usersub, filename);
X    make_usub("waddch",		US_waddch,	usersub, filename);
X    make_usub("addstr",		US_addstr,	usersub, filename);
X    make_usub("waddstr",	US_waddstr,	usersub, filename);
X    make_usub("box",		US_box,		usersub, filename);
X    make_usub("clear",		US_clear,	usersub, filename);
X    make_usub("wclear",		US_wclear,	usersub, filename);
X    make_usub("clearok",	US_clearok,	usersub, filename);
X    make_usub("clrtobot",	US_clrtobot,	usersub, filename);
X    make_usub("wclrtobot",	US_wclrtobot,	usersub, filename);
X    make_usub("clrtoeol",	US_clrtoeol,	usersub, filename);
X    make_usub("wclrtoeol",	US_wclrtoeol,	usersub, filename);
X    make_usub("delch",		US_delch,	usersub, filename);
X    make_usub("wdelch",		US_wdelch,	usersub, filename);
X    make_usub("deleteln",	US_deleteln,	usersub, filename);
X    make_usub("wdeleteln",	US_wdeleteln,	usersub, filename);
X    make_usub("erase",		US_erase,	usersub, filename);
X    make_usub("werase",		US_werase,	usersub, filename);
X    make_usub("flushok",	US_flushok,	usersub, filename);
X    make_usub("idlok",		US_idlok,	usersub, filename);
X    make_usub("insch",		US_insch,	usersub, filename);
X    make_usub("winsch",		US_winsch,	usersub, filename);
X    make_usub("insertln",	US_insertln,	usersub, filename);
X    make_usub("winsertln",	US_winsertln,	usersub, filename);
X    make_usub("move",		US_move,	usersub, filename);
X    make_usub("wmove",		US_wmove,	usersub, filename);
X    make_usub("overlay",	US_overlay,	usersub, filename);
X    make_usub("overwrite",	US_overwrite,	usersub, filename);
X    make_usub("printw",		US_printw,	usersub, filename);
X    make_usub("wprintw",	US_wprintw,	usersub, filename);
X    make_usub("refresh",	US_refresh,	usersub, filename);
X    make_usub("wrefresh",	US_wrefresh,	usersub, filename);
X    make_usub("standout",	US_standout,	usersub, filename);
X    make_usub("wstandout",	US_wstandout,	usersub, filename);
X    make_usub("standend",	US_standend,	usersub, filename);
X    make_usub("wstandend",	US_wstandend,	usersub, filename);
X    make_usub("cbreak",		US_cbreak,	usersub, filename);
X    make_usub("nocbreak",	US_nocbreak,	usersub, filename);
X    make_usub("echo",		US_echo,	usersub, filename);
X    make_usub("noecho",		US_noecho,	usersub, filename);
X    make_usub("getch",		US_getch,	usersub, filename);
X    make_usub("wgetch",		US_wgetch,	usersub, filename);
X    make_usub("getstr",		US_getstr,	usersub, filename);
X    make_usub("wgetstr",	US_wgetstr,	usersub, filename);
X    make_usub("raw",		US_raw,		usersub, filename);
X    make_usub("noraw",		US_noraw,	usersub, filename);
X    make_usub("scanw",		US_scanw,	usersub, filename);
X    make_usub("wscanw",		US_wscanw,	usersub, filename);
X    make_usub("baudrate",	US_baudrate,	usersub, filename);
X    make_usub("delwin",		US_delwin,	usersub, filename);
X    make_usub("endwin",		US_endwin,	usersub, filename);
X    make_usub("erasechar",	US_erasechar,	usersub, filename);
X    make_usub("getcap",		US_getcap,	usersub, filename);
X    make_usub("getyx",		US_getyx,	usersub, filename);
X    make_usub("inch",		US_inch,	usersub, filename);
X    make_usub("winch",		US_winch,	usersub, filename);
X    make_usub("initscr",	US_initscr,	usersub, filename);
X    make_usub("killchar",	US_killchar,	usersub, filename);
X    make_usub("leaveok",	US_leaveok,	usersub, filename);
X    make_usub("longname",	US_longname,	usersub, filename);
X    make_usub("fullname",	US_fullname,	usersub, filename);
X    make_usub("mvwin",		US_mvwin,	usersub, filename);
X    make_usub("newwin",		US_newwin,	usersub, filename);
X    make_usub("nl",		US_nl,		usersub, filename);
X    make_usub("nonl",		US_nonl,	usersub, filename);
X    make_usub("scrollok",	US_scrollok,	usersub, filename);
X    make_usub("subwin",		US_subwin,	usersub, filename);
X    make_usub("touchline",	US_touchline,	usersub, filename);
X    make_usub("touchoverlap",	US_touchoverlap,usersub, filename);
X    make_usub("touchwin",	US_touchwin,	usersub, filename);
X    make_usub("unctrl",		US_unctrl,	usersub, filename);
X    make_usub("gettmode",	US_gettmode,	usersub, filename);
X    make_usub("mvcur",		US_mvcur,	usersub, filename);
X    make_usub("scroll",		US_scroll,	usersub, filename);
X    make_usub("savetty",	US_savetty,	usersub, filename);
X    make_usub("resetty",	US_resetty,	usersub, filename);
X    make_usub("setterm",	US_setterm,	usersub, filename);
X    make_usub("tstp",		US_tstp,	usersub, filename);
X    make_usub("_putchar",	US__putchar,	usersub, filename);
X};
X
Xstatic int
Xusersub(ix, sp, items)
Xint ix;
Xregister int sp;
Xregister int items;
X{
X    STR **st = stack->ary_array + sp;
X    register int i;
X    register char *tmps;
X    register STR *Str;		/* used in str_get and str_gnum macros */
X
X    switch (ix) {
XCASE int addch
XI	char		ch
XEND
X
XCASE int waddch
XI	WINDOW*		win
XI	char		ch
XEND
X
XCASE int addstr
XI	char*		str
XEND
X
XCASE int waddstr
XI	WINDOW*		win
XI	char*		str
XEND
X
XCASE int box
XI	WINDOW*		win
XI	char		vert
XI	char		hor
XEND
X
XCASE int clear
XEND
X
XCASE int wclear
XI	WINDOW*		win
XEND
X
XCASE int clearok
XI	WINDOW*		win
XI	bool		boolf
XEND
X
XCASE int clrtobot
XEND
X
XCASE int wclrtobot
XI	WINDOW*		win
XEND
X
XCASE int clrtoeol
XEND
X
XCASE int wclrtoeol
XI	WINDOW*		win
XEND
X
XCASE int delch
XEND
X
XCASE int wdelch
XI	WINDOW*		win
XEND
X
XCASE int deleteln
XEND
X
XCASE int wdeleteln
XI	WINDOW*		win
XEND
X
XCASE int erase
XEND
X
XCASE int werase
XI	WINDOW*		win
XEND
X
XCASE int flushok
XI	WINDOW*		win
XI	bool		boolf
XEND
X
XCASE int idlok
XI	WINDOW*		win
XI	bool		boolf
XEND
X
XCASE int insch
XI	char		c
XEND
X
XCASE int winsch
XI	WINDOW*		win
XI	char		c
XEND
X
XCASE int insertln
XEND
X
XCASE int winsertln
XI	WINDOW*		win
XEND
X
XCASE int move
XI	int		y
XI	int		x
XEND
X
XCASE int wmove
XI	WINDOW*		win
XI	int		y
XI	int		x
XEND
X
XCASE int overlay
XI	WINDOW*		win1
XI	WINDOW*		win2
XEND
X
XCASE int overwrite
XI	WINDOW*		win1
XI	WINDOW*		win2
XEND
X
X    case US_printw:
X	if (items < 1)
X	    fatal("Usage: &printw($fmt, $arg1, $arg2, ... )");
X	else {
X	    int retval;
X	    STR*	str =		str_new(0);
X
X	    do_sprintf(str, items - 1, st + 1);
X	    retval = addstr(str->str_ptr);
X	    str_numset(st[0], (double) retval);
X	    str_free(str);
X	}
X	return sp;
X
X    case US_wprintw:
X	if (items < 2)
X	    fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )");
X	else {
X	    int retval;
X	    STR*	str =		str_new(0);
X	    WINDOW*	win =		*(WINDOW**)	str_get(st[1]);
X
X	    do_sprintf(str, items - 1, st + 1);
X	    retval = waddstr(win, str->str_ptr);
X	    str_numset(st[0], (double) retval);
X	    str_free(str);
X	}
X	return sp;
X
XCASE int refresh
XEND
X
XCASE int wrefresh
XI	WINDOW*		win
XEND
X
XCASE int standout
XEND
X
XCASE int wstandout
XI	WINDOW*		win
XEND
X
XCASE int standend
XEND
X
XCASE int wstandend
XI	WINDOW*		win
XEND
X
XCASE int cbreak
XEND
X
XCASE int nocbreak
XEND
X
XCASE int echo
XEND
X
XCASE int noecho
XEND
X
X    case US_getch:
X        if (items != 0)
X            fatal("Usage: &getch()");
X        else {
X            int retval;
X	    char retch;
X
X            retval = getch();
X	    if (retval == EOF)
X		st[0] = &str_undef;
X	    else {
X		retch = retval;
X		str_nset(st[0], &retch, 1);
X	    }
X        }
X        return sp;
X
X    case US_wgetch:
X        if (items != 1)
X            fatal("Usage: &wgetch($win)");
X        else {
X            int retval;
X	    char retch;
X            WINDOW*     win =           *(WINDOW**)     str_get(st[1]);
X
X            retval = wgetch(win);
X	    if (retval == EOF)
X		st[0] = &str_undef;
X	    else {
X		retch = retval;
X		str_nset(st[0], &retch, 1);
X	    }
X        }
X        return sp;
X
XCASE int getstr
XIO	char*		str
XEND
X
XCASE int wgetstr
XI	WINDOW*		win
XIO	char*		str
XEND
X
XCASE int raw
XEND
X
XCASE int noraw
XEND
X
XCASE int baudrate
XEND
X
XCASE int delwin
XI	WINDOW*		win
XEND
X
XCASE int endwin
XEND
X
XCASE int erasechar
XEND
X
XCASE char* getcap
XI	char*		str
XEND
X
X    case US_getyx:
X	if (items != 3)
X	    fatal("Usage: &getyx($win, $y, $x)");
X	else {
X	    int retval;
X	    STR*	str =		str_new(0);
X	    WINDOW*	win =		*(WINDOW**)	str_get(st[1]);
X	    int		y;
X	    int		x;
X
X	    do_sprintf(str, items - 1, st + 1);
X	    retval = getyx(win, y, x);
X	    str_numset(st[2], (double)y);
X	    str_numset(st[3], (double)x);
X	    str_numset(st[0], (double) retval);
X	    str_free(str);
X	}
X	return sp;
X
X	
XCASE int inch
XEND
X
XCASE int winch
XI	WINDOW*		win
XEND
X
XCASE WINDOW* initscr
XEND
X
XCASE int killchar
XEND
X
XCASE int leaveok
XI	WINDOW*		win
XI	bool		boolf
XEND
X
XCASE char* longname
XI	char*		termbuf
XIO	char*		name
XEND
X
XCASE int fullname
XI	char*		termbuf
XIO	char*		name
XEND
X
XCASE int mvwin
XI	WINDOW*		win
XI	int		y
XI	int		x
XEND
X
XCASE WINDOW* newwin
XI	int		lines
XI	int		cols
XI	int		begin_y
XI	int		begin_x
XEND
X
XCASE int nl
XEND
X
XCASE int nonl
XEND
X
XCASE int scrollok
XI	WINDOW*		win
XI	bool		boolf
XEND
X
XCASE WINDOW* subwin
XI	WINDOW*		win
XI	int		lines
XI	int		cols
XI	int		begin_y
XI	int		begin_x
XEND
X
XCASE int touchline
XI	WINDOW*		win
XI	int		y
XI	int		startx
XI	int		endx
XEND
X
XCASE int touchoverlap
XI	WINDOW*		win1
XI	WINDOW*		win2
XEND
X
XCASE int touchwin
XI	WINDOW*		win
XEND
X
XCASE char* unctrl
XI	char		ch
XEND
X
XCASE int gettmode
XEND
X
XCASE int mvcur
XI	int		lasty
XI	int		lastx
XI	int		newy
XI	int		newx
XEND
X
XCASE int scroll
XI	WINDOW*		win
XEND
X
XCASE int savetty
XEND
X
XCASE void resetty
XEND
X
XCASE int setterm
XI	char*		name
XEND
X
XCASE int tstp
XEND
X
XCASE int _putchar
XI	char		ch
XEND
X
X    default:
X	fatal("Unimplemented user-defined subroutine");
X    }
X    return sp;
X}
X
Xstatic int
Xuserval(ix, str)
Xint ix;
XSTR *str;
X{
X    switch (ix) {
X    case UV_COLS:
X	str_numset(str, (double)COLS);
X	break;
X    case UV_Def_term:
X	str_set(str, Def_term);
X	break;
X    case UV_ERR:
X	str_numset(str, (double)ERR);
X	break;
X    case UV_LINES:
X	str_numset(str, (double)LINES);
X	break;
X    case UV_My_term:
X	str_numset(str, (double)My_term);
X	break;
X    case UV_OK:
X	str_numset(str, (double)OK);
X	break;
X    case UV_curscr:
X	str_nset(str, &curscr, sizeof(WINDOW*));
X	break;
X    case UV_stdscr:
X	str_nset(str, &stdscr, sizeof(WINDOW*));
X	break;
X    case UV_ttytype:
X	str_set(str, ttytype);
X	break;
X    }
X    return 0;
X}
X
Xstatic int
Xuserset(ix, str)
Xint ix;
XSTR *str;
X{
X    switch (ix) {
X    case UV_COLS:
X	COLS = (int)str_gnum(str);
X	break;
X    case UV_Def_term:
X	Def_term = savestr(str_get(str));	/* never freed */
X	break;
X    case UV_LINES:
X	LINES = (int)str_gnum(str);
X	break;
X    case UV_My_term:
X	My_term = (bool)str_gnum(str);
X	break;
X    case UV_ttytype:
X	strcpy(ttytype, str_get(str));		/* hope it fits */
X	break;
X    }
X    return 0;
X}
!STUFFY!FUNK!
echo Extracting t/op/delete.t
sed >t/op/delete.t <<'!STUFFY!FUNK!' -e 's/X//'
X#!./perl
X
X# $Header: delete.t,v 4.0 91/03/20 01:51:56 lwall Locked $
X
Xprint "1..6\n";
X
X$foo{1} = 'a';
X$foo{2} = 'b';
X$foo{3} = 'c';
X
X$foo = delete $foo{2};
X
Xif ($foo eq 'b') {print "ok 1\n";} else {print "not ok 1 $foo\n";}
Xif ($foo{2} eq '') {print "ok 2\n";} else {print "not ok 2 $foo{2}\n";}
Xif ($foo{1} eq 'a') {print "ok 3\n";} else {print "not ok 3\n";}
Xif ($foo{3} eq 'c') {print "ok 4\n";} else {print "not ok 4\n";}
X
X$foo = join('',values(foo));
Xif ($foo eq 'ac' || $foo eq 'ca') {print "ok 5\n";} else {print "not ok 5\n";}
X
Xforeach $key (keys foo) {
X    delete $foo{$key};
X}
X
X$foo{'foo'} = 'x';
X$foo{'bar'} = 'y';
X
X$foo = join('',values(foo));
Xif ($foo eq 'xy' || $foo eq 'yx') {print "ok 6\n";} else {print "not ok 6\n";}
!STUFFY!FUNK!
echo " "
echo "End of kit 14 (of 36)"
cat /dev/null >kit14isdone
run=''
config=''
for iskit in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36; do
    if test -f kit${iskit}isdone; then
	run="$run $iskit"
    else
	todo="$todo $iskit"
    fi
done
case $todo in
    '')
	echo "You have run all your kits.  Please read README and then type Configure."
	for combo in *:AA; do
	    if test -f "$combo"; then
		realfile=`basename $combo :AA`
		cat $realfile:[A-Z][A-Z] >$realfile
		rm -rf $realfile:[A-Z][A-Z]
	    fi
	done
	rm -rf kit*isdone
	chmod 755 Configure
	;;
    *)  echo "You have run$run."
	echo "You still need to run$todo."
	;;
esac
: Someone might mail this, so...
exit

exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.