]> git.saurik.com Git - apple/shell_cmds.git/commitdiff
shell_cmds-17.1.tar.gz mac-os-x-100 mac-os-x-1004 v17.1
authorApple <opensource@apple.com>
Tue, 10 Apr 2001 15:59:39 +0000 (15:59 +0000)
committerApple <opensource@apple.com>
Tue, 10 Apr 2001 15:59:39 +0000 (15:59 +0000)
388 files changed:
Makefile [new file with mode: 0644]
Makefile.postamble [new file with mode: 0644]
Makefile.preamble [new file with mode: 0644]
PB.project [new file with mode: 0644]
PROJECT [new file with mode: 0644]
apply/Makefile [new file with mode: 0644]
apply/Makefile.postamble [new file with mode: 0644]
apply/Makefile.preamble [new file with mode: 0644]
apply/PB.project [new file with mode: 0644]
apply/apply.1 [new file with mode: 0644]
apply/apply.c [new file with mode: 0644]
basename/Makefile [new file with mode: 0644]
basename/Makefile.postamble [new file with mode: 0644]
basename/Makefile.preamble [new file with mode: 0644]
basename/PB.project [new file with mode: 0644]
basename/basename.1 [new file with mode: 0644]
basename/basename.c [new file with mode: 0644]
basename/dirname.1 [new file with mode: 0644]
chroot/Makefile [new file with mode: 0644]
chroot/Makefile.postamble [new file with mode: 0644]
chroot/Makefile.preamble [new file with mode: 0644]
chroot/PB.project [new file with mode: 0644]
chroot/chroot.8 [new file with mode: 0644]
chroot/chroot.c [new file with mode: 0644]
date/Makefile [new file with mode: 0644]
date/Makefile.postamble [new file with mode: 0644]
date/Makefile.preamble [new file with mode: 0644]
date/PB.project [new file with mode: 0644]
date/date.1 [new file with mode: 0644]
date/date.c [new file with mode: 0644]
date/extern.h [new file with mode: 0644]
date/netdate.c [new file with mode: 0644]
dirname/Makefile [new file with mode: 0644]
dirname/Makefile.postamble [new file with mode: 0644]
dirname/Makefile.preamble [new file with mode: 0644]
dirname/PB.project [new file with mode: 0644]
dirname/dirname.c [new file with mode: 0644]
echo/Makefile [new file with mode: 0644]
echo/Makefile.postamble [new file with mode: 0644]
echo/Makefile.preamble [new file with mode: 0644]
echo/PB.project [new file with mode: 0644]
echo/echo.1 [new file with mode: 0644]
echo/echo.c [new file with mode: 0644]
env/Makefile [new file with mode: 0644]
env/Makefile.postamble [new file with mode: 0644]
env/Makefile.preamble [new file with mode: 0644]
env/PB.project [new file with mode: 0644]
env/env.1 [new file with mode: 0644]
env/env.c [new file with mode: 0644]
expr/Makefile [new file with mode: 0644]
expr/Makefile.postamble [new file with mode: 0644]
expr/Makefile.preamble [new file with mode: 0644]
expr/PB.project [new file with mode: 0644]
expr/expr.1 [new file with mode: 0644]
expr/expr.c [new file with mode: 0644]
false/Makefile [new file with mode: 0644]
false/Makefile.postamble [new file with mode: 0644]
false/Makefile.preamble [new file with mode: 0644]
false/PB.project [new file with mode: 0644]
false/false.1 [new file with mode: 0644]
false/false.c [new file with mode: 0644]
find/Makefile [new file with mode: 0644]
find/Makefile.postamble [new file with mode: 0644]
find/Makefile.preamble [new file with mode: 0644]
find/PB.project [new file with mode: 0644]
find/extern.h [new file with mode: 0644]
find/find.1 [new file with mode: 0644]
find/find.c [new file with mode: 0644]
find/find.h [new file with mode: 0644]
find/function.c [new file with mode: 0644]
find/ls.c [new file with mode: 0644]
find/main.c [new file with mode: 0644]
find/misc.c [new file with mode: 0644]
find/operator.c [new file with mode: 0644]
find/option.c [new file with mode: 0644]
getopt/Makefile [new file with mode: 0644]
getopt/Makefile.postamble [new file with mode: 0644]
getopt/Makefile.preamble [new file with mode: 0644]
getopt/PB.project [new file with mode: 0644]
getopt/getopt.1 [new file with mode: 0644]
getopt/getopt.c [new file with mode: 0644]
hostname/Makefile [new file with mode: 0644]
hostname/Makefile.postamble [new file with mode: 0644]
hostname/Makefile.preamble [new file with mode: 0644]
hostname/PB.project [new file with mode: 0644]
hostname/hostname.1 [new file with mode: 0644]
hostname/hostname.c [new file with mode: 0644]
id/Makefile [new file with mode: 0644]
id/Makefile.postamble [new file with mode: 0644]
id/Makefile.preamble [new file with mode: 0644]
id/PB.project [new file with mode: 0644]
id/groups.1 [new file with mode: 0644]
id/id.1 [new file with mode: 0644]
id/id.c [new file with mode: 0644]
id/whoami.1 [new file with mode: 0644]
jot/Makefile [new file with mode: 0644]
jot/Makefile.postamble [new file with mode: 0644]
jot/Makefile.preamble [new file with mode: 0644]
jot/PB.project [new file with mode: 0644]
jot/jot.1 [new file with mode: 0644]
jot/jot.c [new file with mode: 0644]
kill/Makefile [new file with mode: 0644]
kill/Makefile.postamble [new file with mode: 0644]
kill/Makefile.preamble [new file with mode: 0644]
kill/PB.project [new file with mode: 0644]
kill/kill.1 [new file with mode: 0644]
kill/kill.c [new file with mode: 0644]
lastcomm/Makefile [new file with mode: 0644]
lastcomm/Makefile.postamble [new file with mode: 0644]
lastcomm/Makefile.preamble [new file with mode: 0644]
lastcomm/PB.project [new file with mode: 0644]
lastcomm/lastcomm.1 [new file with mode: 0644]
lastcomm/lastcomm.c [new file with mode: 0644]
lastcomm/pathnames.h [new file with mode: 0644]
locate/Makefile [new file with mode: 0644]
locate/Makefile.postamble [new file with mode: 0644]
locate/Makefile.preamble [new file with mode: 0644]
locate/PB.project [new file with mode: 0644]
locate/bigram/Makefile [new file with mode: 0644]
locate/bigram/Makefile.postamble [new file with mode: 0644]
locate/bigram/Makefile.preamble [new file with mode: 0644]
locate/bigram/PB.project [new file with mode: 0644]
locate/bigram/locate.bigram.c [new file with mode: 0644]
locate/code/Makefile [new file with mode: 0644]
locate/code/Makefile.postamble [new file with mode: 0644]
locate/code/Makefile.preamble [new file with mode: 0644]
locate/code/PB.project [new file with mode: 0644]
locate/code/locate.code.c [new file with mode: 0644]
locate/locate/Makefile [new file with mode: 0644]
locate/locate/Makefile.postamble [new file with mode: 0644]
locate/locate/Makefile.preamble [new file with mode: 0644]
locate/locate/PB.project [new file with mode: 0644]
locate/locate/locate.1 [new file with mode: 0644]
locate/locate/locate.c [new file with mode: 0644]
locate/locate/locate.h [new file with mode: 0644]
locate/locate/pathnames.h [new file with mode: 0644]
locate/locate/updatedb.csh [new file with mode: 0644]
logname/Makefile [new file with mode: 0644]
logname/Makefile.postamble [new file with mode: 0644]
logname/Makefile.preamble [new file with mode: 0644]
logname/PB.project [new file with mode: 0644]
logname/logname.1 [new file with mode: 0644]
logname/logname.c [new file with mode: 0644]
nice/Makefile [new file with mode: 0644]
nice/Makefile.postamble [new file with mode: 0644]
nice/Makefile.preamble [new file with mode: 0644]
nice/PB.project [new file with mode: 0644]
nice/nice.1 [new file with mode: 0644]
nice/nice.c [new file with mode: 0644]
nohup/Makefile [new file with mode: 0644]
nohup/Makefile.postamble [new file with mode: 0644]
nohup/Makefile.preamble [new file with mode: 0644]
nohup/PB.project [new file with mode: 0644]
nohup/nohup.1 [new file with mode: 0644]
nohup/nohup.c [new file with mode: 0644]
printenv/Makefile [new file with mode: 0644]
printenv/Makefile.postamble [new file with mode: 0644]
printenv/Makefile.preamble [new file with mode: 0644]
printenv/PB.project [new file with mode: 0644]
printenv/printenv.1 [new file with mode: 0644]
printenv/printenv.c [new file with mode: 0644]
printf/Makefile [new file with mode: 0644]
printf/Makefile.postamble [new file with mode: 0644]
printf/Makefile.preamble [new file with mode: 0644]
printf/PB.project [new file with mode: 0644]
printf/printf.1 [new file with mode: 0644]
printf/printf.c [new file with mode: 0644]
pwd/Makefile [new file with mode: 0644]
pwd/Makefile.postamble [new file with mode: 0644]
pwd/Makefile.preamble [new file with mode: 0644]
pwd/PB.project [new file with mode: 0644]
pwd/pwd.1 [new file with mode: 0644]
pwd/pwd.c [new file with mode: 0644]
renice/Makefile [new file with mode: 0644]
renice/Makefile.postamble [new file with mode: 0644]
renice/Makefile.preamble [new file with mode: 0644]
renice/PB.project [new file with mode: 0644]
renice/renice.8 [new file with mode: 0644]
renice/renice.c [new file with mode: 0644]
script/Makefile [new file with mode: 0644]
script/Makefile.postamble [new file with mode: 0644]
script/Makefile.preamble [new file with mode: 0644]
script/PB.project [new file with mode: 0644]
script/script.1 [new file with mode: 0644]
script/script.c [new file with mode: 0644]
shlock/Makefile [new file with mode: 0644]
shlock/Makefile.postamble [new file with mode: 0644]
shlock/Makefile.preamble [new file with mode: 0644]
shlock/PB.project [new file with mode: 0644]
shlock/shlock.1 [new file with mode: 0644]
shlock/shlock.c [new file with mode: 0644]
sleep/Makefile [new file with mode: 0644]
sleep/Makefile.postamble [new file with mode: 0644]
sleep/Makefile.preamble [new file with mode: 0644]
sleep/PB.project [new file with mode: 0644]
sleep/sleep.1 [new file with mode: 0644]
sleep/sleep.c [new file with mode: 0644]
su/Makefile [new file with mode: 0644]
su/Makefile.postamble [new file with mode: 0644]
su/Makefile.preamble [new file with mode: 0644]
su/PB.project [new file with mode: 0644]
su/su.1 [new file with mode: 0644]
su/su.c [new file with mode: 0644]
tee/Makefile [new file with mode: 0644]
tee/Makefile.postamble [new file with mode: 0644]
tee/Makefile.preamble [new file with mode: 0644]
tee/PB.project [new file with mode: 0644]
tee/tee.1 [new file with mode: 0644]
tee/tee.c [new file with mode: 0644]
test/Makefile [new file with mode: 0644]
test/Makefile.postamble [new file with mode: 0644]
test/Makefile.preamble [new file with mode: 0644]
test/PB.project [new file with mode: 0644]
test/TEST.csh [new file with mode: 0644]
test/[.1 [new file with mode: 0644]
test/test.1 [new file with mode: 0644]
test/test.c [new file with mode: 0644]
time/Makefile [new file with mode: 0644]
time/Makefile.postamble [new file with mode: 0644]
time/Makefile.preamble [new file with mode: 0644]
time/PB.project [new file with mode: 0644]
time/time.1 [new file with mode: 0644]
time/time.c [new file with mode: 0644]
true/Makefile [new file with mode: 0644]
true/Makefile.postamble [new file with mode: 0644]
true/Makefile.preamble [new file with mode: 0644]
true/PB.project [new file with mode: 0644]
true/true.1 [new file with mode: 0644]
true/true.c [new file with mode: 0644]
uname/Makefile [new file with mode: 0644]
uname/Makefile.postamble [new file with mode: 0644]
uname/Makefile.preamble [new file with mode: 0644]
uname/PB.project [new file with mode: 0644]
uname/uname.1 [new file with mode: 0644]
uname/uname.c [new file with mode: 0644]
users/Makefile [new file with mode: 0644]
users/Makefile.postamble [new file with mode: 0644]
users/Makefile.preamble [new file with mode: 0644]
users/PB.project [new file with mode: 0644]
users/users.1 [new file with mode: 0644]
users/users.c [new file with mode: 0644]
w/Makefile [new file with mode: 0644]
w/Makefile.postamble [new file with mode: 0644]
w/Makefile.preamble [new file with mode: 0644]
w/PB.project [new file with mode: 0644]
w/extern.h [new file with mode: 0644]
w/fmt.c [new file with mode: 0644]
w/pr_time.c [new file with mode: 0644]
w/proc_compare.c [new file with mode: 0644]
w/uptime.1 [new file with mode: 0644]
w/w.1 [new file with mode: 0644]
w/w.c [new file with mode: 0644]
whereis/Makefile [new file with mode: 0644]
whereis/Makefile.postamble [new file with mode: 0644]
whereis/Makefile.preamble [new file with mode: 0644]
whereis/PB.project [new file with mode: 0644]
whereis/whereis.1 [new file with mode: 0644]
whereis/whereis.c [new file with mode: 0644]
which/Makefile [new file with mode: 0644]
which/Makefile.postamble [new file with mode: 0644]
which/Makefile.preamble [new file with mode: 0644]
which/PB.project [new file with mode: 0644]
which/which.1 [new file with mode: 0644]
which/which.csh [new file with mode: 0644]
who/Makefile [new file with mode: 0644]
who/Makefile.postamble [new file with mode: 0644]
who/Makefile.preamble [new file with mode: 0644]
who/PB.project [new file with mode: 0644]
who/who.1 [new file with mode: 0644]
who/who.c [new file with mode: 0644]
window/Makefile [new file with mode: 0644]
window/Makefile.postamble [new file with mode: 0644]
window/Makefile.preamble [new file with mode: 0644]
window/PB.project [new file with mode: 0644]
window/README [new file with mode: 0644]
window/alias.h [new file with mode: 0644]
window/char.c [new file with mode: 0644]
window/char.h [new file with mode: 0644]
window/cmd.c [new file with mode: 0644]
window/cmd1.c [new file with mode: 0644]
window/cmd2.c [new file with mode: 0644]
window/cmd3.c [new file with mode: 0644]
window/cmd4.c [new file with mode: 0644]
window/cmd5.c [new file with mode: 0644]
window/cmd6.c [new file with mode: 0644]
window/cmd7.c [new file with mode: 0644]
window/compress.c [new file with mode: 0644]
window/context.c [new file with mode: 0644]
window/context.h [new file with mode: 0644]
window/defs.h [new file with mode: 0644]
window/error.c [new file with mode: 0644]
window/lcmd.c [new file with mode: 0644]
window/lcmd.h [new file with mode: 0644]
window/lcmd1.c [new file with mode: 0644]
window/lcmd2.c [new file with mode: 0644]
window/local.h [new file with mode: 0644]
window/main.c [new file with mode: 0644]
window/mloop.c [new file with mode: 0644]
window/parser.h [new file with mode: 0644]
window/parser1.c [new file with mode: 0644]
window/parser2.c [new file with mode: 0644]
window/parser3.c [new file with mode: 0644]
window/parser4.c [new file with mode: 0644]
window/parser5.c [new file with mode: 0644]
window/scanner.c [new file with mode: 0644]
window/startup.c [new file with mode: 0644]
window/string.c [new file with mode: 0644]
window/token.h [new file with mode: 0644]
window/tt.h [new file with mode: 0644]
window/ttf100.c [new file with mode: 0644]
window/ttgeneric.c [new file with mode: 0644]
window/tth19.c [new file with mode: 0644]
window/tth29.c [new file with mode: 0644]
window/ttinit.c [new file with mode: 0644]
window/ttoutput.c [new file with mode: 0644]
window/tttermcap.c [new file with mode: 0644]
window/tttvi925.c [new file with mode: 0644]
window/ttwyse60.c [new file with mode: 0644]
window/ttwyse75.c [new file with mode: 0644]
window/ttzapple.c [new file with mode: 0644]
window/ttzentec.c [new file with mode: 0644]
window/value.h [new file with mode: 0644]
window/var.c [new file with mode: 0644]
window/var.h [new file with mode: 0644]
window/win.c [new file with mode: 0644]
window/window.1 [new file with mode: 0644]
window/window_string.h [new file with mode: 0644]
window/windowrc [new file with mode: 0644]
window/ww.h [new file with mode: 0644]
window/wwadd.c [new file with mode: 0644]
window/wwalloc.c [new file with mode: 0644]
window/wwbox.c [new file with mode: 0644]
window/wwchild.c [new file with mode: 0644]
window/wwclose.c [new file with mode: 0644]
window/wwclreol.c [new file with mode: 0644]
window/wwclreos.c [new file with mode: 0644]
window/wwcursor.c [new file with mode: 0644]
window/wwdata.c [new file with mode: 0644]
window/wwdelchar.c [new file with mode: 0644]
window/wwdelete.c [new file with mode: 0644]
window/wwdelline.c [new file with mode: 0644]
window/wwdump.c [new file with mode: 0644]
window/wwend.c [new file with mode: 0644]
window/wwenviron.c [new file with mode: 0644]
window/wwerror.c [new file with mode: 0644]
window/wwflush.c [new file with mode: 0644]
window/wwframe.c [new file with mode: 0644]
window/wwgets.c [new file with mode: 0644]
window/wwinit.c [new file with mode: 0644]
window/wwinschar.c [new file with mode: 0644]
window/wwinsline.c [new file with mode: 0644]
window/wwiomux.c [new file with mode: 0644]
window/wwlabel.c [new file with mode: 0644]
window/wwmisc.c [new file with mode: 0644]
window/wwmove.c [new file with mode: 0644]
window/wwopen.c [new file with mode: 0644]
window/wwprintf.c [new file with mode: 0644]
window/wwpty.c [new file with mode: 0644]
window/wwputc.c [new file with mode: 0644]
window/wwputs.c [new file with mode: 0644]
window/wwredraw.c [new file with mode: 0644]
window/wwredrawwin.c [new file with mode: 0644]
window/wwrint.c [new file with mode: 0644]
window/wwscroll.c [new file with mode: 0644]
window/wwsize.c [new file with mode: 0644]
window/wwspawn.c [new file with mode: 0644]
window/wwsuspend.c [new file with mode: 0644]
window/wwterminfo.c [new file with mode: 0644]
window/wwtty.c [new file with mode: 0644]
window/wwunframe.c [new file with mode: 0644]
window/wwupdate.c [new file with mode: 0644]
window/wwwrite.c [new file with mode: 0644]
window/xx.c [new file with mode: 0644]
window/xx.h [new file with mode: 0644]
window/xxflush.c [new file with mode: 0644]
xargs/Makefile [new file with mode: 0644]
xargs/Makefile.postamble [new file with mode: 0644]
xargs/Makefile.preamble [new file with mode: 0644]
xargs/PB.project [new file with mode: 0644]
xargs/pathnames.h [new file with mode: 0644]
xargs/xargs.1 [new file with mode: 0644]
xargs/xargs.c [new file with mode: 0644]
yes/Makefile [new file with mode: 0644]
yes/Makefile.postamble [new file with mode: 0644]
yes/Makefile.preamble [new file with mode: 0644]
yes/PB.project [new file with mode: 0644]
yes/yes.1 [new file with mode: 0644]
yes/yes.c [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..0162509
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,53 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = shell_cmds
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Aggregate
+
+SUBPROJECTS = locate
+
+TOOLS = apply basename chroot date dirname echo env expr false\
+        find getopt hostname id jot kill lastcomm logname nice\
+        nohup printenv printf pwd renice script shlock sleep su\
+        tee test time true uname users w whereis which who\
+        window xargs yes
+
+OTHERSRCS = PROJECT Makefile.preamble Makefile Makefile.postamble
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = aggregate.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+NEXTSTEP_PB_CFLAGS = -Wall -Werror
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/Makefile.postamble b/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/Makefile.preamble b/Makefile.preamble
new file mode 100644 (file)
index 0000000..8f8a3bd
--- /dev/null
@@ -0,0 +1 @@
+include $(MAKEFILEPATH)/CoreOS/ProjectBuilder/Makefile.Preamble.Common
diff --git a/PB.project b/PB.project
new file mode 100644 (file)
index 0000000..66a0c64
--- /dev/null
@@ -0,0 +1,67 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        OTHER_SOURCES = (PROJECT, Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (
+            apply, 
+            basename, 
+            chroot, 
+            date, 
+            dirname, 
+            echo, 
+            env, 
+            expr, 
+            false, 
+            find, 
+            getopt, 
+            hostname, 
+            id, 
+            jot, 
+            kill, 
+            lastcomm, 
+            locate, 
+            logname, 
+            nice, 
+            nohup, 
+            printenv, 
+            printf, 
+            pwd, 
+            renice, 
+            script, 
+            shlock, 
+            sleep, 
+            su, 
+            tee, 
+            test, 
+            time, 
+            true, 
+            uname, 
+            users, 
+            w, 
+            whereis, 
+            which, 
+            who, 
+            window, 
+            xargs, 
+            yes
+        ); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_COMPILEROPTIONS = "-Wall -Werror"; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = shell_cmds; 
+    PROJECTTYPE = Aggregate; 
+    PROJECTVERSION = 2.8; 
+    TARGETS = (); 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/PROJECT b/PROJECT
new file mode 100644 (file)
index 0000000..41782bc
--- /dev/null
+++ b/PROJECT
@@ -0,0 +1,12 @@
+Project                : shell_cmds
+Description    : Shell Commands
+Distribution   : NetBSD Fri Oct  9 20:13:59 PDT 1998
+Source         : NetBSD Foundation, Inc.
+Location       : cvs.netbsd.org:/cvsroot
+Owner          : wsanchez
+Releases       : Titan
+Dependancies   : 
+
+machine is disabled in favor of arch, which installs a link to itself as machine.
+
+w/fmt.c is copied from ps/fmt.c. We aren't doing the CVS trick of checking out that code from ps, because we don't use BSD ps; ps is a Mach client.
diff --git a/apply/Makefile b/apply/Makefile
new file mode 100644 (file)
index 0000000..6c0556b
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = apply
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = apply.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble apply.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/apply/Makefile.postamble b/apply/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/apply/Makefile.preamble b/apply/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/apply/PB.project b/apply/PB.project
new file mode 100644 (file)
index 0000000..388e985
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (apply.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, apply.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = apply; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/apply/apply.1 b/apply/apply.1
new file mode 100644 (file)
index 0000000..da353b1
--- /dev/null
@@ -0,0 +1,135 @@
+.\"    $NetBSD: apply.1,v 1.7 1998/04/28 04:07:08 fair Exp $
+.\"
+.\" Copyright (c) 1983, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)apply.1    8.2 (Berkeley) 4/4/94
+.\"
+.Dd April 4, 1994
+.Dt APPLY 1
+.Os BSD 4.2
+.Sh NAME
+.Nm apply
+.Nd apply a command to a set of arguments
+.Sh SYNOPSIS
+.Nm
+.Op Fl a Ns Ar c
+.Op Fl Ns Ar #
+.Ar command argument ...
+.Sh DESCRIPTION
+.Nm
+runs the named
+.Ar command
+on each
+argument
+.Ar argument
+in turn.
+.Pp
+Character sequences of the form
+.Dq Li \&%d
+in
+.Ar command ,
+where
+.Dq Li d
+is a digit from 1 to 9, are replaced by the
+.Li d Ns \'th
+following unused
+.Ar argument .
+In this case, the largest digit number of arguments are discarded for
+each execution of
+.Ar command .
+.Pp
+The options are as follows:
+.Bl -tag -width "-ac"
+.It Fl Ns Ar #
+Normally arguments are taken singly; the optional number
+.Fl #
+specifies the number of arguments to be passed to
+.Ar command .
+If the number is zero,
+.Ar command
+is run, without arguments, once for each
+.Ar argument .
+.Pp
+If any sequences of
+.Dq Li \&%d
+occur in command, the
+.Fl #
+option is ignored.
+.It Fl a Ns Ar c
+The use of the character
+.Dq Li %
+as a magic character may be changed with the
+.Fl a
+option.
+.El
+.Sh ENVIRONMENT VARIABLES
+The following environment variable affects the execution of
+.Nm
+:
+.Bl -tag -width SHELL
+.It Ev SHELL
+Pathname of shell to use.
+If this variable is not defined, the Bourne shell is used.
+.El
+.Sh EXAMPLES
+.Bl -tag -width apply -compact
+.It Li "apply echo a*"
+is similar to
+.Xr ls 1 ;
+.It Li "apply \-2 cmp a1 b1 a2 b2 a3 b3"
+compares the `a' files to the `b' files;
+.It Li "apply \-0 who 1 2 3 4 5"
+runs
+.Xr who 1
+5 times; and
+.It Li "apply \'ln %1 /usr/joe\'" *
+links all files in the current directory to the directory
+.Pa /usr/joe .
+.El
+.Sh Files
+.Bl -tag -width /bin/sh -compact
+.It Pa /bin/sh
+Default shell
+.El
+.Sh AUTHOR
+Rob Pike
+.Sh BUGS
+Shell metacharacters in
+.Ar command
+may have bizarre effects; it is best to enclose complicated
+commands in single quotes
+.Pq '' .
+.Sh HISTORY
+The
+.Nm
+command appeared in 
+.Bx 4.2 .
diff --git a/apply/apply.c b/apply/apply.c
new file mode 100644 (file)
index 0000000..80379a0
--- /dev/null
@@ -0,0 +1,243 @@
+/*     $NetBSD: apply.c,v 1.6 1997/12/31 05:53:45 thorpej Exp $        */
+
+/*-
+ * Copyright (c) 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Jan-Simon Pendry.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)apply.c    8.4 (Berkeley) 4/4/94";
+#else
+__RCSID("$NetBSD: apply.c,v 1.6 1997/12/31 05:53:45 thorpej Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/wait.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <paths.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int    main __P((int, char **));
+void   usage __P((void));
+int    system __P((const char *));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int ch, clen, debug, i, l, magic, n, nargs, rval;
+       char *c, *cmd, *p, *q;
+
+       debug = 0;
+       magic = '%';            /* Default magic char is `%'. */
+       nargs = -1;
+       while ((ch = getopt(argc, argv, "a:d0123456789")) != -1)
+               switch (ch) {
+               case 'a':
+                       if (optarg[1] != '\0')
+                               errx(1,
+                                   "illegal magic character specification.");
+                       magic = optarg[0];
+                       break;
+               case 'd':
+                       debug = 1;
+                       break;
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       if (nargs != -1)
+                               errx(1,
+                                   "only one -# argument may be specified.");
+                       nargs = optopt - '0';
+                       break;
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc < 2)
+               usage();
+
+       /*
+        * The command to run is argv[0], and the args are argv[1..].
+        * Look for %digit references in the command, remembering the
+        * largest one.
+        */
+       for (n = 0, p = argv[0]; *p != '\0'; ++p)
+               if (p[0] == magic && isdigit(p[1]) && p[1] != '0') {
+                       ++p;
+                       if (p[0] - '0' > n)
+                               n = p[0] - '0';
+               }
+
+       /*
+        * If there were any %digit references, then use those, otherwise
+        * build a new command string with sufficient %digit references at
+        * the end to consume (nargs) arguments each time round the loop.
+        * Allocate enough space to hold the maximum command.
+        */
+       if ((cmd = malloc(sizeof("exec ") - 1 +
+           strlen(argv[0]) + 9 * (sizeof(" %1") - 1) + 1)) == NULL)
+               err(1, "malloc");
+               
+       if (n == 0) {
+               /* If nargs not set, default to a single argument. */
+               if (nargs == -1)
+                       nargs = 1;
+
+               p = cmd;
+               p += sprintf(cmd, "exec %s", argv[0]);
+               for (i = 1; i <= nargs; i++)
+                       p += sprintf(p, " %c%d", magic, i);
+
+               /*
+                * If nargs set to the special value 0, eat a single
+                * argument for each command execution.
+                */
+               if (nargs == 0)
+                       nargs = 1;
+       } else {
+               (void)sprintf(cmd, "exec %s", argv[0]);
+               nargs = n;
+       }
+
+       /*
+        * Grab some space in which to build the command.  Allocate
+        * as necessary later, but no reason to build it up slowly
+        * for the normal case.
+        */
+       if ((c = malloc(clen = 1024)) == NULL)
+               err(1, "malloc");
+
+       /*
+        * (argc) and (argv) are still offset by one to make it simpler to
+        * expand %digit references.  At the end of the loop check for (argc)
+        * equals 1 means that all the (argv) has been consumed.
+        */
+       for (rval = 0; argc > nargs; argc -= nargs, argv += nargs) {
+               /*
+                * Find a max value for the command length, and ensure
+                * there's enough space to build it.
+                */
+               for (l = strlen(cmd), i = 0; i < nargs; i++)
+                       l += strlen(argv[i]);
+               if (l > clen && (c = realloc(c, clen = l)) == NULL)
+                       err(1, "malloc");
+
+               /* Expand command argv references. */
+               for (p = cmd, q = c; *p != '\0'; ++p)
+                       if (p[0] == magic && isdigit(p[1]) && p[1] != '0')
+                               q += sprintf(q, "%s", argv[(++p)[0] - '0']);
+                       else
+                               *q++ = *p;
+
+               /* Terminate the command string. */
+               *q = '\0';
+
+               /* Run the command. */
+               if (debug)
+                       (void)printf("%s\n", c);
+               else
+                       if (system(c))
+                               rval = 1;
+       }
+
+       if (argc != 1)
+               errx(1, "expecting additional argument%s after \"%s\"",
+                   (nargs - argc) ? "s" : "", argv[argc - 1]);
+       exit(rval);
+}
+
+/*
+ * system --
+ *     Private version of system(3).  Use the user's SHELL environment
+ *     variable as the shell to execute.
+ */
+int
+system(command)
+       const char *command;
+{
+       static char *name, *shell;
+       union wait pstat;
+       pid_t pid;
+       int omask;
+       sig_t intsave, quitsave;
+
+       if (shell == NULL) {
+               if ((shell = getenv("SHELL")) == NULL)
+                       shell = _PATH_BSHELL;
+               if ((name = strrchr(shell, '/')) == NULL)
+                       name = shell;
+               else
+                       ++name;
+       }
+       if (!command)           /* just checking... */
+               return(1);
+
+       omask = sigblock(sigmask(SIGCHLD));
+       switch(pid = vfork()) {
+       case -1:                        /* error */
+               err(1, "vfork");
+       case 0:                         /* child */
+               (void)sigsetmask(omask);
+               execl(shell, name, "-c", command, NULL);
+               warn("%s", shell);
+               _exit(1);
+       }
+       intsave = signal(SIGINT, SIG_IGN);
+       quitsave = signal(SIGQUIT, SIG_IGN);
+       pid = waitpid(pid, (int *)&pstat, 0);
+       (void)sigsetmask(omask);
+       (void)signal(SIGINT, intsave);
+       (void)signal(SIGQUIT, quitsave);
+       return(pid == -1 ? -1 : pstat.w_status);
+}
+
+void
+usage()
+{
+
+       (void)fprintf(stderr,
+           "usage: apply [-a magic] [-0123456789] command arguments ...\n");
+       exit(1);
+}
diff --git a/basename/Makefile b/basename/Makefile
new file mode 100644 (file)
index 0000000..48902e6
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = basename
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = basename.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble basename.1\
+            dirname.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/basename/Makefile.postamble b/basename/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/basename/Makefile.preamble b/basename/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/basename/PB.project b/basename/PB.project
new file mode 100644 (file)
index 0000000..041f770
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (basename.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, basename.1, dirname.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = basename; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/basename/basename.1 b/basename/basename.1
new file mode 100644 (file)
index 0000000..d2cf5b7
--- /dev/null
@@ -0,0 +1,94 @@
+.\"    $NetBSD: basename.1,v 1.11 1997/11/15 20:16:16 msaitoh Exp $
+.\"
+.\" Copyright (c) 1990, 1993, 1994
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)basename.1 8.2 (Berkeley) 4/18/94
+.\"
+.Dd April 18, 1994
+.Dt BASENAME 1
+.Os
+.Sh NAME
+.Nm basename ,
+.Nm dirname
+.Nd return filename or directory portion of pathname
+.Sh SYNOPSIS
+.Nm
+.Ar string
+.Op Ar suffix
+.Nm dirname
+.Ar string
+.Sh DESCRIPTION
+.Nm
+deletes any prefix ending with the last slash
+.Ql \&/
+character present in
+.Ar string ,
+and a
+.Ar suffix ,
+if given.
+The resulting filename is written to the standard output.
+A non-existent suffix is ignored.
+.Pp
+.Nm dirname
+deletes the filename portion, beginning
+with the last slash
+.Ql \&/
+character to the end of
+.Ar string , 
+and writes the result to the standard output.
+.Sh EXAMPLES 
+The following line sets the shell variable
+.Ev FOO
+to
+.Pa /usr/bin .
+.Pp
+.Dl FOO=`dirname /usr/bin/trail`
+.Sh DIAGNOSTICS
+Both the
+.Nm
+and
+.Nm dirname
+utilities
+exit 0 on success, and >0 if an error occurs.
+.Sh SEE ALSO
+.Xr csh 1 ,
+.Xr sh 1
+.Sh STANDARDS
+The
+.Nm
+and
+.Nm dirname
+utilities conform to
+.St -p1003.2-92 .
diff --git a/basename/basename.c b/basename/basename.c
new file mode 100644 (file)
index 0000000..ac02aa1
--- /dev/null
@@ -0,0 +1,148 @@
+/*     $NetBSD: basename.c,v 1.10 1997/10/18 12:18:20 lukem Exp $      */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1991, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)basename.c 8.4 (Berkeley) 5/4/95";
+#endif
+__RCSID("$NetBSD: basename.c,v 1.10 1997/10/18 12:18:20 lukem Exp $");
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <unistd.h>
+
+int main __P((int, char **));
+void usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       char *p;
+       int ch;
+
+       setlocale(LC_ALL, "");
+
+       while ((ch = getopt(argc, argv, "")) != -1)
+               switch(ch) {
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc != 1 && argc != 2)
+               usage();
+
+       /*
+        * (1) If string is // it is implementation defined whether steps (2)
+        *     through (5) are skipped or processed.
+        *
+        * (2) If string consists entirely of slash characters, string shall
+        *     be set to a single slash character.  In this case, skip steps
+        *     (3) through (5).
+        */
+       for (p = *argv;; ++p) {
+               if (!*p) {
+                       if (p > *argv)
+                               (void)printf("/\n");
+                       else
+                               (void)printf("\n");
+                       exit(0);
+               }
+               if (*p != '/')
+                       break;
+       }
+
+       /*
+        * (3) If there are any trailing slash characters in string, they
+        *     shall be removed.
+        */
+       for (; *p; ++p)
+               continue;
+       while (*--p == '/')
+               continue;
+       *++p = '\0';
+
+       /*
+        * (4) If there are any slash characters remaining in string, the
+        *     prefix of string up to an including the last slash character
+        *     in string shall be removed.
+        */
+       while (--p >= *argv)
+               if (*p == '/')
+                       break;
+       ++p;
+
+       /*
+        * (5) If the suffix operand is present, is not identical to the
+        *     characters remaining in string, and is identical to a suffix
+        *     of the characters remaining in string, the suffix suffix
+        *     shall be removed from string.
+        */
+       if (*++argv) {
+               int suffixlen, stringlen, off;
+
+               suffixlen = strlen(*argv);
+               stringlen = strlen(p);
+
+               if (suffixlen < stringlen) {
+                       off = stringlen - suffixlen;
+                       if (!strcmp(p + off, *argv))
+                               p[off] = '\0';
+               }
+       }
+       (void)printf("%s\n", p);
+       exit(0);
+}
+
+void
+usage()
+{
+
+       (void)fprintf(stderr, "usage: basename string [suffix]\n");
+       exit(1);
+}
diff --git a/basename/dirname.1 b/basename/dirname.1
new file mode 100644 (file)
index 0000000..ee3bc6f
--- /dev/null
@@ -0,0 +1 @@
+.so man1/basename.1
diff --git a/chroot/Makefile b/chroot/Makefile
new file mode 100644 (file)
index 0000000..7d2e40b
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = chroot
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = chroot.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble chroot.8
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/sbin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/chroot/Makefile.postamble b/chroot/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/chroot/Makefile.preamble b/chroot/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/chroot/PB.project b/chroot/PB.project
new file mode 100644 (file)
index 0000000..f706b95
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (chroot.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, chroot.8); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/sbin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = chroot; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/chroot/chroot.8 b/chroot/chroot.8
new file mode 100644 (file)
index 0000000..9375bfd
--- /dev/null
@@ -0,0 +1,102 @@
+.\" Copyright (c) 1988, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)chroot.8     8.1 (Berkeley) 6/9/93
+.\"    $NetBSD: chroot.8,v 1.7 1998/10/06 03:47:50 mrg Exp $
+.\"
+.Dd October 6, 1998
+.Dt CHROOT 8
+.Os BSD 4.3
+.Sh NAME
+.Nm chroot
+.Nd change root directory
+.Sh SYNOPSIS
+.Nm
+.Op Fl u user
+.Op Fl g group
+.Op Fl G group,group,...
+.Ar newroot
+.Op Ar command
+.Sh DESCRIPTION
+The
+.Nm
+command changes its root directory to the supplied directory
+.Ar newroot
+and exec's
+.Ar command ,
+if supplied, or an interactive copy of your shell.
+.Pp
+If the
+.Fl u ,
+.Fl g
+or
+.Fl G
+options are given, the user, group and group list of the process are
+set to these values after the chroot has taken place.  See
+.Xr setgid 2 ,
+.Xr setgroups 2 ,
+.Xr setuid 2 ,
+.Xr getgrnam 3
+and
+.Xr getpwnam 3 .
+.Pp
+Note,
+.Ar command
+or the shell are run as your real-user-id.
+.Sh ENVIRONMENT
+The following environment variable is referenced by
+.Nm "" :
+.Bl -tag -width SHELL
+.It Ev SHELL
+If set,
+the string specified by
+.Ev SHELL
+is interpreted as the name of
+the shell to exec.
+If the variable
+.Ev SHELL
+is not set,
+.Pa /bin/sh
+is used.
+.El
+.Sh SEE ALSO
+.Xr chdir 2 ,
+.Xr chroot 2 ,
+.Xr environ 7
+.Sh HISTORY
+The
+.Nm
+utility first appeared in
+.Bx 4.4 .
+.Sh SECURITY CONSIDERATIONS
+.Nm
+should never be installed setuid root, as it would then be possible
+to exploit the program to gain root privileges.
diff --git a/chroot/chroot.c b/chroot/chroot.c
new file mode 100644 (file)
index 0000000..c9c38f5
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1988, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)chroot.c   8.1 (Berkeley) 6/9/93";
+#else
+__RCSID("$NetBSD: chroot.c,v 1.7 1998/10/06 03:47:51 mrg Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <grp.h>
+#include <paths.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int    main __P((int, char **));
+void   usage __P((void)) __attribute__((__noreturn__));
+
+char   *user;          /* user to switch to before running program */
+char   *group;         /* group to switch to ... */
+char   *grouplist;     /* group list to switch to ... */
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       struct group *gp;
+       struct passwd *pw;
+       char *shell, *endp, *comma;
+       gid_t gid = 0, gidlist[NGROUPS_MAX];
+       uid_t uid = 0;
+       int ch, gids;
+
+       while ((ch = getopt(argc, argv, "G:g:u:")) != -1)
+               switch(ch) {
+               case 'u':
+                       user = optarg;
+                       break;
+               case 'g':
+                       group = optarg;
+                       break;
+               case 'G':
+                       grouplist = optarg;
+                       break;
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc < 1)
+               usage();
+
+       if (group) {
+               if (isdigit(*group)) {
+                       gid = (gid_t)strtol(group, &endp, 0);
+                       if (endp == group)
+                               goto getgroup;
+               } else {
+getgroup:
+                       if ((gp = getgrnam(group)))
+                               gid = gp->gr_gid;
+                       else
+                               errx(1, "no such group %s", group);
+               }
+       }
+
+       for (gids = 0; grouplist; ) {
+               comma = strchr(grouplist, ',');
+
+               if (comma)
+                       *comma++ = '\0';
+
+               if (isdigit(*grouplist)) {
+                       gidlist[gids] = (gid_t)strtol(grouplist, &endp, 0);
+                       if (endp == grouplist)
+                               goto getglist;
+               } else {
+getglist:
+                       if ((gp = getgrnam(grouplist)))
+                               gidlist[gids] = gp->gr_gid;
+                       else
+                               errx(1, "no such group %s", group);
+               }
+               gids++;
+               grouplist = comma;
+       }
+
+       if (user) {
+               if (isdigit(*user)) {
+                       uid = (uid_t)strtol(user, &endp, 0);
+                       if (endp == user)
+                               goto getuser;
+               } else {
+getuser:
+                       if ((pw = getpwnam(user)))
+                               uid = pw->pw_uid;
+                       else
+                               errx(1, "no such user %s", user);
+               }
+       }
+
+       if (chdir(argv[0]) || chroot("."))
+               err(1, "%s", argv[0]);
+
+       if (gids && setgroups(gids, gidlist) < 0)
+               err(1, "setgroups");
+       if (group && setgid(gid) < 0)
+               err(1, "setgid");
+       if (user && setuid(uid) < 0)
+               err(1, "setuid");
+
+       if (argv[1]) {
+               execvp(argv[1], &argv[1]);
+               err(1, "%s", argv[1]);
+       }
+
+       if (!(shell = getenv("SHELL")))
+               shell = _PATH_BSHELL;
+       execlp(shell, shell, "-i", NULL);
+       err(1, "%s", shell);
+       /* NOTREACHED */
+}
+
+void
+usage()
+{
+       (void)fprintf(stderr, "usage: chroot [-g group] [-G group,group,...] "
+           "[-u user] newroot [command]\n");
+       exit(1);
+}
diff --git a/date/Makefile b/date/Makefile
new file mode 100644 (file)
index 0000000..d96b895
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = date
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+HFILES = extern.h
+
+CFILES = date.c netdate.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble date.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/date/Makefile.postamble b/date/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/date/Makefile.preamble b/date/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/date/PB.project b/date/PB.project
new file mode 100644 (file)
index 0000000..dc8850c
--- /dev/null
@@ -0,0 +1,28 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        HEADERSEARCH = (); 
+        H_FILES = (extern.h); 
+        OTHER_LINKED = (date.c, netdate.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, date.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = date; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/date/date.1 b/date/date.1
new file mode 100644 (file)
index 0000000..4fe9b53
--- /dev/null
@@ -0,0 +1,213 @@
+.\"    $NetBSD: date.1,v 1.22 1998/06/08 09:07:13 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)date.1     8.3 (Berkeley) 4/28/95
+.\"
+.Dd January 20, 1998
+.Dt DATE 1
+.Os
+.Sh NAME
+.Nm date
+.Nd display or set date and time
+.Sh SYNOPSIS
+.Nm
+.Op Fl nu
+.Op Fl r Ar seconds
+.Op Cm + Ns Ar format
+.Nm ""
+.Ar [[[[[cc]yy]mm]dd]hh]mm[\&.ss]
+.Sh DESCRIPTION
+.Nm
+displays the current date and time when invoked without arguments.
+Providing arguments will format the date and time in a user-defined
+way or set the date.
+Only the superuser may set the date.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl n
+The utility
+.Xr timed 8
+is used to synchronize the clocks on groups of machines.
+By default, if
+timed
+is running,
+.Nm
+will set the time on all of the machines in the local group.
+The
+.Fl n
+option stops
+.Nm
+from setting the time for other than the current machine.
+.It Fl r
+Print out the date and time that is
+.Ar seconds
+from the Epoch.
+.It Fl u
+Display or set the date in
+.Tn UTC
+(universal) time.
+.El
+.Pp
+An operand with a leading plus (``+'') sign signals a user-defined format
+string which specifies the format in which to display the date and time.
+The format string may contain any of the conversion specifications described
+in the 
+.Xr strftime 3
+manual page, as well as any arbitrary text.
+A <newline> character is always output after the characters specified by
+the format string.
+The format string for the default display is:
+.Bd -literal -offset indent
+``%a %b %e %H:%M:%S %Z %Y''.
+.Ed
+.Pp
+If an operand does not have a leading plus sign, it is interpreted as
+a value for setting the system's notion of the current date and time.
+The canonical representation for setting the date and time is:
+.Pp
+.Bl -tag -width Ds -compact -offset indent
+.It Ar cc
+The first two digits of the year (the century).
+.It Ar yy
+The second two digits of the year.  If
+.Dq yy
+is specified, but
+.Dq cc
+is not, a value for
+.Dq yy
+between 69 and 99 results in a
+.Dq cc
+value of 19.  Otherwise, a
+.Dq cc
+value of 20 is used.
+.It Ar mm
+The month of the year, from 1 to 12.
+.It Ar dd
+The day of the month, from 1 to 31.
+.It Ar hh
+The hour of the day, from 0 to 23.
+.It Ar mm
+The minute of the hour, from 0 to 59.
+.It Ar ss
+The second of the minute, from 0 to 61.
+.El
+.Pp
+Everything but the minutes is optional.
+.Pp
+Time changes for Daylight Saving and Standard time and leap seconds
+and years are handled automatically.
+.Sh EXAMPLES
+The command:
+.Bd -literal -offset indent
+date ``+DATE: %m/%d/%y%nTIME: %H:%M:%S''
+.Ed
+.Pp
+will display:
+.Bd -literal -offset indent
+DATE: 11/21/87
+TIME: 13:36:16
+.Ed
+.Pp
+The command:
+.Bd -literal -offset indent
+date 8506131627
+.Ed
+.Pp
+sets the date to
+.Dq Li "June 13, 1985, 4:27 PM" .
+.Pp
+The command:
+.Bd -literal -offset indent
+date 1432
+.Ed
+.Pp
+sets the time to
+.Li "2:32 PM" ,
+without modifying the date.
+.Sh ENVIRONMENT VARIABLES
+The following environment variables affect the execution of
+.Nm
+:
+.Bl -tag -width TZ
+.It Ev TZ
+The timezone to use when displaying dates.
+See
+.Xr environ 7
+for more information.
+.El
+.Sh FILES
+.Bl -tag -width /var/log/messages -compact
+.It Pa /var/log/wtmp
+A record of date resets and time changes.
+.It Pa /var/log/messages
+A record of the user setting the time.
+.El
+.Sh SEE ALSO
+.Xr gettimeofday 2 ,
+.Xr strftime 3 ,
+.Xr utmp 5 ,
+.Xr timed 8
+.Rs
+.%T "TSP: The Time Synchronization Protocol for UNIX 4.3BSD"
+.%A R. Gusella
+.%A S. Zatti
+.Re
+.Sh DIAGNOSTICS
+Exit status is 0 on success, 1 if unable to set the date, and 2
+if able to set the local date, but unable to set it globally.
+.Pp
+Occasionally, when
+.Xr timed 8
+synchronizes the time on many hosts, the setting of a new time value may
+require more than a few seconds.
+On these occasions,
+.Nm
+prints:
+.Ql Network time being set .
+The message
+.Ql Communication error with timed
+occurs when the communication
+between
+.Nm
+and
+timed
+fails.
+.Sh STANDARDS
+The
+.Nm
+utility is expected to be compatible with
+.St -p1003.2 .
diff --git a/date/date.c b/date/date.c
new file mode 100644 (file)
index 0000000..9c59b07
--- /dev/null
@@ -0,0 +1,244 @@
+/*     $NetBSD: date.c,v 1.25 1998/07/28 11:41:47 mycroft Exp $        */
+
+/*
+ * Copyright (c) 1985, 1987, 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT(
+"@(#) Copyright (c) 1985, 1987, 1988, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)date.c     8.2 (Berkeley) 4/28/95";
+#else
+__RCSID("$NetBSD: date.c,v 1.25 1998/07/28 11:41:47 mycroft Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/time.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <syslog.h>
+#include <time.h>
+#include <tzfile.h>
+#include <unistd.h>
+#include <util.h>
+
+#include "extern.h"
+
+time_t tval;
+int retval, nflag;
+
+int main __P((int, char *[]));
+static void setthetime __P((const char *));
+static void badformat __P((void));
+static void badtime __P((void));
+static void usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       extern int optind;
+       extern char *optarg;
+       int ch, rflag;
+       char *format, buf[1024];
+
+       (void)setlocale(LC_ALL, "");
+
+       rflag = 0;
+       while ((ch = getopt(argc, argv, "nr:u")) != -1)
+               switch((char)ch) {
+               case 'n':               /* don't set network */
+                       nflag = 1;
+                       break;
+               case 'r':               /* user specified seconds */
+                       rflag = 1;
+                       tval = atol(optarg);
+                       break;
+               case 'u':               /* do everything in GMT */
+                       (void)setenv("TZ", "GMT0", 1);
+                       break;
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (!rflag && time(&tval) == -1)
+               err(1, "time");
+
+       format = "%a %b %e %H:%M:%S %Z %Y";
+
+       /* allow the operands in any order */
+       if (*argv && **argv == '+') {
+               format = *argv + 1;
+               ++argv;
+       }
+
+       if (*argv) {
+               setthetime(*argv);
+               ++argv;
+       }
+
+       if (*argv && **argv == '+')
+               format = *argv + 1;
+
+       (void)strftime(buf, sizeof(buf), format, localtime(&tval));
+       (void)printf("%s\n", buf);
+       exit(retval);
+       /* NOTREACHED */
+}
+
+#define        ATOI2(s)        ((s) += 2, ((s)[-2] - '0') * 10 + ((s)[-1] - '0'))
+
+void
+setthetime(p)
+       const char *p;
+{
+       struct tm *lt;
+       struct timeval tv;
+       const char *dot, *t;
+       int yearset, len;
+
+       for (t = p, dot = NULL; *t; ++t) {
+               if (isdigit(*t))
+                       continue;
+               if (*t == '.' && dot == NULL) {
+                       dot = t;
+                       continue;
+               }
+               badformat();
+       }
+
+       lt = localtime(&tval);
+
+       if (dot != NULL) {                      /* .ss */
+               len = strlen(dot);
+               if (len != 3)
+                       badformat();
+               ++dot;
+               lt->tm_sec = ATOI2(dot);
+       } else {
+               len = 0;
+               lt->tm_sec = 0;
+       }
+
+       yearset = 0;
+       switch (strlen(p) - len) {
+       case 12:                                /* cc */
+               lt->tm_year = ATOI2(p) * 100 - TM_YEAR_BASE;
+               yearset = 1;
+               /* FALLTHROUGH */
+       case 10:                                /* yy */
+               if (yearset) {
+                       lt->tm_year += ATOI2(p);
+               } else {
+                       yearset = ATOI2(p);
+                       if (yearset < 69)
+                               lt->tm_year = yearset + 2000 - TM_YEAR_BASE;
+                       else
+                               lt->tm_year = yearset + 1900 - TM_YEAR_BASE;
+               }
+               /* FALLTHROUGH */
+       case 8:                                 /* mm */
+               lt->tm_mon = ATOI2(p);
+               --lt->tm_mon;                   /* time struct is 0 - 11 */
+               /* FALLTHROUGH */
+       case 6:                                 /* dd */
+               lt->tm_mday = ATOI2(p);
+               /* FALLTHROUGH */
+       case 4:                                 /* hh */
+               lt->tm_hour = ATOI2(p);
+               /* FALLTHROUGH */
+       case 2:                                 /* mm */
+               lt->tm_min = ATOI2(p);
+               break;
+       default:
+               badformat();
+       }
+
+       /* convert broken-down time to GMT clock time */
+       if ((tval = mktime(lt)) == -1)
+               badtime();
+
+       /* set the time */
+       if (nflag || netsettime(tval)) {
+               logwtmp("|", "date", "");
+               tv.tv_sec = tval;
+               tv.tv_usec = 0;
+               if (settimeofday(&tv, NULL)) {
+                       perror("date: settimeofday");
+                       exit(1);
+               }
+               logwtmp("{", "date", "");
+       }
+
+       if ((p = getlogin()) == NULL)
+               p = "???";
+       syslog(LOG_AUTH | LOG_NOTICE, "date set by %s", p);
+}
+
+static void
+badformat()
+{
+       warnx("illegal time format");
+       usage();
+}
+
+static void
+badtime()
+{
+       errx(1, "illegal time");
+}
+
+static void
+usage()
+{
+       (void)fprintf(stderr,
+           "usage: date [-nu] [-r seconds] [+format]\n");
+       (void)fprintf(stderr, "       date [[[[[cc]yy]mm]dd]hh]mm[.ss]\n");
+       exit(1);
+       /* NOTREACHED */
+}
diff --git a/date/extern.h b/date/extern.h
new file mode 100644 (file)
index 0000000..c0d7fbe
--- /dev/null
@@ -0,0 +1,38 @@
+/*     $NetBSD: extern.h,v 1.3 1995/03/21 09:03:52 cgd Exp $   */
+
+/*-
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)extern.h    8.1 (Berkeley) 5/31/93
+ */
+
+int    netsettime __P((time_t));
diff --git a/date/netdate.c b/date/netdate.c
new file mode 100644 (file)
index 0000000..ee7b8ff
--- /dev/null
@@ -0,0 +1,195 @@
+/*     $NetBSD: netdate.c,v 1.16 1998/07/28 03:47:15 mycroft Exp $     */
+
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)netdate.c  8.2 (Berkeley) 4/28/95";
+#else
+__RCSID("$NetBSD: netdate.c,v 1.16 1998/07/28 03:47:15 mycroft Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+#include <netdb.h>
+#define TSPTYPES
+#include <protocols/timed.h>
+
+#include <err.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "extern.h"
+
+#define        WAITACK         2       /* seconds */
+#define        WAITDATEACK     5       /* seconds */
+
+extern int retval;
+
+/*
+ * Set the date in the machines controlled by timedaemons by communicating the
+ * new date to the local timedaemon.  If the timedaemon is in the master state,
+ * it performs the correction on all slaves.  If it is in the slave state, it
+ * notifies the master that a correction is needed.
+ * Returns 0 on success.  Returns > 0 on failure, setting retval to 2;
+ */
+int
+netsettime(tval)
+       time_t tval;
+{
+       struct timeval tout;
+       struct servent *sp;
+       struct tsp msg;
+       struct sockaddr_in sin, dest, from;
+       fd_set ready;
+       long waittime;
+       int s, length, timed_ack, found, error;
+#ifdef IP_PORTRANGE
+       int on;
+#endif
+       char hostname[MAXHOSTNAMELEN + 1];
+
+       if ((sp = getservbyname("timed", "udp")) == NULL) {
+               warnx("udp/timed: unknown service");
+               return (retval = 2);
+       }
+
+       (void)memset(&dest, 0, sizeof(dest));
+       dest.sin_len = sizeof(struct sockaddr_in);
+       dest.sin_family = AF_INET;
+       dest.sin_port = sp->s_port;
+       dest.sin_addr.s_addr = htonl(INADDR_ANY);
+       s = socket(AF_INET, SOCK_DGRAM, 0);
+       if (s < 0) {
+               if (errno != EPROTONOSUPPORT)
+                       warn("timed");
+               return (retval = 2);
+       }
+
+#ifdef IP_PORTRANGE
+       on = IP_PORTRANGE_LOW;
+       if (setsockopt(s, IPPROTO_IP, IP_PORTRANGE, &on, sizeof(on)) < 0) {
+               warn("setsockopt");
+               goto bad;
+       }
+#endif
+
+       (void)memset(&sin, 0, sizeof(sin));
+       sin.sin_len = sizeof(struct sockaddr_in);
+       sin.sin_family = AF_INET;
+       if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+               warn("bind");
+               goto bad;
+       }
+
+       msg.tsp_type = TSP_SETDATE;
+       msg.tsp_vers = TSPVERSION;
+       if (gethostname(hostname, sizeof(hostname))) {
+               warn("gethostname");
+               goto bad;
+       }
+       hostname[sizeof(hostname) - 1] = '\0';
+       (void)strncpy(msg.tsp_name, hostname, sizeof(hostname));
+       msg.tsp_seq = htons((u_short)0);
+       msg.tsp_time.tv_sec = htonl((u_long)tval);
+       msg.tsp_time.tv_usec = htonl((u_long)0);
+       length = sizeof(struct sockaddr_in);
+       if (connect(s, (struct sockaddr *)&dest, length) < 0) {
+               warn("connect");
+               goto bad;
+       }
+       if (send(s, (char *)&msg, sizeof(struct tsp), 0) < 0) {
+               if (errno != ECONNREFUSED)
+                       warn("send");
+               goto bad;
+       }
+
+       timed_ack = -1;
+       waittime = WAITACK;
+loop:
+       tout.tv_sec = waittime;
+       tout.tv_usec = 0;
+
+       FD_ZERO(&ready);
+       FD_SET(s, &ready);
+       found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout);
+
+       length = sizeof(error);
+       if (!getsockopt(s,
+           SOL_SOCKET, SO_ERROR, (char *)&error, &length) && error) {
+               if (error != ECONNREFUSED)
+                       warn("send (delayed error)");
+               goto bad;
+       }
+
+       if (found > 0 && FD_ISSET(s, &ready)) {
+               length = sizeof(struct sockaddr_in);
+               if (recvfrom(s, &msg, sizeof(struct tsp), 0,
+                   (struct sockaddr *)&from, &length) < 0) {
+                       if (errno != ECONNREFUSED)
+                               warn("recvfrom");
+                       goto bad;
+               }
+               msg.tsp_seq = ntohs(msg.tsp_seq);
+               msg.tsp_time.tv_sec = ntohl(msg.tsp_time.tv_sec);
+               msg.tsp_time.tv_usec = ntohl(msg.tsp_time.tv_usec);
+               switch (msg.tsp_type) {
+               case TSP_ACK:
+                       timed_ack = TSP_ACK;
+                       waittime = WAITDATEACK;
+                       goto loop;
+               case TSP_DATEACK:
+                       (void)close(s);
+                       return (0);
+               default:
+                       warnx("wrong ack received from timed: %s", 
+                           tsptype[msg.tsp_type]);
+                       timed_ack = -1;
+                       break;
+               }
+       }
+       if (timed_ack == -1)
+               warnx("can't reach time daemon, time set locally");
+
+bad:
+       (void)close(s);
+       return (retval = 2);
+}
diff --git a/dirname/Makefile b/dirname/Makefile
new file mode 100644 (file)
index 0000000..331901c
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = dirname
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = dirname.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/dirname/Makefile.postamble b/dirname/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/dirname/Makefile.preamble b/dirname/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/dirname/PB.project b/dirname/PB.project
new file mode 100644 (file)
index 0000000..d6e16ab
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (dirname.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = dirname; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/dirname/dirname.c b/dirname/dirname.c
new file mode 100644 (file)
index 0000000..19f5b37
--- /dev/null
@@ -0,0 +1,155 @@
+/*     $NetBSD: dirname.c,v 1.7 1997/10/18 13:21:41 lukem Exp $        */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1991, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)dirname.c  8.4 (Berkeley) 5/4/95";
+#endif
+__RCSID("$NetBSD: dirname.c,v 1.7 1997/10/18 13:21:41 lukem Exp $");
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <unistd.h>
+
+int    main __P((int, char **));
+static void usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       register char *p;
+       int ch;
+
+       setlocale(LC_ALL, "");
+
+       while ((ch = getopt(argc, argv, "")) != -1)
+               switch(ch) {
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc != 1)
+               usage();
+
+       /*
+        * (1) If string is //, skip steps (2) through (5).
+        * (2) If string consists entirely of slash characters, string
+        *     shall be set to a single slash character.  In this case,
+        *     skip steps (3) through (8).
+        */
+       for (p = *argv;; ++p) {
+               if (!*p) {
+                       if (p > *argv)
+                               (void)printf("/\n");
+                       else
+                               (void)printf(".\n");
+                       exit(0);
+               }
+               if (*p != '/')
+                       break;
+       }
+
+       /*
+        * (3) If there are any trailing slash characters in string, they
+        *     shall be removed.
+        */
+       for (; *p; ++p);
+       while (*--p == '/')
+               continue;
+       *++p = '\0';
+
+       /*
+        * (4) If there are no slash characters remaining in string,
+        *     string shall be set to a single period character.  In this
+        *     case skip steps (5) through (8).
+        *
+        * (5) If there are any trailing nonslash characters in string,
+        *     they shall be removed.
+        */
+       while (--p >= *argv)
+               if (*p == '/')
+                       break;
+       ++p;
+       if (p == *argv) {
+               (void)printf(".\n");
+               exit(0);
+       }
+
+       /*
+        * (6) If the remaining string is //, it is implementation defined
+        *     whether steps (7) and (8) are skipped or processed.
+        *
+        * This case has already been handled, as part of steps (1) and (2).
+        */
+       
+       /*
+        * (7) If there are any trailing slash characters in string, they
+        *     shall be removed.
+        */
+       while (--p >= *argv)
+               if (*p != '/')
+                       break;
+       ++p;
+
+       /*
+        * (8) If the remaining string is empty, string shall be set to
+        *     a single slash character.
+        */
+       *p = '\0';
+       (void)printf("%s\n", p == *argv ? "/" : *argv);
+       exit(0);
+}
+
+static void
+usage()
+{
+
+       (void)fprintf(stderr, "usage: dirname path\n");
+       exit(1);
+}
+
diff --git a/echo/Makefile b/echo/Makefile
new file mode 100644 (file)
index 0000000..f2346d3
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = echo
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = echo.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble echo.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/echo/Makefile.postamble b/echo/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/echo/Makefile.preamble b/echo/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/echo/PB.project b/echo/PB.project
new file mode 100644 (file)
index 0000000..e7ed565
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (echo.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, echo.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = echo; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/echo/echo.1 b/echo/echo.1
new file mode 100644 (file)
index 0000000..e04e4cd
--- /dev/null
@@ -0,0 +1,72 @@
+.\"    $NetBSD: echo.1,v 1.8 1997/10/20 08:51:49 enami Exp $
+.\"
+.\" Copyright (c) 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)echo.1      8.1 (Berkeley) 7/22/93
+.\"
+.Dd July 22, 1993
+.Dt ECHO 1
+.Os
+.Sh NAME
+.Nm echo
+.Nd write arguments to the standard output
+.Sh SYNOPSIS
+.Nm
+.Op Fl n
+.Op "string ..."
+.Sh DESCRIPTION
+The
+.Nm
+utility writes any specified operands, separated by single blank (`` '')
+characters and followed by a newline (``\en'') character, to the standard
+output.
+.Pp
+The following option is available:
+.Bl -tag -width flag
+.It Fl n
+Do not print the trailing newline character.
+.El
+.Pp
+The
+.Nm
+utility exits 0 on success, and >0 if an error occurs.
+.Sh SEE ALSO
+.Xr printf 1
+.Sh STANDARDS
+The
+.Nm
+utility is expected to be
+.St -p1003.2
+compatible.
diff --git a/echo/echo.c b/echo/echo.c
new file mode 100644 (file)
index 0000000..e427f46
--- /dev/null
@@ -0,0 +1,82 @@
+/*     $NetBSD: echo.c,v 1.8 1997/11/05 21:19:56 cgd Exp $     */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT(
+"@(#) Copyright (c) 1989, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)echo.c     8.1 (Berkeley) 5/31/93";
+#else
+__RCSID("$NetBSD: echo.c,v 1.8 1997/11/05 21:19:56 cgd Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int    main __P((int, char *[]));
+
+/* ARGSUSED */
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int nflag;
+
+       /* This utility may NOT do getopt(3) option parsing. */
+       if (*++argv && !strcmp(*argv, "-n")) {
+               ++argv;
+               nflag = 1;
+       }
+       else
+               nflag = 0;
+
+       while (*argv) {
+               (void)printf("%s", *argv);
+               if (*++argv)
+                       (void)putchar(' ');
+       }
+       if (!nflag)
+               (void)putchar('\n');
+       exit(0);
+       /* NOTREACHED */
+}
diff --git a/env/Makefile b/env/Makefile
new file mode 100644 (file)
index 0000000..f1aea83
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = env
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = env.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble env.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/env/Makefile.postamble b/env/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/env/Makefile.preamble b/env/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/env/PB.project b/env/PB.project
new file mode 100644 (file)
index 0000000..8cfa454
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (env.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, env.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = env; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/env/env.1 b/env/env.1
new file mode 100644 (file)
index 0000000..d281dc9
--- /dev/null
+++ b/env/env.1
@@ -0,0 +1,125 @@
+.\"    $NetBSD: env.1,v 1.6 1997/10/18 13:55:22 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1990 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)printenv.1    6.7 (Berkeley) 7/28/91
+.\"    $NetBSD: env.1,v 1.6 1997/10/18 13:55:22 lukem Exp $
+.\"
+.Dd August 27, 1993
+.Dt ENV 1
+.Os
+.Sh NAME
+.Nm env
+.Nd set and print environment
+.Sh SYNOPSIS
+.Nm
+.Op Fl i
+.Op Ar name=value ...
+.Oo
+.Ar utility
+.Op argument ...
+.Oc
+.Sh DESCRIPTION
+.Nm
+executes
+.Ar utility
+after modifying the environment as
+specified on the command line.  The option
+.Ar name=value
+specifies
+an environmental variable,
+.Ar name  ,
+with a value of
+.Ar value  .
+The option
+.Sq Fl i
+causes
+.Nm
+to completely ignore the environment
+it inherits.
+.Pp
+If no 
+.Ar utility
+is specified,
+.Nm
+prints out the names and values
+of the variables in the environment, with one 
+.Ar name=value 
+pair per line.
+.Sh DIAGNOSTICS
+If the 
+.Ar utility
+is invoked, the exit status of 
+.Nm
+shall be the exit status of
+.Ar utility; 
+otherwise, the
+.Nm
+utility exits with one of the following values:
+.Bl -tag -width Ds
+.It 0
+The 
+.Nm
+utility completed successfully
+.It 1-125
+An error occurred in the
+.Nm
+utility.
+.It 126
+The utility specified by
+.Ar utility 
+was found, but could not be invoked.
+.It 127
+The utility specified by
+.Ar utility 
+could not be found.
+.El
+.Sh COMPATIBILITY
+The historic 
+.Fl 
+option has been deprecated but is still supported in this implementation.
+.Sh SEE ALSO
+.Xr execvp 3 ,
+.Xr environ 7
+.Sh STANDARDS
+The
+.Nm
+utility conforms to
+.St -p1003.2-92 .
+.Sh BUGS
+.Nm
+doesn't handle commands with equal
+.Pq Dq =
+signs in their
+names, for obvious reasons.
diff --git a/env/env.c b/env/env.c
new file mode 100644 (file)
index 0000000..42b7542
--- /dev/null
+++ b/env/env.c
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 1988, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1988, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+/*static char sccsid[] = "@(#)env.c    8.3 (Berkeley) 4/2/94";*/
+__RCSID("$NetBSD: env.c,v 1.10 1997/10/18 13:55:28 lukem Exp $");
+#endif /* not lint */
+
+#include <err.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <locale.h>
+#include <errno.h>
+
+int    main __P((int, char **));
+static void usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       extern char **environ;
+       extern int optind;
+       char **ep, *p;
+       char *cleanenv[1];
+       int ch;
+
+       setlocale(LC_ALL, "");
+
+       while ((ch = getopt(argc, argv, "-i")) != -1)
+               switch((char)ch) {
+               case '-':                       /* obsolete */
+               case 'i':
+                       environ = cleanenv;
+                       cleanenv[0] = NULL;
+                       break;
+               case '?':
+               default:
+                       usage();
+               }
+
+       for (argv += optind; *argv && (p = strchr(*argv, '=')); ++argv)
+               (void)setenv(*argv, ++p, 1);
+
+       if (*argv) {
+               /* return 127 if the command to be run could not be found; 126
+                  if the command was was found but could not be invoked */
+
+               execvp(*argv, argv);
+               err((errno == ENOENT) ? 127 : 126, "%s", *argv);
+               /* NOTREACHED */
+       }
+
+       for (ep = environ; *ep; ep++)
+               (void)printf("%s\n", *ep);
+
+       exit(0);
+}
+
+static void
+usage ()
+{
+       (void) fprintf(stderr, "usage: env [-i] [name=value ...] [command]\n");
+       exit (1);
+}
diff --git a/expr/Makefile b/expr/Makefile
new file mode 100644 (file)
index 0000000..8df16b0
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = expr
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = expr.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble expr.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/expr/Makefile.postamble b/expr/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/expr/Makefile.preamble b/expr/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/expr/PB.project b/expr/PB.project
new file mode 100644 (file)
index 0000000..4a9d841
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (expr.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, expr.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = expr; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/expr/expr.1 b/expr/expr.1
new file mode 100644 (file)
index 0000000..c4f2280
--- /dev/null
@@ -0,0 +1,105 @@
+.\"    $NetBSD: expr.1,v 1.10 1997/10/20 08:51:56 enami Exp $
+.\"
+.\" Written by J.T. Conklin <jtc@netbsd.org>.
+.\" Public domain.
+.\"
+.Dd July 3, 1993
+.Dt EXPR 1
+.Os
+.Sh NAME
+.Nm expr
+.Nd evaluate expression
+.Sh SYNOPSIS
+.Nm
+.Ar expression
+.Sh DESCRIPTION
+The
+.Nm
+utility evaluates 
+.Ar expression
+and writes the result on standard output.
+.Pp
+All operators are separate arguments to the
+.Nm
+utility.
+Characters special to the command interpreter must be escaped.
+.Pp
+Operators are listed below in order of increasing precedence.
+Operators with equal precedence are grouped within { } symbols.
+.Bl -tag -width indent
+.It Ar expr1 Li | Ar expr2
+Returns the evaluation of 
+.Ar expr1 
+if it is neither an empty string nor zero;
+otherwise, returns the evaluation of
+.Ar expr2 .
+.It Ar expr1 Li & Ar expr2
+Returns the evaluation of
+.Ar expr1
+if neither expression evaluates to an empty string or zero;
+otherwise, returns zero.
+.It Ar expr1 Li "{=, >, >=, <, <=, !=}" Ar expr2
+Returns the results of integer comparison if both arguments are integers; 
+otherwise, returns the results of string comparison using the locale-specific
+collation sequence.
+The result of each comparison is 1 if the specified relation is true,
+or 0 if the relation is false.
+.It Ar expr1 Li "{+, -}" Ar expr2
+Returns the results of addition or subtraction of integer-valued arguments.
+.It Ar expr1 Li "{*, /, %}" Ar expr2
+Returns the results of multiplication, integer division, or remainder of integer-valued arguments.
+.It Ar expr1 Li : Ar expr2
+The 
+.Dq \:
+operator matches 
+.Ar expr1 
+against 
+.Ar expr2 ,
+which must be a regular expression.  The regular expression is anchored
+to the beginning of  the string with an implicit 
+.Dq ^ .
+.Pp
+If the match succeeds and the pattern contains at least one regular
+expression subexpression 
+.Dq "\e(...\e)" , 
+the string corresponding to 
+.Dq "\e1"
+is returned;
+otherwise the matching operator returns the number of characters matched. 
+If the match fails and the pattern contains a regular expression subexpression
+the null string is returned;
+otherwise 0.
+.El
+.Pp
+Parentheses are used for grouping in the usual manner.
+.Sh EXAMPLES
+.Bl -enum
+.It 
+The following example adds one to the variable a.
+.Dl a=`expr $a + 1`
+.It
+The following example returns the filename portion of a pathname stored
+in variable a.  The // characters act to eliminate ambiguity with the
+division operator.
+.Dl expr "//$a" Li : '.*/\e(.*\e)'
+.It
+The following example returns the number of characters in variable a.
+.Dl expr $a Li : '.*'
+.El
+.Sh DIAGNOSTICS
+The
+.Nm
+utility exits with one of the following values:
+.Bl -tag -width Ds -compact
+.It 0
+the expression is neither an empty string nor 0.
+.It 1
+the expression is an empty string or 0.
+.It 2
+the expression is invalid.
+.El
+.Sh STANDARDS
+The
+.Nm
+utility conforms to
+.St -p1003.2 .
diff --git a/expr/expr.c b/expr/expr.c
new file mode 100644 (file)
index 0000000..5323427
--- /dev/null
@@ -0,0 +1,548 @@
+/*     $NetBSD: expr.c,v 1.9 1998/07/28 11:41:48 mycroft Exp $ */
+
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <ctype.h>
+#include <regex.h>
+#include <err.h>
+
+
+enum token {
+       OR, AND, EQ, LT, GT, ADD, SUB, MUL, DIV, MOD, MATCH, RP, LP,
+       NE, LE, GE, OPERAND, EOI
+};
+
+struct val {
+       enum {
+               integer,
+               string
+       } type;
+
+       union {
+               char           *s;
+               int             i;
+       } u;
+};
+
+enum token     token;
+struct val     *tokval;
+char          **av;
+
+struct val *make_int __P((int));
+struct val *make_str __P((char *));
+void free_value __P((struct val *));
+int is_integer __P((struct val *, int *));
+int to_integer __P((struct val *));
+void to_string __P((struct val *));
+int is_zero_or_null __P((struct val *));
+void nexttoken __P((void));
+void error __P((void)) __attribute__((__noreturn__));
+struct val *eval6 __P((void));
+struct val *eval5 __P((void));
+struct val *eval4 __P((void));
+struct val *eval3 __P((void));
+struct val *eval2 __P((void));
+struct val *eval1 __P((void));
+struct val *eval0 __P((void));
+int main __P((int, char **));
+
+
+struct val *
+make_int(i)
+       int             i;
+{
+       struct val     *vp;
+
+       vp = (struct val *) malloc(sizeof(*vp));
+       if (vp == NULL) {
+               err(2, "%s", "");
+       }
+       vp->type = integer;
+       vp->u.i = i;
+       return vp;
+}
+
+
+struct val *
+make_str(s)
+       char           *s;
+{
+       struct val     *vp;
+
+       vp = (struct val *) malloc(sizeof(*vp));
+       if (vp == NULL || ((vp->u.s = strdup(s)) == NULL)) {
+               err(2, "%s", "");
+       }
+       vp->type = string;
+       return vp;
+}
+
+
+void
+free_value(vp)
+       struct val     *vp;
+{
+       if (vp->type == string)
+               free(vp->u.s);
+       free(vp);
+}
+
+
+/* determine if vp is an integer; if so, return it's value in *r */
+int
+is_integer(vp, r)
+       struct val     *vp;
+       int            *r;
+{
+       char           *s;
+       int             neg;
+       int             i;
+
+       if (vp->type == integer) {
+               *r = vp->u.i;
+               return 1;
+       }
+
+       /*
+        * POSIX.2 defines an "integer" as an optional unary minus 
+        * followed by digits.
+        */
+       s = vp->u.s;
+       i = 0;
+
+       neg = (*s == '-');
+       if (neg)
+               s++;
+
+       while (*s) {
+               if (!isdigit(*s))
+                       return 0;
+
+               i *= 10;
+               i += *s - '0';
+
+               s++;
+       }
+
+       if (neg)
+               i *= -1;
+
+       *r = i;
+       return 1;
+}
+
+
+/* coerce to vp to an integer */
+int
+to_integer(vp)
+       struct val     *vp;
+{
+       int             r;
+
+       if (vp->type == integer)
+               return 1;
+
+       if (is_integer(vp, &r)) {
+               free(vp->u.s);
+               vp->u.i = r;
+               vp->type = integer;
+               return 1;
+       }
+
+       return 0;
+}
+
+
+/* coerce to vp to an string */
+void
+to_string(vp)
+       struct val     *vp;
+{
+       char           *tmp;
+
+       if (vp->type == string)
+               return;
+
+       tmp = malloc(25);
+       if (tmp == NULL) {
+               err(2, "%s", "");
+       }
+       (void)snprintf(tmp, 25, "%d", vp->u.i);
+       vp->type = string;
+       vp->u.s = tmp;
+}
+
+int
+is_zero_or_null(vp)
+       struct val     *vp;
+{
+       if (vp->type == integer)
+               return (vp->u.i == 0);
+       else
+               return (*vp->u.s == 0 || (to_integer(vp) && vp->u.i == 0));
+       /* NOTREACHED */
+}
+
+void
+nexttoken()
+{
+       char           *p;
+
+       if ((p = *av) == NULL) {
+               token = EOI;
+               return;
+       }
+       av++;
+
+       if (p[0] != '\0') {
+               if (p[1] == '\0') {
+                       const char     *x = "|&=<>+-*/%:()";
+                       char           *i;      /* index */
+
+                       if ((i = strchr(x, *p)) != NULL) {
+                               token = i - x;
+                               return;
+                       }
+               } else if (p[1] == '=' && p[2] == '\0') {
+                       switch (*p) {
+                       case '<':
+                               token = LE;
+                               return;
+                       case '>':
+                               token = GE;
+                               return;
+                       case '!':
+                               token = NE;
+                               return;
+                       }
+               }
+       }
+       tokval = make_str(p);
+       token = OPERAND;
+       return;
+}
+
+void
+error()
+{
+       errx(2, "syntax error");
+       /* NOTREACHED */
+}
+
+struct val *
+eval6()
+{
+       struct val     *v;
+
+       if (token == OPERAND) {
+               nexttoken();
+               return tokval;
+
+       } else if (token == RP) {
+               nexttoken();
+               v = eval0();
+
+               if (token != LP)
+                       error();
+               nexttoken();
+               return v;
+       } else {
+               error();
+       }
+       /* NOTREACHED */
+}
+
+/* Parse and evaluate match (regex) expressions */
+struct val *
+eval5()
+{
+       regex_t         rp;
+       regmatch_t      rm[2];
+       char            errbuf[256];
+       int             eval;
+       struct val     *l, *r;
+       struct val     *v;
+
+       l = eval6();
+       while (token == MATCH) {
+               nexttoken();
+               r = eval6();
+
+               /* coerce to both arguments to strings */
+               to_string(l);
+               to_string(r);
+
+               /* compile regular expression */
+               if ((eval = regcomp(&rp, r->u.s, 0)) != 0) {
+                       (void)regerror(eval, &rp, errbuf, sizeof(errbuf));
+                       errx(2, "%s", errbuf);
+               }
+
+               /* compare string against pattern --  remember that patterns 
+                  are anchored to the beginning of the line */
+               if (regexec(&rp, l->u.s, 2, rm, 0) == 0 && rm[0].rm_so == 0) {
+                       if (rm[1].rm_so >= 0) {
+                               *(l->u.s + rm[1].rm_eo) = '\0';
+                               v = make_str(l->u.s + rm[1].rm_so);
+
+                       } else {
+                               v = make_int((int)(rm[0].rm_eo - rm[0].rm_so));
+                       }
+               } else {
+                       if (rp.re_nsub == 0) {
+                               v = make_int(0);
+                       } else {
+                               v = make_str("");
+                       }
+               }
+
+               /* free arguments and pattern buffer */
+               free_value(l);
+               free_value(r);
+               regfree(&rp);
+
+               l = v;
+       }
+
+       return l;
+}
+
+/* Parse and evaluate multiplication and division expressions */
+struct val *
+eval4()
+{
+       struct val     *l, *r;
+       enum token      op;
+
+       l = eval5();
+       while ((op = token) == MUL || op == DIV || op == MOD) {
+               nexttoken();
+               r = eval5();
+
+               if (!to_integer(l) || !to_integer(r)) {
+                       errx(2, "non-numeric argument");
+               }
+
+               if (op == MUL) {
+                       l->u.i *= r->u.i;
+               } else {
+                       if (r->u.i == 0) {
+                               errx(2, "division by zero");
+                       }
+                       if (op == DIV) {
+                               l->u.i /= r->u.i;
+                       } else {
+                               l->u.i %= r->u.i;
+                       }
+               }
+
+               free_value(r);
+       }
+
+       return l;
+}
+
+/* Parse and evaluate addition and subtraction expressions */
+struct val *
+eval3()
+{
+       struct val     *l, *r;
+       enum token      op;
+
+       l = eval4();
+       while ((op = token) == ADD || op == SUB) {
+               nexttoken();
+               r = eval4();
+
+               if (!to_integer(l) || !to_integer(r)) {
+                       errx(2, "non-numeric argument");
+               }
+
+               if (op == ADD) {
+                       l->u.i += r->u.i;
+               } else {
+                       l->u.i -= r->u.i;
+               }
+
+               free_value(r);
+       }
+
+       return l;
+}
+
+/* Parse and evaluate comparison expressions */
+struct val *
+eval2()
+{
+       struct val     *l, *r;
+       enum token      op;
+       int             v = 0;  /* pacify gcc */
+       int             li, ri;
+
+       l = eval3();
+       while ((op = token) == EQ || op == NE || op == LT || op == GT || op == LE || op == GE) {
+               nexttoken();
+               r = eval3();
+
+               if (is_integer(l, &li) && is_integer(r, &ri)) {
+                       switch (op) {
+                       case GT:
+                               v = (li >  ri);
+                               break;
+                       case GE:
+                               v = (li >= ri);
+                               break;
+                       case LT:
+                               v = (li <  ri);
+                               break;
+                       case LE:
+                               v = (li <= ri);
+                               break;
+                       case EQ:
+                               v = (li == ri);
+                               break;
+                       case NE:
+                               v = (li != ri);
+                               break;
+                       case MOD:
+                       case EOI:
+                       case OPERAND:
+                       case LP:
+                       case RP:
+                       case MATCH:
+                       case DIV:
+                       case MUL:
+                       case SUB:
+                       case ADD:
+                       case AND:
+                       case OR:
+                               /* Can't happen */
+                               abort();
+                               break;
+                       }
+               } else {
+                       to_string(l);
+                       to_string(r);
+
+                       switch (op) {
+                       case GT:
+                               v = (strcoll(l->u.s, r->u.s) > 0);
+                               break;
+                       case GE:
+                               v = (strcoll(l->u.s, r->u.s) >= 0);
+                               break;
+                       case LT:
+                               v = (strcoll(l->u.s, r->u.s) < 0);
+                               break;
+                       case LE:
+                               v = (strcoll(l->u.s, r->u.s) <= 0);
+                               break;
+                       case EQ:
+                               v = (strcoll(l->u.s, r->u.s) == 0);
+                               break;
+                       case NE:
+                               v = (strcoll(l->u.s, r->u.s) != 0);
+                               break;
+                       case MUL:
+                       case SUB:
+                       case ADD:
+                       case AND:
+                       case OR:
+                       case DIV:
+                       case OPERAND:
+                       case EOI:
+                       case MOD:
+                       case RP:
+                       case MATCH:
+                       case LP:
+                               /* Can't happen */
+                               abort();
+                               break;
+                       }
+               } 
+
+               free_value(l);
+               free_value(r);
+               l = make_int(v);
+       }
+
+       return l;
+}
+
+/* Parse and evaluate & expressions */
+struct val *
+eval1()
+{
+       struct val     *l, *r;
+
+       l = eval2();
+       while (token == AND) {
+               nexttoken();
+               r = eval2();
+
+               if (is_zero_or_null(l) || is_zero_or_null(r)) {
+                       free_value(l);
+                       free_value(r);
+                       l = make_int(0);
+               } else {
+                       free_value(r);
+               }
+       }
+
+       return l;
+}
+
+/* Parse and evaluate | expressions */
+struct val *
+eval0()
+{
+       struct val     *l, *r;
+
+       l = eval1();
+       while (token == OR) {
+               nexttoken();
+               r = eval1();
+
+               if (is_zero_or_null(l)) {
+                       free_value(l);
+                       l = r;
+               } else {
+                       free_value(r);
+               }
+       }
+
+       return l;
+}
+
+
+int
+main(argc, argv)
+       int             argc;
+       char          **argv;
+{
+       struct val     *vp;
+
+       (void) setlocale(LC_ALL, "");
+       av = argv + 1;
+
+       nexttoken();
+       vp = eval0();
+
+       if (token != EOI)
+               error();
+
+       if (vp->type == integer)
+               (void)printf("%d\n", vp->u.i);
+       else
+               (void)printf("%s\n", vp->u.s);
+
+       exit(is_zero_or_null(vp));
+       /* NOTREACHED */
+}
diff --git a/false/Makefile b/false/Makefile
new file mode 100644 (file)
index 0000000..480c66f
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = false
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = false.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble false.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/false/Makefile.postamble b/false/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/false/Makefile.preamble b/false/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/false/PB.project b/false/PB.project
new file mode 100644 (file)
index 0000000..bdc6079
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (false.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, false.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = false; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/false/false.1 b/false/false.1
new file mode 100644 (file)
index 0000000..f7b07eb
--- /dev/null
@@ -0,0 +1,60 @@
+.\"    $NetBSD: false.1,v 1.5 1997/10/18 14:46:54 lukem Exp $
+.\"
+.\" Copyright (c) 1983, 1990 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)false.1       6.6 (Berkeley) 7/24/91
+.\"    $NetBSD: false.1,v 1.5 1997/10/18 14:46:54 lukem Exp $
+.\"
+.Dd July 24, 1991
+.Dt FALSE 1
+.Os BSD 4.2
+.Sh NAME
+.Nm false
+.Nd Return false value.
+.Sh SYNOPSIS
+.Nm
+.Sh DESCRIPTION
+The
+.Nm
+utility always exits with a nonzero exit code.
+.Sh SEE ALSO
+.Xr csh 1 ,
+.Xr sh 1 ,
+.Xr true 1
+.Sh STANDARDS
+The
+.Nm
+utility conforms to 
+.St -p1003.2-92 .
diff --git a/false/false.c b/false/false.c
new file mode 100644 (file)
index 0000000..9c29522
--- /dev/null
@@ -0,0 +1 @@
+int main () { exit(1); }
\ No newline at end of file
diff --git a/find/Makefile b/find/Makefile
new file mode 100644 (file)
index 0000000..2deb864
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = find
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+HFILES = extern.h find.h
+
+CFILES = find.c function.c ls.c main.c misc.c operator.c option.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble find.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/find/Makefile.postamble b/find/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/find/Makefile.preamble b/find/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/find/PB.project b/find/PB.project
new file mode 100644 (file)
index 0000000..4cc1f6a
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (extern.h, find.h); 
+        OTHER_LINKED = (find.c, function.c, ls.c, main.c, misc.c, operator.c, option.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, find.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = find; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/find/extern.h b/find/extern.h
new file mode 100644 (file)
index 0000000..013fa5f
--- /dev/null
@@ -0,0 +1,83 @@
+/*     $NetBSD: extern.h,v 1.8 1998/02/21 22:47:20 christos Exp $      */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     from: @(#)extern.h      8.3 (Berkeley) 4/16/94
+ */
+
+#include <sys/cdefs.h>
+
+void    brace_subst __P((char *, char **, char *, int));
+void   *emalloc __P((unsigned int));
+PLAN   *find_create __P((char ***));
+int     find_execute __P((PLAN *, char **));
+PLAN   *find_formplan __P((char **));
+int     f_expr __P((PLAN *, FTSENT *));
+PLAN   *not_squish __P((PLAN *));
+PLAN   *or_squish __P((PLAN *));
+PLAN   *paren_squish __P((PLAN *));
+struct stat;
+void    printlong __P((char *, char *, struct stat *));
+int     queryuser __P((char **));
+
+PLAN   *c_atime __P((char ***, int));
+PLAN   *c_ctime __P((char ***, int));
+PLAN   *c_depth __P((char ***, int));
+PLAN   *c_exec __P((char ***, int));
+PLAN   *c_follow __P((char ***, int));
+PLAN   *c_fstype __P((char ***, int));
+PLAN   *c_group __P((char ***, int));
+PLAN   *c_inum __P((char ***, int));
+PLAN   *c_links __P((char ***, int));
+PLAN   *c_ls __P((char ***, int));
+PLAN   *c_name __P((char ***, int));
+PLAN   *c_newer __P((char ***, int));
+PLAN   *c_nogroup __P((char ***, int));
+PLAN   *c_nouser __P((char ***, int));
+PLAN   *c_path __P((char ***, int));
+PLAN   *c_perm __P((char ***, int));
+PLAN   *c_print __P((char ***, int));
+PLAN   *c_print0 __P((char ***, int));
+PLAN   *c_prune __P((char ***, int));
+PLAN   *c_size __P((char ***, int));
+PLAN   *c_type __P((char ***, int));
+PLAN   *c_user __P((char ***, int));
+PLAN   *c_xdev __P((char ***, int));
+PLAN   *c_openparen __P((char ***, int));
+PLAN   *c_closeparen __P((char ***, int));
+PLAN   *c_mtime __P((char ***, int));
+PLAN   *c_not __P((char ***, int));
+PLAN   *c_or __P((char ***, int));
+PLAN   *c_null __P((char ***, int));
+
+extern int ftsoptions, isdeprecated, isdepth, isoutput, isxargs;
diff --git a/find/find.1 b/find/find.1
new file mode 100644 (file)
index 0000000..9692337
--- /dev/null
@@ -0,0 +1,482 @@
+.\"    $NetBSD: find.1,v 1.14 1998/05/27 13:15:30 msaitoh Exp $
+.\"
+.\" Copyright (c) 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)find.1        8.7 (Berkeley) 5/9/95
+.\"
+.Dd May 9, 1995
+.Dt FIND 1
+.Os
+.Sh NAME
+.Nm find
+.Nd walk a file hierarchy
+.Sh SYNOPSIS
+.Nm find
+.Op Fl H | Fl L | Fl P
+.Op Fl Xdx
+.Op Fl f Ar file
+.Op Ar file ...
+.Ar expression
+.Sh DESCRIPTION
+.Nm
+recursively descends the directory tree for each
+.Ar file
+listed, evaluating an
+.Ar expression
+(composed of the ``primaries'' and ``operands'' listed below) in terms
+of each file in the tree.
+.Pp
+The options are as follows:
+.Pp
+.Bl -tag -width Ds
+.It Fl H
+The
+.Fl H
+option causes the file information and file type (see
+.Xr stat 2 ) ,
+returned for each symbolic link encountered on the command line to be 
+those of the file referenced by the link, not the link itself.
+If the referenced file does not exist, the file information and type will
+be for the link itself.  File information of all symbolic links not on 
+the command line is that of the link itself.
+.It Fl L
+The
+.Fl L
+option causes the file information and file type (see
+.Xr stat 2)
+returned for each symbolic link to be those of the file referenced by the
+link, not the link itself.
+If the referenced file does not exist, the file information and type will
+be for the link itself.
+.It Fl P
+The
+.Fl P
+option causes the file information and file type (see
+.Xr stat 2)
+returned for each symbolic link to be those of the link itself.
+.It Fl X
+The
+.Fl X
+option is a modification to permit
+.Nm
+to be safely used in conjunction with
+.Xr xargs 1 .
+If a file name contains any of the delimiting characters used by
+.Xr xargs ,
+a diagnostic message is displayed on standard error, and the file
+is skipped.
+The delimiting characters include single (`` ' '') and double (`` " '')
+quotes, backslash (``\e''), space, tab and newline characters.
+.It Fl d
+The
+.Fl d
+option causes
+.Nm
+to perform a depth\-first traversal, i.e. directories
+are visited in post\-order and all entries in a directory will be acted
+on before the directory itself.
+By default,
+.Nm
+visits directories in pre\-order, i.e. before their contents.
+Note, the default is
+.Ar not
+a breadth\-first traversal.
+.It Fl f
+The
+.Fl f
+option specifies a file hierarchy for
+.Nm
+to traverse.
+File hierarchies may also be specified as the operands immediately
+following the options.
+.It Fl h
+The
+.Fl h
+option causes the file information and file type (see
+.Xr stat  2  ) ,
+returned for each symbolic link to be those of the file referenced by the
+link, not the link itself.
+If the referenced file does not exist, the file information and type will
+be for the link itself.
+.It Fl x
+The
+.Fl x
+option prevents
+.Nm
+from descending into directories that have a device number different
+than that of the file from which the descent began.
+.El
+.Sh PRIMARIES
+.Bl -tag -width Ds
+.It Ic -atime Ar n 
+True if the difference between the file last access time and the time
+.Nm
+was started, rounded up to the next full 24\-hour period, is
+.Ar n
+24\-hour periods.
+.It Ic -ctime Ar n 
+True if the difference between the time of last change of file status
+information and the time
+.Nm
+was started, rounded up to the next full 24\-hour period, is
+.Ar n
+24\-hour periods.
+.It Ic -exec Ar utility Op argument ... ; 
+True if the program named
+.Ar utility
+returns a zero value as its exit status.
+Optional arguments may be passed to the utility.
+The expression must be terminated by a semicolon (``;'').
+If the string ``{}'' appears anywhere in the utility name or the
+arguments it is replaced by the pathname of the current file.
+.Ar Utility
+will be executed from the directory from which
+.Nm
+was executed.
+.It Ic -follow
+Follow symbolic links.
+.It Ic -fstype Ar type 
+True if the file is contained in a file system of type
+.Ar type .
+The
+.Xr sysctl 8
+command can be used to find out the types of filesystems
+that are available on the system:
+.Bd -literal -offset indent
+sysctl vfs
+.Ed
+In addition, there are two pseudo-types, ``local'' and ``rdonly''.
+The former matches any file system physically mounted on the system where
+the
+.Nm
+is being executed, and the latter matches any file system which is
+mounted read-only.
+.It Ic -group Ar gname 
+True if the file belongs to the group
+.Ar gname  .
+If
+.Ar gname
+is numeric and there is no such group name, then
+.Ar gname
+is treated as a group id.
+.It Ic -inum Ar n 
+True if the file has inode number
+.Ar n  .
+.It Ic -links Ar n 
+True if the file has
+.Ar n
+links.
+.It Ic -ls
+This primary always evaluates to true.
+The following information for the current file is written to standard output:
+its inode number, size in 512\-byte blocks, file permissions, number of hard
+links, owner, group, size in bytes, last modification time, and pathname.
+If the file is a block or character special file, the major and minor numbers
+will be displayed instead of the size in bytes.
+If the file is a symbolic link, the pathname of the linked\-to file will be
+displayed preceded by ``\->''.
+The format is identical to that produced by ``ls \-dgils''.
+.It Ic -mtime Ar n 
+True if the difference between the file last modification time and the time
+.Nm
+was started, rounded up to the next full 24\-hour period, is
+.Ar n
+24\-hour periods.
+.It Ic \&-ok Ar utility Op argument ... ; 
+The
+.Ic \&-ok
+primary is identical to the
+.Ic -exec
+primary with the exception that
+.Nm
+requests user affirmation for the execution of the utility by printing
+a message to the terminal and reading a response.
+If the response is other than ``y'' the command is not executed and the
+value of the
+.Ar \&ok
+expression is false.
+.It Ic -name Ar pattern 
+True if the last component of the pathname being examined matches
+.Ar pattern  .
+Special shell pattern matching characters (``['', ``]'', ``*'', and ``?'')
+may be used as part of
+.Ar pattern  .
+These characters may be matched explicitly by escaping them with a
+backslash (``\e'').
+.It Ic -newer Ar file 
+True if the current file has a more recent last modification time than
+.Ar file  .
+.It Ic -nouser
+True if the file belongs to an unknown user.
+.It Ic -nogroup
+True if the file belongs to an unknown group.
+.It Ic -path Ar pattern 
+True if the pathname being examined matches
+.Ar pattern  .
+Special shell pattern matching characters (``['', ``]'', ``*'', and ``?'')
+may be used as part of
+.Ar pattern  .
+These characters may be matched explicitly by escaping them with a
+backslash (``\e'').
+Slashes (``/'') are treated as normal characters and do not have to be
+matched explicitly.
+.It Ic -perm Op Fl Ns Ar mode 
+The
+.Ar mode
+may be either symbolic (see
+.Xr chmod  1  )
+or an octal number.
+If the mode is symbolic, a starting value of zero is assumed and the
+mode sets or clears permissions without regard to the process' file mode
+creation mask.
+If the mode is octal, only bits 07777
+.Pf ( Dv S_ISUID
+|
+.Dv S_ISGID
+|
+.Dv S_ISTXT
+|
+.Dv S_IRWXU
+|
+.Dv S_IRWXG
+|
+.Dv S_IRWXO )
+of the file's mode bits participate
+in the comparison.
+If the mode is preceded by a dash (``\-''), this primary evaluates to true
+if at least all of the bits in the mode are set in the file's mode bits.
+If the mode is not preceded by a dash, this primary evaluates to true if
+the bits in the mode exactly match the file's mode bits.
+Note, the first character of a symbolic mode may not be a dash (``\-'').
+.It Ic -print
+This primary always evaluates to true.
+It prints the pathname of the current file to standard output, followed
+by a newline character.
+If none of
+.Ic -exec ,
+.Ic -ls ,
+.Ic -ok ,
+nor
+.Ic -print0
+is specified, the given expression shall be effectively replaced by
+.Cm \&( Ns Ar given\& expression Ns Cm \&) 
+.Ic -print .
+.It Ic -print0
+This primary always evaluates to true.
+It prints the pathname of the current file to standard output, followed
+by a null character.
+.It Ic -prune
+This primary always evaluates to true.
+It causes
+.Nm
+to not descend into the current file.
+Note, the
+.Ic -prune
+primary has no effect if the
+.Fl d
+option was specified.
+.It Ic -size Ar n Ns Op Cm c 
+True if the file's size, rounded up, in 512\-byte blocks is
+.Ar n  .
+If
+.Ar n
+is followed by a ``c'', then the primary is true if the
+file's size is
+.Ar n
+bytes.
+.It Ic -type Ar t 
+True if the file is of the specified type.
+Possible file types are as follows:
+.Pp
+.Bl -tag -width flag -offset indent -compact
+.It Cm W
+whiteout
+.It Cm b
+block special
+.It Cm c
+character special
+.It Cm d
+directory
+.It Cm f
+regular file
+.It Cm l
+symbolic link
+.It Cm p
+FIFO
+.It Cm s
+socket
+.El
+.Pp
+.It Ic -user Ar uname 
+True if the file belongs to the user
+.Ar uname  .
+If
+.Ar uname
+is numeric and there is no such user name, then
+.Ar uname
+is treated as a user id.
+.El
+.Pp
+All primaries which take a numeric argument allow the number to be
+preceded by a plus sign (``+'') or a minus sign (``\-'').
+A preceding plus sign means ``more than n'', a preceding minus sign means
+``less than n'' and neither means ``exactly n'' .
+.Sh OPERATORS
+The primaries may be combined using the following operators.
+The operators are listed in order of decreasing precedence.
+.Bl -tag -width (expression) 
+.It Cm \&( Ns Ar expression Ns Cm \&) 
+This evaluates to true if the parenthesized expression evaluates to
+true.
+.Pp
+.It Cm \&! Ns Ar expression 
+This is the unary
+.Tn NOT
+operator.
+It evaluates to true if the expression is false.
+.Pp
+.It Ar expression Cm -and Ar expression 
+.It Ar expression expression 
+The
+.Cm -and
+operator is the logical
+.Tn AND
+operator.
+As it is implied by the juxtaposition of two expressions it does not
+have to be specified.
+The expression evaluates to true if both expressions are true.
+The second expression is not evaluated if the first expression is false.
+.Pp
+.It Ar expression Cm -or Ar expression 
+The
+.Cm -or
+operator is the logical
+.Tn OR
+operator.
+The expression evaluates to true if either the first or the second expression
+is true.
+The second expression is not evaluated if the first expression is true.
+.El
+.Pp
+All operands and primaries must be separate arguments to
+.Nm ""  .
+Primaries which themselves take arguments expect each argument
+to be a separate argument to
+.Nm ""  .
+.Sh EXAMPLES
+.Pp
+The following examples are shown as given to the shell:
+.Bl -tag -width findx
+.It Li "find  /  \e!  -name  \*q*.c\*q  -print"
+Print out a list of all the files whose names do not end in ``.c''.
+.It Li "find  /  -newer  ttt  -user  wnj  -print"
+Print out a list of all the files owned by user ``wnj'' that are newer
+than the file ``ttt''.
+.It Li "find  /  \e!  \e(  -newer  ttt  -user  wnj  \e)  -print"
+Print out a list of all the files which are not both newer than ``ttt''
+and owned by ``wnj''.
+.It Li "find  /  \e(  -newer  ttt  -or  -user wnj  \e)  -print"
+Print out a list of all the files that are either owned by ``wnj'' or
+that are newer than ``ttt''.
+.El
+.Sh SEE ALSO
+.Xr chmod 1 ,
+.Xr locate 1 ,
+.Xr stat 2 ,
+.Xr fts 3 ,
+.Xr getpwent 3 ,
+.Xr getgrent 3 ,
+.Xr strmode 3 ,
+.Xr symlink 7
+.Sh STANDARDS
+The
+.Nm
+utility syntax is a superset of the syntax specified by the
+.St -p1003.2
+standard.
+.Pp
+The options and the
+.Ic -follow ,
+.Ic -fstype ,
+.Ic -inum ,
+.Ic -links ,
+.Ic -ls 
+and
+.Ic -print0
+primaries are extensions to
+.St -p1003.2 .
+.Pp
+Historically, the
+.Fl d ,
+.Fl h
+and
+.Fl x
+options were implemented using the primaries ``\-depth'', ``\-follow'',
+and ``\-xdev''.
+These primaries always evaluated to true.
+As they were really global variables that took effect before the traversal
+began, some legal expressions could have unexpected results.
+An example is the expression ``\-print \-o \-depth''.
+As \-print always evaluates to true, the standard order of evaluation
+implies that \-depth would never be evaluated.
+This is not the case.
+.Pp
+The operator ``-or'' was implemented as ``\-o'', and the operator ``-and''
+was implemented as ``\-a''.
+.Pp
+Historic implementations of the
+.Ic -exec
+and
+.Ic -ok
+primaries did not replace the string ``{}'' in the utility name or the
+utility arguments if it had preceding or following non-whitespace characters.
+This version replaces it no matter where in the utility name or arguments
+it appears.
+.Sh BUGS
+The special characters used by
+.Nm
+are also special characters to many shell programs.
+In particular, the characters ``*'', ``['', ``]'', ``?'', ``('', ``)'',
+``!'', ``\e'' and ``;'' may have to be escaped from the shell.
+.Pp
+As there is no delimiter separating options and file names or file
+names and the
+.Ar expression ,
+it is difficult to specify files named ``-xdev'' or ``!''.
+These problems are handled by the
+.Fl f
+option and the
+.Xr getopt 3
+``--'' construct.
diff --git a/find/find.c b/find/find.c
new file mode 100644 (file)
index 0000000..a1672ac
--- /dev/null
@@ -0,0 +1,211 @@
+/*     $NetBSD: find.c,v 1.11 1998/02/21 22:47:20 christos Exp $       */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Cimarron D. Taylor of the University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "from: @(#)find.c       8.5 (Berkeley) 8/5/94";
+#else
+__RCSID("$NetBSD: find.c,v 1.11 1998/02/21 22:47:20 christos Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fts.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "find.h"
+
+/*
+ * find_formplan --
+ *     process the command line and create a "plan" corresponding to the
+ *     command arguments.
+ */
+PLAN *
+find_formplan(argv)
+       char **argv;
+{
+       PLAN *plan, *tail, *new;
+
+       /*
+        * for each argument in the command line, determine what kind of node
+        * it is, create the appropriate node type and add the new plan node
+        * to the end of the existing plan.  The resulting plan is a linked
+        * list of plan nodes.  For example, the string:
+        *
+        *      % find . -name foo -newer bar -print
+        *
+        * results in the plan:
+        *
+        *      [-name foo]--> [-newer bar]--> [-print]
+        *
+        * in this diagram, `[-name foo]' represents the plan node generated
+        * by c_name() with an argument of foo and `-->' represents the
+        * plan->next pointer.
+        */
+       for (plan = tail = NULL; *argv;) {
+               if (!(new = find_create(&argv)))
+                       continue;
+               if (plan == NULL)
+                       tail = plan = new;
+               else {
+                       tail->next = new;
+                       tail = new;
+               }
+       }
+    
+       /*
+        * if the user didn't specify one of -print, -ok or -exec, then -print
+        * is assumed so we bracket the current expression with parens, if
+        * necessary, and add a -print node on the end.
+        */
+       if (!isoutput) {
+               if (plan == NULL) {
+                       new = c_print(NULL, 0);
+                       tail = plan = new;
+               } else {
+                       new = c_openparen(NULL, 0);
+                       new->next = plan;
+                       plan = new;
+                       new = c_closeparen(NULL, 0);
+                       tail->next = new;
+                       tail = new;
+                       new = c_print(NULL, 0);
+                       tail->next = new;
+                       tail = new;
+               }
+       }
+    
+       /*
+        * the command line has been completely processed into a search plan
+        * except for the (, ), !, and -o operators.  Rearrange the plan so
+        * that the portions of the plan which are affected by the operators
+        * are moved into operator nodes themselves.  For example:
+        *
+        *      [!]--> [-name foo]--> [-print]
+        *
+        * becomes
+        *
+        *      [! [-name foo] ]--> [-print]
+        *
+        * and
+        *
+        *      [(]--> [-depth]--> [-name foo]--> [)]--> [-print]
+        *
+        * becomes
+        *
+        *      [expr [-depth]-->[-name foo] ]--> [-print]
+        *
+        * operators are handled in order of precedence.
+        */
+
+       plan = paren_squish(plan);              /* ()'s */
+       plan = not_squish(plan);                /* !'s */
+       plan = or_squish(plan);                 /* -o's */
+       return (plan);
+}
+FTS *tree;                     /* pointer to top of FTS hierarchy */
+
+/*
+ * find_execute --
+ *     take a search plan and an array of search paths and executes the plan
+ *     over all FTSENT's returned for the given search paths.
+ */
+int
+find_execute(plan, paths)
+       PLAN *plan;             /* search plan */
+       char **paths;           /* array of pathnames to traverse */
+{
+       register FTSENT *entry;
+       PLAN *p;
+       int rval;
+    
+       if (!(tree = fts_open(paths, ftsoptions, NULL)))
+               err(1, "ftsopen");
+
+       for (rval = 0; (entry = fts_read(tree)) != NULL; ) {
+               switch (entry->fts_info) {
+               case FTS_D:
+                       if (isdepth)
+                               continue;
+                       break;
+               case FTS_DP:
+                       if (!isdepth)
+                               continue;
+                       break;
+               case FTS_DNR:
+               case FTS_ERR:
+               case FTS_NS:
+                       (void)fflush(stdout);
+                       warnx("%s: %s",
+                           entry->fts_path, strerror(entry->fts_errno));
+                       rval = 1;
+                       continue;
+#ifdef FTS_W
+               case FTS_W:
+                       continue;
+#endif /* FTS_W */
+               }
+#define        BADCH   " \t\n\\'\""
+               if (isxargs && strpbrk(entry->fts_path, BADCH)) {
+                       (void)fflush(stdout);
+                       warnx("%s: illegal path", entry->fts_path);
+                       rval = 1;
+                       continue;
+               }
+                
+               /*
+                * Call all the functions in the execution plan until one is
+                * false or all have been executed.  This is where we do all
+                * the work specified by the user on the command line.
+                */
+               for (p = plan; p && (p->eval)(p, entry); p = p->next)
+                       ;
+       }
+       if (errno)
+               err(1, "fts_read");
+       (void)fts_close(tree);
+       return (rval);
+}
diff --git a/find/find.h b/find/find.h
new file mode 100644 (file)
index 0000000..804011f
--- /dev/null
@@ -0,0 +1,106 @@
+/*     $NetBSD: find.h,v 1.8 1998/02/21 22:47:20 christos Exp $        */
+
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Cimarron D. Taylor of the University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     from: @(#)find.h        8.1 (Berkeley) 6/6/93
+ */
+
+/* node type */
+enum ntype {
+       N_AND = 1,                              /* must start > 0 */
+       N_ATIME, N_CLOSEPAREN, N_CTIME, N_DEPTH, N_EXEC, N_EXPR, N_FOLLOW,
+       N_FSTYPE, N_GROUP, N_INUM, N_LINKS, N_LS, N_MTIME, N_NAME, N_NEWER,
+       N_NOGROUP, N_NOT, N_NOUSER, N_OK, N_OPENPAREN, N_OR, N_PATH,
+       N_PERM, N_PRINT, N_PRINT0, N_PRUNE, N_SIZE, N_TYPE, N_USER, N_XDEV,
+};
+
+/* node definition */
+typedef struct _plandata {
+       struct _plandata *next;                 /* next node */
+       int (*eval)                             /* node evaluation function */
+           __P((struct _plandata *, FTSENT *));
+#define        F_EQUAL         1                       /* [acm]time inum links size */
+#define        F_LESSTHAN      2
+#define        F_GREATER       3
+#define        F_NEEDOK        1                       /* exec ok */
+#define        F_MTFLAG        1                       /* fstype */
+#define        F_MTTYPE        2
+#define        F_ATLEAST       1                       /* perm */
+       int flags;                              /* private flags */
+       enum ntype type;                        /* plan node type */
+       union {
+               gid_t _g_data;                  /* gid */
+               ino_t _i_data;                  /* inode */
+               mode_t _m_data;                 /* mode mask */
+               nlink_t _l_data;                /* link count */
+               off_t _o_data;                  /* file size */
+               time_t _t_data;                 /* time value */
+               uid_t _u_data;                  /* uid */
+               short _mt_data;                 /* mount flags */
+               struct _plandata *_p_data[2];   /* PLAN trees */
+               struct _ex {
+                       char **_e_argv;         /* argv array */
+                       char **_e_orig;         /* original strings */
+                       int *_e_len;            /* allocated length */
+               } ex;
+               char *_a_data[2];               /* array of char pointers */
+               char *_c_data;                  /* char pointer */
+       } p_un;
+} PLAN;
+#define        a_data  p_un._a_data
+#define        c_data  p_un._c_data
+#define        i_data  p_un._i_data
+#define        g_data  p_un._g_data
+#define        l_data  p_un._l_data
+#define        m_data  p_un._m_data
+#define        mt_data p_un._mt_data
+#define        o_data  p_un._o_data
+#define        p_data  p_un._p_data
+#define        t_data  p_un._t_data
+#define        u_data  p_un._u_data
+#define        e_argv  p_un.ex._e_argv
+#define        e_orig  p_un.ex._e_orig
+#define        e_len   p_un.ex._e_len
+
+typedef struct _option {
+       char *name;                     /* option name */
+       enum ntype token;               /* token type */
+       PLAN *(*create)                 /* create function */
+               __P((char ***, int));
+       int arg;                        /* function needs arg */
+} OPTION;
+
+#include "extern.h"
diff --git a/find/function.c b/find/function.c
new file mode 100644 (file)
index 0000000..efa1abe
--- /dev/null
@@ -0,0 +1,1187 @@
+/*     $NetBSD: function.c,v 1.24 1998/02/21 22:47:20 christos Exp $   */
+
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Cimarron D. Taylor of the University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "from: @(#)function.c   8.10 (Berkeley) 5/4/95";
+#else
+__RCSID("$NetBSD: function.c,v 1.24 1998/02/21 22:47:20 christos Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/mount.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fnmatch.h>
+#include <fts.h>
+#include <grp.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <tzfile.h>
+#include <unistd.h>
+
+#include "find.h"
+
+#define        COMPARE(a, b) {                                                 \
+       switch (plan->flags) {                                          \
+       case F_EQUAL:                                                   \
+               return (a == b);                                        \
+       case F_LESSTHAN:                                                \
+               return (a < b);                                         \
+       case F_GREATER:                                                 \
+               return (a > b);                                         \
+       default:                                                        \
+               abort();                                                \
+       }                                                               \
+}
+
+static long    find_parsenum __P((PLAN *, char *, char *, char *));
+       int     f_always_true __P((PLAN *, FTSENT *));
+       int     f_atime __P((PLAN *, FTSENT *));
+       int     f_ctime __P((PLAN *, FTSENT *));
+       int     f_exec __P((PLAN *, FTSENT *));
+       int     f_fstype __P((PLAN *, FTSENT *));
+       int     f_group __P((PLAN *, FTSENT *));
+       int     f_inum __P((PLAN *, FTSENT *));
+       int     f_links __P((PLAN *, FTSENT *));
+       int     f_ls __P((PLAN *, FTSENT *));
+       int     f_mtime __P((PLAN *, FTSENT *));
+       int     f_name __P((PLAN *, FTSENT *));
+       int     f_newer __P((PLAN *, FTSENT *));
+       int     f_nogroup __P((PLAN *, FTSENT *));
+       int     f_nouser __P((PLAN *, FTSENT *));
+       int     f_path __P((PLAN *, FTSENT *));
+       int     f_perm __P((PLAN *, FTSENT *));
+       int     f_print __P((PLAN *, FTSENT *));
+       int     f_print0 __P((PLAN *, FTSENT *));
+       int     f_prune __P((PLAN *, FTSENT *));
+       int     f_size __P((PLAN *, FTSENT *));
+       int     f_type __P((PLAN *, FTSENT *));
+       int     f_user __P((PLAN *, FTSENT *));
+       int     f_not __P((PLAN *, FTSENT *));
+       int     f_or __P((PLAN *, FTSENT *));
+static PLAN   *palloc __P((enum ntype, int (*) __P((PLAN *, FTSENT *))));
+
+/*
+ * find_parsenum --
+ *     Parse a string of the form [+-]# and return the value.
+ */
+static long
+find_parsenum(plan, option, vp, endch)
+       PLAN *plan;
+       char *option, *vp, *endch;
+{
+       long value;
+       char *endchar, *str;    /* Pointer to character ending conversion. */
+    
+       /* Determine comparison from leading + or -. */
+       str = vp;
+       switch (*str) {
+       case '+':
+               ++str;
+               plan->flags = F_GREATER;
+               break;
+       case '-':
+               ++str;
+               plan->flags = F_LESSTHAN;
+               break;
+       default:
+               plan->flags = F_EQUAL;
+               break;
+       }
+    
+       /*
+        * Convert the string with strtol().  Note, if strtol() returns zero
+        * and endchar points to the beginning of the string we know we have
+        * a syntax error.
+        */
+       value = strtol(str, &endchar, 10);
+       if (value == 0 && endchar == str)
+               errx(1, "%s: %s: illegal numeric value", option, vp);
+       if (endchar[0] && (endch == NULL || endchar[0] != *endch))
+               errx(1, "%s: %s: illegal trailing character", option, vp);
+       if (endch)
+               *endch = endchar[0];
+       return (value);
+}
+
+/*
+ * The value of n for the inode times (atime, ctime, and mtime) is a range,
+ * i.e. n matches from (n - 1) to n 24 hour periods.  This interacts with
+ * -n, such that "-mtime -1" would be less than 0 days, which isn't what the
+ * user wanted.  Correct so that -1 is "less than 1".
+ */
+#define        TIME_CORRECT(p, ttype)                                          \
+       if ((p)->type == ttype && (p)->flags == F_LESSTHAN)             \
+               ++((p)->t_data);
+
+/*
+ * -atime n functions --
+ *
+ *     True if the difference between the file access time and the
+ *     current time is n 24 hour periods.
+ */
+int
+f_atime(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       extern time_t now;
+
+       COMPARE((now - entry->fts_statp->st_atime +
+           SECSPERDAY - 1) / SECSPERDAY, plan->t_data);
+}
+PLAN *
+c_atime(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *arg = **argvp;
+       PLAN *new;
+
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+
+       new = palloc(N_ATIME, f_atime);
+       new->t_data = find_parsenum(new, "-atime", arg, NULL);
+       TIME_CORRECT(new, N_ATIME);
+       return (new);
+}
+/*
+ * -ctime n functions --
+ *
+ *     True if the difference between the last change of file
+ *     status information and the current time is n 24 hour periods.
+ */
+int
+f_ctime(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       extern time_t now;
+
+       COMPARE((now - entry->fts_statp->st_ctime +
+           SECSPERDAY - 1) / SECSPERDAY, plan->t_data);
+}
+PLAN *
+c_ctime(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *arg = **argvp;
+       PLAN *new;
+
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+
+       new = palloc(N_CTIME, f_ctime);
+       new->t_data = find_parsenum(new, "-ctime", arg, NULL);
+       TIME_CORRECT(new, N_CTIME);
+       return (new);
+}
+
+/*
+ * -depth functions --
+ *
+ *     Always true, causes descent of the directory hierarchy to be done
+ *     so that all entries in a directory are acted on before the directory
+ *     itself.
+ */
+int
+f_always_true(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       return (1);
+}
+PLAN *
+c_depth(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       isdepth = 1;
+
+       return (palloc(N_DEPTH, f_always_true));
+}
+/*
+ * [-exec | -ok] utility [arg ... ] ; functions --
+ *
+ *     True if the executed utility returns a zero value as exit status.
+ *     The end of the primary expression is delimited by a semicolon.  If
+ *     "{}" occurs anywhere, it gets replaced by the current pathname.
+ *     The current directory for the execution of utility is the same as
+ *     the current directory when the find utility was started.
+ *
+ *     The primary -ok is different in that it requests affirmation of the
+ *     user before executing the utility.
+ */
+int
+f_exec(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       extern int dotfd;
+       int cnt;
+       pid_t pid;
+       int status;
+
+       for (cnt = 0; plan->e_argv[cnt]; ++cnt)
+               if (plan->e_len[cnt])
+                       brace_subst(plan->e_orig[cnt], &plan->e_argv[cnt],
+                           entry->fts_path, plan->e_len[cnt]);
+
+       if (plan->flags == F_NEEDOK && !queryuser(plan->e_argv))
+               return (0);
+
+       /* don't mix output of command with find output */
+       fflush(stdout);
+       fflush(stderr);
+
+       switch (pid = vfork()) {
+       case -1:
+               err(1, "fork");
+               /* NOTREACHED */
+       case 0:
+               if (fchdir(dotfd)) {
+                       warn("chdir");
+                       _exit(1);
+               }
+               execvp(plan->e_argv[0], plan->e_argv);
+               warn("%s", plan->e_argv[0]);
+               _exit(1);
+       }
+       pid = waitpid(pid, &status, 0);
+       return (pid != -1 && WIFEXITED(status) && !WEXITSTATUS(status));
+}
+/*
+ * c_exec --
+ *     build three parallel arrays, one with pointers to the strings passed
+ *     on the command line, one with (possibly duplicated) pointers to the
+ *     argv array, and one with integer values that are lengths of the
+ *     strings, but also flags meaning that the string has to be massaged.
+ */
+PLAN *
+c_exec(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       PLAN *new;                      /* node returned */
+       int cnt;
+       char **argv, **ap, *p;
+
+       isoutput = 1;
+    
+       new = palloc(N_EXEC, f_exec);
+       if (isok)
+               new->flags = F_NEEDOK;
+
+       for (ap = argv = *argvp;; ++ap) {
+               if (!*ap)
+                       errx(1,
+                           "%s: no terminating \";\"", isok ? "-ok" : "-exec");
+               if (**ap == ';')
+                       break;
+       }
+
+       cnt = ap - *argvp + 1;
+       new->e_argv = (char **)emalloc((u_int)cnt * sizeof(char *));
+       new->e_orig = (char **)emalloc((u_int)cnt * sizeof(char *));
+       new->e_len = (int *)emalloc((u_int)cnt * sizeof(int));
+
+       for (argv = *argvp, cnt = 0; argv < ap; ++argv, ++cnt) {
+               new->e_orig[cnt] = *argv;
+               for (p = *argv; *p; ++p)
+                       if (p[0] == '{' && p[1] == '}') {
+                               new->e_argv[cnt] = emalloc((u_int)MAXPATHLEN);
+                               new->e_len[cnt] = MAXPATHLEN;
+                               break;
+                       }
+               if (!*p) {
+                       new->e_argv[cnt] = *argv;
+                       new->e_len[cnt] = 0;
+               }
+       }
+       new->e_argv[cnt] = new->e_orig[cnt] = NULL;
+
+       *argvp = argv + 1;
+       return (new);
+}
+/*
+ * -follow functions --
+ *
+ *     Always true, causes symbolic links to be followed on a global
+ *     basis.
+ */
+PLAN *
+c_follow(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       ftsoptions &= ~FTS_PHYSICAL;
+       ftsoptions |= FTS_LOGICAL;
+
+       return (palloc(N_FOLLOW, f_always_true));
+}
+/*
+ * -fstype functions --
+ *
+ *     True if the file is of a certain type.
+ */
+int
+f_fstype(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       static dev_t curdev;    /* need a guaranteed illegal dev value */
+       static int first = 1;
+       struct statfs sb;
+       static short val;
+       static char fstype[MFSNAMELEN];
+       char *p, save[2];
+
+       /* Only check when we cross mount point. */
+       if (first || curdev != entry->fts_statp->st_dev) {
+               curdev = entry->fts_statp->st_dev;
+
+               /*
+                * Statfs follows symlinks; find wants the link's file system,
+                * not where it points.
+                */
+               if (entry->fts_info == FTS_SL ||
+                   entry->fts_info == FTS_SLNONE) {
+                       if ((p = strrchr(entry->fts_accpath, '/')) != NULL)
+                               ++p;
+                       else
+                               p = entry->fts_accpath;
+                       save[0] = p[0];
+                       p[0] = '.';
+                       save[1] = p[1];
+                       p[1] = '\0';
+                       
+               } else 
+                       p = NULL;
+
+               if (statfs(entry->fts_accpath, &sb))
+                       err(1, "%s", entry->fts_accpath);
+
+               if (p) {
+                       p[0] = save[0];
+                       p[1] = save[1];
+               }
+
+               first = 0;
+
+               /*
+                * Further tests may need both of these values, so
+                * always copy both of them.
+                */
+               val = sb.f_flags;
+               strncpy(fstype, sb.f_fstypename, MFSNAMELEN);
+       }
+       switch (plan->flags) {
+       case F_MTFLAG:
+               return (val & plan->mt_data);   
+       case F_MTTYPE:
+               return (strncmp(fstype, plan->c_data, MFSNAMELEN) == 0);
+       default:
+               abort();
+       }
+}
+PLAN *
+c_fstype(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *arg = **argvp;
+       PLAN *new;
+    
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+    
+       new = palloc(N_FSTYPE, f_fstype);
+
+       switch (*arg) {
+       case 'l':
+               if (!strcmp(arg, "local")) {
+                       new->flags = F_MTFLAG;
+                       new->mt_data = MNT_LOCAL;
+                       return (new);
+               }
+               break;
+       case 'r':
+               if (!strcmp(arg, "rdonly")) {
+                       new->flags = F_MTFLAG;
+                       new->mt_data = MNT_RDONLY;
+                       return (new);
+               }
+               break;
+       }
+
+       new->flags = F_MTTYPE;
+       new->c_data = arg;
+       return (new);
+}
+/*
+ * -group gname functions --
+ *
+ *     True if the file belongs to the group gname.  If gname is numeric and
+ *     an equivalent of the getgrnam() function does not return a valid group
+ *     name, gname is taken as a group ID.
+ */
+int
+f_group(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       return (entry->fts_statp->st_gid == plan->g_data);
+}
+PLAN *
+c_group(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *gname = **argvp;
+       PLAN *new;
+       struct group *g;
+       gid_t gid;
+    
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+
+       g = getgrnam(gname);
+       if (g == NULL) {
+               gid = atoi(gname);
+               if (gid == 0 && gname[0] != '0')
+                       errx(1, "-group: %s: no such group", gname);
+       } else
+               gid = g->gr_gid;
+    
+       new = palloc(N_GROUP, f_group);
+       new->g_data = gid;
+       return (new);
+}
+
+/*
+ * -inum n functions --
+ *
+ *     True if the file has inode # n.
+ */
+int
+f_inum(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       COMPARE(entry->fts_statp->st_ino, plan->i_data);
+}
+PLAN *
+c_inum(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *arg = **argvp;
+       PLAN *new;
+    
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+    
+       new = palloc(N_INUM, f_inum);
+       new->i_data = find_parsenum(new, "-inum", arg, NULL);
+       return (new);
+}
+/*
+ * -links n functions --
+ *
+ *     True if the file has n links.
+ */
+int
+f_links(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       COMPARE(entry->fts_statp->st_nlink, plan->l_data);
+}
+PLAN *
+c_links(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *arg = **argvp;
+       PLAN *new;
+    
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+    
+       new = palloc(N_LINKS, f_links);
+       new->l_data = (nlink_t)find_parsenum(new, "-links", arg, NULL);
+       return (new);
+}
+/*
+ * -ls functions --
+ *
+ *     Always true - prints the current entry to stdout in "ls" format.
+ */
+int
+f_ls(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       printlong(entry->fts_path, entry->fts_accpath, entry->fts_statp);
+       return (1);
+}
+PLAN *
+c_ls(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       ftsoptions &= ~FTS_NOSTAT;
+       isoutput = 1;
+    
+       return (palloc(N_LS, f_ls));
+}
+
+/*
+ * -mtime n functions --
+ *
+ *     True if the difference between the file modification time and the
+ *     current time is n 24 hour periods.
+ */
+int
+f_mtime(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       extern time_t now;
+
+       COMPARE((now - entry->fts_statp->st_mtime + SECSPERDAY - 1) /
+           SECSPERDAY, plan->t_data);
+}
+PLAN *
+c_mtime(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *arg = **argvp;
+       PLAN *new;
+
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+
+       new = palloc(N_MTIME, f_mtime);
+       new->t_data = find_parsenum(new, "-mtime", arg, NULL);
+       TIME_CORRECT(new, N_MTIME);
+       return (new);
+}
+
+/*
+ * -name functions --
+ *
+ *     True if the basename of the filename being examined
+ *     matches pattern using Pattern Matching Notation S3.14
+ */
+int
+f_name(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       return (!fnmatch(plan->c_data, entry->fts_name, 0));
+}
+PLAN *
+c_name(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *pattern = **argvp;
+       PLAN *new;
+
+       (*argvp)++;
+       new = palloc(N_NAME, f_name);
+       new->c_data = pattern;
+       return (new);
+}
+/*
+ * -newer file functions --
+ *
+ *     True if the current file has been modified more recently
+ *     then the modification time of the file named by the pathname
+ *     file.
+ */
+int
+f_newer(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       return (entry->fts_statp->st_mtime > plan->t_data);
+}
+PLAN *
+c_newer(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *filename = **argvp;
+       PLAN *new;
+       struct stat sb;
+    
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+
+       if (stat(filename, &sb))
+               err(1, "%s", filename);
+       new = palloc(N_NEWER, f_newer);
+       new->t_data = sb.st_mtime;
+       return (new);
+}
+/*
+ * -nogroup functions --
+ *
+ *     True if file belongs to a user ID for which the equivalent
+ *     of the getgrnam() 9.2.1 [POSIX.1] function returns NULL.
+ */
+int
+f_nogroup(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+
+       return (group_from_gid(entry->fts_statp->st_gid, 1) ? 0 : 1);
+}
+PLAN *
+c_nogroup(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       ftsoptions &= ~FTS_NOSTAT;
+
+       return (palloc(N_NOGROUP, f_nogroup));
+}
+/*
+ * -nouser functions --
+ *
+ *     True if file belongs to a user ID for which the equivalent
+ *     of the getpwuid() 9.2.2 [POSIX.1] function returns NULL.
+ */
+int
+f_nouser(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+
+       return (user_from_uid(entry->fts_statp->st_uid, 1) ? 0 : 1);
+}
+PLAN *
+c_nouser(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       ftsoptions &= ~FTS_NOSTAT;
+
+       return (palloc(N_NOUSER, f_nouser));
+}
+/*
+ * -path functions --
+ *
+ *     True if the path of the filename being examined
+ *     matches pattern using Pattern Matching Notation S3.14
+ */
+int
+f_path(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       return (!fnmatch(plan->c_data, entry->fts_path, 0));
+}
+PLAN *
+c_path(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *pattern = **argvp;
+       PLAN *new;
+
+       (*argvp)++;
+       new = palloc(N_NAME, f_path);
+       new->c_data = pattern;
+       return (new);
+}
+/*
+ * -perm functions --
+ *
+ *     The mode argument is used to represent file mode bits.  If it starts
+ *     with a leading digit, it's treated as an octal mode, otherwise as a
+ *     symbolic mode.
+ */
+int
+f_perm(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       mode_t mode;
+
+       mode = entry->fts_statp->st_mode &
+           (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO);
+       if (plan->flags == F_ATLEAST)
+               return ((plan->m_data | mode) == mode);
+       else
+               return (mode == plan->m_data);
+       /* NOTREACHED */
+}
+PLAN *
+c_perm(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *perm = **argvp;
+       PLAN *new;
+       mode_t *set;
+
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+
+       new = palloc(N_PERM, f_perm);
+
+       if (*perm == '-') {
+               new->flags = F_ATLEAST;
+               ++perm;
+       }
+
+       if ((set = setmode(perm)) == NULL)
+               err(1, "-perm: %s: illegal mode string", perm);
+
+       new->m_data = getmode(set, 0);
+       return (new);
+}
+/*
+ * -print functions --
+ *
+ *     Always true, causes the current pathame to be written to
+ *     standard output.
+ */
+int
+f_print(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       (void)printf("%s\n", entry->fts_path);
+       return (1);
+}
+
+int
+f_print0(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       (void)fputs(entry->fts_path, stdout);
+       (void)fputc('\0', stdout);
+       return (1);
+}
+PLAN *
+c_print(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       isoutput = 1;
+
+       return (palloc(N_PRINT, f_print));
+}
+
+PLAN *
+c_print0(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       isoutput = 1;
+
+       return (palloc(N_PRINT0, f_print0));
+}
+/*
+ * -prune functions --
+ *
+ *     Prune a portion of the hierarchy.
+ */
+int
+f_prune(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       extern FTS *tree;
+
+       if (fts_set(tree, entry, FTS_SKIP))
+               err(1, "%s", entry->fts_path);
+       return (1);
+}
+PLAN *
+c_prune(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       return (palloc(N_PRUNE, f_prune));
+}
+/*
+ * -size n[c] functions --
+ *
+ *     True if the file size in bytes, divided by an implementation defined
+ *     value and rounded up to the next integer, is n.  If n is followed by
+ *     a c, the size is in bytes.
+ */
+#define        FIND_SIZE       512
+static int divsize = 1;
+
+int
+f_size(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       off_t size;
+
+       size = divsize ? (entry->fts_statp->st_size + FIND_SIZE - 1) /
+           FIND_SIZE : entry->fts_statp->st_size;
+       COMPARE(size, plan->o_data);
+}
+PLAN *
+c_size(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *arg = **argvp;
+       PLAN *new;
+       char endch;
+    
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+
+       new = palloc(N_SIZE, f_size);
+       endch = 'c';
+       new->o_data = find_parsenum(new, "-size", arg, &endch);
+       if (endch == 'c')
+               divsize = 0;
+       return (new);
+}
+/*
+ * -type c functions --
+ *
+ *     True if the type of the file is c, where c is b, c, d, p, f or w
+ *     for block special file, character special file, directory, FIFO,
+ *     regular file or whiteout respectively.
+ */
+int
+f_type(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       return ((entry->fts_statp->st_mode & S_IFMT) == plan->m_data);
+}
+PLAN *
+c_type(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *typestring = **argvp;
+       PLAN *new;
+       mode_t  mask = (mode_t)0;
+    
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+
+       switch (typestring[0]) {
+#ifdef S_IFWHT
+      case 'W':
+#ifdef FTS_WHITEOUT
+             ftsoptions |= FTS_WHITEOUT;
+#endif
+              mask = S_IFWHT;
+              break;
+#endif
+       case 'b':
+               mask = S_IFBLK;
+               break;
+       case 'c':
+               mask = S_IFCHR;
+               break;
+       case 'd':
+               mask = S_IFDIR;
+               break;
+       case 'f':
+               mask = S_IFREG;
+               break;
+       case 'l':
+               mask = S_IFLNK;
+               break;
+       case 'p':
+               mask = S_IFIFO;
+               break;
+       case 's':
+               mask = S_IFSOCK;
+               break;
+#ifdef FTS_WHITEOUT
+       case 'w':
+               mask = S_IFWHT;
+               ftsoptions |= FTS_WHITEOUT;
+               break;
+#endif /* FTS_WHITEOUT */
+       default:
+               errx(1, "-type: %s: unknown type", typestring);
+       }
+    
+       new = palloc(N_TYPE, f_type);
+       new->m_data = mask;
+       return (new);
+}
+/*
+ * -user uname functions --
+ *
+ *     True if the file belongs to the user uname.  If uname is numeric and
+ *     an equivalent of the getpwnam() S9.2.2 [POSIX.1] function does not
+ *     return a valid user name, uname is taken as a user ID.
+ */
+int
+f_user(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       return (entry->fts_statp->st_uid == plan->u_data);
+}
+PLAN *
+c_user(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       char *username = **argvp;
+       PLAN *new;
+       struct passwd *p;
+       uid_t uid;
+    
+       (*argvp)++;
+       ftsoptions &= ~FTS_NOSTAT;
+
+       p = getpwnam(username);
+       if (p == NULL) {
+               uid = atoi(username);
+               if (uid == 0 && username[0] != '0')
+                       errx(1, "-user: %s: no such user", username);
+       } else
+               uid = p->pw_uid;
+
+       new = palloc(N_USER, f_user);
+       new->u_data = uid;
+       return (new);
+}
+/*
+ * -xdev functions --
+ *
+ *     Always true, causes find not to decend past directories that have a
+ *     different device ID (st_dev, see stat() S5.6.2 [POSIX.1])
+ */
+PLAN *
+c_xdev(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       ftsoptions |= FTS_XDEV;
+
+       return (palloc(N_XDEV, f_always_true));
+}
+
+/*
+ * ( expression ) functions --
+ *
+ *     True if expression is true.
+ */
+int
+f_expr(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       PLAN *p;
+       int state;
+
+       state = 0;
+       for (p = plan->p_data[0];
+           p && (state = (p->eval)(p, entry)); p = p->next);
+       return (state);
+}
+/*
+ * N_OPENPAREN and N_CLOSEPAREN nodes are temporary place markers.  They are
+ * eliminated during phase 2 of find_formplan() --- the '(' node is converted
+ * to a N_EXPR node containing the expression and the ')' node is discarded.
+ */
+PLAN *
+c_openparen(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       return (palloc(N_OPENPAREN, (int (*) __P((PLAN *, FTSENT *)))-1));
+}
+PLAN *
+c_closeparen(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       return (palloc(N_CLOSEPAREN, (int (*) __P((PLAN *, FTSENT *)))-1));
+}
+/*
+ * ! expression functions --
+ *
+ *     Negation of a primary; the unary NOT operator.
+ */
+int
+f_not(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       PLAN *p;
+       int state;
+
+       state = 0;
+       for (p = plan->p_data[0];
+           p && (state = (p->eval)(p, entry)); p = p->next);
+       return (!state);
+}
+PLAN *
+c_not(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       return (palloc(N_NOT, f_not));
+}
+/*
+ * expression -o expression functions --
+ *
+ *     Alternation of primaries; the OR operator.  The second expression is
+ * not evaluated if the first expression is true.
+ */
+int
+f_or(plan, entry)
+       PLAN *plan;
+       FTSENT *entry;
+{
+       PLAN *p;
+       int state;
+
+       state = 0;
+       for (p = plan->p_data[0];
+           p && (state = (p->eval)(p, entry)); p = p->next);
+
+       if (state)
+               return (1);
+
+       for (p = plan->p_data[1];
+           p && (state = (p->eval)(p, entry)); p = p->next);
+       return (state);
+}
+
+PLAN *
+c_or(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       return (palloc(N_OR, f_or));
+}
+
+PLAN *
+c_null(argvp, isok)
+       char ***argvp;
+       int isok;
+{
+       return NULL;
+}
+
+static PLAN *
+palloc(t, f)
+       enum ntype t;
+       int (*f) __P((PLAN *, FTSENT *));
+{
+       PLAN *new;
+
+       if ((new = malloc(sizeof(PLAN))) == NULL)
+               err(1, "%s", "");
+       new->type = t;
+       new->eval = f;
+       new->flags = 0;
+       new->next = NULL;
+       return (new);
+}
diff --git a/find/ls.c b/find/ls.c
new file mode 100644 (file)
index 0000000..cdce351
--- /dev/null
+++ b/find/ls.c
@@ -0,0 +1,131 @@
+/*     $NetBSD: ls.c,v 1.10 1998/03/03 02:22:40 thorpej Exp $  */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "from: @(#)ls.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: ls.c,v 1.10 1998/03/03 02:22:40 thorpej Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fts.h>
+#include <grp.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <tzfile.h>
+#include <unistd.h>
+#include <utmp.h>
+
+#include "find.h"
+
+/* Derived from the print routines in the ls(1) source code. */
+
+static void printlink __P((char *));
+static void printtime __P((time_t));
+
+void
+printlong(name, accpath, sb)
+       char *name;                     /* filename to print */
+       char *accpath;                  /* current valid path to filename */
+       struct stat *sb;                /* stat buffer */
+{
+       char modep[15];
+
+       (void)printf("%6lu %4qd ", (u_long)sb->st_ino,
+           (long long)sb->st_blocks);
+       (void)strmode(sb->st_mode, modep);
+       (void)printf("%s %3u %-*s %-*s ", modep, sb->st_nlink, UT_NAMESIZE,
+           user_from_uid(sb->st_uid, 0), UT_NAMESIZE,
+           group_from_gid(sb->st_gid, 0));
+
+       if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode))
+               (void)printf("%3d, %3d ", major(sb->st_rdev),
+                   minor(sb->st_rdev));
+       else
+               (void)printf("%8qd ", (long long)sb->st_size);
+       printtime(sb->st_mtime);
+       (void)printf("%s", name);
+       if (S_ISLNK(sb->st_mode))
+               printlink(accpath);
+       (void)putchar('\n');
+}
+
+static void
+printtime(ftime)
+       time_t ftime;
+{
+       int i;
+       char *longstring;
+
+       longstring = ctime(&ftime);
+       for (i = 4; i < 11; ++i)
+               (void)putchar(longstring[i]);
+
+#define        SIXMONTHS       ((DAYSPERNYEAR / 2) * SECSPERDAY)
+       if (ftime + SIXMONTHS > time((time_t *)NULL))
+               for (i = 11; i < 16; ++i)
+                       (void)putchar(longstring[i]);
+       else {
+               (void)putchar(' ');
+               for (i = 20; i < 24; ++i)
+                       (void)putchar(longstring[i]);
+       }
+       (void)putchar(' ');
+}
+
+static void
+printlink(name)
+       char *name;
+{
+       int lnklen;
+       char path[MAXPATHLEN + 1];
+
+       if ((lnklen = readlink(name, path, MAXPATHLEN)) == -1) {
+               warn("%s", name);
+               return;
+       }
+       path[lnklen] = '\0';
+       (void)printf(" -> %s", path);
+}
diff --git a/find/main.c b/find/main.c
new file mode 100644 (file)
index 0000000..ed2f090
--- /dev/null
@@ -0,0 +1,158 @@
+/*     $NetBSD: main.c,v 1.10 1998/02/10 21:52:51 cgd Exp $    */
+
+/*-
+ * Copyright (c) 1990, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Cimarron D. Taylor of the University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)main.c     8.4 (Berkeley) 5/4/95";
+#else
+__COPYRIGHT("@(#) Copyright (c) 1990, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
+__RCSID("$NetBSD: main.c,v 1.10 1998/02/10 21:52:51 cgd Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <fts.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "find.h"
+
+time_t now;                    /* time find was run */
+int dotfd;                     /* starting directory */
+int ftsoptions;                        /* options for the ftsopen(3) call */
+int isdeprecated;              /* using deprecated syntax */
+int isdepth;                   /* do directories on post-order visit */
+int isoutput;                  /* user specified output operator */
+int isxargs;                   /* don't permit xargs delimiting chars */
+
+int main __P((int, char **));
+static void usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       char **p, **start;
+       int ch;
+
+       (void)time(&now);       /* initialize the time-of-day */
+
+       /* array to hold dir list.  at most (argc - 1) elements. */
+       p = start = alloca(argc * sizeof (char *));
+
+       ftsoptions = FTS_NOSTAT | FTS_PHYSICAL;
+       while ((ch = getopt(argc, argv, "HLPXdf:x")) != EOF)
+               switch(ch) {
+               case 'H':
+                       ftsoptions |= FTS_COMFOLLOW;
+#if 0  /* XXX necessary? */
+                       ftsoptions &= ~FTS_LOGICAL;
+#endif
+                       break;
+               case 'L':
+                       ftsoptions &= ~FTS_COMFOLLOW;
+                       ftsoptions |= FTS_LOGICAL;
+                       break;
+               case 'P':
+                       ftsoptions &= ~(FTS_COMFOLLOW|FTS_LOGICAL);
+                       ftsoptions |= FTS_PHYSICAL;
+                       break;
+               case 'X':
+                       isxargs = 1;
+                       break;
+               case 'd':
+                       isdepth = 1;
+                       break;
+               case 'f':
+                       *p++ = optarg;
+                       break;
+               case 'h':
+                       ftsoptions &= ~FTS_PHYSICAL;
+                       ftsoptions |= FTS_LOGICAL;
+                       break;
+               case 'x':
+                       ftsoptions |= FTS_XDEV;
+                       break;
+               case '?':
+               default:
+                       break;
+               }
+
+       argc -= optind; 
+       argv += optind;
+
+       /*
+        * Find first option to delimit the file list.  The first argument
+        * that starts with a -, or is a ! or a ( must be interpreted as a
+        * part of the find expression, according to POSIX .2.
+        */
+       for (; *argv != NULL; *p++ = *argv++) {
+               if (argv[0][0] == '-')
+                       break;
+               if ((argv[0][0] == '!' || argv[0][0] == '(') &&
+                   argv[0][1] == '\0')
+                       break;
+       }
+
+       if (p == start)
+               usage();
+       *p = NULL;
+
+       if ((dotfd = open(".", O_RDONLY, 0)) < 0)
+               err(1, ".");
+
+       exit(find_execute(find_formplan(argv), start));
+}
+
+static void
+usage()
+{
+       (void)fprintf(stderr,
+"usage: find [-H | -L | -P] [-Xdhx] [-f file] [file ...] [expression]\n");
+       exit(1);
+}
diff --git a/find/misc.c b/find/misc.c
new file mode 100644 (file)
index 0000000..cf6a85b
--- /dev/null
@@ -0,0 +1,135 @@
+/*     $NetBSD: misc.c,v 1.7 1998/02/02 14:02:25 mrg Exp $     */
+
+/*-
+ * Copyright (c) 1990, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Cimarron D. Taylor of the University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "from: @(#)misc.c       8.2 (Berkeley) 4/1/94";
+#else
+__RCSID("$NetBSD: misc.c,v 1.7 1998/02/02 14:02:25 mrg Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fts.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "find.h"
+/*
+ * brace_subst --
+ *     Replace occurrences of {} in orig with path, and place it in a malloced
+ *      area of memory set in store.
+ */
+void
+brace_subst(orig, store, path, len)
+       char *orig, **store, *path;
+       int len;
+{
+       int plen;
+       char ch, *p;
+
+       plen = strlen(path);
+       for (p = *store; (ch = *orig) != '\0'; ++orig)
+               if (ch == '{' && orig[1] == '}') {
+                       while ((p - *store) + plen > len)
+                               if (!(*store = realloc(*store, len *= 2)))
+                                       err(1, "realloc");
+                       memmove(p, path, plen);
+                       p += plen;
+                       ++orig;
+               } else
+                       *p++ = ch;
+       *p = '\0';
+}
+
+/*
+ * queryuser --
+ *     print a message to standard error and then read input from standard
+ *     input. If the input is 'y' then 1 is returned.
+ */
+int
+queryuser(argv)
+       char **argv;
+{
+       int ch, first, nl;
+
+       (void)fprintf(stderr, "\"%s", *argv);
+       while (*++argv)
+               (void)fprintf(stderr, " %s", *argv);
+       (void)fprintf(stderr, "\"? ");
+       (void)fflush(stderr);
+
+       first = ch = getchar();
+       for (nl = 0;;) {
+               if (ch == '\n') {
+                       nl = 1;
+                       break;
+               }
+               if (ch == EOF)
+                       break;
+               ch = getchar();
+       }
+
+       if (!nl) {
+               (void)fprintf(stderr, "\n");
+               (void)fflush(stderr);
+       }
+        return (first == 'y');
+}
+/*
+ * emalloc --
+ *     malloc with error checking.
+ */
+void *
+emalloc(len)
+       u_int len;
+{
+       void *p;
+
+       if ((p = malloc(len)) == NULL)
+               err(1, "malloc");
+       return (p);
+}
diff --git a/find/operator.c b/find/operator.c
new file mode 100644 (file)
index 0000000..128a785
--- /dev/null
@@ -0,0 +1,279 @@
+/*     $NetBSD: operator.c,v 1.6 1998/02/21 22:47:21 christos Exp $    */
+
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Cimarron D. Taylor of the University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "from: @(#)operator.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: operator.c,v 1.6 1998/02/21 22:47:21 christos Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <err.h>
+#include <fts.h>
+#include <stdio.h>
+
+#include "find.h"
+    
+static PLAN *yanknode __P((PLAN **));
+static PLAN *yankexpr __P((PLAN **));
+
+/*
+ * yanknode --
+ *     destructively removes the top from the plan
+ */
+static PLAN *
+yanknode(planp)    
+       PLAN **planp;           /* pointer to top of plan (modified) */
+{
+       PLAN *node;             /* top node removed from the plan */
+    
+       if ((node = (*planp)) == NULL)
+               return (NULL);
+       (*planp) = (*planp)->next;
+       node->next = NULL;
+       return (node);
+}
+/*
+ * yankexpr --
+ *     Removes one expression from the plan.  This is used mainly by
+ *     paren_squish.  In comments below, an expression is either a
+ *     simple node or a N_EXPR node containing a list of simple nodes.
+ */
+static PLAN *
+yankexpr(planp)    
+       PLAN **planp;           /* pointer to top of plan (modified) */
+{
+       PLAN *next;             /* temp node holding subexpression results */
+       PLAN *node;             /* pointer to returned node or expression */
+       PLAN *tail;             /* pointer to tail of subplan */
+       PLAN *subplan;          /* pointer to head of ( ) expression */
+    
+       /* first pull the top node from the plan */
+       if ((node = yanknode(planp)) == NULL)
+               return (NULL);
+    
+       /*
+        * If the node is an '(' then we recursively slurp up expressions
+        * until we find its associated ')'.  If it's a closing paren we
+        * just return it and unwind our recursion; all other nodes are
+        * complete expressions, so just return them.
+        */
+       if (node->type == N_OPENPAREN)
+               for (tail = subplan = NULL;;) {
+                       if ((next = yankexpr(planp)) == NULL)
+                               err(1, "(: missing closing ')'");
+                       /*
+                        * If we find a closing ')' we store the collected
+                        * subplan in our '(' node and convert the node to
+                        * a N_EXPR.  The ')' we found is ignored.  Otherwise,
+                        * we just continue to add whatever we get to our
+                        * subplan.
+                        */
+                       if (next->type == N_CLOSEPAREN) {
+                               if (subplan == NULL)
+                                       errx(1, "(): empty inner expression");
+                               node->p_data[0] = subplan;
+                               node->type = N_EXPR;
+                               node->eval = f_expr;
+                               break;
+                       } else {
+                               if (subplan == NULL)
+                                       tail = subplan = next;
+                               else {
+                                       tail->next = next;
+                                       tail = next;
+                               }
+                               tail->next = NULL;
+                       }
+               }
+       return (node);
+}
+/*
+ * paren_squish --
+ *     replaces "parentheisized" plans in our search plan with "expr" nodes.
+ */
+PLAN *
+paren_squish(plan)
+       PLAN *plan;             /* plan with ( ) nodes */
+{
+       PLAN *expr;             /* pointer to next expression */
+       PLAN *tail;             /* pointer to tail of result plan */
+       PLAN *result;           /* pointer to head of result plan */
+    
+       result = tail = NULL;
+
+       /*
+        * the basic idea is to have yankexpr do all our work and just
+        * collect it's results together.
+        */
+       while ((expr = yankexpr(&plan)) != NULL) {
+               /*
+                * if we find an unclaimed ')' it means there is a missing
+                * '(' someplace.
+                */
+               if (expr->type == N_CLOSEPAREN)
+                       errx(1, "): no beginning '('");
+
+               /* add the expression to our result plan */
+               if (result == NULL)
+                       tail = result = expr;
+               else {
+                       tail->next = expr;
+                       tail = expr;
+               }
+               tail->next = NULL;
+       }
+       return (result);
+}
+/*
+ * not_squish --
+ *     compresses "!" expressions in our search plan.
+ */
+PLAN *
+not_squish(plan)
+       PLAN *plan;             /* plan to process */
+{
+       PLAN *next;             /* next node being processed */
+       PLAN *node;             /* temporary node used in N_NOT processing */
+       PLAN *tail;             /* pointer to tail of result plan */
+       PLAN *result;           /* pointer to head of result plan */
+    
+       tail = result = next = NULL;
+    
+       while ((next = yanknode(&plan)) != NULL) {
+               /*
+                * if we encounter a ( expression ) then look for nots in
+                * the expr subplan.
+                */
+               if (next->type == N_EXPR)
+                       next->p_data[0] = not_squish(next->p_data[0]);
+
+               /*
+                * if we encounter a not, then snag the next node and place
+                * it in the not's subplan.  As an optimization we compress
+                * several not's to zero or one not.
+                */
+               if (next->type == N_NOT) {
+                       int notlevel = 1;
+
+                       node = yanknode(&plan);
+                       while (node->type == N_NOT) {
+                               ++notlevel;
+                               node = yanknode(&plan);
+                       }
+                       if (node == NULL)
+                               errx(1, "!: no following expression");
+                       if (node->type == N_OR)
+                               errx(1, "!: nothing between ! and -o");
+                       if (notlevel % 2 != 1)
+                               next = node;
+                       else
+                               next->p_data[0] = node;
+               }
+
+               /* add the node to our result plan */
+               if (result == NULL)
+                       tail = result = next;
+               else {
+                       tail->next = next;
+                       tail = next;
+               }
+               tail->next = NULL;
+       }
+       return (result);
+}
+/*
+ * or_squish --
+ *     compresses -o expressions in our search plan.
+ */
+PLAN *
+or_squish(plan)
+       PLAN *plan;             /* plan with ors to be squished */
+{
+       PLAN *next;             /* next node being processed */
+       PLAN *tail;             /* pointer to tail of result plan */
+       PLAN *result;           /* pointer to head of result plan */
+    
+       tail = result = next = NULL;
+    
+       while ((next = yanknode(&plan)) != NULL) {
+               /*
+                * if we encounter a ( expression ) then look for or's in
+                * the expr subplan.
+                */
+               if (next->type == N_EXPR)
+                       next->p_data[0] = or_squish(next->p_data[0]);
+
+               /* if we encounter a not then look for not's in the subplan */
+               if (next->type == N_NOT)
+                       next->p_data[0] = or_squish(next->p_data[0]);
+
+               /*
+                * if we encounter an or, then place our collected plan in the
+                * or's first subplan and then recursively collect the
+                * remaining stuff into the second subplan and return the or.
+                */
+               if (next->type == N_OR) {
+                       if (result == NULL)
+                               errx(1, "-o: no expression before -o");
+                       next->p_data[0] = result;
+                       next->p_data[1] = or_squish(plan);
+                       if (next->p_data[1] == NULL)
+                               errx(1, "-o: no expression after -o");
+                       return (next);
+               }
+
+               /* add the node to our result plan */
+               if (result == NULL)
+                       tail = result = next;
+               else {
+                       tail->next = next;
+                       tail = next;
+               }
+               tail->next = NULL;
+       }
+       return (result);
+}
diff --git a/find/option.c b/find/option.c
new file mode 100644 (file)
index 0000000..f531dab
--- /dev/null
@@ -0,0 +1,144 @@
+/*     $NetBSD: option.c,v 1.9 1998/02/21 22:47:21 christos Exp $      */
+
+/*-
+ * Copyright (c) 1990, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Cimarron D. Taylor of the University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "from: @(#)option.c     8.2 (Berkeley) 4/16/94";
+#else
+__RCSID("$NetBSD: option.c,v 1.9 1998/02/21 22:47:21 christos Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <err.h>
+#include <fts.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "find.h"
+
+int typecompare __P((const void *, const void *));
+static OPTION *option __P((char *));
+
+/* NB: the following table must be sorted lexically. */
+static OPTION const options[] = {
+       { "!",          N_NOT,          c_not,          0 },
+       { "(",          N_OPENPAREN,    c_openparen,    0 },
+       { ")",          N_CLOSEPAREN,   c_closeparen,   0 },
+       { "-a",         N_AND,          c_null,         0 },
+       { "-and",       N_AND,          c_null,         0 },
+       { "-atime",     N_ATIME,        c_atime,        1 },
+       { "-ctime",     N_CTIME,        c_ctime,        1 },
+       { "-depth",     N_DEPTH,        c_depth,        0 },
+       { "-exec",      N_EXEC,         c_exec,         1 },
+       { "-follow",    N_FOLLOW,       c_follow,       0 },
+       { "-fstype",    N_FSTYPE,       c_fstype,       1 },
+       { "-group",     N_GROUP,        c_group,        1 },
+       { "-inum",      N_INUM,         c_inum,         1 },
+       { "-links",     N_LINKS,        c_links,        1 },
+       { "-ls",        N_LS,           c_ls,           0 },
+       { "-mtime",     N_MTIME,        c_mtime,        1 },
+       { "-name",      N_NAME,         c_name,         1 },
+       { "-newer",     N_NEWER,        c_newer,        1 },
+       { "-nogroup",   N_NOGROUP,      c_nogroup,      0 },
+       { "-nouser",    N_NOUSER,       c_nouser,       0 },
+       { "-o",         N_OR,           c_or,           0 },
+       { "-ok",        N_OK,           c_exec,         1 },
+       { "-or",        N_OR,           c_or,           0 },
+       { "-path",      N_PATH,         c_path,         1 },
+       { "-perm",      N_PERM,         c_perm,         1 },
+       { "-print",     N_PRINT,        c_print,        0 },
+       { "-print0",    N_PRINT0,       c_print0,       0 },
+       { "-prune",     N_PRUNE,        c_prune,        0 },
+       { "-size",      N_SIZE,         c_size,         1 },
+       { "-type",      N_TYPE,         c_type,         1 },
+       { "-user",      N_USER,         c_user,         1 },
+       { "-xdev",      N_XDEV,         c_xdev,         0 }
+};
+
+/*
+ * find_create --
+ *     create a node corresponding to a command line argument.
+ *
+ * TODO:
+ *     add create/process function pointers to node, so we can skip
+ *     this switch stuff.
+ */
+PLAN *
+find_create(argvp)
+       char ***argvp;
+{
+       OPTION *p;
+       PLAN *new;
+       char **argv;
+
+       argv = *argvp;
+
+       if ((p = option(*argv)) == NULL)
+               errx(1, "%s: unknown option", *argv);
+       ++argv;
+       if (p->arg && !*argv)
+               errx(1, "%s: requires additional arguments", *--argv);
+
+       new = (p->create)(&argv, p->token == N_OK);
+
+       *argvp = argv;
+       return (new);
+}
+
+static OPTION *
+option(name)
+       char *name;
+{
+       OPTION tmp;
+
+       tmp.name = name;
+       return ((OPTION *)bsearch(&tmp, options,
+           sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare));
+}
+
+int
+typecompare(a, b)
+       const void *a, *b;
+{
+       return (strcmp(((OPTION *)a)->name, ((OPTION *)b)->name));
+}
diff --git a/getopt/Makefile b/getopt/Makefile
new file mode 100644 (file)
index 0000000..8a99a0c
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = getopt
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = getopt.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble getopt.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/getopt/Makefile.postamble b/getopt/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/getopt/Makefile.preamble b/getopt/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/getopt/PB.project b/getopt/PB.project
new file mode 100644 (file)
index 0000000..b33ada1
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (getopt.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, getopt.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = getopt; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/getopt/getopt.1 b/getopt/getopt.1
new file mode 100644 (file)
index 0000000..410f61b
--- /dev/null
@@ -0,0 +1,121 @@
+.\"    $NetBSD: getopt.1,v 1.8 1997/10/19 02:16:57 lukem Exp $
+.Dd June 21, 1993
+.Dt GETOPT 1
+.Os
+.Sh NAME
+.Nm getopt
+.Nd parse command options
+.Sh SYNOPSIS
+.Li args=\`getopt optstring $*\`
+.Pp
+.Li set \-\- \`getopt optstring $*\`
+.Sh DESCRIPTION
+.Nm
+is used to break up options in command lines for easy parsing by
+shell procedures, and to check for legal options.
+.Op Optstring
+is a string of recognized option letters (see
+.Xr getopt 3
+);
+if a letter is followed by a colon, the option
+is expected to have an argument which may or may not be
+separated from it by white space.
+The special option
+.Dq \-\-
+is used to delimit the end of the options.
+.Nm
+will place
+.Dq \-\-
+in the arguments at the end of the options,
+or recognize it if used explicitly.
+The shell arguments
+(\fB$1 $2\fR ...) are reset so that each option is
+preceded by a
+.Dq \-
+and in its own shell argument;
+each option argument is also in its own shell argument.
+.Sh EXAMPLE
+The following code fragment shows how one might process the arguments
+for a command that can take the options
+.Op a
+and
+.Op b ,
+and the option
+.Op o ,
+which requires an argument.
+.Pp
+.Bd -literal -offset indent
+args=\`getopt abo: $*\`
+if test $? != 0
+then
+       echo 'Usage: ...'
+       exit 2
+fi
+set \-\- $args
+for i
+do
+       case "$i"
+       in
+               \-a|\-b)
+                       flag=$i; shift;;
+               \-o)
+                       oarg=$2; shift; shift;;
+               \-\-)
+                       shift; break;;
+       esac
+done
+.Ed
+.Pp
+This code will accept any of the following as equivalent:
+.Pp
+.Bd -literal -offset indent
+cmd \-aoarg file file
+cmd \-a \-o arg file file
+cmd \-oarg -a file file
+cmd \-a \-oarg \-\- file file
+.Ed
+.Pp
+.St -p1003.2
+mandates that the 
+.Xr sh 1
+set command return the value of 0 for the exit status.  Therefore,
+the exit status of the
+.Nm
+command is lost when
+.Nm
+and the
+.Xr sh 1
+set command are used on the same line.  The example given
+is one way to detect errors found by 
+.Nm "" .
+.Sh SEE ALSO
+.Xr sh 1 ,
+.Xr getopt 3
+.Sh DIAGNOSTICS
+.Nm
+prints an error message on the standard error output when it
+encounters an option letter not included in
+.Op optstring .
+.Sh HISTORY
+Written by Henry Spencer, working from a Bell Labs manual page.
+Behavior believed identical to the Bell version.
+.Sh BUGS
+Whatever
+.Xr getopt 3
+has.
+.Pp
+Arguments containing white space or embedded shell metacharacters
+generally will not survive intact;  this looks easy to fix but isn't.
+.Pp
+The error message for an invalid option is identified as coming
+from
+.Nm
+rather than from the shell procedure containing the invocation
+of
+.Nm "" ;
+this again is hard to fix.
+.Pp
+The precise best way to use the
+.Ic set
+command to set the arguments without disrupting the value(s) of
+shell options varies from one shell version to another.
diff --git a/getopt/getopt.c b/getopt/getopt.c
new file mode 100644 (file)
index 0000000..ca485b3
--- /dev/null
@@ -0,0 +1,40 @@
+/*     $NetBSD: getopt.c,v 1.5 1998/02/03 03:44:22 perry Exp $ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: getopt.c,v 1.5 1998/02/03 03:44:22 perry Exp $");
+#endif /* not lint */
+
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int    main __P((int, char **));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int c;
+       int status = 0;
+
+       optind = 2;     /* Past the program name and the option letters. */
+       while ((c = getopt(argc, argv, argv[1])) != -1)
+               switch (c) {
+               case '?':
+                       status = 1;     /* getopt routine gave message */
+                       break;
+               default:
+                       if (optarg != NULL)
+                               printf(" -%c %s", c, optarg);
+                       else
+                               printf(" -%c", c);
+                       break;
+               }
+       printf(" --");
+       for (; optind < argc; optind++)
+               printf(" %s", argv[optind]);
+       printf("\n");
+       exit(status);
+}
diff --git a/hostname/Makefile b/hostname/Makefile
new file mode 100644 (file)
index 0000000..f1ded63
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = hostname
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = hostname.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble hostname.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+NEXTSTEP_PB_CFLAGS = -DKERNEL_PRIVATE
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/hostname/Makefile.postamble b/hostname/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/hostname/Makefile.preamble b/hostname/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/hostname/PB.project b/hostname/PB.project
new file mode 100644 (file)
index 0000000..e120a56
--- /dev/null
@@ -0,0 +1,28 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (hostname.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, hostname.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_COMPILEROPTIONS = "-DKERNEL_PRIVATE"; 
+    NEXTSTEP_INSTALLDIR = /bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = hostname; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/hostname/hostname.1 b/hostname/hostname.1
new file mode 100644 (file)
index 0000000..c64e9f0
--- /dev/null
@@ -0,0 +1,69 @@
+.\"    $NetBSD: hostname.1,v 1.13 1997/10/20 08:52:03 enami Exp $
+.\"
+.\" Copyright (c) 1983, 1988, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)hostname.1  8.2 (Berkeley) 4/28/95
+.\"
+.Dd April 28, 1995
+.Dt HOSTNAME 1
+.Os BSD 4.2
+.Sh NAME
+.Nm hostname
+.Nd set or print name of current host system
+.Sh SYNOPSIS
+.Nm
+.Op Fl s
+.Op Ar name-of-host
+.Sh DESCRIPTION
+.Nm
+prints the name of the current host.  The super-user can
+set the host name by supplying an argument; this is usually done in the
+network initialization script
+.Pa /etc/netstart ,
+normally run at boot
+time.
+.Pp
+Options:
+.Bl -tag -width flag
+.It Fl s
+Trims off any domain information from the printed
+name.
+.El
+.Sh SEE ALSO
+.Xr domainname 1 ,
+.Xr gethostname 3 ,
+.Xr sethostname 3
+.Sh HISTORY
+The
+.Nm
+utility appeared in
+.Bx 4.2 .
diff --git a/hostname/hostname.c b/hostname/hostname.c
new file mode 100644 (file)
index 0000000..e78fe5c
--- /dev/null
@@ -0,0 +1,107 @@
+/*     $NetBSD: hostname.c,v 1.13 1998/07/28 05:31:24 mycroft Exp $    */
+
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1988, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)hostname.c 8.2 (Berkeley) 4/28/95";
+#else
+__RCSID("$NetBSD: hostname.c,v 1.13 1998/07/28 05:31:24 mycroft Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+void usage __P((void));
+int main __P((int, char *[]));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int ch, sflag;
+       char *p, hostname[MAXHOSTNAMELEN + 1];
+
+       sflag = 0;
+       while ((ch = getopt(argc, argv, "s")) != -1)
+               switch (ch) {
+               case 's':
+                       sflag = 1;
+                       break;
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc > 1)
+               usage();
+
+       if (*argv) {
+               if (sethostname(*argv, strlen(*argv)))
+                       err(1, "sethostname");
+       } else {
+               if (gethostname(hostname, sizeof(hostname)))
+                       err(1, "gethostname");
+               hostname[sizeof(hostname) - 1] = '\0';
+               if (sflag && (p = strchr(hostname, '.')))
+                       *p = '\0';
+               (void)printf("%s\n", hostname);
+       }
+       exit(0);
+       /* NOTREACHED */
+}
+
+void
+usage()
+{
+
+       (void)fprintf(stderr, "usage: hostname [-s] [name-of-host]\n");
+       exit(1);
+       /* NOTREACHED */
+}
diff --git a/id/Makefile b/id/Makefile
new file mode 100644 (file)
index 0000000..0bbc53f
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = id
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = id.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble groups.1\
+            id.1 whoami.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+NEXTSTEP_PB_CFLAGS = -Wno-error
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/id/Makefile.postamble b/id/Makefile.postamble
new file mode 100644 (file)
index 0000000..e161269
--- /dev/null
@@ -0,0 +1,5 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
+
+after_install::
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/groups
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/whoami
diff --git a/id/Makefile.preamble b/id/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/id/PB.project b/id/PB.project
new file mode 100644 (file)
index 0000000..ad50e39
--- /dev/null
@@ -0,0 +1,28 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (id.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, groups.1, id.1, whoami.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_COMPILEROPTIONS = "-Wno-error"; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = id; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/id/groups.1 b/id/groups.1
new file mode 100644 (file)
index 0000000..02a90e9
--- /dev/null
@@ -0,0 +1,66 @@
+.\"    $NetBSD: groups.1,v 1.6 1998/04/28 07:19:29 fair Exp $
+.\"
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)groups.1      8.1 (Berkeley) 6/6/93
+.\"    $NetBSD: groups.1,v 1.6 1998/04/28 07:19:29 fair Exp $
+.\"
+.Dd June 6, 1993
+.Dt GROUPS 1
+.Os BSD 3
+.Sh NAME
+.Nm groups
+.Nd show group memberships
+.Sh SYNOPSIS
+.Nm
+.Op Ar user
+.Sh DESCRIPTION
+The
+.Nm
+utility has been obsoleted by the
+.Xr id 1
+utility, and is equivalent to
+.Dq Nm id Fl Gn Op Ar user .
+The command
+.Dq Nm id Fl p
+is suggested for normal interactive use.
+.Pp
+The
+.Nm
+utility displays the groups to which you (or the optionally specified user)
+belong.
+.Pp
+The
+.Nm
+utility exits 0 on success, and >0 if an error occurs.
+.Sh SEE ALSO
+.Xr id 1
diff --git a/id/id.1 b/id/id.1
new file mode 100644 (file)
index 0000000..b4b2bc7
--- /dev/null
+++ b/id/id.1
@@ -0,0 +1,141 @@
+.\"    $NetBSD: id.1,v 1.7 1997/10/19 02:45:47 lukem Exp $
+.\"
+.\" Copyright (c) 1991, 1993, 1994
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)id.1        8.2 (Berkeley) 5/5/94
+.\"
+.Dd May 5, 1994
+.Dt ID 1
+.Os BSD 4.4
+.Sh NAME
+.Nm id
+.Nd return user identity
+.Sh SYNOPSIS
+.Nm
+.Op Ar user
+.Nm ""
+.Fl G Op Fl n
+.Op Ar user
+.Nm ""
+.Fl g Op Fl nr
+.Op Ar user
+.Nm ""
+.Fl p
+.Nm ""
+.Fl u Op Fl nr
+.Op Ar user
+.Sh DESCRIPTION
+The
+.Nm
+utility displays the user and group names and numeric IDs, of the
+calling process, to the standard output.
+If the real and effective IDs are different, both are displayed,
+otherwise only the real ID is displayed.
+.Pp
+If a
+.Ar user
+(login name or user ID)
+is specified, the user and group IDs of that user are displayed.
+In this case, the real and effective IDs are assumed to be the same.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl G
+Display the different group IDs (effective, real and supplementary)
+as white-space separated numbers, in no particular order.
+.It Fl g
+Display the effective group ID as a number.
+.It Fl n
+Display the name of the user or group ID for the
+.Fl G ,
+.Fl g
+and
+.Fl u
+options instead of the number.
+If any of the ID numbers cannot be mapped into names, the number will be
+displayed as usual.
+.It Fl p
+Make the output human-readable.
+If the user name returned by
+.Xr getlogin 2
+is different from the login name referenced by the user ID, the name
+returned by
+.Xr getlogin 2
+is displayed, preceded by the keyword ``login''.
+The user ID as a name is displayed, preceded by the keyword ``uid''.
+If the effective user ID is different from the real user ID, the real user
+ID is displayed as a name, preceded by the keyword ``euid''.
+If the effective group ID is different from the real group ID, the real group
+ID is displayed as a name, preceded by the keyword ``rgid''.
+The list of groups to which the user belongs is then displayed as names,
+preceded by the keyword ``groups''.
+Each display is on a separate line.
+.It Fl r
+Display the real ID for the
+.Fl g
+and
+.Fl u
+options instead of the effective ID.
+.It Fl u
+Display the effective user ID as a number.
+.El
+.Pp
+The
+.Nm
+utility exits 0 on success, and >0 if an error occurs.
+.Sh SEE ALSO
+.Xr who 1
+.Sh STANDARDS
+The
+.Nm
+function is expected to conform to
+.St -p1003.2 .
+.Sh HISTORY
+The
+historic
+.Xr groups 1
+command is equivalent to
+.Dq Nm id Fl Gn Op Ar user .
+.Pp
+The
+historic
+.Xr whoami 1
+command is equivalent to
+.Dq Nm id Fl un .
+.Pp
+The
+.Nm
+command first appeared in
+.Bx 4.4 .
diff --git a/id/id.c b/id/id.c
new file mode 100644 (file)
index 0000000..b8732a0
--- /dev/null
+++ b/id/id.c
@@ -0,0 +1,345 @@
+/*-
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1991, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)id.c       8.3 (Berkeley) 4/28/95";
+#else
+__RCSID("$NetBSD: id.c,v 1.10 1998/08/25 20:59:37 ross Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+
+#include <err.h>
+#include <errno.h>
+#include <grp.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+void   current __P((void));
+void   pretty __P((struct passwd *));
+int    main __P((int, char **));
+void   group __P((struct passwd *, int));
+void   usage __P((void));
+void   user __P((struct passwd *));
+struct passwd *
+       who __P((char *));
+
+#ifdef __APPLE__
+extern char *__progname;
+#endif
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       struct group *gr;
+       struct passwd *pw;
+       int ch, id;
+       int Gflag, gflag, nflag, pflag, rflag, uflag;
+
+       Gflag = gflag = nflag = pflag = rflag = uflag = 0;
+
+        if (!strcmp(__progname, "groups")) {
+                Gflag = 1;
+                nflag = 1;
+        }
+        else if (!strcmp(__progname, "whoami")) {
+                uflag = 1;
+                nflag = 1;
+        }
+
+       while ((ch = getopt(argc, argv, "Ggnpru")) != -1)
+               switch(ch) {
+               case 'G':
+                       Gflag = 1;
+                       break;
+               case 'g':
+                       gflag = 1;
+                       break;
+               case 'n':
+                       nflag = 1;
+                       break;
+               case 'p':
+                       pflag = 1;
+                       break;
+               case 'r':
+                       rflag = 1;
+                       break;
+               case 'u':
+                       uflag = 1;
+                       break;
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       switch(Gflag + gflag + pflag + uflag) {
+       case 1:
+               break;
+       case 0:
+               if (!nflag && !rflag)
+                       break;
+               /* FALLTHROUGH */
+       default:
+               usage();
+       }
+
+       pw = *argv ? who(*argv) : NULL;
+
+       if (gflag) {
+               id = pw ? pw->pw_gid : rflag ? getgid() : getegid();
+               if (nflag && (gr = getgrgid(id)))
+                       (void)printf("%s\n", gr->gr_name);
+               else
+                       (void)printf("%u\n", id);
+               exit(0);
+       }
+
+       if (uflag) {
+               id = pw ? pw->pw_uid : rflag ? getuid() : geteuid();
+               if (nflag && (pw = getpwuid(id)))
+                       (void)printf("%s\n", pw->pw_name);
+               else
+                       (void)printf("%u\n", id);
+               exit(0);
+       }
+
+       if (Gflag) {
+               group(pw, nflag);
+               exit(0);
+       }
+
+       if (pflag) {
+               pretty(pw);
+               exit(0);
+       }
+
+       if (pw)
+               user(pw);
+       else
+               current();
+       exit(0);
+}
+
+void
+pretty(pw)
+       struct passwd *pw;
+{
+       struct group *gr;
+       u_int eid, rid;
+       char *login;
+
+       if (pw) {
+               (void)printf("uid\t%s\n", pw->pw_name);
+               (void)printf("groups\t");
+               group(pw, 1);
+       } else {
+               if ((login = getlogin()) == NULL)
+                       err(1, "getlogin");
+
+               pw = getpwuid(rid = getuid());
+               if (pw == NULL || strcmp(login, pw->pw_name))
+                       (void)printf("login\t%s\n", login);
+               if (pw)
+                       (void)printf("uid\t%s\n", pw->pw_name);
+               else
+                       (void)printf("uid\t%u\n", rid);
+               
+               if ((eid = geteuid()) != rid) {
+                       if ((pw = getpwuid(eid)) != NULL)
+                               (void)printf("euid\t%s", pw->pw_name);
+                       else
+                               (void)printf("euid\t%u", eid);
+               }
+               if ((rid = getgid()) != (eid = getegid())) {
+                       if ((gr = getgrgid(rid)) != NULL)
+                               (void)printf("rgid\t%s\n", gr->gr_name);
+                       else
+                               (void)printf("rgid\t%u\n", rid);
+               }
+               (void)printf("groups\t");
+               group(NULL, 1);
+       }
+}
+
+void
+current()
+{
+       struct group *gr;
+       struct passwd *pw;
+       int cnt, id, eid, lastid, ngroups;
+       gid_t groups[NGROUPS];
+       char *fmt;
+
+       id = getuid();
+       (void)printf("uid=%u", id);
+       if ((pw = getpwuid(id)) != NULL)
+               (void)printf("(%s)", pw->pw_name);
+       if ((eid = geteuid()) != id) {
+               (void)printf(" euid=%u", eid);
+               if ((pw = getpwuid(eid)) != NULL)
+                       (void)printf("(%s)", pw->pw_name);
+       }
+       id = getgid();
+       (void)printf(" gid=%u", id);
+       if ((gr = getgrgid(id)) != NULL)
+               (void)printf("(%s)", gr->gr_name);
+       if ((eid = getegid()) != id) {
+               (void)printf(" egid=%u", eid);
+               if ((gr = getgrgid(eid)) != NULL)
+                       (void)printf("(%s)", gr->gr_name);
+       }
+       if ((ngroups = getgroups(NGROUPS, groups)) != NULL) {
+               for (fmt = " groups=%u", lastid = -1, cnt = 0; cnt < ngroups;
+                   fmt = ", %u", lastid = id) {
+                       id = groups[cnt++];
+                       if (lastid == id)
+                               continue;
+                       (void)printf(fmt, id);
+                       if ((gr = getgrgid(id)) != NULL)
+                               (void)printf("(%s)", gr->gr_name);
+               }
+       }
+       (void)printf("\n");
+}
+
+void
+user(pw)
+       struct passwd *pw;
+{
+       struct group *gr;
+       char *fmt;
+       int cnt, id, lastid, ngroups, groups[NGROUPS + 1];
+
+       id = pw->pw_uid;
+       (void)printf("uid=%u(%s)", id, pw->pw_name);
+       (void)printf(" gid=%u", pw->pw_gid);
+       if ((gr = getgrgid(pw->pw_gid)) != NULL)
+               (void)printf("(%s)", gr->gr_name);
+       ngroups = NGROUPS + 1;
+       (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
+       fmt = " groups=%u";
+       for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) {
+               if (lastid == (id = groups[cnt]))
+                       continue;
+               (void)printf(fmt, id);
+               fmt = " %u";
+               if ((gr = getgrgid(id)) != NULL)
+                       (void)printf("(%s)", gr->gr_name);
+               lastid = id;
+       }
+       (void)printf("\n");
+}
+
+void
+group(pw, nflag)
+       struct passwd *pw;
+       int nflag;
+{
+       struct group *gr;
+       int cnt, id, lastid, ngroups;
+       gid_t groups[NGROUPS + 1];
+       char *fmt;
+
+       if (pw) {
+               ngroups = NGROUPS + 1;
+               (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
+       } else {
+               groups[0] = getgid();
+               ngroups = getgroups(NGROUPS, groups + 1) + 1;
+       }
+       fmt = nflag ? "%s" : "%u";
+       for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) {
+               if (lastid == (id = groups[cnt]))
+                       continue;
+               if (nflag) {
+                       if ((gr = getgrgid(id)) != NULL)
+                               (void)printf(fmt, gr->gr_name);
+                       else
+                               (void)printf(*fmt == ' ' ? " %u" : "%u",
+                                   id);
+                       fmt = " %s";
+               } else {
+                       (void)printf(fmt, id);
+                       fmt = " %u";
+               }
+               lastid = id;
+       }
+       (void)printf("\n");
+}
+
+struct passwd *
+who(u)
+       char *u;
+{
+       struct passwd *pw;
+       long id;
+       char *ep;
+
+       /*
+        * Translate user argument into a pw pointer.  First, try to
+        * get it as specified.  If that fails, try it as a number.
+        */
+       if ((pw = getpwnam(u)) != NULL)
+               return(pw);
+       id = strtol(u, &ep, 10);
+       if (*u && !*ep && (pw = getpwuid(id)))
+               return(pw);
+       errx(1, "%s: No such user", u);
+       /* NOTREACHED */
+       return (NULL);
+}
+
+void
+usage()
+{
+       (void)fprintf(stderr, "usage: id [user]\n");
+       (void)fprintf(stderr, "       id -G [-n] [user]\n");
+       (void)fprintf(stderr, "       id -g [-nr] [user]\n");
+       (void)fprintf(stderr, "       id -u [-nr] [user]\n");
+       exit(1);
+}
diff --git a/id/whoami.1 b/id/whoami.1
new file mode 100644 (file)
index 0000000..38666fb
--- /dev/null
@@ -0,0 +1,64 @@
+.\"    $NetBSD: whoami.1,v 1.6 1998/04/28 07:19:29 fair Exp $
+.\"
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)whoami.1      8.1 (Berkeley) 6/6/93
+.\"    $NetBSD: whoami.1,v 1.6 1998/04/28 07:19:29 fair Exp $
+.\"
+.Dd June 6, 1993
+.Dt WHOAMI 1
+.Os BSD 3
+.Sh NAME
+.Nm whoami
+.Nd display effective user id
+.Sh SYNOPSIS
+.Nm
+.Sh DESCRIPTION
+The
+.Nm
+utility has been obsoleted by the
+.Xr id 1
+utility, and is equivalent to
+.Dq Nm id Fl un .
+The command
+.Dq Nm id Fl p
+is suggested for normal interactive use.
+.Pp
+The
+.Nm
+utility displays your effective user ID as a name.
+.Pp
+The
+.Nm
+utility exits 0 on success, and >0 if an error occurs.
+.Sh SEE ALSO
+.Xr id 1
diff --git a/jot/Makefile b/jot/Makefile
new file mode 100644 (file)
index 0000000..cc14754
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = jot
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = jot.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble jot.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/jot/Makefile.postamble b/jot/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/jot/Makefile.preamble b/jot/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/jot/PB.project b/jot/PB.project
new file mode 100644 (file)
index 0000000..9d38f09
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (jot.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, jot.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = jot; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/jot/jot.1 b/jot/jot.1
new file mode 100644 (file)
index 0000000..0d13232
--- /dev/null
+++ b/jot/jot.1
@@ -0,0 +1,201 @@
+.\"    $NetBSD: jot.1,v 1.3 1997/11/01 04:58:39 mycroft Exp $
+.\"
+.\" Copyright (c) 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)jot.1       8.1 (Berkeley) 6/6/93
+.\"
+.Dd November 1, 1997
+.Dt JOT 1
+.Os
+.Sh NAME
+.Nm jot
+.Nd print sequential or random data
+.Sh SYNOPSIS
+.Nm jot
+.Op Fl rcn
+.Op Fl b Ar word
+.Op Fl w Ar word
+.Op Fl s Ar string
+.Op Fl p Ar precision
+.Oo Ar reps
+.Oo Ar begin
+.Oo Ar end
+.Op Ar s
+.Oc
+.Oc
+.Oc
+.Sh DESCRIPTION
+The
+.Nm jot
+utility is used to print out increasing, decreasing, random,
+or redundant data (usually numbers) one per line.
+.Pp
+The following options are available:
+.Bl -tag -width indent
+.It Fl r
+Generate random data instead of sequential data, the default.
+.It Fl b Ar word
+Just print
+.Ar word
+repetitively.
+.It Fl w Ar word
+Print
+.Ar word
+with the generated data appended to it.
+Octal, hexadecimal, exponential, ASCII, zero padded,
+and right-adjusted representations
+are possible by using the appropriate
+.Xr printf 3
+conversion specification inside
+.Ar word ,
+in which case the data are inserted rather than appended.
+.It Fl c
+This is an abbreviation for \fB\-w %c\fP.
+.It Fl s Ar string
+Print data separated by
+.Ar string .
+Normally, newlines separate data.
+.It Fl n
+Do not print the final newline normally appended to the output.
+.It Fl p Ar precision
+Print only as many digits or characters of the data
+as indicated by the integer
+.Ar precision .
+In the absence of
+.Fl p ,
+the precision is the greater of the precisions of
+.Ar begin
+and
+.Ar end .
+The
+.Fl p
+option is overridden by whatever appears in a
+.Xr printf 3
+conversion following
+.Fl w .
+.El
+.Pp
+The last four arguments indicate, respectively,
+the number of data, the lower bound, the upper bound,
+and the step size or, for random data, the seed.
+While at least one of them must appear,
+any of the other three may be omitted, and
+will be considered as such if given as
+.Dq - .
+Any three of these arguments determines the fourth.
+If four are specified and the given and computed values of
+.Ar reps
+conflict, the lower value is used.
+If fewer than three are specified, defaults are assigned
+left to right, except for
+.Ar s ,
+which assumes its default unless both
+.Ar begin
+and
+.Ar end
+are given.
+.Pp
+Defaults for the four arguments are, respectively,
+100, 1, 100, and 1, except that when random data are requested,
+.Ar s
+defaults to a seed depending upon the time of day.
+.Ar reps
+is expected to be an unsigned integer,
+and if given as zero is taken to be infinite.
+.Ar begin
+and
+.Ar end
+may be given as real numbers or as characters
+representing the corresponding value in ASCII.
+The last argument must be a real number.
+.Pp
+Random numbers are obtained through
+.Xr random 3 .
+The name
+.Nm jot
+derives in part from
+.Nm iota ,
+a function in APL.
+.Sh EXAMPLES
+The command:
+.Dl "jot 21 \-1 1.00"
+prints 21 evenly spaced numbers increasing from \-1 to 1.
+.Pp
+The command:
+.Dl "jot \-c 128 0"
+prints the ASCII character set.
+.Pp
+The command:
+.Dl "jot \-w xa%c 26 a"
+prints the strings
+.Dq xaa
+through
+.Dq xaz .
+.Pp
+The command:
+.Dl "jot \-r \-c 160 a z | rs \-g 0 8"
+prints 20 random 8-letter strings.
+.Pp
+The command:
+.Dl "jot \-b y 0"
+is equivalent to
+.Xr yes 1 .
+.Pp
+The command:
+.Dl "jot \-w %ds/old/new/ 30 2 \- 5"
+prints thirty
+.Xr ed 1
+substitution commands applying to lines 2, 7, 12, etc.
+.Pp
+The command:
+.Dl "jot 0 9 \- \-.5"
+prints the stuttering sequence 9, 9, 8, 8, 7, etc.
+.Pp
+The command:
+.Dl "jot \-b x 512 > block"
+creates a file containing exactly 1024 bytes.
+.Pp
+The command:
+.Dl "expand \-\`jot \-s, \- 10 132 4\`"
+sets tabs four spaces apart starting
+from column 10 and ending in column 132.
+.Pp
+The command:
+.Dl "grep \`jot \-s """" \-b . 80\`"
+prints all lines 80 characters or longer.
+.Sh SEE ALSO
+.Xr ed 1 ,
+.Xr expand 1 ,
+.Xr rs 1 ,
+.Xr yes 1 ,
+.Xr printf 3 ,
+.Xr random 3
diff --git a/jot/jot.c b/jot/jot.c
new file mode 100644 (file)
index 0000000..92b9f9e
--- /dev/null
+++ b/jot/jot.c
@@ -0,0 +1,399 @@
+/*     $NetBSD: jot.c,v 1.4 1997/10/19 03:34:49 lukem Exp $    */
+
+/*-
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)jot.c      8.1 (Berkeley) 6/6/93";
+#endif
+__RCSID("$NetBSD: jot.c,v 1.4 1997/10/19 03:34:49 lukem Exp $");
+#endif /* not lint */
+
+/*
+ * jot - print sequential or random data
+ *
+ * Author:  John Kunze, Office of Comp. Affairs, UCB
+ */
+
+#include <ctype.h>
+#include <err.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#define        REPS_DEF        100
+#define        BEGIN_DEF       1
+#define        ENDER_DEF       100
+#define        STEP_DEF        1
+
+#define        isdefault(s)    (strcmp((s), "-") == 0)
+
+double begin;
+double ender;
+double s;
+long   reps;
+int    randomize;
+int    infinity;
+int    boring;
+int    prec;
+int    dox;
+int    chardata;
+int    nofinalnl;
+char   sepstring[BUFSIZ] = "\n";
+char   format[BUFSIZ];
+
+void   error __P((char *, char *));
+void   getargs __P((int, char *[]));
+void   getformat __P((void));
+int    getprec __P((char *));
+int    main __P((int, char **));
+void   putdata __P((double, long));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       double  xd, yd;
+       long    id;
+       double  *x = &xd;
+       double  *y = &yd;
+       long    *i = &id;
+
+       getargs(argc, argv);
+       if (randomize) {
+               *x = (ender - begin) * (ender > begin ? 1 : -1);
+               srandom((int) s);
+               for (*i = 1; *i <= reps || infinity; (*i)++) {
+                       *y = (double) random() / INT_MAX;
+                       putdata(*y * *x + begin, reps - *i);
+               }
+       }
+       else
+               for (*i = 1, *x = begin; *i <= reps || infinity; (*i)++, *x += s)
+                       putdata(*x, reps - *i);
+       if (!nofinalnl)
+               putchar('\n');
+       exit(0);
+}
+
+void
+getargs(ac, av)
+       int ac;
+       char *av[];
+{
+       unsigned int    mask = 0;
+       int             n = 0;
+
+       while (--ac && **++av == '-' && !isdefault(*av))
+               switch ((*av)[1]) {
+               case 'r':
+                       randomize = 1;
+                       break;
+               case 'c':
+                       chardata = 1;
+                       break;
+               case 'n':
+                       nofinalnl = 1;
+                       break;
+               case 'b':
+                       boring = 1;
+               case 'w':
+                       if ((*av)[2])
+                               strcpy(format, *av + 2);
+                       else if (!--ac)
+                               error("Need context word after -w or -b", "");
+                       else
+                               strcpy(format, *++av);
+                       break;
+               case 's':
+                       if ((*av)[2])
+                               strcpy(sepstring, *av + 2);
+                       else if (!--ac)
+                               error("Need string after -s", "");
+                       else
+                               strcpy(sepstring, *++av);
+                       break;
+               case 'p':
+                       if ((*av)[2])
+                               prec = atoi(*av + 2);
+                       else if (!--ac)
+                               error("Need number after -p", "");
+                       else
+                               prec = atoi(*++av);
+                       if (prec <= 0)
+                               error("Bad precision value", "");
+                       break;
+               default:
+                       error("Unknown option %s", *av);
+               }
+
+       switch (ac) {   /* examine args right to left, falling thru cases */
+       case 4:
+               if (!isdefault(av[3])) {
+                       if (!sscanf(av[3], "%lf", &s))
+                               error("Bad s value:  %s", av[3]);
+                       mask |= 01;
+               }
+       case 3:
+               if (!isdefault(av[2])) {
+                       if (!sscanf(av[2], "%lf", &ender))
+                               ender = av[2][strlen(av[2])-1];
+                       mask |= 02;
+                       if (!prec)
+                               n = getprec(av[2]);
+               }
+       case 2:
+               if (!isdefault(av[1])) {
+                       if (!sscanf(av[1], "%lf", &begin))
+                               begin = av[1][strlen(av[1])-1];
+                       mask |= 04;
+                       if (!prec)
+                               prec = getprec(av[1]);
+                       if (n > prec)           /* maximum precision */
+                               prec = n;
+               }
+       case 1:
+               if (!isdefault(av[0])) {
+                       if (!sscanf(av[0], "%ld", &reps))
+                               error("Bad reps value:  %s", av[0]);
+                       mask |= 010;
+               }
+               break;
+       case 0:
+               error("jot - print sequential or random data", "");
+       default:
+               error("Too many arguments.  What do you mean by %s?", av[4]);
+       }
+       getformat();
+       while (mask)    /* 4 bit mask has 1's where last 4 args were given */
+               switch (mask) { /* fill in the 0's by default or computation */
+               case 001:
+                       reps = REPS_DEF;
+                       mask = 011;
+                       break;
+               case 002:
+                       reps = REPS_DEF;
+                       mask = 012;
+                       break;
+               case 003:
+                       reps = REPS_DEF;
+                       mask = 013;
+                       break;
+               case 004:
+                       reps = REPS_DEF;
+                       mask = 014;
+                       break;
+               case 005:
+                       reps = REPS_DEF;
+                       mask = 015;
+                       break;
+               case 006:
+                       reps = REPS_DEF;
+                       mask = 016;
+                       break;
+               case 007:
+                       if (randomize) {
+                               reps = REPS_DEF;
+                               mask = 0;
+                               break;
+                       }
+                       if (s == 0.0) {
+                               reps = 0;
+                               mask = 0;
+                               break;
+                       }
+                       reps = (ender - begin + s) / s;
+                       if (reps <= 0)
+                               error("Impossible stepsize", "");
+                       mask = 0;
+                       break;
+               case 010:
+                       begin = BEGIN_DEF;
+                       mask = 014;
+                       break;
+               case 011:
+                       begin = BEGIN_DEF;
+                       mask = 015;
+                       break;
+               case 012:
+                       s = (randomize ? time(0) : STEP_DEF);
+                       mask = 013;
+                       break;
+               case 013:
+                       if (randomize)
+                               begin = BEGIN_DEF;
+                       else if (reps == 0)
+                               error("Must specify begin if reps == 0", "");
+                       begin = ender - reps * s + s;
+                       mask = 0;
+                       break;
+               case 014:
+                       s = (randomize ? time(0) : STEP_DEF);
+                       mask = 015;
+                       break;
+               case 015:
+                       if (randomize)
+                               ender = ENDER_DEF;
+                       else
+                               ender = begin + reps * s - s;
+                       mask = 0;
+                       break;
+               case 016:
+                       if (randomize)
+                               s = time(0);
+                       else if (reps == 0)
+                               error("Infinite sequences cannot be bounded",
+                                   "");
+                       else if (reps == 1)
+                               s = 0.0;
+                       else
+                               s = (ender - begin) / (reps - 1);
+                       mask = 0;
+                       break;
+               case 017:               /* if reps given and implied, */
+                       if (!randomize && s != 0.0) {
+                               long t = (ender - begin + s) / s;
+                               if (t <= 0)
+                                       error("Impossible stepsize", "");
+                               if (t < reps)           /* take lesser */
+                                       reps = t;
+                       }
+                       mask = 0;
+                       break;
+               default:
+                       error("Bad mask", "");
+               }
+       if (reps == 0)
+               infinity = 1;
+}
+
+void
+putdata(x, notlast)
+       double x;
+       long notlast;
+{
+       long    d = x;
+       long    *dp = &d;
+
+       if (boring)                             /* repeated word */
+               printf("%s", format);
+       else if (dox)                           /* scalar */
+               printf(format, *dp);
+       else                                    /* real */
+               printf(format, x);
+       if (notlast != 0)
+               fputs(sepstring, stdout);
+}
+
+void
+error(msg, s)
+       char *msg, *s;
+{
+       warnx(msg, s);
+       fprintf(stderr,
+           "\nusage:  jot [ options ] [ reps [ begin [ end [ s ] ] ] ]\n");
+       if (strncmp("jot - ", msg, 6) == 0)
+               fprintf(stderr, "Options:\n\t%s\t%s\t%s\t%s\t%s\t%s\t%s",
+                       "-r             random data\n",
+                       "-c             character data\n",
+                       "-n             no final newline\n",
+                       "-b word                repeated word\n",
+                       "-w word                context word\n",
+                       "-s string      data separator\n",
+                       "-p precision   number of characters\n");
+       exit(1);
+}
+
+int
+getprec(s)
+       char *s;
+{
+       char    *p;
+       char    *q;
+
+       for (p = s; *p; p++)
+               if (*p == '.')
+                       break;
+       if (!*p)
+               return (0);
+       for (q = ++p; *p; p++)
+               if (!isdigit(*p))
+                       break;
+       return (p - q);
+}
+
+void
+getformat()
+{
+       char    *p;
+
+       if (boring)                             /* no need to bother */
+               return;
+       for (p = format; *p; p++)               /* look for '%' */
+               if (*p == '%' && *(p+1) != '%') /* leave %% alone */
+                       break;
+       if (!*p && !chardata)
+               sprintf(p, "%%.%df", prec);
+       else if (!*p && chardata) {
+               strcpy(p, "%c");
+               dox = 1;
+       }
+       else if (!*(p+1))
+               strcat(format, "%");            /* cannot end in single '%' */
+       else {
+               while (!isalpha(*p))
+                       p++;
+               switch (*p) {
+               case 'f': case 'e': case 'g': case '%':
+                       break;
+               case 's':
+                       error("Cannot convert numeric data to strings", "");
+                       break;
+               /* case 'd': case 'o': case 'x': case 'D': case 'O': case 'X':
+               case 'c': case 'u': */
+               default:
+                       dox = 1;
+                       break;
+               }
+       }
+}
diff --git a/kill/Makefile b/kill/Makefile
new file mode 100644 (file)
index 0000000..15b4692
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = kill
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = kill.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble kill.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/kill/Makefile.postamble b/kill/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/kill/Makefile.preamble b/kill/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/kill/PB.project b/kill/PB.project
new file mode 100644 (file)
index 0000000..9e03d45
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (kill.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, kill.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = kill; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/kill/kill.1 b/kill/kill.1
new file mode 100644 (file)
index 0000000..5ad2a47
--- /dev/null
@@ -0,0 +1,144 @@
+.\"    $NetBSD: kill.1,v 1.10 1997/10/20 08:52:10 enami Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)kill.1      8.2 (Berkeley) 4/28/95
+.\"
+.Dd April 28, 1995
+.Dt KILL 1
+.Os
+.Sh NAME
+.Nm kill
+.Nd terminate or signal a process
+.Sh SYNOPSIS
+.Nm
+.Op Fl s Ar signal_name
+.Ar pid
+\&...
+.Nm ""
+.Fl l
+.Op Ar exit_status
+.Nm ""
+.Fl signal_name
+.Ar pid
+\&...
+.Nm ""
+.Fl signal_number
+.Ar pid
+\&...
+.Sh DESCRIPTION
+The kill utility sends a signal to the processes specified
+by the pid operand(s).
+.Pp
+Only the super-user may send signals to other users' processes.
+.Pp
+The options are as follows:
+.Pp
+.Bl -tag -width Ds
+.It Fl s Ar signal_name
+A symbolic signal name specifying the signal to be sent instead of the
+default
+.Dv TERM .
+.It Fl l Op Ar exit_status
+If no operand is given, list the signal names; otherwise, write
+the signal name corresponding to
+.Ar exit_status .
+.It Fl signal_name
+A symbolic signal name specifying the signal to be sent instead of the
+default
+.Dv TERM .
+.It Fl signal_number
+A non-negative decimal integer, specifying the signal to be sent instead
+of the default
+.Dv TERM .
+.El
+.Pp
+The following pids have special meanings:
+.Bl -tag -width Ds -compact
+.It -1
+If superuser, broadcast the signal to all processes; otherwise broadcast
+to all processes belonging to the user.
+.El
+.Pp
+Some of the more commonly used signals:
+.Bl -tag -width Ds -compact
+.It 1
+HUP (hang up)
+.It 2
+INT (interrupt)
+.It 3
+QUIT (quit)
+.It 6
+ABRT (abort)
+.It 9
+KILL (non-catchable, non-ignorable kill)
+.It 14
+ALRM (alarm clock)
+.It 15
+TERM (software termination signal)
+.El
+.Pp
+.Nm
+is a built-in to
+.Xr csh  1  ;
+it allows job specifiers of the form ``%...'' as arguments
+so process id's are not as often used as
+.Nm
+arguments.
+See
+.Xr csh  1
+for details.
+.Sh SEE ALSO
+.Xr csh 1 ,
+.Xr ps 1 ,
+.Xr kill 2 ,
+.Xr sigaction 2
+.Sh STANDARDS
+The
+.Nm
+function is expected to be
+.St -p1003.2
+compatible.
+.Sh HISTORY
+A
+.Nm
+command appeared in
+.At v6 .
+.Sh BUGS
+A replacement for the command
+.Dq Li kill 0
+for
+.Xr csh  1
+users should be provided.
diff --git a/kill/kill.c b/kill/kill.c
new file mode 100644 (file)
index 0000000..f78eba3
--- /dev/null
@@ -0,0 +1,196 @@
+/*     $NetBSD: kill.c,v 1.16 1998/07/28 11:41:49 mycroft Exp $        */
+
+/*
+ * Copyright (c) 1988, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1988, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)kill.c     8.4 (Berkeley) 4/28/95";
+#else
+__RCSID("$NetBSD: kill.c,v 1.16 1998/07/28 11:41:49 mycroft Exp $");
+#endif
+#endif /* not lint */
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+void nosig __P((char *));
+void printsignals __P((FILE *));
+int signame_to_signum __P((char *));
+void usage __P((void));
+int main __P((int, char *[]));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int errors, numsig, pid;
+       char *ep;
+
+       if (argc < 2)
+               usage();
+
+       numsig = SIGTERM;
+
+       argc--, argv++;
+       if (!strcmp(*argv, "-l")) {
+               argc--, argv++;
+               if (argc > 1)
+                       usage();
+               if (argc == 1) {
+                       if (!isdigit(**argv))
+                               usage();
+                       numsig = strtol(*argv, &ep, 10);
+                       if (*ep)
+                               errx(1, "illegal signal number: %s", *argv);
+                       if (numsig >= 128)
+                               numsig -= 128;
+                       if (numsig <= 0 || numsig >= NSIG)
+                               nosig(*argv);
+                       (void)printf("%s\n", sys_signame[numsig]);
+                       exit(0);
+               }
+               printsignals(stdout);
+               exit(0);
+       }
+
+       if (!strcmp(*argv, "-s")) {
+               argc--, argv++;
+               if (argc < 1) {
+                       warnx("option requires an argument -- s");
+                       usage();
+               }
+               if (strcmp(*argv, "0")) {
+                       if ((numsig = signame_to_signum(*argv)) < 0)
+                               nosig(*argv);
+               } else
+                       numsig = 0;
+               argc--, argv++;
+       } else if (**argv == '-') {
+               ++*argv;
+               if (isalpha(**argv)) {
+                       if ((numsig = signame_to_signum(*argv)) < 0)
+                               nosig(*argv);
+               } else if (isdigit(**argv)) {
+                       numsig = strtol(*argv, &ep, 10);
+                       if (!*argv || *ep)
+                               errx(1, "illegal signal number: %s", *argv);
+                       if (numsig < 0 || numsig >= NSIG)
+                               nosig(*argv);
+               } else
+                       nosig(*argv);
+               argc--, argv++;
+       }
+
+       if (argc == 0)
+               usage();
+
+       for (errors = 0; argc; argc--, argv++) {
+               pid = strtol(*argv, &ep, 10);
+               if (!**argv || *ep) {
+                       warnx("illegal process id: %s", *argv);
+                       errors = 1;
+               } else if (kill(pid, numsig) == -1) {
+                       warn("%s", *argv);
+                       errors = 1;
+               }
+       }
+
+       exit(errors);
+       /* NOTREACHED */
+}
+
+int
+signame_to_signum(sig)
+       char *sig;
+{
+       int n;
+
+       if (!strncasecmp(sig, "sig", 3))
+               sig += 3;
+       for (n = 1; n < NSIG; n++) {
+               if (!strcasecmp(sys_signame[n], sig))
+                       return (n);
+       }
+       return (-1);
+}
+
+void
+nosig(name)
+       char *name;
+{
+
+       warnx("unknown signal %s; valid signals:", name);
+       printsignals(stderr);
+       exit(1);
+       /* NOTREACHED */
+}
+
+void
+printsignals(fp)
+       FILE *fp;
+{
+       int n;
+
+       for (n = 1; n < NSIG; n++) {
+               (void)fprintf(fp, "%s", sys_signame[n]);
+               if (n == (NSIG / 2) || n == (NSIG - 1))
+                       (void)fprintf(fp, "\n");
+               else
+                       (void)fprintf(fp, " ");
+       }
+}
+
+void
+usage()
+{
+
+       (void)fprintf(stderr, "usage: kill [-s signal_name] pid ...\n");
+       (void)fprintf(stderr, "       kill -l [exit_status]\n");
+       (void)fprintf(stderr, "       kill -signal_name pid ...\n");
+       (void)fprintf(stderr, "       kill -signal_number pid ...\n");
+       exit(1);
+       /* NOTREACHED */
+}
diff --git a/lastcomm/Makefile b/lastcomm/Makefile
new file mode 100644 (file)
index 0000000..18e424b
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = lastcomm
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+HFILES = pathnames.h
+
+CFILES = lastcomm.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble lastcomm.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/lastcomm/Makefile.postamble b/lastcomm/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/lastcomm/Makefile.preamble b/lastcomm/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/lastcomm/PB.project b/lastcomm/PB.project
new file mode 100644 (file)
index 0000000..c476955
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (pathnames.h); 
+        OTHER_LINKED = (lastcomm.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, lastcomm.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = lastcomm; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/lastcomm/lastcomm.1 b/lastcomm/lastcomm.1
new file mode 100644 (file)
index 0000000..11698ce
--- /dev/null
@@ -0,0 +1,128 @@
+.\"    $NetBSD: lastcomm.1,v 1.7 1997/10/19 03:47:52 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)lastcomm.1  8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt LASTCOMM 1
+.Os BSD 3
+.Sh NAME
+.Nm lastcomm
+.Nd show last commands executed in reverse order
+.Sh SYNOPSIS
+.Nm
+.Op Fl f Ar file
+.Op Ar command ...
+.Op Ar user ...
+.Op Ar terminal ...
+.Sh DESCRIPTION
+.Nm
+gives information on previously executed commands.
+With no arguments,
+.Nm
+prints information about all the commands recorded
+during the current accounting file's lifetime.
+.Pp
+Option:
+.Pp
+.Bl -tag -width Fl
+.It Fl f Ar file
+Read from
+.Ar file
+rather than the default
+accounting file.
+.El
+.Pp
+If called with arguments, only accounting entries with a
+matching
+.Ar command
+name,
+.Ar user
+name,
+or
+.Ar terminal
+name
+are printed.
+So, for example:
+.Pp
+.Dl lastcomm a.out root ttyd0
+.Pp
+would produce a listing of all the
+executions of commands named
+.Pa a.out
+by user
+.Ar root
+on the terminal
+.Ar ttyd0  .
+.Pp
+For each process entry, the following are printed.
+.Pp
+.Bl -bullet -offset indent -compact
+.It
+The name of the user who ran the process.
+.It
+Flags, as accumulated by the accounting facilities in the system.
+.It
+The command name under which the process was called.
+.It
+The amount of cpu time used by the process (in seconds).
+.It
+The time the process started.
+.It
+The elapsed time of the process.
+.El
+.Pp
+The flags are encoded as follows: ``S'' indicates the command was
+executed by the super-user, ``F'' indicates the command ran after
+a fork, but without a following
+.Xr exec ,
+``C'' indicates the command was run in PDP-11 compatibility mode
+(VAX only),
+``D'' indicates the command terminated with the generation of a
+.Pa core
+file, and ``X'' indicates the command was terminated with a signal.
+.Sh FILES
+.Bl -tag -width /var/account/acct -compact
+.It Pa /var/account/acct
+Default accounting file.
+.El
+.Sh SEE ALSO
+.Xr last 1 ,
+.Xr sigaction 2 ,
+.Xr acct 5 ,
+.Xr core 5
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 3.0 .
diff --git a/lastcomm/lastcomm.c b/lastcomm/lastcomm.c
new file mode 100644 (file)
index 0000000..242d959
--- /dev/null
@@ -0,0 +1,240 @@
+/*     $NetBSD: lastcomm.c,v 1.14 1998/04/02 10:22:03 kleink Exp $     */
+
+/*
+ * Copyright (c) 1980, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)lastcomm.c 8.2 (Berkeley) 4/29/95";
+#endif
+__RCSID("$NetBSD: lastcomm.c,v 1.14 1998/04/02 10:22:03 kleink Exp $");
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/acct.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <fcntl.h>
+#include <math.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <struct.h>
+#include <time.h>
+#include <tzfile.h>
+#include <unistd.h>
+#include <utmp.h>
+#include "pathnames.h"
+
+time_t  expand __P((u_int));
+char   *flagbits __P((int));
+char   *getdev __P((dev_t));
+int     main __P((int, char **));
+int     requested __P((char *[], struct acct *));
+void    usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       char *p;
+       struct acct ab;
+       struct stat sb;
+       FILE *fp;
+       off_t size;
+       time_t t;
+       double delta;
+       int ch;
+       char *acctfile;
+
+       acctfile = _PATH_ACCT;
+       while ((ch = getopt(argc, argv, "f:")) != -1)
+               switch((char)ch) {
+               case 'f':
+                       acctfile = optarg;
+                       break;
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       /* Open the file. */
+       if ((fp = fopen(acctfile, "r")) == NULL || fstat(fileno(fp), &sb))
+               err(1, "%s", acctfile);
+
+       /*
+        * Round off to integral number of accounting records, probably
+        * not necessary, but it doesn't hurt.
+        */
+       size = sb.st_size - sb.st_size % sizeof(struct acct);
+
+       /* Check if any records to display. */
+       if (size < sizeof(struct acct))
+               exit(0);
+
+       /*
+        * Seek to before the last entry in the file; use lseek(2) in case
+        * the file is bigger than a "long".
+        */
+       size -= sizeof(struct acct);
+       if (lseek(fileno(fp), size, SEEK_SET) == -1)
+               err(1, "%s", acctfile);
+
+       for (;;) {
+               if (fread(&ab, sizeof(struct acct), 1, fp) != 1)
+                       err(1, "%s", acctfile);
+
+               if (ab.ac_comm[0] == '\0') {
+                       ab.ac_comm[0] = '?';
+                       ab.ac_comm[1] = '\0';
+               } else
+                       for (p = &ab.ac_comm[0];
+                           p < &ab.ac_comm[fldsiz(acct, ac_comm)] && *p; ++p)
+                               if (!isprint(*p))
+                                       *p = '?';
+               if (!*argv || requested(argv, &ab)) {
+
+                       t = expand(ab.ac_utime) + expand(ab.ac_stime);
+                       (void)printf(
+                           "%-*.*s %-7s %-*.*s %-*.*s %6.2f secs %.16s",
+                            (int)fldsiz(acct, ac_comm),
+                            (int)fldsiz(acct, ac_comm),
+                            ab.ac_comm, flagbits(ab.ac_flag),
+                            UT_NAMESIZE, UT_NAMESIZE,
+                            user_from_uid(ab.ac_uid, 0), UT_LINESIZE,
+                            UT_LINESIZE, getdev(ab.ac_tty),
+                            t / (double)AHZ, ctime(&ab.ac_btime));
+                       delta = expand(ab.ac_etime) / (double)AHZ;
+                       printf(" (%1.0f:%02.0f:%05.2f)\n",
+                              delta / SECSPERHOUR,
+                              fmod(delta, SECSPERHOUR) / SECSPERMIN,
+                              fmod(delta, SECSPERMIN));
+               }
+               /* are we at the beginning of the file yet? */
+               if (size == 0)
+                       break;
+               /* seek backward over the one we read and the next to read */
+               if (fseek(fp, 2 * -(long)sizeof(struct acct), SEEK_CUR) == -1)
+                       err(1, "%s", acctfile);
+               /* and account for its size */
+               size -= sizeof(struct acct);
+       }
+       exit(0);
+}
+
+time_t
+expand(t)
+       u_int t;
+{
+       time_t nt;
+
+       nt = t & 017777;
+       t >>= 13;
+       while (t) {
+               t--;
+               nt <<= 3;
+       }
+       return (nt);
+}
+
+char *
+flagbits(f)
+       int f;
+{
+       static char flags[20] = "-";
+       char *p;
+
+#define        BIT(flag, ch)   if (f & flag) *p++ = ch
+
+       p = flags + 1;
+       BIT(ASU, 'S');
+       BIT(AFORK, 'F');
+       BIT(ACOMPAT, 'C');
+       BIT(ACORE, 'D');
+       BIT(AXSIG, 'X');
+       *p = '\0';
+       return (flags);
+}
+
+int
+requested(argv, acp)
+       char *argv[];
+       struct acct *acp;
+{
+       do {
+               if (!strcmp(user_from_uid(acp->ac_uid, 0), *argv))
+                       return (1);
+               if (!strcmp(getdev(acp->ac_tty), *argv))
+                       return (1);
+               if (!strncmp(acp->ac_comm, *argv, fldsiz(acct, ac_comm)))
+                       return (1);
+       } while (*++argv);
+       return (0);
+}
+
+char *
+getdev(dev)
+       dev_t dev;
+{
+       static dev_t lastdev = (dev_t)-1;
+       static char *lastname;
+
+       if (dev == NODEV)                       /* Special case. */
+               return ("__");
+       if (dev == lastdev)                     /* One-element cache. */
+               return (lastname);
+       lastdev = dev;
+       if ((lastname = devname(dev, S_IFCHR)) == NULL)
+               lastname = "??";
+       return (lastname);
+}
+
+void
+usage()
+{
+       (void)fprintf(stderr,
+           "lastcomm [ -f file ] [command ...] [user ...] [tty ...]\n");
+       exit(1);
+}
diff --git a/lastcomm/pathnames.h b/lastcomm/pathnames.h
new file mode 100644 (file)
index 0000000..963d279
--- /dev/null
@@ -0,0 +1,40 @@
+/*     $NetBSD: pathnames.h,v 1.3 1994/12/22 01:07:05 jtc Exp $        */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)pathnames.h 8.1 (Berkeley) 6/6/93
+ */
+
+#include <paths.h>
+
+#define        _PATH_ACCT      "/var/account/acct"
diff --git a/locate/Makefile b/locate/Makefile
new file mode 100644 (file)
index 0000000..16bdac7
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = locate
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Aggregate
+
+TOOLS = bigram code locate
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = aggregate.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/locate/Makefile.postamble b/locate/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/locate/Makefile.preamble b/locate/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/locate/PB.project b/locate/PB.project
new file mode 100644 (file)
index 0000000..fc0f9e8
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble); 
+        SUBPROJECTS = (bigram, code, locate); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = locate; 
+    PROJECTTYPE = Aggregate; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/locate/bigram/Makefile b/locate/bigram/Makefile
new file mode 100644 (file)
index 0000000..3916131
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = locate.bigram
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = locate.bigram.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/libexec
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/locate/bigram/Makefile.postamble b/locate/bigram/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/locate/bigram/Makefile.preamble b/locate/bigram/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/locate/bigram/PB.project b/locate/bigram/PB.project
new file mode 100644 (file)
index 0000000..7a75474
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (locate.bigram.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/libexec; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = locate.bigram; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/locate/bigram/locate.bigram.c b/locate/bigram/locate.bigram.c
new file mode 100644 (file)
index 0000000..89a87eb
--- /dev/null
@@ -0,0 +1,95 @@
+/*     $NetBSD: locate.bigram.c,v 1.6 1997/10/19 04:11:52 lukem Exp $  */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * James A. Woods.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1989, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)locate.bigram.c    8.2 (Berkeley) 4/28/95";
+#endif
+__RCSID("$NetBSD: locate.bigram.c,v 1.6 1997/10/19 04:11:52 lukem Exp $");
+#endif /* not lint */
+
+/*
+ *  bigram < text > bigrams
+ * 
+ * List bigrams for 'updatedb' script.
+ * Use 'code' to encode a file using this output.
+ */
+
+#include <stdio.h>
+#include <sys/param.h>                 /* for MAXPATHLEN */
+
+char buf1[MAXPATHLEN] = " ";   
+char buf2[MAXPATHLEN];
+
+int    main __P((int, char **));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       char *cp;
+       char *oldpath = buf1, *path = buf2;
+
+       while ( fgets ( path, sizeof(buf2), stdin ) != NULL ) {
+
+               /* skip longest common prefix */
+               for ( cp = path; *cp == *oldpath; cp++, oldpath++ )
+                       if ( *oldpath == '\0' )
+                               break;
+               /*
+                * output post-residue bigrams only
+                */
+               while ( *cp != '\0' && *(cp + 1) != '\0' ) {
+                       putchar ( *cp++ );
+                       putchar ( *cp++ );
+                       putchar ( '\n' );
+               }
+               if ( path == buf1 )             /* swap pointers */
+                       path = buf2, oldpath = buf1;
+               else
+                       path = buf1, oldpath = buf2;
+       }
+       return (0);
+}
diff --git a/locate/code/Makefile b/locate/code/Makefile
new file mode 100644 (file)
index 0000000..602ceb7
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = locate.code
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = locate.code.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/libexec
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+HEADER_PATHS = -I../locate
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/locate/code/Makefile.postamble b/locate/code/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/locate/code/Makefile.preamble b/locate/code/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/locate/code/PB.project b/locate/code/PB.project
new file mode 100644 (file)
index 0000000..af49ac1
--- /dev/null
@@ -0,0 +1,28 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        HEADERSEARCH = (../locate); 
+        H_FILES = (); 
+        OTHER_LINKED = (locate.code.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/libexec; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = locate.code; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/locate/code/locate.code.c b/locate/code/locate.code.c
new file mode 100644 (file)
index 0000000..c3a262e
--- /dev/null
@@ -0,0 +1,220 @@
+/*     $NetBSD: locate.code.c,v 1.6 1997/10/19 04:11:54 lukem Exp $    */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * James A. Woods.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1989, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)locate.code.c      8.4 (Berkeley) 5/4/95";
+#endif
+__RCSID("$NetBSD: locate.code.c,v 1.6 1997/10/19 04:11:54 lukem Exp $");
+#endif /* not lint */
+
+/*
+ * PURPOSE:    sorted list compressor (works with a modified 'find'
+ *             to encode/decode a filename database)
+ *
+ * USAGE:      bigram < list > bigrams
+ *             process bigrams (see updatedb) > common_bigrams
+ *             code common_bigrams < list > squozen_list
+ *
+ * METHOD:     Uses 'front compression' (see ";login:", Volume 8, Number 1
+ *             February/March 1983, p. 8).  Output format is, per line, an
+ *             offset differential count byte followed by a partially bigram-
+ *             encoded ascii residue.  A bigram is a two-character sequence,
+ *             the first 128 most common of which are encoded in one byte.
+ *
+ * EXAMPLE:    For simple front compression with no bigram encoding,
+ *             if the input is...              then the output is...
+ *
+ *             /usr/src                         0 /usr/src
+ *             /usr/src/cmd/aardvark.c          8 /cmd/aardvark.c
+ *             /usr/src/cmd/armadillo.c        14 armadillo.c
+ *             /usr/tmp/zoo                     5 tmp/zoo
+ *
+ *     The codes are:
+ *
+ *     0-28    likeliest differential counts + offset to make nonnegative
+ *     30      switch code for out-of-range count to follow in next word
+ *     128-255 bigram codes (128 most common, as determined by 'updatedb')
+ *     32-127  single character (printable) ascii residue (ie, literal)
+ *
+ * SEE ALSO:   updatedb.csh, bigram.c
+ *
+ * AUTHOR:     James A. Woods, Informatics General Corp.,
+ *             NASA Ames Research Center, 10/82
+ */
+
+#include <sys/param.h>
+
+#include <err.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "locate.h"
+
+#define        BGBUFSIZE       (NBG * 2)       /* size of bigram buffer */
+
+char buf1[MAXPATHLEN] = " ";   
+char buf2[MAXPATHLEN];
+char bigrams[BGBUFSIZE + 1] = { 0 };
+
+int    bgindex __P((char *));
+int    main __P((int, char **));
+void   usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       char *cp, *oldpath, *path;
+       int ch, code, count, diffcount, oldcount;
+       FILE *fp;
+
+       while ((ch = getopt(argc, argv, "")) != -1)
+               switch(ch) {
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc != 1)
+               usage();
+
+       if ((fp = fopen(argv[0], "r")) == NULL)
+               err(1, "%s", argv[0]);
+
+       /* First copy bigram array to stdout. */
+       (void)fgets(bigrams, BGBUFSIZE + 1, fp);
+       if (fwrite(bigrams, 1, BGBUFSIZE, stdout) != BGBUFSIZE)
+               err(1, "stdout");
+       (void)fclose(fp);
+
+       oldpath = buf1;
+       path = buf2;
+       oldcount = 0;
+       while (fgets(path, sizeof(buf2), stdin) != NULL) {
+               /* Truncate newline. */
+               cp = path + strlen(path) - 1;
+               if (cp > path && *cp == '\n')
+                       *cp = '\0';
+
+               /* Squelch characters that would botch the decoding. */
+               for (cp = path; *cp != '\0'; cp++) {
+                       *cp &= PARITY-1;
+                       if (*cp <= SWITCH)
+                               *cp = '?';
+               }
+
+               /* Skip longest common prefix. */
+               for (cp = path; *cp == *oldpath; cp++, oldpath++)
+                       if (*oldpath == '\0')
+                               break;
+               count = cp - path;
+               diffcount = count - oldcount + OFFSET;
+               oldcount = count;
+               if (diffcount < 0 || diffcount > 2 * OFFSET) {
+                       if (putchar(SWITCH) == EOF ||
+                           putw(diffcount, stdout) == EOF)
+                               err(1, "stdout");
+               } else
+                       if (putchar(diffcount) == EOF)
+                               err(1, "stdout");
+
+               while (*cp != '\0') {
+                       if (*(cp + 1) == '\0') {
+                               if (putchar(*cp) == EOF)
+                                       err(1, "stdout");
+                               break;
+                       }
+                       if ((code = bgindex(cp)) < 0) {
+                               if (putchar(*cp++) == EOF ||
+                                   putchar(*cp++) == EOF)
+                                       err(1, "stdout");
+                       } else {
+                               /* Found, so mark byte with parity bit. */
+                               if (putchar((code / 2) | PARITY) == EOF)
+                                       err(1, "stdout");
+                               cp += 2;
+                       }
+               }
+               if (path == buf1) {             /* swap pointers */
+                       path = buf2;
+                       oldpath = buf1;
+               } else {
+                       path = buf1;
+                       oldpath = buf2;
+               }
+       }
+       /* Non-zero status if there were errors */
+       if (fflush(stdout) != 0 || ferror(stdout))
+               exit(1);
+       exit(0);
+}
+
+int
+bgindex(bg)                    /* Return location of bg in bigrams or -1. */
+       char *bg;
+{
+       char bg0, bg1, *p;
+
+       bg0 = bg[0];
+       bg1 = bg[1];
+       for (p = bigrams; *p != '\0'; p++)
+               if (*p++ == bg0 && *p == bg1)
+                       break;
+       return (*p == '\0' ? -1 : --p - bigrams);
+}
+
+void
+usage()
+{
+       (void)fprintf(stderr,
+           "usage: locate.code common_bigrams < list > squozen_list\n");
+       exit(1);
+}
diff --git a/locate/locate/Makefile b/locate/locate/Makefile
new file mode 100644 (file)
index 0000000..c50d9fa
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = locate
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+HFILES = locate.h pathnames.h
+
+CFILES = locate.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble locate.1\
+            updatedb.csh
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/locate/locate/Makefile.postamble b/locate/locate/Makefile.postamble
new file mode 100644 (file)
index 0000000..abf00eb
--- /dev/null
@@ -0,0 +1,5 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
+
+after_install::
+       $(CP) updatedb.csh $(DSTROOT)/usr/libexec/locate.updatedb
+       $(CHMOD) 555 $(DSTROOT)/usr/libexec/locate.updatedb
diff --git a/locate/locate/Makefile.preamble b/locate/locate/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/locate/locate/PB.project b/locate/locate/PB.project
new file mode 100644 (file)
index 0000000..e2d36fe
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (locate.h, pathnames.h); 
+        OTHER_LINKED = (locate.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, locate.1, updatedb.csh); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = locate; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/locate/locate/locate.1 b/locate/locate/locate.1
new file mode 100644 (file)
index 0000000..8ebdbae
--- /dev/null
@@ -0,0 +1,87 @@
+.\"    $NetBSD: locate.1,v 1.6 1998/08/08 14:49:23 hubertf Exp $
+.\"
+.\" Copyright (c) 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)locate.1    8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt LOCATE 1
+.Os BSD 4.4
+.Sh NAME
+.Nm locate
+.Nd find files
+.Sh SYNOPSIS
+.Nm
+.Ar pattern
+.Sh DESCRIPTION
+.Nm
+searches a database for all pathnames which match the specified
+.Ar pattern  .
+The database is recomputed periodically, and contains the pathnames
+of all files which are publicly accessible.
+.Pp
+Shell globbing and quoting characters (``*'', ``?'', ``\e'', ``[''
+and ``]'')
+may be used in
+.Ar pattern  ,
+although they will have to be escaped from the shell.
+Preceding any character with a backslash (``\e'') eliminates any special
+meaning which it may have.
+The matching differs in that no characters must be matched explicitly,
+including slashes (``/'').
+.Pp
+As a special case, a pattern containing no globbing characters (``foo'')
+is matched as though it were ``*foo*''.
+.Sh FILES
+.Bl -tag -width /usr/libexec/locate.updatedb -compact
+.It Pa /var/db/locate.database
+Database
+.It /usr/libexec/locate.updatedb
+Script to update database.
+.El
+.Sh SEE ALSO
+.Xr find 1 ,
+.Xr fnmatch 3 ,
+.Xr weekly.conf 5
+.Rs
+.%A Woods, James A.
+.%D 1983
+.%T "Finding Files Fast"
+.%J ";login"
+.%V 8:1
+.%P pp. 8-10
+.Re
+.Sh HISTORY
+The
+.Nm
+command appears in
+.Bx 4.4 .
diff --git a/locate/locate/locate.c b/locate/locate/locate.c
new file mode 100644 (file)
index 0000000..a780f05
--- /dev/null
@@ -0,0 +1,206 @@
+/*     $NetBSD: locate.c,v 1.8 1997/10/19 04:11:56 lukem Exp $ */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * James A. Woods.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1989, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)locate.c   8.1 (Berkeley) 6/6/93";
+#endif
+__RCSID("$NetBSD: locate.c,v 1.8 1997/10/19 04:11:56 lukem Exp $");
+#endif /* not lint */
+
+/*
+ * Ref: Usenix ;login:, Vol 8, No 1, February/March, 1983, p. 8.
+ *
+ * Locate scans a file list for the full pathname of a file given only part
+ * of the name.  The list has been processed with with "front-compression"
+ * and bigram coding.  Front compression reduces space by a factor of 4-5,
+ * bigram coding by a further 20-25%.
+ *
+ * The codes are:
+ *
+ *     0-28    likeliest differential counts + offset to make nonnegative
+ *     30      switch code for out-of-range count to follow in next word
+ *     128-255 bigram codes (128 most common, as determined by 'updatedb')
+ *     32-127  single character (printable) ascii residue (ie, literal)
+ *
+ * A novel two-tiered string search technique is employed:
+ *
+ * First, a metacharacter-free subpattern and partial pathname is matched
+ * BACKWARDS to avoid full expansion of the pathname list.  The time savings
+ * is 40-50% over forward matching, which cannot efficiently handle
+ * overlapped search patterns and compressed path residue.
+ *
+ * Then, the actual shell glob-style regular expression (if in this form) is
+ * matched against the candidate pathnames using the slower routines provided
+ * in the standard 'find'.
+ */
+
+#include <sys/param.h>
+
+#include <fnmatch.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "locate.h"
+#include "pathnames.h"
+
+void   fastfind __P((char *));
+int    main __P((int, char **));
+char   *patprep __P((char *));
+
+FILE *fp;
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       if (argc != 2) {
+               (void)fprintf(stderr, "usage: locate pattern\n");
+               exit(1);
+       }
+       if (!(fp = fopen(_PATH_FCODES, "r"))) {
+               (void)fprintf(stderr, "locate: no database file %s.\n",
+                   _PATH_FCODES);
+               exit(1);
+       }
+       while (*++argv)
+               fastfind(*argv);
+       exit(0);
+}
+
+void
+fastfind(pathpart)
+       char *pathpart;
+{
+       char *p, *s;
+       int c;
+       int count, found, globflag;
+       char *cutoff, *patend, *q;
+       char bigram1[NBG], bigram2[NBG], path[MAXPATHLEN];
+
+       for (c = 0, p = bigram1, s = bigram2; c < NBG; c++)
+               p[c] = getc(fp), s[c] = getc(fp);
+
+       p = pathpart;
+       globflag = strchr(p, '*') || strchr(p, '?') || strchr(p, '[');
+       patend = patprep(p);
+
+       found = 0;
+       for (c = getc(fp), count = 0; c != EOF;) {
+               count += ((c == SWITCH) ? getw(fp) : c) - OFFSET;
+               /* overlay old path */
+               for (p = path + count; (c = getc(fp)) > SWITCH;)
+                       if (c < PARITY)
+                               *p++ = c;
+                       else {          /* bigrams are parity-marked */
+                               c &= PARITY - 1;
+                               *p++ = bigram1[c], *p++ = bigram2[c];
+                       }
+               *p-- = '\0';
+               cutoff = (found ? path : path + count);
+               for (found = 0, s = p; s >= cutoff; s--)
+                       if (*s == *patend) {    /* fast first char check */
+                               for (p = patend - 1, q = s - 1; *p != '\0';
+                                   p--, q--)
+                                       if (*q != *p)
+                                               break;
+                               if (*p == '\0') {       /* fast match success */
+                                       found = 1;
+                                       if (!globflag ||
+                                           !fnmatch(pathpart, path, 0))
+                                               (void)printf("%s\n", path);
+                                       break;
+                               }
+                       }
+       }
+}
+
+/*
+ * extract last glob-free subpattern in name for fast pre-match; prepend
+ * '\0' for backwards match; return end of new pattern
+ */
+static char globfree[100];
+
+char *
+patprep(name)
+       char *name;
+{
+       char *endmark, *p, *subp;
+
+       subp = globfree;
+       *subp++ = '\0';
+       p = name + strlen(name) - 1;
+       /* skip trailing metacharacters (and [] ranges) */
+       for (; p >= name; p--)
+               if (strchr("*?", *p) == 0)
+                       break;
+       if (p < name)
+               p = name;
+       if (*p == ']')
+               for (p--; p >= name; p--)
+                       if (*p == '[') {
+                               p--;
+                               break;
+                       }
+       if (p < name)
+               p = name;
+       /*
+        * if pattern has only metacharacters, check every path (force '/'
+        * search)
+        */
+       if ((p == name) && strchr("?*[]", *p) != 0)
+               *subp++ = '/';
+       else {
+               for (endmark = p; p >= name; p--)
+                       if (strchr("]*?", *p) != 0)
+                               break;
+               for (++p;
+                   (p <= endmark) && subp < (globfree + sizeof(globfree));)
+                       *subp++ = *p++;
+       }
+       *subp = '\0';
+       return(--subp);
+}
diff --git a/locate/locate/locate.h b/locate/locate/locate.h
new file mode 100644 (file)
index 0000000..467c2cb
--- /dev/null
@@ -0,0 +1,43 @@
+/*     $NetBSD: locate.h,v 1.3 1994/12/22 06:17:48 jtc Exp $   */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)locate.h    8.1 (Berkeley) 6/6/93
+ */
+
+/* Symbolic constants shared by locate.c and code.c */
+
+#define        NBG             128             /* number of bigrams considered */
+#define        OFFSET          14              /* abs value of max likely diff */
+#define        PARITY          0200            /* parity bit */
+#define        SWITCH          30              /* switch code */
diff --git a/locate/locate/pathnames.h b/locate/locate/pathnames.h
new file mode 100644 (file)
index 0000000..8021ffe
--- /dev/null
@@ -0,0 +1,38 @@
+/*     $NetBSD: pathnames.h,v 1.3 1994/12/22 06:17:49 jtc Exp $        */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)pathnames.h 8.1 (Berkeley) 6/6/93
+ */
+
+#define        _PATH_FCODES    "/var/db/locate.database"
diff --git a/locate/locate/updatedb.csh b/locate/locate/updatedb.csh
new file mode 100644 (file)
index 0000000..d98f902
--- /dev/null
@@ -0,0 +1,81 @@
+#!/bin/csh -f
+#
+#      $NetBSD: updatedb.csh,v 1.7 1995/08/31 22:36:35 jtc Exp $
+#
+# Copyright (c) 1989, 1993
+#      The Regents of the University of California.  All rights reserved.
+#
+# This code is derived from software contributed to Berkeley by
+# James A. Woods.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#      This product includes software developed by the University of
+#      California, Berkeley and its contributors.
+# 4. Neither the name of the University nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#      @(#)updatedb.csh        8.4 (Berkeley) 10/27/94
+#
+
+set SRCHPATHS = "/"                    # directories to be put in the database
+set LIBDIR = /usr/libexec              # for subprograms
+                                       # for temp files
+if (! $?TMPDIR) setenv TMPDIR /var/tmp
+if (! $?DBDIR) setenv DBDIR /var/db
+set FCODES = $DBDIR/locate.database    # the database
+
+set path = ( /bin /usr/bin )
+set bigrams = $TMPDIR/locate.bigrams.$$
+set filelist = $TMPDIR/locate.list.$$
+set errs = $TMPDIR/locate.errs.$$
+
+# Make a file list and compute common bigrams.
+# Alphabetize '/' before any other char with 'tr'.
+# If the system is very short of sort space, 'bigram' can be made
+# smarter to accumulate common bigrams directly without sorting
+# ('awk', with its associative memory capacity, can do this in several
+# lines, but is too slow, and runs out of string space on small machines).
+
+# search locally or everything
+# find ${SRCHPATHS} -print | \
+find ${SRCHPATHS} \( ! -fstype local -o -fstype fdesc -o -fstype kernfs \) -a \
+               -prune -o -print | \
+       tr '/' '\001' | \
+       (sort -T "$TMPDIR" -f; echo $status > $errs) | tr '\001' '/' > $filelist
+
+$LIBDIR/locate.bigram < $filelist | \
+       (sort -T "$TMPDIR"; echo $status >> $errs) | \
+       uniq -c | sort -T "$TMPDIR" -nr | \
+       awk '{ if (NR <= 128) print $2 }' | tr -d '\012' > $bigrams
+
+# code the file list
+
+if { grep -s -v 0 $errs } then
+       printf 'locate: updatedb failed\n\n'
+else
+       $LIBDIR/locate.code $bigrams < $filelist > $FCODES
+       chmod 644 $FCODES
+       rm $bigrams $filelist $errs
+endif
diff --git a/logname/Makefile b/logname/Makefile
new file mode 100644 (file)
index 0000000..a35d67c
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = logname
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = logname.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble logname.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/logname/Makefile.postamble b/logname/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/logname/Makefile.preamble b/logname/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/logname/PB.project b/logname/PB.project
new file mode 100644 (file)
index 0000000..53e4435
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (logname.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, logname.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = logname; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/logname/logname.1 b/logname/logname.1
new file mode 100644 (file)
index 0000000..4d2a508
--- /dev/null
@@ -0,0 +1,78 @@
+.\"    $NetBSD: logname.1,v 1.8 1997/10/19 04:20:06 lukem Exp $
+.\"
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)logname.1   8.1 (Berkeley) 6/9/93
+.\"
+.Dd June 9, 1993
+.Dt LOGNAME 1
+.Os BSD 4.4
+.Sh NAME
+.Nm logname
+.Nd display user's login name
+.Sh SYNOPSIS
+.Nm
+.Sh DESCRIPTION
+The
+.Nm
+utility writes the user's login name to standard output followed by
+a newline.
+.Pp
+The
+.Nm
+utility explicitly ignores the
+.Ev LOGNAME
+and
+.Ev USER
+environment variables
+because the environment cannot be trusted.
+.Pp
+The
+.Nm
+utility exits 0 on success, and >0 if an error occurs.
+.Sh SEE ALSO
+.Xr who 1 ,
+.Xr whoami 1 ,
+.Xr getlogin 2
+.Sh STANDARDS
+The
+.Nm
+utility conforms to 
+.St -p1003.2-92 .
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 4.4 .
diff --git a/logname/logname.c b/logname/logname.c
new file mode 100644 (file)
index 0000000..ed63ffe
--- /dev/null
@@ -0,0 +1,92 @@
+/*     $NetBSD: logname.c,v 1.7 1997/10/19 04:20:06 lukem Exp $        */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1991, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)logname.c  8.2 (Berkeley) 4/3/94";
+#endif
+__RCSID("$NetBSD: logname.c,v 1.7 1997/10/19 04:20:06 lukem Exp $");
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <unistd.h>
+#include <err.h>
+
+int    main __P((int, char **));
+void   usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int ch;
+       char *p;
+
+       setlocale(LC_ALL, "");
+
+       while ((ch = getopt(argc, argv, "")) != -1)
+               switch (ch) {
+               case '?':
+               default:
+                       usage();
+                       /* NOTREACHED */
+               }
+
+       if (argc != optind) {
+               usage();
+               /* NOTREACHED */
+       }
+
+       if ((p = getlogin()) == NULL)
+               err(1, "getlogin");
+       (void)printf("%s\n", p);
+       exit(0);
+}
+
+void
+usage()
+{
+       (void)fprintf(stderr, "usage: logname\n");
+       exit(1);
+}
diff --git a/nice/Makefile b/nice/Makefile
new file mode 100644 (file)
index 0000000..6a4546b
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = nice
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = nice.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble nice.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/nice/Makefile.postamble b/nice/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/nice/Makefile.preamble b/nice/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/nice/PB.project b/nice/PB.project
new file mode 100644 (file)
index 0000000..56d2c0e
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (nice.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, nice.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = nice; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/nice/nice.1 b/nice/nice.1
new file mode 100644 (file)
index 0000000..4dba5c9
--- /dev/null
@@ -0,0 +1,120 @@
+.\"    $NetBSD: nice.1,v 1.8 1997/10/19 06:28:02 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)nice.1      8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt NICE 1
+.Os 
+.Sh NAME
+.Nm nice
+.Nd execute a utility with an altered scheduling priority
+.Sh SYNOPSIS
+.Nm
+.Op Fl n Ar increment
+.Ar utility
+.Op Ar argument ...
+.Sh DESCRIPTION
+.Nm
+runs
+.Ar utility
+at an altered scheduling priority.
+If an 
+.Ar increment 
+is given, it is used; otherwise
+an increment of 10 is assumed.
+The super-user can run utilities with priorities higher than normal by using
+a negative 
+.Ar increment .
+The priority can be adjusted over a
+range of -20 (the highest) to 20 (the lowest).
+.Pp
+Available options:
+.Bl -tag -width indent
+.It Fl n Ar increment
+A positive or negative decimal integer used to modify the system scheduling
+priority of 
+.Ar utility.
+.El
+.Sh DIAGNOSTICS
+The
+.Nm
+utility shall exit with one of the following values:
+.Bl -tag -width indent
+.It 1-125
+An error occurred in the 
+.Nm
+utility.
+.It 126
+The 
+.Ar utility
+was found but could not be invoked.
+.It 127
+The 
+.Ar utility
+could not be found.
+.El
+.Pp
+Otherwise, the exit status of 
+.Nm
+shall be that of 
+.Ar utility .
+.Sh COMPATIBILITY
+The historic 
+.Fl Ns Ar increment 
+option has been deprecated but is still supported in this implementation.
+.Sh SEE ALSO
+.Xr csh 1 ,
+.Xr getpriority 2 ,
+.Xr setpriority 2 ,
+.Xr renice 8
+.Sh STANDARDS
+The
+.Nm
+utility conforms to 
+.St -p1003.2-92 .
+.Sh HISTORY
+A
+.Nm
+utility appeared in
+.At v6 .
+.Sh BUGS
+.Nm
+is built into
+.Xr csh  1
+with a slightly different syntax than described here.  The form
+.Ql nice +10
+nices to positive nice, and
+.Ql nice \-10
+can be used
+by the super-user to give a process more of the processor.
diff --git a/nice/nice.c b/nice/nice.c
new file mode 100644 (file)
index 0000000..62a197e
--- /dev/null
@@ -0,0 +1,122 @@
+/*     $NetBSD: nice.c,v 1.10 1997/10/19 06:28:04 lukem Exp $  */
+
+/*
+ * Copyright (c) 1989 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT(
+    "@(#) Copyright (c) 1989 The Regents of the University of California.\n\
+ All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)nice.c     5.4 (Berkeley) 6/1/90";
+#endif
+__RCSID("$NetBSD: nice.c,v 1.10 1997/10/19 06:28:04 lukem Exp $");
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <ctype.h>
+#include <errno.h>
+#include <err.h>
+#include <unistd.h>
+
+#define        DEFNICE 10
+
+int    main __P((int, char **));
+static void usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       int niceness = DEFNICE;
+       int c;
+
+       setlocale(LC_ALL, "");
+
+        /* handle obsolete -number syntax */
+        if (argc > 1 && argv[1][0] == '-' && isdigit(argv[1][1])) {
+               niceness = atoi (argv[1] + 1);
+                argc--; argv++;
+        }
+
+       while ((c = getopt (argc, argv, "n:")) != -1) {
+               switch (c) {
+               case 'n':
+                       niceness = atoi (optarg);
+                       break;
+
+               case '?':
+               default:
+                       usage();
+                       break;
+               }
+       }
+       argc -= optind; argv += optind;
+
+       if (argc == 0)
+               usage();
+
+       errno = 0;
+       niceness += getpriority(PRIO_PROCESS, 0);
+       if (errno) {
+               err (1, "getpriority");
+               /* NOTREACHED */
+       }
+       if (setpriority(PRIO_PROCESS, 0, niceness)) {
+               warn ("setpriority");
+       }
+
+       execvp(argv[0], &argv[0]);
+       err ((errno == ENOENT) ? 127 : 126, "%s", argv[0]);
+       /* NOTREACHED */
+}
+
+static void
+usage()
+{
+       (void)fprintf(stderr,
+           "usage: nice [ -n increment ] utility [ argument ...]\n");
+       
+       exit(1);
+}
diff --git a/nohup/Makefile b/nohup/Makefile
new file mode 100644 (file)
index 0000000..43fb24e
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = nohup
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = nohup.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble nohup.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/nohup/Makefile.postamble b/nohup/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/nohup/Makefile.preamble b/nohup/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/nohup/PB.project b/nohup/PB.project
new file mode 100644 (file)
index 0000000..ba1f220
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (nohup.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, nohup.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = nohup; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/nohup/nohup.1 b/nohup/nohup.1
new file mode 100644 (file)
index 0000000..c60a263
--- /dev/null
@@ -0,0 +1,105 @@
+.\"    $NetBSD: nohup.1,v 1.6 1997/10/19 10:23:25 lukem Exp $
+.\"
+.\" Copyright (c) 1989, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)nohup.1     8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt NOHUP 1
+.Os
+.Sh NAME
+.Nm nohup
+.Nd invoke a command immune to hangups
+.Sh SYNOPSIS
+.Nm
+.Ar utility
+.Op Ar arg ...
+.Sh DESCRIPTION
+The
+.Nm
+utility invokes
+.Ar command
+with
+its arguments
+and at this time sets the signal
+.Dv SIGHUP
+to be ignored. 
+If the standard output is a terminal, the standard output is
+appended to the file
+.Pa nohup.out
+in the current directory.
+If standard error is a terminal, it is directed to the same place
+as the standard output.
+.Sh ENVIRONMENT
+The following variable is utilized by
+.Nm "" .
+.Bl -tag -width flag
+.It Ev HOME
+If the output file
+.Pa nohup.out
+cannot be created in the current directory, the
+.Nm
+utility uses the directory named by
+.Ev HOME
+to create the file.
+.El
+.Sh DIAGNOSTICS
+The
+.Nm
+utility shall exit with one of the following values:
+.Bl -tag -width Ds 
+.It 126
+The
+.Ar utility
+was found but could not be invoked.
+.It 127
+The
+.Ar utility
+could not be found or an error occurred in 
+.Nm "" .
+.El
+.Pp
+Otherwise, the exit status of 
+.Nm
+shall be that of 
+.Ar utility .
+.Sh SEE ALSO
+.Xr signal 3
+.Sh STANDARDS
+The
+.Nm
+command is expected to be
+.St -p1003.2
+compatible.
diff --git a/nohup/nohup.c b/nohup/nohup.c
new file mode 100644 (file)
index 0000000..e939a7d
--- /dev/null
@@ -0,0 +1,143 @@
+/*     $NetBSD: nohup.c,v 1.8 1997/12/23 18:21:34 ross Exp $   */
+
+/*
+ * Copyright (c) 1989 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT(
+    "@(#) Copyright (c) 1989 The Regents of the University of California.\n\
+ All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)nohup.c    5.4 (Berkeley) 6/1/90";
+#endif
+__RCSID("$NetBSD: nohup.c,v 1.8 1997/12/23 18:21:34 ross Exp $");
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+static void dofile __P((void));
+static void usage __P((void));
+int main __P((int, char **));
+
+/* nohup shall exit with one of the following values:
+   126 - The utility was found but could not be invoked.
+   127 - An error occured in the nohup utility, or the utility could
+         not be found. */
+#define EXIT_NOEXEC    126
+#define EXIT_NOTFOUND  127
+#define EXIT_MISC      127
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       int exit_status;
+
+       if (argc < 2)
+               usage();
+
+       if (isatty(STDOUT_FILENO))
+               dofile();
+       if (isatty(STDERR_FILENO) && dup2(STDOUT_FILENO, STDERR_FILENO) == -1) {
+               /* may have just closed stderr */
+               (void)fprintf(stdin, "nohup: %s\n", strerror(errno));
+               exit(EXIT_MISC);
+       }
+
+       /* The nohup utility shall take the standard action for all signals
+          except that SIGHUP shall be ignored. */
+       (void)signal(SIGHUP, SIG_IGN);
+
+       execvp(argv[1], &argv[1]);
+       exit_status = (errno == ENOENT) ? EXIT_NOTFOUND : EXIT_NOEXEC;
+       (void)fprintf(stderr, "nohup: %s: %s\n", argv[1], strerror(errno));
+       exit(exit_status);
+}
+
+static void
+dofile()
+{
+       int fd;
+       char *p, path[MAXPATHLEN];
+
+       /* If the standard output is a terminal, all output written to 
+          its standard output shall be appended to the end of the file
+          nohup.out in the current directory.  If nohup.out cannot be
+          created or opened for appending, the output shall be appended
+          to the end of the file nohup.out in the directory specified 
+          by the HOME environment variable.
+
+          If a file is created, the file's permission bits shall be
+          set to S_IRUSR | S_IWUSR. */
+#define        FILENAME        "nohup.out"
+       p = FILENAME;
+       if ((fd = open(p, O_RDWR|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR)) >= 0)
+               goto dupit;
+       if ((p = getenv("HOME")) != NULL) {
+               (void)strcpy(path, p);
+               (void)strcat(path, "/");
+               (void)strcat(path, FILENAME);
+               if ((fd = open(p = path, O_RDWR|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR)) >= 0)
+                       goto dupit;
+       }
+       (void)fprintf(stderr, "nohup: can't open a nohup.out file.\n");
+       exit(EXIT_MISC);
+
+dupit: (void)lseek(fd, 0L, SEEK_END);
+       if (dup2(fd, STDOUT_FILENO) == -1) {
+               (void)fprintf(stderr, "nohup: %s\n", strerror(errno));
+               exit(EXIT_MISC);
+       }
+       (void)fprintf(stderr, "sending output to %s\n", p);
+}
+
+static void
+usage()
+{
+       (void)fprintf(stderr, "usage: nohup command\n");
+       exit(EXIT_MISC);
+}
diff --git a/printenv/Makefile b/printenv/Makefile
new file mode 100644 (file)
index 0000000..638e2d1
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = printenv
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = printenv.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble printenv.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/printenv/Makefile.postamble b/printenv/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/printenv/Makefile.preamble b/printenv/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/printenv/PB.project b/printenv/PB.project
new file mode 100644 (file)
index 0000000..64baf1f
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (printenv.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, printenv.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = printenv; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/printenv/printenv.1 b/printenv/printenv.1
new file mode 100644 (file)
index 0000000..ea3fb0f
--- /dev/null
@@ -0,0 +1,69 @@
+.\"    $NetBSD: printenv.1,v 1.5 1997/10/19 12:44:21 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1993
+.\"   The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)printenv.1    8.1 (Berkeley) 6/6/93
+.\"    $NetBSD: printenv.1,v 1.5 1997/10/19 12:44:21 lukem Exp $
+.\"
+.Dd June 6, 1993
+.Dt PRINTENV 1
+.Os
+.Sh NAME
+.Nm printenv
+.Nd print out the environment
+.Sh SYNOPSIS
+.Nm
+.Op Ar name
+.Sh DESCRIPTION
+.Nm
+prints out the names and values of the variables in the environment,
+with one name/value pair per line.  If
+.Ar name
+is specified, only
+its value is printed.
+.Pp
+If a
+.Ar name
+is specified and it is not defined in the environment,
+.Nm
+returns exit status 1, else it returns status 0.
+.Sh SEE ALSO
+.Xr csh 1 ,
+.Xr sh 1 ,
+.Xr environ 7
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 3.0 .
diff --git a/printenv/printenv.c b/printenv/printenv.c
new file mode 100644 (file)
index 0000000..be8b50b
--- /dev/null
@@ -0,0 +1,104 @@
+/*     $NetBSD: printenv.c,v 1.6 1997/10/19 12:44:26 lukem Exp $       */
+
+/*
+ * Copyright (c) 1987, 1993
+ *    Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1987, 1993\n\
+      The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+/*static char sccsid[] = "from: @(#)printenv.c 8.2 (Berkeley) 5/4/95";*/
+__RCSID("$NetBSD: printenv.c,v 1.6 1997/10/19 12:44:26 lukem Exp $");
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+int    main __P((int, char **));
+void   usage __P((void));
+
+/*
+ * printenv
+ *
+ * Bill Joy, UCB
+ * February, 1979
+ */
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       extern char **environ;
+       char *cp, **ep;
+       size_t len;
+       int ch;
+
+       while ((ch = getopt(argc, argv, "")) != -1)
+               switch(ch) {
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc == 0) {
+               for (ep = environ; *ep; ep++)
+                       (void)printf("%s\n", *ep);
+               exit(0);
+       }
+       len = strlen(*argv);
+       for (ep = environ; *ep; ep++)
+               if (!memcmp(*ep, *argv, len)) {
+                       cp = *ep + len;
+                       if (!*cp || *cp == '=') {
+                               (void)printf("%s\n", *cp ? cp + 1 : cp);
+                               exit(0);
+                       }
+               }
+       exit(1);
+}
+
+void
+usage()
+{
+       (void)fprintf(stderr, "usage: printenv [name]\n");
+       exit(1);
+}
diff --git a/printf/Makefile b/printf/Makefile
new file mode 100644 (file)
index 0000000..aaa90fa
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = printf
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = printf.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble printf.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/printf/Makefile.postamble b/printf/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/printf/Makefile.preamble b/printf/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/printf/PB.project b/printf/PB.project
new file mode 100644 (file)
index 0000000..22c7b78
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (printf.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, printf.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = printf; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/printf/printf.1 b/printf/printf.1
new file mode 100644 (file)
index 0000000..bc63d9b
--- /dev/null
@@ -0,0 +1,280 @@
+.\"    $NetBSD: printf.1,v 1.10 1998/08/22 14:54:48 garbled Exp $
+.\"
+.\" Copyright (c) 1989, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)printf.1      8.1 (Berkeley) 6/6/93
+.\"
+.Dd November 5, 1993
+.Dt PRINTF 1
+.Os
+.Sh NAME
+.Nm printf
+.Nd formatted output
+.Sh SYNOPSIS
+.Nm
+.Ar format
+.Op Ar arguments  ...
+.Sh DESCRIPTION
+.Nm
+formats and prints its arguments, after the first, under control
+of the
+.Ar format  .
+The
+.Ar format
+is a character string which contains three types of objects: plain characters,
+which are simply copied to standard output, character escape sequences which
+are converted and copied to the standard output, and format specifications,
+each of which causes printing of the next successive
+.Ar argument  .
+.Pp
+The
+.Ar arguments
+after the first are treated as strings if the corresponding format is
+either
+.Cm b ,
+.Cm c
+or
+.Cm s ;
+otherwise it is evaluated as a C constant, with the following extensions:
+.Pp
+.Bl -bullet -offset indent -compact
+.It
+A leading plus or minus sign is allowed.
+.It
+If the leading character is a single or double quote, the value is the 
+.Tn ASCII
+code of the next character.
+.El
+.Pp
+The format string is reused as often as necessary to satisfy the
+.Ar arguments  .
+Any extra format specifications are evaluated with zero or the null
+string.
+.Pp
+Character escape sequences are in backslash notation as defined in 
+.St -ansiC .
+The characters and their meanings
+are as follows:
+.Bl -tag -width Ds -offset indent
+.It Cm \ee
+Write an <escape> character.
+.It Cm \ea
+Write a <bell> character.
+.It Cm \eb
+Write a <backspace> character.
+.It Cm \ef
+Write a <form-feed> character.
+.It Cm \en
+Write a <new-line> character.
+.It Cm \er
+Write a <carriage return> character.
+.It Cm \et
+Write a <tab> character.
+.It Cm \ev
+Write a <vertical tab> character.
+.It Cm \e\'
+Write a <single quote> character.
+.It Cm \e\e
+Write a backslash character.
+.It Cm \e Ns Ar num 
+Write an 8-bit character whose
+.Tn ASCII
+value is the 1-, 2-, or 3-digit
+octal number
+.Ar num .
+.El
+.Pp
+Each format specification is introduced by the percent character
+(``%'').
+The remainder of the format specification includes,
+in the following order:
+.Bl -tag -width Ds
+.It "Zero or more of the following flags:"
+.Bl -tag -width Ds
+.It Cm #
+A `#' character
+specifying that the value should be printed in an ``alternative form''.
+For
+.Cm c  ,
+.Cm d ,
+and
+.Cm s  ,
+formats, this option has no effect.  For the
+.Cm o
+formats the precision of the number is increased to force the first
+character of the output string to a zero.  For the
+.Cm x
+.Pq Cm X
+format, a non-zero result has the string
+.Li 0x
+.Pq Li 0X
+prepended to it.  For
+.Cm e  ,
+.Cm E ,
+.Cm f  ,
+.Cm g ,
+and
+.Cm G  ,
+formats, the result will always contain a decimal point, even if no
+digits follow the point (normally, a decimal point only appears in the
+results of those formats if a digit follows the decimal point).  For
+.Cm g
+and
+.Cm G
+formats, trailing zeros are not removed from the result as they
+would otherwise be;
+.It Cm \&\-
+A minus sign `\-' which specifies
+.Em left adjustment
+of the output in the indicated field;
+.It Cm \&+
+A `+' character specifying that there should always be
+a sign placed before the number when using signed formats.
+.It Sq \&\ \&
+A space specifying that a blank should be left before a positive number
+for a signed format.  A `+' overrides a space if both are used;
+.It Cm \&0
+A zero `0' character indicating that zero-padding should be used
+rather than blank-padding.  A `\-' overrides a `0' if both are used;
+.El
+.It "Field Width:"
+An optional digit string specifying a
+.Em field width ;
+if the output string has fewer characters than the field width it will
+be blank-padded on the left (or right, if the left-adjustment indicator
+has been given) to make up the field width (note that a leading zero
+is a flag, but an embedded zero is part of a field width);
+.It Precision:
+An optional period,
+.Sq Cm \&.\& ,
+followed by an optional digit string giving a
+.Em precision
+which specifies the number of digits to appear after the decimal point,
+for
+.Cm e
+and 
+.Cm f
+formats, or the maximum number of characters to be printed
+from a string; if the digit string is missing, the precision is treated
+as zero;
+.It Format:
+A character which indicates the type of format to use (one of
+.Cm diouxXfwEgGbcs ) .
+.El
+.Pp
+A field width or precision may be
+.Sq Cm \&*
+instead of a digit string.
+In this case an
+.Ar argument
+supplies the field width or precision.
+.Pp
+The format characters and their meanings are:
+.Bl -tag -width Fl
+.It Cm diouXx
+The
+.Ar argument
+is printed as a signed decimal (d or i), unsigned octal, unsigned decimal,
+or unsigned hexadecimal (X or x), respectively.
+.It Cm f
+The
+.Ar argument
+is printed in the style 
+.Sm off
+.Pf [\-]ddd Cm \&. No ddd
+.Sm on
+where the number of d's
+after the decimal point is equal to the precision specification for
+the argument.
+If the precision is missing, 6 digits are given; if the precision
+is explicitly 0, no digits and no decimal point are printed.
+.It Cm eE
+The
+.Ar argument
+is printed in the style 
+.Sm off
+.Pf [\-]d Cm \&. No ddd Cm e No \\*(Pmdd
+.Sm on
+where there
+is one digit before the decimal point and the number after is equal to
+the precision specification for the argument; when the precision is
+missing, 6 digits are produced.
+An upper-case E is used for an `E' format.
+.It Cm gG
+The
+.Ar argument
+is printed in style
+.Cm f
+or in style
+.Cm e
+.Pq Cm E
+whichever gives full precision in minimum space.
+.It Cm b
+Characters from the string
+.Ar argument
+are printed with backslash-escape sequences expanded.
+.It Cm c
+The first character of
+.Ar argument
+is printed.
+.It Cm s
+Characters from the string
+.Ar argument
+are printed until the end is reached or until the number of characters
+indicated by the precision specification is reached; however if the
+precision is 0 or missing, all characters in the string are printed.
+.It Cm \&%
+Print a `%'; no argument is used.
+.El
+.Pp
+In no case does a non-existent or small field width cause truncation of
+a field; padding takes place only if the specified field width exceeds
+the actual width.
+.Sh RETURN VALUES
+.Nm
+exits 0 on success, 1 on failure.
+.Sh SEE ALSO
+.Xr echo 1 ,
+.Xr printf 3
+.Sh STANDARDS
+The
+.Nm
+utility conforms to 
+.St -p1003.2-92 .
+.Sh BUGS
+Since the floating point numbers are translated from
+.Tn ASCII
+to floating-point and
+then back again, floating-point precision may be lost.
diff --git a/printf/printf.c b/printf/printf.c
new file mode 100644 (file)
index 0000000..9ac5fbd
--- /dev/null
@@ -0,0 +1,550 @@
+/*     $NetBSD: printf.c,v 1.19 1998/02/03 03:10:15 perry Exp $        */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if !defined(BUILTIN) && !defined(SHELL)
+__COPYRIGHT("@(#) Copyright (c) 1989, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif
+#endif
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)printf.c   8.2 (Berkeley) 3/22/95";
+#else
+__RCSID("$NetBSD: printf.c,v 1.19 1998/02/03 03:10:15 perry Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <limits.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <unistd.h>
+
+static int      print_escape_str __P((const char *));
+static size_t   print_escape __P((const char *));
+
+static int      getchr __P((void));
+static double   getdouble __P((void));
+static int      getint __P((void));
+static long     getlong __P((void));
+static unsigned long getulong __P ((void));
+static char    *getstr __P((void));
+static char    *mklong __P((const char *, int)); 
+static void      check_conversion __P((const char *, const char *));
+static void     usage __P((void)); 
+     
+static int     rval;
+static char  **gargv;
+
+#ifdef BUILTIN
+int progprintf __P((int, char **));
+#else
+int main __P((int, char **));
+#endif
+
+#define isodigit(c)    ((c) >= '0' && (c) <= '7')
+#define octtobin(c)    ((c) - '0')
+#define hextobin(c)    ((c) >= 'A' && (c) <= 'F' ? c - 'A' + 10 : (c) >= 'a' && (c) <= 'f' ? c - 'a' + 10 : c - '0')
+
+#ifdef SHELL
+#define main printfcmd
+#ifdef __APPLE__
+#include "bltin/bltin.h"
+#else
+#include "../../bin/sh/bltin/bltin.h"
+#endif
+
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <vararg.h>
+#endif
+
+static void warnx __P((const char *fmt, ...));
+
+static void 
+#ifdef __STDC__
+warnx(const char *fmt, ...)
+#else
+warnx(fmt, va_alist)
+       const char *fmt;
+       va_dcl
+#endif
+{
+       
+       char buf[64];
+       va_list ap;
+
+#ifdef __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       vsprintf(buf, fmt, ap);
+       va_end(ap);
+
+       error(buf);
+}
+#endif /* SHELL */
+
+#define PF(f, func) { \
+       if (fieldwidth) \
+               if (precision) \
+                       (void)printf(f, fieldwidth, precision, func); \
+               else \
+                       (void)printf(f, fieldwidth, func); \
+       else if (precision) \
+               (void)printf(f, precision, func); \
+       else \
+               (void)printf(f, func); \
+}
+
+int
+#ifdef BUILTIN
+progprintf(argc, argv)
+#else
+main(argc, argv)
+#endif
+       int argc;
+       char *argv[];
+{
+       char *fmt, *start;
+       int fieldwidth, precision;
+       char convch, nextch;
+       char *format;
+       int ch;
+
+#if !defined(SHELL) && !defined(BUILTIN)
+       (void)setlocale (LC_ALL, "");
+#endif
+
+       while ((ch = getopt(argc, argv, "")) != -1) {
+               switch (ch) {
+               case '?':
+               default:
+                       usage();
+                       return (1);
+               }
+       }
+       argc -= optind;
+       argv += optind;
+
+       if (argc < 1) {
+               usage();
+               return (1);
+       }
+
+       format = *argv;
+       gargv = ++argv;
+
+#define SKIP1  "#-+ 0"
+#define SKIP2  "*0123456789"
+       do {
+               /*
+                * Basic algorithm is to scan the format string for conversion
+                * specifications -- once one is found, find out if the field
+                * width or precision is a '*'; if it is, gather up value. 
+                * Note, format strings are reused as necessary to use up the
+                * provided arguments, arguments of zero/null string are 
+                * provided to use up the format string.
+                */
+
+               /* find next format specification */
+               for (fmt = format; *fmt; fmt++) {
+                       switch (*fmt) {
+                       case '%':
+                               start = fmt++;
+
+                               if (*fmt == '%') {
+                                       (void)putchar('%');
+                                       break;
+                               } else if (*fmt == 'b') {
+                                       char *p = getstr();
+                                       if (print_escape_str(p)) {
+                                               return (rval);
+                                       }
+                                       break;
+                               }
+
+                               /* skip to field width */
+                               for (; strchr(SKIP1, *fmt); ++fmt) ;
+                               fieldwidth = *fmt == '*' ? getint() : 0;
+
+                               /* skip to possible '.', get following precision */
+                               for (; strchr(SKIP2, *fmt); ++fmt) ;
+                               if (*fmt == '.')
+                                       ++fmt;
+                               precision = *fmt == '*' ? getint() : 0;
+
+                               for (; strchr(SKIP2, *fmt); ++fmt) ;
+                               if (!*fmt) {
+                                       warnx ("missing format character");
+                                       return(1);
+                               }
+
+                               convch = *fmt;
+                               nextch = *(fmt + 1);
+                               *(fmt + 1) = '\0';
+                               switch(convch) {
+                               case 'c': {
+                                       char p = getchr();
+                                       PF(start, p);
+                                       break;
+                               }
+                               case 's': {
+                                       char *p = getstr();
+                                       PF(start, p);
+                                       break;
+                               }
+                               case 'd':
+                               case 'i': {
+                                       char *f = mklong(start, convch);
+                                       long p = getlong();
+                                       PF(f, p);
+                                       break;
+                               }
+                               case 'o':
+                               case 'u':
+                               case 'x':
+                               case 'X': {
+                                       char *f = mklong(start, convch);
+                                       unsigned long p = getulong();
+                                       PF(f, p);
+                                       break;
+                               }
+                               case 'e':
+                               case 'E':
+                               case 'f':
+                               case 'g':
+                               case 'G': {
+                                       double p = getdouble();
+                                       PF(start, p);
+                                       break;
+                               }
+                               default:
+                                       warnx ("%s: invalid directive", start);
+                                       return(1);
+                               }
+                               *(fmt + 1) = nextch;
+                               break;
+
+                       case '\\':
+                               fmt += print_escape(fmt);
+                               break;
+
+                       default:
+                               (void)putchar(*fmt);
+                               break;
+                       }
+               }
+       } while (gargv > argv && *gargv);
+
+       return (rval);
+}
+
+
+/*
+ * Print SysV echo(1) style escape string 
+ *     Halts processing string and returns 1 if a \c escape is encountered.
+ */
+static int
+print_escape_str(str)
+       const char *str;
+{
+       int value;
+       int c;
+
+       while (*str) {
+               if (*str == '\\') {
+                       str++;
+                       /* 
+                        * %b string octal constants are not like those in C.
+                        * They start with a \0, and are followed by 0, 1, 2, 
+                        * or 3 octal digits. 
+                        */
+                       if (*str == '0') {
+                               str++;
+                               for (c = 3, value = 0; c-- && isodigit(*str); str++) {
+                                       value <<= 3;
+                                       value += octtobin(*str);
+                               }
+                               (void)putchar(value);
+                               str--;
+                       } else if (*str == 'c') {
+                               return 1;
+                       } else {
+                               str--;                  
+                               str += print_escape(str);
+                       }
+               } else {
+                       (void)putchar(*str);
+               }
+               str++;
+       }
+
+       return 0;
+}
+
+/*
+ * Print "standard" escape characters 
+ */
+static size_t
+print_escape(str)
+       const char *str;
+{
+       const char *start = str;
+       int value;
+       int c;
+
+       str++;
+
+       switch (*str) {
+       case '0': case '1': case '2': case '3':
+       case '4': case '5': case '6': case '7':
+               for (c = 3, value = 0; c-- && isodigit(*str); str++) {
+                       value <<= 3;
+                       value += octtobin(*str);
+               }
+               (void)putchar(value);
+               return str - start - 1;
+               /* NOTREACHED */
+
+       case 'x':
+               str++;
+               for (value = 0; isxdigit(*str); str++) {
+                       value <<= 4;
+                       value += hextobin(*str);
+               }
+               if (value > UCHAR_MAX) {
+                       warnx ("escape sequence out of range for character");
+                       rval = 1;
+               }
+               (void)putchar (value);
+               return str - start - 1;
+               /* NOTREACHED */
+
+       case '\\':                      /* backslash */
+               (void)putchar('\\');
+               break;
+
+       case '\'':                      /* single quote */
+               (void)putchar('\'');
+               break;
+
+       case '"':                       /* double quote */
+               (void)putchar('"');
+               break;
+
+       case 'a':                       /* alert */
+#ifdef __STDC__
+               (void)putchar('\a');
+#else
+               (void)putchar(007);
+#endif
+               break;
+
+       case 'b':                       /* backspace */
+               (void)putchar('\b');
+               break;
+
+       case 'e':                       /* escape */
+#ifdef __GNUC__
+               (void)putchar('\e');
+#else
+               (void)putchar(033);
+#endif
+               break;
+
+       case 'f':                       /* form-feed */
+               (void)putchar('\f');
+               break;
+
+       case 'n':                       /* newline */
+               (void)putchar('\n');
+               break;
+
+       case 'r':                       /* carriage-return */
+               (void)putchar('\r');
+               break;
+
+       case 't':                       /* tab */
+               (void)putchar('\t');
+               break;
+
+       case 'v':                       /* vertical-tab */
+               (void)putchar('\v');
+               break;
+
+       default:
+               (void)putchar(*str);
+               warnx("unknown escape sequence `\\%c'", *str);
+               rval = 1;
+               break;
+       }
+
+       return 1;
+}
+
+static char *
+mklong(str, ch)
+       const char *str;
+       char ch;
+{
+       static char copy[64];
+       size_t len;     
+
+       len = strlen(str) + 2;
+       (void)memmove(copy, str, len - 3);
+       copy[len - 3] = 'l';
+       copy[len - 2] = ch;
+       copy[len - 1] = '\0';
+       return (copy);  
+}
+
+static int
+getchr()
+{
+       if (!*gargv)
+               return ('\0');
+       return ((int)**gargv++);
+}
+
+static char *
+getstr()
+{
+       if (!*gargv)
+               return ("");
+       return (*gargv++);
+}
+
+static char *Number = "+-.0123456789";
+static int
+getint()
+{
+       if (!*gargv)
+               return(0);
+
+       if (strchr(Number, **gargv))
+               return(atoi(*gargv++));
+
+       return 0;
+}
+
+static long
+getlong()
+{
+       long val;
+       char *ep;
+
+       if (!*gargv)
+               return(0L);
+
+       if (**gargv == '\"' || **gargv == '\'')
+               return (long) *((*gargv++)+1);
+
+       errno = 0;
+       val = strtol (*gargv, &ep, 0);
+       check_conversion(*gargv++, ep);
+       return val;
+}
+
+static unsigned long
+getulong()
+{
+       unsigned long val;
+       char *ep;
+
+       if (!*gargv)
+               return(0UL);
+
+       if (**gargv == '\"' || **gargv == '\'')
+               return (unsigned long) *((*gargv++)+1);
+
+       errno = 0;
+       val = strtoul (*gargv, &ep, 0);
+       check_conversion(*gargv++, ep);
+       return val;
+}
+
+static double
+getdouble()
+{
+       double val;
+       char *ep;
+
+       if (!*gargv)
+               return(0.0);
+
+       if (**gargv == '\"' || **gargv == '\'')
+               return (double) *((*gargv++)+1);
+
+       errno = 0;
+       val = strtod (*gargv, &ep);
+       check_conversion(*gargv++, ep);
+       return val;
+}
+
+static void
+check_conversion(s, ep)
+       const char *s;
+       const char *ep;
+{
+       if (*ep) {
+               if (ep == s)
+                       warnx ("%s: expected numeric value", s);
+               else
+                       warnx ("%s: not completely converted", s);
+               rval = 1;
+       } else if (errno == ERANGE) {
+               warnx ("%s: %s", s, strerror(ERANGE));
+               rval = 1;
+       }
+}
+
+static void
+usage()
+{
+       (void)fprintf(stderr, "usage: printf format [arg ...]\n");
+}
diff --git a/pwd/Makefile b/pwd/Makefile
new file mode 100644 (file)
index 0000000..377d638
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = pwd
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = pwd.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble pwd.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/pwd/Makefile.postamble b/pwd/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/pwd/Makefile.preamble b/pwd/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/pwd/PB.project b/pwd/PB.project
new file mode 100644 (file)
index 0000000..c6850b7
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (pwd.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, pwd.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = pwd; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/pwd/pwd.1 b/pwd/pwd.1
new file mode 100644 (file)
index 0000000..8c443c7
--- /dev/null
+++ b/pwd/pwd.1
@@ -0,0 +1,83 @@
+.\"    $NetBSD: pwd.1,v 1.12 1997/09/14 08:51:38 lukem Exp $
+.\"
+.\" Copyright (c) 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)pwd.1      8.2 (Berkeley) 4/28/95
+.\"
+.Dd November 2, 1998
+.Dt PWD 1
+.Os BSD 4
+.Sh NAME
+.Nm pwd
+.Nd return working directory name
+.Sh SYNOPSIS
+.Nm
+.Op Fl LP
+.Sh DESCRIPTION
+.Nm
+writes the absolute pathname of the current working directory to
+the standard output.
+.Pp
+The
+.Nm
+utility exits 0 on success, and >0 if an error occurs.
+.Pp
+The following options are available:
+.Bl -tag -width indent
+.It Fl L
+Print the logical path to the current working directory, as defined
+by the shell in the evironment variable PWD.
+.It Fl P
+Print the physical path to the current working directory, with symbolic
+links in the path resolved. This is the default.
+.El
+.Sh STANDARDS
+The
+.Nm
+utility is expected to be
+.St -p1003.2
+compatible.
+.Sh SEE ALSO
+.Xr cd 1 ,
+.Xr csh 1 ,
+.Xr getcwd 3
+.Sh BUGS
+In
+.Xr csh 1
+the command
+.Ic dirs
+is always faster (although it can give a different answer in the rare case
+that the current directory or a containing directory was moved after
+the shell descended into it).
diff --git a/pwd/pwd.c b/pwd/pwd.c
new file mode 100644 (file)
index 0000000..bdd80bd
--- /dev/null
+++ b/pwd/pwd.c
@@ -0,0 +1,160 @@
+/*     $NetBSD: pwd.c,v 1.10 1998/07/28 05:31:26 mycroft Exp $ */
+
+/*
+ * Copyright (c) 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1991, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)pwd.c      8.3 (Berkeley) 4/1/94";
+#else
+__RCSID("$NetBSD: pwd.c,v 1.10 1998/07/28 05:31:26 mycroft Exp $");
+#endif
+#endif /* not lint */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <string.h>
+
+char *getcwd_logical __P((char *, size_t));
+void  usage __P((void));
+int   main __P((int, char *[]));
+
+#ifdef __APPLE__
+char
+*getcwd_physical(pt, size)
+       char *pt;
+       size_t size;
+{
+       unsetenv("PWD");
+       return getcwd(pt, size);
+}
+#define getcwd getcwd_physical
+#endif
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int ch;
+       int lFlag=0;
+       char *p = NULL;
+
+       while ((ch = getopt(argc, argv, "LP")) != -1)
+               switch (ch) {
+               case 'L':
+                       lFlag=1;
+                       break;
+               case 'P':
+                       lFlag=0;
+                       break;
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc != 0)
+               usage();
+
+       if (lFlag)
+               p = getcwd_logical(NULL, 0);
+       else
+               p = getcwd(NULL, 0);
+
+       if (p == NULL) err(1, "%s", "");
+
+       (void)printf("%s\n", p);
+
+       exit(0);
+       /* NOTREACHED */
+}
+
+char *
+getcwd_logical(pt, size)
+        char *pt;
+        size_t size;
+{
+        char *pwd;
+        size_t pwdlen;
+        dev_t dev;
+        ino_t ino;
+        struct stat s;
+
+        /* Check $PWD -- if it's right, it's fast. */
+        if ((pwd = getenv("PWD")) != NULL && pwd[0] == '/' && stat(pwd, &s) != -1) {
+                dev = s.st_dev;
+                ino = s.st_ino;
+                if (stat(".", &s) != -1 && dev == s.st_dev && ino == s.st_ino) {
+                        pwdlen = strlen(pwd);
+                       if (pt) {
+                               if (!size) {
+                                        errno = EINVAL;
+                                        return (NULL);
+                               }
+                                if (pwdlen + 1 > size) {
+                                        errno = ERANGE;
+                                        return (NULL);
+                                }
+                        } else if ((pt = malloc(pwdlen + 1)) == NULL) {
+                               errno = ENOMEM;
+                                return (NULL);
+                       }
+                        memmove(pt, pwd, pwdlen);
+                        pt[pwdlen] = '\0';
+                        return (pt);
+                }
+        }
+
+        return (NULL);
+}
+
+void
+usage()
+{
+       (void)fprintf(stderr, "usage: pwd [-LP]\n");
+       exit(1);
+       /* NOTREACHED */
+}
diff --git a/renice/Makefile b/renice/Makefile
new file mode 100644 (file)
index 0000000..8cd335f
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = renice
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = renice.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble renice.8
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/renice/Makefile.postamble b/renice/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/renice/Makefile.preamble b/renice/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/renice/PB.project b/renice/PB.project
new file mode 100644 (file)
index 0000000..8b0d1bb
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (renice.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, renice.8); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = renice; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/renice/renice.8 b/renice/renice.8
new file mode 100644 (file)
index 0000000..ef9cb20
--- /dev/null
@@ -0,0 +1,135 @@
+.\"    $NetBSD: renice.8,v 1.5 1997/10/19 14:01:33 lukem Exp $
+.\"
+.\" Copyright (c) 1983, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)renice.8     8.1 (Berkeley) 6/9/93
+.\"    $NetBSD: renice.8,v 1.5 1997/10/19 14:01:33 lukem Exp $
+.\"
+.Dd June 9, 1993
+.Dt RENICE 8
+.Os BSD 4
+.Sh NAME
+.Nm renice
+.Nd alter priority of running processes
+.Sh SYNOPSIS
+.Nm
+.Ar priority
+.Oo
+.Op Fl p
+.Ar pid ...
+.Oc
+.Oo
+.Op Fl g
+.Ar pgrp ...
+.Oc
+.Oo
+.Op Fl u
+.Ar user ...
+.Oc
+.Sh DESCRIPTION
+.Nm
+alters the 
+scheduling priority of one or more running processes.
+The following
+.Ar who
+parameters are interpreted as process ID's, process group
+ID's, or user names.
+.Nm "" Ns 'ing
+a process group causes all processes in the process group
+to have their scheduling priority altered.  
+.Nm "" Ns 'ing
+a user causes all processes owned by the user to have
+their scheduling priority altered.
+By default, the processes to be affected are specified by
+their process ID's.
+.Pp
+Options supported by
+.Nm "" :
+.Bl -tag -width Ds
+.It Fl g
+Force 
+.Ar who
+parameters to be interpreted as process group ID's.
+.It Fl u
+Force the
+.Ar who
+parameters to be interpreted as user names.
+.It Fl p
+Resets the
+.Ar who
+interpretation to be (the default) process ID's.
+.El
+.Pp
+For example,
+.Bd -literal -offset
+renice +1 987 -u daemon root -p 32
+.Ed
+.Pp
+would change the priority of process ID's 987 and 32, and
+all processes owned by users daemon and root.
+.Pp
+Users other than the super-user may only alter the priority of
+processes they own,
+and can only monotonically increase their ``nice value''
+within the range 0 to
+.Dv PRIO_MAX
+(20).
+(This prevents overriding administrative fiats.)
+The super-user
+may alter the priority of any process
+and set the priority to any value in the range
+.Dv PRIO_MIN
+(\-20)
+to
+.Dv PRIO_MAX .
+Useful priorities are:
+20 (the affected processes will run only when nothing else
+in the system wants to),
+0 (the ``base'' scheduling priority),
+anything negative (to make things go very fast).
+.Sh FILES
+.Bl -tag -width /etc/passwd -compact
+.It Pa /etc/passwd
+to map user names to user ID's
+.El
+.Sh SEE ALSO
+.Xr nice 1 ,
+.Xr getpriority 2 ,
+.Xr setpriority 2
+.Sh BUGS
+Non super-users can not increase scheduling priorities of their own processes,
+even if they were the ones that decreased the priorities in the first place.
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 4.0 .
diff --git a/renice/renice.c b/renice/renice.c
new file mode 100644 (file)
index 0000000..ba4a00d
--- /dev/null
@@ -0,0 +1,135 @@
+/*     $NetBSD: renice.c,v 1.5 1997/10/19 14:01:38 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1983, 1989, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+/*static char sccsid[] = "from: @(#)renice.c   8.1 (Berkeley) 6/9/93";*/
+__RCSID("$NetBSD: renice.c,v 1.5 1997/10/19 14:01:38 lukem Exp $");
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <err.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int    donice __P((int, int, int));
+int    main __P((int, char **));
+
+/*
+ * Change the priority (nice) of processes
+ * or groups of processes which are already
+ * running.
+ */
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       int which = PRIO_PROCESS;
+       int who = 0, prio, errs = 0;
+
+       argc--, argv++;
+       if (argc < 2) {
+               fprintf(stderr, "usage: renice priority [ [ -p ] pids ] ");
+               fprintf(stderr, "[ [ -g ] pgrps ] [ [ -u ] users ]\n");
+               exit(1);
+       }
+       prio = atoi(*argv);
+       argc--, argv++;
+       if (prio > PRIO_MAX)
+               prio = PRIO_MAX;
+       if (prio < PRIO_MIN)
+               prio = PRIO_MIN;
+       for (; argc > 0; argc--, argv++) {
+               if (strcmp(*argv, "-g") == 0) {
+                       which = PRIO_PGRP;
+                       continue;
+               }
+               if (strcmp(*argv, "-u") == 0) {
+                       which = PRIO_USER;
+                       continue;
+               }
+               if (strcmp(*argv, "-p") == 0) {
+                       which = PRIO_PROCESS;
+                       continue;
+               }
+               if (which == PRIO_USER) {
+                       register struct passwd *pwd = getpwnam(*argv);
+                       
+                       if (pwd == NULL) {
+                               warnx("%s: unknown user", *argv);
+                               continue;
+                       }
+                       who = pwd->pw_uid;
+               } else {
+                       who = atoi(*argv);
+                       if (who < 0) {
+                               warnx("%s: bad value", *argv);
+                               continue;
+                       }
+               }
+               errs += donice(which, who, prio);
+       }
+       exit(errs != 0);
+}
+
+int
+donice(which, who, prio)
+       int which, who, prio;
+{
+       int oldprio;
+       extern int errno;
+
+       errno = 0, oldprio = getpriority(which, who);
+       if (oldprio == -1 && errno) {
+               warn("%d: getpriority", who);
+               return (1);
+       }
+       if (setpriority(which, who, prio) < 0) {
+               warn("%d: setpriority", who);
+               return (1);
+       }
+       printf("%d: old priority %d, new priority %d\n", who, oldprio, prio);
+       return (0);
+}
diff --git a/script/Makefile b/script/Makefile
new file mode 100644 (file)
index 0000000..08d1d7d
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = script
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = script.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble script.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/script/Makefile.postamble b/script/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/script/Makefile.preamble b/script/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/script/PB.project b/script/PB.project
new file mode 100644 (file)
index 0000000..0adad9f
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (script.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, script.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = script; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/script/script.1 b/script/script.1
new file mode 100644 (file)
index 0000000..485bf30
--- /dev/null
@@ -0,0 +1,126 @@
+.\"    $NetBSD: script.1,v 1.4 1997/10/19 22:57:47 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)script.1    8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt SCRIPT 1
+.Os BSD 4
+.Sh NAME
+.Nm script
+.Nd make typescript of terminal session
+.Sh SYNOPSIS
+.Nm
+.Op Fl a
+.Op Ar file
+.Sh DESCRIPTION
+.Nm
+makes a typescript of everything printed on your terminal.
+It is useful for students who need a hardcopy record of an interactive
+session as proof of an assignment, as the typescript file 
+can be printed out later with
+.Xr lpr 1 .
+.Pp
+If the argument
+.Ar file
+is given,
+.Nm
+saves all dialogue in
+.Ar file .
+If no file name is given, the typescript is saved in the file
+.Pa typescript  .
+.Pp
+Option:
+.Bl -tag -width Ds
+.It Fl a
+Append the output to
+.Ar file
+or
+.Pa typescript ,
+retaining the prior contents.
+.El
+.Pp
+The script ends when the forked shell exits (a
+.Em control-D
+to exit
+the Bourne shell
+.Pf ( Xr sh 1 ) ,
+and
+.Em exit , 
+.Em logout
+or
+.Em control-d
+(if
+.Em ignoreeof
+is not set) for the
+C-shell,
+.Xr csh 1 ) .
+.Pp
+Certain interactive commands, such as
+.Xr vi 1 ,
+create garbage in the typescript file.
+.Nm
+works best with commands that do not manipulate the
+screen, the results are meant to emulate a hardcopy
+terminal.
+.Sh ENVIRONMENT
+The following environment variable is utilized by
+.Nm
+:
+.Bl -tag -width SHELL
+.It Ev SHELL
+If the variable
+.Ev SHELL
+exists, the shell forked by
+.Nm
+will be that shell. If
+.Ev SHELL
+is not set, the Bourne shell
+is assumed. (Most shells set this variable automatically).
+.El
+.Sh SEE ALSO
+.Xr csh 1
+(for the
+.Em history
+mechanism).
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 3.0 .
+.Sh BUGS
+.Nm
+places
+.Sy everything
+in the log file, including linefeeds and backspaces.
+This is not what the naive user expects.
diff --git a/script/script.c b/script/script.c
new file mode 100644 (file)
index 0000000..dc980ce
--- /dev/null
@@ -0,0 +1,249 @@
+/*     $NetBSD: script.c,v 1.6 1998/04/02 11:08:34 kleink Exp $        */
+
+/*
+ * Copyright (c) 1980, 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1980, 1992, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)script.c   8.1 (Berkeley) 6/6/93";
+#endif
+__RCSID("$NetBSD: script.c,v 1.6 1998/04/02 11:08:34 kleink Exp $");
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <paths.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <time.h>
+#include <tzfile.h>
+#include <unistd.h>
+#include <util.h>
+
+FILE   *fscript;
+int    master, slave;
+int    child, subchild;
+int    outcc;
+char   *fname;
+
+struct termios tt;
+
+void   done __P((void));
+void   dooutput __P((void));
+void   doshell __P((void));
+void   fail __P((void));
+void   finish __P((int));
+int    main __P((int, char **));
+void   scriptflush __P((int));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int cc;
+       struct termios rtt;
+       struct winsize win;
+       int aflg, ch;
+       char ibuf[BUFSIZ];
+
+       aflg = 0;
+       while ((ch = getopt(argc, argv, "a")) != -1)
+               switch(ch) {
+               case 'a':
+                       aflg = 1;
+                       break;
+               case '?':
+               default:
+                       (void)fprintf(stderr, "usage: script [-a] [file]\n");
+                       exit(1);
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc > 0)
+               fname = argv[0];
+       else
+               fname = "typescript";
+
+       if ((fscript = fopen(fname, aflg ? "a" : "w")) == NULL)
+               err(1, "fopen %s", fname);
+
+       (void)tcgetattr(STDIN_FILENO, &tt);
+       (void)ioctl(STDIN_FILENO, TIOCGWINSZ, &win);
+       if (openpty(&master, &slave, NULL, &tt, &win) == -1)
+               err(1, "openpty");
+
+       (void)printf("Script started, output file is %s\n", fname);
+       rtt = tt;
+       cfmakeraw(&rtt);
+       rtt.c_lflag &= ~ECHO;
+       (void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &rtt);
+
+       (void)signal(SIGCHLD, finish);
+       child = fork();
+       if (child < 0) {
+               warn("fork");
+               fail();
+       }
+       if (child == 0) {
+               subchild = child = fork();
+               if (child < 0) {
+                       warn("fork");
+                       fail();
+               }
+               if (child)
+                       dooutput();
+               else
+                       doshell();
+       }
+
+       (void)fclose(fscript);
+       while ((cc = read(STDIN_FILENO, ibuf, BUFSIZ)) > 0)
+               (void)write(master, ibuf, cc);
+       done();
+       /* NOTREACHED */
+       return (0);
+}
+
+void
+finish(signo)
+       int signo;
+{
+       int die, pid;
+       union wait status;
+
+       die = 0;
+       while ((pid = wait3((int *)&status, WNOHANG, 0)) > 0)
+               if (pid == child)
+                       die = 1;
+
+       if (die)
+               done();
+}
+
+void
+dooutput()
+{
+       struct itimerval value;
+       int cc;
+       time_t tvec;
+       char obuf[BUFSIZ];
+
+       (void)close(STDIN_FILENO);
+       tvec = time(NULL);
+       (void)fprintf(fscript, "Script started on %s", ctime(&tvec));
+
+       (void)signal(SIGALRM, scriptflush);
+       value.it_interval.tv_sec = SECSPERMIN / 2;
+       value.it_interval.tv_usec = 0;
+       value.it_value = value.it_interval;
+       (void)setitimer(ITIMER_REAL, &value, NULL);
+       for (;;) {
+               cc = read(master, obuf, sizeof (obuf));
+               if (cc <= 0)
+                       break;
+               (void)write(1, obuf, cc);
+               (void)fwrite(obuf, 1, cc, fscript);
+               outcc += cc;
+       }
+       done();
+}
+
+void
+scriptflush(signo)
+       int signo;
+{
+       if (outcc) {
+               (void)fflush(fscript);
+               outcc = 0;
+       }
+}
+
+void
+doshell()
+{
+       char *shell;
+
+       shell = getenv("SHELL");
+       if (shell == NULL)
+               shell = _PATH_BSHELL;
+
+       (void)close(master);
+       (void)fclose(fscript);
+       login_tty(slave);
+       execl(shell, shell, "-i", NULL);
+       warn("execl %s", shell);
+       fail();
+}
+
+void
+fail()
+{
+
+       (void)kill(0, SIGTERM);
+       done();
+}
+
+void
+done()
+{
+       time_t tvec;
+
+       if (subchild) {
+               tvec = time(NULL);
+               (void)fprintf(fscript,"\nScript done on %s", ctime(&tvec));
+               (void)fclose(fscript);
+               (void)close(master);
+       } else {
+               (void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &tt);
+               (void)printf("Script done, output file is %s\n", fname);
+       }
+       exit(0);
+}
diff --git a/shlock/Makefile b/shlock/Makefile
new file mode 100644 (file)
index 0000000..fcfe3a9
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = shlock
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = shlock.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble shlock.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/shlock/Makefile.postamble b/shlock/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/shlock/Makefile.preamble b/shlock/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/shlock/PB.project b/shlock/PB.project
new file mode 100644 (file)
index 0000000..ad0493f
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (shlock.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, shlock.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = shlock; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/shlock/shlock.1 b/shlock/shlock.1
new file mode 100644 (file)
index 0000000..82b62d2
--- /dev/null
@@ -0,0 +1,122 @@
+.\"    $NetBSD: shlock.1,v 1.2 1997/10/19 23:08:43 lukem Exp $
+.\"
+.Dd June 29, 1997
+.Dt SHLOCK 1
+.Os
+.Sh NAME
+.Nm shlock
+.Nd create or verify a lock file for shell scripts
+.Sh SYNOPSIS
+.Nm
+.Fl f
+.Ar lockfile
+.Op Fl p Ar PID
+.Op Fl u
+.Op Fl v
+.Sh DESCRIPTION
+The
+.Nm
+command can create or verify a lock file on behalf of a shell or
+other script program.
+When it attempts to create a lock file, if one already exists,
+.Nm
+verifies that it is or is not valid.
+If valid,
+.Nm
+will exit with a non-zero exit code.
+If invalid,
+.Nm
+will remove the lock file, and 
+create a new one.
+.Pp
+.Nm
+uses the
+.Xr rename 2
+system call to make the final target lock file, which is an atomic
+operation (i.e. "dot locking", so named for this mechanism's original
+use for locking system mailboxes).
+It puts the process ID ("PID") from the command line into the
+requested lock file.
+.Pp
+.Nm
+verifies that an extant lock file is still valid by
+using
+.Xr kill 2
+with a zero signal to check for the existence of the process that
+holds the lock.
+.Pp
+The
+.Fl f
+argument with
+.Ar lockfile
+is always required.
+.Pp
+The
+.Fl p
+option with
+.Ar PID
+is given when the program is to create a lock file; when absent,
+.Nm
+will simply check for the validity of the lock file.
+.Pp
+The
+.Fl u
+option causes
+.Nm
+to read and write the PID as a binary pid_t, instead of as ASCII,
+to be compatible with the locks created by UUCP.
+.Pp
+The
+.Fl v
+option causes
+.Nm
+to be verbose about what it is doing.
+.Sh RETURN VALUES
+A zero exit code indicates a valid lock file.
+.Sh EXAMPLES
+.Ss BOURNE SHELL
+.Bd -literal
+#!/bin/sh
+lckfile=/tmp/foo.lock
+if shlock -f ${lckfile} -p $$
+then
+#      do what required the lock
+       rm ${lckfile}
+else
+       echo Lock ${lckfile} already held by `cat ${lckfile}`
+fi
+.Ed
+.Ss C SHELL
+.Bd -literal
+#!/bin/csh -f
+set lckfile=/tmp/foo.lock
+shlock -f ${lckfile} -p $$
+if ($status == 0) then
+#      do what required the lock
+       rm ${lckfile}
+else
+       echo Lock ${lckfile} already held by `cat ${lckfile}`
+endif
+.Ed
+
+.Pp
+The examples assume that the filesystem where the lock file is to
+be created is writeable by the user, and has space available.
+.Sh HISTORY
+.Nm
+was written for the first Network News Transfer Protocol (NNTP)
+software distribution, released in March 1986.
+The algorithm was suggested by Peter Honeyman,
+from work he did on HoneyDanBer UUCP.
+.Sh AUTHOR
+Erik E. Fair <fair@clock.org>
+.Sh BUGS
+Does not work on NFS or other network filesystem on different
+systems because the disparate systems have disjoint PID spaces.
+.Pp
+Cannot handle the case where a lock file was not deleted, the
+process that created it has exited, and the system has created a
+new process with the same PID as in the dead lock file.
+The lock file will appear to be valid even though the process is
+unrelated to the one that created the lock in the first place.
+Always remove your lock files after you're done.
diff --git a/shlock/shlock.c b/shlock/shlock.c
new file mode 100644 (file)
index 0000000..862e4b7
--- /dev/null
@@ -0,0 +1,344 @@
+/*     $NetBSD: shlock.c,v 1.3 1998/01/09 08:06:11 perry Exp $ */
+
+/*
+** Program to produce reliable locks for shell scripts.
+** Algorithm suggested by Peter Honeyman, January 1984,
+** in connection with HoneyDanBer UUCP.
+**
+** I tried extending this to handle shared locks in November 1987,
+** and ran into to some fundamental problems:
+**
+**     Neither 4.3 BSD nor System V have an open(2) with locking,
+**     so that you can open a file and have it locked as soon as
+**     it's real; you have to make two system calls, and there's
+**     a race...
+**
+**     When removing dead process id's from a list in a file,
+**     you need to truncate the file (you don't want to create a
+**     new one; see above); unfortunately for the portability of
+**     this program, only 4.3 BSD has ftruncate(2).
+**
+** Erik E. Fair <fair@ucbarpa.berkeley.edu>, November 8, 1987
+**
+** Extensions for UUCP style locks (i.e. pid is an int in the file,
+** rather than an ASCII string). Also fix long standing bug with
+** full file systems and temporary files.
+**
+** Erik E. Fair <fair@apple.com>, November 12, 1989
+**
+** ANSIfy the code somewhat to make gcc -Wall happy with the code.
+** Submit to NetBSD
+**
+** Erik E. Fair <fair@clock.org>, May 20, 1997
+*/
+
+#include <sys/types.h>
+#include <sys/file.h>
+#include <fcntl.h>                     /* Needed on hpux */
+#include <stdio.h>
+#include <signal.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#define        LOCK_SET        0
+#define        LOCK_FAIL       1
+
+#define        LOCK_GOOD       0
+#define        LOCK_BAD        1
+
+#define        FAIL            (-1)
+
+#define        TRUE    1
+#define        FALSE   0
+
+int    Debug = FALSE;
+char   *Pname;
+char   *USAGE = "%s: USAGE: shlock -f file -p pid [-d][-u]\n";
+char   *E_unlk = "%s: unlink(%s): %s\n";
+char   *E_open = "%s: open(%s): %s\n";
+
+#define        dprintf if (Debug) printf
+
+/*
+** Prototypes to make the ANSI compilers happy
+** Didn't lint used to do type and argument checking?
+** (and wasn't that sufficient?)
+*/
+
+#ifdef __STDC__
+/* the following is in case you need to make the prototypes go away. */
+#define _P(x)  x
+
+char   *xtmpfile _P((char *, pid_t, int));
+int    p_exists _P((pid_t));
+int    cklock _P((char *, int));
+int    mklock _P((char *, pid_t, int));
+void   bad_usage _P((void));
+int    main _P((int, char **));
+#endif /* __STDC__ */
+
+/*
+** Create a temporary file, all ready to lock with.
+** The file arg is so we get the filename right, if he
+** gave us a full path, instead of using the current directory
+** which might not be in the same filesystem.
+*/
+char *
+xtmpfile(file, pid, uucpstyle)
+char   *file;
+pid_t  pid;
+int    uucpstyle;
+{
+       int     fd;
+       int     len;
+       char    *cp, buf[BUFSIZ];
+       static char     tempname[BUFSIZ];
+
+       sprintf(buf, "shlock%d", getpid());
+       if ((cp = strrchr(strcpy(tempname, file), '/')) != (char *)NULL) {
+               *++cp = '\0';
+               (void) strcat(tempname, buf);
+       } else
+               (void) strcpy(tempname, buf);
+       dprintf("%s: temporary filename: %s\n", Pname, tempname);
+
+       sprintf(buf, "%d\n", pid);
+       len = strlen(buf);
+openloop:
+       if ((fd = open(tempname, O_RDWR|O_CREAT|O_EXCL, 0644)) < 0) {
+               switch(errno) {
+               case EEXIST:
+                       dprintf("%s: file %s exists already.\n",
+                               Pname, tempname);
+                       if (unlink(tempname) < 0) {
+                               fprintf(stderr, E_unlk,
+                                       Pname, tempname, strerror(errno));
+                               return((char *)NULL);
+                       }
+                       /*
+                       ** Further profanity
+                       */
+                       goto openloop;
+               default:
+                       fprintf(stderr, E_open,
+                               Pname, tempname, strerror(errno));
+                       return((char *)NULL);
+               }
+       }
+
+       /*
+       ** Write the PID into the temporary file before attempting to link
+       ** to the actual lock file. That way we have a valid lock the instant
+       ** the link succeeds.
+       */
+       if (uucpstyle ?
+               (write(fd, &pid, sizeof(pid)) != sizeof(pid)) :
+               (write(fd, buf, len) < 0))
+       {
+               fprintf(stderr, "%s: write(%s,%d): %s\n",
+                       Pname, tempname, pid, strerror(errno));
+               (void) close(fd);
+               if (unlink(tempname) < 0) {
+                       fprintf(stderr, E_unlk,
+                               Pname, tempname, strerror(errno));
+               }
+               return((char *)NULL);
+       }
+       (void) close(fd);
+       return(tempname);
+}
+
+/*
+** Does the PID exist?
+** Send null signal to find out.
+*/
+int
+p_exists(pid)
+pid_t  pid;
+{
+       dprintf("%s: process %d is ", Pname, pid);
+       if (pid <= 0) {
+               dprintf("invalid\n");
+               return(FALSE);
+       }
+       if (kill(pid, 0) < 0) {
+               switch(errno) {
+               case ESRCH:
+                       dprintf("dead\n");
+                       return(FALSE);  /* pid does not exist */
+               case EPERM:
+                       dprintf("alive\n");
+                       return(TRUE);   /* pid exists */
+               default:
+                       dprintf("state unknown: %s\n", strerror(errno));
+                       return(TRUE);   /* be conservative */
+               }
+       }
+       dprintf("alive\n");
+       return(TRUE);   /* pid exists */
+}
+
+/*
+** Check the validity of an existing lock file.
+**
+**     Read the PID out of the lock
+**     Send a null signal to determine whether that PID still exists
+**     Existence (or not) determines the validity of the lock.
+**
+**     Two bigs wins to this algorithm:
+**
+**     o       Locks do not survive crashes of either the system or the
+**                     application by any appreciable period of time.
+**
+**     o       No clean up to do if the system or application crashes.
+**
+*/
+int
+cklock(file, uucpstyle)
+char   *file;
+int    uucpstyle;
+{
+       int     fd = open(file, O_RDONLY);
+       ssize_t len;
+       pid_t   pid;
+       char    buf[BUFSIZ];
+
+       dprintf("%s: checking extant lock <%s>\n", Pname, file);
+       if (fd < 0) {
+               if (errno != ENOENT)
+                       fprintf(stderr, E_open, Pname, file, strerror(errno));
+               return(TRUE);   /* might or might not; conservatism */
+       }
+
+       if (uucpstyle ?
+               ((len = read(fd, &pid, sizeof(pid))) != sizeof(pid)) :
+               ((len = read(fd, buf, sizeof(buf))) <= 0))
+       {
+               close(fd);
+               dprintf("%s: lock file format error\n", Pname);
+               return(FALSE);
+       }
+       close(fd);
+       buf[len + 1] = '\0';
+       return(p_exists(uucpstyle ? pid : atoi(buf)));
+}
+
+int
+mklock(file, pid, uucpstyle)
+char   *file;
+pid_t  pid;
+int    uucpstyle;
+{
+       char    *tmp;
+       int     retcode = FALSE;
+
+       dprintf("%s: trying lock <%s> for process %d\n", Pname, file, pid);
+       if ((tmp = xtmpfile(file, pid, uucpstyle)) == (char *)NULL)
+               return(FALSE);
+
+linkloop:
+       if (link(tmp, file) < 0) {
+               switch(errno) {
+               case EEXIST:
+                       dprintf("%s: lock <%s> already exists\n", Pname, file);
+                       if (cklock(file, uucpstyle)) {
+                               dprintf("%s: extant lock is valid\n", Pname);
+                               break;
+                       } else {
+                               dprintf("%s: lock is invalid, removing\n",
+                                       Pname);
+                               if (unlink(file) < 0) {
+                                       fprintf(stderr, E_unlk,
+                                               Pname, file, strerror(errno));
+                                       break;
+                               }
+                       }
+                       /*
+                       ** I hereby profane the god of structured programming,
+                       ** Edsgar Dijkstra
+                       */
+                       goto linkloop;
+               default:
+                       fprintf(stderr, "%s: link(%s, %s): %s\n",
+                               Pname, tmp, file, strerror(errno));
+                       break;
+               }
+       } else {
+               dprintf("%s: got lock <%s>\n", Pname, file);
+               retcode = TRUE;
+       }
+       if (unlink(tmp) < 0) {
+               fprintf(stderr, E_unlk, Pname, tmp, strerror(errno));
+       }
+       return(retcode);
+}
+
+void
+bad_usage()
+{
+       fprintf(stderr, USAGE, Pname);
+       exit(LOCK_FAIL);
+}
+
+int
+main(ac, av)
+int    ac;
+char   *av[];
+{
+       int     x;
+       char    *file = (char *)NULL;
+       pid_t   pid = 0;
+       int     uucpstyle = FALSE;      /* indicating UUCP style locks */
+       int     only_check = TRUE;      /* don't make a lock */
+
+       Pname = ((Pname = strrchr(av[0], '/')) ? Pname + 1 : av[0]);
+
+       for(x = 1; x < ac; x++) {
+               if (av[x][0] == '-') {
+                       switch(av[x][1]) {
+                       case 'u':
+                               uucpstyle = TRUE;
+                               break;
+                       case 'd':
+                               Debug = TRUE;
+                               break;
+                       case 'p':
+                               if (strlen(av[x]) > 2) {
+                                       pid = atoi(&av[x][2]);
+                               } else {
+                                       if (++x >= ac) {
+                                               bad_usage();
+                                       }
+                                       pid = atoi(av[x]);
+                               }
+                               only_check = FALSE;     /* wants one */
+                               break;
+                       case 'f':
+                               if (strlen(av[x]) > 2) {
+                                       file = &av[x][2];
+                               } else {
+                                       if (++x >= ac) {
+                                               bad_usage();
+                                       }
+                                       file = av[x];
+                               }
+                               break;
+                       default:
+                               fprintf(stderr, USAGE, Pname);
+                               exit(LOCK_FAIL);
+                       }
+               }
+       }
+
+       if (file == (char *)NULL || (!only_check && pid <= 0)) {
+               bad_usage();
+       }
+
+       if (only_check) {
+               exit(cklock(file, uucpstyle) ? LOCK_GOOD : LOCK_BAD);
+       }
+
+       exit(mklock(file, pid, uucpstyle) ? LOCK_SET : LOCK_FAIL);
+}
diff --git a/sleep/Makefile b/sleep/Makefile
new file mode 100644 (file)
index 0000000..0f6ca2a
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = sleep
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = sleep.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble sleep.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/sleep/Makefile.postamble b/sleep/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/sleep/Makefile.preamble b/sleep/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/sleep/PB.project b/sleep/PB.project
new file mode 100644 (file)
index 0000000..4d7fea8
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (sleep.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, sleep.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = sleep; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/sleep/sleep.1 b/sleep/sleep.1
new file mode 100644 (file)
index 0000000..8815eaa
--- /dev/null
@@ -0,0 +1,124 @@
+.\"    $NetBSD: sleep.1,v 1.11 1997/09/14 07:31:56 lukem Exp $
+.\"
+.\" Copyright (c) 1990, 1993, 1994
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)sleep.1     8.3 (Berkeley) 4/18/94
+.\"
+.Dd April 18, 1994
+.Dt SLEEP 1
+.Os
+.Sh NAME
+.Nm sleep
+.Nd suspend execution for an interval of time
+.Sh SYNOPSIS
+.Nm
+.Ar seconds
+.Sh DESCRIPTION
+The
+.Nm
+utility
+suspends execution for a minimum of
+.Ar seconds .
+It is usually used to schedule the execution of other commands (see
+.Sx EXAMPLES
+below).
+.Pp
+The
+.Nm
+utility exits with one of the following values:
+.Bl -tag -width flag
+.It Li \&0
+On successful completion, or if the signal
+.Dv SIGALRM
+was received.
+.It Li \&>\&0
+An error occurred.
+.El
+.Pp
+Note: The
+.Nx
+.Nm
+command will accept and honor a non-integer number of specified
+seconds. This is a non-portable extension, and its use will nearly
+guarantee that a shell script will not execute properly on another
+system.
+.Sh EXAMPLES
+To schedule the execution of a command for
+.Va x
+number seconds later:
+.Pp
+.Dl (sleep 1800; sh command_file >& errors)&
+.Pp
+This incantation would wait a half hour before
+running the script command_file. (See the
+.Xr at 1
+utility.)
+.Pp
+To reiteratively run a command (with the
+.Xr csh 1 ) :
+.Pp
+.Bd -literal -offset indent -compact
+while (1)
+       if (! -r zzz.rawdata) then
+               sleep 300
+       else
+               foreach i (`ls *.rawdata`)
+                       sleep 70
+                       awk -f collapse_data $i >> results
+               end
+               break
+       endif
+end
+.Ed
+.Pp
+The scenario for a script such as this might be: a program currently
+running is taking longer than expected to process a series of
+files, and it would be nice to have
+another program start processing the files created by the first
+program as soon as it is finished (when zzz.rawdata is created).
+The script checks every five minutes for the file zzz.rawdata,
+when the file is found, then another portion processing
+is done courteously by sleeping for 70 seconds in between each
+awk job.
+.Sh SEE ALSO
+.Xr nanosleep 2 ,
+.Xr sleep 3 ,
+.Xr at 1
+.Sh STANDARDS
+The
+.Nm
+command is expected to be
+.St -p1003.2
+compatible.
diff --git a/sleep/sleep.c b/sleep/sleep.c
new file mode 100644 (file)
index 0000000..7f0203a
--- /dev/null
@@ -0,0 +1,154 @@
+/*     $NetBSD: sleep.c,v 1.15 1998/07/28 11:41:58 mycroft Exp $       */
+
+/*
+ * Copyright (c) 1988, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1988, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)sleep.c    8.3 (Berkeley) 4/2/94";
+#else
+__RCSID("$NetBSD: sleep.c,v 1.15 1998/07/28 11:41:58 mycroft Exp $");
+#endif
+#endif /* not lint */
+
+#include <time.h>
+#include <ctype.h>
+#include <math.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <locale.h>
+
+void usage __P((void));
+void alarmhandle __P((int));
+int  main __P((int, char *[]));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+#ifndef __APPLE__
+       char *arg, *temp;
+       double val, ival, fval;
+       struct timespec ntime;
+       int fracflag;
+#else
+        int secs;
+#endif
+       int ch;
+
+       (void)setlocale(LC_ALL, "");
+
+       (void)signal(SIGALRM, alarmhandle);
+
+       while ((ch = getopt(argc, argv, "")) != -1)
+               switch(ch) {
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc != 1)
+               usage();
+
+#ifdef __APPLE__
+        if ((secs = atoi(*argv)) > 0)
+                       (void)sleep(secs);
+#else
+       /*
+        * Okay, why not just use atof for everything? Why bother
+        * checking if there is a fraction in use? Because the old
+        * sleep handled the full range of integers, that's why, and a
+        * double can't handle a large long. This is fairly useless
+        * given how large a number a double can hold on most
+        * machines, but now we won't ever have trouble. If you want
+        * 1000000000.9 seconds of sleep, well, that's your
+        * problem. Why use an isdigit() check instead of checking for
+        * a period? Because doing it this way means locales will be
+        * handled transparently by the atof code.
+        */
+       fracflag = 0;
+       arg = *argv;
+       for (temp = arg; *temp != '\0'; temp++)
+               if (!isdigit(*temp))
+                       fracflag++;
+
+       if (fracflag) {
+               val = atof(arg);
+               if (val <= 0)
+                       exit(0);
+               ival = floor(val);
+               fval = (1000000000 * (val-ival));
+               ntime.tv_sec = ival;
+               ntime.tv_nsec = fval;
+       }
+       else{
+               ntime.tv_sec = atol(arg);
+               if (ntime.tv_sec <= 0)
+                       exit(0);
+               ntime.tv_nsec = 0;
+       }
+
+       (void)nanosleep(&ntime, NULL);
+#endif
+
+       exit(0);
+       /* NOTREACHED */
+}
+
+void
+usage()
+{
+       (void)fputs("usage: sleep seconds\n", stderr);
+       exit(1);
+       /* NOTREACHED */
+}
+
+/* ARGSUSED */
+void
+alarmhandle(i)
+       int i;
+{
+       _exit(0);
+       /* NOTREACHED */
+}
diff --git a/su/Makefile b/su/Makefile
new file mode 100644 (file)
index 0000000..06864a4
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = su
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = su.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble su.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/su/Makefile.postamble b/su/Makefile.postamble
new file mode 100644 (file)
index 0000000..e5df476
--- /dev/null
@@ -0,0 +1,5 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
+
+INSTALL_AS_USER     = root
+INSTALL_AS_GROUP    = wheel
+INSTALL_PERMISSIONS = 4555
diff --git a/su/Makefile.preamble b/su/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/su/PB.project b/su/PB.project
new file mode 100644 (file)
index 0000000..369af31
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (su.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, su.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = su; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/su/su.1 b/su/su.1
new file mode 100644 (file)
index 0000000..8ed4b4c
--- /dev/null
+++ b/su/su.1
@@ -0,0 +1,186 @@
+.\" Copyright (c) 1988, 1990, 1993, 1994
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    from: @(#)su.1  8.2 (Berkeley) 4/18/94
+.\"    $NetBSD: su.1,v 1.14 1997/10/19 23:31:52 lukem Exp $
+.\"
+.Dd April 18, 1994
+.Dt SU 1
+.Os
+.Sh NAME
+.Nm su
+.Nd substitute user identity
+.Sh SYNOPSIS
+.Nm
+.Op Fl Kflm
+.Op Ar login Op Ar "shell arguments"
+.Sh DESCRIPTION
+.Nm
+requests the Kerberos password for
+.Ar login
+(or for
+.Dq Ar login Ns .root ,
+if no login is provided), and switches to
+that user and group ID after obtaining a Kerberos ticket granting ticket.
+A shell is then executed, and any additional
+.Ar "shell arguments"
+after the login name
+are passed to the shell.
+.Nm
+will resort to the local password file to find the password for
+.Ar login
+if there is a Kerberos error.
+If
+.Nm
+is executed by root, no password is requested and a shell
+with the appropriate user ID is executed; no additional Kerberos tickets
+are obtained.
+.Pp
+Alternatively, if the user enters the password "s/key", authentication
+will use the S/Key one-time password system as described in
+.Xr skey 1 .
+S/Key is a Trademark of Bellcore.
+.Pp
+By default, the environment is unmodified with the exception of
+.Ev USER ,
+.Ev HOME ,
+and
+.Ev SHELL .
+.Ev HOME
+and
+.Ev SHELL
+are set to the target login's default values.
+.Ev USER
+is set to the target login, unless the target login has a user ID of 0,
+in which case it is unmodified.
+The invoked shell is the target login's.
+This is the traditional behavior of
+.Nm su .
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl K
+Do not attempt to use Kerberos to authenticate the user.
+.It Fl f
+If the invoked shell is
+.Xr csh 1 ,
+this option prevents it from reading the
+.Dq Pa .cshrc
+file.
+.It Fl l
+Simulate a full login.
+The environment is discarded except for
+.Ev HOME ,
+.Ev SHELL ,
+.Ev PATH ,
+.Ev TERM ,
+and
+.Ev USER .
+.Ev HOME
+and
+.Ev SHELL
+are modified as above.
+.Ev USER
+is set to the target login.
+.Ev PATH
+is set to
+.Dq Pa /bin:/usr/bin .
+.Ev TERM
+is imported from your current environment.
+The invoked shell is the target login's, and
+.Nm
+will change directory to the target login's home directory.
+.It Fl m
+Leave the environment unmodified.
+The invoked shell is your login shell, and no directory changes are made.
+As a security precaution, if the target user's shell is a non-standard
+shell (as defined by
+.Xr getusershell 3 )
+and the caller's real uid is
+non-zero,
+.Nm
+will fail.
+.El
+.Pp
+The
+.Fl l
+and
+.Fl m
+options are mutually exclusive; the last one specified
+overrides any previous ones.
+.Pp
+Only users in group
+.Dq wheel
+(normally gid 0),
+as listed in
+.Pa /etc/group ,
+can
+.Nm
+to
+.Dq root .
+.Pp
+By default (unless the prompt is reset by a startup file) the super-user
+prompt is set to
+.Dq Sy \&#
+to remind one of its awesome power.
+.Sh SEE ALSO
+.Xr csh 1 ,
+.Xr login 1 ,
+.Xr sh 1 ,
+.Xr skey 1 ,
+.Xr kinit 1 ,
+.Xr kerberos 1 ,
+.Xr passwd 5 ,
+.Xr group 5 ,
+.Xr environ 7
+.Sh ENVIRONMENT
+Environment variables used by
+.Nm 
+:
+.Bl -tag -width "HOME"
+.It Ev HOME
+Default home directory of real user ID unless modified as
+specified above.
+.It Ev PATH
+Default search path of real user ID unless modified as specified above.
+.It Ev TERM
+Provides terminal type which may be retained for the substituted
+user ID.
+.It Ev USER
+The user ID is always the effective ID (the target user ID) after an
+.Nm
+unless the user ID is 0 (root).
+.El
+.Sh HISTORY
+A
+.Nm
+command appeared in
+.At v7 .
diff --git a/su/su.c b/su/su.c
new file mode 100644 (file)
index 0000000..750d02b
--- /dev/null
+++ b/su/su.c
@@ -0,0 +1,504 @@
+/*     $NetBSD: su.c,v 1.26 1998/08/25 20:59:40 ross Exp $     */
+
+/*
+ * Copyright (c) 1988 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT(
+    "@(#) Copyright (c) 1988 The Regents of the University of California.\n\
+ All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)su.c       8.3 (Berkeley) 4/2/94";*/
+#else
+__RCSID("$NetBSD: su.c,v 1.26 1998/08/25 20:59:40 ross Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <err.h>
+#include <errno.h>
+#include <grp.h>
+#include <paths.h>
+#include <pwd.h>
+#include <stdio.h>
+#ifdef SKEY
+#include <skey.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <time.h>
+#include <tzfile.h>
+#include <unistd.h>
+
+#ifdef KERBEROS
+#include <kerberosIV/des.h>
+#include <kerberosIV/krb.h>
+#include <netdb.h>
+
+#define        ARGSTR  "-Kflm"
+
+int use_kerberos = 1;
+
+static int kerberos __P((char *, char *, int));
+static int koktologin __P((char *, char *, char *));
+
+#else
+#define        ARGSTR  "-flm"
+#endif
+
+#ifndef        SUGROUP
+#define        SUGROUP "wheel"
+#endif
+
+
+int main __P((int, char **));
+
+static int chshell __P((const char *));
+static char *ontty __P((void));
+
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       extern char *__progname;
+       extern char **environ;
+       struct passwd *pwd;
+       char *p;
+       struct timeval tp;
+       uid_t ruid;
+       gid_t usergid;
+       int asme, ch, asthem, fastlogin, prio;
+       enum { UNSET, YES, NO } iscsh = UNSET;
+       char *user, *shell, *avshell, *username, *cleanenv[10], **np;
+       char shellbuf[MAXPATHLEN], avshellbuf[MAXPATHLEN];
+
+       asme = asthem = fastlogin = 0;
+       shell = NULL;
+       while ((ch = getopt(argc, argv, ARGSTR)) != -1)
+               switch((char)ch) {
+#ifdef KERBEROS
+               case 'K':
+                       use_kerberos = 0;
+                       break;
+#endif
+               case 'f':
+                       fastlogin = 1;
+                       break;
+               case '-':
+               case 'l':
+                       asme = 0;
+                       asthem = 1;
+                       break;
+               case 'm':
+                       asme = 1;
+                       asthem = 0;
+                       break;
+               case '?':
+               default:
+                       (void)fprintf(stderr,
+                           "Usage: %s [%s] [login [shell arguments]]\n",
+                           __progname, ARGSTR);
+                       exit(1);
+               }
+       argv += optind;
+
+       errno = 0;
+       prio = getpriority(PRIO_PROCESS, 0);
+       if (errno)
+               prio = 0;
+       (void)setpriority(PRIO_PROCESS, 0, -2);
+       openlog("su", LOG_CONS, 0);
+
+       /* get current login name and shell */
+       ruid = getuid();
+       username = getlogin();
+       if (username == NULL || (pwd = getpwnam(username)) == NULL ||
+           pwd->pw_uid != ruid)
+               pwd = getpwuid(ruid);
+       if (pwd == NULL)
+               errx(1, "who are you?");
+       username = strdup(pwd->pw_name);
+       usergid = pwd->pw_gid;
+       if (username == NULL)
+               err(1, "strdup");
+
+       if (asme) {
+               if (pwd->pw_shell && *pwd->pw_shell) {
+                       shell = strncpy(shellbuf, pwd->pw_shell,
+                           sizeof(shellbuf) - 1);
+                       shellbuf[sizeof(shellbuf) - 1] = '\0';
+               } else {
+                       shell = _PATH_BSHELL;
+                       iscsh = NO;
+               }
+       }
+       /* get target login information, default to root */
+       user = *argv ? *argv : "root";
+       np = *argv ? argv : argv-1;
+
+       if ((pwd = getpwnam(user)) == NULL)
+               errx(1, "unknown login %s", user);
+
+       if (ruid
+#ifdef KERBEROS
+           && (!use_kerberos || kerberos(username, user, pwd->pw_uid))
+#endif
+          ) {
+                gid_t groups[NGROUPS_MAX];
+                int   numgroups;
+
+               /*
+                * Only allow those in group SUGROUP to su to root.
+                */
+                if (pwd->pw_uid == 0 &&
+                   (initgroups(username, usergid) == 0) &&
+                    ((numgroups = getgroups(NGROUPS_MAX, groups)) > 0)) {
+                       int i;
+                       int wheel = 0;
+                        gid_t wheelgid = 0;
+                        struct group *wheelgroup;
+
+                        if ((wheelgroup = getgrnam(SUGROUP)) != NULL) {
+                               wheelgid = wheelgroup->gr_gid;
+
+                               for (i = 0; i < numgroups; i++) {
+                                       if (groups[i] == wheelgid) {
+                                               wheel = 1;
+                                               break;
+                                        }
+                                }
+                        } else {
+                               /* If we can't get the gid for SUGROUP, then let anyone su */
+                               warnx("unknown secondary group %s; anyone can su %s.", SUGROUP, user);
+                               wheel = 1;
+                        }
+
+                        if (!wheel)
+                               errx(1,
+                                     "you are not listed in the correct secondary group (%s) to su %s.",
+                                     SUGROUP, user);
+                }
+
+               /* if target requires a password, verify it */
+               if (*pwd->pw_passwd) {
+                       p = getpass("Password:");
+#ifdef SKEY
+                       if (strcasecmp(p, "s/key") == 0) {
+                               if (skey_haskey(user))
+                                       errx(1, "Sorry, you have no s/key.");
+                               else {
+                                       if (skey_authenticate(user)) {
+                                               goto badlogin;
+                                       }
+                               }
+
+                       } else
+#endif
+                       if (strcmp(pwd->pw_passwd, crypt(p, pwd->pw_passwd))) {
+#ifdef SKEY
+badlogin:
+#endif
+                               fprintf(stderr, "Sorry\n");
+                               syslog(LOG_AUTH|LOG_WARNING,
+                                       "BAD SU %s to %s%s", username,
+                                       user, ontty());
+                               exit(1);
+                       }
+               }
+       }
+
+       if (asme) {
+               /* if asme and non-standard target shell, must be root */
+               if (!chshell(pwd->pw_shell) && ruid)
+                       errx(1,"permission denied (shell).");
+       } else if (pwd->pw_shell && *pwd->pw_shell) {
+               shell = pwd->pw_shell;
+               iscsh = UNSET;
+       } else {
+               shell = _PATH_BSHELL;
+               iscsh = NO;
+       }
+
+       if ((p = strrchr(shell, '/')) != NULL)
+               avshell = p+1;
+       else
+               avshell = shell;
+
+       /* if we're forking a csh, we want to slightly muck the args */
+       if (iscsh == UNSET)
+               iscsh = strstr(avshell, "csh") ? YES : NO;
+
+       /* set permissions */
+       if (setgid(pwd->pw_gid) < 0)
+               err(1, "setgid");
+       if (initgroups(user, pwd->pw_gid))
+               errx(1, "initgroups failed");
+       if (setuid(pwd->pw_uid) < 0)
+               err(1, "setuid");
+
+       if (!asme) {
+               if (asthem) {
+                       p = getenv("TERM");
+                       cleanenv[0] = NULL;
+                       environ = cleanenv;
+                       (void)setenv("PATH", _PATH_DEFPATH, 1);
+                       if (p)
+                               (void)setenv("TERM", p, 1);
+                       if (chdir(pwd->pw_dir) < 0)
+                               errx(1, "no directory");
+               }
+               if (asthem || pwd->pw_uid)
+                       (void)setenv("USER", pwd->pw_name, 1);
+               (void)setenv("HOME", pwd->pw_dir, 1);
+               (void)setenv("SHELL", shell, 1);
+       }
+
+       if (iscsh == YES) {
+               if (fastlogin)
+                       *np-- = "-f";
+               if (asme)
+                       *np-- = "-m";
+       }
+
+       if (asthem) {
+               avshellbuf[0] = '-';
+               (void)strncpy(avshellbuf+1, avshell, sizeof(avshellbuf) - 2);
+               avshell = avshellbuf;
+       } else if (iscsh == YES) {
+               /* csh strips the first character... */
+               avshellbuf[0] = '_';
+               (void)strncpy(avshellbuf+1, avshell, sizeof(avshellbuf) - 2);
+               avshell = avshellbuf;
+       }
+       *np = avshell;
+
+       if (pwd->pw_change || pwd->pw_expire)
+               (void)gettimeofday(&tp, (struct timezone *)NULL);
+       if (pwd->pw_change) {
+               if (tp.tv_sec >= pwd->pw_change) {
+                       (void)printf("%s -- %s's password has expired.\n",
+                                    (ruid ? "Sorry" : "Note"), user);
+                       if (ruid != 0)
+                               exit(1);
+               } else if (pwd->pw_change - tp.tv_sec <
+                   _PASSWORD_WARNDAYS * SECSPERDAY)
+                       (void)printf("Warning: %s's password expires on %s",
+                                    user, ctime(&pwd->pw_change));
+       }
+       if (pwd->pw_expire) {
+               if (tp.tv_sec >= pwd->pw_expire) {
+                       (void)printf("%s -- %s's account has expired.\n",
+                                    (ruid ? "Sorry" : "Note"), user);
+                       if (ruid != 0)
+                               exit(1);
+               } else if (pwd->pw_expire - tp.tv_sec <
+                   _PASSWORD_WARNDAYS * SECSPERDAY)
+                       (void)printf("Warning: %s's account expires on %s",
+                                    user, ctime(&pwd->pw_expire));
+       }
+       if (ruid != 0)
+               syslog(LOG_NOTICE|LOG_AUTH, "%s to %s%s",
+                   username, user, ontty());
+
+       (void)setpriority(PRIO_PROCESS, 0, prio);
+
+       execv(shell, np);
+       err(1, "%s", shell);
+        /* NOTREACHED */
+}
+
+static int
+chshell(sh)
+       const char *sh;
+{
+       const char *cp;
+
+       while ((cp = getusershell()) != NULL)
+               if (!strcmp(cp, sh))
+                       return (1);
+       return (0);
+}
+
+static char *
+ontty()
+{
+       char *p;
+       static char buf[MAXPATHLEN + 4];
+
+       buf[0] = 0;
+       if ((p = ttyname(STDERR_FILENO)) != NULL)
+               (void)snprintf(buf, sizeof buf, " on %s", p);
+       return (buf);
+}
+
+#ifdef KERBEROS
+static int
+kerberos(username, user, uid)
+       char *username, *user;
+       int uid;
+{
+       KTEXT_ST ticket;
+       AUTH_DAT authdata;
+       struct hostent *hp;
+       int kerno;
+       u_long faddr;
+       char lrealm[REALM_SZ], krbtkfile[MAXPATHLEN];
+       char hostname[MAXHOSTNAMELEN + 1], savehost[MAXHOSTNAMELEN + 1];
+
+       if (krb_get_lrealm(lrealm, 1) != KSUCCESS)
+               return (1);
+       if (koktologin(username, lrealm, user) && !uid) {
+               warnx("kerberos: not in %s's ACL.", user);
+               return (1);
+       }
+       (void)(void)snprintf(krbtkfile, sizeof krbtkfile, "%s_%s_%d", TKT_ROOT,
+           user, getuid());
+
+       (void)setenv("KRBTKFILE", krbtkfile, 1);
+       (void)krb_set_tkt_string(krbtkfile);
+       /*
+        * Set real as well as effective ID to 0 for the moment,
+        * to make the kerberos library do the right thing.
+        */
+       if (setuid(0) < 0) {
+               warn("setuid");
+               return (1);
+       }
+
+       /*
+        * Little trick here -- if we are su'ing to root,
+        * we need to get a ticket for "xxx.root", where xxx represents
+        * the name of the person su'ing.  Otherwise (non-root case),
+        * we need to get a ticket for "yyy.", where yyy represents
+        * the name of the person being su'd to, and the instance is null
+        *
+        * We should have a way to set the ticket lifetime,
+        * with a system default for root.
+        */
+       kerno = krb_get_pw_in_tkt((uid == 0 ? username : user),
+               (uid == 0 ? "root" : ""), lrealm,
+               "krbtgt", lrealm, DEFAULT_TKT_LIFE, 0);
+
+       if (kerno != KSUCCESS) {
+               if (kerno == KDC_PR_UNKNOWN) {
+                       warnx("kerberos: principal unknown: %s.%s@%s",
+                               (uid == 0 ? username : user),
+                               (uid == 0 ? "root" : ""), lrealm);
+                       return (1);
+               }
+               warnx("kerberos: unable to su: %s", krb_err_txt[kerno]);
+               syslog(LOG_NOTICE|LOG_AUTH,
+                   "BAD Kerberos SU: %s to %s%s: %s",
+                   username, user, ontty(), krb_err_txt[kerno]);
+               return (1);
+       }
+
+       if (chown(krbtkfile, uid, -1) < 0) {
+               warn("chown");
+               (void)unlink(krbtkfile);
+               return (1);
+       }
+
+       (void)setpriority(PRIO_PROCESS, 0, -2);
+
+       if (gethostname(hostname, sizeof(hostname)) == -1) {
+               warn("gethostname");
+               dest_tkt();
+               return (1);
+       }
+       hostname[sizeof(hostname) - 1] = '\0';
+
+       (void)strncpy(savehost, krb_get_phost(hostname), sizeof(savehost));
+       savehost[sizeof(savehost) - 1] = '\0';
+
+       kerno = krb_mk_req(&ticket, "rcmd", savehost, lrealm, 33);
+
+       if (kerno == KDC_PR_UNKNOWN) {
+               warnx("Warning: TGT not verified.");
+               syslog(LOG_NOTICE|LOG_AUTH,
+                   "%s to %s%s, TGT not verified (%s); %s.%s not registered?",
+                   username, user, ontty(), krb_err_txt[kerno],
+                   "rcmd", savehost);
+       } else if (kerno != KSUCCESS) {
+               warnx("Unable to use TGT: %s", krb_err_txt[kerno]);
+               syslog(LOG_NOTICE|LOG_AUTH, "failed su: %s to %s%s: %s",
+                   username, user, ontty(), krb_err_txt[kerno]);
+               dest_tkt();
+               return (1);
+       } else {
+               if (!(hp = gethostbyname(hostname))) {
+                       warnx("can't get addr of %s", hostname);
+                       dest_tkt();
+                       return (1);
+               }
+               memmove((char *)&faddr, (char *)hp->h_addr, sizeof(faddr));
+
+               if ((kerno = krb_rd_req(&ticket, "rcmd", savehost, faddr,
+                   &authdata, "")) != KSUCCESS) {
+                       warnx("kerberos: unable to verify rcmd ticket: %s\n",
+                           krb_err_txt[kerno]);
+                       syslog(LOG_NOTICE|LOG_AUTH,
+                           "failed su: %s to %s%s: %s", username,
+                            user, ontty(), krb_err_txt[kerno]);
+                       dest_tkt();
+                       return (1);
+               }
+       }
+       return (0);
+}
+
+static int
+koktologin(name, realm, toname)
+       char *name, *realm, *toname;
+{
+       AUTH_DAT *kdata;
+       AUTH_DAT kdata_st;
+
+       kdata = &kdata_st;
+       memset((char *)kdata, 0, sizeof(*kdata));
+       (void)strncpy(kdata->pname, name, sizeof(kdata->pname) - 1);
+       (void)strncpy(kdata->pinst,
+           ((strcmp(toname, "root") == 0) ? "root" : ""), sizeof(kdata->pinst) - 1);
+       (void)strncpy(kdata->prealm, realm, sizeof(kdata->prealm) - 1);
+       return (kuserok(kdata, toname));
+}
+#endif
diff --git a/tee/Makefile b/tee/Makefile
new file mode 100644 (file)
index 0000000..f4ca484
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = tee
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = tee.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble tee.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/tee/Makefile.postamble b/tee/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/tee/Makefile.preamble b/tee/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/tee/PB.project b/tee/PB.project
new file mode 100644 (file)
index 0000000..84dfa7d
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (tee.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, tee.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = tee; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/tee/tee.1 b/tee/tee.1
new file mode 100644 (file)
index 0000000..19d2d40
--- /dev/null
+++ b/tee/tee.1
@@ -0,0 +1,90 @@
+.\"    $NetBSD: tee.1,v 1.5 1997/10/20 00:37:11 lukem Exp $
+.\"
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)tee.1      8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt TEE 1
+.Os
+.Sh NAME
+.Nm tee
+.Nd pipe fitting
+.Sh SYNOPSIS
+.Nm
+.Op Fl ai
+.Op Ar file ...
+.Sh DESCRIPTION
+The
+.Nm
+utility copies standard input to standard output,
+making a copy in zero or more files.
+The output is unbuffered.
+.Pp
+The following options are available:
+.Bl -tag -width Ds
+.It Fl a
+Append the output to the files rather than
+overwriting them.
+.It Fl i
+Ignore the
+.Dv SIGINT
+signal.
+.El
+.Pp
+The following operands are available:
+.Bl -tag -width file
+.It file
+A pathname of an output
+.Ar file .
+.El
+.Pp
+The
+.Nm
+utility takes the default action for all signals,
+except in the event of the
+.Fl i
+option.
+.Pp
+The
+.Nm
+utility exits 0 on success, and >0 if an error occurs.
+.Sh STANDARDS
+The
+.Nm
+function is expected to be
+.Tn POSIX
+.St -p1003.2
+compatible.
diff --git a/tee/tee.c b/tee/tee.c
new file mode 100644 (file)
index 0000000..e916d90
--- /dev/null
+++ b/tee/tee.c
@@ -0,0 +1,156 @@
+/*     $NetBSD: tee.c,v 1.6 1997/10/20 00:37:11 lukem Exp $    */
+
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1988, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tee.c      8.1 (Berkeley) 6/6/93";
+#endif
+__RCSID("$NetBSD: tee.c,v 1.6 1997/10/20 00:37:11 lukem Exp $");
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <err.h>
+
+typedef struct _list {
+       struct _list *next;
+       int fd;
+       char *name;
+} LIST;
+LIST *head;
+
+void   add __P((int, char *));
+int    main __P((int, char **));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       LIST *p;
+       int n, fd, rval, wval;
+       char *bp;
+       int append, ch, exitval;
+       char *buf;
+#define        BSIZE (8 * 1024)
+
+       setlocale(LC_ALL, "");
+
+       append = 0;
+       while ((ch = getopt(argc, argv, "ai")) != -1)
+               switch((char)ch) {
+               case 'a':
+                       append = 1;
+                       break;
+               case 'i':
+                       (void)signal(SIGINT, SIG_IGN);
+                       break;
+               case '?':
+               default:
+                       (void)fprintf(stderr, "usage: tee [-ai] [file ...]\n");
+                       exit(1);
+               }
+       argv += optind;
+       argc -= optind;
+
+       if ((buf = malloc((size_t)BSIZE)) == NULL)
+               err(1, "malloc");
+
+       add(STDOUT_FILENO, "stdout");
+
+       for (exitval = 0; *argv; ++argv)
+               if ((fd = open(*argv, append ? O_WRONLY|O_CREAT|O_APPEND :
+                   O_WRONLY|O_CREAT|O_TRUNC, DEFFILEMODE)) < 0) {
+                       warn("%s", *argv);
+                       exitval = 1;
+               } else
+                       add(fd, *argv);
+
+       while ((rval = read(STDIN_FILENO, buf, BSIZE)) > 0)
+               for (p = head; p; p = p->next) {
+                       n = rval;
+                       bp = buf;
+                       do {
+                               if ((wval = write(p->fd, bp, n)) == -1) {
+                                       warn("%s", p->name);
+                                       exitval = 1;
+                                       break;
+                               }
+                               bp += wval;
+                       } while (n -= wval);
+               }
+       if (rval < 0) {
+               warn("read");
+               exitval = 1;
+       }
+
+       for (p = head; p; p = p->next) {
+               if (close(p->fd) == -1) {
+                       warn("%s", p->name);
+                       exitval = 1;
+               }
+       }
+
+       exit(exitval);
+}
+
+void
+add(fd, name)
+       int fd;
+       char *name;
+{
+       LIST *p;
+
+       if ((p = malloc((size_t)sizeof(LIST))) == NULL)
+               err(1, "malloc");
+       p->fd = fd;
+       p->name = name;
+       p->next = head;
+       head = p;
+}
diff --git a/test/Makefile b/test/Makefile
new file mode 100644 (file)
index 0000000..eeca1a3
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = test
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = test.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble test.1\
+            TEST.csh
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/test/Makefile.postamble b/test/Makefile.postamble
new file mode 100644 (file)
index 0000000..75155d2
--- /dev/null
@@ -0,0 +1,6 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
+
+OTHERSRCS += '[.1'
+
+after_install::
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/[
diff --git a/test/Makefile.preamble b/test/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/test/PB.project b/test/PB.project
new file mode 100644 (file)
index 0000000..faa95c3
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (test.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, test.1, TEST.csh); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = test; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/test/TEST.csh b/test/TEST.csh
new file mode 100644 (file)
index 0000000..672e1a0
--- /dev/null
@@ -0,0 +1,138 @@
+#      $NetBSD: TEST.csh,v 1.2 1995/03/21 07:03:59 cgd Exp $
+#      @(#)TEST.csh    5.2 (Berkeley) 4/30/93
+
+#alias t '/usr/src/bin/test/obj/test \!*; echo $status'
+alias t '/bin/test \!*; echo $status'
+
+echo 't -b /dev/ttyp2'
+t -b /dev/ttyp2
+echo 't -b /dev/jb1a'
+t -b /dev/jb1a
+
+echo 't -c test.c'
+t -c test.c
+echo 't -c /dev/tty'
+t -c /dev/tty
+
+echo 't -d test.c'
+t -d test.c
+echo 't -d /etc'
+t -d /etc
+
+echo 't -e noexist'
+t -e noexist
+echo 't -e test.c'
+t -e test.c
+
+echo 't -f noexist'
+t -f noexist
+echo 't -f /dev/tty'
+t -f /dev/tty
+echo 't -f test.c'
+t -f test.c
+
+echo 't -g test.c'
+t -g test.c
+echo 't -g /bin/ps'
+t -g /bin/ps
+
+echo 't -n ""'
+t -n ""
+echo 't -n "hello"'
+t -n "hello"
+
+echo 't -p test.c'
+t -p test.c
+
+echo 't -r noexist'
+t -r noexist
+echo 't -r /etc/master.passwd'
+t -r /etc/master.passwd
+echo 't -r test.c'
+t -r test.c
+
+echo 't -s noexist'
+t -s noexist
+echo 't -s /dev/null'
+t -s /dev/null
+echo 't -s test.c'
+t -s test.c
+
+echo 't -t 20'
+t -t 20
+echo 't -t 0'
+t -t 0
+
+echo 't -u test.c'
+t -u test.c
+echo 't -u /bin/rcp'
+t -u /bin/rcp
+
+echo 't -w noexist'
+t -w noexist
+echo 't -w /etc/master.passwd'
+t -w /etc/master.passwd
+echo 't -w /dev/null'
+t -w /dev/null
+
+echo 't -x noexist'
+t -x noexist
+echo 't -x /bin/ps'
+t -x /bin/ps
+echo 't -x /etc/motd'
+t -x /etc/motd
+
+echo 't -z ""'
+t -z ""
+echo 't -z "foo"'
+t -z "foo"
+
+echo 't "foo"'
+t "foo"
+echo 't ""'
+t ""
+
+echo 't "hello" = "hello"'
+t "hello" = "hello"
+echo 't "hello" = "goodbye"'
+t "hello" = "goodbye"
+
+echo 't "hello" != "hello"'
+t "hello" != "hello"
+echo 't "hello" != "goodbye"'
+t "hello" != "goodbye"
+
+echo 't 200 -eq 200'
+t 200 -eq 200
+echo 't 34 -eq 222'
+t 34 -eq 222
+
+echo 't 200 -ne 200'
+t 200 -ne 200
+echo 't 34 -ne 222'
+t 34 -ne 222
+
+echo 't 200 -gt 200'
+t 200 -gt 200
+echo 't 340 -gt 222'
+t 340 -gt 222
+
+echo 't 200 -ge 200'
+t 200 -ge 200
+echo 't 34 -ge 222'
+t 34 -ge 222
+
+echo 't 200 -lt 200'
+t 200 -lt 200
+echo 't 34 -lt 222'
+t 34 -lt 222
+
+echo 't 200 -le 200'
+t 200 -le 200
+echo 't 340 -le 222'
+t 340 -le 222
+
+echo 't 700 -le 1000 -a -n "1" -a "20" = "20"'
+t 700 -le 1000 -a -n "1" -a "20" = "20"
+echo 't ! \( 700 -le 1000 -a -n "1" -a "20" = "20" \)'
+t ! \( 700 -le 1000 -a -n "1" -a "20" = "20" \)
diff --git a/test/[.1 b/test/[.1
new file mode 100644 (file)
index 0000000..9ed6386
--- /dev/null
+++ b/test/[.1
@@ -0,0 +1 @@
+.so man1/test.1
\ No newline at end of file
diff --git a/test/test.1 b/test/test.1
new file mode 100644 (file)
index 0000000..061189e
--- /dev/null
@@ -0,0 +1,317 @@
+.\"    $NetBSD: test.1,v 1.10 1997/11/12 00:48:21 mrg Exp $
+.\"
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)test.1     8.1 (Berkeley) 5/31/93
+.\"
+.Dd May 31, 1993
+.Dt TEST 1
+.Os
+.Sh NAME
+.Nm test ,
+.Nm [
+.Nd condition evaluation utility
+.Sh SYNOPSIS
+.Nm test
+.Ar expression
+.Nm [
+.Ar expression Cm ]
+.Sh DESCRIPTION
+The
+.Nm test
+utility evaluates the expression and, if it evaluates
+to true, returns a zero (true) exit status; otherwise
+it returns 1 (false).
+If there is no expression, test also
+returns 1 (false).
+.Pp
+All operators and flags are separate arguments to the
+.Nm test
+utility.
+.Pp
+The following primaries are used to construct expression:
+.Bl -tag -width Ar
+.It Fl b Ar file
+True if
+.Ar file
+exists and is a block special
+file.
+.It Fl c Ar file
+True if
+.Ar file
+exists and is a character
+special file.
+.It Fl d Ar file
+True if
+.Ar file
+exists and is a directory.
+.It Fl e Ar file
+True if
+.Ar file
+exists (regardless of type).
+.It Fl f Ar file
+True if
+.Ar file
+exists and is a regular file.
+.It Fl g Ar file
+True if
+.Ar file
+exists and its set group ID flag
+is set.
+.It Fl h Ar file
+True if
+.Ar file
+exists and is a symbolic link.
+This operator is retained for compatibility with previous versions of
+this program. Do not rely on its existence; use
+.Fl L
+instead.
+.It Fl k Ar file
+True if
+.Ar file
+exists and its sticky bit is set.
+.It Fl n Ar string
+True if the length of
+.Ar string
+is nonzero.
+.It Fl p Ar file
+True if
+.Ar file
+is a named pipe
+.Po Tn FIFO Pc .
+.It Fl r Ar file
+True if
+.Ar file 
+exists and is readable.
+.It Fl s Ar file
+True if
+.Ar file
+exists and has a size greater
+than zero.
+.It Fl t Ar file_descriptor
+True if the file whose file descriptor number
+is
+.Ar file_descriptor
+is open and is associated with a terminal.
+.It Fl u Ar file
+True if
+.Ar file
+exists and its set user ID flag
+is set.
+.It Fl w Ar file
+True if
+.Ar file
+exists and is writable.
+True
+indicates only that the write flag is on.
+The file is not writable on a read-only file
+system even if this test indicates true.
+.It Fl x Ar file
+True if
+.Ar file
+exists and is executable.
+True
+indicates only that the execute flag is on.
+If
+.Ar file
+is a directory, true indicates that
+.Ar file
+can be searched.
+.It Fl z Ar string
+True if the length of
+.Ar string
+is zero.
+.It Fl L Ar file
+True if 
+.Ar file
+exists and is a symbolic link.
+.It Fl O Ar file
+True if
+.Ar file
+exists and its owner matches the effective user id of this process.
+.It Fl G Ar file
+True if
+.Ar file
+exists and its group matches the effective group id of this process.
+.It Fl S Ar file
+True if
+.Ar file
+exists and is a socket.
+.It Ar file1 Fl nt Ar file2
+True if
+.Ar file1
+exists and is newer than
+.Ar file2 .
+.It Ar file1 Fl ot Ar file2
+True if
+.Ar file1
+exists and is older than
+.Ar file2 .
+.It Ar file1 Fl ef Ar file2
+True if
+.Ar file1
+and
+.Ar file2
+exist and refer to the same file.
+.It Ar string
+True if
+.Ar string
+is not the null
+string.
+.It Ar \&s\&1 Cm \&= Ar \&s\&2
+True if the strings
+.Ar \&s\&1
+and
+.Ar \&s\&2
+are identical.
+.It Ar \&s\&1 Cm \&!= Ar \&s\&2
+True if the strings
+.Ar \&s\&1
+and
+.Ar \&s\&2
+are not identical.
+.It Ar \&s\&1 Cm \&< Ar \&s\&2
+True if string
+.Ar \&s\&1
+comes before
+.Ar \&s\&2
+based on the ASCII value of their characters.
+.It Ar \&s\&1 Cm \&> Ar \&s\&2
+True if string
+.Ar \&s\&1
+comes after
+.Ar \&s\&2
+based on the ASCII value of their characters.
+.It Ar \&s\&1
+True if
+.Ar \&s\&1
+is not the null
+string.
+.It Ar \&n\&1 Fl \&eq Ar \&n\&2 
+True if the integers
+.Ar \&n\&1
+and
+.Ar \&n\&2
+are algebraically
+equal.
+.It Ar \&n\&1 Fl \&ne Ar \&n\&2
+True if the integers
+.Ar \&n\&1
+and
+.Ar \&n\&2
+are not
+algebraically equal.
+.It Ar \&n\&1 Fl \&gt Ar \&n\&2
+True if the integer
+.Ar \&n\&1
+is algebraically
+greater than the integer
+.Ar \&n\&2 .
+.It Ar \&n\&1 Fl \&ge Ar \&n\&2
+True if the integer
+.Ar \&n\&1
+is algebraically
+greater than or equal to the integer
+.Ar \&n\&2 .
+.It Ar \&n\&1 Fl \&lt Ar \&n\&2
+True if the integer
+.Ar \&n\&1
+is algebraically less
+than the integer
+.Ar \&n\&2 .
+.It Ar \&n\&1 Fl \&le Ar \&n\&2
+True if the integer
+.Ar \&n\&1
+is algebraically less
+than or equal to the integer
+.Ar \&n\&2 .
+.El
+.Pp
+These primaries can be combined with the following operators:
+.Bl -tag -width Ar
+.It Cm \&! Ar expression
+True if
+.Ar expression
+is false.
+.It Ar expression1 Fl a Ar expression2
+True if both
+.Ar expression1
+and
+.Ar expression2
+are true.
+.It Ar expression1 Fl o Ar expression2
+True if either
+.Ar expression1
+or
+.Ar expression2
+are true.
+.It Cm \&( Ns Ar expression Ns Cm \&)
+True if expression is true.
+.El
+.Pp
+The
+.Fl a
+operator has higher precedence than the
+.Fl o
+operator.
+.Sh GRAMMAR AMBIGUITY
+The 
+.Nm test
+grammar is inherently ambiguous.  In order to assure a degree of consistency,
+the cases described in 
+.St -p1003.2
+section 4.62.4, 
+are evaluated consistently according to the rules specified in the
+standards document.  All other cases are subject to the ambiguity in the
+command semantics.
+.Sh RETURN VALUES
+The
+.Nm test
+utility exits with one of the following values:
+.Bl -tag -width Ds
+.It 0
+expression evaluated to true.
+.It 1
+expression evaluated to false or expression was
+missing.
+.It >1
+An error occurred.
+.El
+.Sh STANDARDS
+The
+.Nm test
+utility implements a superset of the
+.St -p1003.2
+specification.
diff --git a/test/test.c b/test/test.c
new file mode 100644 (file)
index 0000000..366ccda
--- /dev/null
@@ -0,0 +1,468 @@
+/*     $NetBSD: test.c,v 1.19 1998/07/28 11:41:59 mycroft Exp $        */
+
+/*
+ * test(1); version 7-like  --  author Erik Baalbergen
+ * modified by Eric Gisin to be used as built-in.
+ * modified by Arnold Robbins to add SVR3 compatibility
+ * (-x -c -b -p -u -g -k) plus Korn's -L -nt -ot -ef and new -S (socket).
+ * modified by J.T. Conklin for NetBSD.
+ *
+ * This program is in the Public Domain.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: test.c,v 1.19 1998/07/28 11:41:59 mycroft Exp $");
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <err.h>
+
+/* test(1) accepts the following grammar:
+       oexpr   ::= aexpr | aexpr "-o" oexpr ;
+       aexpr   ::= nexpr | nexpr "-a" aexpr ;
+       nexpr   ::= primary | "!" primary
+       primary ::= unary-operator operand
+               | operand binary-operator operand
+               | operand
+               | "(" oexpr ")"
+               ;
+       unary-operator ::= "-r"|"-w"|"-x"|"-f"|"-d"|"-c"|"-b"|"-p"|
+               "-u"|"-g"|"-k"|"-s"|"-t"|"-z"|"-n"|"-o"|"-O"|"-G"|"-L"|"-S";
+
+       binary-operator ::= "="|"!="|"-eq"|"-ne"|"-ge"|"-gt"|"-le"|"-lt"|
+                       "-nt"|"-ot"|"-ef";
+       operand ::= <any legal UNIX file name>
+*/
+
+enum token {
+       EOI,
+       FILRD,
+       FILWR,
+       FILEX,
+       FILEXIST,
+       FILREG,
+       FILDIR,
+       FILCDEV,
+       FILBDEV,
+       FILFIFO,
+       FILSOCK,
+       FILSYM,
+       FILGZ,
+       FILTT,
+       FILSUID,
+       FILSGID,
+       FILSTCK,
+       FILNT,
+       FILOT,
+       FILEQ,
+       FILUID,
+       FILGID,
+       STREZ,
+       STRNZ,
+       STREQ,
+       STRNE,
+       STRLT,
+       STRGT,
+       INTEQ,
+       INTNE,
+       INTGE,
+       INTGT,
+       INTLE,
+       INTLT,
+       UNOT,
+       BAND,
+       BOR,
+       LPAREN,
+       RPAREN,
+       OPERAND
+};
+
+enum token_types {
+       UNOP,
+       BINOP,
+       BUNOP,
+       BBINOP,
+       PAREN
+};
+
+struct t_op {
+       const char *op_text;
+       short op_num, op_type;
+} const ops [] = {
+       {"-r",  FILRD,  UNOP},
+       {"-w",  FILWR,  UNOP},
+       {"-x",  FILEX,  UNOP},
+       {"-e",  FILEXIST,UNOP},
+       {"-f",  FILREG, UNOP},
+       {"-d",  FILDIR, UNOP},
+       {"-c",  FILCDEV,UNOP},
+       {"-b",  FILBDEV,UNOP},
+       {"-p",  FILFIFO,UNOP},
+       {"-u",  FILSUID,UNOP},
+       {"-g",  FILSGID,UNOP},
+       {"-k",  FILSTCK,UNOP},
+       {"-s",  FILGZ,  UNOP},
+       {"-t",  FILTT,  UNOP},
+       {"-z",  STREZ,  UNOP},
+       {"-n",  STRNZ,  UNOP},
+       {"-h",  FILSYM, UNOP},          /* for backwards compat */
+       {"-O",  FILUID, UNOP},
+       {"-G",  FILGID, UNOP},
+       {"-L",  FILSYM, UNOP},
+       {"-S",  FILSOCK,UNOP},
+       {"=",   STREQ,  BINOP},
+       {"!=",  STRNE,  BINOP},
+       {"<",   STRLT,  BINOP},
+       {">",   STRGT,  BINOP},
+       {"-eq", INTEQ,  BINOP},
+       {"-ne", INTNE,  BINOP},
+       {"-ge", INTGE,  BINOP},
+       {"-gt", INTGT,  BINOP},
+       {"-le", INTLE,  BINOP},
+       {"-lt", INTLT,  BINOP},
+       {"-nt", FILNT,  BINOP},
+       {"-ot", FILOT,  BINOP},
+       {"-ef", FILEQ,  BINOP},
+       {"!",   UNOT,   BUNOP},
+       {"-a",  BAND,   BBINOP},
+       {"-o",  BOR,    BBINOP},
+       {"(",   LPAREN, PAREN},
+       {")",   RPAREN, PAREN},
+       {0,     0,      0}
+};
+
+char **t_wp;
+struct t_op const *t_wp_op;
+
+static void syntax __P((const char *, const char *));
+static int oexpr __P((enum token));
+static int aexpr __P((enum token));
+static int nexpr __P((enum token));
+static int primary __P((enum token));
+static int binop __P((void));
+static int filstat __P((char *, enum token));
+static enum token t_lex __P((char *));
+static int getn __P((const char *));
+static int newerf __P((const char *, const char *));
+static int olderf __P((const char *, const char *));
+static int equalf __P((const char *, const char *));
+
+int main __P((int, char **));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       int     res;
+
+       if (strcmp(argv[0], "[") == 0) {
+               if (strcmp(argv[--argc], "]"))
+                       errx(2, "missing ]");
+               argv[argc] = NULL;
+       }
+
+       /* Implement special cases from POSIX.2, section 4.62.4 */
+       switch (argc) {
+       case 1:
+               return 1;
+       case 2:
+               return (*argv[1] == '\0');
+       case 3:
+               if (argv[1][0] == '!' && argv[1][1] == '\0') {
+                       return !(*argv[2] == '\0');
+               }
+               break;
+       case 4:
+               if (argv[1][0] != '!' || argv[1][1] != '\0') {
+                       if (t_lex(argv[2]), 
+                           t_wp_op && t_wp_op->op_type == BINOP) {
+                               t_wp = &argv[1];
+                               return (binop() == 0);
+                       }
+               }
+               break;
+       case 5:
+               if (argv[1][0] == '!' && argv[1][1] == '\0') {
+                       if (t_lex(argv[3]), 
+                           t_wp_op && t_wp_op->op_type == BINOP) {
+                               t_wp = &argv[2];
+                               return !(binop() == 0);
+                       }
+               }
+               break;
+       }
+
+       t_wp = &argv[1];
+       res = !oexpr(t_lex(*t_wp));
+
+       if (*t_wp != NULL && *++t_wp != NULL)
+               syntax(*t_wp, "unknown operand");
+
+       return res;
+}
+
+static void
+syntax(op, msg)
+       const char      *op;
+       const char      *msg;
+{
+       if (op && *op)
+               errx(2, "%s: %s", op, msg);
+       else
+               errx(2, "%s", msg);
+}
+
+static int
+oexpr(n)
+       enum token n;
+{
+       int res;
+
+       res = aexpr(n);
+       if (t_lex(*++t_wp) == BOR)
+               return oexpr(t_lex(*++t_wp)) || res;
+       t_wp--;
+       return res;
+}
+
+static int
+aexpr(n)
+       enum token n;
+{
+       int res;
+
+       res = nexpr(n);
+       if (t_lex(*++t_wp) == BAND)
+               return aexpr(t_lex(*++t_wp)) && res;
+       t_wp--;
+       return res;
+}
+
+static int
+nexpr(n)
+       enum token n;                   /* token */
+{
+       if (n == UNOT)
+               return !nexpr(t_lex(*++t_wp));
+       return primary(n);
+}
+
+static int
+primary(n)
+       enum token n;
+{
+       int res;
+
+       if (n == EOI)
+               syntax(NULL, "argument expected");
+       if (n == LPAREN) {
+               res = oexpr(t_lex(*++t_wp));
+               if (t_lex(*++t_wp) != RPAREN)
+                       syntax(NULL, "closing paren expected");
+               return res;
+       }
+       if (t_wp_op && t_wp_op->op_type == UNOP) {
+               /* unary expression */
+               if (*++t_wp == NULL)
+                       syntax(t_wp_op->op_text, "argument expected");
+               switch (n) {
+               case STREZ:
+                       return strlen(*t_wp) == 0;
+               case STRNZ:
+                       return strlen(*t_wp) != 0;
+               case FILTT:
+                       return isatty(getn(*t_wp));
+               default:
+                       return filstat(*t_wp, n);
+               }
+       }
+
+       if (t_lex(t_wp[1]), t_wp_op && t_wp_op->op_type == BINOP) {
+               return binop();
+       }         
+
+       return strlen(*t_wp) > 0;
+}
+
+static int
+binop()
+{
+       const char *opnd1, *opnd2;
+       struct t_op const *op;
+
+       opnd1 = *t_wp;
+       (void) t_lex(*++t_wp);
+       op = t_wp_op;
+
+       if ((opnd2 = *++t_wp) == (char *)0)
+               syntax(op->op_text, "argument expected");
+               
+       switch (op->op_num) {
+       case STREQ:
+               return strcmp(opnd1, opnd2) == 0;
+       case STRNE:
+               return strcmp(opnd1, opnd2) != 0;
+       case STRLT:
+               return strcmp(opnd1, opnd2) < 0;
+       case STRGT:
+               return strcmp(opnd1, opnd2) > 0;
+       case INTEQ:
+               return getn(opnd1) == getn(opnd2);
+       case INTNE:
+               return getn(opnd1) != getn(opnd2);
+       case INTGE:
+               return getn(opnd1) >= getn(opnd2);
+       case INTGT:
+               return getn(opnd1) > getn(opnd2);
+       case INTLE:
+               return getn(opnd1) <= getn(opnd2);
+       case INTLT:
+               return getn(opnd1) < getn(opnd2);
+       case FILNT:
+               return newerf (opnd1, opnd2);
+       case FILOT:
+               return olderf (opnd1, opnd2);
+       case FILEQ:
+               return equalf (opnd1, opnd2);
+       default:
+               abort();
+               /* NOTREACHED */
+       }
+}
+
+static int
+filstat(nm, mode)
+       char *nm;
+       enum token mode;
+{
+       struct stat s;
+
+       if (mode == FILSYM ? lstat(nm, &s) : stat(nm, &s))
+               return 0;
+
+       switch (mode) {
+       case FILRD:
+               return access(nm, R_OK) == 0;
+       case FILWR:
+               return access(nm, W_OK) == 0;
+       case FILEX:
+               return access(nm, X_OK) == 0;
+       case FILEXIST:
+               return access(nm, F_OK) == 0;
+       case FILREG:
+               return S_ISREG(s.st_mode);
+       case FILDIR:
+               return S_ISDIR(s.st_mode);
+       case FILCDEV:
+               return S_ISCHR(s.st_mode);
+       case FILBDEV:
+               return S_ISBLK(s.st_mode);
+       case FILFIFO:
+               return S_ISFIFO(s.st_mode);
+       case FILSOCK:
+               return S_ISSOCK(s.st_mode);
+       case FILSYM:
+               return S_ISLNK(s.st_mode);
+       case FILSUID:
+               return (s.st_mode & S_ISUID) != 0;
+       case FILSGID:
+               return (s.st_mode & S_ISGID) != 0;
+       case FILSTCK:
+               return (s.st_mode & S_ISVTX) != 0;
+       case FILGZ:
+               return s.st_size > (off_t)0;
+       case FILUID:
+               return s.st_uid == geteuid();
+       case FILGID:
+               return s.st_gid == getegid();
+       default:
+               return 1;
+       }
+}
+
+static enum token
+t_lex(s)
+       char *s;
+{
+       struct t_op const *op = ops;
+
+       if (s == 0) {
+               t_wp_op = (struct t_op *)0;
+               return EOI;
+       }
+       while (op->op_text) {
+               if (strcmp(s, op->op_text) == 0) {
+                       t_wp_op = op;
+                       return op->op_num;
+               }
+               op++;
+       }
+       t_wp_op = (struct t_op *)0;
+       return OPERAND;
+}
+
+/* atoi with error detection */
+static int
+getn(s)
+       const char *s;
+{
+       char *p;
+       long r;
+
+       errno = 0;
+       r = strtol(s, &p, 10);
+
+       if (errno != 0)
+         errx(2, "%s: out of range", s);
+
+       while (isspace(*p))
+         p++;
+       
+       if (*p)
+         errx(2, "%s: bad number", s);
+
+       return (int) r;
+}
+
+static int
+newerf (f1, f2)
+const char *f1, *f2;
+{
+       struct stat b1, b2;
+
+       return (stat (f1, &b1) == 0 &&
+               stat (f2, &b2) == 0 &&
+               b1.st_mtime > b2.st_mtime);
+}
+
+static int
+olderf (f1, f2)
+const char *f1, *f2;
+{
+       struct stat b1, b2;
+
+       return (stat (f1, &b1) == 0 &&
+               stat (f2, &b2) == 0 &&
+               b1.st_mtime < b2.st_mtime);
+}
+
+static int
+equalf (f1, f2)
+const char *f1, *f2;
+{
+       struct stat b1, b2;
+
+       return (stat (f1, &b1) == 0 &&
+               stat (f2, &b2) == 0 &&
+               b1.st_dev == b2.st_dev &&
+               b1.st_ino == b2.st_ino);
+}
diff --git a/time/Makefile b/time/Makefile
new file mode 100644 (file)
index 0000000..9cc989e
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = time
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = time.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble time.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/time/Makefile.postamble b/time/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/time/Makefile.preamble b/time/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/time/PB.project b/time/PB.project
new file mode 100644 (file)
index 0000000..3883220
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (time.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, time.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = time; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/time/time.1 b/time/time.1
new file mode 100644 (file)
index 0000000..4596a8f
--- /dev/null
@@ -0,0 +1,123 @@
+.\"    $NetBSD: time.1,v 1.7 1997/10/20 03:28:20 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)time.1     8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt TIME 1
+.Os
+.Sh NAME
+.Nm time
+.Nd time command execution
+.Sh SYNOPSIS
+.Nm
+.Op Fl lp
+.Ar utility
+.Sh DESCRIPTION
+The
+.Nm
+utility
+executes and
+times
+.Ar utility .
+After the
+.Ar utility
+finishes,
+.Nm
+writes the total time elapsed,
+the time consumed by system overhead,
+and the time used to execute 
+.Ar utility 
+to the standard error stream.
+Times are reported in seconds.
+.Pp
+Available options:
+.Bl -tag -width Ds
+.It Fl l
+The contents of the
+.Em rusage
+structure are printed.
+.It Fl p
+The output is formatted as specified by
+.St -p1003.2-92 .
+.El
+.Pp
+The
+.Xr csh 1
+has its own and syntactically different builtin version of
+.Nm "" .
+The utility described here
+is available as
+.Pa /usr/bin/time
+to
+.Xr csh
+users.
+.Sh DIAGNOSTICS
+The
+.Nm
+utility shall exit with one of the following values:
+.Bl -tag -width indent
+.It 1-125
+An error occurred in the 
+.Nm
+utility.
+.It 126
+The 
+.Ar utility
+was found but could not be invoked.
+.It 127
+The 
+.Ar utility
+could not be found.
+.El
+.Pp
+Otherwise, the exit status of 
+.Nm
+shall be that of 
+.Ar utility .
+.Sh SEE ALSO
+.Xr csh 1 ,
+.Xr getrusage 2
+.Sh FILES
+.Bl -tag -width /usr/include/sys/resource.h -compact
+.It Pa /usr/include/sys/resource.h
+.El
+.Sh STANDARDS
+The
+.Nm
+utility conforms to 
+.St -p1003.2-92 .
+.Sh BUGS
+The granularity of seconds on microprocessors is crude and
+can result in times being reported for CPU usage which are too large by
+a second.
diff --git a/time/time.c b/time/time.c
new file mode 100644 (file)
index 0000000..cd8f573
--- /dev/null
@@ -0,0 +1,173 @@
+/*     $NetBSD: time.c,v 1.9 1997/10/20 03:28:21 lukem Exp $   */
+
+/*
+ * Copyright (c) 1987, 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1987, 1988, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)time.c     8.1 (Berkeley) 6/6/93";
+#endif
+__RCSID("$NetBSD: time.c,v 1.9 1997/10/20 03:28:21 lukem Exp $");
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+int lflag;
+int portableflag;
+
+int    main __P((int, char **));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       int pid;
+       int ch, status;
+       struct timeval before, after;
+       struct rusage ru;
+
+#ifdef __GNUC__                /* XXX: borken gcc */
+       (void)&argv;
+#endif
+       lflag = 0;
+       while ((ch = getopt(argc, argv, "lp")) != -1)
+               switch((char)ch) {
+               case 'p':
+                       portableflag = 1;
+                       break;
+               case 'l':
+                       lflag = 1;
+                       break;
+               case '?':
+               default:
+                       fprintf(stderr, "usage: time [-lp] command.\n");
+                       exit(1);
+               }
+
+       if (!(argc -= optind))
+               exit(0);
+       argv += optind;
+
+       gettimeofday(&before, (struct timezone *)NULL);
+       switch(pid = vfork()) {
+       case -1:                        /* error */
+               perror("time");
+               exit(1);
+               /* NOTREACHED */
+       case 0:                         /* child */
+               execvp(*argv, argv);
+               perror(*argv);
+               _exit((errno == ENOENT) ? 127 : 126);
+               /* NOTREACHED */
+       }
+
+       /* parent */
+       (void)signal(SIGINT, SIG_IGN);
+       (void)signal(SIGQUIT, SIG_IGN);
+       while (wait3(&status, 0, &ru) != pid);
+       gettimeofday(&after, (struct timezone *)NULL);
+       if (!WIFEXITED(status))
+               fprintf(stderr, "Command terminated abnormally.\n");
+       timersub(&after, &before, &after);
+
+       if (portableflag) {
+               fprintf (stderr, "real %9ld.%02ld\n", 
+                       (long)after.tv_sec, (long)after.tv_usec/10000);
+               fprintf (stderr, "user %9ld.%02ld\n",
+                       (long)ru.ru_utime.tv_sec, (long)ru.ru_utime.tv_usec/10000);
+               fprintf (stderr, "sys  %9ld.%02ld\n",
+                       (long)ru.ru_stime.tv_sec, (long)ru.ru_stime.tv_usec/10000);
+       } else {
+
+               fprintf(stderr, "%9ld.%02ld real ", 
+                       (long)after.tv_sec, (long)after.tv_usec/10000);
+               fprintf(stderr, "%9ld.%02ld user ",
+                       (long)ru.ru_utime.tv_sec, (long)ru.ru_utime.tv_usec/10000);
+               fprintf(stderr, "%9ld.%02ld sys\n",
+                       (long)ru.ru_stime.tv_sec, (long)ru.ru_stime.tv_usec/10000);
+       }
+
+       if (lflag) {
+               int hz = 100;                   /* XXX */
+               long ticks;
+
+               ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) +
+                    hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000;
+
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_maxrss, "maximum resident set size");
+               fprintf(stderr, "%10ld  %s\n", ticks ? ru.ru_ixrss / ticks : 0,
+                       "average shared memory size");
+               fprintf(stderr, "%10ld  %s\n", ticks ? ru.ru_idrss / ticks : 0,
+                       "average unshared data size");
+               fprintf(stderr, "%10ld  %s\n", ticks ? ru.ru_isrss / ticks : 0,
+                       "average unshared stack size");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_minflt, "page reclaims");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_majflt, "page faults");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_nswap, "swaps");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_inblock, "block input operations");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_oublock, "block output operations");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_msgsnd, "messages sent");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_msgrcv, "messages received");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_nsignals, "signals received");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_nvcsw, "voluntary context switches");
+               fprintf(stderr, "%10ld  %s\n",
+                       ru.ru_nivcsw, "involuntary context switches");
+       }
+
+       exit (WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
+}
diff --git a/true/Makefile b/true/Makefile
new file mode 100644 (file)
index 0000000..ef1fc0a
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = true
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = true.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble true.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/true/Makefile.postamble b/true/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/true/Makefile.preamble b/true/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/true/PB.project b/true/PB.project
new file mode 100644 (file)
index 0000000..b26817e
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (true.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, true.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = true; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/true/true.1 b/true/true.1
new file mode 100644 (file)
index 0000000..b022042
--- /dev/null
@@ -0,0 +1,60 @@
+.\"    $NetBSD: true.1,v 1.5 1997/10/20 01:00:41 lukem Exp $
+.\"
+.\" Copyright (c) 1983, 1985, 1990 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)true.1       6.4 (Berkeley) 6/27/91
+.\"    $NetBSD: true.1,v 1.5 1997/10/20 01:00:41 lukem Exp $
+.\"
+.Dd June 27, 1991
+.Dt TRUE 1
+.Os
+.Sh NAME
+.Nm true
+.Nd Return true value.
+.Sh SYNOPSIS
+.Nm
+.Sh DESCRIPTION
+The
+.Nm
+utility always returns with exit code zero.
+.Sh SEE ALSO
+.Xr csh 1 ,
+.Xr sh 1 ,
+.Xr false 1
+.Sh STANDARDS
+The
+.Nm
+utility conforms to 
+.St -p1003.2-92 .
diff --git a/true/true.c b/true/true.c
new file mode 100644 (file)
index 0000000..f7af7e9
--- /dev/null
@@ -0,0 +1 @@
+int main () { exit(0); }
diff --git a/uname/Makefile b/uname/Makefile
new file mode 100644 (file)
index 0000000..1e14989
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = uname
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = uname.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble uname.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/uname/Makefile.postamble b/uname/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/uname/Makefile.preamble b/uname/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/uname/PB.project b/uname/PB.project
new file mode 100644 (file)
index 0000000..e715a43
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (uname.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, uname.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = uname; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/uname/uname.1 b/uname/uname.1
new file mode 100644 (file)
index 0000000..685a07f
--- /dev/null
@@ -0,0 +1,88 @@
+.\"    $NetBSD: uname.1,v 1.7 1997/10/20 02:16:38 lukem Exp $
+.\"
+.\" Copyright (c) 1990 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)du.1 6.13 (Berkeley) 6/20/91
+.\"    $NetBSD: uname.1,v 1.7 1997/10/20 02:16:38 lukem Exp $
+.\"
+.Dd January 26, 1994
+.Dt UNAME 1
+.Os
+.Sh NAME
+.Nm uname
+.Nd Print operating system name
+.Sh SYNOPSIS
+.Nm
+.Op Fl amnpsrv
+.Sh DESCRIPTION
+The
+.Nm
+utility writes symbols representing one or more system characteristics
+to the standard output.
+.Pp
+The following options are available:
+.Bl -tag -width indent
+.It Fl a 
+Behave as though all of the options
+.Fl mnrsv 
+were specified.
+.It Fl m
+print the machine hardware name.
+.It Fl n
+print the nodename (the nodename may be a name
+that the system is known by to a communications
+network).
+.It Fl p
+print the generic processor type.
+.It Fl s
+print the operating system name.
+.It Fl r
+print the operating system release.
+.It Fl v
+print the operating system version.
+.El
+.Pp
+If no options are specified, 
+.Nm
+prints the operating system name as if the
+.Fl s
+option had been specified.
+.Sh SEE ALSO
+.Xr hostname 1 ,
+.Xr machine 1 ,
+.Xr uname 3
+.Sh STANDARDS
+The
+.Nm
+utility conforms to
+.St -p1003.2-92 .
+
diff --git a/uname/uname.c b/uname/uname.c
new file mode 100644 (file)
index 0000000..72a6178
--- /dev/null
@@ -0,0 +1,168 @@
+/*     $NetBSD: uname.c,v 1.9 1997/10/20 02:16:39 lukem Exp $  */
+
+/*
+ * Copyright (c) 1994 Winning Strategies, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by Winning Strategies, Inc.
+ * 4. The name of Winning Strategies, Inc. may not be used to endorse or 
+ *    promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: uname.c,v 1.9 1997/10/20 02:16:39 lukem Exp $");
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <unistd.h>
+#include <sys/utsname.h>
+#include <err.h>
+
+int    main __P((int, char **));
+static void usage __P((void));
+
+#define        PRINT_SYSNAME   0x01
+#define        PRINT_NODENAME  0x02
+#define        PRINT_RELEASE   0x04
+#define        PRINT_VERSION   0x08
+#define        PRINT_MACHINE   0x10
+#define        PRINT_PROCESSOR 0x20
+#define        PRINT_ALL       0x3f
+
+int
+main(argc, argv) 
+       int argc;
+       char **argv;
+{
+       struct utsname u;
+       int c;
+       int space = 0;
+       int print_mask = 0;
+
+       setlocale(LC_ALL, "");
+
+       while ((c = getopt(argc,argv,"amnprsv")) != -1 ) {
+               switch ( c ) {
+               case 'a':
+                       print_mask |= PRINT_ALL;
+                       break;
+               case 'm':
+                       print_mask |= PRINT_MACHINE;
+                       break;
+               case 'n':
+                       print_mask |= PRINT_NODENAME;
+                       break;
+               case 'p': 
+                       print_mask |= PRINT_PROCESSOR;
+                       break;
+               case 'r': 
+                       print_mask |= PRINT_RELEASE;
+                       break;
+               case 's': 
+                       print_mask |= PRINT_SYSNAME;
+                       break;
+               case 'v':
+                       print_mask |= PRINT_VERSION;
+                       break;
+               default:
+                       usage();
+                       /* NOTREACHED */
+               }
+       }
+       
+       if (optind != argc) {
+               usage();
+               /* NOTREACHED */
+       }
+
+       if (!print_mask) {
+               print_mask = PRINT_SYSNAME;
+       }
+
+       if (uname(&u)) {
+               err(1, "uname");
+               /* NOTREACHED */
+       }
+
+       /*
+        * Let's allow the user to override the output of uname via the shell environment.
+        * This is a useful feature for cross-compiling (eg. during an OS bringup).
+        * Otherwise, you have to hack your kernel with the desired strings.
+        */
+       {
+               char *s;
+               s = getenv ("UNAME_SYSNAME");  if (s) strncpy (u.sysname,  s, sizeof (u.sysname));
+               s = getenv ("UNAME_NODENAME"); if (s) strncpy (u.nodename, s, sizeof (u.nodename));
+               s = getenv ("UNAME_RELEASE");  if (s) strncpy (u.release,  s, sizeof (u.release));
+               s = getenv ("UNAME_VERSION");  if (s) strncpy (u.version,  s, sizeof (u.version));
+               s = getenv ("UNAME_MACHINE");  if (s) strncpy (u.machine,  s, sizeof (u.machine));
+       }
+
+       if (print_mask & PRINT_SYSNAME) {
+               space++;
+               fputs(u.sysname, stdout);
+       }
+       if (print_mask & PRINT_NODENAME) {
+               if (space++) putchar(' ');
+               fputs(u.nodename, stdout);
+       }
+       if (print_mask & PRINT_RELEASE) {
+               if (space++) putchar(' ');
+               fputs(u.release, stdout);
+       }
+       if (print_mask & PRINT_VERSION) {
+               if (space++) putchar(' ');
+               fputs(u.version, stdout);
+       }
+       if (print_mask & PRINT_MACHINE) {
+               if (space++) putchar(' ');
+               fputs(u.machine, stdout);
+       }
+       if (print_mask & PRINT_PROCESSOR) {
+               if (space++) putchar(' ');
+#if   defined(__ppc__)
+               fputs("powerpc", stdout);
+#elif defined(__i386__)
+               fputs("i386", stdout);
+#else
+               fputs("unknown", stdout);
+#endif
+       }
+       putchar('\n');
+
+       exit(0);
+       /* NOTREACHED */
+}
+
+static void
+usage()
+{
+       fprintf(stderr, "usage: uname [-amnprsv]\n");
+       exit(1);
+}
diff --git a/users/Makefile b/users/Makefile
new file mode 100644 (file)
index 0000000..e7b7ddd
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = users
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = users.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble users.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/users/Makefile.postamble b/users/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/users/Makefile.preamble b/users/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/users/PB.project b/users/PB.project
new file mode 100644 (file)
index 0000000..f895ea9
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (users.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, users.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = users; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/users/users.1 b/users/users.1
new file mode 100644 (file)
index 0000000..6629f57
--- /dev/null
@@ -0,0 +1,61 @@
+.\"    $NetBSD: users.1,v 1.5 1997/10/20 02:41:21 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)users.1    8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt USERS 1
+.Os BSD 3
+.Sh NAME
+.Nm users
+.Nd list current users
+.Sh SYNOPSIS
+.Nm
+.Sh DESCRIPTION
+.Nm
+lists the login names of the users currently on the system,
+in sorted order, space separated, on a single line.
+.Sh FILES
+.Bl -tag -width /var/run/utmp
+.It Pa /var/run/utmp
+.El
+.Sh SEE ALSO
+.Xr finger 1 ,
+.Xr last 1 ,
+.Xr who 1 ,
+.Xr utmp 5
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 3.0 .
diff --git a/users/users.c b/users/users.c
new file mode 100644 (file)
index 0000000..5e243cd
--- /dev/null
@@ -0,0 +1,125 @@
+/*     $NetBSD: users.c,v 1.7 1998/02/03 04:19:15 perry Exp $  */
+
+/*
+ * Copyright (c) 1980, 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1980, 1987, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)users.c    8.1 (Berkeley) 6/6/93";
+#endif
+__RCSID("$NetBSD: users.c,v 1.7 1998/02/03 04:19:15 perry Exp $");
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <unistd.h>
+#include <utmp.h>
+
+typedef char   namebuf[UT_NAMESIZE];
+
+int    main __P((int, char **));
+int scmp __P((const void *, const void *));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       namebuf *names = NULL;
+       int ncnt = 0;
+       int nmax = 0;
+       int cnt;
+       struct utmp utmp;
+       int ch;
+
+       while ((ch = getopt(argc, argv, "")) != -1)
+               switch(ch) {
+               case '?':
+               default:
+                       (void)fprintf(stderr, "usage: users\n");
+                       exit(1);
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (!freopen(_PATH_UTMP, "r", stdin)) {
+               err(1, "can't open %s", _PATH_UTMP);
+               /* NOTREACHED */
+       }
+
+       while (fread((char *)&utmp, sizeof(utmp), 1, stdin) == 1) {
+               if (*utmp.ut_name) {
+                       if (ncnt >= nmax) {
+                               nmax += 32;
+                               names = realloc(names, 
+                                       sizeof (*names) * nmax);
+
+                               if (!names) {
+                                       err(1, "realloc");
+                                       /* NOTREACHED */
+                               }
+                       }
+
+                       (void)strncpy(names[ncnt], utmp.ut_name, UT_NAMESIZE);
+                       ++ncnt;
+               }
+       }
+
+       if (ncnt) {
+               qsort(names, ncnt, UT_NAMESIZE, scmp);
+               (void)printf("%.*s", UT_NAMESIZE, names[0]);
+               for (cnt = 1; cnt < ncnt; ++cnt)
+                       if (strncmp(names[cnt], names[cnt - 1], UT_NAMESIZE))
+                               (void)printf(" %.*s", UT_NAMESIZE, names[cnt]);
+               (void)printf("\n");
+       }
+       exit(0);
+}
+
+int
+scmp(p, q)
+       const void *p, *q;
+{
+       return(strncmp((char *) p, (char *) q, UT_NAMESIZE));
+}
diff --git a/w/Makefile b/w/Makefile
new file mode 100644 (file)
index 0000000..3c5c7cf
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = w
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+HFILES = extern.h
+
+CFILES = fmt.c proc_compare.c pr_time.c w.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble uptime.1 w.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+NEXTSTEP_PB_CFLAGS = -traditional-cpp -Wno-error
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/w/Makefile.postamble b/w/Makefile.postamble
new file mode 100644 (file)
index 0000000..d6c7e60
--- /dev/null
@@ -0,0 +1,7 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
+
+INSTALL_AS_GROUP    = kmem
+INSTALL_PERMISSIONS = 2555
+
+after_install::
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/uptime
diff --git a/w/Makefile.preamble b/w/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/w/PB.project b/w/PB.project
new file mode 100644 (file)
index 0000000..f2e8fd2
--- /dev/null
@@ -0,0 +1,28 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (extern.h); 
+        OTHER_LINKED = (fmt.c, proc_compare.c, pr_time.c, w.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, uptime.1, w.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_COMPILEROPTIONS = "-traditional-cpp -Wno-error"; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = w; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/w/extern.h b/w/extern.h
new file mode 100644 (file)
index 0000000..7562e03
--- /dev/null
@@ -0,0 +1,43 @@
+/*     $NetBSD: extern.h,v 1.3 1996/06/07 01:39:16 thorpej Exp $       */
+
+/*-
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)extern.h    8.1 (Berkeley) 6/6/93
+ */
+
+struct proc;
+void   fmt_puts __P((char *, int *));
+void   fmt_putc __P((int, int *));
+void   pr_attime __P((time_t *, time_t *));
+void   pr_idle __P((time_t));
+int    proc_compare __P((struct proc *, struct proc *));
diff --git a/w/fmt.c b/w/fmt.c
new file mode 100644 (file)
index 0000000..c3606ab
--- /dev/null
+++ b/w/fmt.c
@@ -0,0 +1,56 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <vis.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+/*#include "ps.h"*/
+#include "extern.h"
+
+void
+fmt_puts(s, leftp)
+       char *s;
+       int *leftp;
+{
+       static char *v = 0, *nv;
+       static int maxlen = 0;
+       int len;
+
+       if (*leftp == 0)
+               return;
+       len = strlen(s) * 4 + 1;
+       if (len > maxlen) {
+               if (maxlen == 0)
+                       maxlen = getpagesize();
+               while (len > maxlen)
+                       maxlen *= 2;
+               nv = realloc(v, maxlen);
+               if (nv == 0)
+                       return;
+               v = nv;
+       }
+       strvis(v, s, VIS_TAB | VIS_NL | VIS_CSTYLE);
+       if (*leftp != -1) {
+               len = strlen(v);
+               if (len > *leftp) {
+                       v[*leftp] = '\0';
+                       *leftp = 0;
+               } else
+                       *leftp -= len;
+       }
+       printf("%s", v);
+}
+
+void
+fmt_putc(c, leftp)
+       int c;
+       int *leftp;
+{
+
+       if (*leftp == 0)
+               return;
+       if (*leftp != -1)
+               *leftp -= 1;
+       putchar(c);
+}
diff --git a/w/pr_time.c b/w/pr_time.c
new file mode 100644 (file)
index 0000000..e05edb5
--- /dev/null
@@ -0,0 +1,116 @@
+/*     $NetBSD: pr_time.c,v 1.9 1998/04/02 11:34:23 kleink Exp $       */
+
+/*-
+ * Copyright (c) 1990, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)pr_time.c  8.2 (Berkeley) 4/4/94";
+#else
+__RCSID("$NetBSD: pr_time.c,v 1.9 1998/04/02 11:34:23 kleink Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <tzfile.h>
+
+#include "extern.h"
+
+/*
+ * pr_attime --
+ *     Print the time since the user logged in. 
+ *
+ *     Note: SCCS forces the bizarre string manipulation, things like
+ *     %I% get replaced in the source code.
+ */
+void
+pr_attime(started, now)
+       time_t *started, *now;
+{
+       static char buf[256];
+       int tnow_yday;
+       struct tm *tp;
+       time_t diff;
+       char *fmt;
+
+       tnow_yday = localtime(now)->tm_yday;
+       tp = localtime(started);
+       diff = *now - *started;
+
+       /* If more than a week, use day-month-year. */
+       if (diff > SECSPERDAY * DAYSPERWEEK)
+               fmt = "%d%b%y";
+
+       /* If not today, use day-hour-am/pm. */
+       else if (tp->tm_yday != tnow_yday)
+               fmt = __CONCAT("%a%", "I%p");
+
+       /* Default is hh:mm{am,pm}. */
+       else
+               fmt = __CONCAT("%l:%", "M%p");
+
+       (void)strftime(buf, sizeof(buf), fmt, tp);
+       buf[sizeof(buf) - 1] = '\0';
+       (void)fputs(buf, stdout);
+}
+
+/*
+ * pr_idle --
+ *     Display the idle time.
+ */
+void
+pr_idle(idle)
+       time_t idle;
+{
+       int days = idle / SECSPERDAY;
+
+       /* If idle more than 36 hours, print as a number of days. */
+       if (idle >= 36 * SECSPERHOUR)
+               printf(days == 1 ? "  %dday " : " %ddays ", days);
+
+       /* If idle more than an hour, print as HH:MM. */
+       else if (idle >= SECSPERHOUR)
+               (void)printf(" %2d:%02d ",
+                   (int)(idle / SECSPERHOUR),
+                   (int)((idle % SECSPERHOUR) / SECSPERMIN));
+
+       /* Else print the minutes idle. */
+       else
+               (void)printf("    %2d ", (int)(idle / SECSPERMIN));
+}
diff --git a/w/proc_compare.c b/w/proc_compare.c
new file mode 100644 (file)
index 0000000..7a15cac
--- /dev/null
@@ -0,0 +1,127 @@
+/*     $NetBSD: proc_compare.c,v 1.7 1997/10/20 02:49:14 mrg Exp $     */
+
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)proc_compare.c     8.2 (Berkeley) 9/23/93";
+#else
+__RCSID("$NetBSD: proc_compare.c,v 1.7 1997/10/20 02:49:14 mrg Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/proc.h>
+
+#include "extern.h"
+
+/*
+ * Returns 1 if p2 is "better" than p1
+ *
+ * The algorithm for picking the "interesting" process is thus:
+ *
+ *     1) Only foreground processes are eligible - implied.
+ *     2) Runnable processes are favored over anything else.  The runner
+ *        with the highest cpu utilization is picked (p_estcpu).  Ties are
+ *        broken by picking the highest pid.
+ *     3) The sleeper with the shortest sleep time is next.  With ties,
+ *        we pick out just "short-term" sleepers (P_SINTR == 0).
+ *     4) Further ties are broken by picking the highest pid.
+ *
+ * If you change this, be sure to consider making the change in the kernel
+ * too (^T in kern/tty.c).
+ *
+ * TODO - consider whether pctcpu should be used.
+ */
+
+#define ISRUN(p)       (((p)->p_stat == SRUN) || ((p)->p_stat == SIDL))
+#define TESTAB(a, b)    ((a)<<1 | (b))
+#define ONLYA   2
+#define ONLYB   1
+#define BOTH    3
+
+int
+proc_compare(p1, p2)
+       struct proc *p1, *p2;
+{
+
+       if (p1 == NULL)
+               return (1);
+       /*
+        * see if at least one of them is runnable
+        */
+       switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
+       case ONLYA:
+               return (0);
+       case ONLYB:
+               return (1);
+       case BOTH:
+               /*
+                * tie - favor one with highest recent cpu utilization
+                */
+               if (p2->p_estcpu > p1->p_estcpu)
+                       return (1);
+               if (p1->p_estcpu > p2->p_estcpu)
+                       return (0);
+               return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
+       }
+       /*
+        * weed out zombies
+        */
+       switch (TESTAB(p1->p_stat == SZOMB, p2->p_stat == SZOMB)) {
+       case ONLYA:
+               return (1);
+       case ONLYB:
+               return (0);
+       case BOTH:
+               return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
+       }
+       /*
+        * pick the one with the smallest sleep time
+        */
+       if (p2->p_slptime > p1->p_slptime)
+               return (0);
+       if (p1->p_slptime > p2->p_slptime)
+               return (1);
+       /*
+        * favor one sleeping in a non-interruptible sleep
+        */
+       if (p1->p_flag & P_SINTR && (p2->p_flag & P_SINTR) == 0)
+               return (1);
+       if (p2->p_flag & P_SINTR && (p1->p_flag & P_SINTR) == 0)
+               return (0);
+       return (p2->p_pid > p1->p_pid);         /* tie - return highest pid */
+}
diff --git a/w/uptime.1 b/w/uptime.1
new file mode 100644 (file)
index 0000000..85ca182
--- /dev/null
@@ -0,0 +1,62 @@
+.\"    $NetBSD: uptime.1,v 1.7 1997/10/20 02:49:15 mrg Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1993, 1994
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)uptime.1   8.2 (Berkeley) 4/18/94
+.\"
+.Dd April 18, 1994
+.Dt UPTIME 1
+.Os BSD 3
+.Sh NAME
+.Nm uptime
+.Nd show how long system has been running
+.Sh SYNOPSIS
+.Nm
+.Sh DESCRIPTION
+The 
+.Nm
+utility displays the current time,
+the length of time the system has been up,
+the number of users, and the load average of the system over the last
+1, 5, and 15 minutes.
+.Sh FILES
+.Bl -tag -width /netbsd
+.It Pa /netbsd
+system name list
+.El
+.Sh SEE ALSO
+.Xr w 1
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 3.0 .
diff --git a/w/w.1 b/w/w.1
new file mode 100644 (file)
index 0000000..3517a2e
--- /dev/null
+++ b/w/w.1
@@ -0,0 +1,143 @@
+.\"    $NetBSD: w.1,v 1.8 1997/11/01 03:28:22 mycroft Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)w.1        8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt W 1
+.Os BSD 4
+.Sh NAME
+.Nm w
+.Nd "who present users are and what they are doing"
+.Sh SYNOPSIS
+.Nm
+.Op Fl hin
+.Op Fl M Ar core
+.Op Fl N Ar system
+.Op Ar user
+.Sh DESCRIPTION
+The
+.Nm
+utility prints a summary of the current activity on the system,
+including what each user is doing.
+The first line displays the current time of day, how long the system has
+been running, the number of users logged into the system, and the load
+averages.
+The load average numbers give the number of jobs in the run queue averaged
+over 1, 5 and 15 minutes.
+.Pp
+The fields output are the user's login name, the name of the terminal the
+user is on, the host from which the user is logged in, the time the user
+logged on, the time since the user last typed anything,
+and the name and arguments of the current process.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl h
+Suppress the heading.
+.It Fl i
+Output is sorted by idle time.
+.It Fl M
+Extract values associated with the name list from the specified
+core instead of the default
+.Dq /dev/kmem .
+.It Fl N
+Extract the name list from the specified system instead of the
+default
+.Dq /netbsd .
+.It Fl n
+Show network addresses as numbers (normally
+.Nm
+interprets addresses and attempts to display them symbolically).
+.El
+.Pp
+If a
+.Ar user
+name is specified, the output is restricted to that user.
+.Sh FILES
+.Bl -tag -width /var/run/utmp -compact
+.It Pa /var/run/utmp
+list of users on the system
+.El
+.Sh SEE ALSO
+.Xr who 1 ,
+.Xr finger 1 ,
+.Xr ps 1 ,
+.Xr uptime 1
+.Sh BUGS
+The notion of the
+.Dq current process
+is muddy.
+The current algorithm is ``the highest numbered process on the terminal
+that is not ignoring interrupts, or, if there is none, the highest numbered
+process on the terminal''.
+This fails, for example, in critical sections of programs like the shell
+and editor, or when faulty programs running in the background fork and fail
+to ignore interrupts.
+(In cases where no process can be found,
+.Nm
+prints
+.Dq \- . )
+.Pp
+The
+.Tn CPU
+time is only an estimate, in particular, if someone leaves a background
+process running after logging out, the person currently on that terminal is
+.Dq charged
+with the time.
+.Pp
+Background processes are not shown, even though they account for
+much of the load on the system.
+.Pp
+Sometimes processes, typically those in the background, are printed with
+null or garbaged arguments.
+In these cases, the name of the command is printed in parentheses.
+.Pp
+The 
+.Nm
+utility does not know about the new conventions for detection of background
+jobs.
+It will sometimes find a background job instead of the right one.
+.Sh COMPATIBILITY
+The
+.Fl f ,
+.Fl l ,
+.Fl s ,
+and
+.Fl w
+flags are no longer supported.
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Ux 3.0 .
diff --git a/w/w.c b/w/w.c
new file mode 100644 (file)
index 0000000..7e52c79
--- /dev/null
+++ b/w/w.c
@@ -0,0 +1,476 @@
+/*     $NetBSD: w.c,v 1.30 1998/07/06 07:50:20 mrg Exp $       */
+
+/*-
+ * Copyright (c) 1980, 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1980, 1991, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)w.c        8.6 (Berkeley) 6/30/94";
+#else
+__RCSID("$NetBSD: w.c,v 1.30 1998/07/06 07:50:20 mrg Exp $");
+#endif
+#endif /* not lint */
+
+/*
+ * w - print system status (who and what)
+ *
+ * This program is similar to the systat command on Tenex/Tops 10/20
+ *
+ */
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/sysctl.h>
+#include <sys/proc.h>
+#include <sys/user.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+
+#include <machine/cpu.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <kvm.h>
+#include <limits.h>
+#include <netdb.h>
+#include <nlist.h>
+#include <paths.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <tzfile.h>
+#include <unistd.h>
+#include <utmp.h>
+#include <vis.h>
+
+#include "extern.h"
+
+struct timeval boottime;
+struct utmp    utmp;
+struct winsize ws;
+kvm_t         *kd;
+time_t         now;            /* the current time of day */
+time_t         uptime;         /* time of last reboot & elapsed time since */
+int            ttywidth;       /* width of tty */
+int            argwidth;       /* width of tty */
+int            header = 1;     /* true if -h flag: don't print heading */
+int            nflag;          /* true if -n flag: don't convert addrs */
+int            sortidle;       /* sort bu idle time */
+char          *sel_user;       /* login of particular user selected */
+char           domain[MAXHOSTNAMELEN + 1];
+
+/*
+ * One of these per active utmp entry.
+ */
+struct entry {
+       struct  entry *next;
+       struct  utmp utmp;
+       dev_t   tdev;           /* dev_t of terminal */
+       time_t  idle;           /* idle time of terminal in seconds */
+       struct  kinfo_proc *kp; /* `most interesting' proc */
+} *ep, *ehead = NULL, **nextp = &ehead;
+
+static void     pr_args __P((struct kinfo_proc *));
+static void     pr_header __P((time_t *, int));
+static struct stat
+               *ttystat __P((char *));
+static void     usage __P((int));
+int    main __P((int, char **));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       extern char *__progname;
+       struct kinfo_proc *kp;
+       struct hostent *hp;
+       struct stat *stp;
+       FILE *ut;
+       struct in_addr l;
+       int ch, i, nentries, nusers, wcmd;
+       gid_t egid = getegid();
+       char *memf, *nlistf, *p, *x;
+       char buf[MAXHOSTNAMELEN], errbuf[_POSIX2_LINE_MAX];
+
+       (void)setegid(getgid());
+
+       /* Are we w(1) or uptime(1)? */
+       p = __progname;
+       if (*p == '-')
+               p++;
+       if (*p == 'u') {
+               wcmd = 0;
+               p = "";
+       } else {
+               wcmd = 1;
+               p = "hiflM:N:nsuw";
+       }
+
+       memf = nlistf = NULL;
+       while ((ch = getopt(argc, argv, p)) != -1)
+               switch (ch) {
+               case 'h':
+                       header = 0;
+                       break;
+               case 'i':
+                       sortidle = 1;
+                       break;
+               case 'M':
+                       header = 0;
+                       memf = optarg;
+                       break;
+               case 'N':
+                       nlistf = optarg;
+                       break;
+               case 'n':
+                       nflag = 1;
+                       break;
+               case 'f': case 'l': case 's': case 'u': case 'w':
+                       warnx("[-flsuw] no longer supported");
+                       /* FALLTHROUGH */
+               case '?':
+               default:
+                       usage(wcmd);
+               }
+       argc -= optind;
+       argv += optind;
+
+       /*
+        * Discard setgid privileges.  If not the running kernel, we toss
+        * them away totally so that bad guys can't print interesting stuff
+        * from kernel memory, otherwise switch back to kmem for the
+        * duration of the kvm_openfiles() call.
+        */
+       if (nlistf != NULL || memf != NULL)
+               (void)setgid(getgid());
+       else
+               (void)setegid(egid);
+
+       if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf)) == NULL)
+               errx(1, "%s", errbuf);
+
+       /* get rid of it now anyway */
+       if (nlistf == NULL && memf == NULL)
+               (void)setgid(getgid());
+
+       (void)time(&now);
+       if ((ut = fopen(_PATH_UTMP, "r")) == NULL)
+               err(1, "%s", _PATH_UTMP);
+
+       if (*argv)
+               sel_user = *argv;
+
+       for (nusers = 0; fread(&utmp, sizeof(utmp), 1, ut);) {
+               if (utmp.ut_name[0] == '\0')
+                       continue;
+               ++nusers;
+               if (wcmd == 0 || (sel_user &&
+                   strncmp(utmp.ut_name, sel_user, UT_NAMESIZE) != 0))
+                       continue;
+               if ((ep = calloc(1, sizeof(struct entry))) == NULL)
+                       err(1, "%s", "");
+               *nextp = ep;
+               nextp = &(ep->next);
+               memmove(&(ep->utmp), &utmp, sizeof(struct utmp));
+               if (!(stp = ttystat(ep->utmp.ut_line)))
+                       continue;
+               ep->tdev = stp->st_rdev;
+#ifdef CPU_CONSDEV
+               /*
+                * If this is the console device, attempt to ascertain
+                * the true console device dev_t.
+                */
+               if (ep->tdev == 0) {
+                       int mib[2];
+                       size_t size;
+
+                       mib[0] = CTL_MACHDEP;
+                       mib[1] = CPU_CONSDEV;
+                       size = sizeof(dev_t);
+                       (void) sysctl(mib, 2, &ep->tdev, &size, NULL, 0);
+               }
+#endif
+               if ((ep->idle = now - stp->st_atime) < 0)
+                       ep->idle = 0;
+       }
+       (void)fclose(ut);
+
+       if (header || wcmd == 0) {
+               pr_header(&now, nusers);
+               if (wcmd == 0)
+                       exit (0);
+       }
+
+#define HEADER "USER    TTY FROM              LOGIN@  IDLE WHAT\n"
+#define WUSED  (sizeof (HEADER) - sizeof ("WHAT\n"))
+       (void)printf(HEADER);
+
+       if ((kp = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nentries)) == NULL)
+               errx(1, "%s", kvm_geterr(kd));
+       for (i = 0; i < nentries; i++, kp++) {
+#ifdef __APPLE__
+               struct proc *p = (struct proc *)&kp->kp_proc;
+#else
+               struct proc *p = &kp->kp_proc;
+#endif
+               struct eproc *e;
+
+               if (p->p_stat == SIDL || p->p_stat == SZOMB)
+                       continue;
+               e = &kp->kp_eproc;
+               for (ep = ehead; ep != NULL; ep = ep->next) {
+                       if (ep->tdev == e->e_tdev && e->e_pgid == e->e_tpgid) {
+                               /*
+                                * Proc is in foreground of this terminal
+                                */
+#ifdef __APPLE__
+                               if (proc_compare((struct proc *)&ep->kp->kp_proc, p))
+#else
+                               if (proc_compare(&ep->kp->kp_proc, p))
+#endif
+                                       ep->kp = kp;
+                               break;
+                       }
+               }
+       }
+       if ((ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == -1 &&
+            ioctl(STDERR_FILENO, TIOCGWINSZ, &ws) == -1 &&
+            ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == -1) || ws.ws_col == 0)
+              ttywidth = 79;
+        else
+              ttywidth = ws.ws_col - 1;
+       argwidth = ttywidth - WUSED;
+       if (argwidth < 4)
+               argwidth = 8;
+       /* sort by idle time */
+       if (sortidle && ehead != NULL) {
+               struct entry *from = ehead, *save;
+               
+               ehead = NULL;
+               while (from != NULL) {
+                       for (nextp = &ehead;
+                           (*nextp) && from->idle >= (*nextp)->idle;
+                           nextp = &(*nextp)->next)
+                               continue;
+                       save = from;
+                       from = from->next;
+                       save->next = *nextp;
+                       *nextp = save;
+               }
+       }
+                       
+       if (!nflag) {
+               int     rv;
+
+               rv = gethostname(domain, sizeof(domain));
+               domain[sizeof(domain) - 1] = '\0';
+               if (rv < 0 || (p = strchr(domain, '.')) == 0)
+                       domain[0] = '\0';
+               else
+                       memmove(domain, p, strlen(p) + 1);
+       }
+
+       for (ep = ehead; ep != NULL; ep = ep->next) {
+               p = *ep->utmp.ut_host ? ep->utmp.ut_host : "-";
+               for (x = p; x < p + UT_HOSTSIZE; x++)
+                       if (*x == '\0' || *x == ':')
+                               break;
+               if (x == p + UT_HOSTSIZE || *x != ':')
+                       x = NULL;
+               else
+                       *x++ = '\0';
+
+               if (!nflag && inet_aton(p, &l) &&
+                   (hp = gethostbyaddr((char *)&l, sizeof(l), AF_INET))) {
+                       if (domain[0] != '\0') {
+                               p = hp->h_name;
+                               p += strlen(hp->h_name);
+                               p -= strlen(domain);
+                               if (p > hp->h_name && strcmp(p, domain) == 0)
+                                       *p = '\0';
+                       }
+                       p = hp->h_name;
+               }
+               if (x) {
+                       (void)snprintf(buf, sizeof(buf), "%s:%.*s", p,
+                           (int)(ep->utmp.ut_host + UT_HOSTSIZE - x), x);
+                       p = buf;
+               }
+               (void)printf("%-*.*s %-2.2s %-*.*s ",
+                   UT_NAMESIZE, UT_NAMESIZE, ep->utmp.ut_name,
+                   strncmp(ep->utmp.ut_line, "tty", 3) ?
+                   ep->utmp.ut_line : ep->utmp.ut_line + 3,
+                   UT_HOSTSIZE, UT_HOSTSIZE, *p ? p : "-");
+               pr_attime(&ep->utmp.ut_time, &now);
+               pr_idle(ep->idle);
+               pr_args(ep->kp);
+               printf("\n");
+       }
+       exit(0);
+}
+
+static void
+pr_args(kp)
+       struct kinfo_proc *kp;
+{
+       char **argv;
+       int left;
+
+       if (kp == 0)
+               goto nothing;
+       left = argwidth;
+       argv = kvm_getargv(kd, kp, argwidth);
+       if (argv == 0)
+               goto nothing;
+       while (*argv) {
+               fmt_puts(*argv, &left);
+               argv++;
+               fmt_putc(' ', &left);
+       }
+       return;
+nothing:
+       putchar('-');
+}
+
+static void
+pr_header(nowp, nusers)
+       time_t *nowp;
+       int nusers;
+{
+       double avenrun[3];
+       time_t uptime;
+       int days, hrs, i, mins;
+       int mib[2];
+       size_t size;
+       char buf[256];
+
+       /*
+        * Print time of day.
+        *
+        * SCCS forces the string manipulation below, as it replaces
+        * %, M, and % in a character string with the file name.
+        */
+       (void)strftime(buf, sizeof(buf),
+           __CONCAT("%l:%","M%p"), localtime(nowp));
+       buf[sizeof(buf) - 1] = '\0';
+       (void)printf("%s ", buf);
+
+       /*
+        * Print how long system has been up.
+        * (Found by looking getting "boottime" from the kernel)
+        */
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_BOOTTIME;
+       size = sizeof(boottime);
+       if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 &&
+           boottime.tv_sec != 0) {
+               uptime = now - boottime.tv_sec;
+               uptime += 30;
+               if (uptime > SECSPERMIN) {
+                       days = uptime / SECSPERDAY;
+                       uptime %= SECSPERDAY;
+                       hrs = uptime / SECSPERHOUR;
+                       uptime %= SECSPERHOUR;
+                       mins = uptime / SECSPERMIN;
+                       (void)printf(" up");
+                       if (days > 0)
+                               (void)printf(" %d day%s,", days,
+                                   days > 1 ? "s" : "");
+                       if (hrs > 0 && mins > 0)
+                               (void)printf(" %2d:%02d,", hrs, mins);
+                       else {
+                               if (hrs > 0)
+                                       (void)printf(" %d hr%s,",
+                                           hrs, hrs > 1 ? "s" : "");
+                               if (mins > 0)
+                                       (void)printf(" %d min%s,",
+                                           mins, mins > 1 ? "s" : "");
+                       }
+               }
+       }
+
+       /* Print number of users logged in to system */
+       (void)printf(" %d user%s", nusers, nusers != 1 ? "s" : "");
+
+       /*
+        * Print 1, 5, and 15 minute load averages.
+        */
+       if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) == -1)
+               (void)printf(", no load average information available\n");
+       else {
+               (void)printf(", load averages:");
+               for (i = 0; i < (sizeof(avenrun) / sizeof(avenrun[0])); i++) {
+                       if (i > 0)
+                               (void)printf(",");
+                       (void)printf(" %.2f", avenrun[i]);
+               }
+               (void)printf("\n");
+       }
+}
+
+static struct stat *
+ttystat(line)
+       char *line;
+{
+       static struct stat sb;
+       char ttybuf[MAXPATHLEN];
+
+       (void)snprintf(ttybuf, sizeof(ttybuf), "%s/%s", _PATH_DEV, line);
+       if (stat(ttybuf, &sb))
+               return (NULL);
+       return (&sb);
+}
+
+static void
+usage(wcmd)
+       int wcmd;
+{
+       if (wcmd)
+               (void)fprintf(stderr,
+                   "usage: w: [-hin] [-M core] [-N system] [user]\n");
+       else
+               (void)fprintf(stderr, "uptime\n");
+       exit(1);
+}
diff --git a/whereis/Makefile b/whereis/Makefile
new file mode 100644 (file)
index 0000000..c988af7
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = whereis
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = whereis.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble whereis.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/whereis/Makefile.postamble b/whereis/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/whereis/Makefile.preamble b/whereis/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/whereis/PB.project b/whereis/PB.project
new file mode 100644 (file)
index 0000000..1efa203
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (whereis.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, whereis.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = whereis; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/whereis/whereis.1 b/whereis/whereis.1
new file mode 100644 (file)
index 0000000..22dfb28
--- /dev/null
@@ -0,0 +1,66 @@
+.\"    $NetBSD: whereis.1,v 1.7 1998/02/06 06:20:06 perry Exp $
+.\"
+.\" Copyright (c) 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)whereis.1   8.3 (Berkeley) 4/27/95
+.\"
+.Dd April 27, 1995
+.Dt WHEREIS 1
+.Os BSD 3
+.Sh NAME
+.Nm whereis
+.Nd locate programs
+.Sh SYNOPSIS
+.Nm
+.Op Ar program ...
+.Sh DESCRIPTION
+The
+.Nm
+utility checks the standard binary directories for the specified programs,
+printing out the paths of any it finds.
+.Pp
+The path searched is the string returned by the
+.Xr sysctl 8
+utility for the
+.Dq user.cs_path
+string.
+.Sh SEE ALSO
+.Xr sysctl 8
+.Sh COMPATIBILITY
+The historic flags and arguments for the
+.Nm
+utility are no longer available in this version.
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 3.0 .
diff --git a/whereis/whereis.c b/whereis/whereis.c
new file mode 100644 (file)
index 0000000..680f1f3
--- /dev/null
@@ -0,0 +1,128 @@
+/*     $NetBSD: whereis.c,v 1.8 1997/10/20 02:22:55 mrg Exp $  */
+
+/*-
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)whereis.c  8.3 (Berkeley) 5/4/95";
+#endif
+__RCSID("$NetBSD: whereis.c,v 1.8 1997/10/20 02:22:55 mrg Exp $");
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/sysctl.h>
+
+#include <err.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+void usage __P((void));
+int main __P((int, char *[]));
+
+int
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       struct stat sb;
+       size_t len;
+       int ch, sverrno, mib[2];
+       char *p, *t, *std, path[MAXPATHLEN];
+
+       while ((ch = getopt(argc, argv, "")) != -1)
+               switch (ch) {
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc == 0)
+               usage();
+
+       /* Retrieve the standard path. */
+       mib[0] = CTL_USER;
+       mib[1] = USER_CS_PATH;
+       if (sysctl(mib, 2, NULL, &len, NULL, 0) == -1)
+               return (-1);
+       if (len == 0)
+               err(1, "user_cs_path: sysctl: zero length\n");
+       if ((std = malloc(len)) == NULL)
+               err(1, "%s", "");
+       if (sysctl(mib, 2, std, &len, NULL, 0) == -1) {
+               sverrno = errno;
+               free(std);
+               errno = sverrno;
+               err(1, "sysctl: user_cs_path");
+       }
+
+       /* For each path, for each program... */
+       for (; *argv; ++argv)
+               for (p = std;; *p++ = ':') {
+                       t = p;
+                       if ((p = strchr(p, ':')) != NULL) {
+                               *p = '\0';
+                               if (t == p)
+                                       t = ".";
+                       } else
+                               if (strlen(t) == 0)
+                                       t = ".";
+                       (void)snprintf(path, sizeof(path), "%s/%s", t, *argv);
+                       if (!stat(path, &sb))
+                               (void)printf("%s\n", path);
+                       if (p == NULL)
+                               break;
+               }
+
+       return (0);
+}
+
+void
+usage()
+{
+
+       (void)fprintf(stderr, "usage: whereis program [...]\n");
+       exit (1);
+}
diff --git a/which/Makefile b/which/Makefile
new file mode 100644 (file)
index 0000000..21a2a4a
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = which
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+OTHERLINKED = which.csh
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble which.1
+
+OTHERLINKEDOFILES = which.o
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/which/Makefile.postamble b/which/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/which/Makefile.preamble b/which/Makefile.preamble
new file mode 100644 (file)
index 0000000..ec3a5ea
--- /dev/null
@@ -0,0 +1,3 @@
+SHELLTOOL = which.csh
+
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/which/PB.project b/which/PB.project
new file mode 100644 (file)
index 0000000..2cb830a
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (which.csh); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, which.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = which; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/which/which.1 b/which/which.1
new file mode 100644 (file)
index 0000000..5353cdd
--- /dev/null
@@ -0,0 +1,75 @@
+.\"    $NetBSD: which.1,v 1.4 1997/10/20 03:19:23 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1991 Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)which.1      6.3 (Berkeley) 4/23/91
+.\"    $NetBSD: which.1,v 1.4 1997/10/20 03:19:23 lukem Exp $
+.\"
+.Dd April 23, 1991
+.Dt WHICH 1
+.Os BSD 3
+.Sh NAME
+.Nm which
+.Nd "locate a program file including aliases and paths"
+.Pq Xr csh 1
+only)
+.Sh SYNOPSIS
+.Nm
+.Op Ar name
+.Ar ...
+.Sh DESCRIPTION
+.Nm
+takes a list of names and looks for the files which would be
+executed had these names been given as commands.
+Each argument is expanded if it is aliased,
+and searched for along the user's path.
+Both aliases and path are taken from the user's
+.Pa \&.cshrc
+file.
+.Sh FILES
+.Bl -tag -width ~/\&.cshrc
+.It Pa ~/\&.cshrc
+source of aliases and path values
+.El
+.Sh DIAGNOSTICS
+A diagnostic is given for names which are aliased to more than a single
+word,
+or if an executable file with the argument name was not found in the path.
+.Sh BUGS
+Must be executed by a
+.Xr csh 1 ,
+or some other shell which knows about aliases.
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 3.0 .
diff --git a/which/which.csh b/which/which.csh
new file mode 100644 (file)
index 0000000..5295deb
--- /dev/null
@@ -0,0 +1,75 @@
+#!/bin/csh
+#
+# DO NOT USE "csh -f"
+#
+# Copyright (c) 1983 The Regents of the University of California.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#      This product includes software developed by the University of
+#      California, Berkeley and its contributors.
+# 4. Neither the name of the University nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#      @(#)which.csh   5.5 (Berkeley) 4/18/91
+#
+
+#      which : tells you which program you get
+#
+set prompt = "% "
+set noglob
+foreach arg ( $argv )
+    set alius = `alias $arg`
+    switch ( $#alius )
+       case 0 :
+           breaksw
+       case 1 :
+           set arg = $alius[1]
+           breaksw
+        default :
+           echo ${arg}: "      " aliased to $alius
+           continue
+    endsw
+    unset found
+    if ( $arg:h != $arg:t ) then
+       if ( -e $arg ) then
+           echo $arg
+       else
+           echo $arg not found
+       endif
+       continue
+    else
+       foreach i ( $path )
+           if ( -x $i/$arg && ! -d $i/$arg ) then
+               echo $i/$arg
+               set found
+               break
+           endif
+       end
+    endif
+    if ( ! $?found ) then
+       echo no $arg in $path
+    endif
+end
diff --git a/who/Makefile b/who/Makefile
new file mode 100644 (file)
index 0000000..b29c433
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = who
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = who.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble who.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/who/Makefile.postamble b/who/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/who/Makefile.preamble b/who/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/who/PB.project b/who/PB.project
new file mode 100644 (file)
index 0000000..d50d72e
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (who.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, who.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = who; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/who/who.1 b/who/who.1
new file mode 100644 (file)
index 0000000..22ccda5
--- /dev/null
+++ b/who/who.1
@@ -0,0 +1,134 @@
+.\"    $NetBSD: who.1,v 1.9 1997/10/20 03:20:28 lukem Exp $
+.\"
+.\" Copyright (c) 1986, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)who.1      8.2 (Berkeley) 12/30/93
+.\"
+.Dd December 6, 1994
+.Dt WHO 1
+.Os
+.Sh NAME
+.Nm who
+.Nd display who is logged in
+.Sh SYNOPSIS
+.Nm
+.Op Fl mTuH
+.Op Ar file 
+.Nm ""
+.Ar am i
+.Sh DESCRIPTION
+The 
+.Nm
+utility displays a list of all users currently logged on, showing for
+each user the login name, tty name, the date and time of login, and
+hostname if not local.
+.Pp
+Available options:
+.Pp
+.Bl -tag -width file
+.It Fl m
+Only print information about the current terminal.  This is the
+.Tn POSIX
+way of saying
+.Nm
+.Ar am i .
+.It Fl T
+Print a character after the user name indicating the state of the
+terminal line:
+.Sq + 
+if the terminal is writable;
+.Sq - 
+if it is not;
+and
+.Sq ?
+if a bad line is encountered.
+.It Fl u
+Print the idle time for each user.
+.It Fl H
+Write column headings above the regular output.
+.It Ar \&am I
+Returns the invoker's real user name. 
+.It Ar file
+By default,
+.Nm
+gathers information from the file
+.Pa /var/run/utmp .
+An alternative
+.Ar file
+may be specified which is usually
+.Pa /var/log/wtmp
+(or
+.Pa /var/log/wtmp.[0-6]
+depending on site policy as
+.Pa wtmp
+can grow quite large and daily versions may or may not
+be kept around after compression by
+.Xr ac 8 ) .
+The
+.Pa wtmp
+file contains a record of every login, logout,
+crash, shutdown and date change
+since
+.Pa wtmp
+was last truncated or
+created.
+.El
+.Pp
+If
+.Pa /var/log/wtmp
+is being used as the file, the user name may be empty
+or one of the special characters '|', '}' and '~'.  Logouts produce
+an output line without any user name.  For more information on the
+special characters, see
+.Xr utmp 5 .
+.Sh FILES
+.Bl -tag -width /var/log/wtmp.[0-6] -compact
+.It Pa /var/run/utmp
+.It Pa /var/log/wtmp
+.It Pa /var/log/wtmp.[0-6]
+.El
+.Sh SEE ALSO
+.Xr last 1 ,
+.Xr mesg 1 ,
+.Xr users 1 ,
+.Xr getuid 2 ,
+.Xr utmp 5
+.Sh STANDARDS
+The
+.Nm
+utility is expected to conform to
+.St -p1003.2-92 .
+.Sh HISTORY
+A
+.Nm
+utility appeared in
+.At v6 .
diff --git a/who/who.c b/who/who.c
new file mode 100644 (file)
index 0000000..f045888
--- /dev/null
+++ b/who/who.c
@@ -0,0 +1,273 @@
+/*     $NetBSD: who.c,v 1.6 1997/10/20 03:20:29 lukem Exp $    */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Michael Fischbein.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT(
+"@(#) Copyright (c) 1989, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)who.c      8.1 (Berkeley) 6/6/93";
+#endif
+__RCSID("$NetBSD: who.c,v 1.6 1997/10/20 03:20:29 lukem Exp $");
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <err.h>
+#include <locale.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <utmp.h>
+
+void output __P((struct utmp *));
+void output_labels __P((void));
+void who_am_i __P((FILE *));
+FILE *file __P((char *));
+void usage __P((void));
+
+int show_term;                 /* show term state */
+int show_idle;                 /* show idle time */
+
+int main __P((int, char **));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       struct utmp usr;
+       FILE *ufp;
+       int c, only_current_term, show_labels;
+
+       setlocale(LC_ALL, "");
+
+       only_current_term = show_term = show_idle = show_labels = 0;
+       while ((c = getopt(argc, argv, "mTuH")) != -1) {
+               switch (c) {
+               case 'm':
+                       only_current_term = 1;
+                       break;
+               case 'T':
+                       show_term = 1;
+                       break;
+               case 'u':
+                       show_idle = 1;
+                       break;
+               case 'H':
+                       show_labels = 1;
+                       break;
+               default:
+                       usage();
+                       /* NOTREACHED */
+               }
+       }
+       argc -= optind;
+       argv += optind;
+
+       if (chdir("/dev")) {
+               err(1, "cannot change directory to /dev");
+               /* NOTREACHED */
+       }
+
+       if (show_labels)
+               output_labels();
+
+       switch (argc) {
+       case 0:                                 /* who */
+               ufp = file(_PATH_UTMP);
+
+               if (only_current_term) {
+                       who_am_i(ufp);
+               } else {
+                       /* only entries with both name and line fields */
+                       while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1)
+                               if (*usr.ut_name && *usr.ut_line)
+                                       output(&usr);
+               }
+               break;
+       case 1:                                 /* who utmp_file */
+               ufp = file(*argv);
+
+               if (only_current_term) {
+                       who_am_i(ufp);
+               } else {
+                       /* all entries */
+                       while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1)
+                               output(&usr);
+               }
+               break;
+       case 2:                                 /* who am i */
+               ufp = file(_PATH_UTMP);
+               who_am_i(ufp);
+               break;
+       default:
+               usage();
+               /* NOTREACHED */
+       }
+       exit(0);
+}
+
+void
+who_am_i(ufp)
+       FILE *ufp;
+{
+       struct utmp usr;
+       struct passwd *pw;
+       char *p;
+       char *t;
+
+       /* search through the utmp and find an entry for this tty */
+       if ((p = ttyname(0)) != NULL) {
+               /* strip any directory component */
+               if ((t = strrchr(p, '/')) != NULL)
+                       p = t + 1;
+               while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1)
+                       if (usr.ut_name && !strcmp(usr.ut_line, p)) {
+                               output(&usr);
+                               return;
+                       }
+               /* well, at least we know what the tty is */
+               (void)strncpy(usr.ut_line, p, UT_LINESIZE);
+       } else
+               (void)strcpy(usr.ut_line, "tty??");
+
+       pw = getpwuid(getuid());
+       (void)strncpy(usr.ut_name, pw ? pw->pw_name : "?", UT_NAMESIZE);
+       (void)time(&usr.ut_time);
+       *usr.ut_host = '\0';
+       output(&usr);
+}
+
+void
+output(up)
+       struct utmp *up;
+{
+       struct stat sb;
+       char line[sizeof (up->ut_line) + 1];
+       char state;
+       static time_t now = 0;
+       time_t idle;
+
+       state = '?';
+       idle = 0;
+
+       if (show_term || show_idle) {
+               if (now == 0)
+                       time(&now);
+               
+               strncpy(line, up->ut_line, sizeof (up->ut_line));
+               line[sizeof (up->ut_line)] = '\0';
+
+               if (stat(line, &sb) == 0) {
+                       state = (sb.st_mode & 020) ? '+' : '-';
+                       idle = now - sb.st_atime;
+               }
+               
+       }
+
+       (void)printf("%-*.*s ", UT_NAMESIZE, UT_NAMESIZE, up->ut_name);
+
+       if (show_term) {
+               (void)printf("%c ", state);
+       }
+
+       (void)printf("%-*.*s ", UT_LINESIZE, UT_LINESIZE, up->ut_line);
+       (void)printf("%.12s ", ctime(&up->ut_time) + 4);
+
+       if (show_idle) {
+               if (idle < 60) 
+                       (void)printf("  .   ");
+               else if (idle < (24 * 60 * 60))
+                       (void)printf("%02ld:%02ld ", 
+                                    (long)(idle / (60 * 60)),
+                                    (long)(idle % (60 * 60)) / 60);
+               else
+                       (void)printf(" old  ");
+       }
+       
+       if (*up->ut_host)
+               printf("\t(%.*s)", UT_HOSTSIZE, up->ut_host);
+       (void)putchar('\n');
+}
+
+void
+output_labels()
+{
+       (void)printf("%-*.*s ", UT_NAMESIZE, UT_NAMESIZE, "USER");
+
+       if (show_term)
+               (void)printf("S ");
+       
+       (void)printf("%-*.*s ", UT_LINESIZE, UT_LINESIZE, "LINE");
+       (void)printf("WHEN         ");
+
+       if (show_idle)
+               (void)printf("IDLE  ");
+       
+       (void)printf("\t%.*s", UT_HOSTSIZE, "FROM");
+
+       (void)putchar('\n');
+}
+
+FILE *
+file(name)
+       char *name;
+{
+       FILE *ufp;
+
+       if (!(ufp = fopen(name, "r"))) {
+               err(1, "%s", name);
+               /* NOTREACHED */
+       }
+       return (ufp);
+}
+
+void
+usage()
+{
+       (void)fprintf(stderr, "usage: who [-mTuH] [ file ]\n       who am i\n");
+       exit(1);
+}
diff --git a/window/Makefile b/window/Makefile
new file mode 100644 (file)
index 0000000..674ab40
--- /dev/null
@@ -0,0 +1,66 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = window
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+HFILES = alias.h char.h context.h defs.h lcmd.h local.h parser.h\
+         token.h tt.h value.h var.h ww.h xx.h window_string.h
+
+CFILES = char.c cmd.c cmd1.c cmd2.c cmd3.c cmd4.c cmd5.c cmd6.c\
+         cmd7.c compress.c context.c error.c lcmd.c lcmd1.c lcmd2.c\
+         main.c mloop.c parser1.c parser2.c parser3.c parser4.c\
+         parser5.c scanner.c startup.c string.c ttf100.c ttgeneric.c\
+         tth19.c tth29.c ttinit.c ttoutput.c tttermcap.c tttvi925.c\
+         ttwyse60.c ttwyse75.c ttzapple.c ttzentec.c var.c win.c\
+         wwadd.c wwalloc.c wwbox.c wwchild.c wwclose.c wwclreol.c\
+         wwclreos.c wwcursor.c wwdata.c wwdelchar.c wwdelete.c\
+         wwdelline.c wwdump.c wwend.c wwenviron.c wwerror.c wwflush.c\
+         wwframe.c wwgets.c wwinit.c wwinschar.c wwinsline.c\
+         wwiomux.c wwlabel.c wwmisc.c wwmove.c wwopen.c wwprintf.c\
+         wwpty.c wwputc.c wwputs.c wwredraw.c wwredrawwin.c wwrint.c\
+         wwscroll.c wwsize.c wwspawn.c wwsuspend.c wwterminfo.c\
+         wwtty.c wwunframe.c wwupdate.c wwwrite.c xx.c xxflush.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble README\
+            window.1 windowrc
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+NEXTSTEP_PB_CFLAGS = -Wno-error
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/window/Makefile.postamble b/window/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/window/Makefile.preamble b/window/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/window/PB.project b/window/PB.project
new file mode 100644 (file)
index 0000000..b18adac
--- /dev/null
@@ -0,0 +1,131 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (
+            alias.h, 
+            char.h, 
+            context.h, 
+            defs.h, 
+            lcmd.h, 
+            local.h, 
+            parser.h, 
+            token.h, 
+            tt.h, 
+            value.h, 
+            var.h, 
+            ww.h, 
+            xx.h, 
+            window_string.h
+        ); 
+        OTHER_LINKED = (
+            char.c, 
+            cmd.c, 
+            cmd1.c, 
+            cmd2.c, 
+            cmd3.c, 
+            cmd4.c, 
+            cmd5.c, 
+            cmd6.c, 
+            cmd7.c, 
+            compress.c, 
+            context.c, 
+            error.c, 
+            lcmd.c, 
+            lcmd1.c, 
+            lcmd2.c, 
+            main.c, 
+            mloop.c, 
+            parser1.c, 
+            parser2.c, 
+            parser3.c, 
+            parser4.c, 
+            parser5.c, 
+            scanner.c, 
+            startup.c, 
+            string.c, 
+            ttf100.c, 
+            ttgeneric.c, 
+            tth19.c, 
+            tth29.c, 
+            ttinit.c, 
+            ttoutput.c, 
+            tttermcap.c, 
+            tttvi925.c, 
+            ttwyse60.c, 
+            ttwyse75.c, 
+            ttzapple.c, 
+            ttzentec.c, 
+            var.c, 
+            win.c, 
+            wwadd.c, 
+            wwalloc.c, 
+            wwbox.c, 
+            wwchild.c, 
+            wwclose.c, 
+            wwclreol.c, 
+            wwclreos.c, 
+            wwcursor.c, 
+            wwdata.c, 
+            wwdelchar.c, 
+            wwdelete.c, 
+            wwdelline.c, 
+            wwdump.c, 
+            wwend.c, 
+            wwenviron.c, 
+            wwerror.c, 
+            wwflush.c, 
+            wwframe.c, 
+            wwgets.c, 
+            wwinit.c, 
+            wwinschar.c, 
+            wwinsline.c, 
+            wwiomux.c, 
+            wwlabel.c, 
+            wwmisc.c, 
+            wwmove.c, 
+            wwopen.c, 
+            wwprintf.c, 
+            wwpty.c, 
+            wwputc.c, 
+            wwputs.c, 
+            wwredraw.c, 
+            wwredrawwin.c, 
+            wwrint.c, 
+            wwscroll.c, 
+            wwsize.c, 
+            wwspawn.c, 
+            wwsuspend.c, 
+            wwterminfo.c, 
+            wwtty.c, 
+            wwunframe.c, 
+            wwupdate.c, 
+            wwwrite.c, 
+            xx.c, 
+            xxflush.c
+        ); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, README, window.1, windowrc); 
+        PRECOMPILED_HEADERS = (); 
+        PROJECT_HEADERS = (); 
+        PUBLIC_HEADERS = (); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_COMPILEROPTIONS = "-Wno-error"; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = window; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/window/README b/window/README
new file mode 100644 (file)
index 0000000..42d45b3
--- /dev/null
@@ -0,0 +1,199 @@
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ *  Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)README      8.1 (Berkeley) 6/6/93
+ */
+
+Compilation notes:
+
+     Compiler options:
+
+       BYTE_ORDER (used only in ww.h)
+               It should already be defined in machine/endian.h.
+               The code knows about BIG_ENDIAN, LITTLE_ENDIAN, and PDP_ENDIAN.
+               It only cares about byte order in words, so PDP_ENDIAN
+               is the same as LITTLE_ENDIAN.
+       OLD_TTY
+               If you don't have Posix termios, then define this.
+       VMIN_BUG
+               Even if you have Posix termios, define this if the MIN and TIME
+               feature in noncanonical mode doesn't work correctly.
+
+     Ok, there's another one, STR_DEBUG.  It turns on consistency checks
+     in the string allocator.  It's been left on since performace doesn't
+     seem to suffer.  There's an abort() somewhere when an inconsistency
+     is found.  It hasn't happened in years.
+
+     The file local.h contains locally tunable constants.
+
+     The makefile used to be updated with mkmf; it has been changed
+at various times to use cpp -M and, currently, mkdep.  The only library
+it needs is termcap.
+
+     Window, as is, only runs on 4.3 (or later) machines.
+
+     On 4.2 machines, at least these modifications must be done:
+
+       delete uses of window size ioctls: TIOCGWINSZ, TIOCSWINSZ,
+               struct winsize
+       add to ww.h
+               typedef int fd_set;
+               #define FD_ZERO(s) (*(s) = 0)
+               #define FD_SET(b, s) (*(s) |= 1 << (b))
+               #define FD_ISSET(b, s) (*(s) & 1 << (b))
+       add to ww.h
+               #define sigmask(s) (1 << (s) - 1)
+
+
+A few notes about the internals:
+
+     The window package.  Windows are opened by calling wwopen().
+Wwwrite() is the primitive for writing to windows.  Wwputc(), wwputs(),
+and wwprintf() are also supported.  Some of the outputs to windows are
+delayed.  Wwupdate() updates the terminal to match the internal screen
+buffer.  Wwspawn() spawns a child process on the other end of a window,
+with its environment tailored to the window.  Visible windows are
+doubly linked in the order of their overlap.  Wwadd() inserts a window
+into the list at a given place.  Wwdelete() deletes it.  Windows not in
+the list are not visible, though wwwrite() still works.  Window was
+written before the days of X and Sunview, so some of the terminology
+is not standard.
+
+     Most functions return -1 on error.  Wwopen() returns the null
+pointer.  An error number is saved in wwerrno.  Wwerror() returns an
+error string based on wwerrno suitable for printing.
+
+     The terminal drivers perform all output to the physical terminal,
+including special functions like character and line insertion and
+deletion.  The window package keeps a list of known terminals.  At
+initialization time, the terminal type is matched against the list to
+find the right terminal driver to use.  The last driver, the generic
+driver, matches all terminals and uses the termcap database.  The
+interface between the window package the terminal driver is the `tt'
+structure.  It contains pointers to functions to perform special
+functions and terminal output, as well as flags about the
+characteristics of the terminal.  Most of these ideas are borrowed
+from the Maryland window package, which in turn is based on Goslin's
+Emacs.
+
+     The IO system is semi-synchronous.  Terminal input is signal
+driven, and everything else is done synchronously with a single
+select().  It is roughly event-driven, though not in a clean way.
+
+     Normally, in both conversation mode and command mode, window
+sleeps in a select() in wwiomux() waiting for data from the
+pseudo-terminals.  At the same time, terminal input causes SIGIO which
+is caught by wwrint().  The select() returns when at least one of the
+pseudo-terminals becomes ready for reading.
+
+     Wwrint() is the interrupt handler for tty input.  It reads input
+into a linear buffer accessed through four pointers:
+
+       +-------+--------------+----------------+
+       | empty |    data      |   empty        |
+       +-------+--------------+----------------+
+       ^       ^               ^                ^
+       |       |               |                |
+       wwib    wwibp          wwibq            wwibe
+
+Wwrint() appends characters at the end and increments wwibq (*wwibq++
+= c), and characters are taken off the buffer at wwibp using the
+wwgetc() and wwpeekc() macros.  As is the convention in C, wwibq
+and wwibe point to one position beyond the end.  In addition,
+wwrint() will do a longjmp(wwjmpbuf) if wwsetjmp is true.  This is
+used by wwiomux() to interrupt the select() which would otherwise
+resume after the interrupt.  (Actually, I hear this is not true,
+but the longjmp feature is used to avoid a race condition as well.
+Anyway, it means I didn't have to depend on a feature in a
+daily-changing kernel, but that's another story.) The macro
+wwinterrupt() returns true if the input buffer is non-empty.
+Wwupdate(), wwwrite(), and wwiomux() check this condition and will
+return at the first convenient opportunity when it becomes true.
+In the case of wwwrite(), the flag ww_nointr in the window structure
+overrides this.  This feature allows the user to interrupt lengthy
+outputs safely.  The structure of the input buffer is designed to
+avoid race conditions without blocking interrupts.
+
+     Actually, wwsetjmp and wwinterrupt() are part of a software
+interrupt scheme used by the two interrupt catchers wwrint() and
+wwchild().  Asserting the interrupt lets the synchronous parts of
+the program know that there's an interesting asynchronous condition
+(i.e., got a keyboard character, or a child process died) that they
+might want to process before anything else.  The synchronous routines
+can check for this condition with wwinterrupt() or by arranging
+that a longjmp() be done.
+
+     Wwiomux() copies pseudo-terminal output into their corresponding
+windows.  Without anything to do, it blocks in a select(), waiting for
+read ready on pseudo-terminals.  Reads are done into per-window buffers
+in the window structures.  When there is at least one buffer non-empty,
+wwiomux() finds the top most of these windows and writes it using
+wwwrite().  Then the process is repeated.  A non-blocking select() is
+done after a wwwrite() to pick up any output that may have come in
+during the write, which may take a long time.  Specifically, we use
+this to stop output or flush buffer when a pseudo-terminal tells us to
+(we use pty packet mode).  The select() blocks only when all of the
+windows' buffers are empty.  A wwupdate() is done prior to this, which
+is the only time the screen is guaranteed to be completely up to date.
+Wwiomux() loops until wwinterrupt() becomes true.
+
+     The top level routine for all this is mloop().  In conversation
+mode, it simply calls wwiomux(), which only returns when input is
+available.  The input buffer is then written to the pseudo-terminal of
+the current window.  If the escape character is found in the input,
+command mode is entered.  Otherwise, the process is repeated.  In
+command mode, control is transferred to docmd() which returns only when
+conversation mode is reentered.  Docmd() and other command processing
+routines typically wait for input in a loop:
+
+       while (wwpeekc() < 0)
+               wwiomux();
+
+When the loop terminates, wwgetc() is used to read the input buffer.
+
+     Output to the physical terminal is handled by the lowest level
+routines of the window package, in the files ttoutput.c and tt.h.  The
+standard IO package is not used, to get better control over buffering
+and to use non-blocking reads in wwrint().  The buffer size is set to
+approximately one second of output time, based on the baudrate.
+
+     The result of all this complexity is faster response time,
+especially in output stopping and flushing.  Wwwrite() checks
+wwinterrupt() after every line.  It also calls wwupdate() for each line
+it writes.  The output buffer is limited to one second of output time.
+Thus, there is usually only a delay of one to two lines plus one second
+after a ^C or ^S.  Also, commands that produce lengthy output can be
+aborted without actually showing all of it on the terminal.  (Try the
+'?' command followed by escape immediately.)
diff --git a/window/alias.h b/window/alias.h
new file mode 100644 (file)
index 0000000..00928a2
--- /dev/null
@@ -0,0 +1,58 @@
+/*     $NetBSD: alias.h,v 1.3 1995/09/28 10:33:59 tls Exp $    */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)alias.h     8.1 (Berkeley) 6/6/93
+ */
+
+#ifndef EXTERN
+#define EXTERN extern
+#endif
+
+#define alias var
+#define a_name r_name
+#define a_buf r_val.v_str
+#define a_flags r_val.v_type
+
+       /* a_flags bits, must not interfere with v_type values */
+#define A_INUSE                0x010   /* already inuse */
+
+#define alias_set(n, s)                var_setstr1(&alias_head, n, s)
+#define alias_walk(f, a)       var_walk1(alias_head, f, a)
+#define alias_unset(n)         var_unset1(&alias_head, n)
+#define alias_lookup(n)                (*var_lookup1(&alias_head, n))
+
+EXTERN struct var *alias_head;
diff --git a/window/char.c b/window/char.c
new file mode 100644 (file)
index 0000000..c7a43a3
--- /dev/null
@@ -0,0 +1,157 @@
+/*     $NetBSD: char.c,v 1.4 1997/11/21 08:35:43 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)char.c     8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: char.c,v 1.4 1997/11/21 08:35:43 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "char.h"
+
+char _cmap[] = {
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,  /* ^@ - ^C */
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,  /* ^D - ^G */
+       _C,             _C|_P,          _C,             _C|_U,  /* ^H - ^K */
+       _C|_U,          _C,             _C|_U,          _C|_U,  /* ^L - ^O */
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,  /* ^P - ^S */
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,  /* ^T - ^W */
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,  /* ^U - ^[ */
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,  /* ^\ - ^_ */
+
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _P|_U,
+       _P|_U,          _P|_U,          _P|_U,          _C|_U,
+
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U,
+       _C|_U,          _C|_U,          _C|_U,          _C|_U
+};
+
+char *_unctrl[] = {
+       "^@",   "^A",   "^B",   "^C",   "^D",   "^E",   "^F",   "^G",
+       "^H",   "^I",   "^J",   "^K",   "^L",   "^M",   "^N",   "^O",
+       "^P",   "^Q",   "^R",   "^S",   "^T",   "^U",   "^V",   "^W",
+       "^X",   "^Y",   "^Z",   "^[",   "^\\",  "^]",   "^^",   "^_",
+       " ",    "!",    "\"",   "#",    "$",    "%",    "&",    "'",
+       "(",    ")",    "*",    "+",    ",",    "-",    ".",    "/",
+       "0",    "1",    "2",    "3",    "4",    "5",    "6",    "7",
+       "8",    "9",    ":",    ";",    "<",    "=",    ">",    "?",
+       "@",    "A",    "B",    "C",    "D",    "E",    "F",    "G",
+       "H",    "I",    "J",    "K",    "L",    "M",    "N",    "O",
+       "P",    "Q",    "R",    "S",    "T",    "U",    "V",    "W",
+       "X",    "Y",    "Z",    "[",    "\\",   "]",    "^",    "_",
+       "`",    "a",    "b",    "c",    "d",    "e",    "f",    "g",
+       "h",    "i",    "j",    "k",    "l",    "m",    "n",    "o",
+       "p",    "q",    "r",    "s",    "t",    "u",    "v",    "w",
+       "x",    "y",    "z",    "{",    "|",    "}",    "~",    "^?",
+       "\\200","\\201","\\202","\\203","\\204","\\205","\\206","\\207",
+       "\\210","\\211","\\212","\\213","\\214","\\215","\\216","\\217",
+       "\\220","\\221","\\222","\\223","\\224","\\225","\\226","\\227",
+       "\\230","\\231","\\232","\\233","\\234","\\235","\\236","\\237",
+       "\\240","\\241","\\242","\\243","\\244","\\245","\\246","\\247",
+       "\\250","\\251","\\252","\\253","\\254","\\255","\\256","\\257",
+       "\\260","\\261","\\262","\\263","\\264","\\265","\\266","\\267",
+       "\\270","\\271","\\272","\\273","\\274","\\275","\\276","\\277",
+       "\\300","\\301","\\302","\\303","\\304","\\305","\\306","\\307",
+       "\\310","\\311","\\312","\\313","\\314","\\315","\\316","\\317",
+       "\\320","\\321","\\322","\\323","\\324","\\325","\\326","\\327",
+       "\\330","\\331","\\332","\\333","\\334","\\335","\\336","\\337",
+       "\\340","\\341","\\342","\\343","\\344","\\345","\\346","\\347",
+       "\\350","\\351","\\352","\\353","\\354","\\355","\\356","\\357",
+       "\\360","\\361","\\362","\\363","\\364","\\365","\\366","\\367",
+       "\\370","\\371","\\372","\\373","\\374","\\375","\\376","\\377"
+};
diff --git a/window/char.h b/window/char.h
new file mode 100644 (file)
index 0000000..28c1fc5
--- /dev/null
@@ -0,0 +1,66 @@
+/*     $NetBSD: char.h,v 1.3 1995/09/28 10:34:01 tls Exp $     */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)char.h      8.1 (Berkeley) 6/6/93
+ */
+
+/*
+ * Macros and things to deal with control characters.
+ *
+ * Unctrl() is just like the standard function, except we don't want
+ * to include curses.
+ * Isctrl() returns true for all characters less than space and
+ * greater than or equal to delete.
+ * Isprt() is tab and all characters not isctrl().  It's used
+ * by wwwrite().
+ * Isunctrl() includes all characters that should be expanded
+ * using unctrl() by wwwrite() if ww_unctrl is set.
+ */
+
+extern char *_unctrl[];
+extern char _cmap[];
+#define ctrl(c)                (c & 0x1f)
+#ifdef __APPLE__
+#undef unctrl
+#endif
+#define unctrl(c)      (_unctrl[(unsigned char) (c)])
+#define _C             0x01
+#define _P             0x02
+#define _U             0x04
+#define isctrl(c)      (_cmap[(unsigned char) (c)] & _C)
+#define isprt(c)       (_cmap[(unsigned char) (c)] & _P)
+#define isunctrl(c)    (_cmap[(unsigned char) (c)] & _U)
diff --git a/window/cmd.c b/window/cmd.c
new file mode 100644 (file)
index 0000000..d0b1bb9
--- /dev/null
@@ -0,0 +1,316 @@
+/*     $NetBSD: cmd.c,v 1.6 1998/08/25 20:59:42 ross Exp $     */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cmd.c      8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: cmd.c,v 1.6 1998/08/25 20:59:42 ross Exp $");
+#endif
+#endif /* not lint */
+
+#include <unistd.h>
+#include "defs.h"
+#include "char.h"
+
+int    checkproc __P((struct ww *));
+
+void
+docmd()
+{
+       int c;
+       struct ww *w;
+       char out = 0;
+
+       while (!out && !quit) {
+               if ((c = wwgetc()) < 0) {
+                       if (terse)
+                               wwsetcursor(0, 0);
+                       else {
+                               wwputs("Command: ", cmdwin);
+                               wwcurtowin(cmdwin);
+                       }
+                       do
+                               wwiomux();
+                       while ((c = wwgetc()) < 0);
+               }
+               if (!terse)
+                       wwputc('\n', cmdwin);
+               switch (c) {
+               default:
+                       if (c != escapec)
+                               break;
+               case 'h': case 'j': case 'k': case 'l':
+               case 'y': case 'p':
+               case ctrl('y'):
+               case ctrl('e'):
+               case ctrl('u'):
+               case ctrl('d'):
+               case ctrl('b'):
+               case ctrl('f'):
+               case ctrl('s'):
+               case ctrl('q'):
+               case ctrl('['):
+                       if (selwin == 0) {
+                               error("No window.");
+                               continue;
+                       }
+               }
+               switch (c) {
+               case '1': case '2': case '3': case '4': case '5':
+               case '6': case '7': case '8': case '9':
+                       if ((w = window[c - '1']) == 0) {
+                               error("%c: No such window.", c);
+                               break;
+                       }
+                       setselwin(w);
+                       if (checkproc(selwin) >= 0)
+                                out = 1;
+                       break;
+               case '%':
+                       if ((w = getwin()) != 0)
+                               setselwin(w);
+                       break;
+               case ctrl('^'):
+                       if (lastselwin != 0) {
+                               setselwin(lastselwin);
+                               if (checkproc(selwin) >= 0)
+                                       out = 1;
+                       } else
+                               error("No previous window.");
+                       break;
+               case 'c':
+                       if ((w = getwin()) != 0)
+                               closewin(w);
+                       break;
+               case 'w':
+                       c_window();
+                       break;
+               case 'm':
+                       if ((w = getwin()) != 0)
+                               c_move(w);
+                       break;
+               case 'M':
+                       if ((w = getwin()) != 0)
+                               movewin(w, w->ww_alt.t, w->ww_alt.l);
+                       break;
+               case 's':
+                       if ((w = getwin()) != 0)
+                               c_size(w);
+                       break;
+               case 'S':
+                       if ((w = getwin()) != 0)
+                               sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
+                       break;
+               case 'y':
+                       c_yank();
+                       break;
+               case 'p':
+                       c_put();
+                       break;
+               case ':':
+                       c_colon();
+                       break;
+               case 'h':
+                       (void) wwwrite(selwin, "\b", 1);
+                       break;
+               case 'j':
+                       (void) wwwrite(selwin, "\n", 1);
+                       break;
+               case 'k':
+                       (void) wwwrite(selwin, "\033A", 2);
+                       break;
+               case 'l':
+                       (void) wwwrite(selwin, "\033C", 2);
+                       break;
+               case ctrl('e'):
+                       wwscroll(selwin, 1);
+                       break;
+               case ctrl('y'):
+                       wwscroll(selwin, -1);
+                       break;
+               case ctrl('d'):
+                       wwscroll(selwin, selwin->ww_w.nr / 2);
+                       break;
+               case ctrl('u'):
+                       wwscroll(selwin, - selwin->ww_w.nr / 2);
+                       break;
+               case ctrl('f'):
+                       wwscroll(selwin, selwin->ww_w.nr);
+                       break;
+               case ctrl('b'):
+                       wwscroll(selwin, - selwin->ww_w.nr);
+                       break;
+               case ctrl('s'):
+                       stopwin(selwin);
+                       break;
+               case ctrl('q'):
+                       startwin(selwin);
+                       break;
+               case ctrl('l'):
+                       wwredraw();
+                       break;
+               case '?':
+                       c_help();
+                       break;
+               case ctrl('['):
+                       if (checkproc(selwin) >= 0)
+                               out = 1;
+                       break;
+               case ctrl('z'):
+                       wwsuspend();
+                       break;
+               case 'q':
+                       c_quit();
+                       break;
+               /* debugging stuff */
+               case '&':
+                       if (debug) {
+                               c_debug();
+                               break;
+                       }
+               default:
+                       if (c == escapec) {
+                               if (checkproc(selwin) >= 0) {
+                                       (void) write(selwin->ww_pty,
+                                               &escapec, 1);
+                                       out = 1;
+                               }
+                       } else {
+                               if (!terse)
+                                       wwbell();
+                               error("Type ? for help.");
+                       }
+               }
+       }
+       if (!quit)
+               setcmd(0);
+}
+
+struct ww *
+getwin()
+{
+       int c;
+       struct ww *w = 0;
+
+       if (!terse)
+               wwputs("Which window? ", cmdwin);
+       wwcurtowin(cmdwin);
+       while ((c = wwgetc()) < 0)
+               wwiomux();
+       if (debug && c == 'c')
+               w = cmdwin;
+       else if (debug && c == 'f')
+               w = framewin;
+       else if (debug && c == 'b')
+               w = boxwin;
+       else if (c >= '1' && c < NWINDOW + '1')
+               w = window[c - '1'];
+       else if (c == '+')
+               w = selwin;
+       else if (c == '-')
+               w = lastselwin;
+       if (w == 0)
+               wwbell();
+       if (!terse)
+               wwputc('\n', cmdwin);
+       return w;
+}
+
+int
+checkproc(w)
+       struct ww *w;
+{
+       if (w->ww_state != WWS_HASPROC) {
+               error("No process in window.");
+               return -1;
+       }
+       return 0;
+}
+
+void
+setcmd(new)
+       char new;
+{
+       if (new && !incmd) {
+               if (!terse)
+                       wwadd(cmdwin, &wwhead);
+               if (selwin != 0)
+                       wwcursor(selwin, 1);
+               wwcurwin = 0;
+       } else if (!new && incmd) {
+               if (!terse) {
+                       wwdelete(cmdwin);
+                       reframe();
+               }
+               if (selwin != 0)
+                       wwcursor(selwin, 0);
+               wwcurwin = selwin;
+       }
+       incmd = new;
+}
+
+void
+setterse(new)
+       char new;
+{
+       if (incmd) {
+               if (new && !terse) {
+                       wwdelete(cmdwin);
+                       reframe();
+               } else if (!new && terse)
+                       wwadd(cmdwin, &wwhead);
+       }
+       terse = new;
+}
+
+/*
+ * Set the current window.
+ */
+void
+setselwin(w)
+       struct ww *w;
+{
+       if (selwin == w)
+               return;
+       if (selwin != 0)
+               lastselwin = selwin;
+       if ((selwin = w) != 0)
+               front(selwin, 1);
+}
diff --git a/window/cmd1.c b/window/cmd1.c
new file mode 100644 (file)
index 0000000..f7ed760
--- /dev/null
@@ -0,0 +1,182 @@
+/*     $NetBSD: cmd1.c,v 1.5 1997/11/21 08:35:46 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cmd1.c     8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: cmd1.c,v 1.5 1997/11/21 08:35:46 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+#include "char.h"
+
+void
+c_window()
+{
+       int col, row, xcol, xrow;
+       int id;
+
+       if ((id = findid()) < 0)
+               return;
+       if (!terse)
+               wwputs("New window (upper left corner): ", cmdwin);
+       col = 0;
+       row = 1;
+       wwadd(boxwin, framewin->ww_back);
+       for (;;) {
+               wwbox(boxwin, row - 1, col - 1, 3, 3);
+               wwsetcursor(row, col);
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&row, &col, row > 1, 0,
+                       wwnrow - 1, wwncol - 1)) {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
+                       return;
+               case 2:
+                       wwunbox(boxwin);
+                       break;
+               case 1:
+                       wwunbox(boxwin);
+               case 0:
+                       continue;
+               }
+               break;
+       }
+       if (!terse)
+               wwputs("\nNew window (lower right corner): ", cmdwin);
+       xcol = col;
+       xrow = row;
+       for (;;) {
+               wwbox(boxwin, row - 1, col - 1,
+                       xrow - row + 3, xcol - col + 3);
+               wwsetcursor(xrow, xcol);
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
+               {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
+                       return;
+               case 2:
+                       wwunbox(boxwin);
+                       break;
+               case 1:
+                       wwunbox(boxwin);
+               case 0:
+                       continue;
+               }
+               break;
+       }
+       wwdelete(boxwin);
+       if (!terse)
+               wwputc('\n', cmdwin);
+       wwcurtowin(cmdwin);
+       (void) openwin(id, row, col, xrow-row+1, xcol-col+1, default_nline,
+           (char *) 0, WWT_PTY, WWU_HASFRAME, default_shellfile,
+           default_shell);
+}
+
+int
+getpos(row, col, minrow, mincol, maxrow, maxcol)
+       int *row, *col;
+       int minrow, mincol;
+       int maxrow, maxcol;
+{
+       static int scount;
+       int count;
+       int c;
+       int oldrow = *row, oldcol = *col;
+
+       while ((c = wwgetc()) >= 0) {
+               switch (c) {
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       scount = scount * 10 + c - '0';
+                       continue;
+               }
+               count = scount ? scount : 1;
+               scount = 0;
+               switch (c) {
+               case 'h':
+                       if ((*col -= count) < mincol)
+                               *col = mincol;
+                       break;
+               case 'H':
+                       *col = mincol;
+                       break;
+               case 'l':
+                       if ((*col += count) > maxcol)
+                               *col = maxcol;
+                       break;
+               case 'L':
+                       *col = maxcol;
+                       break;
+               case 'j':
+                       if ((*row += count) > maxrow)
+                               *row = maxrow;
+                       break;
+               case 'J':
+                       *row = maxrow;
+                       break;
+               case 'k':
+                       if ((*row -= count) < minrow)
+                               *row = minrow;
+                       break;
+               case 'K':
+                       *row = minrow;
+                       break;
+               case ctrl('['):
+                       if (!terse)
+                               wwputs("\nCancelled.  ", cmdwin);
+                       return 3;
+               case '\r':
+                       return 2;
+               default:
+                       if (!terse)
+                               wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
+                       wwbell();
+               }
+       }
+       return oldrow != *row || oldcol != *col;
+}
diff --git a/window/cmd2.c b/window/cmd2.c
new file mode 100644 (file)
index 0000000..6cffcfc
--- /dev/null
@@ -0,0 +1,167 @@
+/*     $NetBSD: cmd2.c,v 1.4 1997/11/21 08:35:47 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cmd2.c     8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: cmd2.c,v 1.4 1997/11/21 08:35:47 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+
+char *help_shortcmd[] = {
+       "#       Select window # and return to conversation mode",
+       "%#      Select window # but stay in command mode",
+       "escape  Return to conversation mode without changing window",
+       "^^      Return to conversation mode and change to previous window",
+       "c#      Close window #",
+       "w       Open a new window",
+       "m#      Move window #",
+       "M#      Move window # to its previous position",
+       "s#      Change the size of window #",
+       "S#      Change window # to its previous size",
+       "^Y      Scroll up one line",
+       "^E      Scroll down one line",
+       "^U      Scroll up half a window",
+       "^D      Scroll down half a window",
+       "^B      Scroll up a full window",
+       "^F      Scroll down a full window",
+       "h       Move cursor left",
+       "j       Move cursor down",
+       "k       Move cursor up",
+       "l       Move cursor right",
+       "y       Yank",
+       "p       Put",
+       "^S      Stop output in current window",
+       "^Q      Restart output in current window",
+       "^L      Redraw screen",
+       "^Z      Suspend",
+       "q       Quit",
+       ":       Enter a long command",
+       0
+};
+
+char *help_longcmd[] = {
+       ":alias name string ...  Make `name' an alias for `string ...'",
+       ":alias                  Show all aliases",
+       ":close # ...            Close windows",
+       ":close all              Close all windows",
+       ":cursor modes           Set the cursor modes",
+       ":echo # string ...      Print `string ...' in window #",
+       ":escape c               Set escape character to `c'",
+       ":foreground # flag      Make # a foreground window, if `flag' is true",
+       ":label # string         Set label of window # to `string'",
+       ":list                   List all open windows",
+       ":default_nline lines    Set default window buffer size to `lines'",
+       ":default_shell string ...",
+       "                        Set default shell to `string ...'",
+       ":default_smooth flag    Set default smooth scroll flag",
+       ":select #               Select window #",
+       ":smooth # flag          Set window # to smooth scroll mode",
+       ":source filename        Execute commands in `filename'",
+       ":terse flag             Set terse mode",
+       ":unalias name           Undefine `name' as an alias",
+       ":unset variable         Deallocate `variable'",
+       ":variable               List all variables",
+       ":window [row col nrow ncol nline label pty frame mapnl keepopen smooth shell]",
+       "                        Open a window at `row', `col' of size `nrow', `ncol',",
+       "                        with `nline' lines in the buffer, and `label'",
+       ":write # string ...     Write `string ...' to window # as input",
+       0
+};
+
+int    help_print __P((struct ww *, char *, char **));
+
+void
+c_help()
+{
+       struct ww *w;
+
+       if ((w = openiwin(wwnrow - 3, "Help")) == 0) {
+               error("Can't open help window: %s.", wwerror());
+               return;
+       }
+       wwprintf(w, "The escape character is %c.\n", escapec);
+       wwprintf(w, "(# represents one of the digits from 1 to 9.)\n\n");
+       if (help_print(w, "Short commands", help_shortcmd) >= 0)
+               (void) help_print(w, "Long commands", help_longcmd);
+       closeiwin(w);
+}
+
+int
+help_print(w, name, list)
+       struct ww *w;
+       char *name;
+       char **list;
+{
+       wwprintf(w, "%s:\n\n", name);
+       while (*list)
+               switch (more(w, 0)) {
+               case 0:
+                       wwputs(*list++, w);
+                       wwputc('\n', w);
+                       break;
+               case 1:
+                       wwprintf(w, "%s: (continued)\n\n", name);
+                       break;
+               case 2:
+                       return -1;
+               }
+       return more(w, 1) == 2 ? -1 : 0;
+}
+
+void
+c_quit()
+{
+       char oldterse = terse;
+
+       setterse(0);
+       wwputs("Really quit [yn]? ", cmdwin);
+       wwcurtowin(cmdwin);
+       while (wwpeekc() < 0)
+               wwiomux();
+       if (wwgetc() == 'y') {
+               wwputs("Yes", cmdwin);
+               quit++;
+       } else
+               wwputc('\n', cmdwin);
+       setterse(!quit && oldterse);
+}
diff --git a/window/cmd3.c b/window/cmd3.c
new file mode 100644 (file)
index 0000000..4b229c6
--- /dev/null
@@ -0,0 +1,74 @@
+/*     $NetBSD: cmd3.c,v 1.4 1997/11/21 08:35:49 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cmd3.c     8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: cmd3.c,v 1.4 1997/11/21 08:35:49 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+#include "window_string.h"
+
+void
+setescape(esc)
+       char *esc;
+{
+       if (*esc == '^') {
+               if (esc[1] != 0)
+                       escapec = esc[1] & 0x1f;
+               else
+                       escapec = '^';
+       } else
+               escapec = *esc;
+}
+
+int
+setlabel(w, label)
+       struct ww *w;
+       char *label;
+{
+       if (w->ww_label != 0)
+               str_free(w->ww_label);
+       if ((w->ww_label = str_cpy(label)) == 0)
+               return -1;
+       return 0;
+}
diff --git a/window/cmd4.c b/window/cmd4.c
new file mode 100644 (file)
index 0000000..b356599
--- /dev/null
@@ -0,0 +1,64 @@
+/*     $NetBSD: cmd4.c,v 1.4 1997/11/21 08:35:50 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cmd4.c     8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: cmd4.c,v 1.4 1997/11/21 08:35:50 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+
+void
+c_colon()
+{
+       char oldterse = terse;
+       char buf[512];
+
+       setterse(0);
+       wwputc(':', cmdwin);
+       wwgets(buf, wwncol - 3, cmdwin);
+       wwputc('\n', cmdwin);
+       wwcurtowin(cmdwin);
+       setterse(oldterse);
+       if (dolongcmd(buf, (struct value *)0, 0) < 0)
+               error("Out of memory.");
+}
diff --git a/window/cmd5.c b/window/cmd5.c
new file mode 100644 (file)
index 0000000..13f8b6e
--- /dev/null
@@ -0,0 +1,142 @@
+/*     $NetBSD: cmd5.c,v 1.5 1998/07/09 18:34:39 msaitoh Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cmd5.c     8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: cmd5.c,v 1.5 1998/07/09 18:34:39 msaitoh Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+
+/*
+ * Window movement.
+ */
+
+void   getminmax __P((int, int, int, int, int *, int *, int *));
+
+void
+c_move(w)
+       struct ww *w;
+{
+       int col, row;
+       int mincol, minrow;
+       int maxcol, maxrow;
+       int curcol, currow;
+
+       if (!terse)
+               wwputs("New window position: ", cmdwin);
+       col = w->ww_w.l;
+       row = w->ww_w.t;
+       wwadd(boxwin, framewin->ww_back);
+       for (;;) {
+               wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2);
+               getminmax(row, w->ww_w.nr, 1, wwnrow,
+                       &currow, &minrow, &maxrow);
+               getminmax(col, w->ww_w.nc, 0, wwncol,
+                       &curcol, &mincol, &maxcol);
+               wwsetcursor(currow, curcol);
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
+                       return;
+               case 2:
+                       wwunbox(boxwin);
+                       break;
+               case 1:
+                       wwunbox(boxwin);
+               case 0:
+                       continue;
+               }
+               break;
+       }
+       wwdelete(boxwin);
+       if (!terse)
+               wwputc('\n', cmdwin);
+       wwcurtowin(cmdwin);
+       movewin(w, row, col);
+}
+
+void
+movewin(w, row, col)
+       struct ww *w;
+       int row, col;
+{
+       struct ww *back = w->ww_back;
+
+       w->ww_alt.t = w->ww_w.t;
+       w->ww_alt.l = w->ww_w.l;
+       wwdelete(w);
+       wwmove(w, row, col);
+       wwadd(w, back);
+       reframe();
+}
+
+/*
+ * Weird stufff, don't ask.
+ */
+void
+getminmax(x, n, a, b, curx, minx, maxx)
+       int x, n, a, b;
+       int *curx, *minx, *maxx;
+{
+       if (x < 0)
+               *curx = x + n - 1;
+       else
+               *curx = x;
+
+       if (x <= a)
+               *minx = 1 - n;
+       else if (x <= b - n)
+               *minx = a;
+       else
+               *minx = b - n;
+
+       if (x >= b - n)
+               *maxx = b - 1;
+       else if (x >= a)
+               *maxx = b - n;
+       else
+               *maxx = a;
+}
diff --git a/window/cmd6.c b/window/cmd6.c
new file mode 100644 (file)
index 0000000..dce3343
--- /dev/null
@@ -0,0 +1,119 @@
+/*     $NetBSD: cmd6.c,v 1.4 1997/11/21 08:35:53 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cmd6.c     8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: cmd6.c,v 1.4 1997/11/21 08:35:53 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+#include "window_string.h"
+#include "char.h"
+
+/*
+ * Debugging commands.
+ */
+
+void   debug_str __P((void));
+
+void
+c_debug()
+{
+       struct ww *w;
+
+       if (!terse)
+               wwputs("[m(smap) n(ns) o(os) s(string) v(nvis) w(win)]? ",
+                   cmdwin);
+       wwcurtowin(cmdwin);
+       while (wwpeekc() < 0)
+               wwiomux();
+       if (!terse)
+               wwputc('\n', cmdwin);
+       switch (wwgetc()) {
+       case 'm':
+               wwdumpsmap();
+               break;
+       case 'n':
+               wwdumpns();
+               break;
+       case 'o':
+               wwdumpos();
+               break;
+       case 's':
+               debug_str();
+               break;
+       case 'v':
+               if ((w = getwin()) != 0)
+                       wwdumpnvis(w);
+               break;
+       case 'w':
+               if ((w = getwin()) != 0)
+                       wwdumpwin(w);
+               break;
+       default:
+               wwbell();
+       }
+}
+
+void
+debug_str()
+{
+#ifdef STR_DEBUG
+       struct ww *w;
+       struct string *s;
+
+       if ((w = openiwin(wwnrow - 3, "Allocated Strings")) == 0) {
+               error("Can't open string window: %s.", wwerror());
+               return;
+       }
+       for (s = str_head.s_forw; s != &str_head; s = s->s_forw) {
+               if (more(w, 0) == 2)
+                       goto out;
+               wwprintf(w, "(0x%x)\t\"%s\"\n", s->s_data, s->s_data);
+       }
+       waitnl(w);
+out:
+       closeiwin(w);
+#else
+       error("No string debugging.");
+#endif
+}
diff --git a/window/cmd7.c b/window/cmd7.c
new file mode 100644 (file)
index 0000000..5d17623
--- /dev/null
@@ -0,0 +1,294 @@
+/*     $NetBSD: cmd7.c,v 1.4 1997/11/21 08:35:54 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cmd7.c     8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: cmd7.c,v 1.4 1997/11/21 08:35:54 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include "defs.h"
+#include "window_string.h"
+
+void   unyank __P((void));
+void   yank_highlight __P((int, int, int, int));
+void   yank_highlight_line __P((int, int, int));
+void   yank_line __P((int, int, int));
+
+/*
+ * Window size.
+ */
+void
+c_size(w)
+       struct ww *w;
+{
+       int col, row;
+
+       if (!terse)
+               wwputs("New window size (lower right corner): ", cmdwin);
+       col = MIN(w->ww_w.r, wwncol) - 1;
+       row = MIN(w->ww_w.b, wwnrow) - 1;
+       wwadd(boxwin, framewin->ww_back);
+       for (;;) {
+               wwbox(boxwin, w->ww_w.t - 1, w->ww_w.l - 1,
+                       row - w->ww_w.t + 3, col - w->ww_w.l + 3);
+               wwsetcursor(row, col);
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&row, &col, w->ww_w.t, w->ww_w.l,
+                       wwnrow - 1, wwncol - 1)) {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
+                       return;
+               case 2:
+                       wwunbox(boxwin);
+                       break;
+               case 1:
+                       wwunbox(boxwin);
+               case 0:
+                       continue;
+               }
+               break;
+       }
+       wwdelete(boxwin);
+       if (!terse)
+               wwputc('\n', cmdwin);
+       wwcurtowin(cmdwin);
+       sizewin(w, row - w->ww_w.t + 1, col - w->ww_w.l + 1);
+}
+
+/*
+ * Yank and put
+ */
+
+struct yb {
+       char *line;
+       int length;
+       struct yb *link;
+};
+struct yb *yb_head, *yb_tail;
+
+void
+c_yank()
+{
+       struct ww *w = selwin;
+       int col1, row1;
+       int col2, row2;
+       int r, c;
+
+       if (!terse)
+               wwputs("Yank starting position: ", cmdwin);
+       wwcursor(w, 0);
+       row1 = w->ww_cur.r;
+       col1 = w->ww_cur.c;
+       for (;;) {
+               wwsetcursor(row1, col1);
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&row1, &col1, w->ww_i.t, w->ww_i.l,
+                              w->ww_i.b - 1, w->ww_i.r - 1)) {
+               case 3:
+                       goto out;
+               case 2:
+                       break;
+               case 1:
+               case 0:
+                       continue;
+               }
+               break;
+       }
+       if (!terse)
+               wwputs("\nYank ending position: ", cmdwin);
+       row2 = row1;
+       col2 = col1;
+       for (;;) {
+               wwsetcursor(row2, col2);
+               while (wwpeekc() < 0)
+                       wwiomux();
+               r = row2;
+               c = col2;
+               switch (getpos(&row2, &col2, w->ww_i.t, w->ww_i.l,
+                              w->ww_i.b - 1, w->ww_i.r - 1)) {
+               case 3:
+                       yank_highlight(row1, col1, r, c);
+                       goto out;
+               case 2:
+                       break;
+               case 1:
+                       yank_highlight(row1, col1, r, c);
+                       yank_highlight(row1, col1, row2, col2);
+               case 0:
+                       continue;
+               }
+               break;
+       }
+       if (row2 < row1 || (row2 == row1 && col2 < col1)) {
+               r = row1;
+               c = col1;
+               row1 = row2;
+               col1 = col2;
+               row2 = r;
+               col2 = c;
+       }
+       unyank();
+       c = col1;
+       for (r = row1; r < row2; r++) {
+               yank_line(r, c, w->ww_b.r);
+               c = w->ww_b.l;
+       }
+       yank_line(r, c, col2);
+       yank_highlight(row1, col1, row2, col2);
+       if (!terse)
+               wwputc('\n', cmdwin);
+out:
+       wwcursor(w, 1);
+}
+
+void
+yank_highlight(row1, col1, row2, col2)
+       int row1, col1, row2, col2;
+{
+       struct ww *w = selwin;
+       int r, c;
+
+       if ((wwavailmodes & WWM_REV) == 0)
+               return;
+       if (row2 < row1 || (row2 == row1 && col2 < col1)) {
+               r = row1;
+               c = col1;
+               row1 = row2;
+               col1 = col2;
+               row2 = r;
+               col2 = c;
+       }
+       c = col1;
+       for (r = row1; r < row2; r++) {
+               yank_highlight_line(r, c, w->ww_b.r);
+               c = w->ww_b.l;
+       }
+       yank_highlight_line(r, c, col2);
+}
+
+void
+yank_highlight_line(r, c, cend)
+       int r, c, cend;
+{
+       struct ww *w = selwin;
+       char *win;
+
+       if (r < w->ww_i.t || r >= w->ww_i.b)
+               return;
+       if (c < w->ww_i.l)
+               c = w->ww_i.l;
+       if (cend >= w->ww_i.r)
+               cend = w->ww_i.r;
+       for (win = w->ww_win[r] + c; c < cend; c++, win++) {
+               *win ^= WWM_REV;
+               if (wwsmap[r][c] == w->ww_index) {
+                       if (*win == 0)
+                               w->ww_nvis[r]++;
+                       else if (*win == WWM_REV)
+                               w->ww_nvis[r]--;
+                       wwns[r][c].c_m ^= WWM_REV;
+                       wwtouched[r] |= WWU_TOUCHED;
+               }
+       }
+}
+
+void
+unyank()
+{
+       struct yb *yp, *yq;
+
+       for (yp = yb_head; yp; yp = yq) {
+               yq = yp->link;
+               str_free(yp->line);
+               free((char *) yp);
+       }
+       yb_head = yb_tail = 0;
+}
+
+void
+yank_line(r, c, cend)
+       int r, c, cend;
+{
+       struct yb *yp;
+       int nl = 0;
+       int n;
+       union ww_char *bp;
+       char *cp;
+
+       if (c == cend)
+               return;
+       if ((yp = (struct yb *) malloc(sizeof *yp)) == 0)
+               return;
+       yp->link = 0;
+       nl = cend == selwin->ww_b.r;
+       bp = selwin->ww_buf[r];
+       for (cend--; cend >= c; cend--)
+               if (bp[cend].c_c != ' ')
+                       break;
+       yp->length = n = cend - c + 1;
+       if (nl)
+               yp->length++;
+       yp->line = str_alloc(yp->length + 1);
+       for (bp += c, cp = yp->line; --n >= 0;)
+               *cp++ = bp++->c_c;
+       if (nl)
+               *cp++ = '\n';
+       *cp = 0;
+       if (yb_head)
+               yb_tail = yb_tail->link = yp;
+       else
+               yb_head = yb_tail = yp;
+}
+
+void
+c_put()
+{
+       struct yb *yp;
+
+       for (yp = yb_head; yp; yp = yp->link)
+               (void) write(selwin->ww_pty, yp->line, yp->length);
+}
diff --git a/window/compress.c b/window/compress.c
new file mode 100644 (file)
index 0000000..edc233e
--- /dev/null
@@ -0,0 +1,940 @@
+/*     $NetBSD: compress.c,v 1.4 1997/11/21 08:35:56 lukem Exp $       */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)compress.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: compress.c,v 1.4 1997/11/21 08:35:56 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "defs.h"
+#include "tt.h"
+
+       /* special */
+int cc_trace = 0;
+FILE *cc_trace_fp;
+
+       /* tunable parameters */
+
+int cc_reverse = 1;
+int cc_sort = 0;
+int cc_chop = 0;
+
+int cc_token_max = 8;          /* <= TOKEN_MAX */
+int cc_token_min = 2;          /* > tt.tt_put_token_cost */
+int cc_npass0 = 1;
+int cc_npass1 = 1;
+
+int cc_bufsize = 1024 * 3;     /* XXX, or 80 * 24 * 2 */
+
+int cc_ntoken = 8192;
+
+#define cc_weight XXX
+#ifndef cc_weight
+int cc_weight = 0;
+#endif
+
+#define TOKEN_MAX 16
+
+struct cc {
+       char string[TOKEN_MAX];
+       char length;
+       char flag;
+#ifndef cc_weight
+       short weight;
+#endif
+       long time;              /* time last seen */
+       short bcount;           /* count in this buffer */
+       short ccount;           /* count in compression */
+       short places;           /* places in the buffer */
+       short code;             /* token code */
+       struct cc *qforw, *qback;
+       struct cc *hforw, **hback;
+};
+
+short cc_thresholds[TOKEN_MAX + 1];
+#define thresh(length) (cc_thresholds[length])
+#define threshp(code, count, length) \
+       ((code) >= 0 || (short) (count) >= cc_thresholds[length])
+
+#ifndef cc_weight
+short cc_wthresholds[TOKEN_MAX + 1];
+#define wthresh(length) (cc_wthresholds[length])
+#define wthreshp(weight, length) ((short) (weight) >= cc_wthresholds[length])
+#else
+#define wthreshp(weight, length) (0)
+#endif
+
+#ifndef cc_weight
+short cc_wlimits[TOKEN_MAX + 1];
+#define wlimit(length) (cc_wlimits[length])
+#endif
+
+#define put_token_score(length) ((length) - tt.tt_put_token_cost)
+
+int cc_score_adjustments[TOKEN_MAX + 1][8]; /* XXX, 8 > max of cc_thresholds */
+#define score_adjust(score, p) \
+       do { \
+               int length = (p)->length; \
+               int ccount = (p)->ccount; \
+               if (threshp((p)->code, ccount, length) || \
+                   wthreshp((p)->weight, length)) /* XXX */ \
+                       (score) -= length - tt.tt_put_token_cost; \
+               else \
+                       (score) += cc_score_adjustments[length][ccount]; \
+       } while (0)
+
+int cc_initial_scores[TOKEN_MAX + 1][8]; /* XXX, 8 > max of cc_thresholds */
+
+struct cc cc_q0a, cc_q0b, cc_q1a, cc_q1b;
+
+#define qinsert(p1, p2) \
+       do { \
+               struct cc *forw = (p1)->qforw; \
+               struct cc *back = (p1)->qback; \
+               back->qforw = forw; \
+               forw->qback = back; \
+               forw = (p2)->qforw; \
+               (p1)->qforw = forw; \
+               forw->qback = (p1); \
+               (p2)->qforw = (p1); \
+               (p1)->qback = (p2); \
+       } while (0)
+
+#define qinsertq(q, p) \
+       ((q)->qforw == (q) ? 0 : \
+        ((q)->qback->qforw = (p)->qforw, \
+         (p)->qforw->qback = (q)->qback, \
+         (q)->qforw->qback = (p), \
+         (p)->qforw = (q)->qforw, \
+         (q)->qforw = (q), \
+         (q)->qback = (q)))
+
+#define H              (14)
+#define HSIZE          (1 << H)
+#define hash(h, c)     (((((h) >> (H - 8)) | (h) << 8) ^ (c)) & (HSIZE - 1))
+
+char *cc_buffer;
+struct cc **cc_output;                 /* the output array */
+short *cc_places[TOKEN_MAX + 1];
+short *cc_hashcodes;                   /* for computing hashcodes */
+struct cc **cc_htab;                   /* the hash table */
+struct cc **cc_tokens;                 /* holds all the active tokens */
+struct cc_undo {
+       struct cc **pos;
+       struct cc *val;
+} *cc_undo;
+
+long cc_time, cc_time0;
+
+char *cc_tt_ob, *cc_tt_obe;
+
+int    cc_compress __P((struct cc **, struct cc **, char));
+void   cc_compress_cleanup __P((struct cc **, int));
+void   cc_compress_phase __P((struct cc **, int, struct cc **, int));
+void   cc_compress_phase1 __P((struct cc **, struct cc **, int, int));
+void   cc_output_phase __P((char *, struct cc **, int));
+int    cc_sweep __P((char *, int, struct cc **, int));
+void   cc_sweep0 __P((char *, int, int));
+int    cc_sweep_phase __P((char *, int, struct cc **));
+void   cc_sweep_reverse __P((struct cc **, short *));
+int    cc_token_compare __P((const void *, const void *));
+
+int
+ccinit()
+{
+       int i, j;
+       struct cc *p;
+
+       if (tt.tt_token_max > cc_token_max)
+               tt.tt_token_max = cc_token_max;
+       if (tt.tt_token_min < cc_token_min)
+               tt.tt_token_min = cc_token_min;
+       if (tt.tt_token_min > tt.tt_token_max) {
+               tt.tt_ntoken = 0;
+               return 0;
+       }
+       if (tt.tt_ntoken > cc_ntoken / 2)       /* not likely */
+               tt.tt_ntoken = cc_ntoken / 2;
+#define C(x) (sizeof (x) / sizeof *(x))
+       for (i = 0; i < C(cc_thresholds); i++) {
+               int h = i - tt.tt_put_token_cost;
+               if (h > 0)
+                       cc_thresholds[i] =
+                               (tt.tt_set_token_cost + 1 + h - 1) / h + 1;
+               else
+                       cc_thresholds[i] = 0;
+       }
+       for (i = 0; i < C(cc_score_adjustments); i++) {
+               int t = cc_thresholds[i];
+               for (j = 0; j < C(*cc_score_adjustments); j++) {
+                       if (j >= t)
+                               cc_score_adjustments[i][j] =
+                                       - (i - tt.tt_put_token_cost);
+                       else if (j < t - 1)
+                               cc_score_adjustments[i][j] = 0;
+                       else
+                               /*
+                                * cost now is
+                                *      length * (ccount + 1)           a
+                                * cost before was
+                                *      set-token-cost + length +
+                                *              ccount * put-token-cost b
+                                * the score adjustment is (b - a)
+                                */
+                               cc_score_adjustments[i][j] =
+                                       tt.tt_set_token_cost + i +
+                                               j * tt.tt_put_token_cost -
+                                                       i * (j + 1);
+                       if (j >= t)
+                               cc_initial_scores[i][j] = 0;
+                       else
+                               /*
+                                * - (set-token-cost +
+                                *      (length - put-token-cost) -
+                                *      (length - put-token-cost) * ccount)
+                                */
+                               cc_initial_scores[i][j] =
+                                       - (tt.tt_set_token_cost +
+                                          (i - tt.tt_put_token_cost) -
+                                          (i - tt.tt_put_token_cost) * j);
+               }
+       }
+#ifndef cc_weight
+       for (i = 1; i < C(cc_wthresholds); i++) {
+               cc_wthresholds[i] =
+                       ((tt.tt_set_token_cost + tt.tt_put_token_cost) / i +
+                               i / 5 + 1) *
+                               cc_weight + 1;
+               cc_wlimits[i] = cc_wthresholds[i] + cc_weight;
+       }
+#endif
+#undef C
+       if ((cc_output = (struct cc **)
+            malloc((unsigned) cc_bufsize * sizeof *cc_output)) == 0)
+               goto nomem;
+       if ((cc_hashcodes = (short *)
+            malloc((unsigned) cc_bufsize * sizeof *cc_hashcodes)) == 0)
+               goto nomem;
+       if ((cc_htab = (struct cc **) malloc(HSIZE * sizeof *cc_htab)) == 0)
+               goto nomem;
+       if ((cc_tokens = (struct cc **)
+            malloc((unsigned)
+                   (cc_ntoken + tt.tt_token_max - tt.tt_token_min + 1) *
+                   sizeof *cc_tokens)) == 0)
+               goto nomem;
+       if ((cc_undo = (struct cc_undo *)
+            malloc((unsigned) cc_bufsize * sizeof *cc_undo)) == 0)
+               goto nomem;
+       for (i = tt.tt_token_min; i <= tt.tt_token_max; i++)
+               if ((cc_places[i] = (short *)
+                    malloc((unsigned) cc_bufsize * sizeof **cc_places)) == 0)
+                       goto nomem;
+       cc_q0a.qforw = cc_q0a.qback = &cc_q0a;
+       cc_q0b.qforw = cc_q0b.qback = &cc_q0b;
+       cc_q1a.qforw = cc_q1a.qback = &cc_q1a;
+       cc_q1b.qforw = cc_q1b.qback = &cc_q1b;
+       if ((p = (struct cc *) malloc((unsigned) cc_ntoken * sizeof *p)) == 0)
+               goto nomem;
+       for (i = 0; i < tt.tt_ntoken; i++) {
+               p->code = i;
+               p->time = -1;
+               p->qback = cc_q0a.qback;
+               p->qforw = &cc_q0a;
+               p->qback->qforw = p;
+               cc_q0a.qback = p;
+               p++;
+       }
+       for (; i < cc_ntoken; i++) {
+               p->code = -1;
+               p->time = -1;
+               p->qback = cc_q1a.qback;
+               p->qforw = &cc_q1a;
+               p->qback->qforw = p;
+               cc_q1a.qback = p;
+               p++;
+       }
+       cc_tt_ob = tt_ob;
+       cc_tt_obe = tt_obe;
+       if ((cc_buffer = malloc((unsigned) cc_bufsize)) == 0)
+               goto nomem;
+       return 0;
+nomem:
+       wwerrno = WWE_NOMEM;
+       return -1;
+}
+
+void
+ccstart()
+{
+       ttflush();
+       tt_obp = tt_ob = cc_buffer;
+       tt_obe = tt_ob + cc_bufsize;
+       tt.tt_flush = ccflush;
+       if (cc_trace) {
+               cc_trace_fp = fopen("window-trace", "a");
+               (void) fcntl(fileno(cc_trace_fp), F_SETFD, 1);
+       }
+       ccreset();
+}
+
+void
+ccreset()
+{
+       struct cc *p;
+
+       memset((char *) cc_htab, 0, HSIZE * sizeof *cc_htab);
+       for (p = cc_q0a.qforw; p != &cc_q0a; p = p->qforw)
+               p->hback = 0;
+       for (p = cc_q1a.qforw; p != &cc_q1a; p = p->qforw)
+               p->hback = 0;
+}
+
+void
+ccend()
+{
+
+       ttflush();
+       tt_obp = tt_ob = cc_tt_ob;
+       tt_obe = cc_tt_obe;
+       tt.tt_flush = 0;
+       if (cc_trace_fp != NULL) {
+               (void) fclose(cc_trace_fp);
+               cc_trace_fp = NULL;
+       }
+}
+
+void
+ccflush()
+{
+       int bufsize = tt_obp - tt_ob;
+       int n;
+
+       if (tt_ob != cc_buffer)
+               abort();
+       if (cc_trace_fp != NULL) {
+               (void) fwrite(tt_ob, 1, bufsize, cc_trace_fp);
+               (void) putc(-1, cc_trace_fp);
+       }
+       tt.tt_flush = 0;
+       (*tt.tt_compress)(1);
+       if (bufsize < tt.tt_token_min) {
+               ttflush();
+               goto out;
+       }
+       tt_obp = tt_ob = cc_tt_ob;
+       tt_obe = cc_tt_obe;
+       cc_time0 = cc_time;
+       cc_time += bufsize;
+       n = cc_sweep_phase(cc_buffer, bufsize, cc_tokens);
+       cc_compress_phase(cc_output, bufsize, cc_tokens, n);
+       cc_output_phase(cc_buffer, cc_output, bufsize);
+       ttflush();
+       tt_obp = tt_ob = cc_buffer;
+       tt_obe = cc_buffer + cc_bufsize;
+out:
+       (*tt.tt_compress)(0);
+       tt.tt_flush = ccflush;
+}
+
+int
+cc_sweep_phase(buffer, bufsize, tokens)
+       char *buffer;
+       int bufsize;
+       struct cc **tokens;
+{
+       struct cc **pp = tokens;
+       int i, n;
+#ifdef STATS
+       int nn, ii;
+#endif
+
+#ifdef STATS
+       if (verbose >= 0)
+               time_begin();
+       if (verbose > 0)
+               printf("Sweep:");
+#endif
+       cc_sweep0(buffer, bufsize, tt.tt_token_min - 1);
+#ifdef STATS
+       ntoken_stat = 0;
+       nn = 0;
+       ii = 0;
+#endif
+       for (i = tt.tt_token_min; i <= tt.tt_token_max; i++) {
+#ifdef STATS
+               if (verbose > 0) {
+                       if (ii > 7) {
+                               printf("\n      ");
+                               ii = 0;
+                       }
+                       ii++;
+                       printf(" (%d", i);
+                       (void) fflush(stdout);
+               }
+#endif
+               n = cc_sweep(buffer, bufsize, pp, i);
+               pp += n;
+#ifdef STATS
+               if (verbose > 0) {
+                       if (--n > 0) {
+                               printf(" %d", n);
+                               nn += n;
+                       }
+                       putchar(')');
+               }
+#endif
+       }
+       qinsertq(&cc_q1b, &cc_q1a);
+#ifdef STATS
+       if (verbose > 0)
+               printf("\n       %d tokens, %d candidates\n",
+                       ntoken_stat, nn);
+       if (verbose >= 0)
+               time_end();
+#endif
+       return pp - tokens;
+}
+
+void
+cc_sweep0(buffer, n, length)
+       char *buffer;
+       int n, length;
+{
+       char *p;
+       short *hc;
+       int i;
+       short c;
+       short pc = tt.tt_padc;
+
+       /* n and length are at least 1 */
+       p = buffer++;
+       hc = cc_hashcodes;
+       i = n;
+       do {
+               if ((*hc++ = *p++) == pc)
+                       hc[-1] = -1;
+       } while (--i);
+       while (--length) {
+               p = buffer++;
+               hc = cc_hashcodes;
+               for (i = n--; --i;) {
+                       if ((c = *p++) == pc || *hc < 0)
+                               c = -1;
+                       else
+                               c = hash(*hc, c);
+                       *hc++ = c;
+               }
+       }
+}
+
+int
+cc_sweep(buffer, bufsize, tokens, length)
+       char *buffer;
+       int bufsize;
+       struct cc **tokens;
+       int length;
+{
+       struct cc *p;
+       char *cp;
+       int i;
+       short *hc;
+       short *places = cc_places[length];
+       struct cc **pp = tokens;
+       short threshold = thresh(length);
+#ifndef cc_weight
+       short wthreshold = wthresh(length);
+       short limit = wlimit(length);
+#endif
+       int time;
+       short pc = tt.tt_padc;
+
+       i = length - 1;
+       bufsize -= i;
+       cp = buffer + i;
+       hc = cc_hashcodes;
+       time = cc_time0;
+       for (i = 0; i < bufsize; i++, time++) {
+               struct cc **h;
+
+               {
+                       short *hc1 = hc;
+                       short c = *cp++;
+                       short hh;
+                       if ((hh = *hc1) < 0 || c == pc) {
+                               *hc1++ = -1;
+                               hc = hc1;
+                               continue;
+                       }
+                       h = cc_htab + (*hc1++ = hash(hh, c));
+                       hc = hc1;
+               }
+               for (p = *h; p != 0; p = p->hforw)
+                       if (p->length == (char) length) {
+                               char *p1 = p->string;
+                               char *p2 = cp - length;
+                               int n = length;
+                               do
+                                       if (*p1++ != *p2++)
+                                               goto fail;
+                               while (--n);
+                               break;
+                       fail:;
+                       }
+               if (p == 0) {
+                       p = cc_q1a.qback;
+                       if (p == &cc_q1a ||
+                           (p->time >= cc_time0 && p->length == (char) length))
+                               continue;
+                       if (p->hback != 0)
+                               if ((*p->hback = p->hforw) != 0)
+                                       p->hforw->hback = p->hback;
+                       {
+                               char *p1 = p->string;
+                               char *p2 = cp - length;
+                               int n = length;
+                               do
+                                       *p1++ = *p2++;
+                               while (--n);
+                       }
+                       p->length = length;
+#ifndef cc_weight
+                       p->weight = cc_weight;
+#endif
+                       p->time = time;
+                       p->bcount = 1;
+                       p->ccount = 0;
+                       p->flag = 0;
+                       if ((p->hforw = *h) != 0)
+                               p->hforw->hback = &p->hforw;
+                       *h = p;
+                       p->hback = h;
+                       qinsert(p, &cc_q1a);
+                       places[i] = -1;
+                       p->places = i;
+#ifdef STATS
+                       ntoken_stat++;
+#endif
+               } else if (p->time < cc_time0) {
+#ifndef cc_weight
+                       if ((p->weight += p->time - time) < 0)
+                               p->weight = cc_weight;
+                       else if ((p->weight += cc_weight) > limit)
+                               p->weight = limit;
+#endif
+                       p->time = time;
+                       p->bcount = 1;
+                       p->ccount = 0;
+                       if (p->code >= 0) {
+                               p->flag = 1;
+                               *pp++ = p;
+                       } else
+#ifndef cc_weight
+                       if (p->weight >= wthreshold) {
+                               p->flag = 1;
+                               *pp++ = p;
+                               qinsert(p, &cc_q1b);
+                       } else
+#endif
+                       {
+                               p->flag = 0;
+                               qinsert(p, &cc_q1a);
+                       }
+                       places[i] = -1;
+                       p->places = i;
+#ifdef STATS
+                       ntoken_stat++;
+#endif
+               } else if (p->time + length > time) {
+                       /*
+                        * overlapping token, don't count as two and
+                        * don't update time, but do adjust weight to offset
+                        * the difference
+                        */
+#ifndef cc_weight
+                       if (cc_weight != 0) {   /* XXX */
+                               p->weight += time - p->time;
+                               if (!p->flag && p->weight >= wthreshold) {
+                                       p->flag = 1;
+                                       *pp++ = p;
+                                       qinsert(p, &cc_q1b);
+                               }
+                       }
+#endif
+                       places[i] = p->places;
+                       p->places = i;
+               } else {
+#ifndef cc_weight
+                       if ((p->weight += p->time - time) < 0)
+                               p->weight = cc_weight;
+                       else if ((p->weight += cc_weight) > limit)
+                               p->weight = limit;
+#endif
+                       p->time = time;
+                       p->bcount++;
+                       if (!p->flag &&
+                           /* code must be < 0 if flag false here */
+                           (p->bcount >= threshold
+#ifndef cc_weight
+                            || p->weight >= wthreshold
+#endif
+                            )) {
+                               p->flag = 1;
+                               *pp++ = p;
+                               qinsert(p, &cc_q1b);
+                       }
+                       places[i] = p->places;
+                       p->places = i;
+               }
+       }
+       if ((i = pp - tokens) > 0) {
+               *pp = 0;
+               if (cc_reverse)
+                       cc_sweep_reverse(tokens, places);
+               if (cc_sort && i > 1) {
+                       qsort((char *) tokens, i, sizeof *tokens,
+                             cc_token_compare);
+               }
+               if (cc_chop) {
+                       if ((i = i * cc_chop / 100) == 0)
+                               i = 1;
+                       tokens[i] = 0;
+               }
+               i++;
+       }
+       return i;
+}
+
+void
+cc_sweep_reverse(pp, places)
+       struct cc **pp;
+       short *places;
+{
+       struct cc *p;
+       short front, back, t;
+
+       while ((p = *pp++) != 0) {
+               back = -1;
+               t = p->places;
+               /* the list is never empty */
+               do {
+                       front = places[t];
+                       places[t] = back;
+                       back = t;
+               } while ((t = front) >= 0);
+               p->places = back;
+       }
+}
+
+void
+cc_compress_phase(output, bufsize, tokens, ntoken)
+       struct cc **output;
+       int bufsize;
+       struct cc **tokens;
+       int ntoken;
+{
+       int i;
+
+       memset((char *) output, 0, bufsize * sizeof *output);
+       for (i = 0; i < cc_npass0; i++)
+               cc_compress_phase1(output, tokens, ntoken, 0);
+       for (i = 0; i < cc_npass1; i++)
+               cc_compress_phase1(output, tokens, ntoken, 1);
+       cc_compress_cleanup(output, bufsize);
+}
+
+void
+cc_compress_phase1(output, tokens, ntoken, flag)
+       struct cc **output;
+       struct cc **tokens;
+       int ntoken, flag;
+{
+       struct cc **pp;
+#ifdef STATS
+       int i = 0;
+       int nt = 0, cc = 0, nc = 0;
+#endif
+
+#ifdef STATS
+       if (verbose >= 0)
+               time_begin();
+       if (verbose > 0)
+               printf("Compress:");
+#endif
+       pp = tokens;
+       while (pp < tokens + ntoken) {
+#ifdef STATS
+               if (verbose > 0) {
+                       ntoken_stat = 0;
+                       ccount_stat = 0;
+                       ncover_stat = 0;
+                       if (i > 2) {
+                               printf("\n         ");
+                               i = 0;
+                       }
+                       i++;
+                       printf(" (%d", (*pp)->length);
+                       (void) fflush(stdout);
+               }
+#endif
+               pp += cc_compress(output, pp, flag);
+#ifdef STATS
+               if (verbose > 0) {
+                       printf(" %dt %du %dc)", ntoken_stat, ccount_stat,
+                              ncover_stat);
+                       nt += ntoken_stat;
+                       cc += ccount_stat;
+                       nc += ncover_stat;
+               }
+#endif
+       }
+#ifdef STATS
+       if (verbose > 0)
+               printf("\n   total: (%dt %du %dc)\n", nt, cc, nc);
+       if (verbose >= 0)
+               time_end();
+#endif
+}
+
+void
+cc_compress_cleanup(output, bufsize)
+       struct cc **output;
+       int bufsize;
+{
+       struct cc **end;
+
+       /* the previous output phase may have been interrupted */
+       qinsertq(&cc_q0b, &cc_q0a);
+       for (end = output + bufsize; output < end;) {
+               struct cc *p;
+               int length;
+               if ((p = *output) == 0) {
+                       output++;
+                       continue;
+               }
+               length = p->length;
+               if (!p->flag) {
+               } else if (p->code >= 0) {
+                       qinsert(p, &cc_q0b);
+                       p->flag = 0;
+               } else if (p->ccount == 0) {
+                       *output = 0;
+               } else if (p->ccount >= thresh(length)
+#ifndef cc_weight
+                          || wthreshp(p->weight, length)
+#endif
+                          ) {
+                       p->flag = 0;
+               } else {
+                       p->ccount = 0;
+                       *output = 0;
+               }
+               output += length;
+       }
+}
+
+int
+cc_compress(output, tokens, flag)
+       struct cc **output;
+       struct cc **tokens;
+       char flag;
+{
+       struct cc **pp = tokens;
+       struct cc *p = *pp++;
+       int length = p->length;
+       int threshold = thresh(length);
+#ifndef cc_weight
+       short wthreshold = wthresh(length);
+#endif
+       short *places = cc_places[length];
+       int *initial_scores = cc_initial_scores[length];
+       int initial_score0 = put_token_score(length);
+
+       do {
+               int score;
+               struct cc_undo *undop;
+               int ccount;
+#ifdef STATS
+               int ncover;
+#endif
+               int i;
+
+               ccount = p->ccount;
+               if ((short) ccount >= p->bcount)
+                       continue;
+               if (p->code >= 0 || ccount >= threshold)
+                       score = 0;
+#ifndef cc_weight
+               else if (p->weight >= wthreshold)
+                       /* allow one fewer match than normal */
+                       /* XXX, should adjust for ccount */
+                       score = - tt.tt_set_token_cost;
+#endif
+               else
+                       score = initial_scores[ccount];
+               undop = cc_undo;
+#ifdef STATS
+               ncover = 0;
+#endif
+               for (i = p->places; i >= 0; i = places[i]) {
+                       struct cc **jp;
+                       struct cc *x;
+                       struct cc **ip = output + i;
+                       int score0 = initial_score0;
+                       struct cc **iip = ip + length;
+                       struct cc_undo *undop1 = undop;
+
+                       if ((x = *(jp = ip)) != 0)
+                               goto z;
+                       while (--jp >= output)
+                               if ((x = *jp) != 0) {
+                                       if (jp + x->length > ip)
+                                               goto z;
+                                       break;
+                               }
+                       jp = ip + 1;
+                       while (jp < iip) {
+                               if ((x = *jp) == 0) {
+                                       jp++;
+                                       continue;
+                               }
+                       z:
+                               if (x == p)
+                                       goto undo;
+#ifdef STATS
+                               ncover++;
+#endif
+                               undop->pos = jp;
+                               undop->val = x;
+                               undop++;
+                               *jp = 0;
+                               x->ccount--;
+                               score_adjust(score0, x);
+                               if (score0 < 0 && flag)
+                                       goto undo;
+                               jp += x->length;
+                       }
+                       undop->pos = ip;
+                       undop->val = 0;
+                       undop++;
+                       *ip = p;
+                       ccount++;
+                       score += score0;
+                       continue;
+               undo:
+                       while (--undop >= undop1)
+                               if ((*undop->pos = x = undop->val))
+                                       x->ccount++;
+                       undop++;
+               }
+               if (score > 0) {
+#ifdef STATS
+                       ccount_stat += ccount - p->ccount;
+                       ntoken_stat++;
+                       ncover_stat += ncover;
+#endif
+                       p->ccount = ccount;
+               } else {
+                       struct cc_undo *u = cc_undo;
+                       while (--undop >= u) {
+                               struct cc *x;
+                               if ((*undop->pos = x = undop->val))
+                                       x->ccount++;
+                       }
+               }
+       } while ((p = *pp++) != 0);
+       return pp - tokens;
+}
+
+void
+cc_output_phase(buffer, output, bufsize)
+       char *buffer;
+       struct cc **output;
+       int bufsize;
+{
+       int i;
+       struct cc *p, *p1;
+
+       for (i = 0; i < bufsize;) {
+               if ((p = output[i]) == 0) {
+                       ttputc(buffer[i]);
+                       i++;
+               } else if (p->code >= 0) {
+                       if (--p->ccount == 0)
+                               qinsert(p, &cc_q0a);
+                       (*tt.tt_put_token)(p->code, p->string, p->length);
+                       wwntokuse++;
+                       wwntoksave += put_token_score(p->length);
+                       i += p->length;
+               } else if ((p1 = cc_q0a.qback) != &cc_q0a) {
+                       p->code = p1->code;
+                       p1->code = -1;
+                       qinsert(p1, &cc_q1a);
+                       if (--p->ccount == 0)
+                               qinsert(p, &cc_q0a);
+                       else
+                               qinsert(p, &cc_q0b);
+                       (*tt.tt_set_token)(p->code, p->string, p->length);
+                       wwntokdef++;
+                       wwntoksave -= tt.tt_set_token_cost;
+                       i += p->length;
+               } else {
+                       p->ccount--;
+                       ttwrite(p->string, p->length);
+                       wwntokbad++;
+                       i += p->length;
+               }
+       }
+       wwntokc += bufsize;
+}
+
+int
+cc_token_compare(p1, p2)
+       const void *p1, *p2;
+{
+       const struct cc **vp1 = (void *)p1;
+       const struct cc **vp2 = (void *)p2;
+       return (*vp2)->bcount - (*vp1)->bcount;
+}
diff --git a/window/context.c b/window/context.c
new file mode 100644 (file)
index 0000000..4409a69
--- /dev/null
@@ -0,0 +1,147 @@
+/*     $NetBSD: context.c,v 1.4 1997/11/21 08:35:58 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)context.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: context.c,v 1.4 1997/11/21 08:35:58 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include "defs.h"
+#include "window_string.h"
+#undef EXTERN
+#define EXTERN
+#include "context.h"
+#undef  EXTERN
+
+/*
+ * Context push/pop for nested command files.
+ */
+int    cx_alloc __P((void));
+void   cx_free __P((void));
+
+int
+cx_alloc()
+{
+       struct context *xp;
+
+       if (cx.x_type != 0) {
+               xp = (struct context *)
+                       malloc((unsigned) sizeof (struct context));
+               if (xp == 0)
+                       return -1;
+               *xp = cx;
+               cx.x_link = xp;
+               cx.x_type = 0;
+       }
+       cx.x_erred = 0;
+       cx.x_synerred = 0;
+       cx.x_abort = 0;
+       return 0;
+}
+
+void
+cx_free()
+{
+       struct context *xp;
+
+       if ((xp = cx.x_link) != 0) {
+               cx = *xp;
+               free((char *)xp);
+       } else
+               cx.x_type = 0;
+}
+
+int
+cx_beginfile(filename)
+       char *filename;
+{
+       if (cx_alloc() < 0)
+               return -1;
+       cx.x_type = X_FILE;
+       if ((cx.x_filename = str_cpy(filename)) == 0)
+               goto bad;
+       cx.x_fp = fopen(filename, "r");
+       if (cx.x_fp == 0)
+               goto bad;
+       (void) fcntl(fileno(cx.x_fp), F_SETFD, 1);
+       cx.x_bol = 1;
+       cx.x_lineno = 0;
+       cx.x_errwin = 0;
+       cx.x_noerr = 0;
+       return 0;
+bad:
+       if (cx.x_filename != 0)
+               str_free(cx.x_filename);
+       cx_free();
+       return -1;
+}
+
+int
+cx_beginbuf(buf, arg, narg)
+       char *buf;
+       struct value *arg;
+       int narg;
+{
+       if (cx_alloc() < 0)
+               return -1;
+       cx.x_type = X_BUF;
+       cx.x_bufp = cx.x_buf = buf;
+       cx.x_arg = arg;
+       cx.x_narg = narg;
+       return 0;
+}
+
+void
+cx_end()
+{
+       switch (cx.x_type) {
+       case X_BUF:
+               break;
+       case X_FILE:
+               (void) fclose(cx.x_fp);
+               str_free(cx.x_filename);
+               break;
+       }
+       cx_free();
+}
diff --git a/window/context.h b/window/context.h
new file mode 100644 (file)
index 0000000..0f9b5a0
--- /dev/null
@@ -0,0 +1,89 @@
+/*     $NetBSD: context.h,v 1.3 1995/09/28 10:34:17 tls Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)context.h   8.1 (Berkeley) 6/6/93
+ */
+
+#include <stdio.h>
+
+#ifndef EXTERN
+#define EXTERN extern
+#endif
+
+struct context {
+       struct context *x_link;         /* nested contexts */
+       char x_type;                    /* tag for union */
+       union {
+               struct {        /* input is a file */
+                       char *X_filename;       /* input file name */
+                       FILE *X_fp;             /* input stream */
+                       short X_lineno;         /* current line number */
+                       char X_bol;             /* at beginning of line */
+                       char X_noerr;           /* don't report errors */
+                       struct ww *X_errwin;    /* error window */
+               } x_f;
+               struct {        /* input is a buffer */
+                       char *X_buf;            /* input buffer */
+                       char *X_bufp;           /* current position in buf */
+                       struct value *X_arg;    /* argument for alias */
+                       int X_narg;             /* number of arguments */
+               } x_b;
+       } x_un;
+               /* holding place for current token */
+       int x_token;                    /* the token */
+       struct value x_val;             /* values associated with token */
+               /* parser error flags */
+       unsigned x_erred :1;            /* had an error */
+       unsigned x_synerred :1;         /* had syntax error */
+       unsigned x_abort :1;            /* fatal error */
+};
+#define x_buf          x_un.x_b.X_buf
+#define x_bufp         x_un.x_b.X_bufp
+#define x_arg          x_un.x_b.X_arg
+#define x_narg         x_un.x_b.X_narg
+#define x_filename     x_un.x_f.X_filename
+#define x_fp           x_un.x_f.X_fp
+#define x_lineno       x_un.x_f.X_lineno
+#define x_bol          x_un.x_f.X_bol
+#define x_errwin       x_un.x_f.X_errwin
+#define x_noerr                x_un.x_f.X_noerr
+
+       /* x_type values, 0 is reserved */
+#define X_FILE         1               /* input is a file */
+#define X_BUF          2               /* input is a buffer */
+
+EXTERN struct context cx;                      /* the current context */
diff --git a/window/defs.h b/window/defs.h
new file mode 100644 (file)
index 0000000..f1bbb68
--- /dev/null
@@ -0,0 +1,131 @@
+/*     $NetBSD: defs.h,v 1.4 1997/11/21 08:35:59 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)defs.h      8.1 (Berkeley) 6/6/93
+ */
+
+#include <sys/time.h>
+#include "value.h"
+#include "ww.h"
+
+#ifndef EXTERN
+#define EXTERN extern
+#endif
+
+#define NWINDOW 9
+
+EXTERN struct timeval starttime;
+
+EXTERN struct ww *window[NWINDOW];     /* the windows */
+EXTERN struct ww *selwin;              /* the selected window */
+EXTERN struct ww *lastselwin;          /* the last selected window */
+EXTERN struct ww *cmdwin;              /* the command window */
+EXTERN struct ww *framewin;            /* the window for framing */
+EXTERN struct ww *boxwin;              /* the window for the box */
+EXTERN struct ww *fgwin;               /* the last foreground window */
+
+#define isfg(w)                ((w)->ww_order <= fgwin->ww_order)
+
+EXTERN char *default_shell[128];       /* default shell argv */
+EXTERN char *default_shellfile;                /* default shell program */
+EXTERN int default_nline;              /* default buffer size for new windows */
+EXTERN int default_smooth;             /* default "smooth" parameter */
+EXTERN char escapec;                   /* the escape character */
+
+/* flags */
+EXTERN char quit;                      /* quit command issued */
+EXTERN char terse;                     /* terse mode */
+EXTERN char debug;                     /* debug mode */
+EXTERN char incmd;                     /* in command mode */
+
+void           addwin __P((struct ww *, char));
+int            ccinit __P((void));
+void           ccend __P((void));
+void           ccflush __P((void));
+void           ccreset __P((void));
+void           ccstart __P((void));
+void           c_colon __P((void));
+void           c_debug __P((void));
+void           c_help __P((void));
+void           c_move __P((struct ww *));
+void           c_put __P((void));
+void           c_quit __P((void));
+void           c_size __P((struct ww *));
+void           c_window __P((void));
+void           c_yank __P((void));
+void           closeiwin __P((struct ww *));
+void           closewin __P((struct ww *));
+void           closewin1 __P((struct ww *));
+int            cx_beginbuf __P((char *, struct value *, int));
+int            cx_beginfile __P((char *));
+void           cx_end __P((void));
+void           deletewin __P((struct ww *));
+void           docmd __P((void));
+int            doconfig __P((void));
+void           dodefault __P((void));
+int            dolongcmd __P((char *, struct value *, int));
+int            dosource __P((char *));
+void           error __P((const char *, ...));
+void           err_end __P((void));
+int            findid __P((void));
+struct ww      *findselwin __P((void));
+void           front __P((struct ww *, char));
+int            getpos __P((int *, int *, int, int, int, int));
+struct ww      *getwin __P((void));
+void           labelwin __P((struct ww *));
+void           mloop __P((void));
+int            more __P((struct ww *,  char));
+void           movewin __P((struct ww *, int, int));
+struct ww      *openwin __P((int, int, int, int, int, int, char *, int, int,
+                           char *, char **));
+struct ww      *openiwin __P((int, char *));
+void           p_memerror __P((void));
+void           p_start __P((void));
+void           reframe __P((void));
+void           setcmd __P((char));
+void           setescape __P((char *));
+int            setlabel __P((struct ww *, char *));
+void           setselwin __P((struct ww *));
+void           setterse __P((char));
+void           setvars __P((void));
+void           sizewin __P((struct ww *, int, int));
+void           startwin __P((struct ww *));
+void           stopwin __P((struct ww *));
+int            s_gettok __P((void));
+void           verror __P((const char *, va_list));
+void           waitnl __P((struct ww *));
+int            waitnl1 __P((struct ww *, char *));
diff --git a/window/error.c b/window/error.c
new file mode 100644 (file)
index 0000000..6c82e23
--- /dev/null
@@ -0,0 +1,123 @@
+/*     $NetBSD: error.c,v 1.4 1997/11/21 08:36:00 lukem Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)error.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: error.c,v 1.4 1997/11/21 08:36:00 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+#include "context.h"
+#include "char.h"
+
+#define ERRLINES 10                    /* number of lines for errwin */
+
+void
+#if __STDC__
+error(const char *fmt, ...)
+#else
+error(fmt, va_alist)
+       char *fmt;
+       va_dcl
+#endif
+{
+       va_list ap;
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       verror(fmt, ap);
+       va_end(ap);
+}
+
+void
+verror(fmt, ap)
+       const char *fmt;
+       va_list ap;
+{
+       struct context *x;
+       struct ww *w;
+
+       for (x = &cx; x != 0 && x->x_type != X_FILE; x = x->x_link)
+               ;
+       if (x == 0) {
+               if (terse)
+                       wwbell();
+               else {
+                       wwvprintf(cmdwin, fmt, ap);
+                       wwputs("  ", cmdwin);
+               }
+               return;
+       }
+       if (x->x_noerr)
+               return;
+       if ((w = x->x_errwin) == 0) {
+               char buf[512];
+
+               (void) snprintf(buf, sizeof(buf), "Errors from %s",
+                   x->x_filename);
+               if ((w = x->x_errwin = openiwin(ERRLINES, buf)) == 0) {
+                       wwputs("Can't open error window.  ", cmdwin);
+                       x->x_noerr = 1;
+                       return;
+               }
+       }
+       if (more(w, 0) == 2) {
+               x->x_noerr = 1;
+               return;
+       }
+       wwprintf(w, "line %d: ", x->x_lineno);
+       wwvprintf(w, fmt, ap);
+       wwputc('\n', w);
+}
+
+void
+err_end()
+{
+       if (cx.x_type == X_FILE && cx.x_errwin != 0) {
+               if (!cx.x_noerr)
+                       waitnl(cx.x_errwin);
+               closeiwin(cx.x_errwin);
+               cx.x_errwin = 0;
+       }
+}
diff --git a/window/lcmd.c b/window/lcmd.c
new file mode 100644 (file)
index 0000000..cad4116
--- /dev/null
@@ -0,0 +1,139 @@
+/*     $NetBSD: lcmd.c,v 1.4 1997/11/21 08:36:01 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)lcmd.c     8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: lcmd.c,v 1.4 1997/11/21 08:36:01 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+#include "lcmd.h"
+#include "window_string.h"
+
+extern struct lcmd_arg arg_alias[];
+extern struct lcmd_arg arg_cursormodes[];
+extern struct lcmd_arg arg_debug[];
+extern struct lcmd_arg arg_echo[];
+extern struct lcmd_arg arg_escape[];
+extern struct lcmd_arg arg_foreground[];
+extern struct lcmd_arg arg_label[];
+extern struct lcmd_arg arg_def_nline[];
+extern struct lcmd_arg arg_def_shell[];
+extern struct lcmd_arg arg_def_smooth[];
+extern struct lcmd_arg arg_close[];
+extern struct lcmd_arg arg_select[];
+extern struct lcmd_arg arg_smooth[];
+extern struct lcmd_arg arg_source[];
+extern struct lcmd_arg arg_terse[];
+extern struct lcmd_arg arg_time[];
+extern struct lcmd_arg arg_unalias[];
+extern struct lcmd_arg arg_unset[];
+extern struct lcmd_arg arg_window[];
+extern struct lcmd_arg arg_write[];
+struct lcmd_arg arg_null[1] = { { 0 } };
+
+struct lcmd_tab lcmd_tab[] = {
+       { "alias",              1,      l_alias,        arg_alias },
+       { "close",              2,      l_close,        arg_close },
+       { "cursormodes",        2,      l_cursormodes,  arg_cursormodes },
+       { "debug",              1,      l_debug,        arg_debug },
+       { "default_nlines",     9,      l_def_nline,    arg_def_nline },
+       { "default_shell",      10,     l_def_shell,    arg_def_shell },
+       { "default_smooth",     10,     l_def_smooth,   arg_def_smooth },
+       { "echo",               2,      l_echo,         arg_echo },
+       { "escape",             2,      l_escape,       arg_escape },
+       { "foreground",         1,      l_foreground,   arg_foreground },
+       { "iostat",             1,      l_iostat,       arg_null },
+       { "label",              2,      l_label,        arg_label },
+       { "list",               2,      l_list,         arg_null },
+       { "nlines",             1,      l_def_nline,    arg_def_nline },
+       { "select",             2,      l_select,       arg_select },
+       { "shell",              2,      l_def_shell,    arg_def_shell },
+       { "smooth",             2,      l_smooth,       arg_smooth },
+       { "source",             2,      l_source,       arg_source },
+       { "terse",              2,      l_terse,        arg_terse },
+       { "time",               2,      l_time,         arg_time },
+       { "unalias",            3,      l_unalias,      arg_unalias },
+       { "unset",              3,      l_unset,        arg_unset },
+       { "variable",           1,      l_variable,     arg_null },
+       { "window",             2,      l_window,       arg_window },
+       { "write",              2,      l_write,        arg_write },
+       { 0,                    0,      0,              0 }
+};
+
+struct lcmd_tab *
+lcmd_lookup(name)
+       char *name;
+{
+       struct lcmd_tab *p;
+
+       for (p = lcmd_tab; p->lc_name != 0; p++)
+               if (str_match(name, p->lc_name, p->lc_minlen))
+                       return p;
+       return 0;
+}
+
+int
+dosource(filename)
+       char *filename;
+{
+       if (cx_beginfile(filename) < 0)
+               return -1;
+       p_start();
+       err_end();
+       cx_end();
+       return 0;
+}
+
+int
+dolongcmd(buffer, arg, narg)
+       char *buffer;
+       struct value *arg;
+       int narg;
+{
+       if (cx_beginbuf(buffer, arg, narg) < 0)
+               return -1;
+       p_start();
+       err_end();
+       cx_end();
+       return 0;
+}
diff --git a/window/lcmd.h b/window/lcmd.h
new file mode 100644 (file)
index 0000000..2741a3e
--- /dev/null
@@ -0,0 +1,87 @@
+/*     $NetBSD: lcmd.h,v 1.4 1997/11/21 08:36:02 lukem Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)lcmd.h      8.1 (Berkeley) 6/6/93
+ */
+
+#define LCMD_NARG 20                   /* maximum number of arguments */
+
+struct lcmd_tab {
+       char *lc_name;
+       int lc_minlen;
+       void (*lc_func) __P((struct value *, struct value *));
+       struct lcmd_arg *lc_arg;
+};
+
+struct lcmd_arg {
+       char *arg_name;
+       int arg_minlen;
+       int arg_flags;
+};
+
+       /* arg_flags bits */
+#define ARG_TYPE       0x0f            /* type of arg */
+#define ARG_ANY                0x00            /* any type */
+#define ARG_NUM                0x01            /* must be a number */
+#define ARG_STR                0x02            /* must be a string */
+#define ARG_LIST       0x10            /* this arg can be a list */
+
+struct lcmd_tab        *lcmd_lookup __P((char *));
+void   l_alias __P((struct value *, struct value *));
+void   l_close __P((struct value *, struct value *));
+void   l_cursormodes __P((struct value *, struct value *));
+void   l_debug __P((struct value *, struct value *));
+void   l_def_nline __P((struct value *, struct value *));
+void   l_def_shell __P((struct value *, struct value *));
+void   l_def_smooth __P((struct value *, struct value *));
+void   l_echo __P((struct value *, struct value *));
+void   l_escape __P((struct value *, struct value *));
+void   l_foreground __P((struct value *, struct value *));
+void   l_iostat __P((struct value *, struct value *));
+void   l_label __P((struct value *, struct value *));
+void   l_list __P((struct value *, struct value *));
+void   l_select __P((struct value *, struct value *));
+void   l_smooth __P((struct value *, struct value *));
+void   l_source __P((struct value *, struct value *));
+void   l_terse __P((struct value *, struct value *));
+void   l_time __P((struct value *, struct value *));
+void   l_unalias __P((struct value *, struct value *));
+void   l_unset __P((struct value *, struct value *));
+void   l_variable __P((struct value *, struct value *));
+void   l_window __P((struct value *, struct value *));
+void   l_write __P((struct value *, struct value *));
+struct ww *vtowin __P((struct value *, struct ww *));
diff --git a/window/lcmd1.c b/window/lcmd1.c
new file mode 100644 (file)
index 0000000..a856d3d
--- /dev/null
@@ -0,0 +1,466 @@
+/*     $NetBSD: lcmd1.c,v 1.7 1997/11/21 08:36:03 lukem Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)lcmd1.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: lcmd1.c,v 1.7 1997/11/21 08:36:03 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <string.h>
+#include <unistd.h>
+#include "defs.h"
+#include "window_string.h"
+#include "lcmd.h"
+#include "var.h"
+
+char   vtobool __P((struct value *, char, char));
+
+struct lcmd_arg arg_window[] = {
+       { "row",        1,      ARG_NUM },
+       { "column",     1,      ARG_NUM },
+       { "nrows",      2,      ARG_NUM },
+       { "ncols",      2,      ARG_NUM },
+       { "nlines",     2,      ARG_NUM },
+       { "label",      1,      ARG_STR },
+       { "pty",        1,      ARG_ANY },
+       { "frame",      1,      ARG_ANY },
+       { "mapnl",      1,      ARG_ANY },
+       { "keepopen",   1,      ARG_ANY },
+       { "smooth",     1,      ARG_ANY },
+       { "shell",      1,      ARG_STR|ARG_LIST },
+       { 0 }
+};
+
+void
+l_window(v, a)
+       struct value *v;
+       struct value *a;
+{
+       struct ww *w;
+       int col, row, ncol, nrow, id, nline;
+       char *label;
+       int haspty, hasframe, mapnl, keepopen, smooth;
+       char *shf, **sh;
+       char *argv[sizeof default_shell / sizeof *default_shell];
+       char **pp;
+
+       if ((id = findid()) < 0)
+               return;
+       row = a->v_type == V_ERR ? 1 : a->v_num;
+       a++;
+       col = a->v_type == V_ERR ? 0 : a->v_num;
+       a++;
+       nrow = a->v_type == V_ERR ? wwnrow - row : a->v_num;
+       a++;
+       ncol = a->v_type == V_ERR ? wwncol - col : a->v_num;
+       a++;
+       nline = a->v_type == V_ERR ? default_nline : a->v_num;
+       a++;
+       label = a->v_type == V_ERR ? 0 : a->v_str;
+       if ((haspty = vtobool(++a, 1, -1)) < 0)
+               return;
+       if ((hasframe = vtobool(++a, 1, -1)) < 0)
+               return;
+       if ((mapnl = vtobool(++a, !haspty, -1)) < 0)
+               return;
+       if ((keepopen = vtobool(++a, 0, -1)) < 0)
+               return;
+       if ((smooth = vtobool(++a, default_smooth, -1)) < 0)
+               return;
+       if ((++a)->v_type != V_ERR) {
+               for (pp = argv; a->v_type != V_ERR &&
+                    pp < &argv[sizeof argv/sizeof *argv-1]; pp++, a++)
+                       *pp = a->v_str;
+               *pp = 0;
+               shf = *(sh = argv);
+               if ((*sh = strrchr(shf, '/')))
+                       (*sh)++;
+               else
+                       *sh = shf;
+       } else {
+               sh = default_shell;
+               shf = default_shellfile;
+       }
+       if ((w = openwin(id, row, col, nrow, ncol, nline, label,
+           haspty ? WWT_PTY : WWT_SOCKET, hasframe ? WWU_HASFRAME : 0, shf,
+           sh)) == 0)
+               return;
+       if (mapnl)
+               SET(w->ww_wflags, WWW_MAPNL);
+       else
+               CLR(w->ww_wflags, WWW_MAPNL);
+       if (keepopen)
+               SET(w->ww_uflags, WWU_KEEPOPEN);
+       else
+               CLR(w->ww_uflags, WWU_KEEPOPEN);
+       if (!smooth)
+               SET(w->ww_wflags, WWW_NOUPDATE);
+       else
+               CLR(w->ww_wflags, WWW_NOUPDATE);
+       v->v_type = V_NUM;
+       v->v_num = id + 1;
+}
+
+struct lcmd_arg arg_def_nline[] = {
+       { "nlines",     1,      ARG_NUM },
+       { 0 }
+};
+
+void
+l_def_nline(v, a)
+       struct value *v, *a;
+{
+       v->v_num = default_nline;
+       v->v_type = V_NUM;
+       if (a->v_type != V_ERR)
+               default_nline = a->v_num;
+}
+
+struct lcmd_arg arg_smooth[] = {
+       { "window",     1,      ARG_NUM },
+       { "flag",       1,      ARG_ANY },
+       { 0 }
+};
+
+void
+l_smooth(v, a)
+       struct value *v, *a;
+{
+       struct ww *w;
+
+       v->v_type = V_NUM;
+       v->v_num = 0;
+       if ((w = vtowin(a++, selwin)) == 0)
+               return;
+       v->v_num = ISSET(w->ww_wflags, WWW_NOUPDATE) == 0;
+       if (!vtobool(a, v->v_num, v->v_num))
+               SET(w->ww_wflags, WWW_NOUPDATE);
+       else
+               CLR(w->ww_wflags, WWW_NOUPDATE);
+}
+
+struct lcmd_arg arg_def_smooth[] = {
+       { "flag",       1,      ARG_ANY },
+       { 0 }
+};
+
+void
+l_def_smooth(v, a)
+       struct value *v, *a;
+{
+       v->v_type = V_NUM;
+       v->v_num = default_smooth;
+       default_smooth = vtobool(a, v->v_num, v->v_num);
+}
+
+struct lcmd_arg arg_select[] = {
+       { "window",     1,      ARG_NUM },
+       { 0 }
+};
+
+void
+l_select(v, a)
+       struct value *v, *a;
+{
+       struct ww *w;
+
+       v->v_type = V_NUM;
+       v->v_num = selwin ? selwin->ww_id + 1 : -1;
+       if (a->v_type == V_ERR)
+               return;
+       if ((w = vtowin(a, (struct ww *)0)) == 0)
+               return;
+       setselwin(w);
+}
+
+struct lcmd_arg arg_debug[] = {
+       { "flag",       1,      ARG_ANY },
+       { 0 }
+};
+
+void
+l_debug(v, a)
+       struct value *v, *a;
+{
+       v->v_type = V_NUM;
+       v->v_num = debug;
+       debug = vtobool(a, debug, debug);
+}
+
+struct lcmd_arg arg_escape[] = {
+       { "escapec",    1,      ARG_STR },
+       { 0 }
+};
+
+void
+l_escape(v, a)
+       struct value *v, *a;
+{
+       char buf[2];
+
+       buf[0] = escapec;
+       buf[1] = 0;
+       if ((v->v_str = str_cpy(buf)) == 0) {
+               error("Out of memory.");
+               return;
+       }
+       v->v_type = V_STR;
+       if (a->v_type != V_ERR)
+               setescape(a->v_str);
+}
+
+struct lcmd_arg arg_label[] = {
+       { "window",     1,      ARG_NUM },
+       { "label",      1,      ARG_STR },
+       { 0 }
+};
+
+void
+l_label(v, a)
+struct value *v;
+       struct value *a;
+{
+       struct ww *w;
+
+       if ((w = vtowin(a, selwin)) == 0)
+               return;
+       if ((++a)->v_type != V_ERR && setlabel(w, a->v_str) < 0)
+               error("Out of memory.");
+       reframe();
+}
+
+struct lcmd_arg arg_foreground[] = {
+       { "window",     1,      ARG_NUM },
+       { "flag",       1,      ARG_ANY },
+       { 0 }
+};
+
+void
+l_foreground(v, a)
+       struct value *v, *a;
+{
+       struct ww *w;
+       char flag;
+
+       if ((w = vtowin(a, selwin)) == 0)
+               return;
+       v->v_type = V_NUM;
+       v->v_num = isfg(w);
+       flag = vtobool(++a, v->v_num, v->v_num);
+       if (flag == v->v_num)
+               return;
+       deletewin(w);
+       addwin(w, flag);
+       reframe();
+}
+
+struct lcmd_arg arg_terse[] = {
+       { "flag",       1,      ARG_ANY },
+       { 0 }
+};
+
+void
+l_terse(v, a)
+       struct value *v, *a;
+{
+       v->v_type = V_NUM;
+       v->v_num = terse;
+       setterse(vtobool(a, terse, terse));
+}
+
+struct lcmd_arg arg_source[] = {
+       { "filename",   1,      ARG_STR },
+       { 0 }
+};
+
+void
+l_source(v, a)
+       struct value *v, *a;
+{
+       v->v_type = V_NUM;
+       if (a->v_type != V_ERR && dosource(a->v_str) < 0) {
+               error("Can't open %s.", a->v_str);
+               v->v_num = -1;
+       } else
+               v->v_num = 0;
+}
+
+struct lcmd_arg arg_write[] = {
+       { "window",     1,      ARG_NUM },
+       { "",           0,      ARG_ANY|ARG_LIST },
+       { 0 }
+};
+
+void
+l_write(v, a)
+       struct value *v;
+       struct value *a;
+{
+       char buf[20];
+       struct ww *w;
+
+       if ((w = vtowin(a++, selwin)) == 0)
+               return;
+       while (a->v_type != V_ERR) {
+               if (a->v_type == V_NUM) {
+                       (void) sprintf(buf, "%d", a->v_num);
+                       (void) write(w->ww_pty, buf, strlen(buf));
+               } else
+                       (void) write(w->ww_pty, a->v_str, strlen(a->v_str));
+               if ((++a)->v_type != V_ERR)
+                       (void) write(w->ww_pty, " ", 1);
+       }
+}
+
+struct lcmd_arg arg_close[] = {
+       { "window",     1,      ARG_ANY|ARG_LIST },
+       { 0 }
+};
+
+void
+l_close(v, a)
+       struct value *v;
+       struct value *a;
+{
+       struct ww *w;
+
+       if (a->v_type == V_STR && str_match(a->v_str, "all", 3))
+               closewin((struct ww *)0);
+       else
+               for (; a->v_type != V_ERR; a++)
+                       if ((w = vtowin(a, (struct ww *)0)) != 0)
+                               closewin(w);
+}
+
+struct lcmd_arg arg_cursormodes[] = {
+       { "modes",      1,      ARG_NUM },
+       { 0 }
+};
+
+void
+l_cursormodes(v, a)
+       struct value *v, *a;
+{
+
+       v->v_type = V_NUM;
+       v->v_num = wwcursormodes;
+       if (a->v_type != V_ERR)
+               wwsetcursormodes(a->v_num);
+}
+
+struct lcmd_arg arg_unset[] = {
+       { "variable",   1,      ARG_ANY },
+       { 0 }
+};
+
+void
+l_unset(v, a)
+       struct value *v, *a;
+{
+       v->v_type = V_NUM;
+       switch (a->v_type) {
+       case V_ERR:
+               v->v_num = -1;
+               return;
+       case V_NUM:
+               if ((a->v_str = str_itoa(a->v_num)) == 0) {
+                       error("Out of memory.");
+                       v->v_num = -1;
+                       return;
+               }
+               a->v_type = V_STR;
+               break;
+       }
+       v->v_num = var_unset(a->v_str);
+}
+
+struct ww *
+vtowin(v, w)
+       struct value *v;
+       struct ww *w;
+{
+       switch (v->v_type) {
+       case V_ERR:
+               if (w != 0)
+                       return w;
+               error("No window specified.");
+               return 0;
+       case V_STR:
+               error("%s: No such window.", v->v_str);
+               return 0;
+       }
+       if (v->v_num < 1 || v->v_num > NWINDOW
+           || (w = window[v->v_num - 1]) == 0) {
+               error("%d: No such window.", v->v_num);
+               return 0;
+       }
+       return w;
+}
+
+char
+vtobool(v, def, err)
+       struct value *v;
+       char def, err;
+{
+       switch (v->v_type) {
+       case V_NUM:
+               return v->v_num != 0;
+       case V_STR:
+               if (str_match(v->v_str, "true", 1)
+                   || str_match(v->v_str, "on", 2)
+                   || str_match(v->v_str, "yes", 1))
+                       return 1;
+               else if (str_match(v->v_str, "false", 1)
+                   || str_match(v->v_str, "off", 2)
+                   || str_match(v->v_str, "no", 1))
+                       return 0;
+               else {
+                       error("%s: Illegal boolean value.", v->v_str);
+                       return err;
+               }
+               /*NOTREACHED*/
+       case V_ERR:
+               return def;
+       }
+       /*NOTREACHED*/
+       return (0);
+}
diff --git a/window/lcmd2.c b/window/lcmd2.c
new file mode 100644 (file)
index 0000000..8d8b72b
--- /dev/null
@@ -0,0 +1,408 @@
+/*     $NetBSD: lcmd2.c,v 1.9 1998/08/25 20:59:42 ross Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)lcmd2.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: lcmd2.c,v 1.9 1998/08/25 20:59:42 ross Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <string.h>
+#include "defs.h"
+#include "window_string.h"
+#include "var.h"
+#include "lcmd.h"
+#include "alias.h"
+
+int    printalias __P((void *, struct var *));
+int    printvar __P((void *, struct var *));
+char   *strtime __P((struct timeval *t));
+
+void
+l_iostat(v, a)
+       struct value *v, *a;
+{
+       struct ww *w;
+
+       if ((w = openiwin(16, "IO Statistics")) == 0) {
+               error("Can't open statistics window: %s.", wwerror());
+               return;
+       }
+       wwprintf(w, "ttflush\twrite\terror\tzero\tchar\n");
+       wwprintf(w, "%d\t%d\t%d\t%d\t%d\n",
+               wwnflush, wwnwr, wwnwre, wwnwrz, wwnwrc);
+       wwprintf(w, "token\tuse\tbad\tsaving\ttotal\tbaud\n");
+       wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d/%d (%.1f/%.1f)\n",
+               wwntokdef, wwntokuse, wwntokbad, wwntoksave, wwntokc,
+               wwntokc - wwntoksave ?
+                       (int) ((float) wwbaud * wwntokc /
+                                       (wwntokc - wwntoksave)) :
+                       wwbaud,
+               wwnwrc ? (int) ((float) wwbaud * (wwnwrc + wwntoksave) /
+                                       wwnwrc) :
+                       wwbaud,
+               wwntokc - wwntoksave ?
+                       (float) wwntokc / (wwntokc - wwntoksave) : 1.0,
+               wwnwrc ? (float) (wwnwrc + wwntoksave) / wwnwrc : 1.0);
+       wwprintf(w, "wwwrite\tattempt\tchar\n");
+       wwprintf(w, "%d\t%d\t%d\n",
+               wwnwwr, wwnwwra, wwnwwrc);
+       wwprintf(w, "wwupdat\tline\tmiss\tscan\tclreol\tclreos\tmiss\tline\n");
+       wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
+               wwnupdate, wwnupdline, wwnupdmiss, wwnupdscan, wwnupdclreol,
+               wwnupdclreos, wwnupdclreosmiss, wwnupdclreosline);
+       wwprintf(w, "select\terror\tzero\n");
+       wwprintf(w, "%d\t%d\t%d\n",
+               wwnselect, wwnselecte, wwnselectz);
+       wwprintf(w, "read\terror\tzero\tchar\tack\tnack\tstat\terrorc\n");
+       wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
+               wwnread, wwnreade, wwnreadz, wwnreadc, wwnreadack, wwnreadnack,
+               wwnreadstat, wwnreadec);
+       wwprintf(w, "ptyread\terror\tzero\tcontrol\tdata\tchar\n");
+       wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\n",
+               wwnwread, wwnwreade, wwnwreadz,
+               wwnwreadp, wwnwreadd, wwnwreadc);
+       waitnl(w);
+       closeiwin(w);
+}
+
+struct lcmd_arg arg_time[] = {
+       { "who",        1,      ARG_STR },
+       { 0 }
+};
+
+void
+l_time(v, a)
+       struct value *v, *a;
+{
+       struct ww *w;
+       struct rusage rusage;
+       struct timeval timeval;
+
+       if ((w = openiwin(8, "Timing and Resource Usage")) == 0) {
+               error("Can't open time window: %s.", wwerror());
+               return;
+       }
+
+       (void) gettimeofday(&timeval, (struct timezone *)0);
+        timersub(&timeval, &starttime, &timeval);
+       (void) getrusage(a->v_type == V_STR
+                       && str_match(a->v_str, "children", 1)
+               ? RUSAGE_CHILDREN : RUSAGE_SELF, &rusage);
+
+       wwprintf(w, "%-15s %-15s %-15s\n",
+               "time", "utime", "stime");
+       wwprintf(w, "%-15s ", strtime(&timeval));
+       wwprintf(w, "%-15s ", strtime(&rusage.ru_utime));
+       wwprintf(w, "%-15s\n", strtime(&rusage.ru_stime));
+       wwprintf(w, "%-15s %-15s %-15s %-15s\n",
+               "maxrss", "ixrss", "idrss", "isrss");
+       wwprintf(w, "%-15ld %-15ld %-15ld %-15ld\n",
+               rusage.ru_maxrss, rusage.ru_ixrss,
+               rusage.ru_idrss, rusage.ru_isrss);
+       wwprintf(w, "%-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s\n",
+               "minflt", "majflt", "nswap", "inblk", "oublk",
+               "msgsnd", "msgrcv", "nsigs", "nvcsw", "nivcsw");
+       wwprintf(w, "%-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld\n",
+               rusage.ru_minflt, rusage.ru_majflt, rusage.ru_nswap,
+               rusage.ru_inblock, rusage.ru_oublock,
+               rusage.ru_msgsnd, rusage.ru_msgrcv, rusage.ru_nsignals,
+               rusage.ru_nvcsw, rusage.ru_nivcsw);
+
+       waitnl(w);
+       closeiwin(w);
+}
+
+char *
+strtime(t)
+       struct timeval *t;
+{
+       char fill = 0;
+       static char buf[20];
+       char *p = buf;
+
+       if (t->tv_sec > 60*60) {
+               (void) sprintf(p, "%ld:", (long int)t->tv_sec / (60*60));
+               while (*p++)
+                       ;
+               p--;
+               t->tv_sec %= 60*60;
+               fill++;
+       }
+       if (t->tv_sec > 60) {
+               (void) sprintf(p, fill ? "%02ld:" : "%ld:", t->tv_sec / 60);
+               while (*p++)
+                       ;
+               p--;
+               t->tv_sec %= 60;
+               fill++;
+       }
+       (void) sprintf(p, fill ? "%02ld.%02d" : "%ld.%02ld",
+               t->tv_sec, t->tv_usec / 10000);
+       return buf;
+}
+
+void
+l_list(v, a)
+       struct value *v, *a;
+{
+       struct ww *w, *wp;
+       int i;
+       int n;
+
+       for (n = 0, i = 0; i < NWINDOW; i++)
+               if (window[i] != 0)
+                       n++;
+       if (n == 0) {
+               error("No windows.");
+               return;
+       }
+       if ((w = openiwin(n + 2, "Windows")) == 0) {
+               error("Can't open listing window: %s.", wwerror());
+               return;
+       }
+       for (i = 0; i < NWINDOW; i++) {
+               if ((wp = window[i]) == 0)
+                       continue;
+               wwprintf(w, "%c %c %-13s %-.*s\n",
+                       wp == selwin ? '+' : (wp == lastselwin ? '-' : ' '),
+                       i + '1',
+                       wp->ww_state == WWS_HASPROC ? "" : "(No process)",
+                       wwncol - 20,
+                       wp->ww_label ? wp->ww_label : "(No label)");
+       }
+       waitnl(w);
+       closeiwin(w);
+}
+
+void
+l_variable(v, a)
+       struct value *v, *a;
+{
+       struct ww *w;
+
+       if ((w = openiwin(wwnrow - 3, "Variables")) == 0) {
+               error("Can't open variable window: %s.", wwerror());
+               return;
+       }
+       if (var_walk(printvar, (void *)w) >= 0)
+               waitnl(w);
+       closeiwin(w);
+}
+
+int
+printvar(vw, r)
+       void *vw;
+       struct var *r;
+{
+       struct ww *w = vw;
+       if (more(w, 0) == 2)
+               return -1;
+       wwprintf(w, "%16s    ", r->r_name);
+       switch (r->r_val.v_type) {
+       case V_STR:
+               wwprintf(w, "%s\n", r->r_val.v_str);
+               break;
+       case V_NUM:
+               wwprintf(w, "%d\n", r->r_val.v_num);
+               break;
+       case V_ERR:
+               wwprintf(w, "ERROR\n");
+               break;
+       }
+       return 0;
+}
+
+struct lcmd_arg arg_def_shell[] = {
+       { "",   0,              ARG_ANY|ARG_LIST },
+       { 0 }
+};
+
+void
+l_def_shell(v, a)
+       struct value *v, *a;
+{
+       char **pp;
+       struct value *vp;
+
+       if (a->v_type == V_ERR) {
+               if ((v->v_str = str_cpy(default_shellfile)) != 0)
+                       v->v_type = V_STR;
+               return;
+       }
+       if ((v->v_str = default_shellfile)) {
+               v->v_type = V_STR;
+               for (pp = default_shell + 1; *pp; pp++) {
+                       str_free(*pp);
+                       *pp = 0;
+               }
+       }
+       for (pp = default_shell, vp = a;
+            vp->v_type != V_ERR &&
+            pp < &default_shell[sizeof default_shell/sizeof *default_shell-1];
+            pp++, vp++)
+               if ((*pp = vp->v_type == V_STR ?
+                    str_cpy(vp->v_str) : str_itoa(vp->v_num)) == 0) {
+                       /* just leave default_shell[] the way it is */
+                       p_memerror();
+                       break;
+               }
+       if ((default_shellfile = *default_shell)) {
+               if ((*default_shell = strrchr(default_shellfile, '/')))
+                       (*default_shell)++;
+               else
+                       *default_shell = default_shellfile;
+       }
+}
+
+struct lcmd_arg arg_alias[] = {
+       { "",   0,              ARG_STR },
+       { "",   0,              ARG_STR|ARG_LIST },
+       { 0 }
+};
+
+void
+l_alias(v, a)
+       struct value *v, *a;
+{
+       if (a->v_type == V_ERR) {
+               struct ww *w;
+
+               if ((w = openiwin(wwnrow - 3, "Aliases")) == 0) {
+                       error("Can't open alias window: %s.", wwerror());
+                       return;
+               }
+               if (alias_walk(printalias, (void *)w) >= 0)
+                       waitnl(w);
+               closeiwin(w);
+       } else {
+               struct alias *ap = 0;
+
+               if ((ap = alias_lookup(a->v_str))) {
+                       if ((v->v_str = str_cpy(ap->a_buf)) == 0) {
+                               p_memerror();
+                               return;
+                       }
+                       v->v_type = V_STR;
+               }
+               if (a[1].v_type == V_STR) {
+                       struct value *vp;
+                       char *p, *q;
+                       char *str;
+                       int n;
+
+                       for (n = 0, vp = a + 1; vp->v_type != V_ERR; vp++, n++)
+                               for (p = vp->v_str; *p; p++, n++)
+                                       ;
+                       if ((str = str_alloc(n)) == 0) {
+                               p_memerror();
+                               return;
+                       }
+                       for (q = str, vp = a + 1; vp->v_type != V_ERR;
+                            vp++, q[-1] = ' ')
+                               for (p = vp->v_str; (*q++ = *p++);)
+                                       ;
+                       q[-1] = 0;
+                       if ((ap = alias_set(a[0].v_str, (char *)0)) == 0) {
+                               p_memerror();
+                               str_free(str);
+                               return;
+                       }
+                       ap->a_buf = str;
+               }
+       }
+}
+
+int
+printalias(vw, a)
+       void *vw;
+       struct alias *a;
+{
+       struct ww *w = vw;
+       if (more(w, 0) == 2)
+               return -1;
+       wwprintf(w, "%16s    %s\n", a->a_name, a->a_buf);
+       return 0;
+}
+
+struct lcmd_arg arg_unalias[] = {
+       { "alias",      1,      ARG_STR },
+       { 0 }
+};
+
+void
+l_unalias(v, a)
+       struct value *v, *a;
+{
+       if (a->v_type == ARG_STR)
+               v->v_num = alias_unset(a->v_str);
+       v->v_type = V_NUM;
+}
+
+struct lcmd_arg arg_echo[] = {
+       { "window",     1,      ARG_NUM },
+       { "",           0,      ARG_ANY|ARG_LIST },
+       { 0 }
+};
+
+void
+l_echo(v, a)
+       struct value *v, *a;
+{
+       char buf[20];
+       struct ww *w;
+
+       if ((w = vtowin(a++, selwin)) == 0)
+               return;
+       while (a->v_type != V_ERR) {
+               if (a->v_type == V_NUM) {
+                       (void) sprintf(buf, "%d", a->v_num);
+                       (void) wwwrite(w, buf, strlen(buf));
+               } else
+                       (void) wwwrite(w, a->v_str, strlen(a->v_str));
+               if ((++a)->v_type != V_ERR)
+                       (void) wwwrite(w, " ", 1);
+       }
+       (void) wwwrite(w, "\r\n", 2);
+}
diff --git a/window/local.h b/window/local.h
new file mode 100644 (file)
index 0000000..435b5fa
--- /dev/null
@@ -0,0 +1,53 @@
+/*     $NetBSD: local.h,v 1.3 1995/09/28 10:34:26 tls Exp $    */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)local.h     8.1 (Berkeley) 6/6/93
+ */
+
+/*
+ * Things of local interest.
+ */
+
+#define RUNCOM         ".windowrc"
+#define ESCAPEC                ctrl('p')
+#define NLINE          48                      /* default text buffer size */
+
+#ifdef TERMINFO
+#define _PATH_CAPTOINFO        "/usr/5bin/captoinfo"
+#define _PATH_TIC      "/usr/5bin/tic"
+#define _PATH_RM       "/bin/rm"
+#endif
diff --git a/window/main.c b/window/main.c
new file mode 100644 (file)
index 0000000..e0f4544
--- /dev/null
@@ -0,0 +1,207 @@
+/*     $NetBSD: main.c,v 1.8 1998/02/03 04:27:35 perry Exp $   */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1983, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)main.c     8.2 (Berkeley) 4/2/94";
+#else
+__RCSID("$NetBSD: main.c,v 1.8 1998/02/03 04:27:35 perry Exp $");
+#endif
+#endif /* not lint */
+
+#include <err.h>
+#include <paths.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "defs.h"
+#include "window_string.h"
+#include "char.h"
+#include "local.h"
+
+int    main __P((int, char **));
+void   usage __P((void));
+
+extern char *__progname;       /* from crt0.o */
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       char *p;
+       char fflag = 0;
+       char dflag = 0;
+       char xflag = 0;
+       char *cmd = 0;
+       char tflag = 0;
+       int ch;
+
+       escapec = ESCAPEC;      
+       debug = strcmp(__progname, "a.out") == 0;
+       while ((ch = getopt(argc, argv, "fc:e:tdDx")) != -1) {
+               switch (ch) {
+               case 'f':
+                       fflag++;
+                       break;
+               case 'c':
+                       if (cmd != 0) {
+                               warnx("Only one -c allowed");
+                               usage();
+                       }
+                       cmd = optarg;
+                       break;
+               case 'e':
+                       setescape(optarg);
+                       break;
+               case 't':
+                       tflag++;
+                       break;
+               case 'd':
+                       dflag++;
+                       break;
+               case 'D':
+                       debug = !debug;
+                       break;
+               case 'x':
+                       xflag++;
+                       break;
+               default:
+                       usage();
+               }
+       }
+       if ((p = getenv("SHELL")) == 0)
+               p = _PATH_BSHELL;
+       if ((default_shellfile = str_cpy(p)) == 0)
+               errx(1, "Out of memory.");
+       if ((p = strrchr(default_shellfile, '/')))
+               p++;
+       else
+               p = default_shellfile;
+       default_shell[0] = p;
+       default_shell[1] = 0;
+       default_nline = NLINE;
+       default_smooth = 1;
+       (void) gettimeofday(&starttime, (struct timezone *)0);
+       if (wwinit() < 0)
+               errx(1, "%s", wwerror());
+
+#ifdef OLD_TTY
+       if (debug)
+               wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
+       if (xflag) {
+               wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
+               wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
+       }
+#else
+       if (debug) {
+               wwnewtty.ww_termios.c_cc[VQUIT] =
+                       wwoldtty.ww_termios.c_cc[VQUIT];
+               wwnewtty.ww_termios.c_lflag |= ISIG;
+       }
+       if (xflag) {
+               wwnewtty.ww_termios.c_cc[VSTOP] =
+                       wwoldtty.ww_termios.c_cc[VSTOP];
+               wwnewtty.ww_termios.c_cc[VSTART] =
+                       wwoldtty.ww_termios.c_cc[VSTART];
+               wwnewtty.ww_termios.c_iflag |= IXON;
+       }
+#endif
+       if (debug || xflag)
+               (void) wwsettty(0, &wwnewtty);
+
+       if ((cmdwin = wwopen(WWT_INTERNAL, wwbaud > 2400 ? WWO_REVERSE : 0, 1,
+                            wwncol, 0, 0, 0)) == 0) {
+               wwflush();
+               warnx("%s.\r", wwerror());
+               goto bad;
+       }
+       SET(cmdwin->ww_wflags,
+           WWW_MAPNL | WWW_NOINTR | WWW_NOUPDATE | WWW_UNCTRL);
+       if ((framewin = wwopen(WWT_INTERNAL, WWO_GLASS|WWO_FRAME, wwnrow,
+                              wwncol, 0, 0, 0)) == 0) {
+               wwflush();
+               warnx("%s.\r", wwerror());
+               goto bad;
+       }
+       wwadd(framewin, &wwhead);
+       if ((boxwin = wwopen(WWT_INTERNAL, WWO_GLASS, wwnrow, wwncol, 0, 0, 0))
+           == 0) {
+               wwflush();
+               warnx("%s.\r", wwerror());
+               goto bad;
+       }
+       fgwin = framewin;
+
+       wwupdate();
+       wwflush();
+       setvars();
+
+       setterse(tflag);
+       setcmd(1);
+       if (cmd != 0)
+               (void) dolongcmd(cmd, (struct value *)0, 0);
+       if (!fflag)
+               if (dflag || doconfig() < 0)
+                       dodefault();
+       if (selwin != 0)
+               setcmd(0);
+
+       mloop();
+
+bad:
+       wwend(1);
+       return 0;
+}
+
+void
+usage()
+{
+       (void) fprintf(stderr,
+           "Usage: %s [-e escape-char] [-c command] [-t] [-f] [-d]\n",
+           __progname);
+       exit(1);
+}
diff --git a/window/mloop.c b/window/mloop.c
new file mode 100644 (file)
index 0000000..d2848c5
--- /dev/null
@@ -0,0 +1,96 @@
+/*     $NetBSD: mloop.c,v 1.6 1997/11/21 08:36:08 lukem Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)mloop.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: mloop.c,v 1.6 1997/11/21 08:36:08 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <unistd.h>
+#include "defs.h"
+
+void
+mloop()
+{
+       while (!quit) {
+               if (incmd) {
+                       docmd();
+               } else if (wwcurwin->ww_state != WWS_HASPROC) {
+                       if (!ISSET(wwcurwin->ww_uflags, WWU_KEEPOPEN))
+                               closewin(wwcurwin);
+                       setcmd(1);
+                       if (wwpeekc() == escapec)
+                               (void) wwgetc();
+                       error("Process died.");
+               } else {
+                       struct ww *w = wwcurwin;
+                       char *p;
+                       int n;
+
+                       if (wwibp >= wwibq) {
+                               wwibp = wwibq = wwib;
+                               wwiomux();
+                       }
+                       for (p = wwibp; p < wwibq && wwmaskc(*p) != escapec;
+                            p++)
+                               ;
+                       if ((n = p - wwibp) > 0) {
+                               if (w->ww_type != WWT_PTY &&
+                                   ISSET(w->ww_pflags, WWP_STOPPED))
+                                       startwin(w);
+#if defined(sun) && !defined(BSD)
+                               /* workaround for SunOS pty bug */
+                               while (--n >= 0)
+                                       (void) write(w->ww_pty, wwibp++, 1);
+#else
+                               (void) write(w->ww_pty, wwibp, n);
+                               wwibp = p;
+#endif
+                       }
+                       if (wwpeekc() == escapec) {
+                               (void) wwgetc();
+                               setcmd(1);
+                       }
+               }
+       }
+}
diff --git a/window/parser.h b/window/parser.h
new file mode 100644 (file)
index 0000000..e1a8ec5
--- /dev/null
@@ -0,0 +1,65 @@
+/*     $NetBSD: parser.h,v 1.4 1997/11/21 08:36:09 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)parser.h    8.1 (Berkeley) 6/6/93
+ */
+
+#include "context.h"
+#include "token.h"
+#include "window_string.h"
+
+#define p_erred()      (cx.x_erred)
+#define p_synerred()   (cx.x_synerred)
+#define p_clearerr()   (cx.x_erred = cx.x_synerred = 0)
+#define p_abort()      (cx.x_abort)
+
+int    p_assign __P((char *, struct value *, int));
+int    p_convstr __P((struct value *v));
+void   p_error __P((const char *msg, ...));
+int    p_expr __P((struct value *, char));
+int    p_expr0 __P((struct value *, char));
+int    p_expr1 __P((struct value *, char));
+int    p_expr11 __P((struct value *, char));
+int    p_expr12 __P((struct value *, char));
+int    p_expr2 __P((struct value *, char));
+int    p_expr3_10 __P((int, struct value *, char));
+int    p_expression __P((char));
+int    p_function __P((char *, struct value *, int));
+int    p_if __P((char));
+int    p_statement __P((char));
+void   p_statementlist __P((char));
+void   p_synerror __P((void));
diff --git a/window/parser1.c b/window/parser1.c
new file mode 100644 (file)
index 0000000..b6f2249
--- /dev/null
@@ -0,0 +1,249 @@
+/*     $NetBSD: parser1.c,v 1.4 1997/11/21 08:36:11 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)parser1.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: parser1.c,v 1.4 1997/11/21 08:36:11 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+#include "parser.h"
+
+void
+p_start()
+{
+       char flag = 1;
+
+       (void) s_gettok();
+       for (;;) {
+               p_statementlist(flag);
+               if (token == T_EOF || p_abort())
+                       break;
+               flag = 0;
+               p_synerror();
+               while (token != T_EOL && token != T_EOF) {
+                       if (token == T_STR)
+                               str_free(token_str);
+                       (void) s_gettok();
+               }
+               if (token == T_EOL)
+                       (void) s_gettok();
+               p_clearerr();
+       }
+}
+
+void
+p_statementlist(flag)
+       char flag;
+{
+       for (; p_statement(flag) >= 0; p_clearerr())
+               ;
+}
+
+int
+p_statement(flag)
+       char flag;
+{
+       switch (token) {
+       case T_EOL:
+               (void) s_gettok();
+               return 0;
+       case T_IF:
+               return p_if(flag);
+       default:
+               return p_expression(flag);
+       }
+}
+
+int
+p_if(flag)
+       char flag;
+{
+       struct value t;
+       char true = 0;
+
+top:
+       (void) s_gettok();
+
+       if (p_expr(&t, flag) < 0) {
+               p_synerror();
+               return -1;
+       }
+       switch (t.v_type) {
+       case V_NUM:
+               true = !true && t.v_num != 0;
+               break;
+       case V_STR:
+               p_error("if: Numeric value required.");
+               str_free(t.v_str);
+       case V_ERR:
+               flag = 0;
+               break;
+       }
+
+       if (token != T_THEN) {
+               p_synerror();
+               return -1;
+       }
+
+       (void) s_gettok();
+       p_statementlist(flag && true);
+       if (p_erred())
+               return -1;
+
+       if (token == T_ELSIF)
+               goto top;
+
+       if (token == T_ELSE) {
+               (void) s_gettok();
+               p_statementlist(flag && !true);
+               if (p_erred())
+                       return -1;
+       }
+
+       if (token == T_ENDIF) {
+               (void) s_gettok();
+               return 0;
+       }
+
+       p_synerror();
+       return -1;
+}
+
+int
+p_expression(flag)
+       char flag;
+{
+       struct value t;
+       char *cmd;
+
+       switch (token) {
+       case T_NUM:
+               t.v_type = V_NUM;
+               t.v_num = token_num;
+               (void) s_gettok();
+               break;
+       case T_STR:
+               t.v_type = V_STR;
+               t.v_str = token_str;
+               (void) s_gettok();
+               break;
+       default:
+               if (p_expr(&t, flag) < 0)
+                       return -1;
+               if (token == T_EOF) {
+                       val_free(t);
+                       return 0;
+               }
+       }
+       if (token != T_ASSIGN && p_convstr(&t) < 0)
+               return -1;
+       cmd = t.v_type == V_STR ? t.v_str : 0;
+       if ((*(token == T_ASSIGN ? p_assign : p_function))(cmd, &t, flag) < 0) {
+               if (cmd)
+                       str_free(cmd);
+               return -1;
+       }
+       if (cmd)
+               str_free(cmd);
+       val_free(t);
+       if (token == T_EOL)
+               (void) s_gettok();
+       else if (token != T_EOF) {
+               p_synerror();
+               return -1;
+       }
+       return 0;
+}
+
+int
+p_convstr(v)
+       struct value *v;
+{
+       if (v->v_type != V_NUM)
+               return 0;
+       if ((v->v_str = str_itoa(v->v_num)) == 0) {
+               p_memerror();
+               v->v_type = V_ERR;
+               return -1;
+       }
+       v->v_type = V_STR;
+       return 0;
+}
+
+void
+p_synerror()
+{
+       if (!cx.x_synerred) {
+               cx.x_synerred = cx.x_erred = 1;
+               error("Syntax error.");
+       }
+}
+
+void
+#if __STDC__
+p_error(const char *msg, ...)
+#else
+p_error(msg, ..)
+       char *msg;
+       va_dcl
+#endif
+{
+       va_list ap;
+#if __STDC__
+       va_start(ap, msg);
+#else
+       va_start(ap);
+#endif
+       if (!cx.x_erred) {
+               cx.x_erred = 1;
+               verror(msg, ap);
+       }
+       va_end(ap);
+}
+
+void
+p_memerror()
+{
+       cx.x_erred = cx.x_abort = 1;
+       error("Out of memory.");
+}
diff --git a/window/parser2.c b/window/parser2.c
new file mode 100644 (file)
index 0000000..963b8b9
--- /dev/null
@@ -0,0 +1,247 @@
+/*     $NetBSD: parser2.c,v 1.5 1998/08/25 20:59:42 ross Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)parser2.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: parser2.c,v 1.5 1998/08/25 20:59:42 ross Exp $");
+#endif
+#endif /* not lint */
+
+#define EXTERN
+#include "ww.h"
+#include "defs.h"
+#include "alias.h"
+#undef  EXTERN
+#include "parser.h"
+#include "var.h"
+#include "lcmd.h"
+
+/*
+ * name == 0 means we don't have a function name but
+ * want to parse the arguments anyway.  flag == 0 in this case.
+ */
+int
+p_function(name, v, flag)
+       char *name;
+       struct value *v;
+       int flag;
+{
+       struct value t;
+       struct lcmd_tab *c = 0;
+       struct alias *a = 0;
+       struct lcmd_arg *ap;                    /* this arg */
+       struct lcmd_arg *lp = 0;                /* list arg */
+       int i;
+       struct value av[LCMD_NARG + 1];
+       struct value *vp;
+
+       if (name != 0) {
+               if ((c = lcmd_lookup(name)))
+                       name = c->lc_name;
+               else if ((a = alias_lookup(name)))
+                       name = a->a_name;
+               else {
+                       p_error("%s: No such command or alias.", name);
+                       flag = 0;
+               }
+       }
+       for (vp = av; vp < &av[LCMD_NARG + 1]; vp++)
+               vp->v_type = V_ERR;
+
+       if (token == T_LP)
+               (void) s_gettok();
+       i = 0;
+       for (;;) {
+               ap = 0;
+               vp = 0;
+               if (token == T_COMMA)           /* null argument */
+                       t.v_type = V_ERR;
+               else {
+                       if (p_expr0(&t, flag) < 0)
+                               break;
+                       if (t.v_type == V_ERR)
+                               flag = 0;
+               }
+               if (token != T_ASSIGN) {
+                       if (i >= LCMD_NARG ||
+                           (c != 0 && (ap = lp) == 0 &&
+                           (ap = c->lc_arg + i)->arg_name == 0)) {
+                               p_error("%s: Too many arguments.", name);
+                               flag = 0;
+                       } else
+                               vp = &av[i++];
+               } else {
+                       char *tmp;
+                       if (p_convstr(&t) < 0)
+                               goto abort;
+                       tmp = t.v_type == V_STR ? t.v_str : 0;
+                       (void) s_gettok();
+                       if (p_expr(&t, flag) < 0) {
+                               if (tmp)
+                                       str_free(tmp);
+                               p_synerror();
+                               goto abort;
+                       }
+                       if (t.v_type == V_ERR)
+                               flag = 0;
+                       if (tmp) {
+                               if (c == 0) {
+                                       /* an aliase */
+                                       p_error("%s: Bad alias syntax.", name);
+                                       flag = 0;
+                               } else {
+                                       for (ap = c->lc_arg, vp = av;
+                                            ap != 0 && ap->arg_name != 0 &&
+                                            (*ap->arg_name == '\0' ||
+                                             !str_match(tmp, ap->arg_name,
+                                                       ap->arg_minlen));
+                                            ap++, vp++)
+                                               ;
+                                       if (ap == 0 || ap->arg_name == 0) {
+                                               p_error("%s: Unknown argument \"%s\".",
+                                                       name, tmp);
+                                               flag = 0;
+                                               ap = 0;
+                                               vp = 0;
+                                       }
+                               }
+                               str_free(tmp);
+                       }
+               }
+               if (ap != 0) {
+                       if (ap->arg_flags & ARG_LIST) {
+                               i = vp - av + 1;
+                               lp = ap;
+                       }
+                       if (vp->v_type != V_ERR) {
+                               if (*ap->arg_name)
+                                       p_error("%s: Argument %d (%s) duplicated.",
+                                               name, vp - av + 1,
+                                               ap->arg_name);
+                               else
+                                       p_error("%s: Argument %d duplicated.",
+                                               name, vp - av + 1);
+                               flag = 0;
+                               vp = 0;
+                       } else if (t.v_type == V_ERR) {
+                               /* do nothing */
+                       } else if (((ap->arg_flags&ARG_TYPE) == ARG_NUM &&
+                                   t.v_type != V_NUM) ||
+                                  ((ap->arg_flags&ARG_TYPE) == ARG_STR &&
+                                  t.v_type != V_STR)) {
+                               if (*ap->arg_name)
+                                       p_error("%s: Argument %d (%s) type mismatch.",
+                                               name, vp - av + 1,
+                                               ap->arg_name);
+                               else
+                                       p_error("%s: Argument %d type mismatch.",
+                                               name, vp - av + 1);
+                               flag = 0;
+                               vp = 0;
+                       }
+               }
+               if (vp != 0)
+                       *vp = t;
+               else
+                       val_free(t);
+               if (token == T_COMMA)
+                       (void) s_gettok();
+       }
+
+       if (p_erred())
+               flag = 0;
+       if (token == T_RP)
+               (void) s_gettok();
+       else if (token != T_EOL && token != T_EOF)
+               flag = 0;               /* look for legal follow set */
+       v->v_type = V_ERR;
+       if (flag) {
+               if (c != 0)
+                       (*c->lc_func)(v, av);
+               else {
+                       if (a->a_flags & A_INUSE)
+                               p_error("%s: Recursive alias.", a->a_name);
+                       else {
+                               a->a_flags |= A_INUSE;
+                               if (dolongcmd(a->a_buf, av, i) < 0)
+                                       p_memerror();
+                               a->a_flags &= ~A_INUSE;
+                       }
+               }
+       }
+       if (p_abort()) {
+               val_free(*v);
+               v->v_type = V_ERR;
+               goto abort;
+       }
+       for (vp = av; vp < &av[LCMD_NARG]; vp++)
+               val_free(*vp);
+       return 0;
+abort:
+       for (vp = av; vp < &av[LCMD_NARG]; vp++)
+               val_free(*vp);
+       return -1;
+}
+
+int
+p_assign(name, v, flag)
+       char *name;
+       struct value *v;
+       char flag;
+{
+       (void) s_gettok();
+
+       if (p_expr(v, flag) < 0) {
+               p_synerror();
+               return -1;
+       }
+       switch (v->v_type) {
+       case V_STR:
+       case V_NUM:
+               if (flag && var_set(name, v) == 0) {
+                       p_memerror();
+                       val_free(*v);
+                       return -1;
+               }
+               break;
+       }
+       return 0;
+}
diff --git a/window/parser3.c b/window/parser3.c
new file mode 100644 (file)
index 0000000..fd3104e
--- /dev/null
@@ -0,0 +1,203 @@
+/*     $NetBSD: parser3.c,v 1.4 1997/11/21 08:36:14 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)parser3.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: parser3.c,v 1.4 1997/11/21 08:36:14 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+#include "parser.h"
+
+/*
+ * =
+ * ? :
+ * ||
+ * &&
+ * |
+ * ^
+ * &
+ * == !=
+ * <= >=
+ * << >>
+ * + -
+ * * / %
+ * unary - + ~ !
+ */
+int
+p_expr(v, flag)
+       struct value *v;
+       char flag;
+{
+       struct value t;
+       int ret;
+
+       if (p_expr0(&t, flag) < 0)
+               return -1;
+
+       if (token != T_ASSIGN) {
+               *v = t;
+               return 0;
+       }
+       switch (t.v_type) {
+       case V_NUM:
+               p_error("%d: Not a variable.", t.v_num);
+       case V_ERR:
+               t.v_str = 0;
+               break;
+       }
+       ret = p_assign(t.v_str, v, flag);
+       if (t.v_str != 0)
+               str_free(t.v_str);
+       return ret;
+}
+
+/*
+ * ? :
+ */
+int
+p_expr0(v, flag)
+       struct value *v;
+       char flag;
+{
+       struct value t;
+       char true = 0;
+
+       if (p_expr1(v, flag) < 0)
+               return -1;
+       if (token != T_QUEST)
+               return 0;
+       switch (v->v_type) {
+       case V_NUM:
+               true = v->v_num != 0;
+               break;
+       case V_STR:
+               p_error("?: Numeric left operand required.");
+               str_free(v->v_str);
+               v->v_type = V_ERR;
+       case V_ERR:
+               flag = 0;
+               break;
+       }
+       (void) s_gettok();
+       v->v_type = V_ERR;
+       if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0)
+               return -1;
+       if (token != T_COLON) {
+               val_free(*v);
+               p_synerror();
+               return -1;
+       }
+       (void) s_gettok();
+       return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0);
+}
+
+/*
+ * ||
+ */
+int
+p_expr1(v, flag)
+       struct value *v;
+       char flag;
+{
+       char true = 0;
+
+       if (p_expr2(v, flag) < 0)
+               return -1;
+       if (token != T_OROR)
+               return 0;
+       for (;;) {
+               switch (v->v_type) {
+               case V_NUM:
+                       v->v_num = true = true || v->v_num != 0;
+                       break;
+               case V_STR:
+                       p_error("||: Numeric operands required.");
+                       str_free(v->v_str);
+                       v->v_type = V_ERR;
+               case V_ERR:
+                       flag = 0;
+                       break;
+               }
+               if (token != T_OROR)
+                       return 0;
+               (void) s_gettok();
+               if (p_expr2(v, flag && !true) < 0)
+                       return -1;
+       }
+}
+
+/*
+ * &&
+ */
+int
+p_expr2(v, flag)
+       struct value *v;
+       char flag;
+{
+       char true = 1;
+
+       if (p_expr3_10(3, v, flag) < 0)
+               return -1;
+       if (token != T_ANDAND)
+               return 0;
+       for (;;) {
+               switch (v->v_type) {
+               case V_NUM:
+                       v->v_num = true = true && v->v_num != 0;
+                       break;
+               case V_STR:
+                       p_error("&&: Numeric operands required.");
+                       str_free(v->v_str);
+                       v->v_type = V_ERR;
+               case V_ERR:
+                       flag = 0;
+                       break;
+               }
+               if (token != T_ANDAND)
+                       return 0;
+               (void) s_gettok();
+               if (p_expr3_10(3, v, flag && true) < 0)
+                       return -1;
+       }
+       /*NOTREACHED*/
+}
diff --git a/window/parser4.c b/window/parser4.c
new file mode 100644 (file)
index 0000000..07782c2
--- /dev/null
@@ -0,0 +1,307 @@
+/*     $NetBSD: parser4.c,v 1.6 1997/11/21 08:36:15 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)parser4.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: parser4.c,v 1.6 1997/11/21 08:36:15 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <string.h>
+#include "defs.h"
+#include "parser.h"
+
+/*
+ * |           3
+ * ^           4
+ * &           5
+ * == !=       6
+ * < <= > >=   7
+ * << >>       8
+ * + -         9
+ * * / %       10
+ */
+int
+p_expr3_10(level, v, flag)
+       int level;
+       struct value *v;
+       char flag;
+{
+       struct value l, r;
+       int op;
+       char *opname = 0;
+
+       if ((level == 10 ? p_expr11(v, flag)
+            : p_expr3_10(level + 1, v, flag)) < 0)
+               return -1;
+       for (;;) {
+               switch (level) {
+               case 3:
+                       if (token != T_OR)
+                               return 0;
+                       opname = "|";
+                       break;
+               case 4:
+                       if (token != T_XOR)
+                               return 0;
+                       opname = "^";
+                       break;
+               case 5:
+                       if (token != T_AND)
+                               return 0;
+                       opname = "&";
+                       break;
+               case 6:
+                       if (token == T_EQ)
+                               opname = "==";
+                       else if (token == T_NE)
+                               opname = "!=";
+                       else
+                               return 0;
+                       break;
+               case 7:
+                       switch (token) {
+                       case T_LT:
+                               opname = "<";
+                               break;
+                       case T_LE:
+                               opname = "<=";
+                               break;
+                       case T_GT:
+                               opname = ">";
+                               break;
+                       case T_GE:
+                               opname = ">=";
+                               break;
+                       default:
+                               return 0;
+                       }
+                       break;
+               case 8:
+                       if (token == T_LS)
+                               opname = "<<";
+                       else if (token == T_RS)
+                               opname = ">>";
+                       else
+                               return 0;
+                       break;
+               case 9:
+                       if (token == T_PLUS)
+                               opname = "+";
+                       else if (token == T_MINUS)
+                               opname = "-";
+                       else
+                               return 0;
+                       break;
+               case 10:
+                       switch (token) {
+                       case T_MUL:
+                               opname = "*";
+                               break;
+                       case T_DIV:
+                               opname = "/";
+                               break;
+                       case T_MOD:
+                               opname = "%";
+                               break;
+                       default:
+                               return 0;
+                       }
+                       break;
+               }
+               l = *v;
+               if (l.v_type == V_ERR)
+                       flag = 0;
+
+               op = token;
+               (void) s_gettok();
+               if ((level == 10 ? p_expr11(&r, flag)
+                    : p_expr3_10(level + 1, &r, flag)) < 0) {
+                       p_synerror();
+                       val_free(l);
+                       return -1;
+               }
+
+               if (r.v_type == V_ERR)
+                       flag = 0;
+               else switch (op) {
+               case T_EQ:
+               case T_NE:
+               case T_LT:
+               case T_LE:
+               case T_GT:
+               case T_GE:
+               case T_PLUS:
+                       if (l.v_type == V_STR) {
+                               if (r.v_type == V_NUM)
+                                       if (p_convstr(&r) < 0)
+                                               flag = 0;
+                       } else
+                               if (r.v_type == V_STR)
+                                       if (p_convstr(&l) < 0)
+                                               flag = 0;
+                       break;
+               case T_LS:
+               case T_RS:
+                       if (r.v_type == V_STR) {
+                               char *p = r.v_str;
+                               r.v_type = V_NUM;
+                               r.v_num = strlen(p);
+                               str_free(p);
+                       }
+                       break;
+               case T_OR:
+               case T_XOR:
+               case T_AND:
+               case T_MINUS:
+               case T_MUL:
+               case T_DIV:
+               case T_MOD:
+               default:
+                       if (l.v_type == V_STR || r.v_type == V_STR) {
+                               p_error("%s: Numeric operands required.",
+                                       opname);
+                               flag = 0;
+                       }
+               }
+               if (!flag) {
+                       val_free(l);
+                       val_free(r);
+                       v->v_type = V_ERR;
+                       if (p_abort())
+                               return -1;
+                       continue;
+               }
+
+               v->v_type = V_NUM;
+               switch (op) {
+               case T_EQ:
+               case T_NE:
+               case T_LT:
+               case T_LE:
+               case T_GT:
+               case T_GE:
+                       if (l.v_type == V_STR) {
+                               int tmp = strcmp(l.v_str, r.v_str);
+                               str_free(l.v_str);
+                               str_free(r.v_str);
+                               l.v_type = V_NUM;
+                               l.v_num = tmp;
+                               r.v_type = V_NUM;
+                               r.v_num = 0;
+                       }
+                       break;
+               }
+               switch (op) {
+               case T_OR:
+                       v->v_num = l.v_num | r.v_num;
+                       break;
+               case T_XOR:
+                       v->v_num = l.v_num ^ r.v_num;
+                       break;
+               case T_AND:
+                       v->v_num = l.v_num & r.v_num;
+                       break;
+               case T_EQ:
+                       v->v_num = l.v_num == r.v_num;
+                       break;
+               case T_NE:
+                       v->v_num = l.v_num != r.v_num;
+                       break;
+               case T_LT:
+                       v->v_num = l.v_num < r.v_num;
+                       break;
+               case T_LE:
+                       v->v_num = l.v_num <= r.v_num;
+                       break;
+               case T_GT:
+                       v->v_num = l.v_num > r.v_num;
+                       break;
+               case T_GE:
+                       v->v_num = l.v_num >= r.v_num;
+                       break;
+               case T_LS:
+                       if (l.v_type == V_STR) {
+                               int i;
+                               if ((i = strlen(l.v_str)) > r.v_num)
+                                       i = r.v_num;
+                               v->v_str = str_ncpy(l.v_str, i);
+                               v->v_type = V_STR;
+                       } else
+                               v->v_num = l.v_num << r.v_num;
+                       break;
+               case T_RS:
+                       if (l.v_type == V_STR) {
+                               int i;
+                               if ((i = strlen(l.v_str)) > r.v_num)
+                                       i -= r.v_num;
+                               else
+                                       i = 0;
+                               v->v_str = str_cpy(l.v_str + i);
+                               v->v_type = V_STR;
+                       } else
+                               v->v_num = l.v_num >> r.v_num;
+                       break;
+               case T_PLUS:
+                       if (l.v_type == V_STR) {
+                               v->v_str = str_cat(l.v_str, r.v_str);
+                               v->v_type = V_STR;
+                       } else
+                               v->v_num = l.v_num + r.v_num;
+                       break;
+               case T_MINUS:
+                       v->v_num = l.v_num - r.v_num;
+                       break;
+               case T_MUL:
+                       v->v_num = l.v_num * r.v_num;
+                       break;
+               case T_DIV:
+                       v->v_num = l.v_num / r.v_num;
+                       break;
+               case T_MOD:
+                       v->v_num = l.v_num % r.v_num;
+                       break;
+               }
+               val_free(l);
+               val_free(r);
+       }
+       /*NOTREACHED*/
+}
diff --git a/window/parser5.c b/window/parser5.c
new file mode 100644 (file)
index 0000000..6fcc068
--- /dev/null
@@ -0,0 +1,211 @@
+/*     $NetBSD: parser5.c,v 1.4 1997/11/21 08:36:16 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)parser5.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: parser5.c,v 1.4 1997/11/21 08:36:16 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+#include "parser.h"
+#include "var.h"
+
+/*
+ * unary $ $? + - ! ~
+ */
+int
+p_expr11(v, flag)
+       struct value *v;
+       char flag;
+{
+       int op;
+       char *opname;
+
+       switch (token) {
+       case T_DOLLAR:
+               opname = "$";
+               break;
+       case T_DQ:
+               opname = "$?";
+               break;
+       case T_PLUS:
+               opname = "unary +";
+               break;
+       case T_MINUS:
+               opname = "unary -";
+               break;
+       case T_NOT:
+               opname = "!";
+               break;
+       case T_COMP:
+               opname = "~";
+               break;
+       default:
+               return p_expr12(v, flag);
+       }
+       op = token;
+       (void) s_gettok();
+       if (p_expr11(v, flag) < 0)
+               return -1;
+       switch (v->v_type) {
+       case V_NUM:
+               break;
+       case V_STR:
+               switch (op) {
+               case T_MINUS:
+               case T_NOT:
+               case T_COMP:
+                       p_error("%s: Numeric operand required.", opname);
+                       str_free(v->v_str);
+                       v->v_type = V_ERR;
+                       return 0;
+               }
+               break;
+       case V_ERR:
+               return 0;
+       }
+       switch (op) {
+       case T_DOLLAR:
+       case T_DQ:
+               if (v->v_type == V_NUM) {
+                       int tmp = cx.x_type == X_BUF && cx.x_arg != 0 &&
+                               v->v_num > 0 && v->v_num <= cx.x_narg;
+                       if (op == T_DQ)
+                               v->v_num = tmp;
+                       else if (tmp)
+                               *v = cx.x_arg[v->v_num - 1];
+                       else {
+                               p_error("%d: No such argument.", v->v_num);
+                               v->v_type = V_ERR;
+                       }
+               } else {
+                       char *name = v->v_str;
+                       struct var *r = var_lookup(name);
+                       if (op == T_DQ) {
+                               v->v_type = V_NUM;
+                               v->v_num = r != 0;
+                       } else if (r != 0)
+                               *v = r->r_val;
+                       else {
+                               p_error("%s: Undefined variable.", name);
+                               v->v_type = V_ERR;
+                       }
+                       str_free(name);
+               }
+               if (v->v_type == V_STR && (v->v_str = str_cpy(v->v_str)) == 0) {
+                       p_memerror();
+                       return -1;
+               }
+               break;
+       case T_MINUS:
+               v->v_num = - v->v_num;
+               break;
+       case T_NOT:
+               v->v_num = ! v->v_num;
+               break;
+       case T_COMP:
+               v->v_num = ~ v->v_num;
+               break;
+       }
+       return 0;
+}
+
+/*
+ * string, number, ( expr )
+ * Plus function calls.
+ *
+ * Always return v_type == V_ERR when flag == 0.
+ */
+int
+p_expr12(v, flag)
+       struct value *v;
+       char flag;
+{
+       v->v_type = V_ERR;
+       switch (token) {
+       case T_NUM:
+               if (flag) {
+                       v->v_type = V_NUM;
+                       v->v_num = token_num;
+               }
+               (void) s_gettok();
+               break;
+       case T_STR:
+               if (flag) {
+                       v->v_type = V_STR;
+                       v->v_str = token_str;
+               } else
+                       str_free(token_str);
+               (void) s_gettok();
+               break;
+       case T_LP:
+               (void) s_gettok();
+               if (p_expr(v, flag) < 0) {
+                       p_synerror();
+                       return -1;
+               }
+               if (token != T_RP) {
+                       p_synerror();
+                       val_free(*v);
+                       return -1;
+               }
+               (void) s_gettok();
+               break;
+       default:
+               return -1;
+       }
+       while (token == T_LP) {
+               char *cmd;
+
+               if (p_convstr(v) < 0)
+                       return -1;
+               cmd = v->v_type == V_STR ? v->v_str : 0;
+               if (p_function(cmd, v, flag) < 0) {
+                       if (cmd)
+                               str_free(cmd);
+                       return -1;
+               }
+               if (cmd)
+                       str_free(cmd);
+       }
+       return 0;
+}
diff --git a/window/scanner.c b/window/scanner.c
new file mode 100644 (file)
index 0000000..ea0ae55
--- /dev/null
@@ -0,0 +1,598 @@
+/*     $NetBSD: scanner.c,v 1.5 1998/08/25 20:59:43 ross Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)scanner.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: scanner.c,v 1.5 1998/08/25 20:59:43 ross Exp $");
+#endif
+#endif /* not lint */
+
+#include "defs.h"
+#include "token.h"
+#include "context.h"
+#include "window_string.h"
+
+int    s_getc __P((void));
+int    s_gettok1 __P((void));
+int    s_ungetc __P((int));
+
+int
+s_getc()
+{
+       int c;
+
+       switch (cx.x_type) {
+       case X_FILE:
+               c = getc(cx.x_fp);
+               if (cx.x_bol && c != EOF) {
+                       cx.x_bol = 0;
+                       cx.x_lineno++;
+               }
+               if (c == '\n')
+                       cx.x_bol = 1;
+               return c;
+       case X_BUF:
+               if (*cx.x_bufp != 0)
+                       return *cx.x_bufp++ & 0xff;
+               else
+                       return EOF;
+       }
+       /*NOTREACHED*/
+       return(0);              /* XXX: placate gcc */
+}
+
+int
+s_ungetc(c)
+       int c;
+{
+       if (c == EOF)
+               return EOF;
+       switch (cx.x_type) {
+       case X_FILE:
+               cx.x_bol = 0;
+               return ungetc(c, cx.x_fp);
+       case X_BUF:
+               if (cx.x_bufp > cx.x_buf)
+                       return *--cx.x_bufp = c;
+               else
+                       return EOF;
+       }
+       /*NOTREACHED*/
+       return(0);              /* XXX: placate gcc */
+}
+
+int
+s_gettok()
+{
+       char buf[100];
+       char *p = buf;
+       int c;
+       int state = 0;
+
+loop:
+       c = s_getc();
+       switch (state) {
+       case 0:
+               switch (c) {
+               case ' ':
+               case '\t':
+                       break;
+               case '\n':
+               case ';':
+                       cx.x_token = T_EOL;
+                       state = -1;
+                       break;
+               case '#':
+                       state = 1;
+                       break;
+               case EOF:
+                       cx.x_token = T_EOF;
+                       state = -1;
+                       break;
+               case 'a': case 'b': case 'c': case 'd': case 'e':
+               case 'f': case 'g': case 'h': case 'i': case 'j':
+               case 'k': case 'l': case 'm': case 'n': case 'o':
+               case 'p': case 'q': case 'r': case 's': case 't':
+               case 'u': case 'v': case 'w': case 'x': case 'y':
+               case 'z':
+               case 'A': case 'B': case 'C': case 'D': case 'E':
+               case 'F': case 'G': case 'H': case 'I': case 'J':
+               case 'K': case 'L': case 'M': case 'N': case 'O':
+               case 'P': case 'Q': case 'R': case 'S': case 'T':
+               case 'U': case 'V': case 'W': case 'X': case 'Y':
+               case 'Z':
+               case '_': case '.':
+                       *p++ = c;
+                       state = 2;
+                       break;
+               case '"':
+                       state = 3;
+                       break;
+               case '\'':
+                       state = 4;
+                       break;
+               case '\\':
+                       switch (c = s_gettok1()) {
+                       case -1:
+                               break;
+                       case -2:
+                               state = 0;
+                               break;
+                       default:
+                               *p++ = c;
+                               state = 2;
+                       }
+                       break;
+               case '0':
+                       cx.x_val.v_num = 0;
+                       state = 10;
+                       break;
+               case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       cx.x_val.v_num = c - '0';
+                       state = 11;
+                       break;
+               case '>':
+                       state = 20;
+                       break;
+               case '<':
+                       state = 21;
+                       break;
+               case '=':
+                       state = 22;
+                       break;
+               case '!':
+                       state = 23;
+                       break;
+               case '&':
+                       state = 24;
+                       break;
+               case '|':
+                       state = 25;
+                       break;
+               case '$':
+                       state = 26;
+                       break;
+               case '~':
+                       cx.x_token = T_COMP;
+                       state = -1;
+                       break;
+               case '+':
+                       cx.x_token = T_PLUS;
+                       state = -1;
+                       break;
+               case '-':
+                       cx.x_token = T_MINUS;
+                       state = -1;
+                       break;
+               case '*':
+                       cx.x_token = T_MUL;
+                       state = -1;
+                       break;
+               case '/':
+                       cx.x_token = T_DIV;
+                       state = -1;
+                       break;
+               case '%':
+                       cx.x_token = T_MOD;
+                       state = -1;
+                       break;
+               case '^':
+                       cx.x_token = T_XOR;
+                       state = -1;
+                       break;
+               case '(':
+                       cx.x_token = T_LP;
+                       state = -1;
+                       break;
+               case ')':
+                       cx.x_token = T_RP;
+                       state = -1;
+                       break;
+               case ',':
+                       cx.x_token = T_COMMA;
+                       state = -1;
+                       break;
+               case '?':
+                       cx.x_token = T_QUEST;
+                       state = -1;
+                       break;
+               case ':':
+                       cx.x_token = T_COLON;
+                       state = -1;
+                       break;
+               case '[':
+                       cx.x_token = T_LB;
+                       state = -1;
+                       break;
+               case ']':
+                       cx.x_token = T_RB;
+                       state = -1;
+                       break;
+               default:
+                       cx.x_val.v_num = c;
+                       cx.x_token = T_CHAR;
+                       state = -1;
+                       break;
+               }
+               break;
+       case 1:                         /* got # */
+               if (c == '\n' || c == EOF) {
+                       (void) s_ungetc(c);
+                       state = 0;
+               }
+               break;
+       case 2:                         /* unquoted string */
+               switch (c) {
+               case 'a': case 'b': case 'c': case 'd': case 'e':
+               case 'f': case 'g': case 'h': case 'i': case 'j':
+               case 'k': case 'l': case 'm': case 'n': case 'o':
+               case 'p': case 'q': case 'r': case 's': case 't':
+               case 'u': case 'v': case 'w': case 'x': case 'y':
+               case 'z':
+               case 'A': case 'B': case 'C': case 'D': case 'E':
+               case 'F': case 'G': case 'H': case 'I': case 'J':
+               case 'K': case 'L': case 'M': case 'N': case 'O':
+               case 'P': case 'Q': case 'R': case 'S': case 'T':
+               case 'U': case 'V': case 'W': case 'X': case 'Y':
+               case 'Z':
+               case '_': case '.':
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       if (p < buf + sizeof buf - 1)
+                               *p++ = c;
+                       break;
+               case '"':
+                       state = 3;
+                       break;
+               case '\'':
+                       state = 4;
+                       break;
+               case '\\':
+                       switch (c = s_gettok1()) {
+                       case -2:
+                               (void) s_ungetc(' ');
+                       case -1:
+                               break;
+                       default:
+                               if (p < buf + sizeof buf - 1)
+                                       *p++ = c;
+                       }
+                       break;
+               default:
+                       (void) s_ungetc(c);
+               case EOF:
+                       *p = 0;
+                       cx.x_token = T_STR;
+                       switch (*buf) {
+                       case 'i':
+                               if (buf[1] == 'f' && buf[2] == 0)
+                                       cx.x_token = T_IF;
+                               break;
+                       case 't':
+                               if (buf[1] == 'h' && buf[2] == 'e'
+                                   && buf[3] == 'n' && buf[4] == 0)
+                                       cx.x_token = T_THEN;
+                               break;
+                       case 'e':
+                               if (buf[1] == 'n' && buf[2] == 'd'
+                                   && buf[3] == 'i' && buf[4] == 'f'
+                                   && buf[5] == 0)
+                                       cx.x_token = T_ENDIF;
+                               else {
+                                       if (buf[1] == 'l' && buf[2] == 's') {
+                                               if (buf[3] == 'i'
+                                               &&  buf[4] == 'f'
+                                               &&  buf[5] == 0)
+                                                       cx.x_token = T_ELSIF;
+                                               else {
+                                                       if (buf[3] == 'e'
+                                                       && buf[4] == 0)
+                                                               cx.x_token =
+                                                                   T_ELSE;
+                                               }
+                                       }
+                               }
+                               break;
+                       }
+                       if (cx.x_token == T_STR
+                           && (cx.x_val.v_str = str_cpy(buf)) == 0) {
+                               p_memerror();
+                               cx.x_token = T_EOF;
+                       }
+                       state = -1;
+                       break;
+               }
+               break;
+       case 3:                         /* " quoted string */
+               switch (c) {
+               case '\n':
+                       (void) s_ungetc(c);
+               case EOF:
+               case '"':
+                       state = 2;
+                       break;
+               case '\\':
+                       switch (c = s_gettok1()) {
+                       case -1:
+                       case -2:        /* newlines are invisible */
+                               break;
+                       default:
+                               if (p < buf + sizeof buf - 1)
+                                       *p++ = c;
+                       }
+                       break;
+               default:
+                       if (p < buf + sizeof buf - 1)
+                               *p++ = c;
+                       break;
+               }
+               break;
+       case 4:                         /* ' quoted string */
+               switch (c) {
+               case '\n':
+                       (void) s_ungetc(c);
+               case EOF:
+               case '\'':
+                       state = 2;
+                       break;
+               case '\\':
+                       switch (c = s_gettok1()) {
+                       case -1:
+                       case -2:        /* newlines are invisible */
+                               break;
+                       default:
+                               if (p < buf + sizeof buf - 1)
+                                       *p++ = c;
+                       }
+                       break;
+               default:
+                       if (p < buf + sizeof buf - 1)
+                               *p++ = c;
+                       break;
+               }
+               break;
+       case 10:                        /* got 0 */
+               switch (c) {
+               case 'x':
+               case 'X':
+                       cx.x_val.v_num = 0;
+                       state = 12;
+                       break;
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7':
+                       cx.x_val.v_num = c - '0';
+                       state = 13;
+                       break;
+               case '8': case '9':
+                       cx.x_val.v_num = c - '0';
+                       state = 11;
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       state = -1;
+                       cx.x_token = T_NUM;
+               }
+               break;
+       case 11:                        /* decimal number */
+               switch (c) {
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       cx.x_val.v_num = cx.x_val.v_num * 10 + c - '0';
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       state = -1;
+                       cx.x_token = T_NUM;
+               }
+               break;
+       case 12:                        /* hex number */
+               switch (c) {
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       cx.x_val.v_num = cx.x_val.v_num * 16 + c - '0';
+                       break;
+               case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+                       cx.x_val.v_num = cx.x_val.v_num * 16 + c - 'a' + 10;
+                       break;
+               case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+                       cx.x_val.v_num = cx.x_val.v_num * 16 + c - 'A' + 10;
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       state = -1;
+                       cx.x_token = T_NUM;
+               }
+               break;
+       case 13:                        /* octal number */
+               switch (c) {
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7':
+                       cx.x_val.v_num = cx.x_val.v_num * 8 + c - '0';
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       state = -1;
+                       cx.x_token = T_NUM;
+               }
+               break;
+       case 20:                        /* got > */
+               switch (c) {
+               case '=':
+                       cx.x_token = T_GE;
+                       state = -1;
+                       break;
+               case '>':
+                       cx.x_token = T_RS;
+                       state = -1;
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       cx.x_token = T_GT;
+                       state = -1;
+               }
+               break;
+       case 21:                        /* got < */
+               switch (c) {
+               case '=':
+                       cx.x_token = T_LE;
+                       state = -1;
+                       break;
+               case '<':
+                       cx.x_token = T_LS;
+                       state = -1;
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       cx.x_token = T_LT;
+                       state = -1;
+               }
+               break;
+       case 22:                        /* got = */
+               switch (c) {
+               case '=':
+                       cx.x_token = T_EQ;
+                       state = -1;
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       cx.x_token = T_ASSIGN;
+                       state = -1;
+               }
+               break;
+       case 23:                        /* got ! */
+               switch (c) {
+               case '=':
+                       cx.x_token = T_NE;
+                       state = -1;
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       cx.x_token = T_NOT;
+                       state = -1;
+               }
+               break;
+       case 24:                        /* got & */
+               switch (c) {
+               case '&':
+                       cx.x_token = T_ANDAND;
+                       state = -1;
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       cx.x_token = T_AND;
+                       state = -1;
+               }
+               break;
+       case 25:                        /* got | */
+               switch (c) {
+               case '|':
+                       cx.x_token = T_OROR;
+                       state = -1;
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       cx.x_token = T_OR;
+                       state = -1;
+               }
+               break;
+       case 26:                        /* got $ */
+               switch (c) {
+               case '?':
+                       cx.x_token = T_DQ;
+                       state = -1;
+                       break;
+               default:
+                       (void) s_ungetc(c);
+                       cx.x_token = T_DOLLAR;
+                       state = -1;
+               }
+               break;
+       default:
+               abort();
+       }
+       if (state >= 0)
+               goto loop;
+       return cx.x_token;
+}
+
+int
+s_gettok1()
+{
+       int c;
+       int n;
+
+       c = s_getc();                   /* got \ */
+       switch (c) {
+       case EOF:
+               return -1;
+       case '\n':
+               return -2;
+       case 'b':
+               return '\b';
+       case 'f':
+               return '\f';
+       case 'n':
+               return '\n';
+       case 'r':
+               return '\r';
+       case 't':
+               return '\t';
+       default:
+               return c;
+       case '0': case '1': case '2': case '3': case '4':
+       case '5': case '6': case '7':
+               break;
+       }
+       n = c - '0';
+       c = s_getc();                   /* got \[0-7] */
+       if (c < '0' || c > '7') {
+               (void) s_ungetc(c);
+               return n;
+       }
+       n = n * 8 + c - '0';
+       c = s_getc();                   /* got \[0-7][0-7] */
+       if (c < '0' || c > '7') {
+               (void) s_ungetc(c);
+               return n;
+       }
+       return n * 8 + c - '0';
+}
diff --git a/window/startup.c b/window/startup.c
new file mode 100644 (file)
index 0000000..1a23e8b
--- /dev/null
@@ -0,0 +1,104 @@
+/*     $NetBSD: startup.c,v 1.5 1997/11/21 08:36:19 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)startup.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: startup.c,v 1.5 1997/11/21 08:36:19 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#include "defs.h"
+#include "var.h"
+#include "char.h"
+#include "local.h"
+
+int
+doconfig()
+{
+       char buf[100];
+       char *home;
+       static char runcom[] = RUNCOM;
+
+       if ((home = getenv("HOME")) == 0)
+               home = ".";
+       (void) sprintf(buf, "%.*s/%s",
+               (int)((sizeof buf - sizeof runcom) / sizeof (char) - 1),
+               home, runcom);
+       return dosource(buf);
+}
+
+/*
+ * The default is two windows of equal size.
+ */
+void
+dodefault()
+{
+       struct ww *w;
+       int r = wwnrow / 2 - 1;
+
+       if (openwin(1, r + 2, 0, wwnrow - r - 2, wwncol, default_nline,
+           (char *) 0, WWT_PTY, WWU_HASFRAME, default_shellfile,
+           default_shell) == 0)
+               return;
+       if ((w = openwin(0, 1, 0, r, wwncol, default_nline,
+           (char *) 0, WWT_PTY, WWU_HASFRAME, default_shellfile,
+           default_shell)) == 0)
+               return;
+       wwprintf(w, "Escape character is %s.\r\n", unctrl(escapec));
+}
+
+void
+setvars()
+{
+       /* try to use a random ordering to balance the tree */
+       (void) var_setnum("nrow", wwnrow);
+       (void) var_setnum("ncol", wwncol);
+       (void) var_setnum("baud", wwbaud);
+       (void) var_setnum("m_rev", WWM_REV);
+       (void) var_setnum("m_blk", WWM_BLK);
+       (void) var_setnum("m_ul", WWM_UL);
+       (void) var_setnum("m_grp", WWM_GRP);
+       (void) var_setnum("m_dim", WWM_DIM);
+       (void) var_setnum("m_usr", WWM_USR);
+       (void) var_setstr("term", wwterm);
+       (void) var_setnum("modes", wwavailmodes);
+}
diff --git a/window/string.c b/window/string.c
new file mode 100644 (file)
index 0000000..7a59021
--- /dev/null
@@ -0,0 +1,165 @@
+/*     $NetBSD: string.c,v 1.6 1997/11/21 08:36:20 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)string.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: string.c,v 1.6 1997/11/21 08:36:20 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define EXTERN
+#include "window_string.h"
+#undef  EXTERN
+
+char *
+str_cpy(s)
+       char *s;
+{
+       char *str;
+       char *p;
+
+       str = p = str_alloc(strlen(s) + 1);
+       if (p == 0)
+               return 0;
+       while ((*p++ = *s++))
+               ;
+       return str;
+}
+
+char *
+str_ncpy(s, n)
+       char *s;
+       int n;
+{
+       int l = strlen(s);
+       char *str;
+       char *p;
+
+       if (n > l)
+               n = l;
+       str = p = str_alloc(n + 1);
+       if (p == 0)
+               return 0;
+       while (--n >= 0)
+               *p++ = *s++;
+       *p = 0;
+       return str;
+}
+
+char *
+str_itoa(i)
+       int i;
+{
+       char buf[30];
+
+       (void) snprintf(buf, sizeof(buf), "%d", i);
+       return str_cpy(buf);
+}
+
+char *
+str_cat(s1, s2)
+       char *s1, *s2;
+{
+       char *str;
+       char *p, *q;
+
+       str = p = str_alloc(strlen(s1) + strlen(s2) + 1);
+       if (p == 0)
+               return 0;
+       for (q = s1; (*p++ = *q++);)
+               ;
+       for (q = s2, p--; (*p++ = *q++);)
+               ;
+       return str;
+}
+
+/*
+ * match s against p.
+ * s can be a prefix of p with at least min characters.
+ */
+int
+str_match(s, p, min)
+       char *s, *p;
+       int min;
+{
+       for (; *s && *p && *s == *p; s++, p++, min--)
+               ;
+       return *s == *p || (*s == 0 && min <= 0);
+}
+
+#ifdef STR_DEBUG
+char *
+str_alloc(l)
+       size_t l;
+{
+       struct string *s;
+
+       s = (struct string *) malloc(l + str_offset);
+       if (s == 0)
+               return 0;
+       if (str_head.s_forw == 0)
+               str_head.s_forw = str_head.s_back = &str_head;
+       s->s_forw = str_head.s_forw;
+       s->s_back = &str_head;
+       str_head.s_forw = s;
+       s->s_forw->s_back = s;
+       return s->s_data;
+}
+
+void
+str_free(str)
+       char *str;
+{
+       struct string *s;
+
+       for (s = str_head.s_forw; s != &str_head && s->s_data != str;
+            s = s->s_forw)
+               ;
+       if (s == &str_head)
+               abort();
+       s->s_back->s_forw = s->s_forw;
+       s->s_forw->s_back = s->s_back;
+       free((char *)s);
+}
+#endif
diff --git a/window/token.h b/window/token.h
new file mode 100644 (file)
index 0000000..aa00223
--- /dev/null
@@ -0,0 +1,85 @@
+/*     $NetBSD: token.h,v 1.3 1995/09/28 10:34:41 tls Exp $    */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)token.h     8.1 (Berkeley) 6/6/93
+ */
+
+#define token          (cx.x_token)
+#define token_num      (cx.x_val.v_num)
+#define token_str      (cx.x_val.v_str)
+
+#define T_EOL          1
+#define T_EOF          2
+#define T_COMP         3
+#define T_PLUS         4
+#define T_MINUS                5
+#define T_MUL          6
+#define T_DIV          7
+#define T_LP           8
+#define T_RP           9
+#define T_LB           10
+#define T_RB           11
+#define T_DOLLAR       12
+#define T_COMMA                13
+#define T_QUEST                14
+#define T_COLON                15
+#define T_CHAR         16
+#define T_STR          17
+#define T_NUM          18
+#define T_MOD          19
+#define T_XOR          20
+#define T_DQ           21              /* $? */
+#define T_GE           22
+#define T_RS           23
+#define T_GT           24
+#define T_LE           25
+#define T_LS           26
+#define T_LT           27
+#define T_EQ           28
+#define T_ASSIGN       29
+#define T_NE           30
+#define T_NOT          31
+#define T_ANDAND       32
+#define T_AND          33
+#define T_OROR         34
+#define T_OR           35
+
+#define T_IF           40
+#define T_THEN         41
+#define T_ELSIF                42
+#define T_ELSE         43
+#define T_ENDIF                44
diff --git a/window/tt.h b/window/tt.h
new file mode 100644 (file)
index 0000000..494127d
--- /dev/null
@@ -0,0 +1,183 @@
+/*     $NetBSD: tt.h,v 1.4 1997/11/21 08:36:24 lukem Exp $     */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)tt.h        8.1 (Berkeley) 6/6/93
+ */
+
+#include <unistd.h>
+
+#ifndef EXTERN
+#define EXTERN extern
+#endif
+
+/*
+ * Interface structure for the terminal drivers.
+ */
+struct tt {
+               /* startup and cleanup */
+       void    (*tt_start) __P((void));
+       void    (*tt_reset) __P((void));
+       void    (*tt_end) __P((void));
+
+               /* terminal functions */
+       void    (*tt_move) __P((int, int));
+       void    (*tt_insline) __P((int));
+       void    (*tt_delline) __P((int));
+       void    (*tt_inschar) __P((char));
+       void    (*tt_insspace) __P((int));
+       void    (*tt_delchar) __P((int));
+       void    (*tt_write) __P((char *, int)); /* write a whole block */
+       void    (*tt_putc) __P((char));         /* write one character */
+       void    (*tt_clreol) __P((void));
+       void    (*tt_clreos) __P((void));
+       void    (*tt_clear) __P((void));
+       void    (*tt_scroll_down) __P((int));
+       void    (*tt_scroll_up) __P((int));
+       void    (*tt_setscroll) __P((int, int));/* set scrolling region */
+       void    (*tt_setmodes) __P((int));      /* set display modes */
+       void    (*tt_set_token) __P((int, char *, int));
+                                               /* define a token */
+       void    (*tt_put_token) __P((int, char *, int));
+                                               /* refer to a defined token */
+       void    (*tt_compress) __P((int));      /* begin, end compression */
+       void    (*tt_checksum) __P((char *, int));
+                                               /* compute checksum */
+       void    (*tt_checkpoint) __P((void));   /* checkpoint protocol */
+       int     (*tt_rint) __P((char *, int));  /* input processing */
+
+               /* internal variables */
+       char tt_modes;                  /* the current display modes */
+       char tt_nmodes;                 /* the new modes for next write */
+       char tt_insert;                 /* currently in insert mode */
+       int tt_row;                     /* cursor row */
+       int tt_col;                     /* cursor column */
+       int tt_scroll_top;              /* top of scrolling region */
+       int tt_scroll_bot;              /* bottom of scrolling region */
+
+               /* terminal info */
+       int tt_nrow;                    /* number of display rows */
+       int tt_ncol;                    /* number of display columns */
+       char tt_availmodes;             /* the display modes supported */
+       char tt_wrap;                   /* has auto wrap around */
+       char tt_retain;                 /* can retain below (db flag) */
+       short tt_padc;                  /* the pad character */
+       int tt_ntoken;                  /* number of compression tokens */
+       int tt_token_min;               /* minimun token size */
+       int tt_token_max;               /* maximum token size */
+       int tt_set_token_cost;          /* cost in addition to string */
+       int tt_put_token_cost;          /* constant cost */
+       int tt_ack;                     /* checkpoint ack-nack flag */
+
+               /* the frame characters */
+       short *tt_frame;
+
+               /* ttflush() hook */
+       void    (*tt_flush) __P((void));
+};
+EXTERN struct tt tt;
+
+/*
+ * tt_padc is used by the compression routine.
+ * It is a short to allow the driver to indicate that there is no padding.
+ */
+#define TT_PADC_NONE 0x100
+
+/*
+ * List of terminal drivers.
+ */
+struct tt_tab {
+       char *tt_name;
+       int tt_len;
+       int (*tt_func) __P((void));
+};
+EXTERN struct tt_tab tt_tab[];
+
+/*
+ * Clean interface to termcap routines.
+ * Too may t's.
+ */
+EXTERN char tt_strings[1024];          /* string buffer */
+EXTERN char *tt_strp;                  /* pointer for it */
+
+struct tt_str {
+       char *ts_str;
+       int ts_n;
+};
+
+struct tt_str *tttgetstr __P((char *));
+struct tt_str *ttxgetstr __P((char *));        /* tgetstr() and expand delays */
+
+int    tt_f100 __P((void));
+int    tt_generic __P((void));
+int    tt_h19 __P((void));
+int    tt_h29 __P((void));
+int    tt_tvi925 __P((void));
+int    tt_wyse60 __P((void));
+int    tt_wyse75 __P((void));
+int    tt_zapple __P((void));
+int    tt_zentec __P((void));
+void   ttflush __P((void));
+struct tt_str *tttgetstr __P((char *));
+int    ttinit __P((void));
+void   ttpgoto __P((struct tt_str *, int, int, int));
+void   ttputs __P((char *));
+int    ttstrcmp __P((struct tt_str *, struct tt_str *));
+void   tttgoto __P((struct tt_str *, int, int));
+void   tttputc __P((int));
+void   ttwrite __P((char *, int));
+void   ttxputc __P((int));
+
+#define tttputs(s, n)  tputs((s)->ts_str, (n), tttputc)
+#define ttxputs(s)     ttwrite((s)->ts_str, (s)->ts_n)
+
+/*
+ * Buffered output without stdio.
+ * These variables have different meanings from the ww_ob* variables.
+ * But I'm too lazy to think up different names.
+ */
+EXTERN char *tt_ob;
+EXTERN char *tt_obp;
+EXTERN char *tt_obe;
+#define ttputc(c)      (tt_obp < tt_obe ? (*tt_obp++ = (c)) \
+                               : (ttflush(), *tt_obp++ = (c)))
+
+/*
+ * Convenience macros for the drivers
+ * They require char.h
+ */
+#define ttctrl(c)      ttputc(ctrl(c))
+#define ttesc(c)       (ttctrl('['), ttputc(c))
diff --git a/window/ttf100.c b/window/ttf100.c
new file mode 100644 (file)
index 0000000..b59c57a
--- /dev/null
@@ -0,0 +1,77 @@
+/*     $NetBSD: ttf100.c,v 1.4 1997/11/21 08:36:27 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ttf100.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: ttf100.c,v 1.4 1997/11/21 08:36:27 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+
+/*
+ * Freedom 100
+ */
+
+#define G (WWM_GRP << WWC_MSHIFT)
+short f100_frame[16] = {
+       ' ',    'J'|G,  'K'|G,  'A'|G,
+       'J'|G,  'J'|G,  'B'|G,  'M'|G,
+       'K'|G,  'D'|G,  'K'|G,  'O'|G,
+       'C'|G,  'L'|G,  'N'|G,  'I'|G
+};
+extern struct tt_str *gen_AE, *gen_AS;
+
+int
+tt_f100()
+{
+       static struct tt_str ae = { "\033%", 2 };
+       static struct tt_str as = { "\033$", 2 };
+
+       if (tt_generic() < 0)
+               return -1;
+       tt.tt_frame = f100_frame;
+       tt.tt_availmodes |= WWM_GRP;
+       gen_AS = &as;
+       gen_AE = &ae;
+       return 0;
+}
diff --git a/window/ttgeneric.c b/window/ttgeneric.c
new file mode 100644 (file)
index 0000000..e45224e
--- /dev/null
@@ -0,0 +1,615 @@
+/*     $NetBSD: ttgeneric.c,v 1.5 1998/08/25 20:59:43 ross Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ttgeneric.c        8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: ttgeneric.c,v 1.5 1998/08/25 20:59:43 ross Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#ifdef __APPLE__
+#define _CURSES_PRIVATE
+#include <curses.h>
+#undef  _CURSES_PRIVATE
+#else
+#include <termcap.h>
+#endif
+#define EXTERN
+#include "tt.h"
+#undef  EXTERN
+#include "ww.h"
+
+extern char PC, *BC, *UP;
+extern short ospeed;
+
+       /* normal frame */
+short gen_frame[16] = {
+       ' ', '|', '-', '+',
+       '|', '|', '+', '+',
+       '-', '+', '-', '+',
+       '+', '+', '+', '+'
+};
+
+       /* ANSI graphics frame */
+#define G (WWM_GRP << WWC_MSHIFT)
+short ansi_frame[16] = {
+       ' ',    'x'|G,  'Q'|G,  'm'|G,
+       'x'|G,  'x'|G,  'l'|G,  't'|G,
+       'q'|G,  'j'|G,  'q'|G,  'v'|G,
+       'k'|G,  'u'|G,  'w'|G,  'n'|G
+};
+struct tt_str ansi_AS = {
+       "\033(0", 3
+};
+
+struct tt_str *gen_PC;
+struct tt_str *gen_CM;
+struct tt_str *gen_IM;
+struct tt_str *gen_IC;
+struct tt_str *gen_ICn;
+struct tt_str *gen_IP;
+struct tt_str *gen_EI;
+struct tt_str *gen_DC;
+struct tt_str *gen_DCn;
+struct tt_str *gen_AL;
+struct tt_str *gen_ALn;
+struct tt_str *gen_DL;
+struct tt_str *gen_DLn;
+struct tt_str *gen_CE;
+struct tt_str *gen_CD;
+struct tt_str *gen_CL;
+struct tt_str *gen_VS;
+struct tt_str *gen_VE;
+struct tt_str *gen_TI;
+struct tt_str *gen_TE;
+struct tt_str *gen_SO;
+struct tt_str *gen_SE;
+struct tt_str *gen_US;
+struct tt_str *gen_UE;
+struct tt_str *gen_LE;
+struct tt_str *gen_ND;
+struct tt_str *gen_UP;
+struct tt_str *gen_DO;
+struct tt_str *gen_BC;
+struct tt_str *gen_NL;
+struct tt_str *gen_CR;
+struct tt_str *gen_HO;
+struct tt_str *gen_AS;
+struct tt_str *gen_AE;
+struct tt_str *gen_XS;
+struct tt_str *gen_XE;
+struct tt_str *gen_SF;
+struct tt_str *gen_SFn;
+struct tt_str *gen_SR;
+struct tt_str *gen_SRn;
+struct tt_str *gen_CS;
+char gen_MI;
+char gen_MS;
+char gen_AM;
+char gen_OS;
+char gen_BS;
+char gen_DA;
+char gen_DB;
+char gen_NS;
+char gen_XN;
+int gen_CO;
+int gen_LI;
+int gen_UG;
+int gen_SG;
+
+void   gen_clear __P((void));
+void   gen_clreol __P((void));
+void   gen_clreos __P((void));
+void   gen_delchar __P((int));
+void   gen_delline __P((int));
+void   gen_end __P((void));
+void   gen_inschar __P((char));
+void   gen_insline __P((int));
+void   gen_insspace __P((int));
+void   gen_move __P((int, int));
+void   gen_putc __P((char));
+void   gen_scroll_down __P((int));
+void   gen_scroll_up __P((int));
+void   gen_setinsert __P((char));
+void   gen_setmodes __P((int));
+void   gen_setscroll __P((int, int));
+void   gen_start __P((void));
+void   gen_write __P((char *, int));
+
+void
+gen_setinsert(new)
+       char new;
+{
+       if (new) {
+               if (gen_IM)
+                       ttxputs(gen_IM);
+       } else
+               if (gen_EI)
+                       ttxputs(gen_EI);
+       tt.tt_insert = new;
+}
+
+void
+gen_setmodes(new)
+       int new;
+{
+       int diff;
+
+       diff = new ^ tt.tt_modes;
+       if (diff & WWM_REV) {
+               if (new & WWM_REV) {
+                       if (gen_SO)
+                               ttxputs(gen_SO);
+               } else
+                       if (gen_SE)
+                               ttxputs(gen_SE);
+       }
+       if (diff & WWM_UL) {
+               if (new & WWM_UL) {
+                       if (gen_US)
+                               ttxputs(gen_US);
+               } else
+                       if (gen_UE)
+                               ttxputs(gen_UE);
+       }
+       if (diff & WWM_GRP) {
+               if (new & WWM_GRP) {
+                       if (gen_AS)
+                               ttxputs(gen_AS);
+               } else
+                       if (gen_AE)
+                               ttxputs(gen_AE);
+       }
+       if (diff & WWM_USR) {
+               if (new & WWM_USR) {
+                       if (gen_XS)
+                               ttxputs(gen_XS);
+               } else
+                       if (gen_XE)
+                               ttxputs(gen_XE);
+       }
+       tt.tt_modes = new;
+}
+
+void
+gen_insline(n)
+       int n;
+{
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       if (gen_ALn)
+               ttpgoto(gen_ALn, 0, n, gen_LI - tt.tt_row);
+       else
+               while (--n >= 0)
+                       tttputs(gen_AL, gen_LI - tt.tt_row);
+}
+
+void
+gen_delline(n)
+       int n;
+{
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       if (gen_DLn)
+               ttpgoto(gen_DLn, 0, n, gen_LI - tt.tt_row);
+       else
+               while (--n >= 0)
+                       tttputs(gen_DL, gen_LI - tt.tt_row);
+}
+
+void
+gen_putc(c)
+       char c;
+{
+       if (tt.tt_insert)
+               gen_setinsert(0);
+       if (tt.tt_nmodes != tt.tt_modes)
+               gen_setmodes(tt.tt_nmodes);
+       ttputc(c);
+       if (++tt.tt_col == gen_CO) {
+               if (gen_XN)
+                       tt.tt_col = tt.tt_row = -10;
+               else if (gen_AM)
+                       tt.tt_col = 0, tt.tt_row++;
+               else
+                       tt.tt_col--;
+       }
+}
+
+void
+gen_write(p, n)
+       char *p;
+       int n;
+{
+       if (tt.tt_insert)
+               gen_setinsert(0);
+       if (tt.tt_nmodes != tt.tt_modes)
+               gen_setmodes(tt.tt_nmodes);
+       ttwrite(p, n);
+       tt.tt_col += n;
+       if (tt.tt_col == gen_CO) {
+               if (gen_XN)
+                       tt.tt_col = tt.tt_row = -10;
+               else if (gen_AM)
+                       tt.tt_col = 0, tt.tt_row++;
+               else
+                       tt.tt_col--;
+       }
+}
+
+void
+gen_move(row, col)
+       int row, col;
+{
+       if (tt.tt_row == row && tt.tt_col == col)
+               return;
+       if (!gen_MI && tt.tt_insert)
+               gen_setinsert(0);
+       if (!gen_MS && tt.tt_modes)
+               gen_setmodes(0);
+       if (row < tt.tt_scroll_top || row > tt.tt_scroll_bot)
+               gen_setscroll(0, tt.tt_nrow - 1);
+       if (tt.tt_row == row) {
+               if (col == 0) {
+                       ttxputs(gen_CR);
+                       goto out;
+               }
+               if (tt.tt_col == col - 1) {
+                       if (gen_ND) {
+                               ttxputs(gen_ND);
+                               goto out;
+                       }
+               } else if (tt.tt_col == col + 1) {
+                       if (gen_LE) {
+                               ttxputs(gen_LE);
+                               goto out;
+                       }
+               }
+       }
+       if (tt.tt_col == col) {
+               if (tt.tt_row == row + 1) {
+                       if (gen_UP) {
+                               ttxputs(gen_UP);
+                               goto out;
+                       }
+               } else if (tt.tt_row == row - 1) {
+                       ttxputs(gen_DO);
+                       goto out;
+               }
+       }
+       if (gen_HO && col == 0 && row == 0) {
+               ttxputs(gen_HO);
+               goto out;
+       }
+       tttgoto(gen_CM, col, row);
+out:
+       tt.tt_col = col;
+       tt.tt_row = row;
+}
+
+void
+gen_start()
+{
+       if (gen_VS)
+               ttxputs(gen_VS);
+       if (gen_TI)
+               ttxputs(gen_TI);
+       ttxputs(gen_CL);
+       tt.tt_col = tt.tt_row = 0;
+       tt.tt_insert = 0;
+       tt.tt_nmodes = tt.tt_modes = 0;
+}
+
+void
+gen_end()
+{
+       if (tt.tt_insert)
+               gen_setinsert(0);
+       if (gen_TE)
+               ttxputs(gen_TE);
+       if (gen_VE)
+               ttxputs(gen_VE);
+}
+
+void
+gen_clreol()
+{
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       tttputs(gen_CE, gen_CO - tt.tt_col);
+}
+
+void
+gen_clreos()
+{
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       tttputs(gen_CD, gen_LI - tt.tt_row);
+}
+
+void
+gen_clear()
+{
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       ttxputs(gen_CL);
+}
+
+void
+gen_inschar(c)
+       char c;
+{
+       if (!tt.tt_insert)
+               gen_setinsert(1);
+       if (tt.tt_nmodes != tt.tt_modes)
+               gen_setmodes(tt.tt_nmodes);
+       if (gen_IC)
+               tttputs(gen_IC, gen_CO - tt.tt_col);
+       ttputc(c);
+       if (gen_IP)
+               tttputs(gen_IP, gen_CO - tt.tt_col);
+       if (++tt.tt_col == gen_CO) {
+               if (gen_XN)
+                       tt.tt_col = tt.tt_row = -10;
+               else if (gen_AM)
+                       tt.tt_col = 0, tt.tt_row++;
+               else
+                       tt.tt_col--;
+       }
+}
+
+void
+gen_insspace(n)
+       int n;
+{
+       if (gen_ICn)
+               ttpgoto(gen_ICn, 0, n, gen_CO - tt.tt_col);
+       else
+               while (--n >= 0)
+                       tttputs(gen_IC, gen_CO - tt.tt_col);
+}
+
+void
+gen_delchar(n)
+       int n;
+{
+       if (gen_DCn)
+               ttpgoto(gen_DCn, 0, n, gen_CO - tt.tt_col);
+       else
+               while (--n >= 0)
+                       tttputs(gen_DC, gen_CO - tt.tt_col);
+}
+
+void
+gen_scroll_down(n)
+       int n;
+{
+       gen_move(tt.tt_scroll_bot, 0);
+       if (gen_SFn)
+               ttpgoto(gen_SFn, 0, n, n);
+       else
+               while (--n >= 0)
+                       ttxputs(gen_SF);
+}
+
+void
+gen_scroll_up(n)
+       int n;
+{
+       gen_move(tt.tt_scroll_top, 0);
+       if (gen_SRn)
+               ttpgoto(gen_SRn, 0, n, n);
+       else
+               while (--n >= 0)
+                       ttxputs(gen_SR);
+}
+
+void
+gen_setscroll(top, bot)
+       int top, bot;
+{
+       tttgoto(gen_CS, bot, top);
+       tt.tt_scroll_top = top;
+       tt.tt_scroll_bot = bot;
+       tt.tt_row = tt.tt_col = -10;
+}
+
+int
+tt_generic()
+{
+       gen_PC = tttgetstr("pc");
+       PC = gen_PC ? *gen_PC->ts_str : 0;
+       ospeed = wwospeed;
+
+       gen_CM = ttxgetstr("cm");               /* may not work */
+       gen_IM = ttxgetstr("im");
+       gen_IC = tttgetstr("ic");
+       gen_ICn = tttgetstr("IC");
+       gen_IP = tttgetstr("ip");
+       gen_EI = ttxgetstr("ei");
+       gen_DC = tttgetstr("dc");
+       gen_DCn = tttgetstr("DC");
+       gen_AL = tttgetstr("al");
+       gen_ALn = tttgetstr("AL");
+       gen_DL = tttgetstr("dl");
+       gen_DLn = tttgetstr("DL");
+       gen_CE = tttgetstr("ce");
+       gen_CD = tttgetstr("cd");
+       gen_CL = ttxgetstr("cl");
+       gen_VS = ttxgetstr("vs");
+       gen_VE = ttxgetstr("ve");
+       gen_TI = ttxgetstr("ti");
+       gen_TE = ttxgetstr("te");
+       gen_SO = ttxgetstr("so");
+       gen_SE = ttxgetstr("se");
+       gen_US = ttxgetstr("us");
+       gen_UE = ttxgetstr("ue");
+       gen_LE = ttxgetstr("le");
+       gen_ND = ttxgetstr("nd");
+       gen_UP = ttxgetstr("up");
+       gen_DO = ttxgetstr("do");
+       gen_BC = ttxgetstr("bc");
+       gen_NL = ttxgetstr("nl");
+       gen_CR = ttxgetstr("cr");
+       gen_HO = ttxgetstr("ho");
+       gen_AS = ttxgetstr("as");
+       gen_AE = ttxgetstr("ae");
+       gen_XS = ttxgetstr("XS");
+       gen_XE = ttxgetstr("XE");
+       gen_SF = ttxgetstr("sf");
+       gen_SFn = ttxgetstr("SF");
+       gen_SR = ttxgetstr("sr");
+       gen_SRn = ttxgetstr("SR");
+       gen_CS = ttxgetstr("cs");
+       gen_MI = tgetflag("mi");
+       gen_MS = tgetflag("ms");
+       gen_AM = tgetflag("am");
+       gen_OS = tgetflag("os");
+       gen_BS = tgetflag("bs");
+       gen_DA = tgetflag("da");
+       gen_DB = tgetflag("db");
+       gen_NS = tgetflag("ns");
+       gen_XN = tgetflag("xn");
+       gen_CO = tgetnum("co");
+       gen_LI = tgetnum("li");
+       gen_UG = tgetnum("ug");
+       gen_SG = tgetnum("sg");
+       if (gen_CL == 0 || gen_OS || gen_CM == 0)
+               return -1;
+
+       /*
+        * Deal with obsolete termcap fields.
+        */
+       if (gen_LE == 0) {
+               if (gen_BC)
+                       gen_LE = gen_BC;
+               else if (gen_BS) {
+                       static struct tt_str bc = { "\b", 1 };
+                       gen_BC = &bc;
+               }
+       }
+       if (gen_NL == 0) {
+               static struct tt_str nl = { "\n", 1 };
+               gen_NL = &nl;
+       }
+       if (gen_DO == 0)
+               gen_DO = gen_NL;
+       if (gen_CR == 0) {
+               static struct tt_str cr = { "\r", 1 };
+               gen_CR = &cr;
+       }
+       /*
+        * Most terminal will scroll with "nl", but very few specify "sf".
+        * We shouldn't use "do" here.
+        */
+       if (gen_SF == 0 && !gen_NS)
+               gen_SF = gen_NL;
+       BC = gen_LE ? gen_LE->ts_str : 0;
+       UP = gen_UP ? gen_UP->ts_str : 0;
+       /*
+        * Fix up display attributes that we can't handle, or don't
+        * really exist.
+        */
+       if (gen_SG > 0)
+               gen_SO = 0;
+       if (gen_UG > 0 || (gen_US && gen_SO && ttstrcmp(gen_US, gen_SO) == 0))
+               gen_US = 0;
+
+       if (gen_IM && gen_IM->ts_n == 0) {
+               free((char *) gen_IM);
+               gen_IM = 0;
+       }
+       if (gen_EI && gen_EI->ts_n == 0) {
+               free((char *) gen_EI);
+               gen_EI = 0;
+       }
+       if (gen_IC && gen_IC->ts_n == 0) {
+               free((char *) gen_IC);
+               gen_IC = 0;
+       }
+       if (gen_IM)
+               tt.tt_inschar = gen_inschar;
+       else if (gen_IC)
+               tt.tt_insspace = gen_insspace;
+       if (gen_DC)
+               tt.tt_delchar = gen_delchar;
+       if (gen_AL)
+               tt.tt_insline = gen_insline;
+       if (gen_DL)
+               tt.tt_delline = gen_delline;
+       if (gen_CE)
+               tt.tt_clreol = gen_clreol;
+       if (gen_CD)
+               tt.tt_clreos = gen_clreos;
+       if (gen_SF)
+               tt.tt_scroll_down = gen_scroll_down;
+       /*
+        * Don't allow scroll_up if da or db but not cs.
+        * See comment in wwscroll.c.
+        */
+       if (gen_SR && (gen_CS || (!gen_DA && !gen_DB)))
+               tt.tt_scroll_up = gen_scroll_up;
+       if (gen_CS)
+               tt.tt_setscroll = gen_setscroll;
+       if (gen_SO)
+               tt.tt_availmodes |= WWM_REV;
+       if (gen_US)
+               tt.tt_availmodes |= WWM_UL;
+       if (gen_AS)
+               tt.tt_availmodes |= WWM_GRP;
+       if (gen_XS)
+               tt.tt_availmodes |= WWM_USR;
+       tt.tt_wrap = gen_AM;
+       tt.tt_retain = gen_DB;
+       tt.tt_ncol = gen_CO;
+       tt.tt_nrow = gen_LI;
+       tt.tt_start = gen_start;
+       tt.tt_end = gen_end;
+       tt.tt_write = gen_write;
+       tt.tt_putc = gen_putc;
+       tt.tt_move = gen_move;
+       tt.tt_clear = gen_clear;
+       tt.tt_setmodes = gen_setmodes;
+       tt.tt_frame = gen_AS && ttstrcmp(gen_AS, &ansi_AS) == 0 ?
+               ansi_frame : gen_frame;
+       return 0;
+}
diff --git a/window/tth19.c b/window/tth19.c
new file mode 100644 (file)
index 0000000..fa16b68
--- /dev/null
@@ -0,0 +1,322 @@
+/*     $NetBSD: tth19.c,v 1.4 1997/11/21 08:36:30 lukem Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tth19.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: tth19.c,v 1.4 1997/11/21 08:36:30 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+#include "char.h"
+
+/*
+kb|h19|heath|h19-b|h19b|heathkit|heath-19|z19|zenith:
+       cr=^M:nl=^J:bl=^G:al=1*\EL:am:le=^H:bs:cd=\EJ:ce=\EK:
+       cl=\EE:cm=\EY%+ %+ :co#80:dc=\EN:dl=1*\EM:do=\EB:
+       ei=\EO:ho=\EH:im=\E@:li#24:mi:nd=\EC:as=\EF:ae=\EG:ms:
+       ta=^I:pt:sr=\EI:se=\Eq:so=\Ep:up=\EA:vs=\Ex4:ve=\Ey4:
+       kb=^h:ku=\EA:kd=\EB:kl=\ED:kr=\EC:kh=\EH:
+       kn#8:k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:
+       l6=blue:l7=red:l8=white:k6=\EP:k7=\EQ:k8=\ER:
+       es:hs:ts=\Ej\Ex5\Ex1\EY8%+ \Eo:fs=\Ek\Ey5:ds=\Ey1:
+*/
+
+#define NCOL   80
+#define NROW   24
+
+#define G (WWM_GRP << WWC_MSHIFT)
+short h19_frame[16] = {
+       ' ',    '`'|G,  'a'|G,  'e'|G,
+       '`'|G,  '`'|G,  'f'|G,  'v'|G,
+       'a'|G,  'd'|G,  'a'|G,  'u'|G,
+       'c'|G,  't'|G,  's'|G,  'b'|G
+};
+
+extern struct tt_str *gen_VS;
+extern struct tt_str *gen_VE;
+
+int h19_msp10c;
+
+#define PAD(ms10) { \
+       int i; \
+       for (i = ((ms10) + 5) / h19_msp10c; --i >= 0;) \
+               ttputc('\0'); \
+}
+#define ICPAD() PAD((NCOL - tt.tt_col) * 1)    /* 0.1 ms per char */
+#define ILPAD() PAD((NROW - tt.tt_row) * 10)   /* 1 ms per char */
+
+#define H19_SETINSERT(m) ttesc((tt.tt_insert = (m)) ? '@' : 'O')
+
+void   h19_clear __P((void));
+void   h19_clreol __P((void));
+void   h19_clreos __P((void));
+void   h19_delchar __P((int));
+void   h19_delline __P((int));
+void   h19_end __P((void));
+void   h19_inschar __P((char));
+void   h19_insline __P((int));
+void   h19_move __P((int, int));
+void   h19_putc __P((char));
+void   h19_scroll_up __P((int));
+void   h19_scroll_down __P((int));
+void   h19_setmodes __P((int));
+void   h19_start __P((void));
+void   h19_write __P((char *, int));
+
+void
+h19_setmodes(new)
+       int new;
+{
+       int diff;
+
+       diff = new ^ tt.tt_modes;
+       if (diff & WWM_REV)
+               ttesc(new & WWM_REV ? 'p' : 'q');
+       if (diff & WWM_GRP)
+               ttesc(new & WWM_REV ? 'F' : 'G');
+       tt.tt_modes = new;
+}
+
+void
+h19_insline(n)
+       int n;
+{
+       while (--n >= 0) {
+               ttesc('L');
+               ILPAD();
+       }
+}
+
+void
+h19_delline(n)
+       int n;
+{
+       while (--n >= 0) {
+               ttesc('M');
+               ILPAD();
+       }
+}
+
+void
+h19_putc(c)
+       char c;
+{
+       if (tt.tt_nmodes != tt.tt_modes)
+               (*tt.tt_setmodes)(tt.tt_nmodes);
+       if (tt.tt_insert)
+               H19_SETINSERT(0);
+       ttputc(c);
+       if (++tt.tt_col == NCOL)
+               tt.tt_col = NCOL - 1;
+}
+
+void
+h19_write(p, n)
+       char *p;
+       int n;
+{
+       if (tt.tt_nmodes != tt.tt_modes)
+               (*tt.tt_setmodes)(tt.tt_nmodes);
+       if (tt.tt_insert)
+               H19_SETINSERT(0);
+       ttwrite(p, n);
+       tt.tt_col += n;
+       if (tt.tt_col == NCOL)
+               tt.tt_col = NCOL - 1;
+}
+
+void
+h19_move(row, col)
+       int row, col;
+{
+       if (tt.tt_row == row) {
+               if (tt.tt_col == col)
+                       return;
+               if (col == 0) {
+                       ttctrl('m');
+                       goto out;
+               }
+               if (tt.tt_col == col - 1) {
+                       ttesc('C');
+                       goto out;
+               }
+               if (tt.tt_col == col + 1) {
+                       ttctrl('h');
+                       goto out;
+               }
+       }
+       if (tt.tt_col == col) {
+               if (tt.tt_row == row + 1) {
+                       ttesc('A');
+                       goto out;
+               }
+               if (tt.tt_row == row - 1) {
+                       ttctrl('j');
+                       goto out;
+               }
+       }
+       if (col == 0 && row == 0) {
+               ttesc('H');
+               goto out;
+       }
+       ttesc('Y');
+       ttputc(' ' + row);
+       ttputc(' ' + col);
+out:
+       tt.tt_col = col;
+       tt.tt_row = row;
+}
+
+void
+h19_start()
+{
+       if (gen_VS)
+               ttxputs(gen_VS);
+       ttesc('w');
+       ttesc('E');
+       tt.tt_col = tt.tt_row = 0;
+       tt.tt_insert = 0;
+       tt.tt_nmodes = tt.tt_modes = 0;
+}
+
+void
+h19_end()
+{
+       if (tt.tt_insert)
+               H19_SETINSERT(0);
+       if (gen_VE)
+               ttxputs(gen_VE);
+       ttesc('v');
+}
+
+void
+h19_clreol()
+{
+       ttesc('K');
+}
+
+void
+h19_clreos()
+{
+       ttesc('J');
+}
+
+void
+h19_clear()
+{
+       ttesc('E');
+}
+
+void
+h19_inschar(c)
+       char c;
+{
+       if (tt.tt_nmodes != tt.tt_modes)
+               (*tt.tt_setmodes)(tt.tt_nmodes);
+       if (!tt.tt_insert)
+               H19_SETINSERT(1);
+       ttputc(c);
+       if (tt.tt_insert)
+               ICPAD();
+       if (++tt.tt_col == NCOL)
+               tt.tt_col = NCOL - 1;
+}
+
+void
+h19_delchar(n)
+       int n;
+{
+       while (--n >= 0)
+               ttesc('N');
+}
+
+void
+h19_scroll_down(n)
+       int n;
+{
+       h19_move(NROW - 1, 0);
+       while (--n >= 0)
+               ttctrl('j');
+}
+
+void
+h19_scroll_up(n)
+       int n;
+{
+       h19_move(0, 0);
+       while (--n >= 0)
+               ttesc('I');
+}
+
+int
+tt_h19()
+{
+       float cpms = (float) wwbaud / 10000;    /* char per ms */
+
+       h19_msp10c = 10 / cpms;                 /* ms per 10 char */
+       gen_VS = ttxgetstr("vs");
+       gen_VE = ttxgetstr("ve");
+
+       tt.tt_start = h19_start;
+       tt.tt_end = h19_end;
+
+       tt.tt_insline = h19_insline;
+       tt.tt_delline = h19_delline;
+       tt.tt_inschar = h19_inschar;
+       tt.tt_delchar = h19_delchar;
+       tt.tt_clreol = h19_clreol;
+       tt.tt_clreos = h19_clreos;
+       tt.tt_clear = h19_clear;
+       tt.tt_move = h19_move;
+       tt.tt_write = h19_write;
+       tt.tt_putc = h19_putc;
+       tt.tt_scroll_down = h19_scroll_down;
+       tt.tt_scroll_up = h19_scroll_up;
+       tt.tt_setmodes = h19_setmodes;
+
+       tt.tt_ncol = NCOL;
+       tt.tt_nrow = NROW;
+       tt.tt_availmodes = WWM_REV|WWM_GRP;
+       tt.tt_frame = h19_frame;
+       return 0;
+}
diff --git a/window/tth29.c b/window/tth29.c
new file mode 100644 (file)
index 0000000..0375cfb
--- /dev/null
@@ -0,0 +1,105 @@
+/*     $NetBSD: tth29.c,v 1.4 1997/11/21 08:36:31 lukem Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tth29.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: tth29.c,v 1.4 1997/11/21 08:36:31 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+#include "char.h"
+
+/*
+ * H29 Driver
+ *
+ * WWM_USR mode is alternate character set.
+ *
+kC|h29|heath-29|z29|zenith-29:\
+       :am:bc=\ED:bt=\E-:cr=^M:do=^J:nl=^J:bl=^G:\
+       :al=\EL:le=^H:bs:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :co#80:dc=\EN:\
+       :dl=1*\EM:do=\EB:ei=\EO:ho=\EH:im=\E@:li#24:mi:nd=\EC:as=\EF:ae=\EG:\
+       :ms:ta=^I:pt:sr=\EI:se=\Eq:so=\Ep:up=\EA:vs=\Ex4:ve=\Ey4:\
+       :kb=^H:ku=\EA:kd=\EB:kl=\ED:kr=\EC:kh=\EH:kn#1:k0=\E~:l0=HOME:\
+       :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:k8=\ER:k9=\E01:\
+       :es:hs:ts=\Ej\Ex5\Ex1\EY8%+ \Eo:fs=\Ek\Ey5:ds=\Ey1:us=\Es8:ue=\Es0:
+ *
+ */
+
+void   h29_setmodes __P((int));
+
+void
+h29_setmodes(new)
+       int new;
+{
+       int modes = '0';
+
+       if (new & WWM_REV)
+               modes += 0x01;
+       if (new & WWM_BLK)
+               modes += 0x02;
+       if (new & WWM_DIM)
+               modes += 0x04;
+       if (new & WWM_UL)
+               modes += 0x08;
+       if (new & WWM_USR)
+               modes += 0x10;
+       ttesc('s');
+       ttputc(modes);
+       if (new & WWM_GRP) {
+               if ((tt.tt_modes & WWM_GRP) == 0)
+                       ttesc('F');
+       } else
+               if (tt.tt_modes & WWM_GRP)
+                       ttesc('G');
+       tt.tt_modes = new;
+}
+
+int
+tt_h29()
+{
+       if (tt_h19() < 0)
+               return -1;
+       tt.tt_setmodes = h29_setmodes;
+       tt.tt_availmodes |= WWM_BLK|WWM_UL|WWM_DIM|WWM_USR;
+       return 0;
+}
diff --git a/window/ttinit.c b/window/ttinit.c
new file mode 100644 (file)
index 0000000..f9e2d42
--- /dev/null
@@ -0,0 +1,120 @@
+/*     $NetBSD: ttinit.c,v 1.4 1997/11/21 08:36:32 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ttinit.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: ttinit.c,v 1.4 1997/11/21 08:36:32 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#include <string.h>
+#include "ww.h"
+#include "tt.h"
+
+struct tt_tab tt_tab[] = {
+       { "h19",        3, tt_h19 },
+       { "h29",        3, tt_h29 },
+       { "f100",       4, tt_f100 },
+       { "tvi925",     6, tt_tvi925 },
+       { "wyse75",     6, tt_wyse75 },
+       { "wyse60",     6, tt_wyse60 },
+       { "w60",        3, tt_wyse60 },
+       { "zapple",     6, tt_zapple },
+       { "zentec",     6, tt_zentec },
+       { "generic",    0, tt_generic },
+       { 0,            0, 0 }
+};
+
+int
+ttinit()
+{
+       int i;
+       struct tt_tab *tp;
+       char *p, *q;
+       char *t;
+
+       tt_strp = tt_strings;
+
+       /*
+        * Set output buffer size to about 1 second of output time.
+        */
+       i = MIN(wwbaud/10, 512);
+       if ((tt_ob = malloc((unsigned) i)) == 0) {
+               wwerrno = WWE_NOMEM;
+               return -1;
+       }
+       tt_obp = tt_ob;
+       tt_obe = tt_ob + i;
+
+       /*
+        * Use the standard name of the terminal (i.e. the second
+        * name in termcap).
+        */
+       for (p = wwtermcap; *p && *p != '|' && *p != ':'; p++)
+               ;
+       if (*p == '|')
+               p++;
+       for (q = p; *q && *q != '|' && *q != ':'; q++)
+               ;
+       if (q != p && (t = malloc((unsigned) (q - p + 1))) != 0) {
+               wwterm = t;
+               while (p < q)
+                       *t++ = *p++;
+               *t = 0;
+       }
+       for (tp = tt_tab; tp->tt_name != 0; tp++)
+               if (strncmp(tp->tt_name, wwterm, tp->tt_len) == 0)
+                       break;
+       if (tp->tt_name == 0) {
+               wwerrno = WWE_BADTERM;
+               return -1;
+       }
+       if ((*tp->tt_func)() < 0) {
+               wwerrno = WWE_CANTDO;
+               return -1;
+       }
+       if (wwgetttysize(0, &tt.tt_nrow, &tt.tt_ncol) < 0)
+               return -1;
+       tt.tt_scroll_top = 0;
+       tt.tt_scroll_bot = tt.tt_nrow - 1;
+       return 0;
+}
diff --git a/window/ttoutput.c b/window/ttoutput.c
new file mode 100644 (file)
index 0000000..66cdae2
--- /dev/null
@@ -0,0 +1,157 @@
+/*     $NetBSD: ttoutput.c,v 1.4 1997/11/21 08:36:34 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ttoutput.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: ttoutput.c,v 1.4 1997/11/21 08:36:34 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include "ww.h"
+#include "tt.h"
+
+/*
+ * Buffered output package.
+ * We need this because stdio fails on non-blocking writes.
+ */
+
+void
+ttflush()
+{
+       char *p;
+       int n = tt_obp - tt_ob;
+
+       if (n == 0)
+               return;
+       if (tt.tt_checksum)
+               (*tt.tt_checksum)(tt_ob, n);
+       if (tt.tt_flush) {
+               (*tt.tt_flush)();
+               return;
+       }
+       wwnflush++;
+       for (p = tt_ob; p < tt_obp;) {
+               wwnwr++;
+               n = write(1, p, tt_obp - p);
+               if (n < 0) {
+                       wwnwre++;
+                       if (errno != EWOULDBLOCK) {
+                               /* can't deal with this */
+                               p = tt_obp;
+                       }
+               } else if (n == 0) {
+                       /* what to do? */
+                       wwnwrz++;
+               } else {
+                       wwnwrc += n;
+                       p += n;
+               }
+       }
+       tt_obp = tt_ob;
+}
+
+void
+ttputs(s)
+       char *s;
+{
+       while (*s)
+               ttputc(*s++);
+}
+
+void
+ttwrite(s, n)
+       char *s;
+       int n;
+{
+       switch (n) {
+       case 0:
+               break;
+       case 1:
+               ttputc(*s);
+               break;
+       case 2:
+               if (tt_obe - tt_obp < 2)
+                       ttflush();
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s;
+               break;
+       case 3:
+               if (tt_obe - tt_obp < 3)
+                       ttflush();
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s;
+               break;
+       case 4:
+               if (tt_obe - tt_obp < 4)
+                       ttflush();
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s;
+               break;
+       case 5:
+               if (tt_obe - tt_obp < 5)
+                       ttflush();
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s++;
+               *tt_obp++ = *s;
+               break;
+       default:
+               while (n > 0) {
+                       int m;
+
+                       while ((m = tt_obe - tt_obp) == 0)
+                               ttflush();
+                       if ((m = tt_obe - tt_obp) > n)
+                               m = n;
+                       memmove(tt_obp, s, m);
+                       tt_obp += m;
+                       s += m;
+                       n -= m;
+               }
+       }
+}
diff --git a/window/tttermcap.c b/window/tttermcap.c
new file mode 100644 (file)
index 0000000..202ce4e
--- /dev/null
@@ -0,0 +1,135 @@
+/*     $NetBSD: tttermcap.c,v 1.4 1997/11/21 08:36:35 lukem Exp $      */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tttermcap.c        8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: tttermcap.c,v 1.4 1997/11/21 08:36:35 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#ifdef __APPLE__
+#include <curses.h>
+#else
+#include <termcap.h>
+#endif
+#include "tt.h"
+
+void
+tttputc(c)
+       int c;
+{
+       ttputc(c);
+}
+
+void
+ttxputc(c)
+       int c;
+{
+       *tt_strp++ = c;
+}
+
+struct tt_str *
+tttgetstr(str)
+       char *str;
+{
+       struct tt_str *s;
+
+       if ((str = tgetstr(str, &tt_strp)) == 0)
+               return 0;
+       if ((s = (struct tt_str *) malloc(sizeof *s)) == 0)
+               return 0;
+       s->ts_str = str;
+       s->ts_n = tt_strp - s->ts_str - 1;
+       return s;
+}
+
+struct tt_str *
+ttxgetstr(str)
+       char *str;
+{
+       struct tt_str *s;
+       char buf[100];
+       char *bufp = buf;
+
+       if (tgetstr(str, &bufp) == 0)
+               return 0;
+       if ((s = (struct tt_str *) malloc(sizeof *s)) == 0)
+               return 0;
+       s->ts_str = tt_strp;
+       tputs(buf, 1, ttxputc);
+       s->ts_n = tt_strp - s->ts_str;
+       *tt_strp++ = 0;
+       return s;
+}
+
+void
+tttgoto(s, col, row)
+       struct tt_str *s;
+       int col, row;
+{
+       char *p = s->ts_str;
+
+       ttputs(tgoto(p, col, row));
+       for (p += s->ts_n; *--p == 0;)
+               ttputc(0);
+}
+
+void
+ttpgoto(s, col, row, n)
+       struct tt_str *s;
+       int col, row, n;
+{
+
+       tputs(tgoto(s->ts_str, col, row), n, tttputc);
+}
+
+int
+ttstrcmp(a, b)
+       struct tt_str *a, *b;
+{
+       int n, r;
+
+       if ((r = memcmp(a->ts_str, b->ts_str,
+                       (n = a->ts_n - b->ts_n) < 0 ? a->ts_n : b->ts_n)))
+               return r;
+       return n;
+}
diff --git a/window/tttvi925.c b/window/tttvi925.c
new file mode 100644 (file)
index 0000000..1818102
--- /dev/null
@@ -0,0 +1,72 @@
+/*     $NetBSD: tttvi925.c,v 1.4 1997/11/21 08:36:37 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * David Barto at Celerity Computer Corp.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tttvi925.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: tttvi925.c,v 1.4 1997/11/21 08:36:37 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+
+/*
+ * Televideo 925 as emulated by Microterm.
+ */
+
+#define G (WWM_GRP << WWC_MSHIFT)
+short tvi925_frame[16] = {
+       ' ',    '~'|G,  '|'|G,  'c'|G,
+       '~'|G,  '~'|G,  '`'|G,  'e'|G,
+       '|'|G,  'a'|G,  '|'|G,  'g'|G,
+       'b'|G,  'f'|G,  'h'|G,  'd'|G
+};
+
+int
+tt_tvi925()
+{
+
+       if (tt_generic() < 0)
+               return -1;
+       tt.tt_availmodes |= WWM_GRP;
+       tt.tt_frame = tvi925_frame;
+       return 0;
+}
diff --git a/window/ttwyse60.c b/window/ttwyse60.c
new file mode 100644 (file)
index 0000000..3bd7f16
--- /dev/null
@@ -0,0 +1,84 @@
+/*     $NetBSD: ttwyse60.c,v 1.4 1997/11/21 08:36:39 lukem Exp $       */
+
+/*
+ * Copyright 1987 by David C. Elliott, MIPS Computer Systems.
+ *
+ * Unlimited redistribution allowed as long as this notice
+ * is kept intact.
+ */
+
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * David C. Elliott, of MIPS Computer Systems.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ttwyse60.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: ttwyse60.c,v 1.4 1997/11/21 08:36:39 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+
+#define G (WWM_GRP << WWC_MSHIFT)
+short wyse60_frame[16] = {
+       ' ',    '6'|G,  ':'|G,  '1'|G,
+       '6'|G,  '6'|G,  '2'|G,  '4'|G,
+       ':'|G,  '5'|G,  ':'|G,  '='|G,
+       '3'|G,  '9'|G,  '0'|G,  '0'|G
+};
+
+extern struct tt_str *gen_AS;
+extern struct tt_str *gen_AE;
+
+int
+tt_wyse60()
+{
+       static struct tt_str ae = { "\033H\003", 3 };
+       static struct tt_str as = { "\033H\002", 3 };
+
+       if (tt_generic() < 0)
+               return -1;
+       tt.tt_availmodes |= WWM_GRP;
+       tt.tt_frame = wyse60_frame;
+       if (gen_AS == 0)
+               gen_AS = &as;
+       if (gen_AE == 0)
+               gen_AE = &ae;
+       return 0;
+}
diff --git a/window/ttwyse75.c b/window/ttwyse75.c
new file mode 100644 (file)
index 0000000..175b215
--- /dev/null
@@ -0,0 +1,84 @@
+/*     $NetBSD: ttwyse75.c,v 1.4 1997/11/21 08:36:40 lukem Exp $       */
+
+/*
+ * Copyright 1987 by David C. Elliott, MIPS Computer Systems.
+ *
+ * Unlimited redistribution allowed as long as this notice
+ * is kept intact.
+ */
+
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * David C. Elliott, of MIPS Computer Systems.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ttwyse75.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: ttwyse75.c,v 1.4 1997/11/21 08:36:40 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+
+#define G (WWM_GRP << WWC_MSHIFT)
+short wyse75_frame[16] = {
+       ' ',    'x'|G,  'q'|G,  'm'|G,
+       'x'|G,  'x'|G,  'l'|G,  't'|G,
+       'q'|G,  'j'|G,  'q'|G,  'v'|G,
+       'k'|G,  'u'|G,  'w'|G,  'v'|G
+};
+
+extern struct tt_str *gen_AS;
+extern struct tt_str *gen_AE;
+
+int
+tt_wyse75()
+{
+       static struct tt_str ae = { "\033(B", 3 };
+       static struct tt_str as = { "\033(0", 3 };
+
+       if (tt_generic() < 0)
+               return -1;
+       tt.tt_availmodes |= WWM_GRP;
+       tt.tt_frame = wyse75_frame;
+       if (gen_AS == 0)
+               gen_AS = &as;
+       if (gen_AE == 0)
+               gen_AE = &ae;
+       return 0;
+}
diff --git a/window/ttzapple.c b/window/ttzapple.c
new file mode 100644 (file)
index 0000000..ca0a0f7
--- /dev/null
@@ -0,0 +1,552 @@
+/*     $NetBSD: ttzapple.c,v 1.4 1997/11/21 08:36:42 lukem Exp $       */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ttzapple.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: ttzapple.c,v 1.4 1997/11/21 08:36:42 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdio.h>
+#include "ww.h"
+#include "tt.h"
+#include "char.h"
+
+/*
+zz|zapple|perfect apple:\
+       :am:pt:co#80:li#24:le=^H:nd=^F:up=^K:do=^J:\
+       :ho=\E0:ll=\E1:cm=\E=%+ %+ :ch=\E<%+ :cv=\E>%+ :\
+       :cl=\E4:ce=\E2:cd=\E3:rp=\E@%.%+ :\
+       :so=\E+:se=\E-:\
+       :dc=\Ec:DC=\EC%+ :ic=\Ei:IC=\EI%+ :\
+       :al=\Ea:AL=\EA%+ :dl=\Ed:DL=\ED%+ :\
+       :sf=\Ef:SF=\EF%+ :sr=\Er:SR=\ER%+ :cs=\E?%+ %+ :\
+       :is=\E-\ET :
+*/
+
+#define NCOL           80
+#define NROW           24
+#define TOKEN_MAX      32
+
+extern short gen_frame[];
+
+       /* for error correction */
+int zz_ecc;
+int zz_lastc;
+
+       /* for checkpointing */
+int zz_sum;
+
+void   zz_checkpoint __P((void));
+void   zz_checksum __P((char *, int));
+void   zz_clear __P((void));
+void   zz_clreol __P((void));
+void   zz_clreos __P((void));
+void   zz_compress __P((int));
+void   zz_delchar __P((int));
+void   zz_delline __P((int));
+void   zz_end __P((void));
+void   zz_insline __P((int));
+void   zz_insspace __P((int));
+void   zz_move __P((int, int));
+void   zz_put_token __P((int, char *, int));
+void   zz_putc __P((char));
+void   zz_reset __P((void));
+int    zz_rint __P((char *, int));
+void   zz_scroll_down __P((int));
+void   zz_scroll_up __P((int));
+void   zz_setmodes __P((int));
+void   zz_setscroll __P((int, int));
+void   zz_set_token __P((int, char *, int));
+void   zz_start __P((void));
+void   zz_write __P((char *, int));
+
+void
+zz_setmodes(new)
+       int new;
+{
+       if (new & WWM_REV) {
+               if ((tt.tt_modes & WWM_REV) == 0)
+                       ttesc('+');
+       } else
+               if (tt.tt_modes & WWM_REV)
+                       ttesc('-');
+       tt.tt_modes = new;
+}
+
+void
+zz_insline(n)
+       int n;
+{
+       if (n == 1)
+               ttesc('a');
+       else {
+               ttesc('A');
+               ttputc(n + ' ');
+       }
+}
+
+void
+zz_delline(n)
+       int n;
+{
+       if (n == 1)
+               ttesc('d');
+       else {
+               ttesc('D');
+               ttputc(n + ' ');
+       }
+}
+
+void
+zz_putc(c)
+       char c;
+{
+       if (tt.tt_nmodes != tt.tt_modes)
+               zz_setmodes(tt.tt_nmodes);
+       ttputc(c);
+       if (++tt.tt_col == NCOL)
+               tt.tt_col = 0, tt.tt_row++;
+}
+
+void
+zz_write(p, n)
+       char *p;
+       int n;
+{
+       if (tt.tt_nmodes != tt.tt_modes)
+               zz_setmodes(tt.tt_nmodes);
+       ttwrite(p, n);
+       tt.tt_col += n;
+       if (tt.tt_col == NCOL)
+               tt.tt_col = 0, tt.tt_row++;
+}
+
+void
+zz_move(row, col)
+       int row, col;
+{
+       int x;
+
+       if (tt.tt_row == row) {
+same_row:
+               if ((x = col - tt.tt_col) == 0)
+                       return;
+               if (col == 0) {
+                       ttctrl('m');
+                       goto out;
+               }
+               switch (x) {
+               case 2:
+                       ttctrl('f');
+               case 1:
+                       ttctrl('f');
+                       goto out;
+               case -2:
+                       ttctrl('h');
+               case -1:
+                       ttctrl('h');
+                       goto out;
+               }
+               if ((col & 7) == 0 && x > 0 && x <= 16) {
+                       ttctrl('i');
+                       if (x > 8)
+                               ttctrl('i');
+                       goto out;
+               }
+               ttesc('<');
+               ttputc(col + ' ');
+               goto out;
+       }
+       if (tt.tt_col == col) {
+               switch (row - tt.tt_row) {
+               case 2:
+                       ttctrl('j');
+               case 1:
+                       ttctrl('j');
+                       goto out;
+               case -2:
+                       ttctrl('k');
+               case -1:
+                       ttctrl('k');
+                       goto out;
+               }
+               if (col == 0) {
+                       if (row == 0)
+                               goto home;
+                       if (row == NROW - 1)
+                               goto ll;
+               }
+               ttesc('>');
+               ttputc(row + ' ');
+               goto out;
+       }
+       if (col == 0) {
+               if (row == 0) {
+home:
+                       ttesc('0');
+                       goto out;
+               }
+               if (row == tt.tt_row + 1) {
+                       /*
+                        * Do newline first to match the sequence
+                        * for scroll down and return
+                        */
+                       ttctrl('j');
+                       ttctrl('m');
+                       goto out;
+               }
+               if (row == NROW - 1) {
+ll:
+                       ttesc('1');
+                       goto out;
+               }
+       }
+       /* favor local motion for better compression */
+       if (row == tt.tt_row + 1) {
+               ttctrl('j');
+               goto same_row;
+       }
+       if (row == tt.tt_row - 1) {
+               ttctrl('k');
+               goto same_row;
+       }
+       ttesc('=');
+       ttputc(' ' + row);
+       ttputc(' ' + col);
+out:
+       tt.tt_col = col;
+       tt.tt_row = row;
+}
+
+void
+zz_start()
+{
+       ttesc('T');
+       ttputc(TOKEN_MAX + ' ');
+       ttesc('U');
+       ttputc('!');
+       zz_ecc = 1;
+       zz_lastc = -1;
+       ttesc('v');
+       ttflush();
+       zz_sum = 0;
+       zz_setscroll(0, NROW - 1);
+       zz_clear();
+       zz_setmodes(0);
+}
+
+void
+zz_reset()
+{
+       zz_setscroll(0, NROW - 1);
+       tt.tt_modes = WWM_REV;
+       zz_setmodes(0);
+       tt.tt_col = tt.tt_row = -10;
+}
+
+void
+zz_end()
+{
+       ttesc('T');
+       ttputc(' ');
+       ttesc('U');
+       ttputc(' ');
+       zz_ecc = 0;
+}
+
+void
+zz_clreol()
+{
+       ttesc('2');
+}
+
+void
+zz_clreos()
+{
+       ttesc('3');
+}
+
+void
+zz_clear()
+{
+       ttesc('4');
+       tt.tt_col = tt.tt_row = 0;
+}
+
+void
+zz_insspace(n)
+       int n;
+{
+       if (n == 1)
+               ttesc('i');
+       else {
+               ttesc('I');
+               ttputc(n + ' ');
+       }
+}
+
+void
+zz_delchar(n)
+       int n;
+{
+       if (n == 1)
+               ttesc('c');
+       else {
+               ttesc('C');
+               ttputc(n + ' ');
+       }
+}
+
+void
+zz_scroll_down(n)
+       int n;
+{
+       if (n == 1)
+               if (tt.tt_row == NROW - 1)
+                       ttctrl('j');
+               else
+                       ttesc('f');
+       else {
+               ttesc('F');
+               ttputc(n + ' ');
+       }
+}
+
+void
+zz_scroll_up(n)
+       int n;
+{
+       if (n == 1)
+               ttesc('r');
+       else {
+               ttesc('R');
+               ttputc(n + ' ');
+       }
+}
+
+void
+zz_setscroll(top, bot)
+       int top, bot;
+{
+       ttesc('?');
+       ttputc(top + ' ');
+       ttputc(bot + ' ');
+       tt.tt_scroll_top = top;
+       tt.tt_scroll_bot = bot;
+}
+
+int zz_debug = 0;
+
+void
+zz_set_token(t, s, n)
+       int t;
+       char *s;
+       int n;
+{
+       if (tt.tt_nmodes != tt.tt_modes)
+               zz_setmodes(tt.tt_nmodes);
+       if (zz_debug) {
+               char buf[100];
+               zz_setmodes(WWM_REV);
+               (void) sprintf(buf, "%02x=", t);
+               ttputs(buf);
+               tt.tt_col += 3;
+       }
+       ttputc(0x80);
+       ttputc(t + 1);
+       s[n - 1] |= 0x80;
+       ttwrite(s, n);
+       s[n - 1] &= ~0x80;
+}
+
+void
+zz_put_token(t, s, n)
+       int t;
+       char *s;
+       int n;
+{
+       if (tt.tt_nmodes != tt.tt_modes)
+               zz_setmodes(tt.tt_nmodes);
+       if (zz_debug) {
+               char buf[100];
+               zz_setmodes(WWM_REV);
+               (void) sprintf(buf, "%02x>", t);
+               ttputs(buf);
+               tt.tt_col += 3;
+       }
+       ttputc(t + 0x81);
+}
+
+int
+zz_rint(p, n)
+       char *p;
+       int n;
+{
+       int i;
+       char *q;
+
+       if (!zz_ecc)
+               return n;
+       for (i = n, q = p; --i >= 0;) {
+               int c = (unsigned char) *p++;
+
+               if (zz_lastc == 0) {
+                       switch (c) {
+                       case 0:
+                               *q++ = 0;
+                               zz_lastc = -1;
+                               break;
+                       case 1:         /* start input ecc */
+                               zz_ecc = 2;
+                               zz_lastc = -1;
+                               wwnreadstat++;
+                               break;
+                       case 2:         /* ack checkpoint */
+                               tt.tt_ack = 1;
+                               zz_lastc = -1;
+                               wwnreadack++;
+                               break;
+                       case 3:         /* nack checkpoint */
+                               tt.tt_ack = -1;
+                               zz_lastc = -1;
+                               wwnreadnack++;
+                               break;
+                       default:
+                               zz_lastc = c;
+                               wwnreadec++;
+                       }
+               } else if (zz_ecc == 1) {
+                       if (c)
+                               *q++ = c;
+                       else
+                               zz_lastc = 0;
+               } else {
+                       if (zz_lastc < 0) {
+                               zz_lastc = c;
+                       } else if (zz_lastc == c) {
+                               *q++ = zz_lastc;
+                               zz_lastc = -1;
+                       } else {
+                               wwnreadec++;
+                               zz_lastc = c;
+                       }
+               }
+       }
+       return q - (p - n);
+}
+
+void
+zz_checksum(p, n)
+       char *p;
+       int n;
+{
+       while (--n >= 0) {
+               int c = *p++ & 0x7f;
+               c ^= zz_sum;
+               zz_sum = c << 1 | (c >> 11 & 1);
+       }
+}
+
+void
+zz_compress(flag)
+       int flag;
+{
+       if (flag)
+               tt.tt_checksum = 0;
+       else
+               tt.tt_checksum = zz_checksum;
+}
+
+void
+zz_checkpoint()
+{
+       static char x[] = { ctrl('['), 'V', 0, 0 };
+
+       zz_checksum(x, sizeof x);
+       ttesc('V');
+       ttputc(' ' + (zz_sum & 0x3f));
+       ttputc(' ' + (zz_sum >> 6 & 0x3f));
+       ttflush();
+       zz_sum = 0;
+}
+
+int
+tt_zapple()
+{
+       tt.tt_insspace = zz_insspace;
+       tt.tt_delchar = zz_delchar;
+       tt.tt_insline = zz_insline;
+       tt.tt_delline = zz_delline;
+       tt.tt_clreol = zz_clreol;
+       tt.tt_clreos = zz_clreos;
+       tt.tt_scroll_down = zz_scroll_down;
+       tt.tt_scroll_up = zz_scroll_up;
+       tt.tt_setscroll = zz_setscroll;
+       tt.tt_availmodes = WWM_REV;
+       tt.tt_wrap = 1;
+       tt.tt_retain = 0;
+       tt.tt_ncol = NCOL;
+       tt.tt_nrow = NROW;
+       tt.tt_start = zz_start;
+       tt.tt_reset = zz_reset;
+       tt.tt_end = zz_end;
+       tt.tt_write = zz_write;
+       tt.tt_putc = zz_putc;
+       tt.tt_move = zz_move;
+       tt.tt_clear = zz_clear;
+       tt.tt_setmodes = zz_setmodes;
+       tt.tt_frame = gen_frame;
+       tt.tt_padc = TT_PADC_NONE;
+       tt.tt_ntoken = 127;
+       tt.tt_set_token = zz_set_token;
+       tt.tt_put_token = zz_put_token;
+       tt.tt_token_min = 1;
+       tt.tt_token_max = TOKEN_MAX;
+       tt.tt_set_token_cost = 2;
+       tt.tt_put_token_cost = 1;
+       tt.tt_compress = zz_compress;
+       tt.tt_checksum = zz_checksum;
+       tt.tt_checkpoint = zz_checkpoint;
+       tt.tt_reset = zz_reset;
+       tt.tt_rint = zz_rint;
+       return 0;
+}
diff --git a/window/ttzentec.c b/window/ttzentec.c
new file mode 100644 (file)
index 0000000..5907404
--- /dev/null
@@ -0,0 +1,74 @@
+/*     $NetBSD: ttzentec.c,v 1.4 1997/11/21 08:36:44 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ttzentec.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: ttzentec.c,v 1.4 1997/11/21 08:36:44 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+
+/*
+ * Zentec 1021
+ *
+ * We let the termcap entry specify how to enter and exit graphics mode,
+ * since it varies with what the terminal is emulating.
+ */
+
+#define G (WWM_GRP << WWC_MSHIFT)
+short zentec_frame[16] = {
+       ' ',    'x'|G,  'q'|G,  'm'|G,
+       'x'|G,  'x'|G,  'l'|G,  't'|G,
+       'q'|G,  'j'|G,  'q'|G,  'v'|G,
+       'k'|G,  'u'|G,  'w'|G,  'n'|G
+};
+
+int
+tt_zentec()
+{
+       if (tt_generic() < 0)
+               return -1;
+       if (tt.tt_availmodes | WWM_GRP)
+               tt.tt_frame = zentec_frame;
+       return 0;
+}
diff --git a/window/value.h b/window/value.h
new file mode 100644 (file)
index 0000000..d6b051f
--- /dev/null
@@ -0,0 +1,55 @@
+/*     $NetBSD: value.h,v 1.3 1995/09/28 10:35:00 tls Exp $    */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)value.h     8.1 (Berkeley) 6/6/93
+ */
+
+struct value {
+       char v_type;
+       union {
+               int V_num;
+               char *V_str;
+       } v_un;
+};
+#define v_num  v_un.V_num
+#define v_str  v_un.V_str
+
+#define V_NUM  1
+#define V_STR  2
+#define V_ERR  3
+
+#define val_free(v)    ((v).v_type == V_STR ? str_free((v).v_str) : 0)
diff --git a/window/var.c b/window/var.c
new file mode 100644 (file)
index 0000000..8fddabc
--- /dev/null
@@ -0,0 +1,168 @@
+/*     $NetBSD: var.c,v 1.5 1997/11/21 08:36:45 lukem Exp $    */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)var.c      8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: var.c,v 1.5 1997/11/21 08:36:45 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#include "value.h"
+#define EXTERN
+#include "var.h"
+#undef  EXTERN
+#include "window_string.h"
+
+struct var *
+var_set1(head, name, v)
+       struct var **head;
+       char *name;
+       struct value *v;
+{
+       struct var **p;
+       struct var *r;
+       struct value val;
+
+       /* do this first, easier to recover */
+       val = *v;
+       if (val.v_type == V_STR && val.v_str != 0 &&
+           (val.v_str = str_cpy(val.v_str)) == 0)
+               return 0;
+       if (*(p = var_lookup1(head, name)) == 0) {
+               r = (struct var *) malloc(sizeof (struct var));
+               if (r == 0) {
+                       val_free(val);
+                       return 0;
+               }
+               if ((r->r_name = str_cpy(name)) == 0) {
+                       val_free(val);
+                       free((char *) r);
+                       return 0;
+               }
+               r->r_left = r->r_right = 0;
+               *p = r;
+       } else {
+               r = *p;
+               val_free(r->r_val);
+       }
+       r->r_val = val;
+       return r;
+}
+
+struct var *
+var_setstr1(head, name, str)
+       struct var **head;
+       char *name;
+       char *str;
+{
+       struct value v;
+
+       v.v_type = V_STR;
+       v.v_str = str;
+       return var_set1(head, name, &v);
+}
+
+struct var *
+var_setnum1(head, name, num)
+       struct var **head;
+       char *name;
+       int num;
+{
+       struct value v;
+
+       v.v_type = V_NUM;
+       v.v_num = num;
+       return var_set1(head, name, &v);
+}
+
+int
+var_unset1(head, name)
+       struct var **head;
+       char *name;
+{
+       struct var **p;
+       struct var *r;
+
+       if (*(p = var_lookup1(head, name)) == 0)
+               return -1;
+       r = *p;
+       *p = r->r_left;
+       while (*p != 0)
+               p = &(*p)->r_right;
+       *p = r->r_right;
+       val_free(r->r_val);
+       str_free(r->r_name);
+       free((char *) r);
+       return 0;
+}
+
+struct var **
+var_lookup1(p, name)
+       struct var **p;
+       char *name;
+{
+       int cmp;
+
+       while (*p != 0) {
+               if ((cmp = strcmp(name, (*p)->r_name)) < 0)
+                       p = &(*p)->r_left;
+               else if (cmp > 0)
+                       p = &(*p)->r_right;
+               else
+                       break;
+       }
+       return p;
+}
+
+int
+var_walk1(r, func, a)
+       struct var *r;
+       int (*func) __P((void *, struct var *));
+       void *a;
+{
+       if (r == 0)
+               return 0;
+       if (var_walk1(r->r_left, func, a) < 0 || (*func)(a, r) < 0
+           || var_walk1(r->r_right, func, a) < 0)
+               return -1;
+       return 0;
+}
diff --git a/window/var.h b/window/var.h
new file mode 100644 (file)
index 0000000..2df1087
--- /dev/null
@@ -0,0 +1,67 @@
+/*     $NetBSD: var.h,v 1.4 1997/11/21 08:36:46 lukem Exp $    */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)var.h       8.1 (Berkeley) 6/6/93
+ */
+
+#ifndef EXTERN
+#define EXTERN extern
+#endif
+
+struct var {
+       struct var *r_left;
+       struct var *r_right;
+       char *r_name;
+       struct value r_val;
+};
+
+struct var     **var_lookup1 __P((struct var **, char *));
+struct var     *var_set1 __P((struct var **, char *, struct value *));
+struct var     *var_setnum1 __P((struct var **, char *, int));
+struct var     *var_setstr1 __P((struct var **, char *, char *));
+int             var_unset1 __P((struct var **, char *));
+int             var_walk1 __P((struct var *, int (*func)(void *, struct var *),
+                               void *));
+
+#define var_set(n, v)          var_set1(&var_head, n, v)
+#define var_setstr(n, s)       var_setstr1(&var_head, n, s)
+#define var_setnum(n, i)       var_setnum1(&var_head, n, i)
+#define var_unset(n)           var_unset1(&var_head, n)
+#define var_lookup(n)          (*var_lookup1(&var_head, n))
+#define var_walk(f, a)         var_walk1(var_head, f, a)
+
+EXTERN struct var *var_head;           /* secret, shhh */
diff --git a/window/win.c b/window/win.c
new file mode 100644 (file)
index 0000000..830f052
--- /dev/null
@@ -0,0 +1,396 @@
+/*     $NetBSD: win.c,v 1.10 1998/08/25 20:59:43 ross Exp $    */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)win.c      8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: win.c,v 1.10 1998/08/25 20:59:43 ross Exp $");
+#endif
+#endif /* not lint */
+
+#include <string.h>
+#include "defs.h"
+#include "char.h"
+#include "window_string.h"
+
+/*
+ * Higher level routines for dealing with windows.
+ *
+ * There are two types of windows: user window, and information window.
+ * User windows are the ones with a pty and shell.  Information windows
+ * are for displaying error messages, and other information.
+ *
+ * The windows are doubly linked in overlapping order and divided into
+ * two groups: foreground and normal.  Information
+ * windows are always foreground.  User windows can be either.
+ * Addwin() adds a window to the list at the top of one of the two groups.
+ * Deletewin() deletes a window.  Front() moves a window to the front
+ * of its group.  Wwopen(), wwadd(), and wwdelete() should never be called
+ * directly.
+ */
+
+/*
+ * Open a user window.
+ */
+struct ww *
+openwin(id, row, col, nrow, ncol, nline, label, type, uflags, shf, sh)
+       int     id, row, col, nrow, ncol, nline;
+       char   *label;
+       int     type, uflags;
+       char   *shf, **sh;
+{
+       struct ww *w;
+
+       if (id < 0 && (id = findid()) < 0)
+               return 0;
+       if (row + nrow <= 0 || row > wwnrow - 1
+           || col + ncol <= 0 || col > wwncol - 1) {
+               error("Illegal window position.");
+               return 0;
+       }
+       w = wwopen(type, 0, nrow, ncol, row, col, nline);
+       if (w == 0) {
+               error("Can't open window: %s.", wwerror());
+               return 0;
+       }
+       w->ww_id = id;
+       window[id] = w;
+       CLR(w->ww_uflags, WWU_ALLFLAGS);
+       SET(w->ww_uflags, uflags);
+       w->ww_alt = w->ww_w;
+       if (label != 0 && setlabel(w, label) < 0)
+               error("No memory for label.");
+       wwcursor(w, 1);
+       /*
+        * We have to do this little maneuver to make sure
+        * addwin() puts w at the top, so we don't waste an
+        * insert and delete operation.
+        */
+       setselwin((struct ww *)0);
+       addwin(w, 0);
+       setselwin(w);
+       if (wwspawn(w, shf, sh) < 0) {
+               error("Can't execute %s: %s.", shf, wwerror());
+               closewin(w);
+               return 0;
+       }
+       return w;
+}
+
+int
+findid()
+{
+       int i;
+
+       for (i = 0; i < NWINDOW && window[i] != 0; i++)
+               ;
+       if (i >= NWINDOW) {
+               error("Too many windows.");
+               return -1;
+       }
+       return i;
+}
+
+struct ww *
+findselwin()
+{
+       struct ww *w, *s = 0;
+       int i;
+
+       for (i = 0; i < NWINDOW; i++)
+               if ((w = window[i]) != 0 && w != selwin &&
+                   (s == 0 ||
+                    (!isfg(w) && (w->ww_order < s->ww_order || isfg(s)))))
+                       s = w;
+       return s;
+}
+
+/*
+ * Close a user window.  Close all if w == 0.
+ */
+void
+closewin(w)
+       struct ww *w;
+{
+       char didit = 0;
+       int i;
+
+       if (w != 0) {
+               closewin1(w);
+               didit++;
+       } else
+               for (i = 0; i < NWINDOW; i++) {
+                       if ((w = window[i]) == 0)
+                               continue;
+                       closewin1(w);
+                       didit++;
+               }
+       if (didit) {
+               if (selwin == 0) {
+                       if (lastselwin != 0) {
+                               setselwin(lastselwin);
+                               lastselwin = 0;
+                       } else if ((w = findselwin()))
+                               setselwin(w);
+               }
+               if (lastselwin == 0 && selwin)
+                       if ((w = findselwin()))
+                               lastselwin = w;
+               reframe();
+       }
+}
+
+/*
+ * Open an information (display) window.
+ */
+struct ww *
+openiwin(nrow, label)
+       int nrow;
+       char *label;
+{
+       struct ww *w;
+
+       if ((w = wwopen(WWT_INTERNAL, 0, nrow, wwncol, 2, 0, 0)) == 0)
+               return 0;
+       SET(w->ww_wflags, WWW_MAPNL | WWW_NOINTR | WWW_NOUPDATE | WWW_UNCTRL);
+       SET(w->ww_uflags, WWU_HASFRAME | WWU_CENTER);
+       w->ww_id = -1;
+       (void) setlabel(w, label);
+       addwin(w, 1);
+       reframe();
+       return w;
+}
+
+/*
+ * Close an information window.
+ */
+void
+closeiwin(w)
+       struct ww *w;
+{
+       closewin1(w);
+       reframe();
+}
+
+void
+closewin1(w)
+       struct ww *w;
+{
+       if (w == selwin)
+               selwin = 0;
+       if (w == lastselwin)
+               lastselwin = 0;
+       if (w->ww_id >= 0 && w->ww_id < NWINDOW)
+               window[w->ww_id] = 0;
+       if (w->ww_label)
+               str_free(w->ww_label);
+       deletewin(w);
+       wwclose(w);
+}
+
+/*
+ * Move the window to the top of its group.
+ * Don't do it if already fully visible.
+ * Wwvisible() doesn't work for tinted windows.
+ * But anything to make it faster.
+ * Always reframe() if doreframe is true.
+ */
+void
+front(w, doreframe)
+       struct ww *w;
+       char doreframe;
+{
+       if (w->ww_back != (isfg(w) ? framewin : fgwin) && !wwvisible(w)) {
+               deletewin(w);
+               addwin(w, isfg(w));
+               doreframe = 1;
+       }
+       if (doreframe)
+               reframe();
+}
+
+/*
+ * Add a window at the top of normal windows or foreground windows.
+ * For normal windows, we put it behind the current window.
+ */
+void
+addwin(w, fg)
+       struct ww *w;
+       char fg;
+{
+       if (fg) {
+               wwadd(w, framewin);
+               if (fgwin == framewin)
+                       fgwin = w;
+       } else
+               wwadd(w, selwin != 0 && selwin != w && !isfg(selwin)
+                               ? selwin : fgwin);
+}
+
+/*
+ * Delete a window.
+ */
+void
+deletewin(w)
+       struct ww *w;
+{
+       if (fgwin == w)
+               fgwin = w->ww_back;
+       wwdelete(w);
+}
+
+void
+reframe()
+{
+       struct ww *w;
+
+       wwunframe(framewin);
+       for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
+               if (ISSET(w->ww_uflags, WWU_HASFRAME)) {
+                       wwframe(w, framewin);
+                       labelwin(w);
+               }
+}
+
+void
+labelwin(w)
+       struct ww *w;
+{
+       int mode = w == selwin ? WWM_REV : 0;
+
+       if (!ISSET(w->ww_uflags, WWU_HASFRAME))
+               return;
+       if (w->ww_id >= 0) {
+               char buf[2];
+
+               buf[0] = w->ww_id + '1';
+               buf[1] = 0;
+               wwlabel(w, framewin, 1, buf, mode);
+       }
+       if (w->ww_label) {
+               int col;
+
+               if (ISSET(w->ww_uflags, WWU_CENTER)) {
+                       col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
+                       col = MAX(3, col);
+               } else
+                       col = 3;
+               wwlabel(w, framewin, col, w->ww_label, mode);
+       }
+}
+
+void
+stopwin(w)
+       struct ww *w;
+{
+       if (w->ww_pty >= 0 && w->ww_type == WWT_PTY && wwstoptty(w->ww_pty) < 0)
+               error("Can't stop output: %s.", wwerror());
+       else
+               SET(w->ww_pflags, WWP_STOPPED);
+}
+
+void
+startwin(w)
+       struct ww *w;
+{
+       if (w->ww_pty >= 0 && w->ww_type == WWT_PTY &&
+           wwstarttty(w->ww_pty) < 0)
+               error("Can't start output: %s.", wwerror());
+       else
+               CLR(w->ww_pflags, WWP_STOPPED);
+}
+
+void
+sizewin(w, nrow, ncol)
+       struct ww *w;
+       int nrow, ncol;
+{
+       struct ww *back = w->ww_back;
+
+       w->ww_alt.nr = w->ww_w.nr;
+       w->ww_alt.nc = w->ww_w.nc;
+       wwdelete(w);
+       if (wwsize(w, nrow, ncol) < 0)
+               error("Can't resize window: %s.", wwerror());
+       wwadd(w, back);
+       reframe();
+}
+
+void
+waitnl(w)
+       struct ww *w;
+{
+       (void) waitnl1(w, "[Type any key to continue]");
+}
+
+int
+more(w, always)
+       struct ww *w;
+       char always;
+{
+       int c;
+       int uc = ISSET(w->ww_wflags, WWW_UNCTRL);
+
+       if (!always && w->ww_cur.r < w->ww_w.b - 2)
+               return 0;
+       c = waitnl1(w, "[Type escape to abort, any other key to continue]");
+       CLR(w->ww_wflags, WWW_UNCTRL);
+       wwputs("\033E", w);
+       SET(w->ww_wflags, uc);
+       return c == ctrl('[') ? 2 : 1;
+}
+
+int
+waitnl1(w, prompt)
+       struct ww *w;
+       char *prompt;
+{
+       int uc = ISSET(w->ww_wflags, WWW_UNCTRL);
+
+       CLR(w->ww_wflags, WWW_UNCTRL);
+       front(w, 0);
+       wwprintf(w, "\033Y%c%c\033sA%s\033rA ",
+               w->ww_w.nr - 1 + ' ', ' ', prompt);     /* print on last line */
+       wwcurtowin(w);
+       while (wwpeekc() < 0)
+               wwiomux();
+       SET(w->ww_wflags, uc);
+       return wwgetc();
+}
diff --git a/window/window.1 b/window/window.1
new file mode 100644 (file)
index 0000000..1f9c1df
--- /dev/null
@@ -0,0 +1,949 @@
+.\"    $NetBSD: window.1,v 1.5 1997/11/21 08:36:50 lukem Exp $
+.\"
+.\" Copyright (c) 1985, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Edward Wang at The University of California, Berkeley.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)window.1    8.2 (Berkeley) 12/30/93
+.\"
+.Dd December 30, 1993
+.Dt WINDOW 1
+.Os BSD 4.3
+.Sh NAME
+.Nm window
+.Nd window environment
+.Sh SYNOPSIS
+.Nm
+.Op Fl t
+.Op Fl f
+.Op Fl d
+.Op Fl e Ar escape-char
+.Op Fl c Ar command
+.Sh DESCRIPTION
+.Nm
+implements a window environment on
+.Tn ASCII
+terminals.
+.Pp
+A window is a rectangular portion of the physical terminal
+screen associated with a set of processes.  Its size and
+position can be changed by the user at any time.  Processes
+communicate with their window in the same way they normally
+interact with a terminal\-through their standard input, output,
+and diagnostic file descriptors.  The window program handles the
+details of redirecting input and output to and from the
+windows.  At any one time, only one window can receive
+input from the keyboard, but all windows can simultaneously send output
+to the display.
+.Pp
+When
+.Nm
+starts up, the commands (see long commands below)
+contained in the file
+.Pa .windowrc
+in the user's home directory are
+executed.  If it does not exist, two equal sized windows spanning
+the terminal screen are created by default.
+.Pp
+The command line options are
+.Bl -tag -width Fl
+.It Fl t
+Turn on terse mode (see
+.Ic terse
+command below).
+.It Fl f
+Fast.  Don't perform any startup action.
+.It Fl d
+Ignore
+.Pa .windowrc
+and create the two default
+windows instead.
+.It Fl e Ar escape-char 
+Set the escape character to
+.Ar escape-char  .
+.Ar Escape-char
+can be a single character, or in the form
+.Ic ^X
+where
+.Ar X
+is any character, meaning
+.No control\- Ns Ar X  . 
+.It Fl c Ar command 
+Execute the string
+.Ar command
+as a long command (see below)
+before doing anything else.
+.El
+.Pp
+Windows can overlap and are framed as necessary.  Each window
+is named by one of the digits ``1'' to ``9''.  This one-character
+identifier, as well as a user definable label string, are displayed
+with the window on the top edge of its frame.  A window can be
+designated to be in the
+.Ar foreground  ,
+in which case it will always be
+on top of all normal, non-foreground windows, and can be covered
+only by other foreground windows.  A window need not be completely
+within the edges of the terminal screen.  Thus a large window
+(possibly larger than the screen) may be positioned to show only
+a portion of its full size.
+.Pp
+Each window has a cursor and a set of control functions.  Most intelligent
+terminal operations such as line and
+character deletion and insertion are supported.  Display modes
+such as underlining and reverse video are available if they are
+supported by the terminal.  In addition,
+similar to terminals with multiple pages of memory,
+each window has a text buffer which can have more lines than the window
+itself.
+.Ss Process Environment
+With each newly created window, a shell program is spawned with its
+process environment tailored to that window.  Its standard input,
+output, and diagnostic file descriptors are bound to one end of either
+a pseudo-terminal
+.Xr (pty 4 )
+or a
+.Ux
+domain socket
+.Xr (socketpair 4 ) .
+If a pseudo-terminal is used, then its special
+characters and modes (see
+.Xr stty 1 )
+are copied from the physical
+terminal.  A
+.Xr termcap 5
+entry tailored to this window is created
+and passed as environment
+.Xr (environ 5 )
+variable
+.Ev TERMCAP  .
+The termcap entry contains the window's size and
+characteristics as well as information from the physical terminal,
+such as the existence of underline, reverse video, and other display
+modes, and the codes produced by the terminal's function keys,
+if any.  In addition, the window size attributes of the pseudo-terminal
+are set to reflect the size of this window, and updated whenever
+it is changed by the user.  In particular, the editor
+.Xr vi 1
+uses
+this information to redraw its display.
+.Ss Operation
+During normal execution,
+.Nm
+can be in one of two states:
+conversation mode and command mode.  In conversation mode, the
+terminal's real cursor is placed at the cursor position of a particular
+window--called the current window--and input from the keyboard is sent
+to the process in that window.  The current window is always
+on top of all other windows, except those in foreground.  In addition,
+it is set apart by highlighting its identifier and label in reverse video.
+.Pp
+Typing
+.Nm "" Ns 's 
+escape character (normally
+.Ic ^P )
+in conversation
+mode switches it into command mode.  In command mode, the top line of
+the terminal screen becomes the command prompt window, and
+.Nm
+interprets input from the keyboard as commands to manipulate windows.
+.Pp
+There are two types of commands: short commands are usually one or two
+key strokes; long commands are strings either typed by the user in the
+command window (see the
+.Dq Ic \&:
+command below), or read from a file (see
+.Ic source
+below).
+.Ss Short Commands
+Below,
+.Ar \&#
+represents one of the digits ``1'' to ``9''
+corresponding to the windows 1 to 9.
+.Ic ^X
+means
+.No control\- Ns Ar X  , 
+where
+.Ar X
+is any character.  In particular,
+.Ic ^^
+is
+.Li control\-^.
+.Ar Escape
+is the escape key, or
+.Ic ^\&[ .
+.Bl -tag -width Ds
+.It Ar #
+Select window
+.Ar #
+as the current window
+and return to conversation mode.
+.It Ic \&% Ns Ar # 
+Select window
+.Ar #
+but stay in command mode.
+.It Ic ^^
+Select the previous window and return to conversation
+mode.  This is useful for toggling between two windows.
+.It Ic escape
+Return to conversation mode.
+.It Ic ^P
+Return to conversation mode and write
+.Ic ^P
+to the
+current window.  Thus, typing two
+.Ic ^P Ns 's
+in conversation
+mode sends one to the current window.  If the
+.Nm
+escape is changed to some other character, that
+character takes the place of
+.Ic ^P
+here.
+.It Ic ?
+List a short summary of commands.
+.It Ic ^L
+Refresh the screen.
+.It Ic q
+Exit
+.Nm ""  .
+Confirmation is requested.
+.It Ic ^Z
+Suspend
+.Nm ""  .
+.It Ic w
+Create a new window.  The user is prompted for the positions
+of the upper left and lower right corners of the window.
+The cursor is placed on the screen and the keys ``h'', ``j'',
+``k'', and ``l''
+move the cursor left, down, up, and right, respectively.
+The keys ``H'', ``J'', ``K'', and ``L'' move the cursor to the respective
+limits of the screen.  Typing a number before the movement keys
+repeats the movement that number of times.  Return enters the cursor position
+as the upper left corner of the window.  The lower right corner
+is entered in the same manner.  During this process,
+the placement of the new window is indicated by a rectangular
+box drawn on the screen, corresponding to where the new window
+will be framed.  Typing escape at any point
+cancels this command.
+.Pp
+This window becomes the current window,
+and is given the first available ID.  The default buffer size
+is used (see
+.Ar default_nline
+command below).
+.Pp
+Only fully visible windows can be created this way.
+.It Ic c Ns Ar # 
+Close window
+.Ar # .
+The process in the window is sent
+the hangup signal (see
+.Xr kill 1 ) .
+.Xr Csh 1
+should
+handle this signal correctly and cause no problems.
+.It Ic m Ns Ar # 
+Move window
+.Ar #
+to another location.  A box in the shape
+of the window is drawn on
+the screen to indicate the new position of the window, and the same keys as
+those for the
+.Ic w
+command are used to position the box.  The
+window can be moved partially off-screen.
+.It Ic M Ns Ar # 
+Move window
+.Ar #
+to its previous position.
+.It Ic s Ns Ar # 
+Change the size of window
+.Ar # .
+The user is prompted
+to enter the new lower right corner of the window.  A box
+is drawn to indicate the new window size.  The same
+keys used in
+.Ic w
+and
+.Ic m
+are used to enter the position.
+.It Ic S Ns Ar # 
+Change window
+.Ar #
+to its previous size.
+.It Ic ^Y
+Scroll the current window up by one line.
+.It Ic ^E
+Scroll the current window down by one line.
+.It Ic ^U
+Scroll the current window up by half the window size.
+.It Ic ^D
+Scroll the current window down by half the window size.
+.It Ic ^B
+Scroll the current window up by the full window size.
+.It Ic ^F
+Scroll the current window down by the full window size.
+.It Ic h
+Move the cursor of the current window left by one column.
+.It Ic j
+Move the cursor of the current window down by one line.
+.It Ic k
+Move the cursor of the current window up by one line.
+.It Ic l
+Move the cursor of the current window right by one column.
+.It Ic y
+Yank.  The user is prompted to enter two points within the current
+window.  Then the content of the current window between those two points
+is saved in the yank buffer.
+.It Ic p
+Put.  The content of the yank buffer is written to the current
+window as input.
+.It Ic ^S
+Stop output in the current window.
+.It Ic ^Q
+Start output in the current window.
+.It Ic :
+Enter a line to be executed as long commands.
+Normal line
+editing characters (erase character, erase word, erase line)
+are supported.
+.El
+.Ss Long Commands
+Long commands are a sequence of statements
+parsed much like a programming language, with a syntax
+similar to that of C.  Numeric and string expressions and variables
+are supported, as well as conditional statements.
+.Pp
+There are two data types: string and number.  A string is a sequence
+of letters or digits beginning with a letter.  ``_'' and ``.'' are
+considered letters.  Alternatively, non-alphanumeric characters can
+be included in strings by quoting them in ``"'' or escaping them
+with ``\\''.  In addition, the ``\\'' sequences of C are supported,
+both inside and outside quotes (e.g., ``\\n'' is a new line,
+``\\r'' a carriage return).  For example, these are legal strings:
+abcde01234, "&#$^*&#", ab"$#"cd, ab\\$\\#cd, "/usr/ucb/window".
+.Pp
+A number is an integer value in one of three forms:
+a decimal number, an octal number preceded by ``0'',
+or a hexadecimal number preceded by ``0x'' or ``0X''.  The natural
+machine integer size is used (i.e., the signed integer type
+of the C compiler).  As in C, a non-zero number represents
+a boolean true.
+.Pp
+The character ``#'' begins a comment which terminates at the
+end of the line.
+.Pp
+A statement is either a conditional or an expression.  Expression
+statements are terminated with a new line or ``;''.  To continue
+an expression on the next line, terminate the first line with ``\\''.
+.Ss Conditional Statement
+.Nm
+has a single control structure:
+the fully bracketed if statement in the form
+.Pp
+.Bd -literal -offset indent -compact
+if <expr> then
+\t<statement>
+\t...
+elsif <expr> then
+\t<statement>
+\t...
+else
+\t<statement>
+\t...
+endif
+.Ed
+.Pp
+The
+.Ic else
+and
+.Ic elsif
+parts are optional, and the latter can
+be repeated any number of times.
+<Expr>
+must be numeric.
+.Ss Expressions
+Expressions in
+.Nm
+are similar to those in the
+C language, with most C operators supported on numeric
+operands.  In addition, some are overloaded to operate on strings.
+.Pp
+When an expression is used as a statement, its value is discarded
+after evaluation.  Therefore, only expressions with side
+effects (assignments and function calls) are useful as statements.
+.Pp
+Single valued (no arrays) variables are supported, of both
+numeric and string values.  Some variables are predefined.  They
+are listed below.
+.Pp
+The operators in order of increasing precedence:
+.Bl -tag -width Fl
+.It Xo
+.Aq Va expr1
+.Ic =
+.Aq Va expr2
+.Xc
+Assignment.  The variable of name
+.Aq Va expr1 , 
+which must be string valued,
+is assigned the result of
+.Aq Va expr2 . 
+Returns the value of
+.Aq Va expr2 . 
+.It Xo
+.Aq Va expr1
+.Ic ?
+.Aq Va expr2
+.Ic :
+.Aq Va expr3
+.Xc
+Returns the value of
+.Aq Va expr2 
+if
+.Aq Va expr1 
+evaluates true
+(non-zero numeric value); returns the value of
+.Aq Va expr3 
+otherwise.  Only
+one of
+.Aq Va expr2 
+and
+.Aq Va expr3 
+is evaluated.
+.Aq Va Expr1 
+must
+be numeric.
+.It Xo
+.Aq Va expr1
+.Ic \&|\&|
+.Aq Va expr2
+.Xc
+Logical or.  Numeric values only.  Short circuit evaluation is supported
+(i.e., if
+.Aq Va expr1 
+evaluates true, then
+.Aq Va expr2 
+is not evaluated).
+.It Xo
+.Aq Va expr1
+.Ic \&&\&&
+.Aq Va expr2
+.Xc
+Logical and with short circuit evaluation.  Numeric values only.
+.It Xo
+.Aq Va expr1
+.Ic \&|
+.Aq Va expr2
+.Xc
+Bitwise or.  Numeric values only.
+.It Xo
+.Aq Va expr1
+.Ic ^
+.Aq Va expr2
+.Xc
+Bitwise exclusive or.  Numeric values only.
+.It Xo
+.Aq Va expr1
+.Ic \&&
+.Aq Va expr2
+.Xc
+Bitwise and.  Numeric values only.
+.It Xo
+.Aq Va expr1
+.Ic ==
+.Aq Va expr2 ,
+.Aq Va expr1
+.Ic !=
+.Aq expr2
+.Xc
+Comparison (equal and not equal, respectively).  The boolean
+result (either 1 or 0) of the comparison is returned.  The
+operands can be numeric or string valued.  One string operand
+forces the other to be converted to a string in necessary.
+.It Xo
+.Aq Va expr1
+.Ic <
+.Aq Va expr2 ,
+.Aq Va expr1
+.Ic >
+.Aq Va expr2 ,
+.Aq Va expr1
+.Ic <=
+.Aq Va expr2 ,
+.Xc
+Less than, greater than, less than or equal to,
+greater than or equal to.  Both numeric and string values, with
+automatic conversion as above.
+.It Xo
+.Aq Va expr1
+.Ic <<
+.Aq Va expr2 ,
+.Aq Va expr1
+.Ic >>
+.Aq Va expr2
+.Xc
+If both operands are numbers,
+.Aq Va expr1
+is bit
+shifted left (or right) by
+.Aq Va expr2
+bits.  If
+.Aq Va expr1
+is
+a string, then its first (or last)
+.Aq Va expr2
+characters are
+returns (if
+.Aq Va expr2
+is also a string, then its length is used
+in place of its value).
+.It Xo
+.Aq Va expr1
+.Ic +
+.Aq Va expr2 ,
+.Aq Va expr1
+.Ic -
+.Aq Va expr2
+.Xc
+Addition and subtraction on numbers.  For ``+'', if one
+argument is a string, then the other is converted to a string,
+and the result is the concatenation of the two strings.
+.It Xo
+.Aq Va expr1
+.Ic \&*
+.Aq Va expr2 ,
+.Aq Va expr1
+.Ic \&/
+.Aq Va expr2 ,
+.Aq Va expr1
+.Ic \&%
+.Aq Va expr2
+.Xc
+Multiplication, division, modulo.  Numbers only.
+.It Xo
+.Ic \- Ns Aq Va expr ,
+.Ic ~ Ns Aq Va expr ,
+.Ic \&! Ns Aq Va expr ,
+.Ic \&$ Ns Aq Va expr ,
+.Ic \&$? Ns Aq Va expr
+.Xc
+The first three are unary minus, bitwise complement and logical complement
+on numbers only.  The operator, ``$'', takes
+.Aq Va expr
+and returns
+the value of the variable of that name.  If
+.Aq Va expr
+is numeric
+with value
+.Ar n
+and it appears within an alias macro (see below),
+then it refers to the nth argument of the alias invocation.  ``$?''
+tests for the existence of the variable
+.Aq Va expr ,
+and returns 1
+if it exists or 0 otherwise.
+.It Xo
+.Ao Va expr Ac Ns Pq Aq Ar arglist
+.Xc
+Function call.
+.Aq Va Expr
+must be a string that is the unique
+prefix of the name of a builtin
+.Nm
+function
+or the full name of a user defined alias macro.  In the case of a builtin
+function,
+.Aq Ar arglist
+can be in one of two forms:
+.Bd -literal -offset indent
+<expr1>, <expr2>, ...
+argname1 = <expr1>, argname2 = <expr2>, ...
+.Ed
+.Pp
+The two forms can in fact be intermixed, but the result is
+unpredictable.  Most arguments can be omitted; default values will
+be supplied for them.  The
+.Ar argnames
+can be unique prefixes
+of the argument names.  The commas separating
+arguments are used only to disambiguate, and can usually be omitted.
+.Pp
+Only the first argument form is valid for user defined aliases.  Aliases
+are defined using the
+.Ic alias
+builtin function (see below).  Arguments
+are accessed via a variant of the variable mechanism (see ``$'' operator
+above).
+.Pp
+Most functions return value, but some are used for side effect
+only and so must be used as statements.  When a function or an alias is used
+as a statement, the parentheses surrounding
+the argument list may be omitted.  Aliases return no value.
+.El
+.Ss  Builtin Functions
+The arguments are listed by name in their natural
+order.  Optional arguments are in square brackets
+.Sq Op .
+Arguments
+that have no names are in angle brackets
+.Sq <> .
+An argument meant to be a boolean flag (often named
+.Ar flag )
+can be one of
+.Ar on ,
+.Ar off ,
+.Ar yes ,
+.Ar no ,
+.Ar true ,
+or
+.Ar false ,
+with
+obvious meanings, or it can be a numeric expression,
+in which case a non-zero value is true.
+.Bl -tag -width Fl
+.It Xo
+.Ic alias Ns Po Bq Aq Ar string ,
+.Bq Aq Ar string\-list Pc
+.Xc
+If no argument is given, all currently defined alias macros are
+listed.  Otherwise,
+.Aq Ar string
+is defined as an alias,
+with expansion
+.Aq Ar string\-list > . 
+The previous definition of
+.Aq Ar string ,
+if any, is returned.  Default for
+.Aq Ar string\-list
+is no change.
+.It Ic close Ns Pq Aq Ar window\-list
+Close the windows specified in
+.Aq Ar window\-list .
+If
+.Aq Ar window\-list
+is the word
+.Ar all  ,
+than all windows are closed.  No value is returned.
+.It Ic cursormodes Ns Pq Bq Ar modes
+Set the window cursor to
+.Ar modes  .
+.Ar Modes
+is the bitwise
+or of the mode bits defined as the variables
+.Ar m_ul
+(underline),
+.Ar m_rev
+(reverse video),
+.Ar m_blk
+(blinking),
+and
+.Ar m_grp
+(graphics, terminal dependent).  Return
+value is the previous modes.  Default is no change.
+For example,
+.Li cursor($m_rev$m_blk)
+sets the window cursors to blinking
+reverse video.
+.It Ic default_nline Ns Pq Bq Ar nline
+Set the default buffer size to
+.Ar nline  .
+Initially, it is
+48 lines.  Returns the old default buffer size.  Default is
+no change.  Using a very large buffer can slow the program down
+considerably.
+.It Ic default_shell Ns Pq Bq Aq Ar string\-list
+Set the default window shell program to
+.Aq Ar string\-list .
+Returns
+the first string in the old shell setting.  Default is no change.  Initially,
+the default shell is taken from the environment variable
+.Ev SHELL  .
+.It Ic default_smooth Ns Pq Bq Ar flag
+Set the default value of the
+.Ar smooth
+argument
+to the command
+.Nm
+(see below).  The argument
+is a boolean flag (one of
+.Ar on  ,
+.Ar off  ,
+.Ar yes  ,
+.Ar no  ,
+.Ar true  ,
+.Ar false  ,
+or a number,
+as described above).  Default is no change.
+The old value (as a number) is returned.
+The initial value is 1 (true).
+.It Xo
+.Ic echo Ns ( Op Ar window ,
+.Bq Aq Ar string\-list )
+.Xc
+Write the list of strings,
+.Aq Ar string-list ,
+to
+.Nm ""  ,
+separated
+by spaces and terminated with a new line.  The strings are only
+displayed in the window, the processes in the window are not
+involved (see
+.Ic write
+below).  No value is returned.  Default
+is the current window.
+.It Ic escape Ns Pq Bq Ar escapec
+Set the escape character to
+.Ar escape-char  .
+Returns the old
+escape character as a one-character string.  Default is no
+change.
+.Ar Escapec
+can be a string of a single character, or
+in the form
+.Fl ^X ,
+meaning
+.No control\- Ns Ar X .
+.It Xo
+.Ic foreground Ns ( Bq Ar window ,
+.Bq Ar flag ) 
+.Xc
+Move
+.Nm
+in or out of foreground.
+.Ar Flag
+is a boolean value.  The old foreground flag
+is returned.  Default for
+.Nm
+is the current window,
+default for
+.Ar flag
+is no change.
+.It Xo
+.Ic label Ns ( Bq Ar window ,
+.Bq Ar label ) 
+.Xc
+Set the label of
+.Nm
+to
+.Ar label  .
+Returns the old
+label as a string.  Default for
+.Nm
+is the current
+window, default for
+.Ar label
+is no change.  To turn
+off a label, set it to an empty string ("").
+.It Ic list Ns Pq
+No arguments.  List the identifiers and labels of all windows.  No
+value is returned.
+.It Ic select Ns Pq Bq Ar window
+Make
+.Nm
+the current window.  The previous current window
+is returned.  Default is no change.
+.It Ic source Ns Pq Ar filename
+Read and execute the long commands in
+.Ar filename  .
+Returns \-1 if the file cannot be read, 0 otherwise.
+.It Ic terse Ns Pq Bq flag
+Set terse mode to
+.Ar flag  .
+In terse mode, the command window
+stays hidden even in command mode, and errors are reported by
+sounding the terminal's bell.
+.Ar Flag
+can take on the same
+values as in
+.Ar foreground
+above.  Returns the old terse flag.
+Default is no change.
+.It Ic unalias Ns Pq Ar alias
+Undefine
+.Ar alias  .
+Returns -1 if
+.Ar alias
+does not exist,
+0 otherwise.
+.It Ic unset Ns Pq Ar variable
+Undefine
+.Ar variable  .
+Returns -1 if
+.Ar variable
+does not exist,
+0 otherwise.
+.It Ic variables Ns Pq
+No arguments.  List all variables.  No value is returned.
+.It Xo
+.Ic window Ns ( Bq Ar row ,
+.Bq Ar column ,
+.Bq Ar nrow ,
+.Bq Ar ncol ,
+.Bq Ar nline ,
+.Bq Ar label ,
+.Bq Ar pty , 
+.Bq Ar frame ,
+.Bq Ar mapnl ,
+.Bq Ar keepopen ,
+.Bq Ar smooth ,
+.Bq Ar shell ) . 
+.Xc
+Open a window with upper left corner at
+.Ar row  ,
+.Ar column
+and size
+.Ar nrow  ,
+.Ar ncol  .
+If
+.Ar nline
+is specified,
+then that many lines are allocated for the text buffer.  Otherwise,
+the default buffer size is used.  Default values for
+.Ar row  ,
+.Ar column  ,
+.Ar nrow  ,
+and
+.Ar ncol
+are, respectively,
+the upper, left-most, lower, or right-most extremes of the
+screen.
+.Ar Label
+is the label string.
+.Ar Frame  ,
+.Ar pty  ,
+and
+.Ar mapnl
+are flag values
+interpreted in the same way as the argument to
+.Ar foreground
+(see above);
+they mean, respectively, put a frame around this window (default true),
+allocate pseudo-terminal for this window rather than socketpair (default
+true), and map new line characters in this window to carriage return
+and line feed (default true if socketpair is used, false otherwise).
+Normally, a window is automatically closed when its process
+exits.  Setting
+.Ar keepopen
+to true (default false) prevents this
+action.  When
+.Ar smooth
+is true, the screen is updated more frequently
+(for this window) to produce a more terminal-like behavior.
+The default value of
+.Ar smooth
+is set by the
+.Ar default_smooth
+command (see above).
+.Ar Shell
+is a list of strings that will be used as the shell
+program to place in the window (default is the program specified
+by
+.Ar default_shell  ,
+see above).  The created window's identifier
+is returned as a number.
+.It Xo
+.Ic write Ns ( Bq Ar window ,
+.Bq Aq Ar string\-list )
+.Xc
+Send the list of strings,
+.Aq Ar string-list ,
+to
+.Nm "" ,
+separated
+by spaces but not terminated with a new line.  The strings are actually
+given to the window as input.  No value is returned.  Default
+is the current window.
+.El
+.Ss Predefined Variables
+These variables are for information only.  Redefining them does
+not affect the internal operation of
+.Nm "" .
+.Bl -tag -width modes
+.It Ar baud
+The baud rate as a number between 50 and 38400.
+.It Ar modes
+The display modes (reverse video, underline, blinking, graphics)
+supported by the physical terminal.  The value of
+.Ar modes
+is the bitwise or of some of the one bit values,
+.Ar m_blk ,
+.Ar m_grp ,
+.Ar m_rev ,
+and
+.Ar m_ul
+(see below).
+These values are useful
+in setting the window cursors' modes (see
+.Ar cursormodes
+above).
+.It Ar m_blk
+The blinking mode bit.
+.It Ar m_grp
+The graphics mode bit (not very useful).
+.It Ar m_rev
+The reverse video mode bit.
+.It Ar m_ul
+The underline mode bit.
+.It Ar ncol
+The number of columns on the physical screen.
+.It Ar nrow
+The number of rows on the physical screen.
+.It Ar term
+The terminal type.  The standard name, found in the second name
+field of the terminal's
+.Ev TERMCAP
+entry, is used.
+.Sh ENVIRONMENT
+.Nm
+utilizes these environment variables:
+.Ev HOME ,
+.Ev SHELL ,
+.Ev TERM ,
+.Ev TERMCAP ,
+.Ev WINDOW_ID .
+.Sh FILES
+.Bl -tag -width /dev/[pt]ty[pq]? -compact
+.It Pa ~/.windowrc
+startup command file.
+.It Pa /dev/[pt]ty[pq]? 
+pseudo-terminal devices.
+.El
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 4.3 .
+.Sh DIAGNOSTICS
+Should be self explanatory.
diff --git a/window/window_string.h b/window/window_string.h
new file mode 100644 (file)
index 0000000..4432ad7
--- /dev/null
@@ -0,0 +1,79 @@
+/*     $NetBSD: string.h,v 1.4 1997/11/21 08:36:22 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)string.h    8.1 (Berkeley) 6/6/93
+ */
+
+#ifndef _W_STRING_H_
+#define _W_STRING_H_
+
+#include <stddef.h>
+
+#ifndef EXTERN
+#define EXTERN extern
+#endif
+
+#define STR_DEBUG
+
+char   *str_cat __P((char *, char *));
+char   *str_cpy __P((char *));
+char   *str_itoa __P((int));
+int     str_match __P((char *, char *, int));
+char   *str_ncpy __P((char *, int));
+
+#define str_cmp(a, b)  strcmp(a, b)
+
+#ifdef STR_DEBUG
+struct string {
+       struct string *s_forw;
+       struct string *s_back;
+       char s_data[1];
+};
+
+EXTERN struct string str_head;
+
+#define str_offset ((unsigned)str_head.s_data - (unsigned)&str_head)
+#define str_stos(s) ((struct string *)((unsigned)(s) - str_offset))
+
+char   *str_alloc __P((size_t));
+void   str_free __P((char *));
+#else
+#define str_free(s)    free(s)
+#define str_alloc(s)   malloc(s)
+#endif
+
+#endif /* _W_STRING_H_ */
diff --git a/window/windowrc b/window/windowrc
new file mode 100644 (file)
index 0000000..57c695a
--- /dev/null
@@ -0,0 +1,85 @@
+# Copyright (c) 1983, 1993
+#      The Regents of the University of California.  All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#      This product includes software developed by the University of
+#      California, Berkeley and its contributors.
+# 4. Neither the name of the University nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#      @(#)windowrc    8.1 (Berkeley) 6/6/93
+#
+
+# Configuration file example for window manager
+# To be installed in ~/.windowrc
+#
+# Create two unequal sized windows of full screen width,
+# and set up some useful aliases.
+#
+
+#
+# Optional settings
+#
+# terse on                     # set terse mode
+# escape "^A"                  # set escape character
+# nline 100                    # set default buffer size
+                               # initially, this is 48
+
+#
+# Make two windows
+# The bottom one is MIN(24, total lines * 3 / 4) lines
+# The top one is the rest of the screen.
+#
+three_fourth = $nrow - ((_ = $nrow * 3 / 4) > 24 ? 24 : $_)
+unset _
+window row = 0, nrow = $three_fourth - 1, label = "Top"
+window row = $three_fourth, label = "Local"
+
+#
+# Useful aliases
+#
+#
+# Standard window
+#
+alias std "window r = $three_fourth, l = $?1 ? $1 : ''"
+#
+# Sysline, add your own options
+#
+alias sysline "_ = select();" \
+       "foreground window(r = 0, nr = 1, nc = $ncol + 1, nl = 0," \
+               "l = sysline, pty = no, frame = no, sh = sysline \\-w), 1;" \
+       "select $_; unset _"
+#
+# Rlogin
+#
+alias rlogin "window r = $three_fourth, l = $1, pty = no, mapnl = no," \
+       "sh = sh \\-c 'echo $TERMCAP | rsh ' + $1 + ' \\'cat > .TERMCAP\\' ;" \
+       "exec rlogin ' + $1"
+alias rl rlogin \$1
+#
+# Two equal windows
+#
+alias two "window r = 1, nr = $nrow / 2 - 1, l = top;" \
+       "window r = $nrow / 2 + 1, l = bottom"
diff --git a/window/ww.h b/window/ww.h
new file mode 100644 (file)
index 0000000..9f4799f
--- /dev/null
@@ -0,0 +1,399 @@
+/*     $NetBSD: ww.h,v 1.12 1998/07/26 15:28:20 mycroft Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)ww.h        8.1 (Berkeley) 6/6/93
+ */
+
+#ifndef __WW_H__
+#define __WW_H__
+
+#include <sys/types.h>
+#ifdef OLD_TTY
+#include <sgtty.h>
+#else
+#include <termios.h>
+#endif
+#include <setjmp.h>
+
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include <stdio.h>
+
+#ifndef EXTERN
+#define EXTERN extern
+#endif
+
+#define NWW    30              /* maximum number of windows */
+
+/* Macros to clear/set/test flags. */
+#define        SET(t, f)       (t) |= (f)
+#define        CLR(t, f)       (t) &= ~(f)
+#define        ISSET(t, f)     ((t) & (f))
+
+       /* a rectangle */
+struct ww_dim {
+       int nr;                 /* number of rows */
+       int nc;                 /* number of columns */
+       int t, b;               /* top, bottom */
+       int l, r;               /* left, right */
+};
+
+       /* a coordinate */
+struct ww_pos {
+       int r;                  /* row */
+       int c;                  /* column */
+};
+
+       /* the window structure */
+struct ww {
+       int ww_flags;
+
+               /* general flags and states */
+       int ww_state;           /* state of window */
+#define WWS_INITIAL    0       /* just opened */
+#define WWS_HASPROC    1       /* has process on pty */
+#define WWS_DEAD       3       /* child died */
+#define        ww_oflags       ww_flags
+#define WWO_REVERSE    0x0001  /* make it all reverse video */
+#define WWO_GLASS      0x0002  /* make it all glass */
+#define WWO_FRAME      0x0004  /* this is a frame window */
+#define        WWO_ALLFLAGS    0x0007
+
+               /* information for overlap */
+       struct ww *ww_forw;     /* doubly linked list, for overlapping info */
+       struct ww *ww_back;
+       unsigned char ww_index; /* the window index, for wwindex[] */
+#define WWX_NOBODY     NWW
+       int ww_order;           /* the overlapping order */
+
+               /* sizes and positions */
+       struct ww_dim ww_w;     /* window size and pos */
+       struct ww_dim ww_b;     /* buffer size and pos */
+       struct ww_dim ww_i;     /* the part inside the screen */
+       struct ww_pos ww_cur;   /* the cursor position, relative to ww_w */
+
+               /* arrays */
+       char **ww_win;          /* the window */
+       union ww_char **ww_buf; /* the buffer */
+       char **ww_fmap;         /* map for frame and box windows */
+       short *ww_nvis;         /* how many ww_buf chars are visible per row */
+
+               /* information for wwwrite() and company */
+       int ww_wstate;          /* state for outputting characters */
+       char ww_modes;          /* current display modes */
+#define        ww_wflags       ww_flags
+#define        WWW_INSERT      0x0008  /* insert mode */
+#define        WWW_MAPNL       0x0010  /* map \n to \r\n */
+#define        WWW_NOUPDATE    0x0020  /* don't do updates in wwwrite() */
+#define        WWW_UNCTRL      0x0040  /* expand control characters */
+#define        WWW_NOINTR      0x0080  /* wwwrite() not interruptable */
+#define        WWW_HASCURSOR   0x0100  /* has fake cursor */
+
+               /* things for the window process and io */
+       int ww_type;
+#define        WWT_PTY         0       /* pty */
+#define        WWT_SOCKET      1       /* socket pair */
+#define        WWT_INTERNAL    2
+#define        ww_pflags       ww_flags
+#define        WWP_STOPPED     0x0200  /* output stopped */
+       int ww_pty;             /* file descriptor of pty or socket pair */
+       int ww_socket;          /* other end of socket pair */
+       int ww_pid;             /* pid of process, if WWS_HASPROC true */
+       char ww_ttyname[11];    /* "/dev/ttyp?" */
+       char *ww_ob;            /* output buffer */
+       char *ww_obe;           /* end of ww_ob */
+       char *ww_obp;           /* current read position in ww_ob */
+       char *ww_obq;           /* current write position in ww_ob */
+
+               /* things for the user, they really don't belong here */
+       int ww_id;              /* the user window id */
+#define        ww_uflags       ww_flags
+#define        WWU_CENTER      0x0400  /* center the label */
+#define        WWU_HASFRAME    0x0800  /* frame it */
+#define        WWU_KEEPOPEN    0x1000  /* keep it open after the process dies */
+#define        WWU_ALLFLAGS    0x1c00
+       char *ww_label;         /* the user supplied label */
+       struct ww_dim ww_alt;   /* alternate position and size */
+};
+
+       /* state of a tty */
+struct ww_tty {
+#ifdef OLD_TTY
+       struct sgttyb ww_sgttyb;
+       struct tchars ww_tchars;
+       struct ltchars ww_ltchars;
+       int ww_lmode;
+       int ww_ldisc;
+#else
+       struct termios ww_termios;
+#endif
+};
+
+union ww_char {
+       short c_w;              /* as a word */
+       struct {
+#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
+               char C_c;       /* the character part */
+               char C_m;       /* the mode part */
+#endif
+#if BYTE_ORDER == BIG_ENDIAN
+               char C_m;       /* the mode part */
+               char C_c;       /* the character part */
+#endif
+       } c_un;
+};
+#define c_c c_un.C_c
+#define c_m c_un.C_m
+
+       /* for display update */
+struct ww_update {
+       int best_gain;
+       int best_col;
+       int gain;
+};
+
+       /* parts of ww_char */
+#define WWC_CMASK      0x00ff
+#define WWC_MMASK      0xff00
+#define WWC_MSHIFT     8
+
+       /* c_m bits */
+#define WWM_REV                0x01    /* reverse video */
+#define WWM_BLK                0x02    /* blinking */
+#define WWM_UL         0x04    /* underlined */
+#define WWM_GRP                0x08    /* graphics */
+#define WWM_DIM                0x10    /* half intensity */
+#define WWM_USR                0x20    /* user specified mode */
+#define WWM_GLS                0x40    /* window only, glass, i.e., transparent */
+
+       /* flags for ww_fmap */
+#define WWF_U          0x01
+#define WWF_R          0x02
+#define WWF_D          0x04
+#define WWF_L          0x08
+#define WWF_MASK       (WWF_U|WWF_R|WWF_D|WWF_L)
+#define WWF_LABEL      0x40
+#define WWF_TOP                0x80
+
+       /* error codes */
+#define WWE_NOERR      0
+#define WWE_SYS                1               /* system error */
+#define WWE_NOMEM      2               /* out of memory */
+#define WWE_TOOMANY    3               /* too many windows */
+#define WWE_NOPTY      4               /* no more ptys */
+#define WWE_SIZE       5               /* bad window size */
+#define WWE_BADTERM    6               /* bad terminal type */
+#define WWE_CANTDO     7               /* dumb terminal */
+
+       /* wwtouched[] bits, there used to be more than one */
+#define WWU_TOUCHED    0x01            /* touched */
+
+       /* the window structures */
+EXTERN struct ww wwhead;
+EXTERN struct ww *wwindex[NWW + 1];    /* last location is for wwnobody */
+EXTERN struct ww wwnobody;
+
+       /* tty things */
+EXTERN struct ww_tty wwoldtty;         /* the old (saved) terminal settings */
+EXTERN struct ww_tty wwnewtty;         /* the new (current) terminal settings */
+EXTERN struct ww_tty wwwintty;         /* the terminal settings for windows */
+EXTERN char *wwterm;                   /* the terminal name */
+EXTERN char wwtermcap[1024];           /* place for the termcap */
+
+       /* generally useful variables */
+EXTERN int wwnrow, wwncol;             /* the screen size */
+EXTERN char wwavailmodes;              /* actually supported modes */
+EXTERN char wwcursormodes;             /* the modes for the fake cursor */
+EXTERN char wwwrap;                    /* terminal has auto wrap around */
+EXTERN int wwdtablesize;               /* result of getdtablesize() call */
+EXTERN unsigned char **wwsmap;         /* the screen map */
+EXTERN union ww_char **wwos;           /* the old (current) screen */
+EXTERN union ww_char **wwns;           /* the new (desired) screen */
+EXTERN union ww_char **wwcs;           /* the checkpointed screen */
+EXTERN char *wwtouched;                        /* wwns changed flags */
+EXTERN struct ww_update *wwupd;                /* for display update */
+EXTERN int wwospeed;                   /* output baud rate, copied from wwoldtty */
+EXTERN int wwbaud;                     /* wwospeed converted into actual number */
+EXTERN int wwcursorrow, wwcursorcol;   /* where we want the cursor to be */
+EXTERN int wwerrno;                    /* error number */
+
+       /* statistics */
+EXTERN int wwnflush, wwnwr, wwnwre, wwnwrz, wwnwrc;
+EXTERN int wwnwwr, wwnwwra, wwnwwrc;
+EXTERN int wwntokdef, wwntokuse, wwntokbad, wwntoksave, wwntokc;
+EXTERN int wwnupdate, wwnupdline, wwnupdmiss;
+EXTERN int wwnupdscan, wwnupdclreol, wwnupdclreos, wwnupdclreosmiss, wwnupdclreosline;
+EXTERN int wwnread, wwnreade, wwnreadz;
+EXTERN int wwnreadc, wwnreadack, wwnreadnack, wwnreadstat, wwnreadec;
+EXTERN int wwnwread, wwnwreade, wwnwreadz, wwnwreadd, wwnwreadc, wwnwreadp;
+EXTERN int wwnselect, wwnselecte, wwnselectz;
+
+       /* quicky macros */
+#define wwsetcursor(r,c) (wwcursorrow = (r), wwcursorcol = (c))
+#define wwcurtowin(w)  wwsetcursor((w)->ww_cur.r, (w)->ww_cur.c)
+#define wwunbox(w)     wwunframe(w)
+#define wwclreol(w,r,c)        wwclreol1((w), (r), (c), 0)
+#define wwredrawwin(w) wwredrawwin1((w), (w)->ww_i.t, (w)->ww_i.b, 0)
+#define wwupdate()     wwupdate1(0, wwnrow);
+
+       /* things for handling input */
+EXTERN struct ww *wwcurwin;    /* window to copy input into */
+EXTERN char *wwib;             /* input (keyboard) buffer */
+EXTERN char *wwibe;            /* wwib + sizeof buffer */
+EXTERN char *wwibp;            /* current read position in buffer */
+EXTERN char *wwibq;            /* current write position in buffer */
+#define wwmaskc(c)     ((c) & 0x7f)
+#define wwgetc()       (wwibp < wwibq ? wwmaskc(*wwibp++) : -1)
+#define wwpeekc()      (wwibp < wwibq ? wwmaskc(*wwibp) : -1)
+#define wwungetc(c)    (wwibp > wwib ? *--wwibp = (c) : -1)
+
+       /* things for short circuiting wwiomux() */
+EXTERN char wwintr;            /* interrupting */
+EXTERN char wwsetjmp;          /* want a longjmp() from wwrint() and wwchild() */
+EXTERN jmp_buf wwjmpbuf;       /* jmpbuf for above */
+#define wwinterrupt()  wwintr
+#define wwsetintr()    do { wwintr = 1; if (wwsetjmp) longjmp(wwjmpbuf, 1); } \
+                       while (0)
+#define wwclrintr()    (wwintr = 0)
+
+       /* checkpointing */
+EXTERN int wwdocheckpoint;
+
+       /* the window virtual terminal */
+#define WWT_TERM       "window-v2"
+#define WWT_TERMCAP    "WW|window-v2|window program version 2:\
+       :am:bs:da:db:ms:pt:cr=^M:nl=^J:bl=^G:ta=^I:\
+       :cm=\\EY%+ %+ :le=^H:nd=\\EC:up=\\EA:do=\\EB:ho=\\EH:\
+       :cd=\\EJ:ce=\\EK:cl=\\EE:me=\\Er^?:"
+#define WWT_REV                "se=\\ErA:so=\\EsA:mr=\\EsA:"
+#define WWT_BLK                "BE=\\ErB:BS=\\EsB:mb=\\EsB:"
+#define WWT_UL         "ue=\\ErD:us=\\EsD:"
+#define WWT_GRP                "ae=\\ErH:as=\\EsH:"
+#define WWT_DIM                "HE=\\ErP:HS=\\EsP:mh=\\EsP:"
+#define WWT_USR                "XE=\\Er`:XS=\\Es`:"
+#define WWT_ALDL       "al=\\EL:dl=\\EM:"
+#define WWT_IMEI       "im=\\E@:ei=\\EO:ic=:mi:" /* XXX, ic for emacs bug */
+#define WWT_IC         "ic=\\EP:"
+#define WWT_DC         "dc=\\EN:"
+EXTERN char wwwintermcap[1024];        /* terminal-specific but window-independent
+                                  part of the window termcap */
+#ifdef TERMINFO
+       /* where to put the temporary terminfo directory */
+EXTERN char wwterminfopath[1024];
+#endif
+
+struct ww *wwopen __P((int, int, int, int, int, int, int));
+void   wwadd __P((struct ww *, struct ww *));
+void   wwaddcap __P((char *, char **));
+void   wwaddcap1 __P((char *, char **));
+void   wwalarm __P((int));
+char  **wwalloc __P((int, int, int, int, int));
+void   wwbell __P((void));
+void   wwbox __P((struct ww *, int, int, int, int));
+void   wwcheckpoint __P((void));
+void   wwchild __P((int));
+void   wwclose __P((struct ww *));
+void   wwclreol1 __P((struct ww *, int, int, char));
+void   wwclreos __P((struct ww *, int, int));
+void   wwcopyscreen __P((union ww_char **s1, union ww_char **s2));
+void   wwcursor __P((struct ww *, int));
+void   wwdelchar __P((struct ww *, int, int));
+void   wwdelete __P((struct ww *));
+void   wwdelete1 __P((struct ww *, int, int, int, int));
+void   wwdelline __P((struct ww *, int));
+void   wwdumpns __P((void));
+void   wwdumpnvis __P((struct ww *));
+void   wwdumpos __P((void));
+void   wwdumpsmap __P((void));
+void   wwdumpwin __P((struct ww *));
+void   wwend __P((int));
+int    wwenviron __P((struct ww *));
+const char *
+       wwerror __P((void));
+void   wwflush __P((void));
+void   wwframe __P((struct ww *, struct ww *));
+void   wwframec __P((struct ww *, int, int, char));
+void   wwfree __P((char **, int));
+int    wwgetpty __P((struct ww *));
+int    wwgettty __P((int, struct ww_tty *));
+int    wwgetttysize __P((int, int *, int *));
+void   wwgets __P((char *, int, struct ww *));
+int    wwinit __P((void));
+void   wwinschar __P((struct ww *, int, int, char, char));
+void   wwinsline __P((struct ww *, int));
+void   wwiomux __P((void));
+void   wwlabel __P((struct ww *, struct ww *, int, char *, int));
+void   wwmove __P((struct ww *, int, int));
+void   wwprintf __P((struct ww *, const char *, ...));
+void   wwputc __P((char, struct ww *));
+void   wwputs __P((char *, struct ww *));
+void   wwredraw __P((void));
+void   wwredrawwin1 __P((struct ww *,int, int, int));
+void   wwquit __P((int));
+void   wwreset __P((void));
+void   wwrint __P((void));
+void   wwscroll __P((struct ww *, int));
+int    wwscroll1 __P((struct ww *, int, int, int, int));
+void   wwsetcursormodes __P((int));
+int    wwsettty __P((int, struct ww_tty *));
+int    wwsetttysize __P((int, int, int));
+int    wwsize __P((struct ww *, int, int));
+int    wwspawn __P((struct ww *, char *, char **));
+void   wwstart __P((void));
+void   wwstart1 __P((void));
+int    wwstarttty __P((int));
+int    wwstoptty __P((int));
+void   wwsuspend __P((void));
+void   wwunframe __P((struct ww *));
+void   wwupdate1 __P((int, int));
+int    wwvisible __P((struct ww *));
+void   wwvprintf __P((struct ww *, const char *, va_list));
+int    wwwrite __P((struct ww *, char *, int));
+#ifdef TERMINFO
+int    wwterminfoinit __P((void));
+int    wwterminfoend __P((void));
+#endif
+
+#undef MIN
+#undef MAX
+#define MIN(x, y)      ((x) > (y) ? (y) : (x))
+#define MAX(x, y)      ((x) > (y) ? (x) : (y))
+
+#endif __WW_H__
diff --git a/window/wwadd.c b/window/wwadd.c
new file mode 100644 (file)
index 0000000..a0311d1
--- /dev/null
@@ -0,0 +1,96 @@
+/*     $NetBSD: wwadd.c,v 1.5 1997/11/21 08:36:54 lukem Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwadd.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwadd.c,v 1.5 1997/11/21 08:36:54 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+/*
+ * Stick w1 behind w2.
+ */
+void
+wwadd(w1, w2)
+       struct ww *w1;
+       struct ww *w2;
+{
+       int i;
+       struct ww *w;
+
+       w1->ww_order = w2->ww_order + 1;
+       w1->ww_back = w2;
+       w1->ww_forw = w2->ww_forw;
+       w2->ww_forw->ww_back = w1;
+       w2->ww_forw = w1;
+
+       for (w = w1->ww_forw; w != &wwhead; w = w->ww_forw)
+               w->ww_order++;
+       for (i = w1->ww_i.t; i < w1->ww_i.b; i++) {
+               int j;
+               unsigned char *smap = wwsmap[i];
+               char *win = w1->ww_win[i];
+               union ww_char *ns = wwns[i];
+               union ww_char *buf = w1->ww_buf[i];
+               int nvis = 0;
+               int nchanged = 0;
+
+               for (j = w1->ww_i.l; j < w1->ww_i.r; j++) {
+                       w = wwindex[smap[j]];
+                       if (w1->ww_order > w->ww_order)
+                               continue;
+                       if (win[j] & WWM_GLS)
+                               continue;
+                       if (w != &wwnobody && w->ww_win[i][j] == 0)
+                               w->ww_nvis[i]--;
+                       smap[j] = w1->ww_index;
+                       if (win[j] == 0)
+                               nvis++;
+                       ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
+                       nchanged++;
+               }
+               if (nchanged > 0)
+                       wwtouched[i] |= WWU_TOUCHED;
+               w1->ww_nvis[i] = nvis;
+       }
+}
diff --git a/window/wwalloc.c b/window/wwalloc.c
new file mode 100644 (file)
index 0000000..fb7bac5
--- /dev/null
@@ -0,0 +1,82 @@
+/*     $NetBSD: wwalloc.c,v 1.4 1997/11/21 08:36:57 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwalloc.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwalloc.c,v 1.4 1997/11/21 08:36:57 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#include "ww.h"
+
+char **
+wwalloc(row, col, nrow, ncol, size)
+       int row, col, nrow, ncol, size;
+{
+       char *p, **pp;
+       int i;
+
+       /* fast, call malloc only once */
+       pp = (char **)
+               malloc((unsigned) sizeof (char **) * nrow + size * nrow * ncol);
+       if (pp == 0) {
+               wwerrno = WWE_NOMEM;
+               return 0;
+       }
+       p = (char *)&pp[nrow];
+       col *= size;
+       size /= sizeof (char);          /* paranoid */
+       size *= ncol;
+       for (i = 0; i < nrow; i++) {
+               pp[i] = p - col;
+               p += size;
+       }
+       return pp - row;
+}
+
+void
+wwfree(p, row)
+       char **p;
+       int row;
+{
+       free((char *)(p + row));
+}
diff --git a/window/wwbox.c b/window/wwbox.c
new file mode 100644 (file)
index 0000000..16c0dc5
--- /dev/null
@@ -0,0 +1,74 @@
+/*     $NetBSD: wwbox.c,v 1.4 1997/11/21 08:36:58 lukem Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwbox.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwbox.c,v 1.4 1997/11/21 08:36:58 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+
+void
+wwbox(w, r, c, nr, nc)
+       struct ww *w;
+       int r, c;
+       int nr, nc;
+{
+       int r1, c1;
+       int i;
+
+       r1 = r + nr - 1;
+       c1 = c + nc - 1;
+       wwframec(w, r, c, WWF_D|WWF_R);
+       for (i = c + 1; i < c1; i++)
+               wwframec(w, r, i, WWF_L|WWF_R);
+       wwframec(w, r, i, WWF_L|WWF_D);
+       for (i = r + 1; i < r1; i++)
+               wwframec(w, i, c1, WWF_U|WWF_D);
+       wwframec(w, i, c1, WWF_U|WWF_L);
+       for (i = c1 - 1; i > c; i--)
+               wwframec(w, r1, i, WWF_R|WWF_L);
+       wwframec(w, r1, i, WWF_R|WWF_U);
+       for (i = r1 - 1; i > r; i--)
+               wwframec(w, i, c, WWF_D|WWF_U);
+}
diff --git a/window/wwchild.c b/window/wwchild.c
new file mode 100644 (file)
index 0000000..53dfd7c
--- /dev/null
@@ -0,0 +1,79 @@
+/*     $NetBSD: wwchild.c,v 1.4 1997/11/21 08:37:00 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwchild.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwchild.c,v 1.4 1997/11/21 08:37:00 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include "ww.h"
+
+void
+wwchild(dummy)
+       int dummy;
+{
+       int olderrno;
+       struct ww **wp;
+       union wait w;
+       int pid;
+       char collected = 0;
+
+       olderrno = errno;
+       while ((pid =
+           wait3((int *)&w, WNOHANG|WUNTRACED, (struct rusage *)0)) > 0) {
+               for (wp = wwindex; wp < &wwindex[NWW]; wp++) {
+                       if (*wp && (*wp)->ww_state == WWS_HASPROC
+                           && (*wp)->ww_pid == pid) {
+                               (*wp)->ww_state = WWS_DEAD;
+                               collected = 1;
+                               break;
+                       }
+               }
+       }
+       errno = olderrno;
+       /* jump out of wwiomux when somebody dies */
+       if (collected)
+               wwsetintr();
+}
diff --git a/window/wwclose.c b/window/wwclose.c
new file mode 100644 (file)
index 0000000..f316db2
--- /dev/null
@@ -0,0 +1,69 @@
+/*     $NetBSD: wwclose.c,v 1.4 1997/11/21 08:37:01 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwclose.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwclose.c,v 1.4 1997/11/21 08:37:01 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include "ww.h"
+
+void
+wwclose(w)
+       struct ww *w;
+{
+       wwindex[w->ww_index] = 0;
+       if (w->ww_pty >= 0)
+               (void) close(w->ww_pty);
+       if (w->ww_socket >= 0)
+               (void) close(w->ww_socket);
+       wwfree((char **)w->ww_win, w->ww_w.t);
+       wwfree((char **)w->ww_buf, w->ww_b.t);
+       if (w->ww_fmap != 0)
+               wwfree((char **)w->ww_fmap, w->ww_w.t);
+       free((char *)(w->ww_nvis + w->ww_w.t));
+       if (w->ww_ob != 0)
+               free(w->ww_ob);
+       free((char *)w);
+}
diff --git a/window/wwclreol.c b/window/wwclreol.c
new file mode 100644 (file)
index 0000000..40ef777
--- /dev/null
@@ -0,0 +1,104 @@
+/*     $NetBSD: wwclreol.c,v 1.5 1997/11/21 08:37:03 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwclreol.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwclreol.c,v 1.5 1997/11/21 08:37:03 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+
+/*
+ * Clear w to the end of line.
+ * If cleared is true, then the screen line has already been cleared.
+ */
+void
+wwclreol1(w, row, col, cleared)
+       struct ww *w;
+       int row, col;
+       char cleared;
+{
+       int i;
+
+       /*
+        * Clear the buffer right off
+        */
+       {
+               union ww_char *buf;
+
+               buf = &w->ww_buf[row][col]; 
+               for (i = w->ww_b.r - col; --i >= 0;)
+                       buf++->c_w = ' ';
+       }
+
+       /*
+        * If can't see it, just return.
+        */
+       if (row < w->ww_i.t || row >= w->ww_i.b
+           || w->ww_i.r <= 0 || w->ww_i.r <= col)
+               return;
+
+       if (col < w->ww_i.l)
+               col = w->ww_i.l;
+
+       /*
+        * Now fix wwns.
+        */
+       {
+               union ww_char *s;
+               unsigned char *smap;
+               char *win;
+
+               i = col;
+               smap = &wwsmap[row][i];
+               s = &wwns[row][i];
+               win = &w->ww_win[row][i];
+               for (i = w->ww_i.r - i; --i >= 0;)
+                       if (*smap++ == w->ww_index)
+                               s++->c_w = ' ' | *win++ << WWC_MSHIFT;
+                       else
+                               s++, win++;
+       }
+       if (!cleared)
+               wwtouched[row] |= WWU_TOUCHED;
+}
diff --git a/window/wwclreos.c b/window/wwclreos.c
new file mode 100644 (file)
index 0000000..0059684
--- /dev/null
@@ -0,0 +1,64 @@
+/*     $NetBSD: wwclreos.c,v 1.5 1997/11/21 08:37:04 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwclreos.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwclreos.c,v 1.5 1997/11/21 08:37:04 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+
+void
+wwclreos(w, row, col)
+       struct ww *w;
+       int row, col;
+{
+       int i;
+
+       wwclreol(w, row, col);
+       for (i = row + 1; i < w->ww_b.b; i++)
+               wwclreol(w, i, w->ww_b.l);
+       /* XXX */
+       if (!ISSET(w->ww_wflags, WWW_NOUPDATE))
+               wwupdate1(w->ww_i.t, w->ww_i.b);
+}
diff --git a/window/wwcursor.c b/window/wwcursor.c
new file mode 100644 (file)
index 0000000..3367449
--- /dev/null
@@ -0,0 +1,103 @@
+/*     $NetBSD: wwcursor.c,v 1.5 1997/11/21 08:37:06 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwcursor.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwcursor.c,v 1.5 1997/11/21 08:37:06 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+void
+wwcursor(w, on)
+       struct ww *w;
+       int on;
+{
+       char *win;
+
+       if (on) {
+               if (ISSET(w->ww_wflags, WWW_HASCURSOR))
+                       return;
+               SET(w->ww_wflags, WWW_HASCURSOR);
+       } else {
+               if (!ISSET(w->ww_wflags, WWW_HASCURSOR))
+                       return;
+               CLR(w->ww_wflags, WWW_HASCURSOR);
+       }
+       if (wwcursormodes != 0) {
+               win = &w->ww_win[w->ww_cur.r][w->ww_cur.c];
+               *win ^= wwcursormodes;
+               if (w->ww_cur.r < w->ww_i.t || w->ww_cur.r >= w->ww_i.b
+                   || w->ww_cur.c < w->ww_i.l || w->ww_cur.c >= w->ww_i.r)
+                       return;
+               if (wwsmap[w->ww_cur.r][w->ww_cur.c] == w->ww_index) {
+                       if (*win == 0)
+                               w->ww_nvis[w->ww_cur.r]++;
+                       else if (*win == wwcursormodes)
+                               w->ww_nvis[w->ww_cur.r]--;
+                       wwns[w->ww_cur.r][w->ww_cur.c].c_m ^= wwcursormodes;
+                       wwtouched[w->ww_cur.r] |= WWU_TOUCHED;
+               }
+       }
+}
+
+void
+wwsetcursormodes(new)
+       int new;
+{
+       int i;
+       struct ww *w;
+       int old = wwcursormodes;
+
+       new &= wwavailmodes;
+       if (new == wwcursormodes)
+               return;
+       for (i = 0; i < NWW; i++)
+               if (wwindex[i] != 0 &&
+                   ISSET((w = wwindex[i])->ww_wflags, WWW_HASCURSOR)) {
+                       wwcursor(w, 0);
+                       wwcursormodes = new;
+                       wwcursor(w, 1);
+                       wwcursormodes = old;
+               }
+       wwcursormodes = new;
+}
diff --git a/window/wwdata.c b/window/wwdata.c
new file mode 100644 (file)
index 0000000..49b886a
--- /dev/null
@@ -0,0 +1,46 @@
+/*     $NetBSD: wwdata.c,v 1.4 1997/11/21 08:37:08 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwdata.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwdata.c,v 1.4 1997/11/21 08:37:08 lukem Exp $");
+#endif
+#endif /* not lint */
diff --git a/window/wwdelchar.c b/window/wwdelchar.c
new file mode 100644 (file)
index 0000000..183b6ec
--- /dev/null
@@ -0,0 +1,133 @@
+/*     $NetBSD: wwdelchar.c,v 1.5 1997/11/21 08:37:10 lukem Exp $      */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwdelchar.c        8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwdelchar.c,v 1.5 1997/11/21 08:37:10 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+#include "xx.h"
+
+void
+wwdelchar(w, row, col)
+       struct ww *w;
+       int row, col;
+{
+       int i;
+       int nvis;
+
+       /*
+        * First, shift the line.
+        */
+       {
+               union ww_char *p, *q;
+
+               p = &w->ww_buf[row][col];
+               q = p + 1;
+               for (i = w->ww_b.r - col; --i > 0;)
+                       *p++ = *q++;
+               p->c_w = ' ';
+       }
+
+       /*
+        * If can't see it, just return.
+        */
+       if (row < w->ww_i.t || row >= w->ww_i.b
+           || w->ww_i.r <= 0 || w->ww_i.r <= col)
+               return;
+
+       if (col < w->ww_i.l)
+               col = w->ww_i.l;
+
+       /*
+        * Now find out how much is actually changed, and fix wwns.
+        */
+       {
+               union ww_char *buf;
+               char *win;
+               union ww_char *ns;
+               unsigned char *smap;
+               char touched;
+
+               nvis = 0;
+               smap = &wwsmap[row][col];
+               for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++)
+                       ;
+               if (i >= w->ww_i.r)
+                       return;
+               col = i;
+               buf = w->ww_buf[row];
+               win = w->ww_win[row];
+               ns = wwns[row];
+               smap = &wwsmap[row][i];
+               touched = wwtouched[row];
+               for (; i < w->ww_i.r; i++) {
+                       if (*smap++ != w->ww_index)
+                               continue;
+                       touched |= WWU_TOUCHED;
+                       if (win[i])
+                               ns[i].c_w =
+                                       buf[i].c_w ^ win[i] << WWC_MSHIFT;
+                       else {
+                               nvis++;
+                               ns[i] = buf[i];
+                       }
+               }
+               wwtouched[row] = touched;
+       }
+
+       /*
+        * Can/Should we use delete character?
+        */
+       if (tt.tt_delchar != 0 && nvis > (wwncol - col) / 2) {
+               union ww_char *p, *q;
+
+               xxdelchar(row, col);
+               p = &wwos[row][col];
+               q = p + 1;
+               for (i = wwncol - col; --i > 0;)
+                       *p++ = *q++;
+               p->c_w = ' ';
+       }
+}
diff --git a/window/wwdelete.c b/window/wwdelete.c
new file mode 100644 (file)
index 0000000..50d118d
--- /dev/null
@@ -0,0 +1,149 @@
+/*     $NetBSD: wwdelete.c,v 1.5 1997/11/21 08:37:11 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwdelete.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwdelete.c,v 1.5 1997/11/21 08:37:11 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+/*
+ * Pull w free from the cover list.
+ */
+void
+wwdelete(w)
+       struct ww *w;
+{
+       int i;
+
+       for (i = w->ww_i.t; i < w->ww_i.b; i++) {
+               int j;
+               unsigned char *smap = wwsmap[i];
+               union ww_char *ns = wwns[i];
+               int nchanged = 0;
+
+               for (j = w->ww_i.l; j < w->ww_i.r; j++)
+                       if (smap[j] == w->ww_index) {
+                               smap[j] = WWX_NOBODY;
+                               ns[j].c_w = ' ';
+                               nchanged++;
+                       }
+               if (nchanged > 0)
+                       wwtouched[i] |= WWU_TOUCHED;
+       }
+
+       {
+               struct ww *wp;
+
+               for (wp = w->ww_forw; wp != &wwhead; wp = wp->ww_forw)
+                       wp->ww_order--;
+       }
+
+       if (w->ww_forw != &wwhead)
+               wwdelete1(w->ww_forw,
+                       w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r);
+
+       w->ww_back->ww_forw = w->ww_forw;
+       w->ww_forw->ww_back = w->ww_back;
+       w->ww_forw = w->ww_back = 0;
+}
+
+void
+wwdelete1(w, t, b, l, r)
+       struct ww *w;
+       int t, b, l, r;
+{
+       int i;
+       int tt, bb, ll, rr;
+       char hasglass;
+
+again:
+       hasglass = 0;
+       tt = MAX(t, w->ww_i.t);
+       bb = MIN(b, w->ww_i.b);
+       ll = MAX(l, w->ww_i.l);
+       rr = MIN(r, w->ww_i.r);
+       if (tt >= bb || ll >= rr) {
+               if ((w = w->ww_forw) == &wwhead)
+                       return;
+               goto again;
+       }
+       for (i = tt; i < bb; i++) {
+               int j;
+               unsigned char *smap = wwsmap[i];
+               union ww_char *ns = wwns[i];
+               char *win = w->ww_win[i];
+               union ww_char *buf = w->ww_buf[i];
+               int nvis = w->ww_nvis[i];
+               int nchanged = 0;
+
+               for (j = ll; j < rr; j++) {
+                       if (smap[j] != WWX_NOBODY)
+                               continue;
+                       if (win[j] & WWM_GLS) {
+                               hasglass = 1;
+                               continue;
+                       }
+                       smap[j] = w->ww_index;
+                       ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
+                       nchanged++;
+                       if (win[j] == 0)
+                               nvis++;
+               }
+               if (nchanged > 0)
+                       wwtouched[i] |= WWU_TOUCHED;
+               w->ww_nvis[i] = nvis;
+       }
+       if ((w = w->ww_forw) == &wwhead)
+               return;
+       if (hasglass)
+               goto again;
+       if (tt > t)
+               wwdelete1(w, t, tt, l, r);
+       if (bb < b)
+               wwdelete1(w, bb, b, l, r);
+       if (ll > l)
+               wwdelete1(w, tt, bb, l, ll);
+       if (rr < r)
+               wwdelete1(w, tt, bb, rr, r);
+}
diff --git a/window/wwdelline.c b/window/wwdelline.c
new file mode 100644 (file)
index 0000000..351c71f
--- /dev/null
@@ -0,0 +1,96 @@
+/*     $NetBSD: wwdelline.c,v 1.4 1997/11/21 08:37:13 lukem Exp $      */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwdelline.c        8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwdelline.c,v 1.4 1997/11/21 08:37:13 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+void
+wwdelline(w, row)
+       struct ww *w;
+       int row;
+{
+       int i;
+       union ww_char **cpp, **cqq;
+       union ww_char *cp;
+       int row1, row2;
+       char deleted;
+       int visible;
+
+       /*
+        * Scroll first.
+        */
+       if ((row1 = row) < w->ww_i.t) {
+               row1 = w->ww_i.t;
+       }
+       if ((row2 = w->ww_b.b) > w->ww_i.b) {
+               row2 = w->ww_i.b;
+               visible = 0;
+       } else
+               visible = 1;
+       deleted = wwscroll1(w, row1, row2, 1, visible);
+
+       /*
+        * Fix the buffer.
+        * But leave clearing the last line for wwclreol().
+        */
+       cpp = &w->ww_buf[row];
+       cqq = cpp + 1;
+       cp = *cpp;
+       for (i = w->ww_b.b - row; --i > 0;)
+               *cpp++ = *cqq++;
+       *cpp = cp;
+
+       /*
+        * Now clear the last line.
+        */
+       if (visible)
+               wwclreol1(w, w->ww_b.b - 1, w->ww_b.l, deleted);
+       else {
+               cp += w->ww_b.l;
+               for (i = w->ww_b.nc; --i >= 0;)
+                       cp++->c_w = ' ';
+       }
+}
diff --git a/window/wwdump.c b/window/wwdump.c
new file mode 100644 (file)
index 0000000..ea24c68
--- /dev/null
@@ -0,0 +1,128 @@
+/*     $NetBSD: wwdump.c,v 1.6 1997/11/21 08:37:14 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwdump.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwdump.c,v 1.6 1997/11/21 08:37:14 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdio.h>
+#include <string.h>
+#include "ww.h"
+#include "tt.h"
+
+static char cmap[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+void
+wwdumpwin(w)
+       struct ww *w;
+{
+       int i, j;
+
+       tt.tt_nmodes = 0;
+       (*tt.tt_clear)();
+       for (i = w->ww_i.t; i < w->ww_i.b; i++) {
+               (*tt.tt_move)(i, w->ww_i.l);
+               for (j = w->ww_i.l; j < w->ww_i.r; j++)
+                       (*tt.tt_putc)(w->ww_win[i][j] & WWM_GLS ? 'G' : ' ');
+       }
+}
+
+void
+wwdumpnvis(w)
+       struct ww *w;
+{
+       int i;
+       char buf[20];
+
+       tt.tt_nmodes = 0;
+       (*tt.tt_clear)();
+       for (i = w->ww_i.t; i < w->ww_i.b; i++) {
+               (*tt.tt_move)(i, w->ww_i.l);
+               (void) sprintf(buf, "%d", w->ww_nvis[i]);
+               (*tt.tt_write)(buf, strlen(buf));
+       }
+}
+
+void
+wwdumpsmap()
+{
+       int i, j;
+
+       tt.tt_nmodes = 0;
+       (*tt.tt_clear)();
+       for (i = 0; i < wwnrow; i++) {
+               (*tt.tt_move)(i, 0);
+               for (j = 0; j < wwncol; j++)
+                       (*tt.tt_putc)(cmap[wwsmap[i][j]]);
+       }
+}
+
+void
+wwdumpns()
+{
+       int i, j;
+
+       (*tt.tt_clear)();
+       for (i = 0; i < wwnrow; i++) {
+               (*tt.tt_move)(i, 0);
+               for (j = 0; j < wwncol; j++) {
+                       tt.tt_nmodes = wwns[i][j].c_m & tt.tt_availmodes;
+                       (*tt.tt_putc)(wwns[i][j].c_c);
+               }
+       }
+}
+
+void
+wwdumpos()
+{
+       int i, j;
+
+       (*tt.tt_clear)();
+       for (i = 0; i < wwnrow; i++) {
+               (*tt.tt_move)(i, 0);
+               for (j = 0; j < wwncol; j++) {
+                       tt.tt_nmodes = wwos[i][j].c_m & tt.tt_availmodes;
+                       (*tt.tt_putc)(wwns[i][j].c_c);
+               }
+       }
+}
diff --git a/window/wwend.c b/window/wwend.c
new file mode 100644 (file)
index 0000000..2431d70
--- /dev/null
@@ -0,0 +1,75 @@
+/*     $NetBSD: wwend.c,v 1.4 1997/11/21 08:37:16 lukem Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwend.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwend.c,v 1.4 1997/11/21 08:37:16 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <unistd.h>
+#include "ww.h"
+#include "tt.h"
+#include "xx.h"
+
+void
+wwend(exit)
+       int exit;
+{
+       if (tt.tt_checkpoint) {
+               (void) alarm(0);
+               wwdocheckpoint = 0;
+       }
+       xxend();
+       (void) wwsettty(0, &wwoldtty);
+#ifdef TERMINFO
+       if (exit)
+               wwterminfoend();
+#endif
+}
+
+void
+wwquit(dummy)
+       int dummy;
+{
+       wwend(1);
+       exit(1);
+}
diff --git a/window/wwenviron.c b/window/wwenviron.c
new file mode 100644 (file)
index 0000000..d033e3d
--- /dev/null
@@ -0,0 +1,117 @@
+/*     $NetBSD: wwenviron.c,v 1.5 1997/11/21 08:37:18 lukem Exp $      */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwenviron.c        8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwenviron.c,v 1.5 1997/11/21 08:37:18 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#if !defined(OLD_TTY) && !defined(TIOCSCTTY) && !defined(TIOCNOTTY)
+#include <sys/ioctl.h>
+#endif
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "ww.h"
+
+/*
+ * Set up the environment of this process to run in window 'wp'.
+ */
+int
+wwenviron(wp)
+       struct ww *wp;
+{
+       int i;
+#ifndef TIOCSCTTY
+       int pgrp = getpid();
+#endif
+       char buf[1024];
+       sigset_t sigset;
+
+#ifndef TIOCSCTTY
+       if ((i = open("/dev/tty", 0)) < 0)
+               goto bad;
+       if (ioctl(i, TIOCNOTTY, (char *)0) < 0)
+               goto bad;
+       (void) close(i);
+#endif
+       if ((i = wp->ww_socket) < 0) {
+               if ((i = open(wp->ww_ttyname, 2)) < 0)
+                       goto bad;
+               if (wwsettty(i, &wwwintty) < 0)
+                       goto bad;
+               if (wwsetttysize(i, wp->ww_w.nr, wp->ww_w.nc) < 0)
+                       goto bad;
+       }
+       (void) dup2(i, 0);
+       (void) dup2(i, 1);
+       (void) dup2(i, 2);
+       (void) close(i);
+#ifdef TIOCSCTTY
+       (void) setsid();
+       (void) ioctl(0, TIOCSCTTY, 0);
+#else
+       (void) ioctl(0, TIOCSPGRP, (char *)&pgrp);
+       (void) setpgrp(pgrp, pgrp);
+#endif
+       /* SIGPIPE is the only one we ignore */
+       (void) signal(SIGPIPE, SIG_DFL);
+       sigemptyset(&sigset);
+       sigprocmask(SIG_SETMASK, &sigset, (sigset_t *)0);
+       /*
+        * Two conditions that make destructive setenv ok:
+        * 1. setenv() copies the string,
+        * 2. we've already called tgetent which copies the termcap entry.
+        */
+       (void) sprintf(buf, "%sco#%d:li#%d:%s",
+               WWT_TERMCAP, wp->ww_w.nc, wp->ww_w.nr, wwwintermcap);
+       (void) setenv("TERMCAP", buf, 1);
+       (void) sprintf(buf, "%d", wp->ww_id + 1);
+       (void) setenv("WINDOW_ID", buf, 1);
+       return 0;
+bad:
+       wwerrno = WWE_SYS;
+       return -1;
+}
diff --git a/window/wwerror.c b/window/wwerror.c
new file mode 100644 (file)
index 0000000..ed20f09
--- /dev/null
@@ -0,0 +1,75 @@
+/*     $NetBSD: wwerror.c,v 1.5 1998/07/26 15:28:20 mycroft Exp $      */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwerror.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwerror.c,v 1.5 1998/07/26 15:28:20 mycroft Exp $");
+#endif
+#endif /* not lint */
+
+#include <errno.h>
+#include <string.h>
+#include "ww.h"
+
+const char *
+wwerror()
+{
+       switch (wwerrno) {
+       case WWE_NOERR:
+               return "No error";
+       case WWE_SYS:
+               return strerror(errno);
+       case WWE_NOMEM:
+               return "Out of memory";
+       case WWE_TOOMANY:
+               return "Too many windows";
+       case WWE_NOPTY:
+               return "Out of pseudo-terminals";
+       case WWE_SIZE:
+               return "Bad window size";
+       case WWE_BADTERM:
+               return "Unknown terminal type";
+       case WWE_CANTDO:
+               return "Can't run window on this terminal";
+       default:
+               return "Unknown error";
+       }
+}
diff --git a/window/wwflush.c b/window/wwflush.c
new file mode 100644 (file)
index 0000000..64dca64
--- /dev/null
@@ -0,0 +1,127 @@
+/*     $NetBSD: wwflush.c,v 1.6 1997/11/21 08:37:21 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwflush.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwflush.c,v 1.6 1997/11/21 08:37:21 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+#include "ww.h"
+#include "tt.h"
+#include "xx.h"
+
+void
+wwflush()
+{
+       int row, col;
+
+       if ((row = wwcursorrow) < 0)
+               row = 0;
+       else if (row >= wwnrow)
+               row = wwnrow - 1;
+       if ((col = wwcursorcol) < 0)
+               col = 0;
+       else if (col >= wwncol)
+               col = wwncol - 1;
+       xxmove(row, col);
+       if (wwdocheckpoint) {
+               xxflush(0);
+               wwcheckpoint();
+       } else
+               xxflush(1);
+}
+
+void
+wwcheckpoint()
+{
+       sigset_t sigset, osigset;
+
+       sigemptyset(&sigset);
+       sigaddset(&sigset, SIGALRM);
+       sigprocmask(SIG_BLOCK, &sigset, &osigset);
+
+       tt.tt_ack = 0;
+       do {
+               (*tt.tt_checkpoint)();
+#ifndef OLD_TTY
+               (void) tcdrain(1);
+#endif
+               (void) alarm(3);
+               for (wwdocheckpoint = 0; !wwdocheckpoint && tt.tt_ack == 0;)
+                       sigsuspend(&osigset);
+       } while (tt.tt_ack == 0);
+       (void) alarm(0);
+       wwdocheckpoint = 0;
+       if (tt.tt_ack < 0) {
+               wwcopyscreen(wwcs, wwos);
+               (void) alarm(1);
+               wwreset();
+               wwupdate();
+               wwflush();
+       } else {
+               wwcopyscreen(wwos, wwcs);
+               (void) alarm(3);
+       }
+
+       sigprocmask(SIG_SETMASK, &osigset, (sigset_t *)0);
+}
+
+void
+wwcopyscreen(s1, s2)
+       union ww_char **s1, **s2;
+{
+       int i;
+       int s = wwncol * sizeof **s1;
+
+       for (i = wwnrow; --i >= 0;)
+               memmove((char *) *s2++, (char *) *s1++, s);
+}
+
+void
+wwalarm(dummy)
+       int dummy;
+{
+       wwdocheckpoint = 1;
+}
diff --git a/window/wwframe.c b/window/wwframe.c
new file mode 100644 (file)
index 0000000..13f0dfa
--- /dev/null
@@ -0,0 +1,255 @@
+/*     $NetBSD: wwframe.c,v 1.5 1997/11/21 08:37:22 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwframe.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwframe.c,v 1.5 1997/11/21 08:37:22 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+
+#define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
+       w1->ww_fmap || w1->ww_order > (w)->ww_order)
+
+void
+wwframe(w, wframe)
+       struct ww *w;
+       struct ww *wframe;
+{
+       int r, c;
+       char a1, a2, a3;
+       char b1, b2, b3;
+       int code;
+       struct ww *w1;
+
+       if (w->ww_w.t > 0) {
+               r = w->ww_w.t - 1;
+               c = w->ww_i.l - 1;
+               a1 = 0;
+               a2 = 0;
+               b1 = 0;
+               b2 = c < 0 || frameok(w, r, c);
+
+               for (; c < w->ww_i.r; c++) {
+                       if (c + 1 >= wwncol) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == wwsmap[r + 1][c + 1];
+                               b3 = frameok(w, r, c + 1);
+                       }
+                       if (b2) {
+                               code = 0;
+                               if ((a1 || a2) && b1)
+                                       code |= WWF_L;
+                               if ((a2 || a3) && b3)
+                                       code |= WWF_R;
+                               if (code)
+                                       wwframec(wframe, r, c, code|WWF_TOP);
+                       }
+                       a1 = a2;
+                       a2 = a3;
+                       b1 = b2;
+                       b2 = b3;
+               }
+               if ((a1 || a2) && b1 && b2)
+                       wwframec(wframe, r, c, WWF_L|WWF_TOP);
+       }
+
+       if (w->ww_w.b < wwnrow) {
+               r = w->ww_w.b;
+               c = w->ww_i.l - 1;
+               a1 = 0;
+               a2 = 0;
+               b1 = 0;
+               b2 = c < 0 || frameok(w, r, c);
+
+               for (; c < w->ww_i.r; c++) {
+                       if (c + 1 >= wwncol) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == wwsmap[r - 1][c + 1];
+                               b3 = frameok(w, r, c + 1);
+                       }
+                       if (b2) {
+                               code = 0;
+                               if ((a1 || a2) && b1)
+                                       code |= WWF_L;
+                               if ((a2 || a3) && b3)
+                                       code |= WWF_R;
+                               if (code)
+                                       wwframec(wframe, r, c, code);
+                       }
+                       a1 = a2;
+                       a2 = a3;
+                       b1 = b2;
+                       b2 = b3;
+               }
+               if ((a1 || a2) && b1 && b2)
+                       wwframec(wframe, r, c, WWF_L);
+       }
+
+       if (w->ww_w.l > 0) {
+               r = w->ww_i.t - 1;
+               c = w->ww_w.l - 1;
+               a1 = 0;
+               a2 = 0;
+               b1 = 0;
+               b2 = r < 0 || frameok(w, r, c);
+
+               for (; r < w->ww_i.b; r++) {
+                       if (r + 1 >= wwnrow) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == wwsmap[r + 1][c + 1];
+                               b3 = frameok(w, r + 1, c);
+                       }
+                       if (b2) {
+                               code = 0;
+                               if ((a1 || a2) && b1)
+                                       code |= WWF_U;
+                               if ((a2 || a3) && b3)
+                                       code |= WWF_D;
+                               if (code)
+                                       wwframec(wframe, r, c, code);
+                       }
+                       a1 = a2;
+                       a2 = a3;
+                       b1 = b2;
+                       b2 = b3;
+               }
+               if ((a1 || a2) && b1 && b2)
+                       wwframec(wframe, r, c, WWF_U);
+       }
+
+       if (w->ww_w.r < wwncol) {
+               r = w->ww_i.t - 1;
+               c = w->ww_w.r;
+               a1 = 0;
+               a2 = 0;
+               b1 = 0;
+               b2 = r < 0 || frameok(w, r, c);
+
+               for (; r < w->ww_i.b; r++) {
+                       if (r + 1 >= wwnrow) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == wwsmap[r + 1][c - 1];
+                               b3 = frameok(w, r + 1, c);
+                       }
+                       if (b2) {
+                               code = 0;
+                               if ((a1 || a2) && b1)
+                                       code |= WWF_U;
+                               if ((a2 || a3) && b3)
+                                       code |= WWF_D;
+                               if (code)
+                                       wwframec(wframe, r, c, code);
+                       }
+                       a1 = a2;
+                       a2 = a3;
+                       b1 = b2;
+                       b2 = b3;
+               }
+               if ((a1 || a2) && b1 && b2)
+                       wwframec(wframe, r, c, WWF_U);
+       }
+}
+
+void
+wwframec(f, r, c, code)
+       struct ww *f;
+       int r, c;
+       char code;
+{
+       char oldcode;
+       unsigned char *smap;
+
+       if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
+               return;
+
+       smap = &wwsmap[r][c];
+
+       {
+               struct ww *w;
+
+               w = wwindex[*smap];
+               if (w->ww_order > f->ww_order) {
+                       if (w != &wwnobody && w->ww_win[r][c] == 0)
+                               w->ww_nvis[r]--;
+                       *smap = f->ww_index;
+               }
+       }
+
+       if (f->ww_fmap != 0) {
+               char *fmap;
+
+               fmap = &f->ww_fmap[r][c];
+               oldcode = *fmap;
+               *fmap |= code;
+               if (code & WWF_TOP)
+                       *fmap &= ~WWF_LABEL;
+               code = *fmap;
+       } else
+               oldcode = 0;
+       {
+               char *win = &f->ww_win[r][c];
+
+               if (*win == WWM_GLS && *smap == f->ww_index)
+                       f->ww_nvis[r]++;
+               *win &= ~WWM_GLS;
+       }
+       if (oldcode != code && (code & WWF_LABEL) == 0) {
+               short frame;
+
+               frame = tt.tt_frame[code & WWF_MASK];
+               f->ww_buf[r][c].c_w = frame;
+               if (wwsmap[r][c] == f->ww_index) {
+                       wwtouched[r] |= WWU_TOUCHED;
+                       wwns[r][c].c_w = frame;
+               }
+       }
+}
diff --git a/window/wwgets.c b/window/wwgets.c
new file mode 100644 (file)
index 0000000..ce0e9ea
--- /dev/null
@@ -0,0 +1,120 @@
+/*     $NetBSD: wwgets.c,v 1.7 1997/11/21 08:37:24 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwgets.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwgets.c,v 1.7 1997/11/21 08:37:24 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <string.h>
+#include "ww.h"
+#include "char.h"
+
+static void rub __P((int, struct ww *));
+
+void
+wwgets(buf, n, w)
+       char *buf;
+       int n;
+       struct ww *w;
+{
+       char *p = buf;
+       int c;
+       int uc = ISSET(w->ww_wflags, WWW_UNCTRL);
+
+       CLR(w->ww_wflags, WWW_UNCTRL);
+       for (;;) {
+               wwcurtowin(w);
+               while ((c = wwgetc()) < 0)
+                       wwiomux();
+#ifdef OLD_TTY
+               if (c == wwoldtty.ww_sgttyb.sg_erase)
+#else
+               if (c == wwoldtty.ww_termios.c_cc[VERASE])
+#endif
+               {
+                       if (p > buf)
+                               rub(*--p, w);
+               } else
+#ifdef OLD_TTY
+               if (c == wwoldtty.ww_sgttyb.sg_kill)
+#else
+               if (c == wwoldtty.ww_termios.c_cc[VKILL])
+#endif
+               {
+                       while (p > buf)
+                               rub(*--p, w);
+               } else
+#ifdef OLD_TTY
+               if (c == wwoldtty.ww_ltchars.t_werasc)
+#else
+               if (c == wwoldtty.ww_termios.c_cc[VWERASE])
+#endif
+               {
+                       while (--p >= buf && (*p == ' ' || *p == '\t'))
+                               rub(*p, w);
+                       while (p >= buf && *p != ' ' && *p != '\t')
+                               rub(*p--, w);
+                       p++;
+               } else if (c == '\r' || c == '\n') {
+                       break;
+               } else {
+                       if (p >= buf + n - 1)
+                               wwputc(ctrl('g'), w);
+                       else
+                               wwputs(unctrl(*p++ = c), w);
+               }
+       }
+       *p = 0;
+       SET(w->ww_wflags, uc);
+}
+
+static void
+rub(c, w)
+       int c;
+       struct ww *w;
+{
+       int i;
+
+       for (i = strlen(unctrl(c)); --i >= 0;)
+               (void) wwwrite(w, "\b \b", 3);
+}
diff --git a/window/wwinit.c b/window/wwinit.c
new file mode 100644 (file)
index 0000000..bb8f505
--- /dev/null
@@ -0,0 +1,425 @@
+/*     $NetBSD: wwinit.c,v 1.12 1997/11/21 08:37:26 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwinit.c   8.2 (Berkeley) 4/28/95";
+#else
+__RCSID("$NetBSD: wwinit.c,v 1.12 1997/11/21 08:37:26 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <fcntl.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef __APPLE__
+#include <curses.h>
+#else
+#include <termcap.h>
+#endif
+#include "ww.h"
+#include "tt.h"
+#include "xx.h"
+#include "char.h"
+
+int
+wwinit()
+{
+       int i, j;
+       char *kp;
+       sigset_t sigset, osigset;
+
+       wwdtablesize = 3;
+       wwhead.ww_forw = &wwhead;
+       wwhead.ww_back = &wwhead;
+
+       sigemptyset(&sigset);
+       sigaddset(&sigset, SIGCHLD);
+       sigaddset(&sigset, SIGALRM);
+       sigaddset(&sigset, SIGHUP);
+       sigaddset(&sigset, SIGTERM);
+       sigprocmask(SIG_BLOCK, &sigset, &osigset);
+
+       if (signal(SIGCHLD, wwchild) == BADSIG ||
+           signal(SIGHUP, wwquit) == BADSIG ||
+           signal(SIGTERM, wwquit) == BADSIG ||
+           signal(SIGPIPE, SIG_IGN) == BADSIG) {
+               wwerrno = WWE_SYS;
+               return -1;
+       }
+
+       if (wwgettty(0, &wwoldtty) < 0)
+               return -1;
+       wwwintty = wwoldtty;
+#ifdef OLD_TTY
+       wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
+       wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
+       wwnewtty.ww_sgttyb.sg_erase = -1;
+       wwnewtty.ww_sgttyb.sg_kill = -1;
+       wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
+       wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
+       wwnewtty.ww_tchars.t_intrc = -1;
+       wwnewtty.ww_tchars.t_quitc = -1;
+       wwnewtty.ww_tchars.t_startc = -1;
+       wwnewtty.ww_tchars.t_stopc = -1;
+       wwnewtty.ww_tchars.t_eofc = -1;
+       wwnewtty.ww_tchars.t_brkc = -1;
+       wwnewtty.ww_ltchars.t_suspc = -1;
+       wwnewtty.ww_ltchars.t_dsuspc = -1;
+       wwnewtty.ww_ltchars.t_rprntc = -1;
+       wwnewtty.ww_ltchars.t_flushc = -1;
+       wwnewtty.ww_ltchars.t_werasc = -1;
+       wwnewtty.ww_ltchars.t_lnextc = -1;
+       wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
+       wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
+#else
+#ifndef OXTABS
+#define OXTABS XTABS
+#endif
+#ifndef _POSIX_VDISABLE
+#define _POSIX_VDISABLE -1
+#endif
+       wwwintty.ww_termios.c_oflag &= ~OXTABS;
+       wwnewtty.ww_termios = wwoldtty.ww_termios;
+       wwnewtty.ww_termios.c_iflag &=
+               ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IMAXBEL);
+       wwnewtty.ww_termios.c_oflag = 0;
+       wwnewtty.ww_termios.c_cflag &= ~(CSIZE | PARENB);
+       wwnewtty.ww_termios.c_cflag |= CS8;
+       wwnewtty.ww_termios.c_lflag = 0;
+       for (i = 0; i < NCCS; i++)
+               wwnewtty.ww_termios.c_cc[i] = _POSIX_VDISABLE;
+       wwnewtty.ww_termios.c_cc[VMIN] = 1;
+       wwnewtty.ww_termios.c_cc[VTIME] = 0;
+#endif
+       if (wwsettty(0, &wwnewtty) < 0)
+               goto bad;
+
+       if ((wwterm = getenv("TERM")) == 0) {
+               wwerrno = WWE_BADTERM;
+               goto bad;
+       }
+       if (tgetent(wwtermcap, wwterm) != 1) {
+               wwerrno = WWE_BADTERM;
+               goto bad;
+       }
+#ifdef OLD_TTY
+       wwospeed = wwoldtty.ww_sgttyb.sg_ospeed;
+#else
+       wwospeed = cfgetospeed(&wwoldtty.ww_termios);
+       wwbaud = wwospeed;
+#endif
+       switch (wwospeed) {
+       default:
+       case B0:
+               wwbaud = 0;
+               break;
+       case B50:
+               wwbaud = 50;
+               break;
+       case B75:
+               wwbaud = 75;
+               break;
+       case B110:
+               wwbaud = 110;
+               break;
+       case B134:
+               wwbaud = 134;
+               break;
+       case B150:
+               wwbaud = 150;
+               break;
+       case B200:
+               wwbaud = 200;
+               break;
+       case B300:
+               wwbaud = 300;
+               break;
+       case B600:
+               wwbaud = 600;
+               break;
+       case B1200:
+               wwbaud = 1200;
+               break;
+       case B1800:
+               wwbaud = 1800;
+               break;
+       case B2400:
+               wwbaud = 2400;
+               break;
+       case B4800:
+               wwbaud = 4800;
+               break;
+       case B9600:
+               wwbaud = 9600;
+               break;
+#ifdef B19200
+       case B19200:
+#else
+       case EXTA:
+#endif
+               wwbaud = 19200;
+               break;
+#ifdef B38400
+       case B38400:
+#else
+       case EXTB:
+#endif
+               wwbaud = 38400;
+               break;
+#ifdef B57600
+       case B57600:
+               wwbaud= 57600;
+               break;
+#endif
+#ifdef B115200
+       case B115200:
+               wwbaud = 115200;
+               break;
+#endif
+       }
+
+       if (xxinit() < 0)
+               goto bad;
+       wwnrow = tt.tt_nrow;
+       wwncol = tt.tt_ncol;
+       wwavailmodes = tt.tt_availmodes;
+       wwwrap = tt.tt_wrap;
+
+       if (wwavailmodes & WWM_REV)
+               wwcursormodes = WWM_REV | (wwavailmodes & WWM_BLK);
+       else if (wwavailmodes & WWM_UL)
+               wwcursormodes = WWM_UL;
+
+       if ((wwib = malloc((unsigned) 512)) == 0)
+               goto bad;
+       wwibe = wwib + 512;
+       wwibq = wwibp = wwib;
+
+       wwsmap = (unsigned char **)
+               wwalloc(0, 0, wwnrow, wwncol, sizeof (unsigned char));
+       if (wwsmap == 0)
+               goto bad;
+       for (i = 0; i < wwnrow; i++)
+               for (j = 0; j < wwncol; j++)
+                       wwsmap[i][j] = WWX_NOBODY;
+
+       wwos = (union ww_char **)
+               wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
+       if (wwos == 0)
+               goto bad;
+       /* wwos is cleared in wwstart1() */
+       wwns = (union ww_char **)
+               wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
+       if (wwns == 0)
+               goto bad;
+       for (i = 0; i < wwnrow; i++)
+               for (j = 0; j < wwncol; j++)
+                       wwns[i][j].c_w = ' ';
+       if (tt.tt_checkpoint) {
+               /* wwcs is also cleared in wwstart1() */
+               wwcs = (union ww_char **)
+                       wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
+               if (wwcs == 0)
+                       goto bad;
+       }
+
+       wwtouched = malloc((unsigned) wwnrow);
+       if (wwtouched == 0) {
+               wwerrno = WWE_NOMEM;
+               goto bad;
+       }
+       for (i = 0; i < wwnrow; i++)
+               wwtouched[i] = 0;
+
+       wwupd = (struct ww_update *) malloc((unsigned) wwnrow * sizeof *wwupd);
+       if (wwupd == 0) {
+               wwerrno = WWE_NOMEM;
+               goto bad;
+       }
+
+       wwindex[WWX_NOBODY] = &wwnobody;
+       wwnobody.ww_order = NWW;
+
+       kp = wwwintermcap;
+       if (wwavailmodes & WWM_REV)
+               wwaddcap1(WWT_REV, &kp);
+       if (wwavailmodes & WWM_BLK)
+               wwaddcap1(WWT_BLK, &kp);
+       if (wwavailmodes & WWM_UL)
+               wwaddcap1(WWT_UL, &kp);
+       if (wwavailmodes & WWM_GRP)
+               wwaddcap1(WWT_GRP, &kp);
+       if (wwavailmodes & WWM_DIM)
+               wwaddcap1(WWT_DIM, &kp);
+       if (wwavailmodes & WWM_USR)
+               wwaddcap1(WWT_USR, &kp);
+       if ((tt.tt_insline && tt.tt_delline) || tt.tt_setscroll)
+               wwaddcap1(WWT_ALDL, &kp);
+       if (tt.tt_inschar)
+               wwaddcap1(WWT_IMEI, &kp);
+       if (tt.tt_insspace)
+               wwaddcap1(WWT_IC, &kp);
+       if (tt.tt_delchar)
+               wwaddcap1(WWT_DC, &kp);
+       wwaddcap("kb", &kp);
+       wwaddcap("ku", &kp);
+       wwaddcap("kd", &kp);
+       wwaddcap("kl", &kp);
+       wwaddcap("kr", &kp);
+       wwaddcap("kh", &kp);
+       if ((j = tgetnum("kn")) >= 0) {
+               char cap[32];
+
+               (void) sprintf(kp, "kn#%d:", j);
+               for (; *kp; kp++)
+                       ;
+               for (i = 1; i <= j; i++) {
+                       (void) sprintf(cap, "k%d", i);
+                       wwaddcap(cap, &kp);
+                       cap[0] = 'l';
+                       wwaddcap(cap, &kp);
+               }
+       }
+       /*
+        * It's ok to do this here even if setenv() is destructive
+        * since tt_init() has already made its own copy of it and
+        * wwterm now points to the copy.
+        */
+       (void) setenv("TERM", WWT_TERM, 1);
+#ifdef TERMINFO
+       if (wwterminfoinit() < 0)
+               goto bad;
+#endif
+
+       if (tt.tt_checkpoint)
+               if (signal(SIGALRM, wwalarm) == BADSIG) {
+                       wwerrno = WWE_SYS;
+                       goto bad;
+               }
+       wwstart1();
+
+       sigprocmask(SIG_SETMASK, &osigset, (sigset_t *)0);
+       return 0;
+
+bad:
+       /*
+        * Don't bother to free storage.  We're supposed
+        * to exit when wwinit fails anyway.
+        */
+       (void) wwsettty(0, &wwoldtty);
+
+       sigprocmask(SIG_SETMASK, &osigset, (sigset_t *)0);
+       return -1;
+}
+
+void
+wwaddcap(cap, kp)
+       char *cap;
+       char **kp;
+{
+       char tbuf[512];
+       char *tp = tbuf;
+       char *str, *p;
+
+       if ((str = tgetstr(cap, &tp)) != 0) {
+               while ((*(*kp)++ = *cap++))
+                       ;
+               (*kp)[-1] = '=';
+               while (*str) {
+                       for (p = unctrl(*str++); (*(*kp)++ = *p++);)
+                               ;
+                       (*kp)--;
+               }
+               *(*kp)++ = ':';
+               **kp = 0;
+       }
+}
+
+void
+wwaddcap1(cap, kp)
+       char *cap;
+       char **kp;
+{
+       while ((*(*kp)++ = *cap++))
+               ;
+       (*kp)--;
+}
+
+void
+wwstart()
+{
+       int i;
+
+       (void) wwsettty(0, &wwnewtty);
+       for (i = 0; i < wwnrow; i++)
+               wwtouched[i] = WWU_TOUCHED;
+       wwstart1();
+}
+
+void
+wwstart1()
+{
+       int i, j;
+
+       for (i = 0; i < wwnrow; i++)
+               for (j = 0; j < wwncol; j++) {
+                       wwos[i][j].c_w = ' ';
+                       if (tt.tt_checkpoint)
+                               wwcs[i][j].c_w = ' ';
+               }
+       xxstart();
+       if (tt.tt_checkpoint)
+               wwdocheckpoint = 1;
+}
+
+/*
+ * Reset data structures and terminal from an unknown state.
+ * Restoring wwos has been taken care of elsewhere.
+ */
+void
+wwreset()
+{
+       int i;
+
+       xxreset();
+       for (i = 0; i < wwnrow; i++)
+               wwtouched[i] = WWU_TOUCHED;
+}
diff --git a/window/wwinschar.c b/window/wwinschar.c
new file mode 100644 (file)
index 0000000..64a117c
--- /dev/null
@@ -0,0 +1,140 @@
+/*     $NetBSD: wwinschar.c,v 1.5 1997/11/21 08:37:27 lukem Exp $      */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwinschar.c        8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwinschar.c,v 1.5 1997/11/21 08:37:27 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+#include "xx.h"
+
+void
+wwinschar(w, row, col, c, m)
+       struct ww *w;
+       int row, col;
+       char c, m;
+{
+       int i;
+       int nvis;
+       short x = c | m << WWC_MSHIFT;
+
+       /*
+        * First, shift the line.
+        */
+       {
+               union ww_char *p, *q;
+
+               p = &w->ww_buf[row][w->ww_b.r];
+               q = p - 1;
+               for (i = w->ww_b.r - col; --i > 0;)
+                       *--p = *--q;
+               q->c_w = x;
+       }
+
+       /*
+        * If can't see it, just return.
+        */
+       if (row < w->ww_i.t || row >= w->ww_i.b
+           || w->ww_i.r <= 0 || w->ww_i.r <= col)
+               return;
+
+       if (col < w->ww_i.l)
+               col = w->ww_i.l;
+
+       /*
+        * Now find out how much is actually changed, and fix wwns.
+        */
+       {
+               union ww_char *buf;
+               char *win;
+               union ww_char *ns;
+               unsigned char *smap;
+               char touched;
+
+               nvis = 0;
+               smap = &wwsmap[row][col];
+               for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++)
+                       ;
+               if (i >= w->ww_i.r)
+                       return;
+               col = i;
+               buf = w->ww_buf[row];
+               win = w->ww_win[row];
+               ns = wwns[row];
+               smap = &wwsmap[row][i];
+               touched = wwtouched[row];
+               for (; i < w->ww_i.r; i++) {
+                       if (*smap++ != w->ww_index)
+                               continue;
+                       touched |= WWU_TOUCHED;
+                       if (win[i])
+                               ns[i].c_w =
+                                       buf[i].c_w ^ win[i] << WWC_MSHIFT;
+                       else {
+                               nvis++;
+                               ns[i] = buf[i];
+                       }
+               }
+               wwtouched[row] = touched;
+       }
+
+       /*
+        * Can/Should we use delete character?
+        */
+       if ((tt.tt_inschar || tt.tt_insspace) && nvis > (wwncol - col) / 2) {
+               union ww_char *p, *q;
+
+               if (tt.tt_inschar)
+                       xxinschar(row, col, c, m);
+               else {
+                       xxinsspace(row, col);
+                       x = ' ';
+               }
+               p = &wwos[row][wwncol];
+               q = p - 1;
+               for (i = wwncol - col; --i > 0;)
+                       *--p = *--q;
+               q->c_w = x;
+       }
+}
diff --git a/window/wwinsline.c b/window/wwinsline.c
new file mode 100644 (file)
index 0000000..ba749f5
--- /dev/null
@@ -0,0 +1,96 @@
+/*     $NetBSD: wwinsline.c,v 1.4 1997/11/21 08:37:29 lukem Exp $      */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwinsline.c        8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwinsline.c,v 1.4 1997/11/21 08:37:29 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+void
+wwinsline(w, row)
+       struct ww *w;
+       int row;
+{
+       int i;
+       union ww_char **cpp, **cqq;
+       union ww_char *cp;
+       int row1, row2;
+       char deleted;
+       int visible;
+
+       /*
+        * Scroll first.
+        */
+       if ((row1 = row) < w->ww_i.t) {
+               row1 = w->ww_i.t;
+               visible = 0;
+       } else
+               visible = 1;
+       if ((row2 = w->ww_b.b) > w->ww_i.b) {
+               row2 = w->ww_i.b;
+       }
+       deleted = wwscroll1(w, row1, row2, -1, visible);
+
+       /*
+        * Fix the buffer.
+        * But leave clearing the last line for wwclreol().
+        */
+       cpp = &w->ww_buf[w->ww_b.b];
+       cqq = cpp - 1;
+       cp = *cqq;
+       for (i = w->ww_b.b - row; --i > 0;)
+               *--cpp = *--cqq;
+       *cqq = cp;
+
+       /*
+        * Now clear the last line.
+        */
+       if (visible)
+               wwclreol1(w, row, w->ww_b.l, deleted);
+       else {
+               cp += w->ww_b.l;
+               for (i = w->ww_b.nc; --i >= 0;)
+                       cp++->c_w = ' ';
+       }
+}
diff --git a/window/wwiomux.c b/window/wwiomux.c
new file mode 100644 (file)
index 0000000..4bcc559
--- /dev/null
@@ -0,0 +1,209 @@
+/*     $NetBSD: wwiomux.c,v 1.6 1997/11/21 08:37:30 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwiomux.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwiomux.c,v 1.6 1997/11/21 08:37:30 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#if !defined(OLD_TTY) && !defined(TIOCPKT_DATA)
+#include <sys/ioctl.h>
+#endif
+#include <sys/time.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include "ww.h"
+
+/*
+ * Multiple window output handler.
+ * The idea is to copy window outputs to the terminal, via the
+ * display package.  We try to give wwcurwin highest priority.
+ * The only return conditions are when there is keyboard input
+ * and when a child process dies.
+ * When there's nothing to do, we sleep in a select().
+ * The history of this routine is interesting.
+ */
+void
+wwiomux()
+{
+       struct ww *w;
+       fd_set imask;
+       volatile int n;
+       char *p;
+       char c;
+       struct timeval tv;
+       char noblock = 0;
+
+       for (;;) {
+               if (wwinterrupt()) {
+                       wwclrintr();
+                       return;
+               }
+
+               FD_ZERO(&imask);
+               n = -1;
+               for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) {
+                       if (w->ww_pty < 0)
+                               continue;
+                       if (w->ww_obq < w->ww_obe) {
+                               if (w->ww_pty > n)
+                                       n = w->ww_pty + 1;
+                               FD_SET(w->ww_pty, &imask);
+                       }
+                       if (w->ww_obq > w->ww_obp &&
+                           !ISSET(w->ww_pflags, WWP_STOPPED))
+                               noblock = 1;
+               }
+               if (wwibq < wwibe) {
+                       if (0 > n)
+                               n = 0 + 1;
+                       FD_SET(0, &imask);
+               }
+
+               if (!noblock) {
+                       if (wwcurwin != 0)
+                               wwcurtowin(wwcurwin);
+                       wwupdate();
+                       wwflush();
+                       (void) setjmp(wwjmpbuf);
+                       wwsetjmp = 1;
+                       if (wwinterrupt()) {
+                               wwsetjmp = 0;
+                               wwclrintr();
+                               return;
+                       }
+                       /* XXXX */
+                       tv.tv_sec = 30;
+                       tv.tv_usec = 0;
+               } else {
+                       tv.tv_sec = 0;
+                       tv.tv_usec = 10000;
+               }
+               wwnselect++;
+               n = select(n + 1, &imask, (fd_set *)0, (fd_set *)0, &tv);
+               wwsetjmp = 0;
+               noblock = 0;
+
+               if (n < 0)
+                       wwnselecte++;
+               else if (n == 0)
+                       wwnselectz++;
+               else {
+                       if (FD_ISSET(0, &imask))
+                               wwrint();
+                       for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) {
+                               if (w->ww_pty < 0 ||
+                                   !FD_ISSET(w->ww_pty, &imask))
+                                       continue;
+                               wwnwread++;
+                               p = w->ww_obq;
+                               if (w->ww_type == WWT_PTY) {
+                                       if (p == w->ww_ob) {
+                                               w->ww_obp++;
+                                               w->ww_obq++;
+                                       } else
+                                               p--;
+                                       c = *p;
+                               }
+                               n = read(w->ww_pty, p, w->ww_obe - p);
+                               if (n < 0) {
+                                       wwnwreade++;
+                                       (void) close(w->ww_pty);
+                                       w->ww_pty = -1;
+                               } else if (n == 0) {
+                                       wwnwreadz++;
+                                       (void) close(w->ww_pty);
+                                       w->ww_pty = -1;
+                               } else if (w->ww_type != WWT_PTY) {
+                                       wwnwreadd++;
+                                       wwnwreadc += n;
+                                       w->ww_obq += n;
+                               } else if (*p == TIOCPKT_DATA) {
+                                       n--;
+                                       wwnwreadd++;
+                                       wwnwreadc += n;
+                                       w->ww_obq += n;
+                               } else {
+                                       wwnwreadp++;
+                                       if (*p & TIOCPKT_STOP)
+                                               SET(w->ww_pflags, WWP_STOPPED);
+                                       if (*p & TIOCPKT_START)
+                                               CLR(w->ww_pflags, WWP_STOPPED);
+                                       if (*p & TIOCPKT_FLUSHWRITE) {
+                                               CLR(w->ww_pflags, WWP_STOPPED);
+                                               w->ww_obq = w->ww_obp =
+                                                       w->ww_ob;
+                                       }
+                               }
+                       }
+               }
+               /*
+                * Try the current window first, if there is output
+                * then process it and go back to the top to try again.
+                * This can lead to starvation of the other windows,
+                * but presumably that what we want.
+                * Update will eventually happen when output from wwcurwin
+                * dies down.
+                */
+               if ((w = wwcurwin) != 0 && w->ww_pty >= 0 &&
+                   w->ww_obq > w->ww_obp &&
+                   !ISSET(w->ww_pflags, WWP_STOPPED)) {
+                       n = wwwrite(w, w->ww_obp, w->ww_obq - w->ww_obp);
+                       if ((w->ww_obp += n) == w->ww_obq)
+                               w->ww_obq = w->ww_obp = w->ww_ob;
+                       noblock = 1;
+                       continue;
+               }
+               for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw)
+                       if (w->ww_pty >= 0 && w->ww_obq > w->ww_obp &&
+                           !ISSET(w->ww_pflags, WWP_STOPPED)) {
+                               n = wwwrite(w, w->ww_obp,
+                                       w->ww_obq - w->ww_obp);
+                               if ((w->ww_obp += n) == w->ww_obq)
+                                       w->ww_obq = w->ww_obp = w->ww_ob;
+                               if (wwinterrupt())
+                                       break;
+                       }
+       }
+}
diff --git a/window/wwlabel.c b/window/wwlabel.c
new file mode 100644 (file)
index 0000000..345a0f0
--- /dev/null
@@ -0,0 +1,106 @@
+/*     $NetBSD: wwlabel.c,v 1.5 1997/11/21 08:37:32 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwlabel.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwlabel.c,v 1.5 1997/11/21 08:37:32 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "char.h"
+
+/*
+ * Label window w on f,
+ * at 1 line above w and 'where' columns from it's left edge.
+ * Gross, but it works.
+ */
+void
+wwlabel(w, f, where, l, mode)
+       struct ww *w;
+       struct ww *f;
+       int where;
+       char *l;
+       int mode;
+{
+       int row;
+       int j;
+       int jj;
+       char *win;
+       union ww_char *buf;
+       union ww_char *ns;
+       char *fmap;
+       unsigned char *smap;
+       char touched;
+       char *p;
+
+       if (f->ww_fmap == 0)
+               return;
+
+       row = w->ww_w.t - 1;
+       if (row < f->ww_i.t || row >= f->ww_i.b)
+               return;
+       win = f->ww_win[row];
+       buf = f->ww_buf[row];
+       fmap = f->ww_fmap[row];
+       ns = wwns[row];
+       smap = wwsmap[row];
+       touched = wwtouched[row];
+       mode <<= WWC_MSHIFT;
+
+       jj = MIN(w->ww_i.r, f->ww_i.r);
+       j = w->ww_i.l + where;
+       while (j < jj && *l)
+               for (p = unctrl(*l++); j < jj && *p; j++, p++) {
+                       /* can't label if not already framed */
+                       if (win[j] & WWM_GLS)
+                               continue;
+                       if (smap[j] != f->ww_index)
+                               buf[j].c_w = mode | *p;
+                       else {
+                               ns[j].c_w = (buf[j].c_w = mode | *p)
+                                               ^ win[j] << WWC_MSHIFT;
+                               touched |= WWU_TOUCHED;
+                       }
+                       fmap[j] |= WWF_LABEL;
+               }
+       wwtouched[row] = touched;
+}
diff --git a/window/wwmisc.c b/window/wwmisc.c
new file mode 100644 (file)
index 0000000..cd74614
--- /dev/null
@@ -0,0 +1,76 @@
+/*     $NetBSD: wwmisc.c,v 1.5 1997/11/21 08:37:34 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwmisc.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwmisc.c,v 1.5 1997/11/21 08:37:34 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+#include "char.h"
+
+/*
+ * Sufficient but not necessary test for total visibility.
+ */
+int
+wwvisible(w)
+       struct ww *w;
+{
+       int i;
+       int nvis = 0;
+
+       for (i = w->ww_i.t; i < w->ww_i.b; i++)
+               nvis += w->ww_nvis[i];
+       if (ISSET(w->ww_wflags, WWW_HASCURSOR)
+           && w->ww_cur.r >= w->ww_i.t && w->ww_cur.r < w->ww_i.b
+           && w->ww_cur.c >= w->ww_i.l && w->ww_cur.c < w->ww_i.r
+           && wwsmap[w->ww_cur.r][w->ww_cur.c] == w->ww_index)
+               nvis++;
+       return nvis == w->ww_i.nr * w->ww_i.nc;
+}
+
+void
+wwbell()
+{
+       ttputc(ctrl('g'));
+}
diff --git a/window/wwmove.c b/window/wwmove.c
new file mode 100644 (file)
index 0000000..23a5566
--- /dev/null
@@ -0,0 +1,107 @@
+/*     $NetBSD: wwmove.c,v 1.5 1997/11/21 08:37:35 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwmove.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwmove.c,v 1.5 1997/11/21 08:37:35 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+/*
+ * Move a window.  Should be unattached.
+ */
+void
+wwmove(w, row, col)
+       struct ww *w;
+       int row, col;
+{
+       int dr, dc;
+       int i;
+
+       dr = row - w->ww_w.t;
+       dc = col - w->ww_w.l;
+
+       w->ww_w.t += dr;
+       w->ww_w.b += dr;
+       w->ww_w.l += dc;
+       w->ww_w.r += dc;
+
+       w->ww_b.t += dr;
+       w->ww_b.b += dr;
+       w->ww_b.l += dc;
+       w->ww_b.r += dc;
+
+       w->ww_i.t = MAX(w->ww_w.t, 0);
+       w->ww_i.b = MIN(w->ww_w.b, wwnrow);
+       w->ww_i.nr = w->ww_i.b - w->ww_i.t;
+       w->ww_i.l = MAX(w->ww_w.l, 0);
+       w->ww_i.r = MIN(w->ww_w.r, wwncol);
+       w->ww_i.nc = w->ww_i.r - w->ww_i.l;
+
+       w->ww_cur.r += dr;
+       w->ww_cur.c += dc;
+
+       w->ww_win -= dr;
+       for (i = w->ww_w.t; i < w->ww_w.b; i++)
+               w->ww_win[i] -= dc;
+       if (w->ww_fmap != 0) {
+               w->ww_fmap -= dr;
+               for (i = w->ww_w.t; i < w->ww_w.b; i++)
+                       w->ww_fmap[i] -= dc;
+       }
+       w->ww_nvis -= dr;
+       for (i = w->ww_i.t; i < w->ww_i.b; i++) {
+               int j = w->ww_i.l;
+               char *win = &w->ww_win[i][j];
+               unsigned char *smap = &wwsmap[i][j];
+               int nvis = 0;
+
+               for (; j < w->ww_i.r; j++, win++, smap++)
+                       if (*win == 0 && *smap == w->ww_index)
+                               nvis++;
+               w->ww_nvis[i] = nvis;
+       }
+       w->ww_buf -= dr;
+       for (i = w->ww_b.t; i < w->ww_b.b; i++)
+               w->ww_buf[i] -= dc;
+}
diff --git a/window/wwopen.c b/window/wwopen.c
new file mode 100644 (file)
index 0000000..9753cde
--- /dev/null
@@ -0,0 +1,206 @@
+/*     $NetBSD: wwopen.c,v 1.9 1998/08/25 20:59:43 ross Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwopen.c   8.2 (Berkeley) 4/28/95";
+#else
+__RCSID("$NetBSD: wwopen.c,v 1.9 1998/08/25 20:59:43 ross Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "ww.h"
+
+struct ww *
+wwopen(type, oflags, nrow, ncol, row, col, nline)
+       int type, oflags, nrow, ncol, row, col, nline;
+{
+       struct ww *w;
+       int i, j;
+       char m;
+       short nvis;
+
+       w = (struct ww *)calloc(sizeof (struct ww), 1);
+       if (w == 0) {
+               wwerrno = WWE_NOMEM;
+               goto bad;
+       }
+       w->ww_pty = -1;
+       w->ww_socket = -1;
+
+       for (i = 0; i < NWW && wwindex[i] != 0; i++)
+               ;
+       if (i >= NWW) {
+               wwerrno = WWE_TOOMANY;
+               goto bad;
+       }
+       w->ww_index = i;
+
+       if (nline < nrow)
+               nline = nrow;
+
+       w->ww_w.t = row;
+       w->ww_w.b = row + nrow;
+       w->ww_w.l = col;
+       w->ww_w.r = col + ncol;
+       w->ww_w.nr = nrow;
+       w->ww_w.nc = ncol;
+
+       w->ww_b.t = row;
+       w->ww_b.b = row + nline;
+       w->ww_b.l = col;
+       w->ww_b.r = col + ncol;
+       w->ww_b.nr = nline;
+       w->ww_b.nc = ncol;
+
+       w->ww_i.t = MAX(w->ww_w.t, 0);
+       w->ww_i.b = MIN(w->ww_w.b, wwnrow);
+       w->ww_i.l = MAX(w->ww_w.l, 0);
+       w->ww_i.r = MIN(w->ww_w.r, wwncol);
+       w->ww_i.nr = w->ww_i.b - w->ww_i.t;
+       w->ww_i.nc = w->ww_i.r - w->ww_i.l;
+
+       w->ww_cur.r = w->ww_w.t;
+       w->ww_cur.c = w->ww_w.l;
+
+       w->ww_type = type;
+       switch (type) {
+       case WWT_PTY:
+               if (wwgetpty(w) < 0)
+                       goto bad;
+               break;
+       case WWT_SOCKET:
+           {
+               int d[2];
+               if (socketpair(AF_LOCAL, SOCK_STREAM, PF_UNSPEC, d) < 0) {
+                       wwerrno = WWE_SYS;
+                       goto bad;
+               }
+               (void) fcntl(d[0], F_SETFD, 1);
+               (void) fcntl(d[1], F_SETFD, 1);
+               w->ww_pty = d[0];
+               w->ww_socket = d[1];
+               break;
+           }
+       }
+       if (type != WWT_INTERNAL) {
+               if ((w->ww_ob = malloc(512)) == 0) {
+                       wwerrno = WWE_NOMEM;
+                       goto bad;
+               }
+               w->ww_obe = w->ww_ob + 512;
+               w->ww_obp = w->ww_obq = w->ww_ob;
+               if (w->ww_pty >= wwdtablesize)
+                       wwdtablesize = w->ww_pty + 1;
+       }
+
+       w->ww_win = wwalloc(w->ww_w.t, w->ww_w.l,
+               w->ww_w.nr, w->ww_w.nc, sizeof (char));
+       if (w->ww_win == 0)
+               goto bad;
+       m = 0;
+       if (oflags & WWO_GLASS)
+               m |= WWM_GLS;
+       if (oflags & WWO_REVERSE) {
+               if (wwavailmodes & WWM_REV)
+                       m |= WWM_REV;
+               else    oflags &= ~WWO_REVERSE;
+       }
+       for (i = w->ww_w.t; i < w->ww_w.b; i++)
+               for (j = w->ww_w.l; j < w->ww_w.r; j++)
+                       w->ww_win[i][j] = m;
+
+       if (oflags & WWO_FRAME) {
+               w->ww_fmap = wwalloc(w->ww_w.t, w->ww_w.l,
+                       w->ww_w.nr, w->ww_w.nc, sizeof (char));
+               if (w->ww_fmap == 0)
+                       goto bad;
+               for (i = w->ww_w.t; i < w->ww_w.b; i++)
+                       for (j = w->ww_w.l; j < w->ww_w.r; j++)
+                               w->ww_fmap[i][j] = 0;
+       }
+
+       w->ww_buf = (union ww_char **)
+               wwalloc(w->ww_b.t, w->ww_b.l,
+                       w->ww_b.nr, w->ww_b.nc, sizeof (union ww_char));
+       if (w->ww_buf == 0)
+               goto bad;
+       for (i = w->ww_b.t; i < w->ww_b.b; i++)
+               for (j = w->ww_b.l; j < w->ww_b.r; j++)
+                       w->ww_buf[i][j].c_w = ' ';
+
+       w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short));
+       if (w->ww_nvis == 0) {
+               wwerrno = WWE_NOMEM;
+               goto bad;
+       }
+       w->ww_nvis -= w->ww_w.t;
+       nvis = m ? 0 : w->ww_w.nc;
+       for (i = w->ww_w.t; i < w->ww_w.b; i++)
+               w->ww_nvis[i] = nvis;
+
+       w->ww_state = WWS_INITIAL;
+       CLR(w->ww_oflags, WWO_ALLFLAGS);
+       SET(w->ww_oflags, oflags);
+       return wwindex[w->ww_index] = w;
+bad:
+       if (w != 0) {
+               if (w->ww_win != 0)
+                       wwfree(w->ww_win, w->ww_w.t);
+               if (w->ww_fmap != 0)
+                       wwfree(w->ww_fmap, w->ww_w.t);
+               if (w->ww_buf != 0)
+                       wwfree((char **)w->ww_buf, w->ww_b.t);
+               if (w->ww_nvis != 0)
+                       free((char *)(w->ww_nvis + w->ww_w.t));
+               if (w->ww_ob != 0)
+                       free(w->ww_ob);
+               if (w->ww_pty >= 0)
+                       (void) close(w->ww_pty);
+               if (w->ww_socket >= 0)
+                       (void) close(w->ww_socket);
+               free((char *)w);
+       }
+       return 0;
+}
diff --git a/window/wwprintf.c b/window/wwprintf.c
new file mode 100644 (file)
index 0000000..d93f1e5
--- /dev/null
@@ -0,0 +1,80 @@
+/*     $NetBSD: wwprintf.c,v 1.4 1997/11/21 08:37:38 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwprintf.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwprintf.c,v 1.4 1997/11/21 08:37:38 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+void
+#if __STDC__
+wwprintf(struct ww *w, const char *fmt, ...)
+#else
+wwprintf(w, fmt, va_alist)
+       struct ww *w;
+       char *fmt;
+       va_dcl
+#endif
+{
+       va_list ap;
+
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       (void) wwvprintf(w, fmt, ap);
+       va_end(ap);
+}
+
+void
+wwvprintf(w, fmt, ap)
+       struct ww *w;
+       const char *fmt;
+       va_list ap;
+{
+       char buf[1024];
+
+       (void) wwwrite(w, buf, vsnprintf(buf, sizeof(buf), fmt, ap));
+}
diff --git a/window/wwpty.c b/window/wwpty.c
new file mode 100644 (file)
index 0000000..1b60204
--- /dev/null
@@ -0,0 +1,97 @@
+/*     $NetBSD: wwpty.c,v 1.5 1997/11/21 08:49:12 mrg Exp $    */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwpty.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwpty.c,v 1.5 1997/11/21 08:49:12 mrg Exp $");
+#endif
+#endif /* not lint */
+
+#if !defined(OLD_TTY) && !defined(TIOCPKT)
+#include <sys/ioctl.h>
+#endif
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include "ww.h"
+
+int
+wwgetpty(w)
+       struct ww *w;
+{
+       char c, *p;
+       int tty;
+       int on = 1;
+#define PTY "/dev/XtyXX"
+#define _PT    5
+#define _PQRS  8
+#define _0_9   9
+
+       (void) strcpy(w->ww_ttyname, PTY);
+       for (c = 'p'; c <= 'u'; c++) {
+               w->ww_ttyname[_PT] = 'p';
+               w->ww_ttyname[_PQRS] = c;
+               w->ww_ttyname[_0_9] = '0';
+               if (access(w->ww_ttyname, 0) < 0)
+                       break;
+               for (p = "0123456789abcdef"; *p; p++) {
+                       w->ww_ttyname[_PT] = 'p';
+                       w->ww_ttyname[_0_9] = *p;
+                       if ((w->ww_pty = open(w->ww_ttyname, 2)) < 0)
+                               continue;
+                       w->ww_ttyname[_PT] = 't';
+                       if ((tty = open(w->ww_ttyname, 2)) < 0) {
+                               (void) close(w->ww_pty);
+                               continue;
+                       }
+                       (void) close(tty);
+                       if (ioctl(w->ww_pty, TIOCPKT, (char *)&on) < 0) {
+                               (void) close(w->ww_pty);
+                               continue;
+                       }
+                       (void) fcntl(w->ww_pty, F_SETFD, 1);
+                       return 0;
+               }
+       }
+       w->ww_pty = -1;
+       wwerrno = WWE_NOPTY;
+       return -1;
+}
diff --git a/window/wwputc.c b/window/wwputc.c
new file mode 100644 (file)
index 0000000..af7e578
--- /dev/null
@@ -0,0 +1,56 @@
+/*     $NetBSD: wwputc.c,v 1.4 1997/11/21 08:37:41 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwputc.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwputc.c,v 1.4 1997/11/21 08:37:41 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+void
+wwputc(c, w)
+       char c;
+       struct ww *w;
+{
+       (void) wwwrite(w, &c, sizeof c);
+}
diff --git a/window/wwputs.c b/window/wwputs.c
new file mode 100644 (file)
index 0000000..793e15e
--- /dev/null
@@ -0,0 +1,60 @@
+/*     $NetBSD: wwputs.c,v 1.4 1997/11/21 08:37:43 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwputs.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwputs.c,v 1.4 1997/11/21 08:37:43 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+void
+wwputs(s, w)
+       char *s;
+       struct ww *w;
+{
+       char *p = s;
+
+       while (*p++)
+               ;
+       (void) wwwrite(w, s, p - s - 1);
+}
diff --git a/window/wwredraw.c b/window/wwredraw.c
new file mode 100644 (file)
index 0000000..49bbc62
--- /dev/null
@@ -0,0 +1,65 @@
+/*     $NetBSD: wwredraw.c,v 1.4 1997/11/21 08:37:44 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwredraw.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwredraw.c,v 1.4 1997/11/21 08:37:44 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+#include "xx.h"
+
+void
+wwredraw()
+{
+       int i, j;
+       union ww_char *os;
+
+       xxclear();
+       for (i = 0; i < wwnrow; i++) {
+               wwtouched[i] = WWU_TOUCHED;
+               os = wwos[i];
+               for (j = wwncol; --j >= 0;)
+                       (os++)->c_w = ' ';
+       }
+}
diff --git a/window/wwredrawwin.c b/window/wwredrawwin.c
new file mode 100644 (file)
index 0000000..7ed8d92
--- /dev/null
@@ -0,0 +1,81 @@
+/*     $NetBSD: wwredrawwin.c,v 1.5 1997/11/21 08:37:45 lukem Exp $    */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwredrawwin.c      8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwredrawwin.c,v 1.5 1997/11/21 08:37:45 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+void
+wwredrawwin1(w, row1, row2, offset)
+       struct ww *w;
+       int row1, row2, offset;
+{
+       int row;
+       int col;
+       unsigned char *smap;
+       union ww_char *buf;
+       char *win;
+       union ww_char *ns;
+       int x;
+       int nchanged;
+
+       for (row = row1; row < row2; row++) {
+               col = w->ww_i.l;
+               ns = wwns[row];
+               smap = &wwsmap[row][col];
+               buf = w->ww_buf[row + offset];
+               win = w->ww_win[row];
+               nchanged = 0;
+               for (; col < w->ww_i.r; col++)
+                       if (*smap++ == w->ww_index &&
+                           ns[col].c_w !=
+                           (x = buf[col].c_w ^ win[col] << WWC_MSHIFT)) {
+                               nchanged++;
+                               ns[col].c_w = x;
+                       }
+               if (nchanged > 0)
+                       wwtouched[row] |= WWU_TOUCHED;
+       }
+}
diff --git a/window/wwrint.c b/window/wwrint.c
new file mode 100644 (file)
index 0000000..929dc4a
--- /dev/null
@@ -0,0 +1,87 @@
+/*     $NetBSD: wwrint.c,v 1.5 1997/11/21 08:37:47 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwrint.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwrint.c,v 1.5 1997/11/21 08:37:47 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <unistd.h>
+#include "ww.h"
+#include "tt.h"
+
+/*
+ * Tty input interrupt handler.
+ * (1) Read input into buffer (wwib*).
+ * (2) Set the interrupt flag if anything is read.
+ * Currently, the last is used to get out of the blocking
+ * select() in wwiomux().
+ * To avoid race conditions, we only modify wwibq in here, except
+ * when the buffer is empty; and everywhere else, we only change wwibp.
+ * It should be completely safe.
+ */
+void
+wwrint()
+{
+       int n;
+
+       wwnread++;
+       n = read(0, wwibq, wwibe - wwibq);
+       if (n > 0) {
+               if (tt.tt_rint)
+                       n = (*tt.tt_rint)(wwibq, n);
+               if (n > 0) {
+                       wwibq += n;
+                       wwnreadc += n;
+                       /*
+                        * Hasten or delay the next checkpoint,
+                        * as the case may be.
+                        */
+                       if (tt.tt_checkpoint && !wwdocheckpoint)
+                               (void) alarm(1);
+                       wwsetintr();
+               }
+       } else if (n == 0)
+               wwnreadz++;
+       else
+               wwnreade++;
+}
diff --git a/window/wwscroll.c b/window/wwscroll.c
new file mode 100644 (file)
index 0000000..0ac8342
--- /dev/null
@@ -0,0 +1,244 @@
+/*     $NetBSD: wwscroll.c,v 1.4 1997/11/21 08:37:48 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwscroll.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwscroll.c,v 1.4 1997/11/21 08:37:48 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+#include "xx.h"
+
+void
+wwscroll(w, n)
+       struct ww *w;
+       int n;
+{
+       int dir;
+       int top;
+
+       if (n == 0)
+               return;
+       dir = n < 0 ? -1 : 1;
+       top = w->ww_b.t - n;
+       if (top > w->ww_w.t)
+               top = w->ww_w.t;
+       else if (top + w->ww_b.nr < w->ww_w.b)
+               top = w->ww_w.b - w->ww_b.nr;
+       n = abs(top - w->ww_b.t);
+       if (n < w->ww_i.nr) {
+               while (--n >= 0) {
+                       (void) wwscroll1(w, w->ww_i.t, w->ww_i.b, dir, 0);
+                       w->ww_buf += dir;
+                       w->ww_b.t -= dir;
+                       w->ww_b.b -= dir;
+               }
+       } else {
+               w->ww_buf -= top - w->ww_b.t;
+               w->ww_b.t = top;
+               w->ww_b.b = top + w->ww_b.nr;
+               wwredrawwin(w);
+       }
+}
+
+/*
+ * Scroll one line, between 'row1' and 'row2', in direction 'dir'.
+ * Don't adjust ww_scroll.
+ * And don't redraw 'leaveit' lines.
+ */
+int
+wwscroll1(w, row1, row2, dir, leaveit)
+       struct ww *w;
+       int row1, row2, dir;
+       int leaveit;
+{
+       int i;
+       int row1x, row2x;
+       int nvis;
+       int nvismax;
+       int scrolled = 0;
+
+       /*
+        * See how many lines on the screen are affected.
+        * And calculate row1x, row2x, and left at the same time.
+        */
+       for (i = row1; i < row2 && w->ww_nvis[i] == 0; i++)
+               ;
+       if (i >= row2)                  /* can't do any fancy stuff */
+               goto out;
+       row1x = i;
+       for (i = row2 - 1; i >= row1 && w->ww_nvis[i] == 0; i--)
+               ;
+       if (i <= row1x)
+               goto out;               /* just one line is easy */
+       row2x = i + 1;
+
+       /*
+        * See how much of this window is visible.
+        */
+       nvismax = wwncol * (row2x - row1x);
+       nvis = 0;
+       for (i = row1x; i < row2x; i++)
+               nvis += w->ww_nvis[i];
+
+       /*
+        * If it's a good idea to scroll and the terminal can, then do it.
+        */
+       if (nvis < nvismax / 2)
+               goto no_scroll;         /* not worth it */
+       if ((dir > 0 ? tt.tt_scroll_down == 0 : tt.tt_scroll_up == 0) ||
+           ((tt.tt_scroll_top != row1x || tt.tt_scroll_bot != row2x - 1) &&
+           tt.tt_setscroll == 0))
+               if (tt.tt_delline == 0 || tt.tt_insline == 0)
+                       goto no_scroll;
+       xxscroll(dir, row1x, row2x);
+       scrolled = 1;
+       /*
+        * Fix up the old screen.
+        */
+       {
+               union ww_char *tmp;
+               union ww_char **cpp, **cqq;
+
+               if (dir > 0) {
+                       cpp = &wwos[row1x];
+                       cqq = cpp + 1;
+                       tmp = *cpp;
+                       for (i = row2x - row1x; --i > 0;)
+                               *cpp++ = *cqq++;
+                       *cpp = tmp;
+               } else {
+                       cpp = &wwos[row2x];
+                       cqq = cpp - 1;
+                       tmp = *cqq;
+                       for (i = row2x - row1x; --i > 0;)
+                               *--cpp = *--cqq;
+                       *cqq = tmp;
+               }
+               for (i = wwncol; --i >= 0;)
+                       tmp++->c_w = ' ';
+       }
+
+no_scroll:
+       /*
+        * Fix the new screen.
+        */
+       if (nvis == nvismax) {
+               /*
+                * Can shift whole lines.
+                */
+               if (dir > 0) {
+                       {
+                               union ww_char *tmp;
+                               union ww_char **cpp, **cqq;
+
+                               cpp = &wwns[row1x];
+                               cqq = cpp + 1;
+                               tmp = *cpp;
+                               for (i = row2x - row1x; --i > 0;)
+                                       *cpp++ = *cqq++;
+                               *cpp = tmp;
+                       }
+                       if (scrolled) {
+                               char *p, *q;
+
+                               p = &wwtouched[row1x];
+                               q = p + 1;
+                               for (i = row2x - row1x; --i > 0;)
+                                       *p++ = *q++;
+                               *p |= WWU_TOUCHED;
+                       } else {
+                               char *p;
+
+                               p = &wwtouched[row1x];
+                               for (i = row2x - row1x; --i >= 0;)
+                                       *p++ |= WWU_TOUCHED;
+                       }
+                       wwredrawwin1(w, row1, row1x, dir);
+                       wwredrawwin1(w, row2x - 1, row2 - leaveit, dir);
+               } else {
+                       {
+                               union ww_char *tmp;
+                               union ww_char **cpp, **cqq;
+
+                               cpp = &wwns[row2x];
+                               cqq = cpp - 1;
+                               tmp = *cqq;
+                               for (i = row2x - row1x; --i > 0;)
+                                       *--cpp = *--cqq;
+                               *cqq = tmp;
+                       }
+                       if (scrolled) {
+                               char *p, *q;
+
+                               p = &wwtouched[row2x];
+                               q = p - 1;
+                               for (i = row2x - row1x; --i > 0;)
+                                       *--p = *--q;
+                               *q |= WWU_TOUCHED;
+                       } else {
+                               char *p;
+
+                               p = &wwtouched[row1x];
+                               for (i = row2x - row1x; --i >= 0;)
+                                       *p++ |= WWU_TOUCHED;
+                       }
+                       wwredrawwin1(w, row1 + leaveit, row1x + 1, dir);
+                       wwredrawwin1(w, row2x, row2, dir);
+               }
+       } else {
+               if (scrolled) {
+                       char *p;
+
+                       p = &wwtouched[row1x];
+                       for (i = row2x - row1x; --i >= 0;)
+                               *p++ |= WWU_TOUCHED;
+               }
+out:
+               if (dir > 0)
+                       wwredrawwin1(w, row1, row2 - leaveit, dir);
+               else
+                       wwredrawwin1(w, row1 + leaveit, row2, dir);
+       }
+       return scrolled;
+}
diff --git a/window/wwsize.c b/window/wwsize.c
new file mode 100644 (file)
index 0000000..1b146d7
--- /dev/null
@@ -0,0 +1,201 @@
+/*     $NetBSD: wwsize.c,v 1.6 1997/11/21 08:37:49 lukem Exp $ */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwsize.c   8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwsize.c,v 1.6 1997/11/21 08:37:49 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#include "ww.h"
+
+/*
+ * Resize a window.  Should be unattached.
+ */
+int
+wwsize(w, nrow, ncol)
+       struct ww *w;
+       int nrow, ncol;
+{
+       int i, j;
+       int nline = 0;
+       union ww_char **buf = 0;
+       char **win = 0;
+       short *nvis = 0;
+       char **fmap = 0;
+       char m;
+
+       /*
+        * First allocate new buffers.
+        */
+       win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
+       if (win == 0)
+               goto bad;
+       if (w->ww_fmap != 0) {
+               fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
+               if (fmap == 0)
+                       goto bad;
+       }
+       if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) {
+               nline = MAX(w->ww_b.nr, nrow);
+               buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l,
+                       nline, ncol, sizeof (union ww_char));
+               if (buf == 0)
+                       goto bad;
+       }
+       nvis = (short *)malloc((unsigned) nrow * sizeof (short));
+       if (nvis == 0) {
+               wwerrno = WWE_NOMEM;
+               goto bad;
+       }
+       nvis -= w->ww_w.t;
+       /*
+        * Copy text buffer.
+        */
+       if (buf != 0) {
+               int b, r;
+
+               b = w->ww_b.t + nline;
+               r = w->ww_b.l + ncol;
+               if (ncol < w->ww_b.nc)
+                       for (i = w->ww_b.t; i < w->ww_b.b; i++)
+                               for (j = w->ww_b.l; j < r; j++)
+                                       buf[i][j] = w->ww_buf[i][j];
+               else
+                       for (i = w->ww_b.t; i < w->ww_b.b; i++) {
+                               for (j = w->ww_b.l; j < w->ww_b.r; j++)
+                                       buf[i][j] = w->ww_buf[i][j];
+                               for (; j < r; j++)
+                                       buf[i][j].c_w = ' ';
+                       }
+               for (; i < b; i++)
+                       for (j = w->ww_b.l; j < r; j++)
+                               buf[i][j].c_w = ' ';
+       }
+       /*
+        * Now free the old stuff.
+        */
+       wwfree((char **)w->ww_win, w->ww_w.t);
+       w->ww_win = win;
+       if (buf != 0) {
+               wwfree((char **)w->ww_buf, w->ww_b.t);
+               w->ww_buf = buf;
+       }
+       if (w->ww_fmap != 0) {
+               wwfree((char **)w->ww_fmap, w->ww_w.t);
+               w->ww_fmap = fmap;
+       }
+       free((char *)(w->ww_nvis + w->ww_w.t));
+       w->ww_nvis = nvis;
+       /*
+        * Set new sizes.
+        */
+               /* window */
+       w->ww_w.b = w->ww_w.t + nrow;
+       w->ww_w.r = w->ww_w.l + ncol;
+       w->ww_w.nr = nrow;
+       w->ww_w.nc = ncol;
+               /* text buffer */
+       if (buf != 0) {
+               w->ww_b.b = w->ww_b.t + nline;
+               w->ww_b.r = w->ww_b.l + ncol;
+               w->ww_b.nr = nline;
+               w->ww_b.nc = ncol;
+       }
+               /* scroll */
+       if ((i = w->ww_b.b - w->ww_w.b) < 0 ||
+           (i = w->ww_cur.r - w->ww_w.b + 1) > 0) {
+               w->ww_buf += i;
+               w->ww_b.t -= i;
+               w->ww_b.b -= i;
+               w->ww_cur.r -= i;
+       }
+               /* interior */
+       w->ww_i.b = MIN(w->ww_w.b, wwnrow);
+       w->ww_i.r = MIN(w->ww_w.r, wwncol);
+       w->ww_i.nr = w->ww_i.b - w->ww_i.t;
+       w->ww_i.nc = w->ww_i.r - w->ww_i.l;
+       /*
+        * Initialize new buffers.
+        */
+               /* window */
+       m = 0;
+       if (w->ww_oflags & WWO_GLASS)
+               m |= WWM_GLS;
+       if (w->ww_oflags & WWO_REVERSE)
+               m |= WWM_REV;
+       for (i = w->ww_w.t; i < w->ww_w.b; i++)
+               for (j = w->ww_w.l; j < w->ww_w.r; j++)
+                       w->ww_win[i][j] = m;
+               /* frame map */
+       if (fmap != 0)
+               for (i = w->ww_w.t; i < w->ww_w.b; i++)
+                       for (j = w->ww_w.l; j < w->ww_w.r; j++)
+                               w->ww_fmap[i][j] = 0;
+               /* visibility */
+       j = m ? 0 : w->ww_w.nc;
+       for (i = w->ww_w.t; i < w->ww_w.b; i++)
+               w->ww_nvis[i] = j;
+       /*
+        * Put cursor back.
+        */
+       if (ISSET(w->ww_wflags, WWW_HASCURSOR)) {
+               CLR(w->ww_wflags, WWW_HASCURSOR);
+               wwcursor(w, 1);
+       }
+       /*
+        * Fool with pty.
+        */
+       if (w->ww_type == WWT_PTY && w->ww_pty >= 0)
+               (void) wwsetttysize(w->ww_pty, nrow, ncol);
+       return 0;
+bad:
+       if (win != 0)
+               wwfree(win, w->ww_w.t);
+       if (fmap != 0)
+               wwfree(fmap, w->ww_w.t);
+       if (buf != 0)
+               wwfree((char **)buf, w->ww_b.t);
+       if (nvis != 0)
+               free((char *)(nvis + w->ww_w.t));
+       return -1;
+}
diff --git a/window/wwspawn.c b/window/wwspawn.c
new file mode 100644 (file)
index 0000000..2fd6382
--- /dev/null
@@ -0,0 +1,103 @@
+/*     $NetBSD: wwspawn.c,v 1.6 1998/04/17 15:56:14 cgd Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwspawn.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwspawn.c,v 1.6 1998/04/17 15:56:14 cgd Exp $");
+#endif
+#endif /* not lint */
+
+#include <signal.h>
+#include <unistd.h>
+#include "ww.h"
+
+/*
+ * There is a dead lock with vfork and closing of pseudo-ports.
+ * So we have to be sneaky about error reporting.
+ */
+int
+wwspawn(wp, file, argv)
+       struct ww *wp;
+       char *file;
+       char **argv;
+{
+       int pid;
+       int ret;
+       char erred = 0;
+       sigset_t sigset, osigset;
+
+#ifdef __GNUC__        /* XXX variable `erred ' might be clobbered by ... `vfork' */
+       (void)&erred;
+#endif
+
+       sigemptyset(&sigset);
+       sigaddset(&sigset, SIGCHLD);
+       sigprocmask(SIG_BLOCK, &sigset, &osigset);
+
+       switch (pid = vfork()) {
+       case -1:
+               wwerrno = WWE_SYS;
+               ret = -1;
+               break;
+       case 0:
+               if (wwenviron(wp) >= 0)
+                       execvp(file, argv);
+               erred = 1;
+               _exit(1);
+       default:
+               if (erred) {
+                       wwerrno = WWE_SYS;
+                       ret = -1;
+               } else {
+                       wp->ww_pid = pid;
+                       wp->ww_state = WWS_HASPROC;
+                       ret = pid;
+               }
+       }
+
+       sigprocmask(SIG_SETMASK, &osigset, (sigset_t *)0);
+
+       if (wp->ww_socket >= 0) {
+               (void) close(wp->ww_socket);
+               wp->ww_socket = -1;
+       }
+       return ret;
+}
diff --git a/window/wwsuspend.c b/window/wwsuspend.c
new file mode 100644 (file)
index 0000000..10518b5
--- /dev/null
@@ -0,0 +1,64 @@
+/*     $NetBSD: wwsuspend.c,v 1.4 1997/11/21 08:37:52 lukem Exp $      */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwsuspend.c        8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwsuspend.c,v 1.4 1997/11/21 08:37:52 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <signal.h>
+#include "ww.h"
+#include "tt.h"
+
+void
+wwsuspend()
+{
+       sig_t oldsig;
+
+       oldsig = signal(SIGTSTP, SIG_IGN);
+       wwend(0);
+       (void) signal(SIGTSTP, SIG_DFL);
+       (void) kill(0, SIGTSTP);
+       (void) signal(SIGTSTP, SIG_IGN);
+       wwstart();
+       (void) signal(SIGTSTP, oldsig);
+}
diff --git a/window/wwterminfo.c b/window/wwterminfo.c
new file mode 100644 (file)
index 0000000..10f9b37
--- /dev/null
@@ -0,0 +1,127 @@
+/*     $NetBSD: wwterminfo.c,v 1.3 1997/12/31 06:56:04 thorpej Exp $   */
+
+/*
+ * Copyright (c) 1982, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwterminfo.c       8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwterminfo.c,v 1.3 1997/12/31 06:56:04 thorpej Exp $");
+#endif
+#endif /* not lint */
+
+#ifdef TERMINFO
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <paths.h>
+#include <unistd.h>
+#include "local.h"
+#include "ww.h"
+
+/*
+ * Terminfo support
+ *
+ * Written by Brian Buhrow
+ *
+ * Subsequently modified by Edward Wang
+ */
+
+/*
+ * Initialize the working terminfo directory
+ */
+int
+wwterminfoinit()
+{
+       FILE *fp;
+       char buf[2048];
+
+               /* make the directory */
+       (void) sprintf(wwterminfopath, "%swwinXXXXXX", _PATH_TMP);
+       mktemp(wwterminfopath);
+       if (mkdir(wwterminfopath, 0755) < 0 ||
+           chmod(wwterminfopath, 00755) < 0) {
+               wwerrno = WWE_SYS;
+               return -1;
+       }
+       (void) setenv("TERMINFO", wwterminfopath, 1);
+               /* make a termcap entry and turn it into terminfo */
+       (void) sprintf(buf, "%s/cap", wwterminfopath);
+       if ((fp = fopen(buf, "w")) == NULL) {
+               wwerrno = WWE_SYS;
+               return -1;
+       }
+       (void) fprintf(fp, "%sco#%d:li#%d:%s\n",
+               WWT_TERMCAP, wwncol, wwnrow, wwwintermcap);
+       (void) fclose(fp);
+       (void) sprintf(buf,
+               "cd %s; %s cap >info 2>/dev/null; %s info >/dev/null 2>&1",
+               wwterminfopath, _PATH_CAPTOINFO, _PATH_TIC);
+       (void) system(buf);
+       return 0;
+}
+
+/*
+ * Delete the working terminfo directory at shutdown
+ */
+int
+wwterminfoend()
+{
+       int pstat;
+       pid_t pid;
+
+       pid = vfork();
+       switch (pid) {
+       case -1:
+               /* can't really do (or say) anything about errors */
+               return -1;
+       case 0:
+               execl(_PATH_RM, _PATH_RM, "-rf", wwterminfopath, 0);
+               _exit(1);
+       }
+       pid = waitpid(pid, &pstat, 0);
+       if (pid == -1 || !WIFEXITED(pstat) || WEXITSTATUS(pstat) != 0)
+               return -1;
+       return 0;
+}
+
+#endif /* TERMINFO */
diff --git a/window/wwtty.c b/window/wwtty.c
new file mode 100644 (file)
index 0000000..946b423
--- /dev/null
@@ -0,0 +1,195 @@
+/*     $NetBSD: wwtty.c,v 1.5 1997/11/21 08:37:56 lukem Exp $  */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwtty.c    8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwtty.c,v 1.5 1997/11/21 08:37:56 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#if !defined(OLD_TTY) && !defined(TIOCGWINSZ)
+#include <sys/ioctl.h>
+#endif
+#include <fcntl.h>
+#include "ww.h"
+
+int
+wwgettty(d, t)
+       int d;
+       struct ww_tty *t;
+{
+#ifdef OLD_TTY
+       if (ioctl(d, TIOCGETP, (char *)&t->ww_sgttyb) < 0)
+               goto bad;
+       if (ioctl(d, TIOCGETC, (char *)&t->ww_tchars) < 0)
+               goto bad;
+       if (ioctl(d, TIOCGLTC, (char *)&t->ww_ltchars) < 0)
+               goto bad;
+       if (ioctl(d, TIOCLGET, (char *)&t->ww_lmode) < 0)
+               goto bad;
+       if (ioctl(d, TIOCGETD, (char *)&t->ww_ldisc) < 0)
+               goto bad;
+#else
+       if (tcgetattr(d, &t->ww_termios) < 0)
+               goto bad;
+#endif
+       return 0;
+bad:
+       wwerrno = WWE_SYS;
+       return -1;
+}
+
+/*
+ * Set the modes of tty 'd' to 't'
+ * 'o' is the current modes.  We set the line discipline only if
+ * it changes, to avoid unnecessary flushing of typeahead.
+ */
+int
+wwsettty(d, t)
+       int d;
+       struct ww_tty *t;
+{
+#ifdef OLD_TTY
+       int i;
+
+       /* XXX, for buggy tty drivers that don't wait for output to drain */
+       while (ioctl(d, TIOCOUTQ, &i) >= 0 && i > 0)
+               usleep(100000);
+       if (ioctl(d, TIOCSETN, (char *)&t->ww_sgttyb) < 0)
+               goto bad;
+       if (ioctl(d, TIOCSETC, (char *)&t->ww_tchars) < 0)
+               goto bad;
+       if (ioctl(d, TIOCSLTC, (char *)&t->ww_ltchars) < 0)
+               goto bad;
+       if (ioctl(d, TIOCLSET, (char *)&t->ww_lmode) < 0)
+               goto bad;
+       if (ioctl(d, TIOCGETD, (char *)&i) < 0)
+               goto bad;
+       if (t->ww_ldisc != i &&
+           ioctl(d, TIOCSETD, (char *)&t->ww_ldisc) < 0)
+               goto bad;
+#else
+#ifdef sun
+       /* XXX, for buggy tty drivers that don't wait for output to drain */
+       (void) tcdrain(d);
+#endif
+       if (tcsetattr(d, TCSADRAIN, &t->ww_termios) < 0)
+               goto bad;
+#endif
+       return 0;
+bad:
+       wwerrno = WWE_SYS;
+       return -1;
+}
+
+/*
+ * The ttysize and stop-start routines must also work
+ * on the control side of pseudoterminals.
+ */
+
+int
+wwgetttysize(d, r, c)
+       int d;
+       int *r, *c;
+{
+       struct winsize winsize;
+
+       if (ioctl(d, TIOCGWINSZ, (char *)&winsize) < 0) {
+               wwerrno = WWE_SYS;
+               return -1;
+       }
+       if (winsize.ws_row != 0)
+               *r = winsize.ws_row;
+       if (winsize.ws_col != 0)
+               *c = winsize.ws_col;
+       return 0;
+}
+
+int
+wwsetttysize(d, r, c)
+       int d, r, c;
+{
+       struct winsize winsize;
+
+       winsize.ws_row = r;
+       winsize.ws_col = c;
+       winsize.ws_xpixel = winsize.ws_ypixel = 0;
+       if (ioctl(d, TIOCSWINSZ, (char *)&winsize) < 0) {
+               wwerrno = WWE_SYS;
+               return -1;
+       }
+       return 0;
+}
+
+int
+wwstoptty(d)
+       int d;
+{
+#if !defined(OLD_TTY) && defined(TCOOFF)
+       /* not guaranteed to work on the pty side */
+       if (tcflow(d, TCOOFF) < 0)
+#else
+       if (ioctl(d, TIOCSTOP, (char *)0) < 0)
+#endif
+       {
+               wwerrno = WWE_SYS;
+               return -1;
+       }
+       return 0;
+}
+
+int
+wwstarttty(d)
+       int d;
+{
+#if !defined(OLD_TTY) && defined(TCOON)
+       /* not guaranteed to work on the pty side */
+       if (tcflow(d, TCOON) < 0)
+#else
+       if (ioctl(d, TIOCSTART, (char *)0) < 0)
+#endif
+       {
+               wwerrno = WWE_SYS;
+               return -1;
+       }
+       return 0;
+}
diff --git a/window/wwunframe.c b/window/wwunframe.c
new file mode 100644 (file)
index 0000000..f50de75
--- /dev/null
@@ -0,0 +1,84 @@
+/*     $NetBSD: wwunframe.c,v 1.5 1997/11/21 08:37:58 lukem Exp $      */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwunframe.c        8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwunframe.c,v 1.5 1997/11/21 08:37:58 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+
+void
+wwunframe(w)
+       struct ww *w;
+{
+       int i;
+
+       for (i = w->ww_i.t; i < w->ww_i.b; i++) {
+               int j;
+               char *win = w->ww_win[i];
+               char *fmap = w->ww_fmap ? w->ww_fmap[i] : 0;
+               unsigned char *smap = wwsmap[i];
+               union ww_char *ns = wwns[i];
+               int nchanged = 0;
+
+               for (j = w->ww_i.l; j < w->ww_i.r; j++) {
+                       if (win[j] & WWM_GLS)
+                               continue;
+                       win[j] |= WWM_GLS;
+                       if (fmap != 0)
+                               fmap[j] = 0;
+                       if (smap[j] == w->ww_index) {
+                               smap[j] = WWX_NOBODY;
+                               ns[j].c_w = ' ';
+                               nchanged++;
+                       }
+               }
+               if (nchanged > 0)
+                       wwtouched[i] |= WWU_TOUCHED;
+               w->ww_nvis[i] = 0;
+       }
+
+       if (w->ww_forw != &wwhead)
+               wwdelete1(w->ww_forw,
+                       w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r);
+}
diff --git a/window/wwupdate.c b/window/wwupdate.c
new file mode 100644 (file)
index 0000000..a1dbe7a
--- /dev/null
@@ -0,0 +1,281 @@
+/*     $NetBSD: wwupdate.c,v 1.4 1997/11/21 08:37:59 lukem Exp $       */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwupdate.c 8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwupdate.c,v 1.4 1997/11/21 08:37:59 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+#include "xx.h"
+
+void
+wwupdate1(top, bot)
+       int top, bot;
+{
+       int i;
+       int j;
+       char *touched;
+       struct ww_update *upd;
+       char check_clreos = 0;
+       int scan_top, scan_bot;
+
+       wwnupdate++;
+       {
+               char *t1 = wwtouched + top, *t2 = wwtouched + bot;
+               int n;
+
+               while (!*t1++)
+                       if (t1 == t2)
+                               return;
+               while (!*--t2)
+                       ;
+               scan_top = top = t1 - wwtouched - 1;
+               scan_bot = bot = t2 - wwtouched + 1;
+               if (scan_bot - scan_top > 1 &&
+                   (tt.tt_clreos != 0 || tt.tt_clear != 0)) {
+                       int st = tt.tt_clreos != 0 ? scan_top : 0;
+
+                       /*
+                        * t1 is one past the first touched row,
+                        * t2 is on the last touched row.
+                        */
+                       for (t1--, n = 1; t1 < t2;)
+                               if (*t1++)
+                                       n++;
+                       /*
+                        * If we can't clreos then we try for clearing
+                        * the whole screen.
+                        */
+                       if ((check_clreos = n * 10 > (wwnrow - st) * 9)) {
+                               scan_top = st;
+                               scan_bot = wwnrow;
+                       }
+               }
+       }
+       if (tt.tt_clreol == 0 && !check_clreos)
+               goto simple;
+       for (i = scan_top, touched = &wwtouched[i], upd = &wwupd[i];
+            i < scan_bot;
+            i++, touched++, upd++) {
+               int gain = 0;
+               int best_gain = 0;
+               int best_col = 0;
+               union ww_char *ns, *os;
+
+               if (wwinterrupt())
+                       return;
+               if (!check_clreos && !*touched)
+                       continue;
+               wwnupdscan++;
+               j = wwncol;
+               ns = &wwns[i][j];
+               os = &wwos[i][j];
+               while (--j >= 0) {
+                       /*
+                        * The cost of clearing is:
+                        *      ncol - nblank + X
+                        * The cost of straight update is, more or less:
+                        *      ncol - nsame
+                        * We clear if  nblank - nsame > X
+                        * X is the clreol overhead.
+                        * So we make gain = nblank - nsame.
+                        */
+                       if ((--ns)->c_w == (--os)->c_w)
+                               gain--;
+                       else
+                               best_gain--;
+                       if (ns->c_w == ' ')
+                               gain++;
+                       if (gain > best_gain) {
+                               best_col = j;
+                               best_gain = gain;
+                       }
+               }
+               upd->best_gain = best_gain;
+               upd->best_col = best_col;
+               upd->gain = gain;
+       }
+       if (check_clreos) {
+               struct ww_update *u;
+               int gain = 0;
+               int best_gain = 0;
+               int best_row = 0;
+               int simple_gain = 0;
+               char didit = 0;
+
+               /*
+                * gain is the advantage of clearing all the lines.
+                * best_gain is the advantage of clearing to eos
+                * at best_row and u->best_col.
+                * simple_gain is the advantage of using only clreol.
+                * We use g > best_gain because u->best_col can be
+                * undefined when u->best_gain is 0 so we can't use it.
+                */
+               for (j = scan_bot - 1, u = wwupd + j; j >= top; j--, u--) {
+                       int g = gain + u->best_gain;
+
+                       if (g > best_gain) {
+                               best_gain = g;
+                               best_row = j;
+                       }
+                       gain += u->gain;
+                       if (tt.tt_clreol != 0 && u->best_gain > 4)
+                               simple_gain += u->best_gain - 4;
+               }
+               if (tt.tt_clreos == 0) {
+                       if (gain > simple_gain && gain > 4) {
+                               xxclear();
+                               i = top = scan_top;
+                               bot = scan_bot;
+                               j = 0;
+                               didit = 1;
+                       }
+               } else
+                       if (best_gain > simple_gain && best_gain > 4) {
+                               i = best_row;
+                               xxclreos(i, j = wwupd[i].best_col);
+                               bot = scan_bot;
+                               didit = 1;
+                       }
+               if (didit) {
+                       wwnupdclreos++;
+                       wwnupdclreosline += wwnrow - i;
+                       u = wwupd + i;
+                       while (i < scan_bot) {
+                               union ww_char *os = &wwos[i][j];
+
+                               for (j = wwncol - j; --j >= 0;)
+                                       os++->c_w = ' ';
+                               wwtouched[i++] |= WWU_TOUCHED;
+                               u++->best_gain = 0;
+                               j = 0;
+                       }
+               } else
+                       wwnupdclreosmiss++;
+       }
+simple:
+       for (i = top, touched = &wwtouched[i], upd = &wwupd[i]; i < bot;
+            i++, touched++, upd++) {
+               union ww_char *os, *ns;
+               char didit;
+
+               if (!*touched)
+                       continue;
+               *touched = 0;
+               wwnupdline++;
+               didit = 0;
+               if (tt.tt_clreol != 0 && upd->best_gain > 4) {
+                       wwnupdclreol++;
+                       xxclreol(i, j = upd->best_col);
+                       for (os = &wwos[i][j], j = wwncol - j; --j >= 0;)
+                               os++->c_w = ' ';
+                       didit = 1;
+               }
+               ns = wwns[i];
+               os = wwos[i];
+               for (j = 0; j < wwncol;) {
+                       char *p, *q;
+                       char m;
+                       int c;
+                       int n;
+                       char buf[512];                  /* > wwncol */
+                       union ww_char lastc;
+
+                       for (; j++ < wwncol && ns++->c_w == os++->c_w;)
+                               ;
+                       if (j > wwncol)
+                               break;
+                       p = buf;
+                       m = ns[-1].c_m;
+                       c = j - 1;
+                       os[-1] = ns[-1];
+                       *p++ = ns[-1].c_c;
+                       n = 5;
+                       q = p;
+                       while (j < wwncol && ns->c_m == m) {
+                               *p++ = ns->c_c;
+                               if (ns->c_w == os->c_w) {
+                                       if (--n <= 0)
+                                               break;
+                                       os++;
+                                       ns++;
+                               } else {
+                                       n = 5;
+                                       q = p;
+                                       lastc = *os;
+                                       *os++ = *ns++;
+                               }
+                               j++;
+                       }
+                       n = q - buf;
+                       if (!wwwrap || i != wwnrow - 1 || c + n != wwncol)
+                               xxwrite(i, c, buf, n, m);
+                       else if (tt.tt_inschar || tt.tt_insspace) {
+                               if (n > 1) {
+                                       q[-2] = q[-1];
+                                       n--;
+                               } else
+                                       c--;
+                               xxwrite(i, c, buf, n, m);
+                               c += n - 1;
+                               if (tt.tt_inschar)
+                                       xxinschar(i, c, ns[-2].c_c,
+                                               ns[-2].c_m);
+                               else {
+                                       xxinsspace(i, c);
+                                       xxwrite(i, c, &ns[-2].c_c, 1,
+                                               ns[-2].c_m);
+                               }
+                       } else {
+                               if (--n)
+                                       xxwrite(i, c, buf, n, m);
+                               os[-1] = lastc;
+                               *touched = WWU_TOUCHED;
+                       }
+                       didit = 1;
+               }
+               if (!didit)
+                       wwnupdmiss++;
+       }
+}
diff --git a/window/wwwrite.c b/window/wwwrite.c
new file mode 100644 (file)
index 0000000..2ef9f9f
--- /dev/null
@@ -0,0 +1,313 @@
+/*     $NetBSD: wwwrite.c,v 1.6 1997/11/21 08:38:00 lukem Exp $        */
+
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)wwwrite.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: wwwrite.c,v 1.6 1997/11/21 08:38:00 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "tt.h"
+#include "xx.h"
+#include "char.h"
+
+#define UPDATE() \
+       if (!ISSET(w->ww_wflags, WWW_NOUPDATE) && w->ww_cur.r >= 0 && \
+           w->ww_cur.r < wwnrow && wwtouched[w->ww_cur.r]) \
+               wwupdate1(w->ww_cur.r, w->ww_cur.r + 1)
+
+/*
+ * To support control character expansion, we save the old
+ * p and q values in r and s, and point p at the beginning
+ * of the expanded string, and q at some safe place beyond it
+ * (p + 10).  At strategic points in the loops, we check
+ * for (r && !*p) and restore the saved values back into
+ * p and q.  Essentially, we implement a stack of depth 2,
+ * to avoid recursion, which might be a better idea.
+ */
+int
+wwwrite(w, p, n)
+       struct ww *w;
+       char *p;
+       int n;
+{
+       int hascursor;
+       char *savep = p;
+       char *q = p + n;
+       char *r = 0;
+       char *s = 0;
+
+#ifdef lint
+       s = 0;                  /* define it before possible use */
+#endif
+       hascursor = ISSET(w->ww_wflags, WWW_HASCURSOR);
+       if (hascursor)
+               wwcursor(w, 0);
+       while (p < q && !ISSET(w->ww_pflags, WWP_STOPPED) &&
+           (!wwinterrupt() || ISSET(w->ww_wflags, WWW_NOINTR))) {
+               if (r && !*p) {
+                       p = r;
+                       q = s;
+                       r = 0;
+                       continue;
+               }
+               if (w->ww_wstate == 0 &&
+                   (isprt(*p) ||
+                   (ISSET(w->ww_wflags, WWW_UNCTRL) && isunctrl(*p)))) {
+                       int i;
+                       union ww_char *bp;
+                       int col, col1;
+
+                       if (ISSET(w->ww_wflags, WWW_INSERT)) {
+                               /* this is very slow */
+                               if (*p == '\t') {
+                                       p++;
+                                       w->ww_cur.c += 8 -
+                                               ((w->ww_cur.c - w->ww_w.l) & 7);
+                                       goto chklf;
+                               }
+                               if (!isprt(*p)) {
+                                       r = p + 1;
+                                       s = q;
+                                       p = unctrl(*p);
+                                       q = p + 10;
+                               }
+                               wwinschar(w, w->ww_cur.r, w->ww_cur.c,
+                                       *p++, w->ww_modes);
+                               goto right;
+                       }
+
+                       bp = &w->ww_buf[w->ww_cur.r][w->ww_cur.c];
+                       i = w->ww_cur.c;
+                       while (i < w->ww_w.r && p < q)
+                               if (!*p && r) {
+                                       p = r;
+                                       q = s;
+                                       r = 0;
+                               } else if (*p == '\t') {
+                                       int tmp = 8 - ((i - w->ww_w.l) & 7);
+                                       p++;
+                                       i += tmp;
+                                       bp += tmp;
+                               } else if (isprt(*p)) {
+                                       bp++->c_w = *p++
+                                               | w->ww_modes << WWC_MSHIFT;
+                                       i++;
+                               } else if (ISSET(w->ww_wflags, WWW_UNCTRL) &&
+                                          isunctrl(*p)) {
+                                       r = p + 1;
+                                       s = q;
+                                       p = unctrl(*p);
+                                       q = p + 10;
+                               } else
+                                       break;
+                       col = MAX(w->ww_cur.c, w->ww_i.l);
+                       col1 = MIN(i, w->ww_i.r);
+                       w->ww_cur.c = i;
+                       if (w->ww_cur.r >= w->ww_i.t
+                           && w->ww_cur.r < w->ww_i.b) {
+                               union ww_char *ns = wwns[w->ww_cur.r];
+                               unsigned char *smap =
+                                   &wwsmap[w->ww_cur.r][col];
+                               char *win = w->ww_win[w->ww_cur.r];
+                               int nchanged = 0;
+
+                               bp = w->ww_buf[w->ww_cur.r];
+                               for (i = col; i < col1; i++)
+                                       if (*smap++ == w->ww_index) {
+                                               nchanged++;
+                                               ns[i].c_w = bp[i].c_w
+                                                       ^ win[i] << WWC_MSHIFT;
+                                       }
+                               if (nchanged > 0)
+                                       wwtouched[w->ww_cur.r] |= WWU_TOUCHED;
+                       }
+               chklf:
+                       if (w->ww_cur.c >= w->ww_w.r)
+                               goto crlf;
+               } else switch (w->ww_wstate) {
+               case 0:
+                       switch (*p++) {
+                       case '\n':
+                               if (ISSET(w->ww_wflags, WWW_MAPNL))
+               crlf:
+                                       w->ww_cur.c = w->ww_w.l;
+               lf:
+                               UPDATE();
+                               if (++w->ww_cur.r >= w->ww_w.b) {
+                                       w->ww_cur.r = w->ww_w.b - 1;
+                                       if (w->ww_w.b < w->ww_b.b) {
+                                               (void) wwscroll1(w, w->ww_i.t,
+                                                       w->ww_i.b, 1, 0);
+                                               w->ww_buf++;
+                                               w->ww_b.t--;
+                                               w->ww_b.b--;
+                                       } else
+                                               wwdelline(w, w->ww_b.t);
+                               }
+                               break;
+                       case '\b':
+                               if (--w->ww_cur.c < w->ww_w.l) {
+                                       w->ww_cur.c = w->ww_w.r - 1;
+                                       goto up;
+                               }
+                               break;
+                       case '\r':
+                               w->ww_cur.c = w->ww_w.l;
+                               break;
+                       case ctrl('g'):
+                               ttputc(ctrl('g'));
+                               break;
+                       case ctrl('['):
+                               w->ww_wstate = 1;
+                               break;
+                       }
+                       break;
+               case 1:
+                       w->ww_wstate = 0;
+                       switch (*p++) {
+                       case '@':
+                               SET(w->ww_wflags, WWW_INSERT);
+                               break;
+                       case 'A':
+               up:
+                               UPDATE();
+                               if (--w->ww_cur.r < w->ww_w.t) {
+                                       w->ww_cur.r = w->ww_w.t;
+                                       if (w->ww_w.t > w->ww_b.t) {
+                                               (void) wwscroll1(w, w->ww_i.t,
+                                                       w->ww_i.b, -1, 0);
+                                               w->ww_buf--;
+                                               w->ww_b.t++;
+                                               w->ww_b.b++;
+                                       } else
+                                               wwinsline(w, w->ww_b.t);
+                               }
+                               break;
+                       case 'B':
+                               goto lf;
+                       case 'C':
+               right:
+                               w->ww_cur.c++;
+                               goto chklf;
+                       case 'E':
+                               w->ww_buf -= w->ww_w.t - w->ww_b.t;
+                               w->ww_b.t = w->ww_w.t;
+                               w->ww_b.b = w->ww_b.t + w->ww_b.nr;
+                               w->ww_cur.r = w->ww_w.t;
+                               w->ww_cur.c = w->ww_w.l;
+                               wwclreos(w, w->ww_w.t, w->ww_w.l);
+                               break;
+                       case 'H':
+                               UPDATE();
+                               w->ww_cur.r = w->ww_w.t;
+                               w->ww_cur.c = w->ww_w.l;
+                               break;
+                       case 'J':
+                               wwclreos(w, w->ww_cur.r, w->ww_cur.c);
+                               break;
+                       case 'K':
+                               wwclreol(w, w->ww_cur.r, w->ww_cur.c);
+                               break;
+                       case 'L':
+                               UPDATE();
+                               wwinsline(w, w->ww_cur.r);
+                               break;
+                       case 'M':
+                               wwdelline(w, w->ww_cur.r);
+                               break;
+                       case 'N':
+                               wwdelchar(w, w->ww_cur.r, w->ww_cur.c);
+                               break;
+                       case 'O':
+                               CLR(w->ww_wflags, WWW_INSERT);
+                               break;
+                       case 'P':
+                               wwinschar(w, w->ww_cur.r, w->ww_cur.c, ' ', 0);
+                               break;
+                       case 'X':
+                               wwupdate();
+                               break;
+                       case 'Y':
+                               UPDATE();
+                               w->ww_wstate = 2;
+                               break;
+                       case 'Z':
+                               wwupdate();
+                               xxflush(0);
+                               break;
+                       case 's':
+                               w->ww_wstate = 4;
+                               break;
+                       case 'r':
+                               w->ww_wstate = 5;
+                               break;
+                       }
+                       break;
+               case 2:
+                       w->ww_cur.r = w->ww_w.t +
+                               (unsigned)(*p++ - ' ') % w->ww_w.nr;
+                       w->ww_wstate = 3;
+                       break;
+               case 3:
+                       w->ww_cur.c = w->ww_w.l +
+                               (unsigned)(*p++ - ' ') % w->ww_w.nc;
+                       w->ww_wstate = 0;
+                       break;
+               case 4:
+                       w->ww_modes |= *p++ & wwavailmodes;
+                       w->ww_wstate = 0;
+                       break;
+               case 5:
+                       w->ww_modes &= ~*p++;
+                       w->ww_wstate = 0;
+                       break;
+               }
+       }
+       if (hascursor)
+               wwcursor(w, 1);
+       wwnwwr++;
+       wwnwwra += n;
+       n = p - savep;
+       wwnwwrc += n;
+       return n;
+}
diff --git a/window/xx.c b/window/xx.c
new file mode 100644 (file)
index 0000000..56459b6
--- /dev/null
@@ -0,0 +1,287 @@
+/*     $NetBSD: xx.c,v 1.4 1997/11/21 08:38:02 lukem Exp $     */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)xx.c       8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: xx.c,v 1.4 1997/11/21 08:38:02 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <stdlib.h>
+#include <string.h>
+#define EXTERN
+#include "xx.h"
+#undef  EXTERN
+#include "defs.h"
+#include "tt.h"
+
+int
+xxinit()
+{
+       if (ttinit() < 0)
+               return -1;
+       xxbufsize = tt.tt_nrow * tt.tt_ncol * 2;
+       /* ccinit may choose to change xxbufsize */
+       if (tt.tt_ntoken > 0 && ccinit() < 0)
+               return -1;
+       xxbuf = malloc((unsigned) xxbufsize * sizeof *xxbuf);
+       if (xxbuf == 0) {
+               wwerrno = WWE_NOMEM;
+               return -1;
+       }
+       xxbufp = xxbuf;
+       xxbufe = xxbuf + xxbufsize;
+       return 0;
+}
+
+void
+xxstart()
+{
+       (*tt.tt_start)();
+       if (tt.tt_ntoken > 0)
+               ccstart();
+       xxreset1();                     /* might be a restart */
+}
+
+void
+xxreset()
+{
+       if (tt.tt_ntoken > 0)
+               ccreset();
+       xxreset1();
+       (*tt.tt_reset)();
+}
+
+void
+xxreset1()
+{
+       struct xx *xp, *xq;
+
+       for (xp = xx_head; xp != 0; xp = xq) {
+               xq = xp->link;
+               xxfree(xp);
+       }
+       xx_tail = xx_head = 0;
+       xxbufp = xxbuf;
+}
+
+void
+xxend()
+{
+       if (tt.tt_scroll_top != 0 || tt.tt_scroll_bot != tt.tt_nrow - 1)
+               /* tt.tt_setscroll is known to be defined */
+               (*tt.tt_setscroll)(0, tt.tt_nrow - 1);
+       if (tt.tt_modes)
+               (*tt.tt_setmodes)(0);
+       if (tt.tt_scroll_down)
+               (*tt.tt_scroll_down)(1);
+       (*tt.tt_move)(tt.tt_nrow - 1, 0);
+       if (tt.tt_ntoken > 0)
+               ccend();
+       (*tt.tt_end)();
+       ttflush();
+}
+
+struct xx *
+xxalloc()
+{
+       struct xx *xp;
+
+       if (xxbufp > xxbufe)
+               abort();
+       if ((xp = xx_freelist) == 0)
+               /* XXX can't deal with failure */
+               xp = (struct xx *) malloc((unsigned) sizeof *xp);
+       else
+               xx_freelist = xp->link;
+       if (xx_head == 0)
+               xx_head = xp;
+       else
+               xx_tail->link = xp;
+       xx_tail = xp;
+       xp->link = 0;
+       return xp;
+}
+
+void
+xxfree(xp)
+       struct xx *xp;
+{
+       xp->link = xx_freelist;
+       xx_freelist = xp;
+}
+
+void
+xxmove(row, col)
+       int row, col;
+{
+       struct xx *xp = xx_tail;
+
+       if (xp == 0 || xp->cmd != xc_move) {
+               xp = xxalloc();
+               xp->cmd = xc_move;
+       }
+       xp->arg0 = row;
+       xp->arg1 = col;
+}
+
+void
+xxscroll(dir, top, bot)
+       int dir, top, bot;
+{
+       struct xx *xp = xx_tail;
+
+       if (xp != 0 && xp->cmd == xc_scroll &&
+           xp->arg1 == top && xp->arg2 == bot &&
+           ((xp->arg0 < 0 && dir < 0) || (xp->arg0 > 0 && dir > 0))) {
+               xp->arg0 += dir;
+               return;
+       }
+       xp = xxalloc();
+       xp->cmd = xc_scroll;
+       xp->arg0 = dir;
+       xp->arg1 = top;
+       xp->arg2 = bot;
+}
+
+void
+xxinschar(row, col, c, m)
+       int row, col, c, m;
+{
+       struct xx *xp;
+
+       xp = xxalloc();
+       xp->cmd = xc_inschar;
+       xp->arg0 = row;
+       xp->arg1 = col;
+       xp->arg2 = c;
+       xp->arg3 = m;
+}
+
+void
+xxinsspace(row, col)
+       int row, col;
+{
+       struct xx *xp = xx_tail;
+
+       if (xp != 0 && xp->cmd == xc_insspace && xp->arg0 == row &&
+           col >= xp->arg1 && col <= xp->arg1 + xp->arg2) {
+               xp->arg2++;
+               return;
+       }
+       xp = xxalloc();
+       xp->cmd = xc_insspace;
+       xp->arg0 = row;
+       xp->arg1 = col;
+       xp->arg2 = 1;
+}
+
+void
+xxdelchar(row, col)
+       int row, col;
+{
+       struct xx *xp = xx_tail;
+
+       if (xp != 0 && xp->cmd == xc_delchar &&
+           xp->arg0 == row && xp->arg1 == col) {
+               xp->arg2++;
+               return;
+       }
+       xp = xxalloc();
+       xp->cmd = xc_delchar;
+       xp->arg0 = row;
+       xp->arg1 = col;
+       xp->arg2 = 1;
+}
+
+void
+xxclear()
+{
+       struct xx *xp;
+
+       xxreset1();
+       xp = xxalloc();
+       xp->cmd = xc_clear;
+}
+
+void
+xxclreos(row, col)
+       int row, col;
+{
+       struct xx *xp = xxalloc();
+
+       xp->cmd = xc_clreos;
+       xp->arg0 = row;
+       xp->arg1 = col;
+}
+
+void
+xxclreol(row, col)
+       int row, col;
+{
+       struct xx *xp = xxalloc();
+
+       xp->cmd = xc_clreol;
+       xp->arg0 = row;
+       xp->arg1 = col;
+}
+
+void
+xxwrite(row, col, p, n, m)
+       int row, col;
+       char *p;
+       int n, m;
+{
+       struct xx *xp;
+
+       if (xxbufp + n + 1 > xxbufe)
+               xxflush(0);
+       xp = xxalloc();
+       xp->cmd = xc_write;
+       xp->arg0 = row;
+       xp->arg1 = col;
+       xp->arg2 = n;
+       xp->arg3 = m;
+       xp->buf = xxbufp;
+       memmove(xxbufp, p, n);
+       xxbufp += n;
+       *xxbufp++ = char_sep;
+}
diff --git a/window/xx.h b/window/xx.h
new file mode 100644 (file)
index 0000000..56a0103
--- /dev/null
@@ -0,0 +1,81 @@
+/*     $NetBSD: xx.h,v 1.4 1997/11/21 08:38:03 lukem Exp $     */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)xx.h        8.1 (Berkeley) 6/6/93
+ */
+
+#ifndef EXTERN
+#define EXTERN extern
+#endif
+
+struct xx {
+       enum { xc_move, xc_scroll, xc_inschar, xc_insspace, xc_delchar,
+               xc_clear, xc_clreos, xc_clreol, xc_write } cmd;
+       int arg0;
+       int arg1;
+       int arg2;
+       int arg3;
+       char *buf;
+       struct xx *link;
+};
+
+EXTERN struct xx *xx_head, *xx_tail;
+EXTERN struct xx *xx_freelist;
+
+EXTERN char *xxbuf, *xxbufp, *xxbufe;
+EXTERN int xxbufsize;
+
+#define char_sep '\0'
+
+struct xx *xxalloc __P((void));
+void   xxclear __P((void));
+void   xxclreol __P((int, int));
+void   xxclreos __P((int, int));
+void   xxdelchar __P((int, int));
+void   xxend __P((void));
+void   xxflush __P((int));
+void   xxflush_scroll __P((struct xx *));
+void   xxfree __P((struct xx *));
+int    xxinit __P((void));
+void   xxinschar __P((int, int, int, int));
+void   xxinsspace __P((int, int));
+void   xxmove __P((int, int));
+void   xxreset __P((void));
+void   xxreset1 __P((void));
+void   xxscroll __P((int, int, int));
+void   xxstart __P((void));
+void   xxwrite __P((int, int, char *, int, int));
diff --git a/window/xxflush.c b/window/xxflush.c
new file mode 100644 (file)
index 0000000..41c8d65
--- /dev/null
@@ -0,0 +1,205 @@
+/*     $NetBSD: xxflush.c,v 1.4 1997/11/21 08:38:05 lukem Exp $        */
+
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Wang at The University of California, Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)xxflush.c  8.1 (Berkeley) 6/6/93";
+#else
+__RCSID("$NetBSD: xxflush.c,v 1.4 1997/11/21 08:38:05 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include "ww.h"
+#include "xx.h"
+#include "tt.h"
+
+void
+xxflush(intr)
+       int intr;
+{
+       struct xx *xp, *xq;
+
+       for (xp = xx_head; xp != 0 && !(intr && wwinterrupt()); xp = xq) {
+               switch (xp->cmd) {
+               case xc_move:
+                       if (xp->link == 0)
+                               (*tt.tt_move)(xp->arg0, xp->arg1);
+                       break;
+               case xc_scroll:
+                       xxflush_scroll(xp);
+                       break;
+               case xc_inschar:
+                       (*tt.tt_move)(xp->arg0, xp->arg1);
+                       tt.tt_nmodes = xp->arg3;
+                       (*tt.tt_inschar)(xp->arg2);
+                       break;
+               case xc_insspace:
+                       (*tt.tt_move)(xp->arg0, xp->arg1);
+                       (*tt.tt_insspace)(xp->arg2);
+                       break;
+               case xc_delchar:
+                       (*tt.tt_move)(xp->arg0, xp->arg1);
+                       (*tt.tt_delchar)(xp->arg2);
+                       break;
+               case xc_clear:
+                       (*tt.tt_clear)();
+                       break;
+               case xc_clreos:
+                       (*tt.tt_move)(xp->arg0, xp->arg1);
+                       (*tt.tt_clreos)();
+                       break;
+               case xc_clreol:
+                       (*tt.tt_move)(xp->arg0, xp->arg1);
+                       (*tt.tt_clreol)();
+                       break;
+               case xc_write:
+                       (*tt.tt_move)(xp->arg0, xp->arg1);
+                       tt.tt_nmodes = xp->arg3;
+                       (*tt.tt_write)(xp->buf, xp->arg2);
+                       break;
+               }
+               xq = xp->link;
+               xxfree(xp);
+       }
+       if ((xx_head = xp) == 0) {
+               xx_tail = 0;
+               xxbufp = xxbuf;
+       }
+       ttflush();
+}
+
+void
+xxflush_scroll(xp)
+       struct xx *xp;
+{
+       struct xx *xq;
+
+ top:
+       if (xp->arg0 == 0)
+               return;
+       /*
+        * We handle retain (da and db) by putting the burden on scrolling up,
+        * which is the less common operation.  It must ensure that
+        * text is not pushed below the screen, so scrolling down doesn't
+        * have to worry about it.
+        *
+        * Try scrolling region (or scrolling the whole screen) first.
+        * Can we assume "sr" doesn't push text below the screen
+        * so we don't have to worry about retain below?
+        * What about scrolling down with a newline?  It probably does
+        * push text above (with da).  Scrolling up would then have
+        * to take care of that.
+        * It's easy to be fool proof, but that slows things down.
+        * The current solution is to disallow tt_scroll_up if da or db is true
+        * but cs (scrolling region) is not.  Again, we sacrifice scrolling
+        * up in favor of scrolling down.  The idea is having scrolling regions
+        * probably means we can scroll (even the whole screen) with impunity.
+        * This lets us work efficiently on simple terminals (use newline
+        * on the bottom to scroll), on any terminal without retain, and
+        * on vt100 style scrolling regions (I think).
+        */
+       if (xp->arg0 > 0) {
+               if ((xq = xp->link) != 0 && xq->cmd == xc_scroll &&
+                   xp->arg2 == xq->arg2 && xq->arg0 < 0) {
+                       if (xp->arg1 < xq->arg1) {
+                               if (xp->arg2 - xp->arg0 <= xq->arg1) {
+                                       xq->arg0 = xp->arg0;
+                                       xq->arg1 = xp->arg1;
+                                       xq->arg2 = xp->arg2;
+                                       return;
+                               }
+                               xp->arg2 = xq->arg1 + xp->arg0;
+                               xq->arg0 += xp->arg0;
+                               xq->arg1 = xp->arg2;
+                               if (xq->arg0 > 0)
+                                       xq->arg1 -= xq->arg0;
+                               goto top;
+                       } else {
+                               if (xp->arg1 - xq->arg0 >= xp->arg2)
+                                       return;
+                               xq->arg2 = xp->arg1 - xq->arg0;
+                               xp->arg0 += xq->arg0;
+                               xp->arg1 = xq->arg2;
+                               if (xp->arg0 < 0)
+                                       xp->arg1 += xp->arg0;
+                               goto top;
+                       }
+               }
+               if (xp->arg0 > xp->arg2 - xp->arg1)
+                       xp->arg0 = xp->arg2 - xp->arg1;
+               if (tt.tt_scroll_down) {
+                       if (tt.tt_scroll_top != xp->arg1 ||
+                           tt.tt_scroll_bot != xp->arg2 - 1) {
+                               if (tt.tt_setscroll == 0)
+                                       goto down;
+                               (*tt.tt_setscroll)(xp->arg1, xp->arg2 - 1);
+                       }
+                       tt.tt_scroll_down(xp->arg0);
+               } else {
+               down:
+                       (*tt.tt_move)(xp->arg1, 0);
+                       (*tt.tt_delline)(xp->arg0);
+                       if (xp->arg2 < tt.tt_nrow) {
+                               (*tt.tt_move)(xp->arg2 - xp->arg0, 0);
+                               (*tt.tt_insline)(xp->arg0);
+                       }
+               }
+       } else {
+               xp->arg0 = - xp->arg0;
+               if (xp->arg0 > xp->arg2 - xp->arg1)
+                       xp->arg0 = xp->arg2 - xp->arg1;
+               if (tt.tt_scroll_up) {
+                       if (tt.tt_scroll_top != xp->arg1 ||
+                           tt.tt_scroll_bot != xp->arg2 - 1) {
+                               if (tt.tt_setscroll == 0)
+                                       goto up;
+                               (*tt.tt_setscroll)(xp->arg1, xp->arg2 - 1);
+                       }
+                       tt.tt_scroll_up(xp->arg0);
+               } else  {
+               up:
+                       if (tt.tt_retain || xp->arg2 != tt.tt_nrow) {
+                               (*tt.tt_move)(xp->arg2 - xp->arg0, 0);
+                               (*tt.tt_delline)(xp->arg0);
+                       }
+                       (*tt.tt_move)(xp->arg1, 0);
+                       (*tt.tt_insline)(xp->arg0);
+               }
+       }
+}
diff --git a/xargs/Makefile b/xargs/Makefile
new file mode 100644 (file)
index 0000000..42b5920
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = xargs
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+HFILES = pathnames.h
+
+CFILES = xargs.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble xargs.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/xargs/Makefile.postamble b/xargs/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/xargs/Makefile.preamble b/xargs/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/xargs/PB.project b/xargs/PB.project
new file mode 100644 (file)
index 0000000..47a0e8c
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (pathnames.h); 
+        OTHER_LINKED = (xargs.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, xargs.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = xargs; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/xargs/pathnames.h b/xargs/pathnames.h
new file mode 100644 (file)
index 0000000..ed4337b
--- /dev/null
@@ -0,0 +1,38 @@
+/*     $NetBSD: pathnames.h,v 1.4 1995/11/15 16:11:17 thorpej Exp $    */
+
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)pathnames.h 8.1 (Berkeley) 6/6/93
+ */
+
+#define        _PATH_ECHO      "/bin/echo"
diff --git a/xargs/xargs.1 b/xargs/xargs.1
new file mode 100644 (file)
index 0000000..cdff51a
--- /dev/null
@@ -0,0 +1,192 @@
+.\"    $NetBSD: xargs.1,v 1.7 1997/06/24 00:45:28 lukem Exp $
+.\"
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" John B. Roll Jr. and the Institute of Electrical and Electronics
+.\" Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)xargs.1     8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt XARGS 1
+.Os
+.Sh NAME
+.Nm xargs
+.Nd "construct argument list(s) and execute utility"
+.Sh SYNOPSIS
+.Nm
+.Op Fl 0
+.Op Fl t
+.Oo Op Fl x
+.Fl n Ar number
+.Oc
+.Op Fl s Ar size
+.Op Ar utility Op Ar arguments ...
+.Sh DESCRIPTION
+The
+.Nm
+utility reads space, tab, newline and end-of-file delimited arguments
+from the standard input and executes the specified
+.Ar utility
+with them as
+arguments.
+.Pp
+The utility and any arguments specified on the command line are given
+to the
+.Ar utility
+upon each invocation, followed by some number of the arguments read
+from standard input.
+The
+.Ar utility
+is repeatedly executed until standard input is exhausted.
+.Pp
+Spaces, tabs and newlines may be embedded in arguments using single
+(``\ '\ '')
+or double (``"'') quotes or backslashes (``\e'').
+Single quotes escape all non-single quote characters, excluding newlines,
+up to the matching single quote.
+Double quotes escape all non-double quote characters, excluding newlines,
+up to the matching double quote.
+Any single character, including newlines, may be escaped by a backslash.
+.Pp
+The options are as follows:
+.Bl -tag -width Fl
+.It Fl 0
+Use NUL
+(``\e0'')
+instead of whitespace as the argument separator.
+This can be used in conjuction with the
+.Fl print0
+option of
+.Xr find 1 .
+.It Fl n Ar number
+Set the maximum number of arguments taken from standard input for each
+invocation of the utility.
+An invocation of
+.Ar utility
+will use less than
+.Ar number
+standard input arguments if the number of bytes accumulated (see the
+.Fl s
+option) exceeds the specified
+.Ar size
+or there are fewer than
+.Ar number
+arguments remaining for the last invocation of
+.Ar utility .
+The current default value for
+.Ar number
+is 5000.
+.It Fl s Ar size
+Set the maximum number of bytes for the command line length provided to
+.Ar utility .
+The sum of the length of the utility name and the arguments passed to
+.Ar utility
+(including
+.Dv NULL
+terminators) will be less than or equal to this number.
+The current default value for
+.Ar size
+is
+.Dv ARG_MAX
+- 2048.
+.It Fl t
+Echo the command to be executed to standard error immediately before it
+is executed.
+.It Fl x
+Force
+.Nm
+to terminate immediately if a command line containing
+.Ar number
+arguments will not fit in the specified (or default) command line length.
+.El
+.Pp
+If no
+.Ar utility
+is specified,
+.Xr echo 1
+is used.
+.Pp
+Undefined behavior may occur if
+.Ar utility
+reads from the standard input.
+.Pp
+The
+.Nm
+utility exits immediately (without processing any further input) if a
+command line cannot be assembled,
+.Ar utility
+cannot be invoked, an invocation of the utility is terminated by a signal
+or an invocation of the utility exits with a value of 255.
+.Sh DIAGNOSTICS
+.Nm
+exits with one of the following values:
+.Bl -tag -width Ds -compact
+.It 0
+All invocations of
+.Ar utility
+returned a zero exit status.
+.It 123
+One or more invocations of
+.Ar utility
+returned a nonzero exit status.
+.It 124
+The
+.Ar utility
+exited with a 255 exit status.
+.It 125
+The
+.Ar utility
+was killed or stopped by a signal.
+.It 126
+The
+.Ar utility
+was found but could not be invoked.
+.It 127
+The
+.Ar utility
+could not be found.
+.It 1
+Some other error occurred.
+.El
+.Sh SEE ALSO
+.Xr echo 1 ,
+.Xr find 1
+.Sh STANDARDS
+The
+.Nm
+utility is expected to be
+.St -p1003.2
+compliant.
+.Sh HISTORY
+The meaning of 123, 124, and 125 exit values were taken from GNU xargs.
diff --git a/xargs/xargs.c b/xargs/xargs.c
new file mode 100644 (file)
index 0000000..81a0d9a
--- /dev/null
@@ -0,0 +1,344 @@
+/*     $NetBSD: xargs.c,v 1.10 1998/04/14 09:26:33 fair Exp $  */
+
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * John B. Roll Jr.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1990, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)xargs.c    8.1 (Berkeley) 6/6/93";
+#endif
+__RCSID("$NetBSD: xargs.c,v 1.10 1998/04/14 09:26:33 fair Exp $");
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+#include <locale.h>
+#include <signal.h>
+#include <err.h>
+#include "pathnames.h"
+
+int tflag, zflag, rval;
+
+void   run __P((char **));
+int    main __P((int, char **));
+void   usage __P((void));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       int ch;
+       char *p, *bbp, *ebp, **bxp, **exp, **xp;
+       int cnt, indouble, insingle, nargs, nflag, nline, xflag;
+       char **av, *argp;
+
+       setlocale(LC_ALL, "");
+
+       /*
+        * POSIX.2 limits the exec line length to ARG_MAX - 2K.  Running that
+        * caused some E2BIG errors, so it was changed to ARG_MAX - 4K.  Given
+        * that the smallest argument is 2 bytes in length, this means that
+        * the number of arguments is limited to:
+        *
+        *       (ARG_MAX - 4K - LENGTH(utility + arguments)) / 2.
+        *
+        * We arbitrarily limit the number of arguments to 5000.  This is
+        * allowed by POSIX.2 as long as the resulting minimum exec line is
+        * at least LINE_MAX.  Realloc'ing as necessary is possible, but
+        * probably not worthwhile.
+        */
+       nargs = 5000;
+       nline = ARG_MAX - 4 * 1024;
+       nflag = xflag = 0;
+       while ((ch = getopt(argc, argv, "0n:s:tx")) != -1)
+               switch(ch) {
+               case '0':
+                       zflag = 1;
+                       break;
+               case 'n':
+                       nflag = 1;
+                       if ((nargs = atoi(optarg)) <= 0)
+                               errx(1, "illegal argument count");
+                       break;
+               case 's':
+                       nline = atoi(optarg);
+                       break;
+               case 't':
+                       tflag = 1;
+                       break;
+               case 'x':
+                       xflag = 1;
+                       break;
+               case '?':
+               default:
+                       usage();
+       }
+       argc -= optind;
+       argv += optind;
+
+       if (xflag && !nflag)
+               usage();
+
+       /*
+        * Allocate pointers for the utility name, the utility arguments,
+        * the maximum arguments to be read from stdin and the trailing
+        * NULL.
+        */
+       if (!(av = bxp =
+           malloc((u_int)(1 + argc + nargs + 1) * sizeof(char **))))
+               err(1, "malloc");
+
+       /*
+        * Use the user's name for the utility as argv[0], just like the
+        * shell.  Echo is the default.  Set up pointers for the user's
+        * arguments.
+        */
+       if (!*argv)
+               cnt = strlen(*bxp++ = _PATH_ECHO);
+       else {
+               cnt = 0;
+               do {
+                       cnt += strlen(*bxp++ = *argv) + 1;
+               } while (*++argv);
+       }
+
+       /*
+        * Set up begin/end/traversing pointers into the array.  The -n
+        * count doesn't include the trailing NULL pointer, so the malloc
+        * added in an extra slot.
+        */
+       exp = (xp = bxp) + nargs;
+
+       /*
+        * Allocate buffer space for the arguments read from stdin and the
+        * trailing NULL.  Buffer space is defined as the default or specified
+        * space, minus the length of the utility name and arguments.  Set up
+        * begin/end/traversing pointers into the array.  The -s count does
+        * include the trailing NULL, so the malloc didn't add in an extra
+        * slot.
+        */
+       nline -= cnt;
+       if (nline <= 0)
+               errx(1, "insufficient space for command");
+
+       if (!(bbp = malloc((u_int)nline + 1)))
+               err(1, "malloc");
+       ebp = (argp = p = bbp) + nline - 1;
+
+       for (insingle = indouble = 0;;)
+               switch(ch = getchar()) {
+               case EOF:
+                       /* No arguments since last exec. */
+                       if (p == bbp)
+                               exit(rval);
+
+                       /* Nothing since end of last argument. */
+                       if (argp == p) {
+                               *xp = NULL;
+                               run(av);
+                               exit(rval);
+                       }
+                       goto arg1;
+               case ' ':
+               case '\t':
+                       /* Quotes escape tabs and spaces. */
+                       if (insingle || indouble || zflag)
+                               goto addch;
+                       goto arg2;
+               case '\0':
+                       if (zflag)
+                               goto arg2;
+                       goto addch;
+               case '\n':
+                       if (zflag)
+                               goto addch;
+                       /* Empty lines are skipped. */
+                       if (argp == p)
+                               continue;
+
+                       /* Quotes do not escape newlines. */
+arg1:                  if (insingle || indouble)
+                                errx(1, "unterminated quote");
+
+arg2:                  *p = '\0';
+                       *xp++ = argp;
+
+                       /*
+                        * If max'd out on args or buffer, or reached EOF,
+                        * run the command.  If xflag and max'd out on buffer
+                        * but not on args, object.
+                        */
+                       if (xp == exp || p == ebp || ch == EOF) {
+                               if (xflag && xp != exp && p == ebp)
+                                       errx(1, "insufficient space for arguments");
+                               *xp = NULL;
+                               run(av);
+                               if (ch == EOF)
+                                       exit(rval);
+                               p = bbp;
+                               xp = bxp;
+                       } else
+                               ++p;
+                       argp = p;
+                       break;
+               case '\'':
+                       if (indouble || zflag)
+                               goto addch;
+                       insingle = !insingle;
+                       break;
+               case '"':
+                       if (insingle || zflag)
+                               goto addch;
+                       indouble = !indouble;
+                       break;
+               case '\\':
+                       if (zflag)
+                               goto addch;
+                       /* Backslash escapes anything, is escaped by quotes. */
+                       if (!insingle && !indouble && (ch = getchar()) == EOF)
+                               errx(1, "backslash at EOF");
+                       /* FALLTHROUGH */
+               default:
+addch:                 if (p < ebp) {
+                               *p++ = ch;
+                               break;
+                       }
+
+                       /* If only one argument, not enough buffer space. */
+                       if (bxp == xp)
+                               errx(1, "insufficient space for argument");
+                       /* Didn't hit argument limit, so if xflag object. */
+                       if (xflag)
+                               errx(1, "insufficient space for arguments");
+
+                       *xp = NULL;
+                       run(av);
+                       xp = bxp;
+                       cnt = ebp - argp;
+                       memmove(bbp, argp, cnt);
+                       p = (argp = bbp) + cnt;
+                       *p++ = ch;
+                       break;
+               }
+       /* NOTREACHED */
+}
+
+void
+run(argv)
+       char **argv;
+{
+       volatile int noinvoke;
+       char **p;
+       pid_t pid;
+       int status;
+
+       if (tflag) {
+               (void)fprintf(stderr, "%s", *argv);
+               for (p = argv + 1; *p; ++p)
+                       (void)fprintf(stderr, " %s", *p);
+               (void)fprintf(stderr, "\n");
+               (void)fflush(stderr);
+       }
+       noinvoke = 0;
+       switch(pid = vfork()) {
+       case -1:
+               err(1, "vfork");
+       case 0:
+               execvp(argv[0], argv);
+               noinvoke = (errno == ENOENT) ? 127 : 126;
+               warn("%s", argv[0]);;
+               _exit(1);
+       }
+       pid = waitpid(pid, &status, 0);
+       if (pid == -1)
+               err(1, "waitpid");
+
+       /*
+        * If we couldn't invoke the utility or the utility didn't exit
+        * properly, quit with 127 or 126 respectively.
+        */
+       if (noinvoke)
+               exit(noinvoke);
+
+       /*
+        * According to POSIX, we have to exit if the utility exits with
+        * a 255 status, or is interrupted by a signal.   xargs is allowed
+        * to return any exit status between 1 and 125 in these cases, but
+        * we'll use 124 and 125, the same values used by GNU xargs.
+        */
+       if (WIFEXITED(status)) {
+               if (WEXITSTATUS (status) == 255) {
+                       warnx ("%s exited with status 255", argv[0]);
+                       exit(124);
+               } else if (WEXITSTATUS (status) != 0) {
+                       rval = 123;
+               }
+       } else if (WIFSIGNALED (status)) {
+#ifdef __APPLE__
+               if (WTERMSIG(status) < NSIG) {
+#else
+               if (WTERMSIG(status) < _NSIG) {
+#endif
+                       warnx("%s terminated by SIG%s", argv[0],
+                               sys_signame[WTERMSIG(status)]);
+               } else {
+                       warnx("%s terminated by signal %d", argv[0],
+                               WTERMSIG(status));
+               }
+               exit(125);
+       }
+}
+
+void
+usage()
+{
+       (void)fprintf(stderr,
+"usage: xargs [-0t] [-n number [-x]] [-s size] [utility [argument ...]]\n");
+       exit(1);
+}
diff --git a/yes/Makefile b/yes/Makefile
new file mode 100644 (file)
index 0000000..ac96c28
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = yes
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+CFILES = yes.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble yes.1
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/yes/Makefile.postamble b/yes/Makefile.postamble
new file mode 100644 (file)
index 0000000..013b558
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
diff --git a/yes/Makefile.preamble b/yes/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/yes/PB.project b/yes/PB.project
new file mode 100644 (file)
index 0000000..7c91ca0
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (yes.c); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble, yes.1); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = yes; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/yes/yes.1 b/yes/yes.1
new file mode 100644 (file)
index 0000000..eab3795
--- /dev/null
+++ b/yes/yes.1
@@ -0,0 +1,56 @@
+.\"    $NetBSD: yes.1,v 1.4 1997/10/20 03:42:10 lukem Exp $
+.\"
+.\" Copyright (c) 1980, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)yes.1      8.1 (Berkeley) 6/6/93
+.\"
+.Dd June 6, 1993
+.Dt YES 1
+.Os BSD 4
+.Sh NAME
+.Nm yes
+.Nd be repetitively affirmative
+.Sh SYNOPSIS
+.Nm
+.Op Ar expletive
+.Sh DESCRIPTION
+.Nm
+outputs
+.Ar expletive ,
+or, by default,
+.Dq y ,
+forever.
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 4.0 .
diff --git a/yes/yes.c b/yes/yes.c
new file mode 100644 (file)
index 0000000..863f363
--- /dev/null
+++ b/yes/yes.c
@@ -0,0 +1,63 @@
+/*     $NetBSD: yes.c,v 1.5 1997/10/19 14:28:27 mrg Exp $      */
+
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1987, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)yes.c      8.1 (Berkeley) 6/6/93";
+#endif
+__RCSID("$NetBSD: yes.c,v 1.5 1997/10/19 14:28:27 mrg Exp $");
+#endif /* not lint */
+
+#include <stdio.h>
+
+int main __P((int, char **));
+
+int
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       if (argc > 1)
+               for(;;)
+                       (void)puts(argv[1]);
+       else for (;;)
+               (void)puts("y");
+}