This is an automated email from the git hooks/post-receive script. jcowgill-guest pushed a commit to annotated tag debian/3.2.2-10 in repository nethack.
commit f44ee3551b1c18098efd1f1f528a53b01408f7df Author: Ben Gertzfield <[email protected]> Date: Tue Oct 28 12:53:37 1997 -0800 Imported Debian patch 3.2.2-10 --- Makefile | 35 ++-- debian/changelog | 44 +++++ debian/conffiles | 1 + debian/control | 36 ++-- debian/menu | 6 + debian/nethack.init | 29 +++ debian/nethack.sh | 58 ++++++ debian/nethackrc.x11 | 71 +++++++ debian/postinst | 19 +- debian/postrm | 14 ++ debian/preinst | 34 ++++ debian/readme | 21 ++ debian/rules | 101 ++++++++-- spoilers.tar.uu => debian/spoilers.tar.uu | 0 doc/recover.6 | 44 +---- include/config.h | 8 +- include/global.h | 2 +- include/unixconf.h | 16 +- makelog | 115 +++++++++++ src/Makefile | 18 +- src/drawing.c | 4 +- src/files.c | 16 +- src/interp.c | 309 ++++++++++++++++++++++++++++++ src/music.c | 13 +- sys/share/ioctl.c | 10 + sys/share/unixtty.c | 52 +++++ sys/unix/Files | 1 + sys/unix/Install | 37 ++++ sys/unix/Makefile | 22 +++ sys/unix/Makefile.src | 20 +- sys/unix/Makefile.top | 4 +- sys/unix/Makefile.utl | 14 +- sys/unix/Master | 1 + sys/unix/Name | 1 + sys/unix/Node | 1 + sys/unix/READ.ME | 51 +++++ sys/unix/Remove | 25 +++ sys/unix/Size | 2 + sys/unix/System | 1 + sys/unix/install.bsd | 59 ++++++ sys/unix/interp.c | 309 ++++++++++++++++++++++++++++++ sys/unix/playtest | 25 +++ sys/unix/spkr.7 | 117 +++++++++++ sys/unix/spkr.c | 305 +++++++++++++++++++++++++++++ sys/unix/spkr.h | 34 ++++ sys/unix/unixmain.c | 16 +- sys/unix/unixunix.c | 15 +- util/Makefile | 10 +- util/recover.c | 19 +- win/tty/termcap.c | 9 +- 50 files changed, 2004 insertions(+), 170 deletions(-) diff --git a/Makefile b/Makefile index 1060bbe..2664504 100644 --- a/Makefile +++ b/Makefile @@ -15,15 +15,15 @@ # make NetHack GAME = nethack -GAMEUID = root -GAMEGRP = games +GAMEUID = games +GAMEGRP = bin # Permissions - some places use setgid instead of setuid, for instance # See also the option "SECURE" in include/config.h -GAMEPERM = 2775 -FILEPERM = 664 -EXEPERM = 755 -DIRPERM = 775 +GAMEPERM = 04755 +FILEPERM = 0644 +EXEPERM = 0755 +DIRPERM = 0755 # GAMEDIR also appears in config.h as "HACKDIR". # @@ -32,11 +32,8 @@ DIRPERM = 775 # therefore there should not be anything in GAMEDIR that you want to keep # (if there is, you'll have to do the installation by hand or modify the # instructions) -GAMEDIR = $(PREFIX)/usr/lib/games/$(GAME) -REALGAMEDIR = /usr/lib/games/$(GAME) -SHELLDIR = $(PREFIX)/usr/games -REALSHELLDIR = /usr/games -VARDIR = $(PREFIX)/var/lib/games/$(GAME) +GAMEDIR = /usr/lib/games/$(GAME)dir +SHELLDIR = /usr/games # per discussion in Install.X11 # VARDATND = @@ -140,7 +137,7 @@ dofiles: $(MAKE) dofiles-$${target-nodlb} cp src/$(GAME) $(GAMEDIR) -rm -f $(SHELLDIR)/$(GAME) - sed -e 's;/usr/games/lib/nethackdir;$(REALGAMEDIR);' \ + sed -e 's;/usr/games/lib/nethackdir;$(GAMEDIR);' \ -e 's;HACKDIR/nethack;HACKDIR/$(GAME);' \ < sys/unix/nethack.sh \ > $(SHELLDIR)/$(GAME) @@ -153,7 +150,7 @@ dofiles: chmod $(EXEPERM) $(SHELLDIR)/$(GAME) dofiles-dlb: check-dlb - ( cd dat; cp nhdat $(DATNODLB) $(GAMEDIR) ) + ( cd dat ; cp nhdat $(DATNODLB) $(GAMEDIR) ) # set up their permissions -( cd $(GAMEDIR) ; $(CHOWN) $(GAMEUID) nhdat $(DATNODLB) ; \ $(CHGRP) $(GAMEGRP) nhdat $(DATNODLB) ; \ @@ -187,15 +184,15 @@ install: $(GAME) $(VARDAT) dungeon spec_levs # set up the directories -mkdir $(SHELLDIR) -rm -rf $(GAMEDIR) - -mkdir $(GAMEDIR) $(VARDIR) $(VARDIR)/save - -$(CHOWN) $(GAMEUID) $(GAMEDIR) $(VARDIR) $(VARDIR)/save - $(CHGRP) $(GAMEGRP) $(GAMEDIR) $(VARDIR) $(VARDIR)/save - chmod $(DIRPERM) $(GAMEDIR) $(VARDIR)/save + -mkdir $(GAMEDIR) $(GAMEDIR)/save + -$(CHOWN) $(GAMEUID) $(GAMEDIR) $(GAMEDIR)/save + $(CHGRP) $(GAMEGRP) $(GAMEDIR) $(GAMEDIR)/save + chmod $(DIRPERM) $(GAMEDIR) $(GAMEDIR)/save # set up the game files ( $(MAKE) dofiles ) # set up some additional files - touch $(VARDIR)/perm $(VARDIR)/record $(VARDIR)/logfile - -( cd $(VARDIR) ; $(CHOWN) $(GAMEUID) perm record logfile ; \ + touch $(GAMEDIR)/perm $(GAMEDIR)/record $(GAMEDIR)/logfile + -( cd $(GAMEDIR) ; $(CHOWN) $(GAMEUID) perm record logfile ; \ $(CHGRP) $(GAMEGRP) perm record logfile ; \ chmod $(FILEPERM) perm record logfile ) # and a reminder diff --git a/debian/changelog b/debian/changelog index 7bb493b..8a2c56f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,46 @@ +nethack (3.2.2-10) stable; urgency=low + + * Re-built with libc5 libraries, as 3.2.2-7 was broken. + * Fixed text menu entry pausing bug. + * Took out dpkg-shlibdeps call for the lib5 build. + * Changed chmod /var/lib/games/nethack 04775 in postinst to 02775. + + -- Ben Gertzfield <[email protected]> Tue, 28 Oct 1997 12:53:37 -0800 + +nethack (3.2.2-9) unstable; urgency=low + + * Re-added fix for permissions on /var/lib/games/nethack to postinst; + fixes bug #13596. + * Added X NetHack entry to menu file, fixes wishlist #13036. + * Menu entry for text NetHack now pauses after the game ends, fixes + bug #13035. + * Built with all-glibc libraries, fixes bug #12793. + * Copied 'license' text-file to /usr/lib/games/nethack, fixes bug #13033. + * Upgraded to Standards-Version 2.3.0.0. + + -- Ben Gertzfield <[email protected]> Fri, 10 Oct 1997 16:17:46 -0700 + +nethack (3.2.2-8) unstable; urgency=low + + * New maintainer. + * Compiled under libc6. + * Added patch for proper IBM graphics support. + * Added patch for sound (speaker) support at the console. + * No longer writes to /usr/lib/games/nethack; fixes bug #10454. + * No longer uses i386-specific commands in makefile; fixes bug #10795. + * Re-added dgn_comp and lev_comp to package; fixes bug #11013. + * Created /etc/rc.boot/nethack to recover save-files on boot; + fixes bug #11012. + * Changed rules file to no longer use debstd. + * Made the recover utility setgid and removed the -d option to + prevent cheating. + * Really fixed bug #10149 -- both logfile and record are now + conffiles. + * If upgrading from a version with incompatible logfile/record files, + warns before clearing out /var/lib/games/nethack. + + -- Ben Gertzfield <[email protected]> Wed, 23 Jul 1997 20:33:26 -0500 + nethack (3.2.2-7) frozen unstable; urgency=low * changes to makefile to force compiling under libc5 @@ -76,5 +119,6 @@ nethack (3.2.1-1) unstable; urgency=low -- Paul Haggart <[email protected]> Sun, 27 Oct 1996 05:56:48 -0500 Local variables: +add-log-mailing-address: "[email protected]" mode: debian-changelog End: diff --git a/debian/conffiles b/debian/conffiles index df03017..1d072db 100644 --- a/debian/conffiles +++ b/debian/conffiles @@ -1 +1,2 @@ /var/lib/games/nethack/logfile +/var/lib/games/nethack/record diff --git a/debian/control b/debian/control index 25dce80..cfeb7dd 100644 --- a/debian/control +++ b/debian/control @@ -1,23 +1,27 @@ Source: nethack Section: games Priority: optional -Maintainer: Paul Haggart <[email protected]> -Standards-Version: 2.1.0.0 +Maintainer: Ben Gertzfield <[email protected]> +Standards-Version: 2.3.0.0 Package: nethack Architecture: any -Depends: ${shlibs:Depends} -Description: console mode dungeon exploration game - Nethack is a single-user, fantasy role-playing computer game, a direct - descendant of the games Hack and Rogue. Nethack is a -very- complex game, - compared to ones such as Moria, Rogue, or Angband. There are several - different character classes, a larger variety of items (from keys to - artifacts), a leaner, meaner collection of monsters, and several quests that - a player must finish before winning the game. There are also many new - dungeon features as well as interesting and quite amusing things that a - player can do. +Depends: libc5 (>= 5.4.0-0), ncurses3.0, xlib6 (>= 3.2-0), xpm4.7 (>= 3.4j-0) +Description: Text-based/X11 overhead view D&D-style adventure game + Nethack is a wonderfully silly, yet quite addicting, Dungeons and + Dragons-style adventure game. You play the part of a fierce fighter, + wizard, or any of many other classes, fighting your way down to + retrieve the Amulet of Yendor (try saying THAT one backwards!) for + your god. On the way, you might encounter a quantum mechanic or two, + or perhaps a microscopic space fleet, or -- if you're REALLY lucky -- + the Ravenous Bugblatter Beast of Traal. . - Much of the Dungeons of Doom within Nethack is borrowed from several fantasy - genres, including Tolkien's Middle Earth, King Aurthor, and Dungeons and - Dragons, as well as a few small references to Star Trek, Doctor Who, and the - Hitchhiker's Guide to the Galaxy. + The Debian package of Nethack includes spoiler files, to be read only + in sheer desperation, in /usr/doc/nethack/spoilers. + . + A few utilities -- recover, for retrieving your auto-save files in case + of a power failure, and dgn_comp and lev_comp, two utilities for making + your own Nethack levels and dungeons, have been included in + /usr/lib/games/nethack. 'recover' will be run every time your system + boots, if there are any auto-save files available. + diff --git a/debian/menu b/debian/menu new file mode 100644 index 0000000..9facac6 --- /dev/null +++ b/debian/menu @@ -0,0 +1,6 @@ +?package(nethack):command="sh -c '/usr/games/nethack; echo Press ENTER to quit. ; read;'" \ + icon="none" needs="text" section="Games/Adventure" \ + title="NetHack" +?package(nethack):needs=x11 \ + command="sh -c 'NETHACKOPTIONS=/etc/nethackrc.x11 /usr/games/nethack'"\ + section="Games/Adventure" title="X NetHack" diff --git a/debian/nethack.init b/debian/nethack.init new file mode 100644 index 0000000..b64b9a2 --- /dev/null +++ b/debian/nethack.init @@ -0,0 +1,29 @@ +#!/bin/sh + +# Nethack save-file recovery script for Debian +# +# Ben Gertzfield ([email protected]) 29 July 1997 +# Copyright 1997 Ben Gertzfield. This script is released under the +# GNU General Public License, version 2 or later. + +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +set -e + +# Has the nethack package been removed? +test -f /usr/lib/games/nethack/recover || exit 0 + +# Are there any lock-files to recover? +ls /var/lib/games/nethack/*lock.0 >/dev/null 2>&1 || exit 0 + +# Yes; recover them. +for file in /var/lib/games/nethack/*lock.0; do + owner=$(ls -l $file | awk '{print $3}') + echo -n "Recovering Nethack save file owned by $owner: " + su $owner -c "/usr/lib/games/nethack/recover $file" >/dev/null 2>&1 + if (($?)); then + echo error $?\! + else + echo "recovered." + fi +done diff --git a/debian/nethack.sh b/debian/nethack.sh new file mode 100644 index 0000000..6ee8b4e --- /dev/null +++ b/debian/nethack.sh @@ -0,0 +1,58 @@ +#!/bin/sh +# SCCS Id: @(#)nethack.sh 3.2 90/02/26 + +HACKDIR=/usr/lib/games/nethack +HACK=$HACKDIR/nethack +MAXNROFPLAYERS=42 + +# see if we can find the full path name of PAGER, so help files work properly +# assume that if someone sets up a special variable (HACKPAGER) for NetHack, +# it will already be in a form acceptable to NetHack +# ideas from [email protected] +if test \( "xxx$PAGER" != xxx \) -a \( "xxx$HACKPAGER" = xxx \) +then + + HACKPAGER=$PAGER + +# use only the first word of the pager variable +# this prevents problems when looking for file names with trailing +# options, but also makes the options unavailable for later use from +# NetHack + for i in $HACKPAGER + do + HACKPAGER=$i + break + done + + if test ! -f $HACKPAGER + then + IFS=: + for i in $PATH + do + if test -f $i/$HACKPAGER + then + HACKPAGER=$i/$HACKPAGER + export HACKPAGER + break + fi + done + IFS=' ' + fi + if test ! -f $HACKPAGER + then + echo Cannot find $PAGER -- unsetting PAGER. + unset HACKPAGER + unset PAGER + fi +fi + + +cd $HACKDIR +case $1 in + -s*) + exec $HACK -d $HACKDIR "$@" + ;; + *) + exec $HACK -d $HACKDIR "$@" $MAXNROFPLAYERS + ;; +esac diff --git a/debian/nethackrc.x11 b/debian/nethackrc.x11 new file mode 100644 index 0000000..b079038 --- /dev/null +++ b/debian/nethackrc.x11 @@ -0,0 +1,71 @@ +# +# System-wide NetHack configuration file for X-based NetHack. +# + +OPTIONS=windowtype:x11,toptenwin,hilite_pet +OPTIONS=fixinv,safe_pet,sortpack,tombstone +OPTIONS=verbose,news,fruit:yiffmelon +OPTIONS=dogname:Kitsune +OPTIONS=catname:Neko-chan +OPTIONS=pickup_types:$ + +# +# There are 17 object symbols and various graphics symbols. +# The descriptions of these symbols can be found in dat/opthelp. +# +# +# Font: nh10 (10x20) +# +OBJECTS= 180 183 188 192 181 184 182 189 190 196 \ + 191 194 193 187 185 186 195 +# +DUNGEON= 032 025 018 013 012 014 011 015 023 024 \ + 022 021 128 129 130 131 132 133 134 135 \ + 136 137 145 146 144 143 142 141 140 149 \ + 150 031 031 147 148 031 161 140 +# +TRAPS= 138 138 138 138 138 138 138 138 138 138 \ + 138 138 138 138 138 139 138 138 138 138 \ + 138 138 +# +EFFECTS= 151 152 153 154 155 156 157 158 \ + 159 160 161 162 \ + 163 164 165 166 167 168 169 170 \ + 171 172 173 174 175 176 177 178 179 +# +# +# Font: ibm (8x14) +# +#OBJECTS= 207 210 215 219 208 211 209 216 217 223 \ +# 218 221 220 214 212 213 222 +# +#DUNGEON= 032 128 129 130 131 132 133 134 135 136 \ +# 137 138 139 045 124 142 143 144 145 146 \ +# 147 148 155 156 227 154 153 152 151 159 \ +# 160 200 200 157 158 250 170 151 +# +#TRAPS= 149 149 149 149 149 149 149 149 149 149 \ +# 149 149 149 149 149 150 149 149 149 149 \ +# 149 149 +# +#EFFECTS= 161 162 163 164 165 166 167 168 \ +# 169 170 171 172 \ +# 173 174 175 176 177 178 179 180 \ +# 181 182 183 184 185 186 187 188 189 +# +# +# Font: a "standard" font like 6x13 +# +#DUNGEON = 032 025 018 013 012 014 011 015 023 024 \ +# 022 021 031 045 124 043 043 031 035 001 \ +# 060 062 060 062 019 092 035 123 125 031 \ +# 125 046 046 035 035 046 127 125 +# +#TRAPS= 094 094 094 094 094 094 094 094 094 094 \ +# 094 094 094 094 094 002 094 094 094 094 \ +# 094 094 +# +#EFFECTS= 124 045 092 047 042 033 041 040 \ +# 048 035 064 042 \ +# 047 045 092 124 124 092 045 047 \ +# 047 064 092 064 064 064 092 064 047 diff --git a/debian/postinst b/debian/postinst index f7a68ca..1faecea 100644 --- a/debian/postinst +++ b/debian/postinst @@ -1,9 +1,18 @@ #!/bin/sh -chown root.games /var/lib/games/nethack /var/lib/games/nethack/save -chmod 775 /var/lib/games/nethack/save /var/lib/games/nethack/save +# Nethack post-installation script for Debian +# +# Ben Gertzfield ([email protected]) 29 July 1997 +# Copyright 1997 Ben Gertzfield. This script is released under the +# GNU General Public License, version 2 or later. -chown root.games /usr/lib/games/nethack -chmod 775 /usr/lib/games/nethack +# Modified 10 October 1997 to fix permissions on /var/lib/games/nethack. -mkfontdir /usr/X11R6/lib/X11/fonts/misc +set -e + +chmod 02775 /var/lib/games/nethack + +if [ -x /usr/X11R6/bin/mkfontdir ] ; then /usr/X11R6/bin/mkfontdir \ + /usr/X11R6/lib/X11/fonts/misc ; fi + +if [ -x /usr/bin/update-menus ] ; then /usr/bin/update-menus ; fi diff --git a/debian/postrm b/debian/postrm new file mode 100644 index 0000000..ac7bdab --- /dev/null +++ b/debian/postrm @@ -0,0 +1,14 @@ +#!/bin/sh + +# Nethack post-remove script for Debian +# +# Ben Gertzfield ([email protected]) 29 July 1997 +# Copyright 1997 Ben Gertzfield. This script is released under the +# GNU General Public License, version 2 or later. + +set -e + +if [ -x /usr/X11R6/bin/mkfontdir ] ; then /usr/X11R6/bin/mkfontdir \ + /usr/X11R6/lib/X11/fonts/misc ; fi + +if [ -x /usr/bin/update-menus ] ; then /usr/bin/update-menus ; fi diff --git a/debian/preinst b/debian/preinst new file mode 100644 index 0000000..2005536 --- /dev/null +++ b/debian/preinst @@ -0,0 +1,34 @@ +#!/bin/sh + +# Nethack pre-installation script for Debian +# +# Ben Gertzfield ([email protected]) 29 July 1997 +# Copyright 1997 Ben Gertzfield. This script is released under the +# GNU General Public License, version 2 or later. + +set -e + +dpkg --compare-versions $2 lt-nl 3.2.2 || exit 0 + +cat <<EOF +You seem to have a version of Nethack prior to this package's version, +which is 3.2.2. Unfortunately, the save files and high scores that +older versions used are incompatible with this version, and will be +cleared if you continue installing this package. + +If you want to save these, back up /var/lib/games/nethack now! + +EOF + +echo -n "Do you want to continue? (Y/n) " +read answer + +if [ "$answer" = "n" -o "$answer" = "N" ] ; then + echo "Aborting installation of Nethack." + exit 1 +else + echo "Removing old save files and high scores.." + rm -rf /var/lib/games/nethack +fi + + diff --git a/debian/readme b/debian/readme new file mode 100644 index 0000000..90c7ad9 --- /dev/null +++ b/debian/readme @@ -0,0 +1,21 @@ +README for Debian GNU/Linux Nethack 3.2.2: + +Nethack is a wonderfully silly yet quite addicting Dungeons and +Dragons-style adventure game. You play the part of a fierce fighter, +wizard, or any of many other classes, fighting your way down to +retrieve the Amulet of Yendor (try saying THAT one backwards!) for +your god. On the way, you might encounter a quantum mechanic or two, +or perhaps a microscopic space fleet, or -- if you're REALLY lucky -- +the Ravenous Bugblatter Beast of Traal. + +The Debian package of Nethack includes spoiler files, to be read only +in sheer desperation, in /usr/doc/nethack/spoilers. + +A few utilities -- recover, for retrieving your auto-save files in case +of a power failure, and dgn_comp and lev_comp, two utilities for making +your own Nethack levels and dungeons, have been included in +/usr/lib/games/nethack. + +The recover utility will be run upon bootup, by /etc/rc.boot/nethack. +Any auto-save files will be retrieved and converted into proper save +files. diff --git a/debian/rules b/debian/rules index e9cfa43..9b63dc6 100755 --- a/debian/rules +++ b/debian/rules @@ -1,53 +1,116 @@ #!/usr/bin/make -f +# Nethack build script for Debian +# +# Ben Gertzfield ([email protected]) 29 July 1997 +# Copyright 1997 Ben Gertzfield. This script is released under the +# GNU General Public License, version 2 or later. + + +ARCH=$(shell dpkg --print-gnu-build-architecture) +CCLIBC1=$(ARCH)-linuxlibc1-gcc +VPATH=/usr/$(ARCH)-linuxlibc1/lib + build: $(checkdir) - make + make all CC=$(CCLIBC1) CFLAGS='-DDEBIAN -O2 -I../include \ + -I/usr/$(ARCH)-linuxlibc1/include -fomit-frame-pointer' touch build + cd util && make recover CC=$(CCLIBC1) \ + CFLAGS='-DDEBIAN -O2 -I../include \ + -I/usr/$(ARCH)-linuxlibc1/include -fomit-frame-pointer' clean: $(checkdir) -rm -f build nh10.pcf - -make spotless + -rm -f `find . -name "*.orig"` -rm -f `find . -name "*~"` -rm -rf debian/tmp debian/files* core debian/substvars + -make spotless binary-indep: checkroot build $(checkdir) -# There are no architecture-independent files to be uploaded binary-arch: checkroot build $(checkdir) install -d debian/tmp/usr/games - install -d debian/tmp/usr/doc/nethack install -d debian/tmp/usr/X11R6/lib/X11/app-defaults install -d debian/tmp/usr/X11R6/lib/X11/fonts/misc - install -d debian/tmp/usr/lib/games/nethack - install -d debian/tmp/var/lib/games/nethack - - # make console-mode nethack - make install PREFIX=`pwd`/debian/tmp + install -d -m 755 -o root -g games \ + debian/tmp/usr/lib/games/nethack + install -d -m 2775 -o root -g games \ + debian/tmp/var/lib/games/nethack + install -d -m 2775 -o root -g games \ + debian/tmp/var/lib/games/nethack/save + install -d debian/tmp/usr/man/man6 + install -d debian/tmp/usr/lib/menu + install -d debian/tmp/etc/rc.boot + install -d debian/tmp/DEBIAN + install -d debian/tmp/usr/doc/nethack + + install -m 0644 -o root -g root \ + dat/{nhdat,x11tiles,pet_mark.xbm,rip.xpm,license} \ + debian/tmp/usr/lib/games/nethack + install -m 0755 -o root -g games \ + debian/nethack.sh debian/tmp/usr/games/nethack + + install -m 2755 -o root -g games src/nethack \ + debian/tmp/usr/lib/games/nethack/ + + touch debian/tmp/var/lib/games/nethack/{perm,record,logfile} + chown root.games debian/tmp/var/lib/games/nethack/{perm,record,logfile} + chmod 0664 debian/tmp/var/lib/games/nethack/{perm,record,logfile} + # build the recover prog, and move it where it's supposed to be - (cd util; /usr/bin/i486-linuxlibc1-gcc -O2 -I../include recover.c -o recover) - install -o root -g games -m 755 util/recover debian/tmp/usr/games/recover + install -o root -g games -m 2755 util/recover \ + debian/tmp/usr/lib/games/nethack/recover + + # install the dgn_comp and lev_comp programs + install -o root -g games -m 755 util/dgn_comp \ + debian/tmp/usr/lib/games/nethack/dgn_comp + + install -o root -g games -m 755 util/lev_comp \ + debian/tmp/usr/lib/games/nethack/lev_comp # install X11 stuff install -m 644 win/X11/NetHack.ad debian/tmp/usr/X11R6/lib/X11/app-defaults/NetHack - bdftopcf -o nh10.pcf win/X11/nh10.bdf + /usr/X11R6/bin/bdftopcf -o nh10.pcf win/X11/nh10.bdf install -m 644 nh10.pcf debian/tmp/usr/X11R6/lib/X11/fonts/misc/ # extract spoilers - uudecode -o /dev/stdout spoilers.tar.uu | tar xf - -C debian/tmp/usr/doc/nethack + uudecode -o /dev/stdout debian/spoilers.tar.uu | tar xf - -C debian/tmp/usr/doc/nethack + + # man pages + install -m 644 -o root -g root doc/*.6 debian/tmp/usr/man/man6 + + install -m 644 -o root -g root doc/Guidebook \ + debian/tmp/usr/doc/nethack + + install -m 644 -o root -g root debian/readme \ + debian/tmp/usr/doc/nethack/README.debian + + # init.d script + install -m 755 -o root -g root debian/nethack.init \ + debian/tmp/etc/rc.boot/nethack - # build the nethack package - debstd doc/Guidebook.txt win/X11/nethack.rc + # system-wide X nethack.rc file, thanks again joey :) + install -m 644 -o root -g root debian/nethackrc.x11 \ + debian/tmp/etc/nethackrc.x11 - # remove some unused manpages - rm debian/tmp/usr/man/man6/dgn_comp.6.gz - rm debian/tmp/usr/man/man6/dlb.6.gz - rm debian/tmp/usr/man/man6/lev_comp.6.gz + install -m 755 -o root -g root debian/postinst debian/tmp/DEBIAN + install -m 755 -o root -g root debian/postrm debian/tmp/DEBIAN + install -m 644 -o root -g root debian/conffiles debian/tmp/DEBIAN + install -m 644 -o root -g root debian/changelog \ + debian/tmp/usr/doc/nethack/changelog.Debian + install -m 644 -o root -g root debian/menu \ + debian/tmp/usr/lib/menu/nethack + install -m 644 -o root -g root debian/copyright \ + debian/tmp/usr/doc/nethack/copyright + -find debian/tmp/usr/{doc,man} -type f -not -name '*.gz' | \ + xargs gzip -9f +# dpkg-shlibdeps debian/tmp/usr/lib/games/nethack/{nethack,recover} dpkg-gencontrol -pnethack dpkg --build debian/tmp .. diff --git a/spoilers.tar.uu b/debian/spoilers.tar.uu similarity index 100% rename from spoilers.tar.uu rename to debian/spoilers.tar.uu diff --git a/doc/recover.6 b/doc/recover.6 index d813264..b5418bd 100644 --- a/doc/recover.6 +++ b/doc/recover.6 @@ -4,10 +4,6 @@ recover \- recover a NetHack game interrupted by disaster .SH SYNOPSIS .B recover -[ -.B \-d -.I directory -] .I "base1 base2" ... .SH DESCRIPTION .PP @@ -25,14 +21,6 @@ options tell which files to process. Each base option specifies recovery of a separate game. .PP -The -.B \-d -option, which must be the first argument if it appears, -supplies a directory which is the NetHack playground. -It overrides the value from NETHACKDIR, HACKDIR, or the directory -specified by the game administrator during compilation -(usually /usr/games/lib/nethackdir). -.PP For recovery to be possible, .I nethack must have been compiled with the INSURANCE option, and the run-time option @@ -61,33 +49,13 @@ will transform these level files into a save file of the same name as .I nethack would have used. .PP -Since -.I recover -must be able to read and delete files from the playground -and create files in the save directory, -it has interesting interactions with game security. -Giving ordinary players access to -.I recover -through setuid or setgid is tantamount to leaving the playground -world-writable, -with respect to both cheating and messing up other players. -For a single-user system, this of course does not change anything, -so some of the microcomputer ports install -.I recover -by default. -.PP -For a multi-user system, -the game administrator may want to arrange for all .0 files in the -playground to be fed to recover when the host machine boots, -and handle game crashes individually. -If the user population is sufficiently trustworthy, -.I recover -can be installed with the same permissions the -.I nethack -executable has. -In either case, .I recover -is easily compiled from the distribution utility directory. +has been installed under Debian GNU/Linux as sgid games. This makes +it possible for users to recover their own games. The security hazards +of possible cheating have been removed, by taking out the +.I -d +option and making sure the only directory auto-save files can be read +from is /var/lib/games/nethack. .SH NOTES .PP Like diff --git a/include/config.h b/include/config.h index 337be8a..fd86320 100644 --- a/include/config.h +++ b/include/config.h @@ -256,7 +256,7 @@ * would allow: * xpmtoppm <x11tiles.xpm | pnmscale 1.25 | ppmquant 90 >x11tiles_big.xpm */ -#define USE_XPM /* Disable if you do not have the XPM library */ +# define USE_XPM /* Disable if you do not have the XPM library */ # ifdef USE_XPM # define GRAPHIC_TOMBSTONE /* Use graphical tombstone (rip.xpm) */ # endif @@ -282,8 +282,8 @@ # define LOGFILE "/var/lib/games/nethack/logfile" # define NEWS "/var/lib/games/nethack/news" #else -# define LOGFILE "logfile" /* larger file for debugging purposes */ -# define NEWS "news" /* the file containing the latest hack news */ +# define LOGFILE "logfile" /* larger file for debugging purposes */ +# define NEWS "news" /* the file containing the latest hack news */ #endif /* @@ -432,7 +432,7 @@ typedef unsigned char uchar; * functions that have been macroized. */ -/*#define VISION_TABLES /* use vision tables generated at compile time */ +#define VISION_TABLES /* use vision tables generated at compile time */ #ifndef VISION_TABLES # ifndef NO_MACRO_CPATH # define MACRO_CPATH /* use clear_path macros instead of functions */ diff --git a/include/global.h b/include/global.h index f507008..f2d30bd 100644 --- a/include/global.h +++ b/include/global.h @@ -17,7 +17,7 @@ #ifdef DEBIAN # define RECORD "/var/lib/games/nethack/record" #else -# define RECORD "record" /* a file containing list of topscorers */ +# define RECORD "record" /* a file containing list of topscorers */ #endif #define HELP "help" /* a file containing command descriptions */ diff --git a/include/unixconf.h b/include/unixconf.h index ba93667..06cca75 100644 --- a/include/unixconf.h +++ b/include/unixconf.h @@ -24,13 +24,13 @@ /* #define ULTRIX /* define for Ultrix v3.0 or higher (but not lower) */ /* Use BSD for < v3.0 */ /* "ULTRIX" not to be confused with "ultrix" */ -/* #define SYSV /* define for System V */ +#define SYSV /* define for System V */ /* #define HPUX /* Hewlett-Packard's Unix, version 6.5 or higher */ /* use SYSV for < v6.5 */ /* define any of the following that are appropriate */ -/* #define SVR4 /* use in addition to SYSV for System V Release 4 */ +#define SVR4 /* use in addition to SYSV for System V Release 4 */ #define NETWORK /* if running on a networked system */ /* e.g. Suns sharing a playground through NFS */ /* #define SUNOS4 /* SunOS 4.x */ @@ -45,9 +45,9 @@ #define TEXTCOLOR /* Use System V r3.2 terminfo color support */ /* and/or ANSI color support on termcap systems */ /* and/or X11 color */ -/* #define POSIX_JOB_CONTROL /* use System V / POSIX job control +#define POSIX_JOB_CONTROL /* use System V / POSIX job control * (e.g., VSUSP) */ -/* #define POSIX_TYPES /* use POSIX types for system calls and termios */ +#define POSIX_TYPES /* use POSIX types for system calls and termios */ /* define for many recent OS releases, including * those with specific defines (since types are * changing toward the standard from earlier chaos). @@ -71,7 +71,7 @@ /* see sys/unix/snd86.shr for more information on these */ /* #define UNIX386MUSIC /* Play real music through speaker on systems with music driver installed */ -/* #define VPIX_MUSIC /* Play real music through speaker on systems with +#define VPIX_MUSIC /* Play real music through speaker on systems with built-in VPIX support */ @@ -114,7 +114,7 @@ * "extra output" method is used, but not all systems provide access to * a fine-grained timer. */ -/* #define TIMED_DELAY /* usleep() */ +#define TIMED_DELAY /* usleep() */ #endif /* @@ -242,9 +242,9 @@ #endif #ifdef DEBIAN -# define HLOCK "/var/lib/games/nethack/perm" +# define HLOCK "/var/lib/games/nethack/perm" #else -# define HLOCK "perm" /* an empty file used for locking purposes */ +# define HLOCK "perm" /* an empty file used for locking purposes */ #endif #ifndef REDO diff --git a/makelog b/makelog new file mode 100644 index 0000000..3e38c45 --- /dev/null +++ b/makelog @@ -0,0 +1,115 @@ +( cd src ; make ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/src' +make[1]: `nethack' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/src' +( cd dat ; make data ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `data' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd dat ; make oracles ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `oracles' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd dat ; make options ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `options' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd dat ; make quest.dat ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `quest.dat' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd dat ; make rumors ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `rumors' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd util ; make tile2x11 ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/util' +make[1]: `tile2x11' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/util' +( cd dat ; make x11tiles ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `x11tiles' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd dat ; make pet_mark.xbm ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `pet_mark.xbm' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd dat ; make rip.xpm ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `rip.xpm' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd util ; make dgn_comp ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/util' +make[2]: Entering directory `/home/che/nethack/nethack-3.2.2/src' +make[2]: `../include/date.h' is up to date. +make[2]: Leaving directory `/home/che/nethack/nethack-3.2.2/src' +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/util' +( cd dat ; make dungeon ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `dungeon' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd util ; make lev_comp ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/util' +make[2]: Entering directory `/home/che/nethack/nethack-3.2.2/src' +make[2]: `../include/date.h' is up to date. +make[2]: Leaving directory `/home/che/nethack/nethack-3.2.2/src' +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/util' +( cd dat ; make spec_levs ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `spec_levs' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +( cd dat ; make quest_levs ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[1]: `quest_levs' is up to date. +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' +mkdir /usr/games +rm -rf /usr/lib/games/nethackdir +mkdir /usr/lib/games/nethackdir /usr/lib/games/nethackdir/save +chown games /usr/lib/games/nethackdir /usr/lib/games/nethackdir/save +chgrp bin /usr/lib/games/nethackdir /usr/lib/games/nethackdir/save +chmod 0755 /usr/lib/games/nethackdir /usr/lib/games/nethackdir/save +( make dofiles ) +make[1]: Entering directory `/home/che/nethack/nethack-3.2.2' +target=`sed -n \ + -e '/librarian/{' \ + -e 's/.*/dlb/p' \ + -e 'q' \ + -e '}' \ + -e '$s/.*/nodlb/p' < dat/options` ; \ +make dofiles-${target-nodlb} +make[2]: Entering directory `/home/che/nethack/nethack-3.2.2' +( cd dat; make options ) +make[3]: Entering directory `/home/che/nethack/nethack-3.2.2/dat' +make[3]: `options' is up to date. +make[3]: Leaving directory `/home/che/nethack/nethack-3.2.2/dat' + color, data file compression, data librarian, debug mode, Elbereth, +make[3]: Entering directory `/home/che/nethack/nethack-3.2.2' +( cd util ; make dlb ) +make[4]: Entering directory `/home/che/nethack/nethack-3.2.2/util' +make[4]: `dlb' is up to date. +make[4]: Leaving directory `/home/che/nethack/nethack-3.2.2/util' +( cd dat ; ../util/dlb cf nhdat help hh cmdhelp history opthelp wizhelp dungeon asmodeus.lev baalz.lev bigrm-?.lev castle.lev fakewiz?.lev juiblex.lev knox.lev medusa-?.lev minend-?.lev minefill.lev minetn-?.lev oracle.lev orcus.lev sanctum.lev tower?.lev valley.lev wizard?.lev astral.lev air.lev earth.lev fire.lev water.lev ?-goal.lev ?-fill?.lev ?-locate.lev ?-start.lev data oracles options quest.dat rumors ) +make[3]: Leaving directory `/home/che/nethack/nethack-3.2.2' +( cd dat ; cp nhdat x11tiles pet_mark.xbm rip.xpm license /usr/lib/games/nethackdir ) +( cd /usr/lib/games/nethackdir ; chown games nhdat x11tiles pet_mark.xbm rip.xpm license ; \ + chgrp bin nhdat x11tiles pet_mark.xbm rip.xpm license ; \ + chmod 0644 nhdat x11tiles pet_mark.xbm rip.xpm license ) +make[2]: Leaving directory `/home/che/nethack/nethack-3.2.2' +cp src/nethack /usr/lib/games/nethackdir +rm -f /usr/games/nethack +sed -e 's;/usr/games/lib/nethackdir;/usr/lib/games/nethackdir;' \ +-e 's;HACKDIR/nethack;HACKDIR/nethack;' \ +< sys/unix/nethack.sh \ + > /usr/games/nethack +( cd /usr/lib/games/nethackdir ; chown games nethack ; \ + chgrp bin nethack ) +chmod 04755 /usr/lib/games/nethackdir/nethack +chown games /usr/games/nethack +chgrp bin /usr/games/nethack +chmod 0755 /usr/games/nethack +make[1]: Leaving directory `/home/che/nethack/nethack-3.2.2' +touch /usr/lib/games/nethackdir/perm /usr/lib/games/nethackdir/record /usr/lib/games/nethackdir/logfile +( cd /usr/lib/games/nethackdir ; chown games perm record logfile ; \ + chgrp bin perm record logfile ; \ + chmod 0644 perm record logfile ) +You may also want to reinstall the man pages via the doc Makefile. diff --git a/src/Makefile b/src/Makefile index d8354fd..da48b14 100644 --- a/src/Makefile +++ b/src/Makefile @@ -56,7 +56,7 @@ SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o # if you get setcgtty() warnings during execution, you are feeding gcc # a non-ANSI <sys/ioctl.h> -- either run fixincludes on it or use # -traditional in CFLAGS -CC = /usr/bin/i486-linuxlibc1-gcc +CC = gcc # # For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following: # @@ -109,8 +109,8 @@ CC = /usr/bin/i486-linuxlibc1-gcc # flags for Linux # compile normally -CFLAGS = -O2 -fomit-frame-pointer -I../include -I/usr/X11R6/include -I/usr/include -DDEBIAN -LFLAGS = -L/usr/X11R6/lib -L/usr/lib +# CFLAGS = -O2 -fomit-frame-pointer -I../include -I/usr/X11/include +# LFLAGS = -L/usr/X11/lib # OR compile backwards compatible a.out format # CFLAGS = -O2 -b i486-linuxaout -fomit-frame-pointer -I../include -I/usr/X11/include # LFLAGS = -b i486-linuxaout -L/usr/X11/lib @@ -124,8 +124,8 @@ LFLAGS = -L/usr/X11R6/lib -L/usr/lib # flags for debugging: # CFLAGS = -g -I../include -# CFLAGS = -O -I../include -# LFLAGS = +CFLAGS = -O2 -I../include -I/usr/X11R6/include +LFLAGS = -s -L/usr/X11R6/lib # Set the WINSRC, WINOBJ, and WINLIB lines to correspond to your desired @@ -160,17 +160,17 @@ WINOBJ = $(WINTTYOBJ) $(WINX11OBJ) # # libraries for tty ports # WINTTYLIB = -ltermcap -# WINTTYLIB = -lcurses +WINTTYLIB = -lcurses # WINTTYLIB = -lcurses16 -WINTTYLIB = -lncurses +# WINTTYLIB = -lncurses # WINTTYLIB = -ltermlib # # libraries for X11 # If USE_XPM is defined in config.h, you will also need -lXpm here. -WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 -lXpm +# WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 # WINX11LIB = -lXaw -lXmu -lXt -lX11 # WINX11LIB = -lXaw -lXmu -lXext -lXt -lXpm -lX11 -lm -# WINX11LIB = -lXaw -lXmu -lXpm -lXext -lXt -lX11 -lSM -lICE -lm # BSD/OS 2.0 +WINX11LIB = -lXaw -lXmu -lXpm -lXext -lXt -lX11 -lSM -lICE # Linux 2.0 # # WINLIB = $(WINTTYLIB) $(WINX11LIB) diff --git a/src/drawing.c b/src/drawing.c index 179864f..2c25298 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -812,7 +812,7 @@ boolean is_rlevel; #endif /* ASCIIGRAPH */ for (i = 0; i < MAXOCLASSES; i++) { -#ifdef ASCIIGRAPH +#if defined(ASCIIGRAPH) && !defined(LINUX) if (iflags.IBMgraphics # if defined(USE_TILES) && defined(MSDOS) && !iflags.grmode @@ -820,7 +820,7 @@ boolean is_rlevel; ) oc_syms[i] = IBM_r_oc_syms[i]; else -#endif /* ASCIIGRAPH */ +#endif /* ASCIIGRAPH && !LINUX */ oc_syms[i] = r_oc_syms[i]; } #if defined(MSDOS) diff --git a/src/files.c b/src/files.c index 2f67535..4e12cbe 100644 --- a/src/files.c +++ b/src/files.c @@ -39,7 +39,7 @@ char lock[PL_NSIZ+17] = "1lock"; /* long enough for _uid+name+.99;1 */ # else # ifdef DEBIAN char bones[] = "/var/lib/games/nethack/bonesnn.xxx"; -char lock[255] = "/var/lib/games/nethack/1lock"; +char lock[255] = "/var/lib/games/nethack/1lock"; # else char bones[] = "bonesnn.xxx"; char lock[PL_NSIZ+14] = "1lock"; /* long enough for uid+name+.99 */ @@ -430,13 +430,13 @@ set_savefile_name() regularize(SAVEF+i); } Strcat(SAVEF, ".sav"); -# else -# ifdef DEBIAN - Sprintf(SAVEF, "/var/lib/games/nethack/save/%d%s", (int)getuid(), plname); - regularize(SAVEF+28); /* avoid . or / in name */ -# else - Sprintf(SAVEF, "save/%d%s", (int)getuid(), plname); - regularize(SAVEF+5); /* avoid . or / in name */ + # else + # ifdef DEBIAN + Sprintf(SAVEF, "/var/lib/games/nethack/save/%d%s", (int)getuid(), plname); + regularize(SAVEF+28); /* avoid . or / in name */ +# else + Sprintf(SAVEF, "save/%d%s", (int)getuid(), plname); + regularize(SAVEF+5); /* avoid . or / in name */ # endif /* DEBIAN */ # endif /* MICRO */ #endif /* VMS */ diff --git a/src/interp.c b/src/interp.c new file mode 100644 index 0000000..55cfe0b --- /dev/null +++ b/src/interp.c @@ -0,0 +1,309 @@ +/* + * interp.c -- device driver for console speaker on 80386 + * + * v1.1 by Eric S. Raymond ([email protected]) Feb 1990 + * + * this is the part of the code common to all 386 UNIX OSes + * + * playinit() and playstring() are called from the appropriate driver + */ + +#ifdef __386BSD__ +#include "param.h" +#else +#include <sys/param.h> +#endif + +#ifndef HZ +#define HZ 60 +#endif + + +/**************** PLAY STRING INTERPRETER BEGINS HERE ********************** + * + * Play string interpretation is modelled on IBM BASIC 2.0's PLAY statement; + * M[LNS] are missing and the ~ synonym and octave-tracking facility is added. + * Requires tone(), rest(), and endtone(). String play is not interruptible + * except possibly at physical block boundaries. + */ + +typedef int bool; +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define toupper(c) ((c) - ' ' * (((c) >= 'a') && ((c) <= 'z'))) +#define isdigit(c) (((c) >= '0') && ((c) <= '9')) +#define dtoi(c) ((c) - '0') + +static int octave; /* currently selected octave */ +static int whole; /* whole-note time at current tempo, in ticks */ +static int value; /* whole divisor for note time, quarter note = 1 */ +static int fill; /* controls spacing of notes */ +static bool octtrack; /* octave-tracking on? */ +static bool octprefix; /* override current octave-tracking state? */ + +/* + * Magic number avoidance... + */ +#define SECS_PER_MIN 60 /* seconds per minute */ +#define WHOLE_NOTE 4 /* quarter notes per whole note */ +#define MIN_VALUE 64 /* the most we can divide a note by */ +#define DFLT_VALUE 4 /* default value (quarter-note) */ +#define FILLTIME 8 /* for articulation, break note in parts */ +#define STACCATO 6 /* 6/8 = 3/4 of note is filled */ +#define NORMAL 7 /* 7/8ths of note interval is filled */ +#define LEGATO 8 /* all of note interval is filled */ +#define DFLT_OCTAVE 4 /* default octave */ +#define MIN_TEMPO 32 /* minimum tempo */ +#define DFLT_TEMPO 120 /* default tempo */ +#define MAX_TEMPO 255 /* max tempo */ +#define NUM_MULT 3 /* numerator of dot multiplier */ +#define DENOM_MULT 2 /* denominator of dot multiplier */ + +/* letter to half-tone: A B C D E F G */ +static int notetab[8] = {9, 11, 0, 2, 4, 5, 7}; + +/* + * This is the American Standard A440 Equal-Tempered scale with frequencies + * rounded to nearest integer. Thank Goddess for the good ol' CRC Handbook... + * our octave 0 is standard octave 2. + */ +#define OCTAVE_NOTES 12 /* semitones per octave */ +static int pitchtab[] = +{ +/* C C# D D# E F F# G G# A A# B*/ +/* 0 */ 65, 69, 73, 78, 82, 87, 93, 98, 103, 110, 117, 123, +/* 1 */ 131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247, +/* 2 */ 262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494, +/* 3 */ 523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988, +/* 4 */ 1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1975, +/* 5 */ 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951, +/* 6 */ 4186, 4435, 4698, 4978, 5274, 5588, 5920, 6272, 6644, 7040, 7459, 7902, +}; + +static void playinit() +{ + octave = DFLT_OCTAVE; + whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / DFLT_TEMPO; + fill = NORMAL; + value = DFLT_VALUE; + octtrack = FALSE; + octprefix = TRUE; /* act as though there was an initial O(n) */ +} + +static void playtone(pitch, value, sustain) +/* play tone of proper duration for current rhythm signature */ +int pitch, value, sustain; +{ + register int sound, silence, snum = 1, sdenom = 1; + + /* this weirdness avoids floating-point arithmetic */ + for (; sustain; sustain--) + { + snum *= NUM_MULT; + sdenom *= DENOM_MULT; + } + + if (pitch == -1) + rest(whole * snum / (value * sdenom)); + else + { + sound = (whole * snum) / (value * sdenom) + - (whole * (FILLTIME - fill)) / (value * FILLTIME); + silence = whole * (FILLTIME-fill) * snum / (FILLTIME * value * sdenom); + +#ifdef DEBUG + printf("playtone: pitch %d for %d ticks, rest for %d ticks\n", + pitch, sound, silence); +#endif /* DEBUG */ + + tone(pitchtab[pitch], sound); + if (fill != LEGATO) + rest(silence); + } +} + +static int abs(n) +int n; +{ + if (n < 0) + return(-n); + else + return(n); +} + +static void playstring(cp, slen) +/* interpret and play an item from a notation string */ +char *cp; +size_t slen; +{ + int pitch, lastpitch = OCTAVE_NOTES * DFLT_OCTAVE; + +#define GETNUM(cp, v) for(v=0; isdigit(cp[1]) && slen > 0; ) \ + {v = v * 10 + (*++cp - '0'); slen--;} + for (; slen--; cp++) + { + int sustain, timeval, tempo; + register char c = toupper(*cp); + +#ifdef DEBUG + printf("playstring: %c (%x)\n", c, c); +#endif /* DEBUG */ + + switch (c) + { + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': + + /* compute pitch */ + pitch = notetab[c - 'A'] + octave * OCTAVE_NOTES; + + /* this may be followed by an accidental sign */ + if (cp[1] == '#' || cp[1] == '+') + { + ++pitch; + ++cp; + slen--; + } + else if (cp[1] == '-') + { + --pitch; + ++cp; + slen--; + } + + /* + * If octave-tracking mode is on, and there has been no octave- + * setting prefix, find the version of the current letter note + * closest to the last regardless of octave. + */ + if (octtrack && !octprefix) + { + if (abs(pitch-lastpitch) > abs(pitch+OCTAVE_NOTES-lastpitch)) + { + ++octave; + pitch += OCTAVE_NOTES; + } + + if (abs(pitch-lastpitch) > abs((pitch-OCTAVE_NOTES)-lastpitch)) + { + --octave; + pitch -= OCTAVE_NOTES; + } + } + octprefix = FALSE; + lastpitch = pitch; + + /* ...which may in turn be followed by an override time value */ + GETNUM(cp, timeval); + if (timeval <= 0 || timeval > MIN_VALUE) + timeval = value; + + /* ...and/or sustain dots */ + for (sustain = 0; cp[1] == '.'; cp++) + { + slen--; + sustain++; + } + + /* time to emit the actual tone */ + playtone(pitch, timeval, sustain); + break; + + case 'O': + if (cp[1] == 'N' || cp[1] == 'n') + { + octprefix = octtrack = FALSE; + ++cp; + slen--; + } + else if (cp[1] == 'L' || cp[1] == 'l') + { + octtrack = TRUE; + ++cp; + slen--; + } + else + { + GETNUM(cp, octave); + if (octave >= sizeof(pitchtab) / OCTAVE_NOTES) + octave = DFLT_OCTAVE; + octprefix = TRUE; + } + break; + + case '>': + if (octave < sizeof(pitchtab) / OCTAVE_NOTES - 1) + octave++; + octprefix = TRUE; + break; + + case '<': + if (octave > 0) + octave--; + octprefix = TRUE; + break; + + case 'N': + GETNUM(cp, pitch); + for (sustain = 0; cp[1] == '.'; cp++) + { + slen--; + sustain++; + } + playtone(pitch - 1, value, sustain); + break; + + case 'L': + GETNUM(cp, value); + if (value <= 0 || value > MIN_VALUE) + value = DFLT_VALUE; + break; + + case 'P': + case '~': + /* this may be followed by an override time value */ + GETNUM(cp, timeval); + if (timeval <= 0 || timeval > MIN_VALUE) + timeval = value; + for (sustain = 0; cp[1] == '.'; cp++) + { + slen--; + sustain++; + } + playtone(-1, timeval, sustain); + break; + + case 'T': + GETNUM(cp, tempo); + if (tempo < MIN_TEMPO || tempo > MAX_TEMPO) + tempo = DFLT_TEMPO; + whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / tempo; + break; + + case 'M': + if (cp[1] == 'N' || cp[1] == 'n') + { + fill = NORMAL; + ++cp; + slen--; + } + else if (cp[1] == 'L' || cp[1] == 'l') + { + fill = LEGATO; + ++cp; + slen--; + } + else if (cp[1] == 'S' || cp[1] == 's') + { + fill = STACCATO; + ++cp; + slen--; + } + break; + } + } +} diff --git a/src/music.c b/src/music.c index 8329cfd..7e2a0fc 100644 --- a/src/music.c +++ b/src/music.c @@ -649,6 +649,9 @@ char *buf; #ifdef VPIX_MUSIC +#ifdef __linux__ +#include <sys/kd.h> +#else # if 0 #include <sys/types.h> #include <sys/console.h> @@ -657,6 +660,7 @@ char *buf; #define KIOC ('K' << 8) #define KDMKTONE (KIOC | 8) # endif +#endif #define noDEBUG @@ -664,24 +668,27 @@ static void tone(hz, ticks) /* emit tone of frequency hz for given number of ticks */ unsigned int hz, ticks; { - ioctl(0,KDMKTONE,hz|((ticks*10)<<16)); + ioctl(0,KDMKTONE,(1193180/hz)|((ticks*10)<<16)); # ifdef DEBUG printf("TONE: %6d %6d\n",hz,ticks * 10); # endif - nap(ticks * 10); + msleep(ticks * 10); } static void rest(ticks) /* rest for given number of ticks */ int ticks; { - nap(ticks * 10); + msleep(ticks * 10); # ifdef DEBUG printf("REST: %6d\n",ticks * 10); # endif } +static void tone(); +static void rest(); +static void speaker(); #include "interp.c" /* from snd86unx.shr */ diff --git a/sys/share/ioctl.c b/sys/share/ioctl.c index 2fd1cfb..cfbfd6a 100644 --- a/sys/share/ioctl.c +++ b/sys/share/ioctl.c @@ -72,6 +72,10 @@ struct termio termio; extern void NDECL(sco_mapon); extern void NDECL(sco_mapoff); #endif +#ifdef __linux__ +extern void NDECL(linux_mapon); +extern void NDECL(linux_mapoff); +#endif #ifdef AUX void @@ -156,6 +160,9 @@ dosuspend() # ifdef _M_UNIX sco_mapon(); # endif +# ifdef __linux__ + linux_mapon(); +# endif (void) signal(SIGTSTP, SIG_DFL); # ifdef AUX ( void ) kill ( 0 , SIGSTOP ) ; @@ -165,6 +172,9 @@ dosuspend() # ifdef _M_UNIX sco_mapoff(); # endif +# ifdef __linux__ + linux_mapoff(); +# endif resume_nhwindows(); } else { pline("I don't think your shell has job control."); diff --git a/sys/share/unixtty.c b/sys/share/unixtty.c index 56b1579..7129683 100644 --- a/sys/share/unixtty.c +++ b/sys/share/unixtty.c @@ -365,6 +365,58 @@ init_sco_cons() } #endif /* _M_UNIX */ +#ifdef __linux__ +# include <sys/vt.h> + +int sco_flag_console = 0; + +void +linux_mapon() +{ +# ifdef TTY_GRAPHICS + if (!strcmp(windowprocs.name, "tty") && sco_flag_console) { + write(1, "\033(B", 3); + } +# endif +} + +void +linux_mapoff() +{ +# ifdef TTY_GRAPHICS + if (!strcmp(windowprocs.name, "tty") && sco_flag_console) { + write(1, "\033(U", 3); + } +# endif +} + +void +check_linux_console() +{ + struct vt_mode vtm; + + if (isatty(0) && ioctl(0,VT_GETMODE,&vtm) >= 0) { + sco_flag_console = 1; + } +} + +void +init_linux_cons() +{ +# ifdef TTY_GRAPHICS + if (!strcmp(windowprocs.name, "tty") && sco_flag_console) { + atexit(linux_mapon); + linux_mapoff(); + switch_graphics(IBM_GRAPHICS); +# ifdef TEXTCOLOR + if (has_colors()) + iflags.use_color = TRUE; +# endif + } +# endif +} +#endif /* __linux__ */ + #ifndef __begui__ /* the Be GUI will define its own error proc */ /* fatal error */ diff --git a/sys/unix/Files b/sys/unix/Files new file mode 100644 index 0000000..42e4046 --- /dev/null +++ b/sys/unix/Files @@ -0,0 +1 @@ +/usr/include/sys/spkr.h diff --git a/sys/unix/Install b/sys/unix/Install new file mode 100644 index 0000000..bf1e716 --- /dev/null +++ b/sys/unix/Install @@ -0,0 +1,37 @@ +# +# Speaker driver installation script +# +TMP=/tmp/speaker.err +ERR1=" Errors have been written to the file $TMP." +ERR2=" The Speaker Driver software was not installed." + +echo "Installing Speaker Driver Software Package" + +/etc/conf/bin/idcheck -p speaker 2>$TMP +if [ $? != 0 ] +then + echo "The speaker package is already at least partly installed. + Removing the old version now..." + /etc/conf/bin/idinstall -d speaker +fi + +/etc/conf/bin/idinstall -a -k speaker 2>>$TMP +if [ $? != 0 ] +then + message "There was an error during package installation. $ERR1 $ERR2" + exit 1 +fi + +/etc/conf/bin/idbuild 2>>$TMP +if [ $? != 0 ] +then + message "There was an error during kernel reconfiguration. $ERR1 $ERR2" + exit 1 +fi + +rm -f $TMP + +cp spkr.h /usr/include/sys/spkr.h + +echo "Performing shutdown..." +cd /; exec /etc/shutdown -g0 -y diff --git a/sys/unix/Makefile b/sys/unix/Makefile new file mode 100644 index 0000000..d0853fa --- /dev/null +++ b/sys/unix/Makefile @@ -0,0 +1,22 @@ +# +# Speaker driver package makefile +# +CFLAGS = -I. -O # -DDEBUG +LDFLAGS = -s + +all: Driver.o + +install: + ./Install + +Driver.o: spkr.c + $(CC) $(CFLAGS) -c spkr.c + mv spkr.o Driver.o + +clean: + rm -f Driver.o *~ speaker.shar + +DSP = Files Install Master Name Node Remove Size System +shar: + shar READ.ME install.bsd spkr.7 Makefile spkr.[ch] \ + interp.c $(DSP) playtest >speaker.shar diff --git a/sys/unix/Makefile.src b/sys/unix/Makefile.src index ebfa843..da48b14 100644 --- a/sys/unix/Makefile.src +++ b/sys/unix/Makefile.src @@ -56,7 +56,7 @@ SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o # if you get setcgtty() warnings during execution, you are feeding gcc # a non-ANSI <sys/ioctl.h> -- either run fixincludes on it or use # -traditional in CFLAGS -# CC = gcc +CC = gcc # # For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following: # @@ -124,8 +124,8 @@ SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o # flags for debugging: # CFLAGS = -g -I../include -CFLAGS = -O -I../include -LFLAGS = +CFLAGS = -O2 -I../include -I/usr/X11R6/include +LFLAGS = -s -L/usr/X11R6/lib # Set the WINSRC, WINOBJ, and WINLIB lines to correspond to your desired @@ -146,8 +146,8 @@ WINX11OBJ = Window.o dialogs.o winX.o winmap.o winmenu.o winmesg.o \ winmisc.o winstat.o wintext.o winval.o tile.o # # -WINSRC = $(WINTTYSRC) -WINOBJ = $(WINTTYOBJ) +WINSRC = $(WINTTYSRC) $(WINX11SRC) +WINOBJ = $(WINTTYOBJ) $(WINX11OBJ) # on some systems the termcap library is in -ltermcap or -lcurses # on 386 Xenix, the -ltermlib tputs() seems not to work; use -lcurses instead @@ -160,20 +160,20 @@ WINOBJ = $(WINTTYOBJ) # # libraries for tty ports # WINTTYLIB = -ltermcap -# WINTTYLIB = -lcurses +WINTTYLIB = -lcurses # WINTTYLIB = -lcurses16 # WINTTYLIB = -lncurses -WINTTYLIB = -ltermlib +# WINTTYLIB = -ltermlib # # libraries for X11 # If USE_XPM is defined in config.h, you will also need -lXpm here. -WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 +# WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 # WINX11LIB = -lXaw -lXmu -lXt -lX11 # WINX11LIB = -lXaw -lXmu -lXext -lXt -lXpm -lX11 -lm -# WINX11LIB = -lXaw -lXmu -lXpm -lXext -lXt -lX11 -lSM -lICE -lm # BSD/OS 2.0 +WINX11LIB = -lXaw -lXmu -lXpm -lXext -lXt -lX11 -lSM -lICE # Linux 2.0 # # -WINLIB = $(WINTTYLIB) +WINLIB = $(WINTTYLIB) $(WINX11LIB) # any other strange libraries your system needs (for Sysunix only -- the more # specialized targets should already be right) diff --git a/sys/unix/Makefile.top b/sys/unix/Makefile.top index 56de355..3fbd419 100644 --- a/sys/unix/Makefile.top +++ b/sys/unix/Makefile.top @@ -36,9 +36,9 @@ GAMEDIR = /usr/games/lib/$(GAME)dir SHELLDIR = /usr/games # per discussion in Install.X11 -VARDATND = +# VARDATND = # VARDATND = x11tiles pet_mark.xbm -# VARDATND = x11tiles pet_mark.xbm rip.xpm +VARDATND = x11tiles pet_mark.xbm rip.xpm VARDATD = data oracles options quest.dat rumors VARDAT = $(VARDATD) $(VARDATND) diff --git a/sys/unix/Makefile.utl b/sys/unix/Makefile.utl index 4ba4e61..ce2144c 100644 --- a/sys/unix/Makefile.utl +++ b/sys/unix/Makefile.utl @@ -15,7 +15,7 @@ # if you are using gcc as your compiler, # uncomment the CC definition below if it's not in your environment -# CC = gcc +CC = gcc # # For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following: # @@ -78,17 +78,17 @@ # flags for debugging: # CFLAGS = -g -I../include -CFLAGS = -O -I../include -LFLAGS = +CFLAGS = -O2 -I../include +LFLAGS = -s # yacc/lex programs to use to generate *_comp.h, *_lex.c, and *_yacc.c. # if, instead of yacc/lex you have bison/flex, comment/uncomment the following. -YACC = yacc -LEX = lex -# YACC = bison -y +# YACC = yacc +# LEX = lex +YACC = bison -y # YACC = byacc -# LEX = flex +LEX = flex # these are the names of the output files from YACC/LEX. Under MS-DOS # and similar systems, they may differ diff --git a/sys/unix/Master b/sys/unix/Master new file mode 100644 index 0000000..7979f46 --- /dev/null +++ b/sys/unix/Master @@ -0,0 +1 @@ +speaker ocwi iocH spkr 0 0 1 1 -1 diff --git a/sys/unix/Name b/sys/unix/Name new file mode 100644 index 0000000..e608cf1 --- /dev/null +++ b/sys/unix/Name @@ -0,0 +1 @@ +386 UNIX Speaker Device Driver Package diff --git a/sys/unix/Node b/sys/unix/Node new file mode 100644 index 0000000..9d9fefb --- /dev/null +++ b/sys/unix/Node @@ -0,0 +1 @@ +speaker speaker c 0 diff --git a/sys/unix/READ.ME b/sys/unix/READ.ME new file mode 100644 index 0000000..e02392a --- /dev/null +++ b/sys/unix/READ.ME @@ -0,0 +1,51 @@ + Console Speaker Driver Package (v1.1) + + by Eric S. Raymond ([email protected]) + +This package gives 80386 machines running SVr3.2 or later the ability to play +tunes on the console speaker. It has been extended to 386BSD (and possibly +BSDI) by Andrew A. Chernov, and to SCO UNIX 3.2.4 (and possibly other VPIX +systems) by Andreas Arens. + +The following files are contained in the kit: + +Documentation and examples: +READ.ME -- this file +speaker.7 -- man page for the driver +playtest -- test script exercising familiar tunes + +Installable driver kit parts, for SVr3.2 or later: +Files -- list of driver package file locations +Install -- installation script for driver kit +Master -- mdevice entry for speaker driver +Name -- name entry foe speaker driver +Node -- /dev node specification file +Remove -- Driver removal script +Size -- installation size data +System -- sdevice entry for speaker driver + +Driver source code, for SVr3.2 or later and 386BSD: +Makefile -- Makefile for driver code +spkr.c -- the driver source +speaker.h -- ioctl interface file + +Common source code: +interp.c -- play string interpretation code + +For SVr3.2 or later, simply type `make' and wait. Then type ./Install +and follow its instructions. You will have to install the man pages by hand. +Be aware that the speaker.7 man page uses tbl(1) constructs. + +For 386BSD, follow the installation instructions in install.bsd. + +For SCO UNIX 3.2.4, no new kernel drivers are needed, and you need only +copy interp.c to your src directory and proceed with making NetHack, with +VPIX_MUSIC set in unixconf.h. + +Interesting tunes mailed to the author will be periodically posted in batches +and added to the test script for future versions. + + Revision notes + +1.1 -- fixed minor bug in M[LSN] interpretation, added octave-tracking. + Tweaked the playtest examples. diff --git a/sys/unix/Remove b/sys/unix/Remove new file mode 100644 index 0000000..236b574 --- /dev/null +++ b/sys/unix/Remove @@ -0,0 +1,25 @@ +# +# Speaker driver remove script +# +TMP=/tmp/speaker.err +RERR="Errors have been written to the file $TMP." + +echo "Removing Speaker Driver Software Package" + +/etc/conf/bin/idinstall -d speaker 2>$TMP +if [ $? != 0 ] +then + message "There was an error during package removal. $RERR" + exit 1 +fi + +/etc/conf/bin/idbuild 2>>$TMP +if [ $? != 0 ] +then + message "There was an error during kernel reconfiguration. $RERR" + exit 1 +fi + +rm -f /dev/speaker $TMP /usr/include/sys/spkr.h + +exit 0 diff --git a/sys/unix/Size b/sys/unix/Size new file mode 100644 index 0000000..8545de0 --- /dev/null +++ b/sys/unix/Size @@ -0,0 +1,2 @@ +ROOT=1400 +USR=100 diff --git a/sys/unix/System b/sys/unix/System new file mode 100644 index 0000000..4a7b37b --- /dev/null +++ b/sys/unix/System @@ -0,0 +1 @@ +speaker Y 1 0 0 0 0 0 0 0 diff --git a/sys/unix/install.bsd b/sys/unix/install.bsd new file mode 100644 index 0000000..def1498 --- /dev/null +++ b/sys/unix/install.bsd @@ -0,0 +1,59 @@ +Copy spkr.c and interp.c to /sys/i386/isa +Copy spkr.h to /sys/sys + +----------------------------------------------------------------------------- + +File /sys/i386/conf/YOUR_MACHINE_NAME +add following line: + +pseudo-device speaker + +----------------------------------------------------------------------------- + +File /sys/i386/conf/files.i386 +add following line: + +i386/isa/spkr.c optional speaker + +----------------------------------------------------------------------------- + +File /sys/i386/i386/conf.c +[major number 20 (hex) is registered for spkr driver, don't change it] +add following code: + +#include "speaker.h" +#if NSPEAKER > 0 +int spkropen(),spkrclose(),spkrwrite(),spkrioctl(); +#else +#define spkropen enxio +#define spkrclose enxio +#define spkrwrite enxio +#define spkrioctl enxio +#endif + ... + +struct cdevsw cdevsw[] = +{ + ... + + { spkropen, spkrclose, enxio, spkrwrite, /*20*/ + spkrioctl, enxio, enxio, NULL, + enxio, enxio, enxio }, + ... + +----------------------------------------------------------------------------- + +Make corresponding device: + + mknod /dev/speaker c 32 0 + +[major number 32 (20 hex) is registered for spkr driver, don't change it] + +----------------------------------------------------------------------------- + +Go to /sys/i386/conf and type + config YOUR_MACHINE_NAME +then go to /sys/compile/YOUR_MACHINE_NAME and type + make depend + make + diff --git a/sys/unix/interp.c b/sys/unix/interp.c new file mode 100644 index 0000000..55cfe0b --- /dev/null +++ b/sys/unix/interp.c @@ -0,0 +1,309 @@ +/* + * interp.c -- device driver for console speaker on 80386 + * + * v1.1 by Eric S. Raymond ([email protected]) Feb 1990 + * + * this is the part of the code common to all 386 UNIX OSes + * + * playinit() and playstring() are called from the appropriate driver + */ + +#ifdef __386BSD__ +#include "param.h" +#else +#include <sys/param.h> +#endif + +#ifndef HZ +#define HZ 60 +#endif + + +/**************** PLAY STRING INTERPRETER BEGINS HERE ********************** + * + * Play string interpretation is modelled on IBM BASIC 2.0's PLAY statement; + * M[LNS] are missing and the ~ synonym and octave-tracking facility is added. + * Requires tone(), rest(), and endtone(). String play is not interruptible + * except possibly at physical block boundaries. + */ + +typedef int bool; +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define toupper(c) ((c) - ' ' * (((c) >= 'a') && ((c) <= 'z'))) +#define isdigit(c) (((c) >= '0') && ((c) <= '9')) +#define dtoi(c) ((c) - '0') + +static int octave; /* currently selected octave */ +static int whole; /* whole-note time at current tempo, in ticks */ +static int value; /* whole divisor for note time, quarter note = 1 */ +static int fill; /* controls spacing of notes */ +static bool octtrack; /* octave-tracking on? */ +static bool octprefix; /* override current octave-tracking state? */ + +/* + * Magic number avoidance... + */ +#define SECS_PER_MIN 60 /* seconds per minute */ +#define WHOLE_NOTE 4 /* quarter notes per whole note */ +#define MIN_VALUE 64 /* the most we can divide a note by */ +#define DFLT_VALUE 4 /* default value (quarter-note) */ +#define FILLTIME 8 /* for articulation, break note in parts */ +#define STACCATO 6 /* 6/8 = 3/4 of note is filled */ +#define NORMAL 7 /* 7/8ths of note interval is filled */ +#define LEGATO 8 /* all of note interval is filled */ +#define DFLT_OCTAVE 4 /* default octave */ +#define MIN_TEMPO 32 /* minimum tempo */ +#define DFLT_TEMPO 120 /* default tempo */ +#define MAX_TEMPO 255 /* max tempo */ +#define NUM_MULT 3 /* numerator of dot multiplier */ +#define DENOM_MULT 2 /* denominator of dot multiplier */ + +/* letter to half-tone: A B C D E F G */ +static int notetab[8] = {9, 11, 0, 2, 4, 5, 7}; + +/* + * This is the American Standard A440 Equal-Tempered scale with frequencies + * rounded to nearest integer. Thank Goddess for the good ol' CRC Handbook... + * our octave 0 is standard octave 2. + */ +#define OCTAVE_NOTES 12 /* semitones per octave */ +static int pitchtab[] = +{ +/* C C# D D# E F F# G G# A A# B*/ +/* 0 */ 65, 69, 73, 78, 82, 87, 93, 98, 103, 110, 117, 123, +/* 1 */ 131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247, +/* 2 */ 262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494, +/* 3 */ 523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988, +/* 4 */ 1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1975, +/* 5 */ 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951, +/* 6 */ 4186, 4435, 4698, 4978, 5274, 5588, 5920, 6272, 6644, 7040, 7459, 7902, +}; + +static void playinit() +{ + octave = DFLT_OCTAVE; + whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / DFLT_TEMPO; + fill = NORMAL; + value = DFLT_VALUE; + octtrack = FALSE; + octprefix = TRUE; /* act as though there was an initial O(n) */ +} + +static void playtone(pitch, value, sustain) +/* play tone of proper duration for current rhythm signature */ +int pitch, value, sustain; +{ + register int sound, silence, snum = 1, sdenom = 1; + + /* this weirdness avoids floating-point arithmetic */ + for (; sustain; sustain--) + { + snum *= NUM_MULT; + sdenom *= DENOM_MULT; + } + + if (pitch == -1) + rest(whole * snum / (value * sdenom)); + else + { + sound = (whole * snum) / (value * sdenom) + - (whole * (FILLTIME - fill)) / (value * FILLTIME); + silence = whole * (FILLTIME-fill) * snum / (FILLTIME * value * sdenom); + +#ifdef DEBUG + printf("playtone: pitch %d for %d ticks, rest for %d ticks\n", + pitch, sound, silence); +#endif /* DEBUG */ + + tone(pitchtab[pitch], sound); + if (fill != LEGATO) + rest(silence); + } +} + +static int abs(n) +int n; +{ + if (n < 0) + return(-n); + else + return(n); +} + +static void playstring(cp, slen) +/* interpret and play an item from a notation string */ +char *cp; +size_t slen; +{ + int pitch, lastpitch = OCTAVE_NOTES * DFLT_OCTAVE; + +#define GETNUM(cp, v) for(v=0; isdigit(cp[1]) && slen > 0; ) \ + {v = v * 10 + (*++cp - '0'); slen--;} + for (; slen--; cp++) + { + int sustain, timeval, tempo; + register char c = toupper(*cp); + +#ifdef DEBUG + printf("playstring: %c (%x)\n", c, c); +#endif /* DEBUG */ + + switch (c) + { + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': + + /* compute pitch */ + pitch = notetab[c - 'A'] + octave * OCTAVE_NOTES; + + /* this may be followed by an accidental sign */ + if (cp[1] == '#' || cp[1] == '+') + { + ++pitch; + ++cp; + slen--; + } + else if (cp[1] == '-') + { + --pitch; + ++cp; + slen--; + } + + /* + * If octave-tracking mode is on, and there has been no octave- + * setting prefix, find the version of the current letter note + * closest to the last regardless of octave. + */ + if (octtrack && !octprefix) + { + if (abs(pitch-lastpitch) > abs(pitch+OCTAVE_NOTES-lastpitch)) + { + ++octave; + pitch += OCTAVE_NOTES; + } + + if (abs(pitch-lastpitch) > abs((pitch-OCTAVE_NOTES)-lastpitch)) + { + --octave; + pitch -= OCTAVE_NOTES; + } + } + octprefix = FALSE; + lastpitch = pitch; + + /* ...which may in turn be followed by an override time value */ + GETNUM(cp, timeval); + if (timeval <= 0 || timeval > MIN_VALUE) + timeval = value; + + /* ...and/or sustain dots */ + for (sustain = 0; cp[1] == '.'; cp++) + { + slen--; + sustain++; + } + + /* time to emit the actual tone */ + playtone(pitch, timeval, sustain); + break; + + case 'O': + if (cp[1] == 'N' || cp[1] == 'n') + { + octprefix = octtrack = FALSE; + ++cp; + slen--; + } + else if (cp[1] == 'L' || cp[1] == 'l') + { + octtrack = TRUE; + ++cp; + slen--; + } + else + { + GETNUM(cp, octave); + if (octave >= sizeof(pitchtab) / OCTAVE_NOTES) + octave = DFLT_OCTAVE; + octprefix = TRUE; + } + break; + + case '>': + if (octave < sizeof(pitchtab) / OCTAVE_NOTES - 1) + octave++; + octprefix = TRUE; + break; + + case '<': + if (octave > 0) + octave--; + octprefix = TRUE; + break; + + case 'N': + GETNUM(cp, pitch); + for (sustain = 0; cp[1] == '.'; cp++) + { + slen--; + sustain++; + } + playtone(pitch - 1, value, sustain); + break; + + case 'L': + GETNUM(cp, value); + if (value <= 0 || value > MIN_VALUE) + value = DFLT_VALUE; + break; + + case 'P': + case '~': + /* this may be followed by an override time value */ + GETNUM(cp, timeval); + if (timeval <= 0 || timeval > MIN_VALUE) + timeval = value; + for (sustain = 0; cp[1] == '.'; cp++) + { + slen--; + sustain++; + } + playtone(-1, timeval, sustain); + break; + + case 'T': + GETNUM(cp, tempo); + if (tempo < MIN_TEMPO || tempo > MAX_TEMPO) + tempo = DFLT_TEMPO; + whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / tempo; + break; + + case 'M': + if (cp[1] == 'N' || cp[1] == 'n') + { + fill = NORMAL; + ++cp; + slen--; + } + else if (cp[1] == 'L' || cp[1] == 'l') + { + fill = LEGATO; + ++cp; + slen--; + } + else if (cp[1] == 'S' || cp[1] == 's') + { + fill = STACCATO; + ++cp; + slen--; + } + break; + } + } +} diff --git a/sys/unix/playtest b/sys/unix/playtest new file mode 100644 index 0000000..a6a7f07 --- /dev/null +++ b/sys/unix/playtest @@ -0,0 +1,25 @@ +: +# Test script for the speaker driver +# +# v1.0 by Eric S. Raymond (Feb 1990) +# modified for 386bsd by Andrew A. Chernov <[email protected]> +# +reveille="t255l8c.f.afc~c.f.afc~c.f.afc.f.a..f.~c.f.afc~c.f.afc~c.f.afc~c.f.." +contact="<cd<a#~<a#>f" +dance="t240<cfcfgagaa#b#>dc<a#a.~fg.gaa#.agagegc.~cfcfgagaa#b#>dc<a#a.~fg.gga.agfgfgf." +loony="t255cf8f8edc<a.>~cf8f8edd#e.~ce8cdce8cd.<a>c8c8c#def8af8." + +case $1 in +reveille) echo $reveille >/dev/speaker;; +contact) echo $contact >/dev/speaker;; +dance) echo $dance >/dev/speaker;; +loony) echo $loony >/dev/speaker;; +*) + echo "No such tune. Available tunes are:" + echo + echo "reveille -- Reveille" + echo "contact -- Contact theme from Close Encounters" + echo "dance -- Lord of the Dance (aka Simple Gifts)" + echo "loony -- Loony Toons theme" + ;; +esac diff --git a/sys/unix/spkr.7 b/sys/unix/spkr.7 new file mode 100644 index 0000000..7c20280 --- /dev/null +++ b/sys/unix/spkr.7 @@ -0,0 +1,117 @@ +.TH SPKR 7 +.SH NAME +spkr \- console speaker device driver +.SH DESCRIPTION +The speaker device driver allows applications to control the PC console +speaker on an IBM-PC-compatible machine running UNIX. +.PP +Only one process may have this device open at any given time; open() and +close() are used to lock and relinquish it. An attempt to open() when +another process has the device locked will return -1 with an EBUSY error +indication. Writes to the device are interpreted as 'play strings' in a +simple ASCII melody notation. An ioctl() for tone generation at arbitrary +frequencies is also supported. +.PP +Sound-generation does \fInot\fR monopolize the processor; in fact, the driver +spends most of its time sleeping while the PC hardware is emitting +tones. Other processes may emit beeps while the driver is running. +.PP +Applications may call ioctl() on a speaker file descriptor to control the +speaker driver directly; definitions for the ioctl() interface are in +sys/spkr.h. The tone_t structure used in these calls has two fields, +specifying a frequency (in hz) and a duration (in 1/100ths of a second). +A frequency of zero is interpreted as a rest. +.PP +At present there are two such ioctls. SPKRTONE accepts a pointer to a +single tone structure as third argument and plays it. SPKRTUNE accepts a +pointer to the first of an array of tone structures and plays them in +continuous sequence; this array must be terminated by a final member with +a zero duration. +.PP +The play-string language is modelled on the PLAY statement conventions of +IBM BASIC 2.0. The MB, MF and X primitives of PLAY are not useful in a UNIX +environment and are omitted. The `octave-tracking' feature is also new. +.PP +There are 84 accessible notes numbered 1-83 in 7 octaves, each running from +C to B, numbered 0-6; the scale is equal-tempered A440 and octave 3 starts +with middle C. By default, the play function emits half-second notes with the +last 1/16th second being `rest time'. +.PP +Play strings are interpreted left to right as a series of play command groups; +letter case is ignored. Play command groups are as follows: +.PP +CDEFGAB -- letters A through G cause the corresponding note to be played in the +current octave. A note letter may optionally be followed by an \fIaccidental +sign\fR, one of # + or -; the first two of these cause it to be sharped one +half-tone, the last causes it to be flatted one half-tone. It may also be +followed by a time value number and by sustain dots (see below). Time values +are interpreted as for the L command below;. +.PP +O <n> -- if <n> is numeric, this sets the current octave. <n> may also be one +of 'L' or 'N' to enable or disable octave-tracking (it is disabled by default). +When octave-tracking is on, interpretation of a pair of letter notes will +change octaves if necessary in order to make the smallest possible jump between +notes. Thus "olbc" will be played as "olb>c", and "olcb" as "olc<b". Octave +locking is disabled for one letter note following by >, < and O[0123456]. +.PP +> -- bump the current octave up one. +.PP +< -- drop the current octave down one. +.PP +N <n> -- play note n, n being 1 to 84 or 0 for a rest of current time value. +May be followedv by sustain dots. +.PP +L <n> -- sets the current time value for notes. The default is L4, quarter +notes. The lowest possible value is 1; values up to 64 are accepted. L1 sets +whole notes, L2 sets half notes, L4 sets quarter notes, etc.. +.PP +P <n> -- pause (rest), with <n> interpreted as for L. May be followed by +sustain dots. May also be written '~'. +.PP +T <n> -- Sets the number of quarter notes per minute; default is 120. Musical +names for common tempi are: + +.TS +a a a. + Tempo Beats Per Minute +very slow Larghissimo + Largo 40-60 + Larghetto 60-66 + Grave + Lento + Adagio 66-76 +slow Adagietto + Andante 76-108 +medium Andantino + Moderato 108-120 +fast Allegretto + Allegro 120-168 + Vivace + Veloce + Presto 168-208 +very fast Prestissimo +.TE +.PP +M[LNS] -- set articulation. MN (N for normal) is the default; the last 1/8th of +the note's value is rest time. You can set ML for legato (no rest space) or +MS (staccato) 1/4 rest space. +.PP +Notes (that is, CDEFGAB or N command character groups) may be followed by +sustain dots. Each dot causes the note's value to be lengthened by one-half +for each one. Thus, a note dotted once is held for 3/2 of its undotted value; +dotted twice, it is held 9/4, and three times would give 27/8. +.PP +Whitespace in play strings is simply skipped and may be used to separate +melody sections. +.SH BUGS +Due to roundoff in the pitch tables and slop in the tone-generation and timer +hardware (neither of which was designed for precision), neither pitch accuracy +nor timings will be mathematically exact. There is no volume control. +.PP +In play strings which are very long (longer than your system's physical I/O +blocks) note suffixes or numbers may occasionally be parsed incorrectly due +to crossing a block boundary. +.SH FILES +/dev/speaker -- speaker device file +.SH AUTHOR +Eric S. Raymond ([email protected]) Feb 1990 diff --git a/sys/unix/spkr.c b/sys/unix/spkr.c new file mode 100644 index 0000000..d100d0c --- /dev/null +++ b/sys/unix/spkr.c @@ -0,0 +1,305 @@ +/* + * spkr.c -- device driver for console speaker on 80386 + * + * v1.1 by Eric S. Raymond ([email protected]) Feb 1990 + * modified for 386bsd by Andrew A. Chernov <[email protected]> + */ + +#ifdef __386BSD__ +#include "speaker.h" +#endif +#if !defined(__386BSD__) || (NSPEAKER > 0) + +#ifdef __386BSD__ +#include "types.h" +#include "param.h" +#include "errno.h" +#include "buf.h" +#include "uio.h" + +#define CADDR caddr_t +#define err_ret(x) return(x) +#else /* SYSV */ +#include <sys/types.h> +#include <sys/param.h> +#include <sys/dir.h> +#include <sys/signal.h> +#include <sys/errno.h> +#include <sys/ioctl.h> +#include <sys/user.h> +#include <sys/sysmacros.h> +#include <limits.h> + +#define CADDR char * +#define err_ret(x) u.u_error = (x) +#endif + +#include "spkr.h" + +/**************** MACHINE DEPENDENT PART STARTS HERE ************************* + * + * This section defines a function tone() which causes a tone of given + * frequency and duration from the 80x86's console speaker. + * Another function endtone() is defined to force sound off, and there is + * also a rest() entry point to do pauses. + * + * Audible sound is generated using the Programmable Interval Timer (PIT) and + * Programmable Peripheral Interface (PPI) attached to the 80x86's speaker. The + * PPI controls whether sound is passed through at all; the PIT's channel 2 is + * used to generate clicks (a square wave) of whatever frequency is desired. + * + * The non-BSD code requires SVr3.2-compatible inb(), outb(), timeout(), + * sleep(), and wakeup(). + */ + +/* + * PIT and PPI port addresses and control values + * + * Most of the magic is hidden in the TIMER_PREP value, which selects PIT + * channel 2, frequency LSB first, square-wave mode and binary encoding. + * The encoding is as follows: + * + * +----------+----------+---------------+-----+ + * | 1 0 | 1 1 | 0 1 1 | 0 | + * | SC1 SC0 | RW1 RW0 | M2 M1 M0 | BCD | + * +----------+----------+---------------+-----+ + * Counter Write Mode 3 Binary + * Channel 2 LSB first, (Square Wave) Encoding + * MSB second + */ +#define PPI 0x61 /* port of Programmable Peripheral Interface */ +#define PPI_SPKR 0x03 /* turn these PPI bits on to pass sound */ +#define PIT_CTRL 0x43 /* PIT control address */ +#define PIT_COUNT 0x42 /* PIT count address */ +#define PIT_MODE 0xB6 /* set timer mode for sound generation */ + +/* + * Magic numbers for timer control. + */ +#define TIMER_CLK 1193180L /* corresponds to 18.2 MHz tick rate */ + +static int endtone() +/* turn off the speaker, ending current tone */ +{ + wakeup((CADDR)endtone); + outb(PPI, inb(PPI) & ~PPI_SPKR); +} + +static void tone(hz, ticks) +/* emit tone of frequency hz for given number of ticks */ +unsigned int hz, ticks; +{ + unsigned int divisor = TIMER_CLK / hz; + int sps; + +#ifdef DEBUG + printf("tone: hz=%d ticks=%d\n", hz, ticks); +#endif /* DEBUG */ + + /* set timer to generate clicks at given frequency in Hertz */ +#ifdef __386BSD__ + sps = spltty(); +#else + sps = spl5(); +#endif + outb(PIT_CTRL, PIT_MODE); /* prepare timer */ + outb(PIT_COUNT, (unsigned char) divisor); /* send lo byte */ + outb(PIT_COUNT, (divisor >> 8)); /* send hi byte */ + splx(sps); + + /* turn the speaker on */ + outb(PPI, inb(PPI) | PPI_SPKR); + + /* + * Set timeout to endtone function, then give up the timeslice. + * This is so other processes can execute while the tone is being + * emitted. + */ + timeout((CADDR)endtone, (CADDR)NULL, ticks); + sleep((CADDR)endtone, PZERO - 1); +} + +static int endrest() +/* end a rest */ +{ + wakeup((CADDR)endrest); +} + +static void rest(ticks) +/* rest for given number of ticks */ +int ticks; +{ + /* + * Set timeout to endrest function, then give up the timeslice. + * This is so other processes can execute while the rest is being + * waited out. + */ +#ifdef DEBUG + printf("rest: %d\n", ticks); +#endif /* DEBUG */ + timeout((CADDR)endrest, (CADDR)NULL, ticks); + sleep((CADDR)endrest, PZERO - 1); +} + +#include "interp.c" /* playinit() and playstring() */ + +/******************* UNIX DRIVER HOOKS BEGIN HERE ************************** + * + * This section implements driver hooks to run playstring() and the tone(), + * endtone(), and rest() functions defined above. For non-BSD systems, + * SVr3.2-compatible copyin() is also required. + */ + +static int spkr_active; /* exclusion flag */ +#ifdef __386BSD__ +static struct buf *spkr_inbuf; /* incoming buf */ +#endif + +int spkropen(dev) +dev_t dev; +{ +#ifdef DEBUG + printf("spkropen: entering with dev = %x\n", dev); +#endif /* DEBUG */ + + if (minor(dev) != 0) + err_ret(ENXIO); + else if (spkr_active) + err_ret(EBUSY); + else + { + playinit(); +#ifdef __386BSD__ + spkr_inbuf = geteblk(DEV_BSIZE); +#endif + spkr_active = 1; + } +#ifdef __386BSD__ + return(0); +#endif +} + +#ifdef __386BSD__ +int spkrwrite(dev, uio) +struct uio *uio; +#else +int spkrwrite(dev) +#endif +dev_t dev; +{ +#ifdef __386BSD__ + register unsigned n; + char *cp; + int error; +#endif +#ifdef DEBUG +#ifdef __386BSD__ + printf("spkrwrite: entering with dev = %x, count = %d\n", + dev, uio->uio_resid); +#else + printf("spkrwrite: entering with dev = %x, u.u_count = %d\n", + dev, u.u_count); +#endif +#endif /* DEBUG */ + + if (minor(dev) != 0) + err_ret(ENXIO); + else + { +#ifdef __386BSD__ + n = MIN(DEV_BSIZE, uio->uio_resid); + cp = spkr_inbuf->b_un.b_addr; + error = uiomove(cp, n, uio); + if (!error) + playstring(cp, n); + return(error); +#else + char bfr[STD_BLK]; + + copyin(u.u_base, bfr, u.u_count); + playstring(bfr, u.u_count); + u.u_base += u.u_count; + u.u_count = 0; +#endif + } +} + +int spkrclose(dev) +dev_t dev; +{ +#ifdef DEBUG + printf("spkrclose: entering with dev = %x\n", dev); +#endif /* DEBUG */ + + if (minor(dev) != 0) + err_ret(ENXIO); + else + { + endtone(); +#ifdef __386BSD__ + brelse(spkr_inbuf); +#endif + spkr_active = 0; + } +#ifdef __386BSD__ + return(0); +#endif +} + +int spkrioctl(dev, cmd, cmdarg) +dev_t dev; +int cmd; +CADDR cmdarg; +{ +#ifdef DEBUG + printf("spkrioctl: entering with dev = %x, cmd = %x\n", dev, cmd); +#endif /* DEBUG */ + + if (minor(dev) != 0) + err_ret(ENXIO); + else if (cmd == SPKRTONE) + { + tone_t *tp = (tone_t *)cmdarg; + + if (tp->frequency == 0) + rest(tp->duration); + else + tone(tp->frequency, tp->duration); + } + else if (cmd == SPKRTUNE) + { +#ifdef __386BSD__ + tone_t *tp = (tone_t *)(*(caddr_t *)cmdarg); + tone_t ttp; + int error; + + for (; ; tp++) { + error = copyin(tp, &ttp, sizeof(tone_t)); + if (error) + return(error); + if (ttp.duration == 0) + break; + if (ttp.frequency == 0) + rest(ttp.duration); + else + tone(ttp.frequency, ttp.duration); + } +#else + tone_t *tp = (tone_t *)cmdarg; + + for (; tp->duration; tp++) + if (tp->frequency == 0) + rest(tp->duration); + else + tone(tp->frequency, tp->duration); +#endif + } + else + err_ret(EINVAL); +#ifdef __386BSD__ + return(0); +#endif +} + +#endif /* !defined(__386BSD__) || (NSPEAKER > 0) */ +/* spkr.c ends here */ diff --git a/sys/unix/spkr.h b/sys/unix/spkr.h new file mode 100644 index 0000000..98252ef --- /dev/null +++ b/sys/unix/spkr.h @@ -0,0 +1,34 @@ +/* + * spkr.h -- interface definitions for speaker ioctl() + * + * v1.1 by Eric S. Raymond ([email protected]) Feb 1990 + * modified for 386bsd by Andrew A. Chernov <[email protected]> + */ + +#ifndef _SPKR_H_ +#define _SPKR_H_ + +#ifdef __386BSD__ +#ifndef KERNEL +#include <sys/ioctl.h> +#else +#include "ioctl.h" +#endif + +#define SPKRTONE _IOW('S', 1, tone_t) /* emit tone */ +#define SPKRTUNE _IO('S', 2) /* emit tone sequence*/ +#else /* SYSV */ +#define SPKRIOC ('S'<<8) +#define SPKRTONE (SPKRIOC|1) /* emit tone */ +#define SPKRTUNE (SPKRIOC|2) /* emit tone sequence*/ +#endif + +typedef struct +{ + int frequency; /* in hertz */ + int duration; /* in 1/100ths of a second */ +} +tone_t; + +#endif /* _SPKR_H_ */ +/* spkr.h ends here */ diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 28fd734..f10f6b8 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -34,6 +34,10 @@ static void FDECL(process_options, (int, char **)); extern void NDECL(check_sco_console); extern void NDECL(init_sco_cons); #endif +#ifdef __linux__ +extern void NDECL(check_linux_console); +extern void NDECL(init_linux_cons); +#endif static void NDECL(wd_message); #ifdef WIZARD @@ -120,12 +124,18 @@ char *argv[]; #ifdef _M_UNIX check_sco_console(); #endif +#ifdef __linux__ + check_linux_console(); +#endif initoptions(); init_nhwindows(&argc,argv); exact_username = whoami(); #ifdef _M_UNIX init_sco_cons(); #endif +#ifdef __linux__ + init_linux_cons(); +#endif /* * It seems you really want to play. @@ -176,15 +186,15 @@ char *argv[]; (void) signal(SIGINT,SIG_IGN); if(!locknum) #ifdef DEBIAN - Sprintf(lock, "/var/lib/games/nethack/%d%s", (int)getuid(), plname); + Sprintf(lock, "/var/lib/games/nethack/%d%s", (int)getuid(), plname); #else - Sprintf(lock, "%d%s", (int)getuid(), plname); + Sprintf(lock, "%d%s", (int)getuid(), plname); #endif getlock(); #ifdef WIZARD } else { #ifdef DEBIAN - Sprintf(lock, "/var/lib/games/nethack/%d%s", (int)getuid(), plname); + Sprintf(lock, "/var/lib/games/nethack/%d%s", (int)getuid(), plname); #else Sprintf(lock, "%d%s", (int)getuid(), plname); #endif diff --git a/sys/unix/unixunix.c b/sys/unix/unixunix.c index af5b0ea..6a9b7f2 100644 --- a/sys/unix/unixunix.c +++ b/sys/unix/unixunix.c @@ -17,6 +17,10 @@ extern void NDECL(sco_mapon); extern void NDECL(sco_mapoff); #endif +#ifdef __linux__ +extern void NDECL(linux_mapon); +extern void NDECL(linux_mapoff); +#endif static struct stat buf, hbuf; @@ -180,11 +184,10 @@ getlock() wait_synch(); error("%s", ""); } - #ifdef DEBIAN - regularize(lock); -#else regularize(lock+23); +#else + regularize(lock); #endif set_levelfile_name(lock, 0); @@ -323,6 +326,9 @@ int wt; #ifdef _M_UNIX sco_mapon(); #endif +#ifdef __linux__ + linux_mapon(); +#endif if((f = fork()) == 0){ /* child */ (void) setgid(getgid()); (void) setuid(getuid()); @@ -342,6 +348,9 @@ int wt; #ifdef _M_UNIX sco_mapoff(); #endif +#ifdef __linux__ + linux_mapoff(); +#endif (void) signal(SIGINT, (SIG_RET_TYPE) done1); #ifdef WIZARD if(wizard) (void) signal(SIGQUIT,SIG_DFL); diff --git a/util/Makefile b/util/Makefile index de3a07e..ce2144c 100644 --- a/util/Makefile +++ b/util/Makefile @@ -15,7 +15,7 @@ # if you are using gcc as your compiler, # uncomment the CC definition below if it's not in your environment -CC = /usr/bin/i486-linuxlibc1-gcc +CC = gcc # # For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following: # @@ -64,8 +64,8 @@ CC = /usr/bin/i486-linuxlibc1-gcc # flags for Linux # compile normally -CFLAGS = -O2 -fomit-frame-pointer -I../include -I/usr/X11R6/include -DDEBIAN -LFLAGS = -L/usr/X11R6/lib +# CFLAGS = -O2 -fomit-frame-pointer -I../include -I/usr/X11/include +# LFLAGS = -L/usr/X11/lib # OR compile backwards compatible a.out format # CFLAGS = -O2 -b i486-linuxaout -fomit-frame-pointer -I../include -I/usr/X11/include # LFLAGS = -b i486-linuxaout -L/usr/X11/lib @@ -78,8 +78,8 @@ LFLAGS = -L/usr/X11R6/lib # flags for debugging: # CFLAGS = -g -I../include -# CFLAGS = -O -I../include -# LFLAGS = +CFLAGS = -O2 -I../include +LFLAGS = -s # yacc/lex programs to use to generate *_comp.h, *_lex.c, and *_yacc.c. diff --git a/util/recover.c b/util/recover.c index a0513b7..0fe85f5 100644 --- a/util/recover.c +++ b/util/recover.c @@ -53,13 +53,23 @@ char *argv[]; char *startdir = (char *)0; #endif +#ifdef DEBIAN + if (argc == 1) { + Fprintf(stderr, + "Usage: %s base1 base2 ...\n", argv[0]); + exit(EXIT_FAILURE); + } +#else if (argc == 1 || (argc == 2 && !strcmp(argv[1], "-"))) { Fprintf(stderr, "Usage: %s [-d directory] base1 base2 ...\n", argv[0]); exit(EXIT_FAILURE); } +#endif argno = 1; + +#ifndef DEBIAN if (!strncmp(argv[argno], "-d", 2)) { dir = argv[argno]+2; if (*dir == '=' || *dir == ':') dir++; @@ -78,16 +88,17 @@ char *argv[]; if (!dir) dir = getenv("NETHACKDIR"); if (!dir) dir = getenv("HACKDIR"); -#if defined(SECURE) && !defined(VMS) +# if defined(SECURE) && !defined(VMS) if (dir -# ifdef HACKDIR +# ifdef HACKDIR && strcmp(dir, HACKDIR) -# endif +# endif ) { (void) setgid(getgid()); (void) setuid(getuid()); } -#endif /* SECURE && !VMS */ +# endif /* SECURE && !VMS */ +#endif /* DEBIAN */ #ifdef HACKDIR if (!dir) dir = HACKDIR; diff --git a/win/tty/termcap.c b/win/tty/termcap.c index db3579d..2a7aa38 100644 --- a/win/tty/termcap.c +++ b/win/tty/termcap.c @@ -41,8 +41,9 @@ struct tc_lcl_data tc_lcl_data = { 0, 0, 0, 0,0, 0,0, FALSE }; STATIC_VAR char *HO, *CL, *CE, *UP, *XD, *BC, *SO, *SE, *TI, *TE; STATIC_VAR char *VS, *VE; +STATIC_VAR char *ME; #if 0 -STATIC_VAR char *MR, *ME; +STATIC_VAR char *MR; STATIC_VAR char *MB, *MH; STATIC_VAR char *MD; /* may already be in use below */ #endif @@ -158,8 +159,8 @@ int *wid, *hgt; US = "\033[4m"; # if 0 MR = "\033[7m"; - ME = "\033[0m"; # endif + ME = "\033[0m"; TI = HE = SE = UE = "\033[0m"; /* strictly, SE should be 2, and UE should be 24, but we can't trust all ANSI emulators to be @@ -288,8 +289,8 @@ int *wid, *hgt; MB = Tgetstr("mb"); /* blink */ MD = Tgetstr("md"); /* boldface */ MH = Tgetstr("mh"); /* dim */ - ME = Tgetstr("me"); # endif + ME = Tgetstr("me"); /* Get rid of padding numbers for HI and HE. Hope they * aren't really needed!!! HI and HE are ouputted to the @@ -1082,7 +1083,7 @@ term_end_raw_bold() void term_end_color() { - xputs(HE); + xputs(ME); } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/nethack.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

