diff options
Diffstat (limited to 'source/xap')
202 files changed, 96074 insertions, 0 deletions
diff --git a/source/xap/MPlayer/MPlayer.SlackBuild b/source/xap/MPlayer/MPlayer.SlackBuild new file mode 100755 index 00000000..20b94741 --- /dev/null +++ b/source/xap/MPlayer/MPlayer.SlackBuild @@ -0,0 +1,407 @@ +#!/bin/sh + +# Copyright 2006, 2007, 2008, 2009 Eric Hameleers, Eindhoven, NL +# Copyright 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Permission to use, copy, modify, and distribute this software for +# any purpose with or without fee is hereby granted, provided that +# the above copyright notice and this permission notice appear in all +# copies. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR +# 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. +# ----------------------------------------------------------------------------- +# +# Slackware SlackBuild script +# =========================== +# By: Eric Hameleers <alien@slackware.com> +# For: MPlayer +# Descr: a movie player for LINUX +# URL: http://www.mplayerhq.hu/ +# ----------------------------------------------------------------------------- + +PRGNAM=MPlayer +VERSION=${VERSION:-r29390} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} +TAG=${TAG:-} + +DOCS="AUTHORS Changelog Copyright LICENSE README DOCS/HTML-single DOCS/tech" + +DEFSKIN=${DEFSKIN:-"Blue"} # Download more skins at the following url: +SKINVER=${SKINVER:-"1.7"} # http://www.mplayerhq.hu/design7/dload.html + +# Available languages: all bg cs de dk el en es fr hu it ja +# ko mk nb nl pl ro ru sk sv tr uk pt_BR zh_CN zh_TW +LANGUAGES="en nl fr de es" # The default is to just add "en" documentation + +if [ "$ARCH" = "x86_64" ]; then + LIBDIRSUFFIX="64" + # --enable-runtime-cpudetection is supported only for x86, x86_64, and PPC + EXTRACONFIGUREOPTIONS="--enable-runtime-cpudetection" +elif [ "$ARCH" = "i486" -o \ + "$ARCH" = "i586" -o \ + "$ARCH" = "i686" ]; then + LIBDIRSUFFIX="" + EXTRACONFIGUREOPTIONS="--enable-runtime-cpudetection" +else + LIBDIRSUFFIX="" + EXTRACONFIGUREOPTIONS="" +fi + +CODECSDIR=/usr/lib${LIBDIRSUFFIX}/codecs # Where the WIN32 codecs are expected for instance + +# --------------------------------------------------------------------------- +# -- PATENT ALERT! -- +# MPlayer source contains an internal copy of 'libdvdcss' for reading DVD's. +# This is considered illegal software in some countries. +# Also, MPLayer can be built with MP3 (lame) and AMR audio encoders +# (needed for FLV and .3GP videos) but these libraries are 'contaminated' +# with patents from Fraunhofer and GGP. +# Also, the AAC encoder has patent issues. +# The Slackware package is built with "USE_PATENTS=NO" i.e. without using +# the lame mp3, faac, AMR and dvdcss libraries. +# This also means that this creates a version of MPlayer that is unable +# to play encrypted DVD's (which is most DVD's on the market). If it is +# allowed in your country to use libdvdcss, this is not a big problem though. +# Install a libdvdcss package and it will be picked up automatically by +# MPlayer's internal libdvdread library, so that MPlayer will again be able +# to play encrypted DVD's. +# +# If you have licenses to use the code, and/or the patents do not apply in +# your region, and you take all legal responsibility, you may wish to build +# MPlayer with the option USE_PATENTS=YES which will include potentially +# patent-encumbered code. +# --------------------------------------------------------------------------- +USE_PATENTS=${USE_PATENTS:-"NO"} + +# MPlayer will try to use one of the TrueType fonts present on the target +# system for it's On Screen Display (OSD) font. +# Slackware 11.0 ships with the Vera and DejaVu fonts, you may want to add +# more fonts to this list. The first font found will be used by creating a +# symbolic link "/usr/share/mplayer/subfont.ttf" to it. +# The use of bitmapped fonts is considered deprecated, but you can still use +# those if you want. Read http://www.mplayerhq.hu/DOCS/HTML/en/fonts-osd.html +# if you want to know more about OSD font configuration. +OSDFONTS="LiberationSans-Regular.ttf \ + Arialuni.ttf arial.ttf \ + DejaVuSans.ttf Vera.ttf" + +# We will work with a stripped-down source tarball, not containing libdvdcss: +[ "$USE_PATENTS" != "YES" ] && EXTRA="_nolibdvdcss" || EXTRA="" + +# Where do we look for sources? +SRCDIR=$(cd $(dirname $0); pwd) + +SOURCE[0]="$SRCDIR/${PRGNAM}${EXTRA}-${VERSION}.tar.xz" +SRCURL[0]="" + +# The default skin to use (we need to add at least one) +SOURCE[1]="$SRCDIR/${DEFSKIN}-${SKINVER}.tar.bz2" +SRCURL[1]="http://www.mplayerhq.hu/MPlayer/skins/${DEFSKIN}-${SKINVER}.tar.bz2" + +# Use the src_checkout() function if no downloadable tarball exists. +# This function checks out sources from SVN/CVS and creates a tarball of them. +src_checkout() { + # Param #1 : index in the SOURCE[] array. + # Param #2 : full path to where SOURCE[$1] tarball should be created. + # Determine the tarball extension: + PEXT=$(echo "${2}" | sed -r -e 's/.*[^.].(tar.xz|tar.gz|tar.bz2|tgz).*/\1/') + case "$PEXT" in + "tar.xz") TARCOMP="J" ;; + "tar.gz") TARCOMP="z" ;; + "tgz") TARCOMP="z" ;; + "tar.bz2") TARCOMP="j" ;; + *) echo "Archive can only have extension 'tar.xz', '.tar.gz' '.tar.bz2' or '.tgz'" ; exit 1 ;; + esac + case ${1} in + 0) # mplayer + if [ "$(echo ${VERSION}|cut -c1)" == 'r' ]; then # revision instead of date + REV=$(echo ${VERSION} | cut -c2-) + else + REV="{${VERSION}}" + fi + mkdir MPlayer-${VERSION} \ + && cd MPlayer-${VERSION} \ + && svn checkout --revision $REV svn://svn.mplayerhq.hu/mplayer/trunk . \ + && find . -type d -name '.svn' -depth | xargs rm -rf \ + && ([ "$USE_PATENTS" != "YES" ] && rm -rf libdvdcss || true) \ + && chown -R root:root . \ + && cd .. \ + && tar -${TARCOMP}cf ${2} MPlayer-${VERSION} + rm -rf MPlayer-${VERSION} + ;; + *) # Do nothing + ;; + esac +} + +# Place to build (TMP) package (PKG) and output (OUTPUT) the program: +TMP=${TMP:-/tmp/build} +PKG=$TMP/package-$PRGNAM +OUTPUT=${OUTPUT:-/tmp} + +## +## --- with a little luck, you won't have to edit below this point --- ## +## + +# Exit the script on errors: +set -e +trap 'echo "$0 FAILED at line $LINENO!" | tee $OUTPUT/error-${PRGNAM}.log' ERR +# Catch unitialized variables: +set -u +P1=${1:-1} + +# Create working directories: +mkdir -p $TMP/tmp-$PRGNAM # location to build the source +rm -rf $TMP/tmp-$PRGNAM/* # remove the remnants of previous build +mkdir -p $PKG # place for the package to be built +rm -rf $PKG/* # erase old package's contents +mkdir -p $OUTPUT # place for the package to be saved + +# Source file availability: +for (( i = 0; i < ${#SOURCE[*]}; i++ )) ; do + if ! [ -f ${SOURCE[$i]} ]; then + echo "Source '$(basename ${SOURCE[$i]})' not available yet..." + # Check if the $SRCDIR is writable at all - if not, download to $OUTPUT + [ -w "$SRCDIR" ] || SOURCE[$i]="$OUTPUT/$(basename ${SOURCE[$i]})" + if ! [ "x${SRCURL[$i]}" == "x" ]; then + echo "Will download file to $(dirname $SOURCE[$i])" + wget -nv -T 20 -O "${SOURCE[$i]}" "${SRCURL[$i]}" || true + if [ $? -ne 0 -o ! -s "${SOURCE[$i]}" ]; then + echo "Downloading '$(basename ${SOURCE[$i]})' failed.. aborting the build." + mv -f "${SOURCE[$i]}" "${SOURCE[$i]}".FAIL + exit 1 + fi + else + # Try if we have a SVN/CVS download routine for ${SOURCE[$i]} + echo "Will checkout sources to $(dirname $SOURCE[$i])" + src_checkout $i "${SOURCE[$i]}" 2>&1 > $OUTPUT/checkout-$(basename ${SOURCE[$i]}).log + fi + if [ ! -f "${SOURCE[$i]}" -o ! -s "${SOURCE[$i]}" ]; then + echo "File '$(basename ${SOURCE[$i]})' not available.. aborting the build." + exit 1 + fi + fi +done + +if [ "$P1" == "--download" ]; then + echo "Download complete." + exit 0 +fi + +# --- PACKAGE BUILDING --- + +echo "++" +echo "|| $PRGNAM-$VERSION" +echo "++" + +# Warn about libdvdread requirement: +if [ "$USE_PATENTS" != "YES" ]; then + cat <<"EOT" +** +** Removing internal DeCSS library. +** If you want to play encrypted DVD's you need to install libdvdcss separately. +** You take full legal responsibility for any use of DeCSS. We neither supply +** DeCSS code nor endorse any illegal use of it. +** +** If you are unaffected by patent concerns because you hold the required +** licenses and permission to use the patented code, or reside in a +** location where this is not a concern, and wish to include the patented +** and restricted code (you take all legal responsibility for doing so), +** then edit this SlackBuild script and change the line: +** USE_PATENTS=${USE_PATENTS:-"NO"} +** to: +** USE_PATENTS="YES" +** +EOT + sleep 5 +fi + +cd $TMP/tmp-$PRGNAM +echo "Extracting the source archive(s) for $PRGNAM..." +tar -xvf ${SOURCE[0]} +[ "$USE_PATENTS" != "YES" ] && rm -rf libdvdcss +chown -R root:root * +chmod -R u+w,go+r-w,a-s * +cd ${PRGNAM}-${VERSION} + +# Determine what X we're running (the modular X returns the prefix +# in the next command, while older versions stay silent): +XPREF=$(pkg-config --variable=prefix x11) || true +[ "$XPREF" == "" ] && XPREF='/usr/X11R6' + +# Remove support for patent encumbered and possibly illegal code: +if [ "$USE_PATENTS" != "YES" ]; then + DO_PATENTED="--disable-libdvdcss-internal \ + --disable-mp3lame --disable-mp3lame-lavc \ + --disable-faac --disable-faac-lavc \ + --disable-libamr_nb --disable-libamr_wb" +else + DO_PATENTED="" +fi + +echo Building ... +# MPlayer wants to automatically determine compiler flags, +# so we don't provide CFLAGS: +./configure --prefix=/usr \ + --mandir=/usr/man \ + --confdir=/etc/mplayer \ + --enable-gui \ + --enable-menu \ + --enable-largefiles \ + --disable-arts \ + --codecsdir=${CODECSDIR} \ + --win32codecsdir=${CODECSDIR} \ + --realcodecsdir=${CODECSDIR} \ + --language="${LANGUAGES}" \ + ${EXTRACONFIGUREOPTIONS} \ + ${DO_PATENTED} \ + 2>&1 | tee $OUTPUT/configure-${PRGNAM}.log +# So that MPlayer does not report "UNKNOWN" as it's version: +echo $VERSION > VERSION +make 2>&1 | tee $OUTPUT/make-${PRGNAM}.log +make DESTDIR=$PKG install 2>&1 |tee $OUTPUT/install-${PRGNAM}.log + +# Build the html documentation (not all languages are available): +( cd DOCS/xml + for i in $(echo $LANGUAGES | tr , ' ') ; do + [ -d $i ] && make html-single-$i ; + done +) + +# Prepare the configfile: +mkdir -p $PKG/etc/mplayer +cp etc/example.conf $PKG/etc/mplayer/mplayer.conf.new + +# Install our default skin: +cd $PKG/usr/share/mplayer/skins +tar -xvf ${SOURCE[1]} +chown -R root:root * +chmod -R u+w,go+r-w,a-s * +ln -s ${DEFSKIN} default +cd - + +# Add this to the doinst.sh: +! [ -d $PKG/install ] && mkdir -p $PKG/install +cat <<EOINS >> $PKG/install/doinst.sh +# Handle the incoming configuration files: +config() { + for infile in \$1; do + NEW="\$infile" + OLD="\`dirname \$NEW\`/\`basename \$NEW .new\`" + # If there's no config file by that name, mv it over: + if [ ! -r \$OLD ]; then + mv \$NEW \$OLD + elif [ "\`cat \$OLD | md5sum\`" = "\`cat \$NEW | md5sum\`" ]; then + # toss the redundant copy + rm \$NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... + done +} + +# Installing a bitmap font is considered deprecated; use a TTF font instead. +# We try to link to an installed TTF font at install time. +# Configure a default TrueType font to use for the OSD : +if [ ! -f usr/share/mplayer/subfont.ttf ]; then + for font in ${OSDFONTS}; do + if [ -f .${XPREF}/lib${LIBDIRSUFFIX}/X11/fonts/TTF/\${font} ]; then + ( cd usr/share/mplayer/ + ln -sf ${XPREF}/lib${LIBDIRSUFFIX}/X11/fonts/TTF/\${font} subfont.ttf + ) + break + fi + done +fi + +# Prepare the new configuration file +config etc/mplayer/mplayer.conf.new + +if [ -x /usr/bin/update-desktop-database ]; then + chroot . /usr/bin/update-desktop-database -q usr/share/applications +fi + +if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then + if [ -x usr/bin/gtk-update-icon-cache ]; then + chroot . /usr/bin/gtk-update-icon-cache usr/share/icons/hicolor >/dev/null 2>&1 + fi +fi + +EOINS + +# Add documentation: +mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION +cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION || true +cp -a $SRCDIR/$(basename $0) $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild +mv $PKG/usr/doc/$PRGNAM-$VERSION/HTML-single $PKG/usr/doc/$PRGNAM-$VERSION/html +# Save a sample of all configuration files: +for i in etc/*.conf ; do + cp $i $PKG/usr/doc/$PRGNAM-$VERSION/$(basename $i)-sample +done +# Save a transcript of all configured options for this specific build: +if [ -n $OUTPUT/configure-${PRGNAM}.log ]; then + cat $OUTPUT/configure-${PRGNAM}.log \ + | sed -n "/^Config files successfully generated/,/^'config.h' and 'config.mak' contain your configuration options./p" \ + > $PKG/usr/doc/$PRGNAM-$VERSION/${PRGNAM}.configuration +fi +find $PKG/usr/doc -type f -exec chmod 644 {} \; + +# Compress the man page(s): +if [ -d $PKG/usr/man ]; then + find $PKG/usr/man -type f -name "*.?" -exec gzip -9f {} \; + for i in $(find $PKG/usr/man -type l -name "*.?") ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done +fi + +# Strip binaries: +( find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null ) + +# Add a package description: +mkdir -p $PKG/install +cat $SRCDIR/slack-desc > $PKG/install/slack-desc +if [ -f $SRCDIR/doinst.sh ]; then + cat $SRCDIR/doinst.sh >> $PKG/install/doinst.sh +fi + +# Build the package: +cd $PKG +makepkg --linkadd y --chown n $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.txz 2>&1 | tee $OUTPUT/makepkg-${PRGNAM}.log +cd $OUTPUT +md5sum ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.txz > ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.txz.md5 +cd - +cat $PKG/install/slack-desc | grep "^${PRGNAM}" > $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.txt + +# Warn about libdvdcss requirement (again): +if [ "$USE_PATENTS" != "YES" ]; then + cat <<"EOT" +** +** Internal DECSS library was not built. +** If you want to play encrypted DVD's you need to install libdvdcss separately. +** You take full legal responsibility for any use of DeCSS. We neither supply +** DeCSS code nor endorse any illegal use of it. +** +** If you are unaffected by patent concerns because you hold the required +** licenses and permission to use the patented code, or reside in a +** location where this is not a concern, and wish to include the patented +** and restricted code (you take all legal responsibility for doing so), +** then edit this SlackBuild script and change the line: +** USE_PATENTS=${USE_PATENTS:-"NO"} +** to: +** USE_PATENTS="YES" +** +EOT + +fi + diff --git a/source/xap/MPlayer/slack-desc b/source/xap/MPlayer/slack-desc new file mode 100644 index 00000000..a73feb27 --- /dev/null +++ b/source/xap/MPlayer/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +MPlayer: MPlayer (media player) +MPlayer: +MPlayer: MPlayer is a movie player. It plays most MPEG/VOB, AVI, Ogg/OGM, +MPlayer: VIVO, ASF/WMA/WMV, QT/MOV/MP4, RealMedia, Matroska, NUT, NuppelVideo, +MPlayer: FLI, YUV4MPEG, FILM, RoQ, PVA files, supported by many native, XAnim, +MPlayer: and Win32 DLL codecs. You can watch VideoCD, SVCD, DVD, 3ivx, +MPlayer: DivX 3/4/5, WMV and even H.264 movies. +MPlayer: +MPlayer: Homepage for MPlayer is http://www.mplayerhq.hu/ +MPlayer: +MPlayer: diff --git a/source/xap/audacious-plugins/amidi-plug.fix-drct.diff b/source/xap/audacious-plugins/amidi-plug.fix-drct.diff new file mode 100644 index 00000000..432b955d --- /dev/null +++ b/source/xap/audacious-plugins/amidi-plug.fix-drct.diff @@ -0,0 +1,11 @@ +diff -ur ./src/amidi-plug/i_configure.c ../audacious-plugins-1.5.1/src/amidi-plug/i_configure.c +--- ./src/amidi-plug/i_configure.c 2008-05-24 00:44:19.000000000 +0200 ++++ ./src/amidi-plug/i_configure.c 2008-11-13 15:08:57.000000000 +0100 +@@ -28,6 +28,7 @@ + #include "i_configure-fluidsynth.h" + #include "i_configure-dummy.h" + #include "i_utils.h" ++#include <audacious/plugin.h> + #include <audacious/auddrct.h> + + diff --git a/source/xap/audacious-plugins/audacious-plugins.SlackBuild b/source/xap/audacious-plugins/audacious-plugins.SlackBuild new file mode 100755 index 00000000..47bc40f9 --- /dev/null +++ b/source/xap/audacious-plugins/audacious-plugins.SlackBuild @@ -0,0 +1,128 @@ +#!/bin/sh + +# Copyright 2006, 2007, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=audacious-plugins +VERSION=${VERSION:-1.5.1} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-4} + +NUMJOBS=${NUMJOBS:-" -j7 "} + + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" + ARCHOPTS="--disable-sse2" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" + ARCHOPTS="--disable-sse2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="64" + ARCHOPTS="" +fi + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.bz2 || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +zcat $CWD/audacious-plugins.libmtp8.diff.gz | patch -p1 || exit 1 +zcat $CWD/amidi-plug.fix-drct.diff.gz | patch -p1 || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Configure: +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --sysconfdir=/etc \ + --mandir=/usr/man \ + --enable-chardet \ + --enable-amidiplug \ + --enable-timidity \ + --disable-altivec \ + --program-prefix= \ + --program-suffix= \ + ${ARCHOPTS} \ + --build=$ARCH-slackware-linux + +# Build and install: +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.* + ) + done + ) +fi + +# Compress info files, if any: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION +cp -a \ + AUTHORS COPYING INSTALL Mercurial-Access \ + $PKG/usr/doc/${PKGNAM}-$VERSION + +mkdir -p $PKG/install +#zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/audacious-plugins/audacious-plugins.libmtp8.diff b/source/xap/audacious-plugins/audacious-plugins.libmtp8.diff new file mode 100644 index 00000000..6c224fa5 --- /dev/null +++ b/source/xap/audacious-plugins/audacious-plugins.libmtp8.diff @@ -0,0 +1,16 @@ +--- ./src/mtp_up/mtp.c.orig 2008-05-23 17:44:20.000000000 -0500 ++++ ./src/mtp_up/mtp.c 2008-09-14 14:28:44.000000000 -0500 +@@ -193,11 +193,12 @@ + g_free(from_path);
+ g_free(tmp);
+ parent_id = mtp_device->default_music_folder;
++ gentrack->parent_id = parent_id;
+
+ #if DEBUG
+ g_print("Uploading track '%s'\n",filename);
+ #endif
+- ret = LIBMTP_Send_Track_From_File(mtp_device, filename , gentrack, NULL , NULL, parent_id);
++ ret = LIBMTP_Send_Track_From_File(mtp_device, filename , gentrack, NULL , NULL);
+ LIBMTP_destroy_track_t(gentrack);
+ if (ret == 0)
+ g_print("Track upload finished!\n");
diff --git a/source/xap/audacious-plugins/slack-desc b/source/xap/audacious-plugins/slack-desc new file mode 100644 index 00000000..2c822733 --- /dev/null +++ b/source/xap/audacious-plugins/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +audacious-plugins: audacious-plugins (Plugins used by the Audacious media player) +audacious-plugins: +audacious-plugins: This is a collection of plugins for Audacious to support additional +audacious-plugins: media formats. +audacious-plugins: +audacious-plugins: The webpage for Audacious is: http://www.audacious-media-player.org. +audacious-plugins: +audacious-plugins: +audacious-plugins: +audacious-plugins: +audacious-plugins: diff --git a/source/xap/audacious/audacious.SlackBuild b/source/xap/audacious/audacious.SlackBuild new file mode 100755 index 00000000..b18a0670 --- /dev/null +++ b/source/xap/audacious/audacious.SlackBuild @@ -0,0 +1,132 @@ +#!/bin/sh + +# Copyright 2006, 2007, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=audacious +VERSION=${VERSION:-1.5.1} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-3} + +NUMJOBS=${NUMJOBS:-" -j7 "} + + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" + ARCHOPTS="--disable-sse2" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" + ARCHOPTS="--disable-sse2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" + ARCHOPTS="" +elif [ "$ARCH" = "arm" ]; then + SLKCFLAGS="-O2 -march=armv4 -mtune=xscale" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "armel" ]; then + SLKCFLAGS="-O2 -march=armv4t" + LIBDIRSUFFIX="" +fi + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.bz2 || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +# Fix command line options handling: +zcat $CWD/audacious.handle_cmd_line_options.diff.gz | patch -p1 || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Configure: +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --sysconfdir=/etc \ + --mandir=/usr/man \ + --enable-ipv6 \ + --enable-chardet \ + --disable-altivec \ + --program-prefix= \ + --program-suffix= \ + ${ARCHOPTS} \ + --build=$ARCH-slackware-linux + +# Build and install: +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.* + ) + done + ) +fi + +# Compress info files, if any: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION +cp -a \ + ABOUT-NLS AUTHORS COPYING INSTALL Mercurial-Access NEWS README \ + $PKG/usr/doc/${PKGNAM}-$VERSION + +mkdir -p $PKG/install +#zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/audacious/audacious.handle_cmd_line_options.diff b/source/xap/audacious/audacious.handle_cmd_line_options.diff new file mode 100644 index 00000000..6ccb2243 --- /dev/null +++ b/source/xap/audacious/audacious.handle_cmd_line_options.diff @@ -0,0 +1,38 @@ +--- ./src/audacious/main.c.orig 2008-05-23 17:00:34.000000000 -0500 ++++ ./src/audacious/main.c 2009-04-10 17:03:00.000000000 -0500 +@@ -315,7 +315,7 @@ + } + + static void +-handle_cmd_line_options() ++handle_cmd_line_options(gboolean skip) + { + gchar **filenames = options.filenames; + #ifdef USE_DBUS +@@ -430,7 +430,7 @@ + } /* is_running */ + else + #endif +- { /* !is_running */ ++ if (!skip) { /* !is_running */ + if (filenames != NULL) + { + gint pos = 0; +@@ -715,7 +715,7 @@ + + signal_handlers_init(); + +- handle_cmd_line_options(); ++ handle_cmd_line_options(TRUE); + + if (options.headless == FALSE) + { +@@ -735,6 +735,8 @@ + plugin_system_init(); + playlist_system_init(); + ++ handle_cmd_line_options(FALSE); ++ + #ifdef USE_DBUS + init_dbus(); + #endif diff --git a/source/xap/audacious/slack-desc b/source/xap/audacious/slack-desc new file mode 100644 index 00000000..6574e805 --- /dev/null +++ b/source/xap/audacious/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +audacious: audacious (A relatively powerful media player) +audacious: +audacious: Audacious is a media player, based on Beep Media Player, which is in +audacious: turn based on the X Multimedia System (XMMS). It is used to play +audacious: audio and other kinds of media files. By default Audacious can play +audacious: MPEG audio, Ogg Vorbis, RIFF wav, most module formats, and a few +audacious: other formats. Audacious can be extended through plugins to play a +audacious: number of other audio and video formats. +audacious: +audacious: The webpage for Audacious is: http://www.audacious-media-player.org. +audacious: diff --git a/source/xap/blackbox/blackbox.SlackBuild b/source/xap/blackbox/blackbox.SlackBuild new file mode 100755 index 00000000..4505d06e --- /dev/null +++ b/source/xap/blackbox/blackbox.SlackBuild @@ -0,0 +1,143 @@ +#!/bin/sh + +# Copyright 2006, 2007, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=blackbox +VERSION=${VERSION:-0.65.0} +BBVER=${BBVER:-0.8.6} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-4} + +NUMJOBS=${NUMJOBS:-" -j7 "} + + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.gz || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Thanks for the gcc-4.1.1 patch, Debian. :-) +zcat $CWD/blackbox_0.65.0-5.diff.gz | patch -p1 --verbose || exit 1 + +# Configure: +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --enable-shape \ + --enable-slit \ + --enable-interlace \ + --enable-nls \ + --enable-timed-cache \ + $ARCH-slackware-linux + +# Build and install: +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +mkdir -p $PKG/etc/X11/xinit +zcat $CWD/xinitrc.blackbox.gz > $PKG/etc/X11/xinit/xinitrc.blackbox +chmod 755 $PKG/etc/X11/xinit/xinitrc.blackbox + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION +cp -a \ + AUTHORS INSTALL LICENSE README* TODO \ + $PKG/usr/doc/${PKGNAM}-$VERSION + +###################################### +# Compile bbkeys program for blackbox: +cd $TMP +rm -rf bbkeys-${BBVER} +tar xvf $CWD/bbkeys-${BBVER}.tar.gz || exit 1 +cd bbkeys-${BBVER} || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Configure: +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --enable-interlace \ + $ARCH-slackware-linux + +# Build and install: +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +mkdir -p /usr/doc/bbkeys-$BBKEYS +cp -a \ + AUTHORS BUGS COPYING ChangeLog INSTALL NEWS README* TODO \ + /usr/doc/bbkeys-$BBKEYS + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/blackbox/blackbox_0.65.0-5.diff b/source/xap/blackbox/blackbox_0.65.0-5.diff new file mode 100644 index 00000000..4b6959d8 --- /dev/null +++ b/source/xap/blackbox/blackbox_0.65.0-5.diff @@ -0,0 +1,12462 @@ +--- blackbox-0.65.0.orig/Makefile.in ++++ blackbox-0.65.0/Makefile.in +@@ -68,6 +68,7 @@ + ORDEREDPSEUDO = @ORDEREDPSEUDO@ + PACKAGE = @PACKAGE@ + SHAPE = @SHAPE@ ++XINERAMA = @XINERAMA@ + TIMEDCACHE = @TIMEDCACHE@ + VERSION = @VERSION@ + gencat_cmd = @gencat_cmd@ +--- blackbox-0.65.0.orig/configure ++++ blackbox-0.65.0/configure +@@ -1,42 +1,325 @@ + #! /bin/sh +- + # Guess values for system-dependent variables and create Makefiles. +-# Generated automatically using autoconf version 2.13 +-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. ++# Generated by GNU Autoconf 2.59. + # ++# Copyright (C) 2003 Free Software Foundation, Inc. + # This configure script is free software; the Free Software Foundation + # gives unlimited permission to copy, distribute and modify it. ++## --------------------- ## ++## M4sh Initialization. ## ++## --------------------- ## ++ ++# Be Bourne compatible ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then ++ set -o posix ++fi ++DUALCASE=1; export DUALCASE # for MKS sh ++ ++# Support unset when possible. ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then ++ as_unset=unset ++else ++ as_unset=false ++fi ++ ++ ++# Work around bugs in pre-3.0 UWIN ksh. ++$as_unset ENV MAIL MAILPATH ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# NLS nuisances. ++for as_var in \ ++ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ ++ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ ++ LC_TELEPHONE LC_TIME ++do ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ eval $as_var=C; export $as_var ++ else ++ $as_unset $as_var ++ fi ++done ++ ++# Required to use basename. ++if expr a : '\(a\)' >/dev/null 2>&1; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then ++ as_basename=basename ++else ++ as_basename=false ++fi ++ ++ ++# Name of the executable. ++as_me=`$as_basename "$0" || ++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)$' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X/"$0" | ++ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } ++ /^X\/\(\/\/\)$/{ s//\1/; q; } ++ /^X\/\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ ++ ++# PATH needs CR, and LINENO needs CR and PATH. ++# Avoid depending upon Character Ranges. ++as_cr_letters='abcdefghijklmnopqrstuvwxyz' ++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' ++as_cr_Letters=$as_cr_letters$as_cr_LETTERS ++as_cr_digits='0123456789' ++as_cr_alnum=$as_cr_Letters$as_cr_digits ++ ++# The user is always right. ++if test "${PATH_SEPARATOR+set}" != set; then ++ echo "#! /bin/sh" >conf$$.sh ++ echo "exit 0" >>conf$$.sh ++ chmod +x conf$$.sh ++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then ++ PATH_SEPARATOR=';' ++ else ++ PATH_SEPARATOR=: ++ fi ++ rm -f conf$$.sh ++fi ++ ++ ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x$as_lineno_3" = "x$as_lineno_2" || { ++ # Find who we are. Look in the path if we contain no path at all ++ # relative or not. ++ case $0 in ++ *[\\/]* ) as_myself=$0 ;; ++ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break ++done ++ ++ ;; ++ esac ++ # We did not find ourselves, most probably we were run as `sh COMMAND' ++ # in which case we are not to be found in the path. ++ if test "x$as_myself" = x; then ++ as_myself=$0 ++ fi ++ if test ! -f "$as_myself"; then ++ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 ++ { (exit 1); exit 1; }; } ++ fi ++ case $CONFIG_SHELL in ++ '') ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for as_base in sh bash ksh sh5; do ++ case $as_dir in ++ /*) ++ if ("$as_dir/$as_base" -c ' ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then ++ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } ++ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } ++ CONFIG_SHELL=$as_dir/$as_base ++ export CONFIG_SHELL ++ exec "$CONFIG_SHELL" "$0" ${1+"$@"} ++ fi;; ++ esac ++ done ++done ++;; ++ esac ++ ++ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO ++ # uniformly replaced by the line number. The first 'sed' inserts a ++ # line-number line before each line; the second 'sed' does the real ++ # work. The second script uses 'N' to pair each line-number line ++ # with the numbered line, and appends trailing '-' during ++ # substitution so that $LINENO is not a special case at line end. ++ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the ++ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) ++ sed '=' <$as_myself | ++ sed ' ++ N ++ s,$,-, ++ : loop ++ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, ++ t loop ++ s,-$,, ++ s,^['$as_cr_digits']*\n,, ++ ' >$as_me.lineno && ++ chmod +x $as_me.lineno || ++ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 ++ { (exit 1); exit 1; }; } ++ ++ # Don't try to exec as it changes $[0], causing all sort of problems ++ # (the dirname of $[0] is not the place where we might find the ++ # original and so on. Autoconf is especially sensible to this). ++ . ./$as_me.lineno ++ # Exit status is that of the last command. ++ exit ++} ++ ++ ++case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in ++ *c*,-n*) ECHO_N= ECHO_C=' ++' ECHO_T=' ' ;; ++ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; ++ *) ECHO_N= ECHO_C='\c' ECHO_T= ;; ++esac ++ ++if expr a : '\(a\)' >/dev/null 2>&1; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++rm -f conf$$ conf$$.exe conf$$.file ++echo >conf$$.file ++if ln -s conf$$.file conf$$ 2>/dev/null; then ++ # We could just check for DJGPP; but this test a) works b) is more generic ++ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). ++ if test -f conf$$.exe; then ++ # Don't use ln at all; we don't have any links ++ as_ln_s='cp -p' ++ else ++ as_ln_s='ln -s' ++ fi ++elif ln conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s=ln ++else ++ as_ln_s='cp -p' ++fi ++rm -f conf$$ conf$$.exe conf$$.file ++ ++if mkdir -p . 2>/dev/null; then ++ as_mkdir_p=: ++else ++ test -d ./-p && rmdir ./-p ++ as_mkdir_p=false ++fi ++ ++as_executable_p="test -f" ++ ++# Sed expression to map a string onto a valid CPP name. ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" ++ ++# Sed expression to map a string onto a valid variable name. ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" ++ + +-# Defaults: +-ac_help= ++# IFS ++# We need space, tab and new line, in precisely that order. ++as_nl=' ++' ++IFS=" $as_nl" ++ ++# CDPATH. ++$as_unset CDPATH ++ ++ ++# Name of the host. ++# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, ++# so uname gets run too. ++ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` ++ ++exec 6>&1 ++ ++# ++# Initializations. ++# + ac_default_prefix=/usr/local +-# Any additions from configure.in: +-ac_help="$ac_help +- --with-x use the X Window System" +-ac_help="$ac_help +- --enable-shape enable support of the XShape extension [default=yes]" +-ac_help="$ac_help +- --enable-ordered-pseudo include code for ordered pseudocolor (8bpp) +- dithering [default=no]" +-ac_help="$ac_help +- --enable-debug include verbose debugging code [default=no]" +-ac_help="$ac_help +- --enable-nls include natural language support [default=yes]" +-ac_help="$ac_help +- --enable-timed-cache use new timed pixmap cache [default=yes]" +-ac_help="$ac_help +- --enable-maintainer-mode enable make rules and dependencies not useful +- (and sometimes confusing) to the casual installer" ++ac_config_libobj_dir=. ++cross_compiling=no ++subdirs= ++MFLAGS= ++MAKEFLAGS= ++SHELL=${CONFIG_SHELL-/bin/sh} ++ ++# Maximum number of lines to put in a shell here document. ++# This variable seems obsolete. It should probably be removed, and ++# only ac_max_sed_lines should be used. ++: ${ac_max_here_lines=38} ++ ++# Identity of this package. ++PACKAGE_NAME= ++PACKAGE_TARNAME= ++PACKAGE_VERSION= ++PACKAGE_STRING= ++PACKAGE_BUGREPORT= ++ ++ac_unique_file="src/blackbox.cc" ++# Factoring default headers for most tests. ++ac_includes_default="\ ++#include <stdio.h> ++#if HAVE_SYS_TYPES_H ++# include <sys/types.h> ++#endif ++#if HAVE_SYS_STAT_H ++# include <sys/stat.h> ++#endif ++#if STDC_HEADERS ++# include <stdlib.h> ++# include <stddef.h> ++#else ++# if HAVE_STDLIB_H ++# include <stdlib.h> ++# endif ++#endif ++#if HAVE_STRING_H ++# if !STDC_HEADERS && HAVE_MEMORY_H ++# include <memory.h> ++# endif ++# include <string.h> ++#endif ++#if HAVE_STRINGS_H ++# include <strings.h> ++#endif ++#if HAVE_INTTYPES_H ++# include <inttypes.h> ++#else ++# if HAVE_STDINT_H ++# include <stdint.h> ++# endif ++#endif ++#if HAVE_UNISTD_H ++# include <unistd.h> ++#endif" ++ ++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX regex_cmd CPP EGREP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS SHAPE XINERAMA ORDEREDPSEUDO DEBUG NLS gencat_cmd TIMEDCACHE MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBOBJS LTLIBOBJS' ++ac_subst_files='' + + # Initialize some variables set by options. ++ac_init_help= ++ac_init_version=false + # The variables have the same names as the options, with + # dashes changed to underlines. +-build=NONE +-cache_file=./config.cache ++cache_file=/dev/null + exec_prefix=NONE +-host=NONE + no_create= +-nonopt=NONE + no_recursion= + prefix=NONE + program_prefix=NONE +@@ -45,10 +328,15 @@ + silent= + site= + srcdir= +-target=NONE + verbose= + x_includes=NONE + x_libraries=NONE ++ ++# Installation directory options. ++# These are left unexpanded so users can "make install exec_prefix=/foo" ++# and all the variables that are supposed to be based on exec_prefix ++# by default will actually change. ++# Use braces instead of parens because sh, perl, etc. also accept them. + bindir='${exec_prefix}/bin' + sbindir='${exec_prefix}/sbin' + libexecdir='${exec_prefix}/libexec' +@@ -62,17 +350,9 @@ + infodir='${prefix}/info' + mandir='${prefix}/man' + +-# Initialize some other variables. +-subdirs= +-MFLAGS= MAKEFLAGS= +-SHELL=${CONFIG_SHELL-/bin/sh} +-# Maximum number of lines to put in a shell here document. +-ac_max_here_lines=12 +- + ac_prev= + for ac_option + do +- + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" +@@ -80,59 +360,59 @@ + continue + fi + +- case "$ac_option" in +- -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; +- *) ac_optarg= ;; +- esac ++ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + +- case "$ac_option" in ++ case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) +- bindir="$ac_optarg" ;; ++ bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) +- ac_prev=build ;; ++ ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) +- build="$ac_optarg" ;; ++ build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) +- cache_file="$ac_optarg" ;; ++ cache_file=$ac_optarg ;; ++ ++ --config-cache | -C) ++ cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) +- datadir="$ac_optarg" ;; ++ datadir=$ac_optarg ;; + + -disable-* | --disable-*) +- ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` ++ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. +- if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then +- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } +- fi +- ac_feature=`echo $ac_feature| sed 's/-/_/g'` +- eval "enable_${ac_feature}=no" ;; ++ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 ++ { (exit 1); exit 1; }; } ++ ac_feature=`echo $ac_feature | sed 's/-/_/g'` ++ eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) +- ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` ++ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. +- if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then +- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } +- fi +- ac_feature=`echo $ac_feature| sed 's/-/_/g'` +- case "$ac_option" in +- *=*) ;; ++ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 ++ { (exit 1); exit 1; }; } ++ ac_feature=`echo $ac_feature | sed 's/-/_/g'` ++ case $ac_option in ++ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac +- eval "enable_${ac_feature}='$ac_optarg'" ;; ++ eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ +@@ -141,95 +421,47 @@ + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) +- exec_prefix="$ac_optarg" ;; ++ exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + +- -help | --help | --hel | --he) +- # Omit some internal or obsolete options to make the list less imposing. +- # This message is too long to be a string in the A/UX 3.1 sh. +- cat << EOF +-Usage: configure [options] [host] +-Options: [defaults in brackets after descriptions] +-Configuration: +- --cache-file=FILE cache test results in FILE +- --help print this message +- --no-create do not create output files +- --quiet, --silent do not print \`checking...' messages +- --version print the version of autoconf that created configure +-Directory and file names: +- --prefix=PREFIX install architecture-independent files in PREFIX +- [$ac_default_prefix] +- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX +- [same as prefix] +- --bindir=DIR user executables in DIR [EPREFIX/bin] +- --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] +- --libexecdir=DIR program executables in DIR [EPREFIX/libexec] +- --datadir=DIR read-only architecture-independent data in DIR +- [PREFIX/share] +- --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] +- --sharedstatedir=DIR modifiable architecture-independent data in DIR +- [PREFIX/com] +- --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] +- --libdir=DIR object code libraries in DIR [EPREFIX/lib] +- --includedir=DIR C header files in DIR [PREFIX/include] +- --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] +- --infodir=DIR info documentation in DIR [PREFIX/info] +- --mandir=DIR man documentation in DIR [PREFIX/man] +- --srcdir=DIR find the sources in DIR [configure dir or ..] +- --program-prefix=PREFIX prepend PREFIX to installed program names +- --program-suffix=SUFFIX append SUFFIX to installed program names +- --program-transform-name=PROGRAM +- run sed PROGRAM on installed program names +-EOF +- cat << EOF +-Host type: +- --build=BUILD configure for building on BUILD [BUILD=HOST] +- --host=HOST configure for HOST [guessed] +- --target=TARGET configure for TARGET [TARGET=HOST] +-Features and packages: +- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) +- --enable-FEATURE[=ARG] include FEATURE [ARG=yes] +- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) +- --x-includes=DIR X include files are in DIR +- --x-libraries=DIR X library files are in DIR +-EOF +- if test -n "$ac_help"; then +- echo "--enable and --with options recognized:$ac_help" +- fi +- exit 0 ;; ++ -help | --help | --hel | --he | -h) ++ ac_init_help=long ;; ++ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ++ ac_init_help=recursive ;; ++ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ++ ac_init_help=short ;; + + -host | --host | --hos | --ho) +- ac_prev=host ;; ++ ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) +- host="$ac_optarg" ;; ++ host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) +- includedir="$ac_optarg" ;; ++ includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) +- infodir="$ac_optarg" ;; ++ infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) +- libdir="$ac_optarg" ;; ++ libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) +- libexecdir="$ac_optarg" ;; ++ libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ +@@ -238,19 +470,19 @@ + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) +- localstatedir="$ac_optarg" ;; ++ localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) +- mandir="$ac_optarg" ;; ++ mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ +- | --no-cr | --no-c) ++ | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ +@@ -264,26 +496,26 @@ + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) +- oldincludedir="$ac_optarg" ;; ++ oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) +- prefix="$ac_optarg" ;; ++ prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) +- program_prefix="$ac_optarg" ;; ++ program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) +- program_suffix="$ac_optarg" ;; ++ program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ +@@ -300,7 +532,7 @@ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) +- program_transform_name="$ac_optarg" ;; ++ program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) +@@ -310,7 +542,7 @@ + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) +- sbindir="$ac_optarg" ;; ++ sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ +@@ -321,58 +553,57 @@ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) +- sharedstatedir="$ac_optarg" ;; ++ sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) +- site="$ac_optarg" ;; ++ site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) +- srcdir="$ac_optarg" ;; ++ srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) +- sysconfdir="$ac_optarg" ;; ++ sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) +- ac_prev=target ;; ++ ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) +- target="$ac_optarg" ;; ++ target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + +- -version | --version | --versio | --versi | --vers) +- echo "configure generated by autoconf version 2.13" +- exit 0 ;; ++ -version | --version | --versio | --versi | --vers | -V) ++ ac_init_version=: ;; + + -with-* | --with-*) +- ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` ++ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. +- if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then +- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } +- fi ++ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid package name: $ac_package" >&2 ++ { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` +- case "$ac_option" in +- *=*) ;; ++ case $ac_option in ++ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac +- eval "with_${ac_package}='$ac_optarg'" ;; ++ eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) +- ac_package=`echo $ac_option|sed -e 's/-*without-//'` ++ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. +- if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then +- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } +- fi +- ac_package=`echo $ac_package| sed 's/-/_/g'` +- eval "with_${ac_package}=no" ;; ++ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid package name: $ac_package" >&2 ++ { (exit 1); exit 1; }; } ++ ac_package=`echo $ac_package | sed 's/-/_/g'` ++ eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. +@@ -383,99 +614,110 @@ + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) +- x_includes="$ac_optarg" ;; ++ x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) +- x_libraries="$ac_optarg" ;; ++ x_libraries=$ac_optarg ;; + +- -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ++ -*) { echo "$as_me: error: unrecognized option: $ac_option ++Try \`$0 --help' for more information." >&2 ++ { (exit 1); exit 1; }; } + ;; + ++ *=*) ++ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` ++ # Reject names that are not valid shell variable names. ++ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && ++ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 ++ { (exit 1); exit 1; }; } ++ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ++ eval "$ac_envvar='$ac_optarg'" ++ export $ac_envvar ;; ++ + *) +- if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then +- echo "configure: warning: $ac_option: invalid host type" 1>&2 +- fi +- if test "x$nonopt" != xNONE; then +- { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } +- fi +- nonopt="$ac_option" ++ # FIXME: should be removed in autoconf 3.0. ++ echo "$as_me: WARNING: you should use --build, --host, --target" >&2 ++ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && ++ echo "$as_me: WARNING: invalid host type: $ac_option" >&2 ++ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac + done + + if test -n "$ac_prev"; then +- { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +-fi +- +-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 +- +-# File descriptor usage: +-# 0 standard input +-# 1 file creation +-# 2 errors and warnings +-# 3 some systems may open it to /dev/tty +-# 4 used on the Kubota Titan +-# 6 checking for... messages and results +-# 5 compiler messages saved in config.log +-if test "$silent" = yes; then +- exec 6>/dev/null +-else +- exec 6>&1 ++ ac_option=--`echo $ac_prev | sed 's/_/-/g'` ++ { echo "$as_me: error: missing argument to $ac_option" >&2 ++ { (exit 1); exit 1; }; } + fi +-exec 5>./config.log + +-echo "\ +-This file contains any messages produced by compilers while +-running configure, to aid debugging if configure makes a mistake. +-" 1>&5 ++# Be sure to have absolute paths. ++for ac_var in exec_prefix prefix ++do ++ eval ac_val=$`echo $ac_var` ++ case $ac_val in ++ [\\/$]* | ?:[\\/]* | NONE | '' ) ;; ++ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 ++ { (exit 1); exit 1; }; };; ++ esac ++done + +-# Strip out --no-create and --no-recursion so they do not pile up. +-# Also quote any args containing shell metacharacters. +-ac_configure_args= +-for ac_arg ++# Be sure to have absolute paths. ++for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ ++ localstatedir libdir includedir oldincludedir infodir mandir + do +- case "$ac_arg" in +- -no-create | --no-create | --no-creat | --no-crea | --no-cre \ +- | --no-cr | --no-c) ;; +- -no-recursion | --no-recursion | --no-recursio | --no-recursi \ +- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; +- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) +- ac_configure_args="$ac_configure_args '$ac_arg'" ;; +- *) ac_configure_args="$ac_configure_args $ac_arg" ;; ++ eval ac_val=$`echo $ac_var` ++ case $ac_val in ++ [\\/$]* | ?:[\\/]* ) ;; ++ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 ++ { (exit 1); exit 1; }; };; + esac + done + +-# NLS nuisances. +-# Only set these to C if already set. These must not be set unconditionally +-# because not all systems understand e.g. LANG=C (notably SCO). +-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +-# Non-C LC_CTYPE values break the ctype check. +-if test "${LANG+set}" = set; then LANG=C; export LANG; fi +-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +-if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi ++# There might be people who depend on the old broken behavior: `$host' ++# used to hold the argument of --host etc. ++# FIXME: To remove some day. ++build=$build_alias ++host=$host_alias ++target=$target_alias ++ ++# FIXME: To remove some day. ++if test "x$host_alias" != x; then ++ if test "x$build_alias" = x; then ++ cross_compiling=maybe ++ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. ++ If a cross compiler is detected then cross compile mode will be used." >&2 ++ elif test "x$build_alias" != "x$host_alias"; then ++ cross_compiling=yes ++ fi ++fi + +-# confdefs.h avoids OS command line length limits that DEFS can exceed. +-rm -rf conftest* confdefs.h +-# AIX cpp loses on an empty file, so make sure it contains at least a newline. +-echo > confdefs.h ++ac_tool_prefix= ++test -n "$host_alias" && ac_tool_prefix=$host_alias- ++ ++test "$silent" = yes && exec 6>/dev/null + +-# A filename unique to this package, relative to the directory that +-# configure is in, which we can look for to find out if srcdir is correct. +-ac_unique_file=src/blackbox.cc + + # Find the source files, if location was not specified. + if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. +- ac_prog=$0 +- ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` +- test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. ++ ac_confdir=`(dirname "$0") 2>/dev/null || ++$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$0" : 'X\(//\)[^/]' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$0" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. +@@ -485,13 +727,491 @@ + fi + if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then +- { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } ++ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 ++ { (exit 1); exit 1; }; } + else +- { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } ++ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 ++ { (exit 1); exit 1; }; } + fi + fi +-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` ++(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || ++ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 ++ { (exit 1); exit 1; }; } ++srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ++ac_env_build_alias_set=${build_alias+set} ++ac_env_build_alias_value=$build_alias ++ac_cv_env_build_alias_set=${build_alias+set} ++ac_cv_env_build_alias_value=$build_alias ++ac_env_host_alias_set=${host_alias+set} ++ac_env_host_alias_value=$host_alias ++ac_cv_env_host_alias_set=${host_alias+set} ++ac_cv_env_host_alias_value=$host_alias ++ac_env_target_alias_set=${target_alias+set} ++ac_env_target_alias_value=$target_alias ++ac_cv_env_target_alias_set=${target_alias+set} ++ac_cv_env_target_alias_value=$target_alias ++ac_env_CC_set=${CC+set} ++ac_env_CC_value=$CC ++ac_cv_env_CC_set=${CC+set} ++ac_cv_env_CC_value=$CC ++ac_env_CFLAGS_set=${CFLAGS+set} ++ac_env_CFLAGS_value=$CFLAGS ++ac_cv_env_CFLAGS_set=${CFLAGS+set} ++ac_cv_env_CFLAGS_value=$CFLAGS ++ac_env_LDFLAGS_set=${LDFLAGS+set} ++ac_env_LDFLAGS_value=$LDFLAGS ++ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ++ac_cv_env_LDFLAGS_value=$LDFLAGS ++ac_env_CPPFLAGS_set=${CPPFLAGS+set} ++ac_env_CPPFLAGS_value=$CPPFLAGS ++ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ++ac_cv_env_CPPFLAGS_value=$CPPFLAGS ++ac_env_CXX_set=${CXX+set} ++ac_env_CXX_value=$CXX ++ac_cv_env_CXX_set=${CXX+set} ++ac_cv_env_CXX_value=$CXX ++ac_env_CXXFLAGS_set=${CXXFLAGS+set} ++ac_env_CXXFLAGS_value=$CXXFLAGS ++ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ++ac_cv_env_CXXFLAGS_value=$CXXFLAGS ++ac_env_CPP_set=${CPP+set} ++ac_env_CPP_value=$CPP ++ac_cv_env_CPP_set=${CPP+set} ++ac_cv_env_CPP_value=$CPP ++ ++# ++# Report the --help message. ++# ++if test "$ac_init_help" = "long"; then ++ # Omit some internal or obsolete options to make the list less imposing. ++ # This message is too long to be a string in the A/UX 3.1 sh. ++ cat <<_ACEOF ++\`configure' configures this package to adapt to many kinds of systems. ++ ++Usage: $0 [OPTION]... [VAR=VALUE]... ++ ++To assign environment variables (e.g., CC, CFLAGS...), specify them as ++VAR=VALUE. See below for descriptions of some of the useful variables. ++ ++Defaults for the options are specified in brackets. ++ ++Configuration: ++ -h, --help display this help and exit ++ --help=short display options specific to this package ++ --help=recursive display the short help of all the included packages ++ -V, --version display version information and exit ++ -q, --quiet, --silent do not print \`checking...' messages ++ --cache-file=FILE cache test results in FILE [disabled] ++ -C, --config-cache alias for \`--cache-file=config.cache' ++ -n, --no-create do not create output files ++ --srcdir=DIR find the sources in DIR [configure dir or \`..'] ++ ++_ACEOF ++ ++ cat <<_ACEOF ++Installation directories: ++ --prefix=PREFIX install architecture-independent files in PREFIX ++ [$ac_default_prefix] ++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX ++ [PREFIX] ++ ++By default, \`make install' will install all the files in ++\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify ++an installation prefix other than \`$ac_default_prefix' using \`--prefix', ++for instance \`--prefix=\$HOME'. ++ ++For better control, use the options below. ++ ++Fine tuning of the installation directories: ++ --bindir=DIR user executables [EPREFIX/bin] ++ --sbindir=DIR system admin executables [EPREFIX/sbin] ++ --libexecdir=DIR program executables [EPREFIX/libexec] ++ --datadir=DIR read-only architecture-independent data [PREFIX/share] ++ --sysconfdir=DIR read-only single-machine data [PREFIX/etc] ++ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] ++ --localstatedir=DIR modifiable single-machine data [PREFIX/var] ++ --libdir=DIR object code libraries [EPREFIX/lib] ++ --includedir=DIR C header files [PREFIX/include] ++ --oldincludedir=DIR C header files for non-gcc [/usr/include] ++ --infodir=DIR info documentation [PREFIX/info] ++ --mandir=DIR man documentation [PREFIX/man] ++_ACEOF ++ ++ cat <<\_ACEOF ++ ++Program names: ++ --program-prefix=PREFIX prepend PREFIX to installed program names ++ --program-suffix=SUFFIX append SUFFIX to installed program names ++ --program-transform-name=PROGRAM run sed PROGRAM on installed program names ++ ++X features: ++ --x-includes=DIR X include files are in DIR ++ --x-libraries=DIR X library files are in DIR ++_ACEOF ++fi ++ ++if test -n "$ac_init_help"; then ++ ++ cat <<\_ACEOF ++ ++Optional Features: ++ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) ++ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] ++ --enable-shape enable support of the XShape extension default=yes ++ --enable-xinerama enable support of the xinerama extension default=yes ++ --enable-ordered-pseudo include code for ordered pseudocolor (8bpp) ++ dithering default=no ++ --enable-debug include verbose debugging code default=no ++ --enable-nls include natural language support default=yes ++ --enable-timed-cache use new timed pixmap cache default=yes ++ --enable-maintainer-mode enable make rules and dependencies not useful ++ (and sometimes confusing) to the casual installer ++ ++Optional Packages: ++ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] ++ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) ++ --with-x use the X Window System ++ ++Some influential environment variables: ++ CC C compiler command ++ CFLAGS C compiler flags ++ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a ++ nonstandard directory <lib dir> ++ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have ++ headers in a nonstandard directory <include dir> ++ CXX C++ compiler command ++ CXXFLAGS C++ compiler flags ++ CPP C preprocessor ++ ++Use these variables to override the choices made by `configure' or to help ++it to find libraries and programs with nonstandard names/locations. ++ ++_ACEOF ++fi ++ ++if test "$ac_init_help" = "recursive"; then ++ # If there are subdirs, report their specific --help. ++ ac_popdir=`pwd` ++ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue ++ test -d $ac_dir || continue ++ ac_builddir=. ++ ++if test "$ac_dir" != .; then ++ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` ++ # A "../" for each directory in $ac_dir_suffix. ++ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` ++else ++ ac_dir_suffix= ac_top_builddir= ++fi ++ ++case $srcdir in ++ .) # No --srcdir option. We are building in place. ++ ac_srcdir=. ++ if test -z "$ac_top_builddir"; then ++ ac_top_srcdir=. ++ else ++ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` ++ fi ;; ++ [\\/]* | ?:[\\/]* ) # Absolute path. ++ ac_srcdir=$srcdir$ac_dir_suffix; ++ ac_top_srcdir=$srcdir ;; ++ *) # Relative path. ++ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ++ ac_top_srcdir=$ac_top_builddir$srcdir ;; ++esac ++ ++# Do not use `cd foo && pwd` to compute absolute paths, because ++# the directories may not exist. ++case `pwd` in ++.) ac_abs_builddir="$ac_dir";; ++*) ++ case "$ac_dir" in ++ .) ac_abs_builddir=`pwd`;; ++ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; ++ *) ac_abs_builddir=`pwd`/"$ac_dir";; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_builddir=${ac_top_builddir}.;; ++*) ++ case ${ac_top_builddir}. in ++ .) ac_abs_top_builddir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; ++ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_srcdir=$ac_srcdir;; ++*) ++ case $ac_srcdir in ++ .) ac_abs_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; ++ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_srcdir=$ac_top_srcdir;; ++*) ++ case $ac_top_srcdir in ++ .) ac_abs_top_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; ++ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; ++ esac;; ++esac ++ ++ cd $ac_dir ++ # Check for guested configure; otherwise get Cygnus style configure. ++ if test -f $ac_srcdir/configure.gnu; then ++ echo ++ $SHELL $ac_srcdir/configure.gnu --help=recursive ++ elif test -f $ac_srcdir/configure; then ++ echo ++ $SHELL $ac_srcdir/configure --help=recursive ++ elif test -f $ac_srcdir/configure.ac || ++ test -f $ac_srcdir/configure.in; then ++ echo ++ $ac_configure --help ++ else ++ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 ++ fi ++ cd "$ac_popdir" ++ done ++fi ++ ++test -n "$ac_init_help" && exit 0 ++if $ac_init_version; then ++ cat <<\_ACEOF ++ ++Copyright (C) 2003 Free Software Foundation, Inc. ++This configure script is free software; the Free Software Foundation ++gives unlimited permission to copy, distribute and modify it. ++_ACEOF ++ exit 0 ++fi ++exec 5>config.log ++cat >&5 <<_ACEOF ++This file contains any messages produced by compilers while ++running configure, to aid debugging if configure makes a mistake. ++ ++It was created by $as_me, which was ++generated by GNU Autoconf 2.59. Invocation command line was ++ ++ $ $0 $@ ++ ++_ACEOF ++{ ++cat <<_ASUNAME ++## --------- ## ++## Platform. ## ++## --------- ## ++ ++hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` ++uname -m = `(uname -m) 2>/dev/null || echo unknown` ++uname -r = `(uname -r) 2>/dev/null || echo unknown` ++uname -s = `(uname -s) 2>/dev/null || echo unknown` ++uname -v = `(uname -v) 2>/dev/null || echo unknown` ++ ++/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` ++/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` ++ ++/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` ++/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` ++/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` ++hostinfo = `(hostinfo) 2>/dev/null || echo unknown` ++/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` ++/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` ++/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` ++ ++_ASUNAME ++ ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ echo "PATH: $as_dir" ++done ++ ++} >&5 ++ ++cat >&5 <<_ACEOF ++ ++ ++## ----------- ## ++## Core tests. ## ++## ----------- ## ++ ++_ACEOF ++ ++ ++# Keep a trace of the command line. ++# Strip out --no-create and --no-recursion so they do not pile up. ++# Strip out --silent because we don't want to record it for future runs. ++# Also quote any args containing shell meta-characters. ++# Make two passes to allow for proper duplicate-argument suppression. ++ac_configure_args= ++ac_configure_args0= ++ac_configure_args1= ++ac_sep= ++ac_must_keep_next=false ++for ac_pass in 1 2 ++do ++ for ac_arg ++ do ++ case $ac_arg in ++ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ continue ;; ++ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ++ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ esac ++ case $ac_pass in ++ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; ++ 2) ++ ac_configure_args1="$ac_configure_args1 '$ac_arg'" ++ if test $ac_must_keep_next = true; then ++ ac_must_keep_next=false # Got value, back to normal. ++ else ++ case $ac_arg in ++ *=* | --config-cache | -C | -disable-* | --disable-* \ ++ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ ++ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ ++ | -with-* | --with-* | -without-* | --without-* | --x) ++ case "$ac_configure_args0 " in ++ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; ++ esac ++ ;; ++ -* ) ac_must_keep_next=true ;; ++ esac ++ fi ++ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" ++ # Get rid of the leading space. ++ ac_sep=" " ++ ;; ++ esac ++ done ++done ++$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } ++$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } ++ ++# When interrupted or exit'd, cleanup temporary files, and complete ++# config.log. We remove comments because anyway the quotes in there ++# would cause problems or look ugly. ++# WARNING: Be sure not to use single quotes in there, as some shells, ++# such as our DU 5.0 friend, will then `close' the trap. ++trap 'exit_status=$? ++ # Save into config.log some information that might help in debugging. ++ { ++ echo ++ ++ cat <<\_ASBOX ++## ---------------- ## ++## Cache variables. ## ++## ---------------- ## ++_ASBOX ++ echo ++ # The following way of writing the cache mishandles newlines in values, ++{ ++ (set) 2>&1 | ++ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in ++ *ac_space=\ *) ++ sed -n \ ++ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ++ ;; ++ *) ++ sed -n \ ++ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ++ ;; ++ esac; ++} ++ echo ++ ++ cat <<\_ASBOX ++## ----------------- ## ++## Output variables. ## ++## ----------------- ## ++_ASBOX ++ echo ++ for ac_var in $ac_subst_vars ++ do ++ eval ac_val=$`echo $ac_var` ++ echo "$ac_var='"'"'$ac_val'"'"'" ++ done | sort ++ echo ++ ++ if test -n "$ac_subst_files"; then ++ cat <<\_ASBOX ++## ------------- ## ++## Output files. ## ++## ------------- ## ++_ASBOX ++ echo ++ for ac_var in $ac_subst_files ++ do ++ eval ac_val=$`echo $ac_var` ++ echo "$ac_var='"'"'$ac_val'"'"'" ++ done | sort ++ echo ++ fi ++ ++ if test -s confdefs.h; then ++ cat <<\_ASBOX ++## ----------- ## ++## confdefs.h. ## ++## ----------- ## ++_ASBOX ++ echo ++ sed "/^$/d" confdefs.h | sort ++ echo ++ fi ++ test "$ac_signal" != 0 && ++ echo "$as_me: caught signal $ac_signal" ++ echo "$as_me: exit $exit_status" ++ } >&5 ++ rm -f core *.core && ++ rm -rf conftest* confdefs* conf$$* $ac_clean_files && ++ exit $exit_status ++ ' 0 ++for ac_signal in 1 2 13 15; do ++ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal ++done ++ac_signal=0 + ++# confdefs.h avoids OS command line length limits that DEFS can exceed. ++rm -rf conftest* confdefs.h ++# AIX cpp loses on an empty file, so make sure it contains at least a newline. ++echo >confdefs.h ++ ++# Predefined preprocessor variables. ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_NAME "$PACKAGE_NAME" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_TARNAME "$PACKAGE_TARNAME" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_VERSION "$PACKAGE_VERSION" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_STRING "$PACKAGE_STRING" ++_ACEOF ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" ++_ACEOF ++ ++ ++# Let the site file select an alternate cache file if it wants to. + # Prefer explicitly selected file to automatically selected ones. + if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then +@@ -502,39 +1222,103 @@ + fi + for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then +- echo "loading site script $ac_site_file" ++ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 ++echo "$as_me: loading site script $ac_site_file" >&6;} ++ sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi + done + + if test -r "$cache_file"; then +- echo "loading cache $cache_file" +- . $cache_file ++ # Some versions of bash will fail to source /dev/null (special ++ # files actually), so we avoid doing that. ++ if test -f "$cache_file"; then ++ { echo "$as_me:$LINENO: loading cache $cache_file" >&5 ++echo "$as_me: loading cache $cache_file" >&6;} ++ case $cache_file in ++ [\\/]* | ?:[\\/]* ) . $cache_file;; ++ *) . ./$cache_file;; ++ esac ++ fi + else +- echo "creating cache $cache_file" +- > $cache_file ++ { echo "$as_me:$LINENO: creating cache $cache_file" >&5 ++echo "$as_me: creating cache $cache_file" >&6;} ++ >$cache_file ++fi ++ ++# Check that the precious variables saved in the cache have kept the same ++# value. ++ac_cache_corrupted=false ++for ac_var in `(set) 2>&1 | ++ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do ++ eval ac_old_set=\$ac_cv_env_${ac_var}_set ++ eval ac_new_set=\$ac_env_${ac_var}_set ++ eval ac_old_val="\$ac_cv_env_${ac_var}_value" ++ eval ac_new_val="\$ac_env_${ac_var}_value" ++ case $ac_old_set,$ac_new_set in ++ set,) ++ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 ++echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ++ ac_cache_corrupted=: ;; ++ ,set) ++ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 ++echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ++ ac_cache_corrupted=: ;; ++ ,);; ++ *) ++ if test "x$ac_old_val" != "x$ac_new_val"; then ++ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 ++echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ++ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 ++echo "$as_me: former value: $ac_old_val" >&2;} ++ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 ++echo "$as_me: current value: $ac_new_val" >&2;} ++ ac_cache_corrupted=: ++ fi;; ++ esac ++ # Pass precious variables to config.status. ++ if test "$ac_new_set" = set; then ++ case $ac_new_val in ++ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ++ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; ++ *) ac_arg=$ac_var=$ac_new_val ;; ++ esac ++ case " $ac_configure_args " in ++ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. ++ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; ++ esac ++ fi ++done ++if $ac_cache_corrupted; then ++ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 ++echo "$as_me: error: changes in the environment can compromise the build" >&2;} ++ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 ++echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} ++ { (exit 1); exit 1; }; } + fi + + ac_ext=c +-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. + ac_cpp='$CPP $CPPFLAGS' +-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +-cross_compiling=$ac_cv_prog_cc_cross +- +-ac_exeext= +-ac_objext=o +-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then +- # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. +- if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then +- ac_n= ac_c=' +-' ac_t=' ' +- else +- ac_n=-n ac_c= ac_t= +- fi +-else +- ac_n= ac_c='\c' ac_t= +-fi ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + ac_aux_dir= +@@ -547,14 +1331,20 @@ + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break ++ elif test -f $ac_dir/shtool; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/shtool install -c" ++ break + fi + done + if test -z "$ac_aux_dir"; then +- { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +-fi +-ac_config_guess=$ac_aux_dir/config.guess +-ac_config_sub=$ac_aux_dir/config.sub +-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. ++ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 ++echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ac_config_guess="$SHELL $ac_aux_dir/config.guess" ++ac_config_sub="$SHELL $ac_aux_dir/config.sub" ++ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + + # Find a good install program. We prefer a C program (faster), + # so one script is as good as another. But avoid the broken or +@@ -563,65 +1353,80 @@ + # SunOS /usr/etc/install + # IRIX /sbin/install + # AIX /bin/install ++# AmigaOS /C/install, which installs bootblocks on floppy discs + # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag + # AFS /usr/afsws/bin/install, which mishandles nonexistent args + # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# OS/2's system install, which has a completely different semantic + # ./install, which can be erroneously created by make from ./install.sh. +-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +-echo "configure:572: checking for a BSD compatible install" >&5 ++echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 ++echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 + if test -z "$INSTALL"; then +-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++if test "${ac_cv_path_install+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" +- for ac_dir in $PATH; do +- # Account for people who put trailing slashes in PATH elements. +- case "$ac_dir/" in +- /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; +- *) +- # OSF1 and SCO ODT 3.0 have their own names for install. +- # Don't use installbsd from OSF since it installs stuff as root +- # by default. +- for ac_prog in ginstall scoinst install; do +- if test -f $ac_dir/$ac_prog; then ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ # Account for people who put trailing slashes in PATH elements. ++case $as_dir/ in ++ ./ | .// | /cC/* | \ ++ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ++ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ ++ /usr/ucb/* ) ;; ++ *) ++ # OSF1 and SCO ODT 3.0 have their own names for install. ++ # Don't use installbsd from OSF since it installs stuff as root ++ # by default. ++ for ac_prog in ginstall scoinst install; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && +- grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then ++ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : ++ elif test $ac_prog = install && ++ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # program-specific install script used by HP pwplus--don't use. ++ : + else +- ac_cv_path_install="$ac_dir/$ac_prog -c" +- break 2 ++ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" ++ break 3 + fi + fi + done +- ;; +- esac +- done +- IFS="$ac_save_IFS" ++ done ++ ;; ++esac ++done ++ + + fi + if test "${ac_cv_path_install+set}" = set; then +- INSTALL="$ac_cv_path_install" ++ INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. +- INSTALL="$ac_install_sh" ++ INSTALL=$ac_install_sh + fi + fi +-echo "$ac_t""$INSTALL" 1>&6 ++echo "$as_me:$LINENO: result: $INSTALL" >&5 ++echo "${ECHO_T}$INSTALL" >&6 + + # Use test -z because SunOS4 sh mishandles braces in ${var-val}. + # It thinks the first close brace ends the variable substitution. + test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' ++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + + test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +-echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +-echo "configure:625: checking whether build environment is sane" >&5 ++echo "$as_me:$LINENO: checking whether build environment is sane" >&5 ++echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 + # Just in case + sleep 1 + echo timestamp > conftestfile +@@ -643,8 +1448,11 @@ + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". +- { echo "configure: error: ls -t appears to fail. Make sure there is not a broken +-alias in your environment" 1>&2; exit 1; } ++ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken ++alias in your environment" >&5 ++echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken ++alias in your environment" >&2;} ++ { (exit 1); exit 1; }; } + fi + + test "$2" = conftestfile +@@ -653,54 +1461,54 @@ + # Ok. + : + else +- { echo "configure: error: newly created file is older than distributed files! +-Check your system clock" 1>&2; exit 1; } ++ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! ++Check your system clock" >&5 ++echo "$as_me: error: newly created file is older than distributed files! ++Check your system clock" >&2;} ++ { (exit 1); exit 1; }; } + fi + rm -f conftest* +-echo "$ac_t""yes" 1>&6 +-if test "$program_transform_name" = s,x,x,; then +- program_transform_name= +-else +- # Double any \ or $. echo might interpret backslashes. +- cat <<\EOF_SED > conftestsed +-s,\\,\\\\,g; s,\$,$$,g +-EOF_SED +- program_transform_name="`echo $program_transform_name|sed -f conftestsed`" +- rm -f conftestsed +-fi ++echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + test "$program_prefix" != NONE && +- program_transform_name="s,^,${program_prefix},; $program_transform_name" ++ program_transform_name="s,^,$program_prefix,;$program_transform_name" + # Use a double $ so make ignores it. + test "$program_suffix" != NONE && +- program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" +- +-# sed with no file args requires a program. +-test "$program_transform_name" = "" && program_transform_name="s,x,x," +- +-echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +-echo "configure:682: checking whether ${MAKE-make} sets \${MAKE}" >&5 +-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ program_transform_name="s,\$,$program_suffix,;$program_transform_name" ++# Double any \ or $. echo might interpret backslashes. ++# By default was `s,x,x', remove it if useless. ++cat <<\_ACEOF >conftest.sed ++s/[\\$]/&&/g;s/;s,x,x,$// ++_ACEOF ++program_transform_name=`echo $program_transform_name | sed -f conftest.sed` ++rm conftest.sed ++ ++echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 ++echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 ++set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` ++if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- cat > conftestmake <<\EOF ++ cat >conftest.make <<\_ACEOF + all: +- @echo 'ac_maketemp="${MAKE}"' +-EOF ++ @echo 'ac_maketemp="$(MAKE)"' ++_ACEOF + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. +-eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` ++eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` + if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes + else + eval ac_cv_prog_make_${ac_make}_set=no + fi +-rm -f conftestmake ++rm -f conftest.make + fi + if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + SET_MAKE= + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" + fi + +@@ -710,75 +1518,87 @@ + VERSION=0.65.0 + + if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then +- { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } ++ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 ++echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} ++ { (exit 1); exit 1; }; } + fi + + + + missing_dir=`cd $ac_aux_dir && pwd` +-echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 +-echo "configure:721: checking for working aclocal" >&5 ++echo "$as_me:$LINENO: checking for working aclocal" >&5 ++echo $ECHO_N "checking for working aclocal... $ECHO_C" >&6 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. + if (aclocal --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal +- echo "$ac_t""found" 1>&6 ++ echo "$as_me:$LINENO: result: found" >&5 ++echo "${ECHO_T}found" >&6 + else + ACLOCAL="$missing_dir/missing aclocal" +- echo "$ac_t""missing" 1>&6 ++ echo "$as_me:$LINENO: result: missing" >&5 ++echo "${ECHO_T}missing" >&6 + fi + +-echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +-echo "configure:734: checking for working autoconf" >&5 ++echo "$as_me:$LINENO: checking for working autoconf" >&5 ++echo $ECHO_N "checking for working autoconf... $ECHO_C" >&6 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. + if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf +- echo "$ac_t""found" 1>&6 ++ echo "$as_me:$LINENO: result: found" >&5 ++echo "${ECHO_T}found" >&6 + else + AUTOCONF="$missing_dir/missing autoconf" +- echo "$ac_t""missing" 1>&6 ++ echo "$as_me:$LINENO: result: missing" >&5 ++echo "${ECHO_T}missing" >&6 + fi + +-echo $ac_n "checking for working automake""... $ac_c" 1>&6 +-echo "configure:747: checking for working automake" >&5 ++echo "$as_me:$LINENO: checking for working automake" >&5 ++echo $ECHO_N "checking for working automake... $ECHO_C" >&6 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. + if (automake --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake +- echo "$ac_t""found" 1>&6 ++ echo "$as_me:$LINENO: result: found" >&5 ++echo "${ECHO_T}found" >&6 + else + AUTOMAKE="$missing_dir/missing automake" +- echo "$ac_t""missing" 1>&6 ++ echo "$as_me:$LINENO: result: missing" >&5 ++echo "${ECHO_T}missing" >&6 + fi + +-echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +-echo "configure:760: checking for working autoheader" >&5 ++echo "$as_me:$LINENO: checking for working autoheader" >&5 ++echo $ECHO_N "checking for working autoheader... $ECHO_C" >&6 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. + if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader +- echo "$ac_t""found" 1>&6 ++ echo "$as_me:$LINENO: result: found" >&5 ++echo "${ECHO_T}found" >&6 + else + AUTOHEADER="$missing_dir/missing autoheader" +- echo "$ac_t""missing" 1>&6 ++ echo "$as_me:$LINENO: result: missing" >&5 ++echo "${ECHO_T}missing" >&6 + fi + +-echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +-echo "configure:773: checking for working makeinfo" >&5 ++echo "$as_me:$LINENO: checking for working makeinfo" >&5 ++echo $ECHO_N "checking for working makeinfo... $ECHO_C" >&6 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. + if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo +- echo "$ac_t""found" 1>&6 ++ echo "$as_me:$LINENO: result: found" >&5 ++echo "${ECHO_T}found" >&6 + else + MAKEINFO="$missing_dir/missing makeinfo" +- echo "$ac_t""missing" 1>&6 ++ echo "$as_me:$LINENO: result: missing" >&5 ++echo "${ECHO_T}missing" >&6 + fi + + +@@ -786,214 +1606,657 @@ + test x$prefix = "xNONE" && prefix="$ac_default_prefix" + + +-# Extract the first word of "gcc", so it can be a program name with args. +-set dummy gcc; ac_word=$2 +-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:793: checking for $ac_word" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. ++set dummy ${ac_tool_prefix}gcc; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_dummy="$PATH" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/$ac_word; then +- ac_cv_prog_CC="gcc" +- break +- fi +- done +- IFS="$ac_save_ifs" ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_CC="${ac_tool_prefix}gcc" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ + fi + fi +-CC="$ac_cv_prog_CC" ++CC=$ac_cv_prog_CC + if test -n "$CC"; then +- echo "$ac_t""$CC" 1>&6 ++ echo "$as_me:$LINENO: result: $CC" >&5 ++echo "${ECHO_T}$CC" >&6 + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi + +-if test -z "$CC"; then +- # Extract the first word of "cc", so it can be a program name with args. +-set dummy cc; ac_word=$2 +-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:823: checking for $ac_word" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++fi ++if test -z "$ac_cv_prog_CC"; then ++ ac_ct_CC=$CC ++ # Extract the first word of "gcc", so it can be a program name with args. ++set dummy gcc; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. ++ if test -n "$ac_ct_CC"; then ++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. + else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_prog_rejected=no +- ac_dummy="$PATH" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/$ac_word; then +- if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then +- ac_prog_rejected=yes +- continue +- fi +- ac_cv_prog_CC="cc" +- break +- fi +- done +- IFS="$ac_save_ifs" ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_CC="gcc" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++ac_ct_CC=$ac_cv_prog_ac_ct_CC ++if test -n "$ac_ct_CC"; then ++ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 ++echo "${ECHO_T}$ac_ct_CC" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ CC=$ac_ct_CC ++else ++ CC="$ac_cv_prog_CC" ++fi ++ ++if test -z "$CC"; then ++ if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. ++set dummy ${ac_tool_prefix}cc; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_CC="${ac_tool_prefix}cc" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++CC=$ac_cv_prog_CC ++if test -n "$CC"; then ++ echo "$as_me:$LINENO: result: $CC" >&5 ++echo "${ECHO_T}$CC" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++fi ++if test -z "$ac_cv_prog_CC"; then ++ ac_ct_CC=$CC ++ # Extract the first word of "cc", so it can be a program name with args. ++set dummy cc; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$ac_ct_CC"; then ++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_CC="cc" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++fi ++fi ++ac_ct_CC=$ac_cv_prog_ac_ct_CC ++if test -n "$ac_ct_CC"; then ++ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 ++echo "${ECHO_T}$ac_ct_CC" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ CC=$ac_ct_CC ++else ++ CC="$ac_cv_prog_CC" ++fi ++ ++fi ++if test -z "$CC"; then ++ # Extract the first word of "cc", so it can be a program name with args. ++set dummy cc; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++ ac_prog_rejected=no ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ++ ac_prog_rejected=yes ++ continue ++ fi ++ ac_cv_prog_CC="cc" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ + if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift +- if test $# -gt 0; then ++ if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift +- set dummy "$ac_dir/$ac_word" "$@" +- shift +- ac_cv_prog_CC="$@" ++ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi + fi + fi + fi +-CC="$ac_cv_prog_CC" ++CC=$ac_cv_prog_CC + if test -n "$CC"; then +- echo "$ac_t""$CC" 1>&6 ++ echo "$as_me:$LINENO: result: $CC" >&5 ++echo "${ECHO_T}$CC" >&6 + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi + +- if test -z "$CC"; then +- case "`uname -s`" in +- *win32* | *WIN32*) +- # Extract the first word of "cl", so it can be a program name with args. +-set dummy cl; ac_word=$2 +-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:874: checking for $ac_word" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++fi ++if test -z "$CC"; then ++ if test -n "$ac_tool_prefix"; then ++ for ac_prog in cl ++ do ++ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. ++set dummy $ac_tool_prefix$ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_dummy="$PATH" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/$ac_word; then +- ac_cv_prog_CC="cl" +- break +- fi +- done +- IFS="$ac_save_ifs" ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_CC="$ac_tool_prefix$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ + fi + fi +-CC="$ac_cv_prog_CC" ++CC=$ac_cv_prog_CC + if test -n "$CC"; then +- echo "$ac_t""$CC" 1>&6 ++ echo "$as_me:$LINENO: result: $CC" >&5 ++echo "${ECHO_T}$CC" >&6 + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi +- ;; +- esac ++ ++ test -n "$CC" && break ++ done ++fi ++if test -z "$CC"; then ++ ac_ct_CC=$CC ++ for ac_prog in cl ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$ac_ct_CC"; then ++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_CC="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 + fi +- test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } ++done ++done ++ ++fi ++fi ++ac_ct_CC=$ac_cv_prog_ac_ct_CC ++if test -n "$ac_ct_CC"; then ++ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 ++echo "${ECHO_T}$ac_ct_CC" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi + +-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +-echo "configure:906: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ++ test -n "$ac_ct_CC" && break ++done + +-ac_ext=c +-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +-cross_compiling=$ac_cv_prog_cc_cross ++ CC=$ac_ct_CC ++fi + +-cat > conftest.$ac_ext << EOF ++fi + +-#line 917 "configure" +-#include "confdefs.h" + +-main(){return(0);} +-EOF +-if { (eval echo configure:922: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- ac_cv_prog_cc_works=yes +- # If we can't run a trivial program, we are probably using a cross compiler. +- if (./conftest; exit) 2>/dev/null; then +- ac_cv_prog_cc_cross=no +- else +- ac_cv_prog_cc_cross=yes +- fi ++test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH ++See \`config.log' for more details." >&5 ++echo "$as_me: error: no acceptable C compiler found in \$PATH ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++ ++# Provide some information about the compiler. ++echo "$as_me:$LINENO:" \ ++ "checking for C compiler version" >&5 ++ac_compiler=`set X $ac_compile; echo $2` ++{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 ++ (eval $ac_compiler --version </dev/null >&5) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 ++ (eval $ac_compiler -v </dev/null >&5) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 ++ (eval $ac_compiler -V </dev/null >&5) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++ ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++ac_clean_files_save=$ac_clean_files ++ac_clean_files="$ac_clean_files a.out a.exe b.out" ++# Try to create an executable without -o first, disregard a.out. ++# It will help us diagnose broken compilers, and finding out an intuition ++# of exeext. ++echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 ++echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ++ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` ++if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 ++ (eval $ac_link_default) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ # Find the output, starting from the most likely. This scheme is ++# not robust to junk in `.', hence go to wildcards (a.*) only as a last ++# resort. ++ ++# Be careful to initialize this variable, since it used to be cached. ++# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ++ac_cv_exeext= ++# b.out is created by i960 compilers. ++for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out ++do ++ test -f "$ac_file" || continue ++ case $ac_file in ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ++ ;; ++ conftest.$ac_ext ) ++ # This is the source file. ++ ;; ++ [ab].out ) ++ # We found the default executable, but exeext='' is most ++ # certainly right. ++ break;; ++ *.* ) ++ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` ++ # FIXME: I believe we export ac_cv_exeext for Libtool, ++ # but it would be cool to find out if it's true. Does anybody ++ # maintain Libtool? --akim. ++ export ac_cv_exeext ++ break;; ++ * ) ++ break;; ++ esac ++done + else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- ac_cv_prog_cc_works=no +-fi +-rm -fr conftest* +-ac_ext=c +-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +-cross_compiling=$ac_cv_prog_cc_cross ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +-if test $ac_cv_prog_cc_works = no; then +- { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } ++{ { echo "$as_me:$LINENO: error: C compiler cannot create executables ++See \`config.log' for more details." >&5 ++echo "$as_me: error: C compiler cannot create executables ++See \`config.log' for more details." >&2;} ++ { (exit 77); exit 77; }; } ++fi ++ ++ac_exeext=$ac_cv_exeext ++echo "$as_me:$LINENO: result: $ac_file" >&5 ++echo "${ECHO_T}$ac_file" >&6 ++ ++# Check the compiler produces executables we can run. If not, either ++# the compiler is broken, or we cross compile. ++echo "$as_me:$LINENO: checking whether the C compiler works" >&5 ++echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 ++# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 ++# If not cross compiling, check that we can run a simple program. ++if test "$cross_compiling" != yes; then ++ if { ac_try='./$ac_file' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ cross_compiling=no ++ else ++ if test "$cross_compiling" = maybe; then ++ cross_compiling=yes ++ else ++ { { echo "$as_me:$LINENO: error: cannot run C compiled programs. ++If you meant to cross compile, use \`--host'. ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot run C compiled programs. ++If you meant to cross compile, use \`--host'. ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++ fi ++ fi + fi +-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +-echo "configure:948: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +-echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +-cross_compiling=$ac_cv_prog_cc_cross ++echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + +-echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +-echo "configure:953: checking whether we are using GNU C" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++rm -f a.out a.exe conftest$ac_cv_exeext b.out ++ac_clean_files=$ac_clean_files_save ++# Check the compiler produces executables we can run. If not, either ++# the compiler is broken, or we cross compile. ++echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 ++echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 ++echo "$as_me:$LINENO: result: $cross_compiling" >&5 ++echo "${ECHO_T}$cross_compiling" >&6 ++ ++echo "$as_me:$LINENO: checking for suffix of executables" >&5 ++echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ # If both `conftest.exe' and `conftest' are `present' (well, observable) ++# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will ++# work properly (i.e., refer to `conftest.exe'), while it won't with ++# `rm'. ++for ac_file in conftest.exe conftest conftest.*; do ++ test -f "$ac_file" || continue ++ case $ac_file in ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; ++ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` ++ export ac_cv_exeext ++ break;; ++ * ) break;; ++ esac ++done + else +- cat > conftest.c <<EOF +-#ifdef __GNUC__ +- yes; +-#endif +-EOF +-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:962: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +- ac_cv_prog_gcc=yes ++ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute suffix of executables: cannot compile and link ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++rm -f conftest$ac_cv_exeext ++echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 ++echo "${ECHO_T}$ac_cv_exeext" >&6 ++ ++rm -f conftest.$ac_ext ++EXEEXT=$ac_cv_exeext ++ac_exeext=$EXEEXT ++echo "$as_me:$LINENO: checking for suffix of object files" >&5 ++echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 ++if test "${ac_cv_objext+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.o conftest.obj ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do ++ case $ac_file in ++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; ++ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` ++ break;; ++ esac ++done + else +- ac_cv_prog_gcc=no +-fi +-fi +- +-echo "$ac_t""$ac_cv_prog_gcc" 1>&6 ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-if test $ac_cv_prog_gcc = yes; then +- GCC=yes +-else +- GCC= +-fi ++{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile ++See \`config.log' for more details." >&5 ++echo "$as_me: error: cannot compute suffix of object files: cannot compile ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++rm -f conftest.$ac_cv_objext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 ++echo "${ECHO_T}$ac_cv_objext" >&6 ++OBJEXT=$ac_cv_objext ++ac_objext=$OBJEXT ++echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 ++echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 ++if test "${ac_cv_c_compiler_gnu+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++#ifndef __GNUC__ ++ choke me ++#endif + +-ac_test_CFLAGS="${CFLAGS+set}" +-ac_save_CFLAGS="$CFLAGS" +-CFLAGS= +-echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +-echo "configure:981: checking whether ${CC-cc} accepts -g" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- echo 'void f(){}' > conftest.c +-if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_compiler_gnu=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_compiler_gnu=no ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ac_cv_c_compiler_gnu=$ac_compiler_gnu ++ ++fi ++echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 ++echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 ++GCC=`test $ac_compiler_gnu = yes && echo yes` ++ac_test_CFLAGS=${CFLAGS+set} ++ac_save_CFLAGS=$CFLAGS ++CFLAGS="-g" ++echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 ++echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 ++if test "${ac_cv_prog_cc_g+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes + else +- ac_cv_prog_cc_g=no +-fi +-rm -f conftest* ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + ++ac_cv_prog_cc_g=no + fi +- +-echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 ++echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 + if test "$ac_test_CFLAGS" = set; then +- CFLAGS="$ac_save_CFLAGS" ++ CFLAGS=$ac_save_CFLAGS + elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" +@@ -1007,136 +2270,494 @@ + CFLAGS= + fi + fi +- +-for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl ++echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 ++echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 ++if test "${ac_cv_prog_cc_stdc+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_cv_prog_cc_stdc=no ++ac_save_CC=$CC ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <stdarg.h> ++#include <stdio.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ ++struct buf { int x; }; ++FILE * (*rcsopen) (struct buf *, struct stat *, int); ++static char *e (p, i) ++ char **p; ++ int i; ++{ ++ return p[i]; ++} ++static char *f (char * (*g) (char **, int), char **p, ...) ++{ ++ char *s; ++ va_list v; ++ va_start (v,p); ++ s = g (p, va_arg (v,int)); ++ va_end (v); ++ return s; ++} ++ ++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has ++ function prototypes and stuff, but not '\xHH' hex character constants. ++ These don't provoke an error unfortunately, instead are silently treated ++ as 'x'. The following induces an error, until -std1 is added to get ++ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an ++ array size at least. It's necessary to write '\x00'==0 to get something ++ that's true only with -std1. */ ++int osf4_cc_array ['\x00' == 0 ? 1 : -1]; ++ ++int test (int i, double x); ++struct s1 {int (*f) (int a);}; ++struct s2 {int (*f) (double a);}; ++int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); ++int argc; ++char **argv; ++int ++main () ++{ ++return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ++ ; ++ return 0; ++} ++_ACEOF ++# Don't try gcc -ansi; that turns off useful extensions and ++# breaks some systems' header files. ++# AIX -qlanglvl=ansi ++# Ultrix and OSF/1 -std1 ++# HP-UX 10.20 and later -Ae ++# HP-UX older versions -Aa -D_HPUX_SOURCE ++# SVR4 -Xc -D__EXTENSIONS__ ++for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" + do +-# Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:1017: checking for $ac_word" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ CC="$ac_save_CC $ac_arg" ++ rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_prog_cc_stdc=$ac_arg ++break + else +- if test -n "$CXX"; then +- ac_cv_prog_CXX="$CXX" # Let the user override the test. +-else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_dummy="$PATH" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/$ac_word; then +- ac_cv_prog_CXX="$ac_prog" +- break +- fi +- done +- IFS="$ac_save_ifs" ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ + fi ++rm -f conftest.err conftest.$ac_objext ++done ++rm -f conftest.$ac_ext conftest.$ac_objext ++CC=$ac_save_CC ++ + fi +-CXX="$ac_cv_prog_CXX" +-if test -n "$CXX"; then +- echo "$ac_t""$CXX" 1>&6 ++ ++case "x$ac_cv_prog_cc_stdc" in ++ x|xno) ++ echo "$as_me:$LINENO: result: none needed" >&5 ++echo "${ECHO_T}none needed" >&6 ;; ++ *) ++ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 ++echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 ++ CC="$CC $ac_cv_prog_cc_stdc" ;; ++esac ++ ++# Some people use a C++ compiler to compile C. Since we use `exit', ++# in C++ we need to declare it. In case someone uses the same compiler ++# for both compiling C and C++ we need to have the C++ compiler decide ++# the declaration of exit, since it's the most demanding environment. ++cat >conftest.$ac_ext <<_ACEOF ++#ifndef __cplusplus ++ choke me ++#endif ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ for ac_declaration in \ ++ '' \ ++ 'extern "C" void std::exit (int) throw (); using std::exit;' \ ++ 'extern "C" void std::exit (int); using std::exit;' \ ++ 'extern "C" void exit (int) throw ();' \ ++ 'extern "C" void exit (int);' \ ++ 'void exit (int);' ++do ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_declaration ++#include <stdlib.h> ++int ++main () ++{ ++exit (42); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ : + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++continue + fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_declaration ++int ++main () ++{ ++exit (42); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-test -n "$CXX" && break ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done +-test -n "$CXX" || CXX="gcc" ++rm -f conftest* ++if test -n "$ac_declaration"; then ++ echo '#ifdef __cplusplus' >>confdefs.h ++ echo $ac_declaration >>confdefs.h ++ echo '#endif' >>confdefs.h ++fi + ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +-echo "configure:1049: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu + +-ac_ext=C +-# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_ext=cc + ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +-ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +-cross_compiling=$ac_cv_prog_cxx_cross +- +-cat > conftest.$ac_ext << EOF +- +-#line 1060 "configure" +-#include "confdefs.h" +- +-int main(){return(0);} +-EOF +-if { (eval echo configure:1065: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- ac_cv_prog_cxx_works=yes +- # If we can't run a trivial program, we are probably using a cross compiler. +- if (./conftest; exit) 2>/dev/null; then +- ac_cv_prog_cxx_cross=no +- else +- ac_cv_prog_cxx_cross=yes ++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ++if test -n "$ac_tool_prefix"; then ++ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC ++ do ++ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. ++set dummy $ac_tool_prefix$ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_CXX+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$CXX"; then ++ ac_cv_prog_CXX="$CXX" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 + fi ++done ++done ++ ++fi ++fi ++CXX=$ac_cv_prog_CXX ++if test -n "$CXX"; then ++ echo "$as_me:$LINENO: result: $CXX" >&5 ++echo "${ECHO_T}$CXX" >&6 + else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- ac_cv_prog_cxx_works=no ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi +-rm -fr conftest* +-ac_ext=c +-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +-cross_compiling=$ac_cv_prog_cc_cross + +-echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6 +-if test $ac_cv_prog_cxx_works = no; then +- { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } ++ test -n "$CXX" && break ++ done + fi +-echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +-echo "configure:1091: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +-echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 +-cross_compiling=$ac_cv_prog_cxx_cross +- +-echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 +-echo "configure:1096: checking whether we are using GNU C++" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++if test -z "$CXX"; then ++ ac_ct_CXX=$CXX ++ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- cat > conftest.C <<EOF +-#ifdef __GNUC__ +- yes; +-#endif +-EOF +-if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1105: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +- ac_cv_prog_gxx=yes ++ if test -n "$ac_ct_CXX"; then ++ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. + else +- ac_cv_prog_gxx=no ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_CXX="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ + fi + fi ++ac_ct_CXX=$ac_cv_prog_ac_ct_CXX ++if test -n "$ac_ct_CXX"; then ++ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 ++echo "${ECHO_T}$ac_ct_CXX" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi + +-echo "$ac_t""$ac_cv_prog_gxx" 1>&6 ++ test -n "$ac_ct_CXX" && break ++done ++test -n "$ac_ct_CXX" || ac_ct_CXX="g++" + +-if test $ac_cv_prog_gxx = yes; then +- GXX=yes +-else +- GXX= ++ CXX=$ac_ct_CXX + fi + +-ac_test_CXXFLAGS="${CXXFLAGS+set}" +-ac_save_CXXFLAGS="$CXXFLAGS" +-CXXFLAGS= +-echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 +-echo "configure:1124: checking whether ${CXX-g++} accepts -g" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- echo 'void f(){}' > conftest.cc +-if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then ++ ++# Provide some information about the compiler. ++echo "$as_me:$LINENO:" \ ++ "checking for C++ compiler version" >&5 ++ac_compiler=`set X $ac_compile; echo $2` ++{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 ++ (eval $ac_compiler --version </dev/null >&5) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 ++ (eval $ac_compiler -v </dev/null >&5) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 ++ (eval $ac_compiler -V </dev/null >&5) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } ++ ++echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 ++echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 ++if test "${ac_cv_cxx_compiler_gnu+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++#ifndef __GNUC__ ++ choke me ++#endif ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_compiler_gnu=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_compiler_gnu=no ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ac_cv_cxx_compiler_gnu=$ac_compiler_gnu ++ ++fi ++echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 ++echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 ++GXX=`test $ac_compiler_gnu = yes && echo yes` ++ac_test_CXXFLAGS=${CXXFLAGS+set} ++ac_save_CXXFLAGS=$CXXFLAGS ++CXXFLAGS="-g" ++echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 ++echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 ++if test "${ac_cv_prog_cxx_g+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes + else +- ac_cv_prog_cxx_g=no +-fi +-rm -f conftest* ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + ++ac_cv_prog_cxx_g=no + fi +- +-echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 ++echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 + if test "$ac_test_CXXFLAGS" = set; then +- CXXFLAGS="$ac_save_CXXFLAGS" ++ CXXFLAGS=$ac_save_CXXFLAGS + elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" +@@ -1150,6 +2771,115 @@ + CXXFLAGS= + fi + fi ++for ac_declaration in \ ++ '' \ ++ 'extern "C" void std::exit (int) throw (); using std::exit;' \ ++ 'extern "C" void std::exit (int); using std::exit;' \ ++ 'extern "C" void exit (int) throw ();' \ ++ 'extern "C" void exit (int);' \ ++ 'void exit (int);' ++do ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_declaration ++#include <stdlib.h> ++int ++main () ++{ ++exit (42); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ : ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++continue ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_declaration ++int ++main () ++{ ++exit (42); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++done ++rm -f conftest* ++if test -n "$ac_declaration"; then ++ echo '#ifdef __cplusplus' >>confdefs.h ++ echo $ac_declaration >>confdefs.h ++ echo '#endif' >>confdefs.h ++fi ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu + + # Find a good install program. We prefer a C program (faster), + # so one script is as good as another. But avoid the broken or +@@ -1158,505 +2888,1513 @@ + # SunOS /usr/etc/install + # IRIX /sbin/install + # AIX /bin/install ++# AmigaOS /C/install, which installs bootblocks on floppy discs + # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag + # AFS /usr/afsws/bin/install, which mishandles nonexistent args + # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# OS/2's system install, which has a completely different semantic + # ./install, which can be erroneously created by make from ./install.sh. +-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +-echo "configure:1167: checking for a BSD compatible install" >&5 ++echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 ++echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 + if test -z "$INSTALL"; then +-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++if test "${ac_cv_path_install+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" +- for ac_dir in $PATH; do +- # Account for people who put trailing slashes in PATH elements. +- case "$ac_dir/" in +- /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; +- *) +- # OSF1 and SCO ODT 3.0 have their own names for install. +- # Don't use installbsd from OSF since it installs stuff as root +- # by default. +- for ac_prog in ginstall scoinst install; do +- if test -f $ac_dir/$ac_prog; then ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ # Account for people who put trailing slashes in PATH elements. ++case $as_dir/ in ++ ./ | .// | /cC/* | \ ++ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ++ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ ++ /usr/ucb/* ) ;; ++ *) ++ # OSF1 and SCO ODT 3.0 have their own names for install. ++ # Don't use installbsd from OSF since it installs stuff as root ++ # by default. ++ for ac_prog in ginstall scoinst install; do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && +- grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then ++ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : ++ elif test $ac_prog = install && ++ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # program-specific install script used by HP pwplus--don't use. ++ : + else +- ac_cv_path_install="$ac_dir/$ac_prog -c" +- break 2 ++ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" ++ break 3 + fi + fi + done +- ;; +- esac +- done +- IFS="$ac_save_IFS" ++ done ++ ;; ++esac ++done ++ + + fi + if test "${ac_cv_path_install+set}" = set; then +- INSTALL="$ac_cv_path_install" ++ INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. +- INSTALL="$ac_install_sh" ++ INSTALL=$ac_install_sh + fi + fi +-echo "$ac_t""$INSTALL" 1>&6 ++echo "$as_me:$LINENO: result: $INSTALL" >&5 ++echo "${ECHO_T}$INSTALL" >&6 + + # Use test -z because SunOS4 sh mishandles braces in ${var-val}. + # It thinks the first close brace ends the variable substitution. + test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' ++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + + test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + + for ac_prog in sed + do +-# Extract the first word of "$ac_prog", so it can be a program name with args. ++ # Extract the first word of "$ac_prog", so it can be a program name with args. + set dummy $ac_prog; ac_word=$2 +-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:1225: checking for $ac_word" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_regex_cmd'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_regex_cmd+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else + if test -n "$regex_cmd"; then + ac_cv_prog_regex_cmd="$regex_cmd" # Let the user override the test. + else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_dummy="$PATH" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/$ac_word; then +- ac_cv_prog_regex_cmd="$ac_prog" +- break +- fi +- done +- IFS="$ac_save_ifs" ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_regex_cmd="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ + fi + fi +-regex_cmd="$ac_cv_prog_regex_cmd" ++regex_cmd=$ac_cv_prog_regex_cmd + if test -n "$regex_cmd"; then +- echo "$ac_t""$regex_cmd" 1>&6 ++ echo "$as_me:$LINENO: result: $regex_cmd" >&5 ++echo "${ECHO_T}$regex_cmd" >&6 + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi + +-test -n "$regex_cmd" && break ++ test -n "$regex_cmd" && break + done + + if test x$regex_cmd = "x"; then +- { echo "configure: error: error. sed is required to build the default menu file." 1>&2; exit 1; } ++ { { echo "$as_me:$LINENO: error: error. sed is required to build the default menu file." >&5 ++echo "$as_me: error: error. sed is required to build the default menu file." >&2;} ++ { (exit 1); exit 1; }; } + fi + +-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +-echo "configure:1259: checking how to run the C preprocessor" >&5 ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 ++echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 + # On Suns, sometimes $CPP names a directory. + if test -n "$CPP" && test -d "$CPP"; then + CPP= + fi + if test -z "$CPP"; then +-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ if test "${ac_cv_prog_CPP+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- # This must be in double quotes, not single quotes, because CPP may get +- # substituted into the Makefile and "${CC-cc}" will confuse make. +- CPP="${CC-cc} -E" ++ # Double quotes because CPP needs to be expanded ++ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" ++ do ++ ac_preproc_ok=false ++for ac_c_preproc_warn_flag in '' yes ++do ++ # Use a header file that comes with gcc, so configuring glibc ++ # with a fresh cross-compiler works. ++ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since ++ # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. +- cat > conftest.$ac_ext <<EOF +-#line 1274 "configure" +-#include "confdefs.h" +-#include <assert.h> +-Syntax Error +-EOF +-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:1280: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +-if test -z "$ac_err"; then ++ # not just through cpp. "Syntax error" is here to catch this case. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include <limits.h> ++#else ++# include <assert.h> ++#endif ++ Syntax error ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag ++ else ++ ac_cpp_err= ++ fi ++else ++ ac_cpp_err=yes ++fi ++if test -z "$ac_cpp_err"; then + : + else +- echo "$ac_err" >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- CPP="${CC-cc} -E -traditional-cpp" +- cat > conftest.$ac_ext <<EOF +-#line 1291 "configure" +-#include "confdefs.h" +-#include <assert.h> +-Syntax Error +-EOF +-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:1297: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +-if test -z "$ac_err"; then ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ # Broken: fails on valid input. ++continue ++fi ++rm -f conftest.err conftest.$ac_ext ++ ++ # OK, works on sane cases. Now check whether non-existent headers ++ # can be detected and how. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <ac_nonexistent.h> ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag ++ else ++ ac_cpp_err= ++ fi ++else ++ ac_cpp_err=yes ++fi ++if test -z "$ac_cpp_err"; then ++ # Broken: success on invalid input. ++continue ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ # Passes both tests. ++ac_preproc_ok=: ++break ++fi ++rm -f conftest.err conftest.$ac_ext ++ ++done ++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. ++rm -f conftest.err conftest.$ac_ext ++if $ac_preproc_ok; then ++ break ++fi ++ ++ done ++ ac_cv_prog_CPP=$CPP ++ ++fi ++ CPP=$ac_cv_prog_CPP ++else ++ ac_cv_prog_CPP=$CPP ++fi ++echo "$as_me:$LINENO: result: $CPP" >&5 ++echo "${ECHO_T}$CPP" >&6 ++ac_preproc_ok=false ++for ac_c_preproc_warn_flag in '' yes ++do ++ # Use a header file that comes with gcc, so configuring glibc ++ # with a fresh cross-compiler works. ++ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since ++ # <limits.h> exists even on freestanding compilers. ++ # On the NeXT, cc -E runs the code through the compiler's parser, ++ # not just through cpp. "Syntax error" is here to catch this case. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#ifdef __STDC__ ++# include <limits.h> ++#else ++# include <assert.h> ++#endif ++ Syntax error ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag ++ else ++ ac_cpp_err= ++ fi ++else ++ ac_cpp_err=yes ++fi ++if test -z "$ac_cpp_err"; then ++ : ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ # Broken: fails on valid input. ++continue ++fi ++rm -f conftest.err conftest.$ac_ext ++ ++ # OK, works on sane cases. Now check whether non-existent headers ++ # can be detected and how. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <ac_nonexistent.h> ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag ++ else ++ ac_cpp_err= ++ fi ++else ++ ac_cpp_err=yes ++fi ++if test -z "$ac_cpp_err"; then ++ # Broken: success on invalid input. ++continue ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ # Passes both tests. ++ac_preproc_ok=: ++break ++fi ++rm -f conftest.err conftest.$ac_ext ++ ++done ++# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. ++rm -f conftest.err conftest.$ac_ext ++if $ac_preproc_ok; then + : + else +- echo "$ac_err" >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- CPP="${CC-cc} -nologo -E" +- cat > conftest.$ac_ext <<EOF +-#line 1308 "configure" +-#include "confdefs.h" +-#include <assert.h> +-Syntax Error +-EOF +-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:1314: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +-if test -z "$ac_err"; then ++ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details." >&5 ++echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details." >&2;} ++ { (exit 1); exit 1; }; } ++fi ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++echo "$as_me:$LINENO: checking for egrep" >&5 ++echo $ECHO_N "checking for egrep... $ECHO_C" >&6 ++if test "${ac_cv_prog_egrep+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if echo a | (grep -E '(a|b)') >/dev/null 2>&1 ++ then ac_cv_prog_egrep='grep -E' ++ else ac_cv_prog_egrep='egrep' ++ fi ++fi ++echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 ++echo "${ECHO_T}$ac_cv_prog_egrep" >&6 ++ EGREP=$ac_cv_prog_egrep ++ ++ ++echo "$as_me:$LINENO: checking for ANSI C header files" >&5 ++echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 ++if test "${ac_cv_header_stdc+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <stdlib.h> ++#include <stdarg.h> ++#include <string.h> ++#include <float.h> ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_header_stdc=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_header_stdc=no ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ ++if test $ac_cv_header_stdc = yes; then ++ # SunOS 4.x string.h does not declare mem*, contrary to ANSI. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <string.h> ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "memchr" >/dev/null 2>&1; then + : + else +- echo "$ac_err" >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- CPP=/lib/cpp ++ ac_cv_header_stdc=no + fi + rm -f conftest* ++ + fi +-rm -f conftest* ++ ++if test $ac_cv_header_stdc = yes; then ++ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <stdlib.h> ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "free" >/dev/null 2>&1; then ++ : ++else ++ ac_cv_header_stdc=no + fi + rm -f conftest* +- ac_cv_prog_CPP="$CPP" ++ + fi +- CPP="$ac_cv_prog_CPP" ++ ++if test $ac_cv_header_stdc = yes; then ++ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. ++ if test "$cross_compiling" = yes; then ++ : ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <ctype.h> ++#if ((' ' & 0x0FF) == 0x020) ++# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') ++# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) ++#else ++# define ISLOWER(c) \ ++ (('a' <= (c) && (c) <= 'i') \ ++ || ('j' <= (c) && (c) <= 'r') \ ++ || ('s' <= (c) && (c) <= 'z')) ++# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) ++#endif ++ ++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) ++int ++main () ++{ ++ int i; ++ for (i = 0; i < 256; i++) ++ if (XOR (islower (i), ISLOWER (i)) ++ || toupper (i) != TOUPPER (i)) ++ exit(2); ++ exit (0); ++} ++_ACEOF ++rm -f conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ : + else +- ac_cv_prog_CPP="$CPP" ++ echo "$as_me: program exited with status $ac_status" >&5 ++echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++( exit $ac_status ) ++ac_cv_header_stdc=no ++fi ++rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++fi ++fi + fi +-echo "$ac_t""$CPP" 1>&6 ++echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 ++echo "${ECHO_T}$ac_cv_header_stdc" >&6 ++if test $ac_cv_header_stdc = yes; then ++ ++cat >>confdefs.h <<\_ACEOF ++#define STDC_HEADERS 1 ++_ACEOF + +-for ac_hdr in ctype.h dirent.h fcntl.h libgen.h locale.h nl_types.h process.h signal.h stdarg.h stdio.h stdlib.h string.h time.h unistd.h sys/param.h sys/select.h sys/signal.h sys/stat.h sys/time.h sys/types.h sys/wait.h +-do +-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +-echo "configure:1342: checking for $ac_hdr" >&5 +-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext <<EOF +-#line 1347 "configure" +-#include "confdefs.h" +-#include <$ac_hdr> +-EOF +-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:1352: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +-if test -z "$ac_err"; then +- rm -rf conftest* +- eval "ac_cv_header_$ac_safe=yes" +-else +- echo "$ac_err" >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_header_$ac_safe=no" + fi +-rm -f conftest* ++ ++# On IRIX 5.3, sys/types and inttypes.h are conflicting. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ ++ inttypes.h stdint.h unistd.h ++do ++as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` ++echo "$as_me:$LINENO: checking for $ac_header" >&5 ++echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 ++if eval "test \"\${$as_ac_Header+set}\" = set"; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_includes_default ++ ++#include <$ac_header> ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ eval "$as_ac_Header=yes" ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++eval "$as_ac_Header=no" ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 ++echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 ++if test `eval echo '${'$as_ac_Header'}'` = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++ ++done ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++for ac_header in ctype.h dirent.h fcntl.h libgen.h locale.h nl_types.h process.h signal.h stdarg.h stdio.h stdlib.h string.h time.h unistd.h sys/param.h sys/select.h sys/signal.h sys/stat.h sys/time.h sys/types.h sys/wait.h ++do ++as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` ++if eval "test \"\${$as_ac_Header+set}\" = set"; then ++ echo "$as_me:$LINENO: checking for $ac_header" >&5 ++echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 ++if eval "test \"\${$as_ac_Header+set}\" = set"; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++fi ++echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 ++echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 ++else ++ # Is the header compilable? ++echo "$as_me:$LINENO: checking $ac_header usability" >&5 ++echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++$ac_includes_default ++#include <$ac_header> ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_header_compiler=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_header_compiler=no ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 ++echo "${ECHO_T}$ac_header_compiler" >&6 ++ ++# Is the header present? ++echo "$as_me:$LINENO: checking $ac_header presence" >&5 ++echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <$ac_header> ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag ++ else ++ ac_cpp_err= ++ fi ++else ++ ac_cpp_err=yes + fi +-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` +- cat >> confdefs.h <<EOF +-#define $ac_tr_hdr 1 +-EOF +- +-else +- echo "$ac_t""no" 1>&6 ++if test -z "$ac_cpp_err"; then ++ ac_header_preproc=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_header_preproc=no ++fi ++rm -f conftest.err conftest.$ac_ext ++echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 ++echo "${ECHO_T}$ac_header_preproc" >&6 ++ ++# So? What about this header? ++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in ++ yes:no: ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 ++echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes ++ ;; ++ no:yes:* ) ++ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 ++echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ++ ( ++ cat <<\_ASBOX ++## ------------------------------------------ ## ++## Report this to the AC_PACKAGE_NAME lists. ## ++## ------------------------------------------ ## ++_ASBOX ++ ) | ++ sed "s/^/$as_me: WARNING: /" >&2 ++ ;; ++esac ++echo "$as_me:$LINENO: checking for $ac_header" >&5 ++echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 ++if eval "test \"\${$as_ac_Header+set}\" = set"; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ eval "$as_ac_Header=\$ac_header_preproc" ++fi ++echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 ++echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 ++ ++fi ++if test `eval echo '${'$as_ac_Header'}'` = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 ++_ACEOF ++ + fi ++ + done + +-echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 +-echo "configure:1379: checking whether time.h and sys/time.h may both be included" >&5 +-if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext <<EOF +-#line 1384 "configure" +-#include "confdefs.h" ++echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 ++echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 ++if test "${ac_cv_header_time+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <sys/types.h> + #include <sys/time.h> + #include <time.h> +-int main() { +-struct tm *tp; +-; return 0; } +-EOF +-if { (eval echo configure:1393: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +- rm -rf conftest* ++ ++int ++main () ++{ ++if ((struct tm *) 0) ++return 0; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + ac_cv_header_time=yes + else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- ac_cv_header_time=no ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_header_time=no + fi +-rm -f conftest* ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi +- +-echo "$ac_t""$ac_cv_header_time" 1>&6 ++echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 ++echo "${ECHO_T}$ac_cv_header_time" >&6 + if test $ac_cv_header_time = yes; then +- cat >> confdefs.h <<\EOF ++ ++cat >>confdefs.h <<\_ACEOF + #define TIME_WITH_SYS_TIME 1 +-EOF ++_ACEOF + + fi + + ++ + for ac_func in basename + do +-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +-echo "configure:1417: checking for $ac_func" >&5 +-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext <<EOF +-#line 1422 "configure" +-#include "confdefs.h" ++as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` ++echo "$as_me:$LINENO: checking for $ac_func" >&5 ++echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 ++if eval "test \"\${$as_ac_var+set}\" = set"; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. ++ For example, HP-UX 11i <limits.h> declares gettimeofday. */ ++#define $ac_func innocuous_$ac_func ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char $ac_func(); below. */ +-#include <assert.h> ++ which can conflict with char $ac_func (); below. ++ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since ++ <limits.h> exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include <limits.h> ++#else ++# include <assert.h> ++#endif ++ ++#undef $ac_func ++ + /* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++char (*f) () = $ac_func; ++#endif ++#ifdef __cplusplus ++} ++#endif ++ ++int ++main () ++{ ++return f != $ac_func; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ eval "$as_ac_var=yes" ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++eval "$as_ac_var=no" ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 ++echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 ++if test `eval echo '${'$as_ac_var'}'` = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 ++_ACEOF ++ ++else ++ echo "$as_me:$LINENO: checking for basename in -lgen" >&5 ++echo $ECHO_N "checking for basename in -lgen... $ECHO_C" >&6 ++if test "${ac_cv_lib_gen_basename+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lgen $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char basename (); ++int ++main () ++{ ++basename (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_gen_basename=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_gen_basename=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_gen_basename" >&5 ++echo "${ECHO_T}$ac_cv_lib_gen_basename" >&6 ++if test $ac_cv_lib_gen_basename = yes; then ++ cat >>confdefs.h <<\_ACEOF ++#define HAVE_BASENAME 1 ++_ACEOF ++ LIBS="$LIBS -lgen" ++fi ++ ++fi ++done ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++for ac_func in getpid setlocale sigaction strftime strcasestr snprintf vsnprintf catopen catgets catclose ++do ++as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` ++echo "$as_me:$LINENO: checking for $ac_func" >&5 ++echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 ++if eval "test \"\${$as_ac_var+set}\" = set"; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. ++ For example, HP-UX 11i <limits.h> declares gettimeofday. */ ++#define $ac_func innocuous_$ac_func ++ ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func (); below. ++ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since ++ <limits.h> exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include <limits.h> ++#else ++# include <assert.h> ++#endif ++ ++#undef $ac_func ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif + /* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char $ac_func(); ++ builtin and then its argument prototype would still apply. */ ++char $ac_func (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++char (*f) () = $ac_func; ++#endif ++#ifdef __cplusplus ++} ++#endif + +-int main() { ++int ++main () ++{ ++return f != $ac_func; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ eval "$as_ac_var=yes" ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++eval "$as_ac_var=no" ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 ++echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 ++if test `eval echo '${'$as_ac_var'}'` = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++done ++ ++echo "$as_me:$LINENO: checking for t_open in -lnsl" >&5 ++echo $ECHO_N "checking for t_open in -lnsl... $ECHO_C" >&6 ++if test "${ac_cv_lib_nsl_t_open+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lnsl $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char t_open (); ++int ++main () ++{ ++t_open (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_nsl_t_open=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_nsl_t_open=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_t_open" >&5 ++echo "${ECHO_T}$ac_cv_lib_nsl_t_open" >&6 ++if test $ac_cv_lib_nsl_t_open = yes; then ++ LIBS="$LIBS -lnsl" ++fi ++ ++echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 ++echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6 ++if test "${ac_cv_lib_socket_socket+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lsocket $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char socket (); ++int ++main () ++{ ++socket (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_socket_socket=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_socket_socket=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 ++echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6 ++if test $ac_cv_lib_socket_socket = yes; then ++ LIBS="$LIBS -lsocket" ++fi ++ ++ ++echo "$as_me:$LINENO: checking for X" >&5 ++echo $ECHO_N "checking for X... $ECHO_C" >&6 ++ ++ac_path_x_has_been_run=yes ++ ++# Check whether --with-x or --without-x was given. ++if test "${with_x+set}" = set; then ++ withval="$with_x" ++ ++fi; ++# $have_x is `yes', `no', `disabled', or empty when we do not yet know. ++if test "x$with_x" = xno; then ++ # The user explicitly disabled X. ++ have_x=disabled ++else ++ if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then ++ # Both variables are already set. ++ have_x=yes ++ else ++ if test "${ac_cv_have_x+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ # One or both of the vars are not set, and there is no cached value. ++ac_x_includes=no ac_x_libraries=no ++rm -fr conftest.dir ++if mkdir conftest.dir; then ++ cd conftest.dir ++ # Make sure to not put "make" in the Imakefile rules, since we grep it out. ++ cat >Imakefile <<'_ACEOF' ++acfindx: ++ @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' ++_ACEOF ++ if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then ++ # GNU make sometimes prints "make[1]: Entering...", which would confuse us. ++ eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` ++ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. ++ for ac_extension in a so sl; do ++ if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && ++ test -f $ac_im_libdir/libX11.$ac_extension; then ++ ac_im_usrlibdir=$ac_im_libdir; break ++ fi ++ done ++ # Screen out bogus values from the imake configuration. They are ++ # bogus both because they are the default anyway, and because ++ # using them would break gcc on systems where it needs fixed includes. ++ case $ac_im_incroot in ++ /usr/include) ;; ++ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; ++ esac ++ case $ac_im_usrlibdir in ++ /usr/lib | /lib) ;; ++ *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; ++ esac ++ fi ++ cd .. ++ rm -fr conftest.dir ++fi + +-/* The GNU C library defines this for functions which it implements +- to always fail with ENOSYS. Some functions are actually named +- something starting with __ and the normal name is an alias. */ +-#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +-choke me +-#else +-$ac_func(); +-#endif ++# Standard set of common directories for X headers. ++# Check X11 before X11Rn because it is often a symlink to the current release. ++ac_x_header_dirs=' ++/usr/X11/include ++/usr/X11R6/include ++/usr/X11R5/include ++/usr/X11R4/include ++ ++/usr/include/X11 ++/usr/include/X11R6 ++/usr/include/X11R5 ++/usr/include/X11R4 ++ ++/usr/local/X11/include ++/usr/local/X11R6/include ++/usr/local/X11R5/include ++/usr/local/X11R4/include ++ ++/usr/local/include/X11 ++/usr/local/include/X11R6 ++/usr/local/include/X11R5 ++/usr/local/include/X11R4 ++ ++/usr/X386/include ++/usr/x386/include ++/usr/XFree86/include/X11 ++ ++/usr/include ++/usr/local/include ++/usr/unsupported/include ++/usr/athena/include ++/usr/local/x11r5/include ++/usr/lpp/Xamples/include + +-; return 0; } +-EOF +-if { (eval echo configure:1445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_func_$ac_func=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_func_$ac_func=no" +-fi +-rm -f conftest* +-fi ++/usr/openwin/include ++/usr/openwin/share/include' + +-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` +- cat >> confdefs.h <<EOF +-#define $ac_tr_func 1 +-EOF +- +-else +- echo "$ac_t""no" 1>&6 +-echo $ac_n "checking for basename in -lgen""... $ac_c" 1>&6 +-echo "configure:1467: checking for basename in -lgen" >&5 +-ac_lib_var=`echo gen'_'basename | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++if test "$ac_x_includes" = no; then ++ # Guess where to find include files, by looking for a specified header file. ++ # First, try using that file with no special directory specified. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <X11/Intrinsic.h> ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag ++ else ++ ac_cpp_err= ++ fi + else +- ac_save_LIBS="$LIBS" +-LIBS="-lgen $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 1475 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char basename(); +- +-int main() { +-basename() +-; return 0; } +-EOF +-if { (eval echo configure:1486: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" ++ ac_cpp_err=yes + fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" +- +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- cat >> confdefs.h <<\EOF +-#define HAVE_BASENAME 1 +-EOF +- LIBS="$LIBS -lgen" ++if test -z "$ac_cpp_err"; then ++ # We can compile using X headers with no special include directory. ++ac_x_includes= + else +- echo "$ac_t""no" 1>&6 +-fi ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-fi ++ for ac_dir in $ac_x_header_dirs; do ++ if test -r "$ac_dir/X11/Intrinsic.h"; then ++ ac_x_includes=$ac_dir ++ break ++ fi + done +- +-for ac_func in getpid setlocale sigaction strftime strcasestr snprintf vsnprintf catopen catgets catclose +-do +-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +-echo "configure:1515: checking for $ac_func" >&5 +-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext <<EOF +-#line 1520 "configure" +-#include "confdefs.h" +-/* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char $ac_func(); below. */ +-#include <assert.h> +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char $ac_func(); +- +-int main() { +- +-/* The GNU C library defines this for functions which it implements +- to always fail with ENOSYS. Some functions are actually named +- something starting with __ and the normal name is an alias. */ +-#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +-choke me +-#else +-$ac_func(); +-#endif +- +-; return 0; } +-EOF +-if { (eval echo configure:1543: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_func_$ac_func=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_func_$ac_func=no" +-fi +-rm -f conftest* + fi ++rm -f conftest.err conftest.$ac_ext ++fi # $ac_x_includes = no + +-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` +- cat >> confdefs.h <<EOF +-#define $ac_tr_func 1 +-EOF +- ++if test "$ac_x_libraries" = no; then ++ # Check for the libraries. ++ # See if we find them without any special options. ++ # Don't add to $LIBS permanently. ++ ac_save_LIBS=$LIBS ++ LIBS="-lXt $LIBS" ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <X11/Intrinsic.h> ++int ++main () ++{ ++XtMalloc (0) ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ LIBS=$ac_save_LIBS ++# We can link X programs with no special library path. ++ac_x_libraries= + else +- echo "$ac_t""no" 1>&6 +-fi +-done ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-echo $ac_n "checking for t_open in -lnsl""... $ac_c" 1>&6 +-echo "configure:1568: checking for t_open in -lnsl" >&5 +-ac_lib_var=`echo nsl'_'t_open | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- ac_save_LIBS="$LIBS" +-LIBS="-lnsl $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 1576 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char t_open(); +- +-int main() { +-t_open() +-; return 0; } +-EOF +-if { (eval echo configure:1587: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" ++LIBS=$ac_save_LIBS ++for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` ++do ++ # Don't even attempt the hair of trying to link an X program! ++ for ac_extension in a so sl; do ++ if test -r $ac_dir/libXt.$ac_extension; then ++ ac_x_libraries=$ac_dir ++ break 2 ++ fi ++ done ++done + fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi # $ac_x_libraries = no + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- LIBS="$LIBS -lnsl" ++if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then ++ # Didn't find X anywhere. Cache the known absence of X. ++ ac_cv_have_x="have_x=no" + else +- echo "$ac_t""no" 1>&6 ++ # Record where we found X for the cache. ++ ac_cv_have_x="have_x=yes \ ++ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" + fi +- +-echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6 +-echo "configure:1608: checking for socket in -lsocket" >&5 +-ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- ac_save_LIBS="$LIBS" +-LIBS="-lsocket $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 1616 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char socket(); +- +-int main() { +-socket() +-; return 0; } +-EOF +-if { (eval echo configure:1627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" + fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- LIBS="$LIBS -lsocket" ++ fi ++ eval "$ac_cv_have_x" ++fi # $with_x != no ++ ++if test "$have_x" != yes; then ++ echo "$as_me:$LINENO: result: $have_x" >&5 ++echo "${ECHO_T}$have_x" >&6 ++ no_x=yes + else +- echo "$ac_t""no" 1>&6 ++ # If each of the values was on the command line, it overrides each guess. ++ test "x$x_includes" = xNONE && x_includes=$ac_x_includes ++ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries ++ # Update the cache value to reflect the command line values. ++ ac_cv_have_x="have_x=yes \ ++ ac_x_includes=$x_includes ac_x_libraries=$x_libraries" ++ # It might be that x_includes is empty (headers are found in the ++ # standard search path. Then output the corresponding message ++ ac_out_x_includes=$x_includes ++ test "x$x_includes" = x && ac_out_x_includes="in standard search path" ++ echo "$as_me:$LINENO: result: libraries $x_libraries, headers $ac_out_x_includes" >&5 ++echo "${ECHO_T}libraries $x_libraries, headers $ac_out_x_includes" >&6 + fi + + +-# If we find X, set shell vars x_includes and x_libraries to the +-# paths, otherwise set no_x=yes. +-# Uses ac_ vars as temps to allow command line to override cache and checks. +-# --without-x overrides everything else, but does not touch the cache. +-echo $ac_n "checking for X""... $ac_c" 1>&6 +-echo "configure:1653: checking for X" >&5 ++if test "x$ac_path_x_has_been_run" != xyes; then ++ echo "$as_me:$LINENO: checking for X" >&5 ++echo $ECHO_N "checking for X... $ECHO_C" >&6 ++ ++ac_path_x_has_been_run=yes + + # Check whether --with-x or --without-x was given. + if test "${with_x+set}" = set; then + withval="$with_x" +- : +-fi + ++fi; + # $have_x is `yes', `no', `disabled', or empty when we do not yet know. + if test "x$with_x" = xno; then + # The user explicitly disabled X. +@@ -1666,207 +4404,209 @@ + # Both variables are already set. + have_x=yes + else +-if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ if test "${ac_cv_have_x+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else + # One or both of the vars are not set, and there is no cached value. +-ac_x_includes=NO ac_x_libraries=NO +-rm -fr conftestdir +-if mkdir conftestdir; then +- cd conftestdir ++ac_x_includes=no ac_x_libraries=no ++rm -fr conftest.dir ++if mkdir conftest.dir; then ++ cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. +- cat > Imakefile <<'EOF' ++ cat >Imakefile <<'_ACEOF' + acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +-EOF ++_ACEOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && +- test -f $ac_im_libdir/libX11.$ac_extension; then +- ac_im_usrlibdir=$ac_im_libdir; break ++ test -f $ac_im_libdir/libX11.$ac_extension; then ++ ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. +- case "$ac_im_incroot" in ++ case $ac_im_incroot in + /usr/include) ;; +- *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; ++ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac +- case "$ac_im_usrlibdir" in ++ case $ac_im_usrlibdir in + /usr/lib | /lib) ;; +- *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; ++ *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. +- rm -fr conftestdir ++ rm -fr conftest.dir + fi + +-if test "$ac_x_includes" = NO; then +- # Guess where to find include files, by looking for this one X11 .h file. +- test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h ++# Standard set of common directories for X headers. ++# Check X11 before X11Rn because it is often a symlink to the current release. ++ac_x_header_dirs=' ++/usr/X11/include ++/usr/X11R6/include ++/usr/X11R5/include ++/usr/X11R4/include ++ ++/usr/include/X11 ++/usr/include/X11R6 ++/usr/include/X11R5 ++/usr/include/X11R4 ++ ++/usr/local/X11/include ++/usr/local/X11R6/include ++/usr/local/X11R5/include ++/usr/local/X11R4/include ++ ++/usr/local/include/X11 ++/usr/local/include/X11R6 ++/usr/local/include/X11R5 ++/usr/local/include/X11R4 ++ ++/usr/X386/include ++/usr/x386/include ++/usr/XFree86/include/X11 ++ ++/usr/include ++/usr/local/include ++/usr/unsupported/include ++/usr/athena/include ++/usr/local/x11r5/include ++/usr/lpp/Xamples/include ++ ++/usr/openwin/include ++/usr/openwin/share/include' + ++if test "$ac_x_includes" = no; then ++ # Guess where to find include files, by looking for a specified header file. + # First, try using that file with no special directory specified. +-cat > conftest.$ac_ext <<EOF +-#line 1715 "configure" +-#include "confdefs.h" +-#include <$x_direct_test_include> +-EOF +-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:1720: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +-if test -z "$ac_err"; then +- rm -rf conftest* ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <X11/Intrinsic.h> ++_ACEOF ++if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 ++ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } >/dev/null; then ++ if test -s conftest.err; then ++ ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag ++ else ++ ac_cpp_err= ++ fi ++else ++ ac_cpp_err=yes ++fi ++if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. + ac_x_includes= + else +- echo "$ac_err" >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- # Look for the header file in a standard set of common directories. +-# Check X11 before X11Rn because it is often a symlink to the current release. +- for ac_dir in \ +- /usr/X11/include \ +- /usr/X11R6/include \ +- /usr/X11R5/include \ +- /usr/X11R4/include \ +- \ +- /usr/include/X11 \ +- /usr/include/X11R6 \ +- /usr/include/X11R5 \ +- /usr/include/X11R4 \ +- \ +- /usr/local/X11/include \ +- /usr/local/X11R6/include \ +- /usr/local/X11R5/include \ +- /usr/local/X11R4/include \ +- \ +- /usr/local/include/X11 \ +- /usr/local/include/X11R6 \ +- /usr/local/include/X11R5 \ +- /usr/local/include/X11R4 \ +- \ +- /usr/X386/include \ +- /usr/x386/include \ +- /usr/XFree86/include/X11 \ +- \ +- /usr/include \ +- /usr/local/include \ +- /usr/unsupported/include \ +- /usr/athena/include \ +- /usr/local/x11r5/include \ +- /usr/lpp/Xamples/include \ +- \ +- /usr/openwin/include \ +- /usr/openwin/share/include \ +- ; \ +- do +- if test -r "$ac_dir/$x_direct_test_include"; then +- ac_x_includes=$ac_dir +- break +- fi +- done ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ for ac_dir in $ac_x_header_dirs; do ++ if test -r "$ac_dir/X11/Intrinsic.h"; then ++ ac_x_includes=$ac_dir ++ break ++ fi ++done + fi +-rm -f conftest* +-fi # $ac_x_includes = NO ++rm -f conftest.err conftest.$ac_ext ++fi # $ac_x_includes = no + +-if test "$ac_x_libraries" = NO; then ++if test "$ac_x_libraries" = no; then + # Check for the libraries. +- +- test -z "$x_direct_test_library" && x_direct_test_library=Xt +- test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc +- + # See if we find them without any special options. + # Don't add to $LIBS permanently. +- ac_save_LIBS="$LIBS" +- LIBS="-l$x_direct_test_library $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 1789 "configure" +-#include "confdefs.h" +- +-int main() { +-${x_direct_test_function}() +-; return 0; } +-EOF +-if { (eval echo configure:1796: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- LIBS="$ac_save_LIBS" ++ ac_save_LIBS=$LIBS ++ LIBS="-lXt $LIBS" ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <X11/Intrinsic.h> ++int ++main () ++{ ++XtMalloc (0) ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ LIBS=$ac_save_LIBS + # We can link X programs with no special library path. + ac_x_libraries= + else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- LIBS="$ac_save_LIBS" +-# First see if replacing the include by lib works. +-# Check X11 before X11Rn because it is often a symlink to the current release. +-for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ +- /usr/X11/lib \ +- /usr/X11R6/lib \ +- /usr/X11R5/lib \ +- /usr/X11R4/lib \ +- \ +- /usr/lib/X11 \ +- /usr/lib/X11R6 \ +- /usr/lib/X11R5 \ +- /usr/lib/X11R4 \ +- \ +- /usr/local/X11/lib \ +- /usr/local/X11R6/lib \ +- /usr/local/X11R5/lib \ +- /usr/local/X11R4/lib \ +- \ +- /usr/local/lib/X11 \ +- /usr/local/lib/X11R6 \ +- /usr/local/lib/X11R5 \ +- /usr/local/lib/X11R4 \ +- \ +- /usr/X386/lib \ +- /usr/x386/lib \ +- /usr/XFree86/lib/X11 \ +- \ +- /usr/lib \ +- /usr/local/lib \ +- /usr/unsupported/lib \ +- /usr/athena/lib \ +- /usr/local/x11r5/lib \ +- /usr/lpp/Xamples/lib \ +- /lib/usr/lib/X11 \ +- \ +- /usr/openwin/lib \ +- /usr/openwin/share/lib \ +- ; \ ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++LIBS=$ac_save_LIBS ++for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` + do ++ # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do +- if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then ++ if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done + done + fi +-rm -f conftest* +-fi # $ac_x_libraries = NO ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi # $ac_x_libraries = no + +-if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then ++if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" + else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ +- ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" ++ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" + fi + fi ++ + fi + eval "$ac_cv_have_x" + fi # $with_x != no + + if test "$have_x" != yes; then +- echo "$ac_t""$have_x" 1>&6 ++ echo "$as_me:$LINENO: result: $have_x" >&5 ++echo "${ECHO_T}$have_x" >&6 + no_x=yes + else + # If each of the values was on the command line, it overrides each guess. +@@ -1875,14 +4615,21 @@ + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" +- echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 ++ # It might be that x_includes is empty (headers are found in the ++ # standard search path. Then output the corresponding message ++ ac_out_x_includes=$x_includes ++ test "x$x_includes" = x && ac_out_x_includes="in standard search path" ++ echo "$as_me:$LINENO: result: libraries $x_libraries, headers $ac_out_x_includes" >&5 ++echo "${ECHO_T}libraries $x_libraries, headers $ac_out_x_includes" >&6 + fi + ++fi + if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. +- cat >> confdefs.h <<\EOF ++ ++cat >>confdefs.h <<\_ACEOF + #define X_DISPLAY_MISSING 1 +-EOF ++_ACEOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= + else +@@ -1895,60 +4642,117 @@ + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . +- case "`(uname -sr) 2>/dev/null`" in ++ case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) +- echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 +-echo "configure:1902: checking whether -R must be followed by a space" >&5 +- ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" +- cat > conftest.$ac_ext <<EOF +-#line 1905 "configure" +-#include "confdefs.h" +- +-int main() { +- +-; return 0; } +-EOF +-if { (eval echo configure:1912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* ++ echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 ++echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 ++ ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + ac_R_nospace=yes + else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- ac_R_nospace=no ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_R_nospace=no + fi +-rm -f conftest* ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + if test $ac_R_nospace = yes; then +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" +- cat > conftest.$ac_ext <<EOF +-#line 1928 "configure" +-#include "confdefs.h" +- +-int main() { +- +-; return 0; } +-EOF +-if { (eval echo configure:1935: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + ac_R_space=yes + else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- ac_R_space=no ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_R_space=no + fi +-rm -f conftest* ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + if test $ac_R_space = yes; then +- echo "$ac_t""yes" 1>&6 ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else +- echo "$ac_t""neither works" 1>&6 ++ echo "$as_me:$LINENO: result: neither works" >&5 ++echo "${ECHO_T}neither works" >&6 + fi + fi +- LIBS="$ac_xsave_LIBS" ++ LIBS=$ac_xsave_LIBS + esac + fi + +@@ -1959,527 +4763,1010 @@ + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else +- # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X +- # libraries were built with DECnet support. And karl@cs.umb.edu says ++ # Martyn Johnson says this is needed for Ultrix, if the X ++ # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). +- echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 +-echo "configure:1967: checking for dnet_ntoa in -ldnet" >&5 +-ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char XOpenDisplay (); ++int ++main () ++{ ++XOpenDisplay (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ : ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 ++echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 ++if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" ++ ac_check_lib_save_LIBS=$LIBS + LIBS="-ldnet $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 1975 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dnet_ntoa(); +- +-int main() { +-dnet_ntoa() +-; return 0; } +-EOF +-if { (eval echo configure:1986: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dnet_ntoa (); ++int ++main () ++{ ++dnet_ntoa (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dnet_dnet_ntoa=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dnet_dnet_ntoa=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 ++echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 ++if test $ac_cv_lib_dnet_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +-else +- echo "$ac_t""no" 1>&6 + fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then +- echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 +-echo "configure:2008: checking for dnet_ntoa in -ldnet_stub" >&5 +-ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 ++echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 ++if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" ++ ac_check_lib_save_LIBS=$LIBS + LIBS="-ldnet_stub $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 2016 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dnet_ntoa(); +- +-int main() { +-dnet_ntoa() +-; return 0; } +-EOF +-if { (eval echo configure:2027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char dnet_ntoa (); ++int ++main () ++{ ++dnet_ntoa (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_dnet_stub_dnet_ntoa=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_dnet_stub_dnet_ntoa=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 ++echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 ++if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +-else +- echo "$ac_t""no" 1>&6 + fi + + fi ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++ LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. +- # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4) ++ # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display +- # on Irix 5.2, according to dickey@clark.net. +- echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 +-echo "configure:2056: checking for gethostbyname" >&5 +-if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext <<EOF +-#line 2061 "configure" +-#include "confdefs.h" ++ # on Irix 5.2, according to T.E. Dickey. ++ # The functions gethostbyname, getservbyname, and inet_addr are ++ # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ++ echo "$as_me:$LINENO: checking for gethostbyname" >&5 ++echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 ++if test "${ac_cv_func_gethostbyname+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define gethostbyname to an innocuous variant, in case <limits.h> declares gethostbyname. ++ For example, HP-UX 11i <limits.h> declares gettimeofday. */ ++#define gethostbyname innocuous_gethostbyname ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char gethostbyname(); below. */ +-#include <assert.h> +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char gethostbyname(); ++ which can conflict with char gethostbyname (); below. ++ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since ++ <limits.h> exists even on freestanding compilers. */ + +-int main() { ++#ifdef __STDC__ ++# include <limits.h> ++#else ++# include <assert.h> ++#endif + ++#undef gethostbyname ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char gethostbyname (); + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) + choke me + #else +-gethostbyname(); ++char (*f) () = gethostbyname; ++#endif ++#ifdef __cplusplus ++} + #endif + +-; return 0; } +-EOF +-if { (eval echo configure:2084: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_func_gethostbyname=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_func_gethostbyname=no" +-fi +-rm -f conftest* +-fi ++int ++main () ++{ ++return f != gethostbyname; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_func_gethostbyname=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- : +-else +- echo "$ac_t""no" 1>&6 ++ac_cv_func_gethostbyname=no + fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 ++echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then +- echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 +-echo "configure:2105: checking for gethostbyname in -lnsl" >&5 +-ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 ++echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 ++if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" ++ ac_check_lib_save_LIBS=$LIBS + LIBS="-lnsl $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 2113 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char gethostbyname(); +- +-int main() { +-gethostbyname() +-; return 0; } +-EOF +-if { (eval echo configure:2124: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char gethostbyname (); ++int ++main () ++{ ++gethostbyname (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_nsl_gethostbyname=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_nsl_gethostbyname=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 ++echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 ++if test $ac_cv_lib_nsl_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +-else +- echo "$ac_t""no" 1>&6 + fi + ++ if test $ac_cv_lib_nsl_gethostbyname = no; then ++ echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 ++echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 ++if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lbsd $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char gethostbyname (); ++int ++main () ++{ ++gethostbyname (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_bsd_gethostbyname=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_bsd_gethostbyname=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 ++echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 ++if test $ac_cv_lib_bsd_gethostbyname = yes; then ++ X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" ++fi ++ ++ fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary +- # on later versions), says simon@lia.di.epfl.ch: it contains +- # gethostby* variants that don't use the nameserver (or something). +- # -lsocket must be given before -lnsl if both are needed. +- # We assume that if connect needs -lnsl, so does gethostbyname. +- echo $ac_n "checking for connect""... $ac_c" 1>&6 +-echo "configure:2154: checking for connect" >&5 +-if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext <<EOF +-#line 2159 "configure" +-#include "confdefs.h" ++ # on later versions), says Simon Leinen: it contains gethostby* ++ # variants that don't use the name server (or something). -lsocket ++ # must be given before -lnsl if both are needed. We assume that ++ # if connect needs -lnsl, so does gethostbyname. ++ echo "$as_me:$LINENO: checking for connect" >&5 ++echo $ECHO_N "checking for connect... $ECHO_C" >&6 ++if test "${ac_cv_func_connect+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define connect to an innocuous variant, in case <limits.h> declares connect. ++ For example, HP-UX 11i <limits.h> declares gettimeofday. */ ++#define connect innocuous_connect ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char connect(); below. */ +-#include <assert.h> +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char connect(); ++ which can conflict with char connect (); below. ++ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since ++ <limits.h> exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include <limits.h> ++#else ++# include <assert.h> ++#endif + +-int main() { ++#undef connect + ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char connect (); + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_connect) || defined (__stub___connect) + choke me + #else +-connect(); ++char (*f) () = connect; ++#endif ++#ifdef __cplusplus ++} + #endif + +-; return 0; } +-EOF +-if { (eval echo configure:2182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_func_connect=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_func_connect=no" +-fi +-rm -f conftest* +-fi ++int ++main () ++{ ++return f != connect; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_func_connect=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- : +-else +- echo "$ac_t""no" 1>&6 ++ac_cv_func_connect=no + fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 ++echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then +- echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 +-echo "configure:2203: checking for connect in -lsocket" >&5 +-ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 ++echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 ++if test "${ac_cv_lib_socket_connect+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" ++ ac_check_lib_save_LIBS=$LIBS + LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 2211 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char connect(); +- +-int main() { +-connect() +-; return 0; } +-EOF +-if { (eval echo configure:2222: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char connect (); ++int ++main () ++{ ++connect (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_socket_connect=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_socket_connect=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 ++echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 ++if test $ac_cv_lib_socket_connect = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +-else +- echo "$ac_t""no" 1>&6 + fi + + fi + +- # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. +- echo $ac_n "checking for remove""... $ac_c" 1>&6 +-echo "configure:2246: checking for remove" >&5 +-if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext <<EOF +-#line 2251 "configure" +-#include "confdefs.h" ++ # Guillermo Gomez says -lposix is necessary on A/UX. ++ echo "$as_me:$LINENO: checking for remove" >&5 ++echo $ECHO_N "checking for remove... $ECHO_C" >&6 ++if test "${ac_cv_func_remove+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define remove to an innocuous variant, in case <limits.h> declares remove. ++ For example, HP-UX 11i <limits.h> declares gettimeofday. */ ++#define remove innocuous_remove ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char remove(); below. */ +-#include <assert.h> +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char remove(); ++ which can conflict with char remove (); below. ++ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since ++ <limits.h> exists even on freestanding compilers. */ + +-int main() { ++#ifdef __STDC__ ++# include <limits.h> ++#else ++# include <assert.h> ++#endif + ++#undef remove ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char remove (); + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_remove) || defined (__stub___remove) + choke me + #else +-remove(); ++char (*f) () = remove; ++#endif ++#ifdef __cplusplus ++} + #endif + +-; return 0; } +-EOF +-if { (eval echo configure:2274: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_func_remove=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_func_remove=no" +-fi +-rm -f conftest* +-fi ++int ++main () ++{ ++return f != remove; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_func_remove=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- : +-else +- echo "$ac_t""no" 1>&6 ++ac_cv_func_remove=no + fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 ++echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then +- echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 +-echo "configure:2295: checking for remove in -lposix" >&5 +-ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ echo "$as_me:$LINENO: checking for remove in -lposix" >&5 ++echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 ++if test "${ac_cv_lib_posix_remove+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" ++ ac_check_lib_save_LIBS=$LIBS + LIBS="-lposix $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 2303 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char remove(); +- +-int main() { +-remove() +-; return 0; } +-EOF +-if { (eval echo configure:2314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char remove (); ++int ++main () ++{ ++remove (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_posix_remove=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_posix_remove=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 ++echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 ++if test $ac_cv_lib_posix_remove = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +-else +- echo "$ac_t""no" 1>&6 + fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. +- echo $ac_n "checking for shmat""... $ac_c" 1>&6 +-echo "configure:2338: checking for shmat" >&5 +-if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext <<EOF +-#line 2343 "configure" +-#include "confdefs.h" ++ echo "$as_me:$LINENO: checking for shmat" >&5 ++echo $ECHO_N "checking for shmat... $ECHO_C" >&6 ++if test "${ac_cv_func_shmat+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++/* Define shmat to an innocuous variant, in case <limits.h> declares shmat. ++ For example, HP-UX 11i <limits.h> declares gettimeofday. */ ++#define shmat innocuous_shmat ++ + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char shmat(); below. */ +-#include <assert.h> +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char shmat(); ++ which can conflict with char shmat (); below. ++ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since ++ <limits.h> exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include <limits.h> ++#else ++# include <assert.h> ++#endif + +-int main() { ++#undef shmat + ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char shmat (); + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_shmat) || defined (__stub___shmat) + choke me + #else +-shmat(); ++char (*f) () = shmat; ++#endif ++#ifdef __cplusplus ++} + #endif + +-; return 0; } +-EOF +-if { (eval echo configure:2366: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_func_shmat=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_func_shmat=no" +-fi +-rm -f conftest* +-fi ++int ++main () ++{ ++return f != shmat; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_func_shmat=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 + +-if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- : +-else +- echo "$ac_t""no" 1>&6 ++ac_cv_func_shmat=no + fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 ++echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then +- echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 +-echo "configure:2387: checking for shmat in -lipc" >&5 +-ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 ++echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 ++if test "${ac_cv_lib_ipc_shmat+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" ++ ac_check_lib_save_LIBS=$LIBS + LIBS="-lipc $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 2395 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char shmat(); +- +-int main() { +-shmat() +-; return 0; } +-EOF +-if { (eval echo configure:2406: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char shmat (); ++int ++main () ++{ ++shmat (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_ipc_shmat=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_ipc_shmat=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 ++echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 ++if test $ac_cv_lib_ipc_shmat = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +-else +- echo "$ac_t""no" 1>&6 + fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. +- ac_save_LDFLAGS="$LDFLAGS" ++ ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. +- # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. +- echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 +-echo "configure:2439: checking for IceConnectionNumber in -lICE" >&5 +-ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ # John Interrante, Karl Berry ++ echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 ++echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 ++if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" +-LIBS="-lICE $X_EXTRA_LIBS $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 2447 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char IceConnectionNumber(); +- +-int main() { +-IceConnectionNumber() +-; return 0; } +-EOF +-if { (eval echo configure:2458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lICE $X_EXTRA_LIBS $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char IceConnectionNumber (); ++int ++main () ++{ ++IceConnectionNumber (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_ICE_IceConnectionNumber=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_ICE_IceConnectionNumber=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 ++echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 ++if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +-else +- echo "$ac_t""no" 1>&6 + fi + +- LDFLAGS="$ac_save_LDFLAGS" ++ LDFLAGS=$ac_save_LDFLAGS + + fi + + +-test x$no_x = "xyes" && { echo "configure: error: Blackbox requires the X Window System libraries and headers." 1>&2; exit 1; } ++test x$no_x = "xyes" && { { echo "$as_me:$LINENO: error: Blackbox requires the X Window System libraries and headers." >&5 ++echo "$as_me: error: Blackbox requires the X Window System libraries and headers." >&2;} ++ { (exit 1); exit 1; }; } + + test x$x_includes = "x" && x_includes="/usr/include" + test x$x_libraries = "x" && x_libraries="/usr/lib" +@@ -2489,71 +5776,107 @@ + LIBS="$LIBS $X_LIBS" + LDFLAGS="$LDFLAGS $LIBS $X_PRE_LIBS" + +-echo $ac_n "checking for GCC""... $ac_c" 1>&6 +-echo "configure:2494: checking for GCC" >&5 ++echo "$as_me:$LINENO: checking for GCC" >&5 ++echo $ECHO_N "checking for GCC... $ECHO_C" >&6 + if test x$GCC = "xyes"; then +- echo "$ac_t""yes" 1>&6 ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + CXXFLAGS="${CXXFLAGS} -Wall -W -pedantic" + else +- echo "$ac_t""no, trying other compilers" 1>&6 +- echo $ac_n "checking for MIPSpro""... $ac_c" 1>&6 +-echo "configure:2501: checking for MIPSpro" >&5 ++ echo "$as_me:$LINENO: result: no, trying other compilers" >&5 ++echo "${ECHO_T}no, trying other compilers" >&6 ++ echo "$as_me:$LINENO: checking for MIPSpro" >&5 ++echo $ECHO_N "checking for MIPSpro... $ECHO_C" >&6 + mips_pro_ver=`$CC -version 2>&1 | grep -i mipspro | cut -f4 -d ' '` + if test "x$mips_pro_ver" = "x"; then +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + else +- echo "$ac_t""yes, version $mips_pro_ver." 1>&6 +- echo $ac_n "checking for -LANG:std in CXXFLAGS""... $ac_c" 1>&6 +-echo "configure:2508: checking for -LANG:std in CXXFLAGS" >&5 ++ echo "$as_me:$LINENO: result: yes, version $mips_pro_ver." >&5 ++echo "${ECHO_T}yes, version $mips_pro_ver." >&6 ++ echo "$as_me:$LINENO: checking for -LANG:std in CXXFLAGS" >&5 ++echo $ECHO_N "checking for -LANG:std in CXXFLAGS... $ECHO_C" >&6 + lang_std_not_set=`echo $CXXFLAGS | grep "\-LANG:std"` + if test "x$lang_std_not_set" = "x"; then +- echo "$ac_t""not set, setting." 1>&6 ++ echo "$as_me:$LINENO: result: not set, setting." >&5 ++echo "${ECHO_T}not set, setting." >&6 + CXXFLAGS="${CXXFLAGS} -LANG:std" + else +- echo "$ac_t""already set." 1>&6 ++ echo "$as_me:$LINENO: result: already set." >&5 ++echo "${ECHO_T}already set." >&6 + fi +- fi ++ fi + fi + +-echo $ac_n "checking for XOpenDisplay in -lX11""... $ac_c" 1>&6 +-echo "configure:2520: checking for XOpenDisplay in -lX11" >&5 +-ac_lib_var=`echo X11'_'XOpenDisplay | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++echo "$as_me:$LINENO: checking for XOpenDisplay in -lX11" >&5 ++echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6 ++if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" ++ ac_check_lib_save_LIBS=$LIBS + LIBS="-lX11 $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 2528 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char XOpenDisplay(); +- +-int main() { +-XOpenDisplay() +-; return 0; } +-EOF +-if { (eval echo configure:2539: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char XOpenDisplay (); ++int ++main () ++{ ++XOpenDisplay (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_X11_XOpenDisplay=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_X11_XOpenDisplay=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_X11_XOpenDisplay" >&5 ++echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6 ++if test $ac_cv_lib_X11_XOpenDisplay = yes; then + LIBS="$LIBS -lX11" + else +- echo "$ac_t""no" 1>&6 +-{ echo "configure: error: Could not find XOpenDisplay in -lX11." 1>&2; exit 1; } ++ { { echo "$as_me:$LINENO: error: Could not find XOpenDisplay in -lX11." >&5 ++echo "$as_me: error: Could not find XOpenDisplay in -lX11." >&2;} ++ { (exit 1); exit 1; }; } + + fi + +@@ -2563,227 +5886,469 @@ + Xext_lib="" + + SHAPE="" +-echo $ac_n "checking whether to build support for the XShape extension""... $ac_c" 1>&6 +-echo "configure:2568: checking whether to build support for the XShape extension" >&5 ++echo "$as_me:$LINENO: checking whether to build support for the XShape extension" >&5 ++echo $ECHO_N "checking whether to build support for the XShape extension... $ECHO_C" >&6 + # Check whether --enable-shape or --disable-shape was given. + if test "${enable_shape+set}" = set; then + enableval="$enable_shape" +- : +-fi + ++fi; + + : ${enableval="yes"} + if test x$enableval = "xyes"; then +- echo "$ac_t""yes" 1>&6 +- echo $ac_n "checking for XShapeCombineShape in -lXext""... $ac_c" 1>&6 +-echo "configure:2580: checking for XShapeCombineShape in -lXext" >&5 +-ac_lib_var=`echo Xext'_'XShapeCombineShape | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++ echo "$as_me:$LINENO: checking for XShapeCombineShape in -lXext" >&5 ++echo $ECHO_N "checking for XShapeCombineShape in -lXext... $ECHO_C" >&6 ++if test "${ac_cv_lib_Xext_XShapeCombineShape+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" ++ ac_check_lib_save_LIBS=$LIBS + LIBS="-lXext $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 2588 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char XShapeCombineShape(); +- +-int main() { +-XShapeCombineShape() +-; return 0; } +-EOF +-if { (eval echo configure:2599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 +- echo $ac_n "checking for X11/extensions/shape.h""... $ac_c" 1>&6 +-echo "configure:2615: checking for X11/extensions/shape.h" >&5 +- cat > conftest.$ac_ext <<EOF +-#line 2617 "configure" +-#include "confdefs.h" ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char XShapeCombineShape (); ++int ++main () ++{ ++XShapeCombineShape (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_Xext_XShapeCombineShape=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_Xext_XShapeCombineShape=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_Xext_XShapeCombineShape" >&5 ++echo "${ECHO_T}$ac_cv_lib_Xext_XShapeCombineShape" >&6 ++if test $ac_cv_lib_Xext_XShapeCombineShape = yes; then ++ echo "$as_me:$LINENO: checking for X11/extensions/shape.h" >&5 ++echo $ECHO_N "checking for X11/extensions/shape.h... $ECHO_C" >&6 ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <X11/Xlib.h> + #include <X11/Xutil.h> + #include <X11/extensions/shape.h> + +-int main() { ++int ++main () ++{ + long foo = ShapeSet +-; return 0; } +-EOF +-if { (eval echo configure:2627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- echo "$ac_t""yes" 1>&6 ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + SHAPE="-DSHAPE"; Xext_lib="-lXext" + else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- echo "$ac_t""no" 1>&6 +- ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ + fi +-rm -f conftest* +- ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++ ++fi ++ + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ ++LIBS="$LIBS $Xext_lib" ++ ++LIBS="$LIBS $X_EXTRA_LIBS" ++ ++Xext_lib="" ++ ++XINERAMA="" ++echo "$as_me:$LINENO: checking whether to build support for the Xinerama extension" >&5 ++echo $ECHO_N "checking whether to build support for the Xinerama extension... $ECHO_C" >&6 ++# Check whether --enable-xinerama or --disable-xinerama was given. ++if test "${enable_xinerama+set}" = set; then ++ enableval="$enable_xinerama" ++ ++fi; ++ ++: ${enableval="yes"} ++if test x$enableval = "xyes"; then ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++ echo "$as_me:$LINENO: checking for XineramaQueryScreens in -lXinerama" >&5 ++echo $ECHO_N "checking for XineramaQueryScreens in -lXinerama... $ECHO_C" >&6 ++if test "${ac_cv_lib_Xinerama_XineramaQueryScreens+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lXinerama $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char XineramaQueryScreens (); ++int ++main () ++{ ++XineramaQueryScreens (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_Xinerama_XineramaQueryScreens=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_Xinerama_XineramaQueryScreens=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_Xinerama_XineramaQueryScreens" >&5 ++echo "${ECHO_T}$ac_cv_lib_Xinerama_XineramaQueryScreens" >&6 ++if test $ac_cv_lib_Xinerama_XineramaQueryScreens = yes; then ++ echo "$as_me:$LINENO: checking for X11/extensions/Xinerama.h" >&5 ++echo $ECHO_N "checking for X11/extensions/Xinerama.h... $ECHO_C" >&6 ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <X11/Xlib.h> ++#include <X11/Xutil.h> ++#include <X11/extensions/Xinerama.h> ++ ++int ++main () ++{ ++XineramaScreenInfo* s = 0 ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++ XINERAMA="-DXINERAMA"; Xext_lib="-lXext -lXinerama" ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++ + fi + + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi + + + LIBS="$LIBS $Xext_lib" + + ORDEREDPSEUDO="" +-echo $ac_n "checking whether to include Pseudocolor ordered dithering code""... $ac_c" 1>&6 +-echo "configure:2653: checking whether to include Pseudocolor ordered dithering code" >&5 ++echo "$as_me:$LINENO: checking whether to include Pseudocolor ordered dithering code" >&5 ++echo $ECHO_N "checking whether to include Pseudocolor ordered dithering code... $ECHO_C" >&6 + # Check whether --enable-ordered-pseudo or --disable-ordered-pseudo was given. + if test "${enable_ordered_pseudo+set}" = set; then + enableval="$enable_ordered_pseudo" + if test x$enableval = "xyes"; then +- echo "$ac_t""yes" 1>&6 +- ORDEREDPSEUDO="-DORDEREDPSEUDO" ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 ++ ORDEREDPSEUDO="-DORDEREDPSEUDO" + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi + else +- echo "$ac_t""no" 1>&6 +- +-fi ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + ++fi; + + + DEBUG="" +-echo $ac_n "checking whether to include verbose debugging code""... $ac_c" 1>&6 +-echo "configure:2672: checking whether to include verbose debugging code" >&5 ++echo "$as_me:$LINENO: checking whether to include verbose debugging code" >&5 ++echo $ECHO_N "checking whether to include verbose debugging code... $ECHO_C" >&6 + # Check whether --enable-debug or --disable-debug was given. + if test "${enable_debug+set}" = set; then + enableval="$enable_debug" + if test x$enableval = "xyes"; then +- echo "$ac_t""yes" 1>&6 ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + if test x$GCC = "xyes"; then + DEBUG="-DDEBUG -fno-inline -g" + else + DEBUG="-DDEBUG" + fi + else +- echo "$ac_t""no" 1>&6 +- DEBUG="-DNDEBUG" ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ DEBUG="-DNDEBUG" + fi + else +- echo "$ac_t""no" 1>&6 +- DEBUG="-DNDEBUG" +- +-fi ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++ DEBUG="-DNDEBUG" + ++fi; + + + NLS="" +-echo $ac_n "checking whether to include NLS support""... $ac_c" 1>&6 +-echo "configure:2697: checking whether to include NLS support" >&5 ++echo "$as_me:$LINENO: checking whether to include NLS support" >&5 ++echo $ECHO_N "checking whether to include NLS support... $ECHO_C" >&6 + # Check whether --enable-nls or --disable-nls was given. + if test "${enable_nls+set}" = set; then + enableval="$enable_nls" + if test x$enableval = "xyes"; then +- echo "$ac_t""yes" 1>&6 ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + NLS="-DNLS" + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi + else +- echo "$ac_t""yes" 1>&6 ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + NLS="-DNLS" + +-fi +- ++fi; + + +-echo $ac_n "checking for setlocale in -lxpg4""... $ac_c" 1>&6 +-echo "configure:2716: checking for setlocale in -lxpg4" >&5 +-ac_lib_var=`echo xpg4'_'setlocale | sed 'y%./+-%__p_%'` +-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++echo "$as_me:$LINENO: checking for setlocale in -lxpg4" >&5 ++echo $ECHO_N "checking for setlocale in -lxpg4... $ECHO_C" >&6 ++if test "${ac_cv_lib_xpg4_setlocale+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- ac_save_LIBS="$LIBS" ++ ac_check_lib_save_LIBS=$LIBS + LIBS="-lxpg4 $LIBS" +-cat > conftest.$ac_ext <<EOF +-#line 2724 "configure" +-#include "confdefs.h" +-/* Override any gcc2 internal prototype to avoid an error. */ +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char setlocale(); +- +-int main() { +-setlocale() +-; return 0; } +-EOF +-if { (eval echo configure:2735: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=yes" +-else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- eval "ac_cv_lib_$ac_lib_var=no" +-fi +-rm -f conftest* +-LIBS="$ac_save_LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + +-fi +-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then +- echo "$ac_t""yes" 1>&6 ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char setlocale (); ++int ++main () ++{ ++setlocale (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_xpg4_setlocale=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_xpg4_setlocale=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_xpg4_setlocale" >&5 ++echo "${ECHO_T}$ac_cv_lib_xpg4_setlocale" >&6 ++if test $ac_cv_lib_xpg4_setlocale = yes; then + LIBS="$LIBS -lxpg4" +-else +- echo "$ac_t""no" 1>&6 + fi + + + for ac_prog in gencat + do +-# Extract the first word of "$ac_prog", so it can be a program name with args. ++ # Extract the first word of "$ac_prog", so it can be a program name with args. + set dummy $ac_prog; ac_word=$2 +-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:2761: checking for $ac_word" >&5 +-if eval "test \"`echo '$''{'ac_cv_prog_gencat_cmd'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_gencat_cmd+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 + else + if test -n "$gencat_cmd"; then + ac_cv_prog_gencat_cmd="$gencat_cmd" # Let the user override the test. + else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_dummy="$PATH" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/$ac_word; then +- ac_cv_prog_gencat_cmd="$ac_prog" +- break +- fi +- done +- IFS="$ac_save_ifs" ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_gencat_cmd="$ac_prog" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ + fi + fi +-gencat_cmd="$ac_cv_prog_gencat_cmd" ++gencat_cmd=$ac_cv_prog_gencat_cmd + if test -n "$gencat_cmd"; then +- echo "$ac_t""$gencat_cmd" 1>&6 ++ echo "$as_me:$LINENO: result: $gencat_cmd" >&5 ++echo "${ECHO_T}$gencat_cmd" >&6 + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi + +-test -n "$gencat_cmd" && break ++ test -n "$gencat_cmd" && break + done + + if test x$gencat_cmd = "x"; then +@@ -2792,37 +6357,42 @@ + + + TIMEDCACHE="" +-echo $ac_n "checking whether to use the new timed pixmap cache""... $ac_c" 1>&6 +-echo "configure:2797: checking whether to use the new timed pixmap cache" >&5 ++echo "$as_me:$LINENO: checking whether to use the new timed pixmap cache" >&5 ++echo $ECHO_N "checking whether to use the new timed pixmap cache... $ECHO_C" >&6 + # Check whether --enable-timed-cache or --disable-timed-cache was given. + if test "${enable_timed_cache+set}" = set; then + enableval="$enable_timed_cache" + if test x$enableval = "xyes"; then +- echo "$ac_t""yes" 1>&6 ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + TIMEDCACHE="-DTIMEDCACHE" + else +- echo "$ac_t""no" 1>&6 ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 + fi + else +- echo "$ac_t""yes" 1>&6 ++ echo "$as_me:$LINENO: result: yes" >&5 ++echo "${ECHO_T}yes" >&6 + TIMEDCACHE="-DTIMEDCACHE" + +-fi +- ++fi; + + +-echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 +-echo "configure:2816: checking return type of signal handlers" >&5 +-if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then +- echo $ac_n "(cached) $ac_c" 1>&6 +-else +- cat > conftest.$ac_ext <<EOF +-#line 2821 "configure" +-#include "confdefs.h" ++echo "$as_me:$LINENO: checking return type of signal handlers" >&5 ++echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 ++if test "${ac_cv_type_signal+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ + #include <sys/types.h> + #include <signal.h> + #ifdef signal +-#undef signal ++# undef signal + #endif + #ifdef __cplusplus + extern "C" void (*signal (int, void (*)(int)))(int); +@@ -2830,41 +6400,65 @@ + void (*signal ()) (); + #endif + +-int main() { ++int ++main () ++{ + int i; +-; return 0; } +-EOF +-if { (eval echo configure:2838: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +- rm -rf conftest* ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + ac_cv_type_signal=void + else +- echo "configure: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- rm -rf conftest* +- ac_cv_type_signal=int ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_type_signal=int + fi +-rm -f conftest* ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi ++echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 ++echo "${ECHO_T}$ac_cv_type_signal" >&6 + +-echo "$ac_t""$ac_cv_type_signal" 1>&6 +-cat >> confdefs.h <<EOF ++cat >>confdefs.h <<_ACEOF + #define RETSIGTYPE $ac_cv_type_signal +-EOF ++_ACEOF + + + +-echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 +-echo "configure:2858: checking whether to enable maintainer-specific portions of Makefiles" >&5 ++echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 ++echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. + if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval + else + USE_MAINTAINER_MODE=no +-fi ++fi; ++ echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 ++echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 + +- echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6 +- + + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= +@@ -2874,460 +6468,1332 @@ + MAINTAINER_MODE_FALSE= + fi + MAINT=$MAINTAINER_MODE_TRUE +- + + +-echo "$ac_t""" 1>&6 +-echo "$ac_t"" $PACKAGE version $VERSION configured successfully." 1>&6 +-echo "$ac_t""" 1>&6 +-echo "$ac_t""Using '$prefix' for installation." 1>&6 +-echo "$ac_t""Using '$CXX' for C++ compiler." 1>&6 +-echo "$ac_t""Building with '$CXXFLAGS' for C++ compiler flags." 1>&6 +-echo "$ac_t""Building with '$LIBS' for linker flags." 1>&6 +-echo "$ac_t""" 1>&6 + ++echo "$as_me:$LINENO: result: " >&5 ++echo "${ECHO_T}" >&6 ++echo "$as_me:$LINENO: result: $PACKAGE version $VERSION configured successfully." >&5 ++echo "${ECHO_T} $PACKAGE version $VERSION configured successfully." >&6 ++echo "$as_me:$LINENO: result: " >&5 ++echo "${ECHO_T}" >&6 ++echo "$as_me:$LINENO: result: Using '$prefix' for installation." >&5 ++echo "${ECHO_T}Using '$prefix' for installation." >&6 ++echo "$as_me:$LINENO: result: Using '$CXX' for C++ compiler." >&5 ++echo "${ECHO_T}Using '$CXX' for C++ compiler." >&6 ++echo "$as_me:$LINENO: result: Building with '$CXXFLAGS' for C++ compiler flags." >&5 ++echo "${ECHO_T}Building with '$CXXFLAGS' for C++ compiler flags." >&6 ++echo "$as_me:$LINENO: result: Building with '$LIBS' for linker flags." >&5 ++echo "${ECHO_T}Building with '$LIBS' for linker flags." >&6 ++echo "$as_me:$LINENO: result: " >&5 ++echo "${ECHO_T}" >&6 + + ++ ac_config_headers="$ac_config_headers config.h" + +-trap '' 1 2 15 +-cat > confcache <<\EOF ++ ac_config_commands="$ac_config_commands default-1" ++ ++ ac_config_files="$ac_config_files Makefile src/Makefile util/Makefile data/Makefile data/styles/Makefile doc/Makefile nls/Makefile nls/C/Makefile nls/da_DK/Makefile nls/de_DE/Makefile nls/es_AR/Makefile nls/es_ES/Makefile nls/fr_FR/Makefile nls/hu_HU/Makefile nls/it_IT/Makefile nls/ja_JP/Makefile nls/ko_KR/Makefile nls/lv_LV/Makefile nls/nl_NL/Makefile nls/no_NO/Makefile nls/pl_PL/Makefile nls/pt_BR/Makefile nls/ro_RO/Makefile nls/ru_RU/Makefile nls/sk_SK/Makefile nls/sl_SI/Makefile nls/sv_SE/Makefile nls/uk_UA/Makefile nls/zh_CN/Makefile nls/zh_TW/Makefile version.h" ++cat >confcache <<\_ACEOF + # This file is a shell script that caches the results of configure + # tests run on this system so they can be shared between configure +-# scripts and configure runs. It is not useful on other systems. +-# If it contains results you don't want to keep, you may remove or edit it. ++# scripts and configure runs, see configure's option --config-cache. ++# It is not useful on other systems. If it contains results you don't ++# want to keep, you may remove or edit it. + # +-# By default, configure uses ./config.cache as the cache file, +-# creating it if it does not exist already. You can give configure +-# the --cache-file=FILE option to use a different cache file; that is +-# what configure does when it calls configure scripts in +-# subdirectories, so they share the cache. +-# Giving --cache-file=/dev/null disables caching, for debugging configure. +-# config.status only pays attention to the cache file if you give it the +-# --recheck option to rerun configure. ++# config.status only pays attention to the cache file if you give it ++# the --recheck option to rerun configure. + # +-EOF ++# `ac_cv_env_foo' variables (set or unset) will be overridden when ++# loading this file, other *unset* `ac_cv_foo' will be assigned the ++# following values. ++ ++_ACEOF ++ + # The following way of writing the cache mishandles newlines in values, + # but we know of no workaround that is simple, portable, and efficient. + # So, don't put newlines in cache variables' values. + # Ultrix sh set writes to stderr and can't be redirected directly, + # and sets the high bit in the cache file unless we assign to the vars. +-(set) 2>&1 | +- case `(ac_space=' '; set | grep ac_space) 2>&1` in +- *ac_space=\ *) +- # `set' does not quote correctly, so add quotes (double-quote substitution +- # turns \\\\ into \\, and sed turns \\ into \). +- sed -n \ +- -e "s/'/'\\\\''/g" \ +- -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" +- ;; +- *) +- # `set' quotes correctly as required by POSIX, so do not add quotes. +- sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' +- ;; +- esac >> confcache +-if cmp -s $cache_file confcache; then +- : +-else ++{ ++ (set) 2>&1 | ++ case `(ac_space=' '; set | grep ac_space) 2>&1` in ++ *ac_space=\ *) ++ # `set' does not quote correctly, so add quotes (double-quote ++ # substitution turns \\\\ into \\, and sed turns \\ into \). ++ sed -n \ ++ "s/'/'\\\\''/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ++ ;; ++ *) ++ # `set' quotes correctly as required by POSIX, so do not add quotes. ++ sed -n \ ++ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ++ ;; ++ esac; ++} | ++ sed ' ++ t clear ++ : clear ++ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ ++ t end ++ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ ++ : end' >>confcache ++if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then +- echo "updating cache $cache_file" +- cat confcache > $cache_file ++ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" ++ cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi + fi + rm -f confcache + +-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 +- + test "x$prefix" = xNONE && prefix=$ac_default_prefix + # Let make expand exec_prefix. + test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +-# Any assignment to VPATH causes Sun make to only execute +-# the first set of double-colon rules, so remove it if not needed. +-# If there is a colon in the path, we need to keep it. ++# VPATH may cause trouble with some makes, so we remove $(srcdir), ++# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and ++# trailing colons and then remove the whole line if VPATH becomes empty ++# (actually we leave an empty line to preserve line numbers). + if test "x$srcdir" = x.; then +- ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' ++ ac_vpsub='/^[ ]*VPATH[ ]*=/{ ++s/:*\$(srcdir):*/:/; ++s/:*\${srcdir}:*/:/; ++s/:*@srcdir@:*/:/; ++s/^\([^=]*=[ ]*\):*/\1/; ++s/:*$//; ++s/^[^=]*=[ ]*$//; ++}' + fi + +-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 +- + DEFS=-DHAVE_CONFIG_H + +-# Without the "./", some shells look in PATH for config.status. +-: ${CONFIG_STATUS=./config.status} ++ac_libobjs= ++ac_ltlibobjs= ++for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue ++ # 1. Remove the extension, and $U if already installed. ++ ac_i=`echo "$ac_i" | ++ sed 's/\$U\././;s/\.o$//;s/\.obj$//'` ++ # 2. Add them. ++ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ++ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' ++done ++LIBOBJS=$ac_libobjs + +-echo creating $CONFIG_STATUS +-rm -f $CONFIG_STATUS +-cat > $CONFIG_STATUS <<EOF +-#! /bin/sh +-# Generated automatically by configure. ++LTLIBOBJS=$ac_ltlibobjs ++ ++ ++ ++: ${CONFIG_STATUS=./config.status} ++ac_clean_files_save=$ac_clean_files ++ac_clean_files="$ac_clean_files $CONFIG_STATUS" ++{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 ++echo "$as_me: creating $CONFIG_STATUS" >&6;} ++cat >$CONFIG_STATUS <<_ACEOF ++#! $SHELL ++# Generated by $as_me. + # Run this file to recreate the current configuration. +-# This directory was configured as follows, +-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +-# +-# $0 $ac_configure_args +-# + # Compiler output produced by configure, useful for debugging +-# configure, is in ./config.log if it exists. ++# configure, is in config.log if it exists. + +-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +-for ac_option ++debug=false ++ac_cs_recheck=false ++ac_cs_silent=false ++SHELL=\${CONFIG_SHELL-$SHELL} ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++## --------------------- ## ++## M4sh Initialization. ## ++## --------------------- ## ++ ++# Be Bourne compatible ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then ++ set -o posix ++fi ++DUALCASE=1; export DUALCASE # for MKS sh ++ ++# Support unset when possible. ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then ++ as_unset=unset ++else ++ as_unset=false ++fi ++ ++ ++# Work around bugs in pre-3.0 UWIN ksh. ++$as_unset ENV MAIL MAILPATH ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# NLS nuisances. ++for as_var in \ ++ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ ++ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ ++ LC_TELEPHONE LC_TIME ++do ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ eval $as_var=C; export $as_var ++ else ++ $as_unset $as_var ++ fi ++done ++ ++# Required to use basename. ++if expr a : '\(a\)' >/dev/null 2>&1; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then ++ as_basename=basename ++else ++ as_basename=false ++fi ++ ++ ++# Name of the executable. ++as_me=`$as_basename "$0" || ++$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)$' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X/"$0" | ++ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } ++ /^X\/\(\/\/\)$/{ s//\1/; q; } ++ /^X\/\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ ++ ++# PATH needs CR, and LINENO needs CR and PATH. ++# Avoid depending upon Character Ranges. ++as_cr_letters='abcdefghijklmnopqrstuvwxyz' ++as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' ++as_cr_Letters=$as_cr_letters$as_cr_LETTERS ++as_cr_digits='0123456789' ++as_cr_alnum=$as_cr_Letters$as_cr_digits ++ ++# The user is always right. ++if test "${PATH_SEPARATOR+set}" != set; then ++ echo "#! /bin/sh" >conf$$.sh ++ echo "exit 0" >>conf$$.sh ++ chmod +x conf$$.sh ++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then ++ PATH_SEPARATOR=';' ++ else ++ PATH_SEPARATOR=: ++ fi ++ rm -f conf$$.sh ++fi ++ ++ ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x$as_lineno_3" = "x$as_lineno_2" || { ++ # Find who we are. Look in the path if we contain no path at all ++ # relative or not. ++ case $0 in ++ *[\\/]* ) as_myself=$0 ;; ++ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break ++done ++ ++ ;; ++ esac ++ # We did not find ourselves, most probably we were run as `sh COMMAND' ++ # in which case we are not to be found in the path. ++ if test "x$as_myself" = x; then ++ as_myself=$0 ++ fi ++ if test ! -f "$as_myself"; then ++ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 ++echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} ++ { (exit 1); exit 1; }; } ++ fi ++ case $CONFIG_SHELL in ++ '') ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for as_base in sh bash ksh sh5; do ++ case $as_dir in ++ /*) ++ if ("$as_dir/$as_base" -c ' ++ as_lineno_1=$LINENO ++ as_lineno_2=$LINENO ++ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` ++ test "x$as_lineno_1" != "x$as_lineno_2" && ++ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then ++ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } ++ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } ++ CONFIG_SHELL=$as_dir/$as_base ++ export CONFIG_SHELL ++ exec "$CONFIG_SHELL" "$0" ${1+"$@"} ++ fi;; ++ esac ++ done ++done ++;; ++ esac ++ ++ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO ++ # uniformly replaced by the line number. The first 'sed' inserts a ++ # line-number line before each line; the second 'sed' does the real ++ # work. The second script uses 'N' to pair each line-number line ++ # with the numbered line, and appends trailing '-' during ++ # substitution so that $LINENO is not a special case at line end. ++ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the ++ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) ++ sed '=' <$as_myself | ++ sed ' ++ N ++ s,$,-, ++ : loop ++ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, ++ t loop ++ s,-$,, ++ s,^['$as_cr_digits']*\n,, ++ ' >$as_me.lineno && ++ chmod +x $as_me.lineno || ++ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 ++echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} ++ { (exit 1); exit 1; }; } ++ ++ # Don't try to exec as it changes $[0], causing all sort of problems ++ # (the dirname of $[0] is not the place where we might find the ++ # original and so on. Autoconf is especially sensible to this). ++ . ./$as_me.lineno ++ # Exit status is that of the last command. ++ exit ++} ++ ++ ++case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in ++ *c*,-n*) ECHO_N= ECHO_C=' ++' ECHO_T=' ' ;; ++ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; ++ *) ECHO_N= ECHO_C='\c' ECHO_T= ;; ++esac ++ ++if expr a : '\(a\)' >/dev/null 2>&1; then ++ as_expr=expr ++else ++ as_expr=false ++fi ++ ++rm -f conf$$ conf$$.exe conf$$.file ++echo >conf$$.file ++if ln -s conf$$.file conf$$ 2>/dev/null; then ++ # We could just check for DJGPP; but this test a) works b) is more generic ++ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). ++ if test -f conf$$.exe; then ++ # Don't use ln at all; we don't have any links ++ as_ln_s='cp -p' ++ else ++ as_ln_s='ln -s' ++ fi ++elif ln conf$$.file conf$$ 2>/dev/null; then ++ as_ln_s=ln ++else ++ as_ln_s='cp -p' ++fi ++rm -f conf$$ conf$$.exe conf$$.file ++ ++if mkdir -p . 2>/dev/null; then ++ as_mkdir_p=: ++else ++ test -d ./-p && rmdir ./-p ++ as_mkdir_p=false ++fi ++ ++as_executable_p="test -f" ++ ++# Sed expression to map a string onto a valid CPP name. ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" ++ ++# Sed expression to map a string onto a valid variable name. ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" ++ ++ ++# IFS ++# We need space, tab and new line, in precisely that order. ++as_nl=' ++' ++IFS=" $as_nl" ++ ++# CDPATH. ++$as_unset CDPATH ++ ++exec 6>&1 ++ ++# Open the log real soon, to keep \$[0] and so on meaningful, and to ++# report actual input values of CONFIG_FILES etc. instead of their ++# values after options handling. Logging --version etc. is OK. ++exec 5>>config.log ++{ ++ echo ++ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ++## Running $as_me. ## ++_ASBOX ++} >&5 ++cat >&5 <<_CSEOF ++ ++This file was extended by $as_me, which was ++generated by GNU Autoconf 2.59. Invocation command line was ++ ++ CONFIG_FILES = $CONFIG_FILES ++ CONFIG_HEADERS = $CONFIG_HEADERS ++ CONFIG_LINKS = $CONFIG_LINKS ++ CONFIG_COMMANDS = $CONFIG_COMMANDS ++ $ $0 $@ ++ ++_CSEOF ++echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 ++echo >&5 ++_ACEOF ++ ++# Files that config.status was made for. ++if test -n "$ac_config_files"; then ++ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS ++fi ++ ++if test -n "$ac_config_headers"; then ++ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS ++fi ++ ++if test -n "$ac_config_links"; then ++ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS ++fi ++ ++if test -n "$ac_config_commands"; then ++ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS ++fi ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++ ++ac_cs_usage="\ ++\`$as_me' instantiates files from templates according to the ++current configuration. ++ ++Usage: $0 [OPTIONS] [FILE]... ++ ++ -h, --help print this help, then exit ++ -V, --version print version number, then exit ++ -q, --quiet do not print progress messages ++ -d, --debug don't remove temporary files ++ --recheck update $as_me by reconfiguring in the same conditions ++ --file=FILE[:TEMPLATE] ++ instantiate the configuration file FILE ++ --header=FILE[:TEMPLATE] ++ instantiate the configuration header FILE ++ ++Configuration files: ++$config_files ++ ++Configuration headers: ++$config_headers ++ ++Configuration commands: ++$config_commands ++ ++Report bugs to <bug-autoconf@gnu.org>." ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<_ACEOF ++ac_cs_version="\\ ++config.status ++configured by $0, generated by GNU Autoconf 2.59, ++ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" ++ ++Copyright (C) 2003 Free Software Foundation, Inc. ++This config.status script is free software; the Free Software Foundation ++gives unlimited permission to copy, distribute and modify it." ++srcdir=$srcdir ++INSTALL="$INSTALL" ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++# If no file are specified by the user, then we need to provide default ++# value. By we need to know if files were specified by the user. ++ac_need_defaults=: ++while test $# != 0 + do +- case "\$ac_option" in ++ case $1 in ++ --*=*) ++ ac_option=`expr "x$1" : 'x\([^=]*\)='` ++ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ++ ac_shift=: ++ ;; ++ -*) ++ ac_option=$1 ++ ac_optarg=$2 ++ ac_shift=shift ++ ;; ++ *) # This is not an option, so the user has probably given explicit ++ # arguments. ++ ac_option=$1 ++ ac_need_defaults=false;; ++ esac ++ ++ case $ac_option in ++ # Handling of the options. ++_ACEOF ++cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) +- echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" +- exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; +- -version | --version | --versio | --versi | --vers | --ver | --ve | --v) +- echo "$CONFIG_STATUS generated by autoconf version 2.13" +- exit 0 ;; +- -help | --help | --hel | --he | --h) +- echo "\$ac_cs_usage"; exit 0 ;; +- *) echo "\$ac_cs_usage"; exit 1 ;; ++ ac_cs_recheck=: ;; ++ --version | --vers* | -V ) ++ echo "$ac_cs_version"; exit 0 ;; ++ --he | --h) ++ # Conflict between --help and --header ++ { { echo "$as_me:$LINENO: error: ambiguous option: $1 ++Try \`$0 --help' for more information." >&5 ++echo "$as_me: error: ambiguous option: $1 ++Try \`$0 --help' for more information." >&2;} ++ { (exit 1); exit 1; }; };; ++ --help | --hel | -h ) ++ echo "$ac_cs_usage"; exit 0 ;; ++ --debug | --d* | -d ) ++ debug=: ;; ++ --file | --fil | --fi | --f ) ++ $ac_shift ++ CONFIG_FILES="$CONFIG_FILES $ac_optarg" ++ ac_need_defaults=false;; ++ --header | --heade | --head | --hea ) ++ $ac_shift ++ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ++ ac_need_defaults=false;; ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil | --si | --s) ++ ac_cs_silent=: ;; ++ ++ # This is an error. ++ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 ++Try \`$0 --help' for more information." >&5 ++echo "$as_me: error: unrecognized option: $1 ++Try \`$0 --help' for more information." >&2;} ++ { (exit 1); exit 1; }; } ;; ++ ++ *) ac_config_targets="$ac_config_targets $1" ;; ++ + esac ++ shift + done + +-ac_given_srcdir=$srcdir +-ac_given_INSTALL="$INSTALL" ++ac_configure_extra_args= + +-trap 'rm -fr `echo "Makefile +-src/Makefile +-util/Makefile +-data/Makefile +-data/styles/Makefile +-doc/Makefile +-nls/Makefile +-nls/C/Makefile +-nls/da_DK/Makefile +-nls/de_DE/Makefile +-nls/es_AR/Makefile +-nls/es_ES/Makefile +-nls/fr_FR/Makefile +-nls/hu_HU/Makefile +-nls/it_IT/Makefile +-nls/ja_JP/Makefile +-nls/ko_KR/Makefile +-nls/lv_LV/Makefile +-nls/nl_NL/Makefile +-nls/no_NO/Makefile +-nls/pl_PL/Makefile +-nls/pt_BR/Makefile +-nls/ro_RO/Makefile +-nls/ru_RU/Makefile +-nls/sk_SK/Makefile +-nls/sl_SI/Makefile +-nls/sv_SE/Makefile +-nls/uk_UA/Makefile +-nls/zh_CN/Makefile +-nls/zh_TW/Makefile +-version.h config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +-EOF +-cat >> $CONFIG_STATUS <<EOF +- +-# Protect against being on the right side of a sed subst in config.status. +-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; +- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF +-$ac_vpsub +-$extrasub +-s%@SHELL@%$SHELL%g +-s%@CFLAGS@%$CFLAGS%g +-s%@CPPFLAGS@%$CPPFLAGS%g +-s%@CXXFLAGS@%$CXXFLAGS%g +-s%@FFLAGS@%$FFLAGS%g +-s%@DEFS@%$DEFS%g +-s%@LDFLAGS@%$LDFLAGS%g +-s%@LIBS@%$LIBS%g +-s%@exec_prefix@%$exec_prefix%g +-s%@prefix@%$prefix%g +-s%@program_transform_name@%$program_transform_name%g +-s%@bindir@%$bindir%g +-s%@sbindir@%$sbindir%g +-s%@libexecdir@%$libexecdir%g +-s%@datadir@%$datadir%g +-s%@sysconfdir@%$sysconfdir%g +-s%@sharedstatedir@%$sharedstatedir%g +-s%@localstatedir@%$localstatedir%g +-s%@libdir@%$libdir%g +-s%@includedir@%$includedir%g +-s%@oldincludedir@%$oldincludedir%g +-s%@infodir@%$infodir%g +-s%@mandir@%$mandir%g +-s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +-s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +-s%@INSTALL_DATA@%$INSTALL_DATA%g +-s%@PACKAGE@%$PACKAGE%g +-s%@VERSION@%$VERSION%g +-s%@ACLOCAL@%$ACLOCAL%g +-s%@AUTOCONF@%$AUTOCONF%g +-s%@AUTOMAKE@%$AUTOMAKE%g +-s%@AUTOHEADER@%$AUTOHEADER%g +-s%@MAKEINFO@%$MAKEINFO%g +-s%@SET_MAKE@%$SET_MAKE%g +-s%@CC@%$CC%g +-s%@CXX@%$CXX%g +-s%@regex_cmd@%$regex_cmd%g +-s%@CPP@%$CPP%g +-s%@X_CFLAGS@%$X_CFLAGS%g +-s%@X_PRE_LIBS@%$X_PRE_LIBS%g +-s%@X_LIBS@%$X_LIBS%g +-s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g +-s%@SHAPE@%$SHAPE%g +-s%@ORDEREDPSEUDO@%$ORDEREDPSEUDO%g +-s%@DEBUG@%$DEBUG%g +-s%@NLS@%$NLS%g +-s%@gencat_cmd@%$gencat_cmd%g +-s%@TIMEDCACHE@%$TIMEDCACHE%g +-s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g +-s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g +-s%@MAINT@%$MAINT%g ++if $ac_cs_silent; then ++ exec 6>/dev/null ++ ac_configure_extra_args="$ac_configure_extra_args --silent" ++fi ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++if \$ac_cs_recheck; then ++ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 ++ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion ++fi ++ ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<_ACEOF ++# ++# INIT-COMMANDS section. ++# ++ ++ ++ ++_ACEOF ++ ++ ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++for ac_config_target in $ac_config_targets ++do ++ case "$ac_config_target" in ++ # Handling of arguments. ++ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; ++ "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; ++ "util/Makefile" ) CONFIG_FILES="$CONFIG_FILES util/Makefile" ;; ++ "data/Makefile" ) CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; ++ "data/styles/Makefile" ) CONFIG_FILES="$CONFIG_FILES data/styles/Makefile" ;; ++ "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; ++ "nls/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/Makefile" ;; ++ "nls/C/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/C/Makefile" ;; ++ "nls/da_DK/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/da_DK/Makefile" ;; ++ "nls/de_DE/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/de_DE/Makefile" ;; ++ "nls/es_AR/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/es_AR/Makefile" ;; ++ "nls/es_ES/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/es_ES/Makefile" ;; ++ "nls/fr_FR/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/fr_FR/Makefile" ;; ++ "nls/hu_HU/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/hu_HU/Makefile" ;; ++ "nls/it_IT/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/it_IT/Makefile" ;; ++ "nls/ja_JP/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/ja_JP/Makefile" ;; ++ "nls/ko_KR/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/ko_KR/Makefile" ;; ++ "nls/lv_LV/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/lv_LV/Makefile" ;; ++ "nls/nl_NL/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/nl_NL/Makefile" ;; ++ "nls/no_NO/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/no_NO/Makefile" ;; ++ "nls/pl_PL/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/pl_PL/Makefile" ;; ++ "nls/pt_BR/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/pt_BR/Makefile" ;; ++ "nls/ro_RO/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/ro_RO/Makefile" ;; ++ "nls/ru_RU/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/ru_RU/Makefile" ;; ++ "nls/sk_SK/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/sk_SK/Makefile" ;; ++ "nls/sl_SI/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/sl_SI/Makefile" ;; ++ "nls/sv_SE/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/sv_SE/Makefile" ;; ++ "nls/uk_UA/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/uk_UA/Makefile" ;; ++ "nls/zh_CN/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/zh_CN/Makefile" ;; ++ "nls/zh_TW/Makefile" ) CONFIG_FILES="$CONFIG_FILES nls/zh_TW/Makefile" ;; ++ "version.h" ) CONFIG_FILES="$CONFIG_FILES version.h" ;; ++ "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; ++ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; ++ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 ++echo "$as_me: error: invalid argument: $ac_config_target" >&2;} ++ { (exit 1); exit 1; }; };; ++ esac ++done ++ ++# If the user did not use the arguments to specify the items to instantiate, ++# then the envvar interface is used. Set only those that are not. ++# We use the long form for the default assignment because of an extremely ++# bizarre bug on SunOS 4.1.3. ++if $ac_need_defaults; then ++ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files ++ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers ++ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands ++fi ++ ++# Have a temporary directory for convenience. Make it in the build tree ++# simply because there is no reason to put it here, and in addition, ++# creating and moving files from /tmp can sometimes cause problems. ++# Create a temporary directory, and hook for its removal unless debugging. ++$debug || ++{ ++ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 ++ trap '{ (exit 1); exit 1; }' 1 2 13 15 ++} ++ ++# Create a (secure) tmp directory for tmp files. ++ ++{ ++ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && ++ test -n "$tmp" && test -d "$tmp" ++} || ++{ ++ tmp=./confstat$$-$RANDOM ++ (umask 077 && mkdir $tmp) ++} || ++{ ++ echo "$me: cannot create a temporary directory in ." >&2 ++ { (exit 1); exit 1; } ++} ++ ++_ACEOF ++ ++cat >>$CONFIG_STATUS <<_ACEOF ++ ++# ++# CONFIG_FILES section. ++# + ++# No need to generate the scripts if there are no CONFIG_FILES. ++# This happens for instance when ./config.status config.h ++if test -n "\$CONFIG_FILES"; then ++ # Protect against being on the right side of a sed subst in config.status. ++ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; ++ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF ++s,@SHELL@,$SHELL,;t t ++s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t ++s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t ++s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t ++s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t ++s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t ++s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t ++s,@exec_prefix@,$exec_prefix,;t t ++s,@prefix@,$prefix,;t t ++s,@program_transform_name@,$program_transform_name,;t t ++s,@bindir@,$bindir,;t t ++s,@sbindir@,$sbindir,;t t ++s,@libexecdir@,$libexecdir,;t t ++s,@datadir@,$datadir,;t t ++s,@sysconfdir@,$sysconfdir,;t t ++s,@sharedstatedir@,$sharedstatedir,;t t ++s,@localstatedir@,$localstatedir,;t t ++s,@libdir@,$libdir,;t t ++s,@includedir@,$includedir,;t t ++s,@oldincludedir@,$oldincludedir,;t t ++s,@infodir@,$infodir,;t t ++s,@mandir@,$mandir,;t t ++s,@build_alias@,$build_alias,;t t ++s,@host_alias@,$host_alias,;t t ++s,@target_alias@,$target_alias,;t t ++s,@DEFS@,$DEFS,;t t ++s,@ECHO_C@,$ECHO_C,;t t ++s,@ECHO_N@,$ECHO_N,;t t ++s,@ECHO_T@,$ECHO_T,;t t ++s,@LIBS@,$LIBS,;t t ++s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t ++s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t ++s,@INSTALL_DATA@,$INSTALL_DATA,;t t ++s,@PACKAGE@,$PACKAGE,;t t ++s,@VERSION@,$VERSION,;t t ++s,@ACLOCAL@,$ACLOCAL,;t t ++s,@AUTOCONF@,$AUTOCONF,;t t ++s,@AUTOMAKE@,$AUTOMAKE,;t t ++s,@AUTOHEADER@,$AUTOHEADER,;t t ++s,@MAKEINFO@,$MAKEINFO,;t t ++s,@SET_MAKE@,$SET_MAKE,;t t ++s,@CC@,$CC,;t t ++s,@CFLAGS@,$CFLAGS,;t t ++s,@LDFLAGS@,$LDFLAGS,;t t ++s,@CPPFLAGS@,$CPPFLAGS,;t t ++s,@ac_ct_CC@,$ac_ct_CC,;t t ++s,@EXEEXT@,$EXEEXT,;t t ++s,@OBJEXT@,$OBJEXT,;t t ++s,@CXX@,$CXX,;t t ++s,@CXXFLAGS@,$CXXFLAGS,;t t ++s,@ac_ct_CXX@,$ac_ct_CXX,;t t ++s,@regex_cmd@,$regex_cmd,;t t ++s,@CPP@,$CPP,;t t ++s,@EGREP@,$EGREP,;t t ++s,@X_CFLAGS@,$X_CFLAGS,;t t ++s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t ++s,@X_LIBS@,$X_LIBS,;t t ++s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t ++s,@SHAPE@,$SHAPE,;t t ++s,@XINERAMA@,$XINERAMA,;t t ++s,@ORDEREDPSEUDO@,$ORDEREDPSEUDO,;t t ++s,@DEBUG@,$DEBUG,;t t ++s,@NLS@,$NLS,;t t ++s,@gencat_cmd@,$gencat_cmd,;t t ++s,@TIMEDCACHE@,$TIMEDCACHE,;t t ++s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t ++s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t ++s,@MAINT@,$MAINT,;t t ++s,@LIBOBJS@,$LIBOBJS,;t t ++s,@LTLIBOBJS@,$LTLIBOBJS,;t t + CEOF +-EOF + +-cat >> $CONFIG_STATUS <<\EOF ++_ACEOF + +-# Split the substitutions into bite-sized pieces for seds with +-# small command number limits, like on Digital OSF/1 and HP-UX. +-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +-ac_file=1 # Number of current file. +-ac_beg=1 # First line for current file. +-ac_end=$ac_max_sed_cmds # Line after last line for current file. +-ac_more_lines=: +-ac_sed_cmds="" +-while $ac_more_lines; do +- if test $ac_beg -gt 1; then +- sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file +- else +- sed "${ac_end}q" conftest.subs > conftest.s$ac_file +- fi +- if test ! -s conftest.s$ac_file; then +- ac_more_lines=false +- rm -f conftest.s$ac_file +- else +- if test -z "$ac_sed_cmds"; then +- ac_sed_cmds="sed -f conftest.s$ac_file" ++ cat >>$CONFIG_STATUS <<\_ACEOF ++ # Split the substitutions into bite-sized pieces for seds with ++ # small command number limits, like on Digital OSF/1 and HP-UX. ++ ac_max_sed_lines=48 ++ ac_sed_frag=1 # Number of current file. ++ ac_beg=1 # First line for current file. ++ ac_end=$ac_max_sed_lines # Line after last line for current file. ++ ac_more_lines=: ++ ac_sed_cmds= ++ while $ac_more_lines; do ++ if test $ac_beg -gt 1; then ++ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag ++ else ++ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag ++ fi ++ if test ! -s $tmp/subs.frag; then ++ ac_more_lines=false + else +- ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" ++ # The purpose of the label and of the branching condition is to ++ # speed up the sed processing (if there are no `@' at all, there ++ # is no need to browse any of the substitutions). ++ # These are the two extra sed commands mentioned above. ++ (echo ':t ++ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed ++ if test -z "$ac_sed_cmds"; then ++ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" ++ else ++ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" ++ fi ++ ac_sed_frag=`expr $ac_sed_frag + 1` ++ ac_beg=$ac_end ++ ac_end=`expr $ac_end + $ac_max_sed_lines` + fi +- ac_file=`expr $ac_file + 1` +- ac_beg=$ac_end +- ac_end=`expr $ac_end + $ac_max_sed_cmds` +- fi +-done +-if test -z "$ac_sed_cmds"; then +- ac_sed_cmds=cat +-fi +-EOF +- +-cat >> $CONFIG_STATUS <<EOF +- +-CONFIG_FILES=\${CONFIG_FILES-"Makefile +-src/Makefile +-util/Makefile +-data/Makefile +-data/styles/Makefile +-doc/Makefile +-nls/Makefile +-nls/C/Makefile +-nls/da_DK/Makefile +-nls/de_DE/Makefile +-nls/es_AR/Makefile +-nls/es_ES/Makefile +-nls/fr_FR/Makefile +-nls/hu_HU/Makefile +-nls/it_IT/Makefile +-nls/ja_JP/Makefile +-nls/ko_KR/Makefile +-nls/lv_LV/Makefile +-nls/nl_NL/Makefile +-nls/no_NO/Makefile +-nls/pl_PL/Makefile +-nls/pt_BR/Makefile +-nls/ro_RO/Makefile +-nls/ru_RU/Makefile +-nls/sk_SK/Makefile +-nls/sl_SI/Makefile +-nls/sv_SE/Makefile +-nls/uk_UA/Makefile +-nls/zh_CN/Makefile +-nls/zh_TW/Makefile +-version.h"} +-EOF +-cat >> $CONFIG_STATUS <<\EOF +-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ++ done ++ if test -z "$ac_sed_cmds"; then ++ ac_sed_cmds=cat ++ fi ++fi # test -n "$CONFIG_FILES" ++ ++_ACEOF ++cat >>$CONFIG_STATUS <<\_ACEOF ++for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". +- case "$ac_file" in +- *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` +- ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; +- *) ac_file_in="${ac_file}.in" ;; ++ case $ac_file in ++ - | *:- | *:-:* ) # input from stdin ++ cat >$tmp/stdin ++ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ * ) ac_file_in=$ac_file.in ;; + esac + +- # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. +- +- # Remove last slash and all that follows it. Not all systems have dirname. +- ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` +- if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then +- # The file is in a subdirectory. +- test ! -d "$ac_dir" && mkdir "$ac_dir" +- ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" +- # A "../" for each directory in $ac_dir_suffix. +- ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` +- else +- ac_dir_suffix= ac_dots= +- fi +- +- case "$ac_given_srcdir" in +- .) srcdir=. +- if test -z "$ac_dots"; then top_srcdir=. +- else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; +- /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; ++ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ++ ac_dir=`(dirname "$ac_file") 2>/dev/null || ++$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$ac_file" : 'X\(//\)[^/]' \| \ ++ X"$ac_file" : 'X\(//\)$' \| \ ++ X"$ac_file" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$ac_file" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ { if $as_mkdir_p; then ++ mkdir -p "$ac_dir" ++ else ++ as_dir="$ac_dir" ++ as_dirs= ++ while test ! -d "$as_dir"; do ++ as_dirs="$as_dir $as_dirs" ++ as_dir=`(dirname "$as_dir") 2>/dev/null || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ done ++ test ! -n "$as_dirs" || mkdir $as_dirs ++ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 ++echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} ++ { (exit 1); exit 1; }; }; } ++ ++ ac_builddir=. ++ ++if test "$ac_dir" != .; then ++ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` ++ # A "../" for each directory in $ac_dir_suffix. ++ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` ++else ++ ac_dir_suffix= ac_top_builddir= ++fi ++ ++case $srcdir in ++ .) # No --srcdir option. We are building in place. ++ ac_srcdir=. ++ if test -z "$ac_top_builddir"; then ++ ac_top_srcdir=. ++ else ++ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` ++ fi ;; ++ [\\/]* | ?:[\\/]* ) # Absolute path. ++ ac_srcdir=$srcdir$ac_dir_suffix; ++ ac_top_srcdir=$srcdir ;; + *) # Relative path. +- srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" +- top_srcdir="$ac_dots$ac_given_srcdir" ;; ++ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ++ ac_top_srcdir=$ac_top_builddir$srcdir ;; ++esac ++ ++# Do not use `cd foo && pwd` to compute absolute paths, because ++# the directories may not exist. ++case `pwd` in ++.) ac_abs_builddir="$ac_dir";; ++*) ++ case "$ac_dir" in ++ .) ac_abs_builddir=`pwd`;; ++ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; ++ *) ac_abs_builddir=`pwd`/"$ac_dir";; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_builddir=${ac_top_builddir}.;; ++*) ++ case ${ac_top_builddir}. in ++ .) ac_abs_top_builddir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; ++ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_srcdir=$ac_srcdir;; ++*) ++ case $ac_srcdir in ++ .) ac_abs_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; ++ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_srcdir=$ac_top_srcdir;; ++*) ++ case $ac_top_srcdir in ++ .) ac_abs_top_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; ++ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; ++ esac;; ++esac ++ ++ ++ case $INSTALL in ++ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; ++ *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + +- case "$ac_given_INSTALL" in +- [/$]*) INSTALL="$ac_given_INSTALL" ;; +- *) INSTALL="$ac_dots$ac_given_INSTALL" ;; +- esac ++ # Let's still pretend it is `configure' which instantiates (i.e., don't ++ # use $as_me), people would be surprised to read: ++ # /* config.h. Generated by config.status. */ ++ if test x"$ac_file" = x-; then ++ configure_input= ++ else ++ configure_input="$ac_file. " ++ fi ++ configure_input=$configure_input"Generated from `echo $ac_file_in | ++ sed 's,.*/,,'` by configure." + +- echo creating "$ac_file" +- rm -f "$ac_file" +- configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." +- case "$ac_file" in +- *Makefile*) ac_comsub="1i\\ +-# $configure_input" ;; +- *) ac_comsub= ;; +- esac ++ # First look for the input files in the build tree, otherwise in the ++ # src tree. ++ ac_file_inputs=`IFS=: ++ for f in $ac_file_in; do ++ case $f in ++ -) echo $tmp/stdin ;; ++ [\\/$]*) ++ # Absolute (can't be DOS-style, as IFS=:) ++ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++echo "$as_me: error: cannot find input file: $f" >&2;} ++ { (exit 1); exit 1; }; } ++ echo "$f";; ++ *) # Relative ++ if test -f "$f"; then ++ # Build tree ++ echo "$f" ++ elif test -f "$srcdir/$f"; then ++ # Source tree ++ echo "$srcdir/$f" ++ else ++ # /dev/null tree ++ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++echo "$as_me: error: cannot find input file: $f" >&2;} ++ { (exit 1); exit 1; }; } ++ fi;; ++ esac ++ done` || { (exit 1); exit 1; } ++ ++ if test x"$ac_file" != x-; then ++ { echo "$as_me:$LINENO: creating $ac_file" >&5 ++echo "$as_me: creating $ac_file" >&6;} ++ rm -f "$ac_file" ++ fi ++_ACEOF ++cat >>$CONFIG_STATUS <<_ACEOF ++ sed "$ac_vpsub ++$extrasub ++_ACEOF ++cat >>$CONFIG_STATUS <<\_ACEOF ++:t ++/@[a-zA-Z_][a-zA-Z_0-9]*@/!b ++s,@configure_input@,$configure_input,;t t ++s,@srcdir@,$ac_srcdir,;t t ++s,@abs_srcdir@,$ac_abs_srcdir,;t t ++s,@top_srcdir@,$ac_top_srcdir,;t t ++s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t ++s,@builddir@,$ac_builddir,;t t ++s,@abs_builddir@,$ac_abs_builddir,;t t ++s,@top_builddir@,$ac_top_builddir,;t t ++s,@abs_top_builddir@,$ac_abs_top_builddir,;t t ++s,@INSTALL@,$ac_INSTALL,;t t ++" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out ++ rm -f $tmp/stdin ++ if test x"$ac_file" != x-; then ++ mv $tmp/out $ac_file ++ else ++ cat $tmp/out ++ rm -f $tmp/out ++ fi ++ ++done ++_ACEOF ++cat >>$CONFIG_STATUS <<\_ACEOF + +- ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` +- sed -e "$ac_comsub +-s%@configure_input@%$configure_input%g +-s%@srcdir@%$srcdir%g +-s%@top_srcdir@%$top_srcdir%g +-s%@INSTALL@%$INSTALL%g +-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +-fi; done +-rm -f conftest.s* ++# ++# CONFIG_HEADER section. ++# + + # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where + # NAME is the cpp macro being defined and VALUE is the value it is being given. + # + # ac_d sets the value in "#define NAME VALUE" lines. +-ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +-ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +-ac_dC='\3' +-ac_dD='%g' +-# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +-ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +-ac_uB='\([ ]\)%\1#\2define\3' ++ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ++ac_dB='[ ].*$,\1#\2' ++ac_dC=' ' ++ac_dD=',;t' ++# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ++ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ++ac_uB='$,\1#\2define\3' + ac_uC=' ' +-ac_uD='\4%g' +-# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +-ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +-ac_eB='$%\1#\2define\3' +-ac_eC=' ' +-ac_eD='%g' +- +-if test "${CONFIG_HEADERS+set}" != set; then +-EOF +-cat >> $CONFIG_STATUS <<EOF +- CONFIG_HEADERS="config.h" +-EOF +-cat >> $CONFIG_STATUS <<\EOF +-fi +-for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then ++ac_uD=',;t' ++ ++for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". +- case "$ac_file" in +- *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` +- ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; +- *) ac_file_in="${ac_file}.in" ;; ++ case $ac_file in ++ - | *:- | *:-:* ) # input from stdin ++ cat >$tmp/stdin ++ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ * ) ac_file_in=$ac_file.in ;; + esac + +- echo creating $ac_file ++ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 ++echo "$as_me: creating $ac_file" >&6;} + +- rm -f conftest.frag conftest.in conftest.out +- ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` +- cat $ac_file_inputs > conftest.in +- +-EOF +- +-# Transform confdefs.h into a sed script conftest.vals that substitutes +-# the proper values into config.h.in to produce config.h. And first: +-# Protect against being on the right side of a sed subst in config.status. +-# Protect against being in an unquoted here document in config.status. +-rm -f conftest.vals +-cat > conftest.hdr <<\EOF +-s/[\\&%]/\\&/g +-s%[\\$`]%\\&%g +-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +-s%ac_d%ac_u%gp +-s%ac_u%ac_e%gp +-EOF +-sed -n -f conftest.hdr confdefs.h > conftest.vals +-rm -f conftest.hdr ++ # First look for the input files in the build tree, otherwise in the ++ # src tree. ++ ac_file_inputs=`IFS=: ++ for f in $ac_file_in; do ++ case $f in ++ -) echo $tmp/stdin ;; ++ [\\/$]*) ++ # Absolute (can't be DOS-style, as IFS=:) ++ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++echo "$as_me: error: cannot find input file: $f" >&2;} ++ { (exit 1); exit 1; }; } ++ # Do quote $f, to prevent DOS paths from being IFS'd. ++ echo "$f";; ++ *) # Relative ++ if test -f "$f"; then ++ # Build tree ++ echo "$f" ++ elif test -f "$srcdir/$f"; then ++ # Source tree ++ echo "$srcdir/$f" ++ else ++ # /dev/null tree ++ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++echo "$as_me: error: cannot find input file: $f" >&2;} ++ { (exit 1); exit 1; }; } ++ fi;; ++ esac ++ done` || { (exit 1); exit 1; } ++ # Remove the trailing spaces. ++ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in ++ ++_ACEOF ++ ++# Transform confdefs.h into two sed scripts, `conftest.defines' and ++# `conftest.undefs', that substitutes the proper values into ++# config.h.in to produce config.h. The first handles `#define' ++# templates, and the second `#undef' templates. ++# And first: Protect against being on the right side of a sed subst in ++# config.status. Protect against being in an unquoted here document ++# in config.status. ++rm -f conftest.defines conftest.undefs ++# Using a here document instead of a string reduces the quoting nightmare. ++# Putting comments in sed scripts is not portable. ++# ++# `end' is used to avoid that the second main sed command (meant for ++# 0-ary CPP macros) applies to n-ary macro definitions. ++# See the Autoconf documentation for `clear'. ++cat >confdef2sed.sed <<\_ACEOF ++s/[\\&,]/\\&/g ++s,[\\$`],\\&,g ++t clear ++: clear ++s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp ++t end ++s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp ++: end ++_ACEOF ++# If some macros were called several times there might be several times ++# the same #defines, which is useless. Nevertheless, we may not want to ++# sort them, since we want the *last* AC-DEFINE to be honored. ++uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines ++sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs ++rm -f confdef2sed.sed + + # This sed command replaces #undef with comments. This is necessary, for + # example, in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. +-cat >> conftest.vals <<\EOF +-s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +-EOF +- +-# Break up conftest.vals because some shells have a limit on +-# the size of here documents, and old seds have small limits too. +- ++cat >>conftest.undefs <<\_ACEOF ++s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, ++_ACEOF ++ ++# Break up conftest.defines because some shells have a limit on the size ++# of here documents, and old seds have small limits too (100 cmds). ++echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS ++echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS ++echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS ++echo ' :' >>$CONFIG_STATUS + rm -f conftest.tail +-while : ++while grep . conftest.defines >/dev/null + do +- ac_lines=`grep -c . conftest.vals` +- # grep -c gives empty output for an empty file on some AIX systems. +- if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi +- # Write a limited-size here document to conftest.frag. +- echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS +- sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS ++ # Write a limited-size here document to $tmp/defines.sed. ++ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS ++ # Speed up: don't consider the non `#define' lines. ++ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS ++ # Work around the forget-to-reset-the-flag bug. ++ echo 't clr' >>$CONFIG_STATUS ++ echo ': clr' >>$CONFIG_STATUS ++ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF +- sed -f conftest.frag conftest.in > conftest.out +- rm -f conftest.in +- mv conftest.out conftest.in +-' >> $CONFIG_STATUS +- sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail +- rm -f conftest.vals +- mv conftest.tail conftest.vals +-done +-rm -f conftest.vals +- +-cat >> $CONFIG_STATUS <<\EOF +- rm -f conftest.frag conftest.h +- echo "/* $ac_file. Generated automatically by configure. */" > conftest.h +- cat conftest.in >> conftest.h +- rm -f conftest.in +- if cmp -s $ac_file conftest.h 2>/dev/null; then +- echo "$ac_file is unchanged" +- rm -f conftest.h +- else +- # Remove last slash and all that follows it. Not all systems have dirname. +- ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` +- if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then +- # The file is in a subdirectory. +- test ! -d "$ac_dir" && mkdir "$ac_dir" +- fi +- rm -f $ac_file +- mv conftest.h $ac_file ++ sed -f $tmp/defines.sed $tmp/in >$tmp/out ++ rm -f $tmp/in ++ mv $tmp/out $tmp/in ++' >>$CONFIG_STATUS ++ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail ++ rm -f conftest.defines ++ mv conftest.tail conftest.defines ++done ++rm -f conftest.defines ++echo ' fi # grep' >>$CONFIG_STATUS ++echo >>$CONFIG_STATUS ++ ++# Break up conftest.undefs because some shells have a limit on the size ++# of here documents, and old seds have small limits too (100 cmds). ++echo ' # Handle all the #undef templates' >>$CONFIG_STATUS ++rm -f conftest.tail ++while grep . conftest.undefs >/dev/null ++do ++ # Write a limited-size here document to $tmp/undefs.sed. ++ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS ++ # Speed up: don't consider the non `#undef' ++ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS ++ # Work around the forget-to-reset-the-flag bug. ++ echo 't clr' >>$CONFIG_STATUS ++ echo ': clr' >>$CONFIG_STATUS ++ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS ++ echo 'CEOF ++ sed -f $tmp/undefs.sed $tmp/in >$tmp/out ++ rm -f $tmp/in ++ mv $tmp/out $tmp/in ++' >>$CONFIG_STATUS ++ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail ++ rm -f conftest.undefs ++ mv conftest.tail conftest.undefs ++done ++rm -f conftest.undefs ++ ++cat >>$CONFIG_STATUS <<\_ACEOF ++ # Let's still pretend it is `configure' which instantiates (i.e., don't ++ # use $as_me), people would be surprised to read: ++ # /* config.h. Generated by config.status. */ ++ if test x"$ac_file" = x-; then ++ echo "/* Generated by configure. */" >$tmp/config.h ++ else ++ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi +-fi; done ++ cat $tmp/in >>$tmp/config.h ++ rm -f $tmp/in ++ if test x"$ac_file" != x-; then ++ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then ++ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 ++echo "$as_me: $ac_file is unchanged" >&6;} ++ else ++ ac_dir=`(dirname "$ac_file") 2>/dev/null || ++$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$ac_file" : 'X\(//\)[^/]' \| \ ++ X"$ac_file" : 'X\(//\)$' \| \ ++ X"$ac_file" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$ac_file" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ { if $as_mkdir_p; then ++ mkdir -p "$ac_dir" ++ else ++ as_dir="$ac_dir" ++ as_dirs= ++ while test ! -d "$as_dir"; do ++ as_dirs="$as_dir $as_dirs" ++ as_dir=`(dirname "$as_dir") 2>/dev/null || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ done ++ test ! -n "$as_dirs" || mkdir $as_dirs ++ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 ++echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} ++ { (exit 1); exit 1; }; }; } + +-EOF +-cat >> $CONFIG_STATUS <<EOF ++ rm -f $ac_file ++ mv $tmp/config.h $ac_file ++ fi ++ else ++ cat $tmp/config.h ++ rm -f $tmp/config.h ++ fi ++done ++_ACEOF ++cat >>$CONFIG_STATUS <<\_ACEOF + ++# ++# CONFIG_COMMANDS section. ++# ++for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ++ ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ++ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ++ ac_dir=`(dirname "$ac_dest") 2>/dev/null || ++$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$ac_dest" : 'X\(//\)[^/]' \| \ ++ X"$ac_dest" : 'X\(//\)$' \| \ ++ X"$ac_dest" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$ac_dest" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ { if $as_mkdir_p; then ++ mkdir -p "$ac_dir" ++ else ++ as_dir="$ac_dir" ++ as_dirs= ++ while test ! -d "$as_dir"; do ++ as_dirs="$as_dir $as_dirs" ++ as_dir=`(dirname "$as_dir") 2>/dev/null || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ done ++ test ! -n "$as_dirs" || mkdir $as_dirs ++ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 ++echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} ++ { (exit 1); exit 1; }; }; } ++ ++ ac_builddir=. ++ ++if test "$ac_dir" != .; then ++ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` ++ # A "../" for each directory in $ac_dir_suffix. ++ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` ++else ++ ac_dir_suffix= ac_top_builddir= ++fi ++ ++case $srcdir in ++ .) # No --srcdir option. We are building in place. ++ ac_srcdir=. ++ if test -z "$ac_top_builddir"; then ++ ac_top_srcdir=. ++ else ++ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` ++ fi ;; ++ [\\/]* | ?:[\\/]* ) # Absolute path. ++ ac_srcdir=$srcdir$ac_dir_suffix; ++ ac_top_srcdir=$srcdir ;; ++ *) # Relative path. ++ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ++ ac_top_srcdir=$ac_top_builddir$srcdir ;; ++esac ++ ++# Do not use `cd foo && pwd` to compute absolute paths, because ++# the directories may not exist. ++case `pwd` in ++.) ac_abs_builddir="$ac_dir";; ++*) ++ case "$ac_dir" in ++ .) ac_abs_builddir=`pwd`;; ++ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; ++ *) ac_abs_builddir=`pwd`/"$ac_dir";; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_builddir=${ac_top_builddir}.;; ++*) ++ case ${ac_top_builddir}. in ++ .) ac_abs_top_builddir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; ++ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_srcdir=$ac_srcdir;; ++*) ++ case $ac_srcdir in ++ .) ac_abs_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; ++ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_srcdir=$ac_top_srcdir;; ++*) ++ case $ac_top_srcdir in ++ .) ac_abs_top_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; ++ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; ++ esac;; ++esac ++ ++ ++ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 ++echo "$as_me: executing $ac_dest commands" >&6;} ++ case $ac_dest in ++ default-1 ) test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h ;; ++ esac ++done ++_ACEOF + +-EOF +-cat >> $CONFIG_STATUS <<\EOF +-test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h ++cat >>$CONFIG_STATUS <<\_ACEOF + +-exit 0 +-EOF ++{ (exit 0); exit 0; } ++_ACEOF + chmod +x $CONFIG_STATUS +-rm -fr confdefs* $ac_clean_files +-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 ++ac_clean_files=$ac_clean_files_save ++ ++ ++# configure is writing to config.log, and then calls config.status. ++# config.status does its own redirection, appending to config.log. ++# Unfortunately, on DOS this fails, as config.log is still kept open ++# by configure, so config.status won't be able to write to it; its ++# output is simply discarded. So we exec the FD to /dev/null, ++# effectively closing config.log, so it can be properly (re)opened and ++# appended to by config.status. When coming back to configure, we ++# need to make the FD available again. ++if test "$no_create" != yes; then ++ ac_cs_success=: ++ ac_config_status_args= ++ test "$silent" = yes && ++ ac_config_status_args="$ac_config_status_args --quiet" ++ exec 5>/dev/null ++ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false ++ exec 5>>config.log ++ # Use ||, not &&, to avoid exiting from the if with $? = 1, which ++ # would make configure fail if this is the last instruction. ++ $ac_cs_success || { (exit 1); exit 1; } ++fi + +--- blackbox-0.65.0.orig/configure.in ++++ blackbox-0.65.0/configure.in +@@ -106,6 +106,38 @@ + + LIBS="$LIBS $Xext_lib" + ++LIBS="$LIBS $X_EXTRA_LIBS" ++ ++Xext_lib="" ++ ++dnl Check for Xinerama extension support and proper library files. ++XINERAMA="" ++AC_MSG_CHECKING([whether to build support for the Xinerama extension]) ++AC_ARG_ENABLE( ++ xinerama, [ --enable-xinerama enable support of the xinerama extension [default=yes]]) ++ ++: ${enableval="yes"} ++if test x$enableval = "xyes"; then ++ AC_MSG_RESULT([yes]) ++ AC_CHECK_LIB(Xinerama, XineramaQueryScreens, ++ AC_MSG_CHECKING([for X11/extensions/Xinerama.h]) ++ AC_TRY_LINK( ++#include <X11/Xlib.h> ++#include <X11/Xutil.h> ++#include <X11/extensions/Xinerama.h> ++, XineramaScreenInfo* s = 0, ++ AC_MSG_RESULT([yes]) ++ XINERAMA="-DXINERAMA"; Xext_lib="-lXext -lXinerama", ++ AC_MSG_RESULT([no]) ++ ) ++ ) ++else ++ AC_MSG_RESULT([no]) ++fi ++AC_SUBST(XINERAMA) ++ ++LIBS="$LIBS $Xext_lib" ++ + dnl Check for ordered 8bpp dithering + ORDEREDPSEUDO="" + AC_MSG_CHECKING([whether to include Pseudocolor ordered dithering code]) +--- blackbox-0.65.0.orig/doc/blackbox.1.in ++++ blackbox-0.65.0/doc/blackbox.1.in +@@ -786,6 +786,13 @@ + .EX + .B Default is False. + .EE ++.TP 3 ++.BI "session.screen<num>.slit.xineramaPlacement" " [True|False]" ++Determines whether Xinerama inforation should be used to ++avoid placing the slit in non-viewable regions of the display. ++.EX ++.B Default is True. ++.EE + .\" + .\" ***** MENU CONFIGURABLE FROM MAIN MENU ***** + .\" +@@ -845,6 +852,24 @@ + .B Default is TopToBottom. + .EE + .TP 3 ++.BI "session.screen<num>.xineramaPlacement" " [True|False]" ++Use Xinerama information when deciding where to place windows. ++.EX ++.B Default is True. ++.EE ++.TP 3 ++.BI "session.screen<num>.xineramaMenus" " [True|False]" ++Use Xinerama information to avoid menus spanning screen boundaries. ++.EX ++.B Default is True. ++.EE ++.TP 3 ++.BI "session.screen<num>.xineramaMaximize" " [True|False]" ++Maximize windows to fill one screen when Xineramam is in use. ++.EX ++.B Default is True. ++.EE ++.TP 3 + .BI "session.imageDither" " [True|False]" + This setting is only used when running in low + color modes. Image Dithering helps to show an +@@ -951,6 +976,19 @@ + .EX + .B Default is False. + .EE ++.TP 3 ++.BI "session.screen<num>.toolbar.xineramaPlacement" " [True|False]" ++Use Xinerama information to prevent toolbar from being split ++across screens. ++.EX ++.B Default is True. ++.EE ++.TP 3 ++.BI "session.screen<num>.toolbar.xineramaScreen" " [integer]" ++Xinerama screen number in which to place the toolbar. ++.EX ++.B Default is -1 (auto). ++.EE + .\" + .\" ***** CONFIGURABLE IN BLACKBOXRC ONLY ***** + .\" +--- blackbox-0.65.0.orig/nls/C/Configmenu.m ++++ blackbox-0.65.0/nls/C/Configmenu.m +@@ -40,3 +40,13 @@ + # Top to Bottom + $ #BottomTop + # Bottom to Top ++$ #XineramaOptions ++# Xinerama Options ++$ #XineramaPlacement ++# Window Placement ++$ #XineramaMaximize ++# Window Maximizing ++$ #XineramaToolbar ++# Toolbar Placement ++$ #XineramaMenus ++# Menu Placement +--- blackbox-0.65.0.orig/nls/C/Toolbar.m ++++ blackbox-0.65.0/nls/C/Toolbar.m +@@ -20,3 +20,7 @@ + # Edit current workspace name + $ #ToolbarPlacement + # Toolbar Placement ++$ #ScreenTop ++# Screen %d Top ++$ #ScreenBottom ++# Screen %d Bottom +--- blackbox-0.65.0.orig/nls/convert.awk ++++ blackbox-0.65.0/nls/convert.awk +@@ -4,6 +4,8 @@ + + if (major > 1) + printf "\n" > output ++ else if (codeset) ++ printf "$ codeset=%s\n", codeset > output + printf "$set %d %s\n", major, $3 > output + + if (header) { +--- blackbox-0.65.0.orig/nls/da_DK/Makefile.am ++++ blackbox-0.65.0/nls/da_DK/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/da_DK/Makefile.in ++++ blackbox-0.65.0/nls/da_DK/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/de_DE/Makefile.am ++++ blackbox-0.65.0/nls/de_DE/Makefile.am +@@ -26,7 +26,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/de_DE/Makefile.in ++++ blackbox-0.65.0/nls/de_DE/Makefile.in +@@ -200,7 +200,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/es_ES/Makefile.am ++++ blackbox-0.65.0/nls/es_ES/Makefile.am +@@ -28,7 +28,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/es_ES/Makefile.in ++++ blackbox-0.65.0/nls/es_ES/Makefile.in +@@ -202,7 +202,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/fr_FR/Makefile.am ++++ blackbox-0.65.0/nls/fr_FR/Makefile.am +@@ -26,7 +26,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/fr_FR/Makefile.in ++++ blackbox-0.65.0/nls/fr_FR/Makefile.in +@@ -200,7 +200,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/hu_HU/Makefile.am ++++ blackbox-0.65.0/nls/hu_HU/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-2 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/hu_HU/Makefile.in ++++ blackbox-0.65.0/nls/hu_HU/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-2 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/it_IT/Makefile.am ++++ blackbox-0.65.0/nls/it_IT/Makefile.am +@@ -26,7 +26,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/it_IT/Makefile.in ++++ blackbox-0.65.0/nls/it_IT/Makefile.in +@@ -200,7 +200,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/ja_JP/Makefile.am ++++ blackbox-0.65.0/nls/ja_JP/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=eucJP output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/ja_JP/Makefile.in ++++ blackbox-0.65.0/nls/ja_JP/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=eucJP output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/ko_KR/Makefile.am ++++ blackbox-0.65.0/nls/ko_KR/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=eucKR output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/ko_KR/Makefile.in ++++ blackbox-0.65.0/nls/ko_KR/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=eucKR output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/nl_NL/Makefile.am ++++ blackbox-0.65.0/nls/nl_NL/Makefile.am +@@ -26,7 +26,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/nl_NL/Makefile.in ++++ blackbox-0.65.0/nls/nl_NL/Makefile.in +@@ -200,7 +200,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/no_NO/Makefile.am ++++ blackbox-0.65.0/nls/no_NO/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/no_NO/Makefile.in ++++ blackbox-0.65.0/nls/no_NO/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/pt_BR/Makefile.am ++++ blackbox-0.65.0/nls/pt_BR/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/pt_BR/Makefile.in ++++ blackbox-0.65.0/nls/pt_BR/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/ru_RU/Makefile.am ++++ blackbox-0.65.0/nls/ru_RU/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=KOI8-R output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/ru_RU/Makefile.in ++++ blackbox-0.65.0/nls/ru_RU/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=KOI8-R output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/sl_SI/Makefile.am ++++ blackbox-0.65.0/nls/sl_SI/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-2 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/sl_SI/Makefile.in ++++ blackbox-0.65.0/nls/sl_SI/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-2 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/sv_SE/Makefile.am ++++ blackbox-0.65.0/nls/sv_SE/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/sv_SE/Makefile.in ++++ blackbox-0.65.0/nls/sv_SE/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/uk_UA/Makefile.am ++++ blackbox-0.65.0/nls/uk_UA/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=KOI8-U output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/uk_UA/Makefile.in ++++ blackbox-0.65.0/nls/uk_UA/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=KOI8-U output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/zh_CN/Makefile.am ++++ blackbox-0.65.0/nls/zh_CN/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=GB2312 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/zh_CN/Makefile.in ++++ blackbox-0.65.0/nls/zh_CN/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=GB2312 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/zh_TW/Makefile.am ++++ blackbox-0.65.0/nls/zh_TW/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=BIG5 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/zh_TW/Makefile.in ++++ blackbox-0.65.0/nls/zh_TW/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=BIG5 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/es_AR/Makefile.am ++++ blackbox-0.65.0/nls/es_AR/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/es_AR/Makefile.in ++++ blackbox-0.65.0/nls/es_AR/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-1 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/pl_PL/Makefile.in ++++ blackbox-0.65.0/nls/pl_PL/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-2 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/pl_PL/Makefile.am ++++ blackbox-0.65.0/nls/pl_PL/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-2 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/sk_SK/Makefile.am ++++ blackbox-0.65.0/nls/sk_SK/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk convert=ISO-8859-2 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/sk_SK/Makefile.in ++++ blackbox-0.65.0/nls/sk_SK/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-2 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/lv_LV/Makefile.am ++++ blackbox-0.65.0/nls/lv_LV/Makefile.am +@@ -23,7 +23,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-13 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/nls/lv_LV/Makefile.in ++++ blackbox-0.65.0/nls/lv_LV/Makefile.in +@@ -197,7 +197,7 @@ + + Translation.m: $(MFILES) + @if test x$(NLSTEST) = "x-DNLS"; then \ +- awk -f @srcdir@/../convert.awk output=Translation.m $(MFILES); \ ++ awk -f @srcdir@/../convert.awk codeset=ISO-8859-13 output=Translation.m $(MFILES); \ + fi + + blackbox.cat: Translation.m +--- blackbox-0.65.0.orig/src/BaseDisplay.cc ++++ blackbox-0.65.0/src/BaseDisplay.cc +@@ -86,6 +86,7 @@ + #include "GCCache.hh" + #include "Timer.hh" + #include "Util.hh" ++#include "Xinerama.hh" + + + // X error handler to handle any and all X errors while the application is +@@ -400,9 +401,8 @@ + } + + +-ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) { +- basedisplay = d; +- screen_number = num; ++ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) ++ : basedisplay(d), screen_number(num), xinerama_info(0) { + + root_window = RootWindow(basedisplay->getXDisplay(), screen_number); + +@@ -465,4 +465,12 @@ + + display_string = string("DISPLAY=") + default_string + '.' + + itostring(static_cast<unsigned long>(screen_number)); ++ ++#ifdef XINERAMA ++ xinerama_info = new XineramaInfo(this); ++ if (! xinerama_info->haveXinerama()) { ++ delete xinerama_info; ++ xinerama_info = 0; ++ } ++#endif + } +--- blackbox-0.65.0.orig/src/BaseDisplay.hh ++++ blackbox-0.65.0/src/BaseDisplay.hh +@@ -35,6 +35,7 @@ + // forward declaration + class BaseDisplay; + class BGCCache; ++class XineramaInfo; + + #include "Timer.hh" + #include "Util.hh" +@@ -51,11 +52,14 @@ + std::string display_string; + Rect rect; + ++ XineramaInfo* xinerama_info; ++ + public: + ScreenInfo(BaseDisplay *d, unsigned int num); + + inline BaseDisplay *getBaseDisplay(void) const { return basedisplay; } + inline Visual *getVisual(void) const { return visual; } ++ inline XineramaInfo *getXineramaInfo(void) const { return xinerama_info; } + inline Window getRootWindow(void) const { return root_window; } + inline Colormap getColormap(void) const { return colormap; } + inline int getDepth(void) const { return depth; } +--- blackbox-0.65.0.orig/src/Basemenu.cc ++++ blackbox-0.65.0/src/Basemenu.cc +@@ -49,6 +49,7 @@ + #include "Image.hh" + #include "Screen.hh" + #include "Util.hh" ++#include "Xinerama.hh" + + using std::string; + using std::min; +@@ -478,6 +479,29 @@ + drawSubmenu(which_sub); + } + ++void Basemenu::moveInScreen(int screen_x, int screen_y, int dx, int dy) { ++ int x = screen_x + dx; ++ int y = screen_y + dy; ++ ++ Rect rect = screen->getRect(); ++ if (screen->getXineramaInfo() && screen->doXineramaMenus()) { ++ XineramaScreen xinerama = screen->getXineramaInfo()-> ++ screenContaining(screen_x, screen_y); ++ if (xinerama.isValid()) { ++ rect = xinerama.getRect(); ++ } ++ } ++ ++ if (x < rect.left()) x = rect.left(); ++ if (y < rect.top()) y = rect.top(); ++ ++ if (x + static_cast<signed>(getWidth()) > rect.right()) ++ x = rect.right() - getWidth() - screen->getBorderWidth(); ++ if (y + static_cast<signed>(getHeight()) > rect.bottom()) ++ y = rect.bottom() - getHeight() - screen->getBorderWidth(); ++ ++ move(x,y); ++} + + void Basemenu::redrawTitle(void) { + const char *text = (! menu.label.empty()) ? getLabel() : +@@ -559,16 +583,24 @@ + y = (((shifted) ? menu.y_shift : menu.y) + + menu.height - submenu->menu.height); + +- if ((x + submenu->getWidth()) > screen->getWidth()) ++ Rect rect = screen->getRect(); ++ if (screen->getXineramaInfo() && screen->doXineramaMenus()) { ++ XineramaScreen scr = ++ screen->getXineramaInfo()->screenContaining(menu.x, menu.y); ++ if (scr.isValid()) ++ rect = scr.getRect(); ++ } ++ ++ if ((x + static_cast<signed>(submenu->getWidth())) > rect.right()) + x = ((shifted) ? menu.x_shift : menu.x) - + submenu->getWidth() - screen->getBorderWidth(); + +- if (x < 0) x = 0; ++ if (x < rect.left()) x = rect.left(); + +- if ((y + submenu->getHeight()) > screen->getHeight()) +- y = screen->getHeight() - submenu->getHeight() - ++ if ((y + static_cast<signed>(submenu->getHeight())) > rect.bottom()) ++ y = rect.bottom() - submenu->getHeight() - + (screen->getBorderWidth() * 2); +- if (y < 0) y = 0; ++ if (y < rect.top()) y = rect.top(); + + submenu->move(x, y); + if (! moving) drawItem(index, True); +@@ -961,22 +993,32 @@ + + void Basemenu::enterNotifyEvent(XCrossingEvent *ce) { + if (ce->window == menu.frame) { ++ ++ Rect rect = screen->getRect(); ++#if 0 ++ if (screen->getXineramaInfo() && screen->doXineramaMenus()) { ++ XineramaScreen xin_scr = ++ screen->getXineramaInfo()->screenContaining(menu.x, menu.y); ++ if (xin_scr.isValid()) { ++ rect = xin_scr.getRect(); ++ } ++ } ++#endif ++ + menu.x_shift = menu.x, menu.y_shift = menu.y; +- if (menu.x + menu.width > screen->getWidth()) { +- menu.x_shift = screen->getWidth() - menu.width - +- screen->getBorderWidth(); ++ if (menu.x + static_cast<signed>(menu.width) > rect.right()) { ++ menu.x_shift = rect.right() - menu.width - screen->getBorderWidth(); + shifted = True; +- } else if (menu.x < 0) { +- menu.x_shift = -screen->getBorderWidth(); ++ } else if (menu.x < rect.left()) { ++ menu.x_shift = rect.left() - screen->getBorderWidth(); + shifted = True; + } + +- if (menu.y + menu.height > screen->getHeight()) { +- menu.y_shift = screen->getHeight() - menu.height - +- screen->getBorderWidth(); ++ if (menu.y + static_cast<signed>(menu.height) > rect.bottom()) { ++ menu.y_shift = rect.bottom() - menu.height - screen->getBorderWidth(); + shifted = True; +- } else if (menu.y + static_cast<signed>(menu.title_h) < 0) { +- menu.y_shift = -screen->getBorderWidth(); ++ } else if (menu.y + static_cast<signed>(menu.title_h) < rect.top()) { ++ menu.y_shift = rect.top() - screen->getBorderWidth(); + shifted = True; + } + +--- blackbox-0.65.0.orig/src/Basemenu.hh ++++ blackbox-0.65.0/src/Basemenu.hh +@@ -129,6 +129,7 @@ + void reconfigure(void); + void setLabel(const std::string& label); + void move(int x, int y); ++ void moveInScreen(int screen_x, int screen_y, int dx = 0, int dy = 0); + void update(void); + void setItemSelected(int index, bool sel); + void setItemEnabled(int index, bool enable); +--- blackbox-0.65.0.orig/src/Configmenu.cc ++++ blackbox-0.65.0/src/Configmenu.cc +@@ -36,13 +36,21 @@ + setLabel(i18n(ConfigmenuSet, ConfigmenuConfigOptions, "Config options")); + setInternalMenu(); + ++ int position = 2; + focusmenu = new Focusmenu(this); + placementmenu = new Placementmenu(this); ++ xineramamenu = 0; + + insert(i18n(ConfigmenuSet, ConfigmenuFocusModel, + "Focus Model"), focusmenu); + insert(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, + "Window Placement"), placementmenu); ++ if (scr->getXineramaInfo()) { ++ xineramamenu = new XineramaMenu(this); ++ insert(i18n(ConfigmenuSet, ConfigmenuXineramaOptions, ++ "Xinerama Options"), xineramamenu); ++ position++; ++ } + insert(i18n(ConfigmenuSet, ConfigmenuImageDithering, + "Image Dithering"), 1); + insert(i18n(ConfigmenuSet, ConfigmenuOpaqueMove, +@@ -57,18 +65,19 @@ + "Disable Bindings with Scroll Lock"), 6); + update(); + +- setItemSelected(2, getScreen()->getImageControl()->doDither()); +- setItemSelected(3, getScreen()->doOpaqueMove()); +- setItemSelected(4, getScreen()->doFullMax()); +- setItemSelected(5, getScreen()->doFocusNew()); +- setItemSelected(6, getScreen()->doFocusLast()); +- setItemSelected(7, getScreen()->allowScrollLock()); ++ setItemSelected(position++, getScreen()->getImageControl()->doDither()); ++ setItemSelected(position++, getScreen()->doOpaqueMove()); ++ setItemSelected(position++, getScreen()->doFullMax()); ++ setItemSelected(position++, getScreen()->doFocusNew()); ++ setItemSelected(position++, getScreen()->doFocusLast()); ++ setItemSelected(position++, getScreen()->allowScrollLock()); + } + + + Configmenu::~Configmenu(void) { + delete focusmenu; + delete placementmenu; ++ delete xineramamenu; + } + + +@@ -132,7 +141,8 @@ + void Configmenu::reconfigure(void) { + focusmenu->reconfigure(); + placementmenu->reconfigure(); +- ++ if (xineramamenu) ++ xineramamenu->reconfigure(); + Basemenu::reconfigure(); + } + +@@ -319,3 +329,59 @@ + + reconfigure(); + } ++ ++ ++Configmenu::XineramaMenu::XineramaMenu(Configmenu* cm) ++ : Basemenu(cm->getScreen()) { ++ setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaOptions, "Xinerama Options")); ++ setInternalMenu(); ++ ++ insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"), ++ ConfigmenuXineramaPlacement); ++ insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximize, "Window Maximizing"), ++ ConfigmenuXineramaMaximize); ++ insert(i18n(ConfigmenuSet, ConfigmenuXineramaToolbar, "Toolbar Placement"), ++ ConfigmenuXineramaToolbar); ++ insert(i18n(ConfigmenuSet, ConfigmenuXineramaMenus, "Menu Placement"), ++ ConfigmenuXineramaMenus); ++ update(); ++ ++ setItemSelected(0, getScreen()->doXineramaPlacement()); ++ setItemSelected(1, getScreen()->doXineramaMaximize()); ++ setItemSelected(2, getScreen()->doXineramaToolbar()); ++ setItemSelected(3, getScreen()->doXineramaMenus()); ++} ++ ++ ++void Configmenu::XineramaMenu::itemSelected(int button, unsigned int index) { ++ if (button != 1) ++ return; ++ ++ switch (find(index)->function()) { ++ ++ case ConfigmenuXineramaPlacement : { ++ getScreen()->saveXineramaPlacement(! getScreen()->doXineramaPlacement()); ++ setItemSelected(index, getScreen()->doXineramaPlacement()); ++ break; ++ } ++ ++ case ConfigmenuXineramaMaximize : { ++ getScreen()->saveXineramaMaximize(! getScreen()->doXineramaMaximize()); ++ setItemSelected(index, getScreen()->doXineramaMaximize()); ++ break; ++ } ++ ++ case ConfigmenuXineramaToolbar : { ++ getScreen()->saveXineramaToolbar(! getScreen()->doXineramaToolbar()); ++ setItemSelected(index, getScreen()->doXineramaToolbar()); ++ getScreen()->getToolbar()->reconfigure(); ++ break; ++ } ++ ++ case ConfigmenuXineramaMenus : { ++ getScreen()->saveXineramaMenus(! getScreen()->doXineramaMenus()); ++ setItemSelected(index, getScreen()->doXineramaMenus()); ++ break; ++ } ++ } ++} +--- blackbox-0.65.0.orig/src/Configmenu.hh ++++ blackbox-0.65.0/src/Configmenu.hh +@@ -58,8 +58,21 @@ + virtual void reconfigure(void); + }; + ++ class XineramaMenu : public Basemenu { ++ private: ++ XineramaMenu(const XineramaMenu&); ++ XineramaMenu& operator=(const XineramaMenu&); ++ ++ protected: ++ virtual void itemSelected(int button, unsigned int index); ++ ++ public: ++ XineramaMenu(Configmenu *cm); ++ }; ++ + Focusmenu *focusmenu; + Placementmenu *placementmenu; ++ XineramaMenu* xineramamenu; + + friend class Focusmenu; + friend class Placementmenu; +@@ -76,6 +89,7 @@ + + inline Basemenu *getFocusmenu(void) { return focusmenu; } + inline Basemenu *getPlacementmenu(void) { return placementmenu; } ++ inline Basemenu *getXineramamenu(void) { return xineramamenu; } + + void reconfigure(void); + }; +--- blackbox-0.65.0.orig/src/Makefile.in ++++ blackbox-0.65.0/src/Makefile.in +@@ -87,6 +87,7 @@ + ORDEREDPSEUDO = @ORDEREDPSEUDO@ + PACKAGE = @PACKAGE@ + SHAPE = @SHAPE@ ++XINERAMA = @XINERAMA@ + TIMEDCACHE = @TIMEDCACHE@ + VERSION = @VERSION@ + gencat_cmd = @gencat_cmd@ +@@ -95,7 +96,7 @@ + DEFAULT_MENU = $(pkgdatadir)/menu + DEFAULT_STYLE = $(pkgdatadir)/styles/Results + +-CPPFLAGS = @CPPFLAGS@ @SHAPE@ @ORDEREDPSEUDO@ @DEBUG@ @NLS@ @TIMEDCACHE@ -DLOCALEPATH=\"$(pkgdatadir)/nls\" -DDEFAULTMENU=\"$(DEFAULT_MENU)\" -DDEFAULTSTYLE=\"$(DEFAULT_STYLE)\" ++CPPFLAGS = @CPPFLAGS@ @SHAPE@ @XINERAMA@ @ORDEREDPSEUDO@ @DEBUG@ @NLS@ @TIMEDCACHE@ -DLOCALEPATH=\"$(pkgdatadir)/nls\" -DDEFAULTMENU=\"$(DEFAULT_MENU)\" -DDEFAULTSTYLE=\"$(DEFAULT_STYLE)\" + + + bin_PROGRAMS = blackbox +@@ -119,7 +120,8 @@ + blackbox_OBJECTS = BaseDisplay.o Basemenu.o Clientmenu.o Color.o \ + Configmenu.o GCCache.o Iconmenu.o Image.o ImageControl.o Netizen.o \ + Rootmenu.o Screen.o Slit.o Texture.o Timer.o Toolbar.o Util.o Window.o \ +-Windowmenu.o Workspace.o Workspacemenu.o blackbox.o i18n.o main.o ++Windowmenu.o Workspace.o Workspacemenu.o Xinerama.o \ ++blackbox.o i18n.o main.o + blackbox_LDADD = $(LDADD) + blackbox_DEPENDENCIES = + blackbox_LDFLAGS = +@@ -321,11 +323,11 @@ + + BaseDisplay.o: BaseDisplay.cc ../config.h i18n.hh \ + ../nls/blackbox-nls.hh BaseDisplay.hh Timer.hh GCCache.hh Color.hh \ +- Util.hh ++ Util.hh Xinerama.hh + Basemenu.o: Basemenu.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ + blackbox.hh BaseDisplay.hh Timer.hh Basemenu.hh GCCache.hh Color.hh \ + Image.hh Screen.hh Texture.hh Util.hh Configmenu.hh Iconmenu.hh \ +- Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh ++ Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh Xinerama.hh + Clientmenu.o: Clientmenu.cc ../config.h blackbox.hh i18n.hh \ + ../nls/blackbox-nls.hh BaseDisplay.hh Timer.hh Clientmenu.hh \ + Basemenu.hh Screen.hh Color.hh Texture.hh Util.hh Configmenu.hh \ +@@ -375,13 +377,13 @@ + blackbox.hh BaseDisplay.hh Timer.hh Clientmenu.hh Basemenu.hh \ + GCCache.hh Color.hh Iconmenu.hh Image.hh Rootmenu.hh Screen.hh \ + Texture.hh Util.hh Configmenu.hh Netizen.hh Workspace.hh \ +- Workspacemenu.hh Toolbar.hh Window.hh Windowmenu.hh Slit.hh ++ Workspacemenu.hh Toolbar.hh Window.hh Windowmenu.hh Slit.hh Xinerama.hh + Util.o: Util.cc ../config.h Util.hh + Window.o: Window.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ + blackbox.hh BaseDisplay.hh Timer.hh GCCache.hh Color.hh Iconmenu.hh \ + Basemenu.hh Image.hh Screen.hh Texture.hh Util.hh Configmenu.hh \ + Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh Toolbar.hh \ +- Window.hh Windowmenu.hh Slit.hh ++ Window.hh Windowmenu.hh Slit.hh Xinerama.hh + Windowmenu.o: Windowmenu.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ + blackbox.hh BaseDisplay.hh Timer.hh Screen.hh Color.hh Texture.hh \ + Util.hh Configmenu.hh Basemenu.hh Iconmenu.hh Netizen.hh Rootmenu.hh \ +@@ -390,11 +392,12 @@ + blackbox.hh BaseDisplay.hh Timer.hh Clientmenu.hh Basemenu.hh \ + Netizen.hh Screen.hh Color.hh Texture.hh Util.hh Configmenu.hh \ + Iconmenu.hh Rootmenu.hh Workspace.hh Workspacemenu.hh Toolbar.hh \ +- Window.hh Windowmenu.hh ++ Window.hh Windowmenu.hh Xinerama.hh + Workspacemenu.o: Workspacemenu.cc ../config.h i18n.hh \ + ../nls/blackbox-nls.hh blackbox.hh BaseDisplay.hh Timer.hh Screen.hh \ + Color.hh Texture.hh Util.hh Configmenu.hh Basemenu.hh Iconmenu.hh \ + Netizen.hh Rootmenu.hh Workspace.hh Workspacemenu.hh Toolbar.hh ++Xinerama.o: Xinerama.cc ../config.h Util.hh Xinerama.hh + blackbox.o: blackbox.cc ../config.h i18n.hh ../nls/blackbox-nls.hh \ + blackbox.hh BaseDisplay.hh Timer.hh Basemenu.hh Clientmenu.hh \ + GCCache.hh Color.hh Image.hh Rootmenu.hh Screen.hh Texture.hh Util.hh \ +--- blackbox-0.65.0.orig/src/Screen.cc ++++ blackbox-0.65.0/src/Screen.cc +@@ -998,6 +998,9 @@ + + *(session_stack + i++) = configmenu->getFocusmenu()->getWindowID(); + *(session_stack + i++) = configmenu->getPlacementmenu()->getWindowID(); ++ if (configmenu->getXineramamenu()) ++ *(session_stack + i++) = configmenu->getXineramamenu()->getWindowID(); ++ + *(session_stack + i++) = configmenu->getWindowID(); + + *(session_stack + i++) = slit->getMenu()->getDirectionmenu()->getWindowID(); +@@ -1704,38 +1707,18 @@ + if (rootmenu->isVisible()) + rootmenu->hide(); + } else if (xbutton->button == 2) { +- int mx = xbutton->x_root - (workspacemenu->getWidth() / 2); +- int my = xbutton->y_root - (workspacemenu->getTitleHeight() / 2); +- +- if (mx < 0) mx = 0; +- if (my < 0) my = 0; +- +- if (mx + workspacemenu->getWidth() > getWidth()) +- mx = getWidth() - workspacemenu->getWidth() - getBorderWidth(); +- +- if (my + workspacemenu->getHeight() > getHeight()) +- my = getHeight() - workspacemenu->getHeight() - getBorderWidth(); +- +- workspacemenu->move(mx, my); ++ workspacemenu->moveInScreen(xbutton->x_root, xbutton->y_root, ++ -static_cast<signed>(workspacemenu->getWidth()) / 2, ++ -static_cast<signed>(workspacemenu->getTitleHeight()) / 2); + + if (! workspacemenu->isVisible()) { + workspacemenu->removeParent(); + workspacemenu->show(); + } + } else if (xbutton->button == 3) { +- int mx = xbutton->x_root - (rootmenu->getWidth() / 2); +- int my = xbutton->y_root - (rootmenu->getTitleHeight() / 2); +- +- if (mx < 0) mx = 0; +- if (my < 0) my = 0; +- +- if (mx + rootmenu->getWidth() > getWidth()) +- mx = getWidth() - rootmenu->getWidth() - getBorderWidth(); +- +- if (my + rootmenu->getHeight() > getHeight()) +- my = getHeight() - rootmenu->getHeight() - getBorderWidth(); +- +- rootmenu->move(mx, my); ++ rootmenu->moveInScreen(xbutton->x_root, xbutton->y_root, ++ -static_cast<signed>(rootmenu->getWidth()) / 2, ++ -static_cast<signed>(rootmenu->getTitleHeight()) / 2); + + if (! rootmenu->isVisible()) { + blackbox->checkMenu(); +--- blackbox-0.65.0.orig/src/Screen.hh ++++ blackbox-0.65.0/src/Screen.hh +@@ -149,15 +149,16 @@ + + bool toolbar_on_top, toolbar_auto_hide, sloppy_focus, auto_raise, + auto_edge_balance, image_dither, ordered_dither, opaque_move, full_max, +- focus_new, focus_last, click_raise, allow_scroll_lock; ++ focus_new, focus_last, click_raise, allow_scroll_lock, ++ xinerama_placement, xinerama_maximize, xinerama_menus, xinerama_toolbar; + BColor border_color; + XrmDatabase stylerc; + + unsigned int workspaces; + int toolbar_placement, toolbar_width_percent, placement_policy, +- edge_snap_threshold, row_direction, col_direction; ++ edge_snap_threshold, row_direction, col_direction, toolbar_xin_screen; + +- bool slit_on_top, slit_auto_hide; ++ bool slit_on_top, slit_auto_hide, xinerama_slit; + int slit_placement, slit_direction; + + unsigned int handle_width, bevel_width, frame_width, border_width; +@@ -224,6 +225,16 @@ + inline bool doFocusNew(void) const { return resource.focus_new; } + inline bool doFocusLast(void) const { return resource.focus_last; } + inline bool allowScrollLock(void) const { return resource.allow_scroll_lock;} ++ inline bool doXineramaPlacement(void) const ++ { return resource.xinerama_placement; } ++ inline bool doXineramaMaximize(void) const ++ { return resource.xinerama_maximize; } ++ inline bool doXineramaMenus(void) const ++ { return resource.xinerama_menus; } ++ inline bool doXineramaToolbar(void) const ++ { return resource.xinerama_toolbar; } ++ inline bool doXineramaSlit(void) const ++ { return resource.xinerama_slit; } + + inline const GC &getOpGC(void) const { return opGC; } + +@@ -281,6 +292,8 @@ + { return resource.row_direction; } + inline int getColPlacementDirection(void) const + { return resource.col_direction; } ++ inline int getXineramaToolbarScreen(void) const ++ { return resource.toolbar_xin_screen; } + + inline void setRootColormapInstalled(bool r) { root_colormap_installed = r; } + inline void saveSloppyFocus(bool s) { resource.sloppy_focus = s; } +@@ -295,6 +308,8 @@ + inline void savePlacementPolicy(int p) { resource.placement_policy = p; } + inline void saveRowPlacementDirection(int d) { resource.row_direction = d; } + inline void saveColPlacementDirection(int d) { resource.col_direction = d; } ++ inline void saveXineramaToolbarScreen(int s) ++ { resource.toolbar_xin_screen = s;} + inline void saveEdgeSnapThreshold(int t) + { resource.edge_snap_threshold = t; } + inline void saveImageDither(bool d) { resource.image_dither = d; } +@@ -303,6 +318,13 @@ + inline void saveFocusNew(bool f) { resource.focus_new = f; } + inline void saveFocusLast(bool f) { resource.focus_last = f; } + inline void saveAllowScrollLock(bool a) { resource.allow_scroll_lock = a; } ++ inline void saveXineramaPlacement(bool p) { resource.xinerama_placement = p; } ++ inline void saveXineramaMaximize(bool m) { resource.xinerama_maximize = m; } ++ inline void saveXineramaMenus(bool m) { resource.xinerama_menus = m; } ++ inline void saveXineramaToolbar(bool t) { resource.xinerama_toolbar = t; } ++ inline void saveXinaramaToolbarScreen(int s) ++ { resource.toolbar_xin_screen = s; } ++ inline void saveXineramaSlit(bool s) { resource.xinerama_slit = s; } + + inline void iconUpdate(void) { iconmenu->update(); } + +--- blackbox-0.65.0.orig/src/Slit.cc ++++ blackbox-0.65.0/src/Slit.cc +@@ -35,6 +35,7 @@ + #include "Screen.hh" + #include "Slit.hh" + #include "Toolbar.hh" ++#include "Xinerama.hh" + + + Slit::Slit(BScreen *scr) { +@@ -481,6 +482,29 @@ + + frame.rect.setPos(x, y); + ++ if (screen->getXineramaInfo() && screen->doXineramaSlit()) { ++ XineramaScreen scr = screen->getXineramaInfo()->screenContaining(frame.rect); ++ if (!scr.isValid()) { ++ scr = screen->getXineramaInfo()->getClosestScreen(x,y); ++ } ++ ++ if (scr.isValid() && (scr.getRect() & frame.rect) != frame.rect) { ++ int w = static_cast<signed>(frame.rect.width()); ++ if (x < scr.getRect().left()) ++ x = scr.getRect().left(); ++ else if (x + w > scr.getRect().right()) ++ x = scr.getRect().right() - w; ++ ++ int h = static_cast<signed>(frame.rect.height()); ++ if (y < scr.getRect().top()) ++ y = scr.getRect().top(); ++ else if (y + h > scr.getRect().bottom()) ++ y = scr.getRect().bottom() - h; ++ ++ frame.rect.setPos(x, y); ++ } ++ } ++ + // we have to add the border to the rect as it is not accounted for + Rect tbar_rect = screen->getToolbar()->getRect(); + tbar_rect.setSize(tbar_rect.width() + (screen->getBorderWidth() * 2), +@@ -536,22 +560,9 @@ + XLowerWindow(display, frame.window); + } else if (e->button == Button3) { + if (! slitmenu->isVisible()) { +- int x, y; +- +- x = e->x_root - (slitmenu->getWidth() / 2); +- y = e->y_root - (slitmenu->getHeight() / 2); +- +- if (x < 0) +- x = 0; +- else if (x + slitmenu->getWidth() > screen->getWidth()) +- x = screen->getWidth() - slitmenu->getWidth(); +- +- if (y < 0) +- y = 0; +- else if (y + slitmenu->getHeight() > screen->getHeight()) +- y = screen->getHeight() - slitmenu->getHeight(); +- +- slitmenu->move(x, y); ++ slitmenu->moveInScreen(e->x_root, e->y_root, ++ -static_cast<signed>(slitmenu->getWidth()) / 2, ++ -static_cast<signed>(slitmenu->getHeight()) / 2); + slitmenu->show(); + } else { + slitmenu->hide(); +--- blackbox-0.65.0.orig/src/Timer.hh ++++ blackbox-0.65.0/src/Timer.hh +@@ -98,9 +98,9 @@ + ~_timer_queue(void) {} + + void release(const _Tp& value) { +- c.erase(std::remove(c.begin(), c.end(), value), c.end()); ++ this->c.erase(std::remove(this->c.begin(), this->c.end(), value), this->c.end()); + // after removing the item we need to make the heap again +- std::make_heap(c.begin(), c.end(), comp); ++ std::make_heap(this->c.begin(), this->c.end(), this->comp); + } + bool empty(void) const { return _Base::empty(); } + size_t size(void) const { return _Base::size(); } +--- blackbox-0.65.0.orig/src/Toolbar.cc ++++ blackbox-0.65.0/src/Toolbar.cc +@@ -62,6 +62,7 @@ + #include "Clientmenu.hh" + #include "Workspacemenu.hh" + #include "Slit.hh" ++#include "Xinerama.hh" + + + static long aMinuteFromNow(void) { +@@ -198,8 +199,56 @@ + + + void Toolbar::reconfigure(void) { ++ Rect rect = screen->getRect(); ++ ++ if (screen->getXineramaInfo() && screen->doXineramaToolbar()) { ++ ++ XineramaScreen xinerama = ++ screen->getXineramaInfo()->getScreen(screen->getXineramaToolbarScreen()); ++ ++ if (! xinerama.isValid()) { ++ ++ XineramaList list; ++ switch (screen->getToolbarPlacement()) { ++ case TopLeft: ++ case TopRight: ++ case TopCenter: ++ screen->getXineramaInfo()->getTopScreens(list); ++ break; ++ case BottomLeft: ++ case BottomRight: ++ case BottomCenter: ++ default: ++ screen->getXineramaInfo()->getBottomScreens(list); ++ break; ++ } ++ ++ switch (screen->getToolbarPlacement()) { ++ case TopLeft: ++ case BottomLeft: ++ xinerama = *list.begin(); ++ break; ++ case TopRight: ++ case BottomRight: ++ xinerama = *list.rbegin(); ++ break; ++ case TopCenter: ++ case BottomCenter: ++ default: { ++ XineramaList::iterator itr = list.begin(); ++ for (int count = list.size()/2; count--; ++itr); ++ xinerama = *itr; ++ break; ++ } ++ } ++ screen->saveXineramaToolbarScreen(xinerama.getScreenNumber()); ++ } // end if (invalid xinerama screen) ++ ++ rect = xinerama.getRect(); ++ } // end if (xinerama) ++ + unsigned int height = 0, +- width = (screen->getWidth() * screen->getToolbarWidthPercent()) / 100; ++ width = (rect.width() * screen->getToolbarWidthPercent()) / 100; + + if (i18n.multibyte()) + height = screen->getToolbarStyle()->fontset_extents->max_ink_extent.height; +@@ -218,18 +267,25 @@ + int x, y; + switch (screen->getToolbarPlacement()) { + case TopLeft: ++ case BottomLeft: ++ x = rect.left(); ++ break; + case TopRight: +- case TopCenter: +- if (screen->getToolbarPlacement() == TopLeft) +- x = 0; +- else if (screen->getToolbarPlacement() == TopRight) +- x = screen->getWidth() - frame.rect.width() ++ case BottomRight: ++ x = rect.left() + rect.width() - frame.rect.width() + - (screen->getBorderWidth() * 2); +- else +- x = (screen->getWidth() - frame.rect.width()) / 2; +- +- y = 0; +- ++ break; ++ case TopCenter: ++ case BottomCenter: ++ default: ++ x = rect.left() + (rect.width() - frame.rect.width()) / 2; ++ break; ++ } ++ switch (screen->getToolbarPlacement()) { ++ case TopLeft: ++ case TopRight: ++ case TopCenter: ++ y = rect.top(); + frame.x_hidden = x; + frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth() + - frame.rect.height(); +@@ -239,19 +295,11 @@ + case BottomRight: + case BottomCenter: + default: +- if (screen->getToolbarPlacement() == BottomLeft) +- x = 0; +- else if (screen->getToolbarPlacement() == BottomRight) +- x = screen->getWidth() - frame.rect.width() +- - (screen->getBorderWidth() * 2); +- else +- x = (screen->getWidth() - frame.rect.width()) / 2; +- +- y = screen->getHeight() - frame.rect.height() ++ y = rect.bottom() - frame.rect.height() + - (screen->getBorderWidth() * 2); + + frame.x_hidden = x; +- frame.y_hidden = screen->getHeight() - screen->getBevelWidth() ++ frame.y_hidden = rect.bottom() - screen->getBevelWidth() + - screen->getBorderWidth(); + break; + } +@@ -758,22 +806,9 @@ + if (toolbarmenu->isVisible()) { + toolbarmenu->hide(); + } else { +- int x, y; +- +- x = be->x_root - (toolbarmenu->getWidth() / 2); +- y = be->y_root - (toolbarmenu->getHeight() / 2); +- +- if (x < 0) +- x = 0; +- else if (x + toolbarmenu->getWidth() > screen->getWidth()) +- x = screen->getWidth() - toolbarmenu->getWidth(); +- +- if (y < 0) +- y = 0; +- else if (y + toolbarmenu->getHeight() > screen->getHeight()) +- y = screen->getHeight() - toolbarmenu->getHeight(); +- +- toolbarmenu->move(x, y); ++ toolbarmenu->moveInScreen(be->x_root, be->y_root, ++ -static_cast<signed>(toolbarmenu->getWidth()) / 2, ++ -static_cast<signed>(toolbarmenu->getHeight()) / 2); + toolbarmenu->show(); + } + } +@@ -1069,21 +1104,88 @@ + : Basemenu(tm->toolbar->screen) { + setLabel(i18n(ToolbarSet, ToolbarToolbarPlacement, "Toolbar Placement")); + setInternalMenu(); +- setMinimumSublevels(3); ++ reconfigure(); ++} + +- insert(i18n(CommonSet, CommonPlacementTopLeft, "Top Left"), +- Toolbar::TopLeft); +- insert(i18n(CommonSet, CommonPlacementBottomLeft, "Bottom Left"), +- Toolbar::BottomLeft); +- insert(i18n(CommonSet, CommonPlacementTopCenter, "Top Center"), +- Toolbar::TopCenter); +- insert(i18n(CommonSet, CommonPlacementBottomCenter, "Bottom Center"), +- Toolbar::BottomCenter); +- insert(i18n(CommonSet, CommonPlacementTopRight, "Top Right"), +- Toolbar::TopRight); +- insert(i18n(CommonSet, CommonPlacementBottomRight, "Bottom Right"), +- Toolbar::BottomRight); ++void Toolbarmenu::Placementmenu::reconfigure(void) ++{ ++ for (int count = getCount(); count > 0; count = remove(count-1)); ++ ++ if (getScreen()->getXineramaInfo() && getScreen()->doXineramaToolbar()) { ++ char buffer[256]; ++ XineramaList top_list, bottom_list; ++ getScreen()->getXineramaInfo()->getTopScreens(top_list); ++ getScreen()->getXineramaInfo()->getBottomScreens(bottom_list); ++ int width = std::max(top_list.size(),bottom_list.size()) + 2; ++ setMinimumSublevels(width); ++ ++ XineramaList::const_iterator top = top_list.begin(); ++ XineramaList::const_iterator bottom = bottom_list.begin(); ++ ++ insert(i18n(CommonSet, CommonPlacementTopLeft, "Top Left"), ++ handleFromPlacement(Toolbar::TopLeft, top->getScreenNumber())); ++ insert(i18n(CommonSet, CommonPlacementBottomLeft, "Bottom Left"), ++ handleFromPlacement(Toolbar::BottomLeft, bottom->getScreenNumber())); ++ ++ for (int count = width - 2; count--; ) { ++ if (top != top_list.end()) { ++ sprintf(buffer, ++ i18n(ToolbarSet, ToolbarScreenTop, "Screen %d Top"), ++ top->getScreenNumber()); ++ insert(buffer, ++ handleFromPlacement(Toolbar::TopCenter,top->getScreenNumber())); ++ ++top; ++ } ++ else { ++ insert("",-2); ++ } ++ ++ if (bottom != bottom_list.end()) { ++ sprintf(buffer, ++ i18n(ToolbarSet, ToolbarScreenBottom, "Screen %d Bottom"), ++ bottom->getScreenNumber()); ++ insert(buffer, ++ handleFromPlacement(Toolbar::BottomCenter,bottom->getScreenNumber())); ++ ++bottom; ++ } ++ else { ++ insert("",-2); ++ } ++ } ++ ++ int last_scr = top_list.rbegin()->getScreenNumber(); ++ insert(i18n(CommonSet, CommonPlacementTopRight, "Top Right"), ++ handleFromPlacement(Toolbar::TopRight, last_scr)); ++ last_scr = bottom_list.rbegin()->getScreenNumber(); ++ insert(i18n(CommonSet, CommonPlacementBottomRight, "Bottom Right"), ++ handleFromPlacement(Toolbar::BottomRight, last_scr)); ++ ++ update(); ++ ++ for (int index = 0; index < static_cast<signed>(getCount()); index++) { ++ if (find(index)->function() == -2) { ++ setItemEnabled(index, false); ++ } ++ } ++ } ++ else { ++ setMinimumSublevels(3); ++ ++ insert(i18n(CommonSet, CommonPlacementTopLeft, "Top Left"), ++ Toolbar::TopLeft); ++ insert(i18n(CommonSet, CommonPlacementBottomLeft, "Bottom Left"), ++ Toolbar::BottomLeft); ++ insert(i18n(CommonSet, CommonPlacementTopCenter, "Top Center"), ++ Toolbar::TopCenter); ++ insert(i18n(CommonSet, CommonPlacementBottomCenter, "Bottom Center"), ++ Toolbar::BottomCenter); ++ insert(i18n(CommonSet, CommonPlacementTopRight, "Top Right"), ++ Toolbar::TopRight); ++ insert(i18n(CommonSet, CommonPlacementBottomRight, "Bottom Right"), ++ Toolbar::BottomRight); ++ } + update(); ++ Basemenu::reconfigure(); + } + + +@@ -1094,7 +1196,14 @@ + BasemenuItem *item = find(index); + if (! item) return; + +- getScreen()->saveToolbarPlacement(item->function()); ++ int placement = Placementmenu::placementFromHandle(item->function()); ++ getScreen()->saveToolbarPlacement(placement); ++ ++ if (getScreen()->getXineramaInfo() && getScreen()->doXineramaToolbar()) { ++ int xinerama = Placementmenu::xineramaFromHandle(item->function()); ++ getScreen()->saveXineramaToolbarScreen(xinerama); ++ } ++ + hide(); + getScreen()->getToolbar()->reconfigure(); + +--- blackbox-0.65.0.orig/src/Toolbar.hh ++++ blackbox-0.65.0/src/Toolbar.hh +@@ -47,6 +47,15 @@ + + public: + Placementmenu(Toolbarmenu *tm); ++ ++ inline static int handleFromPlacement(int placement, int xinerama_screen) ++ { return ((xinerama_screen+1) << 3) | placement; } ++ inline static int placementFromHandle(int handle) ++ { return handle & 0x7; } ++ inline static int xineramaFromHandle(int handle) ++ { return (handle >> 3)-1; } ++ ++ void reconfigure(void); + }; + + Toolbar *toolbar; +--- blackbox-0.65.0.orig/src/Util.hh ++++ blackbox-0.65.0/src/Util.hh +@@ -29,6 +29,14 @@ + + #include <string> + ++struct Point { ++ inline Point(void) : x(0), y(0) {} ++ inline Point(int set_x, int set_y) : x(set_x), y(set_y) {} ++ inline void set(int set_x, int set_y) ++ { x = set_x; y = set_y; } ++ int x, y; ++}; ++ + class Rect { + public: + inline Rect(void) : _x1(0), _y1(0), _x2(0), _y2(0) { } +@@ -51,6 +59,7 @@ + + inline unsigned int width(void) const { return _x2 - _x1 + 1; } + inline unsigned int height(void) const { return _y2 - _y1 + 1; } ++ inline int area(void) const { return width() * height(); } + void setWidth(unsigned int __w); + void setHeight(unsigned int __h); + void setSize(unsigned int __w, unsigned int __h); +@@ -71,6 +80,9 @@ + inline bool valid(void) const { return _x2 > _x1 && _y2 > _y1; } + + bool intersects(const Rect &a) const; ++ ++ inline bool contains( int x, int y ) const ++ { return (x >= _x1) && (x <= _x2) && (y >= _y1) && (y <= _y2); } + + private: + int _x1, _y1, _x2, _y2; +--- blackbox-0.65.0.orig/src/Window.cc ++++ blackbox-0.65.0/src/Window.cc +@@ -44,6 +44,8 @@ + #endif // HAVE_STDLIB_H + } + ++#include <cassert> ++ + #include "i18n.hh" + #include "blackbox.hh" + #include "GCCache.hh" +@@ -55,6 +57,7 @@ + #include "Window.hh" + #include "Windowmenu.hh" + #include "Workspace.hh" ++#include "Xinerama.hh" + + + /* +@@ -208,8 +211,16 @@ + client.normal_hint_flags & (PPosition|USPosition)) { + applyGravity(frame.rect); + +- if (blackbox->isStartup() || client.rect.intersects(screen->getRect())) ++ if (blackbox->isStartup()) { ++ place_window = False; ++ } ++ else if (s->getXineramaInfo() && s->doXineramaPlacement()) { ++ if (s->getXineramaInfo()->screenContaining(client.rect).isValid()) ++ place_window = False; ++ } ++ else if (client.rect.intersects(screen->getRect())) { + place_window = False; ++ } + } + + /* +@@ -1626,7 +1637,13 @@ + blackbox_attrib.premax_h = + client.rect.height() + frame.margin.top + frame.margin.bottom; + +- const Rect &screen_area = screen->availableArea(); ++ Rect screen_area = screen->availableArea(); ++ if (screen->getXineramaInfo() && screen->doXineramaMaximize()) { ++ XineramaScreen xinerama ++ = screen->getXineramaInfo()->screenContaining(frame.rect); ++ if (xinerama.isValid()) ++ screen_area &= xinerama.getRect(); ++ } + frame.changing = screen_area; + + switch(button) { +@@ -3288,6 +3305,7 @@ + do { + if (multibyte) { + XRectangle ink, logical; ++ if (text_len>100) text_len=100; + XmbTextExtents(fontset, text, text_len, &ink, &logical); + length = logical.width; + } else { +--- blackbox-0.65.0.orig/src/Workspace.cc ++++ blackbox-0.65.0/src/Workspace.cc +@@ -55,13 +55,12 @@ + #include "Window.hh" + #include "Workspace.hh" + #include "Windowmenu.hh" ++#include "Xinerama.hh" + + + Workspace::Workspace(BScreen *scrn, unsigned int i) { + screen = scrn; + +- cascade_x = cascade_y = 32; +- + id = i; + + clientmenu = new Clientmenu(this); +@@ -123,9 +122,6 @@ + for (; it != end; ++it, ++i) + (*it)->setWindowNumber(i); + +- if (i == 0) +- cascade_x = cascade_y = 32; +- + return i; + } + +@@ -548,8 +544,19 @@ + + bool Workspace::smartPlacement(Rect& win, const Rect& availableArea) { + rectList spaces; +- spaces.push_back(availableArea); //initially the entire screen is free + ++ // If xinerama info, initialize spaces to available xinerama screens ++ if (screen->getXineramaInfo() && screen->doXineramaPlacement()) { ++ const XineramaList& list = screen->getXineramaInfo()->getScreens(); ++ for (XineramaList::const_iterator itr = list.begin(); ++ itr != list.end(); ++itr) { ++ spaces.push_back(availableArea & itr->getRect()); ++ } ++ } ++ else { ++ spaces.push_back(availableArea); //initially the entire screen is free ++ } ++ + //Find Free Spaces + BlackboxWindowList::const_iterator wit = windowList.begin(), + end = windowList.end(); +@@ -621,17 +628,45 @@ + } + + +-bool Workspace::cascadePlacement(Rect &win, const Rect &availableArea) { +- if (cascade_x > (availableArea.width() / 2) || +- cascade_y > (availableArea.height() / 2)) +- cascade_x = cascade_y = 32; +- +- if (cascade_x == 32) { +- cascade_x += availableArea.x(); +- cascade_y += availableArea.y(); +- } +- +- win.setPos(cascade_x, cascade_y); ++bool Workspace::cascadePlacement(Rect &win, Rect availableArea, int offset) { ++ ++ // Place window in whichever xinerama screen contains the ++ // pointer. ++ int xinerama_screen = 0; ++ if (screen->getXineramaInfo() && screen->doXineramaPlacement()) { ++ int ptr_x, ptr_y, x, y; ++ Window c, r; ++ unsigned int m; ++ XQueryPointer(screen->getBaseDisplay()->getXDisplay(), ++ screen->getRootWindow(), ++ &r, &c, &ptr_x, &ptr_y, &x, &y, &m); ++ XineramaScreen xinerama = ++ screen->getXineramaInfo()->screenContaining(ptr_x, ptr_y); ++ if (! xinerama.isValid()) ++ xinerama = *(screen->getXineramaInfo()->getScreens().begin()); ++ xinerama_screen = xinerama.getScreenNumber(); ++ availableArea &= xinerama.getRect(); ++ } ++ ++ if (cascade_points.count(xinerama_screen) == 0) { ++ cascade_points[xinerama_screen] = Point(32,32); ++ } ++ Point& pos = cascade_points[xinerama_screen]; ++ ++ if (pos.x < (availableArea.left() + 32) || ++ pos.y < (availableArea.top() + 32) || ++ pos.x > (availableArea.left() + (int)availableArea.width() / 2) || ++ pos.y > (availableArea.top() + (int)availableArea.height() / 2)) ++ pos.x = pos.y = 32; ++ ++ if (pos.x == 32) { ++ pos.x += availableArea.x(); ++ pos.y += availableArea.y(); ++ } ++ ++ win.setPos(pos.x, pos.y); ++ pos.x += offset; ++ pos.y += offset; + + return True; + } +@@ -653,9 +688,8 @@ + } // switch + + if (placed == False) { +- cascadePlacement(new_win, availableArea); +- cascade_x += win->getTitleHeight() + (screen->getBorderWidth() * 2); +- cascade_y += win->getTitleHeight() + (screen->getBorderWidth() * 2); ++ cascadePlacement(new_win, availableArea, ++ win->getTitleHeight() + (screen->getBorderWidth() * 2)); + } + + if (new_win.right() > availableArea.right()) +--- blackbox-0.65.0.orig/src/Workspace.hh ++++ blackbox-0.65.0/src/Workspace.hh +@@ -51,7 +51,7 @@ + + std::string name; + unsigned int id; +- unsigned int cascade_x, cascade_y; ++ std::map<int,Point> cascade_points; + + Workspace(const Workspace&); + Workspace& operator=(const Workspace&); +@@ -62,7 +62,7 @@ + StackVector::iterator &stack); + + void placeWindow(BlackboxWindow *win); +- bool cascadePlacement(Rect& win, const Rect& availableArea); ++ bool cascadePlacement(Rect& win, Rect availableArea, int offset); + bool smartPlacement(Rect& win, const Rect& availableArea); + + public: +--- blackbox-0.65.0.orig/src/blackbox.cc ++++ blackbox-0.65.0/src/blackbox.cc +@@ -1094,6 +1094,26 @@ + screen_number, placement); + XrmPutLineResource(&new_blackboxrc, rc_string); + ++ // write out xinerama settings ++ sprintf(rc_string, "session.screen%d.xineramaPlacement: %s", ++ screen_number, screen->doXineramaPlacement() ? "True" : "False"); ++ XrmPutLineResource(&new_blackboxrc, rc_string); ++ sprintf(rc_string, "session.screen%d.xineramaMaximize: %s", ++ screen_number, screen->doXineramaMaximize() ? "True" : "False"); ++ XrmPutLineResource(&new_blackboxrc, rc_string); ++ sprintf(rc_string, "session.screen%d.xineramaMenuPlacement: %s", ++ screen_number, screen->doXineramaMenus() ? "True" : "False"); ++ XrmPutLineResource(&new_blackboxrc, rc_string); ++ sprintf(rc_string, "session.screen%d.slit.xineramaPlacement: %s", ++ screen_number, screen->doXineramaSlit() ? "True" : "False"); ++ XrmPutLineResource(&new_blackboxrc, rc_string); ++ sprintf(rc_string, "session.screen%d.toolbar.xineramaPlacement: %s", ++ screen_number, screen->doXineramaToolbar() ? "True" : "False"); ++ XrmPutLineResource(&new_blackboxrc, rc_string); ++ sprintf(rc_string, "session.screen%d.toolbar.xineramaScreen: %d", ++ screen_number, screen->getXineramaToolbarScreen()); ++ XrmPutLineResource(&new_blackboxrc, rc_string); ++ + load_rc(screen); + + // these are static, but may not be saved in the users .blackboxrc, +@@ -1215,7 +1235,6 @@ + } + } + +- + void Blackbox::load_rc(BScreen *screen) { + XrmDatabase database = (XrmDatabase) 0; + +@@ -1492,6 +1511,50 @@ + ! strncasecmp("true", value.addr, value.size)) { + screen->saveOpaqueMove(True); + } ++ ++ // load xinerama settings ++ sprintf(name_lookup, "session.screen%d.xineramaPlacement", screen_number); ++ sprintf(class_lookup, "Session.Screen%d.XineramaPlacement", screen_number); ++ screen->saveXineramaPlacement(true); ++ if ((XrmGetResource(database,name_lookup,class_lookup,&value_type,&value)) ++ && ! strncasecmp("false", value.addr, value.size)) { ++ screen->saveXineramaPlacement(false); ++ } ++ sprintf(name_lookup, "session.screen%d.xineramaMaximize", screen_number); ++ sprintf(class_lookup, "Session.Screen%d.XineramaMaximize", screen_number); ++ screen->saveXineramaMaximize(true); ++ if ((XrmGetResource(database,name_lookup,class_lookup,&value_type,&value)) ++ && ! strncasecmp("false", value.addr, value.size)) { ++ screen->saveXineramaMaximize(false); ++ } ++ sprintf(name_lookup, "session.screen%d.xineramaMenuPlacement", screen_number); ++ sprintf(class_lookup, "Session.Screen%d.XineramaMenuPlacement", screen_number); ++ screen->saveXineramaMenus(true); ++ if ((XrmGetResource(database,name_lookup,class_lookup,&value_type,&value)) ++ && ! strncasecmp("false", value.addr, value.size)) { ++ screen->saveXineramaMenus(false); ++ } ++ sprintf(name_lookup, "session.screen%d.slit.xineramaPlacement", screen_number); ++ sprintf(class_lookup, "Session.Screen%d.Slit.XineramaPlacement", screen_number); ++ screen->saveXineramaSlit(true); ++ if ((XrmGetResource(database,name_lookup,class_lookup,&value_type,&value)) ++ && ! strncasecmp("false", value.addr, value.size)) { ++ screen->saveXineramaSlit(false); ++ } ++ sprintf(name_lookup, "session.screen%d.toolbar.xineramaPlacement", screen_number); ++ sprintf(class_lookup, "Session.Screen%d.Toolbar.XineramaPlacement", screen_number); ++ screen->saveXineramaToolbar(true); ++ if ((XrmGetResource(database,name_lookup,class_lookup,&value_type,&value)) ++ && ! strncasecmp("false", value.addr, value.size)) { ++ screen->saveXineramaToolbar(false); ++ } ++ sprintf(name_lookup, "session.screen%d.toolbar.xineramaScreen", screen_number); ++ sprintf(class_lookup, "Session.Screen%d.Toolbar.XineramaScreen", screen_number); ++ screen->saveXineramaToolbarScreen(-1); ++ if ((XrmGetResource(database,name_lookup,class_lookup,&value_type,&value)) ++ && sscanf(value.addr, "%d", &int_value) == 1) { ++ screen->saveXineramaToolbarScreen(int_value); ++ } + + XrmDestroyDatabase(database); + } +--- blackbox-0.65.0.orig/src/Xinerama.cc ++++ blackbox-0.65.0/src/Xinerama.cc +@@ -0,0 +1,153 @@ ++// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- ++// Xinerama.cc for Blackbox - an X11 Window manager ++// Copyright (c) 2002 Jason Kraftcheck <kraftche@cae.wisc.edu> ++// ++// Permission is hereby granted, free of charge, to any person obtaining a ++// copy of this software and associated documentation files (the "Software"), ++// to deal in the Software without restriction, including without limitation ++// the rights to use, copy, modify, merge, publish, distribute, sublicense, ++// and/or sell copies of the Software, and to permit persons to whom the ++// Software is furnished to do so, subject to the following conditions: ++// ++// The above copyright notice and this permission notice shall be included in ++// all copies or substantial portions of the Software. ++// ++// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++// DEALINGS IN THE SOFTWARE. ++ ++ ++extern "C" { ++#include <X11/Xlib.h> ++#ifdef XINERAMA ++# include <X11/extensions/Xinerama.h> ++#endif ++} ++ ++#include "Xinerama.hh" ++#include "BaseDisplay.hh" ++ ++bool XineramaInfo::update(void) ++{ ++ screen_list.clear(); ++ ++#ifdef XINERAMA ++ int count; ++ XineramaScreenInfo* xinerama_list = XineramaQueryScreens( ++ screen_info->getBaseDisplay()->getXDisplay(), &count ); ++ if (xinerama_list) { ++ if (count > 1) { ++ for( int i = 0; i < count; i++ ) { ++ const XineramaScreenInfo& scr = xinerama_list[i]; ++ screen_list.push_back( XineramaScreen( scr.screen_number, ++ Rect( scr.x_org, scr.y_org, scr.width, scr.height ) ) ); ++ } ++ } ++ XFree(xinerama_list); ++ } ++#endif ++ ++ return haveXinerama(); ++} ++ ++XineramaScreen XineramaInfo::screenContaining( int x, int y ) const ++{ ++ XineramaList::const_iterator itr = getScreens().begin(), ++ end = getScreens().end(); ++ ++ for ( ; itr != end; ++itr) { ++ if (itr->getRect().contains(x,y)) ++ return *itr; ++ }; ++ ++ return XineramaScreen(); ++} ++ ++XineramaScreen XineramaInfo::screenContaining( const Rect& rect ) const ++{ ++ XineramaScreen result; ++ int area = 0; ++ XineramaList::const_iterator itr = getScreens().begin(), ++ end = getScreens().end(); ++ for ( ; itr != end; ++itr) { ++ if (itr->getRect().intersects(rect)) { ++ int a = (itr->getRect() & rect).area(); ++ if (a > area) { ++ result = *itr; ++ area = a; ++ } ++ } ++ } ++ return result; ++} ++ ++ ++XineramaScreen XineramaInfo::getScreen( int x_screen_number ) const ++{ ++ XineramaList::const_iterator itr = getScreens().begin(), ++ end = getScreens().end(); ++ for ( ; itr != end; ++itr) { ++ if (itr->getScreenNumber() == x_screen_number) ++ return *itr; ++ } ++ ++ return XineramaScreen(); ++} ++ ++ ++void XineramaInfo::getTopBottom( XineramaList& result, bool top ) const ++{ ++ for (XineramaList::const_iterator in_itr = screen_list.begin(); ++ in_itr != screen_list.end(); ++in_itr) { ++ ++ XineramaList::iterator out_itr = result.begin(); ++ while (out_itr != result.end() && ++ in_itr->getRect().left() >= out_itr->getRect().right()) ++ ++out_itr; ++ ++ if (out_itr == result.end()) { ++ result.push_back(*in_itr); ++ } ++ else if (in_itr->getRect().right() <= out_itr->getRect().left()) { ++ result.insert(out_itr,*in_itr); ++ } ++ else if ((!top && in_itr->getRect().bottom() > out_itr->getRect().bottom()) || ++ ( top && in_itr->getRect().top() < out_itr->getRect().top())) { ++ *out_itr = *in_itr; ++ } ++ } ++} ++ ++XineramaScreen XineramaInfo::getClosestScreen( int x, int y ) const ++{ ++ if (getScreens().empty()) ++ return XineramaScreen(); ++ ++ XineramaList::const_iterator itr = screen_list.begin(); ++ XineramaScreen result(*itr); ++ unsigned long dist_sqr = distanceSquared(itr->getRect(),x,y); ++ ++itr; ++ ++ for ( ; itr != screen_list.end(); ++itr) { ++ unsigned long ds = distanceSquared(itr->getRect(), x, y); ++ if (ds < dist_sqr) { ++ dist_sqr = ds; ++ result = *itr; ++ } ++ } ++ ++ return result; ++} ++ ++unsigned long XineramaInfo::distanceSquared(const Rect& rect,int x,int y) ++{ ++ unsigned long x_dist = (x < rect.left() ) ? rect.left() - x : ++ (x > rect.right() ) ? x - rect.right() : 0; ++ unsigned long y_dist = (y < rect.top() ) ? rect.top() - y : ++ (y > rect.bottom()) ? y - rect.bottom() : 0; ++ return x_dist * x_dist + y_dist * y_dist; ++} +--- blackbox-0.65.0.orig/src/Xinerama.hh ++++ blackbox-0.65.0/src/Xinerama.hh +@@ -0,0 +1,93 @@ ++// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- ++// Xinerama.hh for Blackbox - an X11 Window manager ++// Copyright (c) 2002 Jason Kraftcheck <kraftche@cae.wisc.edu> ++// ++// Permission is hereby granted, free of charge, to any person obtaining a ++// copy of this software and associated documentation files (the "Software"), ++// to deal in the Software without restriction, including without limitation ++// the rights to use, copy, modify, merge, publish, distribute, sublicense, ++// and/or sell copies of the Software, and to permit persons to whom the ++// Software is furnished to do so, subject to the following conditions: ++// ++// The above copyright notice and this permission notice shall be included in ++// all copies or substantial portions of the Software. ++// ++// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++// DEALINGS IN THE SOFTWARE. ++ ++#ifndef __Xinerama_hh ++#define __Xinerama_hh ++ ++#include <list> ++ ++#include "Util.hh" ++ ++class XineramaScreen; ++class ScreenInfo; ++ ++typedef std::list<XineramaScreen> XineramaList; ++ ++class XineramaScreen { ++private: ++ int x_screen; ++ Rect rect; ++ ++public: ++ inline XineramaScreen( int screen_number, const Rect& box ) ++ : x_screen(screen_number), rect(box) { } ++ ++ inline XineramaScreen(void) ++ : x_screen(-1) { } ++ ++ inline const Rect& getRect(void) const { return rect; } ++ inline int getScreenNumber(void) const { return x_screen; } ++ ++ inline bool operator==( const XineramaScreen& other ) const ++ { return x_screen == other.x_screen; } ++ ++ inline bool operator!=( const XineramaScreen& other ) const ++ { return x_screen != other.x_screen; } ++ ++ inline bool isValid(void) const { return x_screen >= 0; } ++}; ++ ++class XineramaInfo { ++private: ++ XineramaList screen_list; ++ ScreenInfo* screen_info; ++ ++protected: ++ void getTopBottom( XineramaList& result_list, bool top ) const; ++ ++ static unsigned long distanceSquared( const Rect& rect, int x, int y ); ++ ++public: ++ inline XineramaInfo( ScreenInfo* screen ) : screen_info(screen) ++ { update(); } ++ ++ inline bool haveXinerama(void) const ++ { return !screen_list.empty(); } ++ ++ inline const XineramaList& getScreens(void) const ++ { return screen_list; } ++ ++ bool update(void); ++ ++ XineramaScreen screenContaining( int x, int y ) const; ++ XineramaScreen screenContaining( const Rect& rect ) const; ++ XineramaScreen getScreen( int x_screen_number ) const; ++ XineramaScreen getClosestScreen( int x, int y ) const; ++ ++ inline void getTopScreens( XineramaList& result_list ) const ++ { getTopBottom( result_list, true ); } ++ ++ inline void getBottomScreens( XineramaList& result_list ) const ++ { getTopBottom( result_list, false ); } ++}; ++ ++#endif +--- blackbox-0.65.0.orig/util/Makefile.in ++++ blackbox-0.65.0/util/Makefile.in +@@ -79,7 +79,7 @@ + bin_PROGRAMS = bsetroot + + bsetroot_SOURCES = bsetroot.cc +-bsetroot_LDADD = ../src/BaseDisplay.o ../src/Color.o ../src/GCCache.o ../src/Texture.o ../src/Timer.o ../src/Image.o ../src/ImageControl.o ../src/i18n.o ../src/Util.o ++bsetroot_LDADD = ../src/BaseDisplay.o ../src/Color.o ../src/GCCache.o ../src/Texture.o ../src/Timer.o ../src/Image.o ../src/ImageControl.o ../src/i18n.o ../src/Util.o ../src/Xinerama.o + + MAINTAINERCLEANFILES = Makefile.in + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +--- blackbox-0.65.0.orig/debian/changelog ++++ blackbox-0.65.0/debian/changelog +@@ -0,0 +1,188 @@ ++blackbox (0.65.0-5) unstable; urgency=high ++ ++ * Fixed FTBFS with the missing build dependency on autoconf. ++ (closes: #291133) ++ ++ -- Bruno Barrera C. <bruno@debian.org> Tue, 18 Jan 2005 20:22:45 -0300 ++ ++blackbox (0.65.0-4) unstable; urgency=low ++ ++ * Fixed the string length problem. (closes: #178001) ++ * Added Xinerama support. (closes: #277517) ++ ++ -- Bruno Barrera C. <bruno@debian.org> Mon, 17 Jan 2005 23:27:56 -0300 ++ ++blackbox (0.65.0-3) unstable; urgency=low ++ ++ * Fixed FTBFS with gcc-3.4 (closes: #266642) ++ * debian/postinst now checks for the correct files to be removed ++ (blackbox-menu instead Blackbox-menu) ++ ++ -- Bruno Barrera C. <bruno.barrera@igloo.cl> Fri, 20 Aug 2004 21:44:55 -0400 ++ ++blackbox (0.65.0-2) unstable; urgency=low ++ ++ * New Maintainer (closes: #259585) ++ * Corrected menu-method coding (closes: #251237) ++ * Added a blackbox.desktop file. (closes: #257423) ++ * Completed the debian/copyright file. ++ ++ -- Bruno Barrera C. <bruno.barrera@igloo.cl> Fri, 16 Jul 2004 18:26:04 -0400 ++ ++blackbox (0.65.0-1.2) unstable; urgency=low ++ ++ * Non Maintainer Upload ++ * Patch by Matt Kraai to solve FTBFS: Closes: #208814. ++ ++ -- Jesus Climent <jesus.climent@hispalinux.es> Wed, 15 Oct 2003 15:38:53 +0300 ++ ++blackbox (0.65.0-1.1) unstable; urgency=low ++ ++ * Non Maintainer Upload ++ * Include <cassert> in src/Window.cc (Closes: #196245) ++ ++ -- David Pashley <david@davidpashley.com> Tue, 15 Jul 2003 16:36:04 +0200 ++ ++blackbox (0.65.0-1) unstable; urgency=low ++ ++ * new upstream release ++ * now has man pages for all binaries, closes: #93427 ++ * newer version of bsetbg behaves much better, closes: #109606 ++ * tilde expansion in blackboxrc and menus is now supported, closes: #139330 ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Wed, 18 Sep 2002 11:02:00 -0700 ++ ++blackbox (0.65.0-0.pre1) unstable; urgency=low ++ ++ * temporary deb ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Fri, 6 Sep 2002 19:33:37 -0700 ++ ++blackbox (0.62.1-1) unstable; urgency=low ++ ++ * new upstream release ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Wed, 30 Jan 2002 22:17:06 -0800 ++ ++blackbox (0.62.0-1) unstable; urgency=low ++ ++ * new upstream ++ * I am now the upstream (-: ++ * upstream fixes these, Closes: #72254, #103909, #116767 ++ * Documented update-menu and blackbox behaviour (closes: #117386) ++ * Added README.menu and .style (closes: #81008) ++ * removed empty dir (closes: #78777) ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Sat, 19 Jan 2002 11:22:06 -0800 ++ ++blackbox (0.61.1-1.1) unstable; urgency=low ++ ++ * NMU ++ * Fix unsafe temp files in bsetbg. Closes: #102126 ++ * Add class key as needed, printf is a macro as of gcc 3.0. Closes: #105452 ++ ++ -- LaMont Jones <lamont@smallone.fc.hp.com> Sun, 15 Jul 2001 23:29:46 -0600 ++ ++blackbox (0.61.1-1) unstable; urgency=low ++ ++ * New upstream release ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Mon, 9 Oct 2000 10:10:31 -0700 ++ ++blackbox (0.61.0-3) unstable; urgency=low ++ ++ * Changed menu-method to call x-terminal-emulator instead of xterm ++ * Closes: #71981 ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Wed, 20 Sep 2000 11:41:45 -0700 ++ ++blackbox (0.61.0-2) unstable; urgency=low ++ ++ * removed echo from the postinst ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Thu, 31 Aug 2000 11:35:39 -0700 ++ ++blackbox (0.61.0-1) unstable; urgency=low ++ ++ * New upstream ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Fri, 18 Aug 2000 13:29:31 -0700 ++ ++blackbox (0.61.0.20000806-1) unstable; urgency=low ++ ++ * New upstream ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Mon, 7 Aug 2000 10:19:22 -0700 ++ ++blackbox (0.61.0.20000726-2) unstable; urgency=low ++ ++ * Oops, forgot to re-run autofriends ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Wed, 26 Jul 2000 16:39:15 -0700 ++ ++blackbox (0.61.0.20000726-1) unstable; urgency=low ++ ++ * New upstream beta ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Wed, 26 Jul 2000 13:10:07 -0700 ++ ++blackbox (0.60.3-5) unstable; urgency=low ++ ++ * Fix for improper quoting of rootCommand ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Thu, 20 Jul 2000 21:41:11 -0700 ++ ++blackbox (0.60.3-4) unstable; urgency=low ++ ++ * Bug fix release ++ * added a CXXFLAGS setting to the rules file. This makes blackbox smaller ++ and faster. ++ * Closes: #45298, #55305, #61552, #64615, #64773, #64851, #64969 ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Tue, 18 Jul 2000 13:01:43 -0700 ++ ++blackbox (0.60.3-3) unstable; urgency=low ++ ++ * Oops, left the stylesmenu file ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Sat, 27 May 2000 19:40:41 -0700 ++ ++blackbox (0.60.3-2) unstable; urgency=low ++ ++ * Oops, left a call to update-bbstyles ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Fri, 26 May 2000 16:12:27 -0700 ++ ++blackbox (0.60.3-1) unstable; urgency=low ++ ++ * New upstream release ++ * Changed user style menu to look in ~/.blackbox/styles to match ++ current practice among style authors ++ * Cleaned up menu-method script and thus the resulting menu file it ++ generates ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Fri, 26 May 2000 12:08:34 -0700 ++ ++blackbox (0.60.2-2) unstable; urgency=low ++ ++ * Removed update-styles ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Thu, 25 May 2000 14:02:15 -0700 ++ ++blackbox (0.60.2-1) unstable; urgency=low ++ ++ * New upstream release ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Thu, 25 May 2000 12:55:42 -0700 ++ ++blackbox (0.60.0.alpha-2) unstable; urgency=low ++ ++ * New maintainer ++ ++ -- Sean 'Shaleh' Perry <shaleh@debian.org> Thu, 25 May 2000 11:50:49 -0700 ++ ++blackbox (0.60.0.alpha-1) unstable; urgency=low ++ ++ * The Alpha release. ++ ++ -- Brent A. Fulgham <bfulgham@debian.org> Sat, 22 April 2000 13:32:08 -0800 +--- blackbox-0.65.0.orig/debian/conffiles ++++ blackbox-0.65.0/debian/conffiles +@@ -0,0 +1 @@ ++/etc/menu-methods/blackbox +--- blackbox-0.65.0.orig/debian/control ++++ blackbox-0.65.0/debian/control +@@ -0,0 +1,26 @@ ++Source: blackbox ++Section: x11 ++Priority: optional ++Build-Depends: autoconf, xlibs-dev, debhelper ++Maintainer: Bruno Barrera C. <bruno@debian.org> ++Standards-Version: 3.5.0 ++ ++Package: blackbox ++Architecture: any ++Depends: ${shlibs:Depends} ++Provides: x-window-manager ++Suggests: menu (>=1.5) ++Description: Window manager for X ++ This is a window manager for X. It is similar in many respects to ++ such popular packages as Window Maker, Enlightenment, and FVWM2. You ++ might be interested in this package if you are tired of window managers ++ that are a heavy drain on your system resources, but you still want ++ an attractive and modern-looking interface. ++ . ++ The best part of all is that this program is coded in C++, so it ++ is even more attractive "under the hood" than it is in service -- no ++ small feat. ++ . ++ If none of this sounds familiar to you, or you want your computer to ++ look like Microsoft Windows or Apple's OS X, you probably don't want ++ this package. +--- blackbox-0.65.0.orig/debian/copyright ++++ blackbox-0.65.0/debian/copyright +@@ -0,0 +1,37 @@ ++This package was debianized by Brent A. Fulgham bfulgham@debian.org on ++Thu, 15 Oct 1998 18:17:09 -0700. ++ ++It was downloaded from http://sf.net/projects/blackboxwm ++ ++Upstream Authors: Sean 'Shaleh' Perry <shaleh@debian.org> ++ Brad Hughes <bhughes@trolltech.com> ++ Jeff Raven <jraven@psu.edu> ++ ++Copyright: ++ ++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. 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. +--- blackbox-0.65.0.orig/debian/dirs ++++ blackbox-0.65.0/debian/dirs +@@ -0,0 +1,10 @@ ++etc/menu-methods ++etc/X11/blackbox ++usr/bin ++usr/share/man/man1 ++usr/share/doc ++usr/share/doc/blackbox ++usr/share/blackbox ++usr/share/blackbox/styles ++usr/share/blackbox/nls ++usr/share/xsessions +--- blackbox-0.65.0.orig/debian/docs ++++ blackbox-0.65.0/debian/docs +@@ -0,0 +1 @@ ++AUTHORS README README.bsetbg data/README.menu data/README.style +--- blackbox-0.65.0.orig/debian/menu ++++ blackbox-0.65.0/debian/menu +@@ -0,0 +1,24 @@ ++?package(blackbox):needs="wm" \ ++ section="WindowManagers" title="Blackbox" \ ++ command="/usr/bin/blackbox" ++?package(blackbox):needs="blackbox" \ ++ section="WindowManagers" title="Exit" \ ++ command="exit" ++?package(blackbox):needs="blackbox" \ ++ section="WindowManagers" title="Reconfigure" \ ++ command="reconfig" ++?package(blackbox):needs="blackbox" \ ++ section="WindowManagers" title="Restart" \ ++ command="restart" ++?package(blackbox):needs="blackbox" \ ++ section="Blackbox/Styles" title="/usr/share/blackbox/styles" \ ++ command="stylesdir" ++?package(blackbox):needs="blackbox" \ ++ section="Blackbox/Styles" title="~/.blackbox/styles" \ ++ command="stylesdir" ++?package(blackbox):needs="blackbox" \ ++ section="Blackbox" title="Workspaces" \ ++ command="workspaces" ++?package(blackbox):needs="blackbox" \ ++ section="Blackbox" title="Configuration" \ ++ command="config" +--- blackbox-0.65.0.orig/debian/menu-method ++++ blackbox-0.65.0/debian/menu-method +@@ -0,0 +1,27 @@ ++#!/usr/sbin/install-menu ++# ++# Generates blackbox menus for all registered applications. ++ ++!include menu.h ++compat="menu-1" ++outputencoding="LOCALE" ++ ++genmenu="blackbox-menu" ++rootprefix="/etc/X11/blackbox/" ++userprefix=".blackbox/" ++treewalk="M)" ++ ++supported ++ x11= nstring(level(), " ") "[exec] (" esc(title(), "()") ") {" esc($command, "()") "}\n" ++ wm= nstring(level(), " ") "[restart] (" esc(title(), "()") ") {" esc($command, "()") "}\n" ++ text= nstring(level(), " ") "[exec] (" esc(title(), "()") ") {" esc(term(), "()") "}\n" ++blackbox= nstring(level(), " ") "[" esc($command, "()") "] (" esc(title(), "()") ")\n" ++endsupported ++ ++preoutput= \ ++ "# Automatically generated file. Do not edit (see /usr/share/doc/menu/README)\n\n[begin] (Debian)\n" ++ ++startmenu= "" ++submenutitle= nstring(level(), " ") "[submenu] (" esc(title(),"()") ") {" esc($longtitle,"()") "}\n" ++endmenu= nstring(level(), " ") "[end]\n" ++ +--- blackbox-0.65.0.orig/debian/postinst ++++ blackbox-0.65.0/debian/postinst +@@ -0,0 +1,49 @@ ++#!/bin/sh ++# ++# Blackbox postinst ++# ++# Shamelessly ripped off of Marcelo Magallon's script ++# by Brent Fulgham <bfulgham@debian.org> ++# ++set -e ++ ++WMentry="/usr/bin/blackbox" ++ ++add_wm_entry () ++{ ++ update-alternatives --install /usr/bin/x-window-manager x-window-manager $WMentry 50 \ ++ --slave /usr/share/man/man1/x-window-manager.1.gz x-window-manager.1.gz /usr/share/man/man1/blackbox.1.gz ++} ++ ++case "$1" in ++ configure) ++ if [ "$2" ] && dpkg --compare-versions $2 le 0.51.3-12; then ++ update-alternatives --remove x-window-manager /etc/X11/window-managers ++ fi ++ ++ add_wm_entry ++ ++ # clean up after eaarlier debs ++ if [ -f /usr/share/blackbox/styles/stylesmenu ]; then ++ rm /usr/share/blackbox/styles/stylesmenu ++ fi ++ ++ if [ -f /etc/X11/blackbox/blackbox-menu ]; then ++ rm /etc/X11/blackbox/blackbox-menu ++ fi ++ ++ if [ -x /usr/sbin/wm-menu-config ]; then ++ wm-menu-config blackbox on; ++ fi ++ ;; ++ ++ abort-upgrade|abort-deconfigure|abort-remove) ++ # how did we get here? Force a non-zero exit code ++ exit 1 ++ ;; ++ ++ *) ++ ;; ++esac ++ ++#DEBHELPER# +--- blackbox-0.65.0.orig/debian/postrm ++++ blackbox-0.65.0/debian/postrm +@@ -0,0 +1,24 @@ ++#!/bin/sh ++set -e ++ ++Blackbox_entry="/usr/bin/blackbox" ++ ++case "$1" in ++ purge) ++ rm -rf /etc/X11/blackbox ++ ;; ++ remove) ++ if [ -x /usr/sbin/wm-menu-config ]; then ++ wm-menu-config blackbox off ++ fi ++ ++ if [ -x /usr/sbin/register-window-manager ] ; then ++ register-window-manager --remove $Blackbox_entry ++ fi ++ ++ ;; ++ *) ++ ;; ++esac ++ ++#DEBHELPER# +--- blackbox-0.65.0.orig/debian/rules ++++ blackbox-0.65.0/debian/rules +@@ -0,0 +1,71 @@ ++#!/usr/bin/make -f ++# MAde with the aid of dh_make, by Craig Small ++# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. ++# Some lines taken from debmake, by Cristoph Lameter. ++ ++# Uncomment this to turn on verbose mode. ++#export DH_VERBOSE=1 ++ ++PACKAGE=blackbox ++ ++build: build-stamp ++build-stamp: ++ dh_testdir ++ autoconf ++ CXXFLAGS="-O2 -fno-rtti -fno-exceptions -fno-check-new" ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc/X11/blackbox ++ ++ # Add here commands to compile the package. ++ $(MAKE) DEFAULT_MENU=/etc/X11/blackbox/blackbox-menu ++ ++ touch build-stamp ++ ++clean: ++ dh_testdir ++ dh_testroot ++ rm -f build-stamp install-stamp config.log ++ ++ # Add here commands to clean up after the build process. ++ -$(MAKE) distclean ++ ++ dh_clean ++ ++ ++install: install-stamp ++install-stamp: build-stamp ++ dh_testdir ++ dh_testroot ++ dh_clean -k ++ dh_installdirs ++ ++ # Add here commands to install the package into debian/tmp. ++ $(MAKE) install DESTDIR=`pwd`/debian/tmp ++ # make install places a menu here, but we don't want it ++ rm -f `pwd`/debian/tmp/usr/share/blackbox/menu ++ cp debian/blackbox.desktop `pwd`/debian/tmp/usr/share/xsessions/ ++ touch install-stamp ++ ++# Build architecture-independent files here. ++binary-indep: build install ++# We have nothing to do by default. ++ ++# Build architecture-dependent files here. ++binary-arch: build install ++ dh_testdir ++ dh_testroot ++ dh_installdocs ++ dh_installmenu ++ dh_installchangelogs ChangeLog ++ dh_strip ++ dh_compress ++ dh_fixperms ++ dh_installdeb ++ dh_shlibdeps ++ dh_gencontrol ++ dh_md5sums ++ dh_builddeb ++ ++source diff: ++ @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false ++ ++binary: binary-indep binary-arch ++.PHONY: build clean binary-indep binary-arch binary +--- blackbox-0.65.0.orig/debian/prerm ++++ blackbox-0.65.0/debian/prerm +@@ -0,0 +1,13 @@ ++#!/bin/sh ++set -e ++ ++case "$1" in ++ remove) ++ update-alternatives --remove x-window-manager /usr/bin/blackbox ++ ;; ++ *) ++ ;; ++esac ++ ++#DEBHELPER# ++ +--- blackbox-0.65.0.orig/debian/README.debian ++++ blackbox-0.65.0/debian/README.debian +@@ -0,0 +1,9 @@ ++User menus: ++ ++When update-menus is run as a user it will create ~/.blackbox-menu. You then ++need to exit blackbox if it is running and edit ~/.blackboxrc. Change the ++line: ++ ++session.menuFile: /etc/X11/blackbox/blackbox-menu ++ ++to point to the new file. +--- blackbox-0.65.0.orig/debian/blackbox.desktop ++++ blackbox-0.65.0/debian/blackbox.desktop +@@ -0,0 +1,12 @@ ++[Desktop Entry] ++Encoding=UTF-8 ++Name=Blackbox ++Comment=Highly configurable and low resource X11 Window manager ++Exec=blackbox ++Terminal=False ++TryExec=blackbox ++Type=Application ++ ++[Window Manager] ++SessionManaged=true ++ diff --git a/source/xap/blackbox/slack-desc b/source/xap/blackbox/slack-desc new file mode 100644 index 00000000..a459e577 --- /dev/null +++ b/source/xap/blackbox/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +blackbox: blackbox (Blackbox window manager) +blackbox: +blackbox: Blackbox is that fast, light window manager you have been looking for +blackbox: without all those annoying library dependencies. +blackbox: +blackbox: Also included in this package is the bbkeys utility for controlling +blackbox: keyboard shortcut commands from within Blackbox. +blackbox: +blackbox: The Blackbox home page is http://blackboxwm.sourceforge.net +blackbox: +blackbox: diff --git a/source/xap/blackbox/xinitrc.blackbox b/source/xap/blackbox/xinitrc.blackbox new file mode 100644 index 00000000..e5822118 --- /dev/null +++ b/source/xap/blackbox/xinitrc.blackbox @@ -0,0 +1,28 @@ +#!/bin/sh +# $XConsortium: xinitrc.cpp,v 1.4 91/08/22 11:41:34 rws Exp $ + +userresources=$HOME/.Xresources +usermodmap=$HOME/.Xmodmap +sysresources=/usr/lib/X11/xinit/.Xresources +sysmodmap=/usr/lib/X11/xinit/.Xmodmap + +# merge in defaults and keymaps + +if [ -f $sysresources ]; then + xrdb -merge $sysresources +fi + +if [ -f $sysmodmap ]; then + xmodmap $sysmodmap +fi + +if [ -f $userresources ]; then + xrdb -merge $userresources +fi + +if [ -f $usermodmap ]; then + xmodmap $usermodmap +fi + +# Start the window manager: +exec /usr/bin/blackbox diff --git a/source/xap/electricsheep/README.slackware b/source/xap/electricsheep/README.slackware new file mode 100644 index 00000000..3476cb67 --- /dev/null +++ b/source/xap/electricsheep/README.slackware @@ -0,0 +1,29 @@ +ElectricSheep 2.6.9 +=================== + +Electricsheep can no longer be configured from within the KDE4 screensaver +preferences dialog. Instead, a separate "electricsheep-preferences" +should be used now. The KDE4 screensaver file has been updated to reflect +this change. + +The configuration application, "electricsheep-preferences", will now +display when you push the "setup" button in the screensaver settings in +KDE4 System Settings. The sheep also play in the small preview window +within the System Settings dialog window. + +The "test" button does not work correctly. If you press it, the sheep +will play, but the window in which the animation runs will not stretch +to fullscreen. + +The sheep will play in full screen as expected when the real screensaver +activates after the configured period of idle time. Shake the mouse and +it stops. + +Electricsheep requires MPlayer to display your sheep! In some cases, +the mplayer window may not close after stopping the screensaver. This will +prevent electricsheep to play new sheep when the screensaver activates again. +The solution (it is not a real solution I know) is to kill mplayer with +ksysguard or the commandline "kill". + +============================================================================= +Eric Hameleers <alien@slackware.com> :: 07jan2009 diff --git a/source/xap/electricsheep/electricsheep.SlackBuild b/source/xap/electricsheep/electricsheep.SlackBuild new file mode 100755 index 00000000..1ed540cd --- /dev/null +++ b/source/xap/electricsheep/electricsheep.SlackBuild @@ -0,0 +1,266 @@ +#!/bin/sh + +# Copyright 2008, 2009 Eric Hameleers, Eindhoven, Netherlands +# Copyright 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Permission to use, copy, modify, and distribute this software for +# any purpose with or without fee is hereby granted, provided that +# the above copyright notice and this permission notice appear in all +# copies. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR +# 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. +# ----------------------------------------------------------------------------- +# +# Slackware SlackBuild script +# =========================== +# By: Eric Hameleers <alien@slackware.com> +# For: electricsheep +# Descr: distributed screensaver +# URL: http://electricsheep.org/ +# Needs: MPlayer (to display the sheep) +# ----------------------------------------------------------------------------- + +PRGNAM=electricsheep +VERSION=${VERSION:-20090306} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-2} + +# Where do we look for sources? +SRCDIR=$(cd $(dirname $0); pwd) + +DOCS="COPYING README $SRCDIR/README.slackware" +DOCS_FLAM3="COPYING* README*" +DOCS_FFMPEG="COPYING* CREDITS Changelog MAINTAINERS README" + +SOURCE="$SRCDIR/${PRGNAM}-${VERSION}.tar.xz" +SRCURL="" + +# Place to build (TMP) package (PKG) and output (OUTPUT) the program: +TMP=${TMP:-/tmp/build} +PKG=$TMP/package-$PRGNAM +OUTPUT=${OUTPUT:-/tmp} + +# Use the src_checkout() function if no downloadable tarball exists. +# This function checks out sources from SVN/CVS and creates a tarball of them. +src_checkout() { + # Param #1 : index in the SOURCE[] array. + # Param #2 : full path to where SOURCE[$1] tarball should be created. + # Determine the tarball extension: + PEXT=$(echo "${2}" | sed -r -e 's/.*[^.].(tar.xz|tar.gz|tar.bz2|tgz).*/\1/') + case "$PEXT" in + "tar.xz") TARCOMP="J" ;; + "tar.gz") TARCOMP="z" ;; + "tgz") TARCOMP="z" ;; + "tar.bz2") TARCOMP="j" ;; + *) echo "Archive can only have extension 'tar.xz', '.tar.gz' '.tar.bz2' or '.tgz'" ; exit 1 ;; + esac + case ${1} in + 0) # electricsheep-$VERSION + REV="{${VERSION}}" + mkdir electricsheep-${VERSION} \ + && cd electricsheep-${VERSION} \ + && svn checkout --revision $REV http://electricsheep.svn.sourceforge.net/svnroot/electricsheep/trunk/client client \ + && svn checkout --revision $REV http://flam3.svn.sourceforge.net/svnroot/flam3/trunk/src flam3 \ + && find . -type d -name '.svn' -depth | xargs rm -rf \ + && chown -R root:root . \ + && ( cd ..; tar -${TARCOMP}cf ${2} electricsheep-${VERSION} ) + cd .. + rm -rf electricsheep-${VERSION} + ;; + *) # do nothing + ;; + esac +} +## +## --- with a little luck, you won't have to edit below this point --- ## +## + +# Exit the script on errors: +set -e +trap 'echo "$0 FAILED at line ${LINENO}" | tee $OUTPUT/error-${PRGNAM}.log' ERR +# Catch unitialized variables: +set -u +P1=${1:-1} + +case "$ARCH" in + i486) SLKCFLAGS="-O2 -march=i486 -mtune=i686" + SLKLDFLAGS=""; LIBDIRSUFFIX="" + ;; + s390) SLKCFLAGS="-O2" + SLKLDFLAGS=""; LIBDIRSUFFIX="" + ;; + powerpc) SLKCFLAGS="-O2" + SLKLDFLAGS=""; LIBDIRSUFFIX="" + ;; + x86_64) SLKCFLAGS="-O2 -fPIC" + SLKLDFLAGS="-L/usr/lib64"; LIBDIRSUFFIX="64" + ;; + athlon-xp) SLKCFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer" + SLKLDFLAGS=""; LIBDIRSUFFIX="" + ;; + arm) SLKCFLAGS="-O2 -march=armv4 -mtune=xscale" + SLKLDFLAGS=""; LIBDIRSUFFIX="" + ;; + armel) SLKCFLAGS="-O2 -march=armv4t" + SLKLDFLAGS=""; LIBDIRSUFFIX="" + ;; +esac + +# Create working directories: +mkdir -p $OUTPUT # place for the package to be saved +mkdir -p $TMP/tmp-$PRGNAM # location to build the source +mkdir -p $PKG # place for the package to be built +rm -rf $PKG/* # always erase old package's contents +rm -rf $TMP/tmp-$PRGNAM/* # remove the remnants of previous build +rm -rf $OUTPUT/{configure,make,install,error,makepkg}-$PRGNAM.log + # remove old log files + +# Source file availability: +if ! [ -f ${SOURCE} ]; then + echo "Source '$(basename ${SOURCE})' not available yet..." + # Check if the $SRCDIR is writable at all - if not, download to $OUTPUT + [ -w "$SRCDIR" ] || SOURCE="$OUTPUT/$(basename ${SOURCE})" + if ! [ "x${SRCURL}" == "x" ]; then + echo "Will download file to $(dirname $SOURCE)" + wget -nv -T 20 -O "${SOURCE}" "${SRCURL}" || true + if [ $? -ne 0 -o ! -s "${SOURCE}" ]; then + echo "Downloading '$(basename ${SOURCE})' failed.. aborting the build." + mv -f "${SOURCE}" "${SOURCE}".FAIL + exit 1 + fi + else + # Try if we have a SVN/CVS download routine for ${SOURCE} + echo "Will checkout sources to $(dirname $SOURCE)" + src_checkout 0 "${SOURCE}" 2>&1 > $OUTPUT/checkout-$(basename ${SOURCE}).log + fi + if [ ! -f "${SOURCE}" -o ! -s "${SOURCE}" ]; then + echo "File '$(basename ${SOURCE})' not available.. aborting the build." + exit 1 + fi +fi + +if [ "$P1" == "--download" ]; then + echo "Download complete." + exit 0 +fi + +# --- PACKAGE BUILDING --- + +echo "++" +echo "|| $PRGNAM-$VERSION" +echo "++" + +cd $TMP/tmp-$PRGNAM +echo "Extracting the source archive(s) for $PRGNAM..." +tar -xvf ${SOURCE} +cd ${PRGNAM}-${VERSION} +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +echo Building ... +# First the client: +cd client + # mplayer needs a buffer when reading from a pipe: + zcat $SRCDIR/electricsheep.mplayer.diff.gz | patch -p2 --verbose || exit 1 + # To prevent an error later on: + chmod +x ffmpeg/doc/texi2pod.pl + # We do not use gnome: + cat $SRCDIR/electricsheep_gnome-open.patch | patch -p1 --verbose \ + 2>&1 | tee $OUTPUT/patch-$PRGNAM.log + # Prevent install errors due to missing gnome + sed -i -e "/^install-data-local:/,/^$/d" Makefile.in + LDFLAGS="$SLKLDFLAGS" \ + CXXFLAGS="$SLKCFLAGS" \ + CFLAGS="$SLKCFLAGS" \ + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --build=$ARCH-slackware-linux \ + 2>&1 | tee $OUTPUT/configure-${PRGNAM}.log + make 2>&1 | tee $OUTPUT/make-${PRGNAM}.log + make DESTDIR=$PKG install 2>&1 |tee $OUTPUT/install-${PRGNAM}.log +cd .. +# Then the flam3 (fractal flames) renderer: +cd flam3 + LDFLAGS="$SLKLDFLAGS" \ + CXXFLAGS="$SLKCFLAGS" \ + CFLAGS="$SLKCFLAGS" \ + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --build=$ARCH-slackware-linux \ + 2>&1 | tee $OUTPUT/configure-${PRGNAM}.log + make 2>&1 | tee $OUTPUT/make-${PRGNAM}.log + make DESTDIR=$PKG install 2>&1 |tee $OUTPUT/install-${PRGNAM}.log +cd .. + +# Add documentation: +mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/{flam3,ffmpeg} +( cd client + cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION +) +( cd client/ffmpeg + cp -a $DOCS_FFMPEG $PKG/usr/doc/$PRGNAM-$VERSION/ffmpeg +) +( cd flam3 + cp -a $DOCS_FLAM3 $PKG/usr/doc/$PRGNAM-$VERSION/flam3 +) +chown -R root:root $PKG/usr/doc/$PRGNAM-$VERSION +find $PKG/usr/doc -type f -exec chmod 644 {} \; + +cd client + # Add xscreensaver module: + mkdir -p $PKG/usr/share/xscreensaver/config + install -m644 electricsheep.xml \ + $PKG/usr/share/xscreensaver/config/electricsheep.xml + + # Add the KDE4 screensaver file: + install -D -m644 electricsheep.desktop.kde \ + ${PKG}/usr/share/kde4/services/ScreenSavers/electricsheep.desktop + sed -i -e 's/^X-KDE-Category=.*$/X-KDE-Category=Fractals/' \ + ${PKG}/usr/share/kde4/services/ScreenSavers/electricsheep.desktop + + # Add icons: + mkdir -p $PKG/usr/share/electricsheep + cp -a electricsheep-{smile,frown}.png $PKG/usr/share/electricsheep/ +cd .. + +# Compress the man page(s) +if [ -d $PKG/usr/man ]; then + find $PKG/usr/man -type f -name "*.?" -exec gzip -9f {} \; + for i in $(find $PKG/usr/man -type l -name "*.?") ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done +fi + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Add a package description: +mkdir -p $PKG/install +cat $SRCDIR/slack-desc > $PKG/install/slack-desc + +# Build the package: +cd $PKG +makepkg --linkadd y --chown n $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}.txz 2>&1 | tee $OUTPUT/makepkg-${PRGNAM}.log +cd $OUTPUT +md5sum ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}.txz > ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}.txz.md5 +cd - +cat $PKG/install/slack-desc | grep "^${PRGNAM}" > $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}.txt diff --git a/source/xap/electricsheep/electricsheep.mplayer.diff b/source/xap/electricsheep/electricsheep.mplayer.diff new file mode 100644 index 00000000..6fe7c4ce --- /dev/null +++ b/source/xap/electricsheep/electricsheep.mplayer.diff @@ -0,0 +1,12 @@ +diff -uar electricsheep-20090306.orig/client/electricsheep.c electricsheep-20090306/client/electricsheep.c +--- electricsheep-20090306.orig/client/electricsheep.c 2009-03-06 01:30:18.000000000 +0100 ++++ electricsheep-20090306/client/electricsheep.c 2009-07-01 21:53:21.000000000 +0200 +@@ -1946,6 +1946,8 @@ + } + argv[c++] = "mplayer"; + argv[c++] = "-really-quiet"; ++ argv[c++] = "-cache"; ++ argv[c++] = "8192"; + if (window_id) { + argv[c++] = "-monitoraspect"; + argv[c++] = monitoraspect; diff --git a/source/xap/electricsheep/electricsheep_gnome-open.patch b/source/xap/electricsheep/electricsheep_gnome-open.patch new file mode 100644 index 00000000..e86ec495 --- /dev/null +++ b/source/xap/electricsheep/electricsheep_gnome-open.patch @@ -0,0 +1,13 @@ +--- electricsheep-20090107/electricsheep-preferences.c.orig 2009-01-07 14:36:30.000000000 +0100 ++++ electricsheep-20090107/electricsheep-preferences.c 2009-01-07 17:27:34.000000000 +0100 +@@ -115,8 +115,8 @@ + } + + void on_helpButton_clicked(GtkWidget *widget, gpointer user_data) { +- if (system("gnome-open http://electricsheep.org/client/LNX_" VERSION ".html &")) +- perror("gnome-open"); ++ if (system("xdg-open http://electricsheep.org/client/LNX_" VERSION ".html &")) ++ perror("xdg-open"); + } + + static void tick() { diff --git a/source/xap/electricsheep/slack-desc b/source/xap/electricsheep/slack-desc new file mode 100644 index 00000000..d82ddf45 --- /dev/null +++ b/source/xap/electricsheep/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +electricsheep: electricsheep (distributed screensaver) +electricsheep: +electricsheep: Electric Sheep is an xscreensaver module that displays mpeg video +electricsheep: of an animated fractal flame. In the background it contributes +electricsheep: render cycles to the next animation. Periodically it uploades +electricsheep: completed frames to the server, where they are compressed for +electricsheep: distribution to all clients. +electricsheep: This program is recommended only if you have a high bandwidth +electricsheep: connection to the internet such as DSL or cable modem. +electricsheep: +electricsheep: electricsheep home: http://electricsheep.org/ diff --git a/source/xap/fluxbox/fluxbox.SlackBuild b/source/xap/fluxbox/fluxbox.SlackBuild new file mode 100755 index 00000000..bb0f0363 --- /dev/null +++ b/source/xap/fluxbox/fluxbox.SlackBuild @@ -0,0 +1,90 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=1.1.1 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-fluxbox +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +tar xvf $CWD/fluxbox-$VERSION.tar.?z* || exit 1 +cd fluxbox-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --mandir=/usr/man \ + --docdir=/usr/doc/fluxbox-$VERSION \ + --enable-xinerama \ + --enable-shape \ + --enable-slit \ + --enable-interlace \ + --enable-nls \ + --enable-timed-cache \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +gzip -9 $PKG/usr/man/man?/* + +mkdir -p $PKG/etc/X11/xinit +zcat $CWD/xinitrc.fluxbox.gz > $PKG/etc/X11/xinit/xinitrc.fluxbox +chmod 755 $PKG/etc/X11/xinit/xinitrc.fluxbox + +mkdir -p $PKG/usr/doc/fluxbox-$VERSION +cp -a AUTHORS COPYING* INSTALL NEWS README* TODO \ + $PKG/usr/doc/fluxbox-$VERSION +chmod 644 $PKG/usr/doc/fluxbox-$VERSION/* + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/fluxbox-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/fluxbox/slack-desc b/source/xap/fluxbox/slack-desc new file mode 100644 index 00000000..e1bb595c --- /dev/null +++ b/source/xap/fluxbox/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +fluxbox: fluxbox (Fluxbox window manager) +fluxbox: +fluxbox: Fluxbox is yet another windowmanager for X that is based on blackbox +fluxbox: but with many new features. +fluxbox: +fluxbox: +fluxbox: +fluxbox: +fluxbox: +fluxbox: +fluxbox: diff --git a/source/xap/fluxbox/xinitrc.fluxbox b/source/xap/fluxbox/xinitrc.fluxbox new file mode 100644 index 00000000..d04675a9 --- /dev/null +++ b/source/xap/fluxbox/xinitrc.fluxbox @@ -0,0 +1,28 @@ +#!/bin/sh +# $XConsortium: xinitrc.cpp,v 1.4 91/08/22 11:41:34 rws Exp $ + +userresources=$HOME/.Xresources +usermodmap=$HOME/.Xmodmap +sysresources=/usr/lib/X11/xinit/.Xresources +sysmodmap=/usr/lib/X11/xinit/.Xmodmap + +# merge in defaults and keymaps + +if [ -f $sysresources ]; then + xrdb -merge $sysresources +fi + +if [ -f $sysmodmap ]; then + xmodmap $sysmodmap +fi + +if [ -f $userresources ]; then + xrdb -merge $userresources +fi + +if [ -f $usermodmap ]; then + xmodmap $usermodmap +fi + +# Start the window manager: +exec /usr/bin/startfluxbox diff --git a/source/xap/fvwm/doinst.sh b/source/xap/fvwm/doinst.sh new file mode 100644 index 00000000..57a23d6f --- /dev/null +++ b/source/xap/fvwm/doinst.sh @@ -0,0 +1,13 @@ +#!/bin/sh +config() { + NEW="$1" + OLD="`dirname $NEW`/`basename $NEW .new`" + # If there's no config file by that name, mv it over: + if [ ! -r $OLD ]; then + mv $NEW $OLD + elif [ "`cat $OLD | md5sum`" = "`cat $NEW | md5sum`" ]; then # toss the redundant copy + rm $NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} +config etc/X11/fvwm2/system.fvwm2rc.new diff --git a/source/xap/fvwm/fvwm.SlackBuild b/source/xap/fvwm/fvwm.SlackBuild new file mode 100755 index 00000000..c990f1a0 --- /dev/null +++ b/source/xap/fvwm/fvwm.SlackBuild @@ -0,0 +1,127 @@ +#!/bin/sh + +# Copyright 2006, 2007, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=fvwm +VERSION=${VERSION:-2.4.20} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.bz2 || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Configure: +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --sysconfdir=/etc/X11/fvwm2 \ + --mandir=/usr/man \ + --enable-multibyte \ + --program-prefix= \ + --program-suffix= \ + --enable-extras \ + --build=$ARCH-slackware-linux + +# Build and install: +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Add some ancient icons: +( cd $PKG ; tar xzf $CWD/ancient-icons.tar.gz ) + +# Add a few more things: +mkdir -p $PKG/etc/X11/xinit +zcat $CWD/xinitrc.fvwm2.gz > $PKG/etc/X11/xinit/xinitrc.fvwm2 +chmod 755 $PKG/etc/X11/xinit/xinitrc.fvwm2 +mkdir -p $PKG/etc/X11/fvwm2 +zcat $CWD/system.fvwm2rc.gz > $PKG/etc/X11/fvwm2/system.fvwm2rc.new +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/X11 +( cd $PKG/usr/lib${LIBDIRSUFFIX}/X11 && rm -rf fvwm2 ) +( cd $PKG/usr/lib${LIBDIRSUFFIX}/X11 && ln -sf ../../../etc/X11/fvwm2 fvwm2 ) + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.* + ) + done + ) +fi + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION +cp -a \ + AUTHORS COPYING INSTALL INSTALL.fvwm NEWS README \ + $PKG/usr/doc/${PKGNAM}-$VERSION +( cd docs + cp -a \ + ANNOUNCE BUGS DEVELOPERS FAQ TODO color_combos error_codes fvwm.lsm m4_hacks \ + $PKG/usr/doc/${PKGNAM}-$VERSION +) + +mkdir -p $PKG/install +zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/fvwm/fvwm.colormap.diff b/source/xap/fvwm/fvwm.colormap.diff new file mode 100644 index 00000000..2d2eac94 --- /dev/null +++ b/source/xap/fvwm/fvwm.colormap.diff @@ -0,0 +1,20 @@ +--- ./fvwm/colormaps.c.orig Mon Sep 13 14:10:25 1999 ++++ ./fvwm/colormaps.c Mon Sep 13 14:12:03 1999 +@@ -90,10 +90,13 @@ + /* Reinstall the colormap that we think should be installed, + * UNLESS and unrecognized window has the focus - it might be + * an override-redirect window that has its own colormap. */ +- if((ReInstall)&&(Scr.UnknownWinFocused == None)) +- { +- XInstallColormap(dpy,last_cmap); +- } ++ /* Commented out, since although this behavior is an X standard, it breaks ++ * xlockmore and some other nifty programs, and having it this way doesn't ++ * cause any problems that I'm aware of. */ ++ /* if((ReInstall)&&(Scr.UnknownWinFocused == None)) */ ++ /* { */ ++ /* XInstallColormap(dpy,last_cmap); */ ++ /* } */ + } + + /************************************************************************ diff --git a/source/xap/fvwm/slack-desc b/source/xap/fvwm/slack-desc new file mode 100644 index 00000000..77995d92 --- /dev/null +++ b/source/xap/fvwm/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +fvwm: fvwm (a small and fast virtual window manager for X) +fvwm: +fvwm: Fvwm is the classic highly-configurable virtual window manager for +fvwm: X11. It is a derivative of twm, redesigned to minimize memory +fvwm: consumption, provide a 3-D look to window frames, and provide a simple +fvwm: virtual desktop. +fvwm: +fvwm: +fvwm: +fvwm: +fvwm: diff --git a/source/xap/fvwm/system.fvwm2rc b/source/xap/fvwm/system.fvwm2rc new file mode 100644 index 00000000..863643a4 --- /dev/null +++ b/source/xap/fvwm/system.fvwm2rc @@ -0,0 +1,822 @@ +# +# Default system.fvwm2rc for Slackware Linux, adapted from the version +# for fvwm95 (i.e. beware of non-functional commented-out options) +# + +#========================================================================# + +# +# Fonts - one for window titles, another for icons, and another for the menus +# +WindowFont -adobe-helvetica-bold-r-*-*-12-*-*-*-*-*-*-* +IconFont fixed +MenuStyle black grey76 grey30 -adobe-helvetica-medium-r-*-*-*-120-*-*-*-*-*-* fvwm + +# +# Set the default window colors. The syntax is: +# DefaultColors winforecolor winbackcolor titleforecolor titlebackcolor +# where: +# winbackcolor is the background (border) color of all windows, +# including the menu windows +# winforecolor is used for the menu text +# titlebackcolor is the background color used for title bars of +# non selected windows +# titleforecolor is the color of the title text of non selected windows +# +#DefaultColors Black #c3c3c3 #c3c3c3 grey51 + +# +# Text and background color for the title bar of the active (selected) window +# +#HilightColors White #000080 + +# +# Text and background color for the title bar of sticky windows +# +#StickyColors grey51 #60c080 + +# You can also use the Style command to set the colors of individual +# title bars of some non-selected windows + +#Style "*" ForeColor #c3c3c3 +#Style "*" BackColor grey51 + +#========================================================================# + +# +# Set up the major operating modes +# + +# Let's comment this out and be more UNIX-like :^) +# Style "*" ClickToFocus +# If we use the FvwmTaskBar we don't need the icons :-) +# Style "..." Icon is also commented below. +Style "*" NoIcon +Style "*" MWMFunctions +Style "*" HintOverride +Style "*" MWMDecor + +OpaqueMoveSize 100 +EdgeScroll 100 100 +EdgeResistance 10000 0 + +# +# RandomPlacement prevents user interaction while placing windows: +# +Style "*" RandomPlacement + +# +# NoPPosition instructs fvwm to ignore the PPosition field in window +# geometry hints. Emacs annoyingly sets PPosition to (0,0)! +# +Style "*" NoPPosition + +#========================================================================# + +# +# Set the desk top size in units of physical screen size +# +DeskTopSize 3x2 + +#========================================================================# + +# Set the decoration styles and window options +# Order is important!!!! +# If compatible styles are set for a single window in multiple Style +# commands, then the styles are ORed together. If conflicting styles +# are set, the last one specified is used. + +# These commands should command before any menus or functions are defined, +# and before the internal pager is started. + +# +# Default border and handle widths +# +Style "*" BorderWidth 5, HandleWidth 5 + +Style "Fvwm*" NoTitle, Sticky, WindowListSkip +Style "Fvwm Pager" StaysOnTop, NoHandles +Style "FvwmBanner" StaysOnTop +Style "FvwmButtons" NoTitle, NoHandles, Sticky, WindowListSkip,BorderWidth 5 +Style "*lock" NoTitle, NoHandles, Sticky, WindowListSkip +Style "xbiff" NoTitle, Sticky, WindowListSkip + +# +# Some mini-icons for the title bar +# +#Style "*" TitleIcon mini-x2.xpm +#Style "*xterm*" TitleIcon mini-term.xpm +#Style "rxvt" TitleIcon mini-term.xpm +#Style "xcalc" TitleIcon mini-calc.xpm +#Style "xsession" TitleIcon mini-bx2.xpm +#Style "xv" TitleIcon mini-xv.xpm +#Style "SeaMonkey" TitleIcon mini-nscape.xpm +#Style "xmag" TitleIcon mini-zoom.xpm +#Style "textedit" TitleIcon mini-edit.xpm +#Style "tkps" TitleIcon mini-run.xpm +#Style "Ghostview" TitleIcon mini-gv.xpm +#Style "Xcolorsel" TitleIcon mini-colors.xpm +#Style "IDL*" TitleIcon mini-zoom.xpm +#Style "xeyes" TitleIcon mini-eyes.xpm +#Style "*fm*" TitleIcon mini-filemgr.xpm +# xman resource names +#Style "topBox" TitleIcon mini-book1.xpm +#Style "help" TitleIcon mini-book2.xpm +#Style "manualBrowser" TitleIcon mini-book2.xpm +# xpaint resource names +#Style "xpaint" TitleIcon mini-paint.xpm +#Style "Canvas" TitleIcon mini-paint.xpm +#Style "fatbits" TitleIcon mini-paint.xpm +#Style "filebrowser" TitleIcon mini-paint.xpm + +#Style "rxvt" Icon term.xpm +#Style "xterm" Icon xterm.xpm +#Style "Appointment" Icon datebook.xpm +#Style "xcalc" Icon rcalc.xpm +#Style "xbiff" Icon mail1.xpm +#Style "xmh" Icon mail1.xpm, StartsOnDesk 2 +#Style "xman" Icon xman.xpm +#Style "xvgr" Icon graphs.xpm +#Style "matlab" Icon math4.xpm +#Style "xmag" Icon mag_glass.xpm +#Style "xgraph" Icon graphs.xpm +#Style "xv" Icon xview.xpm +#Style "FvwmButtons" Icon toolbox.xpm +#Style "xconsole" Icon koala.xpm +#Style "xsession" Icon koala.xpm +#Style "textedit" Icon textedit.xpm +#Style "gv" Icon gv.xpm + +#========================================================================# + +# +# Stuff to do at start-up +# + +AddToFunc "InitFunction" +#+ "I" Module FvwmButtons ++ "I" Module FvwmButtons MiniButtons ++ "I" Module FvwmPager 0 0 + +AddToFunc "RestartFunction" +#+ "I" Module FvwmButtons ++ "I" Module FvwmButtons MiniButtons ++ "I" Module FvwmPager 0 0 + +#========================================================================# + +# Now define some handy complex functions + +# +# This one moves and then raises the window if you drag the mouse, +# only raises the window if you click, or does a full maximize if +# you double click +# +AddToFunc "Move-or-Raise" "M" Move ++ "M" Raise ++ "C" Raise ++ "D" Maximize 100 100 + +# +# This one moves and then lowers the window if you drag the mouse, +# only lowers the window if you click, or does a RaiseLower if you double +# click +# +AddToFunc "Move-or-Lower" "M" Move ++ "M" Lower ++ "C" Lower ++ "D" RaiseLower + +# +# This one moves or (de)iconifies: +# +AddToFunc "Move-or-Iconify" "M" Move ++ "D" Iconify + +# +# This one resizes and then raises the window if you drag the mouse, +# only raises the window if you click, or does a RaiseLower if you double +# click +# +AddToFunc "Resize-or-Raise" "M" Resize ++ "M" Raise ++ "C" Raise ++ "D" RaiseLower + + +#========================================================================# + +# +# Now define the menus - defer bindings until later +# + +# This is for the Start menu of the FvwmTaskBar + +DestroyMenu "StartMenu" +AddToMenu "StartMenu" ++ "Manual Pages %mini-book1.xpm%" Exec xman & ++ "Magnifying Glass %mini-zoom.xpm%" Exec xmag & ++ "" Nop ++ "Accessories%mini-hammer.xpm%" Popup Accessories ++ "Applications %mini-x2.xpm%" Popup Applications ++ "File Managers %mini-filemgr.xpm%" Popup Filemanagers ++ "Games %mini-happy.xpm%" Popup Games ++ "Shells %mini-term.xpm" Popup Shells ++ "" Nop ++ "Lock Screen %mini-lock.xpm%" Popup Screenlock ++ "Screensaver %mini-display.xpm%" Popup Screensaver ++ "" Nop ++ "Refresh Screen %mini-ray.xpm%" Refresh ++ "" Nop ++ "Exit Fvwm2 %mini-stop.xpm%" Popup Quit-Verify + +DestroyMenu "Shells" +AddToMenu "Shells" ++ "Xterm (7x14 font)%mini-term.xpm%" Exec xterm -sb -sl 500 -j -ls -fn 7x14 -fb 7x14bold & ++ "Large Xterm (10x20 font)%mini-term.xpm%" Exec xterm -sb -sl 500 -j -ls -fn 10x20 & ++ "" Nop ++ "Rxvt (7x14 font)%mini-term.xpm%" Exec rxvt -font 7x14 -ls & ++ "Large Rxvt (10x20 font)%mini-term.xpm%" Exec rxvt -font 10x20 -ls & + +DestroyMenu "Screensaver" +AddToMenu "Screensaver" ++ "Blank%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode blank & ++ "Random%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode random & ++ "" Nop ++ "Ant%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode ant & ++ "Ball%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode ball & ++ "Bat%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode bat & ++ "Blot%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode blot & ++ "Bomb%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode bomb & ++ "Bouboule%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode bouboule & +#+ "Bob%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode image -bitmap /usr/include/X11/bitmaps/l-bob.xbm -batchcount 7 & +#+ "Bounce%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode bounce & ++ "\"Bob\"%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode bounce & ++ "Braid%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode braid & ++ "Bug%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode bug & ++ "Bubble%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode bubble & ++ "Clock%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode clock & ++ "Coral%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode coral & ++ "Crystal%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode crystal & ++ "Daisy%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode daisy & ++ "Dclock%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode dclock & ++ "Deco%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode deco & ++ "Demon%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode demon & ++ "Dilemma%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode dilemma & ++ "Drift%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode drift & ++ "More" PopUp ScreenSaver2 + +DestroyMenu "Screensaver2" +AddToMenu "Screensaver2" ++ "Eyes%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode eyes & ++ "Fadeplot%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode fadeplot & ++ "Flag%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode flag & ++ "Flame%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode flame & ++ "Forest%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode forest & ++ "Galaxy%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode galaxy & ++ "Geometry%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode geometry & ++ "Grav%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode grav & ++ "Helix%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode helix & ++ "Hop%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode hop & ++ "Hyper%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode hyper & ++ "Ico%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode ico & ++ "Ifs%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode ifs & ++ "Julia%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode julia & ++ "Kaleid%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode kaleid & ++ "Laser%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode laser & ++ "Life%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode life & ++ "Life1d%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode life1d & ++ "Life3d%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode life3d & ++ "Lightning%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode lightning & ++ "Lisa%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode lisa & ++ "Lissie%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode lissie & ++ "Loop%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode loop & ++ "More" PopUp ScreenSaver3 + +DestroyMenu "Screensaver3" +AddToMenu "Screensaver3" ++ "Mandelbrot%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode mandelbrot & ++ "Marquee%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode marquee & ++ "Maze%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode maze & ++ "Mountain%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode mountain & ++ "Munch%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode munch & ++ "Nose%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode nose & ++ "Pacman%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode pacman & ++ "Penguin%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode image -bitmap /usr/include/X11/bitmaps/l-linux.xbm -batchcount 7 & ++ "Penrose%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode penrose & ++ "Petal%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode petal & ++ "Puzzle%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode puzzle & ++ "Pyro%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode pyro & ++ "Qix%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode qix & ++ "Roll%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode roll & ++ "Rotor%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode rotor & ++ "Shape%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode shape & ++ "Sierpinski%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode sierpinski & ++ "Slip%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode slip & ++ "Sphere%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode sphere & ++ "Spiral%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode spiral & ++ "Spline%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode spline & ++ "Star%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode star & ++ "Strange%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode strange & ++ "More" PopUp ScreenSaver4 + +DestroyMenu "Screensaver4" +AddToMenu "Screensaver4" ++ "Swarm%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode swarm & ++ "Swirl%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode swirl & ++ "Triangle%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode triangle & ++ "Tube%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode tube & ++ "Turtle%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode turtle & ++ "Vines%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode vines & ++ "Voters%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode voters & ++ "Wator%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode wator & ++ "Wire%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode wire & ++ "World%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode world & ++ "Worm%mini-bball.xpm%" Exec xlock -nolock -nice 0 -mode worm & + +DestroyMenu "Screenlock" +AddToMenu "Screenlock" ++ "Blank%mini-bball.xpm%" Exec xlock -nice 0 -mode blank & ++ "Random%mini-bball.xpm%" Exec xlock -nice 0 -mode random & ++ "" Nop ++ "Ant%mini-bball.xpm%" Exec xlock -nice 0 -mode ant & ++ "Ball%mini-bball.xpm%" Exec xlock -nice 0 -mode ball & ++ "Bat%mini-bball.xpm%" Exec xlock -nice 0 -mode bat & ++ "Blot%mini-bball.xpm%" Exec xlock -nice 0 -mode blot & ++ "Bomb%mini-bball.xpm%" Exec xlock -nice 0 -mode bomb & ++ "Bouboule%mini-bball.xpm%" Exec xlock -nice 0 -mode bouboule & +#+ "Bob%mini-bball.xpm%" Exec xlock -nice 0 -mode image -bitmap /usr/include/X11/bitmaps/l-bob.xbm -batchcount 7 & +#+ "Bounce%mini-bball.xpm%" Exec xlock -nice 0 -mode bounce & ++ "\"Bob\"%mini-bball.xpm%" Exec xlock -nice 0 -mode bounce & ++ "Braid%mini-bball.xpm%" Exec xlock -nice 0 -mode braid & ++ "Bug%mini-bball.xpm%" Exec xlock -nice 0 -mode bug & ++ "Bubble%mini-bball.xpm%" Exec xlock -nice 0 -mode bubble & ++ "Clock%mini-bball.xpm%" Exec xlock -nice 0 -mode clock & ++ "Coral%mini-bball.xpm%" Exec xlock -nice 0 -mode coral & ++ "Crystal%mini-bball.xpm%" Exec xlock -nice 0 -mode crystal & ++ "Daisy%mini-bball.xpm%" Exec xlock -nice 0 -mode daisy & ++ "Dclock%mini-bball.xpm%" Exec xlock -nice 0 -mode dclock & ++ "Deco%mini-bball.xpm%" Exec xlock -nice 0 -mode deco & ++ "Demon%mini-bball.xpm%" Exec xlock -nice 0 -mode demon & ++ "Dilemma%mini-bball.xpm%" Exec xlock -nice 0 -mode dilemma & ++ "Drift%mini-bball.xpm%" Exec xlock -nice 0 -mode drift & ++ "More" PopUp Screenlock2 + +DestroyMenu "Screenlock2" +AddToMenu "Screenlock2" ++ "Eyes%mini-bball.xpm%" Exec xlock -nice 0 -mode eyes & ++ "Fadeplot%mini-bball.xpm%" Exec xlock -nice 0 -mode fadeplot & ++ "Flag%mini-bball.xpm%" Exec xlock -nice 0 -mode flag & ++ "Flame%mini-bball.xpm%" Exec xlock -nice 0 -mode flame & ++ "Forest%mini-bball.xpm%" Exec xlock -nice 0 -mode forest & ++ "Galaxy%mini-bball.xpm%" Exec xlock -nice 0 -mode galaxy & ++ "Geometry%mini-bball.xpm%" Exec xlock -nice 0 -mode geometry & ++ "Grav%mini-bball.xpm%" Exec xlock -nice 0 -mode grav & ++ "Helix%mini-bball.xpm%" Exec xlock -nice 0 -mode helix & ++ "Hop%mini-bball.xpm%" Exec xlock -nice 0 -mode hop & ++ "Hyper%mini-bball.xpm%" Exec xlock -nice 0 -mode hyper & ++ "Ico%mini-bball.xpm%" Exec xlock -nice 0 -mode ico & ++ "Ifs%mini-bball.xpm%" Exec xlock -nice 0 -mode ifs & ++ "Julia%mini-bball.xpm%" Exec xlock -nice 0 -mode julia & ++ "Kaleid%mini-bball.xpm%" Exec xlock -nice 0 -mode kaleid & ++ "Laser%mini-bball.xpm%" Exec xlock -nice 0 -mode laser & ++ "Life%mini-bball.xpm%" Exec xlock -nice 0 -mode life & ++ "Life1d%mini-bball.xpm%" Exec xlock -nice 0 -mode life1d & ++ "Life3d%mini-bball.xpm%" Exec xlock -nice 0 -mode life3d & ++ "Lightning%mini-bball.xpm%" Exec xlock -nice 0 -mode lightning & ++ "Lisa%mini-bball.xpm%" Exec xlock -nice 0 -mode lisa & ++ "Lissie%mini-bball.xpm%" Exec xlock -nice 0 -mode lissie & ++ "Loop%mini-bball.xpm%" Exec xlock -nice 0 -mode loop & ++ "More" PopUp Screenlock3 + +DestroyMenu "Screenlock3" +AddToMenu "Screenlock3" ++ "Mandelbrot%mini-bball.xpm%" Exec xlock -nice 0 -mode mandelbrot & ++ "Marquee%mini-bball.xpm%" Exec xlock -nice 0 -mode marquee & ++ "Maze%mini-bball.xpm%" Exec xlock -nice 0 -mode maze & ++ "Mountain%mini-bball.xpm%" Exec xlock -nice 0 -mode mountain & ++ "Munch%mini-bball.xpm%" Exec xlock -nice 0 -mode munch & ++ "Nose%mini-bball.xpm%" Exec xlock -nice 0 -mode nose & ++ "Pacman%mini-bball.xpm%" Exec xlock -nice 0 -mode pacman & ++ "Penguin%mini-bball.xpm%" Exec xlock -nice 0 -mode image -bitmap /usr/include/X11/bitmaps/l-linux.xbm -batchcount 7 & ++ "Penrose%mini-bball.xpm%" Exec xlock -nice 0 -mode penrose & ++ "Petal%mini-bball.xpm%" Exec xlock -nice 0 -mode petal & ++ "Puzzle%mini-bball.xpm%" Exec xlock -nice 0 -mode puzzle & ++ "Pyro%mini-bball.xpm%" Exec xlock -nice 0 -mode pyro & ++ "Qix%mini-bball.xpm%" Exec xlock -nice 0 -mode qix & ++ "Roll%mini-bball.xpm%" Exec xlock -nice 0 -mode roll & ++ "Rotor%mini-bball.xpm%" Exec xlock -nice 0 -mode rotor & ++ "Shape%mini-bball.xpm%" Exec xlock -nice 0 -mode shape & ++ "Sierpinski%mini-bball.xpm%" Exec xlock -nice 0 -mode sierpinski & ++ "Slip%mini-bball.xpm%" Exec xlock -nice 0 -mode slip & ++ "Sphere%mini-bball.xpm%" Exec xlock -nice 0 -mode sphere & ++ "Spiral%mini-bball.xpm%" Exec xlock -nice 0 -mode spiral & ++ "Spline%mini-bball.xpm%" Exec xlock -nice 0 -mode spline & ++ "Star%mini-bball.xpm%" Exec xlock -nice 0 -mode star & ++ "Strange%mini-bball.xpm%" Exec xlock -nice 0 -mode strange & ++ "More" PopUp Screenlock4 + +DestroyMenu "Screenlock4" +AddToMenu "Screenlock4" ++ "Swarm%mini-bball.xpm%" Exec xlock -nice 0 -mode swarm & ++ "Swirl%mini-bball.xpm%" Exec xlock -nice 0 -mode swirl & ++ "Triangle%mini-bball.xpm%" Exec xlock -nice 0 -mode triangle & ++ "Tube%mini-bball.xpm%" Exec xlock -nice 0 -mode tube & ++ "Turtle%mini-bball.xpm%" Exec xlock -nice 0 -mode turtle & ++ "Vines%mini-bball.xpm%" Exec xlock -nice 0 -mode vines & ++ "Voters%mini-bball.xpm%" Exec xlock -nice 0 -mode voters & ++ "Wator%mini-bball.xpm%" Exec xlock -nice 0 -mode wator & ++ "Wire%mini-bball.xpm%" Exec xlock -nice 0 -mode wire & ++ "World%mini-bball.xpm%" Exec xlock -nice 0 -mode world & ++ "Worm%mini-bball.xpm%" Exec xlock -nice 0 -mode worm & + +DestroyMenu "Games" +AddToMenu "Games" ++ "Maze%mini-maze.xpm%" Exec maze & ++ "Spider%mini-espada.xpm%" Exec spider & ++ "Chess%mini-slon.xpm%" Exec xboard & ++ "Xlander%mini-xlander.xpm%" Exec xlander & +#+ "Xmahjongg%mini-xmahjongg.xpm%" Exec xmahjongg & ++ "Workman%mini-cdlabel.xpm%" Exec workman & ++ "" Nop ++ "Amusements" Popup Amusements + +DestroyMenu "Amusements" +AddToMenu "Amusements" +#+ "Xcat%mini-cat.xpm%" Exec xcat & ++ "Xeyes%mini-eyes.xpm%" Exec xeyes & ++ "Xlogo%mini-bx2.xpm%" Exec xlogo & ++ "Xroach%mini-roach.xpm%" Exec xroach & ++ "Xsnow%mini-xsnow.xpm%" Exec xsnow & ++ "Stop Xsnow%mini-stop.xpm%" Exec killall xsnow & + +DestroyMenu "Accessories" +AddToMenu "Accessories" ++ "Font viewer (xfontsel)%mini-font.xpm%" Exec xfontsel & ++ "Manual pages%mini-book1.xpm%" Exec xman & ++ "Magnifying glass%mini-zoom.xpm%" Exec xmag & ++ "Oclock%mini-clock.xpm%" Exec oclock & ++ "Running Processes (Top)%mini-run.xpm%" Exec xterm -font 7x14 -T Top -n Top -e top & ++ "System load%mini-perf.xpm%" Exec xload & ++ "Xclipboard%mini-clipboard.xpm%" Exec xclipboard & ++ "Xclock%mini-clock.xpm%" Exec xclock & + +DestroyMenu "Applications" +AddToMenu "Applications" ++ "Emacs%mini-edit.xpm%" Exec emacs & ++ "NcFTP%mini-ftp.xpm%" Exec xterm -name NcFtp -T FTP -ls -fn 7x14 -e ncftp & ++ "GIMP%mini-camera.xpm%" Exec gimp & ++ "Gv%mini-gv.xpm%" Exec gv & ++ "Gnuplot%mini-zoom.xpm%" Exec xterm -T "Gnuplot" -name Gnuplot -fn 7x14 -e gnuplot & ++ "SeaMonkey%mini-nscape.xpm%" Exec seamonkey & ++ "Pine%mini-mail.xpm%" Exec xterm -name Mail -T Mail -ls -fn 7x14 -e pine -i & ++ "Xv%mini-xv.xpm%" Exec xv & ++ "Xedit%mini-edit.xpm%" Exec xedit & ++ "Xfig%mini-xfig.xpm%" Exec xfig & ++ "Xfractint%mini-fractal.xpm%" Exec xterm -font 7x14 -e xfractint & ++ "Xpaint%mini-paint.xpm%" Exec xpaint & ++ "Xpdf%mini-pdf.xpm%" Exec xpdf & ++ "Xxgdb%mini-bug2.xpm%" Exec xxgdb & + +DestroyMenu "Filemanagers" +AddToMenu "Filemanagers" +#+ "TkDesk%mini-desktop.xpm%" Exec tkdesk & ++ "Xfm%mini-filemgr.xpm%" Exec xfm & + +# +# This menu is invoked as a sub-menu - it allows you to quit, +# restart, or switch to another WM. +# +DestroyMenu "Quit-Verify" +AddToMenu "Quit-Verify" ++ "Quit fvwm2%mini-exclam.xpm%" Quit ++ "" Nop ++ "Restart Fvwm2%mini-turn.xpm%" Restart fvwm2 ++ "" Nop ++ "Start fvwm95%mini-exp.xpm%" Restart fvwm95 ++ "Start mwm%mini-mwm.xpm%" Restart mwm ++ "Start olvwm%mini-olwm.xpm%" Restart /usr/openwin/bin/olvwm ++ "Start olwm%mini-olwm.xpm%" Restart /usr/openwin/bin/olwm ++ "Start twm%mini-twm.xpm%" Restart twm + +# +# Provides a list of modules to fire off +# +#DestroyMenu "Module-Popup" +#AddToMenu "Module-Popup" +##+ "Audio" Module FvwmAudio +#+ "Banner%mini.fvwm.xpm%" Module FvwmBanner +#+ "Button Bar%mini-ball.xpm%" Module FvwmButtons +#+ "Button Bar (Mini)%mini-ball.xpm%" Module FvwmButtons MiniButtons +##+ "Clean-Up%mini-pencil.xpm%" Module FvwmClean +##+ "Configure%mini-hammer.xpm%" Module FvwmConfig +#+ "Debug%mini-bug2.xpm%" Module FvwmDebug +##+ "Task bar%mini-exp.xpm%" Module FvwmTaskBar +#+ "Identify%mini-question.xpm%" Module FvwmIdent +#+ "Save Desktop%mini-desktop.xpm%" Module FvwmSaveDesk +#+ "Pager%mini-pager.xpm%" Module FvwmPager 0 0 +#+ "Window List%mini-windows.xpm%" Module FvwmWinList +#+ "Talk%mini-exclam.xpm%" Module FvwmTalk + +AddToMenu Module-Popup "FvwmModules" Title ++ "Identify" Module FvwmIdent ++ "Talk" Module FvwmTalk ++ "" Nop ++ "Button-Bar" Module FvwmButtons ++ "Pager" Module FvwmPager 0 0 ++ "Pager (2 desks)" Module FvwmPager 0 1 ++ "WinList" Module FvwmWinList ++ "" Nop ++ "Banner" Module FvwmBanner ++ "ScrollBar" Module FvwmScroll 50 50 ++ "Background" Module FvwmBacker ++ "AutoRaise" Module FvwmAuto 200 Raise Nop ++ "Stop AutoRaise" KillModule FvwmAuto ++ "" Nop ++ "IconBox" Module FvwmIconBox ++ "IconMan" Module FvwmIconMan ++ "" Nop ++ "Form - Rlogin" Module FvwmForm Rlogin ++ "Form - MyFvwmTalk" Module FvwmForm MyFvwmTalk ++ "Form - QuitVerify" Module FvwmForm QuitVerify + +# +# This menu will fire up some very common utilities +# +DestroyMenu "Utilities" +AddToMenu "Utilities" ++ "" Nop ++ "Xterm%mini-term.xpm%" Exec xterm -sb -sl 500 -j -ls -fn 7x14 -fb 7x14bold & ++ "Running Processes (Top)%mini-run.xpm%" Exec xterm -font 7x14 -T Top -n Top -e top & ++ "Calculator%mini-calc.xpm%" Exec xcalc & ++ "Manual pages%mini-book1.xpm%" Exec xman & ++ "Magnifying glass%mini-zoom.xpm%" Exec xmag & ++ "Oclock%mini-clock.xpm%" Exec oclock & ++ "" Nop ++ "Applications%mini-x2.xpm%" Popup Applications ++ "File Managers%mini-filemgr.xpm%" Popup Filemanagers ++ "Games%mini-happy.xpm%" Popup Games ++ "Shells%mini-term.xpm" Popup Shells ++ "" Nop ++ "Screensaver%mini-display.xpm%" Popup Screensaver ++ "Lock Screen%mini-lock.xpm%" Popup Screenlock ++ "" Nop ++ "Modules%mini-modules.xpm%" Popup Module-Popup ++ "" Nop ++ "Refresh Screen%mini-ray.xpm%" Refresh ++ "" Nop ++ "Exit Fvwm2%mini-stop.xpm%" Popup Quit-Verify + +# +# This defines the most common window operations +# +DestroyMenu "Window Ops" +AddToMenu "Window Ops" Title ++ "&Move%mini-move.xpm%" Function Move-or-Raise ++ "&Resize%mini-resize.xpm%" Function Resize-or-Raise ++ "R&aise%mini-raise.xpm%" Raise ++ "&Lower%mini-lower.xpm%" Lower ++ "(De)Iconify" Iconify ++ "(Un)Stick" Stick ++ "(Un)Maximize%mini-max1.xpm%" Function maximize_func ++ "" Nop ++ "Kill%mini-bomb.xpm%" Destroy ++ "&Close%mini-cross.xpm%" Delete ++ "" Nop ++ "Switch to..." WindowList ++ "Refresh Screen%mini-ray.xpm%" Refresh + +# +# A trimmed down version of "Window Ops", good for binding to decorations +# +AddToMenu "Window-Ops2" "&Restore" Iconify -1 ++ "&Move" Move-or-Raise ++ "&Size" Resize-or-Raise ++ "Mi&nimize" Iconify 1 ++ "Ma&ximize" Maximize 100 100 ++ "" Nop ++ "&Kill" Destroy ++ "&Close Alt+F4" Delete + +#========================================================================# + +# +# One more complex function - couldn't be defined earlier because it used +# pop-up menus +# +# This creates the "system" menu for the title-bar window-ops +# pop-up +# +AddToFunc "window_ops_func" "C" PopUp Window-Ops2 ++ "M" PopUp Window-Ops2 ++ "D" Delete + + +#========================================================================# + +# +# Mouse bindings +# + +# First, for the mouse in the root window +# Button 1 gives the Utilities menu +# Button 2 gives the Window Ops menu +# Button 3 gives the WindowList (like TwmWindows) +# I use the AnyModifier (A) option for the modifier field, so you can hold down +# any shift-control-whatever combination you want! + +# Button Context Modifi Function +Mouse 1 R A Menu "Utilities" Nop +Mouse 2 R A Menu "Window Ops" Nop +Mouse 3 R A WindowList +#Mouse 3 R A Module "winlist" FvwmWinList transient + +# Now the title bar buttons +# Any button in the left title-bar button gives the window ops menu +# Any button in the first right title-bar button Iconifies the window +# Any button in the second title-bar button full-maximizes +# Note the use of "Mouse 0" for AnyButton. + +# Button Context Modif Function +Mouse 0 1 A Function "window_ops_func" +Mouse 0 2 A Maximize 100 100 +Mouse 0 4 A Iconify + +# Now the rest of the frame +# Here I invoke my complex functions for Move-or-lower, Move-or-raise, +# and Resize-or-Raise. +# +# Button 1 in the corner pieces, with any modifiers, gives resize or raise +Mouse 1 F A Function "Resize-or-Raise" +# Button 1 in the title, sides, or icon, w/ any modifiers, gives move or raise +Mouse 1 TS A Function "Move-or-Raise" + +# Button 1 in an icons gives move for a drag, de-iconify for a double-click, +# nothing for a single click +# Button 2 in an icon, w/ any modifiers, gives de-iconify +Mouse 1 I A Function "Move-or-Iconify" +Mouse 2 I A Iconify + +# Button 2 in the corners, sides, or title-bar gives the window ops menu +Mouse 2 FST A Function "window_ops_func" + +# Button 3 anywhere in the decoration (except the title-bar buttons) +# does a raise-lower +Mouse 3 TSIF A RaiseLower + +# Button 3 in the window, with the Modifier-1 key (usually alt or diamond) +# gives Raise-Lower. Used to use control here, but that interferes with xterm +Mouse 3 W M RaiseLower + +#========================================================================# + +# Now some keyboard shortcuts. + +# Arrow Keys +# press arrow + control anywhere, and scroll by 1 page +Key Left A C Scroll -100 0 +Key Right A C Scroll +100 +0 +Key Up A C Scroll +0 -100 +Key Down A C Scroll +0 +100 + +# press arrow + meta key, and scroll by 1/10 of a page +Key Left A M Scroll -10 +0 +Key Right A M Scroll +10 +0 +Key Up A M Scroll +0 -10 +Key Down A M Scroll +0 +10 + +# press shift arrow + control anywhere, and move the pointer by 1% of a page +Key Left A SC CursorMove -1 0 +Key Right A SC CursorMove +1 +0 +Key Up A SC CursorMove +0 -1 +Key Down A SC CursorMove +0 +1 + +# press shift arrow + meta key, and move the pointer by 1/10 of a page +Key Left A SM CursorMove -10 +0 +Key Right A SM CursorMove +10 +0 +Key Up A SM CursorMove +0 -10 +Key Down A SM CursorMove +0 +10 + +# Keyboard accelerators +Key F1 A M Popup "Utilities" +Key F1 A M Popup "Utilities" +Key F2 A M Popup "Window Ops" +Key F3 A M Module "WindowList" FvwmWinList +Key F4 A M Iconify +Key F5 A M Move +Key F6 A M Resize +Key F7 A M CirculateUp +Key F8 A M CirculateDown + +#Page Up/Dapge Down keys are used to scroll by one desktop page +# in any context, press page up/down + control +# in root context, just pressing page up/down is OK +# +# I prefer the non-wrapping scroll. These are for example purposes only +#Key Next A C Scroll 100000 0 +#Key Next R N Scroll 100000 0 +#Key Prior A C Scroll -100000 0 +#Key Prior R N Scroll -100000 0 + +Key Tab A M Prev Focus +Key Tab A MS Next Focus + +Key Escape A C WindowList + +#========================================================================# + +# Definitions used by the modules + +#------------------ Pager +*FvwmPagerBack grey60 +*FvwmPagerFore black +*FvwmPagerFont -adobe-helvetica-bold-r-*-*-10-*-*-*-*-*-*-* +*FvwmPagerHilight #c3c3c3 +*FvwmPagerGeometry -3-27 +*FvwmPagerLabel 0 Desktop +*FvwmPagerSmallFont 5x8 + +#------------------ FvwmButtons +*FvwmButtonsFore Black +*FvwmButtonsBack #c3c3c3 +*FvwmButtonsFont -adobe-helvetica-bold-r-*-*-10-*-*-*-*-*-*-* +# Geometry - really likes to pick its own size, but giving a position is OK +*FvwmButtonsGeometry -5-5 +# Layout: specify rows or columns, not both +*FvwmButtonsRows 1 + +# Define the buttons to use..... +*FvwmButtons xclock clock.xpm Swallow "xclock" Exec xclock -bg \#c3c3c3 -geometry -1500-1500 -padding 0 & +#*GoodStuff xcmap NULL Swallow "xcmap" xcmap -geometry -1500-1500 +*FvwmButtons (2x1) load NULL Swallow "xload" Exec nice -16 xload -nolabel -bg grey60 -update 5 -geometry -1500-1500 +*FvwmButtons SeaMonkey nscape.xpm Exec "SeaMonkey" seamonkey & +*FvwmButtons xterm rterm.xpm Exec "xterm" xterm -ls -sb -fn 7x14 & +*FvwmButtons xfm Xfm.xpm Exec "Xfm" xfm & +#*FvwmButtons textedit textedit.xpm Exec "Textedit" textedit & +*FvwmButtons xcalc rcalc.xpm Exec "Calculator" xcalc & +*FvwmButtons xv xv.xpm Exec "xv" xv & +#*FvwmButtons gv gv.xpm Exec "gv" gv & +#*FvwmButtons seamonkey nscape.xpm Exec "SeaMonkey" seamonkey -geometry 920x650+90+5 +*FvwmButtons kill rbomb.xpm Destroy +#*FvwmButtons (2x1) - whatever SwallowModule Exec "Desktop" FvwmPager 0 0 +*FvwmButtons (2x1, Swallow(UseOld) "Desktop" 'FvwmPager 0 0') + +#------------------ MiniButtons + +Style "MiniButtons" NoTitle,NoHandles,Sticky,StaysOnTop,WindowListSkip,BorderWidth 0 + +*MiniButtonsFore Black +*MiniButtonsBack #c0c0c0 +*MiniButtonsFont -adobe-helvetica-bold-r-*-*-10-*-*-*-*-*-*-* +*MiniButtonsGeometry -5-5 +*MiniButtonsRows 1 +*MiniButtonsPadding 1 1 + +*MiniButtons - mini-nscape.xpm Exec "SeaMonkey" seamonkey -geometry 790x543+0+0 & +*MiniButtons - mini-term.xpm Exec "XTerm" xterm -ls -sb -fn 7x14 & +*MiniButtons - mini-filemgr.xpm Exec "Xfm" xfm & +*MiniButtons - mini-calc.xpm Exec "Calculator" xcalc & +#*MiniButtons - mini-gv.xpm Exec "gv" gv & +*MiniButtons - mini-xv.xpm Exec "xv" xv & +*MiniButtons - mini-bomb.xpm Destroy + +#------------------ Identify +*FvwmIdentBack #000080 +*FvwmIdentFore Yellow +*FvwmIdentFont -adobe-helvetica-medium-r-*-*-12-*-*-*-*-*-*-* + +#------------------ FvwmWinList +*FvwmWinListBack #c3c3c3 +*FvwmWinListFore Black +*FvwmWinListFont -adobe-helvetica-bold-r-*-*-10-*-*-*-*-*-*-* +*FvwmWinListAction Click1 Iconify -1,Focus +*FvwmWinListAction Click2 Iconify +*FvwmWinListAction Click3 Module "FvwmIdent" FvwmIdent +*FvwmWinListUseSkipList +*FvwmWinListGeometry +0-1 + +#------------------ FvwmTaskBar +#Style "FvwmTaskBar" NoTitle,BorderWidth 4,HandleWidth 4,Sticky,StaysOnTop,WindowListSkip,CirculateSkip +# I don't like the taskbar to stay to top, since it covers the bottom +# part of SeaMonkey in full-screen mode: +#Style "FvwmTaskBar" NoTitle,BorderWidth 4,HandleWidth 4,Sticky,WindowListSkip,CirculateSkip + +*FvwmTaskBarGeometry +0-0 +*FvwmTaskBarFore Black +*FvwmTaskBarBack #c3c3c3 +*FvwmTaskBarTipsFore black +*FvwmTaskBarTipsBack bisque +*FvwmTaskBarFont -adobe-helvetica-medium-r-*-*-*-120-*-*-*-*-*-* +*FvwmTaskBarSelFont -adobe-helvetica-bold-r-*-*-*-120-*-*-*-*-*-* +*FvwmTaskBarAction Click1 Iconify -1,Raise,Focus +*FvwmTaskBarAction Click2 Iconify +*FvwmTaskBarAction Click3 Module "FvwmIdent" FvwmIdent +*FvwmTaskBarUseSkipList +*FvwmTaskBarAutoStick +*FvwmTaskBarStartName Start +*FvwmTaskBarStartMenu StartMenu +# Just for fun, let's use the Linux penguin for the Start button: +*FvwmTaskBarStartIcon mini-penguin.xpm +#*FvwmTaskBarStartIcon mini-exp.xpm +*FvwmTaskBarShowTips +*FvwmTaskBarMailProg xterm -e mail diff --git a/source/xap/fvwm/xinitrc.fvwm2 b/source/xap/fvwm/xinitrc.fvwm2 new file mode 100644 index 00000000..955629fc --- /dev/null +++ b/source/xap/fvwm/xinitrc.fvwm2 @@ -0,0 +1,30 @@ +#!/bin/sh +# $XConsortium: xinitrc.cpp,v 1.4 91/08/22 11:41:34 rws Exp $ + +userresources=$HOME/.Xresources +usermodmap=$HOME/.Xmodmap +sysresources=/etc/X11/xinit/.Xresources +sysmodmap=/etc/X11/xinit/.Xmodmap + +# merge in defaults and keymaps + +if [ -f $sysresources ]; then + xrdb -merge $sysresources +fi + +if [ -f $sysmodmap ]; then + xmodmap $sysmodmap +fi + +if [ -f $userresources ]; then + xrdb -merge $userresources +fi + +if [ -f $usermodmap ]; then + xmodmap $usermodmap +fi + +# start some nice programs + +xsetroot -solid SteelBlue +fvwm2 diff --git a/source/xap/gftp/gftp.SlackBuild b/source/xap/gftp/gftp.SlackBuild new file mode 100755 index 00000000..ba93205e --- /dev/null +++ b/source/xap/gftp/gftp.SlackBuild @@ -0,0 +1,94 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +VERSION=2.0.19 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-2} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-gftp + +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf gftp-$VERSION +tar xvf $CWD/gftp-$VERSION.tar.bz2 || exit 1 +cd gftp-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var/lib \ + --mandir=/usr/man \ + --docdir=/usr/doc/gftp-$VERSION \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Put symlinks to the themable icons in place +mkdir -p $PKG/usr/share/icons/hicolor/{scalable,16x16,22x22,24x24,32x32,48x48}/apps +ln -s /usr/share/gftp/gftp-scalable.svg \ + $PKG/usr/share/icons/hicolor/scalable/apps/gftp.svg +for i in 16x16 22x22 24x24 32x32 48x48 ; do + ln -s /usr/share/gftp/gftp-${i}.png \ + $PKG/usr/share/icons/hicolor/${i}/apps/gftp.png +done + +mkdir -p $PKG/usr/doc/gftp-$VERSION +cp -a \ + AUTHORS COPYING NEWS README README.html THANKS TODO docs/USERS-GUIDE \ + $PKG/usr/doc/gftp-$VERSION + +( cd $PKG/usr/man + find . -type f -exec gzip -9 {} \; + for i in $(find . -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done +) + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/gftp-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/gftp/gftp.desktop b/source/xap/gftp/gftp.desktop new file mode 100644 index 00000000..0beaf5bc --- /dev/null +++ b/source/xap/gftp/gftp.desktop @@ -0,0 +1,16 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=gFTP +Comment=Download and upload files using multiple file transfer protocols +Comment[fr]=Télécharge des fichiers en utilisant le protocole FTP +GenericName=gFTP +Exec=gftp %u +Terminal=false +X-MultipleArgs=false +Type=Application +Icon=gftp +Categories=Network; +X-GNOME-Bugzilla-Bugzilla=GNOME +X-GNOME-Bugzilla-Product=gftp +X-GNOME-Bugzilla-Component=general +X-GNOME-Bugzilla-Version=2.0.19 diff --git a/source/xap/gftp/slack-desc b/source/xap/gftp/slack-desc new file mode 100644 index 00000000..693fb4d2 --- /dev/null +++ b/source/xap/gftp/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gftp: gftp (FTP client for X) +gftp: +gftp: gFTP is a multithreaded FTP client for X written using GTK+. It +gftp: features simultaneous downloads, resuming of interrupted file +gftp: transfers, file transfer queues, downloading of entire directories, +gftp: ftp proxy support, remote directory caching, passive and non-passive +gftp: file transfers, drag-n-drop support, bookmarks menu, stop button, +gftp: and many more features. +gftp: +gftp: +gftp: diff --git a/source/xap/gimp/gimp.SlackBuild b/source/xap/gimp/gimp.SlackBuild new file mode 100755 index 00000000..ef001a68 --- /dev/null +++ b/source/xap/gimp/gimp.SlackBuild @@ -0,0 +1,105 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=2.6.6 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-2} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-gimp +rm -rf $PKG +mkdir -p $TMP $PKG + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +cd $TMP +rm -rf gimp-$VERSION +tar xvf $CWD/gimp-$VERSION.tar.bz2 || exit 1 +cd gimp-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --sysconfdir=/etc \ + --localstatedir=/var/lib \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --docdir=/usr/doc/gimp-$VERSION \ + --disable-static \ + --enable-gimp-remote \ + --without-gvfs \ + --with-libcurl \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +mkdir -p $PKG/usr/share/applications $PKG/usr/share/application-registry +make install DESTDIR=$PKG || exit 1 + +# Add a manpage symlink for POLA-compliance +( cd $PKG/usr/man/man1 ; ln -sf gimptool-2.?.1 gimptool.1 ) + +( cd $PKG/usr/man + find . -type f -exec gzip -9 {} \; + for i in $(find . -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done +) + +mkdir -p $PKG/usr/doc/gimp-$VERSION +cp -a \ + AUTHORS COPYING HACKING INSTALL LICENSE NEWS README* docs/Wilber* \ + $PKG/usr/doc/gimp-$VERSION +( cd $PKG/usr/doc/gimp-$VERSION + for i in \ + libgimp libgimpbase libgimpcolor libgimpconfig libgimpmath \ + libgimpmodule libgimpthumb libgimpwidgets ; do \ + ln -s /usr/share/gtk-doc/html/$i $i-html ; + done +) + +find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/gimp-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/gimp/slack-desc b/source/xap/gimp/slack-desc new file mode 100644 index 00000000..9f9aca38 --- /dev/null +++ b/source/xap/gimp/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gimp: gimp (The GNU Image Manipulation Program) +gimp: +gimp: The GIMP is a powerful tool for the preparation and manipulation of +gimp: digital images. The GIMP provides the user with a wide variety of +gimp: image manipulation, painting, processing, and rendering tools. The +gimp: GIMP's open design and extensible architecture make for a very +gimp: powerful end product for photo and image retouching, web graphics +gimp: design, or digital illustration. +gimp: +gimp: +gimp: diff --git a/source/xap/gkrellm/gkrellm.SlackBuild b/source/xap/gkrellm/gkrellm.SlackBuild new file mode 100755 index 00000000..222f2567 --- /dev/null +++ b/source/xap/gkrellm/gkrellm.SlackBuild @@ -0,0 +1,117 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +VERSION=2.3.2 +PKGVER=2.3.2 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +if [ "$ARCH" = "x86_64" ]; then + LIBDIRSUFFIX="64" +else + LIBDIRSUFFIX="" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-gkrellm + +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf gkrellm-$VERSION +tar xvf $CWD/gkrellm-$VERSION.tar.bz2 || exit 1 +cd gkrellm-$VERSION || exit 1 +# Fix library paths (works for all ARCHs): +sed -i -e "s#lib/gkrellm2#lib${LIBDIRSUFFIX}/gkrellm2#g" $(grep -lr 'lib/gkrellm2' *) +# Increase the default width slightly, and don't use the text +# shadow effect by default (this seems better with Pango font +# rendering): +zcat $CWD/gkrellm.theme.defaults.diff.gz | patch -p1 --verbose || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +make \ + INSTALLROOT=/usr \ + INSTALLDIR=/usr/bin \ + INCLUDEDIR=/usr/include \ + MANDIR=/usr/man/man1 \ + LOCALEDIR=/usr/share/locale \ + PKGCONFIGDIR=/usr/lib${LIBDIRSUFFIX}/pkgconfig + +# We will need this installed to build plugins, so... +make install + +# Install to the $PKG dir: +make install \ + INSTALLROOT=$PKG/usr \ + INSTALLDIR=$PKG/usr/bin \ + INCLUDEDIR=$PKG/usr/include \ + MANDIR=$PKG/usr/man/man1 \ + LOCALEDIR=$PKG/usr/share/locale \ + PKGCONFIGDIR=$PKG/usr/lib${LIBDIRSUFFIX}/pkgconfig + +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/gkrellm2/plugins + +mkdir -p $PKG/usr/doc/gkrellm-$VERSION +cp -a \ + COPYRIGHT CREDITS INSTALL README Themes.html \ + $PKG/usr/doc/gkrellm-$VERSION + +gzip -9 $PKG/usr/man/man?/*.? + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +# Add optional plugin(s): +# The countdown plugin is needed to track X-Day. ;-) +COUNTDOWN=0.1.1 +cd $TMP +rm -rf gkrellm-countdown +tar xf $CWD/gkrellm-countdown-$COUNTDOWN.tar.gz || exit 1 +cd gkrellm-countdown || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; +make +cp gkrellm-countdown.so $PKG/usr/lib${LIBDIRSUFFIX}/gkrellm2/plugins + +mkdir -p $PKG/usr/doc/gkrellm-countdown-$COUNTDOWN +cp -a \ + COPYING ChangeLog README \ + $PKG/usr/doc/gkrellm-countdown-$COUNTDOWN + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +cd $PKG +/sbin/makepkg -l y -c n $TMP/gkrellm-$PKGVER-$ARCH-$BUILD.txz + diff --git a/source/xap/gkrellm/gkrellm.theme.defaults.diff b/source/xap/gkrellm/gkrellm.theme.defaults.diff new file mode 100644 index 00000000..aff6a9fb --- /dev/null +++ b/source/xap/gkrellm/gkrellm.theme.defaults.diff @@ -0,0 +1,11 @@ +--- ./src/config.c.orig 2008-10-03 19:33:37.000000000 -0500 ++++ ./src/config.c 2008-10-25 20:33:56.000000000 -0500 +@@ -1883,7 +1883,7 @@ + + _GK.chart_height_min = 5; + _GK.chart_height_max = 200; +- _GK.chart_width_ref = 60; ++ _GK.chart_width_ref = 75; + _GK.chart_text_no_fill = FALSE; + _GK.bg_separator_height = 2; + _GK.allow_scaling = FALSE; diff --git a/source/xap/gkrellm/slack-desc b/source/xap/gkrellm/slack-desc new file mode 100644 index 00000000..3540eb6a --- /dev/null +++ b/source/xap/gkrellm/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gkrellm: gkrellm (GNU Krell Monitors) +gkrellm: +gkrellm: GKrellM charts SMP CPU, load, Disk, and all active net interfaces +gkrellm: automatically. An on/off button and online timer for the PPP interface +gkrellm: is provided. Monitors for memory and swap usage, file system, internet +gkrellm: connections, APM laptop battery, mbox style mailboxes, and cpu temps. +gkrellm: Also includes an uptime monitor, hostname label, and clock/calendar. +gkrellm: +gkrellm: Bill Wilson is the author of GKrellM. +gkrellm: +gkrellm: diff --git a/source/xap/gnuchess/chess.png b/source/xap/gnuchess/chess.png Binary files differnew file mode 100644 index 00000000..6e4a1bff --- /dev/null +++ b/source/xap/gnuchess/chess.png diff --git a/source/xap/gnuchess/eboard.desktop b/source/xap/gnuchess/eboard.desktop new file mode 100644 index 00000000..f467664a --- /dev/null +++ b/source/xap/gnuchess/eboard.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=eboard +GenericName=Chess Game +Comment=A graphical chess engine frontend +Exec=eboard +Icon=/usr/share/pixmaps/chess.png +Terminal=false +Type=Application +Categories=Application;Game;BoardGame diff --git a/source/xap/gnuchess/gnuchess.SlackBuild b/source/xap/gnuchess/gnuchess.SlackBuild new file mode 100755 index 00000000..2b236ae4 --- /dev/null +++ b/source/xap/gnuchess/gnuchess.SlackBuild @@ -0,0 +1,176 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERGNUCHESS=5.07 +VERSJENG=11.2 +VEREBOARD=1.0.3 +VERXBOARD=4.2.7 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-4} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=/tmp/package-gnuchess + +rm -rf $PKG +mkdir -p $TMP $PKG + +### gnuchess +cd $TMP +rm -rf gnuchess-$VERGNUCHESS +tar xvf $CWD/gnuchess-$VERGNUCHESS.tar.bz2 || exit 1 +cd gnuchess-$VERGNUCHESS || exit 1 +# make gnuchess compile with gcc4 +zcat $CWD/gnuchess.gcc4_fix.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + $ARCH-slackware-linux +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +mkdir -p $PKG/usr/doc/gnuchess-$VERGNUCHESS +cp -a \ + doc/README \ + AUTHORS COPYING INSTALL NEWS TODO \ + $PKG/usr/doc/gnuchess-$VERGNUCHESS + +### Sjeng +cd $TMP +rm -rf Sjeng-Free-$VERSJENG +tar xvf $CWD/Sjeng-Free-$VERSJENG.tar.bz2 || exit 1 +cd Sjeng-Free-$VERSJENG || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + $ARCH-slackware-linux +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +mkdir -p $PKG/usr/doc/Sjeng-Free-$VERSJENG +cp -a \ + AUTHORS BUGS COPYING NEWS README THANKS TODO \ + $PKG/usr/doc/Sjeng-Free-$VERSJENG + +### eboard +cd $TMP +rm -rf eboard-$VEREBOARD +tar xvf $CWD/eboard-$VEREBOARD.tar.bz2 || exit 1 +cd eboard-$VEREBOARD || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +./configure \ + --prefix=/usr \ + --extra-flags=$(echo $SLKCFLAGS | sed -e "y/ /:/") +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +mkdir -p $PKG/usr/doc/eboard-$VEREBOARD +cp -a \ + AUTHORS COPYING README TODO Documentation/*.txt \ + $PKG/usr/doc/eboard-$VEREBOARD + +### XBoard +cd $TMP +rm -rf xboard-$VERXBOARD +tar xvf $CWD/xboard-$VERXBOARD.tar.bz2 || exit 1 +cd xboard-$VERXBOARD || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# --infodir is fubar. +zcat $CWD/xboard.infodir.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit 1 +# Taken from Debian to fix CVE-2004-2552 +# FOR WHICH THERE IS NO ATTACK VECTOR!!! +zcat $CWD/xboard.buffer_overflow_fix.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit 1 +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --infodir=/usr/info \ + --enable-zippy \ + --build=$ARCH-slackware-linux +make $NUMJOBS || make || exit 1 +install -c -s xboard $PKG/usr/bin/xboard +install -c -s zic2xpm $PKG/usr/bin/zic2xpm +install -c cmail $PKG/usr/bin/cmail +install -c ./pxboard $PKG/usr/bin/pxboard +install -c -m 644 ./xboard.man $PKG/usr/man/man6/xboard.6 +install -c -m 644 ./zic2xpm.man $PKG/usr/man/man6/zic2xpm.6 +mkdir -p $PKG/usr/info +install -c -m 644 xboard.info $PKG/usr/info/xboard.info +mkdir -p $PKG/usr/doc/xboard-$VERXBOARD +cp -a \ + AUTHORS COPYING COPYRIGHT FAQ FAQ.html NEWS READ_ME \ + $PKG/usr/doc/xboard-$VERXBOARD + +### Finish up... +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +gzip -9 $PKG/usr/man/man?/*.? +gzip -9 $PKG/usr/info/*.info +mkdir -p $PKG/usr/share/pixmaps +cat $CWD/chess.png > $PKG/usr/share/pixmaps/chess.png +mkdir -p $PKG/usr/share/applications +cat $CWD/eboard.desktop > $PKG/usr/share/applications/eboard.desktop +cat $CWD/xboard.desktop > $PKG/usr/share/applications/xboard.desktop + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/gnuchess-$VERGNUCHESS-$ARCH-$BUILD.txz + diff --git a/source/xap/gnuchess/gnuchess.SlackBuild.diff b/source/xap/gnuchess/gnuchess.SlackBuild.diff new file mode 100644 index 00000000..0112a9d2 --- /dev/null +++ b/source/xap/gnuchess/gnuchess.SlackBuild.diff @@ -0,0 +1,89 @@ +--- gnuchess.SlackBuild 2006-04-04 03:47:10.000000000 +0300 ++++ gnuchess.SlackBuild 2007-05-08 17:06:11.000000000 +0300 +@@ -4,10 +4,10 @@ + + VERGNUCHESS=5.07 + VERSJENG=11.2 +-VEREBOARD=0.9.5 ++VEREBOARD=1.0.3 + VERXBOARD=4.2.7 + ARCH=${ARCH:-i486} +-BUILD=${BUILD:-2} ++BUILD=${BUILD:-3} + + if [ "$ARCH" = "i386" ]; then + SLKCFLAGS="-O2 -march=i386 -mcpu=i686" +@@ -27,6 +27,8 @@ + rm -rf gnuchess-$VERGNUCHESS + tar xjvf $CWD/gnuchess-$VERGNUCHESS.tar.bz2 + cd gnuchess-$VERGNUCHESS ++# make gnuchess compile with gcc4 ++zcat $CWD/gnuchess.gcc4_fix.diff.gz | patch -p1 --verbose --backup --suffix=.orig + chown -R root:root . + find . -perm 664 -exec chmod 644 {} \; + find . -perm 600 -exec chmod 644 {} \; +@@ -93,33 +95,13 @@ + find . -perm 511 -exec chmod 755 {} \; + find . -perm 711 -exec chmod 755 {} \; + find . -perm 555 -exec chmod 755 {} \; +-CFLAGS="$SLKCFLAGS" \ + ./configure \ +- --prefix=/usr ++ --prefix=/usr --extra-flags=`echo $SLKCFLAGS | sed -e "y/ /:/"` + make -j3 +-#make install DESTDIR=$PKG +-install -d $PKG/usr/bin +-install -m 0755 eboard $PKG/usr/bin/eboard +-install -m 0755 eboard-config $PKG/usr/bin/eboard-config +-install -m 0755 eboard-addtheme $PKG/usr/bin/eboard-addtheme +-install -d $PKG/usr/man/man1 +-install -d $PKG/usr/man/man6 +-install -m 0644 eboard.6 $PKG/usr/man/man6 +-install -m 0644 eboard-addtheme.1 $PKG/usr/man/man1 +-install -m 0644 eboard-config.1 $PKG/usr/man/man1 +-install -d $PKG/usr/share/eboard +-install -m 0644 classic.png $PKG/usr/share/eboard/classic.png +-install -m 0644 ghouls.png $PKG/usr/share/eboard/ghouls.png +-install -m 0644 plastic.png $PKG/usr/share/eboard/plastic.png +-install -m 0644 eboard_themes.conf $PKG/usr/share/eboard/eboard_themes.conf +-install -m 0644 NAG.en.txt $PKG/usr/share/eboard/NAG.en.txt +-( cd multilang +- install -d $PKG/usr/share/eboard +- install -m 0644 eboard.cs.dict eboard.de.dict eboard.es.dict eboard.it.dict eboard.pt_BR.dict $PKG/usr/share/eboard +-) ++make install DESTDIR=$PKG + mkdir -p $PKG/usr/doc/eboard-$VEREBOARD + cp -a \ +- AUTHORS COPYING README TODO \ ++ AUTHORS COPYING README TODO Documentation/*.txt \ + $PKG/usr/doc/eboard-$VEREBOARD + + ### XBoard +@@ -140,6 +122,8 @@ + find . -perm 555 -exec chmod 755 {} \; + # --infodir is fubar. + zcat $CWD/xboard.infodir.diff.gz | patch -p1 --verbose --backup --suffix=.orig ++# Taken from Debian to fix CVE-2004-2552 ++zcat $CWD/xboard.buffer_overflow_fix.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit 1 + CFLAGS="$SLKCFLAGS" \ + ./configure \ + --prefix=/usr \ +@@ -153,6 +137,7 @@ + install -c ./pxboard $PKG/usr/bin/pxboard + install -c -m 644 ./xboard.man $PKG/usr/man/man6/xboard.6 + install -c -m 644 ./zic2xpm.man $PKG/usr/man/man6/zic2xpm.6 ++mkdir -p $PKG/usr/info + install -c -m 644 xboard.info $PKG/usr/info/xboard.info + mkdir -p $PKG/usr/doc/xboard-$VERXBOARD + cp -a \ +@@ -165,8 +150,9 @@ + find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + ) + gzip -9 $PKG/usr/man/man?/*.? ++gzip -9 $PKG/usr/info/*.info + mkdir -p $PKG/usr/share/pixmaps +-cat $CWD/chess.png > $PKG/usr/share/pixmaps/chess.png ++cp $CWD/chess.png $PKG/usr/share/pixmaps/chess.png + mkdir -p $PKG/usr/share/applications + cat $CWD/eboard.desktop > $PKG/usr/share/applications/eboard.desktop + cat $CWD/xboard.desktop > $PKG/usr/share/applications/xboard.desktop diff --git a/source/xap/gnuchess/gnuchess.gcc4_fix.diff b/source/xap/gnuchess/gnuchess.gcc4_fix.diff new file mode 100644 index 00000000..a6835194 --- /dev/null +++ b/source/xap/gnuchess/gnuchess.gcc4_fix.diff @@ -0,0 +1,11 @@ +--- gnuchess-5.07/src/input.c 2007-05-08 15:55:16.688003280 +0300 ++++ gnuchess-5.07/src/input.c 2007-05-08 15:55:29.238088685 +0300 +@@ -92,7 +92,7 @@ + fgets(inputstr, MAXSTR, stdin); + } + +-static pthread_t input_thread; ++pthread_t input_thread; + + /* Mutex and condition variable for thread communication */ + diff --git a/source/xap/gnuchess/slack-desc b/source/xap/gnuchess/slack-desc new file mode 100644 index 00000000..96776653 --- /dev/null +++ b/source/xap/gnuchess/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gnuchess: gnuchess (GPL licensed chess engines and graphical frontends) +gnuchess: +gnuchess: This is a package of programs for playing chess. It includes the +gnuchess: gnuchess and Sjeng chess engines, and the eboard and XBoard +gnuchess: graphical interfaces to these engines. +gnuchess: +gnuchess: +gnuchess: +gnuchess: +gnuchess: +gnuchess: diff --git a/source/xap/gnuchess/xboard.buffer_overflow_fix.diff b/source/xap/gnuchess/xboard.buffer_overflow_fix.diff new file mode 100644 index 00000000..f36d36ba --- /dev/null +++ b/source/xap/gnuchess/xboard.buffer_overflow_fix.diff @@ -0,0 +1,95 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 09_fix_-icshost_buffer_overflow.dpatch by Florian Ernst <florian@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Of minor importance, though, as there is probably no attack vector +## DP: See bug#343560 + +@DPATCH@ +diff -urNad xboard-4.2.7~/backend.c xboard-4.2.7/backend.c +--- xboard-4.2.7~/backend.c 2003-11-28 10:37:36.000000000 +0100 ++++ xboard-4.2.7/backend.c 2005-12-16 22:19:16.000000000 +0100 +@@ -692,7 +692,7 @@ + sprintf(buf, "Could not open comm port %s", + appData.icsCommPort); + } else { +- sprintf(buf, "Could not connect to host %s, port %s", ++ snprintf(buf, sizeof(buf), "Could not connect to host %s, port %s", + appData.icsHost, appData.icsPort); + } + DisplayFatalError(buf, err, 1); +@@ -869,18 +869,18 @@ + } else if (*appData.gateway != NULLCHAR) { + if (*appData.remoteShell == NULLCHAR) { + /* Use the rcmd protocol to run telnet program on a gateway host */ +- sprintf(buf, "%s %s %s", ++ snprintf(buf, sizeof(buf), "%s %s %s", + appData.telnetProgram, appData.icsHost, appData.icsPort); + return OpenRcmd(appData.gateway, appData.remoteUser, buf, &icsPR); + + } else { + /* Use the rsh program to run telnet program on a gateway host */ + if (*appData.remoteUser == NULLCHAR) { +- sprintf(buf, "%s %s %s %s %s", appData.remoteShell, ++ snprintf(buf, sizeof(buf), "%s %s %s %s %s", appData.remoteShell, + appData.gateway, appData.telnetProgram, + appData.icsHost, appData.icsPort); + } else { +- sprintf(buf, "%s %s -l %s %s %s %s", ++ snprintf(buf, sizeof(buf), "%s %s -l %s %s %s %s", + appData.remoteShell, appData.gateway, + appData.remoteUser, appData.telnetProgram, + appData.icsHost, appData.icsPort); +@@ -1684,7 +1684,7 @@ + + if (loggedOn && !have_set_title && ics_handle[0] != NULLCHAR) { + char buf[MSG_SIZ]; +- sprintf(buf, "%s@%s", ics_handle, appData.icsHost); ++ snprintf(buf, sizeof(buf), "%s@%s", ics_handle, appData.icsHost); + DisplayIcsInteractionTitle(buf); + have_set_title = TRUE; + } +@@ -4882,7 +4882,7 @@ + SendToProgram(buf, cps); + } + if (cps->sendICS) { +- sprintf(buf, "ics %s\n", appData.icsActive ? appData.icsHost : "-"); ++ snprintf(buf, sizeof(buf), "ics %s\n", appData.icsActive ? appData.icsHost : "-"); + SendToProgram(buf, cps); + } + cps->maybeThinking = FALSE; +diff -urNad xboard-4.2.7~/xboard.c xboard-4.2.7/xboard.c +--- xboard-4.2.7~/xboard.c 2003-11-19 09:42:18.000000000 +0100 ++++ xboard-4.2.7/xboard.c 2005-12-16 22:19:16.000000000 +0100 +@@ -6734,8 +6734,8 @@ + strcpy(icon, text); + strcpy(title, text); + } else if (appData.icsActive) { +- sprintf(icon, "%s", appData.icsHost); +- sprintf(title, "%s: %s", programName, appData.icsHost); ++ snprintf(icon, sizeof(icon), "%s", appData.icsHost); ++ snprintf(title, sizeof(title), "%s: %s", programName, appData.icsHost); + } else if (appData.cmailGameName[0] != NULLCHAR) { + sprintf(icon, "%s", "CMail"); + sprintf(title, "%s: %s", programName, "CMail"); +@@ -6804,7 +6804,7 @@ + } else { + fprintf(stderr, "%s: %s: %s\n", + programName, message, strerror(error)); +- sprintf(buf, "%s: %s", message, strerror(error)); ++ snprintf(buf, sizeof(buf), "%s: %s", message, strerror(error)); + message = buf; + } + if (appData.popupExitMessage && boardWidget && XtIsRealized(boardWidget)) { +@@ -7488,9 +7488,9 @@ + char cmdLine[MSG_SIZ]; + + if (port[0] == NULLCHAR) { +- sprintf(cmdLine, "%s %s", appData.telnetProgram, host); ++ snprintf(cmdLine, sizeof(cmdLine), "%s %s", appData.telnetProgram, host); + } else { +- sprintf(cmdLine, "%s %s %s", appData.telnetProgram, host, port); ++ snprintf(cmdLine, sizeof(cmdLine), "%s %s %s", appData.telnetProgram, host, port); + } + return StartChildProcess(cmdLine, "", pr); + } diff --git a/source/xap/gnuchess/xboard.desktop b/source/xap/gnuchess/xboard.desktop new file mode 100644 index 00000000..6336cb63 --- /dev/null +++ b/source/xap/gnuchess/xboard.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=XBoard +GenericName=Chess Game +Comment=A graphical chess engine frontend +Exec=xboard +Icon=/usr/share/pixmaps/chess.png +Terminal=false +Type=Application +Categories=Application;Game;BoardGame diff --git a/source/xap/gnuchess/xboard.infodir.diff b/source/xap/gnuchess/xboard.infodir.diff new file mode 100644 index 00000000..5c18bb02 --- /dev/null +++ b/source/xap/gnuchess/xboard.infodir.diff @@ -0,0 +1,11 @@ +--- ./Makefile.in.orig 2003-11-28 13:12:57.000000000 -0800 ++++ ./Makefile.in 2004-06-26 15:47:07.000000000 -0700 +@@ -21,7 +21,7 @@ + # Yuck; the autoconf generated configure script sets an infodir variable + # and provides a command-line flag to change it, but the default is + # /usr/info instead of /usr/share/info. +-infodir = $(prefix)/share/info ++infodir = /usr/info + + CC = @CC@ + CFLAGS = @CFLAGS@ @CPPFLAGS@ -DINFODIR=\"$(infodir)\" diff --git a/source/xap/gnuplot/gnuplot.SlackBuild b/source/xap/gnuplot/gnuplot.SlackBuild new file mode 100755 index 00000000..f154e16d --- /dev/null +++ b/source/xap/gnuplot/gnuplot.SlackBuild @@ -0,0 +1,115 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=4.2.5 +ARCH=${ARCH:-x86_64} +NUMJOBS=${NUMJOBS:-" -j7 "} +BUILD=${BUILD:-1} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-gnuplot + +rm -rf $PKG +mkdir -p $TMP $PKG +cd $TMP +rm -rf gnuplot-$VERSION +tar xvf $CWD/gnuplot-$VERSION.tar.?z* || exit 1 +cd gnuplot-$VERSION || exit 1 + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# To distribute gnuplot binaries, you can not use GNU readline, as +# gnuplot does not use a GPL compatible free license. +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --with-png \ + --with-gd \ + --datadir=/usr/share/gnuplot \ + --with-readline=builtin \ + --build=${ARCH}-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and if needed symlink the man pages: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + +# Compress info pages and purge "dir" file from the package: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +mkdir -p $PKG/usr/doc/gnuplot-$VERSION +cp -a \ + BUGS CodeStyle Copyright FAQ INSTALL NEWS PATCHLEVEL PGPKEYS PORTING \ + README* TODO VERSION \ + $PKG/usr/doc/gnuplot-$VERSION +cp -a demo $PKG/usr/doc/gnuplot-$VERSION +rm -f $PKG/usr/doc/gnuplot-$VERSION/demo/Make* + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +# Make the package: +cd $PKG +/sbin/makepkg -l y -c n $TMP/gnuplot-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/gnuplot/slack-desc b/source/xap/gnuplot/slack-desc new file mode 100644 index 00000000..f0007b4a --- /dev/null +++ b/source/xap/gnuplot/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gnuplot: gnuplot (plotting utility) +gnuplot: +gnuplot: Gnuplot is a command-line driven interactive function plotting utility +gnuplot: for UNIX, MSDOS, and VMS platforms. The software is copyrighted but +gnuplot: freely distributed (i.e., you don't have to pay for it). It was +gnuplot: originally intended as graphical program which would allow scientists +gnuplot: and students to visualize mathematical functions and data. Gnuplot +gnuplot: supports many different types of terminals, plotters, and printers +gnuplot: (including many color devices, and pseudo-devices like LaTeX) and is +gnuplot: easily extensible to include new devices. +gnuplot: diff --git a/source/xap/gqview/doinst.sh b/source/xap/gqview/doinst.sh new file mode 100644 index 00000000..31da2264 --- /dev/null +++ b/source/xap/gqview/doinst.sh @@ -0,0 +1,7 @@ +if [ -x /usr/bin/update-desktop-database ]; then + /usr/bin/update-desktop-database usr/share/applications >/dev/null 2>&1 +fi +if [ -x /usr/bin/gtk-update-icon-cache ]; then + /usr/bin/gtk-update-icon-cache -f -t usr/share/icons/hicolor > /dev/null 2>&1 +fi + diff --git a/source/xap/gqview/gqview.SlackBuild b/source/xap/gqview/gqview.SlackBuild new file mode 100755 index 00000000..74e0a3a9 --- /dev/null +++ b/source/xap/gqview/gqview.SlackBuild @@ -0,0 +1,103 @@ +#!/bin/sh + +# Copyright 2006 Robby Workman (http://rlworkman.net) +# Copyright 2007, 2009 Patrick Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +# Modified by the SlackBuilds.org project + + +PRGNAM=gqview +VERSION=2.1.5 +ARCH=${ARCH:-x86_64} +NUMJOBS=${NUMJOBS:-" -j7 "} +BUILD=${BUILD:-2} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-$PRGNAM +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf $PRGNAM-$VERSION +tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2 || exit 1 +cd $PRGNAM-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --mandir=/usr/man \ + --program-prefix="" \ + --program-suffix="" \ + --build=i486-slackware-linux + +make $NUMJOBS || make || exit 1 +make install-strip DESTDIR=$PKG || exit 1 + +mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION +cp -a \ + AUTHORS COPYING ChangeLog INSTALL NEWS README TODO \ + $PKG/usr/doc/$PRGNAM-$VERSION +cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild +mv $PKG/usr/share/doc/$PRGNAM-$VERSION/* $PKG/usr/doc/$PRGNAM-$VERSION +rm -r $PKG/usr/share/doc + +# Compress and if needed symlink the man pages: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc +zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh + +cd $PKG +/sbin/makepkg -l y -c n $TMP/$PRGNAM-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/gqview/slack-desc b/source/xap/gqview/slack-desc new file mode 100644 index 00000000..d6a6ceab --- /dev/null +++ b/source/xap/gqview/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gqview: gqview (GQview Image Browser) +gqview: +gqview: GQview is an image browser that features single-click access to view +gqview: images and move around the directory tree. +gqview: +gqview: Homepage: http://gqview.sourceforge.net/ +gqview: +gqview: +gqview: +gqview: +gqview: diff --git a/source/xap/gucharmap/doinst.sh b/source/xap/gucharmap/doinst.sh new file mode 100644 index 00000000..4e8ba707 --- /dev/null +++ b/source/xap/gucharmap/doinst.sh @@ -0,0 +1,4 @@ +if [ -x /usr/bin/update-desktop-database ]; then + /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1 +fi + diff --git a/source/xap/gucharmap/gucharmap.SlackBuild b/source/xap/gucharmap/gucharmap.SlackBuild new file mode 100755 index 00000000..36f52614 --- /dev/null +++ b/source/xap/gucharmap/gucharmap.SlackBuild @@ -0,0 +1,92 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=${VERSION:-2.26.2} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-gucharmap +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf gucharmap-$VERSION +tar xvf $CWD/gucharmap-$VERSION.tar.?z* || exit 1 +cd gucharmap-$VERSION || exit 1 +#zcat $CWD/gucharmap.noscrollkeeper.diff.gz | patch -p1 --verbose || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --sysconfdir=/etc \ + --localstatedir=/var/lib \ + --docdir=/usr/doc/gucharmap-$VERSION \ + --enable-static=no \ + --enable-python-bindings \ + --disable-gconf \ + --disable-schemas-install \ + --disable-scrollkeeper \ + --build=$ARCH-slackware-linux + +make -i $NUMJOBS || make || exit 1 +make -i install DESTDIR=$PKG || exit 1 + +# We don't want the gconf stuff +rm -rf $PKG/etc + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/usr/doc/gucharmap-$VERSION +cp -a \ + COPYING* NEWS README TODO \ + $PKG/usr/doc/gucharmap-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/gucharmap-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/gucharmap/slack-desc b/source/xap/gucharmap/slack-desc new file mode 100644 index 00000000..798e123b --- /dev/null +++ b/source/xap/gucharmap/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gucharmap: gucharmap (character map utility) +gucharmap: +gucharmap: gucharmap is a Unicode character map and font viewer. +gucharmap: +gucharmap: +gucharmap: +gucharmap: +gucharmap: +gucharmap: +gucharmap: +gucharmap: diff --git a/source/xap/gv/gv.SlackBuild b/source/xap/gv/gv.SlackBuild new file mode 100755 index 00000000..d28abd8e --- /dev/null +++ b/source/xap/gv/gv.SlackBuild @@ -0,0 +1,113 @@ +#!/bin/sh + +# Copyright 2006, 2007, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=gv +VERSION=${VERSION:-3.6.7} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.?z* || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Configure: +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libdir=/etc/X11 \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --program-prefix= \ + --program-suffix= \ + --build=$ARCH-slackware-linux + +# Build and install: +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.* + ) + done + ) +fi + +# Compress info files, if any: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION +cp -a \ + AUTHORS COPYING INSTALL NEWS README \ + $PKG/usr/doc/${PKGNAM}-$VERSION + +mkdir -p $PKG/install +#zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/gv/slack-desc b/source/xap/gv/slack-desc new file mode 100644 index 00000000..00626777 --- /dev/null +++ b/source/xap/gv/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gv: gv (PS/PDF file viewer) +gv: +gv: gv is a PostScript and PDF previewer. It allows users to view and +gv: navigate through PostScript and PDF documents on an X display by +gv: providing a user interface for the ghostscript interpreter. +gv: +gv: gv was written by Johannes Plass, using the source code for Tim +gv: Theisen's ghostview 1.5 as a starting point. +gv: +gv: +gv: diff --git a/source/xap/gxine/gxine.SlackBuild b/source/xap/gxine/gxine.SlackBuild new file mode 100755 index 00000000..d9b75d0b --- /dev/null +++ b/source/xap/gxine/gxine.SlackBuild @@ -0,0 +1,99 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +VERSION=0.5.903 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-2} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-gxine +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf gxine-$VERSION +tar xvf $CWD/gxine-$VERSION.tar.bz2 || exit 1 +cd gxine-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --sysconfdir=/etc \ + --localstatedir=/var/lib \ + --mandir=/usr/man \ + --disable-static \ + --with-browser-plugin \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +#zcat $CWD/gxine.desktop.gz > $PKG/usr/share/applications/gxine.desktop +#if [ ! -r $PKG/usr/share/pixmaps/gxine.png ]; then +# exit 1 +#fi + +# I'm sorry, but making this link was the worst suggestion I ever +# went along with. I'll continue to include it (for now), but having +# (buggy) gxine pop up without prompting all the time is ANNOYING!!! +#mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/mozilla/plugins +#( cd $PKG/usr/lib${LIBDIRSUFFIX}/mozilla/plugins +# ln -sf /usr/lib${LIBDIRSUFFIX}/gxine/gxineplugin.so . +#) + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +find $PKG/usr/man -type f -exec gzip -9 {} \; + +mkdir -p $PKG/usr/doc/gxine-$VERSION +cp -a \ + ABOUT-NLS AUTHORS COPYING* INSTALL NEWS README TODO \ + $PKG/usr/doc/gxine-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/gxine-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/gxine/gxine.desktop b/source/xap/gxine/gxine.desktop new file mode 100644 index 00000000..54e5e6c2 --- /dev/null +++ b/source/xap/gxine/gxine.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Version=1.0 +Encoding=UTF-8 +Name=gxine +GenericName=Video Player +Comment=Play films and songs, or watch digital TV +Exec=gxine +MultipleArgs=true +Icon=/usr/share/pixmaps/gxine.png +Terminal=false +Type=Application +StartupNotify=true +Categories=GTK;Application;AudioVideo; +MimeType=video/mpeg;video/msvideo;video/quicktime;video/x-avi;video/x-ms-asf;video/x-ms-wmv;video/x-msvideo;application/x-ogg;application/ogg;audio/x-mp3;audio/x-mpeg;video/x-mpeg;video/x-fli;audio/x-wav;audio/x-mpegurl;audio/x-scpls;audio/x-ms-asx;application/vnd.rn-realmedia;audio/x-real-audio;audio/x-pn-realaudio;application/x-flac;audio/x-flac;application/x-shockwave-flash;audio/mpeg;audio/x-ms-asf;audio/x-m4a;audio/x-ms-wax;video/dv;video/x-anim;video/x-flc;misc/ultravox;application/x-matroska;audio/vnd.rn-realaudio;audio/x-pn-aiff;audio/x-pn-au;audio/x-pn-wav;audio/x-pn-windows-acm;image/vnd.rn-realpix;video/vnd.rn-realvideo diff --git a/source/xap/gxine/slack-desc b/source/xap/gxine/slack-desc new file mode 100644 index 00000000..18f7cef4 --- /dev/null +++ b/source/xap/gxine/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gxine: gxine (GTK+ media player based on Xine) +gxine: +gxine: Xine is a free multimedia player. It plays back CDs, DVDs, and VCDs, +gxine: multimedia files, and multimedia streamed over a network. +gxine: +gxine: The gxine package contains a GTK+ graphical user interface for the +gxine: Xine multimedia player. +gxine: +gxine: +gxine: +gxine: diff --git a/source/xap/imagemagick/imagemagick.SlackBuild b/source/xap/imagemagick/imagemagick.SlackBuild new file mode 100755 index 00000000..cfa07497 --- /dev/null +++ b/source/xap/imagemagick/imagemagick.SlackBuild @@ -0,0 +1,140 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, Minnesota, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +ARCH=${ARCH:-x86_64} +NUMJOBS=${NUMJOBS:-" -j7 "} +BUILD=${BUILD:-1} + + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-imagemagick +rm -rf $PKG +mkdir -p $TMP $PKG + +# NOTE: This is to cope with ImageMagick version numbers such as 5.4.7-4, +# which occur fairly often (but not always). If these numbers are all the same, +# then this is not one of those versions. + +# This is a bit messy, so we'll explain it well. :-) + +# This is the base version number, which is needed to cd into the source tree +BASEVER=6.5.3-3 + +# This is the version number used in the source tarball filename +FILEVER=6.5.3-3 + +# This is the version number used in the package, where a version number cannot +# contain a '-' +PKGVER=6.5.3_3 + +# --with-x or not --with-x, that is the question. It seems many other +# distributions don't compile with X support, but it's been traditional +# here. I am moving the prefix to /usr (instead of /usr/X11R6) though, +# because many X-linked things are put into /usr now (like GNOME), and +# I've heard a few reports of compile failures when this isn't in /usr. +# Everyone else does it -- time to follow the path of least resistance. + +cd $TMP +rm -rf ImageMagick-$BASEVER +tar xvf $CWD/ImageMagick-$FILEVER.tar.?z* || exit 1 +cd ImageMagick-$BASEVER || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# --without-modules seems to avoid a segfault when identifying +# or converting ps or eps files... + +# --disable-openmp seems to keep the perl Image::Magick from +# eating up all RAM, and may help other script bindings. + +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --program-prefix= \ + --with-x \ + --with-frozenpaths=no \ + --without-modules \ + --disable-openmp \ + --enable-static=no \ + --enable-shared \ + --with-perl \ + --build=$ARCH-slackware-linux + +make $NUMJOBS INSTALLDIRS=vendor || make INSTALLDIRS=vendor || exit 1 +make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + +# Lately ImageMagick has been smoking crack: +rm -f $PKG/usr/lib${LIBDIRSUFFIX}/libltdl.* + +( cd $PKG + # Nothing but a perl upgrade should replace this (and maybe not even that) + find . -name perllocal.pod | xargs rm -f +) + +# DESTDIR is still broken about this, but works well enough otherwise: +chmod 644 $PKG/usr/share/man/man3/* +mv $PKG/usr/share/man/man3 $PKG/usr/man +rmdir $PKG/usr/share/man + +( cd $PKG/usr/lib${LIBDIRSUFFIX}/perl5 + # Ditch empty dirs: + rmdir */* 2> /dev/null + rmdir * 2> /dev/null +) + +find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +gzip -9 $PKG/usr/man/man?/*.? + +mkdir -p $PKG/usr +mv $PKG/usr/share/doc $PKG/usr +cp -a \ + AUTHORS LICENSE NEWS NOTICE Platforms.txt QuickStart.txt README.txt \ + $PKG/usr/doc/Imag* + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/imagemagick-$PKGVER-$ARCH-$BUILD.txz + diff --git a/source/xap/imagemagick/slack-desc b/source/xap/imagemagick/slack-desc new file mode 100644 index 00000000..80ac9a67 --- /dev/null +++ b/source/xap/imagemagick/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +imagemagick: imagemagick (a robust collection of image processing tools) +imagemagick: +imagemagick: ImageMagick is a collection of tools for manipulating and displaying +imagemagick: digital images. It can merge images, transform image dimensions, +imagemagick: do screen captures, create animation sequences, and convert between +imagemagick: many different image formats. +imagemagick: +imagemagick: ImageMagick was written by John Cristy of ImageMagick Studio. +imagemagick: +imagemagick: Home page: http://www.imagemagick.org/ +imagemagick: diff --git a/source/xap/mozilla-firefox/firefox.moz_plugin_path.diff b/source/xap/mozilla-firefox/firefox.moz_plugin_path.diff new file mode 100644 index 00000000..761f295a --- /dev/null +++ b/source/xap/mozilla-firefox/firefox.moz_plugin_path.diff @@ -0,0 +1,17 @@ +--- ./firefox.orig 2008-05-29 15:21:18.000000000 -0500 ++++ ./firefox 2008-06-17 12:19:26.000000000 -0500 +@@ -54,6 +54,14 @@ + + moz_libdir=/usr/local/lib/firefox-3.0 + ++# Include /usr/lib/mozilla/plugins in the plugin path: ++if [ "$MOZ_PLUGIN_PATH" ] ; then ++ MOZ_PLUGIN_PATH=$MOZ_PLUGIN_PATH:${moz_libdir}/plugins:/usr/lib/mozilla/plugins ++else ++ MOZ_PLUGIN_PATH=${moz_libdir}/plugins:/usr/lib/mozilla/plugins ++fi ++export MOZ_PLUGIN_PATH ++ + # Use run-mozilla.sh in the current dir if it exists + # If not, then start resolving symlinks until we find run-mozilla.sh + found=0 diff --git a/source/xap/mozilla-firefox/firefox.png b/source/xap/mozilla-firefox/firefox.png Binary files differnew file mode 100644 index 00000000..76204b5d --- /dev/null +++ b/source/xap/mozilla-firefox/firefox.png diff --git a/source/xap/mozilla-firefox/mimeTypes.rdf b/source/xap/mozilla-firefox/mimeTypes.rdf new file mode 100644 index 00000000..f3bc7b40 --- /dev/null +++ b/source/xap/mozilla-firefox/mimeTypes.rdf @@ -0,0 +1,28 @@ +<?xml version="1.0"?> +<RDF:RDF xmlns:NC="http://home.netscape.com/NC-rdf#" + xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <RDF:Seq RDF:about="urn:mimetypes:root"> + </RDF:Seq> + <RDF:Description RDF:about="urn:mimetypes"> + <NC:MIME-types RDF:resource="urn:mimetypes:root"/> + </RDF:Description> + <RDF:Description RDF:about="urn:scheme:mailto" + NC:value="mailto"> + <NC:handlerProp RDF:resource="urn:scheme:handler:mailto"/> + </RDF:Description> + <RDF:Description RDF:about="urn:handler:web:http://compose.mail.yahoo.com/?To=%s" + NC:prettyName="Yahoo! Mail" + NC:uriTemplate="http://compose.mail.yahoo.com/?To=%s" /> + <RDF:Description RDF:about="urn:handler:web:https://mail.google.com/mail/?extsrc=mailto&url=%s" + NC:prettyName="GMail" + NC:uriTemplate="https://mail.google.com/mail/?extsrc=mailto&url=%s" /> + <RDF:Description RDF:about="urn:scheme:handler:mailto" + NC:alwaysAsk="true"> + <NC:possibleApplication RDF:resource="urn:handler:web:http://compose.mail.yahoo.com/?To=%s"/> + <NC:possibleApplication RDF:resource="urn:handler:web:https://mail.google.com/mail/?extsrc=mailto&url=%s"/> + <NC:possibleApplication RDF:resource="urn:handler:local:/usr/bin/thunderbird"/> + </RDF:Description> + <RDF:Description RDF:about="urn:handler:local:/usr/bin/thunderbird" + NC:prettyName="thunderbird" + NC:path="/usr/bin/thunderbird" /> +</RDF:RDF> diff --git a/source/xap/mozilla-firefox/mozilla-firefox-mimeTypes-fix.diff b/source/xap/mozilla-firefox/mozilla-firefox-mimeTypes-fix.diff new file mode 100644 index 00000000..22211304 --- /dev/null +++ b/source/xap/mozilla-firefox/mozilla-firefox-mimeTypes-fix.diff @@ -0,0 +1,45 @@ +diff -Nur mozilla-1.9.1.orig/browser/locales/generic/profile/mimeTypes.rdf mozilla-1.9.1/browser/locales/generic/profile/mimeTypes.rdf +--- mozilla-1.9.1.orig/browser/locales/generic/profile/mimeTypes.rdf 2009-06-29 11:14:41.000000000 -0500 ++++ mozilla-1.9.1/browser/locales/generic/profile/mimeTypes.rdf 2009-07-01 08:28:05.407353867 -0500 +@@ -1,13 +1,28 @@ +-<?xml version="1.0"?> +- +-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" +- xmlns:NC="http://home.netscape.com/NC-rdf#" +- xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> +- +- <Description about="urn:mimetypes"> +- <NC:MIME-types> +- <Seq about="urn:mimetypes:root"> +- </Seq> +- </NC:MIME-types> +- </Description> +-</RDF> ++<?xml version="1.0"?> ++<RDF:RDF xmlns:NC="http://home.netscape.com/NC-rdf#" ++ xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> ++ <RDF:Seq RDF:about="urn:mimetypes:root"> ++ </RDF:Seq> ++ <RDF:Description RDF:about="urn:mimetypes"> ++ <NC:MIME-types RDF:resource="urn:mimetypes:root"/> ++ </RDF:Description> ++ <RDF:Description RDF:about="urn:scheme:mailto" ++ NC:value="mailto"> ++ <NC:handlerProp RDF:resource="urn:scheme:handler:mailto"/> ++ </RDF:Description> ++ <RDF:Description RDF:about="urn:handler:web:http://compose.mail.yahoo.com/?To=%s" ++ NC:prettyName="Yahoo! Mail" ++ NC:uriTemplate="http://compose.mail.yahoo.com/?To=%s" /> ++ <RDF:Description RDF:about="urn:handler:web:https://mail.google.com/mail/?extsrc=mailto&url=%s" ++ NC:prettyName="GMail" ++ NC:uriTemplate="https://mail.google.com/mail/?extsrc=mailto&url=%s" /> ++ <RDF:Description RDF:about="urn:scheme:handler:mailto" ++ NC:alwaysAsk="true"> ++ <NC:possibleApplication RDF:resource="urn:handler:web:http://compose.mail.yahoo.com/?To=%s"/> ++ <NC:possibleApplication RDF:resource="urn:handler:web:https://mail.google.com/mail/?extsrc=mailto&url=%s"/> ++ <NC:possibleApplication RDF:resource="urn:handler:local:/usr/bin/thunderbird"/> ++ </RDF:Description> ++ <RDF:Description RDF:about="urn:handler:local:/usr/bin/thunderbird" ++ NC:prettyName="thunderbird" ++ NC:path="/usr/bin/thunderbird" /> ++</RDF:RDF> diff --git a/source/xap/mozilla-firefox/mozilla-firefox.SlackBuild b/source/xap/mozilla-firefox/mozilla-firefox.SlackBuild new file mode 100755 index 00000000..22dfb33b --- /dev/null +++ b/source/xap/mozilla-firefox/mozilla-firefox.SlackBuild @@ -0,0 +1,184 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, Minnesota, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +# Thanks to the folks at the Mozilla Foundation for permission to +# distribute this, and for all the great work! :-) + +# This is a source build script. Unfortunately, there is no official +# binary tarball available for x86_64 + +VERSION=${VERSION:-3.5.2} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +MOZVERS=${MOZVERS:-1.9.1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +# Try to be gentle to the compiler, no optimizations: +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O -fPIC" + LIBDIRSUFFIX="64" +elif [ "$ARCH" = "arm" ]; then + SLKCFLAGS="-O2 -march=armv4 -mtune=xscale" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "armel" ]; then + SLKCFLAGS="-O2 -march=armv4t" + LIBDIRSUFFIX="" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-mozilla-firefox + +rm -rf $PKG +mkdir -p $TMP $PKG/usr/lib${LIBDIRSUFFIX} + +cd $TMP +rm -rf mozilla-$MOZVERS +tar xvf $CWD/firefox-$VERSION-source.tar.bz2 || exit 1 +cd mozilla-$MOZVERS || exit 1 + +# Fix a long standing bug that's prevented staying current on GTK+. +# Thanks to the BLFS folks. :-) +cat << EOF >> layout/build/Makefile.in + +ifdef MOZ_ENABLE_CANVAS +EXTRA_DSO_LDOPTS += \$(XLDFLAGS) -lX11 -lXrender +endif + +EOF + +# Patch mimeTypes.rdf +# Uncomment this if you want to use the patch; otherwise, we overwrite the +# mimeTypes.rdf inside the package directory later +# zcat $CWD/mozilla-firefox-mimeTypes-fix.diff.gz | patch -p1 || exit 1 + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +export MOZILLA_OFFICIAL="1" && +export BUILD_OFFICIAL="1" && +export MOZ_PHOENIX="1" && +export CFLAGS="$SLKCFLAGS" && +export CXXFLAGS="$SLKCFLAGS" && +./configure \ + --enable-official-branding \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --with-default-mozilla-five-home=/usr/lib${LIBDIRSUFFIX}/firefox-$VERSION \ + --with-system-zlib \ + --enable-application=browser \ + --enable-default-toolkit=cairo-gtk2 \ + --enable-crypto \ + --enable-svg \ + --enable-canvas \ + --enable-xft \ + --enable-xinerama \ + --enable-optimize \ + --enable-reorder \ + --enable-strip \ + --enable-system-cairo \ + --enable-cpp-rtti \ + --enable-single-profile \ + --disable-ldap \ + --disable-accessibility \ + --disable-debug \ + --disable-tests \ + --disable-logging \ + --disable-pedantic \ + --disable-installer \ + --disable-mailnews \ + --disable-composer \ + --disable-profilesharing + # Complains about missing APNG support in Slackware's libpng: + #--with-system-png \ + +#make -f client.mk build MOZ_MAKE_FLAGS="$NUMJOBS" || exit 1 +make MOZ_MAKE_FLAGS="$NUMJOBS" || exit 1 +make install DESTDIR=$PKG || exit 1 + +# We don't need these (just symlinks anyway): +rm -rf $PKG/usr/lib${LIBDIRSUFFIX}/firefox-devel-$VERSION + +# Nor these: +rm -rf $PKG/usr/include + +( cd $PKG/usr/lib${LIBDIRSUFFIX}/firefox-$VERSION + #mv defaults/profile/mimeTypes.rdf defaults/profile/mimeTypes.rdf.orig || exit 1 + zcat $CWD/mimeTypes.rdf > defaults/profile/mimeTypes.rdf || exit 1 + zcat $CWD/firefox.moz_plugin_path.diff.gz \ + | sed -e "s#usr/lib#usr/lib${LIBDIRSUFFIX}#g" \ + | patch -p1 --verbose --backup --suffix=.orig || exit 1 + # Clean up if the above patch was successful: + rm -f firefox.orig +) || exit + +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/mozilla/plugins +mkdir -p $PKG/usr/share/applications +cat $CWD/mozilla-firefox.desktop > $PKG/usr/share/applications/mozilla-firefox.desktop +mkdir -p $PKG/usr/share/pixmaps +cat $CWD/firefox.png > $PKG/usr/share/pixmaps/firefox.png + +# These files/directories are usually created if Firefox is run as root, +# which on many systems might (and possibly should) be never. Therefore, if we +# don't see them we'll put stubs in place to prevent startup errors. +( cd $PKG/usr/lib${LIBDIRSUFFIX}/firefox-$VERSION + if [ -d extensions/talkback\@mozilla.org ]; then + if [ ! -r extensions/talkback\@mozilla.org/chrome.manifest ]; then + echo > extensions/talkback\@mozilla.org/chrome.manifest + fi + fi + if [ ! -d updates ]; then + mkdir -p updates/0 + fi +) + +# Need some default icons in the right place: +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/firefox-$VERSION/chrome/icons/default +install -m 644 other-licenses/branding/firefox/default16.png \ + $PKG/usr/lib${LIBDIRSUFFIX}/firefox-$VERSION/icons/ +install -m 644 other-licenses/branding/firefox/default16.png \ + $PKG/usr/lib${LIBDIRSUFFIX}/firefox-$VERSION/chrome/icons/default/ +( cd $PKG/usr/lib${LIBDIRSUFFIX}/firefox-$VERSION + install -m 644 icons/{default,mozicon50}.xpm chrome/icons/default/ +) + +# Copy over the LICENSE +install -p -c -m 644 LICENSE $PKG/usr/lib${LIBDIRSUFFIX}/firefox-$VERSION/ + +mkdir $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/mozilla-firefox-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/mozilla-firefox/mozilla-firefox.desktop b/source/xap/mozilla-firefox/mozilla-firefox.desktop new file mode 100644 index 00000000..23be26f3 --- /dev/null +++ b/source/xap/mozilla-firefox/mozilla-firefox.desktop @@ -0,0 +1,80 @@ +[Desktop Entry] +Exec=firefox %u +Icon=firefox +Type=Application +Categories=Network; +Name=Firefox +Name[bn]=ফায়ারফকà§à¦¸ +Name[eo]=Mozilo Fajrovulpo +Name[fi]=Mozilla Firefox +Name[pa]=ਫਾਇਰਫੋਕਸ +Name[tg]=Рӯбоҳи оташин +GenericName=Web Browser +GenericName[af]=Web Blaaier +GenericName[ar]=متصÙØ ÙˆÙŠØ¨ +GenericName[az]=Veb SÉ™yyahı +GenericName[bg]=Браузър +GenericName[bn]=ওয়েব বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° +GenericName[br]=Furcher ar Gwiad +GenericName[bs]=WWW Preglednik +GenericName[ca]=Fullejador web +GenericName[cs]=WWW prohlÞeÄ +GenericName[cy]=Porydd Gwe +GenericName[da]=Browser +GenericName[de]=Web-Browser +GenericName[el]=ΠεÏιηγητής Î™ÏƒÏ„Î¿Ï +GenericName[eo]=TTT-legilo +GenericName[es]=Navegador web +GenericName[et]=Veebilehitseja +GenericName[eu]=Web arakatzailea +GenericName[fa]=مرورگر وب +GenericName[fi]=WWW-selain +GenericName[fo]=Alnótsfar +GenericName[fr]=Navigateur web +GenericName[gl]=Navegador Web +GenericName[he]=דפדפן ××™× ×˜×¨× ×˜ +GenericName[hi]=वेब बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° +GenericName[hr]=Web preglednik +GenericName[hu]=WebböngészÅ‘ +GenericName[is]=Vafri +GenericName[it]=Browser Web +GenericName[ja]=ウェブブラウザ +GenericName[ko]=웹 브ë¼ìš°ì € +GenericName[lo]=ເວັບບຣາວເຊີ +GenericName[lt]=Žiniatinklio narÅ¡yklÄ— +GenericName[lv]=Web PÄrlÅ«ks +GenericName[mk]=ПрелиÑтувач на Интернет +GenericName[mn]=Веб-Хөтөч +GenericName[nb]=Nettleser +GenericName[nds]=Nettkieker +GenericName[nl]=Webbrowser +GenericName[nn]=Nettlesar +GenericName[nso]=Seinyakisi sa Web +GenericName[pa]=ਵੈਬ à¨à¨²à¨•à¨¾à¨°à¨¾ +GenericName[pl]=PrzeglÄ…darka WWW +GenericName[pt]=Navegador Web +GenericName[pt_BR]=Navegador Web +GenericName[ro]=Navigator de web +GenericName[ru]=Веб-браузер +GenericName[se]=Fierpmádatlogan +GenericName[sk]=Webový prehliadaÄ +GenericName[sl]=Spletni brskalnik +GenericName[sr]=Веб претраживач +GenericName[sr@Latn]=Veb pretraživaÄ +GenericName[ss]=Ibrawuza yeWeb +GenericName[sv]=Webbläsare +GenericName[ta]=வலை உலாவி +GenericName[tg]=ТафÑиргари вÑб +GenericName[th]=เว็บบราวเซà¸à¸£à¹Œ +GenericName[tr]=Web Tarayıcı +GenericName[uk]=Ðавігатор Тенет +GenericName[uz]=Веб-браузер +GenericName[ven]=Buronza ya Webu +GenericName[vi]=Trình duyệt Web +GenericName[wa]=Betchteu waibe +GenericName[xh]=Umkhangeli zincwadi we Web +GenericName[zh_CN]=网页æµè§ˆå™¨ +GenericName[zh_TW]=網é ç€è¦½å™¨ +GenericName[zu]=Umcingi we-Web +MimeType=text/html; +X-KDE-StartupNotify=true diff --git a/source/xap/mozilla-firefox/slack-desc b/source/xap/mozilla-firefox/slack-desc new file mode 100644 index 00000000..a54bac8f --- /dev/null +++ b/source/xap/mozilla-firefox/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +mozilla-firefox: mozilla-firefox (Mozilla Firefox Web browser) +mozilla-firefox: +mozilla-firefox: This project is a redesign of the Mozilla browser component written +mozilla-firefox: using the XUL user interface language. Firefox empowers you to +mozilla-firefox: browse faster, more safely and more efficiently than with any other +mozilla-firefox: browser. +mozilla-firefox: +mozilla-firefox: Visit the Mozilla Firefox project online: +mozilla-firefox: http://www.mozilla.org/projects/firefox/ +mozilla-firefox: +mozilla-firefox: diff --git a/source/xap/mozilla-thunderbird/mozilla-thunderbird-firefox.diff b/source/xap/mozilla-thunderbird/mozilla-thunderbird-firefox.diff new file mode 100644 index 00000000..fdf20963 --- /dev/null +++ b/source/xap/mozilla-thunderbird/mozilla-thunderbird-firefox.diff @@ -0,0 +1,11 @@ +--- ./defaults/pref/all-thunderbird.js.orig 2005-10-25 22:03:39.000000000 -0500 ++++ ./defaults/pref/all-thunderbird.js 2005-12-09 16:22:00.000000000 -0600 +@@ -440,3 +440,8 @@ + + // prevent status-bar spoofing even if people are foolish enough to turn on JS + pref("dom.disable_window_status_change", true); ++ ++// Use Firefox as the default for http:// and https:// links ++pref("network.protocol-handler.app.http", "/usr/bin/firefox"); ++pref("network.protocol-handler.app.https", "/usr/bin/firefox"); ++ diff --git a/source/xap/mozilla-thunderbird/mozilla-thunderbird.SlackBuild b/source/xap/mozilla-thunderbird/mozilla-thunderbird.SlackBuild new file mode 100755 index 00000000..9872927d --- /dev/null +++ b/source/xap/mozilla-thunderbird/mozilla-thunderbird.SlackBuild @@ -0,0 +1,141 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +# Thanks to the folks at the Mozilla Foundation for permission to +# distribute this, and for all the great work! :-) + +VERSION=2.0.0.23 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-Os -march=i486 -mcpu=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-Os" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-Os -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-mozilla-thunderbird + +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf mozilla +tar xvf $CWD/thunderbird-$VERSION-source.tar.bz2 || exit 1 +cd mozilla || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +export MOZILLA_OFFICIAL="1" && +export BUILD_OFFICIAL="1" && +export MOZ_CO_PROJECT="mail" && +export CFLAGS="$SLKCFLAGS" && +export CXXFLAGS="$SLKCFLAGS" && +./configure \ + --enable-official-branding \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --with-default-mozilla-five-home=/usr/lib${LIBDIRSUFFIX}/thunderbird-$VERSION \ + --with-user-appdir=.thunderbird \ + --with-system-zlib \ + --with-system-png \ + --enable-application=mail \ + --enable-default-toolkit=gtk2 \ + --enable-crypto \ + --enable-xft \ + --enable-pango \ + --enable-xinerama \ + --enable-optimize \ + --enable-reorder \ + --enable-strip \ + --enable-cpp-rtti \ + --enable-single-profile \ + --enable-ldap \ + --disable-freetype2 \ + --disable-accessibility \ + --disable-debug \ + --disable-tests \ + --disable-logging \ + --disable-pedantic \ + --disable-installer \ + --disable-profilesharing \ + --disable-gnomevfs \ + --disable-gnomeui + +make MOZ_OPT_FLAGS="$SLKCFLAGS" MOZ_MAKE_FLAGS="$NUMJOBS" || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +# We do not need 20+ MB of includes: +rm -rf $PKG/usr/include + +( cd $PKG/usr/lib${LIBDIRSUFFIX}/thunderbird-$VERSION + echo "Applying firefox patch" + zcat $CWD/mozilla-thunderbird-firefox.diff.gz | patch -p0 --verbose || exit 1 +) || exit 1 + +mkdir -p $PKG/usr/share/applications +cat $CWD/mozilla-thunderbird.desktop > $PKG/usr/share/applications/mozilla-thunderbird.desktop +mkdir -p $PKG/usr/share/pixmaps +cat $CWD/thunderbird.png > $PKG/usr/share/pixmaps/thunderbird.png + +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/thunderbird-$VERSION/chrome/icons/default/ +install -m 644 other-licenses/branding/thunderbird/default.xpm \ + $PKG/usr/lib${LIBDIRSUFFIX}/thunderbird-$VERSION/chrome/icons/default/ +install -m 644 other-licenses/branding/thunderbird/default.xpm \ + $PKG/usr/lib${LIBDIRSUFFIX}/thunderbird-$VERSION/icons/ + +# These files/directories are usually created if Thunderbird is run as root, +# which on many systems might (and possibly should) be never. Therefore, +# if we don't see them we'll put stubs in place to prevent startup errors. +( cd $PKG/usr/lib${LIBDIRSUFFIX}/thunderbird-$VERSION + if [ -d chrome ]; then + if [ ! -r chrome/app-chrome.manifest ]; then + echo > chrome/app-chrome.manifest + fi + fi + if [ ! -d updates ]; then + mkdir -p updates/0 + fi +) + +# Copy over the LICENSE +install -c -m 644 LICENSE $PKG/usr/lib${LIBDIRSUFFIX}/thunderbird-$VERSION + +mkdir $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/mozilla-thunderbird-$VERSION-${ARCH}-$BUILD.txz + diff --git a/source/xap/mozilla-thunderbird/mozilla-thunderbird.desktop b/source/xap/mozilla-thunderbird/mozilla-thunderbird.desktop new file mode 100644 index 00000000..0f85ecbe --- /dev/null +++ b/source/xap/mozilla-thunderbird/mozilla-thunderbird.desktop @@ -0,0 +1,84 @@ +[Desktop Entry] +Encoding=UTF-8 +Exec=thunderbird +Icon=/usr/share/pixmaps/thunderbird.png +Type=Application +Categories=Application;Network; +Name=Thunderbird +Name[bn]=থাণà§à¦¡à¦¾à¦°à¦¬à¦¾à¦°à§à¦¡ +Name[eo]=Mozilo Tondrobirdo +Name[fi]=Mozilla Thunderbird +Name[pa]=ਥੰਡਰਬਰਡ +Name[tg]=Паррандаи бало +GenericName=Mail Client +GenericName[af]=Pos Kliënt +GenericName[ar]=البريد الألكتروني +GenericName[az]=Poçt Alıcısı +GenericName[be]=Паштовы кліент +GenericName[bg]=ПощенÑки клиент +GenericName[bn]=ইমেইল কà§à¦²à¦¾à§Ÿà§‡à¦¨à§à¦Ÿ +GenericName[br]=Arval postel +GenericName[bs]=Program za Äitanje elektronske poÅ¡te +GenericName[ca]=Client de correu electrònic +GenericName[cs]=Klient pro Ätenà elektronické poÅ¡ty +GenericName[cy]=Dibynnydd Ebost +GenericName[da]=E-mail-klient +GenericName[de]=E-Mail-Programm +GenericName[el]=Πελάτης mail +GenericName[eo]=Legi kaj sendi retpoÅton +GenericName[es]=Cliente de correo electrónico +GenericName[et]=Meiliklient +GenericName[eu]=Posta bezeroa +GenericName[fa]=کارگیر پست الکترونیکی +GenericName[fi]=Sähköpostiohjelma +GenericName[fo]=Postforrit +GenericName[fr]=Logiciel de messagerie électronique +GenericName[ga]=Cliant RÃomhphoist +GenericName[gl]=Cliente de correo +GenericName[he]=×ª×•×›× ×™×ª דו×ר +GenericName[hi]=डाकिया +GenericName[hr]=Program za Äitanje elektronske poÅ¡te +GenericName[hu]=LevelezÅ‘program +GenericName[id]=Klien Mail +GenericName[is]=Póstforrit +GenericName[it]=Programma di posta elettronica +GenericName[ja]=メールクライアント +GenericName[ko]=편지를 ì£¼ê³ ë°›ëŠ” 프로그램 +GenericName[lo]=ໄຄà»à»€àºàº±àº™àºˆàº»àº”ຫມາàºà»€àºà»€àº¥àº±àºà»‚ຕນິຠ+GenericName[lt]=PaÅ¡to klientas +GenericName[lv]=Pasta Klients +GenericName[mk]=Програма за електронÑка пошта +GenericName[mn]=Ð-Захиа-Програм +GenericName[mt]=Klijent tal-imejl +GenericName[nb]=E-postklient +GenericName[nds]=Mailprogramm +GenericName[nl]=E-mailclient +GenericName[nn]=Lesing og sending av e-post +GenericName[nso]=Moreki wa Poso +GenericName[oc]=Programari de correu electrònic +GenericName[pa]=ਪੱਤਰ ਕਲਾਂਇਟ +GenericName[pl]=Program do wysyÅ‚ania i odbierania poczty elektronicznej +GenericName[pt]=Client de E-mail +GenericName[pt_BR]=Cliente de E-mail +GenericName[ro]=Program de poÅŸtă electronică +GenericName[ru]=Клиент Ñлектронной почты +GenericName[se]=Boastaprográmma +GenericName[sk]=Klient elektronickej poÅ¡ty +GenericName[sl]=Program za e-poÅ¡to +GenericName[sr]=Програм за e-пошту +GenericName[sr@Latn]=Program za e-poÅ¡tu +GenericName[ss]=Likhasimende leliposi +GenericName[sv]=E-postklient +GenericName[ta]=அஞà¯à®šà®²à¯ உறà¯à®ªà¯à®ªà®¿à®©à®°à¯ +GenericName[tg]=Коргири почтаи Ñллектроникӣ +GenericName[th]=ไคลเà¸à¸™à¸•à¹Œà¸ˆà¸”หมายà¸à¸´à¹€à¸¥à¹‡à¸à¸—รà¸à¸™à¸´à¸à¸ªà¹Œ +GenericName[tr]=Posta Ä°stemcisi +GenericName[uk]=Клієнт електронної пошти +GenericName[uz]=Хат-хабар клиенти +GenericName[ven]=Mushumisani na poso +GenericName[wa]=Cliyint d' emilaedje +GenericName[xh]=Umxhasi Weposi +GenericName[zh_CN]=é‚®ä»¶ç¨‹åº +GenericName[zh_TW]=郵件處ç†ç¨‹å¼ +GenericName[zu]=Umxhasi weposi +X-KDE-StartupNotify=true diff --git a/source/xap/mozilla-thunderbird/slack-desc b/source/xap/mozilla-thunderbird/slack-desc new file mode 100644 index 00000000..353b2225 --- /dev/null +++ b/source/xap/mozilla-thunderbird/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +mozilla-thunderbird: mozilla-thunderbird (Mozilla Thunderbird mail application) +mozilla-thunderbird: +mozilla-thunderbird: Mozilla Thunderbird is a redesign of the Mozilla mail component +mozilla-thunderbird: written using the XUL user interface language. Thunderbird makes +mozilla-thunderbird: emailing safer, faster, and easier than ever before with the +mozilla-thunderbird: industry's best implementations of features such as intelligent spam +mozilla-thunderbird: filters, built-in RSS reader, quick search, and much more. +mozilla-thunderbird: +mozilla-thunderbird: Visit the Mozilla Thunderbird project online: +mozilla-thunderbird: http://www.mozilla.org/projects/thunderbird/ +mozilla-thunderbird: diff --git a/source/xap/mozilla-thunderbird/thunderbird.png b/source/xap/mozilla-thunderbird/thunderbird.png Binary files differnew file mode 100644 index 00000000..a6172dcd --- /dev/null +++ b/source/xap/mozilla-thunderbird/thunderbird.png diff --git a/source/xap/pan/pan.SlackBuild b/source/xap/pan/pan.SlackBuild new file mode 100755 index 00000000..288b34a7 --- /dev/null +++ b/source/xap/pan/pan.SlackBuild @@ -0,0 +1,113 @@ +#!/bin/sh + +# Copyright 2006, 2007, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=pan +VERSION=${VERSION:-0.133} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.bz2 || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Configure: +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --localstatedir=/var/lib \ + --sysconfdir=/etc \ + --mandir=/usr/man \ + --program-prefix= \ + --program-suffix= \ + --build=$ARCH-slackware-linux + +# Build and install: +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.* + ) + done + ) +fi + +# Compress info files, if any: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION +cp -a \ + AUTHORS COPYING* INSTALL NEWS README TODO \ + $PKG/usr/doc/${PKGNAM}-$VERSION + +mkdir -p $PKG/install +#zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/pan/slack-desc b/source/xap/pan/slack-desc new file mode 100644 index 00000000..c4336adb --- /dev/null +++ b/source/xap/pan/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +pan: pan (USENET newsreader) +pan: +pan: This is PAN, a powerful and user-friendly USENET newsreader based on +pan: GTK+2. Pan is the only Unix newsreader to score 100% on the Good +pan: Net-Keeping Seal of Approval newsreader evaluations. +pan: +pan: +pan: +pan: +pan: +pan: diff --git a/source/xap/pidgin/pidgin.SlackBuild b/source/xap/pidgin/pidgin.SlackBuild new file mode 100755 index 00000000..fb7def08 --- /dev/null +++ b/source/xap/pidgin/pidgin.SlackBuild @@ -0,0 +1,192 @@ +#!/bin/sh + +# Copyright 2006, 2007, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=pidgin +VERSION=${VERSION:-2.5.9} +PIDGINENC=${PIDGINENC:-3.0} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +elif [ "$ARCH" = "arm" ]; then + SLKCFLAGS="-O2 -march=armv4 -mtune=xscale" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "armel" ]; then + SLKCFLAGS="-O2 -march=armv4t" + LIBDIRSUFFIX="" +fi + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.?z* || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Allow certificates signed with rsa-md5: +zcat $CWD/purple-allow-sign-rsa-md5.patch.gz | patch -p0 --verbose || exit 1 + +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --sysconfdir=/etc \ + --mandir=/usr/man \ + --enable-dot=no \ + --disable-schemas-install \ + --enable-dbus \ + --enable-gnutls=yes \ + --enable-nss=no \ + --enable-gtkspell \ + --enable-cyrus-sasl \ + --with-perl-lib=vendor \ + --disable-meanwhile \ + --disable-avahi \ + --disable-nm \ + --program-prefix= \ + --program-suffix= \ + --build=$ARCH-slackware-linux + +# Build and install: +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Fix misplaced items: +eval $(perl '-V:archlib') +eval $(perl '-V:privlib') +VENDORPERL="$(echo $archlib | sed -e "s/perl5/perl5\/vendor_perl/")" + +find $PKG -type f -name perllocal.pod -exec mv {} $PKG/$VENDORPERL/Pidgin.pod \; +mkdir -p $PKG/usr/man/man3 +find $PKG/usr/share/man -type f -name *.3 -exec mv {} $PKG/usr/man/man3 \; +rm -rf $PKG/usr/share/man +rm -r $PKG$privlib + +# This removes our DESTDIR from the packlist filenames, to keep perl's +# internal inventories consistent and correct. +find $PKG -name .packlist | while read plist ; do + sed -e "s%/share/man%/man%g" \ + -e "s%$PKG%%g" \ + -e "s%\.1$%\.1\.gz%g" \ + -e "s%\.2$%\.2\.gz%g" \ + -e "s%\.3$%\.3\.gz%g" \ + -e "s%\.3pm$%\.3pm\.gz%g" \ + -e "s%\.4$%\.4\.gz%g" \ + -e "s%\.5$%\.5\.gz%g" \ + -e "s%\.6$%\.6\.gz%g" \ + -e "s%\.7$%\.7\.gz%g" \ + -e "s%\.8$%\.8\.gz%g" \ + ${plist} > ${plist}.new + mv -f ${plist}.new ${plist} +done + +### add gaim-encryption +( cd $TMP + rm -rf pidgin-encryption-$PIDGINENC + tar xvf $CWD/pidgin-encryption-$PIDGINENC.tar.gz || exit 1 + cd pidgin-encryption-$PIDGINENC + PIDGIN_CFLAGS="-I${PKG}/usr/include/pidgin" \ + PIDGIN_LIBS="-L${PKG}/usr/lib${LIBDIRSUFFIX}" \ + PURPLE_CFLAGS="-I${PKG}/usr/include/libpurple" \ + PURPLE_LIBS="-L${PKG}/usr/lib${LIBDIRSUFFIX}" \ + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --disable-static \ + --with-nss-includes=/usr/include/seamonkey/nss \ + --with-nspr-includes=/usr/include/seamonkey/nspr \ + --with-nss-libs=/usr/lib${LIBDIRSUFFIX}/seamonkey/ \ + --with-nspr-libs=/usr/lib${LIBDIRSUFFIX}/seamonkey/ \ + --program-prefix="" \ + --program-suffix="" \ + --build=$ARCH-slackware-linux + make $NUMJOBS || make || exit 1 + make install DESTDIR=$PKG || exit 1 +) || exit 1 +### end add gaim-encryption + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.* + ) + done + ) +fi + +# Compress info files, if any: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION +cp -a \ + AUTHORS COPYING COPYRIGHT HACKING INSTALL NEWS PLUGIN_HOWTO README* doc \ + $PKG/usr/doc/${PKGNAM}-$VERSION +( cd $PKG/usr/doc/${PKGNAM}-$VERSION/doc + rm -f Makefile* *.dox *.1 *.in +) + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/pidgin/purple-allow-sign-rsa-md5.patch b/source/xap/pidgin/purple-allow-sign-rsa-md5.patch new file mode 100644 index 00000000..d882a6e8 --- /dev/null +++ b/source/xap/pidgin/purple-allow-sign-rsa-md5.patch @@ -0,0 +1,12 @@ +--- libpurple/plugins/ssl/ssl-gnutls.c.old 2008-10-17 18:58:31.000000000 +0200 ++++ libpurple/plugins/ssl/ssl-gnutls.c 2008-10-17 18:53:03.000000000 +0200 +@@ -693,7 +693,8 @@ + (Verisign and possibly others have + root certificates that predate the + current standard) */ +- GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT, ++ GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT ++ | GNUTLS_VERIFY_ALLOW_SIGN_RSA_MD5, + &verify); + + if (ret != 0) { diff --git a/source/xap/pidgin/slack-desc b/source/xap/pidgin/slack-desc new file mode 100644 index 00000000..a9aabca1 --- /dev/null +++ b/source/xap/pidgin/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +pidgin: pidgin (GTK+ instant messaging program) +pidgin: +pidgin: Pidgin allows you to talk to anyone using a variety of messaging +pidgin: protocols, including AIM (Oscar and TOC), ICQ, IRC, Yahoo!, MSN +pidgin: Messenger, Jabber, Gadu-Gadu, Napster, and Zephyr. These protocols +pidgin: are implemented using a modular, easy to use design. To use a +pidgin: protocol, just load the plugin for it. +pidgin: +pidgin: For more info, see: http://www.pidgin.im +pidgin: +pidgin: diff --git a/source/xap/rdesktop/rdesktop.SlackBuild b/source/xap/rdesktop/rdesktop.SlackBuild new file mode 100755 index 00000000..cbfc1498 --- /dev/null +++ b/source/xap/rdesktop/rdesktop.SlackBuild @@ -0,0 +1,106 @@ +#!/bin/sh + +# Copyright 2006, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=rdesktop +VERSION=${VERSION:-1.6.0} +ARCH=${ARCH:-x86_64} +NUMJOBS=${NUMJOBS:-" -j7 "} +BUILD=${BUILD:-1} + + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.bz2 || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Configure: +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --with-sound=alsa \ + --enable-smartcard \ + --mandir=/usr/man \ + --build=$ARCH-slackware-linux + +# Build and install: +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION +cp -a \ + COPYING README \ + doc \ + $PKG/usr/doc/${PKGNAM}-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/rdesktop/slack-desc b/source/xap/rdesktop/slack-desc new file mode 100644 index 00000000..283da1cd --- /dev/null +++ b/source/xap/rdesktop/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +rdesktop: rdesktop (Remote Desktop Protocol client) +rdesktop: +rdesktop: rdesktop is a client for Remote Desktop Protocol (RDP), used in a +rdesktop: number of Microsoft products including Windows NT Terminal Server, +rdesktop: Windows 2000 Server, Windows XP, and Windows 2003 Server. +rdesktop: +rdesktop: For more information, see: http://www.rdesktop.org +rdesktop: +rdesktop: +rdesktop: +rdesktop: diff --git a/source/xap/rxvt/rxvt.SlackBuild b/source/xap/rxvt/rxvt.SlackBuild new file mode 100755 index 00000000..81d39485 --- /dev/null +++ b/source/xap/rxvt/rxvt.SlackBuild @@ -0,0 +1,101 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=2.7.10 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-4} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-rxvt +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf rxvt-$VERSION +tar xvf $CWD/rxvt-$VERSION.tar.bz2 || exit 1 +cd rxvt-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; +zcat $CWD/rxvt.utempter.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit 1 + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --enable-languages \ + --enable-utmp \ + --enable-wtmp \ + --enable-xpm-background \ + --enable-transparency \ + --enable-menubar \ + --enable-graphics \ + --enable-rxvt-scroll \ + --enable-next-scroll \ + --enable-xterm-scroll \ + --enable-xim \ + --enable-frills \ + --enable-linespace \ + --enable-24bit \ + --enable-keepscrolling \ + --enable-mousewheel \ + --enable-slipwheeling \ + --enable-xgetdefault \ + --enable-old-selection \ + $ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +rmdir $PKG/usr/lib $PKG/usr/include +rm $PKG/usr/bin/rxvt-$VERSION +mkdir -p $PKG/usr/doc/rxvt-$VERSION +cp -a \ + rxvt-$VERSION.lsm doc rclock/rclock.html \ + $PKG/usr/doc/rxvt-$VERSION +rm -r $PKG/usr/doc/rxvt-$VERSION/doc/yodl + +gzip -9 $PKG/usr/man/man1/* + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/rxvt-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/rxvt/rxvt.utempter.diff b/source/xap/rxvt/rxvt.utempter.diff new file mode 100644 index 00000000..54e06f7a --- /dev/null +++ b/source/xap/rxvt/rxvt.utempter.diff @@ -0,0 +1,277 @@ +--- ./src/logging.c.orig 2002-12-15 16:33:04.000000000 -0800 ++++ ./src/logging.c 2003-06-07 21:08:52.000000000 -0700 +@@ -60,157 +60,7 @@ + void + rxvt_makeutent(rxvt_t *r, const char *pty, const char *hostname) + { +-#ifdef HAVE_STRUCT_UTMP +- struct utmp *ut = &(r->h->ut); +-#endif +-#ifdef HAVE_STRUCT_UTMPX +- struct utmpx *utx = &(r->h->utx); +-#endif +-#ifdef HAVE_UTMP_PID +- int i; +-#endif +- char ut_id[5]; +- struct passwd *pwent = getpwuid(getuid()); +- +- if (!STRNCMP(pty, "/dev/", 5)) +- pty += 5; /* skip /dev/ prefix */ +- +- if (!STRNCMP(pty, "pty", 3) || !STRNCMP(pty, "tty", 3)) { +- STRNCPY(ut_id, (pty + 3), sizeof(ut_id)); +- } +-#ifdef HAVE_UTMP_PID +- else if (sscanf(pty, "pts/%d", &i) == 1) +- sprintf(ut_id, "vt%02x", (i & 0xff)); /* sysv naming */ +-#endif +- else if (STRNCMP(pty, "pty", 3) && STRNCMP(pty, "tty", 3)) { +- rxvt_print_error("can't parse tty name \"%s\"", pty); +- return; +- } +- +-#ifdef HAVE_STRUCT_UTMP +- MEMSET(ut, 0, sizeof(struct utmp)); +-# ifdef HAVE_UTMP_PID +- setutent(); +- STRNCPY(ut->ut_id, ut_id, sizeof(ut->ut_id)); +- ut->ut_type = DEAD_PROCESS; +- getutid(ut); /* position to entry in utmp file */ +- STRNCPY(r->h->ut_id, ut_id, sizeof(r->h->ut_id)); +-# endif +-#endif +- +-#ifdef HAVE_STRUCT_UTMPX +- MEMSET(utx, 0, sizeof(struct utmpx)); +- setutxent(); +- STRNCPY(utx->ut_id, ut_id, sizeof(utx->ut_id)); +- utx->ut_type = DEAD_PROCESS; +- getutxid(utx); /* position to entry in utmp file */ +- STRNCPY(r->h->ut_id, ut_id, sizeof(r->h->ut_id)); +-#endif +- +-#ifdef HAVE_STRUCT_UTMP +- STRNCPY(ut->ut_line, pty, sizeof(ut->ut_line)); +- ut->ut_time = time(NULL); +-# ifdef HAVE_UTMP_PID +- STRNCPY(ut->ut_user, (pwent && pwent->pw_name) ? pwent->pw_name : "?", +- sizeof(ut->ut_user)); +- STRNCPY(ut->ut_id, ut_id, sizeof(ut->ut_id)); +- ut->ut_time = time(NULL); +- ut->ut_pid = r->h->cmd_pid; +-# ifdef HAVE_UTMP_HOST +- STRNCPY(ut->ut_host, hostname, sizeof(ut->ut_host)); +-# endif +- ut->ut_type = USER_PROCESS; +- pututline(ut); +- endutent(); /* close the file */ +- r->h->utmp_pos = -1; +-# else +- STRNCPY(ut->ut_name, (pwent && pwent->pw_name) ? pwent->pw_name : "?", +- sizeof(ut->ut_name)); +-# ifdef HAVE_UTMP_HOST +- STRNCPY(ut->ut_host, hostname, sizeof(ut->ut_host)); +-# endif +-# endif +-#endif +- +-#ifdef HAVE_STRUCT_UTMPX +- STRNCPY(utx->ut_line, pty, sizeof(utx->ut_line)); +- STRNCPY(utx->ut_user, (pwent && pwent->pw_name) ? pwent->pw_name : "?", +- sizeof(utx->ut_user)); +- STRNCPY(utx->ut_id, ut_id, sizeof(utx->ut_id)); +- utx->ut_session = getsid(0); +- utx->ut_tv.tv_sec = time(NULL); +- utx->ut_tv.tv_usec = 0; +- utx->ut_pid = r->h->cmd_pid; +-# ifdef HAVE_UTMPX_HOST +- STRNCPY(utx->ut_host, hostname, sizeof(utx->ut_host)); +-# if 0 +- { +- char *colon; +- +- if ((colon = STRRCHR(ut->ut_host, ':')) != NULL) +- *colon = '\0'; +- } +-# endif +-# endif +- utx->ut_type = USER_PROCESS; +- pututxline(utx); +- endutxent(); /* close the file */ +- r->h->utmp_pos = -1; +-#endif +- +-#if defined(HAVE_STRUCT_UTMP) && !defined(HAVE_UTMP_PID) +- { +- int i; +-# ifdef HAVE_TTYSLOT +- i = ttyslot(); +- if (rxvt_write_bsd_utmp(i, ut)) +- r->h->utmp_pos = i; +-# else +- FILE *fd0; +- +- if ((fd0 = fopen(TTYTAB_FILENAME, "r")) != NULL) { +- char buf[256], name[256]; +- +- buf[sizeof(buf) - 1] = '\0'; +- for (i = 1; (fgets(buf, sizeof(buf) - 1, fd0) != NULL);) { +- if (*buf == '#' || sscanf(buf, "%s", name) != 1) +- continue; +- if (!STRCMP(ut->ut_line, name)) { +- if (!rxvt_write_bsd_utmp(i, ut)) +- i = 0; +- r->h->utmp_pos = i; +- fclose(fd0); +- break; +- } +- i++; +- } +- fclose(fd0); +- } +-# endif +- } +-#endif +- +-#ifdef WTMP_SUPPORT +-# ifdef WTMP_ONLY_ON_LOGIN +- if (r->Options & Opt_loginShell) +-# endif +- { +-# ifdef HAVE_STRUCT_UTMP +-# ifdef HAVE_UPDWTMP +- updwtmp(RXVT_WTMP_FILE, ut); +-# else +- rxvt_update_wtmp(RXVT_WTMP_FILE, ut); +-# endif +-# endif +-# ifdef HAVE_STRUCT_UTMPX +- updwtmpx(RXVT_WTMPX_FILE, utx); +-# endif +- } +-#endif +-#if defined(LASTLOG_SUPPORT) && defined(RXVT_LASTLOG_FILE) +- if (r->Options & Opt_loginShell) +- rxvt_update_lastlog(RXVT_LASTLOG_FILE, pty, hostname); +-#endif ++ addToUtmp(pty, NULL, r->cmd_fd); + } + + /* ------------------------------------------------------------------------- */ +@@ -221,85 +71,7 @@ + void + rxvt_cleanutent(rxvt_t *r) + { +-#ifdef HAVE_STRUCT_UTMP +- struct utmp *tmput, *ut = &(r->h->ut); +-#endif +-#ifdef HAVE_STRUCT_UTMPX +- struct utmpx *tmputx, *utx = &(r->h->utx); +-#endif +- +-#ifdef HAVE_STRUCT_UTMP +-# ifdef HAVE_UTMP_PID +- MEMSET(ut, 0, sizeof(struct utmp)); +- setutent(); +- STRNCPY(ut->ut_id, r->h->ut_id, sizeof(ut->ut_id)); +- ut->ut_type = USER_PROCESS; +- if ((tmput = getutid(ut))) /* position to entry in utmp file */ +- ut = tmput; +- ut->ut_type = DEAD_PROCESS; +-# else +- MEMSET(ut->ut_name, 0, sizeof(ut->ut_name)); +-# ifdef HAVE_UTMP_HOST +- MEMSET(ut->ut_host, 0, sizeof(ut->ut_host)); +-# endif +-# endif +- ut->ut_time = time(NULL); +-#endif +- +-#ifdef HAVE_STRUCT_UTMPX +- MEMSET(utx, 0, sizeof(struct utmpx)); +- setutxent(); +- STRNCPY(utx->ut_id, r->h->ut_id, sizeof(utx->ut_id)); +- utx->ut_type = USER_PROCESS; +- if ((tmputx = getutxid(utx))) /* position to entry in utmp file */ +- utx = tmputx; +- utx->ut_type = DEAD_PROCESS; +- utx->ut_session = getsid(0); +- utx->ut_tv.tv_sec = time(NULL); +- utx->ut_tv.tv_usec = 0; +-#endif +- +- /* +- * Write ending wtmp entry +- */ +-#ifdef WTMP_SUPPORT +-# ifdef WTMP_ONLY_ON_LOGIN +- if (r->Options & Opt_loginShell) +-# endif +- { +-# ifdef HAVE_STRUCT_UTMP +-# ifdef HAVE_UPDWTMP +- updwtmp(RXVT_WTMP_FILE, ut); +-# else +- rxvt_update_wtmp(RXVT_WTMP_FILE, ut); +-# endif +-# endif +-# ifdef HAVE_STRUCT_UTMPX +- updwtmpx(RXVT_WTMPX_FILE, utx); +-# endif +- } +-#endif +- +- /* +- * Write utmp entry +- */ +-#ifdef HAVE_STRUCT_UTMP +-# ifdef HAVE_UTMP_PID +- if (ut->ut_pid == r->h->cmd_pid) +- pututline(ut); +- endutent(); +-# else +- if (r->h->utmp_pos > 0) { +- MEMSET(ut, 0, sizeof(struct utmp)); +- rxvt_write_bsd_utmp(r->h->utmp_pos, ut); +- } +-# endif +-#endif +-#ifdef HAVE_STRUCT_UTMPX +- if (utx->ut_pid == r->h->cmd_pid) +- pututxline(utx); +- endutxent(); +-#endif ++ removeFromUtmp(); + } + + /* ------------------------------------------------------------------------- */ +--- ./src/init.c.orig 2002-12-03 21:21:39.000000000 -0800 ++++ ./src/init.c 2003-06-07 21:09:26.000000000 -0700 +@@ -858,6 +858,7 @@ + rxvt_print_error("aborting"); + exit(EXIT_FAILURE); + } ++ rxvt_privileged_utmp(r, SAVE); + } + + /*----------------------------------------------------------------------*/ +@@ -1364,7 +1365,6 @@ + #endif + r->num_fds++; /* counts from 0 */ + +- rxvt_privileged_utmp(r, SAVE); + return cfd; + } + +--- ./autoconf/Make.common.in.orig 2001-11-29 19:22:56.000000000 -0800 ++++ ./autoconf/Make.common.in 2003-06-07 21:08:52.000000000 -0700 +@@ -68,7 +68,7 @@ + + LIBTOOL = @LIBTOOL@ + COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(DEBUG) $(DINCLUDE) $(XINC) -I$(basedir) -I$(srcdir) -I. +-LINK = $(CC) $(CFLAGS) $(LDFLAGS) ++LINK = $(CC) $(CFLAGS) $(LDFLAGS) -lutempter -lutil + + # End of common section of the Makefile + #------------------------------------------------------------------------- diff --git a/source/xap/rxvt/slack-desc b/source/xap/rxvt/slack-desc new file mode 100644 index 00000000..5f278d61 --- /dev/null +++ b/source/xap/rxvt/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +rxvt: rxvt (terminal emulator) +rxvt: +rxvt: rxvt is a color vt102 terminal emulator intended as an xterm +rxvt: replacement for users who do not require features such as Tektronix +rxvt: 4014 emulation and toolkit-style configurability. As a result, rxvt +rxvt: uses much less memory -- a significant advantage on a machine serving +rxvt: many X sessions. Also included is rclock, an analog clock for X. +rxvt: +rxvt: +rxvt: +rxvt: diff --git a/source/xap/sane/dll.conf.additions b/source/xap/sane/dll.conf.additions new file mode 100644 index 00000000..3e06e04d --- /dev/null +++ b/source/xap/sane/dll.conf.additions @@ -0,0 +1,3 @@ +# HPLIP backend homepage: http://hplip.sf.net/ +# Uncomment the following line if hplip is installed: +hpaio diff --git a/source/xap/sane/doinst.sh b/source/xap/sane/doinst.sh new file mode 100644 index 00000000..99841064 --- /dev/null +++ b/source/xap/sane/doinst.sh @@ -0,0 +1,15 @@ +#!/bin/sh +config() { + NEW="$1" + OLD="$(dirname $NEW)/$(basename $NEW .new)" + # If there's no config file by that name, mv it over: + if [ ! -r $OLD ]; then + mv $NEW $OLD + elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then # toss the redundant copy + rm $NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} +for file in etc/sane.d/*.new ; do + config $file +done diff --git a/source/xap/sane/sane.SlackBuild b/source/xap/sane/sane.SlackBuild new file mode 100755 index 00000000..2d82f09e --- /dev/null +++ b/source/xap/sane/sane.SlackBuild @@ -0,0 +1,145 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +VERSION=1.0.19 +BACKVER=1.0.19 +FRONTVER=1.0.14 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-4} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-sane + +rm -rf $PKG +mkdir -p $TMP $PKG + +# First, we'll build the backends +cd $TMP +rm -rf sane-backends-$BACKVER +tar xvf $CWD/sane-backends-$BACKVER.tar.bz2 || exit 1 +cd sane-backends-$BACKVER +chown -R root:root . +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --sysconfdir=/etc \ + --mandir=/usr/man \ + --with-docdir=/usr/doc/sane-$VERSION \ + --localstatedir=/var/lib \ + --enable-locking \ + --with-lockdir=/var/lock/sane \ + --with-group=scanner \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Add the default udev rules, and until it's handled upstream, +# fix their syntax work with recent versions of udev +mkdir -p $PKG/lib/udev/rules.d +sed s/SYSFS/ATTRS/g tools/udev/libsane.rules \ + > $PKG/lib/udev/rules.d/80-libsane.rules +# Add the hal fdi file +mkdir -p $PKG/usr/share/hal/fdi/policy/10osvendor/ +cat tools/hal/libsane.fdi \ + > $PKG/usr/share/hal/fdi/policy/10osvendor/10-libsane.fdi + +# Now let's build the frontends +cd $TMP +rm -rf sane-frontends-$FRONTVER +tar xvf $CWD/sane-frontends-$FRONTVER.tar.bz2 || exit 1 +cd sane-frontends-$FRONTVER +chown -R root:root . +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --sysconfdir=/etc \ + --mandir=/usr/man \ + --with-docdir=/usr/doc/sane-$VERSION \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Fix stupid permissions: +chown -R root:root $PKG/var +chmod 755 $PKG/var +chmod 1777 $PKG/var/lock +chown root:scanner $PKG/var/lock/sane +chmod 775 $PKG/var/lock/sane + +find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# List additional backends in /etc/sane.d/dll.conf. +# I don't think it will hurt anything to do this, even +# if these backends turn out not to be available: +zcat $CWD/dll.conf.additions.gz >> $PKG/etc/sane.d/dll.conf + +# Move config files: +( cd $PKG/etc/sane.d + for file in *.conf ; do + mv $file ${file}.new + done +) +rm -f /etc/sane.d/*.conf + +# Compress and if needed symlink the man pages: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc +zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh + +cd $PKG +/sbin/makepkg -l y -c n $TMP/sane-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/sane/slack-desc b/source/xap/sane/slack-desc new file mode 100644 index 00000000..787dbd6f --- /dev/null +++ b/source/xap/sane/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +sane: sane (Scanner Access Now Easy) +sane: +sane: SANE is a universal scanner interface that provides standardized +sane: access to any raster image scanner hardware, such as flatbed scanners, +sane: hand-held scanners, video and still cameras, frame-grabbers, and other +sane: similar devices. +sane: +sane: +sane: +sane: +sane: diff --git a/source/xap/seamonkey/doinst.sh b/source/xap/seamonkey/doinst.sh new file mode 100644 index 00000000..c236bea5 --- /dev/null +++ b/source/xap/seamonkey/doinst.sh @@ -0,0 +1,11 @@ +# If there's no mozilla here, then take over: +if [ ! -r usr/bin/mozilla ]; then + ( cd usr/bin ; ln -sf seamonkey mozilla ) +fi +# Hopefully this won't break everything. ;-) +if ! grep /usr/lib/seamonkey etc/ld.so.conf 1> /dev/null 2> /dev/null ; then + echo "/usr/lib/seamonkey" >> etc/ld.so.conf +fi +if [ -x /sbin/ldconfig ]; then + /sbin/ldconfig 2> /dev/null +fi diff --git a/source/xap/seamonkey/seamonkey-icon.png b/source/xap/seamonkey/seamonkey-icon.png Binary files differnew file mode 100644 index 00000000..824ab7a5 --- /dev/null +++ b/source/xap/seamonkey/seamonkey-icon.png diff --git a/source/xap/seamonkey/seamonkey-mail-icon.png b/source/xap/seamonkey/seamonkey-mail-icon.png Binary files differnew file mode 100644 index 00000000..123b077b --- /dev/null +++ b/source/xap/seamonkey/seamonkey-mail-icon.png diff --git a/source/xap/seamonkey/seamonkey-mail.desktop b/source/xap/seamonkey/seamonkey-mail.desktop new file mode 100644 index 00000000..1e0b62b1 --- /dev/null +++ b/source/xap/seamonkey/seamonkey-mail.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=SeaMonkey Mail +Comment=Read Mail with SeaMonkey +Exec=/usr/bin/seamonkey -mail +Icon=/usr/share/pixmaps/seamonkey-mail-icon.png +Terminal=0 +Type=Application +Categories=Application;Network; diff --git a/source/xap/seamonkey/seamonkey.SlackBuild b/source/xap/seamonkey/seamonkey.SlackBuild new file mode 100755 index 00000000..a0869558 --- /dev/null +++ b/source/xap/seamonkey/seamonkey.SlackBuild @@ -0,0 +1,233 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=${VERSION:-1.1.17} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +elif [ "$ARCH" = "arm" ]; then + SLKCFLAGS="-O2 -march=armv4 -mtune=xscale" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "armel" ]; then + SLKCFLAGS="-O2 -march=armv4t" + LIBDIRSUFFIX="" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-seamonkey +rm -rf $PKG +mkdir -p $TMP $PKG/usr + +cd $TMP +rm -rf mozilla +tar xvf $CWD/seamonkey-${VERSION}.source.tar.xz || exit 1 +cd mozilla || exit 1 + +# Add /usr/lib/mozilla/plugins to MOZ_PLUGINS_PATH: +zcat $CWD/seamonkey.moz_plugin_path.diff.gz \ + | sed -e "s#usr/lib#usr/lib${LIBDIRSUFFIX}#g" \ + | patch -p1 --verbose || exit 1 +rm -f xpfe/bootstrap/mozilla.in.orig + +# Make sure the perms/ownerships are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# Fix a long standing bug that's prevented staying current on GTK+. +# Thanks to the BLFS folks. :-) +cat >> layout/build/Makefile.in << EOF + +ifdef MOZ_ENABLE_CANVAS +EXTRA_DSO_LDOPTS += \$(XLDFLAGS) -lX11 -lXrender +endif + +EOF + +chown -R root:root . +BUILD_OFFICIAL=1 MOZILLA_OFFICIAL=1 \ +./configure --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --enable-optimize="$CFLAGS" \ + --disable-debug \ + --with-default-mozilla-five-home=/usr/lib${LIBDIRSUFFIX}/seamonkey-${VERSION} \ + --enable-strip \ + --disable-tests \ + --enable-svg \ + --enable-system-cairo \ + --enable-canvas \ + --disable-short-wchar \ + --enable-nspr-autoconf \ + --enable-extensions=default,irc \ + --enable-crypto \ + --disable-xprint \ + --without-system-nspr \ + --with-system-zlib \ + --with-system-jpeg \ + --with-system-png \ + --with-system-mng \ + --enable-application=suite \ + --enable-xft \ + --host=$ARCH-slackware-linux \ + --target=$ARCH-slackware-linux \ + --build=$ARCH-slackware-linux + +BUILD_OFFICIAL=1 MOZILLA_OFFICIAL=1 make $NUMJOBS -s export || exit 1 +BUILD_OFFICIAL=1 MOZILLA_OFFICIAL=1 make $NUMJOBS -s libs || exit 1 +BUILD_OFFICIAL=1 MOZILLA_OFFICIAL=1 DESTDIR=$PKG make install || exit 1 + +# Install nss headers. +mkdir -p $PKG/usr/include/seamonkey-${VERSION}/nss +find security/nss/lib -name "*.h" -type f -exec cp -a {} $PKG/usr/include/seamonkey-${VERSION}/nss \; +chown -R root:root $PKG/usr/include/seamonkey-${VERSION}/nss +chmod 644 $PKG/usr/include/seamonkey-${VERSION}/nss/* +# Create a more generic include files symlink: +( cd $PKG/usr/include + if [ ! -e seamonkey ]; then + ln -sf seamonkey-${VERSION} seamonkey + fi +) + +# Let the nspr be found by gxine: +( cd $PKG/usr/lib${LIBDIRSUFFIX}/pkgconfig; ln -s seamonkey-nspr.pc nspr.pc ) + +# A Better Way to handle the problem below is simply to add /usr/lib/seamonkey +# to /etc/ld.so.conf. After all, the various Mozilla offshoots all set an +# LD_LIBRARY_PATH to make sure *they* use the right libraries anyway, and as +# far as I know seamonkey has the only set of Mozilla development libraries +# right now. Plus, doing it this way doesn't stomp all over efforts by people +# who would like to use seamonkey-nss-solibs. + +## Link some libraries into /usr/lib. Unless this is done, some things (like gxine) +## will be unable to load them, even if they linked with them successfully. +#( cd $PKG/usr/lib${LIBDIRSUFFIX} && ( for somelib in libmozjs.so libnspr4.so libnss3.so libplc4.so libplds4.so libsmime3.so libsoftokn3.so libssl3.so ; do +# # Link to it: +# ln -sf seamonkey-${VERSION}/$somelib . +# done ) +#) + +# Compress and if needed symlink the man pages: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + +# Strip files: +find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# This remains the standard plugin directory for all browsers. +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/mozilla/plugins + +# Some software won't compile without this symlink: +( cd $PKG/usr/lib${LIBDIRSUFFIX} + if [ ! -e seamonkey ]; then + ln -sf seamonkey-${VERSION} seamonkey + fi +) + +mkdir -p $PKG/usr/share/applications +cp -a $CWD/*.desktop $PKG/usr/share/applications +chown -R root:root $PKG/usr/share/applications +chmod 644 $PKG/usr/share/applications/* +mkdir -p $PKG/usr/share/pixmaps +cp -a $CWD/*.png $PKG/usr/share/pixmaps +chown -R root:root $PKG/usr/share/pixmaps +chmod 644 $PKG/usr/share/pixmaps/* + +mkdir -p $PKG/usr/doc/seamonkey-$VERSION +cp -a \ + LEGAL LICENSE README.txt \ + $PKG/usr/doc/seamonkey-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc +zcat $CWD/doinst.sh.gz | sed -e "s#usr/lib#usr/lib${LIBDIRSUFFIX}#g" \ + > $PKG/install/doinst.sh + +cd $TMP/package-seamonkey +/sbin/makepkg -l y -c n -p $TMP/seamonkey-$VERSION-$ARCH-$BUILD.txz + +# Create a standalone seamonkey-solibs package for RPM, gxine, etc. +rm -r $TMP/package-seamonkey-solibs +mkdir -p $TMP/package-seamonkey-solibs/usr/doc +cp -a $PKG/usr/doc/seamonkey-$VERSION $TMP/package-seamonkey-solibs/usr/doc +mkdir -p $TMP/package-seamonkey-solibs/usr/lib${LIBDIRSUFFIX}/seamonkey-${VERSION} +for file in libfreebl3.chk libfreebl3.so libmozjs.so libnspr4.so libnss3.so \ + libnssckbi.so libplc4.so libplds4.so libsmime3.so libsoftokn3.chk \ + libsoftokn3.so libssl3.so ; do + cp -a $PKG/usr/lib${LIBDIRSUFFIX}/seamonkey-${VERSION}/$file \ + $TMP/package-seamonkey-solibs/usr/lib${LIBDIRSUFFIX}/seamonkey-${VERSION} +done +mkdir $TMP/package-seamonkey-solibs/install +cat << EOF | sed -e "s#usr/lib#usr/lib${LIBDIRSUFFIX}#g" > $TMP/package-seamonkey-solibs/install/doinst.sh +( cd usr/lib ; rm -rf seamonkey ) +( cd usr/lib ; ln -sf seamonkey-$VERSION seamonkey ) +if ! grep /usr/lib/seamonkey etc/ld.so.conf 1> /dev/null 2> /dev/null ; then + echo "/usr/lib/seamonkey" >> etc/ld.so.conf +fi +if [ -x /sbin/ldconfig ]; then + /sbin/ldconfig 2> /dev/null +fi +EOF +cat << EOF > $TMP/package-seamonkey-solibs/install/slack-desc + |-----handy-ruler------------------------------------------------------| +seamonkey-solibs: seamonkey-solibs (Shared libraries from Seamonkey) +seamonkey-solibs: +seamonkey-solibs: This package contains a subset of the shared libraries from Seamonkey +seamonkey-solibs: to provide runtime support for programs that require nss, nspr, and +seamonkey-solibs: js. These libraries are used in programs like RPM and gxine, and can +seamonkey-solibs: be used in others. This package is built from the Seamonkey sources +seamonkey-solibs: and is provided as a standalone runtime package for people who do not +seamonkey-solibs: want to install the entire seamonkey package (as for server use). +seamonkey-solibs: +seamonkey-solibs: This package is runtime only. The include files and other files for +seamonkey-solibs: development can be found in the seamonkey package. +EOF +cd $TMP/package-seamonkey-solibs +/sbin/makepkg -l y -c n -p $TMP/seamonkey-solibs-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/seamonkey/seamonkey.desktop b/source/xap/seamonkey/seamonkey.desktop new file mode 100644 index 00000000..7c988a76 --- /dev/null +++ b/source/xap/seamonkey/seamonkey.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=SeaMonkey +Comment=Web Browser +Exec=/usr/bin/seamonkey +Icon=/usr/share/pixmaps/seamonkey-icon.png +Terminal=0 +Type=Application +Categories=Application;Network; diff --git a/source/xap/seamonkey/seamonkey.moz_plugin_path.diff b/source/xap/seamonkey/seamonkey.moz_plugin_path.diff new file mode 100644 index 00000000..f967580b --- /dev/null +++ b/source/xap/seamonkey/seamonkey.moz_plugin_path.diff @@ -0,0 +1,16 @@ +--- ./xpfe/bootstrap/mozilla.in.orig 2006-08-20 17:44:28.000000000 -0500 ++++ ./xpfe/bootstrap/mozilla.in 2007-02-19 21:25:32.000000000 -0600 +@@ -60,6 +60,13 @@ + MOZ_PIS_SESSION_PID="$$" + MOZ_PIS_USER_DIR="${MOZ_USER_DIR}" + export MOZ_PIS_API MOZ_PIS_MOZBINDIR MOZ_PIS_SESSION_PID MOZ_PIS_USER_DIR ++ # Include /usr/lib/mozilla/plugins in the plugin path: ++ if [ "$MOZ_PLUGIN_PATH" ] ; then ++ MOZ_PLUGIN_PATH=$MOZ_PLUGIN_PATH:${moz_libdir}/plugins:/usr/lib/mozilla/plugins ++ else ++ MOZ_PLUGIN_PATH=${moz_libdir}/plugins:/usr/lib/mozilla/plugins ++ fi ++ export MOZ_PLUGIN_PATH + + case "${1}" in + "start") diff --git a/source/xap/seamonkey/slack-desc b/source/xap/seamonkey/slack-desc new file mode 100644 index 00000000..978c1d09 --- /dev/null +++ b/source/xap/seamonkey/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +seamonkey: SeaMonkey (an open-source web browser suite) +seamonkey: +seamonkey: The SeaMonkey browser suite. SeaMonkey features a state-of-the-art +seamonkey: web browser and powerful email client, as well as a WYSIWYG web page +seamonkey: composer and a feature-rich IRC chat client. For web developers, +seamonkey: mozilla.org's DOM inspector and JavaScript debugger tools are +seamonkey: included as well. +seamonkey: +seamonkey: Visit the SeaMonkey project at this URL: +seamonkey: http://www.mozilla.org/projects/seamonkey/ +seamonkey: diff --git a/source/xap/seyon/seyon-2.20c.lsm b/source/xap/seyon/seyon-2.20c.lsm new file mode 100644 index 00000000..7eb9dbb9 --- /dev/null +++ b/source/xap/seyon/seyon-2.20c.lsm @@ -0,0 +1,16 @@ +Begin3 +Title: Seyon +Version: 2.20c +Entered-date: 09MAY99 +Description: Seyon is a complete full-featured telecommunications package + for the X Window System. Some of its features are: dialing + directory, scripting language, external file transfer protocol + support, zmodem auto-download, configurable keyboard + translation modes. +Keywords: communication seyon x11 rs232 serial +Author: msaggaf@erl.mit.edu (M. Saggaf) +Maintained-by: stevem@chiark.greenend.org.uk (Steve McIntyre) +Primary-site: sunsite.unc.edu /pub/Linux/apps/serialcomm/dialout + 165 KB seyon-2.20c.tar.gz +Copying-policy: GNU GPL +End diff --git a/source/xap/seyon/seyon.SlackBuild b/source/xap/seyon/seyon.SlackBuild new file mode 100755 index 00000000..656d2ff9 --- /dev/null +++ b/source/xap/seyon/seyon.SlackBuild @@ -0,0 +1,112 @@ +#!/bin/sh + +# Copyright 2002-2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=2.20c +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-3} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-seyon + +rm -rf $PKG +mkdir -p $PKG $PKG +cd $TMP +rm -rf seyon-$VERSION +tar xvf $CWD/seyon-$VERSION.tar.gz || exit 1 +cd seyon-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +zcat $CWD/seyon_2.20c-16.diff.gz | patch -p1 --verbose || exit 1 + +chmod 755 makever.sh +xmkmf +make || exit 1 + +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/X11 +make install DESTDIR=$PKG LIBDIR=/usr/lib${LIBDIRSUFFIX}/X11 || exit 1 + +mkdir -p $PKG/etc/X11/seyon +touch $PKG/etc/X11/seyon/Seyon-modem.new +mkdir -p $PKG/etc/X11/app-defaults +cp Seyon-co.ad $PKG/etc/X11/app-defaults/Seyon-color.new +cp Seyon.ad $PKG/etc/X11/app-defaults/Seyon.new + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/usr/doc/seyon-$VERSION/.seyon +cp -a \ + 1-* COPYING $PKG/usr/doc/seyon-$VERSION +cp -a \ + phonelist protocols script.CIS script.PCBoard script.QWK script.unix startup \ + $PKG/usr/doc/seyon-$VERSION/.seyon +find $PKG/usr/doc/seyon-$VERSION -type f -exec chmod 644 {} \; +find $PKG/usr/doc/seyon-$VERSION -type d -exec chmod 755 {} \; +( cd $PKG/usr/doc/seyon-$VERSION ; ln -sf .seyon HOME.seyon.directory.example ) + +mkdir -p $PKG/usr/man/man1 +cat seyon.man | gzip -9c > $PKG/usr/man/man1/seyon.1.gz + +mkdir -p $PKG/install +cat << EOF > $PKG/install/doinst.sh +#!/bin/sh +config() { + NEW="\$1" + OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)" + # If there's no config file by that name, mv it over: + if [ ! -r \$OLD ]; then + mv \$NEW \$OLD + elif [ "\$(cat \$OLD | md5sum)" = "\$(cat \$NEW | md5sum)" ]; then # toss the redundant copy + rm \$NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} +config etc/X11/seyon/Seyon-modem.new +config etc/X11/app-defaults/Seyon.new +config etc/X11/app-defaults/Seyon-color.new + +EOF + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/seyon-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/seyon/seyon_2.20c-16.diff b/source/xap/seyon/seyon_2.20c-16.diff new file mode 100644 index 00000000..536e69cb --- /dev/null +++ b/source/xap/seyon/seyon_2.20c-16.diff @@ -0,0 +1,5031 @@ +--- seyon-2.20c.orig/Seyon.ad ++++ seyon-2.20c/Seyon.ad +@@ -7,6 +7,8 @@ + ! * statement of rights and permissions for this program. + ! * + ++#include "/etc/X11/seyon/Seyon-modem" ++ + *.title: Seyon Command Center + *.iconName: Seyon + +@@ -259,31 +261,6 @@ + *statusBox.rng.label: RNG + + ! +-! Quick Keys +-! +- +-*quickKeyBox.Command.font: 6x10 +- +-*quickKey1.visible: on +-*quickKey2.visible: on +-*quickKey3.visible: on +-*quickKey4.visible: on +-*quickKey5.visible: on +- +-!*quickKey1.action: DialEntries(1); +-!*quickKey2.action: DialEntries(3); +-!*quickKey3.action: FileTransfer(2, ou*); +-!*quickKey4.action: DivertFile(/tmp/lo); +-!*quickKey5.action: Hangup(); Beep(); +-!RunScript(test1); Echo(ll); +- +-*quickKey1.label: Athena +-*quickKey2.label: Ch1 +-*quickKey3.label: UpMail +-*quickKey4.label: DivMsg +-*quickKey5.label: Local +- +-! + ! Fun messages. Send me more please. + ! + +@@ -302,6 +279,7 @@ + "Have something funny? send it!" \ + "I've fallen and I can't get up!" + +++*showFunMessages: off + *notImplemented*title: Seyon Feature + *notImplemented.dialog.label: \ + This feature is not yet implemented\n\ +--- seyon-2.20c.orig/SeDecl.h ++++ seyon-2.20c/SeDecl.h +@@ -66,7 +66,6 @@ + extern FILE *open_file(), + *open_file_va(); + extern void send_break(), +- usleep(), + show(), + showf(), + SeyonMessage(), +--- seyon-2.20c.orig/1-CHANGES ++++ seyon-2.20c/1-CHANGES +@@ -12,7 +12,6 @@ + Rolled in some obvious bug fixes from the Debian version of 2.14c: + * Fixed typo in Seyon.ad: s/replcae/replace + * Added #include <linux/serial.h> to SePort.c for Linux +- * Minor changes to ExecShellCommand; used to crash, should no more. + * Now under GPL (see 1-COPYING for details), new maintainer. + + Versions up to 2.20b: +--- seyon-2.20c.orig/SeTerm.c ++++ seyon-2.20c/SeTerm.c +@@ -10,7 +10,7 @@ + * This file contains routines for Seyon's terminal. The main routine is + * terminal(), which reads characters from the terminal and sends them to the + * port. That routine also forks a child process that reads characters from +- * the port and writes them to the temrinal. Once the parent receives SIGTERM ++ * the port and writes them to the terminal. Once the parent receives SIGTERM + * (which should be sent by the grand parent), it kills the child and exits. + */ + +--- seyon-2.20c.orig/MultiList.c ++++ seyon-2.20c/MultiList.c +@@ -1031,8 +1031,8 @@ + XfwfMultiListWidget mlw; + int row,column; + { +- GC bg_gc,fg_gc; +- XfwfMultiListItem *item; ++ GC bg_gc,fg_gc = 0; ++ XfwfMultiListItem *item = NULL; + int ul_x,ul_y,str_x,str_y,w,h,item_index,has_item,text_h; + + if (!XtIsRealized((Widget)mlw)) return; +--- seyon-2.20c.orig/SeInit.c ++++ seyon-2.20c/SeInit.c +@@ -34,30 +34,30 @@ + #endif + + extern void TopAbout(), +- TopHelp(), +- TopSet(), +- TopTransfer(), +- TopMisc(), +- SetNewlineTrMode(), +- FunMessage(); ++ TopHelp(), ++ TopSet(), ++ TopTransfer(), ++ TopMisc(), ++ SetNewlineTrMode(), ++ FunMessage(); + + extern void upload_acc_ok(), +- setVal_action_ok(), +- manual_dial_action_ok(), +- divert_action_ok(); ++ setVal_action_ok(), ++ manual_dial_action_ok(), ++ divert_action_ok(); + + extern Boolean CvtStringToStringArray(); + + void HangupConfirm(), +- ExecHangup(), +- ExitConfirm(), +- ExitAction(), +- test(); ++ ExecHangup(), ++ ExitConfirm(), ++ ExitAction(), ++ test(); + + Boolean inhibit_child = False; + Widget w_exit, +- w_kill, +- statusMessage; ++ w_kill, ++ statusMessage; + Widget dialWidget, genericWidget; + pid_t w_child_pid = 0; + Pixmap progIcon; +@@ -66,194 +66,202 @@ + + void + InitVariables(topLevel) +- Widget topLevel; ++ Widget topLevel; + { +- char buffer[REG_BUF]; ++ char buffer[REG_BUF]; + +- sprintf(captureFile, "%s/%s", expand_fname(qres.defaultDirectory, buffer), +- qres.captureFile); ++ expand_fname(qres.defaultDirectory, buffer, REG_BUF); + +- SetNewlineTrMode(qres.newlineTranslation); ++ if(REG_BUF > (1 + strlen(buffer) + strlen(qres.captureFile))) ++ sprintf(captureFile, "%s/%s", buffer, qres.captureFile); ++ else ++ { ++ printf("Buffer overflow in InitVariables: %s/%s\nExit\n",buffer, qres.captureFile); ++ exit(1); ++ } ++ ++ SetNewlineTrMode(qres.newlineTranslation); + } + + void + SetIcon(topLevelWidget) +- Widget topLevelWidget; ++ Widget topLevelWidget; + { +- progIcon = +- XCreateBitmapFromData(XtDisplay(topLevelWidget), +- DefaultRootWindow(XtDisplay(topLevelWidget)), +- progIcon_bits, progIcon_width, +- progIcon_height); +- XtVaSetValues(topLevelWidget, XtNiconPixmap, progIcon, NULL); ++ progIcon = ++ XCreateBitmapFromData(XtDisplay(topLevelWidget), ++ DefaultRootWindow(XtDisplay(topLevelWidget)), ++ progIcon_bits, progIcon_width, ++ progIcon_height); ++ XtVaSetValues(topLevelWidget, XtNiconPixmap, progIcon, NULL); + } + + void + CreateCommandCenter() + { +- void GetQuickKeyResources(), +- GetValueByPopupOKAction(), +- DispatchActionsCallback(); +- void TopShell(); +- void KillChildProc(); +- +- Widget mainBox, +- menuBox, +- statusBox, +- messageBox, +- quickKeyBox; +- static Widget status[NUM_MDM_STAT]; +- static Atom wm_delete_window; +- Dimension menuBoxWidth; +- +- struct _quickKeyRes quickKeyRes; +- Widget quickKeyW; +- char qKBuf[REG_BUF]; +- int i, n = 0; +- +- static XtActionsRec actionTable[] = { +- {"UploadOk", upload_acc_ok}, +- {"SetValOk", setVal_action_ok}, +- {"ManualDialOk", manual_dial_action_ok}, +- {"DivertOk", divert_action_ok}, +- {"Exit", ExitAction}, +- {"GetValueByPopupOK", GetValueByPopupOKAction}, +- }; +- +- XtAppAddActions(XtWidgetToApplicationContext(topLevel), actionTable, +- XtNumber(actionTable)); +- +- mainBox = SeAddPaned("mainBox", topLevel); +- statusBox = AddBox("statusBox", mainBox); +- messageBox = SeAddForm("messageBox", mainBox); +- quickKeyBox = AddBox("quickKeyBox", mainBox); +- menuBox = AddBox("menuBox", mainBox); +- +- status[0] = SeAddToggle("dcd", statusBox, NULL); +- status[1] = SeAddToggle("dtr", statusBox, NULL); +- status[2] = SeAddToggle("dsr", statusBox, NULL); +- status[3] = SeAddToggle("rts", statusBox, NULL); +- status[4] = SeAddToggle("cts", statusBox, NULL); +- status[5] = SeAddToggle("rng", statusBox, NULL); +- +- statusMessage = SeAddLabel("message", messageBox); +- +- AddButton("about", menuBox, TopAbout, NULL); +- AddButton("help", menuBox, TopHelp, NULL); +- AddButton("set", menuBox, TopSet, NULL); +- genericWidget = dialWidget = AddButton("dial", menuBox, TopDial, NULL); +- AddButton("transfer", menuBox, TopTransfer, NULL); +- AddButton("shellCommand", menuBox, TopShell, NULL); +- AddButton("misc", menuBox, TopMisc, NULL); +- AddButton("hangup", menuBox, HangupConfirm, NULL); +- w_exit = AddButton("exit", menuBox, ExitConfirm, NULL); +- w_kill = AddButton("kill", menuBox, KillChildProc, NULL); +- +- for (i = 0; i < MAX_SEQUICKKEYS; i++) { +- sprintf(qKBuf, "quickKey%d", i+1); +- GetQuickKeyResources(qKBuf, &quickKeyRes); +- if (quickKeyRes.visible) { +- n++; ++ void GetQuickKeyResources(), ++ GetValueByPopupOKAction(), ++ DispatchActionsCallback(); ++ void TopShell(); ++ void KillChildProc(); ++ ++ Widget mainBox, ++ menuBox, ++ statusBox, ++ messageBox, ++ quickKeyBox; ++ static Widget status[NUM_MDM_STAT]; ++ static Atom wm_delete_window; ++ Dimension menuBoxWidth; ++ ++ struct _quickKeyRes quickKeyRes; ++ Widget quickKeyW; ++ char qKBuf[LRG_BUF]; ++ int i, n = 0; ++ ++ static XtActionsRec actionTable[] = { ++ {"UploadOk", upload_acc_ok}, ++ {"SetValOk", setVal_action_ok}, ++ {"ManualDialOk", manual_dial_action_ok}, ++ {"DivertOk", divert_action_ok}, ++ {"Exit", ExitAction}, ++ {"GetValueByPopupOK", GetValueByPopupOKAction}, ++ }; ++ ++ XtAppAddActions(XtWidgetToApplicationContext(topLevel), actionTable, ++ XtNumber(actionTable)); ++ ++ mainBox = SeAddPaned("mainBox", topLevel); ++ statusBox = AddBox("statusBox", mainBox); ++ messageBox = SeAddForm("messageBox", mainBox); ++ quickKeyBox = AddBox("quickKeyBox", mainBox); ++ menuBox = AddBox("menuBox", mainBox); ++ ++ status[0] = SeAddToggle("dcd", statusBox, NULL); ++ status[1] = SeAddToggle("dtr", statusBox, NULL); ++ status[2] = SeAddToggle("dsr", statusBox, NULL); ++ status[3] = SeAddToggle("rts", statusBox, NULL); ++ status[4] = SeAddToggle("cts", statusBox, NULL); ++ status[5] = SeAddToggle("rng", statusBox, NULL); ++ ++ statusMessage = SeAddLabel("message", messageBox); ++ ++ AddButton("about", menuBox, TopAbout, NULL); ++ AddButton("help", menuBox, TopHelp, NULL); ++ AddButton("set", menuBox, TopSet, NULL); ++ genericWidget = dialWidget = AddButton("dial", menuBox, TopDial, NULL); ++ AddButton("transfer", menuBox, TopTransfer, NULL); ++ AddButton("shellCommand", menuBox, TopShell, NULL); ++ AddButton("misc", menuBox, TopMisc, NULL); ++ AddButton("hangup", menuBox, HangupConfirm, NULL); ++ w_exit = AddButton("exit", menuBox, ExitConfirm, NULL); ++ w_kill = AddButton("kill", menuBox, KillChildProc, NULL); ++ ++ for (i = 0; i < MAX_SEQUICKKEYS; i++) { ++ sprintf(qKBuf, "quickKey%d", i+1); /* qKBuf is large enough here... */ ++ GetQuickKeyResources(qKBuf, &quickKeyRes); ++ if (quickKeyRes.visible) { ++ n++; + quickKeyW = +- AddButton(qKBuf, quickKeyBox, DispatchActionsCallback, NULL); +- } +- } +- if (n == 0) XtDestroyWidget(quickKeyBox); +- +- XtOverrideTranslations(topLevel, +- XtParseTranslationTable("<Message>WM_PROTOCOLS: Exit()")); +- +- /* Call UpdateStatusBox() before realizing the top-level widget so that +- the status widget array in that function would be properly initialized +- before the user is able to call hangup(), since the latter passes NULL +- to UpdateStatusBox() */ +- UpdateStatusBox((XtPointer)status); +- +- XtSetMappedWhenManaged(topLevel, False); +- XtRealizeWidget(topLevel); +- XtVaGetValues(menuBox, XtNwidth, &menuBoxWidth, NULL); +- XtVaSetValues(statusBox, XtNwidth, menuBoxWidth, NULL); +- if (n) XtVaSetValues(quickKeyBox, XtNwidth, menuBoxWidth, NULL); +- +- /* +- * (ideally one should not assume any fixed numbers, but this will do +- * for now). +- * +- * width of message box = label width +- * + 2*border width (2*1) +- * + defaultDistance (right) (1) +- * + horizDistance (left) (4) +- * +- * desired width of label = width of menu box +- * - hSpace of menu box (2*4) (to align with buttons) +- * - border with of label (2*1) +- * = width of menu box - 10 +- * +- * => width of message box = width of menu box - 10 + 7 +- * => width of message box < width of menu box +- * => menu box width is the controlling factor in deciding the widnow +- * width, as desired. +- */ +- XtVaSetValues(statusMessage, XtNresizable, True, NULL); +- XtVaSetValues(statusMessage, XtNwidth, menuBoxWidth - 10, NULL); +- XtVaSetValues(statusMessage, XtNresizable, False, NULL); +- +- wm_delete_window = XInternAtom(XtDisplay(topLevel), +- "WM_DELETE_WINDOW", False); +- XSetWMProtocols(XtDisplay(topLevel), XtWindow(topLevel), +- &wm_delete_window, 1); ++ AddButton(qKBuf, quickKeyBox, DispatchActionsCallback, NULL); ++ } ++ } ++ if (n == 0) XtDestroyWidget(quickKeyBox); ++ ++ XtOverrideTranslations(topLevel, ++ XtParseTranslationTable("<Message>WM_PROTOCOLS: Exit()")); ++ ++ /* Call UpdateStatusBox() before realizing the top-level widget so that ++ the status widget array in that function would be properly initialized ++ before the user is able to call hangup(), since the latter passes NULL ++ to UpdateStatusBox() */ ++ UpdateStatusBox((XtPointer)status); ++ ++ XtSetMappedWhenManaged(topLevel, False); ++ XtRealizeWidget(topLevel); ++ XtVaGetValues(menuBox, XtNwidth, &menuBoxWidth, NULL); ++ XtVaSetValues(statusBox, XtNwidth, menuBoxWidth, NULL); ++ if (n) XtVaSetValues(quickKeyBox, XtNwidth, menuBoxWidth, NULL); ++ ++ /* ++ * (ideally one should not assume any fixed numbers, but this will do ++ * for now). ++ * ++ * width of message box = label width ++ * + 2*border width (2*1) ++ * + defaultDistance (right) (1) ++ * + horizDistance (left) (4) ++ * ++ * desired width of label = width of menu box ++ * - hSpace of menu box (2*4) (to align with buttons) ++ * - border with of label (2*1) ++ * = width of menu box - 10 ++ * ++ * => width of message box = width of menu box - 10 + 7 ++ * => width of message box < width of menu box ++ * => menu box width is the controlling factor in deciding the widnow ++ * width, as desired. ++ */ ++ XtVaSetValues(statusMessage, XtNresizable, True, NULL); ++ XtVaSetValues(statusMessage, XtNwidth, menuBoxWidth - 10, NULL); ++ XtVaSetValues(statusMessage, XtNresizable, False, NULL); ++ ++ wm_delete_window = XInternAtom(XtDisplay(topLevel), ++ "WM_DELETE_WINDOW", False); ++ XSetWMProtocols(XtDisplay(topLevel), XtWindow(topLevel), ++ &wm_delete_window, 1); + } + + void + TopAbout(parent) +- Widget parent; ++ Widget parent; + { +- Widget popup, +- mBox, +- uBox, +- lBox, +- pic, +- msg, +- caption; +- Pixmap pix; +- Dimension width1, +- width2; +- char msgStr[LRG_BUF]; ++ Widget popup, ++ mBox, ++ uBox, ++ lBox, ++ pic, ++ msg, ++ caption; ++ Pixmap pix; ++ Dimension width1, ++ width2; ++ char msgStr[LRG_BUF]; + #include "authPic.h" + +- popup = SeAddPopup("about", parent); +- mBox = SeAddPaned("mBox", popup); +- uBox = SeAddBox("uBox", mBox); +- lBox = SeAddBox("lBox", mBox); +- +- msg = SeAddLabel("msg", uBox); +- pic = SeAddLabel("pic", uBox); +- caption = SeAddLabel("caption", uBox); ++ popup = SeAddPopup("about", parent); ++ mBox = SeAddPaned("mBox", popup); ++ uBox = SeAddBox("uBox", mBox); ++ lBox = SeAddBox("lBox", mBox); ++ ++ msg = SeAddLabel("msg", uBox); ++ pic = SeAddLabel("pic", uBox); ++ caption = SeAddLabel("caption", uBox); + +- sprintf(msgStr, "%s %s rev. %s\n%s\n%s\n%s", "Seyon version", VERSION, ++ /* msgStr is big enough here */ ++ sprintf(msgStr, "%s %s rev. %s\n%s\n%s\n%s", "Seyon version", VERSION, + REVISION, "Copyright 1992-1993", "(c) Muhammad M. Saggaf", + "All rights reserved"); +- XtVaSetValues(msg, XtNlabel, msgStr, NULL); ++ XtVaSetValues(msg, XtNlabel, msgStr, NULL); + +- pix = XCreateBitmapFromData(XtDisplay(pic), +- DefaultRootWindow(XtDisplay(pic)), +- authPic_bits, authPic_width, +- authPic_height); +- XtVaSetValues(pic, XtNbitmap, pix, NULL); +- +- width1 = SeWidgetWidth(msg); +- width2 = SeWidgetWidth(pic); +- width1 = width1 > width2 ? width1 : width2; +- width2 = SeWidgetWidth(caption); +- width1 = width1 > width2 ? width1 : width2; +- +- XtVaSetValues(msg, XtNwidth, width1, NULL); +- XtVaSetValues(pic, XtNwidth, width1, NULL); +- XtVaSetValues(caption, XtNwidth, width1, NULL); ++ pix = XCreateBitmapFromData(XtDisplay(pic), ++ DefaultRootWindow(XtDisplay(pic)), ++ authPic_bits, authPic_width, ++ authPic_height); ++ XtVaSetValues(pic, XtNbitmap, pix, NULL); ++ ++ width1 = SeWidgetWidth(msg); ++ width2 = SeWidgetWidth(pic); ++ width1 = width1 > width2 ? width1 : width2; ++ width2 = SeWidgetWidth(caption); ++ width1 = width1 > width2 ? width1 : width2; ++ ++ XtVaSetValues(msg, XtNwidth, width1, NULL); ++ XtVaSetValues(pic, XtNwidth, width1, NULL); ++ XtVaSetValues(caption, XtNwidth, width1, NULL); + +- SeAddButton("dismiss", lBox, DestroyShell); ++ SeAddButton("dismiss", lBox, DestroyShell); + +- XtPopupSpringLoaded(popup); ++ XtPopupSpringLoaded(popup); + } + + /* +@@ -262,151 +270,151 @@ + + void + TopHelp(widget) +- Widget widget; ++ Widget widget; + { +- Widget DoDisplayFile(); +- Widget displayPopup; ++ Widget DoDisplayFile(); ++ Widget displayPopup; + +- XtVaSetValues(widget, XtNsensitive, False, NULL); +- displayPopup = DoDisplayFile(widget, qres.helpFile); +- XtAddCallback(displayPopup, XtNdestroyCallback, SetSensitiveOn, widget); ++ XtVaSetValues(widget, XtNsensitive, False, NULL); ++ displayPopup = DoDisplayFile(widget, qres.helpFile); ++ XtAddCallback(displayPopup, XtNdestroyCallback, SetSensitiveOn, widget); + +- PositionShell(displayPopup, widget, SHELLPOS_HWFH); +- XtPopup(displayPopup, XtGrabNone); ++ PositionShell(displayPopup, widget, SHELLPOS_HWFH); ++ XtPopup(displayPopup, XtGrabNone); + } + + void + ExecHangup() + { +- MdmHangup(); +- SeyonMessage("Line Disconnected"); ++ MdmHangup(); ++ SeyonMessage("Line Disconnected"); + } + + void + DoHangup(widget) +- Widget widget; ++ Widget widget; + { +- DestroyShell(widget); +- ExecHangup(); ++ DestroyShell(widget); ++ ExecHangup(); + } + + void + HangupConfirm(widget) +- Widget widget; ++ Widget widget; + { +- Widget popup, +- dialog; ++ Widget popup, ++ dialog; + +- ErrorIfBusy() ++ ErrorIfBusy() + +- if (qres.hangupConfirm) { +- popup = AddSimplePopup("hangup", widget); +- dialog = SeAddDialog("dialog", popup); ++ if (qres.hangupConfirm) { ++ popup = AddSimplePopup("hangup", widget); ++ dialog = SeAddDialog("dialog", popup); + +- XawDialogAddButton(dialog, "yes", DoHangup, (XtPointer) dialog); +- XawDialogAddButton(dialog, "cancel", DestroyShell, NULL); ++ XawDialogAddButton(dialog, "yes", DoHangup, (XtPointer) dialog); ++ XawDialogAddButton(dialog, "cancel", DestroyShell, NULL); + +- PopupCentered(popup, widget); +- } +- else +- ExecHangup(); ++ PopupCentered(popup, widget); ++ } ++ else ++ ExecHangup(); + } + + void + ExitNoHangup(widget) +- Widget widget; ++ Widget widget; + { +- DestroyShell(widget); +- s_exit(widget); ++ DestroyShell(widget); ++ s_exit(widget); + } + + void + ExitHangup(widget) +- Widget widget; ++ Widget widget; + { +- ExecHangup(); +- ExitNoHangup(widget); ++ ExecHangup(); ++ ExitNoHangup(widget); + } + + void + ExitConfirm(widget) +- Widget widget; ++ Widget widget; + { +- Widget popup, +- dialog; ++ Widget popup, ++ dialog; + +- if (qres.exitConfirm && !qres.ignoreModemDCD && Online()) { +- popup = AddSimplePopup("exit", widget); +- dialog = SeAddDialog("dialog", popup); ++ if (qres.exitConfirm && !qres.ignoreModemDCD && Online()) { ++ popup = AddSimplePopup("exit", widget); ++ dialog = SeAddDialog("dialog", popup); + +- XawDialogAddButton(dialog, "yes", ExitHangup, NULL); +- XawDialogAddButton(dialog, "no", ExitNoHangup, NULL); +- XawDialogAddButton(dialog, "cancel", DestroyShell, NULL); ++ XawDialogAddButton(dialog, "yes", ExitHangup, NULL); ++ XawDialogAddButton(dialog, "no", ExitNoHangup, NULL); ++ XawDialogAddButton(dialog, "cancel", DestroyShell, NULL); + +- PopupCentered(popup, widget); +- } +- else +- s_exit(); ++ PopupCentered(popup, widget); ++ } ++ else ++ s_exit(); + } + + void + ExitAction(widget) +- Widget widget; ++ Widget widget; + { +- Boolean wExitButtonStatus; ++ Boolean wExitButtonStatus; + +- /* Prevent the user from exiting the program by f.delete if exiting +- is not permitted */ +- XtVaGetValues(w_exit, XtNsensitive, &wExitButtonStatus, NULL); +- ReturnIfTrue(!wExitButtonStatus); +- s_exit(); ++ /* Prevent the user from exiting the program by f.delete if exiting ++ is not permitted */ ++ XtVaGetValues(w_exit, XtNsensitive, &wExitButtonStatus, NULL); ++ ReturnIfTrue(!wExitButtonStatus); ++ s_exit(); + } + + void + w_exit_up(w_exit_status) +- Boolean w_exit_status; ++ Boolean w_exit_status; + { +- XtVaSetValues(w_exit, XtNsensitive, w_exit_status, NULL); ++ XtVaSetValues(w_exit, XtNsensitive, w_exit_status, NULL); + } + + void + SetKillButtonSens(killWidgetStatus) +- Boolean killWidgetStatus; ++ Boolean killWidgetStatus; + { +- XtVaSetValues(w_kill, XtNsensitive, killWidgetStatus, NULL); +- w_exit_up(!killWidgetStatus); ++ XtVaSetValues(w_kill, XtNsensitive, killWidgetStatus, NULL); ++ w_exit_up(!killWidgetStatus); + } + + void + w_kill_up(w_kill_status) +- Boolean w_kill_status; ++ Boolean w_kill_status; + { +- SetKillButtonSens(w_kill_status); ++ SetKillButtonSens(w_kill_status); + } + + void + KillChildProc() + { +- if (w_child_pid == 0) return; +- if (kill(w_child_pid, SIGTERM) == 0) w_child_pid = 0; ++ if (w_child_pid == 0) return; ++ if (kill(w_child_pid, SIGTERM) == 0) w_child_pid = 0; + } + + void + GetQuickKeyResources(quickKeyName, quickKeyRes) +- String quickKeyName; +- struct _quickKeyRes *quickKeyRes; ++ String quickKeyName; ++ struct _quickKeyRes *quickKeyRes; + { + #define offset(field) XtOffsetOf(struct _quickKeyRes, field) +- static XtResource resources[] = { +- {"visible", "Visible", XtRBoolean, sizeof(Boolean), +- offset(visible), XtRImmediate, (XtPointer)False}, +- {"action", "Action", XtRString, sizeof(String), +- offset(action), XtRString, (XtPointer)""}, +- }; ++ static XtResource resources[] = { ++ {"visible", "Visible", XtRBoolean, sizeof(Boolean), ++ offset(visible), XtRImmediate, (XtPointer)False}, ++ {"action", "Action", XtRString, sizeof(String), ++ offset(action), XtRString, (XtPointer)""}, ++ }; + #undef offset + +- XtGetSubresources(topLevel, (XtPointer)quickKeyRes, quickKeyName, "Command", +- resources, XtNumber(resources), NULL, 0); ++ XtGetSubresources(topLevel, (XtPointer)quickKeyRes, quickKeyName, "Command", ++ resources, XtNumber(resources), NULL, 0); + } + + void +@@ -414,140 +422,140 @@ + { + #define offset(field) XtOffsetOf(struct QueryResources, field) + +- static XtResource resources[] = { +- {"modems", "Modems", XtRString, sizeof(String), +- offset(modems), XtRString, (XtPointer)""}, +- {"script", "Script", XtRString, sizeof(String), +- offset(script), XtRString, (XtPointer) NULL}, ++ static XtResource resources[] = { ++ {"modems", "Modems", XtRString, sizeof(String), ++ offset(modems), XtRString, (XtPointer)""}, ++ {"script", "Script", XtRString, sizeof(String), ++ offset(script), XtRString, (XtPointer) NULL}, + +- {"defaultBPS", "DefaultBPS", XtRString, sizeof(String), +- offset(defaultBPS), XtRString, (XtPointer) "9600"}, +- {"defaultBits", "DefaultBits", XtRInt, sizeof(int), +- offset(defaultBits), XtRImmediate, (XtPointer) 8}, +- {"defaultParity", "DefaultParity", XtRInt, sizeof(int), +- offset(defaultParity), XtRImmediate, (XtPointer) 0}, +- {"defaultStopBits", "DefaultStopBits", XtRInt, sizeof(int), +- offset(defaultStopBits), XtRImmediate, (XtPointer) 1}, +- {"stripHighBit", "StripHighBit", XtRBoolean, sizeof(Boolean), +- offset(stripHighBit), XtRImmediate, (XtPointer) False}, +- {"backspaceTranslation", "BackspaceTranslation", XtRBoolean, +- sizeof(Boolean), offset(backspaceTranslation), XtRImmediate, +- (XtPointer) False}, +- {"metaKeyTranslation", "MetaKeyTranslation", XtRBoolean, +- sizeof(Boolean), offset(metaKeyTranslation), XtRImmediate, +- (XtPointer) True}, +- {"xonxoffFlowControl", "XonxoffFlowControl", XtRBoolean, +- sizeof(Boolean), offset(xonxoffFlowControl), XtRImmediate, +- (XtPointer) False}, +- {"rtsctsFlowControl", "RtsctsFlowControl", XtRBoolean, +- sizeof(Boolean), offset(rtsctsFlowControl), XtRImmediate, +- (XtPointer) False}, +- {"newlineTranslation", "NewlineTranslation", XtRString, +- sizeof(String), offset(newlineTranslation), XtRImmediate, +- (XtPointer) "cr"}, +- +- {"dialPrefix", "DialPrefix", XtRString, sizeof(String), +- offset(dialPrefix), XtRString, (XtPointer) "ATDT"}, +- {"dialSuffix", "DialSuffix", XtRString, sizeof(String), +- offset(dialSuffix), XtRString, (XtPointer) "^M"}, +- {"dialCancelString", "DialCancelString", XtRString, sizeof(String), +- offset(dialCancelString), XtRString, (XtPointer) "^M"}, +- +- {"dialTimeOut", "DialTimeOut", XtRInt, sizeof(int), +- offset(dialTimeOut), XtRImmediate, (XtPointer) 45}, +- {"dialDelay", "DialDelay", XtRInt, sizeof(int), +- offset(dialDelay), XtRImmediate, (XtPointer) 10}, +- {"dialRepeat", "DialRepeat", XtRInt, sizeof(int), +- offset(dialRepeat), XtRImmediate, (XtPointer) 5}, +- +- {"connectString", "ConnectString", XtRString, sizeof(String), +- offset(connectString), XtRString, (XtPointer) "CONNECT"}, +- {"noConnectString1", "NoConnectString1", XtRString, sizeof(String), +- offset(noConnectString[0]), XtRString, (XtPointer) "NO CARRIER"}, +- {"noConnectString2", "NoConnectString2", XtRString, sizeof(String), +- offset(noConnectString[1]), XtRString, (XtPointer) "NO DIALTONE"}, +- {"noConnectString3", "NoConnectString3", XtRString, sizeof(String), +- offset(noConnectString[2]), XtRString, (XtPointer) "BUSY"}, +- {"noConnectString4", "NoConnectString4", XtRString, sizeof(String), +- offset(noConnectString[3]), XtRString, (XtPointer) "VOICE"}, +- +- {"hangupBeforeDial", "HangupBeforeDial", XtRBoolean, sizeof(Boolean), +- offset(hangupBeforeDial), XtRImmediate, (XtPointer)True}, +- {"dialAutoStart", "DialAutoStart", XtRBoolean, sizeof(Boolean), +- offset(dialAutoStart), XtRImmediate, (XtPointer)False}, +- {"dialDirFormat", "DialDirFormat", XtRString, sizeof(String), +- offset(dialDirFormat), XtRString, +- (XtPointer)"%-15s %-15s %6s %1c%1c%1c %1c%1c %s"}, +- {"defaultPhoneEntries", "DefaultPhoneEntries", XtRString, sizeof(String), +- offset(defaultPhoneEntries), XtRString, (XtPointer)NULL}, +- +- {"startupAction", "StartupAction", XtRString, sizeof(String), +- offset(startupAction), XtRString, +- (XtPointer)"RunScript(startup);"}, +- {"postConnectAction", "PostConnectAction", XtRString, sizeof(String), +- offset(postConnectAction), XtRString, (XtPointer)"Beep();"}, +- +- {"autoZmodem", "AutoZmodem", XtRBoolean, sizeof(Boolean), +- offset(autoZmodem), XtRImmediate, (XtPointer)True}, +- {"autoZmodemAction", "AutoZmodemAction", XtRString, sizeof(String), +- offset(autoZmodemAction), XtRString, +- (XtPointer)"ShellCommand($rz);"}, +- +- {"modemVMin", "ModemVMin", XtRInt, sizeof(int), +- offset(modemVMin), XtRImmediate, (XtPointer) 1}, +- {"ignoreModemDCD", "IgnoreModemDCD", XtRBoolean, sizeof(Boolean), +- offset(ignoreModemDCD), XtRImmediate, (XtPointer) False}, +- {"hangupViaDTR", "HangupViaDTR", XtRBoolean, sizeof(Boolean), +- offset(hangupViaDTR), XtRImmediate, (XtPointer)False}, +- {"modemAttentionString", "ModemAttentionString", XtRString, sizeof(String), +- offset(modemAttentionString), XtRString, (XtPointer)"+++"}, +- {"modemHangupString", "ModemHangupString", XtRString, sizeof(String), +- offset(modemHangupString), XtRString, (XtPointer)"ATH^M"}, +- {"hangupConfirm", "HangupConfirm", XtRBoolean, sizeof(Boolean), +- offset(hangupConfirm), XtRImmediate, (XtPointer) True}, +- {"exitConfirm", "ExitConfirm", XtRBoolean, sizeof(Boolean), +- offset(exitConfirm), XtRImmediate, (XtPointer) True}, +- {"neverBeep", "NeverBeep", XtRBoolean, sizeof(Boolean), +- offset(neverBeep), XtRImmediate, (XtPointer)False}, +- +- {"defaultDirectory", "DefaultDirectory", XtRString, sizeof(String), +- offset(defaultDirectory), XtRString, (XtPointer) "~/.seyon"}, +- {"scriptDirectory", "scriptDirectory", XtRString, sizeof(String), +- offset(scriptDirectory), XtRString, (XtPointer) NULL}, +- {"startupFile", "StartupFile", XtRString, sizeof(String), +- offset(startupFile), XtRString, (XtPointer) "startup"}, +- {"phoneFile", "PhoneFile", XtRString, sizeof(String), +- offset(phoneFile), XtRString, (XtPointer) "phonelist"}, +- {"protocolsFile", "ProtocolsFile", XtRString, sizeof(String), +- offset(protocolsFile), XtRString, (XtPointer) "protocols"}, +- {"captureFile", "CaptureFile", XtRString, sizeof(String), +- offset(captureFile), XtRString, (XtPointer) "capture"}, +- {"helpFile", "HelpFile", XtRString, sizeof(String), +- offset(helpFile), XtRString, (XtPointer) HELPFILE}, +- +- {"modemStatusInterval", "ModemStatusInterval", XtRInt, sizeof(int), +- offset(modemStatusInterval), XtRImmediate, (XtPointer) 5}, +- +- {"idleGuard", "IdleGuard", XtRBoolean, sizeof(Boolean), +- offset(idleGuard), XtRImmediate, (XtPointer) False}, +- {"idleGuardInterval", "IdleGuardInterval", XtRInt, sizeof(int), +- offset(idleGuardInterval), XtRImmediate, (XtPointer) 300}, +- {"idleGuardString", "IdleGuardString", XtRString, sizeof(String), +- offset(idleGuardString), XtRImmediate, (XtPointer) " ^H"}, +- +- {"showFunMessages", "ShowFunMessages", XtRBoolean, sizeof(Boolean), +- offset(showFunMessages), XtRImmediate, (XtPointer) True}, +- {"funMessagesInterval", "FunMessagesInterval", XtRInt, sizeof(int), +- offset(funMessagesInterval), XtRImmediate, (XtPointer) 15}, +- {"funMessages", "FunMessages", XtRStringArray, sizeof(String*), +- offset(funMessages), XtRStringArray, (XtPointer) NULL}, +- }; ++ {"defaultBPS", "DefaultBPS", XtRString, sizeof(String), ++ offset(defaultBPS), XtRString, (XtPointer) "9600"}, ++ {"defaultBits", "DefaultBits", XtRInt, sizeof(int), ++ offset(defaultBits), XtRImmediate, (XtPointer) 8}, ++ {"defaultParity", "DefaultParity", XtRInt, sizeof(int), ++ offset(defaultParity), XtRImmediate, (XtPointer) 0}, ++ {"defaultStopBits", "DefaultStopBits", XtRInt, sizeof(int), ++ offset(defaultStopBits), XtRImmediate, (XtPointer) 1}, ++ {"stripHighBit", "StripHighBit", XtRBoolean, sizeof(Boolean), ++ offset(stripHighBit), XtRImmediate, (XtPointer) False}, ++ {"backspaceTranslation", "BackspaceTranslation", XtRBoolean, ++ sizeof(Boolean), offset(backspaceTranslation), XtRImmediate, ++ (XtPointer) False}, ++ {"metaKeyTranslation", "MetaKeyTranslation", XtRBoolean, ++ sizeof(Boolean), offset(metaKeyTranslation), XtRImmediate, ++ (XtPointer) True}, ++ {"xonxoffFlowControl", "XonxoffFlowControl", XtRBoolean, ++ sizeof(Boolean), offset(xonxoffFlowControl), XtRImmediate, ++ (XtPointer) False}, ++ {"rtsctsFlowControl", "RtsctsFlowControl", XtRBoolean, ++ sizeof(Boolean), offset(rtsctsFlowControl), XtRImmediate, ++ (XtPointer) False}, ++ {"newlineTranslation", "NewlineTranslation", XtRString, ++ sizeof(String), offset(newlineTranslation), XtRImmediate, ++ (XtPointer) "cr"}, ++ ++ {"dialPrefix", "DialPrefix", XtRString, sizeof(String), ++ offset(dialPrefix), XtRString, (XtPointer) "ATDT"}, ++ {"dialSuffix", "DialSuffix", XtRString, sizeof(String), ++ offset(dialSuffix), XtRString, (XtPointer) "^M"}, ++ {"dialCancelString", "DialCancelString", XtRString, sizeof(String), ++ offset(dialCancelString), XtRString, (XtPointer) "^M"}, ++ ++ {"dialTimeOut", "DialTimeOut", XtRInt, sizeof(int), ++ offset(dialTimeOut), XtRImmediate, (XtPointer) 45}, ++ {"dialDelay", "DialDelay", XtRInt, sizeof(int), ++ offset(dialDelay), XtRImmediate, (XtPointer) 10}, ++ {"dialRepeat", "DialRepeat", XtRInt, sizeof(int), ++ offset(dialRepeat), XtRImmediate, (XtPointer) 5}, ++ ++ {"connectString", "ConnectString", XtRString, sizeof(String), ++ offset(connectString), XtRString, (XtPointer) "CONNECT"}, ++ {"noConnectString1", "NoConnectString1", XtRString, sizeof(String), ++ offset(noConnectString[0]), XtRString, (XtPointer) "NO CARRIER"}, ++ {"noConnectString2", "NoConnectString2", XtRString, sizeof(String), ++ offset(noConnectString[1]), XtRString, (XtPointer) "NO DIALTONE"}, ++ {"noConnectString3", "NoConnectString3", XtRString, sizeof(String), ++ offset(noConnectString[2]), XtRString, (XtPointer) "BUSY"}, ++ {"noConnectString4", "NoConnectString4", XtRString, sizeof(String), ++ offset(noConnectString[3]), XtRString, (XtPointer) "VOICE"}, ++ ++ {"hangupBeforeDial", "HangupBeforeDial", XtRBoolean, sizeof(Boolean), ++ offset(hangupBeforeDial), XtRImmediate, (XtPointer)True}, ++ {"dialAutoStart", "DialAutoStart", XtRBoolean, sizeof(Boolean), ++ offset(dialAutoStart), XtRImmediate, (XtPointer)False}, ++ {"dialDirFormat", "DialDirFormat", XtRString, sizeof(String), ++ offset(dialDirFormat), XtRString, ++ (XtPointer)"%-15s %-15s %6s %1c%1c%1c %1c%1c %s"}, ++ {"defaultPhoneEntries", "DefaultPhoneEntries", XtRString, sizeof(String), ++ offset(defaultPhoneEntries), XtRString, (XtPointer)NULL}, ++ ++ {"startupAction", "StartupAction", XtRString, sizeof(String), ++ offset(startupAction), XtRString, ++ (XtPointer)"RunScript(startup);"}, ++ {"postConnectAction", "PostConnectAction", XtRString, sizeof(String), ++ offset(postConnectAction), XtRString, (XtPointer)"Beep();"}, ++ ++ {"autoZmodem", "AutoZmodem", XtRBoolean, sizeof(Boolean), ++ offset(autoZmodem), XtRImmediate, (XtPointer)True}, ++ {"autoZmodemAction", "AutoZmodemAction", XtRString, sizeof(String), ++ offset(autoZmodemAction), XtRString, ++ (XtPointer)"ShellCommand($rz);"}, ++ ++ {"modemVMin", "ModemVMin", XtRInt, sizeof(int), ++ offset(modemVMin), XtRImmediate, (XtPointer) 1}, ++ {"ignoreModemDCD", "IgnoreModemDCD", XtRBoolean, sizeof(Boolean), ++ offset(ignoreModemDCD), XtRImmediate, (XtPointer) False}, ++ {"hangupViaDTR", "HangupViaDTR", XtRBoolean, sizeof(Boolean), ++ offset(hangupViaDTR), XtRImmediate, (XtPointer)False}, ++ {"modemAttentionString", "ModemAttentionString", XtRString, sizeof(String), ++ offset(modemAttentionString), XtRString, (XtPointer)"+++"}, ++ {"modemHangupString", "ModemHangupString", XtRString, sizeof(String), ++ offset(modemHangupString), XtRString, (XtPointer)"ATH^M"}, ++ {"hangupConfirm", "HangupConfirm", XtRBoolean, sizeof(Boolean), ++ offset(hangupConfirm), XtRImmediate, (XtPointer) True}, ++ {"exitConfirm", "ExitConfirm", XtRBoolean, sizeof(Boolean), ++ offset(exitConfirm), XtRImmediate, (XtPointer) True}, ++ {"neverBeep", "NeverBeep", XtRBoolean, sizeof(Boolean), ++ offset(neverBeep), XtRImmediate, (XtPointer)False}, ++ ++ {"defaultDirectory", "DefaultDirectory", XtRString, sizeof(String), ++ offset(defaultDirectory), XtRString, (XtPointer) "~/.seyon"}, ++ {"scriptDirectory", "scriptDirectory", XtRString, sizeof(String), ++ offset(scriptDirectory), XtRString, (XtPointer) NULL}, ++ {"startupFile", "StartupFile", XtRString, sizeof(String), ++ offset(startupFile), XtRString, (XtPointer) "startup"}, ++ {"phoneFile", "PhoneFile", XtRString, sizeof(String), ++ offset(phoneFile), XtRString, (XtPointer) "phonelist"}, ++ {"protocolsFile", "ProtocolsFile", XtRString, sizeof(String), ++ offset(protocolsFile), XtRString, (XtPointer) "protocols"}, ++ {"captureFile", "CaptureFile", XtRString, sizeof(String), ++ offset(captureFile), XtRString, (XtPointer) "capture"}, ++ {"helpFile", "HelpFile", XtRString, sizeof(String), ++ offset(helpFile), XtRString, (XtPointer) HELPFILE}, ++ ++ {"modemStatusInterval", "ModemStatusInterval", XtRInt, sizeof(int), ++ offset(modemStatusInterval), XtRImmediate, (XtPointer) 5}, ++ ++ {"idleGuard", "IdleGuard", XtRBoolean, sizeof(Boolean), ++ offset(idleGuard), XtRImmediate, (XtPointer) False}, ++ {"idleGuardInterval", "IdleGuardInterval", XtRInt, sizeof(int), ++ offset(idleGuardInterval), XtRImmediate, (XtPointer) 300}, ++ {"idleGuardString", "IdleGuardString", XtRString, sizeof(String), ++ offset(idleGuardString), XtRImmediate, (XtPointer) " ^H"}, ++ ++ {"showFunMessages", "ShowFunMessages", XtRBoolean, sizeof(Boolean), ++ offset(showFunMessages), XtRImmediate, (XtPointer) True}, ++ {"funMessagesInterval", "FunMessagesInterval", XtRInt, sizeof(int), ++ offset(funMessagesInterval), XtRImmediate, (XtPointer) 15}, ++ {"funMessages", "FunMessages", XtRStringArray, sizeof(String*), ++ offset(funMessages), XtRStringArray, (XtPointer) NULL}, ++ }; + + #undef offset + +- XtSetTypeConverter(XtRString, XtRStringArray, CvtStringToStringArray, +- NULL, 0, XtCacheNone, NULL); ++ XtSetTypeConverter(XtRString, XtRStringArray, CvtStringToStringArray, ++ NULL, 0, XtCacheNone, NULL); + +- XtGetApplicationResources(topLevel, (XtPointer)&qres, resources, +- XtNumber(resources), NULL, 0); ++ XtGetApplicationResources(topLevel, (XtPointer)&qres, resources, ++ XtNumber(resources), NULL, 0); + } +--- seyon-2.20c.orig/SeDial.c ++++ seyon-2.20c/SeDial.c +@@ -89,7 +89,7 @@ + {XMapRaised(XtDisplay(widget), XtWindow(popup)); return;} + + if (disItems[0] == NULL) { +- strcpy(phoneFile, qres.phoneFile); ++ strncpy(phoneFile, qres.phoneFile, REG_BUF); + if (ReadParsePhoneFile(phoneFile, disItems) < 0) return; + + form = XtParent(widget); +@@ -328,7 +328,7 @@ + Widget dialog = XtParent(widget); + char phoneNumber[SM_BUF]; + +- strcpy(phoneNumber, XawDialogGetValueString(dialog)); ++ strncpy(phoneNumber, XawDialogGetValueString(dialog), SM_BUF); + DestroyShell(dialog); + ExecManualDial(XtParent(GetShell(widget)), phoneNumber); + } +@@ -341,7 +341,7 @@ + inhibit_child = True; + manualDial = True; + +- strcpy(phone_number, phoneNumber); ++ strncpy(phone_number, phoneNumber, SM_BUF); + + dialTry = 1; + PreProcessPrep(); +@@ -442,15 +442,15 @@ + if ((ptr = (char*)strstr(raw, keyword)) != NULL) { + ptr += strlen(keyword); + if (strncmp(ptr, "CURRENT", 3)) { +- strcpy(buf, ptr); ++ strncpy(buf, ptr, REG_BUF); + GetWord(buf, wrd); +- strcpy(var, wrd); ++ strncpy(var, wrd, sizeof(*var)); + } + else +- strcpy(var, "CURRENT"); ++ strncpy(var, "CURRENT", sizeof(*var)); + } + else +- strcpy(var, def); ++ strncpy(var, def, sizeof(*var)); + } + + void +@@ -463,8 +463,8 @@ + char svar[TIN_BUF], + sdef[TIN_BUF]; + +- sprintf(svar, "%d", *var); +- sprintf(sdef, "%d", def); ++ sprintf(svar, "%d", *var); /* safe */ ++ sprintf(sdef, "%d", def); /* safe */ + + GetStrField(raw, keyword, svar, sdef); + +@@ -496,7 +496,7 @@ + else { + signal(SIGALRM, SIG_DFL); + alarm(0); +- strcpy(dialMsg, "TIMEOUT"); ++ strncpy(dialMsg, "TIMEOUT", SM_BUF); + longjmp(dial_env, 1); + } + } +@@ -514,6 +514,8 @@ + *bufPtr, + dialString[REG_BUF]; + int i, ++/* length, */ ++ length_remaining, + k; + + if (setjmp(dial_env) != 0) { +@@ -534,8 +536,8 @@ + if (!manualDial) { + + itemName = ddItems[k]->name; +- sprintf(dialString, "\r%s %s%s", ddItems[k]->prefix, ddItems[k]->number, +- ddItems[k]->suffix); ++ strncpy(dialString, FmtString("\r%s %s%s", ddItems[k]->prefix, ++ ddItems[k]->number, ddItems[k]->suffix), REG_BUF); + + if (mbaud(ddItems[k]->baud) < 0) + se_warningf("invalid BPS value in dialing directory: %s", +@@ -552,14 +554,23 @@ + } + else { + itemName = phone_number; +- sprintf(dialString, "\r%s %s%s", qres.dialPrefix, phone_number, +- qres.dialSuffix); ++ strncpy(dialString, FmtString("\r%s %s%s", qres.dialPrefix, phone_number, ++ qres.dialSuffix), REG_BUF); + } + ++ length_remaining = SM_BUF; + if (dialTry == 1) +- sprintf(dialMsg, "Dialing %s", itemName); ++ { ++ strncpy(dialMsg, "Dialing ", length_remaining); ++ length_remaining -= strlen("Dialing "); ++ strncat(dialMsg, itemName, length_remaining); ++ } + else +- sprintf(dialMsg, "Redialing:%d %s", dialTry, itemName); ++ strncpy(dialMsg, "Redialing ", length_remaining); ++ length_remaining -= strlen("Redialing "); ++ sprintf(dialMsg, "%1.1d ", dialTry); ++ length_remaining -= 2; ++ strncat(dialMsg, itemName, length_remaining); + + ProcRequest(SET_MESSAGE, "Setting Up...", ""); + +@@ -589,7 +600,7 @@ + for (i = 0; i < 3; i++) + if (*(bufPtr = StripSpace(qres.noConnectString[i])) && + strncmp(modemResponse, bufPtr, strlen(bufPtr)) == 0) { +- strcpy(dialMsg, modemResponse); ++ strncpy(dialMsg, modemResponse, SM_BUF); + longjmp(dial_env, 1); + } + } /* while(1)... */ +@@ -601,15 +612,20 @@ + String disItems[]; + { + FILE *fp; ++ FILE *devnull; + String rawItems[MAX_ENT + 1]; + char *buf, + *sHold, + disItemsBuf[REG_BUF]; ++ char filename[LRG_BUF]; + int i, + n, ++ length, + iHold; + +- if ((fp = open_file(fname, qres.defaultDirectory)) == NULL) ++ strncpy(filename, fname, REG_BUF); ++ ++ if ((fp = open_file(filename, REG_BUF, qres.defaultDirectory)) == NULL) + return -1; + + ReadCommentedFile(fp, rawItems); +@@ -623,11 +639,9 @@ + + /* Find the number */ + GetWord(buf, ddItems[i]->number); +-/* strcpy(ddItems[i]->number, GetFirstWord(buf));*/ + + /* Find the name */ + GetWord((buf = lptr), ddItems[i]->name); +-/* strcpy(ddItems[i]->name, GetNextWord());*/ + + /* Find other stuff */ + GetStrField(buf, "BPS=", ddItems[i]->baud, qres.defaultBPS); +@@ -643,8 +657,20 @@ + FreeList(rawItems); + FreeList(disItems); + ++ /* Ick... This is horrible - using a user-provided format string ++ means we have no easy way of limiting string length. HACK HACK ++ HACK Use fprintf to output to /dev/null and count the number of ++ bytes... It would be nice if we could rely on having snprintf() */ ++ ++ devnull = fopen("/dev/null", "r+"); ++ if(NULL == devnull) ++ { ++ printf("Open /dev/null failed!?!\n"); ++ return 1; ++ } ++ + for (n = 0; n < i; n++) { +- sprintf(disItemsBuf, qres.dialDirFormat, ++ length = fprintf(devnull, qres.dialDirFormat, + ddItems[n]->name, + ddItems[n]->number, + strncmp((sHold = ddItems[n]->baud), "CUR", 3) ? sHold : "????", +@@ -658,10 +684,33 @@ + strcmp(sHold, qres.dialSuffix) ? 'S' : 'D' : '?', + ddItems[n]->script); + +- disItemsBuf[SM_BUF - 1] = '\0'; +- disItems[n] = XtNewString(disItemsBuf); ++ if(REG_BUF >= length) ++ { ++ sprintf(disItemsBuf, qres.dialDirFormat, ++ ddItems[n]->name, ++ ddItems[n]->number, ++ strncmp((sHold = ddItems[n]->baud), "CUR", 3) ? sHold : "????", ++ (iHold = ddItems[n]->bits) == 100 ? '?' : itoa(iHold), ++ (iHold = ddItems[n]->parity) ? (iHold == 1 ? 'O' : ++ (iHold == 2 ? 'E' : '?')) : 'N', ++ (iHold = ddItems[n]->stopBits) == 100 ? '?' : itoa(iHold), ++ strncmp((sHold = ddItems[n]->prefix), "CUR", 3) ? ++ strcmp(sHold, qres.dialPrefix) ? 'P' : 'D' : '?', ++ strncmp((sHold = ddItems[n]->suffix), "CUR", 3) ? ++ strcmp(sHold, qres.dialSuffix) ? 'S' : 'D' : '?', ++ ddItems[n]->script); ++ disItemsBuf[SM_BUF - 1] = '\0'; ++ disItems[n] = XtNewString(disItemsBuf); ++ } ++ else ++ { ++ printf("ReadParsePhoneFile: attempted overrun: %s\n",ddItems[n]->name); ++ fclose(devnull); ++ return 1; ++ } + } + disItems[n] = NULL; ++ fclose(devnull); + + return 0; + } +--- seyon-2.20c.orig/SePort.c ++++ seyon-2.20c/SePort.c +@@ -51,7 +51,7 @@ + #ifdef linux + #include <linux/serial.h> + #include <sys/ioctl.h> +-#include <linux/fs.h> ++/* #include <linux/fs.h> */ + #include <linux/tty.h> + #endif + #endif +@@ -127,20 +127,30 @@ + + void + MdmPutString(s) +- char *s; ++ char *s; + { +- char c; +- +- usleep(MDELAY); +- for (; (c = *s); s++) { +- if (*s == '^' && *(s + 1)) +- if (*(++s) == '^') c = *s; +- else c = *s & 0x1f; ++ char c; + +- if (c == '~') sleep(1); +- else send_tbyte(c); + usleep(MDELAY); +- } ++ for (; (c = *s); s++) ++ { ++ if (*s == '^' && *(s + 1)) ++ { ++ if (*(++s) == '^') ++ { ++ c = *s; ++ } ++ else ++ { ++ c = *s & 0x1f; ++ } ++ } ++ if (c == '~') ++ sleep(1); ++ else ++ send_tbyte(c); ++ usleep(MDELAY); ++ } + } + + void +@@ -150,10 +160,7 @@ + *b, + *c; + { +- char buf[REG_BUF]; +- +- sprintf(buf, fmt, a, b, c); +- MdmPutString(buf); ++ MdmPutString(FmtString(fmt,a,b,c)); + } + + void +@@ -224,7 +231,7 @@ + int newModem; + { + static Boolean useModemControl = True; +- int retStat; ++ int retStat = 0; + + if (newModem) useModemControl = True; + +@@ -350,11 +357,11 @@ + + char * + mport(s) /* get/set port string */ +- char *s; ++ char *s; + { +- if (s != NULL) +- strcpy(modem_port, s); +- return (modem_port); ++ if (s != NULL) ++ strncpy(modem_port, s, sizeof(modem_port)); ++ return (modem_port); + } + + int +@@ -650,6 +657,17 @@ + ser_io.flags |= ASYNC_SPD_VHI; + break; + #endif ++#else ++#ifdef B57600 ++ case 57600: ++ baudrate = B57600; ++ break; ++#endif ++#ifdef B115200 ++ case 115200: ++ baudrate = B115200; ++ break; ++#endif + #endif + default: + return (-1); +@@ -702,6 +720,14 @@ + #endif + #endif + return 38400; ++#ifdef B57600 ++ case B57600: ++ return 57600; ++#endif ++#ifdef B115200 ++ case B115200: ++ return 115200; ++#endif + } + + SeError("Consistency error in baud rate"); +@@ -822,7 +848,7 @@ + modemName, "", "")); + break; + default: +- SeError(FmtString("Unknown Error While Openeong Modem ``%s''", ++ SeError(FmtString("Unknown Error While Opening Modem ``%s''", + modemName, "", "")); + break; + } +@@ -946,16 +972,13 @@ + } + + void +-sendf_slowly(format, a, b, c) +- char *format, ++sendf_slowly(fmt, a, b, c) ++ char *fmt, + *a, + *b, + *c; + { +- char buffer[SM_BUF]; +- +- sprintf(buffer, format, a, b, c); +- send_slowly(buffer); ++ send_slowly(FmtString(fmt,a,b,c)); + } + + void +@@ -989,7 +1012,7 @@ + LockModem(modem) + String modem; + { +- strcpy(modem_port, modem); ++ strncpy(modem_port, modem, REG_BUF); + return lock_tty(); + } + +@@ -1004,50 +1027,82 @@ + int + lock_tty() + { +- int lfd; +- pid_t pid, +- lckpid; +- char *modemname; ++ int lfd; ++ pid_t pid, ++ lckpid; ++ char *modemname; + #if LF_USE_ASCII_PID +- char pidstr[20], +- lckpidstr[20]; +- int nb; ++ char pidstr[20], ++ lckpidstr[20]; ++ int nb; + #endif + #if LF_USE_DEV_NUMBERS +- struct stat mbuf; ++ struct stat mbuf; + #endif + +- /* Get our PID, and initialize the filename strings */ +- pid = getpid(); ++ /* Get our PID, and initialize the filename strings */ ++ pid = getpid(); + + #if !LF_USE_DEV_NUMBERS +- modemname = strrchr(modem_port, '/'); +- sprintf(lckf, "%s/%s%s", LF_PATH, LF_PREFIX, +- (modemname ? (modemname + 1) : modem_port)); ++ modemname = strrchr(modem_port, '/'); ++ if(modemname) ++ { ++ if( SM_BUF > (1 + strlen(LF_PATH) + strlen(LF_PREFIX) + strlen(modemname))) ++ sprintf(lckf, "%s/%s%s", LF_PATH, LF_PREFIX, (modemname + 1)); ++ else ++ { ++ SePErrorF("Buffer too small for lock filename in lock_tty(): %s", modemname, "", ""); ++ return -1; ++ } ++ } ++ else ++ { ++ if( SM_BUF > (1 + strlen(LF_PATH) + strlen(LF_PREFIX) + strlen(modem_port))) ++ sprintf(lckf, "%s/%s%s", LF_PATH, LF_PREFIX, (modem_port)); ++ else ++ { ++ SePErrorF("Buffer too small for lock filename in lock_tty(): %s", modem_port, "", ""); ++ return -1; ++ } ++ } ++ + #else +- if(stat(modem_port, &mbuf) < 0) { +- SePErrorF("could not stat modem port %s", modem_port, "", ""); +- return -1; +- } +- sprintf(lckf,"%s/%s%03u.%03u.%03u", LF_PATH, LF_PREFIX, major(mbuf.st_dev), +- major(mbuf.st_rdev), minor(mbuf.st_rdev)); ++ if(stat(modem_port, &mbuf) < 0) { ++ SePErrorF("could not stat modem port %s", modem_port, "", ""); ++ return -1; ++ } ++ if( SM_BUF > (10 + strlen(LF_PATH) + strlen(LF_PREFIX))) ++ sprintf(lckf,"%s/%s%03u.%03u.%03u", LF_PATH, LF_PREFIX, major(mbuf.st_dev), ++ major(mbuf.st_rdev), minor(mbuf.st_rdev)); ++ else ++ { ++ SePErrorF("Buffer too small for lock filename in lock_tty():", "", "", ""); ++ return -1; ++ } + #endif /* LF_USE_DEV_NUMBERS */ + +- sprintf(ltmp, "%s/%s%d", LF_PATH, "LTMP.", pid); +- /* Create the LTMP.<pid> file and scribble our PID in it */ +- unlink(ltmp); +- if ((lfd = creat(ltmp, 0644)) == -1) { +- SePErrorF("Could not create temporary lock file %s", ltmp, "", ""); +- return -1; +- } ++ if( SM_BUF > (11 + strlen(LF_PATH))) ++ sprintf(ltmp, "%s/%s%d", LF_PATH, "LTMP.", pid); ++ else ++ { ++ SePErrorF("Buffer too small for ltmp filename in lock_tty():", "", "", ""); ++ return -1; ++ } ++ /* Create the LTMP.<pid> file and scribble our PID in it */ ++ unlink(ltmp); ++ if ((lfd = creat(ltmp, 0644)) == -1) { ++ SePErrorF("Could not create temporary lock file %s", ltmp, "", ""); ++ return -1; ++ } + + #if LF_USE_ASCII_PID +- sprintf(pidstr, "%10d\n", pid); +- write(lfd, pidstr, 11); ++ /* pidstr is easily large enough */ ++ sprintf(pidstr, "%10d\n", pid); ++ write(lfd, pidstr, 11); + #else +- write(lfd, (char*)&pid, sizeof(pid)); ++ write(lfd, (char*)&pid, sizeof(pid)); + #endif +- close(lfd); ++ close(lfd); + + /* + * Attempt to link directly - if it works, we're done. +--- seyon-2.20c.orig/protocols ++++ seyon-2.20c/protocols +@@ -6,7 +6,7 @@ + # you have to use the resources + # zmodemAutoDownload and + # zmodemAutoDownloadCommand for that. +-# see the manula page for more details. ++# see the manual page for more details. + + # the format is simple. + +@@ -24,9 +24,9 @@ + + # you can put comments on a single line + # or at the end of a line +- +-regular_zmodem_dl "$ cd /usr/dl; rz -vv" n # like in here +- ++# ++#regular_zmodem_dl "$ cd /usr/dl; rz -vv" n # like in here ++# + # blank lines are OK too, for readability. + + # the title has to be either a single word, like the above +@@ -34,21 +34,29 @@ + + # you put anything instead of y as long as it starts + # with y: y, Y, yes, yep ..etc. +- +-"regular zmodem ul" "$ cd /usr/src; sz -vv" y +- ++# ++#"regular zmodem ul" "$ cd /usr/src; sz -vv" y ++# + # anything that doesn't start with a y is a no + # e.g. n, N, NO, Not, nope, nien, nono ..etc. + # even hello, but the use of words that doesn't start + # with n is highly discouraged +- +-graphic_zmodem_dl "cd /usr/dl; grz No +-xrz3D "$cd /usr/dl; xrz" NO +- ++# ++#graphic_zmodem_dl "cd /usr/dl; grz No ++#xrz3D "$cd /usr/dl; xrz" NO ++# + # here is my own protocols file + # notice how I make it clear to myself + # whether I'm uploading or downloading +- +-"SEND - Zmodem" "$cd /usr/src; sz -vv" y +-"RECEIVE - Reg. Zmodem" "$cd /usr/dl; rz -vv" n +-"RECEIVE - Xrz3D" "$cd /usr/dl; xrz" n ++# ++#"SEND - Zmodem" "$cd /usr/src; sz -vv" y ++#"RECEIVE - Reg. Zmodem" "$cd /usr/dl; rz -vv" n ++#"RECEIVE - Xrz3D" "$cd /usr/dl; xrz" n ++ ++"Zmodem - RECEIVE" "$lrz" n ++"Ymodem - RECEIVE" "$lrb" n ++"Xmodem - RECEIVE" "$lrx" y ++ ++"Zmodem - SEND" "$lsz" y ++"Ymodem - SEND" "$lsb" y ++"Xmodem - SEND" "$lsx" y +--- seyon-2.20c.orig/SeErr.c ++++ seyon-2.20c/SeErr.c +@@ -107,28 +107,26 @@ + + #ifdef notdef + void +-SePopupWarningF(parent, fmt, a, b, c, d) ++SePopupWarningF(parent, fmt, a, b, c) + Widget parent; + String fmt, + a, + b, +- c, +- d; ++ c; + { + SePopupNoticeF(parent, 0, "Seyon Warning", DestroyParentPopup, +- fmt, a, b, c, d); ++ fmt, a, b, c); + } + + void +-SePopupInitWarningF(parent, fmt, a, b, c, d) ++SePopupInitWarningF(parent, fmt, a, b, c) + Widget parent; + String fmt, + a, + b, +- c, +- d; ++ c; + { + SePopupNoticeF(parent, 0, "Seyon Initialization Warning", +- DestroyParentPopup, fmt, a, b, c, d); ++ DestroyParentPopup, fmt, a, b, c); + } + #endif +--- seyon-2.20c.orig/SeSubs.c ++++ seyon-2.20c/SeSubs.c +@@ -45,9 +45,9 @@ + + void + toggle_flag(flag) +- Boolean *flag; ++ Boolean *flag; + { +- *flag = !*flag; ++ *flag = !*flag; + } + + /* +@@ -56,10 +56,10 @@ + + void + show(msg) +- char *msg; ++ char *msg; + { +- fprintf(tfp, "%s\r\n", msg); +- fflush(tfp); ++ fprintf(tfp, "%s\r\n", msg); ++ fflush(tfp); + } + + /* +@@ -68,105 +68,96 @@ + + void + showf(fmt, a, b, c) +- char *fmt, +- *a, +- *b, +- *c; ++ char *fmt, ++ *a, ++ *b, ++ *c; + { +- fprintf(tfp, fmt, a, b, c); +- fprintf(tfp, "\r\n"); ++ fprintf(tfp, fmt, a, b, c); ++ fprintf(tfp, "\r\n"); + } + + void + SeError(msg) +- char *msg; ++ char *msg; + { +- char buf[REG_BUF]; ++ char buf[REG_BUF]; + +- sprintf(buf, "\r>> Error: %s.", msg); +- show(buf); ++ strncpy(buf, "\r>> Error: ",REG_BUF); ++ strncat(buf, msg, REG_BUF-12); ++ buf[REG_BUF - 1] = 0; /* Null-terminate to be sure */ ++ show(buf); + } + + void + SeErrorF(fmt, a, b, c) +- char *fmt, +- *a, +- *b, +- *c; ++ char *fmt, ++ *a, ++ *b, ++ *c; + { +- char buf[REG_BUF]; +- +- sprintf(buf, fmt, a, b, c); +- SeError(buf); ++ SeError(FmtString(fmt, a, b, c)); + } + + void + se_warning(msg) +- char *msg; ++ char *msg; + { +- char buf[REG_BUF]; ++ char buf[REG_BUF]; + +- sprintf(buf, "\r>> Warning: %s.", msg); +- show(buf); ++ strncpy(buf, "\r>> Warning: ",REG_BUF); ++ strncat(buf, msg, REG_BUF-14); ++ buf[REG_BUF - 1] = 0; /* Null-terminate to be sure */ ++ show(buf); + } + + void + se_warningf(fmt, a, b, c) +- char *fmt, +- *a, +- *b, +- *c; ++ char *fmt, ++ *a, ++ *b, ++ *c; + { +- char buf[REG_BUF]; +- +- sprintf(buf, fmt, a, b, c); +- se_warning(buf); ++ se_warning(FmtString(fmt, a, b, c)); + } + + void + SeNotice(msg) +- char *msg; ++ char *msg; + { +- char buf[REG_BUF]; ++ char buf[REG_BUF]; + +- sprintf(buf, "\r>> Notice: %s.", msg); +- show(buf); ++ strncpy(buf, "\r>> Notice: ",REG_BUF); ++ strncat(buf, msg, REG_BUF-13); ++ buf[REG_BUF - 1] = 0; /* Null-terminate to be sure */ ++ show(buf); + } + + void + SeNoticeF(fmt, a, b, c) +- char *fmt, +- *a, +- *b, +- *c; ++ char *fmt, ++ *a, ++ *b, ++ *c; + { +- char buf[REG_BUF]; +- +- sprintf(buf, fmt, a, b, c); +- SeNotice(buf); ++ SeNotice(FmtString(fmt, a, b, c)); + } + + void + SePError(msg) +- char *msg; ++ char *msg; + { +- char buf[REG_BUF]; +- +- sprintf(buf, "%s: %s", msg, strerror(errno)); +- SeError(buf); ++ SeError(FmtString("%s: %s",msg,strerror(errno))); + } + + void + SePErrorF(fmt, a, b, c) +- char *fmt, +- *a, +- *b, +- *c; ++ char *fmt, ++ *a, ++ *b, ++ *c; + { +- char buf[REG_BUF]; +- +- sprintf(buf, fmt, a, b, c); +- SePError(buf); ++ SePError(FmtString(fmt,a,b,c)); + } + + /* ------------------------------------------------------------ +@@ -180,12 +171,12 @@ + int + SeFork() + { +- pid_t pid; ++ pid_t pid; + +- if ((pid = fork()) < 0) +- SePError("Faild to fork process"); ++ if ((pid = fork()) < 0) ++ SePError("Faild to fork process"); + +- return pid; ++ return pid; + } + + /* +@@ -194,119 +185,119 @@ + + void + ShellCommandHandler(sig, fio_p) +- int sig; +- XtPointer fio_p; ++ int sig; ++ XtPointer fio_p; + { +- void PostExecPrep(); ++ void PostExecPrep(); + +- if (wait((int*)0) < 0) SePError("ShellCommand wait failed"); +- XoAppIgnoreSignal(app_con, SIGCHLD); ++ if (wait((int*)0) < 0) SePError("ShellCommand wait failed"); ++ XoAppIgnoreSignal(app_con, SIGCHLD); + +- set_tty_mode(); +- set_modem_fio(*(int *)fio_p); ++ set_tty_mode(); ++ set_modem_fio(*(int *)fio_p); + +- SeyonMessage("Shell Command Completed"); +- PostExecPrep(); +- inhibit_child = False; ++ SeyonMessage("Shell Command Completed"); ++ PostExecPrep(); ++ inhibit_child = False; + } + + void + ShellCommand(command) +- char *command; ++ char *command; + { +- ExecShellCommand(command, 1); ++ ExecShellCommand(command, 1); + } + + void + ExecShellCommand(command, top) +- char *command; +- int top; ++ char *command; ++ int top; + { +- static char *shell = NULL; +- char cmd[REG_BUF], +- *scmd; +- static int fio=0; +- pid_t forkRes; +- +- if (command == NULL) return; +- +- if (shell == NULL) { +- shell = (char*)getenv("SHELL"); +- if (!shell) shell = "/bin/sh"; +- } +- +- if (top) PreExecPrep(); +- +- io_set_attr(tfd, &oldmode); +- fio = get_modem_fio(); +- +- if (top) +- XoAppAddSignal(app_con, SIGCHLD, ShellCommandHandler, (XtPointer)&fio); +- else signal(SIGCHLD, SIG_IGN); +- +- forkRes = SeFork(); +- if (forkRes == 0) { +- scmd = str_stripspc_copy(cmd, command); +- +- show(""); +- +- if (*scmd == '$') { +- SeNotice("Redirecting stdin/stdout"); +- mattach(); /* Attach modem to stdin/stdout */ +- scmd++; ++ static char *shell = NULL; ++ char cmd[REG_BUF], ++ *scmd; ++ static int fio=0; ++ pid_t forkRes; ++ ++ if (command == NULL) return; ++ ++ if (shell == NULL) { ++ shell = (char*)getenv("SHELL"); ++ if (!shell) shell = "/bin/sh"; + } + +- if (setuid(getuid()) < 0) +- SePError("Failed to set effective uid"); ++ if (top) PreExecPrep(); + +- if (*scmd == CNULL) { +- SeNotice(FmtString1("Executing the shell `%s'", shell)); +- execl(shell, shell, (char*)NULL); +- SeError(FmtString1("Execution of the shell `%s' failed", shell)); +- exit(1); +- } ++ io_set_attr(tfd, &oldmode); ++ fio = get_modem_fio(); ++ ++ if (top) ++ XoAppAddSignal(app_con, SIGCHLD, ShellCommandHandler, (XtPointer)&fio); ++ else signal(SIGCHLD, SIG_IGN); ++ ++ forkRes = SeFork(); ++ if (forkRes == 0) { ++ scmd = str_stripspc_copy(cmd, command); ++ ++ show(""); ++ ++ if (*scmd == '$') { ++ SeNotice("Redirecting stdin/stdout"); ++ mattach(); /* Attach modem to stdin/stdout */ ++ scmd++; ++ } ++ ++ if (setuid(getuid()) < 0) ++ SePError("Failed to set effective uid"); ++ ++ if (*scmd == CNULL) { ++ SeNotice(FmtString1("Executing the shell `%s'", shell)); ++ execl(shell, shell, (char*)NULL); ++ SeError(FmtString1("Execution of the shell `%s' failed", shell)); ++ exit(1); ++ } + +- SeNotice(FmtString1("Executing the command `%s'", scmd)); +- execl(shell, shell, "-c", scmd, (char*)NULL); +- SePError(FmtString1("Execution of the command `%s' failed", scmd)); +- exit(1); +- } +- else if (forkRes > 0) { +- if (top) inhibit_child = True; +- else { ++ SeNotice(FmtString1("Executing the command `%s'", scmd)); ++ execl(shell, shell, "-c", scmd, (char*)NULL); ++ SePError(FmtString1("Execution of the command `%s' failed", scmd)); ++ exit(1); ++ } ++ else if (forkRes > 0) { ++ if (top) inhibit_child = True; ++ else { + wait((int*)0); /* Wait for the child process to terminate */ + set_tty_mode(); + set_modem_fio(fio); +- } +- } /* if (forkRes == 0)... */ ++ } ++ } /* if (forkRes == 0)... */ + } + + void + PreProcessPrep() + { +- SuspContTerminal(TERM_SUSPEND); +- SetKillButtonSens(True); ++ SuspContTerminal(TERM_SUSPEND); ++ SetKillButtonSens(True); + } + + void + PostProcessPrep() + { +- SuspContTerminal(TERM_CONTINUE); +- SetKillButtonSens(False); ++ SuspContTerminal(TERM_CONTINUE); ++ SetKillButtonSens(False); + } + + void + PreExecPrep() + { +- SuspContTerminal(0); +- w_exit_up(False); ++ SuspContTerminal(0); ++ w_exit_up(False); + } + + void + PostExecPrep() + { +- SuspContTerminal(1); +- w_exit_up(True); ++ SuspContTerminal(1); ++ w_exit_up(True); + } + + /* +@@ -318,33 +309,34 @@ + */ + + char * +-expand_fname(fname, buffer) +- char *fname, +- *buffer; +-{ +- char *home, +- *buf, +- name[REG_BUF]; +- int i; +- +- str_stripspc_copy(name, fname); +- buf = buffer; +- +- for (i = 0; name[i]; i++) { +- if (name[i] == '~') { +- if ((home = (char *) getenv("HOME")) == NULL) +- return NULL; +- strcpy(buf, home); +- buf += strlen(home); ++expand_fname(fname, buffer, size) ++ char *fname, ++ *buffer; ++ int size; ++{ ++ char *home, ++ *buf, ++ name[REG_BUF]; ++ int i; ++ ++ str_stripspc_copy(name, fname); ++ buf = buffer; ++ ++ for (i = 0; (name[i] && (buffer+REG_BUF > buf)); i++) { ++ if (name[i] == '~') { ++ if ((home = (char *) getenv("HOME")) == NULL) ++ return NULL; ++ strncpy(buf, home, size); ++ buf += strlen(home); ++ } ++ else { ++ *buf = name[i]; ++ buf++; ++ } + } +- else { +- *buf = name[i]; +- buf++; +- } +- } +- *buf = '\0'; ++ *buf = '\0'; + +- return buffer; ++ return buffer; + } + + /* +@@ -353,11 +345,12 @@ + */ + + FILE* +-open_file(fname, directory) +- char *fname, +- *directory; ++open_file(fname, size, directory) ++ char *fname; ++ int size; ++ char *directory; + { +- return open_file_va(fname, directory, NULL); ++ return open_file_va(fname, size, directory, NULL); + } + + /* +@@ -365,120 +358,79 @@ + */ + + FILE* +-open_file_va(fname, dir1, dir2) +- char *fname, +- *dir1, +- *dir2; +-{ +- FILE *fp; +- char name[REG_BUF], +- fullname[REG_BUF], +- buffer[REG_BUF]; +- +- str_stripspc_copy(name, fname); +- +- if (dir1) { +- sprintf(fullname, "%s/%s", expand_fname(dir1, buffer), name); +- +- if ((fp = fopen(fullname, "r")) != NULL) { +- strcpy(fname, fullname); +- return fp; +- } +- +- if (dir2) { +- sprintf(fullname, "%s/%s", expand_fname(dir2, buffer), name); ++open_file_va(fname, size, dir1, dir2) ++ char *fname; ++ int size; ++ char *dir1, ++ *dir2; ++{ ++ FILE *fp; ++ char *fullname, ++ name[REG_BUF], ++ buffer[REG_BUF]; ++ ++ str_stripspc_copy(name, fname); ++ ++ if (dir1) { ++ fullname = FmtString("%s/%s", expand_fname(dir1, buffer, REG_BUF), name, ""); ++ if ((fp = fopen(fullname, "r")) != NULL) { ++ strncpy(fname, fullname, size); ++ return fp; ++ } + +- if ((fp = fopen(fullname, "r")) != NULL) { +- strcpy(fname, fullname); +- return fp; +- } ++ if (dir2) { ++ fullname = FmtString("%s/%s", expand_fname(dir2, buffer, REG_BUF), name, ""); ++ if ((fp = fopen(fullname, "r")) != NULL) { ++ strncpy(fname, fullname, size); ++ return fp; ++ } ++ } ++ } /* if (dir1)... */ ++ ++ if ((fp = fopen(name, "r")) != NULL) { ++ strncpy(fname, name, REG_BUF); ++ return fp; + } +- } /* if (dir1)... */ +- +- if ((fp = fopen(name, "r")) != NULL) { +- strcpy(fname, name); +- return fp; +- } + +- SeErrorF("/OFV/ Could not open the file `%s'", name, "", ""); +- if (dir1) { +- SeNoticeF("Tried the default directory `%s'", dir1, "", ""); +- if (dir2) +- SeNoticeF("Tried the default directory `%s'", dir2, "", ""); +- } +- SeNotice("Tried the current directory"); ++ SeErrorF("/OFV/ Could not open the file `%s'", name, "", ""); ++ if (dir1) { ++ SeNoticeF("Tried the default directory `%s'", dir1, "", ""); ++ if (dir2) ++ SeNoticeF("Tried the default directory `%s'", dir2, "", ""); ++ } ++ SeNotice("Tried the current directory"); + +- return NULL; ++ return NULL; + } + + /* +- * another implementation of the above using varargs, currently not used +- */ +- +-/*FILE *open_file_va(args) +- va_list args; +- va_decl +-{ +- FILE *fp; +- char *name, *dir, fullname[REG_BUF]; +- char buffer[REG_BUF]; +- +- va_start(args); +- name = va_arg(args, char *); +- +- if (fp = fopen(name, "r")) +- return fp; +- +- while(dir = va_arg(args, char *)) +- { +- sprintf(fullname, "%s/%s", expand_fname(SSpc(dir), buffer), name); +- +- if (fp = fopen(fullname, "r")) +- return fp; +- } +- +- va_end(args); +- +- if (dir = (char *) getenv("HOME")) { +- sprintf(fullname, "%s/%s", dir, name); +- +- if (fp = fopen(fullname, "r")) +- return fp; +- } +- +- showf("<< Seyon: file '%s' not in current, default, or home directory >>", +- name, "", ""); +- return NULL; +-}*/ +- +-/* + * read a file into a buffer + */ + + void + read_file(fp, line) +- FILE *fp; +- char *line[]; ++ FILE *fp; ++ char *line[]; + { +- char buffer[REG_BUF + 1]; +- int i; ++ char buffer[REG_BUF + 1]; ++ int i; + +- for (i = 0; i < MAX_ENT && fgets(buffer, REG_BUF, fp) != NULL; i++) +- line[i] = strcpy((char *)malloc(sizeof(buffer)), SSpc(buffer)); +- line[i] = NULL; ++ for (i = 0; i < MAX_ENT && fgets(buffer, REG_BUF, fp) != NULL; i++) ++ line[i] = strcpy((char *)malloc(sizeof(buffer)), SSpc(buffer)); ++ line[i] = NULL; + } + + /* +- * similar to the above, but closes the file after readsing it ++ * similar to the above, but closes the file after reading it + */ + + void + read_close_file(fp, line) +- FILE *fp; +- char *line[]; ++ FILE *fp; ++ char *line[]; + { +- read_file(fp, line); +- fclose(fp); ++ read_file(fp, line); ++ fclose(fp); + } + + /* +@@ -487,12 +439,12 @@ + + void + write_pipe_data(pd, data, size) +- int *pd; +- char *data; +- int size; ++ int *pd; ++ char *data; ++ int size; + { +- if (write(pd[1], data, size) < 0) +- show("<< Could not write to pipe >>"); ++ if (write(pd[1], data, size) < 0) ++ show("<< Could not write to pipe >>"); + } + + /* +@@ -501,11 +453,11 @@ + + void + read_pipe_data(pd, data, size) +- int *pd; +- char *data; +- int size; ++ int *pd; ++ char *data; ++ int size; + { +- read(pd[0], data, size); ++ read(pd[0], data, size); + } + + /* +@@ -515,30 +467,30 @@ + void + IdleGuard() + { +- struct stat statBuf; +- time_t idleTime; +- static time_t totalIdleTime; +- int timeToNextCall; +- +- if (qres.idleGuard && !inhibit_child) { +- if (fstat(tfd, &statBuf) < 0) { +- SePError("/IG/ Could not stat the tty"); +- return; +- } ++ struct stat statBuf; ++ time_t idleTime; ++ static time_t totalIdleTime; ++ int timeToNextCall; ++ ++ if (qres.idleGuard && !inhibit_child) { ++ if (fstat(tfd, &statBuf) < 0) { ++ SePError("/IG/ Could not stat the tty"); ++ return; ++ } ++ ++ if ((idleTime = time((time_t *) 0) - statBuf.st_mtime) >= ++ qres.idleGuardInterval * 0.99) { ++ MdmPutString(qres.idleGuardString); ++ timeToNextCall = qres.idleGuardInterval; ++ totalIdleTime += idleTime; ++ SeyonMessagef("Idle for %d minutes", (totalIdleTime + 30) / 60); ++ } ++ else { ++ timeToNextCall = qres.idleGuardInterval - (int)idleTime; ++ totalIdleTime = 0; ++ } + +- if ((idleTime = time((time_t *) 0) - statBuf.st_mtime) >= +- qres.idleGuardInterval * 0.99) { +- MdmPutString(qres.idleGuardString); +- timeToNextCall = qres.idleGuardInterval; +- totalIdleTime += idleTime; +- SeyonMessagef("Idle for %d minutes", (totalIdleTime + 30) / 60); +- } +- else { +- timeToNextCall = qres.idleGuardInterval - (int)idleTime; +- totalIdleTime = 0; +- } +- +- XtAppAddTimeOut(app_con, timeToNextCall * 1000, ++ XtAppAddTimeOut(app_con, timeToNextCall * 1000, + (XtTimerCallbackProc) IdleGuard, (XtPointer) app_con); +- } ++ } + } +--- seyon-2.20c.orig/Seyon.c ++++ seyon-2.20c/Seyon.c +@@ -72,314 +72,365 @@ + pid_t mainPid; + + int +-main(argc, argv) +- int argc; +- char *argv[]; ++main(int argc, char *argv[]) + { +- int OpenModem(); +- void DispatchActions(), +- GetParameters(), +- ShowOpenModemErrMsg(); +- +- char *arg[REG_BUF], termEmu[REG_BUF]; +- int sepIndex, i, n, retStatus; ++ int OpenModem(); ++ void DispatchActions(), ++ GetParameters(), ++ ShowOpenModemErrMsg(); ++ ++ char *arg[REG_BUF], ++ termEmu[REG_BUF]; ++ int sepIndex, ++ i, ++ n, ++ length, ++ retStatus; + #ifdef HAVE_FAS +- char large_string[1024]; ++ char large_string[LRG_BUF]; + #endif + +- XtAppContext appContext; +- char modemList[LRG_BUF], +- *curModem, +- *startupAction = modemList; ++ int length_remaining; ++ XtAppContext appContext; ++ char modemList[LRG_BUF], ++ *curModem, ++ *startupAction = modemList; + +- static char *fallbackResources[] = { ++ static char *fallbackResources[] = { + #include "Seyon.ad.h" +- NULL, +- }; ++ NULL, ++ }; + +- static XrmOptionDescRec optionList[] = { +- {"-modems", "modems", XrmoptionSepArg, NULL}, +- {"-script", "script", XrmoptionSepArg, NULL}, +- {"-entries", "defaultPhoneEntries", XrmoptionSepArg, NULL}, +- {"-dial", "dialAutoStart", XrmoptionNoArg, "True"}, +- {"-nodial", "dialAutoStart", XrmoptionNoArg, "False"}, +- {"-emulator", "emulator", XrmoptionSepArg, ""}, +- {"-noemulator", "noemulator", XrmoptionNoArg, ""}, +- {"-nodefargs", "nodefargs", XrmoptionNoArg, ""}, +- }; ++ static XrmOptionDescRec optionList[] = { ++ {"-modems", "modems", XrmoptionSepArg, NULL}, ++ {"-script", "script", XrmoptionSepArg, NULL}, ++ {"-entries", "defaultPhoneEntries", XrmoptionSepArg, NULL}, ++ {"-dial", "dialAutoStart", XrmoptionNoArg, "True"}, ++ {"-nodial", "dialAutoStart", XrmoptionNoArg, "False"}, ++ {"-emulator", "emulator", XrmoptionSepArg, ""}, ++ {"-noemulator", "noemulator", XrmoptionNoArg, ""}, ++ {"-nodefargs", "nodefargs", XrmoptionNoArg, ""}, ++ }; + +- for (i = 1; i < argc && strcmp(argv[i], "--"); i++); +- sepIndex = i; ++ for (i = 1; i < argc && strcmp(argv[i], "--"); i++); ++ sepIndex = i; + +- /* Find if the -noemulator switch is given */ +- for (i = 1; i < sepIndex && ++ /* Find if the -noemulator switch is given */ ++ for (i = 1; i < sepIndex && + strncmp(argv[i], "-noemulator", max(4, strlen(argv[i]))); i++); + +- /* If no, launch Seyon via the emulator */ +- if (i >= sepIndex) { ++ /* If no, launch Seyon via the emulator */ ++ if (i >= sepIndex) { + +- for (i = 1; i < sepIndex && +- strncmp(argv[i], "-emulator", max(3, strlen(argv[i]))); i++); +- if (i < sepIndex - 1) +- strcpy(termEmu, argv[i+1]); +- else +- strcpy(termEmu, SEYON_EMU_NAME); +- +- /* Find if the -nodefargs switch is given */ +- for (i = 1; i < sepIndex && +- strncmp(argv[i], "-nodefargs", max(5, strlen(argv[i]))); i++); ++ for (i = 1; i < sepIndex && ++ strncmp(argv[i], "-emulator", max(3, strlen(argv[i]))); i++); ++ if (i < sepIndex - 1) ++ strncpy(termEmu, argv[i+1], REG_BUF); ++ else ++ strncpy(termEmu, SEYON_EMU_NAME, REG_BUF); ++ ++ /* Find if the -nodefargs switch is given */ ++ for (i = 1; i < sepIndex && ++ strncmp(argv[i], "-nodefargs", max(5, strlen(argv[i]))); i++); + +- n = 1; ++ n = 1; + +- /* If no, use the default emulator arguments */ +- if (i >= sepIndex) { ++ /* If no, use the default emulator arguments */ ++ if (i >= sepIndex) { + arg[n] = "-name"; n++; + arg[n] = "Seyon"; n++; + arg[n] = "-T"; n++; + arg[n] = "Seyon Terminal Emulator"; n++; + arg[n] = "-n"; n++; + arg[n] = "Terminal"; n++; +- } ++ } + +- /* Pass all switches aftetr '--' to the emulator */ +- for (i = sepIndex + 1; i < argc; i++, n++) ++ /* Pass all switches aftetr '--' to the emulator */ ++ for (i = sepIndex + 1; i < argc; i++, n++) + arg[n] = argv[i]; + +- arg[n] = "-e"; n++; ++ arg[n] = "-e"; n++; + + #ifndef HAVE_FAS +- arg[n] = argv[0]; n++; +- arg[n] = "-noemulator"; n++; ++ arg[n] = argv[0]; n++; ++ arg[n] = "-noemulator"; n++; + +- /* Pass all switches before '--' to Seyon */ +- for (i = 1; i < sepIndex; i++, n++) ++ /* Pass all switches before '--' to Seyon */ ++ for (i = 1; i < sepIndex; i++, n++) + arg[n] = argv[i]; + #else +- arg[n] = "/bin/sh"; n++; +- arg[n] = "-c"; n++; +- arg[n] = large_string; +- strcpy(arg[n], argv[0]); +- strcat(arg[n], " -noemulator"); +- for (i = 1; i < sepIndex; i++) { +- strcat(arg[n]," "); +- strcat(arg[n],argv[i]); +- } +- n++; ++ arg[n] = "/bin/sh"; n++; ++ arg[n] = "-c"; n++; ++ arg[n] = large_string; ++ length_remaining = LRG_BUF; ++ strncpy(arg[n], argv[0], LRG_BUF); ++ length_remaining -= strlen(argv[0]); ++ length = strlen(" -noemulator"); ++ if(length_remaining > length) ++ { ++ strncat(arg[n], " -noemulator", length_remaining); ++ length_remaining -= length; ++ } ++ else ++ { ++ printf("String overflow in parsing options\n"); ++ exit (1); ++ } ++ for (i = 1; i < sepIndex; i++) { ++ length = strlen(argv[i]) + 1; ++ if(length_remaining > length) ++ { ++ strncat(arg[n]," ", 1); ++ strncat(arg[n],argv[i], length_remaining); ++ } ++ else ++ { ++ printf("String overflow in parsing options\n"); ++ exit (1); ++ } ++ } ++ n++; + #endif + +- arg[n] = NULL; n++; ++ arg[n] = NULL; n++; + +- arg[0] = termEmu; +- execvp(arg[0], arg); ++ arg[0] = termEmu; ++ execvp(arg[0], arg); + +- fprintf(stderr, "%s `%s.\n%s\n", ">> Warning: Could not execute", +- termEmu, ">> Notice: Falling to `xterm'."); ++ fprintf(stderr, "%s `%s.\n%s\n", ">> Warning: Could not execute", ++ termEmu, ">> Notice: Falling to `xterm'."); + +- arg[0] = "xterm"; +- execvp(arg[0], arg); ++ arg[0] = "xterm"; ++ execvp(arg[0], arg); + +- fprintf(stderr, "%s\n%s\n", ">> Error: Could not execute `xterm'.", +- ">> Notice: Giving up."); +- exit(1); +- } /* if (i >= sepIndex)... */ +- +- /* ---------------------------------------------------------------------- */ +- /* ---------------------------------------------------------------------- */ +- +- /* The real program begins here */ +- +- topLevel = XtAppInitialize(&appContext, "Seyon", optionList, +- XtNumber(optionList), &argc, argv, +- fallbackResources, NULL, 0); +- app_con = appContext; +- GetResources(topLevel); +- +- mainPid = getpid(); +- setup_signal_handlers(); +- SetIcon(topLevel); +- +- printf("\r\n%s %s\r\n", "Seyon Copyright (c) 1992-1993 Muhammad M. Saggaf.", +- "All rights reserved."); +- printf("\rVersion %s rev. %s %s-%s %s@%s %s %s.\r\n\n", VERSION, REVISION, +- COMPILE_HOSTTYPE, COMPILE_OSNAME, COMPILE_BY, COMPILE_HOST, +- COMPILE_DATE, COMPILE_TIME); +- +- if ((tfp = fopen("/dev/tty", "r+")) == NULL) { +- PopupInitError("errTtyAccess", exit); +- goto MainLoop; +- } ++ fprintf(stderr, "%s\n%s\n", ">> Error: Could not execute `xterm'.", ++ ">> Notice: Giving up."); ++ exit(1); ++ } /* if (i >= sepIndex)... */ ++ ++ /* ------------------------------------------------------------------ */ ++ /* ------------------------------------------------------------------ */ ++ ++ /* The real program begins here */ ++ ++ topLevel = XtAppInitialize(&appContext, "Seyon", optionList, ++ XtNumber(optionList), &argc, argv, ++ fallbackResources, NULL, 0); ++ app_con = appContext; ++ GetResources(topLevel); ++ ++ mainPid = getpid(); ++ setup_signal_handlers(); ++ SetIcon(topLevel); ++ ++ printf("\r\n%s %s\r\n", "Seyon Copyright (c) 1992-1993 Muhammad M. Saggaf.", ++ "All rights reserved."); ++ printf("\rVersion %s rev. %s %s-%s %s@%s %s %s.\r\n\n", VERSION, REVISION, ++ COMPILE_HOSTTYPE, COMPILE_OSNAME, COMPILE_BY, COMPILE_HOST, ++ COMPILE_DATE, COMPILE_TIME); ++ ++ if ((tfp = fopen("/dev/tty", "r+")) == NULL) { ++ PopupInitError("errTtyAccess", exit); ++ goto MainLoop; ++ } + +- tfd = fileno(tfp); ++ tfd = fileno(tfp); + +- io_get_attr(tfd, &oldmode); /* get current console tty mode */ +- newmode = oldmode; /* copy (structure) to newmode */ ++ io_get_attr(tfd, &oldmode); /* get current console tty mode */ ++ newmode = oldmode; /* copy (structure) to newmode */ + + #if HAVE_TERMIOS || HAVE_TERMIO +- newmode.c_oflag &= ~OPOST; +- newmode.c_iflag |= (IGNBRK | IGNPAR); +- newmode.c_iflag &= ~(IXON | IXOFF | ISTRIP | BRKINT); +- newmode.c_lflag &= ~(ICANON | ISIG | ECHO); +- newmode.c_cflag |= CREAD; +- newmode.c_cc[VMIN] = 1; +- newmode.c_cc[VTIME] = 1; ++ newmode.c_oflag &= ~OPOST; ++ newmode.c_iflag |= (IGNBRK | IGNPAR); ++ newmode.c_iflag &= ~(IXON | IXOFF | ISTRIP | BRKINT); ++ newmode.c_lflag &= ~(ICANON | ISIG | ECHO); ++ newmode.c_cflag |= CREAD; ++ newmode.c_cc[VMIN] = 1; ++ newmode.c_cc[VTIME] = 1; + #else + #if HAVE_SGTTYB +- newmode.sg_flags = CBREAK; ++ newmode.sg_flags = CBREAK; + #endif + #endif + +- set_tty_mode(); ++ set_tty_mode(); + +- InitVariables(topLevel); ++ InitVariables(topLevel); + +- if (argc > 1 && strcmp(argv[1], "--")) { +- SeErrorF("Unknown or incomplete command-line switch: `%s'", argv[1], +- "", ""); +- PopupInitError("errSwitches", do_exit); +- goto MainLoop; +- } ++ if (argc > 1 && strcmp(argv[1], "--")) { ++ SeErrorF("Unknown or incomplete command-line switch: `%s'", argv[1], ++ "", ""); ++ PopupInitError("errSwitches", do_exit); ++ goto MainLoop; ++ } + +- /* ---------------------------------------------------------------------- */ ++ /* ------------------------------------------------------------------- */ + +- /* Open modem port and configure it */ ++ /* Open modem port and configure it */ + +- strcpy(modemList, qres.modems); +- curModem = GetFirstWord(modemList); ++ strncpy(modemList, qres.modems, LRG_BUF); ++ curModem = GetFirstWord(modemList); + +- show("Locating Modems..."); ++ show("Locating Modems..."); + +- do { +- if ((retStatus = OpenModem(curModem)) >= 0) break; ++ do { ++ if ((retStatus = OpenModem(curModem)) >= 0) break; + +- ShowOpenModemErrMsg(curModem, retStatus); +- if (retStatus != ERR_MDM_NOMODEM) ++ ShowOpenModemErrMsg(curModem, retStatus); ++ if (retStatus != ERR_MDM_NOMODEM) + show(FmtString("Modem `%s' is Unavailable.\n", curModem, "", "")); +- curModem = GetNextWord(); +- } while (curModem[0] != '\0'); +- +- if (retStatus < 0) { +- SeError("No Modems Available"); +- PopupInitError("errModemInit", do_exit); +- goto MainLoop; +- } +- +- show(FmtString("Modem `%s' is Available.\n", curModem, "", "")); +- +- /* ---------------------------------------------------------------------- */ +- +- CreateCommandCenter(); +- +- /* ---------------------------------------------------------------------- */ ++ curModem = GetNextWord(); ++ } while (curModem[0] != '\0'); + +- pipe(child_pipe); +- pipe(scriptToMainPipe); +- pipe(mainToTermPipe); +- XtAppAddInput(appContext, child_pipe[0], (XtPointer)XtInputReadMask, +- ExecProcRequest, NULL); +- XtAppAddInput(appContext, scriptToMainPipe[0], (XtPointer)XtInputReadMask, +- GetParameters, NULL); ++ if (retStatus < 0) { ++ SeError("No Modems Available"); ++ PopupInitError("errModemInit", do_exit); ++ goto MainLoop; ++ } ++ ++ show(FmtString("Modem `%s' is Available.\n", curModem, "", "")); ++ ++ /* ------------------------------------------------------------------- */ ++ ++ CreateCommandCenter(); ++ ++ /* ------------------------------------------------------------------- */ ++ ++ pipe(child_pipe); ++ pipe(scriptToMainPipe); ++ pipe(mainToTermPipe); ++ XtAppAddInput(appContext, child_pipe[0], (XtPointer)XtInputReadMask, ++ ExecProcRequest, NULL); ++ XtAppAddInput(appContext, scriptToMainPipe[0], (XtPointer)XtInputReadMask, ++ GetParameters, NULL); ++ ++ IdleGuard(); ++ if (qres.showFunMessages) ++ XtAppAddTimeOut(appContext, qres.funMessagesInterval*1000, ++ FunMessage, NULL); ++ ++ /* ------------------------------------------------------------------- */ ++ ++ length_remaining = LRG_BUF; ++ strncpy(startupAction, qres.startupAction, LRG_BUF); ++ length_remaining -= strlen(startupAction); ++ if (qres.script) ++ { ++ length = strlen(" RunScript();") + strlen(qres.script); ++ if (length_remaining > length) ++ { ++ sprintf(startupAction + strlen(startupAction), ++ " RunScript(%s);", qres.script); ++ length_remaining -= length; ++ } ++ else ++ { ++ printf("String overflow in parsing options\n"); ++ exit (1); ++ } ++ } ++ if (qres.dialAutoStart) ++ { ++ length = strlen(" DialEntries(Default);"); ++ if(length_remaining > length) ++ { ++ strncat(startupAction, " DialEntries(Default);", length); ++ length -= length; ++ } ++ else ++ { ++ printf("String overflow in parsing options\n"); ++ exit (1); ++ } ++ } ++ ++ /* ------------------------------------------------------------------- */ + +- IdleGuard(); +- if (qres.showFunMessages) XtAppAddTimeOut(appContext, +- qres.funMessagesInterval*1000, FunMessage, NULL); ++ linkflag = 2; ++ ProcRequest(DISPATCH_ACTION, "", startupAction); + +- /* ---------------------------------------------------------------------- */ ++ /* ------------------------------------------------------------------- */ + +- strcpy(startupAction, qres.startupAction); +- if (qres.script) sprintf(startupAction + strlen(startupAction), +- " RunScript(%s);", qres.script); +- if (qres.dialAutoStart) strcat(startupAction, " DialEntries(Default);"); +- +- /* ---------------------------------------------------------------------- */ +- +- linkflag = 2; +- ProcRequest(DISPATCH_ACTION, "", startupAction); +- +- /* ---------------------------------------------------------------------- */ +- +- XtSetMappedWhenManaged(topLevel, True); +- XtMapWidget(topLevel); /* I don't know why I need this, but I do */ ++ XtSetMappedWhenManaged(topLevel, True); ++ XtMapWidget(topLevel); /* I don't know why I need this, but I do */ + + MainLoop: +- XtAppMainLoop(app_con); +- return 0; ++ XtAppMainLoop(app_con); ++ return 0; + } + + void +-setup_signal_handlers() ++setup_signal_handlers(void) + { +- signal(SIGINT, SIG_IGN); +- signal(SIGQUIT, SIG_IGN); ++ signal(SIGINT, SIG_IGN); ++ signal(SIGQUIT, SIG_IGN); + + #ifdef SIGBUS +- signal(SIGBUS, die); ++ signal(SIGBUS, die); + #endif +- signal(SIGFPE, die); +- signal(SIGILL, die); +- signal(SIGIOT, die); +- signal(SIGSEGV, die); +- signal(SIGTERM, die); +- signal(SIGTRAP, die); ++ signal(SIGFPE, die); ++ signal(SIGILL, die); ++ signal(SIGIOT, die); ++ signal(SIGSEGV, die); ++ signal(SIGTERM, die); ++ signal(SIGTRAP, die); + } + + void +-die(sig) +- int sig; ++die(int sig) + { +- void KillChildProc(); +- signal(sig, SIG_IGN); ++ void KillChildProc(); ++ signal(sig, SIG_IGN); + +- SeErrorF("Killed by signal %d", sig, "", ""); +- SeNoticeF("Debugging info: pid=%d.", getpid(), "", ""); ++ SeErrorF("Killed by signal %d", sig, "", ""); ++ SeNoticeF("Debugging info: pid=%d.", getpid(), "", ""); + +- if (getpid() == mainPid) { +- KillTerminal(); +- KillChildProc(); ++ if (getpid() == mainPid) { ++ KillTerminal(); ++ KillChildProc(); + +- SeNotice("Press any key to exit"); +- getchar(); +- cleanup_exit(1); +- } +- else { +- write_child_info(child_pipe, KILL_TERM, "Terminal Proc Exited"); +- exit(1); +- } ++ SeNotice("Press any key to exit"); ++ getchar(); ++ cleanup_exit(1); ++ } ++ else { ++ write_child_info(child_pipe, KILL_TERM, "Terminal Proc Exited"); ++ exit(1); ++ } + } + + void +-do_exit(rc) +- int rc; ++do_exit(int rc) + { +- void KillChildProc(); ++ void KillChildProc(); + +- XtUnmapWidget(topLevel); +- KillTerminal(); +- KillChildProc(); ++ XtUnmapWidget(topLevel); ++ KillTerminal(); ++ KillChildProc(); + +- unlock_tty(); ++ unlock_tty(); + +- fflush(tfp); +- restore_orig_mode(); +- fclose(tfp); ++ fflush(tfp); ++ restore_orig_mode(); ++ fclose(tfp); + +- CloseModem(); ++ CloseModem(); + +- XtDestroyApplicationContext(XtWidgetToApplicationContext(topLevel)); ++ XtDestroyApplicationContext(XtWidgetToApplicationContext(topLevel)); + /* XCloseDisplay(XtDisplay(topLevel));*/ +- exit(rc); ++ exit(rc); + } + + void +-cleanup_exit(status) +- int status; ++cleanup_exit(int status) + { +- SeNotice("cleaning up.."); +- do_exit(status); ++ SeNotice("cleaning up.."); ++ do_exit(status); + } + + void + s_exit() + { +- show("I'm rated PG-34!!"); +- do_exit(0); ++ show("I'm rated PG-34!!"); ++ do_exit(0); + } +--- seyon-2.20c.orig/SeTrans.c ++++ seyon-2.20c/SeTrans.c +@@ -51,7 +51,7 @@ + ErrorIfBusy(); + + if (disItems[0] == NULL) { +- strcpy(protocolsFile, qres.protocolsFile); ++ strncpy(protocolsFile, qres.protocolsFile, REG_BUF); + if (ReadParseProtFile(protocolsFile, disItems) < 0) + return; + } +@@ -81,39 +81,47 @@ + + void + DoTransfer(widget, clientData, callData) +- Widget widget; +- XtPointer clientData, +- callData; +-{ +- XfwfMultiListReturnStruct *item; +- Widget popup; +- String* actionData = (String*)clientData; +- char fullCommand[LRG_BUF]; +- +- if (clientData) +- {if ((transCurItemIndex = atoi(actionData[0]) - 1) < 0 || +- transCurItemIndex > MAX_ENT - 1) +- SimpleError("Invalid Entry Number");} +- else { +- if ((item = XfwfMultiListGetHighlighted(mlw))->num_selected == 0) ++ Widget widget; ++ XtPointer clientData, ++ callData; ++{ ++ XfwfMultiListReturnStruct *item; ++ Widget popup; ++ String* actionData = (String*)clientData; ++ char fullCommand[LRG_BUF]; ++ int length_remaining; ++ ++ if (clientData) ++ {if ((transCurItemIndex = atoi(actionData[0]) - 1) < 0 || ++ transCurItemIndex > MAX_ENT - 1) ++ SimpleError("Invalid Entry Number");} ++ else { ++ if ((item = XfwfMultiListGetHighlighted(mlw))->num_selected == 0) + SimpleError("No Item Selected"); +- transCurItemIndex = item->selected_items[0]; +- } ++ transCurItemIndex = item->selected_items[0]; ++ } + +- strcpy(fullCommand, protItems[transCurItemIndex]->command); ++ strncpy(fullCommand, protItems[transCurItemIndex]->command, LRG_BUF); + +- if (protItems[transCurItemIndex]->reqName) +- if (actionData == NULL || actionData[1] == NULL) { ++ if (protItems[transCurItemIndex]->reqName) ++ { ++ if (actionData == NULL || actionData[1] == NULL) ++ { + popup = GetShell(PopupDialogGetValue("upload", widget, exec_upload, +- NULL, lastUploadFile)); ++ NULL, lastUploadFile)); + PopupCentered(popup, (clientData) ? XtParent(GetShell(widget)) : widget); + return; +- } +- else +- strcat(strcat(fullCommand, " "), actionData[1]); +- +- DestroyShell(widget); +- ShellCommand(fullCommand); ++ } ++ else ++ { ++ length_remaining = LRG_BUF - strlen(fullCommand); ++ strncat(fullCommand, " ", length_remaining); ++ length_remaining -= 1; ++ strncat(fullCommand, actionData[1], length_remaining); ++ } ++ } ++ DestroyShell(widget); ++ ShellCommand(fullCommand); + } + + void +@@ -133,11 +141,11 @@ + Widget widget; + { + Widget dialog = XtParent(widget); +- static char cmd[REG_BUF]; ++ static char *cmd; + +- strcpy(lastUploadFile, XawDialogGetValueString(dialog)); +- sprintf(cmd, "%s %s", protItems[transCurItemIndex]->command, +- lastUploadFile); ++ strncpy(lastUploadFile, XawDialogGetValueString(dialog), REG_BUF); ++ cmd = FmtString("%s %s", protItems[transCurItemIndex]->command, ++ lastUploadFile, ""); + + DestroyShell(XtParent(GetShell(widget))); + ShellCommand(cmd); +--- seyon-2.20c.orig/Seyon-co.ad ++++ seyon-2.20c/Seyon-co.ad +@@ -13,26 +13,30 @@ + *foreground: black + *borderColor: white + ++*background: blue ++*foreground: black ++*borderColor: lightBlue ++ + *Command.background: lightBlue +-*Scrollbar.background: darkSeaGreen +-*Toggle.background: darkOliveGreen +-*Toggle.foreground: darkTurquoise +-*List.background: grey +-*XfwfMultiList.background: grey +-*Text*background: grey +-*Text*Scrollbar.background: darkSeaGreen ++*Scrollbar.background: cyan ++*Toggle.background: cyan ++*Toggle.foreground: black ++*List.background: tan ++*XfwfMultiList.background: tan ++*Text*background: tan ++*Text*Scrollbar.background: cyan + + *ok.background: green +-*cancel.background: tomato ++*cancel.background: red + *dismiss.background: orange +-*hangup.background: orange +-*exit.background: tomato +-*kill.background: tomato ++*hangup.background: red ++*exit.background: red ++*kill.background: red + +-*about*msg.background: grey +-*about*pic.background: grey ++*about*msg.background: tan ++*about*pic.background: tan + +-*messageBox.message.background: grey ++*messageBox.message.background: tan + +-*quickKeyBox.Command.background: darkOliveGreen +-*quickKeyBox.Command.foreground: darkTurquoise ++*quickKeyBox.Command.background: orange ++*quickKeyBox.Command.foreground: black +--- seyon-2.20c.orig/config.h ++++ seyon-2.20c/config.h +@@ -302,7 +302,7 @@ + * HDB uucp does) rather than in binary form as other uucp prgrams do + */ + #ifndef LF_USE_ASCII_PID +-#define LF_USE_ASCII_PID NO ++#define LF_USE_ASCII_PID YES + #endif + + /* +@@ -319,7 +319,7 @@ + */ + + #ifndef LF_PATH +-#define LF_PATH "/usr/spool/uucp" ++#define LF_PATH "/var/lock" + #endif + + /* +--- seyon-2.20c.orig/Imakefile ++++ seyon-2.20c/Imakefile +@@ -48,14 +48,16 @@ + InstallNonExecFile(seyon.help,$(LIBDIR)) + + install:: ++/* + @if [ ! -d $(HOME)/.seyon ]; then mkdir $(HOME)/.seyon; fi; \ + echo "=== Copying example files (no overwrite) to $(HOME)/.seyon ..."; \ + for i in phonelist protocols startup script.*; do \ + if [ ! -f $(HOME)/.seyon/$$i ]; then cp $$i $(HOME)/.seyon; fi;\ + done; ++*/ + + clean:: +- rm -f version.h y.tab.* SeParse.c ++ rm -f version.h y.tab.* SeParse.c Seyon.ad.h + + Seyon.c: Seyon.ad.h version.h + +@@ -66,7 +68,7 @@ + rm -f version.h + + version.h: +- ./makever.sh ++ sh ./makever.sh + + SeScan.o: y.tab.h + +--- seyon-2.20c.orig/makever.sh ++++ seyon-2.20c/makever.sh +@@ -48,9 +48,9 @@ + echo "#define VERSION \"$VERSION\"" >> version.h + echo "#define REVISION \"$REVISION\"" >> version.h + +-echo "#ifdef IS_MAIN" >> version.h +-echo "static char version[] = \"\$Revision: $VERSION.$REVISION \$\";"\ +- >> version.h +-echo "#endif" >> version.h ++#echo "#ifdef IS_MAIN" >> version.h ++#echo "static char version[] = \"\$Revision: $VERSION.$REVISION \$\";"\ ++# >> version.h ++#echo "#endif" >> version.h + + echo "Machine type is $machine, OS name is $system" +--- seyon-2.20c.orig/SeScan.c ++++ seyon-2.20c/SeScan.c +@@ -95,8 +95,8 @@ + SC_OUTSIDE, + }; + +-static ScanState = SC_OUTSIDE; +-static ScanDelim = 0; /* Current string delimiter */ ++static int ScanState = SC_OUTSIDE; ++static int ScanDelim = 0; /* Current string delimiter */ + + void NEW_STATE(st) + int st; +@@ -290,8 +290,8 @@ + #ifdef TEST + main() + { +- scSetInputBuf("Just to see if we'\\'re \\n\\033 able to distinguish' words and strings +-\"Also 'quotes' inside strings\" and 'strs \"inside quotes\"' ++ scSetInputBuf("Just to see if we'\\'re \\n\\033 able to distinguish' words and strings\n\ ++\"Also 'quotes' inside strings\" and 'strs \"inside quotes\"'\n\ + Not to forget ^S and ^q control ^ chars"); + + while (lGetWord() != 0); +--- seyon-2.20c.orig/SeSubsX.c ++++ seyon-2.20c/SeSubsX.c +@@ -70,7 +70,8 @@ + + if (onlineTime != oldOnlineTime) { + oldOnlineTime = onlineTime; +- sprintf(buf, "%02d:%02d", onlineTime / 60, onlineTime % 60); ++ /* Buffer is easily big enough */ ++ sprintf(buf, "%02ld:%02ld", onlineTime / 60, onlineTime % 60); + SeSetLabel(statusWidget[0], buf); + } + +@@ -91,6 +92,7 @@ + msg = qres.funMessages[msg_index++]; + if (msg == NULL) { + msg_index = 0; ++ /* Buffer is easily big enough */ + sprintf(vermsg, "Welcome to Seyon version %s.%s", VERSION, REVISION); + msg = vermsg; + } +@@ -171,7 +173,8 @@ + + procRequest.action = action; + +- if (msg) strcpy(procRequest.msg, msg); ++ if (msg) ++ strncpy(procRequest.msg, msg, 80); + else *procRequest.msg = '\0'; + + write_pipe_data(pd, &procRequest, sizeof(procRequest)); +@@ -186,8 +189,8 @@ + struct _procRequest procRequest; + + procRequest.action = action; +- strcpy(procRequest.msg, msg); +- strcpy(procRequest.arg, arg); ++ strncpy(procRequest.msg, msg, 80); ++ strncpy(procRequest.arg, arg, 90); + + write_pipe_data(child_pipe, &procRequest, sizeof(procRequest)); + } +@@ -201,10 +204,7 @@ + *b, + *c; + { +- char buffer[SM_BUF]; +- +- sprintf(buffer, fmt, a, b, c); +- write_child_info(pd, action, buffer); ++ write_child_info(pd, action, FmtString(fmt,a,b,c)); + } + + void +@@ -222,10 +222,7 @@ + b, + c; + { +- char buf[REG_BUF]; +- +- sprintf(buf, fmt, a, b, c); +- SeyonMessage(buf); ++ SeyonMessage(FmtString(fmt,a,b,c)); + } + + Boolean +--- seyon-2.20c.orig/SeActions.c ++++ seyon-2.20c/SeActions.c +@@ -28,6 +28,7 @@ + /* SeDecl.h includes stdio.h */ + #include "SeDecl.h" + #include "version.h" ++#include "config.h" + + #define CheckNumParam(num) {if (*numParam != num) \ + SimpleError("Wrong Number of Parameters");} +@@ -234,7 +235,7 @@ + Cardinal* numParam; + { + int IconifyShell(); +- Widget dirWidget; ++/* Widget dirWidget; */ + static String termWindowId = NULL; + int i; + +@@ -312,10 +313,18 @@ + Cardinal* numParam; + { + void s_set(); ++ int length; ++ int length_remaining; + + ErrorIfBusy(); + CheckNumParam(2); +- sprintf((lptr = line), "%s %s", param[0], param[1]); ++ ++ length_remaining = WBSIZE; ++ length = 1 + strlen(param[0]) + strlen(param[1]); ++ if(length_remaining > length) ++ sprintf((lptr = line), "%s %s", param[0], param[1]); ++ else ++ printf("SetAction: string buffer would have overrun: %s %s\n",param[0], param[1]); + eof_flag = 0; + s_set(); + } +@@ -372,7 +381,7 @@ + prevActionAsync = False, + startup = True; + static Widget actionWidget; +- static String actionStack; ++ static String actionStack = ""; + + void (*actionProc)(); + static char actionName[SM_BUF], +@@ -387,6 +396,9 @@ + Boolean async; + }; + ++ /* A string containing a script of actions to perform at startup. */ ++ String startScript; ++ + static struct _actionTable actionTable[] = { + {"Beep", BeepAction, False}, + {"CloseWindow", CloseWindowAction, False}, +@@ -413,12 +425,12 @@ + switch (intData) { + + case ACTION_NEW_ACTION: +- strcpy(actionName, stringData); ++ strncpy(actionName, stringData, sizeof(actionName)); + numArgs = 0; + return; + + case ACTION_NEW_ARG: +- strcpy((argsArray[numArgs] = args[numArgs]), stringData); ++ strncpy((argsArray[numArgs] = args[numArgs]), stringData, SM_BUF); + numArgs++; + return; + +@@ -461,10 +473,12 @@ + XtFree(actionStack); + + if (startup) { +- startup = False; +- ParseThis(FmtString("Message(\"Welcome to Seyon version %s.%s\"); %s", +- VERSION, REVISION, "RestartTerminal();"), +- DispatchActions); ++ startup = False; ++ startScript ++ = XtNewString( FmtString("Message(\"Welcome to Seyon version %s.%s\"); %s", ++ VERSION, REVISION, "RestartTerminal();")); ++ ParseThis(startScript, DispatchActions); ++ XtFree(startScript); + } + + return; +--- seyon-2.20c.orig/SeScript.c ++++ seyon-2.20c/SeScript.c +@@ -100,8 +100,8 @@ + if (qres.scriptDirectory) scriptDir = qres.scriptDirectory; + else scriptDir = qres.defaultDirectory; + +- strcpy(buf, scriptFileName); +- if ((scriptFP = open_file(buf, scriptDir)) == NULL) ++ strncpy(buf, scriptFileName, REG_BUF); ++ if ((scriptFP = open_file(buf, REG_BUF, scriptDir)) == NULL) + return False; + + exec_close_script(scriptFP); +@@ -110,31 +110,33 @@ + + void + exec_close_script(script_fp) +- FILE *script_fp; ++ FILE *script_fp; + { +- if_flag = 0; +- echo_flag = False; +- captflag = False; +- tty_flag = True; +- eof_flag = 0; ++ if_flag = 0; ++ echo_flag = False; ++ captflag = False; ++ tty_flag = True; ++ eof_flag = 0; + +- if (linkflag == 2) +- linkflag = 0; ++ if (linkflag == 2) ++ linkflag = 0; + +- while (!eof_flag) +- get_line(script_fp); ++ while (!eof_flag) ++ get_line(script_fp); + +- fclose(script_fp); +- if (captflag) +- fclose(cf); ++ fclose(script_fp); ++ if (captflag) ++ fclose(cf); + +- eof_flag = 0; +- lptr = strcpy(line, ""); +- k_when(); ++ eof_flag = 0; ++ /* No buffer length problem here! */ ++ /* But why do this??? */ ++ lptr = strcpy(line, ""); ++ k_when(); + +- linkflag = 0; ++ linkflag = 0; + +- return; ++ return; + } + + static char wf[MAX_LINE]; +@@ -202,7 +204,7 @@ + + + GETTEST_ARG("waitfor"); +- strcpy(wf, word); ++ strncpy(wf, word, MAX_LINE); + + GET_ARG(); + +@@ -331,7 +333,7 @@ + return; + } + +- strcpy(label, word); ++ strncpy(label, word, WBSIZE); + + rewind(script_fp); + while (!found) { +@@ -360,7 +362,7 @@ + if_flag = 0; /* reset IF flag */ + } + +-static if_negate = 0; ++static int if_negate = 0; + + static int + if_test(cond) +--- seyon-2.20c.orig/SeWin.c ++++ seyon-2.20c/SeWin.c +@@ -377,7 +377,7 @@ + { + Widget dialog = XtParent(valueWidget); + +- strcpy(getValueDefValue, XawDialogGetValueString(dialog)); ++ strncpy(getValueDefValue, XawDialogGetValueString(dialog), REG_BUF); + DestroyShell(dialog); + + (*getValueExecProc)(XtParent(GetShell(valueWidget)), getValueDefValue); +@@ -745,10 +745,7 @@ + b, + c; + { +- char buf[REG_BUF]; +- +- sprintf(buf, fmt, a, b, c); +- SePopupMsg(parent, buf); ++ SePopupMsg(parent, FmtString(fmt,a,b,c)); + } + + Widget +@@ -773,20 +770,16 @@ + } + + void +-SePopupNoticeF(parent, title, call_back, fmt, a, b, c, d) ++SePopupNoticeF(parent, title, call_back, fmt, a, b, c) + Widget parent; + String title; + void (*call_back) (); + String fmt, + a, + b, +- c, +- d; ++ c; + { +- char buf[REG_BUF]; +- +- sprintf(buf, fmt, a, b, c); +- SePopupNotice(parent, title, call_back, buf); ++ SePopupNotice(parent, title, call_back, FmtString(fmt,a,b,c)); + } + + /* +@@ -918,10 +911,7 @@ + b, + c; + { +- char buffer[REG_BUF]; +- +- sprintf(buffer, fmt, a, b, c); +- SetStatusMessage(buffer); ++ SetStatusMessage(FmtString(fmt,a,b,c)); + } + + /*---------------------------------------------------------------------------+ +--- seyon-2.20c.orig/SeString.c ++++ seyon-2.20c/SeString.c +@@ -22,12 +22,13 @@ + + char + itoa(num) +- int num; ++ int num; + { +- char buf[TIN_BUF]; ++ char buf[TIN_BUF]; + +- sprintf(buf, "%d", num); +- return buf[0]; ++ /* Buffer is safely big enough */ ++ sprintf(buf, "%d", num); ++ return buf[0]; + } + + /* +@@ -100,8 +101,15 @@ + char buffer[REG_BUF], + *bufptr; + +- strcpy(buffer, source); ++ strncpy(buffer, source, REG_BUF); ++ ++ /* Null-terminate, as expected by str_strip_lead_end_space(). */ ++ buffer[REG_BUF] = '\0'; ++ + bufptr = str_strip_lead_end_space(buffer); ++ ++ /* Must fit, as we can only have removed things from the original ++ string */ + return strcpy(dest, bufptr); + } + +@@ -128,14 +136,43 @@ + return strBuf; + } + ++/* Note that the the (char *) data structure returned by FmtString() ++ is invalidated on subsequent calls, and that the function is not ++ re-entrant. Take care that the pointer returned is not held for ++ use across calls. */ + char* + FmtString(fmt, a, b, c) +- char *fmt, *a, *b, *c; ++ char *fmt, *a, *b, *c; + { +- static char strBuf[LRG_BUF]; ++ static char strBuf[LRG_BUF]; ++ static FILE *devnull=NULL; ++ int length = 0; ++ ++ /* Clear the buffer as it highlights errors elsewhere, such as ++ simultaneous use of the static string or re-entry into this ++ function. */ ++ memset(strBuf, 0, LRG_BUF); ++ ++ /* Ick... This is horrible - using a user-provided format string ++ means we have no easy way of limiting string length. HACK HACK ++ HACK Use fprintf to output to /dev/null and count the number of ++ bytes... It would be nice if we could rely on having snprintf() */ ++ ++ if(NULL == devnull) ++ { ++ devnull = fopen("/dev/null", "r+"); ++ if(NULL == devnull) ++ { ++ printf("Open /dev/null failed!?!\n"); ++ return strBuf; ++ } ++ length = fprintf(devnull, fmt, a, b, c); ++ } ++ ++ if(LRG_BUF >= length) ++ sprintf(strBuf, fmt, a, b, c); + +- sprintf(strBuf, fmt, a, b, c); +- return strBuf; ++ return strBuf; + } + + /* +@@ -189,6 +226,7 @@ + if (*line == '\0') + return NULL; + else if (*line == '\"') ++ + for (wrd = ++line; *line != '\"' && *line; line++); + else + for (wrd = line; !isspace(*line) && *line; line++); +@@ -246,38 +284,38 @@ + * this routine is not currently used, and I'm not if it works + */ + +-char * +-get_word(str, word) +- char *str, +- *word; +-{ +- char *wrd, +- c; +- +- while (isspace(*str) && *str) +- str++; +- +- if (!(*str)) +- word[0] = '\0'; +- +- else if (*str == '\"') { +- for (wrd = ++str; *str != '\"' && *str; str++); +- *str = '\0'; +- strcpy(word, wrd); +- *str = '\"'; +- str++; +- } ++/* char * */ ++/* get_word(str, word) */ ++/* char *str, */ ++/* *word; */ ++/* { */ ++/* char *wrd, */ ++/* c; */ ++ ++/* while (isspace(*str) && *str) */ ++/* str++; */ ++ ++/* if (!(*str)) */ ++/* word[0] = '\0'; */ ++ ++/* else if (*str == '\"') { */ ++/* for (wrd = ++str; *str != '\"' && *str; str++); */ ++/* *str = '\0'; */ ++/* strcpy(word, wrd); */ ++/* *str = '\"'; */ ++/* str++; */ ++/* } */ ++ ++/* else { */ ++/* for (wrd = str; !isspace(*str) && *str; str++); */ ++/* c = *str; */ ++/* *str = '\0'; */ ++/* strcpy(word, wrd); */ ++/* *str = c; */ ++/* } */ + +- else { +- for (wrd = str; !isspace(*str) && *str; str++); +- c = *str; +- *str = '\0'; +- strcpy(word, wrd); +- *str = c; +- } +- +- return str; +-} ++/* return str; */ ++/* } */ + + #if !HAVE_STRERROR + +--- seyon-2.20c.orig/SeParse.y ++++ seyon-2.20c/SeParse.y +@@ -1,8 +1,11 @@ + %{ + #include <stdio.h> + #include <ctype.h> ++#include <stdlib.h> + #include "SeParse.h" + ++int yylex(void); ++ + void (*callbackProc)(); + %} + +@@ -81,19 +84,19 @@ + { + char long_line[1000]; + +- char input_str[] = "This(is, a, real, funky); script(); +- Scripts(); Can(be); Multi(Line, \"Can't they?\"); +- Commas(are, no, longer, optional, inside, arglists); +- Scripts(); Can(); contain(\"tabs \\t and backspaces \\b\"); +- As(\"Well\\ as Quoted Strings\", and, '\"Quoted Strings inside +- quoted strings\"'); +- esc(can, appear, outside, strings, ^z, \\012\\015\\n); +- But(parenthesis, should, match); +- We(\"have a funny way of specifying \\012 chars and even)\"); +- backslashes( \" \\\\ \"); +- new(\"in this version are ^m and ^A ctr-escapes, as in ^S^Q\"); +- The(next, line, will, give, a, syntax, error, because, it, has, two, adj, functions, +- without, a, separating, semicolon); ++ char input_str[] = "This(is, a, real, funky); script();\n\ ++ Scripts(); Can(be); Multi(Line, \"Can't they?\");\n\ ++ Commas(are, no, longer, optional, inside, arglists);\n\ ++ Scripts(); Can(); contain(\"tabs \\t and backspaces \\b\");\n\ ++ As(\"Well\\ as Quoted Strings\", and, '\"Quoted Strings inside\n\ ++ quoted strings\"');\n\ ++ esc(can, appear, outside, strings, ^z, \\012\\015\\n)\n\ ++ But(parenthesis, should, match);\n\ ++ We(\"have a funny way of specifying \\012 chars and even)\"); \n\ ++ backslashes( \" \\\\ \");\n\ ++ new(\"in this version are ^m and ^A ctr-escapes, as in ^S^Q\");\n\ ++ The(next, line, will, give, a, syntax, error, because, it, has, two, adj, functions,\n\ ++ without, a, separating, semicolon);\n\ + End() script()"; + + printf("------ String to parse: \n%s\n\n---- Parsing begins:\n", input_str); +--- seyon-2.20c.orig/SeSet.c ++++ seyon-2.20c/SeSet.c +@@ -18,6 +18,9 @@ + + #include "seyon.h" + #include "SeDecl.h" ++#if HAVE_TERMIOS ++#include <termios.h> ++#endif + + extern int param_pipe[2]; + +@@ -84,6 +87,13 @@ + {"baud", {"300", "1200", "2400", "4800", "9600", "19200", "38400", + #if USE_NONSTD_BAUD + "57600", "115200", ++#else ++#ifdef B57600 ++ "57600", ++#endif ++#ifdef B115200 ++ "115200", ++#endif + #endif + NULL}, 1, MenuSetGetBaud}, + {"bits", {"5", "6", "7", "8", NULL}, 1, MenuSetGetCSize}, +@@ -191,7 +201,7 @@ + struct _setValue *vptr; + + vptr = set_value; +- strcpy(vptr->value, modem_port); ++ strncpy(vptr->value, modem_port, SM_BUF); + vptr++; + + curValObjPtr = (vptr = (struct _setValue *)client_data); +--- seyon-2.20c.orig/startup ++++ seyon-2.20c/startup +@@ -4,30 +4,30 @@ + # see the manual page for a complete listing of the keywords + # that can be used with 'set'. + +-# set baud 9600 ++set baud 57600 + + # can be 5, 6, 7, or 8 +-# set bits 8 ++set bits 8 + + # can be 0 (= no parity), 1 (= odd parity), or 2 (= even parity) + # set parity 0 + + # can be 1 or 2 +-# set stopBits 1 ++set stopBits 1 + + # can be nl, cr, or cr/lf + # set newlineTranslation cr + +-# set del on +-# set meta_tr on +-# set xoff off +-# set rtscts on +-# set autozm on ++set del on ++set meta_tr on ++set xoff off ++set rtscts on ++set autozm on + # set idleGuard on + + # put the modem initialization string here if you like one. + # most modern modems do not need it since they store their setup in + # non-volatile memory. + +-# echo "Initializing modem..." +-# transmit "ATZ^M" ++echo "Initializing modem..." ++transmit "ATM0^M" +--- seyon-2.20c.orig/debian/po/POTFILES.in ++++ seyon-2.20c/debian/po/POTFILES.in +@@ -0,0 +1 @@ ++[type: gettext/rfc822deb] templates +--- seyon-2.20c.orig/debian/po/fr.po ++++ seyon-2.20c/debian/po/fr.po +@@ -0,0 +1,49 @@ ++# ++# Translators, if you are not familiar with the PO format, gettext ++# documentation is worth reading, especially sections dedicated to ++# this format, e.g. by running: ++# info -n '(gettext)PO Files' ++# info -n '(gettext)Header Entry' ++# ++# Some information specific to po-debconf are available at ++# /usr/share/doc/po-debconf/README-trans ++# or http://www.debian.org/intl/l10n/po-debconf/README-trans ++# ++# Developers do not need to manually edit POT or PO files. ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: seyon 2.20c-12\n" ++"POT-Creation-Date: 2003-10-13 02:02+0100\n" ++"PO-Revision-Date: 2003-10-16 23:41+0100\n" ++"Last-Translator: Christian Perrier <bubulle@debian.org>\n" ++"Language-Team: French <debian-l10n-french@lists.debian.org>\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=iso-8859-15\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#. Description ++#: ../templates:4 ++msgid "Modem device" ++msgstr "Périphérique du modem" ++ ++#. Description ++#: ../templates:4 ++msgid "" ++"Please choose the device file corresponding to the port the modem is " ++"connected to. This may be /dev/ttyS1 or any other device file." ++msgstr "" ++"Veuillez choisir le fichier de périphérique correspondant au port où est " ++"connecté le modem. Cela peut être /dev/ttyS1 ou tout autre fichier de " ++"périphérique." ++ ++#. Description ++#: ../templates:4 ++msgid "" ++"/dev/modem is usually a symbolic link to the appropriate device file. This " ++"configuration program will not setup this link. If you choose \"/dev/modem" ++"\", the link should already exist." ++msgstr "" ++"/dev/modem est généralement un lien symbolique vers le fichier de " ++"périphérique correct. Ce programme de configuration n'établira pas ce lien. " ++"Si vous indiquez « /dev/modem », il faudrait que le lien existe au préalable." +--- seyon-2.20c.orig/debian/po/nl.po ++++ seyon-2.20c/debian/po/nl.po +@@ -0,0 +1,50 @@ ++# ++# Translators, if you are not familiar with the PO format, gettext ++# documentation is worth reading, especially sections dedicated to ++# this format, e.g. by running: ++# info -n '(gettext)PO Files' ++# info -n '(gettext)Header Entry' ++# ++# Some information specific to po-debconf are available at ++# /usr/share/doc/po-debconf/README-trans ++# or http://www.debian.org/intl/l10n/po-debconf/README-trans ++# ++# Developers do not need to manually edit POT or PO files. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: seyon2.20c-12 \n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2003-07-21 16:50+0200\n" ++"PO-Revision-Date: 2003-09-07 17:46+0100\n" ++"Last-Translator: Tim Vandermeersch <qber66@skolelinux.no>\n" ++"Language-Team: dutch <debian-l10n-dutch@lists.debian.org>\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=iso-8859-1\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#. Description ++#: ../templates:4 ++msgid "Modem device" ++msgstr "Modem apparaat" ++ ++#. Description ++#: ../templates:4 ++msgid "" ++"Please choose the device file corresponding to the port the modem is " ++"connected to. This may be /dev/ttyS1 or any other device file." ++msgstr "" ++"Gelieve het overeenkomstige apparaat bestand te kiezen van de poort waar de " ++"modem met verbonden is. Dit kan /dev/ttyS1 of een ander apparaat bestand zijn." ++ ++#. Description ++#: ../templates:4 ++msgid "" ++"/dev/modem is usually a symbolic link to the appropriate device file. This " ++"configuration program will not setup this link. If you choose \"/dev/modem" ++"\", the link should already exist." ++msgstr "" ++"/dev/modem is meestal een symbolische link naar het correcte apparaat bestand." ++"Dit configuratie programma zal deze link niet creëren. Als u \"/dev/modem\"" ++"kiest, dient deze link al te bestaan." +--- seyon-2.20c.orig/debian/po/templates.pot ++++ seyon-2.20c/debian/po/templates.pot +@@ -0,0 +1,45 @@ ++# ++# Translators, if you are not familiar with the PO format, gettext ++# documentation is worth reading, especially sections dedicated to ++# this format, e.g. by running: ++# info -n '(gettext)PO Files' ++# info -n '(gettext)Header Entry' ++# ++# Some information specific to po-debconf are available at ++# /usr/share/doc/po-debconf/README-trans ++# or http://www.debian.org/intl/l10n/po-debconf/README-trans ++# ++# Developers do not need to manually edit POT or PO files. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2003-10-13 02:02+0100\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" ++"Language-Team: LANGUAGE <LL@li.org>\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=CHARSET\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#. Description ++#: ../templates:4 ++msgid "Modem device" ++msgstr "" ++ ++#. Description ++#: ../templates:4 ++msgid "" ++"Please choose the device file corresponding to the port the modem is " ++"connected to. This may be /dev/ttyS1 or any other device file." ++msgstr "" ++ ++#. Description ++#: ../templates:4 ++msgid "" ++"/dev/modem is usually a symbolic link to the appropriate device file. This " ++"configuration program will not setup this link. If you choose \"/dev/modem" ++"\", the link should already exist." ++msgstr "" +--- seyon-2.20c.orig/debian/po/cs.po ++++ seyon-2.20c/debian/po/cs.po +@@ -0,0 +1,49 @@ ++# ++# Translators, if you are not familiar with the PO format, gettext ++# documentation is worth reading, especially sections dedicated to ++# this format, e.g. by running: ++# info -n '(gettext)PO Files' ++# info -n '(gettext)Header Entry' ++# ++# Some information specific to po-debconf are available at ++# /usr/share/doc/po-debconf/README-trans ++# or http://www.debian.org/intl/l10n/po-debconf/README-trans ++# ++# Developers do not need to manually edit POT or PO files. ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: seyon\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2003-10-13 02:02+0100\n" ++"PO-Revision-Date: 2004-12-31 11:57+0100\n" ++"Last-Translator: Miroslav Kure <kurem@debian.cz>\n" ++"Language-Team: Czech <provoz@debian.cz>\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=ISO-8859-2\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#. Description ++#: ../templates:4 ++msgid "Modem device" ++msgstr "Zaøízení modemu" ++ ++#. Description ++#: ../templates:4 ++msgid "" ++"Please choose the device file corresponding to the port the modem is " ++"connected to. This may be /dev/ttyS1 or any other device file." ++msgstr "" ++"Vyberte soubor zaøízení, který odpovídá portu, ke kterému je modem pøipojen. " ++"Mù¾e to být /dev/ttyS1, nebo nìjaký jiný soubor zaøízení." ++ ++#. Description ++#: ../templates:4 ++msgid "" ++"/dev/modem is usually a symbolic link to the appropriate device file. This " ++"configuration program will not setup this link. If you choose \"/dev/modem" ++"\", the link should already exist." ++msgstr "" ++"/dev/modem èasto bývá symbolickým odkazem na pøíslu¹ný soubor zaøízení. " ++"Tento konfiguraèní program zmínìný odkaz nevytváøí. Zadáte-li tedy \"/dev/" ++"modem\", mìl by odkaz ji¾ existovat." +--- seyon-2.20c.orig/debian/conffiles ++++ seyon-2.20c/debian/conffiles +@@ -0,0 +1,2 @@ ++/etc/X11/app-defaults/Seyon ++/etc/X11/app-defaults/Seyon-color +--- seyon-2.20c.orig/debian/config.include ++++ seyon-2.20c/debian/config.include +@@ -0,0 +1,84 @@ ++# Edit this file to configure debian/rules to build a package. ++# No modification of debian/rules should be neccessary. (Famous last words!) ++# ++# File by Joey Hess <joeyh@master.debian.org> ++ ++# What is the name of the primary package in this sourcepackage? ++package=seyon ++ ++# Parameters to pass to rules file. This can include doc files, or ++# command-line switches. ++docs=1-{BUGREPORT,FAQ,HISTORY,README,SURVEY,TODO} ++examples=phonelist protocols startup ++binfiles=$(package) ++copyright=debian/copyright ++ ++# What file must exist in the current directory if the package is ++# properly unpacked here? ++test_file=$(package).h ++ ++# Does this package build from an Imakefile? ++# If so, uncomment the line below. ++use_imakefile=y ++ ++# Does this package build from a Configure script? ++# If so, uncomment the line below and enter the command to run to run the ++# Configure script (ie: "./Configure") ++#use_configure=./Configure ++ ++# What commands to run to build the package? ++define build_command ++ $(MAKE) ++endef ++ ++# What commands to run to clean up after a build? ++define clean_command ++ -$(MAKE) -i clean ++endef ++ ++# List here any files that must be removed during "debian/rules clean" ++# that clean_command doesn't take care of. ++clean_files= ++ ++# List here any temporary directories that are used to build multiple- ++# binary packages. These are automatically created and removed. ++tmp_dirs= ++ ++# List here any files that should be preserved during a build, and restored ++# to their original state during a clean. For example, if the package comes ++# with both an Imakefile and a Makefile, and xmkmf is run, list the original ++# Makefile here so it will be backed up before it is overwritten my xmkmf. ++preserve_files=Makefile ++ ++# What command to run to install the package into debian/tmp? ++# You might want to edit the package's Makefile and add $(PREFIX) ++# to all the paths it installs files to. or, you can just write ++# your own install commands here instead. ++# ++# Note that debian/* and the files in /usr/share/doc will be installed ++# properly for you, you don't need to do that here. ++# ++define install_command ++ $(MAKE) DESTDIR=debian/tmp install ++ install -d debian/tmp/etc/X11/seyon ++ ln -sf /etc/X11/seyon/seyon-emu debian/tmp/usr/X11R6/bin/seyon-emu ++ install -d debian/tmp/usr/X11R6/man/man1 ++ install -m 644 seyon.man debian/tmp/usr/X11R6/man/man1/seyon.1x ++ install -m 644 debian/seyon-emu.man debian/tmp/usr/X11R6/man/man1/seyon-emu.1x ++ # Install 1-CHANGES as upstream changelog. ++ install -d debian/tmp/usr/share/doc/$(package) ++ cp 1-CHANGES debian/tmp/usr/share/doc/$(package)/changelog ++ strip --remove-section=.comment --remove-section=.note debian/tmp/usr/X11R6/bin/seyon ++ install -d debian/tmp/usr/lib/menu ++ install -m 644 debian/menu debian/tmp/usr/lib/menu/seyon ++endef ++ ++# After being installed in debian/tmp, everything is chowned to root.root, ++# and chmod g-ws is run on everything. Enter below any chmod commands you ++# need to run to set files to the proper permissions. This is where you ++# can make programs be suid, etc. ++# (Note that these commands will be run as root.) ++define ch_commands ++ chmod 644 debian/tmp/etc/X11/app-defaults/* ++ chmod 644 debian/tmp/usr/X11R6/lib/X11/seyon.help ++endef +--- seyon-2.20c.orig/debian/copyright ++++ seyon-2.20c/debian/copyright +@@ -0,0 +1,46 @@ ++This is a Debian prepackaged version of seyon. ++ ++This package was originally put together by Joey Hess ++<joeyh@master.debian.org>, using sources from: ++ ++ftp://sunsite.unc.edu/pub/Linux/apps/serialcomm/dialout/Seyon-2.14c-tar.gz ++ ++The following copyright applied to the old package: ++ ++====================================================================== ++ ++ Seyon is Copyright (c) 1992 of Muhammad M. Saggaf. Seyon is not ++ public domain. Permission is granted to use and distribute Seyon ++ freely for any use and to sell it at any price without reference to ++ the copyright owner provided that in all above cases Seyon is intact ++ and is not made part of any program either in whole or in part and ++ that this copyright notice is included with Seyon. Permission is ++ also granted to modify the source as long as the modified source is ++ not distributed. ++ ++====================================================================== ++ ++As of May 1999, Muhammad M. Saggaf has given permission for seyon to ++be released and maintained under GPL (see ++/usr/share/common-licenses/GPL): ++ ++Dear Steve: ++ ++I received your letter today (yes, I know it took a long time, it took a ++trip half-way around the world and then back to my current address in the ++U.S.). I share your view about license for Seyon, I think it is too ++restrictive, especially that I'm not actively maintaining it. The purpose ++behind that restriction was to prevent incompatible versions, really, but I ++don't think it was the correct way of doing that. You have my permission to ++modify the license (e.g. the GPL is just fine) and distribute the package ++with the new license. ++ ++My very best wishes, ++ ++-- M. Saggaf ++ msaggaf@erl.mit.edu ++ ++For now I am the new upstream maintainer as well as the Debian ++maintainer for the seyon package. Upstream sources without the Debian ++patches will be made available shortly from sunsite.unc.edu (now ++better known as metalab.unc.edu), as above. +--- seyon-2.20c.orig/debian/examples ++++ seyon-2.20c/debian/examples +@@ -0,0 +1,7 @@ ++script.QWK ++script.unix ++script.CIS ++script.PCBoard ++startup ++protocols ++phonelist +--- seyon-2.20c.orig/debian/postinst ++++ seyon-2.20c/debian/postinst +@@ -0,0 +1,27 @@ ++#!/bin/sh -e ++ ++case "$1" in ++ abort-upgrade|abort-remove|abort-deconfigure) ++ exit 0;; # Don't prompt for configuration if something went wrong... ++esac ++ ++if test -x /usr/bin/update-menus; then update-menus; fi ++ ++EMU=/etc/X11/seyon/seyon-emu ++COLORDEFAULTS=/etc/X11/seyon/Seyon ++MODEMDEFAULTS=/etc/X11/seyon/Seyon-modem ++ ++. /usr/share/debconf/confmodule ++db_version 2.0 ++ ++if [ ! -f $COLORDEFAULTS -o ! -f $MODEMDEFAULTS ]; then ++ ++ # No longer need to worry about colour/mono app-defaults any more; the ++ # system will get it right... ++ ++ ln -sf /usr/bin/x-terminal-emulator $EMU ++ ++fi ++exit 0 ++ ++#DEBHELPER# +--- seyon-2.20c.orig/debian/postrm ++++ seyon-2.20c/debian/postrm +@@ -0,0 +1,21 @@ ++#!/bin/sh -e ++ ++if test -x /usr/bin/update-menus; then update-menus; fi ++ ++XTERM=/etc/X11/seyon/seyon-emu ++COLORDEFAULTS=/etc/X11/seyon/Seyon ++MODEMDEFAULTS=/etc/X11/seyon/Seyon-modem ++ ++if [ "$1" = "purge" ] ++then ++ rm -f $XTERM $COLORDEFAULTS $MODEMDEFAULTS ++ rmdir /etc/X11/seyon /etc/X11 2>/dev/null || true ++ ++ . /usr/share/debconf/confmodule ++ ++ db_purge ++ ++ ++fi ++ ++#DEBHELPER# +--- seyon-2.20c.orig/debian/postrm.debhelper ++++ seyon-2.20c/debian/postrm.debhelper +@@ -0,0 +1,78 @@ ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section ++# Automatically added by dh_installdebconf ++if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then ++ . /usr/share/debconf/confmodule ++ db_purge ++fi ++# End automatically added section +--- seyon-2.20c.orig/debian/preinst ++++ seyon-2.20c/debian/preinst +@@ -0,0 +1,15 @@ ++#! /bin/sh ++# see: dh_installdeb(1) ++ ++set -e ++ ++# Source debconf library ++. /usr/share/debconf/confmodule ++ ++# dh_installdeb will replace this with shell code automatically ++# generated by other debhelper scripts. ++ ++#DEBHELPER# ++ ++ ++ +--- seyon-2.20c.orig/debian/rules ++++ seyon-2.20c/debian/rules +@@ -0,0 +1,143 @@ ++#!/usr/bin/make -f ++############################################################################## ++# Generic debian/rules file. Based on: ++# ++#> Sample debian.rules file - for GNU Hello (1.3). ++#> Copyright 1994,1995 by Ian Jackson. ++#> I hereby give you perpetual unlimited permission to copy, ++#> modify and relicense this file, provided that you do not remove ++#> my name from the file itself. (I assert my moral right of ++#> paternity under the Copyright, Designs and Patents Act 1988.) ++# ++# Heavily modified by Joey Hess <jeh22@cornell.edu> ++# ++############################################################################## ++# ++# NOTE: You shouldn't have to edit this file. Edit debian/config.include instead. ++# If you must edit this file to get your package to build properly, then ++# I have failed. Let me know; mail jeh22@cornell.edu. ++# ++# (Currently not handled: multiple binary packages from 1 source package, ++# and binary-indep rule.) ++# ++# NOTE: This file is designed so it doesn't need to be run as root. For ++# actions that require that the user be root, the root password will be ++# prompted for, if you're not already root. ++# ++############################################################################## ++ ++# Include config file. ++include debian/config.include ++ ++# Generate a makefile (via configure scriopt or xmkmf). ++makefile-stamp: ++ ifeq ($(strip $(use_imakefile)),y) ++ xmkmf -a ++ endif ++ $(use_configure) ++ touch makefile-stamp ++ ++# Preserve some files that may get deleted/overwritten/modified otherwise. ++preserve-stamp: ++ ifneq ($(strip $(preserve_files)),) ++ $(foreach file,$(preserve_files),-cp $(file) $(file).preserved) ++ endif ++ touch preserve-stamp ++ ++build: preserve-stamp makefile-stamp ++ $(checkdir) ++ $(build_command) ++ touch build ++ ++clean: preserve-stamp makefile-stamp ++ $(checkdir) ++ # Do actual cleaning up here. ++ -rm -f build ++ $(clean_command) ++ -rm -rf *~ debian/*~ debian/files* $(clean_files) ++ $(clean_tmp) ++ # Remove Makefile that xmkmf creates. ++ ifeq ($(strip $(use_imakefile)),y) ++ -rm -f Makefile ++ endif ++ # If we preserved some files, we need to restore them now. ++ ifneq ($(strip $(preserve_files)),) ++ $(foreach file,$(preserve_files),-mv -f $(file).preserved $(file)) ++ endif ++ -rm -f preserve-stamp makefile-stamp ++ ++# Build architecture-independent files here. ++# (not yet set up to be used) ++binary-indep: build ++ $(checkdir) ++ ++# Build architecture-dependent files here. ++binary-arch: build ++ $(checkdir) ++ $(clean_tmp) ++ install -d debian/tmp debian/tmp/DEBIAN debian/tmp/usr/share/doc/$(package) ++ $(install_command) ++ # Compress manpages ++ -gzip -9v -r debian/tmp/usr/man/ debian/tmp/usr/X11R6/man/ ++ # Install documentation files, compressed. ++ ifneq ($(strip $(docs)),) ++ cp $(docs) debian/tmp/usr/share/doc/$(package) ++ gzip -9v debian/tmp/usr/share/doc/$(package)/* ++ endif ++ # Install copyright file, don't compress. ++ ifneq ($(strip $(copyright)),) ++ cp $(copyright) debian/tmp/usr/share/doc/$(package)/copyright ++ endif ++ # Install examples, compressed. ++ ifneq ($(strip $(examples)),) ++ install -d debian/tmp/usr/share/doc/$(package)/examples ++ cp $(examples) debian/tmp/usr/share/doc/$(package)/examples ++ gzip -9v debian/tmp/usr/share/doc/$(package)/examples/* ++ endif ++ # Install other debian files if they exist. ++ -install -m 644 debian/changelog debian/tmp/usr/share/doc/$(package)/changelog.Debian ++ -gzip -9v debian/tmp/usr/share/doc/$(package)/changelog.Debian ++ -install -m 644 debian/conffiles debian/tmp/DEBIAN/conffiles ++ -install -m 755 debian/preinst debian/tmp/DEBIAN/preinst ++ -install -m 755 debian/postinst debian/tmp/DEBIAN/postinst ++ -install -m 755 debian/prerm debian/tmp/DEBIAN/prerm ++ -install -m 755 debian/postrm debian/tmp/DEBIAN/postrm ++ # Generate control file. ++ dpkg-shlibdeps $(binfiles) ++ dpkg-gencontrol -isp ++ # Set permissions. ++ @[ "`whoami`" != root ] && \ ++ echo -e "\n ** Enter root password to set file permissions."; \ ++ debian/rules setperms ++ # C. Perrier. Well, debhelper helps a lot for all this..:-) ++ # Install debconf templates (with debhelper) ++ dh_installdebconf ++ # Actually build the .deb file. ++ dpkg --build debian/tmp .. ++ ++# This must be run suid root, it sets the file permissions in debian/tmp ++setperms: ++ chown -R root.root debian/tmp ++ chmod -R g-ws debian/tmp ++ -$(ch_commands) ++ ++define checkdir ++ @test -f $(test_file) -a -f debian/rules || (echo -e "\n\ ++ ** \"$(test_file)\" or \"debian/rules\" does not exist.\n\ ++ ** Either \"$(package)\" is not unpacked in this directory, or\n\ ++ ** an incorrect test_file is specified in debian/config.\n" && false) ++endef ++ ++# This rm's the debian/tmp directory. ++define clean_tmp ++ -rm -rf debian/tmp >/dev/null 2>&1 ++ @if [ -d debian/tmp ]; then \ ++ if [ "`whoami`" != root ]; then \ ++ echo -e "\n ** Enter root password to remove debian/tmp."; \ ++ fi; \ ++ rm -rf debian/tmp; \ ++ fi ++endef ++ ++binary: binary-indep binary-arch ++.PHONY: clean setperms binary +--- seyon-2.20c.orig/debian/rules.old ++++ seyon-2.20c/debian/rules.old +@@ -0,0 +1,136 @@ ++#!/usr/bin/make -f ++############################################################################## ++# Generic debian/rules file. Based on: ++# ++#> Sample debian.rules file - for GNU Hello (1.3). ++#> Copyright 1994,1995 by Ian Jackson. ++#> I hereby give you perpetual unlimited permission to copy, ++#> modify and relicense this file, provided that you do not remove ++#> my name from the file itself. (I assert my moral right of ++#> paternity under the Copyright, Designs and Patents Act 1988.) ++# ++# Heavily modified by Joey Hess <joeyh@master.debian.org> ++# ++############################################################################## ++# ++# NOTE: You shouldn't have to edit this file. Edit debian/config instead. ++# If you must edit this file to get your package to build properly, then ++# I have failed. Let me know; mail me. ++# ++# (Currently not handled: multiple binary packages from 1 source package, ++# and binary-indep rule.) ++# ++# NOTE: This file is designed so it doesn't need to be run as root. For ++# actions that require that the user be root, the root password will be ++# prompted for, if you're not already root. ++# ++############################################################################## ++# ++# Changelog: ++# * Fakeroot and sudo fixes. ++# * Run dpkg-gencontrol after debstd, and delete substvars during clean. ++# * Clean up junk files in subdirs. ++# * Modifications for multiple binary package support. ++# * Call debstd after fixing file perms. ++# * Don't pass package name to debstd + fixes for multi binary packages. ++# * Use build-stamp instead of build. ++# * New email address. ++# * Added changelog. ++# ++############################################################################## ++ ++# Include config file. ++include debian/config ++ ++# Generate a makefile (via configure scriopt or xmkmf). ++makefile-stamp: ++ ifeq ($(strip $(use_imakefile)),y) ++ xmkmf -a ++ endif ++ $(use_configure) ++ touch makefile-stamp ++ ++# Preserve some files that may get deleted/overwritten/modified otherwise. ++preserve-stamp: ++ ifneq ($(strip $(preserve_files)),) ++ $(foreach file,$(preserve_files),cp $(file) $(file).preserved ;) ++ endif ++ touch preserve-stamp ++ ++build-stamp: preserve-stamp makefile-stamp ++ $(checkdir) ++ $(build_command) ++ touch build-stamp ++ ++build: build-stamp ++ ++clean: preserve-stamp makefile-stamp ++ $(checkdir) ++ # Do actual cleaning up here. ++ -rm -f build-stamp ++ $(clean_command) ++ -find . -name '\#*\#' -o -name '*~' -o -name 'DEADJOE' -exec rm -f {} \; ++ -rm -f debian/files* debian/substvars debian/*.substvars $(clean_files) ++ $(clean_tmp) ++ # Remove Makefile that xmkmf creates. ++ ifeq ($(strip $(use_imakefile)),y) ++ -rm -f Makefile ++ endif ++ # If we preserved some files, we need to restore them now. ++ ifneq ($(strip $(preserve_files)),) ++ $(foreach file,$(preserve_files),mv -f $(file).preserved $(file); ) ++ endif ++ -rm -f preserve-stamp makefile-stamp ++ ++# Build architecture-independent files here. ++# (not yet set up to be used) ++binary-indep: build ++ $(checkdir) ++ ++# Build architecture-dependent files here. ++binary-arch: build ++ $(checkdir) ++ $(clean_tmp) ++ $(install_command) ++ # Set permissions and check package for problems, then build package. ++ @if [ "`whoami`" != root ]; then \ ++ echo -e "\n ** Enter root password to set file permissions."; \ ++ sudo debian/rules setperms; \ ++ else \ ++ debian/rules setperms; \ ++ fi ++ ++# This must be run suid root, it sets the file permissions in debian/tmp ++setperms: ++ chown -R root.root debian/tmp ++ chmod -R g-ws debian/tmp ++ # Debstd handles lots of nasty details. This requires that the debmake ++ # package is installed. ++ -debstd $(debstd) $(docs) ++ dpkg-gencontrol -p$(package) ++ $(ch_commands) ++ dpkg --build debian/tmp .. ++ ++define checkdir ++ @test -e $(test_file) -a -f debian/rules || (echo -e "\n\ ++ ** \"$(test_file)\" or \"debian/rules\" does not exist.\n\ ++ ** Either the package is not unpacked in this directory, or\n\ ++ ** an incorrect test_file is specified in debian/config.\n" && false) ++endef ++ ++# This rm's the debian/tmp directory, and any other directories specified in ++# tmpdirs ++define clean_tmp ++ -rm -rf debian/tmp >/dev/null 2>&1 ++ @if [ -d debian/tmp -o -n "$(tmp_dirs)" ]; then \ ++ if [ "`whoami`" != root ]; then \ ++ echo -e "\n ** Enter root password to remove temporary directories $(tmp_dirs)"; \ ++ sudo rm -rf debian/tmp $(tmp_dirs); \ ++ else \ ++ rm -rf debian/tmp $(tmp_dirs); \ ++ fi; \ ++ fi ++endef ++ ++binary: binary-indep binary-arch ++.PHONY: clean setperms binary +--- seyon-2.20c.orig/debian/seyon-emu.man ++++ seyon-2.20c/debian/seyon-emu.man +@@ -0,0 +1,23 @@ ++.TH SEYON 1 \" -*- nroff -*- ++ ++.SH NAME ++Seyon \- X11 Telecommunications Package. ++ ++.SH SYNOPSIS ++.B seyon-emu ++ ++.SH DESCRIPTION ++ ++.P ++ ++\fISeyon-emu\fP is the name of the terminal-emulator program called by ++\fIseyon\fP. This will normally simply be a symbolic link to another ++program (such as \fIxterm\fP or \fIrxvt\fP). Therefore read the manual ++page of the appropriate program for its options. ++ ++.SH SEE ALSO ++rxvt(1), xterm(1), seyon(1) ++ ++This manual page added by Steve McIntyre <stevem@chiark.greenend.org.uk>, ++Debian maintainer of seyon, 14th March 1998. ++ +--- seyon-2.20c.orig/debian/substvars ++++ seyon-2.20c/debian/substvars +@@ -0,0 +1,2 @@ ++shlibs:Depends=libc6 (>= 2.3.2.ds1-4), libice6 | xlibs (>> 4.1.0), libsm6 | xlibs (>> 4.1.0), libx11-6 | xlibs (>> 4.1.0), libxaw7 (>> 4.1.0), libxext6 | xlibs (>> 4.1.0), libxmu6 | xlibs (>> 4.1.0), libxpm4 | xlibs (>> 4.1.0), libxt6 | xlibs (>> 4.1.0) ++misc:Depends=debconf (>= 0.5) | debconf-2.0, debconf (>= 0.5) +--- seyon-2.20c.orig/debian/templates ++++ seyon-2.20c/debian/templates +@@ -0,0 +1,10 @@ ++Template: seyon/device ++Type: string ++Default: /dev/modem ++_Description: Modem device ++ Please choose the device file corresponding to the port the modem is ++ connected to. This may be /dev/ttyS1 or any other device file. ++ . ++ /dev/modem is usually a symbolic link to the appropriate device file. ++ This configuration program will not setup this link. If you choose ++ "/dev/modem", the link should already exist. +--- seyon-2.20c.orig/debian/config ++++ seyon-2.20c/debian/config +@@ -0,0 +1,92 @@ ++#!/bin/sh -e ++ ++# Some ideas stolen from the cvs package ++ ++# Config script for seyon using debconf ++. /usr/share/debconf/confmodule ++db_version 2.0 || [ $? -lt 30 ] ++ ++db_title "Seyon communication software" ++ ++# Defaults ++MODEMDEFAULTS=/etc/X11/seyon/Seyon-modem ++DEFAULTPORT=/dev/modem ++PORT=$DEFAULTPORT ++ ++read_rcfile() { ++ # Default values ++ if [ -f $MODEMDEFAULTS ]; then ++ PORT=`cat $MODEMDEFAULTS | grep -m1 "^seyon\*modems:" | cut -f2 -d: 2>/dev/null` ++ fi ++ if [ -z $PORT ] ; then ++ PORT=$DEFAULTPORT ++ fi ++} ++ ++write_rcfile() { ++ TEMPFILE=`tempfile` ++ if [ -f $MODEMDEFAULTS ]; then ++ ESCAPEDPORT=`echo $PORT | sed 's/\//\\\\\//g'` ++ sed "s/^seyon\*modems:.*$/seyon\*modems: ${ESCAPEDPORT}/" $MODEMDEFAULTS > $TEMPFILE ++ chmod --reference=$MODEMDEFAULTS $TEMPFILE ++ chown --reference=$MODEMDEFAULTS $TEMPFILE ++ else ++ echo "seyon*modems: $PORT" > $TEMPFILE ++ chmod 640 $TEMPFILE ++ chown root.dialout $TEMPFILE ++ fi ++ if [ ! -d /etc/X11/seyon ] ; then ++ mkdir -p /etc/X11/seyon ++ fi ++ mv $TEMPFILE $MODEMDEFAULTS ++} ++ ++set_debconf() { ++ if [ "$PORT" ]; then ++ db_set seyon/device "$PORT" || true ++ fi ++} ++ ++get_debconf() { ++ db_get seyon/device ++ PORT=$RET ++ # If not present, use default ++ if [ "$PORT" = "" ] ++ then ++ PORT=$DEFAULTPORT ++ fi ++} ++ ++ ++input_settings() { ++ db_input low seyon/device || true ++ db_go ++ db_get seyon/device ++ PORT=$RET ++ # If not present, use default ++ if [ "$PORT" = "" ] ++ then ++ PORT=$DEFAULTPORT ++ fi ++} ++ ++ ++## Main program ++# We first read the settings file ++# in order to get admin-modified settings ++read_rcfile ++# Debconf-stored values are updated accordingly ++set_debconf ++# They are re-read from Debconf ++get_debconf ++# In case the package has never been configured, the settings ++# are asked through debconf ++input_settings ++# They are re-re-read from debconf ++# for updating variables ++get_debconf ++# The settings file is written ++write_rcfile ++# Then we do some other stuff, which could sometimes lead to ++# debconf showing screens ++# This is why they are here and not in the postinst script +--- seyon-2.20c.orig/debian/control ++++ seyon-2.20c/debian/control +@@ -0,0 +1,18 @@ ++Source: seyon ++Section: comm ++Priority: extra ++Maintainer: Steve McIntyre <93sam@debian.org> ++Standards-Version: 3.6.1.1 ++Build-Depends: xlibs-dev, xutils, libxaw7-dev | libxaw-dev, bison, debhelper (>= 4.1.16) ++ ++Package: seyon ++Architecture: any ++Depends: ${shlibs:Depends}, xterm | x-terminal-emulator, debconf (>= 1.2.9) ++Suggests: lrzsz, ckermit ++Description: Full-featured native X11 communications program ++ Seyon is a complete full-featured modem communications package ++ for the X Window System. Some of its features are: ++ - dialing directory ++ - terminal emulation (DEC VT02, Tektronix 4014 and ANSI) ++ - script language ++ - Zmodem +--- seyon-2.20c.orig/debian/menu ++++ seyon-2.20c/debian/menu +@@ -0,0 +1,3 @@ ++?package(seyon):needs="X11" section="Apps/Net" hints="Terminal" \ ++ title="Seyon" longtitle="Seyon communications program" \ ++ command="seyon" +--- seyon-2.20c.orig/debian/prerm ++++ seyon-2.20c/debian/prerm +@@ -0,0 +1,10 @@ ++#!/bin/sh ++ ++ ++PACKAGE=seyon ++ ++if [ \( "$1" = "upgrade" -o "$1" = "remove" \) -a -L /usr/doc/$PACKAGE ]; then ++ rm -f /usr/doc/$PACKAGE ++fi ++ ++#DEBHELPER# +--- seyon-2.20c.orig/debian/changelog ++++ seyon-2.20c/debian/changelog +@@ -0,0 +1,267 @@ ++seyon (2.20c-16) unstable; urgency=low ++ ++ * Added Czech debconf template. Thanks to Miroslav Kure for the ++ patch. Closes: #288019. ++ ++ -- Steve McIntyre <93sam@debian.org> Mon, 03 Jan 2005 21:49:33 +0000 ++ ++seyon (2.20c-15) unstable; urgency=low ++ ++ * Fix handling of /etc/X11/seyon/Seyon-modem on new ++ installations. Closes: #275167. Thanks to Rob Epping for the patch. ++ * Updated Standards-version and fixed some lintian warnings. ++ ++ -- Steve McIntyre <93sam@debian.org> Mon, 25 Oct 2004 22:58:45 +0100 ++ ++seyon (2.20c-14) unstable; urgency=low ++ ++ * Updated French debconf template. Thanks to Christian ++ Perrier. Closes: #216159. ++ * Added Dutch debconf template. Thanks to Tim Vandermeersch. Closes: ++ #209081. ++ ++ -- Steve McIntyre <93sam@debian.org> Sun, 02 Nov 2003 16:10:08 +0000 ++ ++seyon (2.20c-13) unstable; urgency=low ++ ++ * Fixed typo in debian/templates. Closes: #209080 ++ * Update to use new serial speed interface for Linux. Closes: #206321. ++ Thanks to Elrik Fuller for the patch. ++ ++ -- Steve McIntyre <93sam@debian.org> Mon, 13 Oct 2003 02:00:51 +0100 ++ ++seyon (2.20c-12) unstable; urgency=low ++ ++ * Patch by Christian Perrier <bubulle@debian.org> : ++ - rename debian/config to debian/config.include (avoid confusion ++ with the config file needed by debconf) ++ - Now uses debconf : ++ - Depends on debconf (>= 1.2.9 for gettext) ++ - new config script (should properly handle admin-modified settings ++ -->debconf is not a registry) ++ - rewrote postint ++ - new templates file (gettext-based) ++ This should make the installation uninteractive. Closes: #147269 ++ This should also remember the serial port on upgrade; Closes: #92414 ++ - Any value may be entered for the modem device. Closes: #87564 ++ * Make sure that the new Seyon-modem config file has the same ++ permissions as the old one. ++ ++ -- Steve McIntyre <93sam@debian.org> Mon, 21 Jul 2003 20:31:27 +0100 ++ ++seyon (2.20c-11) unstable; urgency=high ++ ++ * Real fix for the string-handling bug in FmtString(). Many thanks ++ to Barry Kitson for a _huge_ amount of work on this one. ++ * Several other less major string cleanups, again thanks to Barry. ++ ++ -- Steve McIntyre <93sam@debian.org> Wed, 16 Jul 2003 01:39:22 +0100 ++ ++seyon (2.20c-10) unstable; urgency=low ++ ++ * Fix for a nasty string-handling bug. Thanks to Barry Kitson for ++ the inspiration. Closes: #90613, #132484. ++ * Make sure we delete the generated Seyon.ad.h file on a "make clean". ++ ++ -- Steve McIntyre <93sam@debian.org> Mon, 14 Jul 2003 02:49:49 +0100 ++ ++seyon (2.20c-9) unstable; urgency=low ++ ++ * Fix multi-line strings so will build again with gcc 3.3. Closes: #196280 ++ Thanks to Joshua Kwan for the patch. ++ * Finally get around to replacing the NMU version. Closes: #133890 ++ Thanks Junichi... ++ * Fixed some lintian warnings ++ ++ -- Steve McIntyre <93sam@debian.org> Sat, 07 Jun 2003 19:08:02 +0100 ++ ++seyon (2.20c-8.1) unstable; urgency=low ++ ++ * NMU ++ * Do not write to $(HOME) when building. (closes: #133890) ++ * Fix build-deps to depend on libxaw7-dev | libxaw-dev instead of ++ libxaw-dev only. ++ ++ -- Junichi Uekawa <dancer@debian.org> Fri, 17 May 2002 21:12:50 +0900 ++ ++seyon (2.20c-8) unstable; urgency=medium ++ ++ * Added Build-Depends on bison. Closes: #123699. ++ * Turned app-defaults files into conffiles after lintian warning. ++ ++ -- Steve McIntyre <93sam@debian.org> Wed, 19 Dec 2001 17:24:13 +0000 ++ ++seyon (2.20c-7) unstable; urgency=low ++ ++ * Added Build-Depends on libxaw-dev. Closes: #89742. ++ ++ -- Steve McIntyre <93sam@debian.org> Thu, 15 Mar 2001 15:55:19 +0000 ++ ++seyon (2.20c-6) unstable; urgency=low ++ ++ * Properly added menu entry. Sorry! Closes: #80160. ++ ++ -- Steve McIntyre <93sam@debian.org> Wed, 14 Mar 2001 00:03:32 +0000 ++ ++seyon (2.20c-5) unstable; urgency=low ++ ++ * Added xutils to Build-Depends. Closes: #89134. ++ * Changed dependency on x-terminal-emulator to xterm | x-terminal-emulator to fix lintian warning. ++ * Added menu hint. Closes: #80160. ++ * I still think there's no better place in the menu structure than Apps/Net. Closes: #15080. ++ ++ -- Steve McIntyre <93sam@debian.org> Sat, 10 Mar 2001 11:12:39 +0000 ++ ++seyon (2.20c-4) unstable; urgency=low ++ ++ * New maintainer address. ++ * Renamed Build-Depends-Indep to Build-Depends. ++ ++ -- Steve McIntyre <93sam@debian.org> Wed, 07 Mar 2001 22:53:31 +0000 ++ ++seyon (2.20c-3) unstable; urgency=medium ++ ++ * Removed a broken usleep() declaration from SeDecl.h. Closes: #87532 ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Sun, 25 Feb 2001 11:31:56 +0000 ++ ++seyon (2.20c-2) unstable; urgency=medium ++ ++ * Move app-defaults file to /etc/X11/app-defaults. Closes: #86289 ++ * Now explicitly depends on x-terminal-emulator instead of imlicitly on xterm. Closes: #75343 ++ * Fixed includes from SePort.c, so it now builds again. Closes: 84487 ++ * Updated Standards-Version, added Build-Depends. ++ * Fixed lots of lintian warnings. ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Sat, 24 Feb 2001 11:01:56 +0000 ++ ++seyon (2.20c-1) unstable; urgency=low ++ ++ * Call makever.sh with sh, so it doesn't need to be executable. Fixes Bug#38037 ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Sun, 23 May 1999 20:19:56 +0100 ++ ++seyon (2.20c-0) unstable; urgency=low ++ ++ * Hurrah! Seyon is now free! Check the copyright file for more info. ++ Fixes Bug#20914. ++ * New upstream version, new upstream maintainer (me!) ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Sun, 09 May 1999 21:18:01 +0100 ++ ++seyon (2.14c-12) frozen unstable; urgency=low ++ ++ * Removed obsolete dependency on xbase. Would be important bug if we weren'y non-free... ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Sat, 06 Feb 1999 13:32:15 +0000 ++ ++seyon (2.14c-11) frozen unstable; urgency=low ++ ++ * Replaced Suggests: for now non-existent kermit package with ckermit. ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Thu, 14 Jan 1999 23:54:15 +0000 ++ ++seyon (2.14c-10) frozen unstable; urgency=low ++ ++ * Integrated non-maintainer diff (9.1) ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Wed, 30 Dec 1998 01:48:53 +0000 ++ ++seyon (2.14c-9.1) frozen unstable; urgency=low ++ ++ * non-maintainer (binary-only) upload for Alpha ++ * ignore error from $(ch_commands) as chmodding the Seyon symlink fails if ++ seyon isn't installed yet (and hence no /etc/X11/seyon/Seyon file). ++ ++ -- Paul Slootman <paul@debian.org> Tue, 29 Dec 1998 20:11:10 +0100 ++ ++seyon (2.14c-9) frozen unstable; urgency=low ++ ++ * Fixed typo in mono app-default file; s/replcae/replace; thanks to Remo Badii <Remo.Badii@psi.ch> for pointing this one out. ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Sun, 24 Oct 1998 20:15:08 +0100 ++ ++seyon (2.14c-8) unstable; urgency=low ++ ++ * Fixed script-handling code so it no longer seg-faults after running a "shell" command. Fixes Bug#27015. ++ * Include examples for phonelist, protocols and startup. Fixes Bug#23268. ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Sat, 17 Oct 1998 22:03:16 +0100 ++ ++seyon (2.14c-7) frozen unstable; urgency=low ++ ++ * Added missing sunsite reference to copyright file. Fixes bug #19870 ++ * Added error-checking to postinst - don't ask questions if something went wrong. Fizes bug #12608. ++ * Restores X beep after use; fixes bug #17231. ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Thu, 26 Mar 1998 22:54:54 -0000 ++ ++seyon (2.14c-6) unstable; urgency=low ++ ++ * New maintainer ++ * Added simple man page for seyon-emu. ++ * Other packaging fixes to close bug #19402. ++ * Uses correct devices (fixes bug #15061) ++ * Postinst fixed (fixes bug #16226) ++ ++ -- Steve McIntyre <stevem@chiark.greenend.org.uk> Sat, 14 Mar 1998 20:31:43 -0000 ++ ++seyon (2.14c-5.3) unstable; urgency=low ++ ++ * Fixed postint to not fail if enter is pressed in response to the first ++ question with no 'y' or 'n'. ++ * Postinst and postrm do not use bashisms, changes them to use /bin/sh. ++ ++ -- Joey Hess <joeyh@master.debian.org> Sun, 16 Nov 1997 00:42:06 -0500 ++ ++seyon (2.14c-5.2) unstable; urgency=low ++ ++ * Libc6 release. ++ ++ -- Joey Hess <joeyh@master.debian.org> Sun, 16 Nov 1997 00:42:06 -0500 ++ ++seyon (2.14c-5.1) unstable; urgency=low ++ ++ * Changed maintainer to Debian QA Group; seyon is orphaned. ++ * Updated to use new source format (#9561). ++ * Use pristine sources. ++ * Register with menu system. ++ * Depend on xbase for xterm. ++ * Use ttyS instead of cua (#4922). ++ * If upgrading, and we used cua before, update the conffiles to use ttyS ++ instead. ++ * Include phonelist in the examples directory (#6475). ++ ++ -- Joey Hess <joeyh@master.debian.org> Mon, 1 Sep 1997 13:13:24 -0400 ++ ++Wed Jul 24 23:18:23 1996 Sven Rudolph <sr1@inf.tu-dresden.de> ++ ++ * debian.control: added exetended description (Bug#3689) ++ ++ * debian.rules: corrected multiarchitecture support ++ ++ * debian.control: added Section: and Priority: ++ ++Thu Apr 4 19:38:36 1996 Sven Rudolph <sr1@inf.tu-dresden.de> ++ ++ * releasing 2.14c-3 ++ ++ * rebuilt for ELF ++ ++ * debian.postinst: fixed creytion of seyon-emu symlink ++ ++ * debian.control: removed Package_Revision field ++ added Architecture field ++ ++Thu Sep 21 23:23:52 1995 Sven Rudolph <sr1@inf.tu-dresden.de> ++ ++ * moved config data to /etc/X11/seyon ++ ++ * debian.postinst: postinst doesn't modify ++ /etc/X11/xinit/Xresources and ++ /etc/X11/xdm/Xresources now ++ ++ * debian.control: fixed entries for DEPENDS and OPTIONAL ++ (Bug#1409, Bug#1177) ++ ++ * debian.control: corrected location of manpage (Bug#490) +--- seyon-2.20c.orig/typescript ++++ seyon-2.20c/typescript +@@ -0,0 +1,37 @@ ++Script started on Thu Feb 24 23:08:45 2000 ++hammer:~/debian/seyon/seyon-2.20c$ make clean && make
++rm -f seyon
++rm -f version.h y.tab.* SeParse.c
++rm -f *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut "#"*
++rm -f version.h
++sh ./makever.sh
++Machine type is i686, OS name is Linux
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o Seyon.o Seyon.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeActions.o SeActions.c
++bison -y -d SeParse.y
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeScan.o SeScan.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeDial.o SeDial.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeErr.o SeErr.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeGeneric.o SeGeneric.c
++rm -f SeInit.o
++gcc -c -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -DHELPFILE=\"/usr/X11R6/lib/X11/seyon.help\" SeInit.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeIo.o SeIo.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeMisc.o SeMisc.c
++mv -f y.tab.c SeParse.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeParse.o SeParse.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SePort.o SePort.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeScript.o SeScript.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeSet.o SeSet.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeSig.o SeSig.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeString.o SeString.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeSubs.o SeSubs.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeSubsX.o SeSubsX.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeSupp.o SeSupp.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeTerm.o SeTerm.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeTrans.o SeTrans.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o SeWin.o SeWin.c
++gcc -O2 -g -Wall -I/usr/X11R6/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE -DFUNCPROTO=15 -DNARROWPROTO -c -o MultiList.o MultiList.c
++rm -f seyon
++gcc -o seyon -O2 -g -Wall -L/usr/X11R6/lib Seyon.o SeActions.o SeScan.o SeDial.o SeErr.o SeGeneric.o SeInit.o SeIo.o SeMisc.o SeParse.o SePort.o SeScript.o SeSet.o SeSig.o SeString.o SeSubs.o SeSubsX.o SeSupp.o SeTerm.o SeTrans.o SeWin.o MultiList.o -lXaw -lXmu -lXt -lSM -lICE -lXext -lX11
++hammer:~/debian/seyon/seyon-2.20c$ ++Script done on Thu Feb 24 23:09:17 2000 diff --git a/source/xap/seyon/slack-desc b/source/xap/seyon/slack-desc new file mode 100644 index 00000000..70c0d089 --- /dev/null +++ b/source/xap/seyon/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +seyon: seyon (telecommunications package) +seyon: +seyon: Seyon is a complete full-featured telecommunications package for the +seyon: X Window System. Some of its features are: Dialing directory that +seyon: supports an unlimited number of entries. Terminal emulation window +seyon: supporting DEC VT02, Tektronix 4014, and ANSI. Script language to +seyon: automate tedious tasks such as logging into remote hosts. Unlimited +seyon: number of slots for external file transfer protocols. Support for +seyon: zmodem auto-download. Seyon is intended to be both simple and +seyon: extensively configurable. +seyon: diff --git a/source/xap/thunar-volman/slack-desc b/source/xap/thunar-volman/slack-desc new file mode 100644 index 00000000..a5fdf60b --- /dev/null +++ b/source/xap/thunar-volman/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------| +thunar-volman: thunar-volman (Thunar Volume Manager Plugin) +thunar-volman: +thunar-volman: thunar-volman is an extension for the Thunar File Manager, +thunar-volman: which enables automatic management of removable drives and +thunar-volman: media. +thunar-volman: +thunar-volman: It was designed to look and act similar to gnome-volume-manager +thunar-volman: to get consistent removable drive and media management in both +thunar-volman: Xfce and GNOME. +thunar-volman: +thunar-volman: diff --git a/source/xap/thunar-volman/thunar-volman.SlackBuild b/source/xap/thunar-volman/thunar-volman.SlackBuild new file mode 100755 index 00000000..bf14ff9e --- /dev/null +++ b/source/xap/thunar-volman/thunar-volman.SlackBuild @@ -0,0 +1,84 @@ +#!/bin/sh + +# Slackware build script for thunar-volman +# http://goodies.xfce.org/releases/thunar-volman/ + +# Copyright 2007-2009 Robby Workman, Northport, Alabama, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PRGNAM=thunar-volman +VERSION=0.3.80 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-$PRGNAM + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +rm -rf $PKG +mkdir -p $TMP $PKG +cd $TMP +rm -rf $PRGNAM-$VERSION +tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2 || exit 1 +cd $PRGNAM-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --enable-debug=no \ + --build=$ARCH-slackware-linux + +make || exit 1 +make install DESTDIR=$PKG + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION +cp -a \ + AUTHORS COPYING ChangeLog INSTALL NEWS README THANKS \ + $PKG/usr/doc/$PRGNAM-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/$PRGNAM-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/vim-gvim b/source/xap/vim-gvim new file mode 120000 index 00000000..1a147f49 --- /dev/null +++ b/source/xap/vim-gvim @@ -0,0 +1 @@ +../ap/vim
\ No newline at end of file diff --git a/source/xap/windowmaker/slack-desc b/source/xap/windowmaker/slack-desc new file mode 100644 index 00000000..ef3edbe7 --- /dev/null +++ b/source/xap/windowmaker/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +windowmaker: windowmaker (a fast and elegant window manager) +windowmaker: +windowmaker: Window Maker is a window manager for the X Window System that is +windowmaker: relatively fast and small, feature rich, easy to use, with a simple +windowmaker: and elegant appearance reminiscent of the NeXTSTEP(tm) graphical +windowmaker: user interface. +windowmaker: +windowmaker: Window Maker is part of the official GNU project. +windowmaker: +windowmaker: +windowmaker: diff --git a/source/xap/windowmaker/windowmaker.SlackBuild b/source/xap/windowmaker/windowmaker.SlackBuild new file mode 100755 index 00000000..8736f058 --- /dev/null +++ b/source/xap/windowmaker/windowmaker.SlackBuild @@ -0,0 +1,120 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=20060427cvs +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-2} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-windowmaker +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf WindowMaker-$VERSION +tar xvf $CWD/WindowMaker-$VERSION.tar.bz2 || exit 1 +cd WindowMaker-$VERSION || exit 1 + +zcat $CWD/windowmaker.no-mmx.diff.gz | patch -p1 --verbose -F 3 || exit 1 +sh autogen.sh + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +# This should be non-interactive where possible. +zcat $CWD/wmaker.inst.diff.gz | patch -p1 --verbose || exit + +LINGUAS="$(cd po ; /bin/ls *.po | sed 's/.po//g')" \ +GNUSTEP_LOCAL_ROOT=/usr/lib${LIBDIRSUFFIX}/GNUstep \ +CFLAGS="$SLKCFLAGS" \ +NLSDIR=/usr/share/locale \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --sysconfdir=/etc/X11 \ + --enable-gnome \ + --enable-kde \ + --enable-usermenu \ + --with-appspath=/usr/lib${LIBDIRSUFFIX}/GNUstep/Applications \ + --build=$ARCH-slackware-linux + +# NLS bugs like -i +make $NUMJOBS || make -i || exit 1 + +# Change /usr/local/GNUstep to /usr/lib/GNUstep in the WMRootMenu: +sed -i -e "s#/usr/local/GNUstep/Applications/WPrefs.app/#/usr/lib${LIBDIRSUFFIX}/GNUstep/Applications/WPrefs.app/#" \ + $(grep -lr '/usr/local/GNUstep/Applications/WPrefs.app/' *) + +make -i install DESTDIR=$PKG +mkdir -p $PKG/usr/doc/WindowMaker-$VERSION +cp -a \ + AUTHORS BUGFORM BUGS COPYING COPYING.WTFPL FAQ FAQ.I18N FAQ.I18N.cs FAQ.I18N.sk INSTALL INSTALL.cs INSTALL.es INSTALL.fr INSTALL.pt INSTALL.sk MIRRORS NEWS README README.definable-cursor README.pt TODO \ + $PKG/usr/doc/WindowMaker-$VERSION +cd $TMP +rm -rf WindowMaker-extra-0.1 +tar xvf $CWD/WindowMaker-extra-0.1.tar.gz || exit 1 +cd WindowMaker-extra-0.1 || exit 1 +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --with-iconsdir=/usr/share/pixmaps \ + $ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/etc/X11/xinit +cat $CWD/xinitrc.wmaker > $PKG/etc/X11/xinit/xinitrc.wmaker +chmod 755 $PKG/etc/X11/xinit/xinitrc.wmaker + +gzip -9 $PKG/usr/man/man1/* $PKG/usr/man/sk/man1/* + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/windowmaker-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/windowmaker/windowmaker.no-mmx.diff b/source/xap/windowmaker/windowmaker.no-mmx.diff new file mode 100644 index 00000000..277cc79e --- /dev/null +++ b/source/xap/windowmaker/windowmaker.no-mmx.diff @@ -0,0 +1,19 @@ +--- ./configure.ac.01 2008-06-02 08:42:30.000000000 +0200 ++++ ./configure.ac 2008-06-02 08:46:49.000000000 +0200 +@@ -190,7 +190,15 @@ + # until we fix it, leave it disabled + asm_support=no + mmx_support=no +-if test "$ac_cv_prog_gcc" = yes; then ++ ++check_for_mmx_support=yes ++AC_ARG_ENABLE(mmx, ++ [ --disable-mmx disable compilation of MMX inline assembly ], ++ [if test x$enableval != xyes; then ++ check_for_mmx_support=no ++ fi]) ++ ++if test "$ac_cv_prog_gcc" = yes -a "$check_for_mmx_support" = yes; then + case $host_cpu in + *i?86*) + # gcc-3.3 or newer complains about some of our stuff without this diff --git a/source/xap/windowmaker/wmaker.inst.diff b/source/xap/windowmaker/wmaker.inst.diff new file mode 100644 index 00000000..c80edd34 --- /dev/null +++ b/source/xap/windowmaker/wmaker.inst.diff @@ -0,0 +1,45 @@ +--- ./util/wmaker.inst.in.orig 2002-05-30 13:13:46.000000000 -0700 ++++ ./util/wmaker.inst.in 2002-05-30 13:16:37.000000000 -0700 +@@ -37,19 +37,7 @@ + make_script() { + ISCRIPT=$1 + +- cat << EOF >> $ISCRIPT +-# Window Maker default X session startup script +- +-PATH="\$PATH:$BINDIR" +- +-# If you login from xdm, uncomment this to make error messages appear +-# in the console window. +-# +-# tail -f $HOME/.xsession-errors > /dev/console & +- +-exec wmaker +- +-EOF ++ cat /etc/X11/xinit/xinitrc.wmaker >> $ISCRIPT + chmod +rx $ISCRIPT + } + +@@ -329,20 +317,7 @@ + + trap "show_end_message;exit" 2 + +-echo +-echo "Now the .xinitrc, .Xclients or .xsession script must be updated so that" +-echo "it calls wmaker when you start an X session." +-echo "Type the name of the file that must be changed (normally .xinitrc)." +-echo "If the file already exists, it will be backed up with a .old.$DATE " +-echo "extension" +-echo "If you want to edit it by hand, hit <Control>-C now." +-read file +- +-if test "x$file" = "x"; then +- echo "Using .xinitrc as a default value" +- file=.xinitrc +-fi +- ++file=.xinitrc + if [ -f $USERDIR/$file ]; then + mv $USERDIR/$file $USERDIR/$file.old.$DATE + fi diff --git a/source/xap/windowmaker/xinitrc.wmaker b/source/xap/windowmaker/xinitrc.wmaker new file mode 100644 index 00000000..4e28503b --- /dev/null +++ b/source/xap/windowmaker/xinitrc.wmaker @@ -0,0 +1,38 @@ +#!/bin/sh +# $XConsortium: xinitrc.cpp,v 1.4 91/08/22 11:41:34 rws Exp $ + +userresources=$HOME/.Xresources +usermodmap=$HOME/.Xmodmap +sysresources=/usr/X11R6/lib/X11/xinit/.Xresources +sysmodmap=/usr/X11R6/lib/X11/xinit/.Xmodmap + +# merge in defaults and keymaps + +if [ -f $sysresources ]; then + xrdb -merge $sysresources +fi + +if [ -f $sysmodmap ]; then + xmodmap $sysmodmap +fi + +if [ -f $userresources ]; then + xrdb -merge $userresources +fi + +if [ -f $usermodmap ]; then + xmodmap $usermodmap +fi + +# If the user lacks $HOME/GNUstep, install it: +if [ ! -f $HOME/GNUstep/Defaults/WindowMaker ]; then + wmaker.inst +fi + +# Test for cpp, which wmaker uses to process config files: +if [ ! -x /usr/bin/cpp ]; then + NOCPP="--no-cpp" +fi + +# Start the window manager: +exec /usr/bin/wmaker $NOCPP diff --git a/source/xap/x11-ssh-askpass/README b/source/xap/x11-ssh-askpass/README new file mode 100644 index 00000000..e1247b38 --- /dev/null +++ b/source/xap/x11-ssh-askpass/README @@ -0,0 +1,10 @@ +x11-ssh-askpass is an X11-based passphrase dialog for use with OpenSSH. + +To utilize this service, you will need a private SSH key in ~/.ssh/ +If you log on using kdm, then just create a ~/.xprofile with the +contents of /usr/doc/x11-ssh-askpass-1.2.4.1/xprofile.sample + +If you are launching X from console (with startx), then you can edit your +~/.xinitrc to source ~/.xprofile or just add the contents of ~/.xprofile +to ~/.xinitrc to it. Of course, there are other acceptable ways to do +the same thing - gurus can roll their own. diff --git a/source/xap/x11-ssh-askpass/slack-desc b/source/xap/x11-ssh-askpass/slack-desc new file mode 100644 index 00000000..d467253f --- /dev/null +++ b/source/xap/x11-ssh-askpass/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler---------------------------------------------| +x11-ssh-askpass: x11-ssh-askpass (an X11-based passphrase dialog) +x11-ssh-askpass: +x11-ssh-askpass: x11-ssh-askpass is an X11-based passphrase dialog for use +x11-ssh-askpass: with OpenSSH. +x11-ssh-askpass: +x11-ssh-askpass: +x11-ssh-askpass: +x11-ssh-askpass: +x11-ssh-askpass: +x11-ssh-askpass: +x11-ssh-askpass: diff --git a/source/xap/x11-ssh-askpass/x11-ssh-askpass.SlackBuild b/source/xap/x11-ssh-askpass/x11-ssh-askpass.SlackBuild new file mode 100755 index 00000000..837b7f8a --- /dev/null +++ b/source/xap/x11-ssh-askpass/x11-ssh-askpass.SlackBuild @@ -0,0 +1,67 @@ +#!/bin/sh + +# Slackware build script for x11-ssh-askpass +# Written by "Vincent Batts <vbatts@batts.mine.nu>" + +# Modified by Robby Workman <rworkman@slackbuilds.org> + +VERSION=1.2.4.1 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} +TAG=${TAG:-} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-x11-ssh-askpass +OUTPUT=${OUTPUT:-/tmp} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +rm -rf $PKG +mkdir -p $TMP $PKG $OUTPUT +cd $TMP +rm -rf x11-ssh-askpass-$VERSION +tar xvf $CWD/x11-ssh-askpass-$VERSION.tar.gz +cd x11-ssh-askpass-$VERSION +chown -R root:root . +chmod -R a-s,u+rw,go+r-w . + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --with-app-defaults-dir=/etc/X11/app-defaults + +xmkmf || exit 1 +make includes || exit 1 +make || exit 1 +make install DESTDIR=$PKG || exit 1 +make install.man DESTDIR=$PKG || exit 1 + +( cd $PKG + find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null || true + find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null +) + +gzip -9 $PKG/usr/man/man1/x11-ssh-askpass.1x + +mkdir -p $PKG/usr/doc/x11-ssh-askpass-$VERSION +cp README $CWD/xprofile.sample $PKG/usr/doc/x11-ssh-askpass-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $OUTPUT/x11-ssh-askpass-$VERSION-$ARCH-$BUILD$TAG.txz diff --git a/source/xap/x11-ssh-askpass/x11-ssh-askpass.info b/source/xap/x11-ssh-askpass/x11-ssh-askpass.info new file mode 100644 index 00000000..3a94bf36 --- /dev/null +++ b/source/xap/x11-ssh-askpass/x11-ssh-askpass.info @@ -0,0 +1,10 @@ +PRGNAM="x11-ssh-askpass" +VERSION="1.2.4.1" +HOMEPAGE="http://www.jmknoble.net/software/x11-ssh-askpass/" +DOWNLOAD="http://www.jmknoble.net/software/x11-ssh-askpass/x11-ssh-askpass-1.2.4.1.tar.gz" +MD5SUM="8f2e41f3f7eaa8543a2440454637f3c3" +DOWNLOAD_x86_64="" +MD5SUM_x86_64="" +MAINTAINER="Vincent Batts" +EMAIL="vbatts@batts.mine.nu" +APPROVED="rworkman" diff --git a/source/xap/x11-ssh-askpass/xprofile.sample b/source/xap/x11-ssh-askpass/xprofile.sample new file mode 100644 index 00000000..dce0eae0 --- /dev/null +++ b/source/xap/x11-ssh-askpass/xprofile.sample @@ -0,0 +1,14 @@ +#!/bin/sh + +usessh=${usessh:-yes} + +if test "$usessh" = "yes" -a -d $HOME/.ssh ; then + SSH_ASKPASS="/usr/libexec/x11-ssh-askpass" + if [ -x $SSH_ASKPASS ] ; then + export SSH_ASKPASS + ssh-agent > $HOME/.ssh/agent + . $HOME/.ssh/agent + ssh-add + fi +fi + diff --git a/source/xap/x3270/doinst.sh b/source/xap/x3270/doinst.sh new file mode 100644 index 00000000..049c91e4 --- /dev/null +++ b/source/xap/x3270/doinst.sh @@ -0,0 +1,24 @@ +#!/bin/sh +config() { + NEW="$1" + OLD="`dirname $NEW`/`basename $NEW .new`" + # If there's no config file by that name, mv it over: + if [ ! -r $OLD ]; then + mv $NEW $OLD + elif [ "`cat $OLD | md5sum`" = "`cat $NEW | md5sum`" ]; then # toss the redundant copy + rm $NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} +config etc/X11/x3270/ibm_hosts.new + +# Update the X font indexes: +if [ -x /usr/bin/mkfontdir -o -x /usr/X11R6/bin/mkfontdir ]; then + ( cd /usr/share/fonts/misc + mkfontscale . + mkfontdir -e /usr/share/fonts/encodings -e /usr/share/fonts/encodings/large . + ) +fi +if [ -x /usr/bin/fc-cache ]; then + /usr/bin/fc-cache -f +fi diff --git a/source/xap/x3270/slack-desc b/source/xap/x3270/slack-desc new file mode 100644 index 00000000..15eff71d --- /dev/null +++ b/source/xap/x3270/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +x3270: x3270 (IBM host access tool for X) +x3270: +x3270: x3270 opens a telnet connection to an IBM host in an X window. Since +x3270: the window created by x3270 can use its own font for displaying +x3270: characters, is a fairly accurate representation of an IBM 3278. +x3270: +x3270: +x3270: +x3270: +x3270: +x3270: diff --git a/source/xap/x3270/x3270.SlackBuild b/source/xap/x3270/x3270.SlackBuild new file mode 100755 index 00000000..225142a2 --- /dev/null +++ b/source/xap/x3270/x3270.SlackBuild @@ -0,0 +1,89 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +TARBVER=3.3.7p8 +VERSION=3.3.7p8 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-x3270 + +rm -rf $PKG +mkdir -p $TMP $PKG +cd $TMP +rm -rf x3270-$VERSION +tar xvf $CWD/x3270-$TARBVER.tar.bz2 || exit 1 +cd x3270-3.3 || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +./configure \ + --prefix=/usr \ + --sysconfdir=/etc/X11 \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG + +mv $PKG/etc/X11/x3270/ibm_hosts $PKG/etc/X11/x3270/ibm_hosts.new +find $PKG -name fonts.dir -exec rm {} \; +if [ -d $PKG/usr/lib/X11/fonts/misc ]; then + mkdir -p $PKG/usr/share/fonts + mv $PKG/usr/lib/X11/fonts/misc $PKG/usr/share/fonts + rmdir $PKG/usr/lib/X11/fonts/misc 2> /dev/null + rmdir $PKG/usr/lib/X11/fonts 2> /dev/null + rmdir $PKG/usr/lib/X11 2> /dev/null + rmdir $PKG/usr/lib 2> /dev/null +fi + +mkdir -p $PKG/etc/X11/app-defaults +cat X3270.xad > $PKG/etc/X11/app-defaults/X3270 + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/usr/man/man{1,5} +for file in x3270-script.man x3270.man x3270if.man ; do + cat $file | gzip -9c > $PKG/usr/man/man1/`basename $file .man`.1.gz +done +cat ibm_hosts.man | gzip -9c > $PKG/usr/man/man5/ibm_hosts.5.gz + +mkdir -p $PKG/usr/doc/x3270-$VERSION +cp -a \ + LICENSE README* Examples html \ + $PKG/usr/doc/x3270-$VERSION + +mkdir -p $PKG/install +zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/x3270-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xchat/patches/patches.url b/source/xap/xchat/patches/patches.url new file mode 100644 index 00000000..33531f7c --- /dev/null +++ b/source/xap/xchat/patches/patches.url @@ -0,0 +1 @@ +http://xchat.org/files/source/2.8/patches/ diff --git a/source/xap/xchat/patches/xc286-smallfixes.diff b/source/xap/xchat/patches/xc286-smallfixes.diff new file mode 100644 index 00000000..da900152 --- /dev/null +++ b/source/xap/xchat/patches/xc286-smallfixes.diff @@ -0,0 +1,68 @@ +# +# Various small fixes from CVS that are considered safe to apply to 2.8.6. +# +--- xchat-2.8.6/src/common/cfgfiles.c 2008-02-05 21:02:47.000000000 +1100 ++++ xchat-2.8.6p1/src/common/cfgfiles.c 2008-06-15 13:45:43.000000000 +1000 +@@ -886,7 +886,6 @@ + set_showval (session *sess, const struct prefs *var, char *tbuf) + { + int len, dots, j; +- static const char *offon[] = { "OFF", "ON" }; + + len = strlen (var->name); + memcpy (tbuf, var->name, len); +@@ -909,8 +908,10 @@ + *((int *) &prefs + var->offset)); + break; + case TYPE_BOOL: +- sprintf (tbuf + len, "\0033:\017 %s\n", offon[ +- *((int *) &prefs + var->offset)]); ++ if (*((int *) &prefs + var->offset)) ++ sprintf (tbuf + len, "\0033:\017 %s\n", "ON"); ++ else ++ sprintf (tbuf + len, "\0033:\017 %s\n", "OFF"); + break; + } + PrintText (sess, tbuf); +--- xchat-2.8.6/src/common/chanopt.c 2008-06-10 22:00:55.000000000 +1000 ++++ xchat-2.8.6p1/src/common/chanopt.c 2008-06-15 13:48:04.000000000 +1000 +@@ -32,7 +32,7 @@ + + #define S_F(xx) STRUCT_OFFSET_STR(struct session,xx) + +-channel_options chanopt[] = ++static const channel_options chanopt[] = + { + {"alert_beep", "BEEP", S_F(alert_beep)}, + {"alert_taskbar", NULL, S_F(alert_taskbar)}, +--- xchat-2.8.6/src/common/servlist.c 2008-04-01 19:22:34.000000000 +1100 ++++ xchat-2.8.6p1/src/common/servlist.c 2008-06-15 13:57:41.000000000 +1000 +@@ -509,6 +509,8 @@ + list = g_slist_nth (net->servlist, net->selected); + if (!list) + list = net->servlist; ++ if (!list) ++ return; + ircserv = list->data; + + /* incase a protocol switch is added to the servlist gui */ +--- xchat-2.8.6/src/common/text.c 2008-03-28 13:20:04.000000000 +1100 ++++ xchat-2.8.6p1/src/common/text.c 2008-06-15 13:59:59.000000000 +1000 +@@ -216,7 +216,7 @@ + static void + scrollback_save (session *sess, char *text) + { +- char buf[1024]; ++ char buf[512 * 4]; + time_t stamp; + int len; + +@@ -266,7 +266,7 @@ + scrollback_load (session *sess) + { + int fh; +- char buf[1024]; ++ char buf[512 * 4]; + char *text; + time_t stamp; + int lines; diff --git a/source/xap/xchat/patches/xchat.gtk_2_14.diff b/source/xap/xchat/patches/xchat.gtk_2_14.diff new file mode 100644 index 00000000..f0a42a1c --- /dev/null +++ b/source/xap/xchat/patches/xchat.gtk_2_14.diff @@ -0,0 +1,191 @@ +diff -ur xchat-2.8.6.orig/src/fe-gtk/about.c xchat-2.8.6/src/fe-gtk/about.c +--- xchat-2.8.6.orig/src/fe-gtk/about.c 2008-04-01 10:58:38.000000000 +0200 ++++ xchat-2.8.6/src/fe-gtk/about.c 2008-10-12 14:12:59.329706289 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <stdlib.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/ascii.c xchat-2.8.6/src/fe-gtk/ascii.c +--- xchat-2.8.6.orig/src/fe-gtk/ascii.c 2008-02-05 11:02:50.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/ascii.c 2008-10-12 14:12:59.329706289 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <stdlib.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/banlist.c xchat-2.8.6/src/fe-gtk/banlist.c +--- xchat-2.8.6.orig/src/fe-gtk/banlist.c 2008-02-05 11:02:50.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/banlist.c 2008-10-12 14:12:59.329706289 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <stdlib.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/fe-gtk.c xchat-2.8.6/src/fe-gtk/fe-gtk.c +--- xchat-2.8.6.orig/src/fe-gtk/fe-gtk.c 2008-02-24 09:39:44.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/fe-gtk.c 2008-10-12 14:12:59.339702951 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <string.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/ignoregui.c xchat-2.8.6/src/fe-gtk/ignoregui.c +--- xchat-2.8.6.orig/src/fe-gtk/ignoregui.c 2008-02-05 11:02:52.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/ignoregui.c 2008-10-12 14:12:59.343034799 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <stdlib.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/maingui.c xchat-2.8.6/src/fe-gtk/maingui.c +--- xchat-2.8.6.orig/src/fe-gtk/maingui.c 2008-04-01 10:53:41.000000000 +0200 ++++ xchat-2.8.6/src/fe-gtk/maingui.c 2008-10-12 14:12:59.349699891 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdlib.h> + #include <string.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/menu.c xchat-2.8.6/src/fe-gtk/menu.c +--- xchat-2.8.6.orig/src/fe-gtk/menu.c 2008-06-08 09:59:37.000000000 +0200 ++++ xchat-2.8.6/src/fe-gtk/menu.c 2008-10-12 14:12:59.349699891 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <stdlib.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/notifygui.c xchat-2.8.6/src/fe-gtk/notifygui.c +--- xchat-2.8.6.orig/src/fe-gtk/notifygui.c 2008-02-05 11:03:34.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/notifygui.c 2008-10-12 14:12:59.363033500 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <stdlib.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/palette.c xchat-2.8.6/src/fe-gtk/palette.c +--- xchat-2.8.6.orig/src/fe-gtk/palette.c 2008-02-05 11:02:52.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/palette.c 2008-10-12 14:12:59.363033500 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <stdlib.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/pixmaps.c xchat-2.8.6/src/fe-gtk/pixmaps.c +--- xchat-2.8.6.orig/src/fe-gtk/pixmaps.c 2008-02-05 11:02:52.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/pixmaps.c 2008-10-12 14:12:59.363033500 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <string.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/plugingui.c xchat-2.8.6/src/fe-gtk/plugingui.c +--- xchat-2.8.6.orig/src/fe-gtk/plugingui.c 2008-02-05 11:02:52.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/plugingui.c 2008-10-12 14:12:59.363033500 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <string.h> + #include <stdio.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/rawlog.c xchat-2.8.6/src/fe-gtk/rawlog.c +--- xchat-2.8.6.orig/src/fe-gtk/rawlog.c 2008-02-24 05:49:37.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/rawlog.c 2008-10-12 14:12:59.366369608 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <string.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/search.c xchat-2.8.6/src/fe-gtk/search.c +--- xchat-2.8.6.orig/src/fe-gtk/search.c 2008-02-05 11:02:53.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/search.c 2008-10-12 14:12:59.369703062 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <string.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/urlgrab.c xchat-2.8.6/src/fe-gtk/urlgrab.c +--- xchat-2.8.6.orig/src/fe-gtk/urlgrab.c 2008-02-05 11:02:53.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/urlgrab.c 2008-10-12 14:12:59.376368714 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <string.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/userlistgui.c xchat-2.8.6/src/fe-gtk/userlistgui.c +--- xchat-2.8.6.orig/src/fe-gtk/userlistgui.c 2008-02-05 11:02:53.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/userlistgui.c 2008-10-12 14:12:59.379703216 +0200 +@@ -16,7 +16,7 @@ + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +-#define GTK_DISABLE_DEPRECATED ++/* #define GTK_DISABLE_DEPRECATED */ + + #include <stdio.h> + #include <string.h> +diff -ur xchat-2.8.6.orig/src/fe-gtk/xtext.h xchat-2.8.6/src/fe-gtk/xtext.h +--- xchat-2.8.6.orig/src/fe-gtk/xtext.h 2008-02-24 05:48:02.000000000 +0100 ++++ xchat-2.8.6/src/fe-gtk/xtext.h 2008-10-12 14:10:49.203049619 +0200 +@@ -1,6 +1,7 @@ + #ifndef __XTEXT_H__ + #define __XTEXT_H__ + ++#include <gtk/gtktypeutils.h> + #include <gtk/gtkadjustment.h> + #ifdef USE_XFT + #include <X11/Xft/Xft.h> diff --git a/source/xap/xchat/slack-desc b/source/xap/xchat/slack-desc new file mode 100644 index 00000000..70c75e67 --- /dev/null +++ b/source/xap/xchat/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xchat: xchat (GTK+-based IRC client) +xchat: +xchat: X-Chat is a GTK+-based IRC (Internet Relay Chat) client. +xchat: +xchat: +xchat: +xchat: +xchat: +xchat: +xchat: +xchat: diff --git a/source/xap/xchat/xchat.SlackBuild b/source/xap/xchat/xchat.SlackBuild new file mode 100755 index 00000000..1f05472b --- /dev/null +++ b/source/xap/xchat/xchat.SlackBuild @@ -0,0 +1,114 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=2.8.6 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-3} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xchat +rm -rf $PKG +mkdir -p $TMP $PKG/usr + +cd $TMP +rm -rf xchat-$VERSION +tar xvf $CWD/xchat-$VERSION.tar.bz2 || exit 1 +cd xchat-$VERSION || exit 1 +if [ -d $CWD/patches ]; then + for file in $CWD/patches/*.diff.gz ; do + zcat $file | patch -p1 --verbose || exit 1 + done +fi +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --localstatedir=/var/lib \ + --enable-tcl=/usr/lib${LIBDIRSUFFIX} \ + --enable-ipv6 \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/usr/doc/xchat-$VERSION +cp -a \ + AUTHORS COPYING HACKING INSTALL README \ + $PKG/usr/doc/xchat-$VERSION + +# In case they ever add this stuff: + +# Compress and if needed symlink the man pages: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + +# Compress info pages and purge "dir" file from the package: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $TMP/package-xchat +/sbin/makepkg -l y -c n $TMP/xchat-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xfce/patches/exo_quoting_fix.diff b/source/xap/xfce/patches/exo_quoting_fix.diff new file mode 100644 index 00000000..ac654457 --- /dev/null +++ b/source/xap/xfce/patches/exo_quoting_fix.diff @@ -0,0 +1,66 @@ +Index: exo-open/main.c +=================================================================== +--- exo-open/main.c (revision 30250) ++++ exo-open/main.c (revision 30251) +@@ -36,7 +36,17 @@ + #include <exo/exo.h> + + ++/** ++ * For testing this code the following commands should work: ++ * ++ * exo-open --launch WebBrowser http://xfce.org (bug #5461). ++ * exo-open http://xfce.org ++ * exo-open --launch TerminalEmulator ./script.sh 'something with a space' 'nospace' (bug #5132). ++ * exo-open --launch TerminalEmulator ssh -l username some.host.com ++ **/ + ++ ++ + static gboolean opt_help = FALSE; + static gboolean opt_version = FALSE; + static gchar *opt_launch = NULL; +@@ -143,6 +153,8 @@ + { + if (argc > 1) + { ++ /* NOTE: see the comment at the top of this document! */ ++ + /* combine all specified parameters to one parameter string */ + join = g_string_new (NULL); + for (i = 1; argv[i] != NULL; i++) +@@ -150,11 +162,18 @@ + /* separate the arguments */ + if (i > 1) + join = g_string_append_c (join, ' '); +- +- /* append the quoted argument */ +- quoted = g_shell_quote (argv[i]); +- join = g_string_append (join, quoted); +- g_free (quoted); ++ ++ /* only quote arguments with spaces */ ++ if (strchr (argv[i], ' ') != NULL) ++ { ++ quoted = g_shell_quote (argv[i]); ++ join = g_string_append (join, quoted); ++ g_free (quoted); ++ } ++ else ++ { ++ join = g_string_append (join, argv[i]); ++ } + } + parameter = g_string_free (join, FALSE); + } +@@ -163,6 +182,10 @@ + parameter = NULL; + } + ++#ifndef NDEBUG ++ g_message ("launch=%s, wd=%s, parameters (%d)=%s", opt_launch, opt_working_directory, argc, parameter); ++#endif ++ + /* run the preferred application */ + if (!exo_execute_preferred_application (opt_launch, parameter, opt_working_directory, NULL, &err)) + { diff --git a/source/xap/xfce/patches/launcher-plugin-migrate-icon-cat.diff b/source/xap/xfce/patches/launcher-plugin-migrate-icon-cat.diff new file mode 100644 index 00000000..4370281a --- /dev/null +++ b/source/xap/xfce/patches/launcher-plugin-migrate-icon-cat.diff @@ -0,0 +1,48 @@ +diff --git a/plugins/launcher/launcher.c b/plugins/launcher/launcher.c +index 8edc66c..1e370c4 100644 +--- a/plugins/launcher/launcher.c ++++ b/plugins/launcher/launcher.c +@@ -37,6 +37,30 @@ + #include "launcher-exec.h" + #include "launcher-dialog.h" + ++/* for 4.4 settings migration */ ++static const gchar *icon_category_map[] = { ++ "applications-other", ++ "accessories-text-editor", ++ "system-file-manager", ++ "applications-accessories", ++ "applications-games", ++ "help-browser", ++ "applications-multimedia", ++ "applications-internet", ++ "applications-graphics", ++ "printer", ++ "office-calendar", ++ "applications-office", ++ "audio-card", ++ "utilities-terminal", ++ "applications-development", ++ "preferences-desktop", ++ "applications-system", ++ "applications-other", ++ "applications-accessories", ++}; ++#define ICON_CATEGORY_MAP_MAX (G_N_ELEMENTS (icon_category_map) - 1) ++ + /* prototypes */ + static void launcher_utility_icon_theme_changed (GtkIconTheme *icon_theme, + LauncherPlugin *launcher); +@@ -1216,6 +1240,12 @@ launcher_plugin_read (LauncherPlugin *launcher) + entry->name = launcher_plugin_read_entry (rc, "Name"); + entry->comment = launcher_plugin_read_entry (rc, "Comment"); + entry->icon = launcher_plugin_read_entry (rc, "Icon"); ++ if (G_UNLIKELY (!entry->icon)) ++ { ++ gint icon_category = xfce_rc_read_int_entry (rc, "X-XFCE-IconCategory", -1); ++ if (G_LIKELY (icon_category >= 0 && icon_category <= ICON_CATEGORY_MAP_MAX)) ++ entry->icon = g_strdup (icon_category_map[icon_category]); ++ } + entry->exec = launcher_plugin_read_entry (rc, "Exec"); + entry->path = launcher_plugin_read_entry (rc, "Path"); + diff --git a/source/xap/xfce/patches/migrate-itheme-smartly.diff b/source/xap/xfce/patches/migrate-itheme-smartly.diff new file mode 100644 index 00000000..e9c66ed2 --- /dev/null +++ b/source/xap/xfce/patches/migrate-itheme-smartly.diff @@ -0,0 +1,92 @@ +Index: scripts/xfconf-migration-4.6.pl.in +=================================================================== +--- a/scripts/xfconf-migration-4.6.pl.in (revision 29645) ++++ b/scripts/xfconf-migration-4.6.pl.in (working copy) +@@ -256,6 +256,77 @@ + return $mcs.'.xml'; + } + ++sub icon_theme_exists ++{ ++ my ($dirref,$themename) = @_; ++ my @dirs = @{$dirref}; ++ ++ foreach my $d (@dirs) { ++ return 1 if(-f "$d/$themename/index.theme"); ++ } ++ ++ return 0; ++} ++ ++sub migrate_icon_theme ++{ ++ my ($ref,$chan) = @_; ++ my %opts = %{$ref}; ++ my $opt = 'Net/IconThemeName'; ++ ++ return if(!defined($opts{$opt})); ++ my $val = $opts{$opt}->{'value'}; ++ ++ if(lc($val) eq 'rodent') { ++ # we don't ship rodent anymore, so try to find something suitable ++ my @icondirs; ++ if(defined($ENV{'XDG_DATA_HOME'})) { ++ @icondirs = ( $ENV{'XDG_DATA_HOME'} . '/icons' ); ++ } else { ++ @icondirs = ( $ENV{'HOME'} . '/.local/share/icons' ); ++ } ++ ++ if(defined($ENV{'XDG_DATA_DIRS'})) { ++ push(@icondirs, split(/:/, $ENV{'XDG_DATA_DIRS'})); ++ } else { ++ push(@icondirs, ( '/usr/share/icons', '/usr/local/share/icons' )); ++ } ++ ++ $val = undef; ++ foreach my $itheme (('Tango', 'gnome', 'crystalsvg')) { ++ if(icon_theme_exists(\@icondirs, $itheme)) { ++ $val = $itheme; ++ last; ++ } ++ } ++ ++ if(!defined($val)) { ++ # pick the first one that is not 'hicolor' ++ foreach my $d (@icondirs) { ++ opendir(DIR, $d) and do { ++ my @subdirs = grep { $_ ne 'hicolor' && -d "$d/$_" } readdir(DIR); ++ foreach my $sd (@subdirs) { ++ if(-f "$d/$sd/index.theme") { ++ $val = $sd; ++ last; ++ } ++ } ++ closedir(DIR); ++ }; ++ last if(defined($val)); ++ } ++ ++ if(!defined($val)) { ++ # ok, their system is kinda b0rked; not much we can do ++ warn("Couldn't find a suitable icon theme to migrate to"); ++ return; ++ } ++ } ++ } ++ ++ xfconf_set($chan, 'string', '/Net/IconThemeName', $val); ++} ++ + sub migrate_xsettings + { + my $mcs = 'gtk'; +@@ -283,8 +354,7 @@ + '/Net/CursorBlinkTime', 'int'); + save_xfconf_prop($ref, $chan, 'Net/DndDragThreshold', + '/Net/DndDragThreshold', 'int'); +- save_xfconf_prop($ref, $chan, 'Net/IconThemeName', +- '/Net/IconThemeName', 'string'); ++ migrate_icon_theme($ref, $chan); + save_xfconf_prop($ref, $chan, 'Net/ThemeName', + '/Net/ThemeName', 'string'); + diff --git a/source/xap/xfce/patches/terminal-0.4.0-fixup_docdir.diff b/source/xap/xfce/patches/terminal-0.4.0-fixup_docdir.diff new file mode 100644 index 00000000..d9608470 --- /dev/null +++ b/source/xap/xfce/patches/terminal-0.4.0-fixup_docdir.diff @@ -0,0 +1,132 @@ +diff -Nur Terminal-0.4.0.orig/Makefile.in Terminal-0.4.0/Makefile.in +--- Terminal-0.4.0.orig/Makefile.in 2009-07-20 13:04:04.000000000 -0500 ++++ Terminal-0.4.0/Makefile.in 2009-07-20 13:50:20.529864039 -0500 +@@ -986,7 +986,7 @@ + + TerminalHelp: TerminalHelp.in Makefile + rm -f TerminalHelp.gen TerminalHelp +- sed -e "s,\@datadir\@,$(datadir),g" \ ++ sed -e "s,\@docdir\@,$(docdir),g" \ + < $(srcdir)/TerminalHelp.in \ + > TerminalHelp.gen + mv TerminalHelp.gen TerminalHelp +diff -Nur Terminal-0.4.0.orig/TerminalHelp.in Terminal-0.4.0/TerminalHelp.in +--- Terminal-0.4.0.orig/TerminalHelp.in 2009-07-20 13:03:50.000000000 -0500 ++++ Terminal-0.4.0/TerminalHelp.in 2009-07-20 13:50:20.529864039 -0500 +@@ -19,7 +19,7 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # + +-HELPDIR="@datadir@/doc/Terminal/" ++HELPDIR="@docdir@/" + + if test -n "$LC_ALL"; then + LC=$LC_ALL +diff -Nur Terminal-0.4.0.orig/doc/C/Makefile.in Terminal-0.4.0/doc/C/Makefile.in +--- Terminal-0.4.0.orig/doc/C/Makefile.in 2009-07-20 13:04:02.000000000 -0500 ++++ Terminal-0.4.0/doc/C/Makefile.in 2009-07-20 13:50:20.533867320 -0500 +@@ -260,7 +260,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Terminal/C ++TARGET_DIR = $(docdir)/C + STYLESHEET = ../terminal.xsl + DOCUMENT = Terminal.xml + +diff -Nur Terminal-0.4.0.orig/doc/C/images/Makefile.in Terminal-0.4.0/doc/C/images/Makefile.in +--- Terminal-0.4.0.orig/doc/C/images/Makefile.in 2009-07-20 13:04:02.000000000 -0500 ++++ Terminal-0.4.0/doc/C/images/Makefile.in 2009-07-20 13:50:20.533867320 -0500 +@@ -240,7 +240,7 @@ + top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ +-imagesdir = $(datadir)/doc/Terminal/C/images ++imagesdir = $(docdir)/C/images + images_DATA = \ + terminal-compose-shortcut.png \ + terminal-edit-preferences.png \ +diff -Nur Terminal-0.4.0.orig/doc/Makefile.in Terminal-0.4.0/doc/Makefile.in +--- Terminal-0.4.0.orig/doc/Makefile.in 2009-07-20 13:04:02.000000000 -0500 ++++ Terminal-0.4.0/doc/Makefile.in 2009-07-20 13:51:00.229192942 -0500 +@@ -286,7 +286,7 @@ + fr \ + ja + +-cssdir = $(datadir)/doc/Terminal ++cssdir = $(docdir)/ + css_DATA = \ + terminal.css + +diff -Nur Terminal-0.4.0.orig/doc/da/Makefile.in Terminal-0.4.0/doc/da/Makefile.in +--- Terminal-0.4.0.orig/doc/da/Makefile.in 2009-07-20 13:04:02.000000000 -0500 ++++ Terminal-0.4.0/doc/da/Makefile.in 2009-07-20 13:50:20.533867320 -0500 +@@ -260,7 +260,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Terminal/da ++TARGET_DIR = $(docdir)/da + STYLESHEET = ../terminal.xsl + DOCUMENT = Terminal.xml + +diff -Nur Terminal-0.4.0.orig/doc/da/images/Makefile.in Terminal-0.4.0/doc/da/images/Makefile.in +--- Terminal-0.4.0.orig/doc/da/images/Makefile.in 2009-07-20 13:04:02.000000000 -0500 ++++ Terminal-0.4.0/doc/da/images/Makefile.in 2009-07-20 13:50:20.533867320 -0500 +@@ -240,7 +240,7 @@ + top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ +-imagesdir = $(datadir)/doc/Terminal/da/images ++imagesdir = $(docdir)/da/images + images_DATA = \ + terminal-compose-shortcut.png \ + terminal-edit-preferences.png \ +diff -Nur Terminal-0.4.0.orig/doc/fr/Makefile.in Terminal-0.4.0/doc/fr/Makefile.in +--- Terminal-0.4.0.orig/doc/fr/Makefile.in 2009-07-20 13:04:02.000000000 -0500 ++++ Terminal-0.4.0/doc/fr/Makefile.in 2009-07-20 13:50:20.533867320 -0500 +@@ -260,7 +260,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Terminal/fr ++TARGET_DIR = $(docdir)/fr + STYLESHEET = ../terminal.xsl + DOCUMENT = Terminal.xml + +diff -Nur Terminal-0.4.0.orig/doc/fr/images/Makefile.in Terminal-0.4.0/doc/fr/images/Makefile.in +--- Terminal-0.4.0.orig/doc/fr/images/Makefile.in 2009-07-20 13:04:03.000000000 -0500 ++++ Terminal-0.4.0/doc/fr/images/Makefile.in 2009-07-20 13:50:20.533867320 -0500 +@@ -240,7 +240,7 @@ + top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ +-imagesdir = $(datadir)/doc/Terminal/fr/images ++imagesdir = $(docdir)/fr/images + images_DATA = \ + terminal-compose-shortcut.png \ + terminal-edit-preferences.png \ +diff -Nur Terminal-0.4.0.orig/doc/ja/Makefile.in Terminal-0.4.0/doc/ja/Makefile.in +--- Terminal-0.4.0.orig/doc/ja/Makefile.in 2009-07-20 13:04:03.000000000 -0500 ++++ Terminal-0.4.0/doc/ja/Makefile.in 2009-07-20 13:50:20.537889876 -0500 +@@ -260,7 +260,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Terminal/ja ++TARGET_DIR = $(docdir)/ja + STYLESHEET = ../terminal.xsl + DOCUMENT = Terminal.xml + +diff -Nur Terminal-0.4.0.orig/doc/ja/images/Makefile.in Terminal-0.4.0/doc/ja/images/Makefile.in +--- Terminal-0.4.0.orig/doc/ja/images/Makefile.in 2009-07-20 13:04:03.000000000 -0500 ++++ Terminal-0.4.0/doc/ja/images/Makefile.in 2009-07-20 13:50:20.537889876 -0500 +@@ -240,7 +240,7 @@ + top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ +-imagesdir = $(datadir)/doc/Terminal/ja/images ++imagesdir = $(docdir)/ja/images + images_DATA = \ + terminal-compose-shortcut.png \ + terminal-edit-preferences.png \ diff --git a/source/xap/xfce/patches/thunar-1.0.1-fixup_docdir.diff b/source/xap/xfce/patches/thunar-1.0.1-fixup_docdir.diff new file mode 100644 index 00000000..52d076d9 --- /dev/null +++ b/source/xap/xfce/patches/thunar-1.0.1-fixup_docdir.diff @@ -0,0 +1,360 @@ +diff -Nur Thunar-1.0.1.orig/Makefile.in Thunar-1.0.1/Makefile.in +--- Thunar-1.0.1.orig/Makefile.in 2009-04-18 09:41:09.000000000 -0500 ++++ Thunar-1.0.1/Makefile.in 2009-07-20 19:36:55.895440657 -0500 +@@ -932,7 +932,7 @@ + + ThunarHelp: ThunarHelp.in Makefile + rm -f ThunarHelp.gen ThunarHelp +- sed -e "s,\@datadir\@,$(datadir),g" \ ++ sed -e "s,\@htmldir\@,$(htmldir),g" \ + < $(srcdir)/ThunarHelp.in \ + > ThunarHelp.gen + mv ThunarHelp.gen ThunarHelp +diff -Nur Thunar-1.0.1.orig/ThunarHelp.in Thunar-1.0.1/ThunarHelp.in +--- Thunar-1.0.1.orig/ThunarHelp.in 2008-10-22 01:43:23.000000000 -0500 ++++ Thunar-1.0.1/ThunarHelp.in 2009-07-20 19:36:38.235721255 -0500 +@@ -19,7 +19,7 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # + +-HELPDIR="@datadir@/doc/Thunar/html/" ++HELPDIR="@htmldir@/" + + if test -n "$LC_ALL"; then + LC=$LC_ALL +diff -Nur Thunar-1.0.1.orig/docs/Makefile.in Thunar-1.0.1/docs/Makefile.in +--- Thunar-1.0.1.orig/docs/Makefile.in 2009-04-18 09:40:14.000000000 -0500 ++++ Thunar-1.0.1/docs/Makefile.in 2009-07-20 19:36:38.235721255 -0500 +@@ -292,7 +292,7 @@ + builddir = @builddir@ + datadir = @datadir@ + datarootdir = @datarootdir@ +-docdir = $(datadir)/doc/Thunar ++docdir = @docdir@ + dvidir = @dvidir@ + exec_prefix = @exec_prefix@ + host = @host@ +diff -Nur Thunar-1.0.1.orig/docs/manual/C/Makefile.in Thunar-1.0.1/docs/manual/C/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/C/Makefile.in 2009-04-18 09:40:19.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/C/Makefile.in 2009-07-20 19:36:38.235721255 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/C ++TARGET_DIR = $(htmldir)/C + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/C/images/Makefile.in Thunar-1.0.1/docs/manual/C/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/C/images/Makefile.in 2009-04-18 09:40:21.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/C/images/Makefile.in 2009-07-20 19:36:38.235721255 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/C/images ++imagesdir = $(htmldir)/C/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/Makefile.in Thunar-1.0.1/docs/manual/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/Makefile.in 2009-04-18 09:40:22.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/Makefile.in 2009-07-20 19:36:38.235721255 -0500 +@@ -338,7 +338,7 @@ + tr \ + zh_TW + +-cssdir = $(datadir)/doc/Thunar/html ++cssdir = $(htmldir) + css_DATA = \ + thunar.css + +diff -Nur Thunar-1.0.1.orig/docs/manual/da/Makefile.in Thunar-1.0.1/docs/manual/da/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/da/Makefile.in 2009-04-18 09:40:22.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/da/Makefile.in 2009-07-20 19:36:38.239694094 -0500 +@@ -317,7 +317,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/da ++TARGET_DIR = $(htmldir)/da + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/da/images/Makefile.in Thunar-1.0.1/docs/manual/da/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/da/images/Makefile.in 2009-04-18 09:40:24.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/da/images/Makefile.in 2009-07-20 19:36:38.239694094 -0500 +@@ -311,7 +311,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/da/images ++imagesdir = $(htmldir)/da/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/es/Makefile.in Thunar-1.0.1/docs/manual/es/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/es/Makefile.in 2009-04-18 09:40:24.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/es/Makefile.in 2009-07-20 19:36:38.239694094 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/es ++TARGET_DIR = $(htmldir)/es + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/es/images/Makefile.in Thunar-1.0.1/docs/manual/es/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/es/images/Makefile.in 2009-04-18 09:40:25.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/es/images/Makefile.in 2009-07-20 19:36:38.239694094 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/es/images ++imagesdir = $(htmldir)/es/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/eu/Makefile.in Thunar-1.0.1/docs/manual/eu/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/eu/Makefile.in 2009-04-18 09:40:25.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/eu/Makefile.in 2009-07-20 19:36:38.239694094 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/eu ++TARGET_DIR = $(htmldir)/eu + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/eu/images/Makefile.in Thunar-1.0.1/docs/manual/eu/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/eu/images/Makefile.in 2009-04-18 09:40:26.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/eu/images/Makefile.in 2009-07-20 19:36:38.239694094 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/eu/images ++imagesdir = $(htmldir)/eu/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/fr/Makefile.in Thunar-1.0.1/docs/manual/fr/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/fr/Makefile.in 2009-04-18 09:40:26.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/fr/Makefile.in 2009-07-20 19:36:38.243692845 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/fr ++TARGET_DIR = $(htmldir)/fr + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/fr/images/Makefile.in Thunar-1.0.1/docs/manual/fr/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/fr/images/Makefile.in 2009-04-18 09:40:27.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/fr/images/Makefile.in 2009-07-20 19:36:38.243692845 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/fr/images ++imagesdir = $(htmldir)/fr/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/gl/Makefile.in Thunar-1.0.1/docs/manual/gl/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/gl/Makefile.in 2009-04-18 09:40:27.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/gl/Makefile.in 2009-07-20 19:36:38.243692845 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/gl ++TARGET_DIR = $(htmldir)/gl + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/gl/images/Makefile.in Thunar-1.0.1/docs/manual/gl/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/gl/images/Makefile.in 2009-04-18 09:40:29.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/gl/images/Makefile.in 2009-07-20 19:36:38.243692845 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/C/images ++imagesdir = $(htmldir)/C/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/it/Makefile.in Thunar-1.0.1/docs/manual/it/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/it/Makefile.in 2009-04-18 09:40:30.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/it/Makefile.in 2009-07-20 19:36:38.243692845 -0500 +@@ -317,7 +317,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/it ++TARGET_DIR = $(htmldir)/it + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/it/images/Makefile.in Thunar-1.0.1/docs/manual/it/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/it/images/Makefile.in 2009-04-18 09:40:31.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/it/images/Makefile.in 2009-07-20 19:36:38.243692845 -0500 +@@ -311,7 +311,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/it/images ++imagesdir = $(htmldir)/it/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/ja/Makefile.in Thunar-1.0.1/docs/manual/ja/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/ja/Makefile.in 2009-04-18 09:40:32.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/ja/Makefile.in 2009-07-20 19:36:38.247717296 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/ja ++TARGET_DIR = $(htmldir)/ja + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/ja/images/Makefile.in Thunar-1.0.1/docs/manual/ja/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/ja/images/Makefile.in 2009-04-18 09:40:33.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/ja/images/Makefile.in 2009-07-20 19:36:38.247717296 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/ja/images ++imagesdir = $(htmldir)/ja/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/nl/Makefile.in Thunar-1.0.1/docs/manual/nl/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/nl/Makefile.in 2009-04-18 09:40:34.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/nl/Makefile.in 2009-07-20 19:36:38.247717296 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/nl ++TARGET_DIR = $(htmldir)/nl + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/nl/images/Makefile.in Thunar-1.0.1/docs/manual/nl/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/nl/images/Makefile.in 2009-04-18 09:40:34.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/nl/images/Makefile.in 2009-07-20 19:36:38.247717296 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/nl/images ++imagesdir = $(htmldir)/nl/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/pl/Makefile.in Thunar-1.0.1/docs/manual/pl/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/pl/Makefile.in 2009-04-18 09:40:34.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/pl/Makefile.in 2009-07-20 19:36:38.247717296 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/pl ++TARGET_DIR = $(htmldir)/pl + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/pl/images/Makefile.in Thunar-1.0.1/docs/manual/pl/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/pl/images/Makefile.in 2009-04-18 09:40:34.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/pl/images/Makefile.in 2009-07-20 19:36:38.247717296 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/pl/images ++imagesdir = $(htmldir)/pl/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/ru/Makefile.in Thunar-1.0.1/docs/manual/ru/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/ru/Makefile.in 2009-04-18 09:40:35.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/ru/Makefile.in 2009-07-20 19:36:38.251717303 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/ru ++TARGET_DIR = $(htmldir)/ru + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/ru/images/Makefile.in Thunar-1.0.1/docs/manual/ru/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/ru/images/Makefile.in 2009-04-18 09:40:35.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/ru/images/Makefile.in 2009-07-20 19:36:38.251717303 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/ru/images ++imagesdir = $(htmldir)/ru/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/tr/Makefile.in Thunar-1.0.1/docs/manual/tr/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/tr/Makefile.in 2009-04-18 09:40:35.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/tr/Makefile.in 2009-07-20 19:36:38.251717303 -0500 +@@ -317,7 +317,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/tr ++TARGET_DIR = $(htmldir)/tr + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/tr/images/Makefile.in Thunar-1.0.1/docs/manual/tr/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/tr/images/Makefile.in 2009-04-18 09:40:36.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/tr/images/Makefile.in 2009-07-20 19:36:38.251717303 -0500 +@@ -311,7 +311,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/tr/images ++imagesdir = $(htmldir)/tr/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ +diff -Nur Thunar-1.0.1.orig/docs/manual/zh_TW/Makefile.in Thunar-1.0.1/docs/manual/zh_TW/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/zh_TW/Makefile.in 2009-04-18 09:40:36.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/zh_TW/Makefile.in 2009-07-20 19:36:38.251717303 -0500 +@@ -319,7 +319,7 @@ + SUBDIRS = \ + images + +-TARGET_DIR = $(datadir)/doc/Thunar/html/zh_TW ++TARGET_DIR = $(htmldir)/zh_TW + STYLESHEET = ../thunar.xsl + DOCUMENT = Thunar.xml + +diff -Nur Thunar-1.0.1.orig/docs/manual/zh_TW/images/Makefile.in Thunar-1.0.1/docs/manual/zh_TW/images/Makefile.in +--- Thunar-1.0.1.orig/docs/manual/zh_TW/images/Makefile.in 2009-04-18 09:40:36.000000000 -0500 ++++ Thunar-1.0.1/docs/manual/zh_TW/images/Makefile.in 2009-07-20 19:36:38.251717303 -0500 +@@ -313,7 +313,7 @@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + xfconf_query_found = @xfconf_query_found@ +-imagesdir = $(datadir)/doc/Thunar/html/zh_TW/images ++imagesdir = $(htmldir)/zh_TW/images + images_DATA = \ + bulk-rename.png \ + file-manager-window.png \ diff --git a/source/xap/xfce/patches/xfcalendar.desktop.in.diff b/source/xap/xfce/patches/xfcalendar.desktop.in.diff new file mode 100644 index 00000000..d8826781 --- /dev/null +++ b/source/xap/xfce/patches/xfcalendar.desktop.in.diff @@ -0,0 +1,9 @@ +--- a/xfcalendar.desktop.in 2009-03-01 10:13:10.349305702 -0600 ++++ b/xfcalendar.desktop.in 2009-03-01 10:13:29.564307721 -0600 +@@ -10,4 +10,5 @@ + Terminal=false + Type=Application + Categories=X-XFCE;Office;Calendar;GTK; ++OnlyShowIn=XFCE; + _GenericName=Calendar + diff --git a/source/xap/xfce/patches/xfdesktop-fix_education_icon.diff b/source/xap/xfce/patches/xfdesktop-fix_education_icon.diff new file mode 100644 index 00000000..56a34060 --- /dev/null +++ b/source/xap/xfce/patches/xfdesktop-fix_education_icon.diff @@ -0,0 +1,11 @@ +diff -Nur xfdesktop-4.6.1.orig/modules/menu/directory-data/xfce-education.directory.in xfdesktop-4.6.1/modules/menu/directory-data/xfce-education.directory.in +--- xfdesktop-4.6.1.orig/modules/menu/directory-data/xfce-education.directory.in 2009-01-12 16:03:19.000000000 -0600 ++++ xfdesktop-4.6.1/modules/menu/directory-data/xfce-education.directory.in 2009-07-31 01:04:29.029467762 -0500 +@@ -2,6 +2,6 @@ + Version=1.0 + Encoding=UTF-8 + Type=Directory +-Icon= ++Icon=applications-education + _Name=Education + _Comment=Educational software diff --git a/source/xap/xfce/profile.d/xfce.csh b/source/xap/xfce/profile.d/xfce.csh new file mode 100755 index 00000000..ccc2b8f1 --- /dev/null +++ b/source/xap/xfce/profile.d/xfce.csh @@ -0,0 +1,6 @@ +#!/bin/csh +if ( $?XDG_CONFIG_DIRS ) then + setenv XDG_CONFIG_DIRS ${XDG_CONFIG_DIRS}:/etc/xfce/xdg +else + setenv XDG_CONFIG_DIRS /etc/xdg:/etc/xfce/xdg +endif diff --git a/source/xap/xfce/profile.d/xfce.sh b/source/xap/xfce/profile.d/xfce.sh new file mode 100755 index 00000000..adb187c1 --- /dev/null +++ b/source/xap/xfce/profile.d/xfce.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ ! "$XDG_CONFIG_DIRS" = "" ]; then + XDG_CONFIG_DIRS=$XDG_CONFIG_DIRS:/etc/xfce/xdg +else + XDG_CONFIG_DIRS=/etc/xdg:/etc/xfce/xdg +fi +export XDG_CONFIG_DIRS diff --git a/source/xap/xfce/slack-desc b/source/xap/xfce/slack-desc new file mode 100644 index 00000000..ecedf010 --- /dev/null +++ b/source/xap/xfce/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xfce: xfce (a fast and lightweight desktop environment for X) +xfce: +xfce: Xfce is a fast and lightweight desktop environment that is both +xfce: visually appealing and easy to use. +xfce: +xfce: For more information, see: http://www.xfce.org +xfce: +xfce: Xfce was developed by Olivier Fourdan. +xfce: +xfce: +xfce: diff --git a/source/xap/xfce/xfce.SlackBuild b/source/xap/xfce/xfce.SlackBuild new file mode 100755 index 00000000..2ed8042e --- /dev/null +++ b/source/xap/xfce/xfce.SlackBuild @@ -0,0 +1,201 @@ +#!/bin/sh + +# Copyright 2003 Slackware Linux, Inc., Concord, CA, USA +# Copyright 2007, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +VERSION=4.6.1 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-5} + +# A few tarballs have different versions; handle them here +XDT_VERS=4.6.0 # xfce4-dev-tools version +EXO_VERS=0.3.101 # exo version +THUNAR_VERS=1.0.1 # thunar version +GXE_VERS=2.6.0 # gtk-xfce-engine version +TERM_VERS=0.4.0 # terminal version +MPAD_VERS=0.2.16 # mousepad version +XFWMTHEME_VERS=4.6.0 # xfwm4-themes version + +NUMJOBS=${NUMJOBS:--j6} + +CWD=$(pwd) +TMP=${TMP:-/tmp/xfce-build-dir} +PKG=$TMP/package-xfce + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +rm -rf $PKG +mkdir -p $TMP $PKG +cd $TMP || exit 1 + +COMPRESSION=xz +COMPRESSUTIL=xz + +# The Rodent theme isn't xdg-compliant, so they're not shipping it +# xfce4-icon-theme-$VERSION.tar.$COMPRESSION +# We'll set Tango as the system default instead... + +for file in \ + xfce4-dev-tools-$XDT_VERS.tar.$COMPRESSION \ + libxfce4util-$VERSION.tar.$COMPRESSION \ + xfconf-$VERSION.tar.$COMPRESSION \ + libxfcegui4-$VERSION.tar.$COMPRESSION \ + libxfce4menu-$VERSION.tar.$COMPRESSION \ + exo-$EXO_VERS.tar.$COMPRESSION \ + xfce4-panel-$VERSION.tar.$COMPRESSION \ + Thunar-$THUNAR_VERS.tar.$COMPRESSION \ + xfce4-settings-$VERSION.tar.$COMPRESSION \ + xfce4-session-$VERSION.tar.$COMPRESSION \ + xfdesktop-$VERSION.tar.$COMPRESSION \ + xfwm4-$VERSION.tar.$COMPRESSION \ + xfce-utils-$VERSION.tar.$COMPRESSION \ + xfce4-mixer-$VERSION.tar.$COMPRESSION \ + xfprint-$VERSION.tar.$COMPRESSION \ + xfce4-appfinder-$VERSION.tar.$COMPRESSION \ + gtk-xfce-engine-$GXE_VERS.tar.$COMPRESSION \ + Terminal-$TERM_VERS.tar.$COMPRESSION \ + xfwm4-themes-$XFWMTHEME_VERS.tar.$COMPRESSION \ + mousepad-$MPAD_VERS.tar.$COMPRESSION \ + orage-$VERSION.tar.$COMPRESSION ; +do + $COMPRESSUTIL -dc $CWD/src/$file | tar xvf - || exit 1 + cd $(basename $file .tar.$COMPRESSION) || exit 1 + chown -R root:root . + find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + + # Here's where we patch or set up any other package-specific stuff: + # Patch to only show xfcalendar in XFce (otherwise it shows up in + # KDE's Lost & Found and does not work): + if [ "$file" = "orage-$VERSION.tar.$COMPRESSION" ]; then + zcat $CWD/patches/xfcalendar.desktop.in.diff.gz | patch -p1 || exit 1 + fi + # Fix http://bugzilla.xfce.org/show_bug.cgi?id=5461 + # and enable python bindings in libexo + if [ "$file" = "exo-$EXO_VERS.tar.$COMPRESSION" ]; then + zcat $CWD/patches/exo_fix_quoting.diff.gz | patch -p0 || exit 1 + PACKAGE_SPECIFIC_OPTIONS="--enable-python" + fi + # Make Terminal respect --docdir + if [ "$file" = "Terminal-$TERM_VERS.tar.$COMPRESSION" ]; then + zcat $CWD/patches/terminal-0.4.0-fixup_docdir.diff.gz | patch -p1 || exit 1 + fi + # Make Thunar respect --docdir + if [ "$file" = "Thunar-$THUNAR_VERS.tar.$COMPRESSION" ]; then + zcat $CWD/patches/thunar-1.0.1-fixup_docdir.diff.gz | patch -p1 || exit 1 + fi + # Fix the missing education icon in the desktop menu + if [ "$file" = "xfdesktop-$VERSION.tar.$COMPRESSION" ]; then + zcat $CWD/patches/xfdesktop-fix_education_icon.diff.gz | patch -p1 || exit 1 + fi + # End patches/package-specific stuff + + CFLAGS="$SLKCFLAGS" \ + CXXFLAGS="$SLKCFLAGS" \ + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --sysconfdir=/etc/xfce \ + --mandir=/usr/man \ + --docdir=/usr/doc/xfce-$VERSION/$(basename $file .tar.$COMPRESSION) \ + --htmldir=/usr/doc/xfce-$VERSION/$(basename $file .tar.$COMPRESSION)/html \ + --disable-static \ + --build=$ARCH-slackware-linux \ + $PACKAGE_SPECIFIC_OPTIONS + + # Unset this now -- we're done with it + unset PACKAGE_SPECIFIC_OPTIONS + + make $NUMJOBS || make || exit 1 + make install || exit 1 + make install DESTDIR=$PKG + + mkdir -p $PKG/usr/doc/xfce-$VERSION/$(basename $file .tar.$COMPRESSION) + # This will cause errors, but won't miss any docs: + cp -a \ + AUTHORS BUGS COMPOSITOR COPYING* FAQ HACKING INSTALL \ + NEWS NOTES README* THANKS TODO example.gtkrc-2.0 \ + $PKG/usr/doc/xfce-$VERSION/$(basename $file .tar.$COMPRESSION) \ + 2> /dev/null || true + + cd - ; +done + +find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# The Rodent icon theme isn't xdg compliant, so it spews errors quite often +# and just flat breaks some things here and there, so the Xfce team elected +# not to ship it with 4.6.0. In the meantime, we'll default to Tango. +sed -i s/Rodent/Tango/ \ + $PKG/etc/xfce/xdg/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml + +# We're going to borrow the "applications-education" icons (six of them) +# from kde's oxygen icon theme (it's LGPL) +tar xf $CWD/icons.tar.xz -C $PKG/usr/share + +# We don't want any of those icon caches +find $PKG/usr/share/icons -type f -name "index-theme.cache" -exec rm -f {} \; + +# Compress and if needed symlink the man pages: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + +mkdir -p $PKG/etc/profile.d +cp -a $CWD/profile.d/* $PKG/etc/profile.d +chown root:root $PKG/etc/profile.d/* +chmod 755 $PKG/etc/profile.d/* + +mkdir -p $PKG/etc/X11/xinit +( cd $PKG/etc/X11/xinit + ln -sf ../../xfce/xdg/xfce4/xinitrc xinitrc.xfce + chmod 755 ../../xfce/xdg/xfce4/xinitrc +) + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/xfce-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xfce4-power-manager/doinst.sh b/source/xap/xfce4-power-manager/doinst.sh new file mode 100644 index 00000000..1f8ff67d --- /dev/null +++ b/source/xap/xfce4-power-manager/doinst.sh @@ -0,0 +1,10 @@ +if [ -x /usr/bin/update-desktop-database ]; then + /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1 +fi + +if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then + if [ -x /usr/bin/gtk-update-icon-cache ]; then + /usr/bin/gtk-update-icon-cache usr/share/icons/hicolor >/dev/null 2>&1 + fi +fi + diff --git a/source/xap/xfce4-power-manager/slack-desc b/source/xap/xfce4-power-manager/slack-desc new file mode 100644 index 00000000..d1dd7ec1 --- /dev/null +++ b/source/xap/xfce4-power-manager/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------| +xfce4-power-manager: xfce4-power-manager (Power Management Daemon for Xfce) +xfce4-power-manager: +xfce4-power-manager: xfce4-power-manager makes power management functions (such as +xfce4-power-manager: suspend and hibernate) easy inside the Xfce Desktop Environment +xfce4-power-manager: (but it should also work in any other desktop environment). +xfce4-power-manager: +xfce4-power-manager: +xfce4-power-manager: +xfce4-power-manager: +xfce4-power-manager: +xfce4-power-manager: diff --git a/source/xap/xfce4-power-manager/xfce4-power-manager.SlackBuild b/source/xap/xfce4-power-manager/xfce4-power-manager.SlackBuild new file mode 100755 index 00000000..1487b2d0 --- /dev/null +++ b/source/xap/xfce4-power-manager/xfce4-power-manager.SlackBuild @@ -0,0 +1,91 @@ +#!/bin/sh + +# Slackware build script for xfce4-power-manager + +# Copyright 2008-2009 Robby Workman Northport, Alabama, USA +# Copyright 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PRGNAM=xfce4-power-manager +VERSION=0.6.6 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-$PRGNAM + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +rm -rf $PKG +mkdir -p $TMP $PKG +cd $TMP || exit 1 +rm -rf $PRGNAM-$VERSION +tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2 || exit 1 +cd $PRGNAM-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --sysconfdir=/etc/xfce \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --docdir=/usr/doc/$PRGNAM-$VERSION \ + --enable-debug=no \ + --build=$ARCH-slackware-linux + +make || exit 1 +make install DESTDIR=$PKG + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/html +cp -a \ + AUTHORS COPYING ChangeLog INSTALL NEWS README TODO \ + $PKG/usr/doc/$PRGNAM-$VERSION +( cd $PKG/usr/doc/$PRGNAM-$VERSION/html + ln -s /usr/share/xfce4/doc/C/xfce4-power-manager.html index.html + ln -s /usr/share/xfce4/doc/C/images . +) + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc +zcat $CWD/doinst.sh.gz > $PKG/install/doinst.sh + +cd $PKG +/sbin/makepkg -l y -c n $TMP/$PRGNAM-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xfractint/slack-desc b/source/xap/xfractint/slack-desc new file mode 100644 index 00000000..0b8614fa --- /dev/null +++ b/source/xap/xfractint/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xfractint: xfractint (fractal generation program) +xfractint: +xfractint: Xfractint draws a wide variety of fractals. Xfractint is a port of the +xfractint: DOS program Fractint. +xfractint: +xfractint: The primary original authors of Fractint are Bert Tyler, Timothy +xfractint: Wegner, Mark Peterson, and Pieter Branderhorst. Fractint was ported +xfractint: to X by Ken Shirriff. +xfractint: +xfractint: +xfractint: diff --git a/source/xap/xfractint/xfractint.SlackBuild b/source/xap/xfractint/xfractint.SlackBuild new file mode 100755 index 00000000..1ae5e6fe --- /dev/null +++ b/source/xap/xfractint/xfractint.SlackBuild @@ -0,0 +1,109 @@ +#!/bin/sh + +# Copyright 2007, 2008, 2009 Patrick Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=xfractint +VERSION=${VERSION:-20.04p09} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/xfractint-${VERSION}.tar.bz2 || exit 1 +cd ${PKGNAM}-${VERSION} || exit 1 + +rm -f unix/calmanfx.o # contains i386 code + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +make OPT="$SLKCFLAGS" SRCDIR=/usr/share/xfractint SHRDIR=/usr/share/xfractint BINDIR=/usr/bin MANDIR=/usr/man/man1 || exit 1 + +mkdir -p $PKG/usr/{bin,man/man1,share/xfractint} +make install SRCDIR=$PKG/usr/share/xfractint SHRDIR=$PKG/usr/share/xfractint BINDIR=$PKG/usr/bin MANDIR=$PKG/usr/man/man1 || exit 1 + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.* + ) + done + ) +fi + +# Compress info files, if any: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +# Add palette maps missing from latest sources: +( cd $PKG/usr/share/${PKGNAM}/maps ; tar xf $CWD/palette.maps.tar.gz ) + +# Fix all wrong permissions in /usr/share/xfractint +( cd $PKG/usr/share + find . -perm 777 -exec chmod 755 {} \; + find . -perm 666 -exec chmod 644 {} \; +) + +# Add a documentation directory: +mkdir -p ${PKG}/usr/doc/${PKGNAM}-$VERSION +cp -a *.txt read.me $PKG/usr/doc/${PKGNAM}-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +# Build the package: +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xgames/maze.diff b/source/xap/xgames/maze.diff new file mode 100644 index 00000000..77ec739c --- /dev/null +++ b/source/xap/xgames/maze.diff @@ -0,0 +1,22 @@ +--- ./getopt.c.orig Wed Aug 4 14:48:46 1999 ++++ ./getopt.c Wed Aug 4 14:48:55 1999 +@@ -22,7 +22,7 @@ + char *optarg; + + int +-getopt(argc, argv, opts) ++maze_getopt(argc, argv, opts) + int argc; + char **argv, *opts; + { +--- ./maze.c.orig Wed Aug 4 14:48:59 1999 ++++ ./maze.c Wed Aug 4 14:49:10 1999 +@@ -136,7 +136,7 @@ + int flags; + + cmd = argv[0]; +- while ((c = getopt(argc, argv, "rSd:g:")) != EOF) ++ while ((c = maze_getopt(argc, argv, "rSd:g:")) != EOF) + switch(c) { + + case 'S': diff --git a/source/xap/xgames/slack-desc b/source/xap/xgames/slack-desc new file mode 100644 index 00000000..a81a038c --- /dev/null +++ b/source/xap/xgames/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xgames: xgames (small X games collection) +xgames: +xgames: A few small and historic games and toys for X. +xgames: +xgames: Includes maze, spider, xcolormap, xlander, xminesweep, xroach, xsnow. +xgames: +xgames: +xgames: +xgames: +xgames: +xgames: diff --git a/source/xap/xgames/spider.diff b/source/xap/xgames/spider.diff new file mode 100644 index 00000000..b0704f14 --- /dev/null +++ b/source/xap/xgames/spider.diff @@ -0,0 +1,121 @@ +--- ./globals.h.orig 1991-09-28 12:46:20.000000000 -0500 ++++ ./globals.h 2007-02-21 20:14:54.000000000 -0600 +@@ -96,6 +96,6 @@ + Bool can_get_help_files(); + #endif + +-extern char *malloc(); +-extern char *calloc(); +-extern char *realloc(); ++extern void *malloc(); ++extern void *calloc(); ++extern void *realloc(); +--- ./movelog.c.orig 1991-09-28 12:46:17.000000000 -0500 ++++ ./movelog.c 2007-02-21 20:17:21.000000000 -0600 +@@ -22,6 +22,7 @@ + #ifdef SVR4 + #include <unistd.h> + #endif ++#include <stdlib.h> + + #define CACHE_SIZE 50 + static int move_index = 0; +@@ -33,6 +34,21 @@ + + extern int cheat_count; + ++Rank flip_ranks[NUM_RANKS] = { ++ King, Queen, Jack, Ten, Nine, Eight, Seven, ++ Six, Five, Four, Three, Deuce, Ace ++}; ++ ++static int ++card_to_int(card) ++CardPtr card; ++{ ++int val; ++ ++ val = card->suit * 13 + flip_ranks[card->rank]; ++ return (val); ++} ++ + make_deck_cache() + { + CardPtr tmp; +@@ -280,11 +296,6 @@ + } + } + +-Rank flip_ranks[NUM_RANKS] = { +- King, Queen, Jack, Ten, Nine, Eight, Seven, +- Six, Five, Four, Three, Deuce, Ace +-}; +- + static void + int_to_card(val, suit, rank) + int val; +@@ -298,16 +309,6 @@ + assert (*rank >= Ace && *suit <= King); + } + +-static int +-card_to_int(card) +-CardPtr card; +-{ +-int val; +- +- val = card->suit * 13 + flip_ranks[card->rank]; +- return (val); +-} +- + static CardPtr + find_card(cache, suit, rank) + CardPtr *cache; +@@ -709,6 +710,23 @@ + } + } + ++static int ++restore_game(str, str2) ++char *str, *str2; ++{ ++ ++ if (read_position(str) != 0) { ++ return (-1); ++ } ++ ++ init_cache(); /* clear out the move cache */ ++ ++ if (str2) ++ read_moves(str2); ++ ++ return (0); ++} ++ + read_selection(buf) + char *buf; + { +@@ -786,23 +804,6 @@ + show_message(buf); + } + +-static int +-restore_game(str, str2) +-char *str, *str2; +-{ +- +- if (read_position(str) != 0) { +- return (-1); +- } +- +- init_cache(); /* clear out the move cache */ +- +- if (str2) +- read_moves(str2); +- +- return (0); +-} +- + /* + * play the same deck again + */ diff --git a/source/xap/xgames/xcolormap.diff b/source/xap/xgames/xcolormap.diff new file mode 100644 index 00000000..57a0bee7 --- /dev/null +++ b/source/xap/xgames/xcolormap.diff @@ -0,0 +1,22 @@ +--- ./Makefile.orig Wed Aug 4 14:53:55 1999 ++++ ./Makefile Wed Aug 4 14:54:07 1999 +@@ -3,7 +3,7 @@ + PROGRAM = xcolormap + OBJS = xcolormap.o + +-LIBS = -lm -lXt -lX11 ++LIBS = -lm -L /usr/X11R6/lib -lXt -lX11 + + all: $(PROGRAM) + +--- ./xcolormap.c.orig Wed Aug 4 14:53:23 1999 ++++ ./xcolormap.c Wed Aug 4 14:53:49 1999 +@@ -113,7 +113,7 @@ + + if (!TheDisplay) + { +- XtWarning ("%s: can't open display, exiting...", APPNAME); ++ XtWarning ("%s: can't open display, exiting..."); + exit (0); + } + diff --git a/source/xap/xgames/xcuckoo.diff b/source/xap/xgames/xcuckoo.diff new file mode 100644 index 00000000..00c014cb --- /dev/null +++ b/source/xap/xgames/xcuckoo.diff @@ -0,0 +1,12 @@ +diff -u xcuckoo.orig/xcuckoo.c xcuckoo/xcuckoo.c +--- xcuckoo.orig/xcuckoo.c 1992-05-05 02:38:34.000000000 -0500 ++++ xcuckoo/xcuckoo.c 2007-02-28 13:10:37.000000000 -0600 +@@ -37,7 +37,7 @@ + #include "version.h" + #include "patchlevel.h" + +-extern char *malloc(); ++extern void *malloc(); + + /* R4 concession */ + #ifndef XPointer diff --git a/source/xap/xgames/xgames.SlackBuild b/source/xap/xgames/xgames.SlackBuild new file mode 100755 index 00000000..e2514f81 --- /dev/null +++ b/source/xap/xgames/xgames.SlackBuild @@ -0,0 +1,154 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +VERSION=0.3 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-2} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xgames +rm -rf $PKG +mkdir -p $TMP $PKG + +# Build spider: +cd $TMP +tar xvf $CWD/spider.tar.gz || exit 1 +cd spider || exit 1 +zcat $CWD/spider.diff.gz | patch -p1 --verbose || exit 1 +xmkmf +make $NUMJOBS || make || exit 1 +mkdir -p $PKG/usr/bin +cat spider > $PKG/usr/bin/spider +mkdir -p $PKG/usr/man/man6 +cat spider.man | gzip -9c > $PKG/usr/man/man6/spider.6.gz +mkdir -p $PKG/usr/doc/xgames-$VERSION/spider +cp -a README* $PKG/usr/doc/xgames-$VERSION/spider + +# Build maze: +cd $TMP +tar xvf $CWD/maze.tar.gz || exit 1 +cd maze || exit 1 +zcat $CWD/maze.diff.gz | patch -p1 || exit 1 +xmkmf +make $NUMJOBS || make || exit 1 +cat maze > $PKG/usr/bin/maze +cat maze.man | gzip -9c > $PKG/usr/man/man6/maze.6.gz +mkdir -p $PKG/usr/doc/xgames-$VERSION/maze +cp -a README $PKG/usr/doc/xgames-$VERSION/maze + +# Build xcolormap: +cd $TMP +tar xvf $CWD/xcolormap.tar.gz || exit 1 +cd xcolormap || exit 1 +zcat $CWD/xcolormap.diff.gz | patch -p1 || exit 1 +make $NUMJOBS || make || exit 1 +cat xcolormap > $PKG/usr/bin/xcolormap +mkdir -p $PKG/usr/doc/xgames-$VERSION/xcolormap +cp -a README $PKG/usr/doc/xgames-$VERSION/xcolormap + +# Build xcuckoo: +cd $TMP +tar xvf $CWD/xcuckoo-1.1.tar.gz || exit 1 +cd xcuckoo || exit 1 +zcat $CWD/xcuckoo.diff.gz | patch -p1 --verbose || exit 1 +xmkmf +make $NUMJOBS || make || exit 1 +cat xcuckoo > $PKG/usr/bin/xcuckoo +cat xcuckoo.man | gzip -9c > $PKG/usr/man/man6/xcuckoo.6.gz +mkdir -p $PKG/usr/doc/xgames-$VERSION/xcuckoo +cp -a CHANGES $PKG/usr/doc/xgames-$VERSION/xcuckoo + +# Build xlander: +cd $TMP +tar xvf $CWD/xlander.tar.gz || exit 1 +cd xlander || exit 1 +zcat $CWD/xlander.fixes.diff.gz | patch -p1 || exit 1 +zcat $CWD/xlander-2009-07-18.diff.gz | patch -p1 || exit 1 +xmkmf +make $NUMJOBS || make || exit 1 +cat xlander > $PKG/usr/bin/xlander +cat xlander.man | gzip -9c > $PKG/usr/man/man6/xlander.6.gz +mkdir -p $PKG/usr/doc/xgames-$VERSION/xlander +cp -a README $PKG/usr/doc/xgames-$VERSION/xlander + +# Build xminesweep: +cd $TMP +tar xvf $CWD/xminesweep3.0.tar.gz || exit 1 +cd xminesweep3.0 || exit 1 +xmkmf +make $NUMJOBS || make || exit 1 +cat xminesweep > $PKG/usr/bin/xminesweep +cat xminesweep.man | gzip -9c > $PKG/usr/man/man6/xminesweep.6.gz +mkdir -p $PKG/usr/doc/xgames-$VERSION/xminesweep +cp -a README $PKG/usr/doc/xgames-$VERSION/xminesweep + +# Build xneko: +cd $TMP +tar xvf $CWD/xneko.tar.gz || exit 1 +cd xneko || exit 1 +xmkmf +make $NUMJOBS || make || exit 1 +cat xneko > $PKG/usr/bin/xneko +cat xneko.man | gzip -9c > $PKG/usr/man/man6/xneko.6.gz +mkdir -p $PKG/usr/doc/xgames-$VERSION/xneko +cp -a README $PKG/usr/doc/xgames-$VERSION/xneko + +# Build xroach: +cd $TMP +tar xvf $CWD/xroach.tar.gz || exit 1 +cd xroach || exit 1 +xmkmf +make $NUMJOBS || make || exit 1 +cat xroach > $PKG/usr/bin/xroach +cat xroach.man | gzip -9c > $PKG/usr/man/man6/xroach.6.gz +mkdir -p $PKG/usr/doc/xgames-$VERSION/xroach +cp -a README.linux $PKG/usr/doc/xgames-$VERSION/xroach + +# Build xsnow: +cd $TMP +tar xvf $CWD/xsnow-1.40.tar.gz || exit 1 +cd xsnow-1.40 || exit 1 +xmkmf +make $NUMJOBS || make || exit 1 +cat xsnow > $PKG/usr/bin/xsnow +cat xsnow.man | gzip -9c > $PKG/usr/man/man6/xsnow.6.gz +mkdir -p $PKG/usr/doc/xgames-$VERSION/xsnow +cp -a README $PKG/usr/doc/xgames-$VERSION/xsnow + +# Fix everything up: +chmod 755 $PKG/usr/bin/* +strip $PKG/usr/bin/* + +( cd $PKG/usr/doc + find . -type f -exec chown root.root {} \; + find . -type f -exec chmod 644 {} \; +) + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/xgames-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xgames/xlander-2009-07-18.diff b/source/xap/xgames/xlander-2009-07-18.diff new file mode 100644 index 00000000..21402ea4 --- /dev/null +++ b/source/xap/xgames/xlander-2009-07-18.diff @@ -0,0 +1,86 @@ +diff --git a/game.c b/game.c +index e6f3a53..b789081 100644 +--- a/game.c ++++ b/game.c +@@ -93,7 +93,7 @@ void RateLanding (db, lander) + extern LINE landingpad[]; + int x_distance, z_distance; /* Distance from center of pad */ + int abs (); +- void InitializeLander (), DisplayAcceleration (); ++ void InitFrameRate (), InitializeLander (), DisplayAcceleration (); + + x_distance = + abs ((int) (db->off_x - (landingpad[0].x1 + (PAD_WIDTH >> 1)))); +@@ -108,6 +108,7 @@ void RateLanding (db, lander) + } + XDrawImageString (d, instrBuffer, gcInstr, 381, 84, buf, strlen (buf)); + Pause ("Press mouse button to continue"); ++ InitFrameRate (); + InitializeLander (db, lander); + + /* +diff --git a/initialize.c b/initialize.c +index 99a81c5..279e3f2 100644 +--- a/initialize.c ++++ b/initialize.c +@@ -60,7 +60,7 @@ void InitializeLander (craft, lander) + lander->retro_thruster = 0; + lander->vert_speed = 0.0; + lander->heading = 1.36; +- lander->lat_veloc = 100.0; ++ lander->lat_veloc = 300.0; + lander->fuel = FULL_TANK; + lander->alt = craft->off_y / PIXELS_PER_FOOT; + } +diff --git a/patchlevel.h b/patchlevel.h +index 9625f98..be79bb8 100644 +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -1,2 +1,2 @@ +-#define PATCHLEVEL 3 ++#define PATCHLEVEL 4 + +diff --git a/xlander.c b/xlander.c +index 2b2c103..318e5df 100644 +--- a/xlander.c ++++ b/xlander.c +@@ -101,9 +101,17 @@ void DisplayWorld () + } + + ++void InitFrameRate () ++{ ++ gettimeofday(&frame_time, NULL); ++ gettimeofday(&prev_frame_time, NULL); ++ fps = 1000000.0; /* Avoid initial spike */ ++} ++ ++ + void UpdateFrameRate () + { +- unsigned long sec, usec, diff; ++ long sec, usec, diff; + + gettimeofday(&frame_time, NULL); + sec = frame_time.tv_sec - prev_frame_time.tv_sec; +@@ -164,6 +172,7 @@ int main (argc, argv) + */ + mask = sigblock (sigmask (SIGINT)); + Pause ("Press any mouse button to begin"); ++ InitFrameRate (); + DisplayAcceleration (); + for (;;) { + UpdateOrientation (world, craft, &lander); +diff --git a/xlander.h b/xlander.h +index ea157f7..ea072d3 100644 +--- a/xlander.h ++++ b/xlander.h +@@ -44,7 +44,7 @@ + #define PIXELS_PER_FOOT 6 /* Number of pixels per foot */ + #define ACCELERATION -5.310 /* Acceleration of gravity (ft/sec^2) */ + #define RETRO 35.0 /* Acceleration due to retroactive thruster */ +-#define LATERAL_THRUST 5.0 /* Acceleration due to lateral thruster */ ++#define LATERAL_THRUST 1.0 /* Acceleration due to lateral thruster */ + #define PI 3.1415926535897932384 + #define HALFPI 1.5707963 /* pi/2 */ + #define TWOPI100 628 diff --git a/source/xap/xgames/xlander.fixes.diff b/source/xap/xgames/xlander.fixes.diff new file mode 100644 index 00000000..7212e183 --- /dev/null +++ b/source/xap/xgames/xlander.fixes.diff @@ -0,0 +1,228 @@ +diff -ru a-slackware-1995-06-17/game.c b-gary/game.c +--- a-slackware-1995-06-17/game.c 1995-06-17 21:23:00.000000000 -0400 ++++ b-gary/game.c 2007-03-01 04:08:49.000000000 -0500 +@@ -165,7 +165,7 @@ + switch (event.type) { + case KeyPress: + if (lander->fuel > 0.0) { +- XLookupString (&event, &ch, 1, &keysym, (XComposeStatus *) 0); ++ XLookupString ((XKeyEvent *) &event, &ch, 1, &keysym, (XComposeStatus *) 0); + if (ch == lander->controls[0] || keysym == XK_Up) + lander->rear_thruster = lander->lateral_thrust; + else if (ch == lander->controls[1] || keysym == XK_Down) +@@ -179,7 +179,7 @@ + } + break; + case KeyRelease: +- XLookupString (&event, &ch, 1, &keysym, (XComposeStatus *) 0); ++ XLookupString ((XKeyEvent *) &event, &ch, 1, &keysym, (XComposeStatus *) 0); + if (ch == lander->controls[0] || keysym == XK_Up) + lander->rear_thruster = 0; + else if (ch == lander->controls[1] || keysym == XK_Down) +@@ -197,24 +197,26 @@ + } + + if (lander->retro_thruster > 0) +- lander->fuel -= RETRO_BURN; ++ lander->fuel -= RETRO_BURN / fps; + if (lander->front_thruster > 0) +- lander->fuel -= LATERAL_BURN; ++ lander->fuel -= LATERAL_BURN / fps; + if (lander->rear_thruster > 0) +- lander->fuel -= LATERAL_BURN; ++ lander->fuel -= LATERAL_BURN / fps; + if (lander->left_thruster > 0) +- lander->fuel -= LATERAL_BURN; ++ lander->fuel -= LATERAL_BURN / fps; + if (lander->right_thruster > 0) +- lander->fuel -= LATERAL_BURN; ++ lander->fuel -= LATERAL_BURN / fps; ++ if (lander->fuel < 0.0) ++ lander->fuel = 0.0; /* Prevents gas gauge from going negative */ + lander->vert_speed += +- (lander->retro_thruster + acceleration) / TICKS_PER_SECOND; +- lander->alt += lander->vert_speed / TICKS_PER_SECOND; ++ (lander->retro_thruster + acceleration) / fps; ++ lander->alt += lander->vert_speed / fps; + lat_accel_x = lander->right_thruster - lander->left_thruster; + lat_accel_y = lander->rear_thruster - lander->front_thruster; + lat_veloc_x = lander->lat_veloc * cos (lander->heading) + lat_accel_x; + lat_veloc_y = lander->lat_veloc * sin (lander->heading) + lat_accel_y; +- craft->off_x += (lat_veloc_x / TICKS_PER_SECOND) * PIXELS_PER_FOOT; +- craft->off_z += (lat_veloc_y / TICKS_PER_SECOND) * PIXELS_PER_FOOT; ++ craft->off_x += (lat_veloc_x / fps) * PIXELS_PER_FOOT; ++ craft->off_z += (lat_veloc_y / fps) * PIXELS_PER_FOOT; + lander->lat_veloc = + sqrt (lat_veloc_x * lat_veloc_x + lat_veloc_y * lat_veloc_y); + +diff -ru a-slackware-1995-06-17/globals.c b-gary/globals.c +--- a-slackware-1995-06-17/globals.c 1995-06-17 21:22:36.000000000 -0400 ++++ b-gary/globals.c 2007-03-01 04:08:49.000000000 -0500 +@@ -27,3 +27,4 @@ + XrmDatabase resources = (XrmDatabase) 0; + /* X Resource database */ + float acceleration = 0.0; /* Acceleration due to gravity */ ++float fps; /* Current frames per second */ +diff -ru a-slackware-1995-06-17/globals.h b-gary/globals.h +--- a-slackware-1995-06-17/globals.h 1995-06-17 21:22:41.000000000 -0400 ++++ b-gary/globals.h 2007-03-01 04:08:49.000000000 -0500 +@@ -30,5 +30,6 @@ + extern int px, py, pz; + extern int roll, pitch, yaw; + extern float acceleration; ++extern float fps; + +-#endif _globals_h_ ++#endif /* _globals_h_ */ +diff -ru a-slackware-1995-06-17/initialize.c b-gary/initialize.c +--- a-slackware-1995-06-17/initialize.c 1995-06-17 21:23:00.000000000 -0400 ++++ b-gary/initialize.c 2007-03-01 04:08:49.000000000 -0500 +@@ -61,7 +61,7 @@ + lander->vert_speed = 0.0; + lander->heading = 1.36; + lander->lat_veloc = 100.0; +- lander->fuel = 320.0; ++ lander->fuel = FULL_TANK; + lander->alt = craft->off_y / PIXELS_PER_FOOT; + } + +@@ -293,7 +293,7 @@ + + world->min_x = world->min_y = -HALF_WORLD_LENGTH; + world->max_x = world->max_y = HALF_WORLD_WIDTH; +- srandom ((long) time ((int *) 0)); ++ srandom ((long) time ((time_t *) 0)); + for (x = -HALF_WORLD_WIDTH; x < HALF_WORLD_WIDTH; + r ^= 1, x += EDGE_LENGTH + (int) x_offset) + for (y = r * (int) y_offset - HALF_WORLD_LENGTH; y < HALF_WORLD_LENGTH; +diff -ru a-slackware-1995-06-17/instrument.c b-gary/instrument.c +--- a-slackware-1995-06-17/instrument.c 1995-06-17 21:22:39.000000000 -0400 ++++ b-gary/instrument.c 2007-03-01 04:08:49.000000000 -0500 +@@ -48,7 +48,7 @@ + { + static int heading_x = 50, heading_y = 15; + static int fuel_level = 80, old_x = 290, old_y = 10; +- int new_fuel_level = (int) fuel / 4; ++ int new_fuel_level = (int) (fuel / (float) FULL_TANK * 80.0); + char buf[32]; + + /* +diff -ru a-slackware-1995-06-17/patchlevel.h b-gary/patchlevel.h +--- a-slackware-1995-06-17/patchlevel.h 1995-06-17 21:23:00.000000000 -0400 ++++ b-gary/patchlevel.h 2007-03-01 04:08:49.000000000 -0500 +@@ -1,2 +1,2 @@ +-#define PATCHLEVEL 2 ++#define PATCHLEVEL 3 + +diff -ru a-slackware-1995-06-17/xlander.c b-gary/xlander.c +--- a-slackware-1995-06-17/xlander.c 1995-06-17 21:22:36.000000000 -0400 ++++ b-gary/xlander.c 2007-03-01 04:08:49.000000000 -0500 +@@ -14,6 +14,7 @@ + + #include "xlander.h" + #include "globals.h" ++#include <sys/time.h> + + /* + * A lander +@@ -68,6 +69,7 @@ + static DATABASE *world, *craft, *thrust, *shadow; + static LANDER lander; + int mask; ++struct timeval frame_time, prev_frame_time; + + /****************************************************************************** + ** DisplayWorld +@@ -98,7 +100,26 @@ + XSync (d,False); + } + +-void main (argc, argv) ++ ++void UpdateFrameRate () ++{ ++ unsigned long sec, usec, diff; ++ ++ gettimeofday(&frame_time, NULL); ++ sec = frame_time.tv_sec - prev_frame_time.tv_sec; ++ usec = frame_time.tv_usec - prev_frame_time.tv_usec; ++ if(usec < 0) { ++ usec += 1000000; ++ sec--; ++ } ++ diff = sec * 1000000 + usec; ++ fps = 1000000.0 / (float) diff; ++ prev_frame_time.tv_sec = frame_time.tv_sec; ++ prev_frame_time.tv_usec = frame_time.tv_usec; ++} ++ ++ ++int main (argc, argv) + int argc; + char *argv[]; + { +@@ -113,6 +134,10 @@ + thrust = DBInitFromData (thrust_data, THRUSTSIZE); + shadow = DBInitFromData (shadow_data, SHADOWSIZE); + ++ gettimeofday(&frame_time, NULL); ++ gettimeofday(&prev_frame_time, NULL); ++ fps = 1000000.0; /* Prevent startup pulse */ ++ + /* + * Initial coordinates of the lander... + */ +@@ -143,7 +168,9 @@ + for (;;) { + UpdateOrientation (world, craft, &lander); + DisplayWorld (); ++ UpdateFrameRate (); + (void) sigsetmask (mask); + mask = sigblock (sigmask (SIGINT)); + } ++ return 0; + } +diff -ru a-slackware-1995-06-17/xlander.h b-gary/xlander.h +--- a-slackware-1995-06-17/xlander.h 1995-06-17 21:23:00.000000000 -0400 ++++ b-gary/xlander.h 2007-03-01 04:08:49.000000000 -0500 +@@ -20,6 +20,7 @@ + #ifndef _xlander_h_ + #define _xlander_h_ + ++#include <stdlib.h> + #include <stdio.h> + #include <math.h> + #include <signal.h> +@@ -41,7 +42,6 @@ + #define HALF_WORLD_LENGTH (WORLD_LENGTH >> 1) + #define HALF_WORLD_WIDTH (WORLD_WIDTH >> 1) + #define PIXELS_PER_FOOT 6 /* Number of pixels per foot */ +-#define TICKS_PER_SECOND 3 /* Number of frames per second */ + #define ACCELERATION -5.310 /* Acceleration of gravity (ft/sec^2) */ + #define RETRO 35.0 /* Acceleration due to retroactive thruster */ + #define LATERAL_THRUST 5.0 /* Acceleration due to lateral thruster */ +@@ -53,7 +53,7 @@ + #define LAT_SPEED 30.0 /* Maximum lateral speed without crashing */ + #define RETRO_BURN 1.6 /* Retroactive thruster fuel consumption */ + #define LATERAL_BURN 0.4 /* Lateral thruster fuel consumption */ +-#define FULL_TANK 320 /* Full tank of fuel */ ++#define FULL_TANK 15 /* Full tank of fuel */ + #define MAX_VELOC 640.0 /* Maximum velocity */ + + #define LANDER_WIDTH 600 +@@ -107,9 +107,6 @@ + + DATABASE *DBInit (), *DBInitFromData (), *LoadDataBase (); + void DBInsert (), DBFinish (), DBPlot (), SwapBuffers (), exit (); +-#ifndef _AIX +-char *malloc (); +-#endif + double atof (); + #ifdef sun + int printf (), fprintf (), time (); +@@ -122,4 +119,4 @@ + #define WorldToRadarX(x) (290 + (((int) (x) + (WORLD_WIDTH >> 1)) / 250)) + #define WorldToRadarY(y) (90 - (((int) (y) + (WORLD_LENGTH >> 1)) / 250)) + +-#endif _xlander_h_ ++#endif /* _xlander_h_ */ diff --git a/source/xap/xine-lib/slack-desc b/source/xap/xine-lib/slack-desc new file mode 100644 index 00000000..27673668 --- /dev/null +++ b/source/xap/xine-lib/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xine-lib: xine-lib (xine multimedia playback engine libraries) +xine-lib: +xine-lib: xine-lib is a free (GPL licensed) high-performance multimedia +xine-lib: playback engine. The xine shared libraries are used by xine-ui (and +xine-lib: other media players and multimedia applications) for smooth video +xine-lib: processing and playback of multimedia streams such as movies, radio +xine-lib: and TV network streams, DVDs, and VCDs. +xine-lib: +xine-lib: +xine-lib: +xine-lib: diff --git a/source/xap/xine-lib/xine-lib.SlackBuild b/source/xap/xine-lib/xine-lib.SlackBuild new file mode 100755 index 00000000..84c6703f --- /dev/null +++ b/source/xap/xine-lib/xine-lib.SlackBuild @@ -0,0 +1,98 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +# Version on the tarball +VERSION=1.1.16.3 +# Version used in the source directory to cd into +DIRVER=1.1.16.3 +# Version used for the Slackware package +PKGVER=1.1.16.3 + +# I would use "-march=i486 -mtune=i686" here as usual, but with XINE it's all or nothing. +# I'd rather have it work well for the i686/Athlon crowd than suck for everyone. +ARCH=${ARCH:-x86_64} +TARGET=${TARGET:-$ARCH-pc-linux-gnu} +BUILD=${BUILD:-6} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +if [ "$ARCH" = "x86_64" ]; then + LIBDIRSUFFIX="64" +else + LIBDIRSUFFIX="" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xine-lib +rm -rf $PKG +mkdir -p $TMP $PKG/usr + +cd $TMP +rm -rf xine-lib-$VERSION +tar xvf $CWD/xine-lib-$VERSION.tar.bz2 || exit 1 +cd xine-lib-$DIRVER || exit 1 + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +XINE_BUILD=$TARGET \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --docdir=/usr/doc/xine-lib-$VERSION \ + --mandir=/usr/man \ + --with-w32-path=/usr/lib${LIBDIRSUFFIX}/codecs \ + --with-arts \ + --disable-nosefart \ + --without-speex + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/codecs + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +( cd $PKG/usr/man + find . -type f -exec gzip -9 {} \; + for i in $(find . -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done +) + +# Copy a few missed docs, and remove the redundant html FAQ (we have a txt) +cp -a \ + ABOUT-NLS AUTHORS NEWS \ + $PKG/usr/doc/xine-lib-$VERSION +rm -f $PKG/usr/doc/xine-lib-$VERSION/faq.html + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/xine-lib-$PKGVER-$ARCH-$BUILD.txz + diff --git a/source/xap/xine-ui/slack-desc b/source/xap/xine-ui/slack-desc new file mode 100644 index 00000000..f4e39279 --- /dev/null +++ b/source/xap/xine-ui/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xine-ui: xine-ui (xine multimedia playback engine user interface) +xine-ui: +xine-ui: Xine is a free multimedia player. It plays back CDs, DVDs, and VCDs, +xine-ui: multimedia files, and multimedia streamed over a network. +xine-ui: +xine-ui: The xine-ui package contains the graphical user interface for the +xine-ui: xine multimedia player. +xine-ui: +xine-ui: +xine-ui: +xine-ui: diff --git a/source/xap/xine-ui/xine-ui.SlackBuild b/source/xap/xine-ui/xine-ui.SlackBuild new file mode 100755 index 00000000..1dd61f1f --- /dev/null +++ b/source/xap/xine-ui/xine-ui.SlackBuild @@ -0,0 +1,87 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=0.99.5 +# I would use "-march=i486 -mcpu=i686" here as usual, but with XINE it's all or nothing. +# I'd rather have it work well for the i686/Athlon crowd than suck for everyone. +ARCH=${ARCH:-x86_64} +TARGET=${TARGET:-$ARCH-pc-linux-gnu} +BUILD=${BUILD:-2} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xine-ui +rm -rf $PKG +mkdir -p $TMP $PKG/usr + +cd $TMP +rm -rf xine-ui-$VERSION +tar xvf $CWD/xine-ui-$VERSION.tar.bz2 || exit 1 +cd xine-ui-$VERSION || exit 1 + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +XINE_BUILD=$TARGET \ +./configure \ + --prefix=/usr \ + --with-aalib \ + --with-caca \ + --build=$TARGET + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +mkdir -p $PKG/usr/share/applications +zcat $CWD/xine.desktop.gz > $PKG/usr/share/applications/xine.desktop + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +( cd $PKG/usr/man + find . -name "*.?" | xargs gzip -9 +) + +mkdir -p $PKG/usr/doc/xine-ui-$VERSION +cp -a \ + ABOUT-NLS AUTHORS COPYING NEWS README \ + doc/README* \ + $PKG/usr/doc/xine-ui-$VERSION +cp -a \ + src/xitk/xine-toolkit/README \ + $PKG/usr/doc/xine-ui-$VERSION/README.xitk +# redundant +rm -rf $PKG/usr/share/doc + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/xine-ui-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xine-ui/xine.desktop b/source/xap/xine-ui/xine.desktop new file mode 100644 index 00000000..0936a4e9 --- /dev/null +++ b/source/xap/xine-ui/xine.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Xine +Name[pl]=Odtwarzacz xine +GenericName=Media Player +Comment=Xine Media Player +Comment[pl]=Odtwarzacz filmów +Icon=xine.xpm +Exec=xine +Terminal=0 +Type=Application +Categories=Application;AudioVideo;Player; +MimeType=video/mpeg;video/quicktime;video/x-msvideo;video/x-anim;audio/x-mp3;audio/x-mp2; +# vi: encoding=utf-8 diff --git a/source/xap/xlockmore/l-bob.README b/source/xap/xlockmore/l-bob.README new file mode 100644 index 00000000..8e868f88 --- /dev/null +++ b/source/xap/xlockmore/l-bob.README @@ -0,0 +1,5 @@ + +The image of J. R. "Bob" Dobbs found in the file l-bob.xbm, and used as the +"bob" (xlockmore) screensaver in Slackware, is a registered trademark of +The Subgenius Foundation (http://www.subgenius.com). Used by permission. + diff --git a/source/xap/xlockmore/l-bob.xbm b/source/xap/xlockmore/l-bob.xbm new file mode 100644 index 00000000..ceea6daf --- /dev/null +++ b/source/xap/xlockmore/l-bob.xbm @@ -0,0 +1,364 @@ +#define image_width 172 +#define image_height 246 +static unsigned char image_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0xa0, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0x07,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xf0,0x00, + 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, + 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff, + 0xff,0xff,0xdf,0xff,0xf3,0xff,0x1f,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, + 0x00,0x00,0xfe,0xff,0xff,0xff,0xdf,0xff,0xff,0x9f,0xff,0xe3,0xff,0x3f,0x00, + 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x9f,0xff, + 0xff,0x3f,0xff,0xc7,0xff,0x3f,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, + 0x80,0xff,0xff,0xff,0xff,0x1f,0xf2,0x7f,0x7f,0xfe,0xc3,0xff,0x7f,0x00,0x00, + 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x3f,0xc0,0x7f, + 0x7e,0xfc,0xc1,0xff,0xff,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xe0, + 0xff,0xff,0xff,0xcf,0x7f,0x00,0xff,0x7c,0xfc,0xc1,0xff,0xff,0x01,0x00,0x00, + 0x00,0xf0,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x0f,0xff,0x00,0xff,0x78, + 0xf0,0xc1,0xff,0xff,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf8,0xff, + 0xff,0xfc,0x1f,0xfe,0x00,0xff,0x30,0xe0,0x81,0xff,0xff,0x03,0x00,0x00,0x00, + 0xf0,0x00,0x00,0x00,0x00,0xfc,0xff,0x7f,0x38,0x1f,0xfc,0x01,0xfe,0x01,0xe0, + 0x83,0xff,0xf9,0x07,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xff,0xff,0x3f, + 0x38,0x1e,0xf8,0x01,0xfc,0x01,0xe0,0x87,0xff,0xfb,0x07,0x00,0x00,0x00,0xf0, + 0x00,0x00,0x00,0x80,0xff,0xff,0x7f,0x00,0x3c,0xf0,0x01,0xf8,0x01,0xe0,0x8f, + 0xff,0xf3,0x07,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xc0,0xff,0xff,0x7f,0x00, + 0x3c,0xf0,0x03,0xf8,0x01,0xc0,0xff,0xff,0xf3,0x0f,0x00,0x00,0x00,0xf0,0x00, + 0x00,0x00,0xc0,0xff,0xff,0xff,0x00,0x7c,0xe0,0x03,0xf0,0x01,0xc0,0xff,0xff, + 0xf3,0x3f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x81,0x7f, + 0xe0,0x03,0xf0,0x03,0xc0,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0xf0,0x00,0x00, + 0x00,0xe0,0xff,0xff,0xff,0x83,0xff,0xe0,0x03,0xe0,0x03,0xc0,0xff,0xff,0xff, + 0xff,0x01,0x00,0x00,0xf0,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x97,0xff,0xc0, + 0x07,0xe0,0x03,0x80,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xf0,0x00,0x00,0x00, + 0xf0,0xff,0xff,0xff,0xff,0xff,0xc1,0x07,0xc0,0x07,0x80,0xff,0xff,0xff,0xff, + 0x07,0x00,0x00,0xf0,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xc1,0x07, + 0xc0,0x03,0x80,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0xf0,0x00,0x00,0x00,0xf8, + 0xff,0xff,0xff,0xff,0xff,0x83,0x0f,0xc0,0x07,0xc0,0xff,0xff,0xff,0xff,0x3f, + 0x00,0x00,0xf0,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xc7,0x0f,0xc0, + 0x1f,0xe0,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0xf0,0x00,0x00,0x00,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xcf,0x1f,0xc0,0x7f,0xfc,0xff,0xff,0xff,0xff,0xff,0x00, + 0x00,0xf0,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xc0,0x7f, + 0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xf0,0x00,0x00,0x00,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xc3,0x7f,0xfe,0xff,0xff,0xff,0xff,0xff,0x01,0x00, + 0xf0,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc7,0x7f,0xfe, + 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0xf0,0x00,0x00,0x80,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0x7f,0xfe,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xf0, + 0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfe,0xff, + 0xff,0xff,0xff,0xff,0x0f,0x00,0xf0,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0x7f,0xfe,0xff,0xff,0x0f,0xff,0xff,0x1f,0x00,0xf0,0x00, + 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfe,0xff,0xff, + 0x07,0xff,0xff,0x1f,0x00,0xf0,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0x3f,0xff,0xff,0xbf,0x00,0xff,0xff,0x1f,0x00,0xf0,0x00,0x00, + 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0x0f,0x00, + 0xff,0xff,0x1f,0x00,0xf0,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0xfe,0xff,0x3f,0x00,0xf0,0x00,0x00,0xe0, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xfe, + 0xff,0x3f,0x00,0xf0,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0x1f,0x00,0x00,0xfe,0xff,0x3f,0x00,0xf0,0x00,0x00,0xf0,0xff, + 0xff,0xff,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xfc,0xff, + 0x3f,0x00,0xf0,0x00,0x00,0xf0,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff, + 0xff,0x0f,0x00,0x00,0x00,0xfc,0xff,0x3f,0x00,0xf0,0x00,0x00,0xf0,0xff,0xff, + 0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xf8,0xff,0x3f, + 0x00,0xf0,0x00,0x00,0xf0,0xff,0xff,0x03,0xf0,0xff,0xff,0xff,0xff,0xff,0x7f, + 0x00,0x00,0x00,0x00,0xf8,0xff,0x3f,0x00,0xf0,0x00,0x00,0xf0,0xff,0xff,0x03, + 0xe0,0xff,0xff,0xe7,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0xf8,0xff,0x7f,0x00, + 0xf0,0x00,0x00,0xf0,0xff,0xff,0x01,0x00,0x00,0x80,0xc3,0xff,0xff,0x01,0x00, + 0x00,0x00,0x00,0xf8,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x01,0x00, + 0x00,0x00,0x00,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,0x00,0xf0, + 0x00,0x00,0xf8,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xf8,0x07,0x00,0x00,0x00, + 0x00,0x00,0xf0,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,0x00,0xf0,0x00, + 0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xe0,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x07,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x7f,0x00,0xf0,0x00,0x00, + 0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xc0,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8, + 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, + 0xff,0xff,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff, + 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff, + 0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff, + 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x7f, + 0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x7f,0x00, + 0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x80,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x7f,0x00,0xf0, + 0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xc0,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xc0,0xff,0x7f,0x00,0xf0,0x00, + 0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x70,0xc0,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xc0,0xff,0x7f,0x00,0xf0,0x00,0x00, + 0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, + 0xc1,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xc1,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8, + 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xc1, + 0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xf8,0xc1,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff, + 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xc1,0xff, + 0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf8,0xc1,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf0,0xff,0xff, + 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xc1,0xff,0x7f, + 0x00,0xf0,0x00,0x00,0xf0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xf0,0xc1,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf0,0xff,0xff,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xc1,0xff,0x7f,0x00, + 0xf0,0x00,0x00,0xf0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xf0,0xc1,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf0,0xff,0xff,0x03,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xc1,0xff,0x7f,0x00,0xf0, + 0x00,0x00,0xf0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xe0,0xc3,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf0,0xff,0xff,0x03,0x40,0x91, + 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x00,0xe0,0xc3,0xff,0x7f,0x00,0xf0,0x00, + 0x00,0xf0,0xff,0xff,0x03,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xf0,0xff,0x0f, + 0xe0,0xc3,0xff,0x7f,0x00,0xf0,0x00,0x00,0xf0,0xff,0xff,0xc3,0xff,0xff,0x0f, + 0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xf3,0xc3,0xff,0x7f,0x00,0xf0,0x00,0x00, + 0xfc,0xff,0xff,0xe3,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xf7, + 0x83,0xff,0xff,0x00,0xf0,0x00,0x00,0xfc,0xff,0xff,0xf3,0xff,0xff,0x7f,0x00, + 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x83,0xff,0xff,0x00,0xf0,0x00,0x00,0xfc, + 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x03, + 0xff,0xff,0x00,0xf0,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00, + 0x00,0x80,0xff,0xff,0xff,0xff,0x07,0xff,0xff,0x00,0xf0,0x00,0x00,0xfc,0xff, + 0xff,0xff,0x01,0xfc,0xff,0x01,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0x07,0xff, + 0xff,0x00,0xf0,0x00,0x00,0xfc,0xff,0xff,0x5f,0x00,0xf8,0xff,0x03,0x00,0x00, + 0xc0,0xff,0x3f,0x00,0xff,0x0f,0xff,0xff,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff, + 0x1f,0x00,0xe0,0xff,0x07,0x00,0x00,0xe0,0xff,0x03,0x00,0xfc,0x0f,0xfe,0x7f, + 0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x1f,0x00,0xc0,0xff,0x0f,0x00,0x00,0xf0, + 0xff,0x00,0x00,0xf0,0x0f,0xfe,0x7f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0x1f, + 0xf0,0xff,0xff,0x1f,0x00,0x00,0xf8,0xff,0x23,0x00,0xe0,0x1f,0xfe,0x3f,0x00, + 0xf0,0x00,0x00,0xf8,0xff,0xff,0x1f,0xfe,0xff,0xff,0x3f,0x00,0x00,0xfc,0xff, + 0xff,0x07,0xe0,0x1f,0xfe,0x3f,0x00,0xf0,0x00,0x00,0xf8,0xff,0xff,0xff,0xff, + 0xff,0xff,0x7f,0x00,0x00,0xfe,0xff,0xff,0x3f,0xc0,0x1f,0xfe,0x3f,0x00,0xf0, + 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff, + 0x7f,0xc0,0x1f,0xfe,0x3f,0x00,0xf0,0x00,0x00,0xf8,0xff,0x3f,0xfe,0xff,0xff, + 0xff,0xff,0x01,0x80,0xff,0xff,0xff,0xff,0x81,0x1f,0xfc,0x3f,0x00,0xf0,0x00, + 0x00,0xf8,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0x01,0xc0,0xff,0xff,0xff,0xff, + 0x83,0x1f,0xfc,0x3f,0x00,0xf0,0x00,0x00,0xf8,0xff,0x1f,0xf8,0xff,0xff,0xff, + 0xff,0x01,0xe0,0xff,0xff,0xff,0xff,0x83,0x1f,0xfc,0x3f,0x00,0xf0,0x00,0x00, + 0xf8,0xff,0x1f,0xf8,0xf7,0xff,0xf9,0xff,0x01,0xe0,0xff,0xff,0xff,0xfb,0x03, + 0x1f,0xfc,0x3f,0x00,0xf0,0x00,0x00,0xf8,0xff,0x0f,0xf8,0xc1,0xff,0xe0,0xff, + 0x03,0xf0,0xff,0x83,0xff,0xe1,0x07,0x1e,0xfe,0x3f,0x00,0xf0,0x00,0x00,0xf8, + 0xff,0x0f,0xf8,0xc1,0xff,0xe0,0xff,0x03,0xf0,0xff,0x83,0xff,0xe1,0x07,0x1e, + 0xfe,0x3f,0x00,0xf0,0x00,0x00,0xf8,0xff,0x0f,0xf8,0xc0,0xff,0xe0,0xff,0x03, + 0xe0,0xff,0x81,0xff,0xe1,0x07,0x1f,0xfe,0x3f,0x00,0xf0,0x00,0x00,0xf8,0xff, + 0x0f,0xf8,0xc0,0xff,0xe0,0xff,0x03,0xc0,0xff,0x80,0xff,0xe1,0x03,0x1e,0xfe, + 0x3f,0x00,0xf0,0x00,0x00,0xf8,0xff,0x1f,0x70,0xc0,0x7f,0xf0,0xff,0x03,0x00, + 0x00,0x80,0xff,0xe1,0x01,0x1e,0xfe,0x3f,0x00,0xf0,0x00,0x00,0xf8,0xff,0x1f, + 0x20,0x00,0x07,0xf8,0xff,0x03,0x00,0x00,0xf8,0xff,0xc0,0x00,0x1e,0xfe,0x1f, + 0x00,0xf0,0x00,0x00,0xf8,0xff,0x0f,0x00,0x00,0x00,0xfe,0xff,0x03,0x00,0x00, + 0xfe,0x07,0x00,0x00,0x1e,0xfe,0x1f,0x00,0xf0,0x00,0x00,0xf8,0xff,0x0f,0x00, + 0x00,0x80,0xff,0xfc,0x03,0x00,0x00,0xfe,0x03,0x00,0x00,0x1e,0xfe,0x1f,0x00, + 0xf0,0x00,0x00,0xf8,0xbf,0x0f,0x00,0x00,0xe0,0xff,0xfc,0x03,0x00,0x00,0xfe, + 0x03,0x00,0x00,0x08,0xfe,0x1f,0x00,0xf0,0x00,0x00,0xf0,0xbf,0x0f,0x00,0x00, + 0xf8,0x7f,0xfc,0x03,0x00,0x00,0xfc,0x0f,0x00,0x00,0x00,0xfe,0x1f,0x00,0xf0, + 0x00,0x00,0xf0,0x3f,0x0f,0x00,0xfc,0xff,0x3f,0xf8,0x03,0x00,0x00,0xf8,0xff, + 0x00,0x00,0x00,0xfe,0x0f,0x00,0xf0,0x00,0x00,0xf0,0x3f,0x0e,0x00,0xfc,0xff, + 0x0f,0xf8,0x01,0x00,0x00,0xf0,0xff,0x01,0x00,0x00,0xfe,0x1f,0x00,0xf0,0x00, + 0x00,0xf0,0x3f,0x0f,0x00,0xfc,0xff,0x07,0xf8,0x01,0x00,0x00,0xc0,0xff,0x01, + 0x00,0x00,0xfe,0x0f,0x00,0xf0,0x00,0x00,0xf0,0x7f,0x06,0x00,0xfc,0xff,0x01, + 0xf8,0x01,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x0f,0x00,0xf0,0x00,0x00, + 0xf0,0x7f,0x06,0x00,0xe0,0x3f,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xfe,0x0f,0x00,0xf0,0x00,0x00,0xf0,0x7f,0x06,0x00,0x00,0x07,0x00,0xf8, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x07,0x00,0xf0,0x00,0x00,0xe0, + 0x7f,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xfe,0x07,0x00,0xf0,0x00,0x00,0xe0,0x7f,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x07,0x00,0xf0,0x00,0x00,0xf0,0x7f, + 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe, + 0x07,0x00,0xf0,0x00,0x00,0xe0,0x7f,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x0f,0x00,0xf0,0x00,0x00,0xe0,0x7f,0x1c, + 0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x0f, + 0x00,0xf0,0x00,0x00,0xe0,0x7f,0x3c,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x9e,0x0f,0x00,0xf0,0x00,0x00,0xe0,0xff,0x3c,0x00, + 0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x0f,0x00, + 0xf0,0x00,0x00,0xc0,0xfd,0x7c,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x9e,0x0f,0x00,0xf0,0x00,0x00,0x80,0xfd,0x7c,0x00,0x00, + 0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x07,0x00,0xf0, + 0x00,0x00,0x00,0xfc,0x7c,0x00,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x9f,0x07,0x00,0xf0,0x00,0x00,0x00,0xfc,0xfc,0x00,0x00,0x00, + 0x80,0x3f,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x00,0xf0,0x00, + 0x00,0x80,0xff,0xfc,0x00,0x00,0x00,0xe0,0x3f,0x00,0x38,0x00,0x00,0x00,0x00, + 0x00,0x00,0xff,0x03,0x00,0xf0,0x00,0x00,0x80,0xff,0xf8,0x01,0x00,0x00,0xf0, + 0x3f,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,0x00,0xf0,0x00,0x00, + 0x00,0xff,0xf8,0x03,0x00,0x00,0xf8,0x3f,0x00,0x20,0x00,0x1e,0x00,0x00,0x00, + 0x04,0xef,0x01,0x00,0xf0,0x00,0x00,0x00,0xff,0xf8,0x03,0x00,0x00,0xff,0x1f, + 0x00,0x20,0xc0,0x7f,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, + 0x7c,0xf8,0x07,0x00,0x80,0xff,0x1f,0x00,0x00,0xe0,0xff,0x01,0x00,0x00,0x0f, + 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf8,0x07,0x00,0xe0,0xff,0x1f,0x00, + 0x00,0xe0,0xff,0x03,0x00,0xc0,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, + 0xf8,0x07,0x00,0xf0,0xff,0x1f,0x00,0x00,0xf0,0xff,0x07,0x00,0xc0,0x1f,0x00, + 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0xf8,0xfe,0x1f,0x00,0x00, + 0xfc,0xf3,0x0f,0x00,0xf0,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf8, + 0x0f,0x00,0x7c,0xfc,0x3f,0x00,0x80,0xff,0xe1,0x3f,0x00,0xf8,0x0f,0x00,0x00, + 0x00,0xf0,0x00,0x00,0x00,0x00,0xf8,0x1f,0x00,0x3e,0xfc,0xbf,0x00,0xe0,0xff, + 0xc0,0x3f,0x00,0xfe,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf8,0x1f, + 0x00,0x1f,0xfc,0xff,0x03,0xf0,0x7f,0x80,0x7f,0x80,0xff,0x0f,0x00,0x00,0x00, + 0xf0,0x00,0x00,0x00,0x00,0xf8,0x1f,0x80,0x0f,0xfe,0xff,0x07,0xfe,0x3f,0x00, + 0x7f,0xf8,0xff,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf8,0x7f,0xe0, + 0x07,0xff,0xff,0xff,0xff,0x1f,0x00,0xff,0xf9,0xff,0x0f,0x00,0x00,0x00,0xf0, + 0x00,0x00,0x00,0x00,0xf8,0xff,0xf0,0x83,0xff,0xff,0xff,0xff,0x03,0x00,0xfe, + 0xff,0xff,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x83, + 0xff,0xff,0xff,0xff,0x00,0x00,0xfe,0xff,0xff,0x0f,0x00,0x00,0x00,0xf0,0x00, + 0x00,0x00,0x00,0xfc,0xff,0xff,0x80,0xff,0xff,0xff,0x7f,0x00,0x00,0xfc,0xff, + 0xff,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xe0,0xff, + 0xff,0xff,0x3f,0x00,0x00,0xf8,0xff,0xff,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00, + 0x00,0x00,0xfc,0xff,0x7f,0xe0,0xff,0xff,0xff,0x1f,0x00,0x00,0xf8,0xff,0xff, + 0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xfc,0xff,0x3f,0xf0,0xff,0xff, + 0xff,0x0f,0x00,0x00,0xf0,0xff,0xff,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, + 0x00,0xfe,0xff,0x1f,0xfc,0xff,0xff,0xff,0x07,0x00,0x00,0xf8,0xff,0xff,0x0f, + 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xfc,0xff,0x07,0xff,0xff,0xff,0xff, + 0x03,0x00,0xf0,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, + 0xfc,0xff,0x83,0xff,0xff,0xff,0xff,0x01,0x00,0xff,0xff,0x1f,0xff,0x1f,0x00, + 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xfc,0xff,0x81,0xff,0xff,0xff,0xff,0x00, + 0xe0,0xff,0xff,0x07,0xf8,0x1f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xfc, + 0xff,0x01,0xff,0xff,0xff,0x3f,0x80,0xff,0xff,0xff,0x01,0xf8,0x3f,0x00,0x00, + 0x00,0xf0,0x00,0x00,0x00,0x00,0xfc,0xff,0x01,0xfe,0xff,0xff,0x1f,0xc0,0xff, + 0xff,0xff,0x00,0xf8,0x1f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf8,0xff, + 0x01,0xf8,0xff,0xff,0x1f,0xf8,0xff,0xff,0x7f,0x00,0xf8,0x1f,0x00,0x00,0x00, + 0xf0,0x00,0x00,0x00,0x00,0xf8,0xff,0x01,0xf8,0x8f,0xfc,0xff,0xff,0xff,0xff, + 0x3f,0x00,0xfc,0x1f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf8,0xff,0x01, + 0xf8,0x0f,0xe0,0xff,0xff,0x07,0xf8,0x0f,0x00,0xfc,0x1f,0x00,0x00,0x00,0xf0, + 0x00,0x00,0x00,0x00,0xf8,0xe7,0x03,0xf8,0x0f,0x00,0x04,0x00,0x00,0xf8,0x0f, + 0x00,0xfc,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf0,0xef,0x03,0xfc, + 0x0f,0x00,0x00,0x00,0x00,0xfe,0x07,0x00,0xfc,0x0f,0x00,0x00,0x00,0xf0,0x00, + 0x00,0x00,0x00,0xf0,0xef,0x07,0xfc,0x1f,0x00,0x00,0x00,0x00,0xff,0x03,0x00, + 0xfc,0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xf0,0xc7,0x07,0xf8,0x3f, + 0x00,0x00,0x00,0x00,0xff,0x01,0x00,0xfe,0x07,0x00,0x00,0x00,0xf0,0x00,0x00, + 0x00,0x00,0xe0,0xc7,0x07,0xf8,0xff,0x01,0x00,0x00,0x00,0xff,0x00,0x00,0xfe, + 0x07,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xe0,0xc7,0x07,0xf0,0xff,0x0f, + 0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x07,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, + 0x00,0xe0,0xc7,0x07,0xf0,0xff,0x1f,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x03, + 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xc0,0xcf,0x07,0xf0,0xff,0x3f,0x00, + 0x00,0xc0,0x7f,0x00,0x00,0xff,0x03,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, + 0xc0,0xdf,0x07,0xe0,0xff,0x3f,0x00,0x00,0xe0,0x07,0x00,0x80,0xff,0x01,0x00, + 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x80,0x9f,0x0f,0xe0,0xff,0x7f,0x00,0x00, + 0xc6,0x00,0x00,0x80,0xff,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x80, + 0xbf,0x0f,0xe0,0xff,0x7f,0x00,0xfc,0x0f,0x00,0x00,0x80,0xff,0x00,0x00,0x00, + 0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xff,0x0f,0xc0,0xff,0xff,0xff,0xff,0x0f, + 0x00,0x00,0xc0,0xff,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xff, + 0x0f,0x80,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xc0,0x7f,0x00,0x00,0x00,0x00, + 0xf0,0x00,0x00,0x00,0x00,0x00,0xfe,0x0f,0x80,0xff,0xff,0xff,0x7f,0x00,0x00, + 0x00,0xc0,0x7f,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xfe,0x0f, + 0x80,0xff,0xff,0xf0,0x3f,0x00,0x00,0x00,0xe0,0x7f,0x00,0x00,0x00,0x00,0xf0, + 0x00,0x00,0x00,0x00,0x00,0xfc,0x1f,0xc0,0xff,0x7f,0x00,0x00,0x00,0x00,0x00, + 0xe0,0x3f,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xfc,0x1f,0xe0, + 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,0x00,0x00,0x00,0x00,0xf0,0x00, + 0x00,0x00,0x00,0x00,0xf8,0x3c,0xf0,0xff,0x7f,0x00,0x00,0x10,0x00,0x00,0xf0, + 0x1f,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xf8,0x3c,0xf0,0xff, + 0xff,0x00,0xf0,0x7f,0x00,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, + 0x00,0x00,0x00,0xf0,0x18,0xfc,0xff,0xff,0x07,0xfe,0xff,0x00,0x00,0xf8,0x1f, + 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0xfe,0xff,0xff, + 0xff,0xff,0xff,0x01,0x00,0xf8,0x0f,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, + 0x00,0x00,0xe0,0x00,0xff,0xcf,0xff,0xff,0xff,0xff,0x01,0x00,0xfc,0x0f,0x00, + 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x40,0xc0,0xff,0x87,0xff,0xff, + 0xff,0xff,0x01,0x00,0xfc,0x07,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x00,0xe0,0xff,0x83,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,0x03,0x00,0x00, + 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x81,0xff,0xff,0xff, + 0x7f,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf0,0xff,0x81,0xff,0xff,0xff,0x1f,0x00,0x00,0xfe,0x01,0x00,0x00,0x00, + 0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xc1,0xff,0xcf,0xff,0x0f, + 0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, + 0xfc,0xff,0xf0,0xff,0x03,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00, + 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xf0,0xff,0x00,0x00,0x00,0x00, + 0xc0,0xff,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0xfe, + 0x7f,0xf0,0x3f,0x00,0x00,0x00,0x00,0xc0,0xff,0x00,0x00,0x00,0x00,0x00,0xf0, + 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x3f,0xf0,0x3f,0x00,0x00,0x00,0x00,0xc0, + 0x7f,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0xc0,0x00,0x00,0x00,0xff,0x3f, + 0xfc,0x1f,0x00,0x00,0x00,0x00,0xe0,0x3f,0x00,0x00,0x00,0x00,0x00,0xf0,0x00, + 0x00,0xf0,0x03,0x03,0xc0,0xff,0x1f,0xfc,0x0f,0x00,0x00,0x00,0x00,0xf0,0x1f, + 0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0xfc,0x83,0x07,0xe0,0xff,0x3f,0xfc, + 0x07,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, + 0xfe,0x87,0x07,0xf0,0xff,0x3f,0xfe,0x07,0x00,0x00,0x00,0x00,0xfc,0x0f,0x00, + 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0xfe,0xc3,0x0f,0xf8,0xff,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0xfe,0x0f,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x80,0xff, + 0xc3,0x1f,0xfc,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00, + 0x00,0x00,0x00,0xf0,0x00,0x80,0xff,0xe3,0x1f,0xfe,0xff,0xff,0xff,0x07,0x00, + 0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xe0,0xff,0xf1, + 0x3f,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x80,0xff,0x01,0x00,0x00,0x00, + 0x00,0x00,0xf0,0x00,0xe0,0x1f,0xfc,0xff,0xff,0x3f,0xfc,0xff,0x03,0x00,0x00, + 0x00,0xe0,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xe0,0x1f,0xfc,0xff, + 0xff,0x3f,0xfc,0xff,0x03,0x00,0x00,0x00,0xe0,0x7f,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf0,0x00,0xe0,0x0f,0xfc,0xff,0xff,0x1f,0xfc,0xff,0x03,0x00,0x00,0x00, + 0xf0,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xc0,0x01,0xfe,0xff,0xff, + 0x1f,0xf8,0xff,0x07,0x00,0x00,0x00,0xfc,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf0,0x00,0x00,0x00,0xfe,0xff,0xff,0x0f,0xf8,0xff,0x0f,0x00,0x00,0x80,0xff, + 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, + 0xf0,0xff,0xff,0x0f,0x08,0xfc,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, + 0x00,0x0f,0x1c,0xfc,0xff,0xff,0x07,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x80,0xff,0x1f,0xf8,0xff,0xff,0x03,0xc0, + 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00, + 0xff,0x3f,0xf8,0xff,0xff,0x01,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00, + 0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xff,0x3f,0xf0,0xff,0xff,0x00,0x80,0xff, + 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xff, + 0x7f,0xf0,0xff,0xff,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf0,0x00,0xff,0xff,0xe0,0xff,0x7f,0x00,0x00,0xf0,0xff, + 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xff,0xff, + 0xe0,0xff,0x7f,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xf0,0x00,0xfe,0xff,0xc0,0xff,0x3f,0x00,0x00,0x00,0x00,0xf8, + 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xfc,0xff,0xc1, + 0xff,0x1f,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xf0,0x00,0xfc,0xff,0xc1,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xfc,0xff,0xc1,0xff, + 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf0,0x00,0xfc,0xff,0xc1,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xf8,0xff,0xc3,0xff,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf0,0x00,0xf8,0xff,0xc3,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xf0,0xff,0xc3,0xff,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, + 0x00,0xf0,0xff,0xc7,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xe0,0xff,0xff,0xff,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00, + 0xe0,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xc0,0xff,0xff,0x3f,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x80, + 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0xfe, + 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xf0,0x00,0x00,0xfc,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0xf8,0xff, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xf0,0x00,0x00,0xe0,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/source/xap/xlockmore/l-linux.xbm b/source/xap/xlockmore/l-linux.xbm new file mode 100644 index 00000000..7ceeaf90 --- /dev/null +++ b/source/xap/xlockmore/l-linux.xbm @@ -0,0 +1,205 @@ +#define image_width 128 +#define image_height 151 +static unsigned char image_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x05, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x06, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x09, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x02, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x50, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x14, 0x00, + 0xe8, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x03, 0x2e, 0x00, 0x5c, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x5f, 0x00, 0xf7, 0x0b, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0x7d, 0x00, + 0xfe, 0x0f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x83, 0x7f, 0x80, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xf1, 0x80, 0x0f, 0x1f, 0x00, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xe0, 0x80, + 0x87, 0x1e, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc7, 0xc8, 0x81, 0x87, 0x1c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xd0, 0x80, 0x03, 0x3c, 0x00, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xd0, 0x81, + 0x03, 0x3c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc7, 0xc0, 0x00, 0x03, 0x3c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xc0, 0x2a, 0x03, 0x3c, 0x00, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x41, 0xff, + 0x01, 0x3c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xa1, 0x2b, 0x0f, 0x1e, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xeb, 0xfe, 0x9f, 0x0f, 0x00, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf7, 0xfb, + 0x76, 0x0d, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0xba, 0xdf, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xea, 0xfd, 0xdb, 0x1e, 0x00, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x7d, 0x6f, + 0xff, 0x1b, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xd6, 0xfd, 0x6d, 0x1b, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x47, 0xfb, 0xef, 0xf7, 0x15, 0x00, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x47, 0x6d, 0xff, + 0x3e, 0x1d, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xde, 0xbb, 0xcf, 0x16, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfa, 0xef, 0xb3, 0x0b, 0x04, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xd8, 0xbe, + 0xe8, 0x05, 0x08, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xf2, 0x37, 0x55, 0x1d, 0x54, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x01, 0x40, 0x7d, 0x3f, 0x28, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd7, 0xbf, + 0x8b, 0x3f, 0xa8, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0x57, 0x65, 0xf5, 0x77, 0x50, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x4e, 0x5b, 0x75, 0x5f, 0x40, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x3f, 0x2a, + 0xfd, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x83, 0x77, 0x89, 0xee, 0xff, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xdf, 0xf5, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x7f, 0xff, + 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xff, 0xfd, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xc0, 0xdf, 0xb7, 0xff, 0xff, 0x03, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe0, 0xff, 0xfe, + 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0xf0, 0xff, 0xfb, 0xff, 0xff, 0x07, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfc, 0xff, + 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x7f, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0xff, 0x3f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x3f, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x1f, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0x0f, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x0f, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x07, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x03, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x03, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xc3, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xe3, 0xc3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf0, 0xff, + 0xff, 0xff, 0x5f, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x36, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xbb, 0x1d, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xfc, 0xff, + 0xff, 0xff, 0xf7, 0x37, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xda, 0x5e, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xbd, 0xfb, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0x00, 0x80, 0xfb, 0xff, + 0xff, 0xff, 0xeb, 0xbf, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, + 0x00, 0x80, 0xfe, 0xff, 0xff, 0x7f, 0xfd, 0xf5, 0x81, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0x15, 0x00, 0xc0, 0xf7, 0xff, 0xff, 0x5f, 0xb7, 0xde, + 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0x00, 0xe0, 0xfe, 0xff, + 0xff, 0xaf, 0xfd, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x3d, + 0x00, 0xb0, 0xf7, 0xff, 0xff, 0x6a, 0xd7, 0xb6, 0x05, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x57, 0x01, 0xd4, 0xfd, 0xff, 0x6f, 0xb5, 0xbf, 0xff, + 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xbb, 0x4a, 0x75, 0xff, 0xff, + 0xf3, 0xef, 0xf5, 0xb6, 0x06, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0xaa, 0xda, 0xf7, 0xff, 0x5f, 0x7d, 0xef, 0xff, 0x1f, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xbf, 0xaa, 0xf6, 0xfd, 0xff, 0xf5, 0xdf, 0x7f, 0xb7, + 0x2d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xd5, 0x55, 0xbb, 0xde, 0xff, + 0xdd, 0xf6, 0xd5, 0xfb, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xbe, + 0xfe, 0xee, 0xf7, 0xff, 0xf7, 0x7b, 0x7f, 0x6f, 0x5b, 0x00, 0xfe, 0xff, + 0xff, 0xff, 0x7f, 0xd5, 0xab, 0xfd, 0xbd, 0xff, 0x7b, 0xef, 0xfd, 0xdf, + 0xbf, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xfd, 0xda, 0xb7, 0xef, 0xff, + 0xad, 0xbf, 0x57, 0xfb, 0xf6, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xaa, + 0xf7, 0xfe, 0xfd, 0xfe, 0xfb, 0xf5, 0xff, 0xb7, 0x7f, 0x01, 0xfe, 0xff, + 0xff, 0xff, 0x3f, 0xfd, 0x5e, 0xb7, 0xb7, 0xfb, 0x6d, 0x5f, 0xbd, 0xee, + 0xeb, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x5f, 0xab, 0xfb, 0xfd, 0xde, 0xff, + 0xf7, 0xff, 0xef, 0xbd, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfd, + 0xef, 0xdf, 0xbd, 0xed, 0xdb, 0xea, 0xfb, 0xfb, 0xbb, 0xc5, 0xff, 0xff, + 0xff, 0xff, 0x83, 0xb6, 0x7d, 0xf7, 0xf7, 0xff, 0xb5, 0xbf, 0x5e, 0xaf, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfb, 0xdf, 0xdf, 0xfe, 0xad, + 0xfb, 0xee, 0xf7, 0xff, 0xde, 0xea, 0xff, 0xff, 0xff, 0xff, 0x40, 0xad, + 0xfb, 0xfa, 0xd7, 0xfe, 0xd7, 0xbb, 0xde, 0xf6, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0xfd, 0xee, 0xbf, 0xfd, 0xb7, 0xfb, 0xff, 0xfb, 0xbf, + 0xbf, 0xd6, 0xff, 0xff, 0xff, 0x1f, 0xc0, 0xee, 0xbf, 0xf7, 0x77, 0xdf, + 0x55, 0xdb, 0x5f, 0xed, 0xd6, 0xaf, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xbb, + 0xf6, 0x5e, 0xdf, 0xf6, 0xfb, 0xfe, 0xf6, 0xff, 0xff, 0xb5, 0xff, 0xff, + 0xff, 0x03, 0x40, 0xf5, 0xbf, 0xfb, 0xfb, 0xdf, 0xed, 0xab, 0xdf, 0x55, + 0x5b, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x80, 0xde, 0xfa, 0x5e, 0x6f, 0xf5, + 0xb7, 0xff, 0xf6, 0xfe, 0xff, 0x6b, 0xfc, 0xff, 0x1f, 0x00, 0x40, 0xf7, + 0xd7, 0xf7, 0xfb, 0xff, 0xdb, 0xed, 0xff, 0xbb, 0xed, 0x36, 0xe0, 0x7f, + 0x00, 0x00, 0x80, 0x7a, 0x7f, 0xdd, 0xae, 0xfe, 0xed, 0xde, 0xb6, 0xff, + 0x77, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xdd, 0xed, 0xfb, 0xdf, 0xff, + 0x57, 0xbb, 0xfb, 0xdb, 0xde, 0xab, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf7, + 0xf7, 0xdf, 0xea, 0xff, 0xbb, 0xed, 0xae, 0xbe, 0x7f, 0x5d, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xba, 0xbf, 0x76, 0xfb, 0xff, 0x4b, 0xb5, 0xf5, 0xf7, + 0xf6, 0x57, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6d, 0xdb, 0xaf, 0xfc, 0xff, + 0xa7, 0xaa, 0x56, 0xdd, 0x5f, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, + 0xf7, 0x5a, 0xff, 0xff, 0x1f, 0xa9, 0x5a, 0xf5, 0xf6, 0x2b, 0x00, 0x00, + 0x00, 0x00, 0xa0, 0x5a, 0x5d, 0x95, 0xff, 0xff, 0xff, 0xa7, 0x52, 0xab, + 0x5d, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x80, 0x6a, 0xd7, 0xca, 0xff, 0xff, + 0xff, 0x1f, 0xa4, 0x54, 0xab, 0x09, 0x00, 0xfc, 0xff, 0xff, 0x00, 0xaa, + 0xba, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x41, 0xaa, 0x5a, 0x25, 0xf8, 0xff, + 0xff, 0xff, 0x0f, 0xd5, 0x4a, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xa4, + 0x4a, 0x02, 0xfc, 0xff, 0xff, 0xff, 0x4f, 0xa4, 0x2a, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x11, 0x29, 0x91, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x52, + 0x95, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x44, 0xc4, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0x90, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x12, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x08, 0x91, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff}; diff --git a/source/xap/xlockmore/s-bob.xbm b/source/xap/xlockmore/s-bob.xbm new file mode 100644 index 00000000..47b24090 --- /dev/null +++ b/source/xap/xlockmore/s-bob.xbm @@ -0,0 +1,94 @@ +#define s-bob_width 86 +#define s-bob_height 123 +static char s-bob_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00, + 0x00,0xfe,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff, + 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xfd,0x07,0x00, + 0x00,0x00,0x00,0xf0,0xff,0x7f,0xff,0xf7,0xfb,0x07,0x00,0x00,0x00,0x00,0xf8, + 0xff,0x7f,0xf8,0xee,0xf9,0x0f,0x00,0x00,0x00,0x00,0xfc,0xff,0xf3,0xf0,0xcc, + 0xf9,0x1f,0x00,0x00,0x00,0x00,0xfe,0x4f,0xe7,0xe1,0x81,0xf1,0x3d,0x00,0x00, + 0x00,0x00,0xff,0x0f,0xc6,0xc1,0x81,0xf3,0x3d,0x00,0x00,0x00,0x80,0xff,0x0f, + 0x8e,0xc1,0x81,0xff,0x7d,0x00,0x00,0x00,0x80,0xff,0x1f,0x8f,0x81,0x81,0xff, + 0xff,0x01,0x00,0x00,0xc0,0xff,0xff,0x9f,0x83,0x03,0xff,0xff,0x03,0x00,0x00, + 0xc0,0xff,0xff,0x1f,0x83,0x83,0xff,0xff,0x07,0x00,0x00,0xe0,0xff,0xff,0xbf, + 0x87,0xef,0xff,0xff,0x0f,0x00,0x00,0xf0,0xff,0xff,0xff,0x9f,0xef,0xff,0xff, + 0x1f,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0x3f,0x00,0x00,0xf0, + 0xff,0xff,0xff,0xff,0xef,0xff,0xf3,0x7f,0x00,0x00,0xf8,0xff,0xff,0xff,0xff, + 0xf7,0x7f,0xf0,0x7f,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0x1f,0xe0,0x7f, + 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0x07,0xe0,0x7f,0x00,0x00,0xfc,0xff, + 0xfc,0xff,0xff,0x3f,0x00,0xe0,0x7f,0x00,0x00,0xfc,0x1f,0xfc,0xff,0xff,0x0f, + 0x00,0xc0,0x7f,0x00,0x00,0xfc,0x1f,0x00,0x90,0xff,0x01,0x00,0xc0,0xff,0x00, + 0x00,0xfc,0x1f,0x00,0x00,0x3c,0x00,0x00,0xc0,0xff,0x00,0x00,0xfc,0x1f,0x00, + 0x00,0x00,0x00,0x00,0x80,0xff,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00, + 0x80,0xff,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x00,0x00, + 0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x00,0x00,0xfc,0x1f,0x00,0x00, + 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, + 0xff,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x00,0x00,0xfc, + 0x1f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00, + 0x00,0x00,0x8c,0xff,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x9c,0xff, + 0x00,0x00,0xfc,0x3f,0x00,0x00,0x00,0x00,0x00,0x9c,0xff,0x00,0x00,0xfc,0x3f, + 0x00,0x00,0x00,0x00,0x00,0x9c,0xff,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00,0x00, + 0x00,0x9c,0xff,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x9c,0xff,0x00, + 0x00,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x98,0xff,0x00,0x00,0xfc,0x1f,0xff, + 0x03,0x00,0xc0,0x3f,0x98,0xff,0x00,0x00,0xfe,0x9f,0xff,0x07,0x00,0xe0,0xff, + 0x1f,0xff,0x00,0x00,0xfe,0xff,0xff,0x0f,0x00,0xf0,0xff,0x1f,0xff,0x00,0x00, + 0xfe,0xff,0xe1,0x1f,0x00,0xf0,0xff,0x3f,0xff,0x00,0x00,0xfc,0x7f,0x80,0x3f, + 0x00,0xf8,0x01,0x3e,0xfe,0x00,0x00,0xfc,0x7f,0xfc,0x7f,0x00,0xfc,0x01,0x78, + 0x7e,0x00,0x00,0xfc,0xff,0xff,0xff,0x00,0xfe,0x7f,0x78,0x7e,0x00,0x00,0xfc, + 0xe7,0xff,0xff,0x01,0xff,0xff,0x71,0x7e,0x00,0x00,0xfc,0xc7,0xff,0xff,0x81, + 0xff,0xff,0x71,0x7e,0x00,0x00,0xfc,0xc3,0xf9,0xf8,0xc1,0x1f,0x9f,0x63,0x7e, + 0x00,0x00,0xfc,0xc3,0xf8,0xf8,0x81,0x1f,0x9f,0x73,0x7e,0x00,0x00,0xfc,0xc7, + 0xf8,0xfc,0x01,0x00,0x9f,0x61,0x7e,0x00,0x00,0xfc,0x03,0x00,0xfe,0x01,0xe0, + 0x03,0x60,0x7e,0x00,0x00,0x7c,0x03,0x80,0xef,0x01,0xe0,0x01,0x00,0x7e,0x00, + 0x00,0x7c,0x03,0xfe,0xc7,0x01,0xc0,0x0f,0x00,0x3e,0x00,0x00,0x7c,0x03,0xfe, + 0xc3,0x01,0x80,0x1f,0x00,0x3e,0x00,0x00,0xfc,0x02,0x78,0xc0,0x01,0x00,0x00, + 0x00,0x3e,0x00,0x00,0xf8,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x3e,0x00,0x00, + 0xfc,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0xf8,0x06,0x00,0xc0, + 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0xf8,0x06,0x00,0xe0,0x00,0x00,0x00,0x00, + 0x36,0x00,0x00,0xf0,0x0e,0x00,0xf0,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0xe0, + 0x0e,0x00,0x70,0x40,0x00,0x00,0x00,0x3f,0x00,0x00,0xf0,0x1c,0x00,0x7c,0x40, + 0x00,0x00,0x00,0x1f,0x00,0x00,0xf0,0x1c,0x00,0x7f,0x00,0xf8,0x00,0x20,0x00, + 0x00,0x00,0x00,0x3c,0x80,0x7f,0x00,0xf8,0x01,0x38,0x00,0x00,0x00,0x00,0x3c, + 0xc0,0x7e,0x00,0xde,0x03,0x3c,0x00,0x00,0x00,0x00,0x7c,0x60,0x7e,0x80,0x8f, + 0x07,0x3e,0x00,0x00,0x00,0x00,0x7c,0x30,0xfe,0xe3,0x07,0xcf,0x3f,0x00,0x00, + 0x00,0x00,0xfc,0x1c,0xff,0xff,0x01,0xfe,0x3f,0x00,0x00,0x00,0x00,0xfe,0x0f, + 0xff,0xff,0x00,0xfe,0x3f,0x00,0x00,0x00,0x00,0xfe,0x8f,0xff,0x7f,0x00,0xfc, + 0x3f,0x00,0x00,0x00,0x00,0xfe,0xe7,0xff,0x3f,0x00,0xfc,0x3f,0x00,0x00,0x00, + 0x00,0xfe,0xf1,0xff,0x1f,0xf0,0x7f,0x7f,0x00,0x00,0x00,0x00,0xfe,0xf1,0xff, + 0x07,0xff,0x1f,0x7c,0x00,0x00,0x00,0x00,0xfc,0xc1,0xff,0xc7,0xff,0x0f,0x7c, + 0x00,0x00,0x00,0x00,0xfc,0xc1,0x83,0xff,0xc3,0x03,0x7e,0x00,0x00,0x00,0x00, + 0xbc,0xe1,0x03,0x00,0xe0,0x03,0x3e,0x00,0x00,0x00,0x00,0xbc,0xc3,0x07,0x00, + 0xf0,0x01,0x3e,0x00,0x00,0x00,0x00,0xb8,0xc3,0x3f,0x00,0xf0,0x00,0x3f,0x00, + 0x00,0x00,0x00,0xb8,0xc3,0x7f,0x00,0xf8,0x00,0x1f,0x00,0x00,0x00,0x00,0x70, + 0x83,0xff,0x00,0x0a,0x00,0x0f,0x00,0x00,0x00,0x00,0xf0,0x83,0xff,0xff,0x03, + 0x80,0x0f,0x00,0x00,0x00,0x00,0xe0,0x03,0xff,0xff,0x00,0x80,0x0f,0x00,0x00, + 0x00,0x00,0xe0,0x87,0xff,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0xc0,0xc6, + 0xff,0x00,0x04,0xc0,0x07,0x00,0x00,0x00,0x00,0xc0,0xe4,0xff,0xe3,0x0f,0xc0, + 0x07,0x00,0x00,0x00,0x00,0x80,0xf0,0xfb,0xff,0x1f,0xe0,0x03,0x00,0x00,0x00, + 0x00,0x00,0xf8,0xf1,0xff,0x0f,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0xfc,0xf1, + 0xff,0x07,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0xfe,0xfc,0x01,0x00,0xf0,0x00, + 0x00,0x00,0x00,0x00,0x00,0xfe,0x7c,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x08, + 0x00,0x7f,0x7e,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x1e,0x83,0x7f,0x3e,0x00, + 0x00,0x3c,0x00,0x00,0x00,0x00,0x9e,0xc3,0xff,0x3f,0x00,0x00,0x3e,0x00,0x00, + 0x00,0x00,0x9f,0xe7,0xff,0x3f,0x00,0x00,0x1f,0x00,0x00,0x00,0x80,0xe7,0xff, + 0xe7,0x1f,0x00,0x80,0x0f,0x00,0x00,0x00,0x80,0xe3,0xff,0xe7,0x1f,0x00,0xc0, + 0x0f,0x00,0x00,0x00,0x00,0xe0,0xff,0xc3,0x3f,0x00,0xf0,0x07,0x00,0x00,0x00, + 0x30,0xe6,0xff,0x83,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xf0,0xc7,0xff,0x01, + 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xf0,0xcf,0xff,0x00,0xfe,0xff,0xff,0x00, + 0x00,0x00,0x00,0xf0,0x8f,0xff,0x00,0xf0,0xff,0x7f,0x00,0x00,0x00,0x00,0xe0, + 0x9f,0x7f,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0xe0,0x9f,0x3f,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x9f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xc0,0x9f,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff, + 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x07,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00}; diff --git a/source/xap/xlockmore/slack-desc b/source/xap/xlockmore/slack-desc new file mode 100644 index 00000000..92ee2c41 --- /dev/null +++ b/source/xap/xlockmore/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xlockmore: xlockmore (screen locker for X) +xlockmore: +xlockmore: Patrick J. Naughton's xlock screensaver/locker for X, with many +xlockmore: more modes added by David A. Bagley. +xlockmore: +xlockmore: The 'Bob' bitmap has been included especially for Slackware, as well +xlockmore: as a Linux penguin logo. (NOTE: the image of J. R. "Bob" Dobbs is a +xlockmore: registered trademark of The Subgenius Foundation, used by permission) +xlockmore: +xlockmore: +xlockmore: diff --git a/source/xap/xlockmore/xlockmore.SlackBuild b/source/xap/xlockmore/xlockmore.SlackBuild new file mode 100755 index 00000000..f25bf14e --- /dev/null +++ b/source/xap/xlockmore/xlockmore.SlackBuild @@ -0,0 +1,108 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=5.28 +ARCH=${ARCH:-x86_64} +NUMJOBS=${NUMJOBS:-" -j7 "} +BUILD=${BUILD:-1} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC -lcrypt" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xlockmore +rm -rf $PKG +mkdir -p $TMP $PKG + +## Explode the package framework: +#cd $PKG +#tar xzvf $CWD/_xlockmore.tar.gz + +cd $TMP +rm -rf xlockmore-$VERSION +tar xvf $CWD/xlockmore-$VERSION.tar.bz2 || exit 1 +cd xlockmore-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +zcat $CWD/xlockmore.bitmap.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit 1 +mkdir -p $PKG/usr/include/X11/bitmaps +cp $CWD/l-bob.xbm $PKG/usr/include/X11/bitmaps +cp $CWD/s-bob.xbm $PKG/usr/include/X11/bitmaps +cp $CWD/l-linux.xbm $PKG/usr/include/X11/bitmaps +mkdir -p $PKG/usr/doc/xlockmore-$VERSION +cp -a README $PKG/usr/doc/xlockmore-$VERSION/README +cp -a docs/* $PKG/usr/doc/xlockmore-$VERSION +cp -a $CWD/l-bob.README $PKG/usr/doc/xlockmore-$VERSION +## Normal compile: +#./configure --prefix=/usr --without-opengl --without-mesagl \ +# --without-dtsaver --without-rplay --without-nas --disable-bomb +# Use MesaGL/OpenGL: +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --without-dtsaver \ + --without-ttf \ + --without-gtk \ + --without-rplay \ + --without-nas \ + --disable-bomb \ + --without-motif \ + --without-esound \ + --without-gtk \ + $ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +cd xlock + +mkdir -p $PKG/etc/X11/app-defaults +cat XLock.ad > $PKG/etc/X11/app-defaults/XLock +mkdir -p $PKG/usr/bin +cat xlock > $PKG/usr/bin/xlock +chown root.shadow $PKG/usr/bin/xlock +chmod 2751 $PKG/usr/bin/xlock + +mkdir -p $PKG/usr/man/man1 +cat xlock.man | gzip -9c > $PKG/usr/man/man1/xlock.1.gz + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Build the package: +cd $PKG +/sbin/makepkg -l y -c n $TMP/xlockmore-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xlockmore/xlockmore.bitmap.diff b/source/xap/xlockmore/xlockmore.bitmap.diff new file mode 100644 index 00000000..f9d77758 --- /dev/null +++ b/source/xap/xlockmore/xlockmore.bitmap.diff @@ -0,0 +1,20 @@ +--- ./xlock/XLock.ad.orig 2002-05-13 09:51:34.000000000 -0700 ++++ ./xlock/XLock.ad 2002-05-29 21:25:39.000000000 -0700 +@@ -75,6 +75,8 @@ + !XLock.*.bitmap: bitmaps/m-xlock.xbm + !XLock.*.bitmap: pixmaps/m-xlock.xpm + !XLock.*.bitmap: /usr/lib/X11/xlock/bitmaps ++! It's best to have no default here, or it kills the bat mode: ++!XLock.*.bitmap: /usr/X11R6/include/X11/bitmaps/s-bob.xbm + + ! For mailbox check application + !XLock.mailCmd: /usr/ucb/mail -e +@@ -165,6 +167,8 @@ + !XLock.bounce.cycles: 1 + XLock.bounce.size: 0 + XLock.bounce.saturation: 1.0 ++! "Bob" is taking over the bounce mode by default: ++XLock.bounce.bitmap: /usr/X11R6/include/X11/bitmaps/s-bob.xbm + XLock.braid.delay: 1000 + XLock.braid.count: 15 + XLock.braid.cycles: 100 diff --git a/source/xap/xmms/slack-desc b/source/xap/xmms/slack-desc new file mode 100644 index 00000000..6ea4362d --- /dev/null +++ b/source/xap/xmms/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xmms: xmms (X Multimedia System) +xmms: +xmms: XMMS is the X Multimedia System. It is used to play audio and other +xmms: kinds of media files. By default XMMS can play MPEG audio, Ogg +xmms: Vorbis, RIFF wav, most module formats, and a few other formats. XMMS +xmms: can be extended through plugins to play a number of other audio and +xmms: video formats. +xmms: +xmms: +xmms: +xmms: diff --git a/source/xap/xmms/xmms.SlackBuild b/source/xap/xmms/xmms.SlackBuild new file mode 100755 index 00000000..b11afde6 --- /dev/null +++ b/source/xap/xmms/xmms.SlackBuild @@ -0,0 +1,98 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=1.2.11 +ARCH=${ARCH:-x86_64} +NUMJOBS=${NUMJOBS:-" -j7 "} +BUILD=${BUILD:-3} + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" + ARCHOPTS="--enable-simd" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" + ARCHOPTS="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" + ARCHOPTS="" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xmms +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf xmms-$VERSION +tar xvf $CWD/xmms-$VERSION.tar.bz2 || exit 1 +cd xmms-$VERSION || exit 1 + +zcat $CWD/xmms.gtk.doublesize.diff.gz | patch -p1 || exit 1 +zcat $CWD/xmms.wmxmms_vis_depth_workaround.diff.gz | patch -p0 || exit 1 + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --localstatedir=/var/lib \ + --disable-static \ + --with-ipv6 \ + $ARCHOPTS \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +# Add a .desktop file for the menus: +mkdir -p $PKG/usr/share/applications +cat $CWD/xmms.desktop > $PKG/usr/share/applications/xmms.desktop + +mkdir -p $PKG/usr/doc/xmms-$VERSION +cp -a \ + ABOUT-NLS AUTHORS COPYING FAQ INSTALL NEWS README TODO \ + $PKG/usr/doc/xmms-$VERSION + +# Finish up... +gzip -9 $PKG/usr/man/*/* + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/xmms-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xmms/xmms.desktop b/source/xap/xmms/xmms.desktop new file mode 100644 index 00000000..49e4870b --- /dev/null +++ b/source/xap/xmms/xmms.desktop @@ -0,0 +1,13 @@ +[Desktop Entry] +Name=XMMS +GenericName=Audio Player +Comment=Play music +Comment[hu]=Zene lejátszása +Comment[de]=Musik abspielen +Exec=xmms %U +Icon=xmms +MimeType=application/x-ogg;audio/mp3;audio/mpeg;audio/mpegurl;audio/prs.sid;audio/x-flac;audio/x-it;audio/x-mod;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-ms-wma;audio/x-musepack;audio/x-s3m;audio/x-scpls;audio/x-stm;audio/x-wav;audio/x-xm;application/ogg;audio/x-vorbis+ogg +Categories=Application;GTK;AudioVideo;Player; +Terminal=false +Type=Application +Encoding=UTF-8 diff --git a/source/xap/xmms/xmms.gtk.doublesize.diff b/source/xap/xmms/xmms.gtk.doublesize.diff new file mode 100644 index 00000000..226bb78a --- /dev/null +++ b/source/xap/xmms/xmms.gtk.doublesize.diff @@ -0,0 +1,11 @@ +--- ./xmms/util.c.orig 2006-07-16 08:40:04.000000000 -0500 ++++ ./xmms/util.c 2008-09-12 15:49:41.000000000 -0500 +@@ -175,7 +175,7 @@ + * This needs to be optimized + */ + +- dblimg = gdk_image_new(GDK_IMAGE_NORMAL, gdk_visual_get_best(), img->width << 1, img->height << 1); ++ dblimg = gdk_image_new(GDK_IMAGE_NORMAL, gdk_visual_get_best_with_depth(img->depth), img->width << 1, img->height << 1); + if (dblimg->bpp == 1) + { + char *srcptr, *ptr, *ptr2; diff --git a/source/xap/xmms/xmms.wmxmms_vis_depth_workaround.diff b/source/xap/xmms/xmms.wmxmms_vis_depth_workaround.diff new file mode 100644 index 00000000..8b940791 --- /dev/null +++ b/source/xap/xmms/xmms.wmxmms_vis_depth_workaround.diff @@ -0,0 +1,11 @@ +--- wmxmms/wmxmms.c.orig 2008-11-09 19:32:24.000000000 -0600 ++++ wmxmms/wmxmms.c 2008-09-13 12:17:35.000000000 -0500 +@@ -650,7 +650,7 @@ + dock_gc = gdk_gc_new(icon_win->window); + + launch_pixmap = gdk_pixmap_new(window->window, 64, 64, +- gdk_visual_get_best_depth()); ++ -1); + + launch_mask = gdk_pixmap_new(window->window, 64, 64, 1); + mask_gc = gdk_gc_new(launch_mask); diff --git a/source/xap/xpaint/slack-desc b/source/xap/xpaint/slack-desc new file mode 100644 index 00000000..93027a60 --- /dev/null +++ b/source/xap/xpaint/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xpaint: xpaint (simple X paint program) +xpaint: +xpaint: XPaint is a versatile bitmap/pixmap editing tool with a feature set +xpaint: similar to MacPaint. +xpaint: +xpaint: The short features list: +xpaint: Brushes, Spray paint, Pencil, Lines, Arcs, Pattern Fill, Text, +xpaint: Boxes, Circles, Polygons. +xpaint: Works on multiple images simultaneously. Cut/Copy/Paste between all +xpaint: active images. Fatbits/Zoom on the image windows. +xpaint: diff --git a/source/xap/xpaint/xpaint.SlackBuild b/source/xap/xpaint/xpaint.SlackBuild new file mode 100755 index 00000000..c353c738 --- /dev/null +++ b/source/xap/xpaint/xpaint.SlackBuild @@ -0,0 +1,120 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +PKGNAM=xpaint +VERSION=${VERSION:-2.7.8.1} +ARCH=${ARCH:-x86_64} +NUMJOBS=${NUMJOBS:-" -j7 "} +BUILD=${BUILD:-2} + + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.bz2 || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +if [ "$ARCH" = "x86_64" ]; then + # Make it detect Xaw3d: + sed -i -e "s#usr/lib/#usr/lib${LIBDIRSUFFIX}/#g" $( grep -lr 'usr/lib/' * ) +fi +zcat ${CWD}/xpaint_xaw3d_no_scroll_mode.diff.gz | patch -p1 || exit 1 +#zcat ${CWD}/xpaint_2.7.8.1-1.2.diff.gz | patch -p1 || exit 1 + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +./configure + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG +make install.man DESTDIR=$PKG + +( cd bitmaps + mkdir -p ${PKG}/usr/include/X11/bitmaps + find . -name "*.xbm" -exec cp {} ${PKG}/usr/include/X11/bitmaps \; + mkdir -p ${PKG}/usr/include/X11/pixmaps + find . -name "*.xpm" -exec cp {} ${PKG}/usr/include/X11/pixmaps \; + mkdir -p /install +) + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.* + ) + done + ) +fi + +# Compress info files, if any: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +# Add a documentation directory: +mkdir -p ${PKG}/usr/doc/xpaint-$VERSION +cp -a \ + README README.PNG README.old TODO \ + ${PKG}/usr/doc/xpaint-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > ${PKG}/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xpaint/xpaint_2.7.8.1-1.2.diff b/source/xap/xpaint/xpaint_2.7.8.1-1.2.diff new file mode 100644 index 00000000..1f8cc82e --- /dev/null +++ b/source/xap/xpaint/xpaint_2.7.8.1-1.2.diff @@ -0,0 +1,47 @@ +--- ./misc.h.orig 2005-08-15 14:50:05.000000000 -0500 ++++ ./misc.h 2007-05-10 16:46:23.000000000 -0500 +@@ -24,7 +24,7 @@ + long random(void); + #endif + +-#if !defined(__VMS) & !defined(linux) & !defined(__EMX__) & !defined(__FreeBSD__) & !defined(__CYGWIN__) ++#if !defined(__VMS) & !defined(linux) & !defined(__EMX__) & !defined(__FreeBSD__) & !defined(__CYGWIN__) & !defined(__GLIBC__) + #if defined(BSD4_4) || defined(HPArchitecture) || defined(SGIArchitecture) || defined(_AIX) || defined(_SCO_DS) + void srandom(unsigned int); + #else +--- ./Local.config.orig 2005-04-30 16:33:14.000000000 -0500 ++++ ./Local.config 2007-05-10 16:47:02.000000000 -0500 +@@ -132,11 +132,11 @@ + XCOMM You must have the XPM library. + XCOMM Make sure the path name to the library is correct. + +-XPM_LIB = -L/usr/X11R6/lib -lXpm ++XPM_LIB = -lXpm + + XCOMM Make sure this points to the location of the 'xpm.h' file. + +-XPM_INCLUDE = -I/usr/X11R6/include/X11 ++XPM_INCLUDE = -I/usr/include/X11 + + + DEPENDFLAGS = -I./bitmaps +--- ./configure.orig 2005-06-03 07:26:11.000000000 -0500 ++++ ./configure 2007-05-10 16:46:23.000000000 -0500 +@@ -7,7 +7,7 @@ + echo "(looking for Xaw, Xaw3d, Xaw95, neXtaw)" + echo "" + else +- WIDGETS=`echo $1 | tr [a:z] [A:Z]` ++ WIDGETS=`echo $1` + fi + + if test "$WIDGETS" = "" ; then +@@ -54,7 +54,7 @@ + fi + fi + +-if test "$WIDGETS" = "XAW3DG" ; then ++if test "$WIDGETS" = "xaw3dg" ; then + ln -sf /usr/include/X11/Xaw3d xaw_incdir + echo "XAWLIB_DEFINES = -DXAW3D -DXAW3DG" + echo "XAWLIB_DEFINES = -DXAW3D -DXAW3DG" > Local.xawdefs diff --git a/source/xap/xpaint/xpaint_xaw3d_no_scroll_mode.diff b/source/xap/xpaint/xpaint_xaw3d_no_scroll_mode.diff new file mode 100644 index 00000000..f89b12c1 --- /dev/null +++ b/source/xap/xpaint/xpaint_xaw3d_no_scroll_mode.diff @@ -0,0 +1,11 @@ +--- xpaint-2.7.8.1/misc.c.orig 2005-04-24 11:57:52.000000000 +0000 ++++ xpaint-2.7.8.1/misc.c 2008-11-06 21:43:46.000000000 +0000 +@@ -671,7 +671,7 @@ + } + else return; + if (sb == None) return; +-#ifdef XAW3DG ++#if defined(XAW3DG) && defined(XAW_ARROW_SCROLLBARS) + if (((ScrollbarWidget)sb)->scrollbar.scroll_mode == 2 /* if scroll continuous */ + || LookAhead (sb, event)) + return; diff --git a/source/xap/xpdf/VendorP.h.buggy.diff b/source/xap/xpdf/VendorP.h.buggy.diff new file mode 100644 index 00000000..a8c91ab4 --- /dev/null +++ b/source/xap/xpdf/VendorP.h.buggy.diff @@ -0,0 +1,19 @@ +--- ./VendorP.h.orig 2007-02-14 02:45:33.000000000 -0600 ++++ ./VendorP.h 2007-08-08 14:22:17.000000000 -0500 +@@ -76,6 +76,8 @@ + XtPointer extension; /* pointer to extension record */ + } VendorShellClassPart; + ++struct VendorShellClassRec; ++/* + typedef struct _VendorShellClassRec { + CoreClassPart core_class; + CompositeClassPart composite_class; +@@ -85,6 +87,7 @@ + } VendorShellClassRec; + + externalref VendorShellClassRec vendorShellClassRec; ++*/ + + /* New fields for the vendor shell widget. */ + diff --git a/source/xap/xpdf/slack-desc b/source/xap/xpdf/slack-desc new file mode 100644 index 00000000..164302aa --- /dev/null +++ b/source/xap/xpdf/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xpdf: xpdf (PDF viewer for X) +xpdf: +xpdf: Xpdf is a viewer for Portable Document Format (PDF) files. +xpdf: +xpdf: xpdf was written by Derek B. Noonburg. +xpdf: +xpdf: The xpdf package requires the t1lib package to render Type 1 fonts. +xpdf: +xpdf: +xpdf: +xpdf: diff --git a/source/xap/xpdf/xpdf-3.02pl1.patch b/source/xap/xpdf/xpdf-3.02pl1.patch new file mode 100644 index 00000000..cd42fb96 --- /dev/null +++ b/source/xap/xpdf/xpdf-3.02pl1.patch @@ -0,0 +1,33 @@ +*** xpdf-3.02.orig/xpdf/Stream.cc Tue Feb 27 14:05:52 2007 +--- xpdf-3.02/xpdf/Stream.cc Thu Jul 26 14:44:43 2007 +*************** +*** 410,424 **** + ok = gFalse; + + nVals = width * nComps; +- if (width <= 0 || nComps <= 0 || nBits <= 0 || +- nComps >= INT_MAX / nBits || +- width >= INT_MAX / nComps / nBits || +- nVals * nBits + 7 < 0) { +- return; +- } + pixBytes = (nComps * nBits + 7) >> 3; + rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes; +! if (rowBytes <= 0) { + return; + } + predLine = (Guchar *)gmalloc(rowBytes); +--- 410,422 ---- + ok = gFalse; + + nVals = width * nComps; + pixBytes = (nComps * nBits + 7) >> 3; + rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes; +! if (width <= 0 || nComps <= 0 || nBits <= 0 || +! nComps > gfxColorMaxComps || +! nBits > 16 || +! width >= INT_MAX / nComps || // check for overflow in nVals +! nVals >= (INT_MAX - 7) / nBits) { // check for overflow in rowBytes + return; + } + predLine = (Guchar *)gmalloc(rowBytes); diff --git a/source/xap/xpdf/xpdf-3.02pl2.patch b/source/xap/xpdf/xpdf-3.02pl2.patch new file mode 100644 index 00000000..ab9e3c67 --- /dev/null +++ b/source/xap/xpdf/xpdf-3.02pl2.patch @@ -0,0 +1,823 @@ +diff -c -r xpdf-3.02pl1.orig/xpdf/Stream.cc xpdf-3.02/xpdf/Stream.cc +*** xpdf-3.02pl1.orig/xpdf/Stream.cc Thu Oct 25 15:47:38 2007 +--- xpdf-3.02/xpdf/Stream.cc Thu Oct 25 15:48:19 2007 +*************** +*** 1243,1265 **** + columns = columnsA; + if (columns < 1) { + columns = 1; +! } +! if (columns + 4 <= 0) { +! columns = INT_MAX - 4; + } + rows = rowsA; + endOfBlock = endOfBlockA; + black = blackA; +! refLine = (short *)gmallocn(columns + 3, sizeof(short)); +! codingLine = (short *)gmallocn(columns + 2, sizeof(short)); + + eof = gFalse; + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; +! codingLine[0] = 0; +! codingLine[1] = refLine[2] = columns; +! a0 = 1; + + buf = EOF; + } +--- 1243,1268 ---- + columns = columnsA; + if (columns < 1) { + columns = 1; +! } else if (columns > INT_MAX - 2) { +! columns = INT_MAX - 2; + } + rows = rowsA; + endOfBlock = endOfBlockA; + black = blackA; +! // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = columns +! // ---> max codingLine size = columns + 1 +! // refLine has one extra guard entry at the end +! // ---> max refLine size = columns + 2 +! codingLine = (int *)gmallocn(columns + 1, sizeof(int)); +! refLine = (int *)gmallocn(columns + 2, sizeof(int)); + + eof = gFalse; + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; +! codingLine[0] = columns; +! a0i = 0; +! outputBits = 0; + + buf = EOF; + } +*************** +*** 1278,1286 **** + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; +! codingLine[0] = 0; +! codingLine[1] = columns; +! a0 = 1; + buf = EOF; + + // skip any initial zero bits and end-of-line marker, and get the 2D +--- 1281,1289 ---- + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; +! codingLine[0] = columns; +! a0i = 0; +! outputBits = 0; + buf = EOF; + + // skip any initial zero bits and end-of-line marker, and get the 2D +*************** +*** 1297,1507 **** + } + } + + int CCITTFaxStream::lookChar() { + short code1, code2, code3; +! int a0New; +! GBool err, gotEOL; +! int ret; +! int bits, i; + +! // if at eof just return EOF +! if (eof && codingLine[a0] >= columns) { +! return EOF; + } + + // read the next row +! err = gFalse; +! if (codingLine[a0] >= columns) { + + // 2-D encoding + if (nextLine2D) { +- // state: +- // a0New = current position in coding line (0 <= a0New <= columns) +- // codingLine[a0] = last change in coding line +- // (black-to-white if a0 is even, +- // white-to-black if a0 is odd) +- // refLine[b1] = next change in reference line of opposite color +- // to a0 +- // invariants: +- // 0 <= codingLine[a0] <= a0New +- // <= refLine[b1] <= refLine[b1+1] <= columns +- // 0 <= a0 <= columns+1 +- // refLine[0] = 0 +- // refLine[n] = refLine[n+1] = columns +- // -- for some 1 <= n <= columns+1 +- // end condition: +- // 0 = codingLine[0] <= codingLine[1] < codingLine[2] < ... +- // < codingLine[n-1] < codingLine[n] = columns +- // -- where 1 <= n <= columns+1 + for (i = 0; codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } +! refLine[i] = refLine[i + 1] = columns; +! b1 = 1; +! a0New = codingLine[a0 = 0] = 0; +! do { + code1 = getTwoDimCode(); + switch (code1) { + case twoDimPass: +! if (refLine[b1] < columns) { +! a0New = refLine[b1 + 1]; +! b1 += 2; + } + break; + case twoDimHoriz: +! if ((a0 & 1) == 0) { +! code1 = code2 = 0; + do { +! code1 += code3 = getWhiteCode(); + } while (code3 >= 64); + do { +! code2 += code3 = getBlackCode(); + } while (code3 >= 64); + } else { +- code1 = code2 = 0; + do { +! code1 += code3 = getBlackCode(); + } while (code3 >= 64); + do { +! code2 += code3 = getWhiteCode(); + } while (code3 >= 64); + } +! if (code1 > 0 || code2 > 0) { +! if (a0New + code1 <= columns) { +! codingLine[a0 + 1] = a0New + code1; +! } else { +! codingLine[a0 + 1] = columns; +! } +! ++a0; +! if (codingLine[a0] + code2 <= columns) { +! codingLine[a0 + 1] = codingLine[a0] + code2; +! } else { +! codingLine[a0 + 1] = columns; +! } +! ++a0; +! a0New = codingLine[a0]; +! while (refLine[b1] <= a0New && refLine[b1] < columns) { +! b1 += 2; + } + } + break; +! case twoDimVert0: +! if (refLine[b1] < columns) { +! a0New = codingLine[++a0] = refLine[b1]; +! ++b1; +! while (refLine[b1] <= a0New && refLine[b1] < columns) { +! b1 += 2; + } +- } else { +- a0New = codingLine[++a0] = columns; + } + break; + case twoDimVertR1: +! if (refLine[b1] + 1 < columns) { +! a0New = codingLine[++a0] = refLine[b1] + 1; +! ++b1; +! while (refLine[b1] <= a0New && refLine[b1] < columns) { +! b1 += 2; + } +- } else { +- a0New = codingLine[++a0] = columns; + } + break; +! case twoDimVertL1: +! if (refLine[b1] - 1 > a0New || (a0 == 0 && refLine[b1] == 1)) { +! a0New = codingLine[++a0] = refLine[b1] - 1; +! --b1; +! while (refLine[b1] <= a0New && refLine[b1] < columns) { +! b1 += 2; + } + } + break; +! case twoDimVertR2: +! if (refLine[b1] + 2 < columns) { +! a0New = codingLine[++a0] = refLine[b1] + 2; +! ++b1; +! while (refLine[b1] <= a0New && refLine[b1] < columns) { +! b1 += 2; + } +- } else { +- a0New = codingLine[++a0] = columns; + } + break; + case twoDimVertL2: +! if (refLine[b1] - 2 > a0New || (a0 == 0 && refLine[b1] == 2)) { +! a0New = codingLine[++a0] = refLine[b1] - 2; +! --b1; +! while (refLine[b1] <= a0New && refLine[b1] < columns) { +! b1 += 2; + } +! } +! break; +! case twoDimVertR3: +! if (refLine[b1] + 3 < columns) { +! a0New = codingLine[++a0] = refLine[b1] + 3; +! ++b1; +! while (refLine[b1] <= a0New && refLine[b1] < columns) { +! b1 += 2; + } +- } else { +- a0New = codingLine[++a0] = columns; + } + break; +! case twoDimVertL3: +! if (refLine[b1] - 3 > a0New || (a0 == 0 && refLine[b1] == 3)) { +! a0New = codingLine[++a0] = refLine[b1] - 3; +! --b1; +! while (refLine[b1] <= a0New && refLine[b1] < columns) { +! b1 += 2; + } + } + break; + case EOF: + eof = gTrue; +! codingLine[a0 = 0] = columns; +! return EOF; + default: + error(getPos(), "Bad 2D code %04x in CCITTFax stream", code1); + err = gTrue; + break; + } +! } while (codingLine[a0] < columns); + + // 1-D encoding + } else { +! codingLine[a0 = 0] = 0; +! while (1) { + code1 = 0; +! do { +! code1 += code3 = getWhiteCode(); +! } while (code3 >= 64); +! codingLine[a0+1] = codingLine[a0] + code1; +! ++a0; +! if (codingLine[a0] >= columns) { +! break; +! } +! code2 = 0; +! do { +! code2 += code3 = getBlackCode(); +! } while (code3 >= 64); +! codingLine[a0+1] = codingLine[a0] + code2; +! ++a0; +! if (codingLine[a0] >= columns) { +! break; + } + } + } + +- if (codingLine[a0] != columns) { +- error(getPos(), "CCITTFax row is wrong length (%d)", codingLine[a0]); +- // force the row to be the correct length +- while (codingLine[a0] > columns) { +- --a0; +- } +- codingLine[++a0] = columns; +- err = gTrue; +- } +- + // byte-align the row + if (byteAlign) { + inputBits &= ~7; +--- 1300,1529 ---- + } + } + ++ inline void CCITTFaxStream::addPixels(int a1, int blackPixels) { ++ if (a1 > codingLine[a0i]) { ++ if (a1 > columns) { ++ error(getPos(), "CCITTFax row is wrong length (%d)", a1); ++ err = gTrue; ++ a1 = columns; ++ } ++ if ((a0i & 1) ^ blackPixels) { ++ ++a0i; ++ } ++ codingLine[a0i] = a1; ++ } ++ } ++ ++ inline void CCITTFaxStream::addPixelsNeg(int a1, int blackPixels) { ++ if (a1 > codingLine[a0i]) { ++ if (a1 > columns) { ++ error(getPos(), "CCITTFax row is wrong length (%d)", a1); ++ err = gTrue; ++ a1 = columns; ++ } ++ if ((a0i & 1) ^ blackPixels) { ++ ++a0i; ++ } ++ codingLine[a0i] = a1; ++ } else if (a1 < codingLine[a0i]) { ++ if (a1 < 0) { ++ error(getPos(), "Invalid CCITTFax code"); ++ err = gTrue; ++ a1 = 0; ++ } ++ while (a0i > 0 && a1 <= codingLine[a0i - 1]) { ++ --a0i; ++ } ++ codingLine[a0i] = a1; ++ } ++ } ++ + int CCITTFaxStream::lookChar() { + short code1, code2, code3; +! int b1i, blackPixels, i, bits; +! GBool gotEOL; + +! if (buf != EOF) { +! return buf; + } + + // read the next row +! if (outputBits == 0) { +! +! // if at eof just return EOF +! if (eof) { +! return EOF; +! } +! +! err = gFalse; + + // 2-D encoding + if (nextLine2D) { + for (i = 0; codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } +! refLine[i++] = columns; +! refLine[i] = columns; +! codingLine[0] = 0; +! a0i = 0; +! b1i = 0; +! blackPixels = 0; +! // invariant: +! // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] +! // <= columns +! // exception at left edge: +! // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible +! // exception at right edge: +! // refLine[b1i] = refLine[b1i+1] = columns is possible +! while (codingLine[a0i] < columns) { + code1 = getTwoDimCode(); + switch (code1) { + case twoDimPass: +! addPixels(refLine[b1i + 1], blackPixels); +! if (refLine[b1i + 1] < columns) { +! b1i += 2; + } + break; + case twoDimHoriz: +! code1 = code2 = 0; +! if (blackPixels) { + do { +! code1 += code3 = getBlackCode(); + } while (code3 >= 64); + do { +! code2 += code3 = getWhiteCode(); + } while (code3 >= 64); + } else { + do { +! code1 += code3 = getWhiteCode(); + } while (code3 >= 64); + do { +! code2 += code3 = getBlackCode(); + } while (code3 >= 64); + } +! addPixels(codingLine[a0i] + code1, blackPixels); +! if (codingLine[a0i] < columns) { +! addPixels(codingLine[a0i] + code2, blackPixels ^ 1); +! } +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +! b1i += 2; +! } +! break; +! case twoDimVertR3: +! addPixels(refLine[b1i] + 3, blackPixels); +! blackPixels ^= 1; +! if (codingLine[a0i] < columns) { +! ++b1i; +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +! b1i += 2; + } + } + break; +! case twoDimVertR2: +! addPixels(refLine[b1i] + 2, blackPixels); +! blackPixels ^= 1; +! if (codingLine[a0i] < columns) { +! ++b1i; +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +! b1i += 2; + } + } + break; + case twoDimVertR1: +! addPixels(refLine[b1i] + 1, blackPixels); +! blackPixels ^= 1; +! if (codingLine[a0i] < columns) { +! ++b1i; +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +! b1i += 2; + } + } + break; +! case twoDimVert0: +! addPixels(refLine[b1i], blackPixels); +! blackPixels ^= 1; +! if (codingLine[a0i] < columns) { +! ++b1i; +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +! b1i += 2; + } + } + break; +! case twoDimVertL3: +! addPixelsNeg(refLine[b1i] - 3, blackPixels); +! blackPixels ^= 1; +! if (codingLine[a0i] < columns) { +! if (b1i > 0) { +! --b1i; +! } else { +! ++b1i; +! } +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +! b1i += 2; + } + } + break; + case twoDimVertL2: +! addPixelsNeg(refLine[b1i] - 2, blackPixels); +! blackPixels ^= 1; +! if (codingLine[a0i] < columns) { +! if (b1i > 0) { +! --b1i; +! } else { +! ++b1i; + } +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +! b1i += 2; + } + } + break; +! case twoDimVertL1: +! addPixelsNeg(refLine[b1i] - 1, blackPixels); +! blackPixels ^= 1; +! if (codingLine[a0i] < columns) { +! if (b1i > 0) { +! --b1i; +! } else { +! ++b1i; +! } +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +! b1i += 2; + } + } + break; + case EOF: ++ addPixels(columns, 0); + eof = gTrue; +! break; + default: + error(getPos(), "Bad 2D code %04x in CCITTFax stream", code1); ++ addPixels(columns, 0); + err = gTrue; + break; + } +! } + + // 1-D encoding + } else { +! codingLine[0] = 0; +! a0i = 0; +! blackPixels = 0; +! while (codingLine[a0i] < columns) { + code1 = 0; +! if (blackPixels) { +! do { +! code1 += code3 = getBlackCode(); +! } while (code3 >= 64); +! } else { +! do { +! code1 += code3 = getWhiteCode(); +! } while (code3 >= 64); + } ++ addPixels(codingLine[a0i] + code1, blackPixels); ++ blackPixels ^= 1; + } + } + + // byte-align the row + if (byteAlign) { + inputBits &= ~7; +*************** +*** 1560,1573 **** + // this if we know the stream contains end-of-line markers because + // the "just plow on" technique tends to work better otherwise + } else if (err && endOfLine) { +! do { + if (code1 == EOF) { + eof = gTrue; + return EOF; + } + eatBits(1); +! code1 = lookBits(13); +! } while ((code1 >> 1) != 0x001); + eatBits(12); + if (encoding > 0) { + eatBits(1); +--- 1582,1598 ---- + // this if we know the stream contains end-of-line markers because + // the "just plow on" technique tends to work better otherwise + } else if (err && endOfLine) { +! while (1) { +! code1 = lookBits(13); + if (code1 == EOF) { + eof = gTrue; + return EOF; + } ++ if ((code1 >> 1) == 0x001) { ++ break; ++ } + eatBits(1); +! } + eatBits(12); + if (encoding > 0) { + eatBits(1); +*************** +*** 1575,1585 **** + } + } + +! a0 = 0; +! outputBits = codingLine[1] - codingLine[0]; +! if (outputBits == 0) { +! a0 = 1; +! outputBits = codingLine[2] - codingLine[1]; + } + + ++row; +--- 1600,1610 ---- + } + } + +! // set up for output +! if (codingLine[0] > 0) { +! outputBits = codingLine[a0i = 0]; +! } else { +! outputBits = codingLine[a0i = 1]; + } + + ++row; +*************** +*** 1587,1625 **** + + // get a byte + if (outputBits >= 8) { +! ret = ((a0 & 1) == 0) ? 0xff : 0x00; +! if ((outputBits -= 8) == 0) { +! ++a0; +! if (codingLine[a0] < columns) { +! outputBits = codingLine[a0 + 1] - codingLine[a0]; +! } + } + } else { + bits = 8; +! ret = 0; + do { + if (outputBits > bits) { +! i = bits; +! bits = 0; +! if ((a0 & 1) == 0) { +! ret |= 0xff >> (8 - i); + } +! outputBits -= i; + } else { +! i = outputBits; +! bits -= outputBits; +! if ((a0 & 1) == 0) { +! ret |= (0xff >> (8 - i)) << bits; + } + outputBits = 0; +! ++a0; +! if (codingLine[a0] < columns) { +! outputBits = codingLine[a0 + 1] - codingLine[a0]; + } + } +! } while (bits > 0 && codingLine[a0] < columns); + } +- buf = black ? (ret ^ 0xff) : ret; + return buf; + } + +--- 1612,1654 ---- + + // get a byte + if (outputBits >= 8) { +! buf = (a0i & 1) ? 0x00 : 0xff; +! outputBits -= 8; +! if (outputBits == 0 && codingLine[a0i] < columns) { +! ++a0i; +! outputBits = codingLine[a0i] - codingLine[a0i - 1]; + } + } else { + bits = 8; +! buf = 0; + do { + if (outputBits > bits) { +! buf <<= bits; +! if (!(a0i & 1)) { +! buf |= 0xff >> (8 - bits); + } +! outputBits -= bits; +! bits = 0; + } else { +! buf <<= outputBits; +! if (!(a0i & 1)) { +! buf |= 0xff >> (8 - outputBits); + } ++ bits -= outputBits; + outputBits = 0; +! if (codingLine[a0i] < columns) { +! ++a0i; +! outputBits = codingLine[a0i] - codingLine[a0i - 1]; +! } else if (bits > 0) { +! buf <<= bits; +! bits = 0; + } + } +! } while (bits); +! } +! if (black) { +! buf ^= 0xff; + } + return buf; + } + +*************** +*** 1661,1666 **** +--- 1690,1698 ---- + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(12); ++ if (code == EOF) { ++ return 1; ++ } + if ((code >> 5) == 0) { + p = &whiteTab1[code]; + } else { +*************** +*** 1673,1678 **** +--- 1705,1713 ---- + } else { + for (n = 1; n <= 9; ++n) { + code = lookBits(n); ++ if (code == EOF) { ++ return 1; ++ } + if (n < 9) { + code <<= 9 - n; + } +*************** +*** 1684,1689 **** +--- 1719,1727 ---- + } + for (n = 11; n <= 12; ++n) { + code = lookBits(n); ++ if (code == EOF) { ++ return 1; ++ } + if (n < 12) { + code <<= 12 - n; + } +*************** +*** 1709,1717 **** + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(13); + if ((code >> 7) == 0) { + p = &blackTab1[code]; +! } else if ((code >> 9) == 0) { + p = &blackTab2[(code >> 1) - 64]; + } else { + p = &blackTab3[code >> 7]; +--- 1747,1758 ---- + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(13); ++ if (code == EOF) { ++ return 1; ++ } + if ((code >> 7) == 0) { + p = &blackTab1[code]; +! } else if ((code >> 9) == 0 && (code >> 7) != 0) { + p = &blackTab2[(code >> 1) - 64]; + } else { + p = &blackTab3[code >> 7]; +*************** +*** 1723,1728 **** +--- 1764,1772 ---- + } else { + for (n = 2; n <= 6; ++n) { + code = lookBits(n); ++ if (code == EOF) { ++ return 1; ++ } + if (n < 6) { + code <<= 6 - n; + } +*************** +*** 1734,1739 **** +--- 1778,1786 ---- + } + for (n = 7; n <= 12; ++n) { + code = lookBits(n); ++ if (code == EOF) { ++ return 1; ++ } + if (n < 12) { + code <<= 12 - n; + } +*************** +*** 1747,1752 **** +--- 1794,1802 ---- + } + for (n = 10; n <= 13; ++n) { + code = lookBits(n); ++ if (code == EOF) { ++ return 1; ++ } + if (n < 13) { + code <<= 13 - n; + } +*************** +*** 1961,1966 **** +--- 2011,2022 ---- + // allocate a buffer for the whole image + bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth; + bufHeight = ((height + mcuHeight - 1) / mcuHeight) * mcuHeight; ++ if (bufWidth <= 0 || bufHeight <= 0 || ++ bufWidth > INT_MAX / bufWidth / (int)sizeof(int)) { ++ error(getPos(), "Invalid image size in DCT stream"); ++ y = height; ++ return; ++ } + for (i = 0; i < numComps; ++i) { + frameBuf[i] = (int *)gmallocn(bufWidth * bufHeight, sizeof(int)); + memset(frameBuf[i], 0, bufWidth * bufHeight * sizeof(int)); +*************** +*** 3036,3041 **** +--- 3092,3102 ---- + } + scanInfo.firstCoeff = str->getChar(); + scanInfo.lastCoeff = str->getChar(); ++ if (scanInfo.firstCoeff < 0 || scanInfo.lastCoeff > 63 || ++ scanInfo.firstCoeff > scanInfo.lastCoeff) { ++ error(getPos(), "Bad DCT coefficient numbers in scan info block"); ++ return gFalse; ++ } + c = str->getChar(); + scanInfo.ah = (c >> 4) & 0x0f; + scanInfo.al = c & 0x0f; +diff -c -r xpdf-3.02pl1.orig/xpdf/Stream.h xpdf-3.02/xpdf/Stream.h +*** xpdf-3.02pl1.orig/xpdf/Stream.h Tue Feb 27 14:05:52 2007 +--- xpdf-3.02/xpdf/Stream.h Thu Oct 25 15:48:15 2007 +*************** +*** 528,540 **** + int row; // current row + int inputBuf; // input buffer + int inputBits; // number of bits in input buffer +! short *refLine; // reference line changing elements +! int b1; // index into refLine +! short *codingLine; // coding line changing elements +! int a0; // index into codingLine + int outputBits; // remaining ouput bits + int buf; // character buffer + + short getTwoDimCode(); + short getWhiteCode(); + short getBlackCode(); +--- 528,542 ---- + int row; // current row + int inputBuf; // input buffer + int inputBits; // number of bits in input buffer +! int *codingLine; // coding line changing elements +! int *refLine; // reference line changing elements +! int a0i; // index into codingLine +! GBool err; // error on current line + int outputBits; // remaining ouput bits + int buf; // character buffer + ++ void addPixels(int a1, int black); ++ void addPixelsNeg(int a1, int black); + short getTwoDimCode(); + short getWhiteCode(); + short getBlackCode(); diff --git a/source/xap/xpdf/xpdf-3.02pl3.patch b/source/xap/xpdf/xpdf-3.02pl3.patch new file mode 100644 index 00000000..b5988805 --- /dev/null +++ b/source/xap/xpdf/xpdf-3.02pl3.patch @@ -0,0 +1,1145 @@ +diff -r -c xpdf-3.02.orig/goo/gmem.cc xpdf-3.02/goo/gmem.cc +*** xpdf-3.02.orig/goo/gmem.cc Tue Feb 27 14:05:51 2007 +--- xpdf-3.02/goo/gmem.cc Thu Mar 19 15:47:25 2009 +*************** +*** 55,61 **** + void *data; + unsigned long *trl, *p; + +! if (size <= 0) { + return NULL; + } + size1 = gMemDataSize(size); +--- 55,69 ---- + void *data; + unsigned long *trl, *p; + +! if (size < 0) { +! #if USE_EXCEPTIONS +! throw GMemException(); +! #else +! fprintf(stderr, "Invalid memory allocation size\n"); +! exit(1); +! #endif +! } +! if (size == 0) { + return NULL; + } + size1 = gMemDataSize(size); +*************** +*** 91,97 **** + #else + void *p; + +! if (size <= 0) { + return NULL; + } + if (!(p = malloc(size))) { +--- 99,113 ---- + #else + void *p; + +! if (size < 0) { +! #if USE_EXCEPTIONS +! throw GMemException(); +! #else +! fprintf(stderr, "Invalid memory allocation size\n"); +! exit(1); +! #endif +! } +! if (size == 0) { + return NULL; + } + if (!(p = malloc(size))) { +*************** +*** 112,118 **** + void *q; + int oldSize; + +! if (size <= 0) { + if (p) { + gfree(p); + } +--- 128,142 ---- + void *q; + int oldSize; + +! if (size < 0) { +! #if USE_EXCEPTIONS +! throw GMemException(); +! #else +! fprintf(stderr, "Invalid memory allocation size\n"); +! exit(1); +! #endif +! } +! if (size == 0) { + if (p) { + gfree(p); + } +*************** +*** 131,137 **** + #else + void *q; + +! if (size <= 0) { + if (p) { + free(p); + } +--- 155,169 ---- + #else + void *q; + +! if (size < 0) { +! #if USE_EXCEPTIONS +! throw GMemException(); +! #else +! fprintf(stderr, "Invalid memory allocation size\n"); +! exit(1); +! #endif +! } +! if (size == 0) { + if (p) { + free(p); + } +diff -r -c xpdf-3.02.orig/xpdf/JBIG2Stream.cc xpdf-3.02/xpdf/JBIG2Stream.cc +*** xpdf-3.02.orig/xpdf/JBIG2Stream.cc Tue Feb 27 14:05:52 2007 +--- xpdf-3.02/xpdf/JBIG2Stream.cc Tue Mar 31 10:55:23 2009 +*************** +*** 422,433 **** + table[i] = table[len]; + + // assign prefixes +! i = 0; +! prefix = 0; +! table[i++].prefix = prefix++; +! for (; table[i].rangeLen != jbig2HuffmanEOT; ++i) { +! prefix <<= table[i].prefixLen - table[i-1].prefixLen; +! table[i].prefix = prefix++; + } + } + +--- 422,435 ---- + table[i] = table[len]; + + // assign prefixes +! if (table[0].rangeLen != jbig2HuffmanEOT) { +! i = 0; +! prefix = 0; +! table[i++].prefix = prefix++; +! for (; table[i].rangeLen != jbig2HuffmanEOT; ++i) { +! prefix <<= table[i].prefixLen - table[i-1].prefixLen; +! table[i].prefix = prefix++; +! } + } + } + +*************** +*** 491,497 **** + } + if (p->bits < 0) { + error(str->getPos(), "Bad two dim code in JBIG2 MMR stream"); +! return 0; + } + bufLen -= p->bits; + return p->n; +--- 493,499 ---- + } + if (p->bits < 0) { + error(str->getPos(), "Bad two dim code in JBIG2 MMR stream"); +! return EOF; + } + bufLen -= p->bits; + return p->n; +*************** +*** 507,513 **** + ++nBytesRead; + } + while (1) { +! if (bufLen >= 7 && ((buf >> (bufLen - 7)) & 0x7f) == 0) { + if (bufLen <= 12) { + code = buf << (12 - bufLen); + } else { +--- 509,515 ---- + ++nBytesRead; + } + while (1) { +! if (bufLen >= 11 && ((buf >> (bufLen - 7)) & 0x7f) == 0) { + if (bufLen <= 12) { + code = buf << (12 - bufLen); + } else { +*************** +*** 550,563 **** + ++nBytesRead; + } + while (1) { +! if (bufLen >= 6 && ((buf >> (bufLen - 6)) & 0x3f) == 0) { + if (bufLen <= 13) { + code = buf << (13 - bufLen); + } else { + code = buf >> (bufLen - 13); + } + p = &blackTab1[code & 0x7f]; +! } else if (bufLen >= 4 && ((buf >> (bufLen - 4)) & 0x0f) == 0) { + if (bufLen <= 12) { + code = buf << (12 - bufLen); + } else { +--- 552,566 ---- + ++nBytesRead; + } + while (1) { +! if (bufLen >= 10 && ((buf >> (bufLen - 6)) & 0x3f) == 0) { + if (bufLen <= 13) { + code = buf << (13 - bufLen); + } else { + code = buf >> (bufLen - 13); + } + p = &blackTab1[code & 0x7f]; +! } else if (bufLen >= 7 && ((buf >> (bufLen - 4)) & 0x0f) == 0 && +! ((buf >> (bufLen - 6)) & 0x03) != 0) { + if (bufLen <= 12) { + code = buf << (12 - bufLen); + } else { +*************** +*** 683,690 **** + h = hA; + line = (wA + 7) >> 3; + if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { +! data = NULL; +! return; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); +--- 686,694 ---- + h = hA; + line = (wA + 7) >> 3; + if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { +! // force a call to gmalloc(-1), which will throw an exception +! h = -1; +! line = 2; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); +*************** +*** 698,705 **** + h = bitmap->h; + line = bitmap->line; + if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { +! data = NULL; +! return; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); +--- 702,710 ---- + h = bitmap->h; + line = bitmap->line; + if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { +! // force a call to gmalloc(-1), which will throw an exception +! h = -1; +! line = 2; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); +*************** +*** 754,759 **** +--- 759,766 ---- + inline void JBIG2Bitmap::getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr) { + if (y < 0 || y >= h || x >= w) { + ptr->p = NULL; ++ ptr->shift = 0; // make gcc happy ++ ptr->x = 0; // make gcc happy + } else if (x < 0) { + ptr->p = &data[y * line]; + ptr->shift = 7; +*************** +*** 798,803 **** +--- 805,814 ---- + Guint src0, src1, src, dest, s1, s2, m1, m2, m3; + GBool oneByte; + ++ // check for the pathological case where y = -2^31 ++ if (y < -0x7fffffff) { ++ return; ++ } + if (y < 0) { + y0 = -y; + } else { +*************** +*** 1011,1018 **** +--- 1022,1034 ---- + JBIG2SymbolDict::JBIG2SymbolDict(Guint segNumA, Guint sizeA): + JBIG2Segment(segNumA) + { ++ Guint i; ++ + size = sizeA; + bitmaps = (JBIG2Bitmap **)gmallocn(size, sizeof(JBIG2Bitmap *)); ++ for (i = 0; i < size; ++i) { ++ bitmaps[i] = NULL; ++ } + genericRegionStats = NULL; + refinementRegionStats = NULL; + } +*************** +*** 1021,1027 **** + Guint i; + + for (i = 0; i < size; ++i) { +! delete bitmaps[i]; + } + gfree(bitmaps); + if (genericRegionStats) { +--- 1037,1045 ---- + Guint i; + + for (i = 0; i < size; ++i) { +! if (bitmaps[i]) { +! delete bitmaps[i]; +! } + } + gfree(bitmaps); + if (genericRegionStats) { +*************** +*** 1296,1301 **** +--- 1314,1326 ---- + goto eofError2; + } + ++ // check for missing page information segment ++ if (!pageBitmap && ((segType >= 4 && segType <= 7) || ++ (segType >= 20 && segType <= 43))) { ++ error(getPos(), "First JBIG2 segment associated with a page must be a page information segment"); ++ goto syntaxError; ++ } ++ + // read the segment data + switch (segType) { + case 0: +*************** +*** 1411,1416 **** +--- 1436,1443 ---- + Guint i, j, k; + Guchar *p; + ++ symWidths = NULL; ++ + // symbol dictionary flags + if (!readUWord(&flags)) { + goto eofError; +*************** +*** 1466,1485 **** + codeTables = new GList(); + numInputSyms = 0; + for (i = 0; i < nRefSegs; ++i) { +! seg = findSegment(refSegs[i]); +! if (seg->getType() == jbig2SegSymbolDict) { +! numInputSyms += ((JBIG2SymbolDict *)seg)->getSize(); +! } else if (seg->getType() == jbig2SegCodeTable) { +! codeTables->append(seg); + } + } + + // compute symbol code length +! symCodeLen = 0; +! i = 1; +! while (i < numInputSyms + numNewSyms) { + ++symCodeLen; +! i <<= 1; + } + + // get the input symbol bitmaps +--- 1493,1524 ---- + codeTables = new GList(); + numInputSyms = 0; + for (i = 0; i < nRefSegs; ++i) { +! if ((seg = findSegment(refSegs[i]))) { +! if (seg->getType() == jbig2SegSymbolDict) { +! j = ((JBIG2SymbolDict *)seg)->getSize(); +! if (numInputSyms > UINT_MAX - j) { +! error(getPos(), "Too many input symbols in JBIG2 symbol dictionary"); +! delete codeTables; +! goto eofError; +! } +! numInputSyms += j; +! } else if (seg->getType() == jbig2SegCodeTable) { +! codeTables->append(seg); +! } + } + } ++ if (numInputSyms > UINT_MAX - numNewSyms) { ++ error(getPos(), "Too many input symbols in JBIG2 symbol dictionary"); ++ delete codeTables; ++ goto eofError; ++ } + + // compute symbol code length +! symCodeLen = 1; +! i = (numInputSyms + numNewSyms) >> 1; +! while (i) { + ++symCodeLen; +! i >>= 1; + } + + // get the input symbol bitmaps +*************** +*** 1491,1501 **** + k = 0; + inputSymbolDict = NULL; + for (i = 0; i < nRefSegs; ++i) { +! seg = findSegment(refSegs[i]); +! if (seg->getType() == jbig2SegSymbolDict) { +! inputSymbolDict = (JBIG2SymbolDict *)seg; +! for (j = 0; j < inputSymbolDict->getSize(); ++j) { +! bitmaps[k++] = inputSymbolDict->getBitmap(j); + } + } + } +--- 1530,1541 ---- + k = 0; + inputSymbolDict = NULL; + for (i = 0; i < nRefSegs; ++i) { +! if ((seg = findSegment(refSegs[i]))) { +! if (seg->getType() == jbig2SegSymbolDict) { +! inputSymbolDict = (JBIG2SymbolDict *)seg; +! for (j = 0; j < inputSymbolDict->getSize(); ++j) { +! bitmaps[k++] = inputSymbolDict->getBitmap(j); +! } + } + } + } +*************** +*** 1510,1515 **** +--- 1550,1558 ---- + } else if (huffDH == 1) { + huffDHTable = huffTableE; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffDW == 0) { +*************** +*** 1517,1533 **** +--- 1560,1585 ---- + } else if (huffDW == 1) { + huffDWTable = huffTableC; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffBMSize == 0) { + huffBMSizeTable = huffTableA; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffBMSizeTable = + ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffAggInst == 0) { + huffAggInstTable = huffTableA; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffAggInstTable = + ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } +*************** +*** 1560,1566 **** + } + + // allocate symbol widths storage +- symWidths = NULL; + if (huff && !refAgg) { + symWidths = (Guint *)gmallocn(numNewSyms, sizeof(Guint)); + } +--- 1612,1617 ---- +*************** +*** 1602,1607 **** +--- 1653,1662 ---- + goto syntaxError; + } + symWidth += dw; ++ if (i >= numNewSyms) { ++ error(getPos(), "Too many symbols in JBIG2 symbol dictionary"); ++ goto syntaxError; ++ } + + // using a collective bitmap, so don't read a bitmap here + if (huff && !refAgg) { +*************** +*** 1638,1643 **** +--- 1693,1702 ---- + arithDecoder->decodeInt(&refDX, iardxStats); + arithDecoder->decodeInt(&refDY, iardyStats); + } ++ if (symID >= numInputSyms + i) { ++ error(getPos(), "Invalid symbol ID in JBIG2 symbol dictionary"); ++ goto syntaxError; ++ } + refBitmap = bitmaps[symID]; + bitmaps[numInputSyms + i] = + readGenericRefinementRegion(symWidth, symHeight, +*************** +*** 1704,1709 **** +--- 1763,1774 ---- + } else { + arithDecoder->decodeInt(&run, iaexStats); + } ++ if (i + run > numInputSyms + numNewSyms || ++ (ex && j + run > numExSyms)) { ++ error(getPos(), "Too many exported symbols in JBIG2 symbol dictionary"); ++ delete symbolDict; ++ goto syntaxError; ++ } + if (ex) { + for (cnt = 0; cnt < run; ++cnt) { + symbolDict->setBitmap(j++, bitmaps[i++]->copy()); +*************** +*** 1713,1718 **** +--- 1778,1788 ---- + } + ex = !ex; + } ++ if (j != numExSyms) { ++ error(getPos(), "Too few symbols in JBIG2 symbol dictionary"); ++ delete symbolDict; ++ goto syntaxError; ++ } + + for (i = 0; i < numNewSyms; ++i) { + delete bitmaps[numInputSyms + i]; +*************** +*** 1735,1740 **** +--- 1805,1814 ---- + + return gTrue; + ++ codeTableError: ++ error(getPos(), "Missing code table in JBIG2 symbol dictionary"); ++ delete codeTables; ++ + syntaxError: + for (i = 0; i < numNewSyms; ++i) { + if (bitmaps[numInputSyms + i]) { +*************** +*** 1837,1842 **** +--- 1911,1918 ---- + } + } else { + error(getPos(), "Invalid segment reference in JBIG2 text region"); ++ delete codeTables; ++ return; + } + } + symCodeLen = 0; +*************** +*** 1871,1876 **** +--- 1947,1955 ---- + } else if (huffFS == 1) { + huffFSTable = huffTableG; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffFSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffDS == 0) { +*************** +*** 1880,1885 **** +--- 1959,1967 ---- + } else if (huffDS == 2) { + huffDSTable = huffTableJ; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffDSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffDT == 0) { +*************** +*** 1889,1894 **** +--- 1971,1979 ---- + } else if (huffDT == 2) { + huffDTTable = huffTableM; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffDTTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDW == 0) { +*************** +*** 1896,1901 **** +--- 1981,1989 ---- + } else if (huffRDW == 1) { + huffRDWTable = huffTableO; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffRDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDH == 0) { +*************** +*** 1903,1908 **** +--- 1991,1999 ---- + } else if (huffRDH == 1) { + huffRDHTable = huffTableO; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffRDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDX == 0) { +*************** +*** 1910,1915 **** +--- 2001,2009 ---- + } else if (huffRDX == 1) { + huffRDXTable = huffTableO; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffRDXTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDY == 0) { +*************** +*** 1917,1927 **** +--- 2011,2027 ---- + } else if (huffRDY == 1) { + huffRDYTable = huffTableO; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffRDYTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRSize == 0) { + huffRSizeTable = huffTableA; + } else { ++ if (i >= (Guint)codeTables->getLength()) { ++ goto codeTableError; ++ } + huffRSizeTable = + ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } +*************** +*** 2016,2023 **** +--- 2116,2130 ---- + + return; + ++ codeTableError: ++ error(getPos(), "Missing code table in JBIG2 text region"); ++ gfree(codeTables); ++ delete syms; ++ return; ++ + eofError: + error(getPos(), "Unexpected EOF in JBIG2 stream"); ++ return; + } + + JBIG2Bitmap *JBIG2Stream::readTextRegion(GBool huff, GBool refine, +*************** +*** 2324,2331 **** + error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); + return; + } +! seg = findSegment(refSegs[0]); +! if (seg->getType() != jbig2SegPatternDict) { + error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); + return; + } +--- 2431,2438 ---- + error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); + return; + } +! if (!(seg = findSegment(refSegs[0])) || +! seg->getType() != jbig2SegPatternDict) { + error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); + return; + } +*************** +*** 2483,2489 **** + + // read the bitmap + bitmap = readGenericBitmap(mmr, w, h, templ, tpgdOn, gFalse, +! NULL, atx, aty, mmr ? 0 : length - 18); + + // combine the region bitmap into the page bitmap + if (imm) { +--- 2590,2596 ---- + + // read the bitmap + bitmap = readGenericBitmap(mmr, w, h, templ, tpgdOn, gFalse, +! NULL, atx, aty, mmr ? length - 18 : 0); + + // combine the region bitmap into the page bitmap + if (imm) { +*************** +*** 2505,2510 **** +--- 2612,2654 ---- + error(getPos(), "Unexpected EOF in JBIG2 stream"); + } + ++ inline void JBIG2Stream::mmrAddPixels(int a1, int blackPixels, ++ int *codingLine, int *a0i, int w) { ++ if (a1 > codingLine[*a0i]) { ++ if (a1 > w) { ++ error(getPos(), "JBIG2 MMR row is wrong length ({0:d})", a1); ++ a1 = w; ++ } ++ if ((*a0i & 1) ^ blackPixels) { ++ ++*a0i; ++ } ++ codingLine[*a0i] = a1; ++ } ++ } ++ ++ inline void JBIG2Stream::mmrAddPixelsNeg(int a1, int blackPixels, ++ int *codingLine, int *a0i, int w) { ++ if (a1 > codingLine[*a0i]) { ++ if (a1 > w) { ++ error(getPos(), "JBIG2 MMR row is wrong length ({0:d})", a1); ++ a1 = w; ++ } ++ if ((*a0i & 1) ^ blackPixels) { ++ ++*a0i; ++ } ++ codingLine[*a0i] = a1; ++ } else if (a1 < codingLine[*a0i]) { ++ if (a1 < 0) { ++ error(getPos(), "Invalid JBIG2 MMR code"); ++ a1 = 0; ++ } ++ while (*a0i > 0 && a1 <= codingLine[*a0i - 1]) { ++ --*a0i; ++ } ++ codingLine[*a0i] = a1; ++ } ++ } ++ + JBIG2Bitmap *JBIG2Stream::readGenericBitmap(GBool mmr, int w, int h, + int templ, GBool tpgdOn, + GBool useSkip, JBIG2Bitmap *skip, +*************** +*** 2517,2523 **** + JBIG2BitmapPtr atPtr0, atPtr1, atPtr2, atPtr3; + int *refLine, *codingLine; + int code1, code2, code3; +! int x, y, a0, pix, i, refI, codingI; + + bitmap = new JBIG2Bitmap(0, w, h); + bitmap->clearToZero(); +--- 2661,2667 ---- + JBIG2BitmapPtr atPtr0, atPtr1, atPtr2, atPtr3; + int *refLine, *codingLine; + int code1, code2, code3; +! int x, y, a0i, b1i, blackPixels, pix, i; + + bitmap = new JBIG2Bitmap(0, w, h); + bitmap->clearToZero(); +*************** +*** 2527,2535 **** + if (mmr) { + + mmrDecoder->reset(); + refLine = (int *)gmallocn(w + 2, sizeof(int)); +! codingLine = (int *)gmallocn(w + 2, sizeof(int)); +! codingLine[0] = codingLine[1] = w; + + for (y = 0; y < h; ++y) { + +--- 2671,2688 ---- + if (mmr) { + + mmrDecoder->reset(); ++ if (w > INT_MAX - 2) { ++ error(getPos(), "Bad width in JBIG2 generic bitmap"); ++ // force a call to gmalloc(-1), which will throw an exception ++ w = -3; ++ } ++ // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = w ++ // ---> max codingLine size = w + 1 ++ // refLine has one extra guard entry at the end ++ // ---> max refLine size = w + 2 ++ codingLine = (int *)gmallocn(w + 1, sizeof(int)); + refLine = (int *)gmallocn(w + 2, sizeof(int)); +! codingLine[0] = w; + + for (y = 0; y < h; ++y) { + +*************** +*** 2537,2664 **** + for (i = 0; codingLine[i] < w; ++i) { + refLine[i] = codingLine[i]; + } +! refLine[i] = refLine[i + 1] = w; + + // decode a line +! refI = 0; // b1 = refLine[refI] +! codingI = 0; // a1 = codingLine[codingI] +! a0 = 0; +! do { + code1 = mmrDecoder->get2DCode(); + switch (code1) { + case twoDimPass: +! if (refLine[refI] < w) { +! a0 = refLine[refI + 1]; +! refI += 2; +! } +! break; + case twoDimHoriz: +! if (codingI & 1) { +! code1 = 0; +! do { +! code1 += code3 = mmrDecoder->getBlackCode(); +! } while (code3 >= 64); +! code2 = 0; +! do { +! code2 += code3 = mmrDecoder->getWhiteCode(); +! } while (code3 >= 64); +! } else { +! code1 = 0; +! do { +! code1 += code3 = mmrDecoder->getWhiteCode(); +! } while (code3 >= 64); +! code2 = 0; +! do { +! code2 += code3 = mmrDecoder->getBlackCode(); +! } while (code3 >= 64); +! } +! if (code1 > 0 || code2 > 0) { +! a0 = codingLine[codingI++] = a0 + code1; +! a0 = codingLine[codingI++] = a0 + code2; +! while (refLine[refI] <= a0 && refLine[refI] < w) { +! refI += 2; +! } +! } +! break; +! case twoDimVert0: +! a0 = codingLine[codingI++] = refLine[refI]; +! if (refLine[refI] < w) { +! ++refI; +! } +! break; +! case twoDimVertR1: +! a0 = codingLine[codingI++] = refLine[refI] + 1; +! if (refLine[refI] < w) { +! ++refI; +! while (refLine[refI] <= a0 && refLine[refI] < w) { +! refI += 2; +! } +! } +! break; +! case twoDimVertR2: +! a0 = codingLine[codingI++] = refLine[refI] + 2; +! if (refLine[refI] < w) { +! ++refI; +! while (refLine[refI] <= a0 && refLine[refI] < w) { +! refI += 2; +! } +! } +! break; + case twoDimVertR3: +! a0 = codingLine[codingI++] = refLine[refI] + 3; +! if (refLine[refI] < w) { +! ++refI; +! while (refLine[refI] <= a0 && refLine[refI] < w) { +! refI += 2; +! } +! } +! break; +! case twoDimVertL1: +! a0 = codingLine[codingI++] = refLine[refI] - 1; +! if (refI > 0) { +! --refI; +! } else { +! ++refI; +! } +! while (refLine[refI] <= a0 && refLine[refI] < w) { +! refI += 2; +! } +! break; +! case twoDimVertL2: +! a0 = codingLine[codingI++] = refLine[refI] - 2; +! if (refI > 0) { +! --refI; +! } else { +! ++refI; +! } +! while (refLine[refI] <= a0 && refLine[refI] < w) { +! refI += 2; +! } +! break; + case twoDimVertL3: +! a0 = codingLine[codingI++] = refLine[refI] - 3; +! if (refI > 0) { +! --refI; +! } else { +! ++refI; +! } +! while (refLine[refI] <= a0 && refLine[refI] < w) { +! refI += 2; +! } +! break; + default: + error(getPos(), "Illegal code in JBIG2 MMR bitmap data"); + break; + } +! } while (a0 < w); +! codingLine[codingI++] = w; + + // convert the run lengths to a bitmap line + i = 0; +! while (codingLine[i] < w) { + for (x = codingLine[i]; x < codingLine[i+1]; ++x) { + bitmap->setPixel(x, y); + } + i += 2; + } + } +--- 2690,2846 ---- + for (i = 0; codingLine[i] < w; ++i) { + refLine[i] = codingLine[i]; + } +! refLine[i++] = w; +! refLine[i] = w; + + // decode a line +! codingLine[0] = 0; +! a0i = 0; +! b1i = 0; +! blackPixels = 0; +! // invariant: +! // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] <= w +! // exception at left edge: +! // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible +! // exception at right edge: +! // refLine[b1i] = refLine[b1i+1] = w is possible +! while (codingLine[a0i] < w) { + code1 = mmrDecoder->get2DCode(); + switch (code1) { + case twoDimPass: +! mmrAddPixels(refLine[b1i + 1], blackPixels, codingLine, &a0i, w); +! if (refLine[b1i + 1] < w) { +! b1i += 2; +! } +! break; + case twoDimHoriz: +! code1 = code2 = 0; +! if (blackPixels) { +! do { +! code1 += code3 = mmrDecoder->getBlackCode(); +! } while (code3 >= 64); +! do { +! code2 += code3 = mmrDecoder->getWhiteCode(); +! } while (code3 >= 64); +! } else { +! do { +! code1 += code3 = mmrDecoder->getWhiteCode(); +! } while (code3 >= 64); +! do { +! code2 += code3 = mmrDecoder->getBlackCode(); +! } while (code3 >= 64); +! } +! mmrAddPixels(codingLine[a0i] + code1, blackPixels, +! codingLine, &a0i, w); +! if (codingLine[a0i] < w) { +! mmrAddPixels(codingLine[a0i] + code2, blackPixels ^ 1, +! codingLine, &a0i, w); +! } +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { +! b1i += 2; +! } +! break; + case twoDimVertR3: +! mmrAddPixels(refLine[b1i] + 3, blackPixels, codingLine, &a0i, w); +! blackPixels ^= 1; +! if (codingLine[a0i] < w) { +! ++b1i; +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { +! b1i += 2; +! } +! } +! break; +! case twoDimVertR2: +! mmrAddPixels(refLine[b1i] + 2, blackPixels, codingLine, &a0i, w); +! blackPixels ^= 1; +! if (codingLine[a0i] < w) { +! ++b1i; +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { +! b1i += 2; +! } +! } +! break; +! case twoDimVertR1: +! mmrAddPixels(refLine[b1i] + 1, blackPixels, codingLine, &a0i, w); +! blackPixels ^= 1; +! if (codingLine[a0i] < w) { +! ++b1i; +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { +! b1i += 2; +! } +! } +! break; +! case twoDimVert0: +! mmrAddPixels(refLine[b1i], blackPixels, codingLine, &a0i, w); +! blackPixels ^= 1; +! if (codingLine[a0i] < w) { +! ++b1i; +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { +! b1i += 2; +! } +! } +! break; + case twoDimVertL3: +! mmrAddPixelsNeg(refLine[b1i] - 3, blackPixels, codingLine, &a0i, w); +! blackPixels ^= 1; +! if (codingLine[a0i] < w) { +! if (b1i > 0) { +! --b1i; +! } else { +! ++b1i; +! } +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { +! b1i += 2; +! } +! } +! break; +! case twoDimVertL2: +! mmrAddPixelsNeg(refLine[b1i] - 2, blackPixels, codingLine, &a0i, w); +! blackPixels ^= 1; +! if (codingLine[a0i] < w) { +! if (b1i > 0) { +! --b1i; +! } else { +! ++b1i; +! } +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { +! b1i += 2; +! } +! } +! break; +! case twoDimVertL1: +! mmrAddPixelsNeg(refLine[b1i] - 1, blackPixels, codingLine, &a0i, w); +! blackPixels ^= 1; +! if (codingLine[a0i] < w) { +! if (b1i > 0) { +! --b1i; +! } else { +! ++b1i; +! } +! while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { +! b1i += 2; +! } +! } +! break; +! case EOF: +! mmrAddPixels(w, 0, codingLine, &a0i, w); +! break; + default: + error(getPos(), "Illegal code in JBIG2 MMR bitmap data"); ++ mmrAddPixels(w, 0, codingLine, &a0i, w); + break; + } +! } + + // convert the run lengths to a bitmap line + i = 0; +! while (1) { + for (x = codingLine[i]; x < codingLine[i+1]; ++x) { + bitmap->setPixel(x, y); + } ++ if (codingLine[i+1] >= w || codingLine[i+2] >= w) { ++ break; ++ } + i += 2; + } + } +*************** +*** 2706,2712 **** + ltp = !ltp; + } + if (ltp) { +! bitmap->duplicateRow(y, y-1); + continue; + } + } +--- 2888,2896 ---- + ltp = !ltp; + } + if (ltp) { +! if (y > 0) { +! bitmap->duplicateRow(y, y-1); +! } + continue; + } + } +*************** +*** 2909,2916 **** + return; + } + if (nRefSegs == 1) { +! seg = findSegment(refSegs[0]); +! if (seg->getType() != jbig2SegBitmap) { + error(getPos(), "Bad bitmap reference in JBIG2 generic refinement segment"); + return; + } +--- 3093,3100 ---- + return; + } + if (nRefSegs == 1) { +! if (!(seg = findSegment(refSegs[0])) || +! seg->getType() != jbig2SegBitmap) { + error(getPos(), "Bad bitmap reference in JBIG2 generic refinement segment"); + return; + } +*************** +*** 3004,3009 **** +--- 3188,3197 ---- + tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); ++ } else { ++ tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy ++ tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; ++ tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; + } + + for (x = 0; x < w; ++x) { +*************** +*** 3075,3080 **** +--- 3263,3272 ---- + tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); ++ } else { ++ tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy ++ tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; ++ tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; + } + + for (x = 0; x < w; ++x) { +diff -r -c xpdf-3.02.orig/xpdf/JBIG2Stream.h xpdf-3.02/xpdf/JBIG2Stream.h +*** xpdf-3.02.orig/xpdf/JBIG2Stream.h Tue Feb 27 14:05:52 2007 +--- xpdf-3.02/xpdf/JBIG2Stream.h Tue Mar 31 10:50:07 2009 +*************** +*** 78,83 **** +--- 78,87 ---- + Guint *refSegs, Guint nRefSegs); + void readGenericRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length); ++ void mmrAddPixels(int a1, int blackPixels, ++ int *codingLine, int *a0i, int w); ++ void mmrAddPixelsNeg(int a1, int blackPixels, ++ int *codingLine, int *a0i, int w); + JBIG2Bitmap *readGenericBitmap(GBool mmr, int w, int h, + int templ, GBool tpgdOn, + GBool useSkip, JBIG2Bitmap *skip, diff --git a/source/xap/xpdf/xpdf-arabic.diff b/source/xap/xpdf/xpdf-arabic.diff new file mode 100644 index 00000000..a6dfcf1f --- /dev/null +++ b/source/xap/xpdf/xpdf-arabic.diff @@ -0,0 +1,7 @@ +--- ./add-to-xpdfrc.orig 2003-02-16 16:54:40.000000000 -0600 ++++ ./add-to-xpdfrc 2008-03-02 01:24:14.000000000 -0600 +@@ -1,3 +1,3 @@ + #----- begin Arabic support package (2003-feb-16) +-unicodeMap ISO-8859-6 /usr/local/share/xpdf/arabic/ISO-8859-6.unicodeMap ++unicodeMap ISO-8859-6 /usr/share/xpdf/arabic/ISO-8859-6.unicodeMap + #----- end Arabic support package diff --git a/source/xap/xpdf/xpdf-chinese-simplified.diff b/source/xap/xpdf/xpdf-chinese-simplified.diff new file mode 100644 index 00000000..adb125a4 --- /dev/null +++ b/source/xap/xpdf/xpdf-chinese-simplified.diff @@ -0,0 +1,19 @@ +--- ./add-to-xpdfrc.orig 2004-07-27 17:28:08.000000000 -0500 ++++ ./add-to-xpdfrc 2008-03-02 01:46:16.000000000 -0600 +@@ -1,9 +1,9 @@ + #----- begin Chinese Simplified support package (2004-jul-27) +-cidToUnicode Adobe-GB1 /usr/local/share/xpdf/chinese-simplified/Adobe-GB1.cidToUnicode +-unicodeMap ISO-2022-CN /usr/local/share/xpdf/chinese-simplified/ISO-2022-CN.unicodeMap +-unicodeMap EUC-CN /usr/local/share/xpdf/chinese-simplified/EUC-CN.unicodeMap +-unicodeMap GBK /usr/local/share/xpdf/chinese-simplified/GBK.unicodeMap +-cMapDir Adobe-GB1 /usr/local/share/xpdf/chinese-simplified/CMap +-toUnicodeDir /usr/local/share/xpdf/chinese-simplified/CMap +-#displayCIDFontTT Adobe-GB1 /usr/..../gkai00mp.ttf ++cidToUnicode Adobe-GB1 /usr/share/xpdf/chinese-simplified/Adobe-GB1.cidToUnicode ++unicodeMap ISO-2022-CN /usr/share/xpdf/chinese-simplified/ISO-2022-CN.unicodeMap ++unicodeMap EUC-CN /usr/share/xpdf/chinese-simplified/EUC-CN.unicodeMap ++unicodeMap GBK /usr/share/xpdf/chinese-simplified/GBK.unicodeMap ++cMapDir Adobe-GB1 /usr/share/xpdf/chinese-simplified/CMap ++toUnicodeDir /usr/share/xpdf/chinese-simplified/CMap ++displayCIDFontTT Adobe-GB1 /usr/share/fonts/TTF/wqy-zenhei.ttf + #----- end Chinese Simplified support package diff --git a/source/xap/xpdf/xpdf-chinese-traditional.diff b/source/xap/xpdf/xpdf-chinese-traditional.diff new file mode 100644 index 00000000..71d35ee5 --- /dev/null +++ b/source/xap/xpdf/xpdf-chinese-traditional.diff @@ -0,0 +1,17 @@ +--- ./add-to-xpdfrc.orig 2004-07-27 17:28:07.000000000 -0500 ++++ ./add-to-xpdfrc 2008-03-02 01:45:16.000000000 -0600 +@@ -1,8 +1,8 @@ + #----- begin Chinese Traditional support package (2004-jul-27) +-cidToUnicode Adobe-CNS1 /usr/local/share/xpdf/chinese-traditional/Adobe-CNS1.cidToUnicode +-unicodeMap Big5 /usr/local/share/xpdf/chinese-traditional/Big5.unicodeMap +-unicodeMap Big5ascii /usr/local/share/xpdf/chinese-traditional/Big5ascii.unicodeMap +-cMapDir Adobe-CNS1 /usr/local/share/xpdf/chinese-traditional/CMap +-toUnicodeDir /usr/local/share/xpdf/chinese-traditional/CMap +-#displayCIDFontTT Adobe-CNS1 /usr/..../bkai00mp.ttf ++cidToUnicode Adobe-CNS1 /usr/share/xpdf/chinese-traditional/Adobe-CNS1.cidToUnicode ++unicodeMap Big5 /usr/share/xpdf/chinese-traditional/Big5.unicodeMap ++unicodeMap Big5ascii /usr/share/xpdf/chinese-traditional/Big5ascii.unicodeMap ++cMapDir Adobe-CNS1 /usr/share/xpdf/chinese-traditional/CMap ++toUnicodeDir /usr/share/xpdf/chinese-traditional/CMap ++displayCIDFontTT Adobe-CNS1 /usr/share/fonts/TTF/wqy-zenhei.ttf + #----- end Chinese Traditional support package diff --git a/source/xap/xpdf/xpdf-cyrillic.diff b/source/xap/xpdf/xpdf-cyrillic.diff new file mode 100644 index 00000000..ec841961 --- /dev/null +++ b/source/xap/xpdf/xpdf-cyrillic.diff @@ -0,0 +1,9 @@ +--- ./add-to-xpdfrc.orig 2003-07-08 00:43:40.000000000 -0500 ++++ ./add-to-xpdfrc 2008-03-02 01:27:17.000000000 -0600 +@@ -1,4 +1,4 @@ + #----- begin Cyrillic support package (2003-jun-28) +-nameToUnicode /usr/local/share/xpdf/cyrillic/Bulgarian.nameToUnicode +-unicodeMap KOI8-R /usr/local/share/xpdf/cyrillic/KOI8-R.unicodeMap ++nameToUnicode /usr/share/xpdf/cyrillic/Bulgarian.nameToUnicode ++unicodeMap KOI8-R /usr/share/xpdf/cyrillic/KOI8-R.unicodeMap + #----- end Cyrillic support package diff --git a/source/xap/xpdf/xpdf-greek.diff b/source/xap/xpdf/xpdf-greek.diff new file mode 100644 index 00000000..fe47d443 --- /dev/null +++ b/source/xap/xpdf/xpdf-greek.diff @@ -0,0 +1,9 @@ +--- ./add-to-xpdfrc.orig 2003-07-08 00:43:40.000000000 -0500 ++++ ./add-to-xpdfrc 2008-03-02 01:28:00.000000000 -0600 +@@ -1,4 +1,4 @@ + #----- begin Greek support package (2003-jun-28) +-nameToUnicode /usr/local/share/xpdf/greek/Greek.nameToUnicode +-unicodeMap ISO-8859-7 /usr/local/share/xpdf/greek/ISO-8859-7.unicodeMap ++nameToUnicode /usr/share/xpdf/greek/Greek.nameToUnicode ++unicodeMap ISO-8859-7 /usr/share/xpdf/greek/ISO-8859-7.unicodeMap + #----- end Greek support package diff --git a/source/xap/xpdf/xpdf-hebrew.diff b/source/xap/xpdf/xpdf-hebrew.diff new file mode 100644 index 00000000..e7d091d0 --- /dev/null +++ b/source/xap/xpdf/xpdf-hebrew.diff @@ -0,0 +1,9 @@ +--- ./add-to-xpdfrc.orig 2008-03-02 01:28:33.000000000 -0600 ++++ ./add-to-xpdfrc 2008-03-02 01:28:45.000000000 -0600 +@@ -1,4 +1,4 @@ + #----- begin Hebrew support package (2003-feb-16) +-unicodeMap ISO-8859-8 /usr/local/share/xpdf/hebrew/ISO-8859-8.unicodeMap +-unicodeMap Windows-1255 /usr/local/share/xpdf/hebrew/Windows-1255.unicodeMap ++unicodeMap ISO-8859-8 /usr/share/xpdf/hebrew/ISO-8859-8.unicodeMap ++unicodeMap Windows-1255 /usr/share/xpdf/hebrew/Windows-1255.unicodeMap + #----- end Hebrew support package diff --git a/source/xap/xpdf/xpdf-japanese.diff b/source/xap/xpdf/xpdf-japanese.diff new file mode 100644 index 00000000..5c1878fe --- /dev/null +++ b/source/xap/xpdf/xpdf-japanese.diff @@ -0,0 +1,57 @@ +--- ./add-to-xpdfrc.orig 2008-03-02 01:31:08.000000000 -0600 ++++ ./add-to-xpdfrc 2008-03-02 01:31:32.000000000 -0600 +@@ -1,9 +1,47 @@ + #----- begin Japanese support package (2004-jul-27) +-cidToUnicode Adobe-Japan1 /usr/local/share/xpdf/japanese/Adobe-Japan1.cidToUnicode +-unicodeMap ISO-2022-JP /usr/local/share/xpdf/japanese/ISO-2022-JP.unicodeMap +-unicodeMap EUC-JP /usr/local/share/xpdf/japanese/EUC-JP.unicodeMap +-unicodeMap Shift-JIS /usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap +-cMapDir Adobe-Japan1 /usr/local/share/xpdf/japanese/CMap +-toUnicodeDir /usr/local/share/xpdf/japanese/CMap +-#displayCIDFontTT Adobe-Japan1 /usr/..../kochi-mincho.ttf ++cidToUnicode Adobe-Japan1 /usr/share/xpdf/japanese/Adobe-Japan1.cidToUnicode ++unicodeMap ISO-2022-JP /usr/share/xpdf/japanese/ISO-2022-JP.unicodeMap ++unicodeMap EUC-JP /usr/share/xpdf/japanese/EUC-JP.unicodeMap ++unicodeMap Shift-JIS /usr/share/xpdf/japanese/Shift-JIS.unicodeMap ++cMapDir Adobe-Japan1 /usr/share/xpdf/japanese/CMap ++toUnicodeDir /usr/share/xpdf/japanese/CMap ++ ++### use Sazanami by default ++displayCIDFontTT Adobe-Japan1 /usr/share/fonts/TTF/sazanami-mincho.ttf ++### use Sazanami (Sazanami Gothic) if gothic font is required ++displayNamedCIDFontTT ShinGo-Bold /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT ShinGo-regular /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT MidashiGo-MB31 /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT FutoGoB101-Bold /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT HeiseiKakuGo-W5 /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT HeiseiKakuGo-W9 /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT HeiseiMaruGo-W4 /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT MS-Gothic /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT HG-GothicB /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT Kochi-Gothic /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT GothicBBB-Medium-H /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT GothicBBB-Medium /usr/share/fonts/TTF/sazanami-gothic.ttf ++displayNamedCIDFontTT Ryumin-Light-H /usr/share/fonts/TTF/sazanami-mincho.ttf ++displayNamedCIDFontTT Ryumin-Light /usr/share/fonts/TTF/sazanami-mincho.ttf ++ ++### make default font name to "Ryumin-Light" when converted to PostScript ++psFont16 Adobe-Japan1 H Ryumin-Light-H ISO-2022-JP ++psFont16 Adobe-Japan1 V Ryumin-Light-V ISO-2022-JP ++# use "Gothic-BBB-Medium" if gothic font is required ++psNamedFont16 MidashiGo-MB31 H GothicBBB-Medium-H ISO-2022-JP ++psNamedFont16 MidashiGo-MB31 V GothicBBB-Medium-V ISO-2022-JP ++psNamedFont16 FutoGoB101-Bold H GothicBBB-Medium-H ISO-2022-JP ++psNamedFont16 FutoGoB101-Bold V GothicBBB-Medium-V ISO-2022-JP ++psNamedFont16 HeiseiKakuGo-W5 H GothicBBB-Medium-H ISO-2022-JP ++psNamedFont16 HeiseiKakuGo-W5 V GothicBBB-Medium-V ISO-2022-JP ++psNamedFont16 HeiseiKakuGo-W9 H GothicBBB-Medium-H ISO-2022-JP ++psNamedFont16 HeiseiKakuGo-W9 V GothicBBB-Medium-V ISO-2022-JP ++psNamedFont16 HeiseiMaruGo-W4 H GothicBBB-Medium-H ISO-2022-JP ++psNamedFont16 HeiseiMaruGo-W4 V GothicBBB-Medium-V ISO-2022-JP ++psNamedFont16 MS-Gothic H GothicBBB-Medium-H ISO-2022-JP ++psNamedFont16 MS-Gothic V GothicBBB-Medium-V ISO-2022-JP ++psNamedFont16 HG-GothicB H GothicBBB-Medium-H ISO-2022-JP ++psNamedFont16 HG-GothicB V GothicBBB-Medium-V ISO-2022-JP ++psNamedFont16 Kochi-Gothic H GothicBBB-Medium-H ISO-2022-JP ++psNamedFont16 Kochi-Gothic V GothicBBB-Medium-V ISO-2022-JP + #----- end Japanese support package diff --git a/source/xap/xpdf/xpdf-korean.diff b/source/xap/xpdf/xpdf-korean.diff new file mode 100644 index 00000000..632fc214 --- /dev/null +++ b/source/xap/xpdf/xpdf-korean.diff @@ -0,0 +1,15 @@ +--- ./add-to-xpdfrc.orig 2005-07-07 13:05:05.000000000 -0500 ++++ ./add-to-xpdfrc 2008-03-02 01:33:52.000000000 -0600 +@@ -1,8 +1,8 @@ + #----- begin Korean support package (2005-jul-07) +-cidToUnicode Adobe-Korea1 /usr/local/share/xpdf/korean/Adobe-Korea1.cidToUnicode +-unicodeMap ISO-2022-KR /usr/local/share/xpdf/korean/ISO-2022-KR.unicodeMap +-cMapDir Adobe-Korea1 /usr/local/share/xpdf/korean/CMap +-toUnicodeDir /usr/local/share/xpdf/korean/CMap ++cidToUnicode Adobe-Korea1 /usr/share/xpdf/korean/Adobe-Korea1.cidToUnicode ++unicodeMap ISO-2022-KR /usr/share/xpdf/korean/ISO-2022-KR.unicodeMap ++cMapDir Adobe-Korea1 /usr/share/xpdf/korean/CMap ++toUnicodeDir /usr/share/xpdf/korean/CMap + #displayCIDFontTT Adobe-Korea1 /usr/..../batang.ttf" + #displayCIDFontTT Unidocs-Korea1 /usr/..../batang.ttf" + #----- end Korean support package diff --git a/source/xap/xpdf/xpdf-latin2.diff b/source/xap/xpdf/xpdf-latin2.diff new file mode 100644 index 00000000..88ce2444 --- /dev/null +++ b/source/xap/xpdf/xpdf-latin2.diff @@ -0,0 +1,7 @@ +--- ./add-to-xpdfrc.orig 2002-11-03 17:49:15.000000000 -0600 ++++ ./add-to-xpdfrc 2008-03-02 01:35:51.000000000 -0600 +@@ -1,3 +1,3 @@ + #----- begin Latin2 support package (2002-oct-22) +-unicodeMap Latin2 /usr/local/share/xpdf/latin2/Latin2.unicodeMap ++unicodeMap Latin2 /usr/share/xpdf/latin2/Latin2.unicodeMap + #----- end Latin2 support package diff --git a/source/xap/xpdf/xpdf-resizefix.diff b/source/xap/xpdf/xpdf-resizefix.diff new file mode 100644 index 00000000..4be7feb0 --- /dev/null +++ b/source/xap/xpdf/xpdf-resizefix.diff @@ -0,0 +1,34 @@ +--- ./fofi/FoFiType1.cc.orig 2007-02-27 16:05:51.000000000 -0600 ++++ ./fofi/FoFiType1.cc 2007-04-11 19:58:28.000000000 -0500 +@@ -235,9 +235,14 @@ + } + } + } else { +- if (strtok(buf, " \t") && +- (p = strtok(NULL, " \t\n\r")) && !strcmp(p, "def")) { +- break; ++ p = strtok(buf, " \t\n\r"); ++ if (p) ++ { ++ if (!strcmp(p, "def")) break; ++ if (!strcmp(p, "readonly")) break; ++ // the spec does not says this but i'm mantaining old xpdf behaviour that accepts "foo def" as end of the encoding array ++ p = strtok(buf, " \t\n\r"); ++ if (p && !strcmp(p, "def")) break; + } + } + } +--- ./splash/Splash.cc.orig 2007-02-27 16:05:52.000000000 -0600 ++++ ./splash/Splash.cc 2007-04-11 19:58:35.000000000 -0500 +@@ -1501,6 +1501,11 @@ + xPath->aaScale(); + } + xPath->sort(); ++ if (!&xPath->segs[0]) ++ { ++ delete xPath; ++ return splashErrEmptyPath; ++ } + scanner = new SplashXPathScanner(xPath, eo); + + // get the min and max x and y values diff --git a/source/xap/xpdf/xpdf-thai.diff b/source/xap/xpdf/xpdf-thai.diff new file mode 100644 index 00000000..75b9b1a2 --- /dev/null +++ b/source/xap/xpdf/xpdf-thai.diff @@ -0,0 +1,9 @@ +--- ./add-to-xpdfrc.orig 2002-11-03 17:49:15.000000000 -0600 ++++ ./add-to-xpdfrc 2008-03-02 01:36:36.000000000 -0600 +@@ -1,4 +1,4 @@ + #----- begin Thai support package (2002-jan-16) +-nameToUnicode /usr/local/share/xpdf/thai/Thai.nameToUnicode +-unicodeMap TIS-620 /usr/local/share/xpdf/thai/TIS-620.unicodeMap ++nameToUnicode /usr/share/xpdf/thai/Thai.nameToUnicode ++unicodeMap TIS-620 /usr/share/xpdf/thai/TIS-620.unicodeMap + #----- end Thai support package diff --git a/source/xap/xpdf/xpdf-turkish.diff b/source/xap/xpdf/xpdf-turkish.diff new file mode 100644 index 00000000..ec7fe79f --- /dev/null +++ b/source/xap/xpdf/xpdf-turkish.diff @@ -0,0 +1,7 @@ +--- ./add-to-xpdfrc.orig 2002-11-03 17:49:15.000000000 -0600 ++++ ./add-to-xpdfrc 2008-03-02 01:37:33.000000000 -0600 +@@ -1,3 +1,3 @@ + #----- begin Turkish support package (2002-apr-10) +-unicodeMap ISO-8859-9 /usr/local/share/xpdf/turkish/ISO-8859-9.unicodeMap ++unicodeMap ISO-8859-9 /usr/share/xpdf/turkish/ISO-8859-9.unicodeMap + #----- end Turkish support package diff --git a/source/xap/xpdf/xpdf.SlackBuild b/source/xap/xpdf/xpdf.SlackBuild new file mode 100755 index 00000000..d07fb9aa --- /dev/null +++ b/source/xap/xpdf/xpdf.SlackBuild @@ -0,0 +1,143 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=3.02 +PATCHLEVEL=pl3 +ARCH=${ARCH:-x86_64} +NUMJOBS=${NUMJOBS:-" -j7 "} +BUILD=1 + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xpdf +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf xpdf-$VERSION +tar xvf $CWD/xpdf-$VERSION.tar.gz || exit 1 +cd xpdf-$VERSION || exit 1 + +zcat $CWD/xpdf-resizefix.diff.gz | patch -p1 --verbose || exit 1 +cat $CWD/xpdf-3.02pl1.patch | patch -p1 --verbose || exit 1 +cat $CWD/xpdf-3.02pl2.patch | patch -p1 --verbose || exit 1 +cat $CWD/xpdf-3.02pl3.patch | patch -p1 --verbose || exit 1 +zcat $CWD/xpdf_3.02-1.3.diff.gz | patch -p1 --verbose || exit 1 + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +zcat $CWD/xpdfrc.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --sysconfdir=/etc \ + --with-gzip \ + --with-freetype2-includes=/usr/include/freetype2 + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG || exit 1 + +mkdir -p $PKG/etc +cat doc/sample-xpdfrc > $PKG/etc/xpdfrc +mkdir -p $PKG/usr/share/applications +cat $CWD/xpdf.desktop > $PKG/usr/share/applications/xpdf.desktop +mkdir -p $PKG/usr/share/icons +cat xpdf/xpdfIcon.xpm > $PKG/usr/share/icons/xpdfIcon.xpm + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +chmod 755 $PKG/usr/bin/* +gzip -9 $PKG/usr/man/man?/* + +mkdir -p $PKG/usr/doc/xpdf-$VERSION +cp -a \ + ANNOUNCE CHANGES COPYING INSTALL README \ + $PKG/usr/doc/xpdf-$VERSION +chmod 644 $PKG/usr/doc/xpdf-$VERSION/* + +# Add additional language support: +for language in xpdf-arabic xpdf-chinese-simplified xpdf-chinese-traditional xpdf-cyrillic xpdf-greek xpdf-hebrew xpdf-japanese xpdf-korean xpdf-latin2 xpdf-thai xpdf-turkish ; do + rm -rf ${language} + tar xf $CWD/${language}.tar.gz + ( cd ${language} + zcat $CWD/${language}.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit 1 + chown -R root:root . + find . -type f -exec chmod 644 {} \; + cat add-to-xpdfrc >> $PKG/etc/xpdfrc + mkdir -p $PKG/usr/share/xpdf/$(echo ${language} | cut -f2- -d -) + cp -a * $PKG/usr/share/xpdf/$(echo ${language} | cut -f2- -d -) + ) +done + +mkdir -p $PKG/install +mv $PKG/etc/xpdfrc $PKG/etc/xpdfrc.new +cat << EOF > $PKG/install/doinst.sh +#!/bin/sh +config() { + NEW="\$1" + OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)" + # If there's no config file by that name, mv it over: + if [ ! -r \$OLD ]; then + mv \$NEW \$OLD + elif [ "\$(cat \$OLD | md5sum)" = "\$(cat \$NEW | md5sum)" ]; then # toss the redundant copy + rm \$NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} +config etc/xpdfrc.new +EOF +cat $CWD/slack-desc > $PKG/install/slack-desc + +# We'll use the versions of these from the poppler derived work (if they exist here): +( cd $PKG/usr/bin + rm -f pdfinfo pdftops pdftoppm pdftohtml pdftotext pdfimages pdffonts + cd $PKG/usr/man/man1 + for file in pdfinfo pdftops pdftoppm pdftohtml pdftotext pdfimages pdffonts ; do + rm -f ${file}.1.gz + done +) + +# Build the package: +cd $PKG +/sbin/makepkg -l y -c n $TMP/xpdf-${VERSION}${PATCHLEVEL}-$ARCH-$BUILD.txz + diff --git a/source/xap/xpdf/xpdf.desktop b/source/xap/xpdf/xpdf.desktop new file mode 100644 index 00000000..b8f4c9b1 --- /dev/null +++ b/source/xap/xpdf/xpdf.desktop @@ -0,0 +1,100 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=X PDF +Name[bn]=à¦à¦•à§à¦¸ পি-ডি-à¦à¦« +Name[de]=X-PDF +Name[eo]=XPDF +Name[es]=PDF para X +Name[fr]=XPDF +Name[hi]=à¤à¤•à¥à¤¸ पीडीà¤à¤« +Name[ko]=Xìš© PDF +Name[mn]=X-PDF +Name[nds]=X-PDF +Name[te]=à°Žà°•à±à°¸à± పిడిఎఫౠ+MimeType=application/pdf +GenericName=PDF Viewer +GenericName[af]=Pdf Aansig +GenericName[ar]=عارض الملÙات PDF +GenericName[az]=PDF Nümayişçisi +GenericName[be]=ПраглÑдальнік PDF +GenericName[bg]=Преглед на PDF документи +GenericName[bn]=পি-ডি-à¦à¦« পà§à¦°à¦¦à¦°à§à¦¶à¦• +GenericName[br]=Gweler PDF +GenericName[bs]=Preglednik PDF dokumenata +GenericName[ca]=Visor PDF +GenericName[cs]=ProhlÞeÄ PDF souborů +GenericName[csb]=Przezérnik PDF +GenericName[cy]=Gwelydd PDF +GenericName[da]=PDF-fremviser +GenericName[de]=PDF-Betrachter +GenericName[el]=Î ÏοβολÎας PDF +GenericName[eo]=PDF-rigardilo +GenericName[es]=Visor de documentos PDF +GenericName[et]=PDF failide vaatamine +GenericName[eu]=PDF ikustailua +GenericName[fa]=مشاهده‌گر PDF +GenericName[fi]=PDF-näytin +GenericName[fo]=PDF-vÃsari +GenericName[fr]=Afficheur PDF +GenericName[fy]=PDF-werjefteprogramma +GenericName[ga]=Amharcán PDF +GenericName[gl]=Visualizador de PDF +GenericName[he]=מציג קבצי PDF +GenericName[hi]=पीडीà¤à¤« पà¥à¤°à¤¦à¤°à¥à¤¶à¤• +GenericName[hr]=Preglednik PDF dokumenata +GenericName[hu]=PDF-nézegetÅ‘ +GenericName[id]=Viewer PDF +GenericName[is]=PDF-sjá +GenericName[it]=Visualizzatore PDF +GenericName[ja]=PDF ビューア +GenericName[kk]=PDF қарау құралы +GenericName[km]=កម្មវិធី​មើល PDF +GenericName[ko]=PDF 보기 +GenericName[lo]=ສະà»àº”ງຜົນPDF +GenericName[lt]=PDF ŽiÅ«riklis +GenericName[lv]=PDF SkatÄ«tÄjs +GenericName[mk]=Прегледувач на PDF +GenericName[mn]=PDF-Харагч +GenericName[ms]=Pemapar PDF +GenericName[mt]=Werrej PDF +GenericName[nb]=PDF-leser +GenericName[nds]=Kieker för PDF-Dateien +GenericName[ne]=PDF दरà¥à¤¶à¤• +GenericName[nl]=PDF-weergaveprogramma +GenericName[nn]=PDF-lesar +GenericName[nso]=Molebeledi wa PDF +GenericName[oc]=Visualisor PDF +GenericName[pa]=PDF ਦਰਸ਼ਕ +GenericName[pl]=PrzeglÄ…darka plików PDF +GenericName[pt]=Visualizador de PDFs +GenericName[pt_BR]=Visualizador de arquivos PDF +GenericName[ro]=Vizualizor de documente PDF +GenericName[ru]=ПроÑмотр PDF +GenericName[rw]=Mugaragaza PDF +GenericName[se]=PDF-logan +GenericName[sk]=PrehliadaÄ PDF súborov +GenericName[sl]=Pregledovalnik datotek PDF +GenericName[sr]=PDF приказивач +GenericName[sr@Latn]=PDF prikazivaÄ +GenericName[ss]=Sibuki se PDF +GenericName[sv]=PDF-visare +GenericName[ta]=PDF காடà¯à®šà®¿ +GenericName[tg]=Ðамоишгари PDF +GenericName[th]=ตัวà¹à¸ªà¸”งผล PDF +GenericName[tr]=PDF Görüntüleyici +GenericName[tt]=PDF Kürsätkeç +GenericName[uk]=ПереглÑдач PDF +GenericName[uz]=PDF кўрувчи +GenericName[ven]=Tshivhoni tsha PDF +GenericName[vi]=Trình xem PDF +GenericName[wa]=HÃ¥yneu di documints PDF +GenericName[zh_CN]=PDF 查看器 +GenericName[zh_TW]=PDF æª¢è¦–ç¨‹å¼ +GenericName[zu]=Umbukisi we-PDF +Exec=xpdf +Icon=xpdfIcon +Path= +Type=Application +Terminal=false +X-KDE-StartupNotify=false +Categories=Graphics;PDFViewer; diff --git a/source/xap/xpdf/xpdf_3.02-1.3.diff b/source/xap/xpdf/xpdf_3.02-1.3.diff new file mode 100644 index 00000000..6a769e5c --- /dev/null +++ b/source/xap/xpdf/xpdf_3.02-1.3.diff @@ -0,0 +1,4470 @@ +--- xpdf-3.02.orig/debian/README.Debian ++++ xpdf-3.02/debian/README.Debian +@@ -0,0 +1,16 @@ ++ ++This package incorporates the following Xpdf language ++packages: ++ ++xpdf-cyrillic 2002-jun-28 ++xpdf-greek 2002-jun-28 ++xpdf-hebrew 2003-feb-16 ++xpdf-latin2 2002-oct-22 ++xpdf-thai 2002-jan-16 ++xpdf-turkish 2002-apr-10 ++xpdf-arabic 2003-feb-16 ++ ++xpdf-chinese-simplified, xpdf-chinese-traditional, xpdf-korean ++and xpdf-japanese are separate Debian packages in the "non-free" ++section of the Debian archive. ++ +--- xpdf-3.02.orig/debian/xpdf-utils.files ++++ xpdf-3.02/debian/xpdf-utils.files +@@ -0,0 +1,10 @@ ++/usr/share/man/man1/pdftotext.1 ++/usr/share/man/man1/pdfinfo.1 ++/usr/share/man/man1/pdffonts.1 ++/usr/share/man/man1/pdfimages.1 ++/usr/share/man/man1/pdftops.1 ++/usr/bin/pdftops ++/usr/bin/pdftotext ++/usr/bin/pdfinfo ++/usr/bin/pdffonts ++/usr/bin/pdfimages +--- xpdf-3.02.orig/debian/patches-obselete/04_freetype-glyph.dpatch ++++ xpdf-3.02/debian/patches-obselete/04_freetype-glyph.dpatch +@@ -0,0 +1,20 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 04_freetype-glyph.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: Bug fix for Freetype glyph handling ++ ++@DPATCH@ ++ ++--- xpdf-3.00.orig/splash/SplashFTFont.cc +++++ xpdf-3.00/splash/SplashFTFont.cc ++@@ -238,6 +238,9 @@ ++ if (FT_Get_Glyph(slot, &glyph)) { ++ return NULL; ++ } +++ if (glyph->format != FT_GLYPH_FORMAT_OUTLINE) { +++ return NULL; +++ } ++ path.path = new SplashPath(); ++ path.needClose = gFalse; ++ FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline, +--- xpdf-3.02.orig/debian/patches-obselete/07_decrypt.dpatch ++++ xpdf-3.02/debian/patches-obselete/07_decrypt.dpatch +@@ -0,0 +1,52 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 07_decrypt.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: Avoid potential buffer overruns during decryption ++ ++@DPATCH@ ++diff -urNad --exclude=CVS --exclude=.svn ./xpdf/Decrypt.cc /tmp/dpep-work.wRRwAu/xpdf-3.01/xpdf/Decrypt.cc ++--- ./xpdf/Decrypt.cc 2005-08-17 15:34:31.000000000 +1000 +++++ /tmp/dpep-work.wRRwAu/xpdf-3.01/xpdf/Decrypt.cc 2005-08-19 18:47:09.000000000 +1000 ++@@ -75,6 +75,11 @@ ++ Guchar fx, fy; ++ int len, i, j; ++ +++ // check whether we have non-zero keyLength +++ if ( !keyLength ) { +++ return gFalse; +++ } +++ ++ // try using the supplied owner password to generate the user password ++ *ownerPasswordOk = gFalse; ++ if (ownerPassword) { ++@@ -100,7 +105,7 @@ ++ } else { ++ memcpy(test2, ownerKey->getCString(), 32); ++ for (i = 19; i >= 0; --i) { ++- for (j = 0; j < keyLength; ++j) { +++ for (j = 0; j < keyLength && j < 16; ++j) { ++ tmpKey[j] = test[j] ^ i; ++ } ++ rc4InitKey(tmpKey, keyLength, fState); ++@@ -140,6 +145,11 @@ ++ int len, i, j; ++ GBool ok; ++ +++ // check whether we have non-zero keyLength +++ if ( !keyLength ) { +++ return gFalse; +++ } +++ ++ // generate file key ++ buf = (Guchar *)gmalloc(72 + fileID->getLength()); ++ if (userPassword) { ++@@ -184,7 +194,7 @@ ++ } else if (encRevision == 3) { ++ memcpy(test, userKey->getCString(), 32); ++ for (i = 19; i >= 0; --i) { ++- for (j = 0; j < keyLength; ++j) { +++ for (j = 0; j < keyLength && j < 16; ++j) { ++ tmpKey[j] = fileKey[j] ^ i; ++ } ++ rc4InitKey(tmpKey, keyLength, fState); +--- xpdf-3.02.orig/debian/patches-obselete/03_freetype-build.dpatch ++++ xpdf-3.02/debian/patches-obselete/03_freetype-build.dpatch +@@ -0,0 +1,301 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 03_freetype-build.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: Use pkg-config to locate FreeType build information ++ ++@DPATCH@ ++diff -urNad --exclude=CVS --exclude=.svn ./configure.in /tmp/dpep-work.9fnwEh/xpdf-3.01/configure.in ++--- ./configure.in 2005-08-19 17:06:04.000000000 +1000 +++++ /tmp/dpep-work.9fnwEh/xpdf-3.01/configure.in 2005-08-19 17:12:11.000000000 +1000 ++@@ -301,10 +301,8 @@ ++ AC_SUBST(t1_CFLAGS) ++ ++ dnl ##### Check for FreeType 2.x. ++-dnl ##### (Note: FT_Get_Name_Index was added in FT 2.0.5, and is ++-dnl ##### the reason that Xpdf requires 2.0.5+.) ++-smr_CHECK_LIB(freetype2, freetype, [FreeType2 font rasterizer - version 2.0.5+], ++- FT_Get_Name_Index, ft2build.h, -lm) +++PKG_CHECK_MODULES(freetype2, freetype2 >= 9.5.3, smr_have_freetype2_library="yes", +++ smr_have_freetype2_library="no") ++ AC_SUBST(freetype2_LIBS) ++ AC_SUBST(freetype2_CFLAGS) ++ if test "x$smr_have_freetype2_library" = xyes; then ++diff -urNad --exclude=CVS --exclude=.svn ./smr.m4 /tmp/dpep-work.9fnwEh/xpdf-3.01/smr.m4 ++--- ./smr.m4 1970-01-01 10:00:00.000000000 +1000 +++++ /tmp/dpep-work.9fnwEh/xpdf-3.01/smr.m4 2005-08-19 17:12:05.000000000 +1000 ++@@ -0,0 +1,274 @@ +++# <<< smr.m4 from smr_macros 0.2.4 >>> +++ +++dnl ####################### -*- Mode: M4 -*- ########################### +++dnl smr.m4 -- +++dnl +++dnl Copyright (C) 1999 Matthew D. Langston <langston at SLAC.Stanford.EDU> +++dnl Copyright (C) 1998 Steve Robbins <stever at cs.mcgill.ca> +++dnl +++dnl This file is free software; you can redistribute it and/or modify it +++dnl under the terms of the GNU General Public License as published by +++dnl the Free Software Foundation; either version 2 of the License, or +++dnl (at your option) any later version. +++dnl +++dnl This file is distributed in the hope that it will be useful, but +++dnl WITHOUT ANY WARRANTY; without even the implied warranty of +++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +++dnl General Public License for more details. +++dnl +++dnl You should have received a copy of the GNU General Public License +++dnl along with this file; if not, write to: +++dnl +++dnl Free Software Foundation, Inc. +++dnl Suite 330 +++dnl 59 Temple Place +++dnl Boston, MA 02111-1307, USA. +++dnl #################################################################### +++ +++ +++dnl NOTE: The macros in this file are extensively documented in the +++dnl accompanying `smr_macros.texi' Texinfo file. Please see the +++dnl Texinfo documentation for the definitive specification of how +++dnl these macros are supposed to work. If the macros work +++dnl differently than the Texinfo documentation says they should, +++dnl then the macros (and not the Texinfo documentation) has the +++dnl bug(s). +++ +++dnl This is a convenient macro which translates illegal characters for +++dnl bourne shell variables into legal characters. It has the same +++dnl functionality as sed 'y%./+-:%__p__%'. +++AC_DEFUN([smr_safe_translation], [patsubst(patsubst([$1], [+], [p]), [./-:], [_])]) +++ +++AC_DEFUN(smr_SWITCH, +++[ +++ dnl Define convenient aliases for the arguments since there are so +++ dnl many of them and I keep confusing myself whenever I have to edit +++ dnl this macro. +++ pushdef([smr_name], $1) +++ pushdef([smr_help_string], $2) +++ pushdef([smr_default], $3) +++ pushdef([smr_yes_define], $4) +++ pushdef([smr_no_define], $5) +++ +++ dnl Do some sanity checking of the arguments. +++ ifelse([regexp(smr_default, [^\(yes\|no\)$])], -1, [AC_MSG_ERROR($0: third arg must be either yes or no)]) +++ +++ dnl Create the help string +++ pushdef([smr_lhs], [--ifelse(smr_default, yes, disable, enable)-smr_name])dnl +++ pushdef([smr_rhs], [ifelse(smr_default, yes, disable, enable) smr_help_string (default is smr_default)])dnl +++ +++ dnl Add the option to `configure --help'. We don't need to supply the +++ dnl 4th argument to AC_ARG_ENABLE (i.e. the code to set the default +++ dnl value) because that is done below by AC_CACHE_CHECK. +++ AC_ARG_ENABLE([smr_name], +++ AC_HELP_STRING([smr_lhs], [smr_rhs]), +++ smr_cv_enable_[]smr_name=$enableval) +++ +++ dnl We cache the result so that the user doesn't have to remember +++ dnl which flags they passed to `configure'. +++ AC_CACHE_CHECK([whether to enable smr_help_string], +++ smr_cv_enable_[]smr_name, +++ smr_cv_enable_[]smr_name=smr_default) +++ +++ ifelse(smr_yes_define, , , test x"[$]smr_cv_enable_[]smr_name" = xyes && AC_DEFINE(smr_yes_define)) +++ ifelse(smr_no_define, , , test x"[$]smr_cv_enable_[]smr_name" = xno && AC_DEFINE(smr_no_define)) +++ +++ dnl Sanity check the value assigned to smr_cv_enable_$1 to force it to +++ dnl be either `yes' or `no'. +++ if test ! x"[$]smr_cv_enable_[]smr_name" = xyes; then +++ if test ! x"[$]smr_cv_enable_[]smr_name" = xno; then +++ AC_MSG_ERROR([smr_lhs must be either yes or no]) +++ fi +++ fi +++ +++ popdef([smr_name]) +++ popdef([smr_help_string]) +++ popdef([smr_default]) +++ popdef([smr_yes_define]) +++ popdef([smr_no_define]) +++ popdef([smr_lhs]) +++ popdef([smr_rhs]) +++]) +++ +++ +++AC_DEFUN(smr_ARG_WITHLIB, +++[ +++ dnl Define convenient aliases for the arguments since there are so +++ dnl many of them and I keep confusing myself whenever I have to edit +++ dnl this macro. +++ pushdef([smr_name], $1) +++ pushdef([smr_libname], ifelse($2, , smr_name, $2)) +++ pushdef([smr_help_string], $3) +++ pushdef([smr_safe_name], smr_safe_translation(smr_name)) +++ +++ dnl Add the option to `configure --help'. We don't need to supply the +++ dnl 4th argument to AC_ARG_WITH (i.e. the code to set the default +++ dnl value) because that is done below by AC_CACHE_CHECK. +++ AC_ARG_WITH(smr_safe_name-library, +++ AC_HELP_STRING([--with-smr_safe_name-library[[=PATH]]], +++ [use smr_name library ifelse(smr_help_string, , , (smr_help_string))]), +++ smr_cv_with_[]smr_safe_name[]_library=$withval) +++ +++ dnl We cache the result so that the user doesn't have to remember +++ dnl which flags they passed to `configure'. +++ AC_CACHE_CHECK([whether to use smr_name library], +++ smr_cv_with_[]smr_safe_name[]_library, +++ smr_cv_with_[]smr_safe_name[]_library=maybe) +++ +++ +++ case x"[$]smr_cv_with_[]smr_safe_name[]_library" in +++ xyes | xmaybe) +++ smr_safe_name[]_LIBS="-l[]smr_libname" +++ with_[]smr_safe_name=[$]smr_cv_with_[]smr_safe_name[]_library +++ ;; +++ xno) +++ smr_safe_name[]_LIBS= +++ with_[]smr_safe_name=no +++ ;; +++ *) +++ if test -f "[$]smr_cv_with_[]smr_safe_name[]_library"; then +++ smr_safe_name[]_LIBS=[$]smr_cv_with_[]smr_safe_name[]_library +++ elif test -d "[$]smr_cv_with_[]smr_safe_name[]_library"; then +++ smr_safe_name[]_LIBS="-L[$]smr_cv_with_[]smr_safe_name[]_library -l[]smr_libname" +++ else +++ AC_MSG_ERROR([argument must be boolean, file, or directory]) +++ fi +++ with_[]smr_safe_name=yes +++ ;; +++ esac +++ +++ popdef([smr_name]) +++ popdef([smr_libname]) +++ popdef([smr_help_string]) +++ popdef([smr_safe_name]) +++]) +++ +++ +++AC_DEFUN(smr_ARG_WITHINCLUDES, +++[ +++ dnl Define convenient aliases for the arguments since there are so +++ dnl many of them and I keep confusing myself whenever I have to edit +++ dnl this macro. +++ pushdef([smr_name], $1) +++ pushdef([smr_header], $2) +++ pushdef([smr_extra_flags], $3) +++ pushdef([smr_safe_name], smr_safe_translation(smr_name)) +++ +++ dnl Add the option to `configure --help'. We don't need to supply the +++ dnl 4th argument to AC_ARG_WITH (i.e. the code to set the default +++ dnl value) because that is done below by AC_CACHE_CHECK. +++ AC_ARG_WITH(smr_safe_name-includes, +++ AC_HELP_STRING([--with-smr_safe_name-includes[[=DIR]]], +++ [set directory for smr_name headers]), +++ smr_cv_with_[]smr_safe_name[]_includes=$withval) +++ +++ dnl We cache the result so that the user doesn't have to remember +++ dnl which flags they passed to `configure'. +++ AC_CACHE_CHECK([where to find the smr_name header files], +++ smr_cv_with_[]smr_safe_name[]_includes, +++ smr_cv_with_[]smr_safe_name[]_includes=) +++ +++ if test ! x"[$]smr_cv_with_[]smr_safe_name[]_includes" = x; then +++ if test -d "[$]smr_cv_with_[]smr_safe_name[]_includes"; then +++ smr_safe_name[]_CFLAGS="-I[$]smr_cv_with_[]smr_safe_name[]_includes" +++ else +++ AC_MSG_ERROR([argument must be a directory]) +++ fi +++ else +++ smr_safe_name[]_CFLAGS= +++ fi +++ +++ dnl This bit of logic comes from the autoconf AC_PROG_CC macro. We +++ dnl need to put the given include directory into CPPFLAGS temporarily, +++ dnl but then restore CPPFLAGS to its old value. +++ smr_test_CPPFLAGS="${CPPFLAGS+set}" +++ smr_save_CPPFLAGS="$CPPFLAGS" +++ CPPFLAGS="$CPPFLAGS [$]smr_safe_name[]_CFLAGS smr_extra_flags" +++ +++ dnl If the header file smr_header exists, then define +++ dnl HAVE_[]smr_header (in all capitals). +++ AC_CHECK_HEADERS([smr_header], +++ smr_have_[]smr_safe_name[]_header=yes, +++ smr_have_[]smr_safe_name[]_header=no) +++ +++ if test x"$smr_test_CPPFLAGS" = xset; then +++ CPPFLAGS=$smr_save_CPPFLAGS +++ else +++ unset CPPFLAGS +++ fi +++ +++ popdef([smr_name]) +++ popdef([smr_header]) +++ popdef([smr_extra_flags]) +++ popdef([smr_safe_name]) +++]) +++ +++ +++AC_DEFUN(smr_CHECK_LIB, +++[ +++ dnl Define convenient aliases for the arguments since there are so +++ dnl many of them and I keep confusing myself whenever I have to edit +++ dnl this macro. +++ pushdef([smr_name], $1) +++ pushdef([smr_libname], ifelse($2, , smr_name, $2)) +++ pushdef([smr_help_string], $3) +++ pushdef([smr_function], $4) +++ pushdef([smr_header], $5) +++ pushdef([smr_extra_libs], $6) +++ pushdef([smr_extra_flags], $7) +++ pushdef([smr_prototype], $8) +++ pushdef([smr_safe_name], smr_safe_translation(smr_name)) +++ +++ dnl Give the user (via "configure --help") an interface to specify +++ dnl whether we should use the library or not, and possibly where we +++ dnl should find it. +++ smr_ARG_WITHLIB([smr_name], [smr_libname], [smr_help_string]) +++ +++ if test ! x"$with_[]smr_safe_name" = xno; then +++ +++ # If we got this far, then the user didn't explicitly ask not to use +++ # the library. +++ +++ dnl If the caller of smr_CHECK_LIB specified a header file for this +++ dnl library, then give the user (via "configure --help") an +++ dnl interface to specify where this header file can be found (if it +++ dnl isn't found by the compiler by default). +++ ifelse(smr_header, , , [smr_ARG_WITHINCLUDES(smr_name, smr_header, smr_extra_flags)]) +++ +++ # We need only look for the library if the header has been found +++ # (or no header is needed). +++ if test [$]smr_have_[]smr_safe_name[]_header != no; then +++ +++ AC_CHECK_LIB(smr_libname, +++ smr_function, +++ smr_have_[]smr_safe_name[]_library=yes, +++ smr_have_[]smr_safe_name[]_library=no, +++ [$]smr_safe_name[]_CFLAGS [smr_extra_flags] [$]smr_safe_name[]_LIBS [smr_extra_libs], +++ [ifelse(smr_prototype, , , [[#]include <smr_header>])], +++ smr_prototype) +++ fi +++ +++ if test x"[$]smr_have_[]smr_safe_name[]_library" = xyes; then +++ AC_MSG_RESULT([using smr_name library]) +++ else +++ smr_safe_name[]_LIBS= +++ smr_safe_name[]_CFLAGS= +++ +++ if test x"$with_[]smr_safe_name" = xmaybe; then +++ AC_MSG_RESULT([not using smr_name library]) +++ else +++ AC_MSG_WARN([requested smr_name library not found!]) +++ fi +++ fi +++ fi +++ +++ popdef([smr_name]) +++ popdef([smr_libname]) +++ popdef([smr_help_string]) +++ popdef([smr_function]) +++ popdef([smr_header]) +++ popdef([smr_extra_libs]) +++ popdef([smr_extra_flags]) +++ popdef([smr_prototype]) +++ popdef([smr_safe_name]) +++]) +--- xpdf-3.02.orig/debian/patches-obselete/05_gmem.dpatch ++++ xpdf-3.02/debian/patches-obselete/05_gmem.dpatch +@@ -0,0 +1,97 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 05_gmem.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: Change all size parameters to size_t (why?) ++ ++@DPATCH@ ++diff -urNad --exclude=CVS --exclude=.svn ./goo/gmem.c /tmp/dpep-work.0qyf6L/xpdf-3.01/goo/gmem.c ++--- ./goo/gmem.c 2005-08-19 19:02:18.000000000 +1000 +++++ /tmp/dpep-work.0qyf6L/xpdf-3.01/goo/gmem.c 2005-08-19 19:05:34.000000000 +1000 ++@@ -54,9 +54,9 @@ ++ ++ #endif /* DEBUG_MEM */ ++ ++-void *gmalloc(int size) { +++void *gmalloc(size_t size) { ++ #ifdef DEBUG_MEM ++- int size1; +++ size_t size1; ++ char *mem; ++ GMemHdr *hdr; ++ void *data; ++@@ -96,11 +96,11 @@ ++ #endif ++ } ++ ++-void *grealloc(void *p, int size) { +++void *grealloc(void *p, size_t size) { ++ #ifdef DEBUG_MEM ++ GMemHdr *hdr; ++ void *q; ++- int oldSize; +++ size_t oldSize; ++ ++ if (size == 0) { ++ if (p) ++@@ -137,8 +137,8 @@ ++ #endif ++ } ++ ++-void *gmallocn(int nObjs, int objSize) { ++- int n; +++void *gmallocn(int nObjs, size_t objSize) { +++ size_t n; ++ ++ n = nObjs * objSize; ++ if (objSize == 0 || n / objSize != nObjs) { ++@@ -148,8 +148,8 @@ ++ return gmalloc(n); ++ } ++ ++-void *greallocn(void *p, int nObjs, int objSize) { ++- int n; +++void *greallocn(void *p, int nObjs, size_t objSize) { +++ size_t n; ++ ++ n = nObjs * objSize; ++ if (objSize == 0 || n / objSize != nObjs) { ++@@ -161,7 +161,7 @@ ++ ++ void gfree(void *p) { ++ #ifdef DEBUG_MEM ++- int size; +++ size_t size; ++ GMemHdr *hdr; ++ GMemHdr *prevHdr, *q; ++ int lst; ++diff -urNad --exclude=CVS --exclude=.svn ./goo/gmem.h /tmp/dpep-work.0qyf6L/xpdf-3.01/goo/gmem.h ++--- ./goo/gmem.h 2005-08-19 19:02:18.000000000 +1000 +++++ /tmp/dpep-work.0qyf6L/xpdf-3.01/goo/gmem.h 2005-08-19 19:04:24.000000000 +1000 ++@@ -19,13 +19,13 @@ ++ * Same as malloc, but prints error message and exits if malloc() ++ * returns NULL. ++ */ ++-extern void *gmalloc(int size); +++extern void *gmalloc(size_t size); ++ ++ /* ++ * Same as realloc, but prints error message and exits if realloc() ++ * returns NULL. If <p> is NULL, calls malloc instead of realloc(). ++ */ ++-extern void *grealloc(void *p, int size); +++extern void *grealloc(void *p, size_t size); ++ ++ /* ++ * These are similar to gmalloc and grealloc, but take an object count ++@@ -33,8 +33,8 @@ ++ * bytes, but there is an additional error check that the total size ++ * doesn't overflow an int. ++ */ ++-extern void *gmallocn(int nObjs, int objSize); ++-extern void *greallocn(void *p, int nObjs, int objSize); +++extern void *gmallocn(int nObjs, size_t objSize); +++extern void *greallocn(void *p, int nObjs, size_t objSize); ++ ++ /* ++ * Same as free, but checks for and ignores NULL pointers. +--- xpdf-3.02.orig/debian/patches-obselete/00list ++++ xpdf-3.02/debian/patches-obselete/00list +@@ -0,0 +1,10 @@ ++# Security fixes: ++04_freetype-glyph.dpatch ++05_gmem.dpatch ++06_splashpath.dpatch ++07_decrypt.dpatch ++08_core_action.dpatch ++23_security3.dpatch ++# Fix for full screen handling (bug#247602) ++31_fullscreen.patch ++32_vscroll.patch +--- xpdf-3.02.orig/debian/patches-obselete/31_fullscreen.dpatch ++++ xpdf-3.02/debian/patches-obselete/31_fullscreen.dpatch +@@ -0,0 +1,45 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 31_fullscreen.dpatch by Junichi Uekawa <dancer@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: NETWM support, rediff of 247602 by Eugeniy Meshcheryakov <eugen@univ.kiev.ua> ++ ++@DPATCH@ ++diff -urNad xpdf-3.01~/xpdf/XPDFViewer.cc xpdf-3.01/xpdf/XPDFViewer.cc ++--- xpdf-3.01~/xpdf/XPDFViewer.cc 2006-07-12 23:58:06.000000000 +0900 +++++ xpdf-3.01/xpdf/XPDFViewer.cc 2006-07-12 23:59:42.000000000 +0900 ++@@ -1049,6 +1049,9 @@ ++ #endif ++ int depth; ++ Pixel fg, bg, arm; +++ Atom wmStateAtom; +++ Atom wmStateFullscreenAtom; +++ XClientMessageEvent event; ++ ++ // show the window ++ XtPopup(win, XtGrabNone); ++@@ -1240,6 +1243,24 @@ ++ about_height, ++ fg, arm, depth), ++ NULL); +++ if (app->getFullScreen()) { +++ XtUnmanageChild(toolBar); +++ wmStateAtom = XInternAtom(display, "_NET_WM_STATE", False); +++ wmStateFullscreenAtom = XInternAtom(display, "_NET_WM_STATE_FULLSCREEN", False); +++ event.type = ClientMessage; +++ event.serial = 0; +++ event.send_event = True; +++ event.window = XtWindow(win); +++ event.message_type = wmStateAtom; +++ event.format = 32; +++ event.data.l[0] = 1; /* _NET_WM_STATE_ADD */ +++ event.data.l[1] = wmStateFullscreenAtom; +++ event.data.l[2] = 0; +++ event.data.l[3] = 0; +++ event.data.l[4] = 0; +++ XSendEvent(display, RootWindow(display, screenNum), False, +++ SubstructureRedirectMask | SubstructureNotifyMask, (XEvent *)&event); +++ } ++ } ++ ++ void XPDFViewer::closeWindow() { +--- xpdf-3.02.orig/debian/patches-obselete/08_core_action.dpatch ++++ xpdf-3.02/debian/patches-obselete/08_core_action.dpatch +@@ -0,0 +1,20 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 08_core_action.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: No description. ++ ++@DPATCH@ ++diff -urNad --exclude=CVS --exclude=.svn ./xpdf/XPDFCore.cc /tmp/dpep-work.ujprcX/xpdf-3.01/xpdf/XPDFCore.cc ++--- ./xpdf/XPDFCore.cc 2005-08-19 18:27:53.000000000 +1000 +++++ /tmp/dpep-work.ujprcX/xpdf-3.01/xpdf/XPDFCore.cc 2005-08-19 18:52:50.000000000 +1000 ++@@ -452,6 +452,9 @@ ++ GString *msg; ++ int i; ++ +++ if (action == 0) +++ return; +++ ++ switch (kind = action->getKind()) { ++ ++ // GoTo / GoToR action +--- xpdf-3.02.orig/debian/patches-obselete/32_vscroll.dpatch ++++ xpdf-3.02/debian/patches-obselete/32_vscroll.dpatch +@@ -0,0 +1,98 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 32_vscroll.dpatch by Junichi Uekawa <dancer@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: remove scrollbar patch, updated from 247602 by Eugeniy Meshcheryakov <eugen@univ.kiev.ua> ++ ++@DPATCH@ ++diff -urNad xpdf-3.01~/xpdf/XPDFCore.cc xpdf-3.01/xpdf/XPDFCore.cc ++--- xpdf-3.01~/xpdf/XPDFCore.cc 2006-07-13 00:06:46.000000000 +0900 +++++ xpdf-3.01/xpdf/XPDFCore.cc 2006-07-13 00:08:17.000000000 +0900 ++@@ -881,39 +881,40 @@ ++ XtSetArg(args[n], XmNvisualPolicy, XmVARIABLE); ++n; ++ scrolledWin = XmCreateScrolledWindow(parentWidget, "scroll", args, n); ++ XtManageChild(scrolledWin); ++- n = 0; ++- XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; ++- XtSetArg(args[n], XmNminimum, 0); ++n; ++- XtSetArg(args[n], XmNmaximum, 1); ++n; ++- XtSetArg(args[n], XmNsliderSize, 1); ++n; ++- XtSetArg(args[n], XmNvalue, 0); ++n; ++- XtSetArg(args[n], XmNincrement, 1); ++n; ++- XtSetArg(args[n], XmNpageIncrement, 1); ++n; ++- hScrollBar = XmCreateScrollBar(scrolledWin, "hScrollBar", args, n); ++- XtManageChild(hScrollBar); ++- XtAddCallback(hScrollBar, XmNvalueChangedCallback, ++- &hScrollChangeCbk, (XtPointer)this); +++ if (!fullScreen) { +++ n = 0; +++ XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n; +++ XtSetArg(args[n], XmNminimum, 0); ++n; +++ XtSetArg(args[n], XmNmaximum, 1); ++n; +++ XtSetArg(args[n], XmNsliderSize, 1); ++n; +++ XtSetArg(args[n], XmNvalue, 0); ++n; +++ XtSetArg(args[n], XmNincrement, 1); ++n; +++ XtSetArg(args[n], XmNpageIncrement, 1); ++n; +++ hScrollBar = XmCreateScrollBar(scrolledWin, "hScrollBar", args, n); +++ XtManageChild(hScrollBar); +++ XtAddCallback(hScrollBar, XmNvalueChangedCallback, +++ &hScrollChangeCbk, (XtPointer)this); ++ #ifndef DISABLE_SMOOTH_SCROLL ++- XtAddCallback(hScrollBar, XmNdragCallback, ++- &hScrollDragCbk, (XtPointer)this); +++ XtAddCallback(hScrollBar, XmNdragCallback, +++ &hScrollDragCbk, (XtPointer)this); ++ #endif ++- n = 0; ++- XtSetArg(args[n], XmNorientation, XmVERTICAL); ++n; ++- XtSetArg(args[n], XmNminimum, 0); ++n; ++- XtSetArg(args[n], XmNmaximum, 1); ++n; ++- XtSetArg(args[n], XmNsliderSize, 1); ++n; ++- XtSetArg(args[n], XmNvalue, 0); ++n; ++- XtSetArg(args[n], XmNincrement, 1); ++n; ++- XtSetArg(args[n], XmNpageIncrement, 1); ++n; ++- vScrollBar = XmCreateScrollBar(scrolledWin, "vScrollBar", args, n); ++- XtManageChild(vScrollBar); ++- XtAddCallback(vScrollBar, XmNvalueChangedCallback, ++- &vScrollChangeCbk, (XtPointer)this); +++ n = 0; +++ XtSetArg(args[n], XmNorientation, XmVERTICAL); ++n; +++ XtSetArg(args[n], XmNminimum, 0); ++n; +++ XtSetArg(args[n], XmNmaximum, 1); ++n; +++ XtSetArg(args[n], XmNsliderSize, 1); ++n; +++ XtSetArg(args[n], XmNvalue, 0); ++n; +++ XtSetArg(args[n], XmNincrement, 1); ++n; +++ XtSetArg(args[n], XmNpageIncrement, 1); ++n; +++ vScrollBar = XmCreateScrollBar(scrolledWin, "vScrollBar", args, n); +++ XtManageChild(vScrollBar); +++ XtAddCallback(vScrollBar, XmNvalueChangedCallback, +++ &vScrollChangeCbk, (XtPointer)this); ++ #ifndef DISABLE_SMOOTH_SCROLL ++- XtAddCallback(vScrollBar, XmNdragCallback, ++- &vScrollDragCbk, (XtPointer)this); +++ XtAddCallback(vScrollBar, XmNdragCallback, +++ &vScrollDragCbk, (XtPointer)this); ++ #endif ++- +++ } ++ // create the drawing area ++ n = 0; ++ XtSetArg(args[n], XmNshadowType, XmSHADOW_IN); ++n; ++@@ -1459,7 +1460,7 @@ ++ XtSetArg(args[n], XmNsliderSize, drawAreaWidth); ++n; ++ XtSetArg(args[n], XmNincrement, 16); ++n; ++ XtSetArg(args[n], XmNpageIncrement, drawAreaWidth); ++n; ++- XtSetValues(hScrollBar, args, n); +++ if (hScrollBar) XtSetValues(hScrollBar, args, n); ++ ++ if (pages->getLength() > 0) { ++ if (continuousMode) { ++@@ -1479,7 +1480,7 @@ ++ XtSetArg(args[n], XmNsliderSize, drawAreaHeight); ++n; ++ XtSetArg(args[n], XmNincrement, 16); ++n; ++ XtSetArg(args[n], XmNpageIncrement, drawAreaHeight); ++n; ++- XtSetValues(vScrollBar, args, n); +++ if (vScrollBar) XtSetValues(vScrollBar, args, n); ++ } ++ ++ void XPDFCore::setCursor(Cursor cursor) { +--- xpdf-3.02.orig/debian/patches-obselete/23_security3.dpatch ++++ xpdf-3.02/debian/patches-obselete/23_security3.dpatch +@@ -0,0 +1,45 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 23_security3.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: Red Hat-supplied patch for CAN-2006-0301 ++ ++@DPATCH@ ++diff -urNad xpdf-3.01~/splash/Splash.cc xpdf-3.01/splash/Splash.cc ++--- xpdf-3.01~/splash/Splash.cc 2006-02-01 20:41:14.000000000 +1100 +++++ xpdf-3.01/splash/Splash.cc 2006-02-01 20:41:41.000000000 +1100 ++@@ -931,6 +931,10 @@ ++ int alpha2, ialpha2; ++ Guchar t; ++ +++ if ( (unsigned) x >= (unsigned) bitmap->getWidth() || +++ (unsigned) y >= (unsigned) bitmap->getHeight()) +++ return; +++ ++ if (noClip || state->clip->test(x, y)) { ++ if (alpha != 1 || softMask || state->blendFunc) { ++ blendFunc = state->blendFunc ? state->blendFunc : &blendNormal; ++@@ -1198,6 +1202,11 @@ ++ updateModY(y); ++ } ++ +++ if ((unsigned) x0 >= (unsigned) bitmap->getWidth() || +++ (unsigned) x1 >= (unsigned) bitmap->getWidth() || +++ (unsigned) y >= (unsigned) bitmap->getHeight()) +++ return; +++ ++ if (alpha != 1 || softMask || state->blendFunc) { ++ blendFunc = state->blendFunc ? state->blendFunc : &blendNormal; ++ if (softMask) { ++@@ -1828,6 +1837,11 @@ ++ updateModY(y); ++ } ++ +++ if ((unsigned) x0 >= (unsigned) bitmap->getWidth() || +++ (unsigned) x1 >= (unsigned) bitmap->getWidth() || +++ (unsigned) y >= (unsigned) bitmap->getHeight()) +++ return; +++ ++ switch (bitmap->mode) { ++ case splashModeMono1: ++ p = &bitmap->data[y * bitmap->rowSize + (x0 >> 3)]; +--- xpdf-3.02.orig/debian/patches-obselete/06_splashpath.dpatch ++++ xpdf-3.02/debian/patches-obselete/06_splashpath.dpatch +@@ -0,0 +1,20 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 06_splashpath.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: No description. ++ ++@DPATCH@ ++diff -urNad --exclude=CVS --exclude=.svn ./splash/Splash.cc /tmp/dpep-work.Z6NPbI/xpdf-3.01/splash/Splash.cc ++--- ./splash/Splash.cc 2005-08-17 15:34:30.000000000 +1000 +++++ /tmp/dpep-work.Z6NPbI/xpdf-3.01/splash/Splash.cc 2005-08-19 18:36:11.000000000 +1000 ++@@ -820,6 +820,9 @@ ++ if (path->length == 0) { ++ return splashErrEmptyPath; ++ } +++ if (path->length == 1) { +++ return splashErrBogusPath; +++ } ++ xPath = new SplashXPath(path, state->flatness, gTrue); ++ xPath->sort(); ++ scanner = new SplashXPathScanner(xPath, eo); +--- xpdf-3.02.orig/debian/xpdfrc ++++ xpdf-3.02/debian/xpdfrc +@@ -0,0 +1,96 @@ ++#======================================================================== ++# ++# System-wide xpdfrc file ++# ++# The Xpdf tools look for a config file in two places: ++# 1. ~/.xpdfrc ++# 2. /etc/xpdf/xpdfrc ++# ++# Note that if ~/.xpdfrc exists, Xpdf will NOT read the system ++# configuration file /etc/xpdf/xpdfrc. You may wish to include it ++# from your ~/.xpdfrc using: ++# include /etc/xpdf/xpdfrc ++# and then add additional settings. ++# ++# For complete details on config file syntax and available options, ++# please see the xpdfrc(5) man page. ++# ++# http://www.foolabs.com/xpdf/ ++# ++#======================================================================== ++ ++#----- display fonts ++ ++# These map the Base-14 fonts to the Type 1 fonts that ship with ++# ghostscript (gsfonts package). ++ ++displayFontT1 Times-Roman /usr/share/fonts/type1/gsfonts/n021003l.pfb ++displayFontT1 Times-Italic /usr/share/fonts/type1/gsfonts/n021023l.pfb ++displayFontT1 Times-Bold /usr/share/fonts/type1/gsfonts/n021004l.pfb ++displayFontT1 Times-BoldItalic /usr/share/fonts/type1/gsfonts/n021024l.pfb ++displayFontT1 Helvetica /usr/share/fonts/type1/gsfonts/n019003l.pfb ++displayFontT1 Helvetica-Oblique /usr/share/fonts/type1/gsfonts/n019023l.pfb ++displayFontT1 Helvetica-Bold /usr/share/fonts/type1/gsfonts/n019004l.pfb ++displayFontT1 Helvetica-BoldOblique /usr/share/fonts/type1/gsfonts/n019024l.pfb ++displayFontT1 Courier /usr/share/fonts/type1/gsfonts/n022003l.pfb ++displayFontT1 Courier-Oblique /usr/share/fonts/type1/gsfonts/n022023l.pfb ++displayFontT1 Courier-Bold /usr/share/fonts/type1/gsfonts/n022004l.pfb ++displayFontT1 Courier-BoldOblique /usr/share/fonts/type1/gsfonts/n022024l.pfb ++displayFontT1 Symbol /usr/share/fonts/type1/gsfonts/s050000l.pfb ++displayFontT1 ZapfDingbats /usr/share/fonts/type1/gsfonts/d050000l.pfb ++ ++# If you need to display PDF files that refer to non-embedded fonts, ++# you should add one or more fontDir options to point to the ++# directories containing the font files. Xpdf will only look at .pfa, ++# .pfb, and .ttf files in those directories (other files will simply ++# be ignored). ++ ++#fontDir /usr/local/fonts/bakoma ++ ++#----- PostScript output control ++ ++# Set the default PostScript file or command. ++ ++psFile "|lpr" ++ ++# Set the default PostScript paper size -- this can be letter, legal, ++# A4, or A3. You can also specify a paper size as width and height ++# (in points). Xpdf uses the paper size in /etc/papersize by default. ++ ++#psPaperSize letter ++ ++#----- text output control ++ ++# Choose a text encoding for copy-and-paste and for pdftotext output. ++# The Latin1, ASCII7, and UTF-8 encodings are built into Xpdf. Other ++# encodings are available in the language support packages. ++ ++#textEncoding UTF-8 ++ ++# Choose the end-of-line convention for multi-line copy-and-past and ++# for pdftotext output. The available options are unix, mac, and dos. ++ ++#textEOL unix ++ ++#----- misc settings ++ ++# Enable Type 1 font rasterizing with t1lib. Default "yes". ++ ++#enableT1lib no ++ ++# Enable TrueType and Type 1 font rasterizing with FreeType. Default "yes". ++ ++#enableFreeType no ++ ++# Enable anti-aliasing of fonts. Default "yes". ++ ++#antialias no ++ ++# Set the command used to run a web browser when a URL hyperlink is ++# clicked. ++ ++urlCommand "sensible-browser '%s'" ++ ++# Include the language configuration file list generated by update-xpdfrc ++include /etc/xpdf/includes ++ +--- xpdf-3.02.orig/debian/xpdf-common.postinst ++++ xpdf-3.02/debian/xpdf-common.postinst +@@ -0,0 +1,20 @@ ++#!/bin/sh ++set -e ++ ++if [ "$1" = "configure" ]; then ++ /usr/sbin/update-xpdfrc ++fi ++ ++# Remove old /etc/xpdfrc if present ++rm -f /etc/xpdfrc ++ ++# Move accidental /etc/xpdf/xpdf-* language files ++# to their proper names (bug in 2.01-1) ++for i in cyrillic greek hebrew latin2 thai turkish; do ++ if [ -e /etc/xpdf/xpdf-$i ]; then ++ mv /etc/xpdf/xpdf-$i /etc/xpdf/xpdfrc-$i ++ fi ++done ++ ++#DEBHELPER# ++ +--- xpdf-3.02.orig/debian/control ++++ xpdf-3.02/debian/control +@@ -0,0 +1,75 @@ ++Source: xpdf ++Section: text ++Priority: optional ++Maintainer: Hamish Moffatt <hamish@debian.org> ++Standards-Version: 3.7.2 ++Build-Depends: libt1-dev (>= 5.0.2-3), libxext-dev, libxp-dev, libxt-dev, libxpm-dev, libx11-dev, lesstif2-dev | libmotif-dev, x-dev, debhelper (>= 4.2.21), libfreetype6-dev (>= 2.1.2-1), libpaper-dev | libpaperg-dev, pkg-config, dpatch, automake1.9, autoconf ++Build-Conflicts: libttf-dev, libstroke0-dev, autoconf2.13 ++ ++Package: xpdf ++Architecture: all ++Depends: xpdf-reader, xpdf-utils, xpdf-common ++Conflicts: xpdf-i (<= 0.90-8) ++Replaces: xpdf-i (<= 0.90-8) ++Description: Portable Document Format (PDF) suite ++ xpdf is a suite of tools for Portable Document Format (PDF) files. (These are ++ sometimes called 'Acrobat' files after the name of Adobe's PDF software.) ++ . ++ The tools include xpdf, a PDF viewer (in the package xpdf-reader), ++ and PDF converters (including to/from PostScript) (in the package ++ xpdf-utils). ++ . ++ This package is intended for compatibility with previous versions of ++ this package only. You can safely remove it from your system. ++ ++Package: xpdf-common ++Architecture: all ++Conflicts: xpdf (<= 0.93-6), xpdf-cyrillic, xpdf-greek, xpdf-hebrew, xpdf-latin2, xpdf-thai, xpdf-turkish ++Replaces: xpdf-cyrillic, xpdf-greek, xpdf-hebrew, xpdf-latin2, xpdf-thai, xpdf-turkish ++Suggests: xpdf-reader | xpdf-utils ++Recommends: gsfonts-x11 ++Description: Portable Document Format (PDF) suite -- common files ++ xpdf is a suite of tools for Portable Document Format (PDF) files. (These are ++ sometimes called 'Acrobat' files after the name of Adobe's PDF software.) ++ . ++ This package contains common files needed by the other xpdf packages. ++ ++Package: xpdf-reader ++Architecture: any ++Depends: ${shlibs:Depends}, gsfonts (>= 6.0-1), xpdf-common (>= ${source:Version}), xpdf-common (<< ${source:Version}.1~) ++Provides: pdf-viewer, postscript-preview ++Conflicts: xpdf-i (<= 0.90-8), xpdf (<= 0.93-6) ++Suggests: www-browser ++Description: Portable Document Format (PDF) suite -- viewer for X11 ++ xpdf is a suite of tools for Portable Document Format (PDF) files. (These are ++ sometimes called 'Acrobat' files after the name of Adobe's PDF software.) ++ . ++ This package contains xpdf itself, a PDF viewer for X11. ++ xpdf is designed to be small and efficient. xpdf supports encrypted ++ PDF files. Standard X fonts, Truetype fonts and Type 1 fonts are supported. ++ . ++ This package also contains pdftoppm, a utility for converting ++ PDF files to PBM, PGM and PPM formats. ++ . ++ See also the xpdf-utils package for conversion utilities and the ++ other xpdf-* packages for additional language support. ++ ++Package: xpdf-utils ++Architecture: any ++Depends: ${shlibs:Depends}, gsfonts (>= 6.0-1), xpdf-common (>= ${source:Version}), xpdf-common (<< ${source:Version}.1~) ++Provides: pdf-viewer, postscript-preview, poppler-utils ++Conflicts: xpdf-i (<= 0.90-8), xpdf (<= 0.93-6), poppler-utils ++Replaces: poppler-utils ++Suggests: pdftk ++Description: Portable Document Format (PDF) suite -- utilities ++ xpdf is a suite of tools for Portable Document Format (PDF) files. (These are ++ sometimes called 'Acrobat' files after the name of Adobe's PDF software.) ++ . ++ This package contains pdftops (PDF to PostScript converter), ++ pdfinfo (PDF document information extractor), pdfimages ++ (PDF image extractor), pdftotext (PDF to text converter), and ++ pdffonts (PDF font analyzer). ++ . ++ To view PDF files, see the xpdf-reader package. That package ++ also contains pdftoppm (PDF to Portable Bitmap converter). ++ +--- xpdf-3.02.orig/debian/xpdf-reader.mime ++++ xpdf-3.02/debian/xpdf-reader.mime +@@ -0,0 +1,2 @@ ++application/pdf; /usr/bin/xpdf %s; test=test "$DISPLAY" != ""; description=Portable Document Format; nametemplate=%s.pdf; priority=6 ++application/x-pdf; /usr/bin/xpdf %s; test=test "$DISPLAY" != ""; description=Portable Document Format; nametemplate=%s.pdf; priority=6 +--- xpdf-3.02.orig/debian/xpdf-common.dirs ++++ xpdf-3.02/debian/xpdf-common.dirs +@@ -0,0 +1,7 @@ ++usr/share/doc/xpdf-common ++usr/share/doc/xpdf-common/examples ++usr/share/man/man5 ++usr/share/man/man8 ++usr/share/xpdf ++usr/sbin ++etc/xpdf +--- xpdf-3.02.orig/debian/update-xpdfrc ++++ xpdf-3.02/debian/update-xpdfrc +@@ -0,0 +1,22 @@ ++#!/bin/sh ++set -e ++ ++TARGET=/etc/xpdf/includes ++ ++# Generate /etc/xpdf/includes from /etc/xpdf/* ++# This allows the xpdf-* language add-on packages ++# to supply configuration file snippets. ++ ++echo \# DO NOT EDIT THIS FILE DIRECTLY. >> $TARGET ++echo \# This file was automatically generated by /usr/sbin/update-xpdfrc. > $TARGET ++echo \# Instead, add or remove files in /etc/xpdf/ then run >> $TARGET ++echo \# /usr/sbin/update-xpdfrc to regenerate this file. >> $TARGET ++echo >> $TARGET ++ ++find /etc/xpdf \ ++ -name xpdfrc-\* \ ++ -and -not -name \*.dpkg\* \ ++ -and -not -name \*~ \ ++ -and -not -name \*,v \ ++ -printf "include %p\n" >> $TARGET ++ +--- xpdf-3.02.orig/debian/xpdf-reader.files ++++ xpdf-3.02/debian/xpdf-reader.files +@@ -0,0 +1,4 @@ ++usr/share/man/man1/pdftoppm.1 ++usr/share/man/man1/xpdf.1 ++usr/bin/xpdf ++usr/bin/pdftoppm +--- xpdf-3.02.orig/debian/update-xpdfrc.8 ++++ xpdf-3.02/debian/update-xpdfrc.8 +@@ -0,0 +1,46 @@ ++.\" Please adjust this date whenever revising the manpage. ++.\" ++.\" Some roff macros, for reference: ++.\" .nh disable hyphenation ++.\" .hy enable hyphenation ++.\" .ad l left justify ++.\" .ad b justify to both left and right margins ++.\" .nf disable filling ++.\" .fi enable filling ++.\" .br insert line break ++.\" .sp <n> insert n+1 empty lines ++.\" for manpage-specific macros, see man(7) ++.TH "update-xpdfrc" "8" "October 22, 2002" "Hamish Moffatt" ++.SH "NAME" ++update\-xpdfrc \- program to generate xpdf's configuration file ++.SH "SYNOPSIS" ++.B update\-xdfrc ++.SH "DESCRIPTION" ++.B \fBupdate\-xpdfrc\fR ++is a program used to generate part of the \fIxpdfrc(5)\fR file used ++by xpdf. The generated configuration file contains a list of the ++configuration snippets provided by the xpdf-* language packages. ++ ++You may edit the file \fI/etc/xpdfrc\fR to configure xpdf. ++However, do not edit the generated file \fI/etc/xpdf/includes\fR. ++It is updated whenever a language package is added or removed. ++You must include the file /etc/xpdf/includes in your xpdfrc ++to make use of this functionality. ++ ++The language support packages (xpdf-japanese etc) provide additional ++configuration files such as \fI/etc/xpdf/xpdfrc-japanese\fR, which will be ++listed in the generated \fI/etc/xpdf/includes\fR. ++ ++.SH "FILES" ++.nf ++.ta \w'/etc/xpdf/xpdfrc\-* 'u ++/etc/xpdf/xpdfrc main configuration file ++.br ++/etc/xpdf/xpdf\-* additional configuration files ++.SH "SEE ALSO" ++.BR xpdfrc (5), ++.BR xpdf (1). ++.SH "AUTHOR" ++This manual page and the update-xpdfrc utility was written by Hamish Moffatt <hamish@debian.org> ++for the Debian GNU/Linux system (but may be used by others). ++.\" vim:syn=nroff +--- xpdf-3.02.orig/debian/xpdf.postinst ++++ xpdf-3.02/debian/xpdf.postinst +@@ -0,0 +1,18 @@ ++#!/bin/sh ++set -e ++ ++# Attempt to remove the /usr/share/doc/xpdf directory. ++# If it exists. dpkg won't replace it with the symbolic ++# link. ++ ++if [ "$1" = "configure" ]; then ++ ++ if [ -d /usr/share/doc/xpdf ]; then ++ rm -rf /usr/share/doc/xpdf ++ ln -sf xpdf-common /usr/share/doc/xpdf ++ fi ++ ++fi ++ ++#DEBHELPER# ++ +--- xpdf-3.02.orig/debian/xpdf-utils.dirs ++++ xpdf-3.02/debian/xpdf-utils.dirs +@@ -0,0 +1,3 @@ ++usr/share/doc ++usr/share/man/man1 ++usr/bin +--- xpdf-3.02.orig/debian/compat ++++ xpdf-3.02/debian/compat +@@ -0,0 +1 @@ ++4 +--- xpdf-3.02.orig/debian/lang/etc/xpdf/xpdfrc-cyrillic ++++ xpdf-3.02/debian/lang/etc/xpdf/xpdfrc-cyrillic +@@ -0,0 +1,4 @@ ++#----- begin Cyrillic support package (2003-jun-28) ++nameToUnicode /usr/share/xpdf/cyrillic/Bulgarian.nameToUnicode ++unicodeMap KOI8-R /usr/share/xpdf/cyrillic/KOI8-R.unicodeMap ++#----- end Cyrillic support package +--- xpdf-3.02.orig/debian/lang/etc/xpdf/xpdfrc-hebrew ++++ xpdf-3.02/debian/lang/etc/xpdf/xpdfrc-hebrew +@@ -0,0 +1,4 @@ ++#----- begin Hebrew support package (2003-feb-16) ++unicodeMap ISO-8859-8 /usr/share/xpdf/hebrew/ISO-8859-8.unicodeMap ++unicodeMap Windows-1255 /usr/share/xpdf/hebrew/Windows-1255.unicodeMap ++#----- end Hebrew support package +--- xpdf-3.02.orig/debian/lang/etc/xpdf/xpdfrc-latin2 ++++ xpdf-3.02/debian/lang/etc/xpdf/xpdfrc-latin2 +@@ -0,0 +1,3 @@ ++#----- begin Latin2 support package (2002-oct-22) ++unicodeMap Latin2 /usr/share/xpdf/latin2/Latin2.unicodeMap ++#----- end Latin2 support package +--- xpdf-3.02.orig/debian/lang/etc/xpdf/xpdfrc-turkish ++++ xpdf-3.02/debian/lang/etc/xpdf/xpdfrc-turkish +@@ -0,0 +1,3 @@ ++#----- begin Turkish support package (2002-apr-10) ++unicodeMap ISO-8859-9 /usr/share/xpdf/turkish/ISO-8859-9.unicodeMap ++#----- end Turkish support package +--- xpdf-3.02.orig/debian/lang/etc/xpdf/xpdfrc-greek ++++ xpdf-3.02/debian/lang/etc/xpdf/xpdfrc-greek +@@ -0,0 +1,4 @@ ++#----- begin Greek support package (2002-feb-13) ++nameToUnicode /usr/share/xpdf/greek/Greek.nameToUnicode ++unicodeMap ISO-8859-7 /usr/share/xpdf/greek/ISO-8859-7.unicodeMap ++#----- end Greek support package +--- xpdf-3.02.orig/debian/lang/etc/xpdf/xpdfrc-arabic ++++ xpdf-3.02/debian/lang/etc/xpdf/xpdfrc-arabic +@@ -0,0 +1,3 @@ ++#----- begin Arabic support package (2003-feb-16) ++unicodeMap ISO-8859-6 /usr/share/xpdf/arabic/ISO-8859-6.unicodeMap ++#----- end Arabic support package +--- xpdf-3.02.orig/debian/lang/etc/xpdf/xpdfrc-thai ++++ xpdf-3.02/debian/lang/etc/xpdf/xpdfrc-thai +@@ -0,0 +1,4 @@ ++#----- begin Thai support package (2002-jan-16) ++nameToUnicode /usr/share/xpdf/thai/Thai.nameToUnicode ++unicodeMap TIS-620 /usr/share/xpdf/thai/TIS-620.unicodeMap ++#----- end Thai support package +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/hebrew/Windows-1255.unicodeMap ++++ xpdf-3.02/debian/lang/usr/share/xpdf/hebrew/Windows-1255.unicodeMap +@@ -0,0 +1,66 @@ ++000a 000a 0a ++000c 000d 0c ++0020 007e 20 ++00a0 00a3 a0 ++00a5 00a9 a5 ++00ab 00b9 ab ++00bb 00bf bb ++00d7 aa ++00f7 ba ++010c 43 ++010d 63 ++0131 69 ++0141 4c ++0142 6c ++0152 4f45 ++0153 6f65 ++0160 53 ++0161 73 ++0178 59 ++017d 5a ++017e 7a ++0192 83 ++02c6 88 ++02da b0 ++02dc 98 ++05b0 05b9 c0 ++05bb 05c3 cb ++05f0 05f4 d4 ++05d0 05ea e0 ++200e 200f fd ++2013 2014 96 ++2018 2019 91 ++201a 82 ++201c 201d 93 ++201e 84 ++2020 86 ++2021 87 ++2022 95 ++2026 85 ++2030 89 ++2039 8b ++203a 9b ++2044 2f ++20aa a4 ++20ac 80 ++2122 99 ++2212 2d ++f6f9 4c ++f6fa 4f45 ++f6fc b0 ++f6fd 53 ++f6fe 7e ++f6ff 5a ++f721 21 ++f724 24 ++f726 26 ++f730 f739 30 ++f73f 3f ++f761 f77a 41 ++f7a1 f7a2 a1 ++f7bf bf ++fb00 6666 ++fb01 6669 ++fb02 666c ++fb03 666669 ++fb04 66666c +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/hebrew/ISO-8859-8.unicodeMap ++++ xpdf-3.02/debian/lang/usr/share/xpdf/hebrew/ISO-8859-8.unicodeMap +@@ -0,0 +1,63 @@ ++000a 000a 0a ++000c 000d 0c ++0020 007e 20 ++00a0 00a0 20 ++00a2 00a9 a2 ++00ab 00b9 ab ++00bb 00be bb ++010c 43 ++010d 63 ++0131 69 ++0141 4c ++0142 6c ++0152 4f45 ++0153 6f65 ++0160 53 ++0161 73 ++0178 59 ++017d 5a ++017e 7a ++02c6 5e ++02da b0 ++02dc 7e ++05d0 05ea e0 ++05f0 e5e5 ++05f1 e5e9 ++05f2 e9e9 ++2013 ad ++2014 2d2d ++2018 60 ++2019 27 ++201a 2c ++201c 22 ++201d 22 ++201e 2c2c ++2022 b7 ++2026 2e2e2e ++2039 3c ++203a 3e ++2044 2f ++2122 544d ++2212 2d ++f6f9 4c ++f6fa 4f45 ++f6fc b0 ++f6fd 53 ++f6fe 7e ++f6ff 5a ++f721 21 ++f724 24 ++f726 26 ++f730 f739 30 ++f73f 3f ++f761 f77a 41 ++f7a1 f7a2 a1 ++f7bf bf ++f7e0 f7f6 c0 ++f7f8 f7fe d8 ++f7ff 59 ++fb00 6666 ++fb01 6669 ++fb02 666c ++fb03 666669 ++fb04 66666c +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/arabic/ISO-8859-6.unicodeMap ++++ xpdf-3.02/debian/lang/usr/share/xpdf/arabic/ISO-8859-6.unicodeMap +@@ -0,0 +1,40 @@ ++000a 000a 0a ++000c 000d 0c ++0020 007e 20 ++00a0 00a0 20 ++00a4 a4 ++00ad ad ++02c6 5e ++02dc 7e ++060c 060c ac ++061b 061b bb ++061f 061f bf ++0621 063a c1 ++0640 0652 e0 ++2013 2013 ad ++2014 2014 2d2d ++2018 2018 60 ++2019 2019 27 ++201a 201a 2c ++201c 201c 22 ++201d 201d 22 ++201e 201e 2c2c ++2026 2026 2e2e2e ++2039 2039 3c ++203a 203a 3e ++2044 2044 2f ++2122 2122 544d ++2212 2212 2d ++f6f9 f6f9 4c ++f6fe f6fe 7e ++f721 f721 21 ++f724 f724 24 ++f726 f726 26 ++f730 f739 30 ++f73f f73f 3f ++f761 f77a 41 ++fb00 fb00 6666 ++fb01 fb01 6669 ++fb02 fb02 666c ++fb03 fb03 666669 ++fb04 fb04 66666c +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/thai/Thai.nameToUnicode ++++ xpdf-3.02/debian/lang/usr/share/xpdf/thai/Thai.nameToUnicode +@@ -0,0 +1,116 @@ ++0e01 ThaiCharacterKoKai ++0e02 ThaiCharacterKhoKhai ++0e03 ThaiCharacterKhoKhuat ++0e04 ThaiCharacterKhoKhwai ++0e05 ThaiCharacterKhoKhon ++0e06 ThaiCharacterKhoRakhang ++0e07 ThaiCharacterNgoNgu ++0e08 ThaiCharacterChoChan ++0e09 ThaiCharacterChoChing ++0e0a ThaiCharacterChoChang ++0e0b ThaiCharacterSoSo ++0e0c ThaiCharacterChoChoe ++0e0d ThaiCharacterYoYing ++0e0e ThaiCharacterDoChada ++0e0f ThaiCharacterToPatak ++0e10 ThaiCharacterThoThan ++0e11 ThaiCharacterThoNangmontho ++0e12 ThaiCharacterThoPhuthao ++0e13 ThaiCharacterNoNen ++0e14 ThaiCharacterDoDek ++0e15 ThaiCharacterToTao ++0e16 ThaiCharacterThoThung ++0e17 ThaiCharacterThoThahan ++0e18 ThaiCharacterThoThong ++0e19 ThaiCharacterNoNu ++0e1a ThaiCharacterBoBaimai ++0e1b ThaiCharacterPoPla ++0e1c ThaiCharacterPhoPhung ++0e1d ThaiCharacterFoFa ++0e1e ThaiCharacterPhoPhan ++0e1f ThaiCharacterFoFan ++0e20 ThaiCharacterPhoSamphao ++0e21 ThaiCharacterMoMa ++0e22 ThaiCharacterYoYak ++0e23 ThaiCharacterRoRua ++0e24 ThaiCharacterRu ++0e25 ThaiCharacterLoLing ++0e26 ThaiCharacterLu ++0e27 ThaiCharacterWoWaen ++0e28 ThaiCharacterSoSala ++0e29 ThaiCharacterSoRusi ++0e2a ThaiCharacterSoSua ++0e2b ThaiCharacterHoHip ++0e2c ThaiCharacterLoChula ++0e2d ThaiCharacterOAng ++0e2e ThaiCharacterHoNokhuk ++0e2f ThaiCharacterPaiyannoi ++0e30 ThaiCharacterSaraA ++0e31 ThaiCharacterMaiHan-akat ++0e32 ThaiCharacterSaraAa ++0e33 ThaiCharacterSaraAm ++0e34 ThaiCharacterSaraI ++0e35 ThaiCharacterSaraIi ++0e36 ThaiCharacterSaraUe ++0e37 ThaiCharacterSaraUee ++0e38 ThaiCharacterSaraU ++0e39 ThaiCharacterSaraUu ++0e3a ThaiCharacterPhinthu ++0e3f ThaiCurrencySymbolBaht ++0e40 ThaiCharacterSaraE ++0e41 ThaiCharacterSaraAe ++0e42 ThaiCharacterSaraO ++0e43 ThaiCharacterSaraAiMaimuan ++0e44 ThaiCharacterSaraAiMaimalai ++0e45 ThaiCharacterLakkhangyao ++0e46 ThaiCharacterMaiyamok ++0e47 ThaiCharacterMaitaikhu ++0e48 ThaiCharacterMaiEk ++0e49 ThaiCharacterMaiTho ++0e4a ThaiCharacterMaiTri ++0e4b ThaiCharacterMaiChattawa ++0e4c ThaiCharacterThanthakhat ++0e4d ThaiCharacterNikhahit ++0e4e ThaiCharacterYamakkan ++0e4f ThaiCharacterFongman ++0e50 ThaiDigitZero ++0e51 ThaiDigitOne ++0e52 ThaiDigitTwo ++0e53 ThaiDigitThree ++0e54 ThaiDigitFour ++0e55 ThaiDigitFive ++0e56 ThaiDigitSix ++0e57 ThaiDigitSeven ++0e58 ThaiDigitEight ++0e59 ThaiDigitNine ++0e5a ThaiCharacterAngkhankhu ++0e5b ThaiCharacterKhomut ++0e4c ThaiCharacterThanthakhatLowLeft ++0e49 ThaiCharacterMaiThoLeft ++0e38 ThaiCharacterSaraULow ++0e31 ThaiCharacterMaiHanAkat ++0e4b ThaiCharacterMaiChattawaLeft ++0e37 ThaiCharacterSaraUeeLeft ++0e4a ThaiCharacterMaiTriLeft ++0e3a ThaiCharacterPhinthuLow ++0e48 ThaiCharacterMaiEkLeft ++0e49 ThaiCharacterMaiThoLow ++0e0d ThaiCharacterYoYingDescless ++0e4b ThaiCharacterMaiChattawaLow ++0e4a ThaiCharacterMaiTriLow ++0e48 ThaiCharacterMaiEkLow ++0e31 ThaiCharacterMaiHanAkatLeft ++0e4c ThaiCharacterThanthakhatLeft ++0e34 ThaiCharacterSaraILeft ++0e4d ThaiCharacterNikhahitLeft ++0e3f ThaiCharacterBaht ++0e49 ThaiCharacterMaiThoLowLeft ++0e4b ThaiCharacterMaiChattawaLowLeft ++0e4c ThaiCharacterThanthakhatLow ++0e39 ThaiCharacterSaraUuLow ++0e4a ThaiCharacterMaiTriLowLeft ++0e35 ThaiCharacterSaraIiLeft ++0e48 ThaiCharacterMaiEkLowLeft ++0e47 ThaiCharacterMaitaikhuLeft ++0e10 ThaiCharacterThoThanDescless ++0e36 ThaiCharacterSaraUeLeft +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/thai/TIS-620.unicodeMap ++++ xpdf-3.02/debian/lang/usr/share/xpdf/thai/TIS-620.unicodeMap +@@ -0,0 +1,47 @@ ++000a 0a ++000c 000d 0c ++0020 007e 20 ++00a0 20 ++0131 69 ++0141 4c ++0142 6c ++0152 4f45 ++0153 6f65 ++0160 53 ++0161 73 ++0178 59 ++017d 5a ++017e 7a ++02c6 5e ++02dc 7e ++0e01 0e3a a1 ++0e3f 0e5b df ++2013 2d2d ++2014 2d2d ++2018 60 ++2019 27 ++201a 2c ++201c 22 ++201d 22 ++201e 2c2c ++2022 2a ++2026 2e2e2e ++2039 3c ++203a 3e ++2044 2f ++2122 544d ++2212 2d ++f700 b0 ++f701 f704 d4 ++f705 f709 e8 ++f70a f70e e8 ++f70f ad ++f710 d1 ++f711 ed ++f712 f717 e7 ++f718 f71a d8 ++fb00 6666 ++fb01 6669 ++fb02 666c ++fb03 666669 ++fb04 66666c +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/greek/ISO-8859-7.unicodeMap ++++ xpdf-3.02/debian/lang/usr/share/xpdf/greek/ISO-8859-7.unicodeMap +@@ -0,0 +1,63 @@ ++000a 0a ++000c 000d 0c ++0020 007e 20 ++00a0 a0 ++00a3 a3 ++00a6 00a9 a6 ++00ab 00ad ab ++00b0 00b4 b0 ++00b5 ec ++00b7 b7 ++00bb bb ++00bd bd ++02c6 5e ++02da b0 ++02dc 7e ++0374 b4 ++037e 3b ++0384 038a b4 ++038c bc ++038e 03a1 be ++03a3 03ce d3 ++03d0 e2 ++03d1 e8 ++03d2 d5 ++03d3 be ++03d4 db ++03d5 f6 ++03d6 f0 ++03d7 eae1e9 ++03da d3d4 ++03db f3f4 ++03f0 ea ++03f1 f1 ++03f2 63 ++03f3 6a ++03f4 c8 ++03f5 e5 ++2013 ad ++2014 af ++2018 60 ++2019 a2 ++201a 2c ++201b a1 ++201c 22 ++201d 22 ++201e 2c2c ++2022 b7 ++2026 2e2e2e ++2039 3c ++203a 3e ++2044 2f ++20ac c5f5f1fe ++20af c4f1f7 ++2122 544d ++2126 d9 ++2206 c4 ++2212 2d ++2219 b7 ++fb00 6666 ++fb01 6669 ++fb02 666c ++fb03 666669 ++fb04 66666c +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/greek/Greek.nameToUnicode ++++ xpdf-3.02/debian/lang/usr/share/xpdf/greek/Greek.nameToUnicode +@@ -0,0 +1,11 @@ ++0396 Dzeta ++039e Ksi ++039f Omikron ++03a7 Khi ++03b2 betatwo ++03b6 dzeta ++03be ksi ++03bf omikron ++03c3 sigmafinal ++03c6 phitwo ++03c7 khi +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/cyrillic/KOI8-R.unicodeMap ++++ xpdf-3.02/debian/lang/usr/share/xpdf/cyrillic/KOI8-R.unicodeMap +@@ -0,0 +1,100 @@ ++000a 0a ++000c 000d 0c ++0020 007e 20 ++00a0 9a ++00a9 bf ++00b0 9c ++00b2 9d ++00b7 9e ++00f7 9f ++02c6 5e ++02da 9c ++02dc 7e ++0401 b3 ++0410 0411 e1 ++0412 f7 ++0413 e7 ++0414 0415 e4 ++0416 f6 ++0417 fa ++0418 041f e9 ++0420 0423 f2 ++0424 e6 ++0425 e8 ++0426 e3 ++0427 fe ++0428 fb ++0429 fd ++042a ff ++042b f9 ++042c f8 ++042d fc ++042e e0 ++042f f1 ++0430 0431 c1 ++0432 d7 ++0433 c7 ++0434 0435 c4 ++0436 d6 ++0437 da ++0438 c9 ++0439 043f ca ++0440 0443 d2 ++0444 c6 ++0445 c8 ++0446 c3 ++0447 de ++0448 db ++0449 dd ++044a df ++044b d9 ++044c d8 ++044d dc ++044e c0 ++044f d1 ++0451 a3 ++2013 2d ++2014 2d2d ++2018 60 ++2019 27 ++201a 2c ++201c 22 ++201d 22 ++201e 2c2c ++2022 9e ++2026 2e2e2e ++2039 3c ++203a 3e ++2044 2f ++2122 544d ++2212 2d ++2219 221a 95 ++2248 97 ++2264 2265 98 ++2320 93 ++2321 9b ++2500 80 ++2502 81 ++250c 82 ++2510 83 ++2514 84 ++2518 85 ++251c 86 ++2524 87 ++252c 88 ++2534 89 ++253c 8a ++2550 2552 a0 ++2553 2561 a4 ++2562 256c b4 ++2580 8b ++2584 8c ++2588 8d ++258c 8e ++2590 2593 8f ++25a0 94 ++fb00 6666 ++fb01 6669 ++fb02 666c ++fb03 666669 ++fb04 66666c +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/cyrillic/Bulgarian.nameToUnicode ++++ xpdf-3.02/debian/lang/usr/share/xpdf/cyrillic/Bulgarian.nameToUnicode +@@ -0,0 +1,58 @@ ++0410 As ++0411 Buki ++0412 Wjedi ++0413 Glagol ++0414 Dobro ++0415 Jest ++0416 Schiwete ++0417 Selmja ++0418 Ische ++0419 Ischebreve ++041a Kako ++041b Ljudi ++041c Muislete ++041d Nasche ++041e On ++041f Pakoj ++0420 Rzui ++0421 Slovo ++0422 Twerdo ++0423 Uk ++0424 Fert ++0425 Cherr ++0426 Zui ++0427 Tscherw ++0428 Scha ++0429 Schtscha ++042a Jerr ++042e Ju ++042f Ja ++0430 as ++0431 buki ++0432 wjedi ++0433 glagol ++0434 dobro ++0435 jest ++0436 schiwete ++0437 selmja ++0438 ische ++0439 ischebreve ++043a kako ++043b ljudi ++043c muislete ++043d nasche ++043e on ++043f pakoj ++0440 rzui ++0441 slovo ++0442 twerdo ++0443 uk ++0444 fert ++0445 cherr ++0446 zui ++0447 tscherw ++0448 scha ++0449 schtscha ++044a jerr ++044e ju ++044f ja +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/latin2/Latin2.unicodeMap ++++ xpdf-3.02/debian/lang/usr/share/xpdf/latin2/Latin2.unicodeMap +@@ -0,0 +1,134 @@ ++000a 000a 0a ++000c 000d 0c ++0020 007e 20 ++00a0 00a0 20 ++00a4 a4 ++00a7 00a8 a7 ++00ad ad ++00b0 b0 ++00b4 b4 ++00b8 b8 ++00c1 00c2 c1 ++00c4 c4 ++00c7 c7 ++00c9 c9 ++00cb cb ++00cd 00ce cd ++00d3 00d4 d3 ++00d6 00d7 d6 ++00da da ++00dc 00dd dc ++00df df ++00e1 00e2 e1 ++00e4 e4 ++00e7 e7 ++00e9 e9 ++00eb eb ++00ed 00ee ed ++00f3 00f4 f3 ++00f6 00f7 f6 ++00fa fa ++00fc 00fd fc ++0102 c3 ++0103 e3 ++0104 a1 ++0105 b1 ++0106 c6 ++0107 e6 ++010c c8 ++010d e8 ++010e cf ++010f ef ++0110 d0 ++0111 f0 ++0118 ca ++0119 ea ++011a cc ++011b ec ++0131 69 ++0132 494a ++0133 696a ++0139 c5 ++013a e5 ++013d a5 ++013e b5 ++0141 a3 ++0142 b3 ++0143 d1 ++0144 f1 ++0147 d2 ++0148 f2 ++0150 d5 ++0151 f5 ++0152 4f45 ++0153 6f65 ++0154 c0 ++0155 e0 ++0158 d8 ++0159 f8 ++015a a6 ++015b b6 ++015e aa ++015f ba ++0160 a9 ++0161 b9 ++0162 de ++0163 fe ++0164 ab ++0165 bb ++016e d9 ++016f f9 ++0170 db ++0171 fb ++0178 59 ++0179 ac ++017a bc ++017b af ++017c bf ++017d ae ++017e be ++02c6 5e ++02c7 b7 ++02d8 a2 ++02d9 ff ++02da b0 ++02db b2 ++02dc 7e ++02dd bd ++2013 2013 ad ++2014 2014 2d2d ++2018 2018 60 ++2019 2019 27 ++201a 201a 2c ++201c 201c 22 ++201d 201d 22 ++201e 201e 2c2c ++2022 2022 b7 ++2026 2026 2e2e2e ++2039 2039 3c ++203a 203a 3e ++2044 2044 2f ++2122 2122 544d ++2212 2212 2d ++f6f9 f6f9 4c ++f6fa f6fa 4f45 ++f6fc f6fc b0 ++f6fd f6fd 53 ++f6fe f6fe 7e ++f6ff f6ff 5a ++f721 f721 21 ++f724 f724 24 ++f726 f726 26 ++f730 f739 30 ++f73f f73f 3f ++f761 f77a 41 ++f7a1 f7a2 a1 ++f7bf f7bf bf ++f7e0 f7f6 c0 ++f7f8 f7fe d8 ++f7ff f7ff 59 ++fb00 fb00 6666 ++fb01 fb01 6669 ++fb02 fb02 666c ++fb03 fb03 666669 ++fb04 fb04 66666c +--- xpdf-3.02.orig/debian/lang/usr/share/xpdf/turkish/ISO-8859-9.unicodeMap ++++ xpdf-3.02/debian/lang/usr/share/xpdf/turkish/ISO-8859-9.unicodeMap +@@ -0,0 +1,67 @@ ++000a 0a ++000c 000d 0c ++0020 007e 20 ++00a0 20 ++00a1 00ac a1 ++00ae 00cf ae ++00d1 00dc d1 ++00df 00ef df ++00f1 00fc f1 ++00ff ff ++010c 43 ++010d 63 ++011e d0 ++011f f0 ++0130 dd ++0131 fd ++0141 4c ++0142 6c ++0152 4f45 ++0153 6f65 ++015e de ++015f fe ++0160 53 ++0161 73 ++0178 59 ++017d 5a ++017e 7a ++02c6 5e ++02da b0 ++02dc 7e ++2013 ad ++2014 2d2d ++2018 60 ++2019 27 ++201a 2c ++201c 22 ++201d 22 ++201e 2c2c ++2022 b7 ++2026 2e2e2e ++2039 3c ++203a 3e ++2044 2f ++2122 544d ++2212 2d ++f6f9 4c ++f6fa 4f45 ++f6fc b0 ++f6fd 53 ++f6fe 7e ++f6ff 5a ++f721 21 ++f724 24 ++f726 26 ++f730 f739 30 ++f73f 3f ++f761 f77a 41 ++f7a1 f7a2 a1 ++f7bf bf ++f7e0 f7f6 c0 ++f7f8 f7fe d8 ++f7ff 59 ++fb00 6666 ++fb01 6669 ++fb02 666c ++fb03 666669 ++fb04 66666c +--- xpdf-3.02.orig/debian/changelog ++++ xpdf-3.02/debian/changelog +@@ -0,0 +1,801 @@ ++xpdf (3.02-1.3) unstable; urgency=high ++ ++ * Non-maintainer upload by testing security team. ++ * Included fix-CVE-2007-5393_2007-5392_2007-4352.dpatch to address the ++ following security issues (Closes: #450629) ++ - CVE-2007-5393 buffer overflow in the CCITTFaxStream::lookChar leading ++ to arbitrary code execution via a crafted pdf file. ++ - CVE-2007-5392 integer overflow in the DCTStream::reset resulting in a ++ heap based buffer overflow allows code execution. ++ - CVE-2007-4352 array index error in DCTStream::readProgressiveDataUnit ++ leads to memory corruption and possibly arbitrary code execution. ++ ++ -- Nico Golde <nion@debian.org> Fri, 09 Nov 2007 09:22:19 +0100 ++ ++xpdf (3.02-1.2) unstable; urgency=high ++ ++ * Non-maintainer upload by testing security team. ++ * Removed post-3.5.7-kdegraphics-CVE-2007-3387.diff.dpatch and ++ created fix-CVE-2007-3387_CVE-2007-5049.dpatch to have a fix ++ for CVE-2007-3387 and a buffer overflow in GetNextLine() ++ (CVE-2007-5049) since they are related (Closes: #443906). ++ ++ -- Nico Golde <nion@debian.org> Thu, 27 Sep 2007 12:05:46 +0200 ++ ++xpdf (3.02-1.1) unstable; urgency=high ++ ++ * Non-maintainer upload with permission of the maintainer ++ * Fix integer overflow in the StreamPredictor::StreamPredictor ++ function by adding post-3.5.7-kdegraphics-CVE-2007-3387.diff.dpatch ++ (Closes: #435462) Fixes: CVE-2007-3387 ++ ++ -- Steffen Joeris <white@debian.org> Tue, 07 Aug 2007 14:00:34 +1000 ++ ++xpdf (3.02-1) unstable; urgency=low ++ ++ * New upstream release (closes: #413611) ++ * Adds PDF 1.6 and 1.7 support (closes: #320509, #329372) ++ * Fixes segfault on Postscript conversion (in xpdf or pdftops) ++ with libc6 2.5-1, though probably also fixed in libc6 already ++ (closes: #419618) ++ * Improved rendering of some PDFs (closes: #409759, #242294, #280767) ++ * Improved full screen handling (obseletes patches incorporated ++ in 3.01-9; 31_fullscreen.dpatch, 32_vscroll.dpatch) ++ * Adds new options to the xpdfrc(5) (closes: #384024) ++ * Fixed handling of some broken PDFs (closes: #330711) ++ * On-the-fly switch to full screen is possible (closes: #281479) ++ * Adds configurable keybindings ++ ++ * Patched Latin2 unicode map to include IJ sequences; thanks to ++ Petr Peringer for the patch (closes: #402757) ++ * Fix reference to /etc/xpdf/xpdf-* -> /etc/xpdf/xpdfrc-* in ++ update-xpdfrc(8) (closes: #402852) ++ * Added -title support to zxpdf (closes: #338096) ++ * Updated debian/copyright (closes: #407888) ++ * Modified xpdfrc(5) to note that options are case sensitive (closes: ++ #417979) ++ * Fix package relationships so that package is bin-NMU safe ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 25 Apr 2007 02:42:16 +1000 ++ ++xpdf (3.01-9) unstable; urgency=low ++ ++ * Incorporate patches from Eugeniy Meshcheryakov and Junichi Uekawa to ++ fix fullscreen mode when using a NETWM-compliant window manager ++ (closes: #247602, #362496, #367845, #168970, #192397, #165047) ++ (31_fullscreen.dpatch, 32_vscroll.dpatch) ++ * Nasty, nasty patch to workaround FTBFS due to incompatility ++ between latest g++-4.1 and lesstif - bug#377230 (40_lesstif_copy.dpatch, ++ 41_lesstif_cpp.dpatch) ++ * Upgrade to standards-revision 3.7.2 ++ * Made xpdf-common recommend gsfonts-x11 (closes: #329804) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 15 Jul 2006 16:01:16 +1000 ++ ++xpdf (3.01-8) unstable; urgency=low ++ ++ * Add patch 05_freetype-2.2.dpatch: make splash/SplashFTFont.cc ++ compatible with FreeType 2.2 (ie don't use FreeType internals ++ directly any more). Fixes unreported FTBFS. ++ * Enable additional compile-time options: --enable-opi, ++ --enable-multithreaded, --enable-wordlist ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 27 May 2006 00:58:12 +1000 ++ ++xpdf (3.01-7) unstable; urgency=high ++ ++ * SECURITY UPDATE: incorporated upstream patch revision 3.01pl2 ++ (obseletes several patches collected from Red Hat, Ubuntu etc). ++ * References: CAN-2005-3191/3192/3193/3624/3625/2626/2627/3628, ++ CAN-2006-0301 (all included, some improved by this patch) ++ ++ -- Hamish Moffatt <hamish@debian.org> Thu, 16 Feb 2006 00:22:13 +1100 ++ ++xpdf (3.01-6) unstable; urgency=high ++ ++ * SECURITY UPDATE: fixed buffer overflow in splash image handling ++ (Splash/splash.cc) using patch supplied by Red Hat: ++ https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=179046 ++ (closes: #350785, #350783) ++ * References: CVE-2006-0301 ++ * My first upload from the side of the road on borrowed wifi ++ in a foreign country... ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 1 Feb 2006 22:42:42 +1300 ++ ++xpdf (3.01-5) unstable; urgency=low ++ ++ * Changed build-dep on libpaperg-dev to libpaper-dev (closes: #346397) ++ * Made xpdf-utils conflicts/replaces/provides poppler-utils ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 8 Jan 2006 13:25:57 +1100 ++ ++xpdf (3.01-4) unstable; urgency=high ++ ++ * SECURITY UPDATE: added additional precautionary checks ++ supplied by Martin Pitt, Chris Evans and Ludwid Nussel ++ * Changed build-dep on xlibs-dev to individual lib*-dev packages ++ ++ -- Hamish Moffatt <hamish@debian.org> Fri, 6 Jan 2006 18:55:24 +1100 ++ ++xpdf (3.01-3) unstable; urgency=high ++ ++ * SECURITY UPDATE: fix several potential buffer overflows: ++ DCTStream Baseline Heap Overflow, DCTStream Progressive Heap Overflow, ++ StreamPredictor Heap Overflow, JPX Stream Reader Heap Overflow ++ (closes: #322462) (21_security.dpatch) ++ * References: CAN-2005-3193, CAN-2005-3191 ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 6 Dec 2005 23:05:10 +0000 ++ ++xpdf (3.01-2) unstable; urgency=low ++ ++ * Incorporate upstream patch to fix resize issues with some ++ window managers (20_resize.dpatch) ++ (closes: #325112, #326888, #327572, #329112, #324172) ++ * Fix incorrect escape sequences in xpdf.1 (closes: #320631) ++ Thanks to Erik Schanze for the patch. (01_manpage.dpatch) ++ ++ -- Hamish Moffatt <hamish@debian.org> Mon, 10 Oct 2005 23:34:46 +1000 ++ ++xpdf (3.01-1) unstable; urgency=low ++ ++ * New upstream release (closes: #323715) ++ * Added initial transparency support (closes: #181958, #284504, #243533) ++ * Improved performance of pattern handling (closes: #220628) ++ * Rasterizer optimisations (closes: #229714, #283549) ++ * Handle negative font sizes (closes: #267790, #269495) ++ * Fixed bugs in the Type 1C font parser ++ (closes: #280291, #308547, #316895, #322906, #317708) ++ and TrueType (closes: #270086) ++ * Fix borders with some files (closes: #284307) ++ * Fixed copy/paste losing text (closes: #310042) ++ * Window is sized to fit the document page (closes: #249039, #254843) ++ * Background window is now gray to show page size (closes: #295696) ++ * Directories are not scanned until open dialog used (closes: #298742) ++ * Fixed other crashes (closes: #251057, #264298, #303710), ++ PostScript output bugs (closes: #295685) ++ ++ * Added build-conflicts with libstroke0-dev, as it supplies ++ autoconf macros that conflict with xpdf's own ++ * Added category and generic name entries to the Desktop file ++ (closes: #302546); thanks to Alejandro Exojo for the patch ++ * Register for MIME type application/x-pdf in addition to ++ application/pdf (closes: #319057) ++ * Updated to standards-revision 3.6.2 ++ ++ -- Hamish Moffatt <hamish@debian.org> Fri, 19 Aug 2005 22:48:35 +1000 ++ ++xpdf (3.00-15) unstable; urgency=low ++ ++ * SECURITY UPDATE: fix potiential DoS attack through hand-crafted ++ PDFs with corrupt loca tables (closes: #322462) ++ * References: CAN-2005-2097 ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 17 Aug 2005 07:55:17 +1000 ++ ++xpdf (3.00-14) unstable; urgency=low ++ ++ * Use dpatch for patch management; added build-dep on dpatch ++ * Fix FTBFS with gcc-4.0 (closes: #316836); ++ thanks to Daniel Schepler for the patch ++ * xpdf-utils now suggests: pdftk (closes: #306624) ++ * Fix page parameter handling in zxpdf (closes: #315458) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 17 Jul 2005 01:07:20 +1000 ++ ++xpdf (3.00-13) unstable; urgency=low ++ ++ * SECURITY UPDATE: fix buffer overflow for PDF documents with an /Encrypt ++ /Length value > 16 (xpdf/XRef.cc) (upstream xpdf-3.00pl3.patch) ++ * References: CAN-2005-0064 (in addition to previous changes) ++ ++ * Added desktop entry to xpdf-reader (adapted from Ubuntu with thanks) ++ (closes: #280812) ++ * Updated build-dependency on debhelper to 4.2.21 to get dh_desktop ++ ++ * Fixed FTBFS on amd64 with gcc-4.0 resulting from cast from void* ++ to int in xpdf/XPDFViewer.cc (closes: #288727) ++ Thanks to Andreas Jochens for the patch. ++ ++ * Added note to header of source files modified to remove PDF ++ permission checking as requested by upstream in bug#298584 ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 22 Mar 2005 23:33:52 +1100 ++ ++xpdf (3.00-12) unstable; urgency=high ++ ++ * SECURITY UPDATE: Fixed buffer overflow that could overwrite the stack ++ and hence cause the execution of arbitrary code as reported by ++ iDEFENSE (xpdf/Decrypt.cc) ++ * References: CAN-2005-0064 ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 19 Jan 2005 23:48:56 +1100 ++ ++xpdf (3.00-11) unstable; urgency=high ++ ++ * SECURITY UPDATE: fix potential buffer overflow ++ Applied patch to colour map handling in xpdf/Gfx.cc (closes: #286742) ++ * References: CAN-2004-1125 ++ ++ -- Hamish Moffatt <hamish@debian.org> Thu, 23 Dec 2004 08:16:24 +1100 ++ ++xpdf (3.00-10) unstable; urgency=high ++ ++ * SECURITY UPDATE: fix potential buffer overflow ++ * goo/gmem.[ch]: change declarations of gmalloc and grealloc to use size_t ++ instead of int; int truncated sizes to 32 bits, which made xpdf still ++ vulnerable to integer (and eventually buffer) overflow attacks on 64 bit ++ platforms like amd64. ++ * Thanks to Marcus Meissner <meissner@suse.de> for providing the patch ++ and Martin Pitt <mpitt@debian.org> for providing the changes for ++ Debian in the form of 3.00-9ubuntu2 ++ * References: ++ CAN-2004-0889 (incomplete fix in version 3.00-9) ++ ++ * Incorporated patch from Arnaud Giersch to fix crashes with ++ certain PDFs (closes: #278693, #279292) ++ ++ -- Hamish Moffatt <hamish@debian.org> Mon, 8 Nov 2004 00:23:22 +1100 ++ ++xpdf (3.00-9) unstable; urgency=high ++ ++ * Applied patch to fix vulnerability CAN-2004:0889: integer overflow ++ issues that could allow denial of service or possibly arbitrary ++ code execution ++ ++ -- Hamish Moffatt <hamish@debian.org> Thu, 21 Oct 2004 23:49:32 +1000 ++ ++xpdf (3.00-8) unstable; urgency=low ++ ++ * Final cleanup for sarge. ++ * Fixed handling of some PDFs causing crashes (Closes: #254864) ++ Modified splash/SplashFTFont.cc to prevent crash caused by calling ++ FreeType's FT_Decompose_Outline with a non-outline object ++ * Cleaned up dependency on libt1-5 to prevent duplicate depends ++ * Moved pixmaps to /usr/share/pixmaps ++ * Cleaned up lintian warnings ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 18 Aug 2004 23:32:07 +1000 ++ ++xpdf (3.00-7) unstable; urgency=low ++ ++ * Changed wrapper script to use /bin/bash explicitly ++ (closes: #245943, #248090) ++ * Add /usr/share/bug/xpdf/control so that bugs submitted to 'xpdf' ++ go to 'xpdf-reader' instead ++ * Update supplied configuration file for new configuration options ++ (closes: #246351) ++ * Added menu icon (closes: #244504) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 9 May 2004 23:24:30 +1000 ++ ++xpdf (3.00-6) unstable; urgency=low ++ ++ * Add dependency on libt1-5 >= 5.0.2 to fix several Xpdf crashes ++ (closes: #238946, #243847, #243879) ++ * Fixed wrapper script so that X resources are still located ++ correctly (closes: #242513) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 25 Apr 2004 21:48:25 +1000 ++ ++xpdf (3.00-5) unstable; urgency=low ++ ++ * Fix crash when clicking bookmarks in some PDFs (closes: #236007) ++ * Not uploaded ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 30 Mar 2004 23:31:16 +1000 ++ ++xpdf (3.00-4) unstable; urgency=low ++ ++ * Build with new libt1 rather than old t1lib (closes: #234273) ++ * Fixed repeated text in pdfimages(1) (closes: #202139) ++ * Fix crash on some PDFs due to empty paths (closes: #231709, #240187) ++ (thanks to Guillaume Morin for the patch) ++ * Applied upstream patch to add TrueType font collection (TTC) support ++ (closes: #232340) ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 30 Mar 2004 22:30:35 +1000 ++ ++xpdf (3.00-3) unstable; urgency=low ++ ++ * Add upstream patch to fix handling of 16-bit TrueType fonts ++ * Added note to /etc/xpdf/xpdfrc file warning that user configuration ++ files (~/.xpdfrc) override the system-wide file, rather than supplement ++ it (closes: #230853) ++ * Updated /etc/xpdf/xpdfrc to remove obselete X font mappings ++ (no longer supported) ++ * Updated /usr/share/doc/xpdf-common/examples/sample-xpdfrc for 3.00 ++ (closes: #229874) by supplying the debian package version instead ++ of upstream's ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 10 Feb 2004 23:00:02 +1100 ++ ++xpdf (3.00-2) unstable; urgency=low ++ ++ * Added build-dep for pkg-config ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 28 Jan 2004 00:38:31 +1100 ++ ++xpdf (3.00-1) unstable; urgency=low ++ ++ * New upstream release ++ * Enter now works in Find dialog to start searching (closes: #167975) ++ * Find dialog text input grows when window is resized (closes: #205208) ++ * Fixed crashes with some PDFs (closes: #223989, #224943, #225289, #229264) ++ * Fixed inverted horizontal mouse wheel behaviour (closes: #224849) ++ * Fixed slow rendering of some documents (closes: #222254) ++ * Corrected location of upstream sources in copyright file ++ (closes: #229670) ++ * Fixed location of configuration file in manual pages ++ (/etc/xpdfrc -> /etc/xpdf/xpdfrc) ++ ++ -- Hamish Moffatt <hamish@debian.org> Mon, 26 Jan 2004 14:39:30 +1100 ++ ++xpdf (2.03-2) unstable; urgency=low ++ ++ * Applied upstream patch to fix reading of JBIG encoded files (closes: ++ #220450) ++ * Wrapper script will now use exec when calling xpdf.bin ++ (closes: #219736) and zxpdf will do the same when calling xpdf ++ ++ -- Hamish Moffatt <hamish@debian.org> Fri, 14 Nov 2003 09:08:11 +1100 ++ ++xpdf (2.03-1) unstable; urgency=low ++ ++ * New upstream release ++ * Fixes crashes with some documents (closes: #215867, #212990) ++ * Supports PDF outline (bookmarks) (closes: #166926) ++ * Supports clipping to text which makes some more PDF files ++ display correctly (closes: #184070) ++ * Fix PDF BitsPerComponent handling (closes: #185950) ++ * Handle PDFs with broken Unicode cmap table (closes: #188532) ++ * Handle PDFs with broken DCT streams (closes: #193718) ++ * Improved text extraction with right-to-left scripts (closes: #176745) ++ * If the print command is changed in the print dialog, it won't ++ be reset if another file is opened (closes: #200466) ++ ++ * Updated Greek and Cyrillic language support to 2003-jun-28 versions ++ * Provided manual page for xpdf.bin (symlink to xpdf(1)) (closes: #211887) ++ * update-xpdfrc will now ignore backup (*~) and RCS files (closes: #194124) ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 22 Oct 2003 22:43:47 +1000 ++ ++xpdf (2.02pl1-1) unstable; urgency=high ++ ++ * Upstream patch release to fix security hole in URL handling ++ (closes: #198032) ++ ++ -- Hamish Moffatt <hamish@debian.org> Thu, 19 Jun 2003 23:06:21 +1000 ++ ++xpdf (2.02-2) unstable; urgency=low ++ ++ * Modified xpdf(1) to include information about zxpdf ++ (closes: #175535) ++ * Modified zxpdf to work with no command line parameters ++ * Modified zxpdf to recognise .PDF (upper case) file extension ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 23 Apr 2003 00:27:50 +1000 ++ ++xpdf (2.02-1) unstable; urgency=low ++ ++ * New upstream release ++ * Incorporated new Arabic language package 2003-feb-16 ++ * Updated Hebrew language support to 2003-feb-16 ++ * Upstream: fixed display problems in some PDFs (closes: #181076, ++ #144047, #167827, #176856, #180829) ++ * Upstream: fixed crash on find-next before find (closes: #172973) ++ * Upstream: fixed color handling in buttons (closes: #171398) ++ * Upstream: fixed crash if Ctrl-W pressed while file open (closes: #177698) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 30 Mar 2003 14:06:43 +1000 ++ ++xpdf (2.01-3) unstable; urgency=low ++ ++ * Fixed wrapper script bug: incorrect handling of command line ++ parameters (closes: #174965, #174851) ++ * Fixed wrapper script bug: should set $LC_ALL as well as $LANG ++ (closes: #174717) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 4 Jan 2003 15:59:01 +1100 ++ ++xpdf (2.01-2) unstable; urgency=low ++ ++ * Applied patch to fix buffer overflow as reported by iDEFENSE ++ * Fixed name of language configuration files (/etc/xpdf/xpdf-* renamed ++ back to xpdfrc-*) (closes: #173046) ++ * Modified update-xpdfrc to ignore .dpkg* files in /etc/xpdf ++ (closes: #173268) ++ * Made xpdf a wrapper script which calls real xpdf binary to work ++ around locale problems (closes: #167956, #168717, #169339, #172009) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 28 Dec 2002 00:35:52 +1100 ++ ++xpdf (2.01-1) unstable; urgency=low ++ ++ * New upstream release ++ * Merged in the small and free xpdf language packages xpdf-cyrillic, ++ xpdf-greek, xpdf-hebrew, xpdf-latin2, xpdf-thai and xpdf-turkish; ++ the others remain as seperate packages in non-free. ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 8 Dec 2002 00:02:37 +1100 ++ ++xpdf (2.00-2) unstable; urgency=low ++ ++ * Recompile with lesstif2 (closes: #170624) ++ * Change the default urlCommand to sensible-browser, which will make it ++ honour the BROWSER variable, and run a good default browser that is ++ installed if that is not set. Sure beats hardcoding non-free netscape. ++ (closes: #170085) ++ * Suggest www-browser. ++ * Fixed incorrect resource names in xpdf(1) (closes: #168730) ++ * Set a default print command (closes: #168520) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 30 Nov 2002 13:08:38 +1100 ++ ++xpdf (2.00-1) unstable; urgency=low ++ ++ * New upstream release - uses Lesstif instead of old Xpdf-specific toolkit ++ * Upstream: Control-P now brings up the print dialog (closes: #157225) ++ * Upstream: Worked around problems with fonts in some PDF files ++ (closes: #159778) ++ * Upstream: 'Save as' now uses the standard Motif save dialog, so any ++ filename can be entered (closes: #158423) ++ * Upstream: handles malformed PDFs with error messages rather than ++ silently as happened previously in some cases (closes: #151241) ++ * Upstream: fullscreen behaviour is working fine in this version ++ (closes: #156252) ++ * Upstream: Enter works in save dialog (closes: #166942) ++ * Upstream: now uses standard Motif file selector dialog (closes: #160255) ++ * No performance issues observed with resizing the window (closes: #165847) ++ * Tweaked configuration mechanism not to build /etc/xpdfrc now, ++ but an include file for the main configuration file instead. ++ No changes to the language packages are required to support this. ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 5 Nov 2002 11:49:24 +1100 ++ ++xpdf (1.01-3) unstable; urgency=low ++ ++ * Recompile with more recent FreeType, updated dependencies to match ++ (closes: #155946) ++ * Made xpdf handle missing default paper name from libpaper ++ (eg if $PAPERSIZE is set to a non-existent file) (closes: #150360) ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 4 Sep 2002 21:49:41 +1000 ++ ++xpdf (1.01-2) unstable; urgency=low ++ ++ * Fixed dependencies to ensure that xpdf-common, xpdf-reader and ++ xpdf-utils versions are always synchronised (closes: #147897, ++ #151683) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 7 Jul 2002 01:24:00 +1000 ++ ++xpdf (1.01-1) unstable; urgency=low ++ ++ * New upstream release (closes: #146286, #147428) ++ including support for Type 3 fonts (closes: #128686, #137378, ++ #137416, #143245, #145541, #147614) ++ * Removed empty examples directory (closes: #145057, #146336) ++ * Changed dependency on gsfonts to require the woody version ++ or newer (>= 6.0-1) (closes: #146398) ++ * Applied patch to allow copying and printing of protected ++ PDF files (closes: #145558) ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 22 May 2002 23:16:47 +1000 ++ ++xpdf (1.00-4) unstable; urgency=low ++ ++ * xpdf-reader: added zxpdf script contributed by Yann Dirson to allow ++ viewing of compressed PDF files (closes: #87316, #14227) ++ * xpdf-reader, xpdf-utils: corrected location of the configuration ++ files in the manual pages (closes: #139982) ++ * xpdf-common: added note to /etc/xpdf/xpdfrc describing configuration ++ file scheme (closes: #143372) ++ ++ -- Hamish Moffatt <hamish@debian.org> Thu, 25 Apr 2002 10:57:47 +1000 ++ ++xpdf (1.00-3) unstable; urgency=low ++ ++ * Fixed conflicts with xpdf-i (should conflict with versions ++ <= 0.90-8, not 0.90-7) (closes: #136385, #136157) ++ * Applied patch from the upstream author to fix the missing ++ initialZoom X resource (closes: #135712) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 9 Mar 2002 00:23:33 +1100 ++ ++xpdf (1.00-2) unstable; urgency=low ++ ++ * Fixed problem with building the arch-specific packages when ++ xpdf-common was not installed (tried to overwrite /etc/xpdfrc) ++ (closes: #134336, #134338) ++ ++ -- Hamish Moffatt <hamish@debian.org> Mon, 18 Feb 2002 08:36:59 +1100 ++ ++xpdf (1.00-1) unstable; urgency=low ++ ++ * New upstream release (closes: #131961) ++ * Split the xpdf package into xpdf-reader, xpdf-utils and a ++ metapackage, xpdf. This reduces the number of library packages ++ required if you just want pdf2ps, for example. (closes: #122786) ++ * The new upstream release has the language support split into ++ seperate packages. See xpdf-chinese-simplified, ++ xpdf-chinese-traditional, xpdf-korean, xpdf-japanese, ++ xpdf-thai and xpdf-cyrillic. NOTE: some of these are ++ non-free. ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 2 Feb 2002 23:44:20 +1100 ++ ++xpdf (0.93-6) unstable; urgency=low ++ ++ * Applied patch from the upstream author Derek Noonburg ++ to fix an unitialized variable which causes xpdf ++ to sometimes crash on Alpha systems (closes: #124314) ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 16 Jan 2002 21:30:53 +1100 ++ ++xpdf (0.93-5) unstable; urgency=low ++ ++ * Applied patch from the upstream author Derek Noonburg ++ to fix TrueType font embedding bugs (closes: #123913) ++ * Added Build-Conflicts: with libttf-dev; the compile gets ++ mixed up between freetype1 and freetype2 when libttf-dev ++ is installed (closes: #123565) ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 9 Jan 2002 22:46:49 +1100 ++ ++xpdf (0.93-4) unstable; urgency=low ++ ++ * Added menu hint "Documents" (closes: #121029) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 25 Nov 2001 13:02:24 +1100 ++ ++xpdf (0.93-3) unstable; urgency=low ++ ++ * Added app-defaults file mapping for Type 1 base-14 fonts (requires ++ gsfonts) (closes: #120649, #120994) ++ * Added libpaper support; xpdf now gets the default paper size from ++ X resources, $PAPERSIZE, /etc/papersize, or defaults to letter ++ (closes: #120645) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 25 Nov 2001 11:38:19 +1100 ++ ++xpdf (0.93-2) unstable; urgency=low ++ ++ * Removed final references to install-mime (closes: #120423) ++ * Linked with libfreetype6 (closes: #116283) ++ * Configuration file moved to /etc/xpdfrc (was /usr/etc/xpdfrc by mistake) ++ * Also linked with t1lib ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 24 Nov 2001 16:20:23 +1100 ++ ++xpdf (0.93-1) unstable; urgency=low ++ ++ * New upstream release (closes: #81911, #107448) ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 7 Nov 2001 23:54:52 +1100 ++ ++xpdf (0.92-5) unstable; urgency=low ++ ++ * Fixed freetype file locations which caused the build to fail if ++ libfreetype6-dev wasn't installed (but isn't actually used) ++ (closes: #111745) ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 11 Sep 2001 20:21:47 +1000 ++ ++xpdf (0.92-4) unstable; urgency=low ++ ++ * Added libttf-dev to build-deps so that xpdf will be built with ++ TrueType font support (closes: #108667) ++ * Increased xpdf's priority in mailcap from 4 to 6 to be above ++ gv and acroread (closes: #106858) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 2 Sep 2001 14:54:11 +1000 ++ ++xpdf (0.92-3) unstable; urgency=low ++ ++ * Changed build-dep on xpm4g-dev to xlibs-dev (closes: #83814) ++ * Re-enabled Chinese language support (closes: #74974) ++ ++ -- Hamish Moffatt <hamish@debian.org> Mon, 29 Jan 2001 08:23:06 +1100 ++ ++xpdf (0.92-2) unstable; urgency=low ++ ++ * Recompiled with latest X libraries ++ ++ -- Hamish Moffatt <hamish@debian.org> Thu, 18 Jan 2001 08:21:23 +1100 ++ ++xpdf (0.92-1) unstable; urgency=low ++ ++ * New upstream release ++ * Updated Standards-Version ++ ++ -- Hamish Moffatt <hamish@debian.org> Wed, 6 Dec 2000 21:16:34 +1100 ++ ++xpdf (0.91-3) unstable; urgency=low ++ ++ * Enabled Chinese language support (closes: #74974) ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 7 Nov 2000 15:52:41 +1100 ++ ++xpdf (0.91-2) unstable; urgency=low ++ ++ * Changed replaces/conflicts with xpdf-i to allow installation ++ of xpdf-i 0.91-1 (dummy package) as well as xpdf >= 0.91 ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 19 Sep 2000 22:55:44 +1100 ++ ++xpdf (0.91-1) unstable; urgency=low ++ ++ * New upstream version (closes: #43604, #47391, #61055, #67591, #50170) ++ * Upstream source now includes decryption; xpdf-i is now obselete ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 20 Aug 2000 18:25:07 +1000 ++ ++xpdf (0.90-6) unstable; urgency=low ++ ++ * Added build-depends for debhelper, xpm4g-dev and xlib6g-dev ++ (closes: #68464, #61585) ++ ++ -- Hamish Moffatt <hamish@debian.org> Mon, 7 Aug 2000 19:29:08 +1000 ++ ++xpdf (0.90-5) unstable; urgency=low ++ ++ * Added build-depends for t1lib-dev (closes: #55658) ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 1 Aug 2000 21:03:43 +1000 ++ ++xpdf (0.90-4) unstable; urgency=low ++ ++ * Recompile for t1lib1 ++ ++ -- Hamish Moffatt <hamish@debian.org> Mon, 3 Jan 2000 09:45:45 +1100 ++ ++xpdf (0.90-3) unstable; urgency=low ++ ++ * FHS compliant ++ * Converted to debhelper ++ * Moved xpdf binary from /usr/X11R6/bin to /usr/bin ++ ++ -- Hamish Moffatt <hamish@debian.org> Fri, 1 Oct 1999 23:51:31 +1000 ++ ++xpdf (0.90-2) unstable; urgency=low ++ ++ * Recompiled with t1lib 0.9.1-4 to get correct dependencies ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 11 Sep 1999 00:59:17 +1000 ++ ++xpdf (0.90-1) unstable; urgency=low ++ ++ * New upstream version ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 14 Aug 1999 14:31:00 +1000 ++ ++xpdf (0.80-6) unstable; urgency=low ++ ++ * Added code in postinst and postrm to remove old MIME entries ++ added using install-mime (fixes #37724, #31293) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 23 May 1999 00:25:00 +1000 ++ ++xpdf (0.80-5) unstable; urgency=low ++ ++ * Fixed error in /usr/lib/mime/packages/xpdf (fixes #37537) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 15 May 1999 22:35:00 +1000 ++ ++xpdf (0.80-4) unstable; urgency=low ++ ++ * Fixed bug in postinst introduced in 0.80-3 (fixes #37009, #37026) ++ * xpdf now Conflicts with and Replaces xpdf-i ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 02 May 1999 18:20:00 +1000 ++ ++xpdf (0.80-3) unstable; urgency=low ++ ++ * Fixed incorrect mime support handling with patch from David Rocher ++ (fixes bug#36901) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 01 May 1999 18:45:00 +1000 ++ ++xpdf (0.80-2) unstable; urgency=low ++ ++ * Enabled support for 16-bit Japanese fonts (fixes bug#30671) ++ ++ -- Hamish Moffatt <hamish@debian.org> Fri, 18 Dec 1998 00:18:00 +1100 ++ ++xpdf (0.80-1) unstable; urgency=low ++ ++ * New upstream release ++ ++ -- Hamish Moffatt <hamish@debian.org> Sun, 29 Nov 1998 01:03:00 +1100 ++ ++xpdf (0.7a-3) unstable; urgency=low ++ ++ * Previous upload had wrong section and was rejected ++ * Change of license; xpdf is now GPL (see ++ http://www.debian.org/Lists-Archives/debian-devel-9809/msg00193.html) ++ ++ -- Hamish Moffatt <hamish@debian.org> Sat, 10 Oct 1998 11:12:00 +1000 ++ ++xpdf (0.7a-2) unstable; urgency=low ++ ++ * New maintainer ++ * Updated to use update-mime (fixes#26532) ++ * Removed dependency on mime-support, as instructed by update-mime(1) ++ * Rebuilt with new libstdc++ ++ ++ -- Hamish Moffatt <hamish@debian.org> Tue, 06 Oct 1998 19:43:00 +1000 ++ ++xpdf (0.7a-1) non-free; urgency=low ++ ++ * Upgraded to new upstream release xpdf-0.7a ++ ++ -- Dirk Eddelbuettel <edd@debian.org> Mon, 2 Mar 1998 19:24:35 -0500 ++ ++xpdf (0.7-3) non-free; urgency=low ++ ++ * Moved to non-free as the copyright violated #3 of the DFSG (fixes #14360) ++ ++ -- Dirk Eddelbuettel <edd@debian.org> Tue, 4 Nov 1997 20:44:26 -0500 ++ ++xpdf (0.7-2) unstable; urgency=low ++ ++ * Compiled with GNU libc2 aka libc6 ++ * Linked against xlib6g and xpm4g (fixes bug #12915) ++ * Uses pristine upstream sources as xpdf_0.7.orig.tar.gz ++ * Upgraded to Debian Policy 2.3.0.0 ++ * Added menu file for xpdf ++ ++ -- Dirk Eddelbuettel <edd@debian.org> Tue, 30 Sep 1997 20:34:09 -0400 ++ ++xpdf (0.7-1) unstable; urgency=low ++ ++ * New upstream release xpdf-0.7 ++ ++ -- Dirk Eddelbuettel <edd@debian.org> Thu, 29 May 1997 21:22:38 -0400 ++ ++xpdf (0.6-1) unstable frozen; urgency=low ++ ++ * New upstream release xpdf-0.6 (fixes bug #4476) ++ ++ * Changed Priority: to optional as per override file on master ++ ++ * Converted package management files to Debian Standard 2.1.1.0 ++ * Changed maintainer email address to <edd@debian.org> ++ ++ -- Dirk Eddelbuettel <edd@debian.org> Sun, 24 Nov 1996 16:50:23 -0500 ++ ++Sat Aug 10 16:22:28 1996 Dirk Eddelbuettel <edd@miles.econ.queensu.ca> ++ ++ * xpdf-0.5-1 release: only changes to Debian package files ++ ++ * debian.control: now Depends on mime-support, suitable postinst ++ and postrm scripts added (with thanks to Brian White); ++ also updated virtual package dependencies, now Provides: a ++ pdf-viewer as well as postscript-preview and Depends changed ++ to X11R6 from elf-x11r6lib ++ ++ * debian.rules: install xpdf.1x, not xpdf.1 ++ ++Mon May 27 20:58:19 1996 Dirk Eddelbuettel <edd@miles.econ.queensu.ca> ++ ++ * xpdf-0.5-0 release: upgraded to upstream version 0.5 ++ ++Sun Apr 28 09:51:02 1996 Dirk Eddelbuettel <edd@miles.econ.queensu.ca> ++ ++ * xpdf-0.4-0 release: upgraded to upstream version 0.4 ++ ++ * debian.control: added Architecture:, changed Section: to text, ++ added note that xpdftops is now included ++ ++Wed Feb 14 21:49:17 1996 Dirk Eddelbuettel <edd@miles.econ.queensu.ca> ++ ++ * xpdf-0.3-1 release ++ ++ * debian.rules: fix location of README to /usr/doc/xpdf (bug#2333) ++ ++Sun Jan 28 17:36:31 1996 Dirk Eddelbuettel <edd@miles.econ.queensu.ca> ++ ++ * xpdf-0.3-0: Initial Debian release ++ +--- xpdf-3.02.orig/debian/xpdf.dirs ++++ xpdf-3.02/debian/xpdf.dirs +@@ -0,0 +1,2 @@ ++usr/share/doc ++usr/share/bug/xpdf +--- xpdf-3.02.orig/debian/xpdf-common.postrm ++++ xpdf-3.02/debian/xpdf-common.postrm +@@ -0,0 +1,9 @@ ++#!/bin/sh ++set -e ++ ++if [ "$1" = "purge" ]; then ++ rm -f /etc/xpdf/includes ++fi ++ ++#DEBHELPER# ++ +--- xpdf-3.02.orig/debian/xpdf.desktop ++++ xpdf-3.02/debian/xpdf.desktop +@@ -0,0 +1,11 @@ ++[Desktop Entry] ++Encoding=UTF-8 ++Name=xpdf ++GenericName=PDF viewer ++Comment=View PDF files ++Exec=xpdf ++Icon=xpdf.xpm ++Terminal=false ++Type=Application ++MimeType=application/pdf; ++Categories=PDFViewer;Viewer;Graphics; +--- xpdf-3.02.orig/debian/xpdf-reader.menu ++++ xpdf-3.02/debian/xpdf-reader.menu +@@ -0,0 +1,8 @@ ++?package(xpdf-reader):\ ++ needs="x11" \ ++ section="Apps/Viewers" \ ++ command="/usr/bin/xpdf" \ ++ title="Xpdf" \ ++ hints="Documents" \ ++ icon="/usr/share/pixmaps/xpdf.xpm" \ ++ longtitle="Xpdf: Portable Document Format (PDF) file viewer for X" +--- xpdf-3.02.orig/debian/xpdf-bug-control ++++ xpdf-3.02/debian/xpdf-bug-control +@@ -0,0 +1 @@ ++Submit-As: xpdf-reader +--- xpdf-3.02.orig/debian/xpdf-reader.dirs ++++ xpdf-3.02/debian/xpdf-reader.dirs +@@ -0,0 +1,7 @@ ++usr/share/doc ++usr/share/applications ++usr/share/man/man1 ++usr/lib/mime/packages ++usr/lib/menu ++usr/bin ++usr/share/pixmaps +--- xpdf-3.02.orig/debian/patches/40_lesstif_copy.dpatch ++++ xpdf-3.02/debian/patches/40_lesstif_copy.dpatch +@@ -0,0 +1,18 @@ ++#! /bin/sh -e ++## DP: make local copy of lesstif headers for use in patch 41 ++ ++dpatch_patch () ++{ ++ mkdir lesstif ++ cp -a /usr/include/Xm lesstif/ ++} ++ ++dpatch_unpatch () ++{ ++ rm -rf lesstif ++} ++ ++DPATCH_LIB_NO_DEFAULT=1 ++ ++. /usr/share/dpatch/dpatch.lib.sh ++ +--- xpdf-3.02.orig/debian/patches/01_manpage.dpatch ++++ xpdf-3.02/debian/patches/01_manpage.dpatch +@@ -0,0 +1,258 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 01_manpage.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: Manual page updates ++ ++@DPATCH@ ++diff -urNad xpdf-3.02~/doc/pdffonts.1 xpdf-3.02/doc/pdffonts.1 ++--- xpdf-3.02~/doc/pdffonts.1 2007-04-25 01:26:52.000000000 +1000 +++++ xpdf-3.02/doc/pdffonts.1 2007-04-25 01:26:55.000000000 +1000 ++@@ -73,9 +73,7 @@ ++ .SH CONFIGURATION FILE ++ Pdffonts reads a configuration file at startup. It first tries to ++ find the user's private config file, ~/.xpdfrc. If that doesn't ++-exist, it looks for a system-wide config file, typically ++-/usr/local/etc/xpdfrc (but this location can be changed when pdffonts ++-is built). See the +++exist, it looks for a system-wide config file, /etc/xpdf/xpdfrc. See the ++ .BR xpdfrc (5) ++ man page for details. ++ .SH OPTIONS ++diff -urNad xpdf-3.02~/doc/pdfimages.1 xpdf-3.02/doc/pdfimages.1 ++--- xpdf-3.02~/doc/pdfimages.1 2007-04-25 01:26:52.000000000 +1000 +++++ xpdf-3.02/doc/pdfimages.1 2007-04-25 01:26:55.000000000 +1000 ++@@ -12,9 +12,9 @@ ++ saves images from a Portable Document Format (PDF) file as Portable ++ Pixmap (PPM), Portable Bitmap (PBM), or JPEG files. ++ .PP ++-Pdfimages reads the PDF file, scans one or more pages, +++Pdfimages reads the PDF file ++ .IR PDF-file , ++-and writes one PPM, PBM, or JPEG file for each image, +++scans one or more pages, and writes one PPM, PBM, or JPEG file for each image, ++ .IR image-root - nnn . xxx , ++ where ++ .I nnn ++@@ -28,9 +28,7 @@ ++ .SH CONFIGURATION FILE ++ Pdfimages reads a configuration file at startup. It first tries to ++ find the user's private config file, ~/.xpdfrc. If that doesn't ++-exist, it looks for a system-wide config file, typically ++-/usr/local/etc/xpdfrc (but this location can be changed when pdfimages ++-is built). See the +++exist, it looks for a system-wide config file, /etc/xpdf/xpdfrc. See the ++ .BR xpdfrc (5) ++ man page for details. ++ .SH OPTIONS ++diff -urNad xpdf-3.02~/doc/pdfinfo.1 xpdf-3.02/doc/pdfinfo.1 ++--- xpdf-3.02~/doc/pdfinfo.1 2007-04-25 01:26:52.000000000 +1000 +++++ xpdf-3.02/doc/pdfinfo.1 2007-04-25 01:26:55.000000000 +1000 ++@@ -71,8 +71,7 @@ ++ .SH CONFIGURATION FILE ++ Pdfinfo reads a configuration file at startup. It first tries to find ++ the user's private config file, ~/.xpdfrc. If that doesn't exist, it ++-looks for a system-wide config file, typically /usr/local/etc/xpdfrc ++-(but this location can be changed when pdfinfo is built). See the +++looks for a system-wide config file, /etc/xpdf/xpdfrc. See the ++ .BR xpdfrc (5) ++ man page for details. ++ .SH OPTIONS ++diff -urNad xpdf-3.02~/doc/pdftoppm.1 xpdf-3.02/doc/pdftoppm.1 ++--- xpdf-3.02~/doc/pdftoppm.1 2007-04-25 01:26:52.000000000 +1000 +++++ xpdf-3.02/doc/pdftoppm.1 2007-04-25 01:26:55.000000000 +1000 ++@@ -24,9 +24,7 @@ ++ .SH CONFIGURATION FILE ++ Pdftoppm reads a configuration file at startup. It first tries to ++ find the user's private config file, ~/.xpdfrc. If that doesn't ++-exist, it looks for a system-wide config file, typically ++-/usr/local/etc/xpdfrc (but this location can be changed when pdftoppm ++-is built). See the +++exist, it looks for a system-wide config file, /etc/xpdf/xpdfrc. See the ++ .BR xpdfrc (5) ++ man page for details. ++ .SH OPTIONS ++diff -urNad xpdf-3.02~/doc/pdftops.1 xpdf-3.02/doc/pdftops.1 ++--- xpdf-3.02~/doc/pdftops.1 2007-04-25 01:26:52.000000000 +1000 +++++ xpdf-3.02/doc/pdftops.1 2007-04-25 01:26:55.000000000 +1000 ++@@ -31,8 +31,7 @@ ++ .SH CONFIGURATION FILE ++ Pdftops reads a configuration file at startup. It first tries to find ++ the user's private config file, ~/.xpdfrc. If that doesn't exist, it ++-looks for a system-wide config file, typically /usr/local/etc/xpdfrc ++-(but this location can be changed when pdftops is built). See the +++looks for a system-wide config file, /etc/xpdf/xpdfrc. See the ++ .BR xpdfrc (5) ++ man page for details. ++ .SH OPTIONS ++diff -urNad xpdf-3.02~/doc/pdftotext.1 xpdf-3.02/doc/pdftotext.1 ++--- xpdf-3.02~/doc/pdftotext.1 2007-04-25 01:26:52.000000000 +1000 +++++ xpdf-3.02/doc/pdftotext.1 2007-04-25 01:26:55.000000000 +1000 ++@@ -28,9 +28,7 @@ ++ .SH CONFIGURATION FILE ++ Pdftotext reads a configuration file at startup. It first tries to ++ find the user's private config file, ~/.xpdfrc. If that doesn't ++-exist, it looks for a system-wide config file, typically ++-/usr/local/etc/xpdfrc (but this location can be changed when pdftotext ++-is built). See the +++exist, it looks for a system-wide config file, /etc/xpdf/xpdfrc. See the ++ .BR xpdfrc (5) ++ man page for details. ++ .SH OPTIONS ++diff -urNad xpdf-3.02~/doc/xpdf.1 xpdf-3.02/doc/xpdf.1 ++--- xpdf-3.02~/doc/xpdf.1 2007-04-25 01:26:52.000000000 +1000 +++++ xpdf-3.02/doc/xpdf.1 2007-04-25 01:26:55.000000000 +1000 ++@@ -7,10 +7,15 @@ ++ [options] ++ .RI [ PDF-file ++ .RI [ page " | +" dest ]] +++.sp +++.B zxpdf +++[options] +++.RI [ PDF-file +++.RI [ page " | +" dest ]] ++ .SH DESCRIPTION ++ .B Xpdf ++ is a viewer for Portable Document Format (PDF) files. (These are also ++-sometimes also called \'Acrobat' files, from the name of Adobe's PDF +++sometimes also called 'Acrobat' files, from the name of Adobe's PDF ++ software.) Xpdf runs under the X Window System on UNIX, VMS, and ++ OS/2. ++ .PP ++@@ -29,7 +34,7 @@ ++ xpdf file.pdf 18 ++ .RE ++ .PP ++-You can also give a named destination, prefixed with \'+' in place of +++You can also give a named destination, prefixed with '+' in place of ++ the page number. (This is only useful with PDF files that provide ++ named destination targets.) ++ .PP ++@@ -38,11 +43,17 @@ ++ .RS ++ xpdf ++ .RE +++.PP +++Compressed files (gz and bz2) may be viewed using the command: +++.PP +++.RS +++zxpdf file.pdf.gz +++.RE +++.PP ++ .SH CONFIGURATION FILE ++ Xpdf reads a configuration file at startup. It first tries to find ++ the user's private config file, ~/.xpdfrc. If that doesn't exist, it ++-looks for a system-wide config file, typically /usr/local/etc/xpdfrc ++-(but this location can be changed when xpdf is built). See the +++looks for a system-wide config file, /etc/xpdf/xpdfrc. See the ++ .BR xpdfrc (5) ++ man page for details. ++ .SH OPTIONS ++@@ -92,8 +103,8 @@ ++ .TP ++ .BI \-z " zoom" ++ Set the initial zoom factor. A number specifies a zoom percentage, ++-where 100 means 72 dpi.You may also specify \'page', to fit the page ++-to the window size, or \'width', to fit the page width to the window +++where 100 means 72 dpi.You may also specify 'page', to fit the page +++to the window size, or 'width', to fit the page width to the window ++ width. ++ .RB "[config file: " initialZoom "; or X resource: " xpdf.initialZoom ] ++ .TP ++@@ -123,7 +134,7 @@ ++ .BI \-ps " PS-file" ++ Set the default file name for PostScript output (i.e., the name which ++ will appear in the print dialog). This can also be of the form ++-\'|command' to pipe the PostScript through a command. +++'|command' to pipe the PostScript through a command. ++ .RB "[config file: " psFile ] ++ .TP ++ .BI \-paper " size" ++@@ -231,7 +242,7 @@ ++ .RB "[X resource: " xpdf*fontList ] ++ .PP ++ The color and font options only affect the user interface elements, ++-not the PDF display (the \'paper'). +++not the PDF display (the 'paper'). ++ .PP ++ The following X resources do not have command line option equivalents: ++ .TP ++@@ -254,7 +265,7 @@ ++ .B "dashed left/right arrow buttons" ++ Move backward or forward along the history path. ++ .TP ++-.B "\'Page' entry box" +++.B "'Page' entry box" ++ Move to a specific page number. Click in the box to activate it, type ++ the page number, then hit return. ++ .TP ++@@ -267,17 +278,17 @@ ++ .B "print button" ++ Bring up a dialog for generating a PostScript file. The dialog has ++ options to set the pages to be printed and the PostScript file name. ++-The file name can be \'-' for stdout or \'|command' to pipe the ++-PostScript through a command, e.g., \'|lpr'. +++The file name can be '-' for stdout or '|command' to pipe the +++PostScript through a command, e.g., '|lpr'. ++ .TP ++-.B "\'?' button" ++-Bring up the \'about xpdf' window. +++.B "'?' button" +++Bring up the 'about xpdf' window. ++ .TP ++ .B "link info" ++-The space between the \'?' and \'Quit' buttons is used to show the URL +++The space between the '?' and 'Quit' buttons is used to show the URL ++ or external file name when the mouse is over a link. ++ .TP ++-.B "\'Quit' button" +++.B "'Quit' button" ++ Quit xpdf. ++ .PP ++ .SS Menu ++@@ -333,9 +344,9 @@ ++ .PP ++ .SS Links ++ Clicking on a hyperlink will jump to the link's destination. A link ++-to another PDF document will make xpdf load that document. A ++-\'launch' link to an executable program will display a dialog, and if ++-you click \'ok', execute the program. URL links call an external +++to another PDF document will make xpdf load that document. A 'launch' +++link to an executable program will display a dialog, and if +++you click 'ok', execute the program. URL links call an external ++ command (see the ++ .B WEB BROWSERS ++ section below). ++@@ -458,7 +469,7 @@ ++ .PP ++ When you click on a URL link in a PDF file, xpdf will execute the ++ command specified by the urlCommand config file option, replacing an ++-occurrence of \'%s' with the URL. For example, to call netscape with +++occurrence of '%s' with the URL. For example, to call netscape with ++ the URL, add this line to your config file: ++ .PP ++ .RS ++@@ -809,8 +820,8 @@ ++ xpdf -remote myServer file.pdf ++ .RE ++ .PP ++-If there is currently no xpdf running in server mode with the name ++-\'myServer', a new xpdf window will be opened. If another command: +++If there is currently no xpdf running in server mode with the name 'myServer', +++a new xpdf window will be opened. If another command: ++ .PP ++ .RS ++ xpdf -remote myServer another.pdf 9 ++diff -urNad xpdf-3.02~/doc/xpdfrc.5 xpdf-3.02/doc/xpdfrc.5 ++--- xpdf-3.02~/doc/xpdfrc.5 2007-02-28 09:05:51.000000000 +1100 +++++ xpdf-3.02/doc/xpdfrc.5 2007-04-25 01:28:30.000000000 +1000 ++@@ -19,6 +19,9 @@ ++ .PP ++ The following sections list all of the configuration options, sorted ++ into functional groups. There is an examples section at the end. +++.PP +++Note that all settings are case-sensitive; in particular, boolean options +++are "yes" and "no" (rather than "Yes" or "No"). ++ .SH INCLUDE FILES ++ .TP ++ .BI include " config\-file" +--- xpdf-3.02.orig/debian/patches/00list ++++ xpdf-3.02/debian/patches/00list +@@ -0,0 +1,24 @@ ++01_manpage.dpatch ++02_permissions.dpatch ++#10_add_accelerators.dpatch # doesn't work ++ ++# Security fixes: ++#04_freetype-glyph.dpatch # Not obvious ++#05_gmem.dpatch # Not obvious ++#06_splashpath.dpatch # Not obvious ++#07_decrypt.dpatch # Not obvious ++#08_core_action.dpatch # Not obvious ++#23_security3.dpatch # Not obvious ++ ++# Lesstif bug#377230 workaround: ++40_lesstif_copy.dpatch ++41_lesstif_cpp.dpatch ++ ++# Final cleanup: ++99_autoconf.dpatch ++ ++# Fix CVE-2007-3387 and CVE-2007-5049 ++fix-CVE-2007-3387_CVE-2007-5049.dpatch ++ ++# Fix CVE-2007-5393, CVE-2007-5392, CVE-2007-4352 ++fix-CVE-2007-5393_2007-5392_2007-4352.dpatch +--- xpdf-3.02.orig/debian/patches/02_permissions.dpatch ++++ xpdf-3.02/debian/patches/02_permissions.dpatch +@@ -0,0 +1,176 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## permissions.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: Remove PDF file permission checks ++ ++@DPATCH@ ++diff -urNad xpdf-3.02~/xpdf/PDFCore.cc xpdf-3.02/xpdf/PDFCore.cc ++--- xpdf-3.02~/xpdf/PDFCore.cc 2007-02-28 09:05:52.000000000 +1100 +++++ xpdf-3.02/xpdf/PDFCore.cc 2007-04-24 23:43:59.000000000 +1000 ++@@ -4,6 +4,8 @@ ++ // ++ // Copyright 2004 Glyph & Cog, LLC ++ // +++// Modified for Debian by Hamish Moffatt, 18 August 2005. +++// ++ //======================================================================== ++ ++ #include <aconf.h> ++@@ -1563,9 +1565,11 @@ ++ int x0, y0, x1, y1, t; ++ GString *s; ++ +++#ifdef ENFORCE_PERMISSIONS ++ if (!doc->okToCopy()) { ++ return NULL; ++ } +++#endif ++ if ((page = findPage(pg))) { ++ cvtUserToDev(pg, xMin, yMin, &x0, &y0); ++ cvtUserToDev(pg, xMax, yMax, &x1, &y1); ++diff -urNad xpdf-3.02~/xpdf/XPDFCore.cc xpdf-3.02/xpdf/XPDFCore.cc ++--- xpdf-3.02~/xpdf/XPDFCore.cc 2007-02-28 09:05:52.000000000 +1100 +++++ xpdf-3.02/xpdf/XPDFCore.cc 2007-04-24 23:46:39.000000000 +1000 ++@@ -4,6 +4,8 @@ ++ // ++ // Copyright 2002-2003 Glyph & Cog, LLC ++ // +++// Modified for Debian by Hamish Moffatt, 22 May 2002. +++// ++ //======================================================================== ++ ++ #include <aconf.h> ++@@ -384,11 +386,15 @@ ++ #ifndef NO_TEXT_SELECT ++ if (selectULX != selectLRX && ++ selectULY != selectLRY) { +++#ifdef ENFORCE_PERMISSIONS ++ if (doc->okToCopy()) { ++ copySelection(); ++ } else { ++ error(-1, "Copying of text from this document is not allowed."); ++ } +++#else +++ copySelection(); +++#endif ++ } ++ #endif ++ } ++@@ -407,9 +413,11 @@ ++ int pg; ++ double ulx, uly, lrx, lry; ++ +++#ifdef ENFORCE_PERMISSIONS ++ if (!doc->okToCopy()) { ++ return; ++ } +++#endif ++ if (getSelection(&pg, &ulx, &uly, &lrx, &lry)) { ++ //~ for multithreading: need a mutex here ++ if (currentSelection) { ++diff -urNad xpdf-3.02~/xpdf/XPDFViewer.cc xpdf-3.02/xpdf/XPDFViewer.cc ++--- xpdf-3.02~/xpdf/XPDFViewer.cc 2007-02-28 09:05:52.000000000 +1100 +++++ xpdf-3.02/xpdf/XPDFViewer.cc 2007-04-24 23:43:59.000000000 +1000 ++@@ -4,6 +4,8 @@ ++ // ++ // Copyright 2002-2003 Glyph & Cog, LLC ++ // +++// Modified for Debian by Hamish Moffatt, 22 May 2002. +++// ++ //======================================================================== ++ ++ #include <aconf.h> ++@@ -3406,10 +3408,12 @@ ++ PSOutputDev *psOut; ++ ++ doc = viewer->core->getDoc(); +++#ifdef ENFORCE_PERMISSIONS ++ if (!doc->okToPrint()) { ++ error(-1, "Printing this document is not allowed."); ++ return; ++ } +++#endif ++ ++ viewer->core->setBusyCursor(gTrue); ++ ++diff -urNad xpdf-3.02~/xpdf/pdfimages.cc xpdf-3.02/xpdf/pdfimages.cc ++--- xpdf-3.02~/xpdf/pdfimages.cc 2007-02-28 09:05:52.000000000 +1100 +++++ xpdf-3.02/xpdf/pdfimages.cc 2007-04-24 23:43:59.000000000 +1000 ++@@ -4,6 +4,8 @@ ++ // ++ // Copyright 1998-2003 Glyph & Cog, LLC ++ // +++// Modified for Debian by Hamish Moffatt, 22 May 2002. +++// ++ //======================================================================== ++ ++ #include <aconf.h> ++@@ -119,11 +121,13 @@ ++ } ++ ++ // check for copy permission +++#ifdef ENFORCE_PERMISSIONS ++ if (!doc->okToCopy()) { ++ error(-1, "Copying of images from this document is not allowed."); ++ exitCode = 3; ++ goto err1; ++ } +++#endif ++ ++ // get page range ++ if (firstPage < 1) ++diff -urNad xpdf-3.02~/xpdf/pdftops.cc xpdf-3.02/xpdf/pdftops.cc ++--- xpdf-3.02~/xpdf/pdftops.cc 2007-02-28 09:05:52.000000000 +1100 +++++ xpdf-3.02/xpdf/pdftops.cc 2007-04-24 23:43:59.000000000 +1000 ++@@ -4,6 +4,8 @@ ++ // ++ // Copyright 1996-2003 Glyph & Cog, LLC ++ // +++// Modified for Debian by Hamish Moffatt, 22 May 2002. +++// ++ //======================================================================== ++ ++ #include <aconf.h> ++@@ -278,12 +280,14 @@ ++ goto err1; ++ } ++ +++#ifdef ENFORCE_PERMISSIONS ++ // check for print permission ++ if (!doc->okToPrint()) { ++ error(-1, "Printing this document is not allowed."); ++ exitCode = 3; ++ goto err1; ++ } +++#endif ++ ++ // construct PostScript file name ++ if (argc == 3) { ++diff -urNad xpdf-3.02~/xpdf/pdftotext.cc xpdf-3.02/xpdf/pdftotext.cc ++--- xpdf-3.02~/xpdf/pdftotext.cc 2007-02-28 09:05:52.000000000 +1100 +++++ xpdf-3.02/xpdf/pdftotext.cc 2007-04-24 23:43:59.000000000 +1000 ++@@ -4,6 +4,8 @@ ++ // ++ // Copyright 1997-2003 Glyph & Cog, LLC ++ // +++// Modified for Debian by Hamish Moffatt, 22 May 2002. +++// ++ //======================================================================== ++ ++ #include <aconf.h> ++@@ -160,12 +162,14 @@ ++ goto err2; ++ } ++ +++#ifdef ENFORCE_PERMISSIONS ++ // check for copy permission ++ if (!doc->okToCopy()) { ++ error(-1, "Copying of text from this document is not allowed."); ++ exitCode = 3; ++ goto err2; ++ } +++#endif ++ ++ // construct text file name ++ if (argc == 3) { +--- xpdf-3.02.orig/debian/patches/fix-CVE-2007-5393_2007-5392_2007-4352.dpatch ++++ xpdf-3.02/debian/patches/fix-CVE-2007-5393_2007-5392_2007-4352.dpatch +@@ -0,0 +1,652 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## fix-CVE-2007-5393_2007-5392_2007-4352.dpatch by Nico Golde <nion@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: No description. ++ ++@DPATCH@ ++diff -urNad xpdf-3.02~/xpdf/Stream.cc xpdf-3.02/xpdf/Stream.cc ++--- xpdf-3.02~/xpdf/Stream.cc 2007-02-27 23:05:52.000000000 +0100 +++++ xpdf-3.02/xpdf/Stream.cc 2007-11-09 09:20:09.000000000 +0100 ++@@ -1245,23 +1245,26 @@ ++ columns = columnsA; ++ if (columns < 1) { ++ columns = 1; ++- } ++- if (columns + 4 <= 0) { ++- columns = INT_MAX - 4; +++ } else if (columns > INT_MAX - 2) { +++ columns = INT_MAX - 2; ++ } ++ rows = rowsA; ++ endOfBlock = endOfBlockA; ++ black = blackA; ++- refLine = (short *)gmallocn(columns + 3, sizeof(short)); ++- codingLine = (short *)gmallocn(columns + 2, sizeof(short)); +++ // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = columns +++ // ---> max codingLine size = columns + 1 +++ // refLine has one extra guard entry at the end +++ // ---> max refLine size = columns + 2 +++ codingLine = (int *)gmallocn(columns + 1, sizeof(int)); +++ refLine = (int *)gmallocn(columns + 2, sizeof(int)); ++ ++ eof = gFalse; ++ row = 0; ++ nextLine2D = encoding < 0; ++ inputBits = 0; ++- codingLine[0] = 0; ++- codingLine[1] = refLine[2] = columns; ++- a0 = 1; +++ codingLine[0] = columns; +++ a0i = 0; +++ outputBits = 0; ++ ++ buf = EOF; ++ } ++@@ -1280,9 +1283,9 @@ ++ row = 0; ++ nextLine2D = encoding < 0; ++ inputBits = 0; ++- codingLine[0] = 0; ++- codingLine[1] = columns; ++- a0 = 1; +++ codingLine[0] = columns; +++ a0i = 0; +++ outputBits = 0; ++ buf = EOF; ++ ++ // skip any initial zero bits and end-of-line marker, and get the 2D ++@@ -1299,211 +1302,230 @@ ++ } ++ } ++ +++inline void CCITTFaxStream::addPixels(int a1, int blackPixels) { +++ if (a1 > codingLine[a0i]) { +++ if (a1 > columns) { +++ error(getPos(), "CCITTFax row is wrong length (%d)", a1); +++ err = gTrue; +++ a1 = columns; +++ } +++ if ((a0i & 1) ^ blackPixels) { +++ ++a0i; +++ } +++ codingLine[a0i] = a1; +++ } +++} +++ +++inline void CCITTFaxStream::addPixelsNeg(int a1, int blackPixels) { +++ if (a1 > codingLine[a0i]) { +++ if (a1 > columns) { +++ error(getPos(), "CCITTFax row is wrong length (%d)", a1); +++ err = gTrue; +++ a1 = columns; +++ } +++ if ((a0i & 1) ^ blackPixels) { +++ ++a0i; +++ } +++ codingLine[a0i] = a1; +++ } else if (a1 < codingLine[a0i]) { +++ if (a1 < 0) { +++ error(getPos(), "Invalid CCITTFax code"); +++ err = gTrue; +++ a1 = 0; +++ } +++ while (a0i > 0 && a1 <= codingLine[a0i - 1]) { +++ --a0i; +++ } +++ codingLine[a0i] = a1; +++ } +++} +++ ++ int CCITTFaxStream::lookChar() { ++ short code1, code2, code3; ++- int a0New; ++- GBool err, gotEOL; ++- int ret; ++- int bits, i; +++ int b1i, blackPixels, i, bits; +++ GBool gotEOL; ++ ++- // if at eof just return EOF ++- if (eof && codingLine[a0] >= columns) { ++- return EOF; +++ if (buf != EOF) { +++ return buf; ++ } ++ ++ // read the next row ++- err = gFalse; ++- if (codingLine[a0] >= columns) { +++ if (outputBits == 0) { +++ +++ // if at eof just return EOF +++ if (eof) { +++ return EOF; +++ } +++ +++ err = gFalse; ++ ++ // 2-D encoding ++ if (nextLine2D) { ++- // state: ++- // a0New = current position in coding line (0 <= a0New <= columns) ++- // codingLine[a0] = last change in coding line ++- // (black-to-white if a0 is even, ++- // white-to-black if a0 is odd) ++- // refLine[b1] = next change in reference line of opposite color ++- // to a0 ++- // invariants: ++- // 0 <= codingLine[a0] <= a0New ++- // <= refLine[b1] <= refLine[b1+1] <= columns ++- // 0 <= a0 <= columns+1 ++- // refLine[0] = 0 ++- // refLine[n] = refLine[n+1] = columns ++- // -- for some 1 <= n <= columns+1 ++- // end condition: ++- // 0 = codingLine[0] <= codingLine[1] < codingLine[2] < ... ++- // < codingLine[n-1] < codingLine[n] = columns ++- // -- where 1 <= n <= columns+1 ++ for (i = 0; codingLine[i] < columns; ++i) { ++ refLine[i] = codingLine[i]; ++ } ++- refLine[i] = refLine[i + 1] = columns; ++- b1 = 1; ++- a0New = codingLine[a0 = 0] = 0; ++- do { +++ refLine[i++] = columns; +++ refLine[i] = columns; +++ codingLine[0] = 0; +++ a0i = 0; +++ b1i = 0; +++ blackPixels = 0; +++ // invariant: +++ // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] +++ // <= columns +++ // exception at left edge: +++ // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible +++ // exception at right edge: +++ // refLine[b1i] = refLine[b1i+1] = columns is possible +++ while (codingLine[a0i] < columns) { ++ code1 = getTwoDimCode(); ++ switch (code1) { ++ case twoDimPass: ++- if (refLine[b1] < columns) { ++- a0New = refLine[b1 + 1]; ++- b1 += 2; +++ addPixels(refLine[b1i + 1], blackPixels); +++ if (refLine[b1i + 1] < columns) { +++ b1i += 2; ++ } ++ break; ++ case twoDimHoriz: ++- if ((a0 & 1) == 0) { ++- code1 = code2 = 0; +++ code1 = code2 = 0; +++ if (blackPixels) { ++ do { ++- code1 += code3 = getWhiteCode(); +++ code1 += code3 = getBlackCode(); ++ } while (code3 >= 64); ++ do { ++- code2 += code3 = getBlackCode(); +++ code2 += code3 = getWhiteCode(); ++ } while (code3 >= 64); ++ } else { ++- code1 = code2 = 0; ++ do { ++- code1 += code3 = getBlackCode(); +++ code1 += code3 = getWhiteCode(); ++ } while (code3 >= 64); ++ do { ++- code2 += code3 = getWhiteCode(); +++ code2 += code3 = getBlackCode(); ++ } while (code3 >= 64); ++ } ++- if (code1 > 0 || code2 > 0) { ++- if (a0New + code1 <= columns) { ++- codingLine[a0 + 1] = a0New + code1; ++- } else { ++- codingLine[a0 + 1] = columns; ++- } ++- ++a0; ++- if (codingLine[a0] + code2 <= columns) { ++- codingLine[a0 + 1] = codingLine[a0] + code2; ++- } else { ++- codingLine[a0 + 1] = columns; ++- } ++- ++a0; ++- a0New = codingLine[a0]; ++- while (refLine[b1] <= a0New && refLine[b1] < columns) { ++- b1 += 2; +++ addPixels(codingLine[a0i] + code1, blackPixels); +++ if (codingLine[a0i] < columns) { +++ addPixels(codingLine[a0i] + code2, blackPixels ^ 1); +++ } +++ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +++ b1i += 2; +++ } +++ break; +++ case twoDimVertR3: +++ addPixels(refLine[b1i] + 3, blackPixels); +++ blackPixels ^= 1; +++ if (codingLine[a0i] < columns) { +++ ++b1i; +++ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +++ b1i += 2; ++ } ++ } ++ break; ++- case twoDimVert0: ++- if (refLine[b1] < columns) { ++- a0New = codingLine[++a0] = refLine[b1]; ++- ++b1; ++- while (refLine[b1] <= a0New && refLine[b1] < columns) { ++- b1 += 2; +++ case twoDimVertR2: +++ addPixels(refLine[b1i] + 2, blackPixels); +++ blackPixels ^= 1; +++ if (codingLine[a0i] < columns) { +++ ++b1i; +++ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +++ b1i += 2; ++ } ++- } else { ++- a0New = codingLine[++a0] = columns; ++ } ++ break; ++ case twoDimVertR1: ++- if (refLine[b1] + 1 < columns) { ++- a0New = codingLine[++a0] = refLine[b1] + 1; ++- ++b1; ++- while (refLine[b1] <= a0New && refLine[b1] < columns) { ++- b1 += 2; +++ addPixels(refLine[b1i] + 1, blackPixels); +++ blackPixels ^= 1; +++ if (codingLine[a0i] < columns) { +++ ++b1i; +++ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +++ b1i += 2; ++ } ++- } else { ++- a0New = codingLine[++a0] = columns; ++ } ++ break; ++- case twoDimVertL1: ++- if (refLine[b1] - 1 > a0New || (a0 == 0 && refLine[b1] == 1)) { ++- a0New = codingLine[++a0] = refLine[b1] - 1; ++- --b1; ++- while (refLine[b1] <= a0New && refLine[b1] < columns) { ++- b1 += 2; +++ case twoDimVert0: +++ addPixels(refLine[b1i], blackPixels); +++ blackPixels ^= 1; +++ if (codingLine[a0i] < columns) { +++ ++b1i; +++ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +++ b1i += 2; ++ } ++ } ++ break; ++- case twoDimVertR2: ++- if (refLine[b1] + 2 < columns) { ++- a0New = codingLine[++a0] = refLine[b1] + 2; ++- ++b1; ++- while (refLine[b1] <= a0New && refLine[b1] < columns) { ++- b1 += 2; +++ case twoDimVertL3: +++ addPixelsNeg(refLine[b1i] - 3, blackPixels); +++ blackPixels ^= 1; +++ if (codingLine[a0i] < columns) { +++ if (b1i > 0) { +++ --b1i; +++ } else { +++ ++b1i; +++ } +++ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +++ b1i += 2; ++ } ++- } else { ++- a0New = codingLine[++a0] = columns; ++ } ++ break; ++ case twoDimVertL2: ++- if (refLine[b1] - 2 > a0New || (a0 == 0 && refLine[b1] == 2)) { ++- a0New = codingLine[++a0] = refLine[b1] - 2; ++- --b1; ++- while (refLine[b1] <= a0New && refLine[b1] < columns) { ++- b1 += 2; +++ addPixelsNeg(refLine[b1i] - 2, blackPixels); +++ blackPixels ^= 1; +++ if (codingLine[a0i] < columns) { +++ if (b1i > 0) { +++ --b1i; +++ } else { +++ ++b1i; ++ } ++- } ++- break; ++- case twoDimVertR3: ++- if (refLine[b1] + 3 < columns) { ++- a0New = codingLine[++a0] = refLine[b1] + 3; ++- ++b1; ++- while (refLine[b1] <= a0New && refLine[b1] < columns) { ++- b1 += 2; +++ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +++ b1i += 2; ++ } ++- } else { ++- a0New = codingLine[++a0] = columns; ++ } ++ break; ++- case twoDimVertL3: ++- if (refLine[b1] - 3 > a0New || (a0 == 0 && refLine[b1] == 3)) { ++- a0New = codingLine[++a0] = refLine[b1] - 3; ++- --b1; ++- while (refLine[b1] <= a0New && refLine[b1] < columns) { ++- b1 += 2; +++ case twoDimVertL1: +++ addPixelsNeg(refLine[b1i] - 1, blackPixels); +++ blackPixels ^= 1; +++ if (codingLine[a0i] < columns) { +++ if (b1i > 0) { +++ --b1i; +++ } else { +++ ++b1i; +++ } +++ while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { +++ b1i += 2; ++ } ++ } ++ break; ++ case EOF: +++ addPixels(columns, 0); ++ eof = gTrue; ++- codingLine[a0 = 0] = columns; ++- return EOF; +++ break; ++ default: ++ error(getPos(), "Bad 2D code %04x in CCITTFax stream", code1); +++ addPixels(columns, 0); ++ err = gTrue; ++ break; ++ } ++- } while (codingLine[a0] < columns); +++ } ++ ++ // 1-D encoding ++ } else { ++- codingLine[a0 = 0] = 0; ++- while (1) { +++ codingLine[0] = 0; +++ a0i = 0; +++ blackPixels = 0; +++ while (codingLine[a0i] < columns) { ++ code1 = 0; ++- do { ++- code1 += code3 = getWhiteCode(); ++- } while (code3 >= 64); ++- codingLine[a0+1] = codingLine[a0] + code1; ++- ++a0; ++- if (codingLine[a0] >= columns) { ++- break; ++- } ++- code2 = 0; ++- do { ++- code2 += code3 = getBlackCode(); ++- } while (code3 >= 64); ++- codingLine[a0+1] = codingLine[a0] + code2; ++- ++a0; ++- if (codingLine[a0] >= columns) { ++- break; +++ if (blackPixels) { +++ do { +++ code1 += code3 = getBlackCode(); +++ } while (code3 >= 64); +++ } else { +++ do { +++ code1 += code3 = getWhiteCode(); +++ } while (code3 >= 64); ++ } +++ addPixels(codingLine[a0i] + code1, blackPixels); +++ blackPixels ^= 1; ++ } ++ } ++ ++- if (codingLine[a0] != columns) { ++- error(getPos(), "CCITTFax row is wrong length (%d)", codingLine[a0]); ++- // force the row to be the correct length ++- while (codingLine[a0] > columns) { ++- --a0; ++- } ++- codingLine[++a0] = columns; ++- err = gTrue; ++- } ++- ++ // byte-align the row ++ if (byteAlign) { ++ inputBits &= ~7; ++@@ -1562,14 +1584,17 @@ ++ // this if we know the stream contains end-of-line markers because ++ // the "just plow on" technique tends to work better otherwise ++ } else if (err && endOfLine) { ++- do { +++ while (1) { +++ code1 = lookBits(13); ++ if (code1 == EOF) { ++ eof = gTrue; ++ return EOF; ++ } +++ if ((code1 >> 1) == 0x001) { +++ break; +++ } ++ eatBits(1); ++- code1 = lookBits(13); ++- } while ((code1 >> 1) != 0x001); +++ } ++ eatBits(12); ++ if (encoding > 0) { ++ eatBits(1); ++@@ -1577,11 +1602,11 @@ ++ } ++ } ++ ++- a0 = 0; ++- outputBits = codingLine[1] - codingLine[0]; ++- if (outputBits == 0) { ++- a0 = 1; ++- outputBits = codingLine[2] - codingLine[1]; +++ // set up for output +++ if (codingLine[0] > 0) { +++ outputBits = codingLine[a0i = 0]; +++ } else { +++ outputBits = codingLine[a0i = 1]; ++ } ++ ++ ++row; ++@@ -1589,39 +1614,43 @@ ++ ++ // get a byte ++ if (outputBits >= 8) { ++- ret = ((a0 & 1) == 0) ? 0xff : 0x00; ++- if ((outputBits -= 8) == 0) { ++- ++a0; ++- if (codingLine[a0] < columns) { ++- outputBits = codingLine[a0 + 1] - codingLine[a0]; ++- } +++ buf = (a0i & 1) ? 0x00 : 0xff; +++ outputBits -= 8; +++ if (outputBits == 0 && codingLine[a0i] < columns) { +++ ++a0i; +++ outputBits = codingLine[a0i] - codingLine[a0i - 1]; ++ } ++ } else { ++ bits = 8; ++- ret = 0; +++ buf = 0; ++ do { ++ if (outputBits > bits) { ++- i = bits; ++- bits = 0; ++- if ((a0 & 1) == 0) { ++- ret |= 0xff >> (8 - i); +++ buf <<= bits; +++ if (!(a0i & 1)) { +++ buf |= 0xff >> (8 - bits); ++ } ++- outputBits -= i; +++ outputBits -= bits; +++ bits = 0; ++ } else { ++- i = outputBits; ++- bits -= outputBits; ++- if ((a0 & 1) == 0) { ++- ret |= (0xff >> (8 - i)) << bits; +++ buf <<= outputBits; +++ if (!(a0i & 1)) { +++ buf |= 0xff >> (8 - outputBits); ++ } +++ bits -= outputBits; ++ outputBits = 0; ++- ++a0; ++- if (codingLine[a0] < columns) { ++- outputBits = codingLine[a0 + 1] - codingLine[a0]; +++ if (codingLine[a0i] < columns) { +++ ++a0i; +++ outputBits = codingLine[a0i] - codingLine[a0i - 1]; +++ } else if (bits > 0) { +++ buf <<= bits; +++ bits = 0; ++ } ++ } ++- } while (bits > 0 && codingLine[a0] < columns); +++ } while (bits); +++ } +++ if (black) { +++ buf ^= 0xff; ++ } ++- buf = black ? (ret ^ 0xff) : ret; ++ return buf; ++ } ++ ++@@ -1663,6 +1692,9 @@ ++ code = 0; // make gcc happy ++ if (endOfBlock) { ++ code = lookBits(12); +++ if (code == EOF) { +++ return 1; +++ } ++ if ((code >> 5) == 0) { ++ p = &whiteTab1[code]; ++ } else { ++@@ -1675,6 +1707,9 @@ ++ } else { ++ for (n = 1; n <= 9; ++n) { ++ code = lookBits(n); +++ if (code == EOF) { +++ return 1; +++ } ++ if (n < 9) { ++ code <<= 9 - n; ++ } ++@@ -1686,6 +1721,9 @@ ++ } ++ for (n = 11; n <= 12; ++n) { ++ code = lookBits(n); +++ if (code == EOF) { +++ return 1; +++ } ++ if (n < 12) { ++ code <<= 12 - n; ++ } ++@@ -1711,9 +1749,12 @@ ++ code = 0; // make gcc happy ++ if (endOfBlock) { ++ code = lookBits(13); +++ if (code == EOF) { +++ return 1; +++ } ++ if ((code >> 7) == 0) { ++ p = &blackTab1[code]; ++- } else if ((code >> 9) == 0) { +++ } else if ((code >> 9) == 0 && (code >> 7) != 0) { ++ p = &blackTab2[(code >> 1) - 64]; ++ } else { ++ p = &blackTab3[code >> 7]; ++@@ -1725,6 +1766,9 @@ ++ } else { ++ for (n = 2; n <= 6; ++n) { ++ code = lookBits(n); +++ if (code == EOF) { +++ return 1; +++ } ++ if (n < 6) { ++ code <<= 6 - n; ++ } ++@@ -1736,6 +1780,9 @@ ++ } ++ for (n = 7; n <= 12; ++n) { ++ code = lookBits(n); +++ if (code == EOF) { +++ return 1; +++ } ++ if (n < 12) { ++ code <<= 12 - n; ++ } ++@@ -1749,6 +1796,9 @@ ++ } ++ for (n = 10; n <= 13; ++n) { ++ code = lookBits(n); +++ if (code == EOF) { +++ return 1; +++ } ++ if (n < 13) { ++ code <<= 13 - n; ++ } ++@@ -1963,6 +2013,12 @@ ++ // allocate a buffer for the whole image ++ bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth; ++ bufHeight = ((height + mcuHeight - 1) / mcuHeight) * mcuHeight; +++ if (bufWidth <= 0 || bufHeight <= 0 || +++ bufWidth > INT_MAX / bufWidth / (int)sizeof(int)) { +++ error(getPos(), "Invalid image size in DCT stream"); +++ y = height; +++ return; +++ } ++ for (i = 0; i < numComps; ++i) { ++ frameBuf[i] = (int *)gmallocn(bufWidth * bufHeight, sizeof(int)); ++ memset(frameBuf[i], 0, bufWidth * bufHeight * sizeof(int)); ++@@ -3038,6 +3094,11 @@ ++ } ++ scanInfo.firstCoeff = str->getChar(); ++ scanInfo.lastCoeff = str->getChar(); +++ if (scanInfo.firstCoeff < 0 || scanInfo.lastCoeff > 63 || +++ scanInfo.firstCoeff > scanInfo.lastCoeff) { +++ error(getPos(), "Bad DCT coefficient numbers in scan info block"); +++ return gFalse; +++ } ++ c = str->getChar(); ++ scanInfo.ah = (c >> 4) & 0x0f; ++ scanInfo.al = c & 0x0f; ++diff -urNad xpdf-3.02~/xpdf/Stream.h xpdf-3.02/xpdf/Stream.h ++--- xpdf-3.02~/xpdf/Stream.h 2007-02-27 23:05:52.000000000 +0100 +++++ xpdf-3.02/xpdf/Stream.h 2007-11-09 09:20:09.000000000 +0100 ++@@ -528,13 +528,15 @@ ++ int row; // current row ++ int inputBuf; // input buffer ++ int inputBits; // number of bits in input buffer ++- short *refLine; // reference line changing elements ++- int b1; // index into refLine ++- short *codingLine; // coding line changing elements ++- int a0; // index into codingLine +++ int *codingLine; // coding line changing elements +++ int *refLine; // reference line changing elements +++ int a0i; // index into codingLine +++ GBool err; // error on current line ++ int outputBits; // remaining ouput bits ++ int buf; // character buffer ++ +++ void addPixels(int a1, int black); +++ void addPixelsNeg(int a1, int black); ++ short getTwoDimCode(); ++ short getWhiteCode(); ++ short getBlackCode(); +--- xpdf-3.02.orig/debian/patches/10_add_accelerators.dpatch ++++ xpdf-3.02/debian/patches/10_add_accelerators.dpatch +@@ -0,0 +1,33 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 10_add_accelerators.dpatch by <hamish@noddy.cloud.net.au> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: Add keyboard accelerators for rotate (#385962) ++ ++@DPATCH@ ++diff -urNad xpdf-3.02~/xpdf/XPDFViewer.cc xpdf-3.02/xpdf/XPDFViewer.cc ++--- xpdf-3.02~/xpdf/XPDFViewer.cc 2007-04-25 01:40:50.000000000 +1000 +++++ xpdf-3.02/xpdf/XPDFViewer.cc 2007-04-25 01:42:13.000000000 +1000 ++@@ -1958,16 +1958,22 @@ ++ n = 0; ++ s = XmStringCreateLocalized("Rotate counterclockwise"); ++ XtSetArg(args[n], XmNlabelString, s); ++n; +++ s2 = XmStringCreateLocalized("["); +++ XtSetArg(args[n], XmNacceleratorText, s2); ++n; ++ btn = XmCreatePushButton(popupMenu, "rotateCCW", args, n); ++ XmStringFree(s); +++ XmStringFree(s2); ++ XtManageChild(btn); ++ XtAddCallback(btn, XmNactivateCallback, ++ &rotateCCWCbk, (XtPointer)this); ++ n = 0; ++ s = XmStringCreateLocalized("Rotate clockwise"); ++ XtSetArg(args[n], XmNlabelString, s); ++n; +++ s2 = XmStringCreateLocalized("]"); +++ XtSetArg(args[n], XmNacceleratorText, s2); ++n; ++ btn = XmCreatePushButton(popupMenu, "rotateCW", args, n); ++ XmStringFree(s); +++ XmStringFree(s2); ++ XtManageChild(btn); ++ XtAddCallback(btn, XmNactivateCallback, ++ &rotateCWCbk, (XtPointer)this); +--- xpdf-3.02.orig/debian/patches/fix-CVE-2007-3387_CVE-2007-5049.dpatch ++++ xpdf-3.02/debian/patches/fix-CVE-2007-3387_CVE-2007-5049.dpatch +@@ -0,0 +1,31 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## fix-CVE-2007-3387_CVE-2007-5049.dpatch by Nico Golde <nion@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: No description. ++ ++@DPATCH@ ++diff -urNad xpdf-3.02~/xpdf/Stream.cc xpdf-3.02/xpdf/Stream.cc ++--- xpdf-3.02~/xpdf/Stream.cc 2007-02-27 23:05:52.000000000 +0100 +++++ xpdf-3.02/xpdf/Stream.cc 2007-09-27 12:04:52.000000000 +0200 ++@@ -410,15 +410,13 @@ ++ ok = gFalse; ++ ++ nVals = width * nComps; ++- if (width <= 0 || nComps <= 0 || nBits <= 0 || ++- nComps >= INT_MAX / nBits || ++- width >= INT_MAX / nComps / nBits || ++- nVals * nBits + 7 < 0) { ++- return; ++- } ++ pixBytes = (nComps * nBits + 7) >> 3; ++ rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes; ++- if (rowBytes <= 0) { +++ if (width <= 0 || nComps <= 0 || nBits <= 0 || +++ nComps > gfxColorMaxComps || +++ nBits > 16 || +++ width >= INT_MAX / nComps || // check for overflow in nVals +++ nVals >= (INT_MAX - 7) / nBits) { // check for overflow in rowBytes ++ return; ++ } ++ predLine = (Guchar *)gmalloc(rowBytes); +--- xpdf-3.02.orig/debian/patches/99_autoconf.dpatch ++++ xpdf-3.02/debian/patches/99_autoconf.dpatch +@@ -0,0 +1,19 @@ ++#! /bin/sh -e ++## DP: run aclocal and autoconf ++ ++dpatch_patch () ++{ ++ tar cf debian/patched/autoconf.tar configure aclocal.m4 ++ aclocal-1.9 -I . ++ autoconf ++} ++ ++dpatch_unpatch () ++{ ++ tar xf debian/patched/autoconf.tar ++} ++ ++DPATCH_LIB_NO_DEFAULT=1 ++ ++. /usr/share/dpatch/dpatch.lib.sh ++ +--- xpdf-3.02.orig/debian/patches/41_lesstif_cpp.dpatch ++++ xpdf-3.02/debian/patches/41_lesstif_cpp.dpatch +@@ -0,0 +1,30 @@ ++#! /bin/sh /usr/share/dpatch/dpatch-run ++## 41_lesstif_cpp.dpatch by <hamish@debian.org> ++## ++## All lines beginning with `## DP:' are a description of the patch. ++## DP: Work around mixed C/C++ linkages in lesstif - #377230 ++ ++@DPATCH@ ++diff -urNad xpdf-3.01~/lesstif/Xm/VendorSP.h xpdf-3.01/lesstif/Xm/VendorSP.h ++--- xpdf-3.01~/lesstif/Xm/VendorSP.h 2006-05-28 08:30:56.000000000 +1000 +++++ xpdf-3.01/lesstif/Xm/VendorSP.h 2006-07-15 14:42:38.000000000 +1000 ++@@ -30,10 +30,6 @@ ++ #include <Xm/VendorS.h> ++ #include <X11/ShellP.h> ++ ++-#ifdef __cplusplus ++-extern "C" { ++-#endif ++- ++ XMLIBEXPORT extern Cardinal _XmFilterResources(XtResource *resources, ++ Cardinal numResources, ++ WidgetClass filterClass, ++@@ -58,8 +54,5 @@ ++ XMLIBEXPORT extern VendorShellClassRec vendorShellClassRec; ++ ++ ++-#ifdef __cplusplus ++-} ++-#endif ++ ++ #endif /* _XM_VENDORSP_H */ +--- xpdf-3.02.orig/debian/zxpdf ++++ xpdf-3.02/debian/zxpdf +@@ -0,0 +1,52 @@ ++#!/bin/bash ++ ++# Copyright (c) 2001 Alcove - http://www.alcove.com/ ++# Please distribute under the terms of the GNU GPL, version 2 ++ ++# Author: Yann Dirson <yann.dirson@fr.alcove.com> ++# $Id: zxpdf,v 1.1 2001/09/28 10:23:35 ydirson Exp $ ++ ++set -e ++ ++file= ++flags= ++title="zxpdf" ++while [ $# -gt 0 ] ++do ++ case "$1" in ++ -z|-g|-geometry|-remote|-rgb|-papercolor|-eucjp|-t1lib|-ps|-paperw|-paperh) ++ flags="$flags $1 $2"; shift ;; ++ -title) title="$2"; shift ;; ++ -*) flags="$flags $1" ;; ++ *.pdf|*.PDF) file="$1"; shift; pages="$@"; cat=; break ;; ++ *.gz|*.Z) file="$1"; shift; pages="$@"; cat=zcat; break ;; ++ *.bz2) file="$1"; shift; pages="$@"; cat=bzcat; break ;; ++ *) echo >&2 "ERROR: unknown suffix in file \`$1'"; exit 1 ;; ++ esac ++ shift ++done ++ ++if [ $# -ge 1 ] # optional page argument ++then ++ echo >&2 "ERROR: Too many arguments" ++fi ++ ++if [ x"$title" == x -a x"$tmp" != x ] ++then ++ title="zxpdf: $file" ++fi ++ ++if [ -z "$cat" ] ++then ++ tmp="$file" ++else ++ tmp=$(basename "$file") ++ tmp=$(tempfile -p "${tmp%.pdf*}" -s .pdf) ++ $cat "$file" >"$tmp" ++fi ++ ++if [ "$tmp" == "" ]; then ++ exec xpdf -title $title $flags ++else ++ exec xpdf -title $title $flags "$tmp" $pages ++fi +--- xpdf-3.02.orig/debian/copyright ++++ xpdf-3.02/debian/copyright +@@ -0,0 +1,42 @@ ++ ++This is Debian GNU/Linux's prepackaged version of the 'xpdf' viewer written ++by Derek B. Noonburg. This package was original built by ++Dirk Eddelbuettel <edd@qed.econ.queensu.ca> and since 1998 has been ++maintained by Hamish Moffatt <hamish@debian.org>. Current sources are found ++at ++ http://www.foolabs.com/xpdf ++ ++ ++The upstream author's email address is: derekn@foolabs.com ++ ++Copyright: ++ ++Xpdf is copyright 1996-2007 Derek B. Noonburg. ++ ++Xpdf is licensed under the GNU General Public License (GPL), version ++2. In my opinion, the GPL is a convoluted, confusing, ambiguous mess. ++But it's also pervasive, and I'm sick of arguing. And even if it is ++confusing, the basic idea is good. ++ ++In order to cut down on the confusion a little bit, here are some ++informal clarifications: ++ ++- I don't mind if you redistribute xpdf in source and/or binary form, ++ as long as you include all of the documentation: README, man pages ++ (or help files), and COPYING. (Note that the README file contains a ++ pointer to a web page with the source code.) ++ ++- Selling a CD-ROM that contains xpdf is fine with me, as long as it ++ includes the documentation. I wouldn't mind receiving a sample ++ copy, but it's not necessary. ++ ++- If you make useful changes to xpdf, please make the source code ++ available -- post it on a web site, email it to me, whatever. ++ ++For information on commercial licensing and consulting, please see the ++Glyph & Cog web site: ++ ++ http://www.glyphandcog.com/ ++ ++The full text of the GPL can be found in /usr/share/common-licenses/GPL. ++ +--- xpdf-3.02.orig/debian/xpdf.xpm ++++ xpdf-3.02/debian/xpdf.xpm +@@ -0,0 +1,177 @@ ++/* XPM */ ++static char *xpdf[] = { ++/* columns rows colors chars-per-pixel */ ++"32 32 139 2", ++" c #003D000F000F", ++". c #0CE40CE00CE0", ++"X c #1E7600000000", ++"o c #138D13B413B4", ++"O c #19E816001600", ++"+ c #1B021CF31CF3", ++"@ c #26B900000000", ++"# c #2D20004E004E", ++"$ c #2DCD0F260F26", ++"% c #342B0C290C29", ++"& c #39F700000000", ++"* c #35BB16E016E0", ++"= c #3F3D10DC10DC", ++"- c #23C023C023C0", ++"; c #2DB72DF22DF2", ++": c #32B02C2C2C2C", ++"> c #331533153315", ++", c #3D4F3DAB3DAB", ++"< c #412900000000", ++"1 c #4E4400000000", ++"2 c #438A16751675", ++"3 c #552E00090009", ++"4 c #589D00000000", ++"5 c #553814381438", ++"6 c #466A40084008", ++"7 c #578D29C429C4", ++"8 c #63DD00000000", ++"9 c #706515B015B0", ++"0 c #708517F717F7", ++"q c #71D819011901", ++"w c #42B142B242B2", ++"e c #4AB94AB64AB6", ++"r c #5F30420C420C", ++"t c #52F852745274", ++"y c #553A59885988", ++"u c #5C0B535A535A", ++"i c #599959D559D5", ++"p c #618059D459D4", ++"a c #7FA2562B562B", ++"s c #63F465206520", ++"d c #699169916991", ++"f c #7B317B717B71", ++"g c #AE2F00880088", ++"h c #B26E00000000", ++"j c #B8C604F204F2", ++"k c #B90308810881", ++"l c #B13817391739", ++"z c #BFF611DD11DD", ++"x c #A7343C313C31", ++"c c #B6A136E436E4", ++"v c #B14F39523952", ++"b c #A7CA44514451", ++"n c #AC7B5BE65BE6", ++"m c #ABF678C378C3", ++"M c #C79F00000000", ++"N c #CD5500170017", ++"B c #C4B212E112E1", ++"V c #CED416B516B5", ++"C c #DD5300000000", ++"Z c #DCAC0C610C61", ++"A c #D83D139D139D", ++"S c #DCCB13C113C1", ++"D c #D90D194E194E", ++"F c #D87234623462", ++"G c #D84A3CFC3CFC", ++"H c #DED13D643D64", ++"J c #E229000B000B", ++"K c #E2CE09930993", ++"L c #E45115631563", ++"P c #E54D19161916", ++"I c #E2BC21232123", ++"U c #CE1D46944694", ++"Y c #CD8C53CB53CB", ++"T c #D70F42BB42BB", ++"R c #DA5454E754E7", ++"E c #D9295CAA5CAA", ++"W c #CAFD63A163A1", ++"Q c #C9846E7E6E7E", ++"! c #DEBA65C865C8", ++"~ c #DD2D7F957F95", ++"^ c #E4DA44214421", ++"/ c #E3A452AE52AE", ++"( c #ED3959C459C4", ++") c #E22F650D650D", ++"_ c #845284888488", ++"` c #86F188C288C2", ++"' c #8DE18DEE8DEE", ++"] c #935A941B941B", ++"[ c #9CE89CF49CF4", ++"{ c #A7A8850E850E", ++"} c #AA8084FC84FC", ++"| c #AFF888F088F0", ++" . c #B29381928192", ++".. c #B6EE8A448A44", ++"X. c #A3FDA3EBA3EB", ++"o. c #AB35AC0CAC0C", ++"O. c #B246B246B246", ++"+. c #B969B4DDB4DD", ++"@. c #BB90BB8FBB8F", ++"#. c #CD068F7A8F7A", ++"$. c #CDC0936A936A", ++"%. c #D20085B385B3", ++"&. c #D6699ED29ED2", ++"*. c #DC829C599C59", ++"=. c #CD42A62FA62F", ++"-. c #CE21ABF7ABF7", ++";. c #CD9AB2CBB2CB", ++":. c #CD0CC08AC08A", ++">. c #D8C2A77BA77B", ++",. c #EAE89F659F65", ++"<. c #EC71BE37BE37", ++"1. c #F4BBA0EAA0EA", ++"2. c #F5C9AB37AB37", ++"3. c #FB7DAD09AD09", ++"4. c #C526C505C505", ++"5. c #CD07CC65CC65", ++"6. c #D032D33DD33D", ++"7. c #D630C522C522", ++"8. c #DA43C538C538", ++"9. c #DFD0CAA7CAA7", ++"0. c #D260D3EFD3EF", ++"q. c #D4D9D990D990", ++"w. c #DB0BDBC3DBC3", ++"e. c #E08DE8F0E8F0", ++"r. c #E76CC6A0C6A0", ++"t. c #E78BD27BD27B", ++"y. c #EFD9D5B1D5B1", ++"u. c #EAC6DCDCDCDC", ++"i. c #E5DCE474E474", ++"p. c #E7BFEA2AEA2A", ++"a. c #ED83E7CCE7CC", ++"s. c #EBD0EBC8EBC8", ++"d. c #EE64F2ADF2AD", ++"f. c #F714E461E461", ++"g. c #F915E48FE48F", ++"h. c #FD3EEA64EA64", ++"j. c #F276F27AF27A", ++"k. c #FCA4F400F400", ++"l. c #FFF3FFF3FFF3", ++/* pixels */ ++" ", ++" ", ++"< 1 1 3 3 & @ 1 1 @ ", ++"8 N J J J N 4 # g J h # ", ++" 4 N J J J N 4 O w w o o 6 b A h # ", ++" 4 N J C J N 4 , w.5.> O X.4.7.>.% ", ++" 4 N J J J N 4 O.O. ` y.F ! q.O ", ++" 4 N J J J N 4 - 0.o. # ;.2.h 2 , ", ++" 4 N J J J N 4 w s.] @ x p.| # ", ++" 4 N J J J N 4 w p.} g T p._ ", ++" 3 N J J J N 4 e d.%.C U s.f ", ++" . . 3 M J J J N 4 X i k.H g a s.> ", ++" ; @.f t n / D J J B 6 y u .h.l 7 ] j.d t . ", ++" > @.l.w.] s 6.*.K A #.8.W ! u.a.* ; [ d.d t ", ++" o _ 4.l.d d h.A Q e.R C A r.6.o . +.5.o ", ++" + _ j.e i s.0 &.<.A J A 8.4.. . 4.4.o ", ++" _ s.w i p.O o.3.C J S t.4.. o 5.@.. ", ++" ] s.w . ] 6.= -.2.C J P h.~ 4 O i.f ", ++" X.j.w w w...j ,.r.c N ^ k.( N 0 s.i ", ++" o.s.] ' o...z J c 4.5.$.=.f.1.K ) g.X.. ", ++" O 4.O.O + 2 k J g # o + + 5 V P K L D q ", ++" w s.] # g J h # 4 N J J C N 4 ", ++" w p._ @ h J g # 4 N J J J N 4 ", ++" e d.} g J h # 4 N J J J N 4 ", ++" i k.Y J g # 4 N J J J N 4 ", ++" s h.I g # 4 N J J J N 4 ", ++" $ +.s.m # 4 N J J J N 4 ", ++" # g T b : 4 N J J J N 4 ", ++" # h J g # 4 N J J J N < ", ++" @ 1 1 @ & 1 3 1 3 X ", ++" ", ++" " ++}; +--- xpdf-3.02.orig/debian/xpdf-wrapper ++++ xpdf-3.02/debian/xpdf-wrapper +@@ -0,0 +1,5 @@ ++#!/bin/bash ++LANG=C ++LC_ALL=C ++export LANG LC_ALL ++exec -a xpdf xpdf.bin "$@" +--- xpdf-3.02.orig/debian/rules ++++ xpdf-3.02/debian/rules +@@ -0,0 +1,110 @@ ++#!/usr/bin/make -f ++# -*- makefile -*- ++# debian.rules file for the Debian GNU/Linux xpdf package ++# Copyright 1996,1997,1998 by Dirk Eddelbuettel <edd@debian.org> ++# Copyright 1998-2006 by Hamish Moffatt <hamish@debian.org> ++ ++build: build-stamp ++build-stamp: patch ++ dh_testdir ++ #CC=gcc-4.0 CXX=g++-4.0 ./configure ++ ./configure \ ++ --prefix=/usr \ ++ --sysconfdir=/etc/xpdf \ ++ --mandir=/usr/share/man \ ++ --with-x \ ++ --enable-freetype2 \ ++ --enable-opi \ ++ --enable-wordlist \ ++ --enable-multithreaded \ ++ --with-Xm-includes=$(shell pwd)/lesstif \ ++ --with-freetype2-includes=/usr/include/freetype2 \ ++ --with-t1-includes=/usr/include ++ $(MAKE) ++ touch build-stamp ++ ++clean: clean1 unpatch ++clean1: ++ dh_testdir ++ -$(MAKE) -i distclean ++ rm -rf *~ debian/*~ debian/files* build-stamp aconf.h ++ rm -rf fofi/Makefile splash/Makefile ++ dh_clean ++ ++binary-indep: # Nothing to build ++ dh_testdir ++ dh_installdirs -i ++ ln -sf xpdf-common debian/xpdf/usr/share/doc/xpdf ++ ++ cp doc/xpdfrc.5 debian/xpdf-common/usr/share/man/man5 ++ cp debian/xpdfrc debian/xpdf-common/usr/share/doc/xpdf-common/examples/sample-xpdfrc ++ cp debian/update-xpdfrc debian/xpdf-common/usr/sbin ++ chmod +x debian/xpdf-common/usr/sbin/update-xpdfrc ++ cp debian/xpdfrc debian/xpdf-common/etc/xpdf ++ cp debian/xpdf-bug-control debian/xpdf/usr/share/bug/xpdf/control ++ ++ dh_installdocs -pxpdf-common README debian/README.Debian ++ dh_installchangelogs -pxpdf-common CHANGES ++ cp debian/update-xpdfrc.8 debian/xpdf-common/usr/share/man/man8 ++ ++ cp -a debian/lang/* debian/xpdf-common/ ++ ++ dh_compress -i ++ dh_fixperms -i ++ dh_installdeb -i ++ dh_shlibdeps -i ++ dh_gencontrol -i ++ dh_md5sums -i ++ dh_builddeb -i ++ ++binary-arch: build ++ dh_testdir ++ ++ dh_installdirs -a ++ mkdir -p debian/tmp ++ mkdir -p debian/tmp/usr/share ++ $(MAKE) install DESTDIR=`pwd`/debian/tmp ++ ++ ln -sf xpdf-common debian/xpdf-reader/usr/share/doc/xpdf-reader ++ ln -sf xpdf-common debian/xpdf-utils/usr/share/doc/xpdf-utils ++ ++ cp debian/zxpdf debian/xpdf-reader/usr/bin ++ chmod +x debian/xpdf-reader/usr/bin/zxpdf ++ ln -sf xpdf.1.gz debian/xpdf-reader/usr/share/man/man1/zxpdf.1.gz ++ ln -sf xpdf.1.gz debian/xpdf-reader/usr/share/man/man1/xpdf.bin.1.gz ++ ++ cp debian/xpdf.xpm debian/xpdf-reader/usr/share/pixmaps ++ ++ dh_installdocs -a ++ dh_movefiles -a ++ rm -rf debian/tmp ++ ++ # rename xpdf binary and install wrapper script ++ mv debian/xpdf-reader/usr/bin/xpdf debian/xpdf-reader/usr/bin/xpdf.bin ++ cp debian/xpdf-wrapper debian/xpdf-reader/usr/bin/xpdf ++ chmod +x debian/xpdf-reader/usr/bin/xpdf ++ cp debian/xpdf.desktop debian/xpdf-reader/usr/share/applications/ ++ ++ dh_installmime -pxpdf-reader ++ dh_installmenu -pxpdf-reader ++ dh_strip -a ++ dh_desktop -a ++ dh_compress -a ++ dh_fixperms -a ++ dh_installdeb -a ++ dh_shlibdeps -a ++ dh_gencontrol -a ++ dh_md5sums -a ++ dh_builddeb -a ++ ++patch: patch-stamp ++patch-stamp: ++ dpatch apply-all ++ #dpatch call-all -a=pkg-info >patch-stamp ++ touch patch-stamp ++ ++unpatch: ++ dpatch deapply-all ++ rm -rf patch-stamp debian/patched ++ ++binary: binary-indep binary-arch diff --git a/source/xap/xpdf/xpdfrc.diff b/source/xap/xpdf/xpdfrc.diff new file mode 100644 index 00000000..f005414e --- /dev/null +++ b/source/xap/xpdf/xpdfrc.diff @@ -0,0 +1,43 @@ +--- ./doc/sample-xpdfrc.orig 2005-08-17 00:34:30.000000000 -0500 ++++ ./doc/sample-xpdfrc 2007-02-17 21:26:12.000000000 -0600 +@@ -29,20 +29,20 @@ + # installed in a "standard" location, xpdf will find them + # automatically.) + +-#displayFontT1 Times-Roman /usr/local/share/ghostscript/fonts/n021003l.pfb +-#displayFontT1 Times-Italic /usr/local/share/ghostscript/fonts/n021023l.pfb +-#displayFontT1 Times-Bold /usr/local/share/ghostscript/fonts/n021004l.pfb +-#displayFontT1 Times-BoldItalic /usr/local/share/ghostscript/fonts/n021024l.pfb +-#displayFontT1 Helvetica /usr/local/share/ghostscript/fonts/n019003l.pfb +-#displayFontT1 Helvetica-Oblique /usr/local/share/ghostscript/fonts/n019023l.pfb +-#displayFontT1 Helvetica-Bold /usr/local/share/ghostscript/fonts/n019004l.pfb +-#displayFontT1 Helvetica-BoldOblique /usr/local/share/ghostscript/fonts/n019024l.pfb +-#displayFontT1 Courier /usr/local/share/ghostscript/fonts/n022003l.pfb +-#displayFontT1 Courier-Oblique /usr/local/share/ghostscript/fonts/n022023l.pfb +-#displayFontT1 Courier-Bold /usr/local/share/ghostscript/fonts/n022004l.pfb +-#displayFontT1 Courier-BoldOblique /usr/local/share/ghostscript/fonts/n022024l.pfb +-#displayFontT1 Symbol /usr/local/share/ghostscript/fonts/s050000l.pfb +-#displayFontT1 ZapfDingbats /usr/local/share/ghostscript/fonts/d050000l.pfb ++displayFontT1 Times-Roman /usr/share/ghostscript/fonts/n021003l.pfb ++displayFontT1 Times-Italic /usr/share/ghostscript/fonts/n021023l.pfb ++displayFontT1 Times-Bold /usr/share/ghostscript/fonts/n021004l.pfb ++displayFontT1 Times-BoldItalic /usr/share/ghostscript/fonts/n021024l.pfb ++displayFontT1 Helvetica /usr/share/ghostscript/fonts/n019003l.pfb ++displayFontT1 Helvetica-Oblique /usr/share/ghostscript/fonts/n019023l.pfb ++displayFontT1 Helvetica-Bold /usr/share/ghostscript/fonts/n019004l.pfb ++displayFontT1 Helvetica-BoldOblique /usr/share/ghostscript/fonts/n019024l.pfb ++displayFontT1 Courier /usr/share/ghostscript/fonts/n022003l.pfb ++displayFontT1 Courier-Oblique /usr/share/ghostscript/fonts/n022023l.pfb ++displayFontT1 Courier-Bold /usr/share/ghostscript/fonts/n022004l.pfb ++displayFontT1 Courier-BoldOblique /usr/share/ghostscript/fonts/n022024l.pfb ++displayFontT1 Symbol /usr/share/ghostscript/fonts/s050000l.pfb ++displayFontT1 ZapfDingbats /usr/share/ghostscript/fonts/d050000l.pfb + + # If you need to display PDF files that refer to non-embedded fonts, + # you should add one or more fontDir options to point to the +@@ -88,4 +88,4 @@ + # Set the command used to run a web browser when a URL hyperlink is + # clicked. + +-#urlCommand "netscape -remote 'openURL(%s)'" ++#urlCommand "firefox -remote 'openURL(%s)'" diff --git a/source/xap/xsane/slack-desc b/source/xap/xsane/slack-desc new file mode 100644 index 00000000..330a2e56 --- /dev/null +++ b/source/xap/xsane/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xsane: xsane (Graphical frontend to SANE, Scanner Access Now Easy) +xsane: +xsane: xsane provides a graphical user-interface to control an image +xsane: acquisition device such as a flatbed scanner. It allows previewing +xsane: and scanning individual images and can be invoked either directly +xsane: from the command-line or through the GIMP image manipulation program. +xsane: +xsane: xsane accesses image acquisition devices through the SANE (Scanner +xsane: Access Now Easy) interface. +xsane: +xsane: diff --git a/source/xap/xsane/xsane.SlackBuild b/source/xap/xsane/xsane.SlackBuild new file mode 100755 index 00000000..f8d73012 --- /dev/null +++ b/source/xap/xsane/xsane.SlackBuild @@ -0,0 +1,96 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=0.996 +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-1} + +NUMJOBS=${NUMJOBS:-" -j7 "} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xsane + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +rm -rf $PKG +mkdir -p $TMP $PKG +cd $TMP +rm -rf xsane-$VERSION +tar xvf $CWD/xsane-$VERSION.tar.bz2 || exit 1 +cd xsane-$VERSION || exit 1 +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +CFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --mandir=/usr/man \ + --build=$ARCH-slackware-linux + +make $NUMJOBS || make || exit 1 +make install DESTDIR=$PKG + +rmdir $PKG/usr/sbin + +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +mkdir -p $PKG/usr/doc/xsane-$VERSION +cp -a \ + xsane.* \ + $PKG/usr/doc/xsane-$VERSION +rm -f $PKG/usr/doc/xsane-$VERSION/xsane.spec* +( cd $PKG/usr/doc/xsane-$VERSION ; ln -s /usr/share/sane/xsane/doc html ) + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/xsane-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xscreensaver/setuid.c b/source/xap/xscreensaver/setuid.c new file mode 100644 index 00000000..343dcf09 --- /dev/null +++ b/source/xap/xscreensaver/setuid.c @@ -0,0 +1,274 @@ +/* setuid.c --- management of runtime privileges. + * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <X11/Xlib.h> /* not used for much... */ + +/* This file doesn't need the Xt headers, so stub these types out... */ +#undef XtPointer +#define XtAppContext void* +#define XrmDatabase void* +#define XtIntervalId void* +#define XtPointer void* +#define Widget void* + +#include "xscreensaver.h" + +#ifndef EPERM +#include <errno.h> +#endif + +#include <pwd.h> /* for getpwnam() and struct passwd */ +#include <grp.h> /* for getgrgid() and struct group */ + +static const char * +uid_gid_string (uid_t uid, gid_t gid) +{ + static char buf[255]; + struct passwd *p = 0; + struct group *g = 0; + p = getpwuid (uid); + g = getgrgid (gid); + sprintf (buf, "%s/%s (%ld/%ld)", + (p && p->pw_name ? p->pw_name : "???"), + (g && g->gr_name ? g->gr_name : "???"), + (long) uid, (long) gid); + return buf; +} + + +void +describe_uids (saver_info *si, FILE *out) +{ + uid_t uid = getuid(); + gid_t gid = getgid(); + uid_t euid = geteuid(); + gid_t egid = getegid(); + char *s1 = strdup (uid_gid_string (uid, gid)); + char *s2 = strdup (uid_gid_string (euid, egid)); + + if (si->orig_uid && *si->orig_uid && + (!!strcmp (si->orig_uid, s1) || + !!strcmp (si->orig_uid, s2))) + fprintf (out, "%s: initial effective uid/gid was %s\n", blurb(), + si->orig_uid); + + fprintf (out, "%s: running as %s", blurb(), s1); + if (uid != euid || gid != egid) + fprintf (out, "; effectively %s", s2); + fprintf(out, "\n"); + free(s1); + free(s2); +} + + +static int +set_ids_by_number (uid_t uid, gid_t gid, char **message_ret) +{ + int uid_errno = 0; + int gid_errno = 0; + struct passwd *p = getpwuid (uid); + struct group *g = getgrgid (gid); + + if (message_ret) + *message_ret = 0; + + /* Rumor has it that some implementations of of setuid() do nothing + when called with -1; therefore, if the "nobody" user has a uid of + -1, then that would be Really Bad. Rumor further has it that such + systems really ought to be using -2 for "nobody", since that works. + So, if we get a uid (or gid, for good measure) of -1, switch to -2 + instead. Note that this must be done after we've looked up the + user/group names with getpwuid(-1) and/or getgrgid(-1). + */ + if (gid == (gid_t) -1) gid = (gid_t) -2; + if (uid == (uid_t) -1) uid = (uid_t) -2; + + errno = 0; + if (setgid (gid) != 0) + gid_errno = errno ? errno : -1; + + errno = 0; + if (setuid (uid) != 0) + uid_errno = errno ? errno : -1; + + if (uid_errno == 0 && gid_errno == 0) + { + static char buf [1024]; + sprintf (buf, "changed uid/gid to %s/%s (%ld/%ld).", + (p && p->pw_name ? p->pw_name : "???"), + (g && g->gr_name ? g->gr_name : "???"), + (long) uid, (long) gid); + if (message_ret) + *message_ret = buf; + return 0; + } + else + { + char buf [1024]; + if (gid_errno) + { + sprintf (buf, "%s: couldn't set gid to %s (%ld)", + blurb(), + (g && g->gr_name ? g->gr_name : "???"), + (long) gid); + if (gid_errno == -1) + fprintf(stderr, "%s: unknown error\n", buf); + else + perror(buf); + } + + if (uid_errno) + { + sprintf (buf, "%s: couldn't set uid to %s (%ld)", + blurb(), + (p && p->pw_name ? p->pw_name : "???"), + (long) uid); + if (uid_errno == -1) + fprintf(stderr, "%s: unknown error\n", buf); + else + perror(buf); + } + + return -1; + } +} + + +/* If we've been run as setuid or setgid to someone else (most likely root) + turn off the extra permissions so that random user-specified programs + don't get special privileges. (On some systems it is necessary to install + this program as setuid root in order to read the passwd file to implement + lock-mode.) + + *** WARNING: DO NOT DISABLE ANY OF THE FOLLOWING CODE! + If you do so, you will open a security hole. See the sections + of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", + and "USING XDM". + */ +void +hack_uid (saver_info *si) +{ + + /* Discard privileges, and set the effective user/group ids to the + real user/group ids. That is, give up our "chmod +s" rights. + */ + { + uid_t euid = geteuid(); + gid_t egid = getegid(); + uid_t uid = getuid(); + gid_t gid = getgid(); + + si->orig_uid = strdup (uid_gid_string (euid, egid)); + + if (uid != euid || gid != egid) + if (set_ids_by_number (uid, gid, &si->uid_message) != 0) + saver_exit (si, 1, 0); + } + + + /* Locking can't work when running as root, because we have no way of + knowing what the user id of the logged in user is (so we don't know + whose password to prompt for.) + + *** WARNING: DO NOT DISABLE THIS CODE! + If you do so, you will open a security hole. See the sections + of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", + and "USING XDM". + */ + if (getuid() == (uid_t) 0) + { + si->locking_disabled_p = True; + si->nolock_reason = "running as root"; + } + + + /* If we're running as root, switch to a safer user. This is above and + beyond the fact that we've disabling locking, above -- the theory is + that running graphics demos as root is just always a stupid thing + to do, since they have probably never been security reviewed and are + more likely to be buggy than just about any other kind of program. + (And that assumes non-malicious code. There are also attacks here.) + + *** WARNING: DO NOT DISABLE THIS CODE! + If you do so, you will open a security hole. See the sections + of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", + and "USING XDM". + */ + if (getuid() == (uid_t) 0) + { + struct passwd *p; + + p = getpwnam ("nobody"); + if (! p) p = getpwnam ("noaccess"); + if (! p) p = getpwnam ("daemon"); + if (! p) + { + fprintf (stderr, + "%s: running as root, and couldn't find a safer uid.\n", + blurb()); + saver_exit(si, 1, 0); + } + + if (set_ids_by_number (p->pw_uid, p->pw_gid, &si->uid_message) != 0) + saver_exit (si, -1, 0); + } + + + /* If there's anything even remotely funny looking about the passwd struct, + or if we're running as some other user from the list below (a + non-comprehensive selection of users known to be privileged in some way, + and not normal end-users) then disable locking. If it was possible, + switching to "nobody" would be the thing to do, but only root itself has + the privs to do that. + + *** WARNING: DO NOT DISABLE THIS CODE! + If you do so, you will open a security hole. See the sections + of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", + and "USING XDM". + */ + { + uid_t uid = getuid (); /* get it again */ + struct passwd *p = getpwuid (uid); /* get it again */ + + if (!p || + uid == (uid_t) 0 || + uid == (uid_t) -1 || + uid == (uid_t) -2 || + p->pw_uid == (uid_t) 0 || + p->pw_uid == (uid_t) -1 || + p->pw_uid == (uid_t) -2 || + !p->pw_name || + !*p->pw_name || + !strcmp (p->pw_name, "root") || + !strcmp (p->pw_name, "nobody") || + !strcmp (p->pw_name, "noaccess") || + !strcmp (p->pw_name, "operator") || + !strcmp (p->pw_name, "daemon") || + !strcmp (p->pw_name, "bin") || + !strcmp (p->pw_name, "adm") || + !strcmp (p->pw_name, "sys") || + !strcmp (p->pw_name, "games")) + { + static char buf [1024]; + sprintf (buf, "running as %s", + (p && p->pw_name && *p->pw_name + ? p->pw_name : "<unknown>")); + si->nolock_reason = buf; + si->locking_disabled_p = True; + si->dangerous_uid_p = True; + } + } +} diff --git a/source/xap/xscreensaver/slack-desc b/source/xap/xscreensaver/slack-desc new file mode 100644 index 00000000..85e2b909 --- /dev/null +++ b/source/xap/xscreensaver/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xscreensaver: xscreensaver (a screen saver and locker for X) +xscreensaver: +xscreensaver: A modular screen saver and locker for the X Window System. Highly +xscreensaver: customizable: allows the use of any program that can draw on the +xscreensaver: root window as a display mode. More than 100 display modes are +xscreensaver: included in this package. +xscreensaver: +xscreensaver: +xscreensaver: +xscreensaver: +xscreensaver: diff --git a/source/xap/xscreensaver/xscreensaver.SlackBuild b/source/xap/xscreensaver/xscreensaver.SlackBuild new file mode 100755 index 00000000..4eb2fdfd --- /dev/null +++ b/source/xap/xscreensaver/xscreensaver.SlackBuild @@ -0,0 +1,103 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, Minnesota, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + + +VERSION=5.08 +ARCH=${ARCH:-x86_64} +NUMJOBS=${NUMJOBS:-" -j7 "} +BUILD=${BUILD:-2} + + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xscreensaver + +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf xscreensaver-$VERSION +tar xvf $CWD/xscreensaver-$VERSION.tar.?z* || exit 1 +cd xscreensaver-$VERSION + +# Allow xscreensaver to work setgid shadow. I'd rather avoid requiring +# setuid root on this if at all possible... +zcat $CWD/xscreensaver.setuid.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit 1 + +# Add support for the electricsheep distributed screensaver: +zcat $CWD/xscreensaver.electricsheep.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit 1 + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +xml_config=/usr/bin/xml-config xml2_config=/usr/bin/xml2-config \ + +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +./configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --mandir=/usr/man \ + --with-x-app-defaults=/etc/X11/app-defaults \ + --with-shadow \ + --with-jpeg \ + --with-gl \ + --build=$ARCH-slackware-linux + +# We use '-i' because xscreensaver's NLS support has always been horribly broken +make -i $NUMJOBS || make -i +make -i install_prefix=$PKG install-strip + +gzip -9 $PKG/usr/man/man?/* + +chown root:shadow $PKG/usr/bin/xscreensaver +chmod 2751 $PKG/usr/bin/xscreensaver + +# This is needed for the menus: +mkdir -p $PKG/usr/share/pixmaps +mkdir -p $PKG/etc +mkdir -p $PKG/usr/doc/xscreensaver-$VERSION +cp -a \ + README* \ + $PKG/usr/doc/xscreensaver-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/xscreensaver-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xscreensaver/xscreensaver.electricsheep.diff b/source/xap/xscreensaver/xscreensaver.electricsheep.diff new file mode 100644 index 00000000..27b11961 --- /dev/null +++ b/source/xap/xscreensaver/xscreensaver.electricsheep.diff @@ -0,0 +1,20 @@ +--- ./driver/XScreenSaver_ad.h.orig 2008-12-28 01:59:19.000000000 -0600 ++++ ./driver/XScreenSaver_ad.h 2009-05-15 16:22:44.000000000 -0500 +@@ -138,6 +138,7 @@ + squiral -root \\n\ + wander -root \\n\ + - webcollage -root \\n\ ++ electricsheep --root 1 \\n\ + xflame -root \\n\ + xmatrix -root \\n\ + GL: gflux -root \\n\ +--- ./driver/XScreenSaver.ad.in.orig 2008-12-28 01:33:15.000000000 -0600 ++++ ./driver/XScreenSaver.ad.in 2009-05-15 16:22:04.000000000 -0500 +@@ -239,6 +239,7 @@ + squiral -root \n\ + wander -root \n\ + - webcollage -root \n\ ++ electricsheep --root 1 \n\ + xflame -root \n\ + xmatrix -root \n\ + @GL_KLUDGE@ GL: gflux -root \n\ diff --git a/source/xap/xscreensaver/xscreensaver.setuid.diff b/source/xap/xscreensaver/xscreensaver.setuid.diff new file mode 100644 index 00000000..c6810af5 --- /dev/null +++ b/source/xap/xscreensaver/xscreensaver.setuid.diff @@ -0,0 +1,179 @@ +--- ./driver/setuid.c.orig 2006-02-08 20:28:38.000000000 -0600 ++++ ./driver/setuid.c 2006-04-04 16:48:08.000000000 -0500 +@@ -1,5 +1,5 @@ + /* setuid.c --- management of runtime privileges. +- * xscreensaver, Copyright (c) 1993-1998, 2005 Jamie Zawinski <jwz@jwz.org> ++ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that +@@ -41,7 +41,7 @@ + struct group *g = 0; + p = getpwuid (uid); + g = getgrgid (gid); +- sprintf (buf, "%.100s/%.100s (%ld/%ld)", ++ sprintf (buf, "%s/%s (%ld/%ld)", + (p && p->pw_name ? p->pw_name : "???"), + (g && g->gr_name ? g->gr_name : "???"), + (long) uid, (long) gid); +@@ -74,50 +74,11 @@ + } + + +-/* Returns true if we need to call setgroups(). +- +- Without calling setgroups(), the process will retain any supplementary +- gids associated with the uid, e.g.: +- +- % groups root +- root : root bin daemon sys adm disk wheel +- +- However, setgroups() can only be called by root, and returns EPERM +- for other users even if the call would be a no-op (e.g., setting the +- group list to the current list.) So, to avoid that spurious error, +- before calling setgroups() we first check whether the current list +- of groups contains only one element, our target group. If so, we +- don't need to call setgroups(). +- */ +-static int +-setgroups_needed_p (uid_t target_group) +-{ +- gid_t groups[1024]; +- int n, size; +- size = sizeof(groups) / sizeof(gid_t); +- n = getgroups (size - 1, groups); +- if (n < 0) +- { +- char buf [1024]; +- sprintf (buf, "%s: getgroups(%ld, ...)", blurb(), (long int)(size - 1)); +- perror (buf); +- return 1; +- } +- else if (n == 0) /* an empty list means only egid is in effect. */ +- return 0; +- else if (n == 1 && groups[0] == target_group) /* one element, the target */ +- return 0; +- else /* more than one, or the wrong one. */ +- return 1; +-} +- +- + static int + set_ids_by_number (uid_t uid, gid_t gid, char **message_ret) + { + int uid_errno = 0; + int gid_errno = 0; +- int sgs_errno = 0; + struct passwd *p = getpwuid (uid); + struct group *g = getgrgid (gid); + +@@ -136,11 +97,6 @@ + if (uid == (uid_t) -1) uid = (uid_t) -2; + + errno = 0; +- if (setgroups_needed_p (gid) && +- setgroups (1, &gid) < 0) +- sgs_errno = errno ? errno : -1; +- +- errno = 0; + if (setgid (gid) != 0) + gid_errno = errno ? errno : -1; + +@@ -148,10 +104,10 @@ + if (setuid (uid) != 0) + uid_errno = errno ? errno : -1; + +- if (uid_errno == 0 && gid_errno == 0 && sgs_errno == 0) ++ if (uid_errno == 0 && gid_errno == 0) + { + static char buf [1024]; +- sprintf (buf, "changed uid/gid to %.100s/%.100s (%ld/%ld).", ++ sprintf (buf, "changed uid/gid to %s/%s (%ld/%ld).", + (p && p->pw_name ? p->pw_name : "???"), + (g && g->gr_name ? g->gr_name : "???"), + (long) uid, (long) gid); +@@ -162,71 +118,28 @@ + else + { + char buf [1024]; +- gid_t groups[1024]; +- int n, size; +- +- if (sgs_errno) +- { +- sprintf (buf, "%s: couldn't setgroups to %.100s (%ld)", +- blurb(), +- (g && g->gr_name ? g->gr_name : "???"), +- (long) gid); +- if (sgs_errno == -1) +- fprintf(stderr, "%s: unknown error\n", buf); +- else +- { +- errno = sgs_errno; +- perror(buf); +- } +- +- fprintf (stderr, "%s: effective group list: ", blurb()); +- size = sizeof(groups) / sizeof(gid_t); +- n = getgroups (size - 1, groups); +- if (n < 0) +- fprintf (stderr, "unknown!\n"); +- else +- { +- int i; +- fprintf (stderr, "["); +- for (i = 0; i < n; i++) +- { +- g = getgrgid (groups[i]); +- if (i > 0) fprintf (stderr, ", "); +- if (g && g->gr_name) fprintf (stderr, "%s", g->gr_name); +- else fprintf (stderr, "%ld", (long) groups[i]); +- } +- fprintf (stderr, "]\n"); +- } +- } +- + if (gid_errno) + { +- sprintf (buf, "%s: couldn't set gid to %.100s (%ld)", ++ sprintf (buf, "%s: couldn't set gid to %s (%ld)", + blurb(), + (g && g->gr_name ? g->gr_name : "???"), + (long) gid); + if (gid_errno == -1) + fprintf(stderr, "%s: unknown error\n", buf); + else +- { +- errno = gid_errno; +- perror(buf); +- } ++ perror(buf); + } + + if (uid_errno) + { +- sprintf (buf, "%s: couldn't set uid to %.100s (%ld)", ++ sprintf (buf, "%s: couldn't set uid to %s (%ld)", + blurb(), + (p && p->pw_name ? p->pw_name : "???"), + (long) uid); + if (uid_errno == -1) + fprintf(stderr, "%s: unknown error\n", buf); + else +- { +- errno = uid_errno; +- perror(buf); +- } ++ perror(buf); + } + + return -1; +@@ -350,7 +263,7 @@ + !strcmp (p->pw_name, "games")) + { + static char buf [1024]; +- sprintf (buf, "running as %.100s", ++ sprintf (buf, "running as %s", + (p && p->pw_name && *p->pw_name + ? p->pw_name : "<unknown>")); + si->nolock_reason = buf; diff --git a/source/xap/xv/slack-desc b/source/xap/xv/slack-desc new file mode 100644 index 00000000..2fc48166 --- /dev/null +++ b/source/xap/xv/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xv: xv (John Bradley's interactive image viewer) +xv: +xv: xv is an interactive image manipulation program. +xv: +xv: NOTICE: This program is unregistered shareware. Please read the +xv: license information included. +xv: +xv: +xv: +xv: +xv: diff --git a/source/xap/xv/xv-3.10a-jumbo-README.txt b/source/xap/xv/xv-3.10a-jumbo-README.txt new file mode 100644 index 00000000..63627ddf --- /dev/null +++ b/source/xap/xv/xv-3.10a-jumbo-README.txt @@ -0,0 +1,442 @@ +These are the latest versions of the XV jumbo patches I originally created +in February 2000 (but never distributed) and eventually updated and released +in May 2004, prompted by a discussion on LWN (http://lwn.net/Articles/76391/). +Information about the patches, updates to the patches, and the patches +themselves can all be found here: + + http://pobox.com/~newt/greg_xv.html + http://freshmeat.net/projects/xvjumbopatches/ + +(Use the "Subscribe to new releases" link on the latter page if you want to +be notified of new versions automatically; trivial registration required.) + +These two patches incorporate all of the fix- and enhancement-patches +available from John's XV site (http://www.trilon.com/xv/downloads.html +and ftp://ftp.trilon.com/pub/xv/patches/), plus a number of my own fixes +and additions, plus quite a few from other people--though not all of the +ones I'd intended to, due to lack of time after dealing with the latest +set of security issues (one of which I discovered, sigh). They're still +not fully complete, and it's possible they never will be, but I do plan +to continue tinkering with them whenever the mood strikes--and I may even +release them publicly on rare occasions. (At the current rate, it looks +like once a year may be the best we can hope for...we'll see.) + +Also be aware that several other people have had the same idea over the +years. Ones I've found, more or less by accident, include: + + - Landon Curt "chongo" Noll (http://www.isthe.com/chongo/) + http://www.isthe.com/chongo/src/xv-patch/ + - Mark Ashley <mark ibiblio.org> + http://www.ibiblio.org/pub/packages/solaris/sparc/html/xv.3.10a.p19.html + - Peter Jordan <pete dc.seflin.org> + http://www.ibiblio.org/pub/Linux/apps/graphics/viewers/X/xv-3.10a.patch.* + - Uwe F. Mayer (http://www.tux.org/~mayer/) + http://www.tux.org/~mayer/linux/book/node311.html + - Kurt Wall <kwall kurtwerks.com> + http://www.kurtwerks.com/software/xv.html + - Chisato Yamauchi (http://phe.phyas.aichi-edu.ac.jp/~cyamauch/index_en.html) + http://phe.phyas.aichi-edu.ac.jp/~cyamauch/xv.html + - Daisuke Yabuki <dxy optix.org> + http://www.optix.org/~dxy/solaris/xv/ + - Pekoe (http://pekoe.lair.net/) + http://pekoe.lair.net/diary/xv.html + - FreeBSD FreshPorts + http://www.freshports.org/graphics/xv/ + - Kyoichiro Suda <sudakyo fat.coara.or.jp> + http://www.coara.or.jp/~sudakyo/XV_jp.html + +I very much doubt that this is an exhaustive list. So far, most of the +other patch-sets appear not to be as extensive or as up-to-date as my own, +particularly now that the (very large) "Japanese extension" patches are +incorporated--big thanks to Werner Fink of SuSE for that! + +Below I summarize the component patches that are encompassed by my jumbo +bugfixes and jumbo enhancements patches. Unfortunately, some of my own +additions never saw the light of day as standalone patches, but considering +the number of overlaps (collisions) already implicit in this list, it would +have been difficult to accomplish even if I'd had the time. + +Here's a quick guide to the "third-party" credits in the lists below: + + AAC = Andrey A. Chernov [ache] + (http://cvsweb.freebsd.org/ports/graphics/xv/files/patch-ab) + AD = Andreas Dilger (adilger clusterfs.com) + AL = Alexander Lehmann (lehmann usa.net) + AT = Anthony Thyssen (http://www.cit.gu.edu.au/~anthony/) + DAC = David A. Clunie (http://www.dclunie.com/xv-pcd.html) + EK = Egmont Koblinger (egmont users.sourceforge.net) + GRR = Greg Roelofs (http://pobox.com/~newt/) + GV = Guido Vollbeding (http://sylvana.net/guido/) + IM = IKEMOTO Masahiro (ikeyan airlab.cs.ritsumei.ac.jp) + JCE = John C. Elliott (http://www.seasip.demon.co.uk/ZX/zxdload.html) + JHB = John H. Bradley, of course (http://www.trilon.com/xv/) + JPD = Jean-Pierre Demailly (http://www-fourier.ujf-grenoble.fr/~demailly/) + JR = John Rochester (http://www.freebsd.org/cgi/query-pr.cgi?pr=2920) + (also http://cvsweb.freebsd.org/ports/graphics/xv/files/patch-af, -ag) + JZ = Joe Zbiciak (http://spatula-city.org/~im14u2c/) + KS = Kyoichiro Suda (http://www.coara.or.jp/~sudakyo/XV_jp.html) + LCN = Landon Curt "chongo" Noll (http://www.isthe.com/chongo/) + LJ = Larry Jones (lawrence.jones ugs.com) + PBJ = Peter Jordan (http://www.ibiblio.org/pub/Linux/apps/graphics/viewers/X/) + PSV = Pawel S. Veselov (http://manticore.2y.net/wbmp.html) + SB = Sean Borman (http://www.nd.edu/~sborman/software/xvwheelmouse.html) + SJT = TenThumbs (tenthumbs cybernex.net) + TA = Tim Adye (http://hepwww.rl.ac.uk/Adye/xv-psnewstyle.html) + TI = Tetsuya INOUE (tin329 chino.it.okayama-u.ac.jp) + TO = Tavis Ormandy (taviso gentoo.org) + WF = Werner Fink (http://www.suse.de/~werner/) + +Other credits are as listed on the XV Downloads page or in the respective +patches (e.g., the jp-extension patches or within the PNG patch). + +Finally, please note that these patches have not been blessed by John Bradley +in any way (although I copied him on the May 2004 announcement--no response +at that time). Nor have I personally tested every change and feature! (See +the BIG SCARY WARNING below for further caveats.) In other words, they're +both completely unofficial and completely unguaranteed. But they seem to +work for me. (And when they don't, I fix 'em. Eventually, anyway... ;-) ) + +One further "final" note: as of this release, I am no longer updating the +fixes patch; new stuff (including fixes) now appears only in the enhancements +one. It simply became too much of a timesink to maintain parallel trees--not +to mention parallel makefiles (generic/public vs. local/personal, old vs. +new libjpeg/libtiff) and xv.h (unregistered/public vs. registered/personal), +particularly when some fixes came about while working on an enhancement and +others were provided by third parties relative to the previous fix+enh state. +Hence the mismatched "20050410" date on the fixes patch. + +GRR 20050501 + + +How to build +------------ + +The following assumes you, the user, already have the libtiff,[1] +libjpeg,[2] libpng,[3] and zlib[4] libraries downloaded, patched (if +necessary), compiled, and installed, not to mention a C compiler and +the bzip2,[5] tar,[6] patch,[7] and make[8] utilities. You should also +have downloaded the original XV 3.10a source distribution from the XV +Downloads page[9] and be able to edit its Makefile and config.h files +as indicated in the INSTALL file. Finally, you should know what a +Unix(-style) command line is, where to find one, and how to wield it +with abandon (or at least with adult supervision)--and preferably not +as the root user until the make install step. (A filesystem is a +terrible thing to waste.) + + [1] http://www.remotesensing.org/libtiff/ + [2] http://www.ijg.org/ + [3] http://www.libpng.org/pub/png/libpng.html + [4] http://www.zlib.net/ + [5] http://sources.redhat.com/bzip2/ + [6] http://www.gnu.org/directory/devel/specific/tar.html + [7] http://www.gnu.org/directory/devel/specific/patch.html + [8] http://www.gnu.org/directory/devel/specific/make.html + [9] http://www.trilon.com/xv/downloads.html#src-distrib + ++-------------------------------------------------------------------------+ +| | +| BIG SCARY WARNING | +| | +| These patches work for Greg (and parts of them apparently work for | +| various other people), and so far Greg's CPU still computes and his | +| hard disks haven't been wiped. But there's no guarantee that that | +| will be the case for you! In particular, not every incorporated patch | +| has been explicitly tested, nor has every possible subcase of the | +| explicitly tested subset. (Read that again; it's grammatical.) Nor are | +| these patches officially blessed by John Bradley in any way. In other | +| words, if you use these patches, you do so at your own risk. (Greg | +| doesn't believe there are any serious problems remaining, but then, | +| what programmer ever does? Bugs happen.) | +| | ++-------------------------------------------------------------------------+ + +Assuming you have the prerequisites out of the way and aren't scared +off by the Big Scary Warning, here's the build procedure: + + bzip2 -dc xv-3.10a-jumbo-patches-20050501.tar.bz2 | tar xvf - + (or tar xvzf xv-3.10a-jumbo-patches-20050501.tar.gz) + + tar xvzf xv-3.10a.tar.gz + + cd xv-3.10a + + patch -p1 < ../xv-3.10a-jumbo-fix-patch-20050410.txt + + [optional] patch -p1 < ../xv-3.10a-jumbo-enh-patch-20050501.txt + + edit Makefile and config.h as directed in INSTALL file (in particular, + ensure paths to external libraries and header files are correct) + + make + + ./xv your_favorite_image your_other_favorite_image etc. + +If everything seems to be working to your satisfaction, go ahead and install: + + make -n install (and double-check that things will be installed + where you want them to be) + + become root if necessary (e.g., type su) + + make install + +That wasn't so hard, was it? + + +Summary of incorporated and unincorporated patches +-------------------------------------------------- + +fixes ((*) = listed on XV Downloads page, (f) = on ftp site only): + +20040516: + - grabpatch (*) [obsoleted by new-xvgrab.c below] + - vispatch (*) + - mp-tiff-patch (*) [technically an enhancement, but JHB says...] + - longname.patch (*) [*SECURITY*] + - xpm.patch (*) + - deepcolor.patch (*) [slightly modified for language conformance] + - gifpatch (*) + - exceed_grab.patch (*) + - xv-redhat6-readme.txt (*) [slightly modified for portability] + - beos.patch (*) [modified for portability] + - croppad.patch (f) + - epsfpatch (f) + - tiff1200.patch (*) + - gssafer.patch (*) [*SECURITY*] + - new-xvgrab.c (f) [includes grabpatch but not exceed_grab.patch] + - xcmap.diff (AD) [part of xv-3.10a-png-1.2d.tar.gz] + - fixes for huge number gcc -Wall warnings--including two bugs (GRR) + - fix for cleandir script when no makefile exists (GRR) + - *SECURITY* fix for gets() in vdcomp.c (GRR, LCN vdcomp-security.patch) + - *SECURITY* fix for getwd() on Linux (GRR, LCN Linux-compile.patch) + - fix for "no fuss" Linux compiles (LCN Linux-compile.patch) + - partial *SECURITY* fix for mktemp() in xv.c and xvdir.c (GRR) + (remaining instances in xv.c (2), xvimage.c, xvfits.c, xvpds.c, xvps.c, and + possibly xvtiff.c--most involve system()) + - freebsd-vdcomp-newline.patch (AAC) + - xv-3.10a.patch.linux (PBJ) [/bin/sh versions of cleandir, RANLIB.sh only] + - removed trailing white space (GRR) [purely cosmetic] +20040523: + - fixed compilation error in registered versions (GRR) +20050410: + - fix for YCbCr oversaturated-green bug(s) in TIFF decoder (GRR) + - provisional fix for contiguous tiled TIFFs with bottom-* orientation (GRR) + - fixes for gcc 3.3 -Wall warnings (GRR) + - fix for incorrect 16/24-bit display of xwd dumps (SJT) + - *SECURITY* fix for multiple input-validation bugs (OpenBSD/SuSE, Gentoo, GRR) + (this also completes the partial mktemp() security fix listed above) + - fix for (probable) 24-bit endianness bug in fixpix code (GRR) + + +enhancements ((*) = listed on XV Downloads page, (<who>) = third-party): + +20040516: + - xv-3.10a.JPEG-patch (*) + (xv-3.10a.JPEG-patch.old differs only in ftp site listed in comments at top) + - xv-3.10a.TIFF-patch (*) + - xv-3.10a-png-1.2d.tar.gz (AL, AD) (*) + (xvjpeg.diff and xvtiff.diff ignored; xcmap.diff included in fixes) + - xvpng-1.2d-fix3.patch (GRR, SJT) (*) + - pdf.patch (*) + - windowid.patch + windowid.patch.readme (*) + - bmp32.patch (*) + - fixpix-20000610.tar.gz (GV) + (identical to 19961127 version except for README updates and new Win32 file) + [modified to be runtime-selectable via -/+fixpix option] + - browse-remember.patch (JZ) + - faster-smooth.patch (JZ) + - PAM support (GRR) + - PNG/GIF -ibg ("image background") transparency option (GRR) + (does not yet support TIFF, XPM or TGA) + - VersionInfo* in help screen (GRR) + - minor grammar/spelling fixes (GRR) + - floating-point support for -wait when USE_TICKS enabled (GRR) + - wheelmouse.patch (SB) + - freebsd-gravity-hints-patch (JR) + - xv-zx.patch (JCE) + - xv3.10a.wapbmp.patch (PSV) + - xv-3.10a-pcd.patch.20010708 (DAC) + - jp-ext-bzip2-1.1.patch + (from ftp://ftp.freebsd.org/pub/FreeBSD/ports/local-distfiles/shige/xv/) +20050410: + - boosted maximum number of files from 4096 to 32768 (GRR) + (note that OS kernel limits may also apply; for example, in Linux see + MAX_ARG_PAGES in linux-<version>/include/linux/binfmts.h) + - xv-3.10a-bmp16.patch (KS) + - final-image delay (e.g., "-wait 0.2,3" : pause 3 secs on final image) (GRR) + - xv-numpad.patch (EK) + - xv-delete-is-not-backspace.patch (EK) + - made browser window (schnauzer) and icons configurable (AT, GRR) +20050501: + - xv-3.10a-bmpfix.patch (WF) [*SECURITY*] + - xv310a-jp-extension-rev5.3.3.tar.gz (TI, IM, ..., WF) + (adds support for MAG, MAKI, Pi, PIC, and PIC2 formats[*]; "magic suffix" + detection/conversion; MacBinary prefixes; archives as virtual filesystems; + multilingual text viewer [though not Unicode]; etc.) + - xv-3.10a-yaos.dif (WF, TO) [*SECURITY*] + (fixes a number of format-string issues and system() calls) + - xv-3.10a.dif (WF) [*SECURITY*] + (fixes more format-string issues, mktemp() and open() calls, and compilation + warnings [mostly from jp-extension patch]) + - xv-3.10a-jumbo-jpd_startgrab-patch-20050420.txt (JPD) + - PATCH.alwaysnever (LJ) + - PATCH.bsd (LJ) + - PATCH.linedraw (LJ) + - PATCH.multipage (LJ) + - PATCH.multipageGIF (LJ) + - PATCH.random (LJ) + - PATCH.stat (LJ) + - PATCH.thumbs (LJ) + - xv-startgrab-imake-hips.patch (JPD) + ("hips" portion only; adds support for HIPS image format[*]) + - xv-3.10a-formatstr.patch (KS) + - xv-3.10a-shortsleep.patch (KS) + - xv-3.10a-locale-linux.patch (KS) + - xv-3.10a-printkey.patch (KS) + - xv-3.10a-sysconfdir.patch (KS) + - added PREFIX and DESTDIR support to Makefile (KS, GRR) + - xv-3.10a-xvexecpath.patch (but disabled pending fixes) (KS) + - xv-3.10a-zeroquit.patch (KS, GRR) + + +[*] Note that all six of these formats may still suffer from exploitable heap + overflows [*SECURITY*] when decoding images with large (possibly invalid) + dimensions; as a result, they are DISABLED by default. (Search for "GRR + POSSIBLE OVERFLOW / FIXME" comments in xvmag.c, xvmaki.c, xvpi.c, xvpic.c, + xvpic2.c, and xvhips.c, but keep in mind that these may not be exhaustive.) + Users who choose to overlook these security issues can enable any or all + of them by editing config.h. + + +not (yet?) included: + + - others from http://www.coara.or.jp/~sudakyo/XV_jp.html (some are duplicates): + -rw-r--r-- 4644 Mar 11 2004 xv-3.10a-directory.patch + -rw-r--r-- 462 Mar 11 2004 xv-3.10a-dirwkey.patch + -rw-r--r-- 688 Mar 11 2004 xv-3.10a-docdir.patch + -rw-r--r-- 11952 Mar 11 2004 xv-3.10a-download-test0.patch + -rw-r--r-- 41786 Mar 11 2004 xv-3.10a-download-test1.patch + -rw-r--r-- 42397 Mar 11 2004 xv-3.10a-download-test2.patch + -rw-r--r-- 47679 Mar 11 2004 xv-3.10a-download-test3.patch + -rw-r--r-- 52745 Mar 11 2004 xv-3.10a-download-test4.patch + -rw-r--r-- 3423 Apr 24 2004 xv-3.10a-keyzoom.patch + -rw-r--r-- 12387 Mar 15 2004 xv-3.10a-menubutton.patch + -rw-r--r-- 1178 Apr 24 2004 xv-3.10a-noblink.patch + -rw-r--r-- 57092 Jul 9 2004 xv-3.10a-resolution.patch + -rw-r--r-- 4645 Apr 24 2004 xv-3.10a-selall.patch + -rw-r--r-- 702 Apr 24 2004 xv-3.10a-showlongname.patch + -rw-r--r-- 1205 Apr 24 2004 xv-3.10a-staytoppdir.patch + -rw-r--r-- 4228 Apr 24 2004 xv-3.10a-wheelmouse.patch + -rw-r--r-- 744 Apr 24 2004 xv-3.10a-xvbutt_wait.patch + -rw-r--r-- 3757 Jul 9 2004 xv-3.10a-xvscrl_button2.patch + -rw-r--r-- 1494 Jul 9 2004 xv-3.10a-xvscrl_wait.patch + -rw-r--r-- 19352 Jul 9 2004 xv-3.10a-xvzoom.patch + + - xv-3.10a+jp-extension-rev5.3.3+FLmask.v2.1+png+misc.patch ["mask" support] + + - xv-psnewstyle.patch (TA) [coming later in 2005?] + - xv-3.10a.patch.linux (PBJ) [maybe use vdcomp.c changes?] + - xvxpm-anthony-thyssen.c (AT) ["slate grey" bug already gone?] + + - stuff in xv/unsupt: + -rw-r--r-- 30527 Dec 22 1994 FITS.rite + -rw-r--r-- 49152 Dec 22 1994 FITS.tar + -rw-r--r-- 3753 Dec 22 1994 G3.patch1 + -rw-r--r-- 24576 Dec 22 1994 G3.tar + -rw-r--r-- 1098 Dec 22 1994 INFO.cgm + -rw-r--r-- 1941 Dec 22 1994 README + -rwxr-xr-x 1059 Dec 22 1994 getweather + -rwxr-xr-x 2186 Dec 22 1994 getweather.ksh + -rw-r--r-- 856 Dec 22 1994 twm.fix + -rw-r--r-- 844 Dec 22 1994 vargs.c + -rw-r--r-- 47626 Dec 22 1994 vis + -rw-r--r-- 21097 Dec 22 1994 xscm + + + +not finished (and/or even started ;-) ): + + - fix xvpng.c not to use direct struct access + - (better) fix for never-ending pile of SLOW popups when viewing TIFFs with + unknown tags (or truncated/corrupted images) + - fix for minor .Z inefficiency in xv.c ("FIXME") + - fix for filename entry-field mouse/cursor bogosity + (want at least positioning to work; preferably also select/cut/paste) + - fix for spacebar-for-next-image getting stuck at first text file + - fix for .ppm.gz "disk leak" [can't reproduce...already fixed?] + (maybe occurs only if filesystem is already nearly full? bad .gz?) + + - transparency support for TIFF, XPM and TGA images + - support for tiled background image (with transparent foreground image) + - MNG/JNG support + - SVG support + + +ChangeLog +--------- + + 20000220 + original pair of jumbo patches, comprising perhaps 16 fix-patches and a + dozen enhancement-patches; never publicly released + + 20040516 + first public release, incorporating 25 fix-patches and 21 enhancement- + patches + + 20040523 + minor fix to xvctrl.c to support registered versions (GRR warnings-patch + was slightly overzealous); switched to tarball packaging + + 20040531 + fixed undefined CLK_TCK with gcc -ansi (enh/USE_TICKS option); made + libjpeg, libtiff, libpng and zlib sections of makefile more consistent + (enh) + + 20040606 + added freshmeat link, build instructions, and changelog to jumbo README + (this file) + + 20050213 + increased max number of files from 4096 to 32768 (enh) + + 20050320-20050410 + fixed two very long-standing YCbCr bugs in TIFF decoder (fix); + provisionally fixed bug in TIFF decoder for contiguous tiled TIFFs with + bottom-* orientation (fix/USE_TILED_TIFF_BOTLEFT_FIX option); fixed new + gcc 3.3 warnings (fix); fixed incorrect 16/24-bit display of xwd dumps + (fix); fixed multiple input-validation bugs (potential heap overflows) + and mktemp() dependencies (*SECURITY* fixes: CAN-2004-1725, CAN-2004- + 1726, CAN-2005-0665, CERT VU#622622, and others); added support for 16- + and 32-bit BMPs using bitfields "compression" (enh); fixed probable byte- + sex bug in 24-bit FixPix display code (enh/USE_24BIT_ENDIAN_FIX option); + fixed numerical-keypad NumLock behavior and delete-key behavior in file- + load/save window (enh); made schnauzer window and icons configurable (enh) + + 20050417 + incorporated "Japanese extension" patches, revision 5.3.3 (enh); fixed + additional *SECURITY* issues (format-string vulnerabilities, system() + and mktemp() calls, etc., but NOT heap overflows in new decoders) both + in existing code and in jp-extension additions (enh) + + 20050425 + added support for -startgrab option (enh); added support for a "Never" + button to file-overwrite popups (enh); added NetBSD and BSDI to list of + mkstemp()-supporting systems (enh); improved line-drawing code to set the + correct pixels for lines of all slopes (enh); added "Page n of m" to Info + window for multipage images (enh); added support for multipage (animated) + GIFs (enh); fixed -random support so randomized file list can be traversed + normally in forward or backward direction (enh); added typecasts to stat() + printfs for portability (enh); fixed erroneous use of "creation" time and + forced unlink prior to overwrite in schnauzer thumbnail code (enh); added + HIPS support (enh/HAVE_HIPS option) + + 20050501 + extended multipage keyboard support (PgUp/PgDn) to all windows except + control ("console") and directory (enh); fixed minor (non-security) + format-string issue in xv.c (enh); shortened delay on popup error windows + from 3 seconds to 1 second (enh); tweaked text-viewer localization support + (TV_L10N) for Linux (enh); added keyboard short cuts for Color and + Grayscale buttons in print dialog (enh); added support for separate "magic + suffix" (xv_mgcsfx) config dir (enh); added PREFIX and DESTDIR support to + Makefile (enh); fixed handling of zero-length files and other text-viewer + failures (enh) diff --git a/source/xap/xv/xv-3.10a-jumbo-enh-patch-20050501.txt b/source/xap/xv/xv-3.10a-jumbo-enh-patch-20050501.txt new file mode 100644 index 00000000..d78b601a --- /dev/null +++ b/source/xap/xv/xv-3.10a-jumbo-enh-patch-20050501.txt @@ -0,0 +1,28167 @@ +diff : xv-3.10a-jumbo-enh-patch-20050501.txt + +This is a unified diff. It should be applied (using Larry Wall's "patch" +program) to the XV 3.10a sources AFTER the jumbo-fixes patch has already +been applied. + +diffs below: + Imakefile + Makefile + Makefile.std + README.jumbo + README.pcd + bggen.c + bits/br_bzip2 + bits/br_mag + bits/br_maki + bits/br_mgcsfx + bits/br_pcd + bits/br_pi + bits/br_pic + bits/br_pic2 + bits/br_png + bits/br_zx + config.h + tiff/Makefile + vdcomp.c + xcmap.c + xv.c + xv.h + xv_mgcsfx.sample + xvbmp.c + xvbrowse.c + xvctrl.c + xvdial.c + xvdir.c + xvevent.c + xvfits.c + xvgam.c + xvgif.c + xvgrab.c + xvhips.c + xvhips.h + xvimage.c + xvinfo.c + xvjpeg.c + xvmag.c + xvmaki.c + xvmgcsfx.c + xvmisc.c + xvml.c + xvml.h + xvpbm.c + xvpcd.c + xvpds.c + xvpi.c + xvpic.c + xvpic2.c + xvpng.c + xvpopup.c + xvps.c + xvrle.c + xvroot.c + xvsmooth.c + xvtext.c + xvtiff.c + xvtiffwr.c + xvvd.c + xvwbmp.c + xvxpm.c + xvzx.c + + +diff -ruN xv-3.10a-bugfixes/Imakefile xv-3.10a-enhancements/Imakefile +--- xv-3.10a-bugfixes/Imakefile 1995-01-13 12:24:01.000000000 -0800 ++++ xv-3.10a-enhancements/Imakefile 2005-04-17 14:04:22.000000000 -0700 +@@ -104,6 +104,11 @@ + SGI = -Dsgi + #endif + ++/* install directory of xv_mgcsfx.sample. */ ++MGCSFXDIR = $(LIBDIR) ++/* Directory of default configuration file. */ ++MGCSFX = -DMGCSFXDIR=\"$(MGCSFXDIR)\" ++ + + + +@@ -137,6 +142,8 @@ + #if defined(SCOArchitecture) + SCO= -Dsco -DPOSIX -DNO_RANDOM + SYS_LIBRARIES= -lm -lc -lx ++#elif defined(HPArchitecture) ++SYS_LIBRARIES= -lm -lV3 + #else + SYS_LIBRARIES= -lm + #endif +@@ -147,7 +154,7 @@ + + DEFINES= $(SCO) $(UNIX) $(NODIRENT) $(VPRINTF) $(TIMERS) \ + $(HPUX7) $(JPEG) $(TIFF) $(PDS) $(DXWM) $(RAND) \ +- $(BACKING_STORE) $(BSDTYPES) $(SGI) ++ $(BACKING_STORE) $(BSDTYPES) $(SGI) $(MGCSFX) + + INCLUDES = $(JPEGINCLUDE) $(TIFFINCLUDE) + +@@ -157,7 +164,9 @@ + xvdial.c xvgraf.c xvsunras.c xvjpeg.c xvps.c xvpopup.c xvdflt.c \ + xvtiff.c xvtiffwr.c xvpds.c xvrle.c xviris.c xvgrab.c vprintf.c \ + xvbrowse.c xvtext.c xvpcx.c xviff.c xvtarga.c xvxpm.c xvcut.c \ +- xvxwd.c xvfits.c ++ xvxwd.c xvfits.c xvpng.c xvzx.c xvwbmp.c xvpcd.c \ ++ xvmag.c xvpic.c xvmaki.c xvpi.c xvpic2.c xvvd.c xvmgcsfx.c \ ++ xvml.c + + OBJS1 = xv.o xvevent.o xvroot.o xvmisc.o xvimage.o xvcolor.o xvsmooth.o \ + xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o xvalg.o \ +@@ -165,7 +174,9 @@ + xvdial.o xvgraf.o xvsunras.o xvjpeg.o xvps.o xvpopup.o xvdflt.o \ + xvtiff.o xvtiffwr.o xvpds.o xvrle.o xviris.o xvgrab.o vprintf.o \ + xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \ +- xvxwd.o xvfits.o ++ xvxwd.o xvfits.o xvpng.o xvzx.o xvwbmp.o xvpcd.o \ ++ xvmag.o xvpic.o xvmaki.o xvpi.o xvpic2.o xvvd.o xvmgcsfx.o \ ++ xvml.o + + SRCS2= bggen.c + OBJS2= bggen.o +@@ -266,6 +277,8 @@ + InstallManPageLong(docs/xvp2p,$(MANDIR),xvpictoppm) + InstallManPageLong(docs/vdcomp,$(MANDIR),vdcomp) + ++InstallNonExecFile(xv_mgcsfx.sample,$(MGCSFXDIR)) ++ + tar: + tar cf xv.tar Makefile* Imakefile *.c *.h bits docs \ + docs unsupt vms $(JPEGDIR) $(TIFFDIR) $(MISC) +diff -ruN xv-3.10a-bugfixes/Makefile xv-3.10a-enhancements/Makefile +--- xv-3.10a-bugfixes/Makefile 2005-04-06 08:17:13.000000000 -0700 ++++ xv-3.10a-enhancements/Makefile 2005-05-01 10:23:32.000000000 -0700 +@@ -41,10 +41,14 @@ + + + ### Installation locations +-BINDIR = /usr/local/bin +-MANDIR = /usr/local/man/man1 ++PREFIX = /usr/local ++BINDIR = $(PREFIX)/bin ++MANDIR = $(PREFIX)/man/man1 + MANSUF = 1 +-LIBDIR = /usr/local/lib ++DOCDIR = $(PREFIX)/doc/xv-3.10a ++LIBDIR = $(PREFIX)/lib/xv ++SYSCONFDIR = $(PREFIX)/etc ++DESTDIR = + + + buildit: all +@@ -59,13 +63,59 @@ + ### on your machine, *COMMENT OUT* the following lines + ### + JPEG = -DDOJPEG +-JPEGDIR = jpeg +-JPEGINC = -I$(JPEGDIR) +-JPEGLIB = $(JPEGDIR)/libjpeg.a +-$(JPEGDIR)/jconfig.h: +- cd $(JPEGDIR) ; ./configure CC='$(CC)' +-$(JPEGLIB): $(JPEGDIR)/jconfig.h +- cd $(JPEGDIR) ; make ++#JPEGDIR = jpeg ++JPEGDIR = /usr ++#JPEGDIR = /usr/local ++#JPEGDIR = ../../libjpeg ++### ++JPEGINC = -I$(JPEGDIR)/include ++#JPEGINC = -I$(JPEGDIR) ++### ++JPEGLIB = -L$(JPEGDIR)/lib -ljpeg ++#JPEGLIB = -L$(JPEGDIR) -ljpeg ++#JPEGLIB = $(JPEGDIR)/libjpeg.a ++### ++### this is intended to build the ancient version (5a) that's included in the ++### "jpeg" subdir of XV, not an arbitrary copy of libjpeg: ++### ++#$(JPEGDIR)/jconfig.h: ++# cd $(JPEGDIR) ; ./configure CC='$(CC)' ++#$(JPEGLIB): $(JPEGDIR)/jconfig.h ++# cd $(JPEGDIR) ; make ++ ++ ++### ++### if, for whatever reason, you're unable to get the PNG library to compile ++### on your machine, *COMMENT OUT* the following lines ++### ++PNG = -DDOPNG ++PNGDIR = /usr ++#PNGDIR = /usr/local ++#PNGDIR = ../../libpng ++### ++PNGINC = -I$(PNGDIR)/include ++#PNGINC = -I$(PNGDIR) ++### ++PNGLIB = -L$(PNGDIR)/lib -lpng ++#PNGLIB = -L$(PNGDIR) -lpng ++#PNGLIB = $(PNGDIR)/libpng.a ++ ++ ++### ++### if, for whatever reason, you're unable to get both the PNG library and ++### (newer versions of) the TIFF library to compile on your machine, *COMMENT ++### OUT* the following lines ++### ++ZLIBDIR = /usr ++#ZLIBDIR = /usr/local ++#ZLIBDIR = ../../zlib ++### ++ZLIBINC = -I$(ZLIBDIR)/include ++#ZLIBINC = -I$(ZLIBDIR) ++### ++ZLIBLIB = -L$(ZLIBDIR)/lib -lz ++#ZLIBLIB = -L$(ZLIBDIR) -lz ++#ZLIBLIB = $(ZLIBDIR)/libz.a + + + ### +@@ -80,17 +130,32 @@ + ### + #TIFF = -DDOTIFF + TIFF = -DDOTIFF -DUSE_TILED_TIFF_BOTLEFT_FIX +-TIFFDIR = tiff +-TIFFINC = -I$(TIFFDIR) +-TIFFLIB = $(TIFFDIR)/libtiff.a +-$(TIFFLIB): +- ( cd $(TIFFDIR) ; make CC='$(CC)' COPTS='$(CCOPTS) $(MCHN)' ) ++#TIFFDIR = tiff ++TIFFDIR = /usr ++#TIFFDIR = /usr/local ++#TIFFDIR = ../../libtiff ++### ++TIFFINC = -I$(TIFFDIR)/include ++#TIFFINC = -I$(TIFFDIR) ++### ++### libtiff 3.5 and up may be compiled with zlib and libjpeg, but dependency ++### is properly handled in LIBS line ~143 lines below ++### ++TIFFLIB = -L$(TIFFDIR)/lib -ltiff ++#TIFFLIB = -L$(TIFFDIR) -ltiff ++#TIFFLIB = $(TIFFDIR)/libtiff.a ++### ++### this is intended to build the ancient version (3.3.016 beta) that's included ++### in the "tiff" subdir of XV, not an arbitrary copy of libtiff: ++### ++#$(TIFFLIB): ++# ( cd $(TIFFDIR) ; make CC='$(CC)' COPTS='$(CCOPTS) $(MCHN)' ) + + + ### + ### if, for whatever reason, you're unable to get the PDS/VICAR support + ### to compile (xvpds.c, and vdcomp.c), *COMMENT OUT* the following line, +-### and also remove 'vdcomp' from the 'all:' dependancy ++### and also remove 'vdcomp' from the 'all:' dependency + ### + PDS = -DDOPDS + +@@ -98,8 +163,10 @@ + #----------System V---------- + + # if you are running on a SysV-based machine, such as HP, Silicon Graphics, +-# Solaris, etc., uncomment the following line to get mostly there. +-#UNIX = -DSVR4 ++# Solaris, etc.; uncomment one of the following lines to get you *most* of ++# the way there. SYSV means System V R3. ++# UNIX = -DSVR4 ++# UNIX = -DSYSV + + + #----------Machine-Specific Configurations---------- +@@ -121,12 +188,15 @@ + # To use old HP compilers (HPUX 7.0 or so), you may need + #MCHN= -Dhpux -D_HPUX_SOURCE +Ns4000 + # +-# also, if you're using HP's compiler, add '-Aa' to whichever of those ++# Also, if you're using HP's compiler, add '-Aa' to whichever of those + # two lines you're using, to turn on ANSI C mode. Or so I'm told. + # +-# note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever) ++# Note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever) + # to whichever of those lines you used, as HP tends to store their X11 + # include files in a non-standard place... ++# ++# And you probably have to add '-lV3' to the end of the LIBS def when ++# using XV's AUTO_EXPAND option. + + + ### for LINUX, uncomment the following line +@@ -205,6 +275,16 @@ + #VPRINTF = -DNEED_VPRINTF -DLONGINT -DNOSTDHDRS + + ++# if your X Window System compiled with -DX_LOCALE, ++# uncomment the following line: ++# TVL10N = -DX_LOCALE ++ ++# Install directory of xv_mgcsfx.sample. ++MGCSFXDIR = $(LIBDIR) ++# Directory of default configuration file. ++MGCSFX = -DMGCSFXDIR=\"$(MGCSFXDIR)\" ++ ++ + + + ################ END OF CONFIGURATION OPTIONS ################# +@@ -212,13 +292,14 @@ + + + +-CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \ +- $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ +- $(DXWM) $(MCHN) ++CFLAGS = $(CCOPTS) $(PNG) $(PNGINC) $(ZLIBINC) $(JPEG) $(JPEGINC) \ ++ $(TIFF) $(TIFFINC) $(PDS) $(NODIRENT) $(VPRINTF) $(TIMERS) \ ++ $(UNIX) $(BSDTYPES) $(RAND) $(DXWM) $(MCHN) $(TVL10N) $(MGCSFX) \ ++ -DSYSCONFDIR=\"$(SYSCONFDIR)\" -DXVEXECPATH=\"$(LIBDIR)\" + + ### remove -lm for BeOS: +-LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm +-#LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) ++LIBS = $(TIFFLIB) $(JPEGLIB) $(PNGLIB) $(ZLIBLIB) -L/usr/X11R6/lib -lX11 -lm ++#LIBS = $(TIFFLIB) $(JPEGLIB) $(PNGLIB) $(ZLIBLIB) -lX11 + + OBJS = xv.o xvevent.o xvroot.o xvmisc.o xvimage.o xvcolor.o xvsmooth.o \ + xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o xvalg.o \ +@@ -226,7 +307,9 @@ + xvdial.o xvgraf.o xvsunras.o xvjpeg.o xvps.o xvpopup.o xvdflt.o \ + xvtiff.o xvtiffwr.o xvpds.o xvrle.o xviris.o xvgrab.o vprintf.o \ + xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \ +- xvxwd.o xvfits.o ++ xvxwd.o xvfits.o xvpng.o xvzx.o xvwbmp.o xvpcd.o xvhips.o \ ++ xvmag.o xvpic.o xvmaki.o xvpi.o xvpic2.o xvvd.o xvmgcsfx.o \ ++ xvml.o + + MISC = README INSTALL CHANGELOG IDEAS + +@@ -236,10 +319,12 @@ + + + +-all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm ++#all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm ++all: xv bggen vdcomp xcmap xvpictoppm + + +-xv: $(OBJS) $(JPEGLIB) $(TIFFLIB) ++#xv: $(OBJS) $(JPEGLIB) $(TIFFLIB) ++xv: $(OBJS) + $(CC) -o xv $(CFLAGS) $(OBJS) $(LIBS) + + bggen: bggen.c +@@ -268,13 +353,14 @@ + + + install: all +- cp xv bggen vdcomp xcmap xvpictoppm $(BINDIR) +- cp docs/xv.man $(MANDIR)/xv.$(MANSUF) +- cp docs/bggen.man $(MANDIR)/bggen.$(MANSUF) +- cp docs/xcmap.man $(MANDIR)/xcmap.$(MANSUF) +- cp docs/xvp2p.man $(MANDIR)/xvpictoppm.$(MANSUF) +- cp docs/vdcomp.man $(MANDIR)/vdcomp.$(MANSUF) +- cp docs/xvdocs.ps* $(LIBDIR) ++ cp xv bggen vdcomp xcmap xvpictoppm $(DESTDIR)$(BINDIR) ++ cp docs/xv.man $(DESTDIR)$(MANDIR)/xv.$(MANSUF) ++ cp docs/bggen.man $(DESTDIR)$(MANDIR)/bggen.$(MANSUF) ++ cp docs/xcmap.man $(DESTDIR)$(MANDIR)/xcmap.$(MANSUF) ++ cp docs/xvp2p.man $(DESTDIR)$(MANDIR)/xvpictoppm.$(MANSUF) ++ cp docs/vdcomp.man $(DESTDIR)$(MANDIR)/vdcomp.$(MANSUF) ++ cp docs/xvdocs.ps* $(DESTDIR)$(LIBDIR) # or $(DESTDIR)$(DOCDIR) ++ #cp xv_mgcsfx.sample $(DESTDIR)$(SYSCONFDIR)/xv_mgcsfx + + tar: + # tar only local jpeg and tiff dirs, not user's or system's copies: +@@ -299,7 +385,7 @@ + xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds + xvbrowse.o: bits/br_ps bits/br_iff bits/br_targa bits/br_xpm + xvbrowse.o: bits/br_trash bits/fcurs bits/fccurs bits/fdcurs bits/fcursm +-xvbrowse.o: bits/br_xwd ++xvbrowse.o: bits/br_xwd bits/br_png bits/br_zx bits/br_pcd bits/br_bzip2 + + xvbutt.o: bits/cboard50 bits/rb_frame bits/rb_frame1 bits/rb_top + xvbutt.o: bits/rb_bot bits/rb_dtop bits/rb_dbot bits/rb_body +diff -ruN xv-3.10a-bugfixes/Makefile.std xv-3.10a-enhancements/Makefile.std +--- xv-3.10a-bugfixes/Makefile.std 2005-04-06 08:17:13.000000000 -0700 ++++ xv-3.10a-enhancements/Makefile.std 2005-05-01 10:23:32.000000000 -0700 +@@ -41,10 +41,14 @@ + + + ### Installation locations +-BINDIR = /usr/local/bin +-MANDIR = /usr/local/man/man1 ++PREFIX = /usr/local ++BINDIR = $(PREFIX)/bin ++MANDIR = $(PREFIX)/man/man1 + MANSUF = 1 +-LIBDIR = /usr/local/lib ++DOCDIR = $(PREFIX)/doc/xv-3.10a ++LIBDIR = $(PREFIX)/lib/xv ++SYSCONFDIR = $(PREFIX)/etc ++DESTDIR = + + + buildit: all +@@ -59,13 +63,59 @@ + ### on your machine, *COMMENT OUT* the following lines + ### + JPEG = -DDOJPEG +-JPEGDIR = jpeg +-JPEGINC = -I$(JPEGDIR) +-JPEGLIB = $(JPEGDIR)/libjpeg.a +-$(JPEGDIR)/jconfig.h: +- cd $(JPEGDIR) ; ./configure CC='$(CC)' +-$(JPEGLIB): $(JPEGDIR)/jconfig.h +- cd $(JPEGDIR) ; make ++#JPEGDIR = jpeg ++JPEGDIR = /usr ++#JPEGDIR = /usr/local ++#JPEGDIR = ../../libjpeg ++### ++JPEGINC = -I$(JPEGDIR)/include ++#JPEGINC = -I$(JPEGDIR) ++### ++JPEGLIB = -L$(JPEGDIR)/lib -ljpeg ++#JPEGLIB = -L$(JPEGDIR) -ljpeg ++#JPEGLIB = $(JPEGDIR)/libjpeg.a ++### ++### this is intended to build the ancient version (5a) that's included in the ++### "jpeg" subdir of XV, not an arbitrary copy of libjpeg: ++### ++#$(JPEGDIR)/jconfig.h: ++# cd $(JPEGDIR) ; ./configure CC='$(CC)' ++#$(JPEGLIB): $(JPEGDIR)/jconfig.h ++# cd $(JPEGDIR) ; make ++ ++ ++### ++### if, for whatever reason, you're unable to get the PNG library to compile ++### on your machine, *COMMENT OUT* the following lines ++### ++PNG = -DDOPNG ++PNGDIR = /usr ++#PNGDIR = /usr/local ++#PNGDIR = ../../libpng ++### ++PNGINC = -I$(PNGDIR)/include ++#PNGINC = -I$(PNGDIR) ++### ++PNGLIB = -L$(PNGDIR)/lib -lpng ++#PNGLIB = -L$(PNGDIR) -lpng ++#PNGLIB = $(PNGDIR)/libpng.a ++ ++ ++### ++### if, for whatever reason, you're unable to get both the PNG library and ++### (newer versions of) the TIFF library to compile on your machine, *COMMENT ++### OUT* the following lines ++### ++ZLIBDIR = /usr ++#ZLIBDIR = /usr/local ++#ZLIBDIR = ../../zlib ++### ++ZLIBINC = -I$(ZLIBDIR)/include ++#ZLIBINC = -I$(ZLIBDIR) ++### ++ZLIBLIB = -L$(ZLIBDIR)/lib -lz ++#ZLIBLIB = -L$(ZLIBDIR) -lz ++#ZLIBLIB = $(ZLIBDIR)/libz.a + + + ### +@@ -80,17 +130,32 @@ + ### + #TIFF = -DDOTIFF + TIFF = -DDOTIFF -DUSE_TILED_TIFF_BOTLEFT_FIX +-TIFFDIR = tiff +-TIFFINC = -I$(TIFFDIR) +-TIFFLIB = $(TIFFDIR)/libtiff.a +-$(TIFFLIB): +- ( cd $(TIFFDIR) ; make CC='$(CC)' COPTS='$(CCOPTS) $(MCHN)' ) ++#TIFFDIR = tiff ++TIFFDIR = /usr ++#TIFFDIR = /usr/local ++#TIFFDIR = ../../libtiff ++### ++TIFFINC = -I$(TIFFDIR)/include ++#TIFFINC = -I$(TIFFDIR) ++### ++### libtiff 3.5 and up may be compiled with zlib and libjpeg, but dependency ++### is properly handled in LIBS line ~143 lines below ++### ++TIFFLIB = -L$(TIFFDIR)/lib -ltiff ++#TIFFLIB = -L$(TIFFDIR) -ltiff ++#TIFFLIB = $(TIFFDIR)/libtiff.a ++### ++### this is intended to build the ancient version (3.3.016 beta) that's included ++### in the "tiff" subdir of XV, not an arbitrary copy of libtiff: ++### ++#$(TIFFLIB): ++# ( cd $(TIFFDIR) ; make CC='$(CC)' COPTS='$(CCOPTS) $(MCHN)' ) + + + ### + ### if, for whatever reason, you're unable to get the PDS/VICAR support + ### to compile (xvpds.c, and vdcomp.c), *COMMENT OUT* the following line, +-### and also remove 'vdcomp' from the 'all:' dependancy ++### and also remove 'vdcomp' from the 'all:' dependency + ### + PDS = -DDOPDS + +@@ -98,8 +163,10 @@ + #----------System V---------- + + # if you are running on a SysV-based machine, such as HP, Silicon Graphics, +-# Solaris, etc., uncomment the following line to get mostly there. +-#UNIX = -DSVR4 ++# Solaris, etc.; uncomment one of the following lines to get you *most* of ++# the way there. SYSV means System V R3. ++# UNIX = -DSVR4 ++# UNIX = -DSYSV + + + #----------Machine-Specific Configurations---------- +@@ -121,12 +188,15 @@ + # To use old HP compilers (HPUX 7.0 or so), you may need + #MCHN= -Dhpux -D_HPUX_SOURCE +Ns4000 + # +-# also, if you're using HP's compiler, add '-Aa' to whichever of those ++# Also, if you're using HP's compiler, add '-Aa' to whichever of those + # two lines you're using, to turn on ANSI C mode. Or so I'm told. + # +-# note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever) ++# Note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever) + # to whichever of those lines you used, as HP tends to store their X11 + # include files in a non-standard place... ++# ++# And you probably have to add '-lV3' to the end of the LIBS def when ++# using XV's AUTO_EXPAND option. + + + ### for LINUX, uncomment the following line +@@ -205,6 +275,16 @@ + #VPRINTF = -DNEED_VPRINTF -DLONGINT -DNOSTDHDRS + + ++# if your X Window System compiled with -DX_LOCALE, ++# uncomment the following line: ++# TVL10N = -DX_LOCALE ++ ++# Install directory of xv_mgcsfx.sample. ++MGCSFXDIR = $(LIBDIR) ++# Directory of default configuration file. ++MGCSFX = -DMGCSFXDIR=\"$(MGCSFXDIR)\" ++ ++ + + + ################ END OF CONFIGURATION OPTIONS ################# +@@ -212,13 +292,14 @@ + + + +-CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \ +- $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ +- $(DXWM) $(MCHN) ++CFLAGS = $(CCOPTS) $(PNG) $(PNGINC) $(ZLIBINC) $(JPEG) $(JPEGINC) \ ++ $(TIFF) $(TIFFINC) $(PDS) $(NODIRENT) $(VPRINTF) $(TIMERS) \ ++ $(UNIX) $(BSDTYPES) $(RAND) $(DXWM) $(MCHN) $(TVL10N) $(MGCSFX) \ ++ -DSYSCONFDIR=\"$(SYSCONFDIR)\" -DXVEXECPATH=\"$(LIBDIR)\" + + ### remove -lm for BeOS: +-LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm +-#LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) ++LIBS = $(TIFFLIB) $(JPEGLIB) $(PNGLIB) $(ZLIBLIB) -L/usr/X11R6/lib -lX11 -lm ++#LIBS = $(TIFFLIB) $(JPEGLIB) $(PNGLIB) $(ZLIBLIB) -lX11 + + OBJS = xv.o xvevent.o xvroot.o xvmisc.o xvimage.o xvcolor.o xvsmooth.o \ + xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o xvalg.o \ +@@ -226,7 +307,9 @@ + xvdial.o xvgraf.o xvsunras.o xvjpeg.o xvps.o xvpopup.o xvdflt.o \ + xvtiff.o xvtiffwr.o xvpds.o xvrle.o xviris.o xvgrab.o vprintf.o \ + xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \ +- xvxwd.o xvfits.o ++ xvxwd.o xvfits.o xvpng.o xvzx.o xvwbmp.o xvpcd.o xvhips.o \ ++ xvmag.o xvpic.o xvmaki.o xvpi.o xvpic2.o xvvd.o xvmgcsfx.o \ ++ xvml.o + + MISC = README INSTALL CHANGELOG IDEAS + +@@ -236,10 +319,12 @@ + + + +-all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm ++#all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm ++all: xv bggen vdcomp xcmap xvpictoppm + + +-xv: $(OBJS) $(JPEGLIB) $(TIFFLIB) ++#xv: $(OBJS) $(JPEGLIB) $(TIFFLIB) ++xv: $(OBJS) + $(CC) -o xv $(CFLAGS) $(OBJS) $(LIBS) + + bggen: bggen.c +@@ -268,13 +353,14 @@ + + + install: all +- cp xv bggen vdcomp xcmap xvpictoppm $(BINDIR) +- cp docs/xv.man $(MANDIR)/xv.$(MANSUF) +- cp docs/bggen.man $(MANDIR)/bggen.$(MANSUF) +- cp docs/xcmap.man $(MANDIR)/xcmap.$(MANSUF) +- cp docs/xvp2p.man $(MANDIR)/xvpictoppm.$(MANSUF) +- cp docs/vdcomp.man $(MANDIR)/vdcomp.$(MANSUF) +- cp docs/xvdocs.ps* $(LIBDIR) ++ cp xv bggen vdcomp xcmap xvpictoppm $(DESTDIR)$(BINDIR) ++ cp docs/xv.man $(DESTDIR)$(MANDIR)/xv.$(MANSUF) ++ cp docs/bggen.man $(DESTDIR)$(MANDIR)/bggen.$(MANSUF) ++ cp docs/xcmap.man $(DESTDIR)$(MANDIR)/xcmap.$(MANSUF) ++ cp docs/xvp2p.man $(DESTDIR)$(MANDIR)/xvpictoppm.$(MANSUF) ++ cp docs/vdcomp.man $(DESTDIR)$(MANDIR)/vdcomp.$(MANSUF) ++ cp docs/xvdocs.ps* $(DESTDIR)$(LIBDIR) # or $(DESTDIR)$(DOCDIR) ++ #cp xv_mgcsfx.sample $(DESTDIR)$(SYSCONFDIR)/xv_mgcsfx + + tar: + # tar only local jpeg and tiff dirs, not user's or system's copies: +@@ -299,7 +385,7 @@ + xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds + xvbrowse.o: bits/br_ps bits/br_iff bits/br_targa bits/br_xpm + xvbrowse.o: bits/br_trash bits/fcurs bits/fccurs bits/fdcurs bits/fcursm +-xvbrowse.o: bits/br_xwd ++xvbrowse.o: bits/br_xwd bits/br_png bits/br_zx bits/br_pcd bits/br_bzip2 + + xvbutt.o: bits/cboard50 bits/rb_frame bits/rb_frame1 bits/rb_top + xvbutt.o: bits/rb_bot bits/rb_dtop bits/rb_dbot bits/rb_body +diff -ruN xv-3.10a-bugfixes/README.jumbo xv-3.10a-enhancements/README.jumbo +--- xv-3.10a-bugfixes/README.jumbo 2005-04-10 19:55:23.000000000 -0700 ++++ xv-3.10a-enhancements/README.jumbo 2005-05-01 13:45:58.000000000 -0700 +@@ -14,10 +14,10 @@ + available from John's XV site (http://www.trilon.com/xv/downloads.html + and ftp://ftp.trilon.com/pub/xv/patches/), plus a number of my own fixes + and additions, plus quite a few from other people--though not all of the +-ones I'd intended to (sorry, SJT, AT, and JPD!) due to lack of time after +-dealing with the latest security issue (which I discovered, sigh). They're +-still not fully complete, and it's possible they never will be, but I do +-plan to continue working on them whenever the mood strikes--and I may even ++ones I'd intended to, due to lack of time after dealing with the latest ++set of security issues (one of which I discovered, sigh). They're still ++not fully complete, and it's possible they never will be, but I do plan ++to continue tinkering with them whenever the mood strikes--and I may even + release them publicly on rare occasions. (At the current rate, it looks + like once a year may be the best we can hope for...we'll see.) + +@@ -26,91 +26,86 @@ + + - Landon Curt "chongo" Noll (http://www.isthe.com/chongo/) + http://www.isthe.com/chongo/src/xv-patch/ +- - Mark Ashley <mark@ibiblio.org> ++ - Mark Ashley <mark ibiblio.org> + http://www.ibiblio.org/pub/packages/solaris/sparc/html/xv.3.10a.p19.html +- - Peter Jordan <pete@dc.seflin.org> ++ - Peter Jordan <pete dc.seflin.org> + http://www.ibiblio.org/pub/Linux/apps/graphics/viewers/X/xv-3.10a.patch.* + - Uwe F. Mayer (http://www.tux.org/~mayer/) + http://www.tux.org/~mayer/linux/book/node311.html +- - Kurt Wall <kwall@kurtwerks.com> ++ - Kurt Wall <kwall kurtwerks.com> + http://www.kurtwerks.com/software/xv.html + - Chisato Yamauchi (http://phe.phyas.aichi-edu.ac.jp/~cyamauch/index_en.html) + http://phe.phyas.aichi-edu.ac.jp/~cyamauch/xv.html +- - Daisuke Yabuki <dxy@optix.org> ++ - Daisuke Yabuki <dxy optix.org> + http://www.optix.org/~dxy/solaris/xv/ + - Pekoe (http://pekoe.lair.net/) + http://pekoe.lair.net/diary/xv.html + - FreeBSD FreshPorts + http://www.freshports.org/graphics/xv/ +- - <sudakyo@fat.coara.or.jp> ++ - Kyoichiro Suda <sudakyo fat.coara.or.jp> + http://www.coara.or.jp/~sudakyo/XV_jp.html + +-I very much doubt that this is an exhaustive list. So far, most of the other +-patch-sets appear not to be quite as extensive or as up-to-date as my own, +-although the last three or four do include the [large] Japanese extension +-patches that I omitted--not because they're unworthy, but simply because I +-didn't find them until collisions between the two sets of patches had become +-a large problem. (Maybe for the next release... I'd intended to try for +-this release, but the security issues ended up taking almost all of my +-available time. And, to be honest, from my perspective, inclusion of the +-jp-extension patches is more for completeness' sake than personal interest, +-so their priority is fairly low.) ++I very much doubt that this is an exhaustive list. So far, most of the ++other patch-sets appear not to be as extensive or as up-to-date as my own, ++particularly now that the (very large) "Japanese extension" patches are ++incorporated--big thanks to Werner Fink of SuSE for that! + + Below I summarize the component patches that are encompassed by my jumbo + bugfixes and jumbo enhancements patches. Unfortunately, some of my own + additions never saw the light of day as standalone patches, but considering + the number of overlaps (collisions) already implicit in this list, it would +-have been difficult to accomplish even if I'd had the time. In any case, +-they're present in these jumbo patches but not chongo's, so those who _really_ +-care can "subtract" the two sets of patches to see what I did. ++have been difficult to accomplish even if I'd had the time. + + Here's a quick guide to the "third-party" credits in the lists below: + + AAC = Andrey A. Chernov [ache] + (http://cvsweb.freebsd.org/ports/graphics/xv/files/patch-ab) +- AD = Andreas Dilger (adilger@clusterfs.com) +- AL = Alexander Lehmann (lehmann@usa.net) ++ AD = Andreas Dilger (adilger clusterfs.com) ++ AL = Alexander Lehmann (lehmann usa.net) + AT = Anthony Thyssen (http://www.cit.gu.edu.au/~anthony/) + DAC = David A. Clunie (http://www.dclunie.com/xv-pcd.html) +- EK = Egmont Koblinger (egmont@users.sourceforge.net) ++ EK = Egmont Koblinger (egmont users.sourceforge.net) + GRR = Greg Roelofs (http://pobox.com/~newt/) + GV = Guido Vollbeding (http://sylvana.net/guido/) ++ IM = IKEMOTO Masahiro (ikeyan airlab.cs.ritsumei.ac.jp) + JCE = John C. Elliott (http://www.seasip.demon.co.uk/ZX/zxdload.html) + JHB = John H. Bradley, of course (http://www.trilon.com/xv/) + JPD = Jean-Pierre Demailly (http://www-fourier.ujf-grenoble.fr/~demailly/) + JR = John Rochester (http://www.freebsd.org/cgi/query-pr.cgi?pr=2920) + (also http://cvsweb.freebsd.org/ports/graphics/xv/files/patch-af, -ag) + JZ = Joe Zbiciak (http://spatula-city.org/~im14u2c/) ++ KS = Kyoichiro Suda (http://www.coara.or.jp/~sudakyo/XV_jp.html) + LCN = Landon Curt "chongo" Noll (http://www.isthe.com/chongo/) ++ LJ = Larry Jones (lawrence.jones ugs.com) + PBJ = Peter Jordan (http://www.ibiblio.org/pub/Linux/apps/graphics/viewers/X/) + PSV = Pawel S. Veselov (http://manticore.2y.net/wbmp.html) + SB = Sean Borman (http://www.nd.edu/~sborman/software/xvwheelmouse.html) +- SJT = TenThumbs (tenthumbs@cybernex.net) ++ SJT = TenThumbs (tenthumbs cybernex.net) + TA = Tim Adye (http://hepwww.rl.ac.uk/Adye/xv-psnewstyle.html) ++ TI = Tetsuya INOUE (tin329 chino.it.okayama-u.ac.jp) ++ TO = Tavis Ormandy (taviso gentoo.org) ++ WF = Werner Fink (http://www.suse.de/~werner/) + + Other credits are as listed on the XV Downloads page or in the respective + patches (e.g., the jp-extension patches or within the PNG patch). + + Finally, please note that these patches have not been blessed by John Bradley +-in any way (although I copied him on the May 2004 announcement--no response). +-Nor have I personally tested every change and feature! (See the BIG SCARY +-WARNING below for further caveats.) In other words, they're both completely +-unofficial and completely unguaranteed. But they seem to work for me. (And +-when they don't, I fix 'em. Eventually, anyway... ;-) ) +- +-One further "final" note: this may well be the last release to include +-separate fix- and enhancements-patches. It is too much of a timesink to +-maintain parallel trees--not to mention parallel makefiles (generic/public +-vs. local/personal, old vs. new libjpeg/libtiff) and xv.h (unregistered/ +-public vs. registered/personal), particularly when some fixes come about +-while working on an enhancement. Henceforth--assuming, of course, that +-there _is_ a "henceforth"--I expect to merge the patches into a single +-jumbo patch. (Alternatively, I may simply freeze the current fix-patch +-and continue to evolve only the enhancements patch; in particular, new +-fixes would appear only in it. Either approach would be simple enough; +-feedback as to which would be preferable is welcomed.) ++in any way (although I copied him on the May 2004 announcement--no response ++at that time). Nor have I personally tested every change and feature! (See ++the BIG SCARY WARNING below for further caveats.) In other words, they're ++both completely unofficial and completely unguaranteed. But they seem to ++work for me. (And when they don't, I fix 'em. Eventually, anyway... ;-) ) ++ ++One further "final" note: as of this release, I am no longer updating the ++fixes patch; new stuff (including fixes) now appears only in the enhancements ++one. It simply became too much of a timesink to maintain parallel trees--not ++to mention parallel makefiles (generic/public vs. local/personal, old vs. ++new libjpeg/libtiff) and xv.h (unregistered/public vs. registered/personal), ++particularly when some fixes came about while working on an enhancement and ++others were provided by third parties relative to the previous fix+enh state. ++Hence the mismatched "20050410" date on the fixes patch. + +-GRR 20050410 ++GRR 20050501 + + + How to build +@@ -158,8 +153,8 @@ + Assuming you have the prerequisites out of the way and aren't scared + off by the Big Scary Warning, here's the build procedure: + +- bzip2 -dc xv-3.10a-jumbo-patches-20050410.tar.bz2 | tar xvf - +- (or tar xvzf xv-3.10a-jumbo-patches-20050410.tar.gz) ++ bzip2 -dc xv-3.10a-jumbo-patches-20050501.tar.bz2 | tar xvf - ++ (or tar xvzf xv-3.10a-jumbo-patches-20050501.tar.gz) + + tar xvzf xv-3.10a.tar.gz + +@@ -167,7 +162,7 @@ + + patch -p1 < ../xv-3.10a-jumbo-fix-patch-20050410.txt + +- [optional] patch -p1 < ../xv-3.10a-jumbo-enh-patch-20050410.txt ++ [optional] patch -p1 < ../xv-3.10a-jumbo-enh-patch-20050501.txt + + edit Makefile and config.h as directed in INSTALL file (in particular, + ensure paths to external libraries and header files are correct) +@@ -221,6 +216,8 @@ + - freebsd-vdcomp-newline.patch (AAC) + - xv-3.10a.patch.linux (PBJ) [/bin/sh versions of cleandir, RANLIB.sh only] + - removed trailing white space (GRR) [purely cosmetic] ++20040523: ++ - fixed compilation error in registered versions (GRR) + 20050410: + - fix for YCbCr oversaturated-green bug(s) in TIFF decoder (GRR) + - provisional fix for contiguous tiled TIFFs with bottom-* orientation (GRR) +@@ -265,12 +262,50 @@ + - boosted maximum number of files from 4096 to 32768 (GRR) + (note that OS kernel limits may also apply; for example, in Linux see + MAX_ARG_PAGES in linux-<version>/include/linux/binfmts.h) +- - xv-3.10a-bmp16.patch +- (from http://www.coara.or.jp/~sudakyo/XV_jp.html) ++ - xv-3.10a-bmp16.patch (KS) + - final-image delay (e.g., "-wait 0.2,3" : pause 3 secs on final image) (GRR) + - xv-numpad.patch (EK) + - xv-delete-is-not-backspace.patch (EK) + - made browser window (schnauzer) and icons configurable (AT, GRR) ++20050501: ++ - xv-3.10a-bmpfix.patch (WF) [*SECURITY*] ++ - xv310a-jp-extension-rev5.3.3.tar.gz (TI, IM, ..., WF) ++ (adds support for MAG, MAKI, Pi, PIC, and PIC2 formats[*]; "magic suffix" ++ detection/conversion; MacBinary prefixes; archives as virtual filesystems; ++ multilingual text viewer [though not Unicode]; etc.) ++ - xv-3.10a-yaos.dif (WF, TO) [*SECURITY*] ++ (fixes a number of format-string issues and system() calls) ++ - xv-3.10a.dif (WF) [*SECURITY*] ++ (fixes more format-string issues, mktemp() and open() calls, and compilation ++ warnings [mostly from jp-extension patch]) ++ - xv-3.10a-jumbo-jpd_startgrab-patch-20050420.txt (JPD) ++ - PATCH.alwaysnever (LJ) ++ - PATCH.bsd (LJ) ++ - PATCH.linedraw (LJ) ++ - PATCH.multipage (LJ) ++ - PATCH.multipageGIF (LJ) ++ - PATCH.random (LJ) ++ - PATCH.stat (LJ) ++ - PATCH.thumbs (LJ) ++ - xv-startgrab-imake-hips.patch (JPD) ++ ("hips" portion only; adds support for HIPS image format[*]) ++ - xv-3.10a-formatstr.patch (KS) ++ - xv-3.10a-shortsleep.patch (KS) ++ - xv-3.10a-locale-linux.patch (KS) ++ - xv-3.10a-printkey.patch (KS) ++ - xv-3.10a-sysconfdir.patch (KS) ++ - added PREFIX and DESTDIR support to Makefile (KS, GRR) ++ - xv-3.10a-xvexecpath.patch (but disabled pending fixes) (KS) ++ - xv-3.10a-zeroquit.patch (KS, GRR) ++ ++ ++[*] Note that all six of these formats may still suffer from exploitable heap ++ overflows [*SECURITY*] when decoding images with large (possibly invalid) ++ dimensions; as a result, they are DISABLED by default. (Search for "GRR ++ POSSIBLE OVERFLOW / FIXME" comments in xvmag.c, xvmaki.c, xvpi.c, xvpic.c, ++ xvpic2.c, and xvhips.c, but keep in mind that these may not be exhaustive.) ++ Users who choose to overlook these security issues can enable any or all ++ of them by editing config.h. + + + not (yet?) included: +@@ -284,31 +319,21 @@ + -rw-r--r-- 42397 Mar 11 2004 xv-3.10a-download-test2.patch + -rw-r--r-- 47679 Mar 11 2004 xv-3.10a-download-test3.patch + -rw-r--r-- 52745 Mar 11 2004 xv-3.10a-download-test4.patch +- -rw-r--r-- 415 Mar 11 2004 xv-3.10a-formatstr.patch + -rw-r--r-- 3423 Apr 24 2004 xv-3.10a-keyzoom.patch +- -rw-r--r-- 1461 Mar 11 2004 xv-3.10a-locale-linux.patch + -rw-r--r-- 12387 Mar 15 2004 xv-3.10a-menubutton.patch + -rw-r--r-- 1178 Apr 24 2004 xv-3.10a-noblink.patch +- -rw-r--r-- 484 Mar 11 2004 xv-3.10a-printkey.patch + -rw-r--r-- 57092 Jul 9 2004 xv-3.10a-resolution.patch + -rw-r--r-- 4645 Apr 24 2004 xv-3.10a-selall.patch +- -rw-r--r-- 360 Mar 11 2004 xv-3.10a-shortsleep.patch + -rw-r--r-- 702 Apr 24 2004 xv-3.10a-showlongname.patch + -rw-r--r-- 1205 Apr 24 2004 xv-3.10a-staytoppdir.patch +- -rw-r--r-- 1591 Mar 15 2004 xv-3.10a-sysconfdir.patch + -rw-r--r-- 4228 Apr 24 2004 xv-3.10a-wheelmouse.patch + -rw-r--r-- 744 Apr 24 2004 xv-3.10a-xvbutt_wait.patch +- -rw-r--r-- 712 Mar 11 2004 xv-3.10a-xvexecpath.patch + -rw-r--r-- 3757 Jul 9 2004 xv-3.10a-xvscrl_button2.patch + -rw-r--r-- 1494 Jul 9 2004 xv-3.10a-xvscrl_wait.patch + -rw-r--r-- 19352 Jul 9 2004 xv-3.10a-xvzoom.patch +- -rw-r--r-- 1827 Apr 24 2004 xv-3.10a-zeroquit.patch + +- - xv310a-jp-extension-rev5.3.3.tar.gz [extensive] +- - xv-3.10a-jp-extension-5.3.3-png-1.2d.patch [PNG patch relative to jp-ext] +- - xv-3.10a+jp-extension-rev5.3.3+FLmask.v2.1+png+misc.patch [??] ++ - xv-3.10a+jp-extension-rev5.3.3+FLmask.v2.1+png+misc.patch ["mask" support] + +- - xv-grab-imake-hips.patch (JPD) [HIPS format, -startgrab option] + - xv-psnewstyle.patch (TA) [coming later in 2005?] + - xv-3.10a.patch.linux (PBJ) [maybe use vdcomp.c changes?] + - xvxpm-anthony-thyssen.c (AT) ["slate grey" bug already gone?] +@@ -332,8 +357,8 @@ + not finished (and/or even started ;-) ): + + - fix xvpng.c not to use direct struct access +- - fix for never-ending pile of SLOW popups when viewing TIFFs with unknown tags +- (or truncated/corrupted images) ++ - (better) fix for never-ending pile of SLOW popups when viewing TIFFs with ++ unknown tags (or truncated/corrupted images) + - fix for minor .Z inefficiency in xv.c ("FIXME") + - fix for filename entry-field mouse/cursor bogosity + (want at least positioning to work; preferably also select/cut/paste) +@@ -344,6 +369,7 @@ + - transparency support for TIFF, XPM and TGA images + - support for tiled background image (with transparent foreground image) + - MNG/JNG support ++ - SVG support + + + ChangeLog +@@ -364,7 +390,7 @@ + 20040531 + fixed undefined CLK_TCK with gcc -ansi (enh/USE_TICKS option); made + libjpeg, libtiff, libpng and zlib sections of makefile more consistent +- (enh); ++ (enh) + + 20040606 + added freshmeat link, build instructions, and changelog to jumbo README +@@ -385,3 +411,32 @@ + sex bug in 24-bit FixPix display code (enh/USE_24BIT_ENDIAN_FIX option); + fixed numerical-keypad NumLock behavior and delete-key behavior in file- + load/save window (enh); made schnauzer window and icons configurable (enh) ++ ++ 20050417 ++ incorporated "Japanese extension" patches, revision 5.3.3 (enh); fixed ++ additional *SECURITY* issues (format-string vulnerabilities, system() ++ and mktemp() calls, etc., but NOT heap overflows in new decoders) both ++ in existing code and in jp-extension additions (enh) ++ ++ 20050425 ++ added support for -startgrab option (enh); added support for a "Never" ++ button to file-overwrite popups (enh); added NetBSD and BSDI to list of ++ mkstemp()-supporting systems (enh); improved line-drawing code to set the ++ correct pixels for lines of all slopes (enh); added "Page n of m" to Info ++ window for multipage images (enh); added support for multipage (animated) ++ GIFs (enh); fixed -random support so randomized file list can be traversed ++ normally in forward or backward direction (enh); added typecasts to stat() ++ printfs for portability (enh); fixed erroneous use of "creation" time and ++ forced unlink prior to overwrite in schnauzer thumbnail code (enh); added ++ HIPS support (enh/HAVE_HIPS option) ++ ++ 20050501 ++ extended multipage keyboard support (PgUp/PgDn) to all windows except ++ control ("console") and directory (enh); fixed minor (non-security) ++ format-string issue in xv.c (enh); shortened delay on popup error windows ++ from 3 seconds to 1 second (enh); tweaked text-viewer localization support ++ (TV_L10N) for Linux (enh); added keyboard short cuts for Color and ++ Grayscale buttons in print dialog (enh); added support for separate "magic ++ suffix" (xv_mgcsfx) config dir (enh); added PREFIX and DESTDIR support to ++ Makefile (enh); fixed handling of zero-length files and other text-viewer ++ failures (enh) +diff -ruN xv-3.10a-bugfixes/README.pcd xv-3.10a-enhancements/README.pcd +--- xv-3.10a-bugfixes/README.pcd 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/README.pcd 2001-07-08 11:21:19.000000000 -0700 +@@ -0,0 +1,159 @@ ++Copyright 1993-2001 David Clunie. ++ ++PCD patch for XV 3.10a Release Notes 2001/07/08. ++ ++See also the progress notes at the end of this file. Thanks to all those ++contributors who have substantially improved this patch. ++ ++These patches allow xv to read Kodak photocd files and choose which of the ++5 available resolutions one wants to view. ++ ++When a photocd file is loaded, a dialog box asks which resolution you ++would like. The visual schnauzer builds thumbnails by reading the lowest ++resolution image. The selected resolution can be selected from the ++command line with the -pcd option: ++ ++ [-pcd 0|1|2|3|4] ++ ++where: ++ ++ 0=192*128, base/16 resolution ++ 1=384*256, base/4 resolution ++ 2=768*512, base resolution ++ 3=1536*1024, 4base resolution ++ 4=3072*2048 16base resolution. ++ ++Note that the Pro format is not supported. ++ ++The command line option allows loops without the dialog box popping up, eg.: ++ ++ xv -pcd 1 -wloop -wait 10 *.pcd ++ ++The code is pretty crude and was written quickly for a specific purpose and ++has not really been cleaned up. It is poorly structured, full of debugging ++codes and verbose comments, and there is very little attempt at optimizing ++things. No profiling has been done. ++ ++There is not yet support for overview files, nor is there a facility to ++use the higher resolution chroma planes from when viewing lower resolution ++images. ++ ++It's only claim to fame is that it works and produces reasonable looking ++images. ++ ++The outline of this is shamelessly derived from xvpbm.c to read the ++file, and xvtiffwr.c to handle the popup window and X stuff (X never ++has been my forte !), and the PhotoCD format information (though not ++the code) was found in Hadmut Danisch's (danisch@ira.uka.de) hpcdtoppm ++program in which he has reverse engineered the format by studying ++hex dumps of PhotoCDs ! The color stuff and Huffman decding were ++extensively revised by Matthew Francey. ++ ++Feel free to send me comments or improvements, or even better, more ++information about the photo CD format ... hopefully someone who really ++knows what they are doing will tidy it up or do a neater job. ++ ++david (dclunie@dclunie.com) ++ ++--------- ++ ++The trace #define in xvpcd.c is now in the right place, and the ansi ++prototype for the magnify function has been fixed. Colin made me switch to ++xvbcopy() which seems like a good idea for System V victims. ++ ++--------- ++ ++Date: Wed, 22 Dec 1993 16:09:52 --1000 ++From: colinc@fitmail.fit.qut.edu.au (Colin Canfield ) ++ ++I have done some more work using your patch I thought you might be intested in. ++The major change was adding a size parameter to the LoadPCD; either -1 to mean ++the popup or else the size you desired. This allows batch mode processing, ++specifically xv -pcd <size> <filename>, and the visual schnauzer can work in ++quick mode (ie. you don't have to select each image size when it is building ++the icons) ++ ++I have added an xbm file for the file type but haven't drawn an icon for it, ++this is in bitmaps/br_pcd.xbm. I will just send you the new files. ++ ++--------- ++ ++From: andrew@andrew.triumf.ca (Andrew Daviel) ++Date: 16 Feb 1995 23:32:21 GMT ++ ++This is David Clunie's patch for xv-3.00 tuned a bit to work ++on xv-3.10. The code's all the same except for replacing ++"trace" with "fprintf" in xvpcd.c and adding an "unsigned" qualifier to ++keep my compiler (gcc) happy. Oh yes, changed RFT_PCD to 20 as ++John Bradley has now used 15 through 19. ++ ++--------- ++ ++From: dclunie@flash.us.com (David A. Clunie) ++Date: Thu Jun 15 14:43:46 GMT+0300 1995 ++ ++Andrew's patch didn't include Colin's browser changes, so I redid the ++xv-3.10 update from scratch ... it seems pretty much the same as ++Andrew's changes. I also edited the Imakefile and Makefiles in order ++to support the PCD changes, as well as make the install process a ++little more flexible, with options to strip and set modes and so on. ++Also made RFT_PCD 25 so as not to conflict with magpic patch from Japan ++by Ikemoto Masahiro <ikeyan@airlab.cs.ritsumei.ac.jp>, and used his ++bitmap icon for pcd files. ++ ++Now there are two versions of the patch, one which should be applied ++to the xv-3.10 distribution. ++ ++The other should be applied to xv-3.10 AFTER Ikemoto Masahiro's ++Patch.magpic2.PhotoCD.XV319a, in order to add the browser features to ++the latter, as well as fixing a Makefile typo (was xcpcd.c not xvpcd.c) ++and including unistd.h for the SEEK_xxx constants in the magicpic ++stuff. ++ ++--------- ++ ++Subject: Re: photo-cd patch for xv ++From: Matthew Francey <mdf@angoss.com> ++Date: Mon, 26 Mar 2001 15:37:55 +0000 ++ ++Attached is a revised version of xvpcd.c; the areas that I have ++re-written or changed are in a different coding style so you can tell ++what has changed. The GNU 'indent' program can be run against the file ++to enforce a consistent style .. ++ ++Here is what I've done though: ++ ++a) huffman table reader re-written, because it would fail on some ++ photocd files with "unusual" huffman codes. ++ ++b) the huffman-coded corrections are now properly applied ++ ++c) the corrections can sometimes over or underflow; clipping has been ++ introduced and effectively fixes the problem, but I suspect that ++ there is something deeper going on. ++ ++d) the "official" YCC->sRGB transform is done. a "beyond 100% white" ++ mapping table was snarfed from ImageMagick. an option for using a ++ flat linear LUT was added -- this can make somewhat over-exposed images ++ look alot nicer. ++ ++e) there were strange problems where the code wouldn't be able to find ++ the huffman tables and data for the 16base image (the bit-buffering ++ code was starting mid-sector, instead of at a sector boundary). Looking ++ at a pcd file with a hex editor suggests to me that it is possible to ++ just skip directly to these huffman tables -- no special "+12" and such ++ constants necessary. But I haven't tried this yet. ++ ++The results: I've been able to read about 50 or 60 .pcd files [scattered ++in age from 6 years old to scans done last week] with this code without ++incident. Image quality at the high resolution is excellent. Even the ++trivial amount of LUT control is useful when dealing with over-exposed ++images. ++ ++If I get around to it: finer LUT control to take advantage of the ++slightly extended dynamic range of PhotoCD scans, especially in regards to ++dark or somewhat underexposed scenes. ++ ++ ++ ++ +diff -ruN xv-3.10a-bugfixes/bggen.c xv-3.10a-enhancements/bggen.c +--- xv-3.10a-bugfixes/bggen.c 2004-05-16 17:50:52.000000000 -0700 ++++ xv-3.10a-enhancements/bggen.c 2005-04-17 14:04:22.000000000 -0700 +@@ -34,7 +34,7 @@ + #define MAXCOLS 128 + + /* some VMS thing... */ +-#ifdef vax11c ++#if defined(vax11c) || (defined(__sony_news) && (defined(bsd43) || defined(__bsd43) || defined(SYSTYPE_BSD) || defined(__SYSTYPE_BSD))) + #include <ctype.h> + #endif + +diff -ruN xv-3.10a-bugfixes/bits/br_bzip2 xv-3.10a-enhancements/bits/br_bzip2 +--- xv-3.10a-bugfixes/bits/br_bzip2 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_bzip2 1998-04-12 19:23:39.000000000 -0700 +@@ -0,0 +1,27 @@ ++#define br_bzip2_width 48 ++#define br_bzip2_height 48 ++static unsigned char br_bzip2_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x7c, 0xbe, 0x3d, 0x0e, 0x02, 0x20, 0xfc, 0xbe, 0x7d, 0x1f, 0x02, ++ 0x20, 0xcc, 0xb0, 0x6d, 0x1b, 0x02, 0x20, 0xcc, 0x98, 0x6d, 0x1b, 0x02, ++ 0x20, 0xfc, 0x98, 0x6d, 0x18, 0x02, 0x20, 0x7c, 0x8c, 0x7d, 0x0c, 0x02, ++ 0x20, 0xcc, 0x8c, 0x3d, 0x0e, 0x02, 0x20, 0xcc, 0x84, 0x0d, 0x06, 0x02, ++ 0x20, 0xcc, 0x86, 0x0d, 0x03, 0x02, 0x20, 0xfc, 0xbe, 0x0d, 0x1f, 0x02, ++ 0x20, 0x7c, 0xbe, 0x0d, 0x1f, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03}; +diff -ruN xv-3.10a-bugfixes/bits/br_mag xv-3.10a-enhancements/bits/br_mag +--- xv-3.10a-bugfixes/bits/br_mag 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_mag 2005-04-17 14:04:22.000000000 -0700 +@@ -0,0 +1,27 @@ ++#define br_mag_width 48 ++#define br_mag_height 48 ++static unsigned char br_mag_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x0c, 0x86, 0xc1, 0x0f, 0x02, ++ 0x20, 0x0c, 0xc6, 0xe3, 0x1f, 0x02, 0x20, 0x1c, 0xe7, 0x67, 0x18, 0x02, ++ 0x20, 0x1c, 0x77, 0x6e, 0x18, 0x02, 0x20, 0xbc, 0x37, 0x6c, 0x00, 0x02, ++ 0x20, 0xbc, 0x37, 0x6c, 0x00, 0x02, 0x20, 0xec, 0x36, 0x6c, 0x1e, 0x02, ++ 0x20, 0xec, 0xf6, 0x6f, 0x1e, 0x02, 0x20, 0x4c, 0xf6, 0x6f, 0x18, 0x02, ++ 0x20, 0x4c, 0x36, 0x6c, 0x18, 0x02, 0x20, 0x0c, 0x36, 0x6c, 0x18, 0x02, ++ 0x20, 0x0c, 0x36, 0xec, 0x1f, 0x02, 0x20, 0x0c, 0x36, 0xcc, 0x0f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03}; +diff -ruN xv-3.10a-bugfixes/bits/br_maki xv-3.10a-enhancements/bits/br_maki +--- xv-3.10a-bugfixes/bits/br_maki 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_maki 2005-04-17 14:04:22.000000000 -0700 +@@ -0,0 +1,27 @@ ++#define br_maki_width 48 ++#define br_maki_height 48 ++static unsigned char br_maki_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x83, 0x61, 0x18, 0x33, 0x02, ++ 0x20, 0x83, 0xf1, 0x98, 0x33, 0x02, 0x20, 0xc7, 0xf9, 0x99, 0x31, 0x02, ++ 0x20, 0xc7, 0x9d, 0xdb, 0x30, 0x02, 0x20, 0xef, 0x0d, 0xfb, 0x30, 0x02, ++ 0x20, 0xef, 0x0d, 0x7b, 0x30, 0x02, 0x20, 0xbb, 0x0d, 0x7b, 0x30, 0x02, ++ 0x20, 0xbb, 0xfd, 0xdb, 0x30, 0x02, 0x20, 0x93, 0xfd, 0xdb, 0x30, 0x02, ++ 0x20, 0x93, 0x0d, 0x9b, 0x31, 0x02, 0x20, 0x83, 0x0d, 0x9b, 0x31, 0x02, ++ 0x20, 0x83, 0x0d, 0x1b, 0x33, 0x02, 0x20, 0x83, 0x0d, 0x1b, 0x33, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03}; +diff -ruN xv-3.10a-bugfixes/bits/br_mgcsfx xv-3.10a-enhancements/bits/br_mgcsfx +--- xv-3.10a-bugfixes/bits/br_mgcsfx 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_mgcsfx 2005-04-17 14:04:22.000000000 -0700 +@@ -0,0 +1,27 @@ ++#define br_mgcsfx_width 48 ++#define br_mgcsfx_height 48 ++static unsigned char br_mgcsfx_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x3c, 0xcf, 0x71, 0x00, 0x02, ++ 0x20, 0x6c, 0x61, 0xda, 0x00, 0x02, 0x20, 0x6c, 0x67, 0xd8, 0x1e, 0x02, ++ 0x20, 0x3c, 0x61, 0xd8, 0x1e, 0x02, 0x20, 0x6c, 0x61, 0xda, 0x00, 0x02, ++ 0x20, 0x6c, 0xcf, 0x71, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x4e, 0x7a, 0xef, 0x3d, 0x02, 0x20, 0xd3, 0x32, 0x68, 0x6c, 0x02, ++ 0x20, 0xc3, 0x32, 0xe4, 0x6c, 0x02, 0x20, 0x5b, 0x33, 0x62, 0x6c, 0x02, ++ 0x20, 0x53, 0x33, 0x61, 0x6c, 0x02, 0x20, 0x4e, 0x7a, 0xef, 0x3d, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03}; +diff -ruN xv-3.10a-bugfixes/bits/br_pcd xv-3.10a-enhancements/bits/br_pcd +--- xv-3.10a-bugfixes/bits/br_pcd 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_pcd 1995-06-15 21:31:53.000000000 -0700 +@@ -0,0 +1,27 @@ ++#define br_pcd_width 48 ++#define br_pcd_height 48 ++static unsigned char br_pcd_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x67, 0x00, 0xe0, 0x1c, 0x02, ++ 0x20, 0x6f, 0x00, 0xf0, 0x3d, 0x02, 0x20, 0x6b, 0x00, 0xb0, 0x2d, 0x02, ++ 0x20, 0x6b, 0x00, 0x33, 0x2c, 0x02, 0x20, 0x6b, 0x00, 0x33, 0x2c, 0x02, ++ 0x20, 0xeb, 0x98, 0x37, 0x2c, 0x02, 0x20, 0xef, 0xbd, 0x37, 0x2c, 0x02, ++ 0x20, 0x67, 0x2d, 0x33, 0x2c, 0x02, 0x20, 0x63, 0x2d, 0x33, 0x2c, 0x02, ++ 0x20, 0x63, 0x2d, 0x33, 0x2c, 0x02, 0x20, 0x63, 0x2d, 0xb3, 0x2d, 0x02, ++ 0x20, 0x63, 0x3d, 0xf7, 0x3d, 0x02, 0x20, 0x63, 0x19, 0xe6, 0x1c, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03}; +diff -ruN xv-3.10a-bugfixes/bits/br_pi xv-3.10a-enhancements/bits/br_pi +--- xv-3.10a-bugfixes/bits/br_pi 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_pi 2005-04-17 14:04:22.000000000 -0700 +@@ -0,0 +1,27 @@ ++#define br_pi_width 48 ++#define br_pi_height 48 ++static unsigned char br_pi_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x80, 0x1f, 0x7e, 0x00, 0x02, ++ 0x20, 0x80, 0x3f, 0x7e, 0x00, 0x02, 0x20, 0x80, 0x31, 0x18, 0x00, 0x02, ++ 0x20, 0x80, 0x31, 0x18, 0x00, 0x02, 0x20, 0x80, 0x31, 0x18, 0x00, 0x02, ++ 0x20, 0x80, 0x39, 0x18, 0x00, 0x02, 0x20, 0x80, 0x1f, 0x18, 0x00, 0x02, ++ 0x20, 0x80, 0x0f, 0x18, 0x00, 0x02, 0x20, 0x80, 0x01, 0x18, 0x00, 0x02, ++ 0x20, 0x80, 0x01, 0x18, 0x00, 0x02, 0x20, 0x80, 0x01, 0x18, 0x00, 0x02, ++ 0x20, 0x80, 0x01, 0x7e, 0x00, 0x02, 0x20, 0x80, 0x01, 0x7e, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03}; +diff -ruN xv-3.10a-bugfixes/bits/br_pic xv-3.10a-enhancements/bits/br_pic +--- xv-3.10a-bugfixes/bits/br_pic 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_pic 2005-04-17 14:04:22.000000000 -0700 +@@ -0,0 +1,27 @@ ++#define br_pic_width 48 ++#define br_pic_height 48 ++static unsigned char br_pic_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xf0, 0xf3, 0xf3, 0x01, 0x02, ++ 0x20, 0xf0, 0xf7, 0xfb, 0x03, 0x02, 0x20, 0x30, 0xc6, 0x18, 0x03, 0x02, ++ 0x20, 0x30, 0xc6, 0x18, 0x00, 0x02, 0x20, 0x30, 0xc6, 0x18, 0x00, 0x02, ++ 0x20, 0x30, 0xc7, 0x18, 0x00, 0x02, 0x20, 0xf0, 0xc3, 0x18, 0x00, 0x02, ++ 0x20, 0xf0, 0xc1, 0x18, 0x00, 0x02, 0x20, 0x30, 0xc0, 0x18, 0x00, 0x02, ++ 0x20, 0x30, 0xc0, 0x18, 0x00, 0x02, 0x20, 0x30, 0xc0, 0x18, 0x03, 0x02, ++ 0x20, 0x30, 0xf0, 0xfb, 0x03, 0x02, 0x20, 0x30, 0xf0, 0xf3, 0x01, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03}; +diff -ruN xv-3.10a-bugfixes/bits/br_pic2 xv-3.10a-enhancements/bits/br_pic2 +--- xv-3.10a-bugfixes/bits/br_pic2 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_pic2 2005-04-17 14:04:22.000000000 -0700 +@@ -0,0 +1,27 @@ ++#define br_pic2_width 48 ++#define br_pic2_height 48 ++static unsigned char br_pic2_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x3f, 0x3f, 0x1f, 0x1f, 0x02, ++ 0x20, 0x7f, 0xbf, 0xbf, 0x3f, 0x02, 0x20, 0x63, 0x8c, 0xb1, 0x31, 0x02, ++ 0x20, 0x63, 0x8c, 0x01, 0x30, 0x02, 0x20, 0x63, 0x8c, 0x01, 0x30, 0x02, ++ 0x20, 0x73, 0x8c, 0x01, 0x30, 0x02, 0x20, 0x3f, 0x8c, 0x01, 0x18, 0x02, ++ 0x20, 0x1f, 0x8c, 0x01, 0x0c, 0x02, 0x20, 0x03, 0x8c, 0x01, 0x06, 0x02, ++ 0x20, 0x03, 0x8c, 0x01, 0x03, 0x02, 0x20, 0x03, 0x8c, 0xb1, 0x01, 0x02, ++ 0x20, 0x03, 0xbf, 0xbf, 0x3f, 0x02, 0x20, 0x03, 0x3f, 0x9f, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03}; +diff -ruN xv-3.10a-bugfixes/bits/br_png xv-3.10a-enhancements/bits/br_png +--- xv-3.10a-bugfixes/bits/br_png 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_png 1996-06-13 14:32:08.000000000 -0700 +@@ -0,0 +1,28 @@ ++#define br_png_width 48 ++#define br_png_height 48 ++static unsigned char br_png_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0xf8, 0x19, 0xc3, 0x07, 0x02, 0x20, 0x18, 0x3b, 0x63, 0x0c, 0x02, ++ 0x20, 0x18, 0x3b, 0x33, 0x00, 0x02, 0x20, 0x18, 0x5b, 0x33, 0x00, 0x02, ++ 0x20, 0xf8, 0x59, 0x33, 0x0f, 0x02, 0x20, 0x18, 0x98, 0x33, 0x0c, 0x02, ++ 0x20, 0x18, 0x98, 0x33, 0x0c, 0x02, 0x20, 0x18, 0x18, 0x63, 0x0c, 0x02, ++ 0x20, 0x18, 0x18, 0xc3, 0x0b, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03, ++ }; +diff -ruN xv-3.10a-bugfixes/bits/br_zx xv-3.10a-enhancements/bits/br_zx +--- xv-3.10a-bugfixes/bits/br_zx 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/bits/br_zx 1998-08-06 13:00:03.000000000 -0700 +@@ -0,0 +1,28 @@ ++#define br_zx_width 48 ++#define br_zx_height 48 ++static unsigned char br_zx_bits[] = { ++ 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, ++ 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x7f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x7f, 0xce, 0x01, 0x0e, 0x02, 0x20, 0x61, 0x84, 0x00, 0x11, 0x02, ++ 0x20, 0x30, 0x48, 0x00, 0x10, 0x02, 0x20, 0x18, 0x38, 0x10, 0x08, 0x02, ++ 0x20, 0x0c, 0x30, 0x10, 0x0e, 0x02, 0x20, 0x06, 0x68, 0x7c, 0x10, 0x02, ++ 0x20, 0x03, 0x48, 0x10, 0x10, 0x02, 0x20, 0x41, 0x84, 0x10, 0x11, 0x02, ++ 0x20, 0x7f, 0xce, 0x01, 0x0e, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0xff, 0xff, 0xff, 0xff, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x40, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, ++ 0x20, 0x00, 0x00, 0x00, 0x10, 0x02, 0x20, 0x00, 0x00, 0x00, 0x08, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0x84, 0x03, 0x20, 0x00, 0x00, 0x00, 0xc2, 0x03, ++ 0x20, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x20, 0x00, 0x00, 0x80, 0xf0, 0x02, ++ 0x20, 0x00, 0x00, 0x40, 0x78, 0x02, 0x20, 0x00, 0x00, 0x20, 0x3c, 0x02, ++ 0x20, 0x00, 0x00, 0x10, 0x1e, 0x02, 0x20, 0x00, 0x00, 0x08, 0x0f, 0x03, ++ 0x20, 0x00, 0x00, 0x84, 0x87, 0x03, 0x20, 0x00, 0x00, 0xc2, 0xc3, 0x03, ++ 0x20, 0x00, 0x00, 0xe1, 0xe1, 0x03, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03, ++ }; +diff -ruN xv-3.10a-bugfixes/config.h xv-3.10a-enhancements/config.h +--- xv-3.10a-bugfixes/config.h 2005-03-21 23:21:31.000000000 -0800 ++++ xv-3.10a-enhancements/config.h 2005-04-30 23:52:42.000000000 -0700 +@@ -6,26 +6,46 @@ + /*************************************************************************** + * GZIP'd file support + * +- * if you have the gnu uncompression utility 'gunzip', XV can use it to +- * automatically 'unzip' any gzip'd files. To enable this feature, +- * change 'undef' to 'define' in the following line. Needless to say, if +- * your gunzip is installed elsewhere on your machine, change the 'GUNZIP' +- * definition appropriately. (use 'which gunzip' to find if you have gunzip, +- * and where it lives) ++ * if you have the GNU uncompression utility 'gunzip' (or 'gzip' itself, ++ * which is just a link to gunzip), XV can use it to automatically 'unzip' ++ * any gzip'd files. To enable this feature, change 'undef' to 'define' in ++ * the following line. Needless to say, if your gunzip is installed elsewhere ++ * on your machine, change the 'GUNZIP' definition appropriately. (use ++ * 'which gunzip' to find if you have gunzip, and where it lives; ditto for ++ * gzip) + */ +-#undef USE_GUNZIP ++#define USE_GUNZIP + + #ifdef USE_GUNZIP + # ifdef VMS + # define GUNZIP "UNCOMPRESS" + # else +-/* define GUNZIP "/usr/local/bin/gunzip -q" */ +-# define GUNZIP "/usr/bin/gzip -dq" /* more portable */ ++# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__linux__) ++# define GUNZIP "/usr/bin/gzip -dq" ++# else ++# define GUNZIP "/usr/local/bin/gzip -dq" /* is full path truly needed? */ ++# endif + # endif + #endif + + + /*************************************************************************** ++ * BZIP2'd file support ++ * ++ * if you have the uncompression utility 'bunzip2' (or 'bzip2' itself, which ++ * is just a link to bunzip2), XV can use it to automatically 'unzip' any ++ * bzip2'd files. To enable this feature, change 'undef' to 'define' in the ++ * following line (if not already done). Use 'which bunzip2' or 'which bzip2' ++ * to find if you have bzip2/bunzip2, and where it lives. ++ */ ++#define USE_BUNZIP2 ++ ++#ifdef USE_BUNZIP2 ++# define BUNZIP2 "bzip2 -d" /* should this include the full path? */ ++#endif ++ ++ ++/*************************************************************************** + * compress'd file support + * + * if you have GUNZIP defined above, just ignore this, as 'gunzip' can +@@ -38,7 +58,14 @@ + */ + #define UNCOMPRESS "/usr/ucb/uncompress" + +-#if defined(hpux) || defined(SVR4) || defined(__386BSD__) ++#if defined(hpux) || defined(SVR4) || \ ++ defined(__386BSD__) || defined(__FreeBSD__) || defined(__NetBSD__) || \ ++ defined(__linux__) ++ /* ++ I want to use BSD macro for checking if this OS is *BSD or not, ++ but the macro is defined in <sys/parm.h>, which I don't know all ++ machine has or not. ++ */ + # undef UNCOMPRESS + # define UNCOMPRESS "/usr/bin/uncompress" + #endif +@@ -90,6 +117,7 @@ + */ + + /* #define GS_PATH "/usr/local/bin/gs" */ ++#define GS_PATH "/usr/bin/gs" + /* #define GS_LIB "." */ + /* #define GS_DEV "ppmraw" */ + +@@ -120,3 +148,201 @@ + + #define BACKING_STORE + ++ ++/*************************************************************************** ++ * PhotoCD/MAG/PIC/MAKI/Pi/PIC2/HIPS format Support: ++ * ++ * if, for whatever reason--say, security concerns--you don't want to ++ * include support for one or more of the PhotoCD, MAG/MAKI/Pi/PIC/PIC2 ++ * (Japanese), or HIPS (astronomical) image formats, change the relevant ++ * 'define' to 'undef' in the following lines. Conversely, if you *do* ++ * want them, change 'undef' to 'define' as appropriate. ++ */ ++ ++#define HAVE_PCD /* believed to be reasonably safe */ ++ ++#undef HAVE_MAG /* probable security issues */ ++#undef HAVE_MAKI /* probable security issues */ ++#undef HAVE_PI /* probable security issues */ ++#undef HAVE_PIC /* probable security issues */ ++#undef HAVE_PIC2 /* probable security issues */ ++ ++#undef HAVE_HIPS /* probable security issues */ ++ ++ ++/*************************************************************************** ++ * MacBinary file support: ++ * ++ * if you want XV to be able to handle ``MacBinary'' files (which have ++ * 128 byte info file header at the head), change 'undef' to 'define' ++ * in the following line. ++ */ ++ ++#undef MACBINARY ++ ++ ++/*************************************************************************** ++ * Auto Expand support: ++ * ++ * if you want to extract archived file automatically and regard it as ++ * a directory, change 'undef' to 'define' in the AUTO_EXPAND line. ++ * ++ * Virtual Thumbdir support: ++ * ++ * if you want Virtual directory based Thumbdir(It means that XV ++ * doesn't forget builded Icons still be quited even if the directory ++ * is read-only), change 'undef' to 'define' the VIRTUAL_TD line. ++ */ ++ ++#undef AUTO_EXPAND ++#undef VIRTUAL_TD ++ ++#if defined(VIRTUAL_TD) && !defined(AUTO_EXPAND) ++# undef VIRTUAL_TD ++#endif ++ ++ ++/*************************************************************************** ++ * Adjust the aspect ratio of Icons: ++ * ++ * if you want to adjust the aspect ratio of the icons in Visual ++ * Schnauzer, change 'undef' to 'define' in the following line. ++ */ ++ ++#undef VS_ADJUST ++ ++ ++/*************************************************************************** ++ * Restore original colormap: ++ * ++ * if you want to restore original colormap when icons in Visual ++ * Shunauzer is double-clicked, change 'undef' to 'define' in the ++ * following line. ++ */ ++ ++#undef VS_RESCMAP ++ ++ ++/*************************************************************************** ++ * TextViewer l10n support: ++ * ++ * if you want XV to show the text in Japanese on TextViewer, change ++ * 'undef' to 'define' in the following line. ++ */ ++ ++#undef TV_L10N ++ ++#ifdef TV_L10N ++/* ++ * if you want to change the default code-set used in case that XV ++ * fails to select correct code-set, uncomment the '#define ++ * LOCALE_DEFAULT' line and change the 'LOCALE_DEFAULT' definition ++ * appropriately. ++ * (0:ASCII, 1:EUC-j, 2:JIS, 3:MS Kanji) */ ++ ++/* # define LOCALE_DEFAULT 0 */ ++ ++/* ++ * Uncomment and edit the following lines, if your X Window System was ++ * not compiled with -DX_LOCALE and you failed to display the Japanese ++ * text in TextViewer. You don't have to write locale name of JIS code-set ++ * and Microsoft code-set, if your system doesn't support those code-sets. ++ */ ++ ++/* ++# define LOCALE_NAME_EUC "ja_JP.EUC" ++# define LOCALE_NAME_JIS "ja_JP.JIS" ++# define LOCALE_NAME_MSCODE "ja_JP.SJIS" ++*/ ++ ++/* ++ * if your system doesn't have the Japanese fonts in the sizes, ++ * Uncomment and edit the following font size entries. ++ */ ++ ++/* # define TV_FONTSIZE 14,16,24 */ ++ ++/* ++ * If you need, uncomment and modify the following font name. ++ */ ++ ++/* # define TV_FONTSET "-*-fixed-medium-r-normal--%d-*" */ ++#endif /* TV_L10N */ ++ ++ ++/*************************************************************************** ++ * User definable filter support: ++ * ++ * Use the filters as input and output method for load and save unsupported ++ * image format file. The filter command is recognized by definition of ++ * magic number or suffix in "~/.xv_mgcsfx" . ++ * To enable this feature, change 'undef' to 'define' in the following line. ++ */ ++#undef HAVE_MGCSFX ++ ++#ifdef HAVE_MGCSFX ++/* ++ * Support symbol 'auto' as <input image type> in startup file. This type ++ * cannot use pipe as input; it writes to a temporary file and recognizes ++ * the actual filetype by XV processing. ++ */ ++# define HAVE_MGCSFX_AUTO ++ ++/* ++ * The startup file of definition for MgcSfx. 'MGCSFX_SITE_RC' is read ++ * first and '~/MGCSFX_RC' is second. So same definitions in both files ++ * are overridden by '~/MGCSFX_RC' ++ * To define startup file, see the sample of startup file 'xv_mgcsfx.sample'. ++ */ ++# define MGCSFX_SITE_RC "xv_mgcsfx" ++# define MGCSFX_RC ".xv_mgcsfx" ++ ++/* ++ * If you want startup file to pass preprocessor in reading time, then ++ * change 'undef' to 'define' in the following line. ++ * ++ * WARNING : If you decide to use preprocessor, you must not write ++ * '# <comment>' style comment in startup file. Because, ++ * preprocessor can't recognize. */ ++# undef USE_MGCSFX_PREPROCESSOR ++ ++# ifdef USE_MGCSFX_PREPROCESSOR ++/* ++ * This is used like "system("MGCSFX_PREPROCESSOR MGCSFX_RC > tmp_name");", ++ * and read tmp_name instead of MGCSFX_RC. ++ */ ++# define MGCSFX_PREPROCESSOR "/usr/lib/cpp" ++/* # define MGCSFX_PREPROCESSOR "cc -E" */ ++ ++# endif /* USE_MGCSFX_PREPROCESSOR */ ++ ++/* ++ * Default string of command. If input command is required for undefined file, ++ * dialog is popuped with 'MGCSFX_DEFAULT_INPUT_COMMAND'. And, if output ++ * command is required in save dialog of MgcSfx, dialog is popuped with ++ * 'MGCSFX_DEFAULT_OUTPUT_COMMAND'. ++ * ++ * WARNING : Now, supported only 'PNM' image format, when command input is ++ * required. You should define filter which use 'PNM' image format ++ * as input or output. ++ */ ++# define MGCSFX_DEFAULT_INPUT_COMMAND "tifftopnm" ++# define MGCSFX_DEFAULT_OUTPUT_COMMAND "pnmtotiff" ++ ++#endif /* HAVE_MGCSFX */ ++ ++ ++/*************************************************************************** ++ * Multi-Lingual TextViewer ++ * ++ * if you want XV to show the text in multi-lingual on TextViewer, change ++ * 'undef' to 'define' in the following line. ++ */ ++ ++#undef TV_MULTILINGUAL ++ ++#define TV_DEFAULT_CODESET TV_EUC_JAPAN ++ ++#ifdef TV_MULTILINGUAL ++# undef TV_L10N ++#endif +diff -ruN xv-3.10a-bugfixes/tiff/Makefile xv-3.10a-enhancements/tiff/Makefile +--- xv-3.10a-bugfixes/tiff/Makefile 2004-05-16 18:49:11.000000000 -0700 ++++ xv-3.10a-enhancements/tiff/Makefile 2005-04-17 14:45:28.000000000 -0700 +@@ -38,7 +38,7 @@ + IPATH= -I. + + COPTS= -O +-CFLAGS= ${COPTS} ${IPATH} ++CFLAGS= ${COPTS} ${IPATH} -D_BSD_SOURCE + + INCS= tiff.h tiffio.h + +diff -ruN xv-3.10a-bugfixes/vdcomp.c xv-3.10a-enhancements/vdcomp.c +--- xv-3.10a-bugfixes/vdcomp.c 2005-03-20 17:48:59.000000000 -0800 ++++ xv-3.10a-enhancements/vdcomp.c 2005-04-17 22:59:39.000000000 -0700 +@@ -106,6 +106,7 @@ + !defined(pyr) && \ + !defined(__UMAXV__) && \ + !defined(bsd43) && \ ++ !defined(__bsd43) && \ + !defined(aux) && \ + !defined(__bsdi__) && \ + !defined(sequent) && \ +@@ -115,7 +116,14 @@ + # if defined(hp300) || defined(hp800) || defined(NeXT) + # include <sys/malloc.h> /* it's in 'sys' on HPs and NeXT */ + # else +-# include <malloc.h> ++# if !defined(__386BSD__) && !defined(__FreeBSD__) && !defined(__NetBSD__) ++ /* ++ I want to use BSD macro for checking if this OS is *BSD or not, ++ but the macro is defined in <sys/parm.h>, which I don't know all ++ machine has or not. ++ */ ++# include <malloc.h> ++# endif + # endif + # endif + #endif /* !VMS */ +diff -ruN xv-3.10a-bugfixes/xcmap.c xv-3.10a-enhancements/xcmap.c +--- xv-3.10a-bugfixes/xcmap.c 2005-03-20 15:51:59.000000000 -0800 ++++ xv-3.10a-enhancements/xcmap.c 2005-04-17 14:45:28.000000000 -0700 +@@ -163,7 +163,7 @@ + XSetBackground(theDisp,theGC,bcol); + + CreateMainWindow(cmd,geom,argc,argv); +- Resize(WIDE,HIGH); ++ Resize((int)WIDE,(int)HIGH); + + XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask + | StructureNotifyMask | ButtonPressMask); +@@ -212,10 +212,10 @@ + + case ConfigureNotify: { + XConfigureEvent *conf_event = (XConfigureEvent *) event; ++ int w = conf_event->width, h = conf_event->height; + +- if (conf_event->window == mainW && +- (conf_event->width != WIDE || conf_event->height != HIGH)) +- Resize(conf_event->width, conf_event->height); ++ if (conf_event->window == mainW && (w != WIDE || h != HIGH)) ++ Resize((int)(w ? w : WIDE), (int)(h ? h : HIGH)); + } + break; + +@@ -274,6 +274,8 @@ + WIDE = HIGH = 256; /* default window size */ + + x=y=w=h=1; ++ hints.flags = 0; ++ + i=XParseGeometry(geom,&x,&y,&w,&h); + if (i&WidthValue) + { +diff -ruN xv-3.10a-bugfixes/xv.c xv-3.10a-enhancements/xv.c +--- xv-3.10a-bugfixes/xv.c 2005-03-20 22:25:22.000000000 -0800 ++++ xv-3.10a-enhancements/xv.c 2005-05-01 13:33:25.000000000 -0700 +@@ -62,6 +62,19 @@ + + static char basefname[128]; /* just the current fname, no path */ + ++#ifdef TV_L10N ++# ifndef TV_FONTSET ++# define TV_FONTSET "-*-fixed-medium-r-normal--%d-*" ++# endif ++# ifndef TV_FONTSIZE ++# define TV_FONTSIZE 14,16 ++# endif ++ ++static int mfontsize[] = { TV_FONTSIZE, 0 }; ++static char mfontset[256]; ++#endif ++ ++ + /* things to do upon successfully loading an image */ + static int autoraw = 0; /* force raw if using stdcmap */ + static int autodither = 0; /* dither */ +@@ -78,6 +91,12 @@ + + static int force8 = 0; /* force 8-bit mode */ + static int force24 = 0; /* force 24-bit mode */ ++#ifdef HAVE_PCD ++static int PcdSize = -1; /* force dialog to ask */ ++#endif ++ ++static float waitsec_nonfinal = -1; /* "normal" waitsec value */ ++static float waitsec_final = -1; /* final-image waitsec value */ + + /* used in DeleteCmd() and Quit() */ + static char **mainargv; +@@ -103,7 +122,6 @@ + static void openNextLoop PARM((void)); + static void openPrevPic PARM((void)); + static void openNamedPic PARM((void)); +-static int findRandomPic PARM((void)); + static void mainLoop PARM((void)); + static void createMainWindow PARM((char *, char *)); + static void setWinIconNames PARM((char *)); +@@ -120,16 +138,17 @@ + int imap, ctrlmap, gmap, browmap, cmtmap, clrroot, nopos, limit2x; + char *display, *whitestr, *blackstr, *histr, *lostr, + *infogeom, *fgstr, *bgstr, *ctrlgeom, *gamgeom, *browgeom, *tmpstr; +-char *rootfgstr, *rootbgstr, *visualstr, *textgeom, *cmtgeom; ++char *rootfgstr, *rootbgstr, *imagebgstr, *visualstr, *textgeom, *cmtgeom; + char *monofontname, *flistName; ++#ifdef TV_L10N ++char **misscharset, *defstr; ++int nmisscharset; ++#endif + int curstype, stdinflag, browseMode, savenorm, preview, pscomp, preset, + rmodeset, gamset, cgamset, perfect, owncmap, rwcolor, stdcmap; + int nodecor; + double gamval, rgamval, ggamval, bgamval; + +- +- +- + /*******************************************/ + int main(argc, argv) + int argc; +@@ -137,6 +156,9 @@ + /*******************************************/ + { + int i; ++#ifdef TV_L10N ++ int j; ++#endif + XColor ecdef; + Window rootReturn, parentReturn, *children; + unsigned int numChildren, rootDEEP; +@@ -153,6 +175,13 @@ + /*** variable Initialization ***/ + /*****************************************************/ + ++#ifdef TV_L10N ++ /* setlocale(LC_ALL, localeList[LOCALE_EUCJ]); */ ++ setlocale(LC_ALL, ""); ++ xlocale = (int)XSupportsLocale(); /* assume that (Bool) is (int) */ ++ /* if X doesn't support ja_JP.ujis text viewer l10n doesn't work. */ ++#endif ++ + xv_getwd(initdir, sizeof(initdir)); + searchdir[0] = '\0'; + fullfname[0] = '\0'; +@@ -162,7 +191,7 @@ + + /* init internal variables */ + display = NULL; +- fgstr = bgstr = rootfgstr = rootbgstr = NULL; ++ fgstr = bgstr = rootfgstr = rootbgstr = imagebgstr = NULL; + histr = lostr = whitestr = blackstr = NULL; + visualstr = monofontname = flistName = NULL; + winTitle = NULL; +@@ -180,6 +209,7 @@ + autoclose = autoDelete = 0; + cmapInGam = 0; + grabDelay = 0; ++ startGrab = 0; + showzoomcursor = 0; + perfect = owncmap = stdcmap = rwcolor = 0; + +@@ -228,6 +258,10 @@ + if (!tmpdir) FatalError("can't malloc 'tmpdir'\n"); + strcpy(tmpdir, tmpstr); + } ++#ifdef AUTO_EXPAND ++ Vdinit(); ++ vd_handler_setup(); ++#endif + + /* init command-line options flags */ + infogeom = DEFINFOGEOM; ctrlgeom = DEFCTRLGEOM; +@@ -238,7 +272,7 @@ + ninstall = 0; fixedaspect = 0; noFreeCols = nodecor = 0; + DEBUG = 0; bwidth = 2; + nolimits = useroot = clrroot = noqcheck = 0; +- waitsec = -1; waitloop = 0; automax = 0; ++ waitsec = waitsec_final = -1.0; waitloop = 0; automax = 0; + rootMode = 0; hsvmode = 0; + rmodeset = gamset = cgamset = 0; + nopos = limit2x = 0; +@@ -251,6 +285,10 @@ + preset = 0; + viewonly = 0; + ++#ifdef ENABLE_FIXPIX_SMOOTH ++ do_fixpix_smooth = 0; ++#endif ++ + /* init 'xormasks' array */ + xorMasks[0] = 0x01010101; + xorMasks[1] = 0x02020203; +@@ -277,6 +315,24 @@ + tiffW = (Window) NULL; tiffUp = 0; + #endif + ++#ifdef HAVE_PNG ++ pngW = (Window) NULL; pngUp = 0; ++#endif ++ ++ pcdW = (Window) NULL; pcdUp = 0; ++ ++#ifdef HAVE_PIC2 ++ pic2W = (Window) NULL; pic2Up = 0; ++#endif ++ ++#ifdef HAVE_PCD ++ pcdW = (Window) NULL; pcdUp = 0; ++#endif ++ ++#ifdef HAVE_MGCSFX ++ mgcsfxW = (Window) NULL; mgcsfxUp = 0; ++#endif ++ + imap = ctrlmap = gmap = browmap = cmtmap = 0; + + ch_offx = ch_offy = p_offx = p_offy = 0; +@@ -303,13 +359,35 @@ + verifyArgs(); + + ++#if 0 ++#ifdef XVEXECPATH ++ /* set up path to search for external executables */ ++ { ++ char *systempath = getenv("PATH"); ++ char *xvexecpath = getenv("XVPATH"); ++ if (xvexecpath == NULL) xvexecpath = XVEXECPATH; ++ /* FIXME: can systempath == NULL? */ ++ strcat(systempath, ":"); /* FIXME: writing to mem we don't own */ ++ strcat(systempath, xvexecpath); /* FIXME: writing to mem we don't own */ ++ /* FIXME: was there supposed to be a setenv() call in here? */ ++ if (DEBUG) ++ fprintf(stderr, "DEBUG: executable search path: %s\n", systempath); ++ } ++#endif ++#endif ++ ++ + /*****************************************************/ + /*** X Setup ***/ + /*****************************************************/ + + theScreen = DefaultScreen(theDisp); + theCmap = DefaultColormap(theDisp, theScreen); +- rootW = RootWindow(theDisp,theScreen); ++ if (spec_window) { ++ rootW = spec_window; ++ } else { ++ rootW = RootWindow(theDisp,theScreen); ++ } + theGC = DefaultGC(theDisp,theScreen); + theVisual = DefaultVisual(theDisp,theScreen); + ncells = DisplayCells(theDisp, theScreen); +@@ -320,7 +398,7 @@ + + rootDEEP = dispDEEP; + +- /* things dependant on theVisual: ++ /* things dependent on theVisual: + * dispDEEP, theScreen, rootW, ncells, theCmap, theGC, + * vrWIDE, dispWIDE, vrHIGH, dispHIGH, maxWIDE, maxHIGH + */ +@@ -500,6 +578,7 @@ + arrow = XCreateFontCursor(theDisp,(u_int) curstype); + cross = XCreateFontCursor(theDisp,XC_crosshair); + tcross = XCreateFontCursor(theDisp,XC_tcross); ++ tlcorner = XCreateFontCursor(theDisp,XC_top_left_corner); + zoom = XCreateFontCursor(theDisp,XC_sizing); + + { +@@ -575,6 +654,18 @@ + xvAllocColor(theDisp, theCmap, &ecdef)) rootbg = ecdef.pixel; + + ++ /* GRR 19980308: set up image bg color (for transparent images) */ ++ have_imagebg = 0; ++ if (imagebgstr && XParseColor(theDisp, theCmap, imagebgstr, &ecdef) && ++ xvAllocColor(theDisp, theCmap, &ecdef)) { ++ /* imagebg = ecdef.pixel; */ ++ have_imagebg = 1; ++ imagebgR = ecdef.red; ++ imagebgG = ecdef.green; ++ imagebgB = ecdef.blue; ++ } ++ ++ + /* set up hi/lo colors */ + i=0; + if (dispDEEP > 1) { /* only if we're on a reasonable display */ +@@ -664,6 +755,61 @@ + + monofont=monofinfo->fid; + ++#ifdef TV_L10N ++ if (xlocale) { ++ i = 0; ++ while (mfontsize[i]) { ++ xlocale = 1; /* True */ ++ ++ sprintf(mfontset, TV_FONTSET, mfontsize[i]); ++/*fprintf(stderr, "FontSet: %s\n", mfontset);*/ ++ ++ monofset = XCreateFontSet(theDisp, mfontset, ++ &misscharset, &nmisscharset, &defstr); ++# if 0 /* not useful */ ++ if (!monofset) { ++ /* the current locale is not supported */ ++/*fprintf(stderr, "Current locale `%s' is not supported.\n", localeList[i]);*/ ++ xlocale = 0; ++ break; ++ } ++# endif ++/*fprintf(stderr, "# of misscharset in mfontsize[%d]: %d\n", i,nmisscharset);*/ ++ ++ for (j = 0; j < nmisscharset; j++) { ++ if (!strncmp(misscharset[j], "jisx0208", 8)) { ++ /* font for JIS X 0208 is not found */ ++ xlocale = 0; ++ break; ++ } ++ } ++ ++ if (xlocale) { ++ monofsetinfo = XExtentsOfFontSet(monofset); ++ monofsetinfo->max_logical_extent.width = mfontsize[i]; ++ /* correct size of TextViewer ++ in case that JIS X 0208 is not found */ ++ break; ++ } ++ ++ i++; ++ } /* while (mfontsize[i]) */ ++ ++# if 0 ++ if (nmisscharset > 0) { ++ sprintf(str,"missing %d charset:\n", nmisscharset); ++ for (i = 0; i < nmisscharset; i++) { ++ sprintf(str, "%s\t%s\n", str, misscharset[i]); ++ } ++# if 0 ++ FatalError(str); ++# else ++ fprintf(stderr, "%s", str); ++# endif ++ } ++# endif ++ } ++#endif /* TV_L10N */ + + + +@@ -693,6 +839,18 @@ + } + else namelist[0] = NULL; + } ++ else if (randomShow) { ++ int i, j; ++ char *tmp; ++ ++ srandom((int)time((time_t *)0)); ++ for (i = numnames; i > 1; i--) { ++ j = random() % i; ++ tmp = namelist[i-1]; ++ namelist[i-1] = namelist[j]; ++ namelist[j] = tmp; ++ } ++ } + + if (numnames) makeDispNames(); + +@@ -796,6 +954,25 @@ + XSetTransientForHint(theDisp, tiffW, dirW); + #endif + ++#ifdef HAVE_PNG ++ CreatePNGW(); ++ XSetTransientForHint(theDisp, pngW, dirW); ++#endif ++ ++#ifdef HAVE_PCD ++ CreatePCDW(); ++ XSetTransientForHint(theDisp, pcdW, dirW); ++#endif ++ ++#ifdef HAVE_PIC2 ++ CreatePIC2W(); ++ XSetTransientForHint(theDisp, pic2W, dirW); ++#endif ++ ++#ifdef HAVE_MGCSFX ++ CreateMGCSFXW(); ++ XSetTransientForHint(theDisp, mgcsfxW, dirW); ++#endif + + LoadFishCursors(); + SetCursors(-1); +@@ -964,7 +1141,11 @@ + + dispDEEP = vinfo[best].depth; + theScreen = vinfo[best].screen; +- rootW = RootWindow(theDisp, theScreen); ++ if (spec_window) { ++ rootW = spec_window; ++ } else { ++ rootW = RootWindow(theDisp,theScreen); ++ } + ncells = vinfo[best].colormap_size; + theCmap = XCreateColormap(theDisp, rootW, theVisual, AllocNone); + +@@ -1095,6 +1276,9 @@ + + if (rd_str ("fileList")) flistName = def_str; + if (rd_flag("fixed")) fixedaspect = def_int; ++#ifdef ENABLE_FIXPIX_SMOOTH ++ if (rd_flag("fixpix")) do_fixpix_smooth = def_int; ++#endif + if (rd_flag("force8")) force8 = def_int; + if (rd_flag("force24")) force24 = def_int; + if (rd_str ("foreground")) fgstr = def_str; +@@ -1106,21 +1290,37 @@ + if (rd_str ("highlight")) histr = def_str; + if (rd_str ("iconGeometry")) icongeom = def_str; + if (rd_flag("iconic")) startIconic = def_int; ++ if (rd_str ("imageBackground")) imagebgstr = def_str; + if (rd_str ("infoGeometry")) infogeom = def_str; + if (rd_flag("infoMap")) imap = def_int; + if (rd_flag("loadBrowse")) browseMode = def_int; + if (rd_str ("lowlight")) lostr = def_str; ++#ifdef MACBINARY ++ if (rd_flag("macbinary")) handlemacb = def_int; ++#endif ++#ifdef HAVE_MGCSFX ++ if (rd_flag("mgcsfx")) mgcsfx = def_int; ++#endif + if (rd_flag("mono")) mono = def_int; + if (rd_str ("monofont")) monofontname = def_str; + if (rd_int ("ncols")) ncols = def_int; + if (rd_flag("ninstall")) ninstall = def_int; + if (rd_flag("nodecor")) nodecor = def_int; + if (rd_flag("nolimits")) nolimits = def_int; ++#ifdef HAVE_MGCSFX ++ if (rd_flag("nomgcsfx")) nomgcsfx = def_int; ++#endif ++#if defined(HAVE_PIC) || defined(HAVE_PIC2) ++ if (rd_flag("nopicadjust")) nopicadjust = def_int; ++#endif + if (rd_flag("nopos")) nopos = def_int; + if (rd_flag("noqcheck")) noqcheck = def_int; + if (rd_flag("nostat")) nostat = def_int; + if (rd_flag("ownCmap")) owncmap = def_int; + if (rd_flag("perfect")) perfect = def_int; ++#ifdef HAVE_PIC2 ++ if (rd_flag("pic2split")) pic2split = def_int; ++#endif + if (rd_flag("popupKludge")) winCtrPosKludge = def_int; + if (rd_str ("print")) strncpy(printCmd, def_str, + (size_t) PRINTCMDLEN); +@@ -1138,6 +1338,9 @@ + if (rd_str ("textviewGeometry")) textgeom = def_str; + if (rd_flag("useStdCmap")) stdcmap = def_int; + if (rd_str ("visual")) visualstr = def_str; ++#ifdef VS_ADJUST ++ if (rd_flag("vsadjust")) vsadjust = def_int; ++#endif + if (rd_flag("vsDisable")) novbrowse = def_int; + if (rd_str ("vsGeometry")) browgeom = def_str; + if (rd_flag("vsMap")) browmap = def_int; +@@ -1172,7 +1375,13 @@ + } + + if (numnames<MAXNAMES) { ++#ifdef AUTO_EXPAND ++ if(Isarchive(argv[i]) == 0){ /* Not archive file */ ++ namelist[numnames++] = argv[i]; ++ } ++#else + namelist[numnames++] = argv[i]; ++#endif + if (numnames==MAXNAMES) { + fprintf(stderr,"%s: too many filenames. Only using first %d.\n", + cmd, MAXNAMES); +@@ -1198,6 +1407,14 @@ + } + } + ++ else if (!argcmp(argv[i],"-windowid",3,0,&pm)) { ++ if (++i<argc) { ++ if (sscanf(argv[i], "%ld", &spec_window) != 1) { ++ fprintf(stderr,"%s: bad argument to -windowid '%s'\n",cmd,argv[i]); ++ } ++ } ++ } ++ + else if (!argcmp(argv[i],"-best24",3,0,&pm)) /* -best */ + conv24 = CONV24_BEST; + +@@ -1289,7 +1506,11 @@ + else if (!argcmp(argv[i],"-fg",3,0,&pm)) /* fg color */ + { if (++i<argc) fgstr = argv[i]; } + +- else if (!argcmp(argv[i],"-fixed",3,1,&fixedaspect)); /* fix asp. ratio */ ++ else if (!argcmp(argv[i],"-fixed",5,1,&fixedaspect)); /* fix asp. ratio */ ++ ++#ifdef ENABLE_FIXPIX_SMOOTH ++ else if (!argcmp(argv[i],"-fixpix",5,1,&do_fixpix_smooth)); /* dithering */ ++#endif + + else if (!argcmp(argv[i],"-flist",3,0,&pm)) /* file list */ + { if (++i<argc) flistName = argv[i]; } +@@ -1330,6 +1551,10 @@ + { if (++i<argc) infogeom = argv[i]; } + + else if (!argcmp(argv[i],"-imap", 3,1,&imap)); /* imap */ ++ ++ else if (!argcmp(argv[i],"-ibg",3,0,&pm)) /* GRR: image background color */ ++ { if (++i<argc) imagebgstr = argv[i]; } ++ + else if (!argcmp(argv[i],"-lbrowse", 3,1,&browseMode)); /* browse mode */ + + else if (!argcmp(argv[i],"-lo",3,0,&pm)) /* lowlight */ +@@ -1354,9 +1579,17 @@ + else if (!argcmp(argv[i],"-maxpect",5,1,&pm)) /* auto maximize */ + { automax=pm; fixedaspect=pm; } + ++#ifdef MACBINARY ++ else if (!argcmp(argv[i],"-macbinary",3,1,&handlemacb)); /* macbinary */ ++#endif ++ + else if (!argcmp(argv[i],"-mfn",3,0,&pm)) /* mono font name */ + { if (++i<argc) monofontname = argv[i]; } + ++#ifdef HAVE_MGCSFX ++ else if (!argcmp(argv[i],"-mgcsfx", 4,1,&mgcsfx)); /* mgcsfx */ ++#endif ++ + else if (!argcmp(argv[i],"-mono",3,1,&mono)); /* mono */ + + else if (!argcmp(argv[i],"-name",3,0,&pm)) /* name */ +@@ -1365,17 +1598,30 @@ + else if (!argcmp(argv[i],"-ncols",3,0,&pm)) /* ncols */ + { if (++i<argc) ncols=abs(atoi(argv[i])); } + +- else if (!argcmp(argv[i],"-ninstall", 3,1,&ninstall)); /* inst cmaps?*/ ++ else if (!argcmp(argv[i],"-ninstall", 3,1,&ninstall)); /* inst cmaps? */ + else if (!argcmp(argv[i],"-nodecor", 4,1,&nodecor)); + else if (!argcmp(argv[i],"-nofreecols",4,1,&noFreeCols)); + else if (!argcmp(argv[i],"-nolimits", 4,1,&nolimits)); /* nolimits */ ++#ifdef HAVE_MGCSFX ++ else if (!argcmp(argv[i],"-nomgcsfx", 4,1,&nomgcsfx)); /* nomgcsfx */ ++#endif ++#if defined(HAVE_PIC) || defined(HAVE_PIC2) ++ else if (!argcmp(argv[i],"-nopicadjust", 4,1,&nopicadjust));/*nopicadjust*/ ++#endif + else if (!argcmp(argv[i],"-nopos", 4,1,&nopos)); /* nopos */ + else if (!argcmp(argv[i],"-noqcheck", 4,1,&noqcheck)); /* noqcheck */ +- else if (!argcmp(argv[i],"-noresetroot",5,1,&resetroot)); /* reset root*/ ++ else if (!argcmp(argv[i],"-noresetroot",5,1,&resetroot)); /* reset root */ + else if (!argcmp(argv[i],"-norm", 5,1,&autonorm)); /* norm */ + else if (!argcmp(argv[i],"-nostat", 4,1,&nostat)); /* nostat */ + else if (!argcmp(argv[i],"-owncmap", 2,1,&owncmap)); /* own cmap */ ++#ifdef HAVE_PCD ++ else if (!argcmp(argv[i],"-pcd", 4,0,&pm)) /* pcd with size */ ++ { if (i+1<argc) PcdSize = atoi(argv[++i]); } ++#endif + else if (!argcmp(argv[i],"-perfect", 3,1,&perfect)); /* -perfect */ ++#ifdef HAVE_PIC2 ++ else if (!argcmp(argv[i],"-pic2split", 3,1,&pic2split)); /* pic2split */ ++#endif + else if (!argcmp(argv[i],"-pkludge", 3,1,&winCtrPosKludge)); + else if (!argcmp(argv[i],"-poll", 3,1,&polling)); /* chk mod? */ + +@@ -1418,6 +1664,7 @@ + conv24 = CONV24_SLOW; + + else if (!argcmp(argv[i],"-smooth",3,1,&autosmooth)); /* autosmooth */ ++ else if (!argcmp(argv[i],"-startgrab",3,1,&startGrab)); /* startGrab */ + else if (!argcmp(argv[i],"-stdcmap",3,1,&stdcmap)); /* use stdcmap */ + + else if (!argcmp(argv[i],"-tgeometry",2,0,&pm)) /* textview geom */ +@@ -1429,6 +1676,10 @@ + else if (!argcmp(argv[i],"-visual",4,0,&pm)) /* visual */ + { if (++i<argc) visualstr = argv[i]; } + ++#ifdef VS_ADJUST ++ else if (!argcmp(argv[i],"-vsadjust", 3,1,&vsadjust)); /* vsadjust */ ++#endif ++ + else if (!argcmp(argv[i],"-vsdisable",4,1,&novbrowse)); /* disable sch? */ + + else if (!argcmp(argv[i],"-vsgeometry",4,0,&pm)) /* visSchnauzer geom */ +@@ -1440,8 +1691,9 @@ + + else if (!argcmp(argv[i],"-wait",3,0,&pm)) { /* secs betwn pics */ + if (++i<argc) { +- waitsec = abs(atoi(argv[i])); +- if (waitsec<0) waitsec = 0; ++ char *comma = strchr(argv[i], ','); ++ waitsec_nonfinal = fabs(atof(argv[i])); ++ waitsec_final = comma? fabs(atof(comma+1)) : waitsec_nonfinal; + } + } + +@@ -1467,7 +1719,11 @@ + /* check options for validity */ + + if (strlen(searchdir)) { /* got a search directory */ ++#ifdef AUTO_EXPAND ++ if (Chvdir(searchdir)) { ++#else + if (chdir(searchdir)) { ++#endif + fprintf(stderr,"xv: unable to cd to directory '%s'.\n",searchdir); + fprintf(stderr, + " Ignoring '-dir' option and/or 'xv.searchDirectory' resource\n"); +@@ -1514,7 +1770,7 @@ + preset = 0; + } + +- if (waitsec < 0) noFreeCols = 0; /* disallow nfc if not doing slideshow */ ++ if (waitsec < 0.0) noFreeCols = 0; /* disallow nfc if not doing slideshow */ + if (noFreeCols && perfect) { perfect = 0; owncmap = 1; } + + /* decide what default color allocation stuff we've settled on */ +@@ -1556,6 +1812,20 @@ + + static void cmdSyntax() + { ++ /* GRR 19980605: added version info for most common libraries */ ++ fprintf(stderr, "XV - %s.\n", REVDATE); ++#ifdef HAVE_JPEG ++ VersionInfoJPEG(); ++#endif ++#ifdef HAVE_TIFF ++ VersionInfoTIFF(); ++#endif ++#ifdef HAVE_PNG ++ VersionInfoPNG(); ++#endif ++ /* pbm/pgm/ppm support is native, not via pbmplus/netpbm libraries */ ++ fprintf(stderr, "\n"); ++ + fprintf(stderr, "Usage:\n"); + printoption(cmd); + printoption("[-]"); +@@ -1595,6 +1865,9 @@ + printoption("[-expand exp | hexp:vexp]"); + printoption("[-fg color]"); + printoption("[-/+fixed]"); ++#ifdef ENABLE_FIXPIX_SMOOTH ++ printoption("[-/+fixpix]"); ++#endif + printoption("[-flist fname]"); + printoption("[-gamma val]"); + printoption("[-geometry geom]"); +@@ -1607,6 +1880,7 @@ + printoption("[-hi color]"); + printoption("[-/+hist]"); + printoption("[-/+hsv]"); ++ printoption("[-ibg color]"); /* GRR 19980314 */ + printoption("[-icgeometry geom]"); + printoption("[-/+iconic]"); + printoption("[-igeometry geom]"); +@@ -1614,9 +1888,15 @@ + printoption("[-/+lbrowse]"); + printoption("[-lo color]"); + printoption("[-/+loadclear]"); ++#ifdef MACBINARY ++ printoption("[-/+macbinary]"); ++#endif + printoption("[-/+max]"); + printoption("[-/+maxpect]"); + printoption("[-mfn font]"); ++#ifdef HAVE_MGCSFX ++ printoption("[-/+mgcsfx]"); ++#endif + printoption("[-/+mono]"); + printoption("[-name str]"); + printoption("[-ncols #]"); +@@ -1624,13 +1904,25 @@ + printoption("[-/+nodecor]"); + printoption("[-/+nofreecols]"); + printoption("[-/+nolimits]"); ++#ifdef HAVE_MGCSFX ++ printoption("[-/+nomgcsfx]"); ++#endif ++#if defined(HAVE_PIC) || defined(HAVE_PIC2) ++ printoption("[-/+nopicadjust]"); ++#endif + printoption("[-/+nopos]"); + printoption("[-/+noqcheck]"); + printoption("[-/+noresetroot]"); + printoption("[-/+norm]"); + printoption("[-/+nostat]"); + printoption("[-/+owncmap]"); ++#ifdef HAVE_PCD ++ printoption("[-pcd size(0=192*128,1,2,3,4=3072*2048)]"); ++#endif + printoption("[-/+perfect]"); ++#ifdef HAVE_PIC2 ++ printoption("[-/+pic2split]"); ++#endif + printoption("[-/+pkludge]"); + printoption("[-/+poll]"); + printoption("[-preset #]"); +@@ -1649,17 +1941,22 @@ + printoption("[-/+rw]"); + printoption("[-slow24]"); + printoption("[-/+smooth]"); ++ printoption("[-/+startgrab]"); + printoption("[-/+stdcmap]"); + printoption("[-tgeometry geom]"); + printoption("[-/+vflip]"); + printoption("[-/+viewonly]"); + printoption("[-visual type]"); ++#ifdef VS_ADJUST ++ printoption("[-/+vsadjust]"); ++#endif + printoption("[-/+vsdisable]"); + printoption("[-vsgeometry geom]"); + printoption("[-/+vsmap]"); + printoption("[-/+vsperfect]"); +- printoption("[-wait seconds]"); ++ printoption("[-wait secs[,final_secs]]"); + printoption("[-white color]"); ++ printoption("[-windowid windowid]"); + printoption("[-/+wloop]"); + printoption("[filename ...]"); + fprintf(stderr,"\n\n"); +@@ -1682,6 +1979,7 @@ + fprintf(stderr,"\t7: centered on a 'brick' background\n"); + fprintf(stderr,"\t8: symmetrical tiling\n"); + fprintf(stderr,"\t9: symmetrical mirrored tiling\n"); ++ fprintf(stderr,"\t10: upper left corner\n"); + fprintf(stderr,"\n"); + Quit(1); + } +@@ -1694,7 +1992,7 @@ + int *plusminus; + { + /* does a string compare between a1 and a2. To return '0', a1 and a2 +- must match to the length of a2, and that length has to ++ must match to the length of a1, and that length has to + be at least 'minlen'. Otherwise, return non-zero. plusminus set to '1' + if '-option', '0' if '+option' */ + +@@ -1734,6 +2032,10 @@ + char *tmp; + char *fullname, /* full name of the original file */ + filename[512]; /* full name of file to load (could be /tmp/xxx)*/ ++#ifdef MACBINARY ++ char origname[512]; /* file name of original file (NO processing) */ ++ origname[0] = '\0'; ++#endif + + xvbzero((char *) &pinfo, sizeof(PICINFO)); + +@@ -1866,8 +2168,22 @@ + frompipe = 1; + } + } ++#ifdef AUTO_EXPAND ++ else { ++ fullname = (char *) malloc(MAXPATHLEN+2); ++ strcpy(fullname, namelist[filenum]); ++ freename = 1; ++ } ++ tmp = (char *) rindex(fullname, '/'); ++ if (tmp) { ++ *tmp = '\0'; ++ Mkvdir(fullname); ++ *tmp = '/'; ++ } ++ Dirtovd(fullname); ++#else + else fullname = namelist[filenum]; +- ++#endif + + strcpy(fullfname, fullname); + tmp = BaseName(fullname); +@@ -1875,18 +2191,20 @@ + + + /* chop off trailing ".Z", ".z", or ".gz" from displayed basefname, if any */ +- if (strlen(basefname) > (size_t) 2 && +- strcmp(basefname+strlen(basefname)-2,".Z")==0) ++ if (strlen(basefname)>2 && strcmp(basefname+strlen(basefname)-2,".Z")==0) + basefname[strlen(basefname)-2]='\0'; + else { + #ifdef GUNZIP +- if (strlen(basefname)>2 && strcmp(basefname+strlen(basefname)-2,".Z")==0) ++ if (strlen(basefname)>2 && strcmp(basefname+strlen(basefname)-2,".z")==0) + basefname[strlen(basefname)-2]='\0'; +- +- else if (strlen(basefname)>3 && +- strcmp(basefname+strlen(basefname)-3,".gz")==0) ++ else ++ if (strlen(basefname)>3 && strcmp(basefname+strlen(basefname)-3,".gz")==0) + basefname[strlen(basefname)-3]='\0'; +-#endif /* GUNZIP */ ++#endif ++#ifdef BUNZIP2 ++ if (strlen(basefname)>4 && strcmp(basefname+strlen(basefname)-4,".bz2")==0) ++ basefname[strlen(basefname)-4]='\0'; ++#endif + } + + +@@ -1973,6 +2291,9 @@ + + if (strcmp(filename,STDINSTR)==0) { + FILE *fp = NULL; ++#ifndef USE_MKSTEMP ++ int tmpfd; ++#endif + + #ifndef VMS + sprintf(filename,"%s/xvXXXXXX",tmpdir); +@@ -1984,13 +2305,18 @@ + fp = fdopen(mkstemp(filename), "w"); + #else + mktemp(filename); +- fp = fopen(filename, "w"); ++ tmpfd = open(filename,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR); ++ if (tmpfd < 0) FatalError("openPic(): can't create temporary file"); ++ fp = fdopen(tmpfd,"w"); + #endif + if (!fp) FatalError("openPic(): can't write temporary file"); + + clearerr(stdin); + while ( (i=getchar()) != EOF) putc(i,fp); + fclose(fp); ++#ifndef USE_MKSTEMP ++ close(tmpfd); ++#endif + + /* and remove it from list, since we can never reload from stdin */ + if (strcmp(namelist[0], STDINSTR)==0) deleteFromList(0); +@@ -2005,15 +2331,21 @@ + (no pipes or stdin, though it could be compressed) to be loaded */ + filetype = ReadFileType(filename); + ++#ifdef HAVE_MGCSFX ++ if (mgcsfx && filetype == RFT_UNKNOWN){ /* force use MgcSfx */ ++ if(getInputCom() != 0) filetype = RFT_MGCSFX; ++ } ++#endif + +- if (filetype == RFT_COMPRESS) { /* a compressed file. uncompress it */ ++ /* if it's a compressed file, uncompress it: */ ++ if ((filetype == RFT_COMPRESS) || (filetype == RFT_BZIP2)) { + char tmpname[128]; + + if ( + #ifndef VMS +- UncompressFile(filename, tmpname) ++ UncompressFile(filename, tmpname, filetype) + #else +- UncompressFile(basefname, tmpname) ++ UncompressFile(basefname, tmpname, filetype) + #endif + ) { + +@@ -2029,6 +2361,57 @@ + WaitCursor(); + } + ++#ifdef MACBINARY ++ if (handlemacb && macb_file == True) { ++ char tmpname[128]; ++ ++ if (RemoveMacbinary(filename, tmpname)) { ++ if (strcmp(fullname,filename)!=0) unlink(filename); ++ strcpy(origname, filename); ++ strcpy(filename, tmpname); ++ } ++ else filetype = RFT_ERROR; ++ ++ WaitCursor(); ++ } ++#endif ++ ++#ifdef HAVE_MGCSFX_AUTO ++ if (filetype == RFT_MGCSFX) { ++ char tmpname[128], tmp[256]; ++ char *icom; ++ ++ if ((icom = mgcsfx_auto_input_com(filename)) != NULL) { ++ sprintf(tmpname, "%s/xvmsautoXXXXXX", tmpdir); ++#ifdef USE_MKSTEMP ++ close(mkstemp(tmpname)); ++#else ++ mktemp(tmpname); ++#endif ++ SetISTR(ISTR_INFO, "Converting to known format by MgcSfx auto..."); ++ sprintf(tmp,"%s >%s", icom, tmpname); ++ } ++ else goto ms_auto_no; ++ ++#ifndef VMS ++ if (system(tmp)) ++#else ++ if (!system(tmp)) ++#endif ++ { ++ SetISTR(ISTR_INFO, "Unable to convert '%s' by MgcSfx auto.", ++ BaseName(filename)); ++ Warning(); ++ filetype = RFT_ERROR; ++ goto ms_auto_no; ++ } ++ ++ filetype = ReadFileType(tmpname); ++ if (strcmp(fullname,filename)!=0) unlink(filename); ++ strcpy(filename, tmpname); ++ } ++ms_auto_no: ++#endif /* HAVE_MGCSFX_AUTO */ + + if (filetype == RFT_ERROR) { + char foostr[512]; +@@ -2042,10 +2425,16 @@ + + if (filetype == RFT_UNKNOWN) { + /* view as a text/hex file */ +- TextView(filename); ++#ifdef MACBINARY ++ if (origname[0]) ++ i = TextView(origname); ++ else ++#endif ++ i = TextView(filename); + SetISTR(ISTR_INFO,"'%s' not in a recognized format.", basefname); + /* Warning(); */ +- goto SHOWN_AS_TEXT; ++ if (i) goto SHOWN_AS_TEXT; ++ else goto FAILED; + } + + if (filetype < RFT_ERROR) { +@@ -2073,8 +2462,9 @@ + if (filetype == RFT_XBM && (!i || pinfo.w==0 || pinfo.h==0)) { + /* probably just a '.h' file or something... */ + SetISTR(ISTR_INFO," "); +- TextView(filename); +- goto SHOWN_AS_TEXT; ++ i = TextView(filename); ++ if (i) goto SHOWN_AS_TEXT; ++ else goto FAILED; + } + + if (!i) { +@@ -2209,12 +2599,15 @@ + if (fullname && strcmp(fullname,filename)!=0) unlink(filename); + + +- SetISTR(ISTR_INFO,formatStr); ++ SetISTR(ISTR_INFO, "%s", formatStr); + + SetInfoMode(INF_PART); +- SetISTR(ISTR_FILENAME, "%s", +- (filenum==DFLTPIC || filenum==GRABBED || frompipe) ? +- "<none>" : basefname); ++ if (filenum==DFLTPIC || filenum==GRABBED || frompipe) ++ SetISTR(ISTR_FILENAME, "<none>"); ++ else if (numPages > 1) ++ SetISTR(ISTR_FILENAME, "%s Page %d of %d", basefname, curPage+1, numPages); ++ else ++ SetISTR(ISTR_FILENAME, "%s", basefname); + + SetISTR(ISTR_RES,"%d x %d",pWIDE,pHIGH); + SetISTR(ISTR_COLOR, ""); +@@ -2424,7 +2817,7 @@ + if (autodither && ncols>0) epicMode = EM_DITH; + + /* if in CM_STDCMAP mode, and *not* in '-wait 0', then autodither */ +- if (colorMapMode == CM_STDCMAP && waitsec != 0) epicMode = EM_DITH; ++ if (colorMapMode == CM_STDCMAP && waitsec != 0.0) epicMode = EM_DITH; + + /* if -smooth or image has been shrunk to fit screen */ + if (autosmooth || (pWIDE >maxWIDE || pHIGH>maxHIGH) +@@ -2510,7 +2903,11 @@ + to generate the correct exposes (particularly with 'BitGravity' turned + on */ + +- if (mainW && !useroot) GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH); ++ /*Brian T. Schellenberger: fix for X 4.2 refresh problem*/ ++ if (mainW && !useroot) { ++ XSync(theDisp, False); ++ GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH); ++ } + + return 1; + +@@ -2542,6 +2939,9 @@ + } + + ++extern byte ZXheader[128]; /* [JCE] Spectrum screen magic number is ++ defined in xvzx.c */ ++ + + /********************************/ + int ReadFileType(fname) +@@ -2554,76 +2954,105 @@ + + FILE *fp; + byte magicno[30]; /* first 30 bytes of file */ +- int rv, n; ++ int rv=RFT_UNKNOWN, n; ++#ifdef MACBINARY ++ int macbin_alrchk = False; ++#endif + + if (!fname) return RFT_ERROR; /* shouldn't happen */ + + fp = xv_fopen(fname, "r"); + if (!fp) return RFT_ERROR; + ++ if (strlen(fname) > 4 && ++ strcasecmp(fname+strlen(fname)-5, ".wbmp")==0) rv = RFT_WBMP; ++ + n = fread(magicno, (size_t) 1, (size_t) 30, fp); + fclose(fp); + +- if (n<30) return RFT_UNKNOWN; /* files less than 30 bytes long... */ ++ if (n<30) return rv; /* files less than 30 bytes long... */ + +- rv = RFT_UNKNOWN; ++#ifdef MACBINARY ++ macb_file = False; ++ while (1) { ++#endif + +- if (strncmp((char *) magicno,"GIF87a", (size_t) 6)==0 || +- strncmp((char *) magicno,"GIF89a", (size_t) 6)==0) rv = RFT_GIF; ++#ifdef HAVE_MGCSFX ++ if (is_mgcsfx(fname, magicno, 30) != 0) rv = RFT_MGCSFX; ++ else ++#endif ++ if (strncmp((char *) magicno,"GIF87a", (size_t) 6)==0 || ++ strncmp((char *) magicno,"GIF89a", (size_t) 6)==0) rv = RFT_GIF; + + else if (strncmp((char *) magicno,"VIEW", (size_t) 4)==0 || +- strncmp((char *) magicno,"WEIV", (size_t) 4)==0) rv = RFT_PM; ++ strncmp((char *) magicno,"WEIV", (size_t) 4)==0) rv = RFT_PM; ++ ++#ifdef HAVE_PIC2 ++ else if (magicno[0]=='P' && magicno[1]=='2' && ++ magicno[2]=='D' && magicno[3]=='T') rv = RFT_PIC2; ++#endif + + else if (magicno[0] == 'P' && magicno[1]>='1' && +- magicno[1]<='6') rv = RFT_PBM; ++ (magicno[1]<='6' || magicno[1]=='8')) rv = RFT_PBM; + + /* note: have to check XPM before XBM, as first 2 chars are the same */ + else if (strncmp((char *) magicno, "/* XPM */", (size_t) 9)==0) rv = RFT_XPM; + + else if (strncmp((char *) magicno,"#define", (size_t) 7)==0 || +- (magicno[0] == '/' && magicno[1] == '*')) rv = RFT_XBM; ++ (magicno[0] == '/' && magicno[1] == '*')) rv = RFT_XBM; + + else if (magicno[0]==0x59 && (magicno[1]&0x7f)==0x26 && +- magicno[2]==0x6a && (magicno[3]&0x7f)==0x15) rv = RFT_SUNRAS; ++ magicno[2]==0x6a && (magicno[3]&0x7f)==0x15) rv = RFT_SUNRAS; + +- else if (magicno[0] == 'B' && magicno[1] == 'M') rv = RFT_BMP; ++ else if (magicno[0] == 'B' && magicno[1] == 'M') rv = RFT_BMP; + +- else if (magicno[0]==0x52 && magicno[1]==0xcc) rv = RFT_UTAHRLE; ++ else if (magicno[0]==0x52 && magicno[1]==0xcc) rv = RFT_UTAHRLE; + + else if ((magicno[0]==0x01 && magicno[1]==0xda) || +- (magicno[0]==0xda && magicno[1]==0x01)) rv = RFT_IRIS; ++ (magicno[0]==0xda && magicno[1]==0x01)) rv = RFT_IRIS; + +- else if (magicno[0]==0x1f && magicno[1]==0x9d) rv = RFT_COMPRESS; ++ else if (magicno[0]==0x1f && magicno[1]==0x9d) rv = RFT_COMPRESS; + + #ifdef GUNZIP +- else if (magicno[0]==0x1f && magicno[1]==0x8b) rv = RFT_COMPRESS; ++ else if (magicno[0]==0x1f && magicno[1]==0x8b) rv = RFT_COMPRESS; + #endif + +- else if (magicno[0]==0x0a && magicno[1] <= 5) rv = RFT_PCX; ++#ifdef BUNZIP2 ++ else if (magicno[0]==0x42 && magicno[1]==0x5a) rv = RFT_BZIP2; ++#endif ++ ++ else if (magicno[0]==0x0a && magicno[1] <= 5) rv = RFT_PCX; + + else if (strncmp((char *) magicno, "FORM", (size_t) 4)==0 && +- strncmp((char *) magicno+8, "ILBM", (size_t) 4)==0) rv = RFT_IFF; ++ strncmp((char *) magicno+8, "ILBM", (size_t) 4)==0) rv = RFT_IFF; + + else if (magicno[0]==0 && magicno[1]==0 && + magicno[2]==2 && magicno[3]==0 && + magicno[4]==0 && magicno[5]==0 && +- magicno[6]==0 && magicno[7]==0) rv = RFT_TARGA; ++ magicno[6]==0 && magicno[7]==0) rv = RFT_TARGA; + + else if (magicno[4]==0x00 && magicno[5]==0x00 && +- magicno[6]==0x00 && magicno[7]==0x07) rv = RFT_XWD; ++ magicno[6]==0x00 && magicno[7]==0x07) rv = RFT_XWD; + + else if (strncmp((char *) magicno,"SIMPLE ", (size_t) 8)==0 && +- magicno[29] == 'T') rv = RFT_FITS; ++ magicno[29] == 'T') rv = RFT_FITS; + ++ /* [JCE] Spectrum screen */ ++ else if (memcmp(magicno, ZXheader, (size_t) 18)==0) rv = RFT_ZX; + + #ifdef HAVE_JPEG + else if (magicno[0]==0xff && magicno[1]==0xd8 && +- magicno[2]==0xff) rv = RFT_JFIF; ++ magicno[2]==0xff) rv = RFT_JFIF; + #endif + + #ifdef HAVE_TIFF + else if ((magicno[0]=='M' && magicno[1]=='M') || +- (magicno[0]=='I' && magicno[1]=='I')) rv = RFT_TIFF; ++ (magicno[0]=='I' && magicno[1]=='I')) rv = RFT_TIFF; ++#endif ++ ++#ifdef HAVE_PNG ++ else if (magicno[0]==0x89 && magicno[1]=='P' && ++ magicno[2]=='N' && magicno[3]=='G') rv = RFT_PNG; + #endif + + #ifdef HAVE_PDS +@@ -2635,11 +3064,59 @@ + rv = RFT_PDSVICAR; + #endif + +-#ifdef GS_PATH ++#ifdef GS_PATH /* Ghostscript handles both PostScript and PDF */ + else if (strncmp((char *) magicno, "%!", (size_t) 2)==0 || +- strncmp((char *) magicno, "\004%!", (size_t) 3)==0) rv = RFT_PS; ++ strncmp((char *) magicno, "\004%!", (size_t) 3)==0 || ++ strncmp((char *) magicno, "%PDF", (size_t) 4)==0) rv = RFT_PS; + #endif + ++#ifdef HAVE_MAG ++ else if (strncmp((char *) magicno,"MAKI02 ", (size_t) 8)==0) rv = RFT_MAG; ++#endif ++ ++#ifdef HAVE_MAKI ++ else if (strncmp((char *) magicno,"MAKI01A ", (size_t) 8)==0 || ++ strncmp((char *) magicno,"MAKI01B ", (size_t) 8)==0) rv = RFT_MAKI; ++#endif ++ ++#ifdef HAVE_PIC ++ else if (magicno[0]=='P' && magicno[1]=='I'&&magicno[2]=='C') rv = RFT_PIC; ++#endif ++ ++#ifdef HAVE_PI ++ else if (magicno[0]=='P' && magicno[1]=='i') rv = RFT_PI; ++#endif ++ ++#ifdef HAVE_HIPS ++ else if (strstr((char *) magicno, "./digest")) rv = RFT_HIPS; ++#endif ++ ++#ifdef HAVE_PCD ++ else if (magicno[0]==0xff && magicno[1]==0xff && ++ magicno[2]==0xff && magicno[3]==0xff) rv = RFT_PCD; ++#endif ++ ++#ifdef MACBINARY ++ /* Now we try to handle MacBinary files, but the method is VERY dirty... */ ++ if (macbin_alrchk == True) { ++ macb_file = True; ++ break; ++ } ++ ++ if (rv != RFT_UNKNOWN) ++ break; ++ ++ /* Skip MACBSIZE and recheck */ ++ macbin_alrchk = True; ++ fp = xv_fopen(fname, "r"); ++ if (!fp) return RFT_ERROR; ++ fseek(fp, MACBSIZE, SEEK_SET); ++ n = fread(magicno, (size_t) 1, (size_t) 30, fp); ++ fclose(fp); ++ ++ if (n<30) return RFT_UNKNOWN; /* files less than 30 bytes long... */ ++ } ++#endif + return rv; + } + +@@ -2652,9 +3129,10 @@ + PICINFO *pinfo; + { + /* if quick is set, we're being called to generate icons, or something +- like that. We should load the image as quickly as possible. Currently, +- this only affects the LoadPS routine, which, if quick is set, only +- generates the page file for the first page of the document */ ++ like that. We should load the image as quickly as possible. Previously, ++ this affected only the LoadPS routine, which, if quick is set, only ++ generates the page file for the first page of the document. Now it ++ also affects PCD, which loads only a thumbnail. */ + + int rv = 0; + +@@ -2665,7 +3143,11 @@ + switch (ftype) { + case RFT_GIF: rv = LoadGIF (fname, pinfo); break; + case RFT_PM: rv = LoadPM (fname, pinfo); break; ++#ifdef HAVE_MGCSFX ++ case RFT_PBM: rv = LoadPBM (fname, pinfo, -1); break; ++#else + case RFT_PBM: rv = LoadPBM (fname, pinfo); break; ++#endif + case RFT_XBM: rv = LoadXBM (fname, pinfo); break; + case RFT_SUNRAS: rv = LoadSunRas(fname, pinfo); break; + case RFT_BMP: rv = LoadBMP (fname, pinfo); break; +@@ -2677,21 +3159,60 @@ + case RFT_XPM: rv = LoadXPM (fname, pinfo); break; + case RFT_XWD: rv = LoadXWD (fname, pinfo); break; + case RFT_FITS: rv = LoadFITS (fname, pinfo, quick); break; ++ case RFT_ZX: rv = LoadZX (fname, pinfo); break; /* [JCE] */ ++ case RFT_WBMP: rv = LoadWBMP (fname, pinfo); break; ++ ++#ifdef HAVE_PCD ++ /* if quick is switched on, use the smallest image size; don't ask the user */ ++ case RFT_PCD: rv = LoadPCD (fname, pinfo, quick ? 0 : PcdSize); break; ++#endif + + #ifdef HAVE_JPEG +- case RFT_JFIF: rv = LoadJFIF (fname, pinfo, quick); break; ++ case RFT_JFIF: rv = LoadJFIF (fname, pinfo, quick); break; + #endif + + #ifdef HAVE_TIFF +- case RFT_TIFF: rv = LoadTIFF (fname, pinfo, quick); break; ++ case RFT_TIFF: rv = LoadTIFF (fname, pinfo, quick); break; ++#endif ++ ++#ifdef HAVE_PNG ++ case RFT_PNG: rv = LoadPNG (fname, pinfo); break; + #endif + + #ifdef HAVE_PDS +- case RFT_PDSVICAR: rv = LoadPDS (fname, pinfo); break; ++ case RFT_PDSVICAR: rv = LoadPDS (fname, pinfo); break; + #endif + + #ifdef GS_PATH +- case RFT_PS: rv = LoadPS (fname, pinfo, quick); break; ++ case RFT_PS: rv = LoadPS (fname, pinfo, quick); break; ++#endif ++ ++#ifdef HAVE_MAG ++ case RFT_MAG: rv = LoadMAG (fname, pinfo); break; ++#endif ++ ++#ifdef HAVE_MAKI ++ case RFT_MAKI: rv = LoadMAKI (fname, pinfo); break; ++#endif ++ ++#ifdef HAVE_PIC ++ case RFT_PIC: rv = LoadPIC (fname, pinfo); break; ++#endif ++ ++#ifdef HAVE_PI ++ case RFT_PI: rv = LoadPi (fname, pinfo); break; ++#endif ++ ++#ifdef HAVE_PIC2 ++ case RFT_PIC2: rv = LoadPIC2 (fname, pinfo, quick); break; ++#endif ++ ++#ifdef HAVE_HIPS ++ case RFT_HIPS: rv = LoadHIPS (fname, pinfo); break; ++#endif ++ ++#ifdef HAVE_MGCSFX ++ case RFT_MGCSFX: rv = LoadMGCSFX (fname, pinfo); break; + #endif + + } +@@ -2700,13 +3221,17 @@ + + + /********************************/ +-int UncompressFile(name, uncompname) ++int UncompressFile(name, uncompname, filetype) + char *name, *uncompname; ++ int filetype; + { + /* returns '1' on success, with name of uncompressed file in uncompname + returns '0' on failure */ + + char namez[128], *fname, buf[512]; ++#ifndef USE_MKSTEMP ++ int tmpfd; ++#endif + + fname = name; + namez[0] = '\0'; +@@ -2746,15 +3271,23 @@ + close(mkstemp(uncompname)); + #else + mktemp(uncompname); ++ tmpfd = open(uncompname,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR); ++ if (tmpfd < 0) FatalError("UncompressFile(): can't create temporary file"); ++ close(tmpfd); + #endif + + #ifndef VMS +- sprintf(buf,"%s -c %s >%s", UNCOMPRESS, fname, uncompname); ++ if (filetype == RFT_COMPRESS) ++ sprintf(buf,"%s -c '%s' > '%s'", UNCOMPRESS, fname, uncompname); ++# ifdef BUNZIP2 ++ else if (filetype == RFT_BZIP2) ++ sprintf(buf,"%s -c '%s' > '%s'", BUNZIP2, fname, uncompname); ++# endif + #else /* it IS VMS */ + # ifdef GUNZIP +- sprintf(buf,"%s %s %s", UNCOMPRESS, fname, uncompname); ++ sprintf(buf,"%s '%s' '%s'", UNCOMPRESS, fname, uncompname); + # else +- sprintf(buf,"%s %s", UNCOMPRESS, fname); ++ sprintf(buf,"%s '%s'", UNCOMPRESS, fname); + # endif + #endif + +@@ -2797,6 +3330,62 @@ + } + + ++#ifdef MACBINARY ++/********************************/ ++int RemoveMacbinary(src, dst) ++ char *src, *dst; ++{ ++ char buffer[8192]; /* XXX */ ++ int n, eof; ++#ifndef USE_MKSTEMP ++ int tmpfd; ++#endif ++ FILE *sfp, *dfp; ++ ++ sprintf(dst, "%s/xvmXXXXXX", tmpdir); ++#ifdef USE_MKSTEMP ++ close(mkstemp(dst)); ++#else ++ mktemp(dst); ++ tmpfd = open(dst,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR); ++ if (tmpfd < 0) FatalError("RemoveMacbinary(): can't create temporary file"); ++#endif ++ ++ SetISTR(ISTR_INFO, "Removing MacBinary..."); ++ ++ sfp = xv_fopen(src, "r"); ++#ifdef USE_MKSTEMP ++ dfp = xv_fopen(dst, "w"); ++#else ++ dfp = fdopen(tmpfd, "w"); ++#endif ++ if (!sfp || !dfp) { ++ SetISTR(ISTR_INFO, "Unable to remove a InfoFile header form '%s'.", src); ++ Warning(); ++ return 0; ++ } ++ fseek(sfp, MACBSIZE, SEEK_SET); ++ while ((n = fread(buffer, 1, sizeof(buffer), sfp)) == 8192) /* XXX */ ++ fwrite(buffer, 1, n, dfp); ++ if ((eof = feof(sfp))) ++ fwrite(buffer, 1, n, dfp); ++ fclose(sfp); ++ fflush(dfp); ++ fclose(dfp); ++#ifndef USE_MKSTEMP ++ close(tmpfd); ++#endif ++ if (!eof) { ++ SetISTR(ISTR_INFO, "Unable to remove a InfoFile header form '%s'.", src); ++ Warning(); ++ return 0; ++ } ++ ++ return 1; ++} ++#endif ++ ++ + /********************************/ + void KillPageFiles(bname, numpages) + char *bname; +@@ -2918,6 +3507,9 @@ + + char fullcmd[512], tmpname[64], str[512]; + int i; ++#ifndef USE_MKSTEMP ++ int tmpfd; ++#endif + + if (!cmd || (strlen(cmd) < (size_t) 2)) return 1; + +@@ -2926,6 +3518,9 @@ + close(mkstemp(tmpname)); + #else + mktemp(tmpname); ++ tmpfd = open(tmpname,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR); ++ if (tmpfd < 0) FatalError("openPic(): can't create temporary file"); ++ close(tmpfd); + #endif + if (tmpname[0] == '\0') { /* mktemp() or mkstemp() blew up */ + sprintf(str,"Unable to create temporary filename."); +@@ -2966,26 +3561,21 @@ + { + int i; + ++ waitsec = (numnames <= 1)? waitsec_final : waitsec_nonfinal; ++ + if (!numnames) { openPic(DFLTPIC); return; } + + i = 0; +- if (!randomShow) { +- while (numnames>0) { +- if (openPic(0)) return; /* success */ +- else { +- if (polling && !i) +- fprintf(stderr,"%s: POLLING: Waiting for file '%s' \n\tto %s\n", +- cmd, namelist[0], "be created, or whatever..."); +- i = 1; +- } ++ while (numnames>0) { ++ if (openPic(0)) return; /* success */ ++ else { ++ if (polling && !i) ++ fprintf(stderr,"%s: POLLING: Waiting for file '%s' \n\tto %s\n", ++ cmd, namelist[0], "be created, or whatever..."); ++ i = 1; + } + } + +- else { /* pick random first picture */ +- for (i=findRandomPic(); i>=0; i=findRandomPic()) +- if (openPic(i)) return; /* success */ +- } +- + if (numnames>1) FatalError("couldn't open any pictures"); + else Quit(-1); + } +@@ -3014,19 +3604,15 @@ + { + int i; + +- if (!randomShow) { +- if (curname>=0) i = curname+1; +- else if (nList.selected >= 0 && nList.selected < numnames) +- i = nList.selected; +- else i = 0; ++ if (curname>=0) i = curname+1; ++ else if (nList.selected >= 0 && nList.selected < numnames) ++ i = nList.selected; ++ else i = 0; + +- while (i<numnames && !openPic(i)); +- if (i<numnames) return; /* success */ +- } +- else { +- for (i=findRandomPic(); i>=0; i=findRandomPic()) +- if (openPic(i)) return; +- } ++ waitsec = (i == numnames-1)? waitsec_final : waitsec_nonfinal; ++ ++ while (i<numnames && !openPic(i)); ++ if (i<numnames) return; /* success */ + + Quit(0); + } +@@ -3039,25 +3625,21 @@ + + j = loop = 0; + while (1) { +- if (!randomShow) { + +- if (curname>=0) i = curname+1; +- else if (nList.selected >= 0 && nList.selected < numnames) +- i = nList.selected; +- else i = 0; ++ if (curname>=0) i = curname+1; ++ else if (nList.selected >= 0 && nList.selected < numnames) ++ i = nList.selected; ++ else i = 0; + +- if (loop) { i = 0; loop = 0; } ++ if (loop) { i = 0; loop = 0; } + +- while (i<numnames && !openPic(i)); +- if (i<numnames) return; +- } +- else { +- for (i=findRandomPic(); i>=0; i=findRandomPic()) +- if (openPic(i)) return; +- } ++ waitsec = (i == numnames-1)? waitsec_final : waitsec_nonfinal; ++ ++ while (i<numnames && !openPic(i)); ++ if (i<numnames) return; + + loop = 1; /* back to top of list */ +- if (j) break; /* we're in a 'failure loop' */ ++ if (j) break; /* we're in a 'failure loop' */ + j++; + } + +@@ -3090,47 +3672,6 @@ + openPic(LOADPIC); + } + +- +- +- +-/****************/ +-static int findRandomPic() +-/****************/ +-{ +- static byte *loadList; +- static int left_to_load, listLen = -1; +- int k; +- time_t t; +- +- /* picks a random name out of the list, and returns it's index. If there +- are no more names to pick, it returns '-1' and resets itself */ +- +- if (!loadList || numnames!=listLen) { +- if (loadList) free(loadList); +- else { +- time(&t); +- srandom((unsigned int) t); /* seed the random */ +- } +- +- left_to_load = listLen = numnames; +- loadList = (byte *) malloc((size_t) listLen); +- for (k=0; k<listLen; k++) loadList[k] = 0; +- } +- +- if (left_to_load <= 0) { /* we've loaded all the pics */ +- for (k=0; k<listLen; k++) loadList[k] = 0; /* clear flags */ +- left_to_load = listLen; +- return -1; /* 'done' return */ +- } +- +- for (k=abs(random()) % listLen; loadList[k]; k = (k+1) % listLen); +- +- left_to_load--; +- loadList[k] = TRUE; +- +- return k; +-} +- + /****************/ + static void mainLoop() + { +@@ -3144,10 +3685,11 @@ + selected file (or the 0th file, if no selection either), and 'Prev' means + view the one right before the selected file */ + +- openFirstPic(); /* find first displayable picture, exit if none */ ++ /* find first displayable picture, exit if none */ ++ if (!startGrab) openFirstPic(); + + if (!pic) { /* must've opened a text file... display dflt pic */ +- openPic(DFLTPIC); ++ if (!startGrab) openPic(DFLTPIC); + if (mainW && !useroot) RaiseTextWindows(); + } + +@@ -3224,8 +3766,16 @@ + hints.flags = 0; + if ((i&XValue || i&YValue)) hints.flags = USPosition; + +- if (i&XValue && i&XNegative) x = vrWIDE - eWIDE - abs(x); +- if (i&YValue && i&YNegative) y = vrHIGH - eHIGH - abs(y); ++ hints.win_gravity = NorthWestGravity; ++ if (i&XValue && i&XNegative) { ++ hints.win_gravity = NorthEastGravity; ++ x = vrWIDE - (eWIDE + 2 * bwidth) - abs(x); ++ } ++ if (i&YValue && i&YNegative) { ++ hints.win_gravity = (hints.win_gravity == NorthWestGravity) ? ++ SouthWestGravity : SouthEastGravity; ++ y = vrHIGH - (eHIGH + 2 * bwidth) - abs(y); ++ } + + if (x+eWIDE > vrWIDE) x = vrWIDE - eWIDE; /* keep on screen */ + if (y+eHIGH > vrHIGH) y = vrHIGH - eHIGH; +@@ -3245,7 +3795,7 @@ + hints.x = x; hints.y = y; + hints.width = eWIDE; hints.height = eHIGH; + hints.max_width = maxWIDE; hints.max_height = maxHIGH; +- hints.flags |= USSize | PMaxSize; ++ hints.flags |= USSize | PMaxSize | PWinGravity; + + xswa.bit_gravity = StaticGravity; + xswa.background_pixel = bg; +@@ -3294,10 +3844,6 @@ + } + } + +- +- XSetStandardProperties(theDisp,mainW,"","",None,NULL,0,&hints); +- setWinIconNames(name); +- + xwmh.input = True; + xwmh.flags = InputHint; + +@@ -3322,12 +3868,13 @@ + } + } + } +- XSetWMHints(theDisp, mainW, &xwmh); + + classh.res_name = "xv"; + classh.res_class = "XVroot"; +- XSetClassHint(theDisp, mainW, &classh); + ++ XmbSetWMProperties(theDisp, mainW, NULL, NULL, NULL, 0, &hints, &xwmh, ++ &classh); ++ setWinIconNames(name); + + if (nodecor) { /* turn of image window decorations (in MWM) */ + Atom mwm_wm_hints; +@@ -4070,16 +4617,30 @@ + unsigned long nitems, nleft; + byte *data; + +- i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0), +- resAtom, 0L, 1L, False, +- XA_STRING, &actType, &actFormat, &nitems, &nleft, +- (unsigned char **) &data); ++ if (spec_window) { ++ i = XGetWindowProperty(theDisp, spec_window, ++ resAtom, 0L, 1L, False, ++ XA_STRING, &actType, &actFormat, &nitems, &nleft, ++ (unsigned char **) &data); ++ } else { ++ i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0), ++ resAtom, 0L, 1L, False, ++ XA_STRING, &actType, &actFormat, &nitems, &nleft, ++ (unsigned char **) &data); ++ } + if (i==Success && actType==XA_STRING && actFormat==8) { + if (nitems>0 && data) XFree(data); +- i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0), resAtom, 0L, +- (long) ((nleft+4+3)/4), +- False, XA_STRING, &actType, &actFormat, +- &nitems, &nleft, (unsigned char **) &data); ++ if (spec_window) { ++ i = XGetWindowProperty(theDisp, spec_window, resAtom, 0L, ++ (long) ((nleft+4+3)/4), ++ False, XA_STRING, &actType, &actFormat, ++ &nitems, &nleft, (unsigned char **) &data); ++ } else { ++ i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0), resAtom, 0L, ++ (long) ((nleft+4+3)/4), ++ False, XA_STRING, &actType, &actFormat, ++ &nitems, &nleft, (unsigned char **) &data); ++ } + if (i==Success && actType==XA_STRING && actFormat==8 && data) { + def_resource = XrmGetStringDatabase((char *) data); + XFree(data); +diff -ruN xv-3.10a-bugfixes/xv.h xv-3.10a-enhancements/xv.h +--- xv-3.10a-bugfixes/xv.h 2005-04-10 09:37:18.000000000 -0700 ++++ xv-3.10a-enhancements/xv.h 2005-05-01 13:32:10.000000000 -0700 +@@ -14,8 +14,9 @@ + /* GRR orig jumbo enhancements patch: 20000220 */ + /* GRR 1st public jumbo F+E patches: 20040531 */ + /* GRR 2nd public jumbo F+E patches: 20050410 */ +-#define REVDATE "version 3.10a-jumboFix of 20050410" +-#define VERSTR "3.10a-20050410" ++/* GRR 3rd public jumbo F+E patches: 20050501 */ ++#define REVDATE "version 3.10a-jumboFix+Enh of 20050501" ++#define VERSTR "3.10a-20050501" + + /* + * uncomment the following, and modify for your site, but only if you've +@@ -49,6 +50,10 @@ + /* START OF MACHINE-DEPENDENT CONFIGURATION INFO */ + /*************************************************/ + ++ ++#define ENABLE_FIXPIX_SMOOTH /* GRR 19980607 */ ++ ++ + /* Things to make xv more likely to just build, without the user tweaking + the makefile */ + +@@ -67,6 +72,14 @@ + # define SVR4 + #endif + ++#if defined(__sony_news) && defined(bsd43) && !defined(__bsd43) ++# define __bsd43 ++#elif defined(__sony_news) && (defined(SYSTYPE_BSD) || defined(__SYSTYPE_BSD)) && !defined(bsd43) && !defined(__bsd43) ++# define bsd43 ++# define __bsd43 ++#endif ++ ++#include <signal.h> /* for interrupt handling */ + + /* at least on Linux, the following file (1) includes sys/types.h and + * (2) defines __USE_BSD (which was not defined before here), so __linux__ +@@ -78,7 +91,9 @@ + # ifndef _LINUX_LIMITS_H + # include <linux/limits.h> + # endif +-# define USLEEP ++# ifndef USLEEP ++# define USLEEP ++# endif + /* want only one or the other defined, not both: */ + # if !defined(BSDTYPES) && !defined(__USE_BSD) + # define BSDTYPES +@@ -117,6 +132,16 @@ + #endif + + ++#if defined(__sony_news) && defined(__bsd43) ++# include <unistd.h> ++#endif ++ ++ ++#if defined(__FreeBSD__) ++# include <sys/param.h> ++#endif ++ ++ + /* include files */ + #include <stdio.h> + #include <math.h> +@@ -132,9 +157,11 @@ + + #ifndef VMS + # include <errno.h> +- extern int errno; /* SHOULD be in errno.h, but often isn't */ +-# if !defined(__NetBSD__) && !(defined(__linux__) && defined(__USE_BSD)) +- extern char *sys_errlist[]; /* this too... */ ++# ifndef __NetBSD__ ++# if !(defined __GLIBC__ && __GLIBC__ >= 2) ++ extern int errno; /* SHOULD be in errno.h, but often isn't */ ++ extern char *sys_errlist[]; /* this too... */ ++# endif + # endif + #endif + +@@ -203,9 +230,10 @@ + #include <X11/Xatom.h> + #include <X11/Xmd.h> + ++#ifdef TV_L10N ++# include <X11/Xlocale.h> ++#endif + +-#undef SIGCHLD /* defined in both Xos.h and signal.h */ +-#include <signal.h> /* for interrupt handling */ + + #include <sys/types.h> + +@@ -316,7 +344,9 @@ + # endif + #endif + +- ++#ifndef S_IRWUSR ++# define S_IRWUSR (S_IRUSR|__S_IWRITE) ++#endif + + #ifndef MAXPATHLEN + # define MAXPATHLEN 256 +@@ -343,13 +373,36 @@ + #endif + + +-/* GRR 20040430: This is new and still only partially implemented. No doubt +- * there are many other systems that have mkstemp() (SUSv3), +- * but let's start small... */ +-#if defined(__linux__) || defined(__OpenBSD__) +-# define USE_MKSTEMP /* use 'mkstemp()' instead of 'mktemp()' */ ++/* GRR 20040430: This is new and still not fully deployed. No doubt there ++ * are other systems that have mkstemp() (SUSv3); we can add ++ * them later. */ ++#ifndef VMS /* VMS hates multi-line definitions */ ++# if defined(__linux__) || defined(__OpenBSD__) || defined(__NetBSD__) || \ ++ defined(__bsdi__) ++# ifndef USE_MKSTEMP ++# define USE_MKSTEMP /* use 'mkstemp()' instead of 'mktemp()' */ ++# endif /* >> SECURITY ISSUE << */ ++# endif ++#endif ++ ++ ++/* GRR 20040503: This is new and so far tested only under Linux. But it ++ * allows -wait to work with subsecond values as long as ++ * times() exists and clock_t is a long int (latter matters ++ * only if/when clocks wrap, which for Linux is multiples of ++ * 497.11 days since the last reboot). */ ++#if defined(__linux__) ++# define USE_TICKS /* use times()/Timer(), not time()/sleep() */ ++# include <limits.h> /* LONG_MAX (really want CLOCK_T_MAX) */ ++# include <sys/times.h> /* times() */ ++# ifndef CLK_TCK /* can be undefined in strict-ANSI mode */ ++# define CLK_TCK CLOCKS_PER_SEC /* claimed to be same thing in time.h */ ++# endif + #endif + ++#if (defined(SYSV) || defined(SVR4) || defined(linux)) && !defined(USE_GETCWD) ++# define USE_GETCWD ++#endif + + /*****************************/ + /* END OF CONFIGURATION INFO */ +@@ -363,17 +416,21 @@ + # define HAVE_TIFF + #endif + ++#ifdef DOPNG ++# define HAVE_PNG ++#endif ++ + #ifdef DOPDS + # define HAVE_PDS + #endif + + + +-#define PROGNAME "xv" /* used in resource database */ ++#define PROGNAME "xv" /* used in resource database */ + +-#define MAXNAMES 4096 /* max # of files in ctrlW list */ ++#define MAXNAMES 32768 /* max # of files in ctrlW list */ + +-#define MAXBRWIN 4 /* max # of vis browser windows */ ++#define MAXBRWIN 16 /* max # of vis browser windows */ + + /* strings in the INFOBOX (used in SetISTR and GetISTR) */ + #define NISTR 10 /* number of ISTRs */ +@@ -494,24 +551,80 @@ + #define F_TIFINC 0 + #endif + ++#ifdef HAVE_PNG ++#define F_PNGINC 1 ++#else ++#define F_PNGINC 0 ++#endif ++ ++#ifdef HAVE_MAG ++# define F_MAGINC 1 ++#else ++# define F_MAGINC 0 ++#endif ++ ++#ifdef HAVE_PIC ++# define F_PICINC 1 ++#else ++# define F_PICINC 0 ++#endif ++ ++#ifdef HAVE_MAKI ++# define F_MAKINC 1 ++#else ++# define F_MAKINC 0 ++#endif ++ ++#ifdef HAVE_PI ++# define F_PAIINC 1 ++#else ++# define F_PAIINC 0 ++#endif ++ ++#ifdef HAVE_PIC2 ++# define F_PC2INC 1 ++#else ++# define F_PC2INC 0 ++#endif ++ ++#ifdef HAVE_MGCSFX ++# define F_MGCSFXINC 1 ++#else ++# define F_MGCSFXINC 0 ++#endif ++ ++#ifdef MACBINARY ++# define MACBSIZE 128 ++#endif + + #define F_GIF 0 + #define F_JPEG ( 0 + F_JPGINC) + #define F_TIFF ( 0 + F_JPGINC + F_TIFINC) +-#define F_PS ( 1 + F_JPGINC + F_TIFINC) +-#define F_PBMRAW ( 2 + F_JPGINC + F_TIFINC) +-#define F_PBMASCII ( 3 + F_JPGINC + F_TIFINC) +-#define F_XBM ( 4 + F_JPGINC + F_TIFINC) +-#define F_XPM ( 5 + F_JPGINC + F_TIFINC) +-#define F_BMP ( 6 + F_JPGINC + F_TIFINC) +-#define F_SUNRAS ( 7 + F_JPGINC + F_TIFINC) +-#define F_IRIS ( 8 + F_JPGINC + F_TIFINC) +-#define F_TARGA ( 9 + F_JPGINC + F_TIFINC) +-#define F_FITS (10 + F_JPGINC + F_TIFINC) +-#define F_PM (11 + F_JPGINC + F_TIFINC) +-#define F_DELIM1 (12 + F_JPGINC + F_TIFINC) /* ----- */ +-#define F_FILELIST (13 + F_JPGINC + F_TIFINC) +-#define F_MAXFMTS (14 + F_JPGINC + F_TIFINC) /* 15, normally */ ++#define F_PNG ( 0 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_PS ( 1 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_PBMRAW ( 2 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_PBMASCII ( 3 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_XBM ( 4 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_XPM ( 5 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_BMP ( 6 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_SUNRAS ( 7 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_IRIS ( 8 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_TARGA ( 9 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_FITS (10 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_PM (11 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define F_ZX (12 + F_JPGINC + F_TIFINC + F_PNGINC) /* [JCE] */ ++#define F_WBMP (13 + F_JPGINC + F_TIFINC + F_PNGINC) ++#define JP_EXT_F (F_WBMP) ++#define F_MAG (JP_EXT_F + F_MAGINC) ++#define F_PIC (JP_EXT_F + F_MAGINC + F_PICINC) ++#define F_MAKI (JP_EXT_F + F_MAGINC + F_PICINC + F_MAKINC) ++#define F_PI (JP_EXT_F + F_MAGINC + F_PICINC + F_MAKINC + F_PAIINC) ++#define F_PIC2 (JP_EXT_F + F_MAGINC + F_PICINC + F_MAKINC + F_PAIINC + F_PC2INC) ++#define F_MGCSFX (JP_EXT_F + F_MAGINC + F_PICINC + F_MAKINC + F_PAIINC + F_PC2INC + F_MGCSFXINC) ++#define JP_EXT_F_END (F_MGCSFX) ++#define F_DELIM1 (JP_EXT_F_END + 1) /* ----- */ ++#define F_FILELIST (JP_EXT_F_END + 2) ++#define F_MAXFMTS (JP_EXT_F_END + 3) /* 23, normally */ + + + +@@ -541,6 +654,19 @@ + #define RFT_XPM 17 + #define RFT_XWD 18 + #define RFT_FITS 19 ++#define RFT_PNG 20 ++#define RFT_ZX 21 /* [JCE] */ ++#define RFT_WBMP 22 ++#define RFT_PCD 23 ++#define RFT_HIPS 24 ++#define RFT_BZIP2 25 ++#define JP_EXT_RFT (RFT_BZIP2) ++#define RFT_MAG (JP_EXT_RFT + 1) ++#define RFT_MAKI (JP_EXT_RFT + 2) ++#define RFT_PIC (JP_EXT_RFT + 3) ++#define RFT_PI (JP_EXT_RFT + 4) ++#define RFT_PIC2 (JP_EXT_RFT + 5) ++#define RFT_MGCSFX (JP_EXT_RFT + 6) + + /* definitions for page up/down, arrow up/down list control */ + #define LS_PAGEUP 0 +@@ -599,7 +725,8 @@ + #define RM_CBRICK 7 /* centered on a 'brick' bg */ + #define RM_ECENTER 8 /* symmetrical tiled */ + #define RM_ECMIRR 9 /* symmetrical mirror tiled */ +-#define RM_MAX RM_ECMIRR ++#define RM_UPLEFT 10 /* just in upper left corner */ ++#define RM_MAX RM_UPLEFT + + + /* values of colorMapMode */ +@@ -649,7 +776,8 @@ + #define RMB_CBRICK 8 + #define RMB_ECENTER 9 + #define RMB_ECMIRR 10 +-#define RMB_MAX 11 ++#define RMB_UPLEFT 11 ++#define RMB_MAX 12 + + + /* indicies into conv24MB */ +@@ -784,9 +912,9 @@ + int len; /* length of major axis */ + int vert; /* true if vertical, else horizontal */ + int active; /* true if scroll bar can do anything*/ +- int min,max; /* min/max values 'pos' can take */ +- int val; /* 'value' of scrollbar */ +- int page; /* amt val change on pageup/pagedown */ ++ double min,max; /* min/max values 'pos' can take */ ++ double val; /* 'value' of scrollbar */ ++ double page; /* amt val change on pageup/pagedown */ + int tpos; /* thumb pos. (pixels from tmin) */ + int tmin,tmax; /* min/max thumb offsets (from 0,0) */ + int tsize; /* size of thumb (in pixels) */ +@@ -801,9 +929,10 @@ + typedef struct { Window win; /* window ID */ + int x,y,w,h; /* window coords in parent */ + int active; /* true if can do anything*/ +- int min,max; /* min/max values 'pos' can take */ +- int val; /* 'value' of dial */ +- int page; /* amt val change on pageup/pagedown */ ++ double min,max; /* min/max values 'pos' can take */ ++ double val; /* 'value' of dial */ ++ double inc; /* amt val change on up/down */ ++ double page; /* amt val change on pageup/pagedown */ + char *title; /* title for this guage */ + char *units; /* string appended to value */ + u_long fg,bg,hi,lo; /* colors */ +@@ -971,15 +1100,19 @@ + WHERE unsigned int ncells, dispWIDE, dispHIGH, dispDEEP; + WHERE unsigned int vrWIDE, vrHIGH, maxWIDE, maxHIGH; + WHERE Colormap theCmap, LocalCmap; +-WHERE Window rootW, mainW, vrootW; ++WHERE Window spec_window, rootW, mainW, vrootW; + WHERE GC theGC; + WHERE u_long black, white, fg, bg, infofg, infobg; + WHERE u_long hicol, locol; + WHERE u_long blkRGB, whtRGB; + WHERE Font mfont, monofont; + WHERE XFontStruct *mfinfo, *monofinfo; ++#ifdef TV_L10N ++WHERE XFontSet monofset; ++WHERE XFontSetExtents *monofsetinfo; ++#endif + WHERE Visual *theVisual; +-WHERE Cursor arrow, cross, tcross, zoom, inviso; ++WHERE Cursor arrow, cross, tcross, zoom, inviso, tlcorner; + WHERE Pixmap iconPix, iconmask; + WHERE Pixmap riconPix, riconmask; + WHERE int showzoomcursor; +@@ -996,6 +1129,10 @@ + WHERE int picType; /* CONV24_8BIT,CONV24_24BIT,etc.*/ + WHERE char *picComments; /* text comments on current pic */ + ++#ifdef TV_L10N ++WHERE int xlocale; /* true if Xlib supports locale */ ++#endif ++ + WHERE int numPages, curPage; /* for multi-page files */ + WHERE char pageBaseName[64]; /* basename for multi-page files */ + +@@ -1029,6 +1166,23 @@ + WHERE unsigned long cols[256]; /* maps pic pixel values to X pixel vals */ + WHERE int fc2pcol[256]; /* maps freecols into pic pixel values */ + WHERE int numcols; /* # of desired colors in picture */ ++#ifdef MACBINARY ++WHERE char macb_file; /* True if this file type is MacBinary */ ++WHERE int handlemacb; /* True if we want to handle MacBinary */ ++#endif ++#if defined(HAVE_PIC) || defined(HAVE_PIC2) ++WHERE int nopicadjust; /* True if we don't want to adjust aspect */ ++#endif ++#ifdef HAVE_PIC2 ++WHERE int pic2split; /* True if we want to split multiblocks */ ++#endif ++#ifdef VS_ADJUST ++WHERE int vsadjust; /* True if we want to adjust aspect of icons */ ++#endif ++#ifdef HAVE_MGCSFX ++WHERE int mgcsfx; /* True if we want to force use MgcSfx */ ++WHERE int nomgcsfx; /* True if we don't want to use MgcSfx */ ++#endif + + /* Std Cmap stuff */ + WHERE byte stdr[256], stdg[256], stdb[256]; /* std 3/3/2 cmap */ +@@ -1083,42 +1237,47 @@ + noFreeCols, /* don't free colors when loading new pic */ + autoquit, /* quit in '-root' or when click on win */ + xerrcode, /* errorcode of last X error */ +- grabDelay; /* # of seconds to sleep at start of Grab */ ++ grabDelay, /* # of seconds to sleep at start of Grab */ ++ startGrab; /* start immediate grab ? */ + + WHERE int state824; /* displays warning when going 8->24 */ + + WHERE float defaspect, /* default aspect ratio to use */ + normaspect; /* normal aspect ratio of this picture */ + +-WHERE unsigned long rootbg, rootfg; /* fg/bg for root border */ +-WHERE int waitsec; /* secs btwn pics. -1=wait for event */ +-WHERE int waitloop; /* loop at end of slide show? */ +-WHERE int automax; /* maximize pic on open */ +-WHERE int rootMode; /* mode used for -root images */ ++WHERE u_long rootbg, rootfg; /* fg/bg for root border */ ++WHERE u_short imagebgR; ++WHERE u_short imagebgG; /* GRR 19980308: bg for transpar. images */ ++WHERE u_short imagebgB; ++WHERE int have_imagebg; ++WHERE double waitsec; /* secs btwn pics. -1.0=wait for event */ ++WHERE int waitloop; /* loop at end of slide show? */ ++WHERE int automax; /* maximize pic on open */ ++WHERE int rootMode; /* mode used for -root images */ + +-WHERE int nostat; /* if true, don't stat() in LdCurDir */ ++WHERE int nostat; /* if true, don't stat() in LdCurDir */ + +-WHERE int ctrlColor; /* whether or not to use colored butts */ ++WHERE int ctrlColor; /* whether or not to use colored butts */ + +-WHERE char *def_str; /* used by rd_*() routines */ ++WHERE char *def_str; /* used by rd_*() routines */ + WHERE int def_int; +-WHERE char *tmpdir; /* equal to "/tmp" or $TMPDIR env var */ +-WHERE Pixmap gray25Tile, /* used for 3d effect on 1-bit disp's */ ++WHERE char *tmpdir; /* equal to "/tmp" or $TMPDIR env var */ ++WHERE Pixmap gray25Tile, /* used for 3d effect on 1-bit disp's */ + gray50Tile; +-WHERE int autoDelete; /* delete cmd-line files on exit? */ ++WHERE int autoDelete; /* delete cmd-line files on exit? */ + + #define PRINTCMDLEN 256 + WHERE char printCmd[PRINTCMDLEN]; + + /* stuff used for 'info' box */ + WHERE Window infoW; +-WHERE int infoUp; /* boolean: whether infobox is visible */ ++WHERE int infoUp; /* boolean: whether infobox is visible */ + WHERE int infoMode; + + + /* stuff used for 'ctrl' box */ + WHERE Window ctrlW; +-WHERE int ctrlUp; /* boolean: whether ctrlbox is visible */ ++WHERE int ctrlUp; /* boolean: whether ctrlbox is visible */ + WHERE char *namelist[MAXNAMES]; /* list of file names from argv */ + WHERE char *origlist[MAXNAMES]; /* only names from argv (autoDelete)*/ + WHERE int orignumnames; +@@ -1157,25 +1316,30 @@ + + + /* stuff used for 'browse' box */ +-WHERE int anyBrowUp; /* whether *any* browser visible */ ++WHERE int anyBrowUp; /* whether *any* browser visible */ + + /* stuff used for textview windows */ +-WHERE int anyTextUp; /* are any text windows visible? */ +-WHERE int commentUp; /* comment window up? */ ++WHERE int anyTextUp; /* are any text windows visible? */ ++WHERE int commentUp; /* comment window up? */ + + /* stuff used for xvcut.c */ +-WHERE int forceClipFile; /* don't use property clipboard */ +-WHERE int clearR, clearG, clearB; /* clear color in 24-bit mode */ ++WHERE int forceClipFile; /* don't use property clipboard */ ++WHERE int clearR, clearG, clearB; /* clear color in 24-bit mode */ + + + /* stuff used for 'ps' box */ + WHERE Window psW; +-WHERE int psUp; /* is psW mapped, or what? */ ++WHERE int psUp; /* is psW mapped, or what? */ + WHERE CBUTT encapsCB, pscompCB; + WHERE char *gsDev, *gsGeomStr; + WHERE int gsRes; + + ++/* stuff used for 'pcd' box */ ++WHERE Window pcdW; ++WHERE int pcdUp; /* is pcdW mapped, or what? */ ++ ++ + #ifdef HAVE_JPEG + /* stuff used for 'jpeg' box */ + WHERE Window jpegW; +@@ -1190,6 +1354,91 @@ + #endif + + ++#ifdef HAVE_PNG ++/* stuff used for 'png' box */ ++WHERE Window pngW; ++WHERE int pngUp; /* is pngW mapped, or what? */ ++#endif ++ ++ ++#ifdef ENABLE_FIXPIX_SMOOTH ++WHERE int do_fixpix_smooth; /* GRR 19980607: runtime FS dithering */ ++#endif ++ ++#ifdef HAVE_PIC2 ++/* stuff used for 'pic2' box */ ++WHERE Window pic2W; ++WHERE int pic2Up; /* is pic2W mapped, or what? */ ++#endif /* HAVE_PIC2 */ ++ ++#ifdef HAVE_PCD ++/* stuff used for 'pcd' box */ ++WHERE Window pcdW; ++WHERE int pcdUp; /* is pcdW mapped, or what? */ ++#endif /* HAVE_PCD */ ++ ++#ifdef HAVE_MGCSFX ++/* stuff used for 'mgcsfx' box */ ++WHERE Window mgcsfxW; ++WHERE Window mgcsfxNameW; ++WHERE int mgcsfxUp; /* is mgcsfxW mapped, or what? */ ++#endif /* HAVE_MGCSFX */ ++ ++#ifdef TV_L10N ++/* stuff used for TextViewer Japanization */ ++# define LOCALE_USASCII 0 ++# define LOCALE_EUCJ 1 ++# define LOCALE_JIS 2 ++# define LOCALE_MSCODE 3 ++ ++# ifndef LOCALE_DEFAULT ++# define LOCALE_DEFAULT 0 ++# endif /* !LOCALE_DEFAULT */ ++ ++# ifndef MAIN ++ extern char *localeList[]; ++# else ++# ifndef LOCALE_NAME_EUC ++# ifndef X_LOCALE ++# if defined(__FreeBSD__) ++ char *localeList[] = {"", "ja_JP.EUC", "none", "none"}; ++# elif defined(__linux__) ++ char *localeList[] = {"", "ja_JP.eucJP", "none", "ja_JP.SJIS"}; ++# elif defined(__sun) || defined(sun) ++ char *localeList[] = {"", "ja", "none", "none"}; ++# elif defined(__sgi) /* sgi, __sgi, __sgi__ (gcc) */ ++ char *localeList[] = {"", "ja_JP.EUC", "none", "none"}; ++# elif defined(sony_news) ++ char *localeList[] = {"", "ja_JP.EUC", "none", "ja_JP.SJIS"}; ++# elif defined(nec) ++ char *localeList[] = {"", "japan", "none", "none"}; ++# elif defined(__hpux) ++ char *localeList[] = {"", "japanese.euc", "none", "japanese"}; ++# elif defined(__osf__) ++ char *localeList[] = {"", "ja_JP.deckanji", "none", "ja_JP.SJIS"}; ++# elif defined(_AIX) ++ char *localeList[] = {"", "ja_JP", "none", "Ja_JP" }; ++# elif defined(__bsdi) ++ char *localeList[] = {"", "Japanese-EUC", "none", "none" }; ++# else ++ char *localeList[] = {"", "ja_JP.EUC", "ja_JP.JIS", "ja_JP.SJIS"}; ++# endif ++# else ++# if (XlibSpecificationRelease > 5) ++ char *localeList[] = {"", "ja_JP.eucJP", "ja_JP.JIS7", ++ "ja_JP.SJIS"}; ++# else ++ char *localeList[] = {"", "ja_JP.ujis", "ja_JP.jis7", ++ "ja_JP.mscode"}; ++# endif ++# endif /* X_LOCALE */ ++# else ++ char *localeList[] = {"", LOCALE_NAME_EUC, ++ LOCALE_NAME_JIS, LOCALE_NAME_MSCODE}; ++# endif /* LOCALE_NAME_EUC */ ++# endif /* MAIN */ ++#endif /* TV_L10N */ ++ + #undef WHERE + + +@@ -1199,8 +1448,11 @@ + /****************************** XV.C ****************************/ + int ReadFileType PARM((char *)); + int ReadPicFile PARM((char *, int, PICINFO *, int)); +-int UncompressFile PARM((char *, char *)); ++int UncompressFile PARM((char *, char *, int)); + void KillPageFiles PARM((char *, int)); ++#ifdef MACBINARY ++int RemoveMacbinary PARM((char *, char *)); ++#endif + + void NewPicGetColors PARM((int, int)); + void FixAspect PARM((int, int *, int *)); +@@ -1429,6 +1681,9 @@ + int CheckPoll PARM((int)); + void DIRDeletedFile PARM((char *)); + void DIRCreatedFile PARM((char *)); ++FILE *pic2_OpenOutFile PARM((char *, int *)); ++void pic2_KillNullFile PARM((FILE *)); ++int OpenOutFileDesc PARM((char *)); + + + /*************************** XVBROWSE.C ************************/ +@@ -1448,7 +1703,7 @@ + + /*************************** XVTEXT.C ************************/ + void CreateTextWins PARM((char *, char *)); +-void TextView PARM((char *)); ++int TextView PARM((char *)); + void OpenTextView PARM((char *, int, char *, int)); + + void OpenCommentText PARM((void)); +@@ -1466,6 +1721,8 @@ + int TextCheckEvent PARM((XEvent *, int *, int *)); + int TextDelWin PARM((Window)); + ++int CharsetCheckEvent PARM((XEvent *)); ++int CharsetDelWin PARM((Window)); + + + /**************************** XVGAM.C **************************/ +@@ -1502,12 +1759,12 @@ + + + /*************************** XVDIAL.C ***************************/ +-void DCreate PARM((DIAL *, Window, int, int, int, int, int, +- int, int, int, u_long, u_long, u_long, +- u_long, char *, char *)); ++void DCreate PARM((DIAL *, Window, int, int, int, int, double, ++ double, double, double, double, u_long, ++ u_long, u_long, u_long, char *, char *)); + +-void DSetRange PARM((DIAL *, int, int, int, int)); +-void DSetVal PARM((DIAL *, int)); ++void DSetRange PARM((DIAL *, double,double,double,double,double)); ++void DSetVal PARM((DIAL *, double)); + void DSetActive PARM((DIAL *, int)); + void DRedraw PARM((DIAL *)); + int DTrack PARM((DIAL *, int, int)); +@@ -1585,7 +1842,11 @@ + byte *, byte *, int, int, char *)); + + /**************************** XVPBM.C ***************************/ ++#ifdef HAVE_MGCSFX ++int LoadPBM PARM((char *, PICINFO *, int)); ++#else + int LoadPBM PARM((char *, PICINFO *)); ++#endif + int WritePBM PARM((FILE *, byte *, int, int, int, byte *, + byte *, byte *, int, int, int, char *)); + +@@ -1604,6 +1865,11 @@ + int WriteBMP PARM((FILE *, byte *, int, int, int, byte *, + byte *, byte *, int, int)); + ++/**************************** XVWBMP.C ***************************/ ++int LoadWBMP PARM((char *, PICINFO *)); ++int WriteWBMP PARM((FILE *, byte *, int, int, int, byte *, ++ byte *, byte *, int, int)); ++ + /**************************** XVRLE.C ***************************/ + int LoadRLE PARM((char *, PICINFO *)); + +@@ -1642,6 +1908,7 @@ + void JPEGDialog PARM((int)); + int JPEGCheckEvent PARM((XEvent *)); + void JPEGSaveParams PARM((char *, int)); ++void VersionInfoJPEG PARM((void)); /* GRR 19980605 */ + + /**************************** XVTIFF.C ***************************/ + int LoadTIFF PARM((char *, PICINFO *, int)); +@@ -1649,6 +1916,15 @@ + void TIFFDialog PARM((int)); + int TIFFCheckEvent PARM((XEvent *)); + void TIFFSaveParams PARM((char *, int)); ++void VersionInfoTIFF PARM((void)); /* GRR 19980605 */ ++ ++/**************************** XVPNG.C ***************************/ ++int LoadPNG PARM((char *, PICINFO *)); ++void CreatePNGW PARM((void)); ++void PNGDialog PARM((int)); ++int PNGCheckEvent PARM((XEvent *)); ++void PNGSaveParams PARM((char *, int)); ++void VersionInfoPNG PARM((void)); /* GRR 19980605 */ + + /**************************** XVPDS.C ***************************/ + int LoadPDS PARM((char *, PICINFO *)); +@@ -1661,6 +1937,87 @@ + void PSResize PARM((void)); + int LoadPS PARM((char *, PICINFO *, int)); + ++/************************ [JCE] XVZX.C ***************************/ ++ ++int LoadZX PARM((char *, PICINFO *)); ++int WriteZX PARM((FILE *, byte *, int, int, int, byte *, ++ byte *, byte *, int, int, char *)); ++ ++/**************************** XVPCD.C ***************************/ ++int LoadPCD PARM((char *, PICINFO *, int)); ++void CreatePCDW PARM((void)); ++void PCDDialog PARM((int)); ++int PCDCheckEvent PARM((XEvent *)); ++void PCDSetParamOptions PARM((char *)); ++ ++/*************************** XVMAG.C ***************************/ ++int LoadMAG PARM((char *, PICINFO *)); ++int WriteMAG PARM((FILE *, byte *, int, int, int, ++ byte *, byte *, byte *, int, int, char *)); ++ ++/*************************** XVMAKI.C ***************************/ ++int LoadMAKI PARM((char *, PICINFO *)); ++int WriteMAKI PARM((FILE *, byte *, int, int, int, ++ byte *, byte *, byte *, int, int)); ++ ++/*************************** XVPIC.C ***************************/ ++int LoadPIC PARM((char *, PICINFO *)); ++int WritePIC PARM((FILE *, byte *, int, int, int, ++ byte *, byte *, byte *, int, int, char *)); ++ ++/*************************** XVPI.C ***************************/ ++int LoadPi PARM((char *, PICINFO *)); ++int WritePi PARM((FILE *, byte *, int, int, int, ++ byte *, byte *, byte *, int, int, char *)); ++ ++/*************************** XVPIC2.C ***************************/ ++int LoadPIC2 PARM((char *, PICINFO *, int)); ++void CreatePIC2W PARM((void)); ++void PIC2Dialog PARM((int)); ++int PIC2CheckEvent PARM((XEvent *)); ++int PIC2SetParamOptions PARM((char *)); ++ ++/**************************** XVPCD.C ***************************/ ++int LoadPCD PARM((char *, PICINFO *,int)); ++void CreatePCDW PARM((void)); ++void PCDDialog PARM((int)); ++int PCDCheckEvent PARM((XEvent *)); ++void PCDSetParamOptions PARM((char *)); ++ ++/**************************** XVHIPS.C ***************************/ ++int LoadHIPS PARM((char *, PICINFO *)); ++ ++/*************************** XVMGCSFX.C ***************************/ ++int is_mgcsfx PARM((char *, unsigned char *, int)); ++char *mgcsfx_auto_input_com PARM((char *)); ++int LoadMGCSFX PARM((char *, PICINFO *)); ++void CreateMGCSFXW PARM((void)); ++void MGCSFXDialog PARM((int)); ++int MGCSFXCheckEvent PARM((XEvent *)); ++int MGCSFXSaveParams PARM((char *, int)); ++ ++int getInputCom PARM((void)); ++int getOutputCom PARM((void)); ++ ++/**************************** XVVD.C ****************************/ ++void Vdinit PARM((void)); ++void Vdsettle PARM((void)); ++int Chvdir PARM((char *)); ++void Dirtovd PARM((char *)); ++void Vdtodir PARM((char *)); ++void Dirtosubst PARM((char *)); ++int Mkvdir PARM((char *)); ++void Mkvdir_force PARM((char *)); ++int Rmvdir PARM((char *)); ++int Movevdir PARM((char *, char *)); ++int Isarchive PARM((char *)); ++int Isvdir PARM((char *)); ++void vd_HUPhandler PARM((void)); ++void vd_handler PARM((int)); ++int vd_Xhandler PARM((Display *, XErrorEvent *)); ++int vd_XIOhandler PARM((Display *)); ++void vd_handler_setup PARM((void)); ++ + /*************************** XVPOPUP.C ***************************/ + void CenterMapWindow PARM((Window, int, int, int, int)); + int PopUp PARM((char *, char **, int)); +@@ -1714,3 +2071,13 @@ + void CoordP2E PARM((int, int, int *, int *)); + void CoordE2P PARM((int, int, int *, int *)); + ++#if defined(__mips) && defined(__SYSTYPE_BSD43) ++# define strstr(A,B) pds_strstr((A),(B)) ++# undef S_IFIFO ++#endif /* !mips_bsd */ ++ ++#ifndef SEEK_SET ++# define SEEK_SET 0 ++# define SEEK_CUR 1 ++# define SEEK_END 2 ++#endif +diff -ruN xv-3.10a-bugfixes/xv_mgcsfx.sample xv-3.10a-enhancements/xv_mgcsfx.sample +--- xv-3.10a-bugfixes/xv_mgcsfx.sample 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xv_mgcsfx.sample 2005-04-17 14:04:22.000000000 -0700 +@@ -0,0 +1,125 @@ ++#/* ++# Configuration file for XV with recognition of 'Magic and Suffix' ++# ++# ++# $Id: xv_mgcsfx.sample,v 1.11 95/10/03 17:00:05 tin329 Exp Locker: tin329 $ ++# ++# Author: Tetsuya INOUE <tin329@chino.it.okayama-u.ac.jp> ++# ++# ++# MgcSfx definition should write in one line. ++# Format: ++# <desc>:<ms type>:<ofs>:<magic>:<suffix>:<in it>:<in c>:<out it>:<out c> ++# If you decide to not use preprocessor, comment style is allowed. ++# # <comment> ++# ++# <desc> Description of your recognized image format. ++# <ms type> Type ID for recognition. (You should use 'magic'.) ++# * magic Data of string style. ++# `\' escape for special characters: ++# \b \f \n \r \t \v \\ \' \" \a \? ++# \0 ...\377 octal value ++# \x0 ...\xff hexadecimal value ++# * suffix Suffix of file name. ++# This type check <suffix> instead ++# of <magic>. ++# * [b|l]eint16 2 byte integer of [big|little] endian. ++# * [b|l]eint32 4 byte integer of [big|little] endian. ++# <ofs> Offset of magic number in the target image file. ++# <magic> Data(magic number) of <ms type> to match at <ofs>. ++# <suffix> Suffix of filename with '.'start. ++# ++# <in it> Input image format type (output from <in c>). ++# * PNM (PPM, PGM, PBM) ++# * AUTO Recognized by xv management, and load. ++# This is different from others, because ++# this write file to temporary. ++# <out it> Output image format type (input to <out c>). ++# * PNM_RAW (PPM_RAW, PGM_RAW, PBM_RAW) ++# * PNM_ASCII (PPM_ASCII, PGM_ASCII, PBM_ASCII) ++# ++# <in c> Command to get the input image. ++# * Command mast read stdin or file(specified by ++# argument), and write to stdout. ++# * Use %s to represent the file name. Without %s, ++# get file on stdin. ++# <out c> Command to put the output image. ++# * Command mast read stdin and write to stdout. ++# ++# <comment> Any message. ++#*/ ++ ++#/*############################################################################ ++# ++# definition of the rule with Magic and Suffix ++# ++#*/ ++ ++# /* Canon View Station Image Format */ ++ViewStation(std):magic:0:VsStdImf V0.2:.vs:PNM:VStopnm %s:PNM_RAW:pnmtoVS ++ViewStation(obj):magic:0:VsObjFormat V1.0:.vs:PNM:VSobjtopnm -:PNM_RAW:pnmtoVSobj ++ ++# /* CERN httpd cache */ ++# /* unchc skip header of CERN httpd cache file, and write data to stdout. */ ++CERN httpd cache:magic:0:HTTP/1.0::AUTO:unchc %s:: ++ ++# /* XLD4(Q4) image format */ ++XLD(Q4):magic:11:MAJYO:.q4:PNM:q4toppm:: ++ ++# /* ML1 image format */ ++ML1:magic:0:\1\0\0\x1a:.ml1:PNM:ml1toppm %s:: ++ ++# /* Pict image format, 256 color only */ ++PICT:suffix:::.pict:PNM:picttoppm:PNM_RAW:ppmquant 256 | ppmtopict ++PICT(gzip):suffix:::.pict.gz:PNM:gzip -dc | picttoppm:PNM_RAW:ppmquant 256 | ppmtopict | gzip ++PICT(compress):suffix:::.pict.Z:PNM:compress -dc | picttoppm:PNM_RAW:ppmquant 256 | ppmtopict | compress ++ ++# /* Tim image format(used by SONY PlayStation) */ ++TIM:magic:0:\x10\x00\x00\x00:.tim:PNM:timtoppm:: ++ ++# /* Cam image format(used by CASIO QV-10) */ ++# /* CAM:magic:0:\x07\x20\x4d\x4d:.cam:AUTO:camtoppm -j:PNM_RAW */ ++CAM:magic:0:\x07\x20\x4d\x4d:.cam:PNM:camtoppm:: ++ ++# /* Portable Network Graphics (PNG) format : magic is "0x89 PNG" */ ++PNG:magic:0:\x89\x50\x4e\x47:.png:PNM:pngtopnm %s:PNM_RAW:pnmtopng ++# /* PNG(interlace):magic:0:\x89\x50\x4e\x47:.png:PNM:pngtopnm %s:PNM_RAW:pnmtopng -interlace */ ++ ++# /* DB-Z, SAURUS Freehand Memo, PV-F1 Action Board, Wiz Quick Memo format */ ++# /* Use xbm2free-1.10 or later. Old version is NOT a filter. */ ++# /* To show version of xbm2free, type "xbm2free" (with no argument). */ ++ZAURUS:magic:19:IMG1:.zau:PBM_ASCII:free2pbm:PBM:pbmtoxbm|xbm2free -s - ++DBZ:magic:19:IMG1:.dbz:::PBM:pbmtoxbm|xbm2free -d - ++PVF1:magic:12:IMG1:.pvf1:PBM_ASCII:free2pbm:PBM:pbmtoxbm|xbm2free -v - ++# /* WIZ:magic:19:IMG1:.wiz:::PBM:pbmtoxbm|xbm2free -w - */ ++ ++ ++ ++# /* Compress:magic:0:\037\235:.Z:AUTO:uncompress %s:: */ ++# /* Gzip:magic:0:\037\213:.gz:AUTO:gunzip %s:: */ ++# /* Gzip(old):magic:0:\037\236:.z:AUTO:gunzip %s:: */ ++ ++# /* MAKI:magic:0:MAKI01A\040:.mki:::: */ ++# /* MAKI:magic:0:MAKI01B\040:.mki:::: */ ++# /* MAG:magic:0:MAKI02\040\040:.mag:::: */ ++# /* Pi:magic:0:Pi:.pi:::: */ ++# /* PIC:magic:0:PIC:.pic:::: */ ++# /* PIC2:magic:0:P2DT:.p2:::: */ ++# /* PhotoCD:magic:0:\xff\xff\xff\xff:.pcd:::: */ ++ ++# /* PBM(ascii):magic:0:P1:.pbm:::: */ ++# /* PGM(ascii):magic:0:P2:.pgm:::: */ ++# /* PPM(ascii):magic:0:P3:.ppm:::: */ ++# /* PBM(raw):magic:0:P4:.pbm:::: */ ++# /* PGM(raw):magic:0:P5:.pgm:::: */ ++# /* PPM(raw):magic:0:P6:.ppm:::: */ ++ ++# /* Sun raster:magic:0:\131\246\152\225:.sun:::: */ ++# /* JFIF(JPEG):magic:0:\xff\xd8\xff:.jpg:::: */ ++# /* TIFF big-endian:magic:0:\115\115:.tif:::: */ ++# /* TIFF little-endian:magic:0:\111\111:.tif:::: */ ++# /* GIF(87):magic:0:GIF87a:.gif:::: */ ++# /* GIF(89):magic:0:GIF89a:.gif:::: */ ++# /* SGI(1):magic:0:\x01\xda:.rgb:::: */ ++# /* SGI(2):magic:0:\xda\x01:.rgb:::: */ ++# /* XWD:magic:0:\0\0\0\7: :::: */ +diff -ruN xv-3.10a-bugfixes/xvbmp.c xv-3.10a-enhancements/xvbmp.c +--- xv-3.10a-bugfixes/xvbmp.c 2005-03-27 18:12:17.000000000 -0800 ++++ xv-3.10a-enhancements/xvbmp.c 2005-04-17 13:56:31.000000000 -0700 +@@ -1,5 +1,5 @@ + /* +- * xvbmp.c - i/o routines for .BMP files (MS Windows 3.x) ++ * xvbmp.c - I/O routines for .BMP files (MS Windows 3.x and later; OS/2) + * + * LoadBMP(fname, numcols) + * WriteBMP(fp, pic, ptype, w, h, r, g, b, numcols, style); +@@ -9,30 +9,39 @@ + + #include "xv.h" + +-/* comments on error handling: +- a truncated file is not considered a Major Error. The file is loaded, the +- rest of the pic is filled with 0's. +- +- a file with garbage characters in it is an unloadable file. All allocated +- stuff is tossed, and LoadBMP returns non-zero +- +- not being able to malloc is a Fatal Error. The program is aborted. */ +- +- +-#define BI_RGB 0 +-#define BI_RLE8 1 +-#define BI_RLE4 2 ++/* Comments on error-handling: ++ A truncated file is not considered a Major Error. The file is loaded, ++ and the rest of the pic is filled with 0's. ++ ++ A file with garbage characters in it is an unloadable file. All allocated ++ stuff is tossed, and LoadBMP returns non-zero. ++ ++ Not being able to malloc is a Fatal Error. The program is aborted. */ ++ ++ ++#define BI_RGB 0 /* a.k.a. uncompressed */ ++#define BI_RLE8 1 ++#define BI_RLE4 2 ++#define BI_BITFIELDS 3 /* BMP version 4 */ ++#define BI_JPEG 4 /* BMP version 5 (not yet supported) */ ++#define BI_PNG 5 /* BMP version 5 (not yet supported) */ + + #define WIN_OS2_OLD 12 + #define WIN_NEW 40 + #define OS2_NEW 64 + ++#if (defined(UINT_MAX) && UINT_MAX != 0xffffffffU) ++# error XV's BMP code requires 32-bit unsigned integer type, but u_int isn't ++#endif ++ + static long filesize; + + static int loadBMP1 PARM((FILE *, byte *, u_int, u_int)); + static int loadBMP4 PARM((FILE *, byte *, u_int, u_int, u_int)); + static int loadBMP8 PARM((FILE *, byte *, u_int, u_int, u_int)); +-static int loadBMP24 PARM((FILE *, byte *, u_int, u_int)); ++static int loadBMP16 PARM((FILE *, byte *, u_int, u_int, u_int *)); ++static int loadBMP24 PARM((FILE *, byte *, u_int, u_int, u_int)); ++static int loadBMP32 PARM((FILE *, byte *, u_int, u_int, u_int *)); + static u_int getshort PARM((FILE *)); + static u_int getint PARM((FILE *)); + static void putshort PARM((FILE *, int)); +@@ -52,15 +61,14 @@ + PICINFO *pinfo; + /*******************************************/ + { +- FILE *fp; +- int i, c, c1, rv; +- u_int bfSize, bfOffBits, biSize, biWidth, biHeight, biPlanes; +- u_int biBitCount, biCompression, biSizeImage, biXPelsPerMeter; +- u_int biYPelsPerMeter, biClrUsed, biClrImportant; +- int bPad; +- char *cmpstr; +- byte *pic24, *pic8; +- char buf[512], *bname; ++ FILE *fp; ++ int i, c, c1, rv, bPad; ++ u_int bfSize, bfOffBits, biSize, biWidth, biHeight, biPlanes; ++ u_int biBitCount, biCompression, biSizeImage, biXPelsPerMeter; ++ u_int biYPelsPerMeter, biClrUsed, biClrImportant; ++ u_int colormask[3]; ++ char buf[512], *bname, *cmpstr, rgb_bits[16]; ++ byte *pic24, *pic8; + + /* returns '1' on success */ + +@@ -98,14 +106,13 @@ + biClrUsed = getint(fp); + biClrImportant = getint(fp); + } +- + else { /* old bitmap format */ + biWidth = getshort(fp); /* Types have changed ! */ + biHeight = getshort(fp); + biPlanes = getshort(fp); + biBitCount = getshort(fp); + +- /* Not in old versions so have to compute them*/ ++ /* not in old versions, so have to compute them */ + biSizeImage = (((biPlanes * biBitCount*biWidth)+31)/32)*4*biHeight; + + biCompression = BI_RGB; +@@ -126,25 +133,39 @@ + if (FERROR(fp)) { bmpError(bname,"EOF reached in file header"); goto ERROR; } + + +- /* error checking */ +- if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 && biBitCount!=24) || +- biPlanes!=1 || biCompression>BI_RLE4 || ++ /* error-checking */ ++ if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 && ++ biBitCount!=16 && biBitCount!=24 && biBitCount!=32) || ++ biPlanes!=1 || biCompression>BI_PNG || + biWidth<=0 || biHeight<=0 || + (biClrUsed && biClrUsed > (1 << biBitCount))) { + + sprintf(buf, +- "Bogus BMP File! (%dx%d, Bits=%d, Colors=%d, Planes=%d, Compr=%d)", ++ "Unsupported BMP type (%dx%d, Bits=%d, Colors=%d, Planes=%d, " ++ "Compr=%d)", + biWidth, biHeight, biBitCount, biClrUsed, biPlanes, biCompression); + + bmpError(bname, buf); + goto ERROR; + } + ++ if (biCompression>BI_BITFIELDS) { ++ sprintf(buf, "Unsupported BMP compression method (%s)", ++ biCompression == BI_JPEG? "JPEG" : ++ biCompression == BI_PNG? "PNG" : ++ "unknown/newer than v5"); ++ ++ bmpError(bname, buf); ++ goto ERROR; ++ } ++ + if (((biBitCount==1 || biBitCount==24) && biCompression != BI_RGB) || +- (biBitCount==4 && biCompression==BI_RLE8) || +- (biBitCount==8 && biCompression==BI_RLE4)) { ++ (biBitCount==4 && biCompression!=BI_RGB && biCompression!=BI_RLE4) || ++ (biBitCount==8 && biCompression!=BI_RGB && biCompression!=BI_RLE8) || ++ ((biBitCount==16 || biBitCount==32) && ++ biCompression!=BI_RGB && biCompression!=BI_BITFIELDS)) { + +- sprintf(buf,"Bogus BMP File! (bitCount=%d, Compression=%d)", ++ sprintf(buf,"Unsupported BMP type (bitCount=%d, Compression=%d)", + biBitCount, biCompression); + + bmpError(bname, buf); +@@ -156,20 +177,23 @@ + if (biSize != WIN_OS2_OLD) { + /* skip ahead to colormap, using biSize */ + c = biSize - 40; /* 40 bytes read from biSize to biClrImportant */ +- for (i=0; i<c; i++) getc(fp); +- ++ for (i=0; i<c; i++) ++ getc(fp); + bPad = bfOffBits - (biSize + 14); + } + ++ /* 16-bit or 32-bit color mask */ ++ if (biCompression==BI_BITFIELDS) { ++ colormask[0] = getint(fp); ++ colormask[1] = getint(fp); ++ colormask[2] = getint(fp); ++ bPad -= 12; ++ } ++ + /* load up colormap, if any */ +- if (biBitCount!=24) { ++ if (biBitCount == 1 || biBitCount == 4 || biBitCount == 8) { + int i, cmaplen; + +-/* this is superfluous; see identical test in "error checking" block above +- if (biClrUsed > (1 << biBitCount)) +- biClrUsed = (1 << biBitCount); +- */ +- + cmaplen = (biClrUsed) ? biClrUsed : 1 << biBitCount; + for (i=0; i<cmaplen; i++) { + pinfo->b[i] = getc(fp); +@@ -205,7 +229,7 @@ + + /* create pic8 or pic24 */ + +- if (biBitCount==24) { ++ if (biBitCount==16 || biBitCount==24 || biBitCount==32) { + u_int npixels = biWidth * biHeight; + u_int count = 3 * npixels; + +@@ -227,19 +251,35 @@ + WaitCursor(); + + /* load up the image */ +- if (biBitCount == 1) rv = loadBMP1(fp,pic8,biWidth,biHeight); +- else if (biBitCount == 4) rv = loadBMP4(fp,pic8,biWidth,biHeight, +- biCompression); +- else if (biBitCount == 8) rv = loadBMP8(fp,pic8,biWidth,biHeight, +- biCompression); +- else rv = loadBMP24(fp,pic24,biWidth,biHeight); ++ switch (biBitCount) { ++ case 1: ++ rv = loadBMP1(fp, pic8, biWidth, biHeight); ++ break; ++ case 4: ++ rv = loadBMP4(fp, pic8, biWidth, biHeight, biCompression); ++ break; ++ case 8: ++ rv = loadBMP8(fp, pic8, biWidth, biHeight, biCompression); ++ break; ++ case 16: ++ rv = loadBMP16(fp, pic24, biWidth, biHeight, /* v-- BI_RGB */ ++ biCompression == BI_BITFIELDS? colormask : NULL); ++ break; ++ default: ++ if (biBitCount == 32 && biCompression == BI_BITFIELDS) ++ rv = loadBMP32(fp, pic24, biWidth, biHeight, colormask); ++ else /* 24 or (32 and BI_RGB) */ ++ rv = loadBMP24(fp, pic24, biWidth, biHeight, biBitCount); ++ break; ++ } + + if (rv) bmpError(bname, "File appears truncated. Winging it."); + ++ + fclose(fp); + + +- if (biBitCount == 24) { ++ if (biBitCount > 8) { + pinfo->pic = pic24; + pinfo->type = PIC24; + } +@@ -251,6 +291,22 @@ + cmpstr = ""; + if (biCompression == BI_RLE4) cmpstr = ", RLE4 compressed"; + else if (biCompression == BI_RLE8) cmpstr = ", RLE8 compressed"; ++ else if (biCompression == BI_BITFIELDS) { ++ int bit, c[3], i; ++ u_int mask; ++ ++ for (i = 0; i < 3; ++i) { ++ mask = colormask[i]; ++ c[i] = 0; ++ for (bit = 0; bit < 32; ++bit) { ++ if (mask & 1) ++ ++c[i]; ++ mask >>= 1; ++ } ++ } ++ sprintf(rgb_bits, ", RGB%d%d%d", c[0], c[1], c[2]); ++ cmpstr = rgb_bits; ++ } + + pinfo->w = biWidth; pinfo->h = biHeight; + pinfo->normw = pinfo->w; pinfo->normh = pinfo->h; +@@ -282,12 +338,13 @@ + u_int w,h; + { + int i,j,c,bitnum,padw; +- byte *pp; ++ byte *pp = pic8 + ((h - 1) * w); ++ size_t l = w*h; + + c = 0; + padw = ((w + 31)/32) * 32; /* 'w', padded to be a multiple of 32 */ + +- for (i=h-1; i>=0; i--) { ++ for (i=h-1; i>=0 && (pp - pic8 <= l); i--) { + pp = pic8 + (i * w); + if ((i&0x3f)==0) WaitCursor(); + for (j=bitnum=0; j<padw; j++,bitnum++) { +@@ -316,8 +373,8 @@ + u_int w,h,comp; + { + int i,j,c,c1,x,y,nybnum,padw,rv; +- byte *pp; +- ++ byte *pp = pic8 + ((h - 1) * w); ++ size_t l = w*h; + + rv = 0; + c = c1 = 0; +@@ -325,7 +382,7 @@ + if (comp == BI_RGB) { /* read uncompressed data */ + padw = ((w + 7)/8) * 8; /* 'w' padded to a multiple of 8pix (32 bits) */ + +- for (i=h-1; i>=0; i--) { ++ for (i=h-1; i>=0 && (pp - pic8 <= l); i--) { + pp = pic8 + (i * w); + if ((i&0x3f)==0) WaitCursor(); + +@@ -353,7 +410,7 @@ + + if (c) { /* encoded mode */ + c1 = getc(fp); +- for (i=0; i<c; i++,x++,pp++) ++ for (i=0; i<c && (pp - pic8 <= l); i++,x++,pp++) + *pp = (i&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f); + } + +@@ -373,7 +430,7 @@ + } + + else { /* absolute mode */ +- for (i=0; i<c; i++, x++, pp++) { ++ for (i=0; i<c && (pp - pic8 <= l); i++, x++, pp++) { + if ((i&1) == 0) c1 = getc(fp); + *pp = (i&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f); + } +@@ -402,14 +459,18 @@ + u_int w,h,comp; + { + int i,j,c,c1,padw,x,y,rv; +- byte *pp; ++ byte *pp = pic8 + ((h - 1) * w); ++ size_t l = w*h; ++ byte *pend; + + rv = 0; + ++ pend = pic8 + w * h; ++ + if (comp == BI_RGB) { /* read uncompressed data */ + padw = ((w + 3)/4) * 4; /* 'w' padded to a multiple of 4pix (32 bits) */ + +- for (i=h-1; i>=0; i--) { ++ for (i=h-1; i>=0 && (pp - pic8 <= l); i--) { + pp = pic8 + (i * w); + if ((i&0x3f)==0) WaitCursor(); + +@@ -425,12 +486,12 @@ + x = y = 0; + pp = pic8 + x + (h-y-1)*w; + +- while (y<h) { ++ while (y<h && pp<=pend) { + c = getc(fp); if (c == EOF) { rv = 1; break; } + + if (c) { /* encoded mode */ + c1 = getc(fp); +- for (i=0; i<c; i++,x++,pp++) *pp = c1; ++ for (i=0; i<c && pp<=pend; i++,x++,pp++) *pp = c1; + } + + else { /* c==0x00 : escape codes */ +@@ -449,7 +510,7 @@ + } + + else { /* absolute mode */ +- for (i=0; i<c; i++, x++, pp++) { ++ for (i=0; i<c && pp<=pend; i++, x++, pp++) { + c1 = getc(fp); + *pp = c1; + } +@@ -472,26 +533,133 @@ + + + /*******************************************/ +-static int loadBMP24(fp, pic24, w, h) ++static int loadBMP16(fp, pic24, w, h, mask) ++ FILE *fp; ++ byte *pic24; ++ u_int w, h, *mask; ++{ ++ int x, y; ++ byte *pp = pic24 + ((h - 1) * w * 3); ++ size_t l = w*h*3; ++ u_int buf, colormask[6]; ++ int i, bit, bitshift[6], colorbits[6], bitshift2[6]; ++ ++ if (mask == NULL) { /* RGB555 */ ++ colormask[0] = 0x00007c00; ++ colormask[1] = 0x000003e0; ++ colormask[2] = 0x0000001f; ++ colormask[3] = 0x7c000000; ++ colormask[4] = 0x03e00000; ++ colormask[5] = 0x001f0000; ++ bitshift[0] = 7; bitshift2[0] = 0; ++ bitshift[1] = 2; bitshift2[1] = 0; ++ bitshift[2] = 0; bitshift2[2] = 3; ++ bitshift[3] = 23; bitshift2[3] = 0; ++ bitshift[4] = 18; bitshift2[4] = 0; ++ bitshift[5] = 13; bitshift2[5] = 0; ++ } else { ++ colormask[0] = mask[0]; ++ colormask[1] = mask[1]; ++ colormask[2] = mask[2]; ++ colormask[3] = (mask[0] & 0xffff) << 16; ++ colormask[4] = (mask[1] & 0xffff) << 16; ++ colormask[5] = (mask[2] & 0xffff) << 16; ++ ++ for (i = 0; i < 3; ++i) { ++ buf = colormask[i]; ++ ++ bitshift[i] = 0; ++ for (bit = 0; bit < 32; ++bit) { ++ if (buf & 1) ++ break; ++ else ++ ++bitshift[i]; ++ buf >>= 1; ++ } ++ bitshift[i+3] = bitshift[i] + 16; ++ ++ colorbits[i] = 0; ++ for (; bit < 32; ++bit) { ++ if (buf & 1) ++ ++colorbits[i]; ++ else ++ break; ++ buf >>= 1; ++ } ++ if (colorbits[i] > 8) { /* over 8-bit depth */ ++ bitshift[i] += (colorbits[i] - 8); ++ bitshift[i+3] = bitshift[i] + 16; ++ bitshift2[i] = bitshift2[i+3] = 0; ++ } else ++ bitshift2[i] = bitshift2[i+3] = 8 - colorbits[i]; ++ } ++ } ++ ++ if (DEBUG > 1) ++ fprintf(stderr, "loadBMP16: bitfields\n" ++ "\tR: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n" ++ "\t (mask = %08x, shift >>%2d, <<%2d)\n" ++ "\tG: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n" ++ "\t (mask = %08x, shift >>%2d, <<%2d)\n" ++ "\tB: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n" ++ "\t (mask = %08x, shift >>%2d, <<%2d)\n", ++ colorbits[0], colormask[0], bitshift[0], bitshift2[0], ++ colormask[3], bitshift[3], bitshift2[3], ++ colorbits[1], colormask[1], bitshift[1], bitshift2[1], ++ colormask[4], bitshift[4], bitshift2[4], ++ colorbits[2], colormask[2], bitshift[2], bitshift2[2], ++ colormask[5], bitshift[5], bitshift2[5]); ++ ++ for (y = h-1; y >= 0 && (pp - pic24 <= l); y--) { ++ pp = pic24 + (3 * w * y); ++ if ((y&0x3f)==0) WaitCursor(); ++ ++ for (x = w; x > 1; x -= 2) { ++ buf = getint(fp); ++ *(pp++) = (buf & colormask[0]) >> bitshift[0] << bitshift2[0]; ++ *(pp++) = (buf & colormask[1]) >> bitshift[1] << bitshift2[1]; ++ *(pp++) = (buf & colormask[2]) >> bitshift[2] << bitshift2[2]; ++ *(pp++) = (buf & colormask[3]) >> bitshift[3] << bitshift2[3]; ++ *(pp++) = (buf & colormask[4]) >> bitshift[4] << bitshift2[4]; ++ *(pp++) = (buf & colormask[5]) >> bitshift[5] << bitshift2[5]; ++ } ++ if (w & 1) { /* padded to 2 pix */ ++ buf = getint(fp); ++ *(pp++) = (buf & colormask[0]) >> bitshift[0]; ++ *(pp++) = (buf & colormask[1]) >> bitshift[1]; ++ *(pp++) = (buf & colormask[2]) >> bitshift[2]; ++ } ++ } ++ ++ return FERROR(fp)? 1 : 0; ++} ++ ++ ++ ++/*******************************************/ ++static int loadBMP24(fp, pic24, w, h, bits) /* also handles 32-bit BI_RGB */ + FILE *fp; + byte *pic24; +- u_int w,h; ++ u_int w,h, bits; + { + int i,j,padb,rv; +- byte *pp; ++ byte *pp = pic24 + ((h - 1) * w * 3); ++ size_t l = w*h*3; + + rv = 0; + + padb = (4 - ((w*3) % 4)) & 0x03; /* # of pad bytes to read at EOscanline */ ++ if (bits==32) padb = 0; + + for (i=h-1; i>=0; i--) { + pp = pic24 + (i * w * 3); + if ((i&0x3f)==0) WaitCursor(); + +- for (j=0; j<w; j++) { ++ for (j=0; j<w && (pp - pic24 <= l); j++) { + pp[2] = getc(fp); /* blue */ + pp[1] = getc(fp); /* green */ + pp[0] = getc(fp); /* red */ ++ if (bits==32) getc(fp); + pp += 3; + } + +@@ -507,6 +675,70 @@ + + + /*******************************************/ ++static int loadBMP32(fp, pic24, w, h, colormask) /* 32-bit BI_BITFIELDS only */ ++ FILE *fp; ++ byte *pic24; ++ u_int w, h, *colormask; ++{ ++ int x, y; ++ byte *pp; ++ u_int buf; ++ int i, bit, bitshift[3], colorbits[3], bitshift2[3]; ++ ++ for (i = 0; i < 3; ++i) { ++ buf = colormask[i]; ++ ++ bitshift[i] = 0; ++ for (bit = 0; bit < 32; ++bit) { ++ if (buf & 1) ++ break; ++ else ++ ++bitshift[i]; ++ buf >>= 1; ++ } ++ ++ colorbits[i] = 0; ++ for (; bit < 32; ++bit) { ++ if (buf & 1) ++ ++colorbits[i]; ++ else ++ break; ++ buf >>= 1; ++ } ++ if (colorbits[i] > 8) { /* over 8-bit depth */ ++ bitshift[i] += (colorbits[i] - 8); ++ bitshift2[i] = 0; ++ } else ++ bitshift2[i] = 8 - colorbits[i]; ++ } ++ ++ if (DEBUG > 1) ++ fprintf(stderr, "loadBMP32: bitfields\n" ++ "\tR: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n" ++ "\tG: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n" ++ "\tB: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n", ++ colorbits[0], colormask[0], bitshift[0], bitshift2[0], ++ colorbits[1], colormask[1], bitshift[1], bitshift2[1], ++ colorbits[2], colormask[2], bitshift[2], bitshift2[2]); ++ ++ for (y = h-1; y >= 0; y--) { ++ pp = pic24 + (3 * w * y); ++ if ((y&0x3f)==0) WaitCursor(); ++ ++ for(x = w; x > 0; x --) { ++ buf = getint(fp); ++ *(pp++) = (buf & colormask[0]) >> bitshift[0] << bitshift2[0]; ++ *(pp++) = (buf & colormask[1]) >> bitshift[1] << bitshift2[1]; ++ *(pp++) = (buf & colormask[2]) >> bitshift[2] << bitshift2[2]; ++ } ++ } ++ ++ return FERROR(fp)? 1 : 0; ++} ++ ++ ++ ++/*******************************************/ + static u_int getshort(fp) + FILE *fp; + { +@@ -523,7 +755,7 @@ + int c, c1, c2, c3; + c = getc(fp); c1 = getc(fp); c2 = getc(fp); c3 = getc(fp); + return ((u_int) c) + +- (((u_int) c1) << 8) + ++ (((u_int) c1) << 8) + + (((u_int) c2) << 16) + + (((u_int) c3) << 24); + } +diff -ruN xv-3.10a-bugfixes/xvbrowse.c xv-3.10a-enhancements/xvbrowse.c +--- xv-3.10a-bugfixes/xvbrowse.c 2004-05-16 18:01:25.000000000 -0700 ++++ xv-3.10a-enhancements/xvbrowse.c 2005-04-25 23:30:27.000000000 -0700 +@@ -24,6 +24,10 @@ + typedef unsigned int mode_t; /* file mode bits */ + #endif + ++#ifndef MAX ++# define MAX(a,b) (((a)>(b))?(a):(b)) /* used only for wheelmouse support */ ++#endif ++ + + /* load up built-in icons */ + #include "bits/br_file" +@@ -36,6 +40,7 @@ + #include "bits/br_error" + /* #include "bits/br_unknown" commented out (near line 492) */ + #include "bits/br_cmpres" ++#include "bits/br_bzip2" + + #include "bits/br_gif" + #include "bits/br_pm" +@@ -50,11 +55,20 @@ + #include "bits/br_tiff" + #include "bits/br_pds" + #include "bits/br_ps" ++#include "bits/br_pcd" + #include "bits/br_iff" + #include "bits/br_targa" + #include "bits/br_xpm" + #include "bits/br_xwd" + #include "bits/br_fits" ++#include "bits/br_png" ++#include "bits/br_zx" /* [JCE] The Spectrum+3 icon */ ++#include "bits/br_mag" ++#include "bits/br_maki" ++#include "bits/br_pic" ++#include "bits/br_pi" ++#include "bits/br_pic2" ++#include "bits/br_mgcsfx" + + #include "bits/br_trash" + #include "bits/fcurs" +@@ -94,14 +108,23 @@ + #define BF_XPM 25 + #define BF_XWD 26 + #define BF_FITS 27 +-#define BF_MAX 28 /* # of built-in icons */ ++#define BF_PNG 28 ++#define BF_ZX 29 /* [JCE] Spectrum SCREEN$ */ ++#define BF_PCD 30 ++#define BF_BZIP2 31 ++#define JP_EXT_BF (BF_BZIP2) ++#define BF_MAG (JP_EXT_BF + 1) ++#define BF_MAKI (JP_EXT_BF + 2) ++#define BF_PIC (JP_EXT_BF + 3) ++#define BF_PI (JP_EXT_BF + 4) ++#define BF_PIC2 (JP_EXT_BF + 5) ++#define BF_MGCSFX (JP_EXT_BF + 6) ++#define JP_EXT_BF_END (BF_MGCSFX) ++#define BF_MAX (JP_EXT_BF_END + 1) /* # of built-in icons */ + + #define ISLOADABLE(ftyp) (ftyp!=BF_DIR && ftyp!=BF_CHR && ftyp!=BF_BLK && \ + ftyp!=BF_SOCK && ftyp!=BF_FIFO) + +-#define DEF_BROWWIDE 615 /* default size of window */ +-#define DEF_BROWHIGH 356 +- + #define SCROLLVERT 8 /* height of scroll region at top/bottom of iconw */ + #define PAGEVERT 40 /* during rect drag, if further than this, page */ + +@@ -113,16 +136,35 @@ + #define BOTMARGIN 58 /* room for a row of buttons and a line of text */ + #define LRMARGINS 5 /* left and right margins */ + +-#define ISIZE_WIDE 80 /* maximum size of an icon */ +-#define ISIZE_HIGH 60 ++/* some people like bigger icons; 4:3 aspect ratio is recommended ++ * (NOTE: standard XV binaries will not be able to read larger icons!) */ ++#ifndef ISIZE_WIDE ++# define ISIZE_WIDE 80 /* maximum size of an icon */ ++#endif ++#ifndef ISIZE_HIGH ++# define ISIZE_HIGH 60 ++#endif + +-#define ISPACE_WIDE (ISIZE_WIDE+16) /* icon spacing */ ++#ifndef ISIZE_WPAD ++# define ISIZE_WPAD 16 /* extra horizontal padding between icons */ ++#endif ++ ++#ifndef INUM_WIDE ++# define INUM_WIDE 6 /* size initial window to hold this many icons */ ++#endif ++#ifndef INUM_HIGH ++# define INUM_HIGH 3 ++#endif ++ ++#define ISPACE_WIDE (ISIZE_WIDE+ISIZE_WPAD) /* icon spacing */ + #define ISPACE_TOP 4 /* dist btwn top of ISPACE and ISIZE */ + #define ISPACE_TTOP 4 /* dist btwn bot of icon and title */ + #define ISPACE_HIGH (ISIZE_HIGH+ISPACE_TOP+ISPACE_TTOP+16+4) + + #define DBLCLICKTIME 300 /* milliseconds */ + ++#define COUNT(x) (sizeof (x) / sizeof (x)[0]) ++ + /* button/menu indicies */ + #define BR_CHDIR 0 + #define BR_DELETE 1 +@@ -140,12 +182,23 @@ + #define BR_NBUTTS 13 /* # of command buttons */ + #define BR_SEP1 13 /* separator */ + #define BR_HIDDEN 14 ++#ifdef AUTO_EXPAND ++#define BR_CLEARVD 15 ++#define BR_SELFILES 16 ++#define BR_NCMDS 17 /* # of menu commands */ ++#else + #define BR_SELFILES 15 + #define BR_NCMDS 16 /* # of menu commands */ ++#endif + + #define BUTTW 80 + #define BUTTH 24 + ++/* original size of window was 615 x 356 (for 80x60 thumbnails in 6x3 array) */ ++#define DEF_BROWWIDE (ISPACE_WIDE * INUM_WIDE + LRMARGINS * 2 + 29) ++#define DEF_BROWHIGH (ISPACE_HIGH * INUM_HIGH + BUTTH * 2 + 16 + 28) ++/* last number is a fudge--e.g., extra spaces, borders, etc. -----^ */ ++ + static char *showHstr = "Show hidden files"; + static char *hideHstr = "Hide 'hidden' files"; + +@@ -164,6 +217,9 @@ + "Close window\t^c", + MBSEP, + "Show hidden files", /* no equiv */ ++#ifdef AUTO_EXPAND ++ "Clear virtual directory", ++#endif + "Select files...\t^f" + }; + +@@ -209,6 +265,13 @@ + } BROWINFO; + + ++/* keep track of last icon visible in each path */ ++typedef struct IVIS IVIS; ++ struct IVIS { IVIS *next; ++ char *name; ++ int icon; ++ }; ++ + static Cursor movecurs, copycurs, delcurs; + static BROWINFO binfo[MAXBRWIN]; + static Pixmap bfIcons[BF_MAX], trashPix; +@@ -294,10 +357,16 @@ + static void cp_special PARM((struct stat *, int)); + static void cp_fifo PARM((struct stat *, int)); + ++#ifdef AUTO_EXPAND ++static int stat2bf PARM((u_int, char *)); ++#else + static int stat2bf PARM((u_int)); ++#endif + + static int selmatch PARM((char *, char *)); + static int selmatch1 PARM((char *, char *)); ++static void recIconVisible PARM((char *, int)); ++static void restIconVisible PARM((BROWINFO *)); + + + +@@ -511,9 +580,10 @@ + bfIcons[BF_JFIF]=MakePix1(br->win,br_jfif_bits,br_jfif_width,br_jfif_height); + bfIcons[BF_TIFF]=MakePix1(br->win,br_tiff_bits,br_tiff_width,br_tiff_height); + bfIcons[BF_PDS] =MakePix1(br->win,br_pds_bits, br_pds_width, br_pds_height); +- +- bfIcons[BF_COMPRESS]= MakePix1(br->win, br_cmpres_bits, +- br_cmpres_width, br_cmpres_height); ++ bfIcons[BF_COMPRESS] = MakePix1(br->win, br_cmpres_bits, ++ br_cmpres_width, br_cmpres_height); ++ bfIcons[BF_BZIP2] = MakePix1(br->win, br_bzip2_bits, ++ br_bzip2_width, br_bzip2_height); + + bfIcons[BF_PS] =MakePix1(br->win,br_ps_bits, br_ps_width, br_ps_height); + bfIcons[BF_IFF] =MakePix1(br->win,br_iff_bits, br_iff_width, br_iff_height); +@@ -524,6 +594,16 @@ + bfIcons[BF_XPM] =MakePix1(br->win,br_xpm_bits, br_xpm_width, br_xpm_height); + bfIcons[BF_XWD] =MakePix1(br->win,br_xwd_bits, br_xwd_width, br_xwd_height); + bfIcons[BF_FITS]=MakePix1(br->win,br_fits_bits,br_fits_width,br_fits_height); ++ bfIcons[BF_PNG] =MakePix1(br->win,br_png_bits, br_png_width, br_png_height); ++ bfIcons[BF_ZX] =MakePix1(br->win,br_zx_bits, br_zx_width, br_zx_height); ++ bfIcons[BF_PCD] =MakePix1(br->win,br_pcd_bits, br_pcd_width, br_pcd_height); ++ bfIcons[BF_MAG] =MakePix1(br->win,br_mag_bits, br_mag_width, br_mag_height); ++ bfIcons[BF_MAKI]=MakePix1(br->win,br_maki_bits,br_maki_width,br_maki_height); ++ bfIcons[BF_PIC] =MakePix1(br->win,br_pic_bits, br_pic_width, br_pic_height); ++ bfIcons[BF_PI] =MakePix1(br->win,br_pi_bits, br_pi_width, br_pi_height); ++ bfIcons[BF_PIC2]=MakePix1(br->win,br_pic2_bits,br_pic2_width,br_pic2_height); ++ bfIcons[BF_MGCSFX] = MakePix1(br->win,br_mgcsfx_bits, ++ br_mgcsfx_width,br_mgcsfx_height); + + + /* check that they all got built */ +@@ -698,6 +778,9 @@ + } + } + ++#ifdef VS_RESCMAP ++static int _IfTempOut=0; ++#endif + + /***************************************************************/ + void KillBrowseWindows() +@@ -730,7 +813,6 @@ + return 0; + } + +- + /***************************************************************/ + static int brChkEvent(br, xev) + BROWINFO *br; +@@ -745,15 +827,32 @@ + + if (!hasBeenSized) return 0; /* ignore evrythng until we get 1st Resize */ + ++ ++#ifdef VS_RESCMAP ++ /* force change color map if have LocalCmap */ ++ if (browPerfect && browCmap && (_IfTempOut==2)) { ++ int i; ++ XSetWindowAttributes xswa; ++ ++ xswa.colormap = LocalCmap? LocalCmap : theCmap; ++ for (i=0; i<MAXBRWIN; ++i) ++ XChangeWindowAttributes(theDisp, binfo[i].win, CWColormap, &xswa); ++ XFlush(theDisp); ++ _IfTempOut=1; ++ } ++#endif ++ + if (xev->type == Expose) { + int x,y,w,h; + XExposeEvent *e = (XExposeEvent *) xev; + x = e->x; y = e->y; w = e->width; h = e->height; + + /* throw away excess redraws for 'dumb' windows */ +- if (e->count > 0 && (e->window == br->scrl.win)) {} ++ if (e->count > 0 && (e->window == br->scrl.win)) ++ ; + +- else if (e->window == br->scrl.win) SCRedraw(&(br->scrl)); ++ else if (e->window == br->scrl.win) ++ SCRedraw(&(br->scrl)); + + else if (e->window == br->win || e->window == br->iconW) { /* smart wins */ + /* group individual expose rects into a single expose region */ +@@ -806,13 +905,57 @@ + int i,x,y; + x = e->x; y = e->y; + +- if (e->button == Button1) { ++#ifdef VS_RESCMAP ++ if (browCmap && browPerfect && (_IfTempOut!=0)) ++ { ++ XSetWindowAttributes xswa; ++ _IfTempOut--; ++ xswa.colormap = browCmap; ++ for(i=0;i<MAXBRWIN;i++) ++ XChangeWindowAttributes(theDisp, binfo[i].win, CWColormap, &xswa); ++ XFlush(theDisp); ++ } ++ ++#endif ++ ++ if (e->button == Button1) { + if (e->window == br->win) clickBrow(br,x,y); + else if (e->window == br->scrl.win) SCTrack(&(br->scrl),x,y); + else if (e->window == br->iconW) { + i = clickIconWin(br, x,y,(unsigned long) e->time, + (e->state&ControlMask) || (e->state&ShiftMask)); +- ++ } ++ else rv = 0; ++ } ++ else if (e->button == Button4) { /* note min vs. max, + vs. - */ ++ /* scroll regardless of where we are in the browser window */ ++ if (e->window == br->win || ++ e->window == br->scrl.win || ++ e->window == br->iconW) ++ { ++ SCRL *sp=&(br->scrl); ++ int halfpage=MAX(1,sp->page/2); /* user resize to 1 line? */ ++ ++ if (sp->val > sp->min+halfpage) ++ SCSetVal(sp,sp->val-halfpage); ++ else ++ SCSetVal(sp,sp->min); ++ } ++ else rv = 0; ++ } ++ else if (e->button == Button5) { /* note max vs. min, - vs. + */ ++ /* scroll regardless of where we are in the browser window */ ++ if (e->window == br->win || ++ e->window == br->scrl.win || ++ e->window == br->iconW) ++ { ++ SCRL *sp=&(br->scrl); ++ int halfpage=MAX(1,sp->page/2); /* user resize to 1 line? */ ++ ++ if (sp->val < sp->max-halfpage) ++ SCSetVal(sp,sp->val+halfpage); ++ else ++ SCSetVal(sp,sp->max); + } + else rv = 0; + } +@@ -1101,6 +1244,10 @@ + case BR_SELFILES: doSelFilesCmd(br); break; + + case BR_RECURSUP: doRecurseCmd(br); break; ++ ++#ifdef AUTO_EXPAND ++ case BR_CLEARVD: Vdsettle(); break; ++#endif + } + } + +@@ -1250,6 +1397,18 @@ + int i, allowtext; + + if (!nostr) setSelInfoStr(br, sel); ++#ifdef AUTO_EXPAND ++ if (Isvdir(br->path)) { ++ BTSetActive(&br->but[BR_DELETE], 0); ++ br->cmdMB.dim[BR_DELETE] = 1; ++ ++ BTSetActive(&br->but[BR_RENAME], 0); ++ br->cmdMB.dim[BR_RENAME] = 1; ++ ++ BTSetActive(&br->but[BR_MKDIR], 0); ++ br->cmdMB.dim[BR_MKDIR] = 1; ++ } else { ++#endif + BTSetActive(&br->but[BR_DELETE], br->numlit>0); + br->cmdMB.dim[BR_DELETE] = !(br->numlit>0); + +@@ -1258,6 +1417,11 @@ + + BTSetActive(&br->but[BR_GENICON], br->numlit>0); + br->cmdMB.dim[BR_GENICON] = !(br->numlit>0); ++#ifdef AUTO_EXPAND ++ BTSetActive(&br->but[BR_MKDIR], 1); ++ br->cmdMB.dim[BR_MKDIR] = 0; ++ } ++#endif + + /* turn on 'text view' cmd if exactly one non-dir is lit */ + allowtext = 0; +@@ -1318,8 +1482,11 @@ + struct stat st; + + sprintf(buf, "%s%s", br->path, bf->name); /* build filename */ ++#ifdef AUTO_EXPAND ++ Dirtovd(buf); ++#endif + if (stat(buf, &st) == 0) { +- sprintf(buf, "%s: %ld bytes", bf->name, st.st_size); ++ sprintf(buf, "%s: %ld bytes", bf->name, (long)st.st_size); + strcat(buf, buf1); + } + } +@@ -1598,6 +1765,10 @@ + { + int sval, first, numvis; + ++ /* if we know what path we have, remember last visible icon for this path */ ++ if (br->path) ++ recIconVisible(br->path, num); ++ + /* if icon #i isn't visible, adjust scrollbar so it *is* */ + + sval = br->scrl.val; +@@ -1649,29 +1820,14 @@ + return; + } + +- + /***************************************************************/ +-static int clickIconWin(br, mx, my, mtime, multi) +- BROWINFO *br; +- int mx,my,multi; +- unsigned long mtime; ++static int updateSel(br, sel, multi, mtime) ++ BROWINFO *br; ++ int sel, multi; ++ unsigned long mtime; + { +- /* returns '-1' normally, returns an index into bfList[] if the user +- double-clicks an icon */ +- +- int i,j, rv, sel, cpymode, dodel; +- BROWINFO *destBr; +- BFIL *bf; +- char buf[256], *destFolderName; +- +- rv = -1; /* default return value */ +- if (!br->bfList || !br->bfLen) return rv; +- +- destBr = br; destFolderName = "."; +- +- sel = mouseInWhichIcon(br, mx, my); +- +- dodel = 0; ++ int i; ++ BFIL *bf; + + if (sel == -1) { /* clicked on nothing */ + if (!multi) { /* deselect all */ +@@ -1728,11 +1884,12 @@ + + + /* see if we've double-clicked something */ +- if (sel==br->lastIconClicked && mtime-br->lastClickTime < DBLCLICKTIME) { ++ if (mtime && ++ sel==br->lastIconClicked && mtime-br->lastClickTime < DBLCLICKTIME) { + br->lastIconClicked = -1; /* YES */ + + doubleClick(br, sel); +- return rv; ++ return -1; + } + + else { +@@ -1741,9 +1898,36 @@ + } + } + +- + changedNumLit(br, -1, 0); ++ return 0; ++} ++ + ++/***************************************************************/ ++static int clickIconWin(br, mx, my, mtime, multi) ++ BROWINFO *br; ++ int mx,my,multi; ++ unsigned long mtime; ++{ ++ /* returns '-1' normally, returns an index into bfList[] if the user ++ double-clicks an icon */ ++ ++ int i,j, sel, cpymode, dodel; ++ BROWINFO *destBr; ++ BFIL *bf; ++ char buf[256], *destFolderName; ++ ++ if (!br->bfList || !br->bfLen) return -1; ++ ++ destBr = br; destFolderName = "."; ++ ++ sel = mouseInWhichIcon(br, mx, my); ++ dodel = 0; ++ ++ recIconVisible(br->path, sel); ++ ++ if (updateSel(br, sel, multi, mtime)) ++ return -1; + + + { /* track mouse until button1 is released */ +@@ -2098,7 +2282,7 @@ + } + } /* end of 'tracking' sub-function */ + +- return rv; ++ return -1; + } + + /*******************************************/ +@@ -2164,15 +2348,35 @@ + else sprintf(buf, "%s%s", br->path, br->bfList[sel].name); + #endif + ++#ifdef AUTO_EXPAND ++ if (Chvdir(buf)) { ++#else + if (chdir(buf)) { ++#endif + char str[512]; + sprintf(str,"Unable to cd to '%s'\n", br->bfList[sel].name); + setBrowStr(br, str); + XBell(theDisp, 50); + } + else { ++#ifdef AUTO_EXPAND ++ if (Isvdir(buf)) { ++ BTSetActive(&br->but[BR_DELETE], 0); ++ br->cmdMB.dim[BR_DELETE] = 1; ++ ++ BTSetActive(&br->but[BR_RENAME], 0); ++ br->cmdMB.dim[BR_RENAME] = 1; ++ ++ BTSetActive(&br->but[BR_MKDIR], 0); ++ br->cmdMB.dim[BR_MKDIR] = 1; ++ } else { ++ BTSetActive(&br->but[BR_MKDIR], 1); ++ br->cmdMB.dim[BR_MKDIR] = 0; ++ } ++#endif + scanDir(br); + SCSetVal(&(br->scrl), 0); /* reset to top on a chdir */ ++ restIconVisible(br); + } + } + +@@ -2193,6 +2397,28 @@ + } + else { *event_retP = LOADPIC; SetDirFName(buf); } + ++#ifdef VS_RESCMAP ++ /* Change Colormap for browser */ ++ if (browPerfect && browCmap) ++ { ++ int i; ++ XSetWindowAttributes xswa; ++ if(LocalCmap) ++ { ++ xswa.colormap = LocalCmap; ++ _IfTempOut=2; ++ } ++ else ++ { ++ xswa.colormap = theCmap; ++ _IfTempOut=2; ++ } ++ for(i=0;i<MAXBRWIN;i++) ++ XChangeWindowAttributes(theDisp, binfo[i].win, CWColormap, &xswa); ++ XFlush(theDisp); ++ } ++#endif ++ + *event_doneP = 1; /* make MainLoop load image */ + } + } +@@ -2347,6 +2573,9 @@ + + /* try to open this file */ + sprintf(foo, "%s%s", br->path, br->bfList[i].name); ++#ifdef AUTO_EXPAND ++ Dirtovd(foo); ++#endif + for (j=0; j<numnames && strcmp(namelist[j],foo); j++); + if (j<numnames) { + curname = nList.selected = j; +@@ -2362,6 +2591,9 @@ + else { /* not SPACE, or SPACE and lit=1 and not shift */ + for (i=0; i<br->bfLen && !br->bfList[i].lit; i++); /* find lit one */ + sprintf(fname, "%s%s", br->path, br->bfList[i].name); ++#ifdef AUTO_EXPAND ++ Dirtovd(fname); ++#endif + viewsel = !(strcmp(fname, fullfname)); + + if (viewsel) { +@@ -2553,7 +2785,11 @@ + } + #endif + ++#ifdef AUTO_EXPAND ++ if (Chvdir(tmppath)) { ++#else + if (chdir(tmppath)) { ++#endif + char str[512]; + sprintf(str,"Unable to cd to '%s'\n", tmppath); + MBRedraw(&(br->dirMB)); +@@ -2561,8 +2797,24 @@ + XBell(theDisp, 50); + } + else { ++#ifdef AUTO_EXPAND ++ if (Isvdir(tmppath)) { ++ BTSetActive(&br->but[BR_DELETE], 0); ++ br->cmdMB.dim[BR_DELETE] = 1; ++ ++ BTSetActive(&br->but[BR_RENAME], 0); ++ br->cmdMB.dim[BR_RENAME] = 1; ++ ++ BTSetActive(&br->but[BR_MKDIR], 0); ++ br->cmdMB.dim[BR_MKDIR] = 1; ++ } else { ++ BTSetActive(&br->but[BR_MKDIR], 1); ++ br->cmdMB.dim[BR_MKDIR] = 0; ++ } ++#endif + scanDir(br); + SCSetVal(&br->scrl, 0); /* reset to top of window on a chdir */ ++ restIconVisible(br); + } + } + } +@@ -2581,7 +2833,11 @@ + if ((strlen(br->path) > (size_t) 2) && br->path[strlen(br->path)-1] == '/') + br->path[strlen(br->path)-1] = '\0'; + ++#ifdef AUTO_EXPAND ++ rv = Chvdir(br->path); ++#else + rv = chdir(br->path); ++#endif + if (rv) { + char str[512]; + sprintf(str, "Unable to cd to '%s'\n", br->path); +@@ -2589,6 +2845,23 @@ + XBell(theDisp, 50); + } + ++#ifdef AUTO_EXPAND ++ if (Isvdir(br->path)) { ++ BTSetActive(&br->but[BR_DELETE], 0); ++ br->cmdMB.dim[BR_DELETE] = 1; ++ ++ BTSetActive(&br->but[BR_RENAME], 0); ++ br->cmdMB.dim[BR_RENAME] = 1; ++ ++ BTSetActive(&br->but[BR_MKDIR], 0); ++ br->cmdMB.dim[BR_MKDIR] = 1; ++ } else { ++ BTSetActive(&br->but[BR_MKDIR], 1); ++ br->cmdMB.dim[BR_MKDIR] = 0; ++ } ++#endif ++ ++ restIconVisible(br); + strcat(br->path, "/"); /* put trailing '/' back on */ + return rv; + } +@@ -2615,8 +2888,13 @@ + strcpy(dstbr->mblist[i], srcbr->mblist[i]); + } + +- dstbr->dirMB.list = srcbr->mblist; ++#if 0 ++ dstbr->dirMB.list = srcbr->mblist; /* original bug..? */ + dstbr->dirMB.nlist = srcbr->ndirs; ++#else ++ dstbr->dirMB.list = dstbr->mblist; /* fixed by */ ++ dstbr->dirMB.nlist = dstbr->ndirs; /* jp-extension. */ ++#endif + + XClearArea(theDisp, dstbr->dirMB.win, dstbr->dirMB.x, dstbr->dirMB.y, + dstbr->dirMB.w+3, dstbr->dirMB.h+3, False); +@@ -2974,7 +3252,11 @@ + + + if (stat(bf->name, &st)==0) { ++#ifdef AUTO_EXPAND ++ bf->ftype = stat2bf((u_int) st.st_mode , bf->name); ++#else + bf->ftype = stat2bf((u_int) st.st_mode); ++#endif + if (bf->ftype == BF_FILE && (st.st_mode & 0111)) bf->ftype = BF_EXE; + + switch (bf->ftype) { +@@ -3006,6 +3288,7 @@ + case RFT_XBM: bf->ftype = BF_XBM; break; + case RFT_SUNRAS: bf->ftype = BF_SUNRAS; break; + case RFT_BMP: bf->ftype = BF_BMP; break; ++ case RFT_WBMP: bf->ftype = BF_BMP; break; + case RFT_UTAHRLE: bf->ftype = BF_UTAHRLE; break; + case RFT_IRIS: bf->ftype = BF_IRIS; break; + case RFT_PCX: bf->ftype = BF_PCX; break; +@@ -3013,12 +3296,22 @@ + case RFT_TIFF: bf->ftype = BF_TIFF; break; + case RFT_PDSVICAR: bf->ftype = BF_PDS; break; + case RFT_COMPRESS: bf->ftype = BF_COMPRESS; break; ++ case RFT_BZIP2: bf->ftype = BF_BZIP2; break; + case RFT_PS: bf->ftype = BF_PS; break; + case RFT_IFF: bf->ftype = BF_IFF; break; + case RFT_TARGA: bf->ftype = BF_TARGA; break; + case RFT_XPM: bf->ftype = BF_XPM; break; + case RFT_XWD: bf->ftype = BF_XWD; break; + case RFT_FITS: bf->ftype = BF_FITS; break; ++ case RFT_PNG: bf->ftype = BF_PNG; break; ++ case RFT_ZX: bf->ftype = BF_ZX; break; /* [JCE] */ ++ case RFT_PCD: bf->ftype = BF_PCD; break; ++ case RFT_MAG: bf->ftype = BF_MAG; break; ++ case RFT_MAKI: bf->ftype = BF_MAKI; break; ++ case RFT_PIC: bf->ftype = BF_PIC; break; ++ case RFT_PI: bf->ftype = BF_PI; break; ++ case RFT_PIC2: bf->ftype = BF_PIC2; break; ++ case RFT_MGCSFX: bf->ftype = BF_MGCSFX; break; + } + } + } +@@ -3405,7 +3698,7 @@ + double wexpand,hexpand; + int iwide, ihigh; + byte *icon24, *icon8; +- char str[256], str1[256], *readname, uncompname[128]; ++ char str[256], str1[256], readname[128], uncompname[128]; + char basefname[128], *uncName; + + +@@ -3414,7 +3707,7 @@ + basefname[0] = '\0'; + pinfo.pic = (byte *) NULL; + pinfo.comment = (char *) NULL; +- readname = bf->name; ++ strncpy(readname, bf->name, sizeof(readname) - 1); + + /* free any old info in 'bf' */ + if (bf->imginfo) free (bf->imginfo); +@@ -3431,7 +3724,7 @@ + + filetype = ReadFileType(bf->name); + +- if (filetype == RFT_COMPRESS) { ++ if ((filetype == RFT_COMPRESS) || (filetype == RFT_BZIP2)) { + #if (defined(VMS) && !defined(GUNZIP)) + /* VMS decompress doesn't like the file to have a trailing .Z in fname + however, GUnZip is OK with it, which we are calling UnCompress */ +@@ -3442,9 +3735,9 @@ + uncName = bf->name; + #endif + +- if (UncompressFile(uncName, uncompname)) { ++ if (UncompressFile(uncName, uncompname, filetype)) { + filetype = ReadFileType(uncompname); +- readname = uncompname; ++ strncpy(readname, uncompname, sizeof(readname) - 1); + } + else { + sprintf(str, "Couldn't uncompress file '%s'", bf->name); +@@ -3453,6 +3746,56 @@ + } + } + ++#ifdef MACBINARY ++ if (handlemacb && macb_file == True && bf->ftype != BF_ERROR) { ++ if (RemoveMacbinary(readname, uncompname)) { ++ if (strcmp(readname, bf->name)!=0) unlink(readname); ++ strncpy(readname, uncompname, sizeof(readname) - 1); ++ } ++ else { ++ sprintf(str, "Unable to remove a InfoFile header form '%s'.", bf->name); ++ setBrowStr(br, str); ++ bf->ftype = BF_ERROR; ++ } ++ } ++#endif ++ ++#ifdef HAVE_MGCSFX_AUTO ++ if (bf->ftype != BF_ERROR) { ++ if(filetype == RFT_MGCSFX){ ++ char tmpname[128]; ++ char *icom; ++ ++ if((icom = mgcsfx_auto_input_com(bf->name)) != NULL){ ++ sprintf(tmpname, "%s/xvmsautoXXXXXX", tmpdir); ++#ifdef USE_MKSTEMP ++ close(mkstemp(tmpname)); ++#else ++ mktemp(tmpname); ++#endif ++ SetISTR(ISTR_INFO, "Converting to known format by MgcSfx auto..."); ++ sprintf(str,"%s >%s", icom, tmpname); ++ }else goto ms_auto_no; ++ ++#ifndef VMS ++ if (system(str)) ++#else ++ if (!system(str)) ++#endif ++ { ++ sprintf(str, "Unable to convert '%s' by MgcSfx auto.", bf->name); ++ setBrowStr(br, str); ++ bf->ftype = BF_ERROR; ++ } else { ++ filetype = ReadFileType(tmpname); ++ if (strcmp(readname, bf->name)!=0) unlink(readname); ++ strncpy(readname, tmpname, sizeof(readname) - 1); ++ } ++ } ++ } ++ms_auto_no: ++#endif /* HAVE_MGCSFX_AUTO */ ++ + /* get rid of comments. don't need 'em */ + if (pinfo.comment) free(pinfo.comment); pinfo.comment = (char *) NULL; + +@@ -3470,6 +3813,9 @@ + else { + /* otherwise it's a known filetype... do the *hard* part now... */ + ++#ifdef VS_ADJUST ++ normaspect = defaspect; ++#endif + i = ReadPicFile(readname, filetype, &pinfo, 1); + KillPageFiles(pinfo.pagebname, pinfo.numpages); + +@@ -3489,7 +3835,7 @@ + } + + /* if we made an uncompressed file, we can rm it now */ +- if (readname != bf->name) unlink(readname); ++ if (strcmp(readname, bf->name)!=0) unlink(readname); + + + /* at this point either BF_ERROR, BF_UNKNOWN, BF_EXE or pic */ +@@ -3507,16 +3853,30 @@ + + /* compute size of icon (iwide,ihigh) */ + ++#ifdef VS_ADJUST ++ if (!vsadjust) normaspect = 1; ++ ++ wexpand = (double) (pinfo.w * normaspect) / (double) ISIZE_WIDE; ++#else + wexpand = (double) pinfo.w / (double) ISIZE_WIDE; ++#endif /* VS_ADJUST */ + hexpand = (double) pinfo.h / (double) ISIZE_HIGH; + + if (wexpand >= 1.0 || hexpand >= 1.0) { /* don't expand small icons */ + if (wexpand>hexpand) { ++#ifdef VS_ADJUST ++ iwide = (int) ((pinfo.w * normaspect) / wexpand + 0.5); ++#else + iwide = (int) (pinfo.w / wexpand + 0.5); ++#endif + ihigh = (int) (pinfo.h / wexpand + 0.5); + } + else { ++#ifdef VS_ADJUST ++ iwide = (int) ((pinfo.w * normaspect) / hexpand + 0.5); ++#else + iwide = (int) (pinfo.w / hexpand + 0.5); ++#endif + ihigh = (int) (pinfo.h / hexpand + 0.5); + } + } +@@ -3566,6 +3926,15 @@ + case RFT_XPM: strcat(str,"XPM file"); break; + case RFT_XWD: strcat(str,"XWD file"); break; + case RFT_FITS: strcat(str,"FITS file"); break; ++ case RFT_PNG: strcat(str,"PNG file"); break; ++ case RFT_ZX: strcat(str,"Spectrum SCREEN$"); break; /* [JCE] */ ++ case RFT_PCD: strcat(str,"PhotoCD file"); break; ++ case RFT_MAG: strcat(str,"MAG file"); break; ++ case RFT_MAKI: strcat(str,"MAKI file"); break; ++ case RFT_PIC: strcat(str,"PIC file"); break; ++ case RFT_PI: strcat(str,"PI file"); break; ++ case RFT_PIC2: strcat(str,"PIC2 file"); break; ++ case RFT_MGCSFX: strcat(str,"Magic Suffix file"); break; + default: strcat(str,"file of unknown type"); break; + } + +@@ -3669,6 +4038,10 @@ + + sprintf(thFname, "%s%s/%s", br->path, THUMBDIR, bf->name); + ++#ifdef AUTO_EXPAND ++ Dirtovd(thFname); ++#endif ++ + fp = fopen(thFname, "r"); + if (!fp) return; /* nope, it doesn't have one */ + +@@ -3784,6 +4157,11 @@ + + sprintf(thFname, "%s%s/%s", br->path, THUMBDIR, bf->name); + ++#ifdef AUTO_EXPAND ++ Dirtovd(thFname); ++#endif ++ ++ unlink(thFname); /* just in case there's already an unwritable one */ + fp = fopen(thFname, "w"); + if (!fp) { + sprintf(buf, "Can't create thumbnail file '%s': %s", thFname, +@@ -3848,15 +4226,30 @@ + + sprintf(thFname, "%s%s", br->path, THUMBDIRNAME); + ++#ifdef AUTO_EXPAND ++ Dirtovd(thFname); ++#endif ++ + i = stat(thFname, &st); + if (i) { /* failed, let's create it */ + sprintf(thFname, "%s.", br->path); ++#ifdef AUTO_EXPAND ++ Dirtovd(thFname); ++#endif + i = stat(thFname, &st); /* get permissions of parent dir */ + if (!i) perm = st.st_mode & 07777; + else perm = 0755; + + sprintf(thFname, "%s%s", br->path, THUMBDIRNAME); ++#ifdef AUTO_EXPAND ++ Dirtovd(thFname); ++# ifdef VIRTUAL_TD ++ if (mkdir(thFname, (mode_t) perm) < 0) ++ Mkvdir_force(thFname); ++# else + mkdir(thFname, (mode_t) perm); ++# endif ++#endif + } + } + +@@ -3898,7 +4291,7 @@ + for (i=0, bf=br->bfList; i<br->bfLen; i++, bf++) { + if (bf->ftype <= BF_FILE || bf->ftype >= BF_ERROR || bf->ftype==BF_EXE) { + +- /* ie, not a 'special' file */ ++ /* i.e., not a 'special' file */ + + int s1, s2; + char thfname[256]; +@@ -3912,10 +4305,9 @@ + sprintf(thfname, "%s/%s", THUMBDIR, bf->name); + s2 = stat(thfname, &thumbst); + +- if (s1 || s2 || filest.st_mtime > thumbst.st_mtime || +- filest.st_ctime > thumbst.st_ctime) { ++ if (s1 || s2 || filest.st_mtime > thumbst.st_mtime) { + /* either stat'ing the file or the thumbfile failed, or +- both stat's succeeded and the file has a newer mod or creation ++ both stat's succeeded and the file has a newer mod + time than the thumbnail file */ + + makeIconVisible(br, i); +@@ -3927,8 +4319,12 @@ + iconsBuilt++; + if (DEBUG) + fprintf(stderr,"icon made:fname='%s' thfname='%s' %d,%d,%ld,%ld\n", +- bf->name, thfname, s1,s2,filest.st_mtime,thumbst.st_mtime); ++ bf->name, thfname, s1, s2, ++ (long)filest.st_mtime, (long)thumbst.st_mtime); + } ++ } else if (filest.st_ctime > thumbst.st_ctime) { ++ /* update protections */ ++ chmod(thfname, (mode_t) (filest.st_mode & 07777)); + } + } + statcount++; +@@ -3963,7 +4359,11 @@ + sprintf(thfname, "%s/%s", THUMBDIR, dp->d_name); + if (stat(thfname, &thumbst)==0) { /* success */ + int tmp; ++#ifdef AUTO_EXPAND ++ tmp = stat2bf((u_int) thumbst.st_mode , thfname); ++#else + tmp = stat2bf((u_int) thumbst.st_mode); ++#endif + + if (tmp == BF_FILE) { /* a plain file */ + /* see if this thumbfile has an associated pic file */ +@@ -4042,6 +4442,15 @@ + static char *labels[] = { "\nOk", "\033Cancel" }; + struct stat st; + ++#ifdef AUTO_EXPAND ++ if (Isvdir(br->path)) { ++ sprintf(buf,"Sorry, you can't rename file in the virtual directory, '%s'", ++ br->path); ++ ErrPopUp(buf, "\nBummer!"); ++ return; ++ } ++#endif ++ + if (cdBrow(br)) return; + + /* find the selected file */ +@@ -4129,6 +4538,15 @@ + static char *labels[] = { "\nOk", "\033Cancel" }; + struct stat st; + ++#ifdef AUTO_EXPAND ++ if (Isvdir(br->path)) { ++ sprintf(buf,"Sorry, you can't mkdir in the virtual directory, '%s'", ++ br->path); ++ ErrPopUp(buf, "\nBummer!"); ++ return; ++ } ++#endif ++ + if (cdBrow(br)) return; + + buf[0] = '\0'; +@@ -4197,14 +4615,34 @@ + if (cdBrow(br)) return; /* prints its own error message */ + } + ++#ifdef AUTO_EXPAND ++ if (Chvdir(buf)) { ++#else + if (chdir(buf)) { ++#endif + sprintf(str,"Unable to cd to '%s'\n", buf); + setBrowStr(br, str); + XBell(theDisp, 50); + } + else { ++#ifdef AUTO_EXPAND ++ if (Isvdir(buf)) { ++ BTSetActive(&br->but[BR_DELETE], 0); ++ br->cmdMB.dim[BR_DELETE] = 1; ++ ++ BTSetActive(&br->but[BR_RENAME], 0); ++ br->cmdMB.dim[BR_RENAME] = 1; ++ ++ BTSetActive(&br->but[BR_MKDIR], 0); ++ br->cmdMB.dim[BR_MKDIR] = 1; ++ } else { ++ BTSetActive(&br->but[BR_MKDIR], 1); ++ br->cmdMB.dim[BR_MKDIR] = 0; ++ } ++#endif + scanDir(br); + SCSetVal(&(br->scrl), 0); /* reset to top on a chdir */ ++ restIconVisible(br); + } + } + +@@ -4229,6 +4667,15 @@ + char buf[512]; + static char *yesno[] = { "\004Delete", "\033Cancel" }; + ++#ifdef AUTO_EXPAND ++ if (Isvdir(br->path)) { ++ sprintf(buf,"Sorry, you can't delete file at the virtual directory, '%s'", ++ br->path); ++ ErrPopUp(buf, "\nBummer!"); ++ return; ++ } ++#endif ++ + if (!br->bfLen || !br->bfList || !br->numlit) return; + + if (cdBrow(br)) return; /* can't cd to this directory. screw it! */ +@@ -4251,7 +4698,11 @@ + for (i=0, bf=br->bfList; i<br->bfLen; i++,bf++) { + if (bf->lit) { + if (firstdel == -1) firstdel = i; +- if (bf->ftype == BF_DIR) numdirs++; ++ if (bf->ftype == BF_DIR ++#ifdef AUTO_EXPAND ++ && (!Isarchive(bf->name)) ++#endif ++ ) numdirs++; + else numfiles++; + } + } +@@ -4265,7 +4716,12 @@ + slen = strlen(buf); + + for (i=0, bf=br->bfList; i<br->bfLen; i++,bf++) { ++#ifdef AUTO_EXPAND ++ if (bf->lit && (bf->ftype != BF_DIR || Isarchive(bf->name))) { ++#else + if (bf->lit && bf->ftype != BF_DIR) { ++#endif ++ + if ( (slen + strlen(bf->name) + 1) > 256) { + strcat(buf,"..."); + break; +@@ -4277,7 +4733,7 @@ + } + } + +- i = PopUp(buf, yesno, 2); ++ i = PopUp(buf, yesno, COUNT(yesno)); + if (i) return; /* cancelled */ + } + +@@ -4290,7 +4746,11 @@ + slen = strlen(buf); + + for (i=0, bf=br->bfList; i<br->bfLen; i++,bf++) { ++#ifdef AUTO_EXPAND ++ if (bf->lit && (bf->ftype == BF_DIR || !Isarchive(bf->name))) { ++#else + if (bf->lit && bf->ftype == BF_DIR) { ++#endif + if ( (slen + strlen(bf->name) + 1) > 256) { + strcat(buf,"..."); + break; +@@ -4302,7 +4762,7 @@ + } + } + +- i = PopUp(buf, yesno, 2); ++ i = PopUp(buf, yesno, COUNT(yesno)); + if (i) return; /* cancelled */ + } + +@@ -4311,7 +4771,11 @@ + + for (i=0, bf=br->bfList; i<br->bfLen; i++,bf++) { + if (bf->lit) { +- if (bf->ftype == BF_DIR) rm_dir (br, bf->name); ++ if (bf->ftype == BF_DIR ++#ifdef AUTO_EXPAND ++ && !Isarchive(bf->name) ++#endif ++ ) rm_dir (br, bf->name); + else rm_file(br, bf->name); + } + } +@@ -4440,7 +4904,11 @@ + xv_getwd(orgDir, sizeof(orgDir)); + + sprintf(curDir, "%s%s", br->path, subdir); ++#ifdef AUTO_EXPAND ++ if (Chvdir(curDir)) { ++#else + if (chdir(curDir)) { ++#endif + char str[512]; + sprintf(str, "Unable to cd to '%s'\n", curDir); + setBrowStr(br, str); +@@ -4452,14 +4920,24 @@ + /* have we looped? */ + for (i=0; i<dirStackLen && strcmp(curDir, dirStack[i]); i++); + if (i<dirStackLen) { /* YES */ ++#ifdef AUTO_EXPAND ++ Chvdir(orgDir); ++#else + chdir(orgDir); ++#endif ++ restIconVisible(br); + return; + } + + sp = (char *) malloc((size_t) strlen(curDir) + 1); + if (!sp) { + setBrowStr(br, "malloc() error in recurseUpdate()\n"); ++#ifdef AUTO_EXPAND ++ Chvdir(orgDir); ++#else + chdir(orgDir); ++#endif ++ restIconVisible(br); + return; + } + +@@ -4494,7 +4972,12 @@ + + xv_getwd(curDir, sizeof(curDir)); + if (strcmp(orgDir, curDir)) { /* change back to orgdir */ ++#ifdef AUTO_EXPAND ++ Chvdir(orgDir); ++#else + chdir(orgDir); ++#endif ++ restIconVisible(br); + scanDir(br); + } + } +@@ -4518,6 +5001,13 @@ + setBrowStr(br, buf); + } + ++#ifdef AUTO_EXPAND ++ if (Rmvdir(name)) { ++ sprintf(buf, "fail to remove virturl directory: %s", name); ++ setBrowStr(br, buf); ++ } ++#endif ++ + /* try to delete a thumbnail file, as well. ignore errors */ + strcpy(buf1, name); /* tmp1 = leading path of name */ + tmp = (char *) rindex(buf1, '/'); +@@ -4586,7 +5076,14 @@ + goto done; + } + +- if (stat2bf((u_int) st.st_mode) == BF_DIR) { /* skip, for now */ ++#ifdef AUTO_EXPAND ++ if ((stat2bf((u_int) st.st_mode , rmdirPath) == BF_DIR) ++ && !Isarchive(rmdirPath)) /* skip, for now */ ++#else ++ ++ if (stat2bf((u_int) st.st_mode) == BF_DIR) /* skip, for now */ ++#endif ++ { + rmdirPath[oldpathlen] = '\0'; + continue; /* don't remove from list */ + } +@@ -4639,9 +5136,9 @@ + + static int overwrite; + #define OWRT_ASK 0 +-#define OWRT_NOASK 1 +-#define OWRT_CANCEL 2 +- ++#define OWRT_ALWAYS 1 ++#define OWRT_NEVER 2 ++#define OWRT_CANCEL 3 + + /*******************************************/ + static void dragFiles(srcBr, dstBr, srcpath, dstpath, dstdir, +@@ -4676,11 +5173,26 @@ + } + else if (strcmp(dstdir,".")!=0) sprintf(dstp, "%s%s/", dstpath, dstdir); + ++#ifdef AUTO_EXPAND ++ if (Isvdir(dstp)) { ++ sprintf(buf,"Sorry, you can't %s to the virtual directory, '%s'", ++ cpymode ? "copy" : "move", dstp); ++ ErrPopUp(buf, "\nBummer!"); ++ SetCursors(-1); ++ return; ++ } ++ if (Isvdir(srcpath)) ++ cpymode = 1; ++#endif ++ + + + /* if there is a thumbnail directory in 'srcpath', make one for dstpath */ + sprintf(src,"%s%s", srcpath, THUMBDIR); + dothumbs = 0; ++#ifdef AUTO_EXPAND ++ Dirtovd(src); ++#endif + if (stat(src, &st)==0) { + sprintf(dst,"%s%s", dstp, THUMBDIR); + mkdir(dst, st.st_mode & 07777); +@@ -4711,6 +5223,14 @@ + if (overwrite == OWRT_CANCEL) break; /* abort move */ + if (j==1) fail++; + ++#ifdef AUTO_EXPAND ++ if (!cpymode && j==0) ++ if (Movevdir(src,dst)) { ++ sprintf(buf, "fail to move virturl directory: %s", names[i]); ++ setBrowStr(srcBr, buf); ++ } ++#endif ++ + if (dothumbs && j==0) { + sprintf(src,"%s%s/%s", srcpath, THUMBDIR, names[i]); + sprintf(dst,"%s%s/%s", dstp, THUMBDIR, names[i]); +@@ -4748,6 +5268,15 @@ + } + + ++ if (!cpymode) { ++ /* clear all lit files in the source folder (as they've been moved) ++ note: this won't be the optimal behavior if any files failed to ++ move, but screw it, that's not going to happen too often... */ ++ for (i=0; i<srcBr->bfLen; i++) srcBr->bfList[i].lit = 0; ++ srcBr->numlit = 0; ++ } ++ ++ + /* clear all files in the destination folder */ + for (i=0; i<dstBr->bfLen; i++) { + dstBr->bfList[i].lit = 0; +@@ -4793,7 +5322,51 @@ + SetCursors(-1); + } + ++static int recursive_remove(dir) ++ char *dir; ++{ ++ DIR *dp = NULL; ++ struct dirent *di; ++ char name[MAXPATHLEN+1]; ++ ++ strncpy(name, dir, MAXPATHLEN); ++ name[MAXPATHLEN] = 0; ++ ++ if (name[strlen(name) - 1] == '/') ++ name[strlen(name) - 1] = 0; + ++ if ((dp = opendir(name)) == NULL) ++ goto err; ++ ++ while ((di = readdir(dp)) != NULL) { ++ char buf[MAXPATHLEN+1]; ++ struct stat st; ++ ++ if (!strcmp(di->d_name, ".") || !strcmp(di->d_name, "..")) ++ continue; ++ ++ snprintf(buf, MAXPATHLEN, "%s/%s", name, di->d_name); ++ ++ if (stat(buf, &st) < 0) ++ continue; ++ ++ if (S_ISDIR(st.st_mode)) { ++ if (recursive_remove(buf) < 0) ++ goto err; ++ } else ++ unlink(buf); ++ } ++ ++ if (rmdir(name) < 0) ++ goto err; ++ ++ closedir(dp); ++ return 0; ++ ++err: ++ if (dp) closedir(dp); ++ return -1; ++} + + /*************************************************/ + static int moveFile(src,dst) +@@ -4811,31 +5384,45 @@ + int i, srcdir, dstdir; + struct stat st; + char buf[512]; +- static char *owbuts[4] = { "\nOk", "dDon't ask", "nNo", "\033Cancel" }; ++ static char *owbuts[] = { "\nOk", "aAlways", "nNo", "NNever", "\033Cancel" }; + + if (DEBUG) fprintf(stderr,"moveFile %s %s\n", src, dst); + ++#ifdef AUTO_EXPAND ++ Dirtosubst(src); ++#endif ++ + if (stat(src, &st)) return 0; /* src doesn't exist, it would seem */ ++#ifdef AUTO_EXPAND ++ srcdir = (stat2bf((u_int) st.st_mode , src) == BF_DIR); ++#else + srcdir = (stat2bf((u_int) st.st_mode) == BF_DIR); ++#endif + + /* see if destination exists */ ++ + if (stat(dst, &st)==0) { ++ if (overwrite==OWRT_NEVER) return -1; ++#ifdef AUTO_EXPAND ++ dstdir = (stat2bf((u_int) st.st_mode , dst) == BF_DIR); ++#else + dstdir = (stat2bf((u_int) st.st_mode) == BF_DIR); ++#endif + + if (overwrite==OWRT_ASK) { +- sprintf(buf, "%s '%s' exists.\n\nOverwrite?", ++ snprintf(buf, sizeof(buf), "%s '%s' exists.\n\nOverwrite?", + dstdir ? "Directory" : "File", dst); +- i = PopUp(buf, owbuts, 4); +- +- if (i==1) overwrite = OWRT_NOASK; +- else if (i==2) return -1; +- else if (i==3) { overwrite = OWRT_CANCEL; return 1; } ++ switch (PopUp(buf, owbuts, COUNT(owbuts))) { ++ case 1: overwrite = OWRT_ALWAYS; break; ++ case 2: return -1; ++ case 3: overwrite = OWRT_NEVER; return -1; ++ case 4: overwrite = OWRT_CANCEL; return 1; ++ } + } + + if (dstdir) { + #ifndef VMS /* we don't delete directories in VMS */ +- sprintf(buf, "rm -rf %s", dst); +- if (system(buf)) { /* okay, so it's cheating... */ ++ if (recursive_remove(dst)) { /* okay, so it's cheating... */ + SetISTR(ISTR_WARNING, "Unable to remove directory %s", dst); + return 1; + } +@@ -4858,9 +5445,8 @@ + if (i == 0) { /* copied okay, kill the original */ + if (srcdir) { + #ifndef VMS /* we don't delete directories in VMS */ +- sprintf(buf, "rm -rf %s", src); +- if (system(buf)) { /* okay, so it's cheating... */ +- SetISTR(ISTR_WARNING, "Unable to remove directory %s", dst); ++ if (recursive_remove(src)) { /* okay, so it's cheating... */ ++ SetISTR(ISTR_WARNING, "Unable to remove directory %s", src); + return 1; + } + #endif /* VMS */ +@@ -4906,38 +5492,51 @@ + fall through: if dest doesn't exist, copy the directory, recurs */ + + +- int i, dstExists, srcdir, dstdir; ++ int dstExists, srcdir, dstdir; + struct stat srcSt, dstSt; + char buf[1024]; +- static char *owdiff[3] = { "\nOk", "nNo", "\033Cancel" }; +- static char *owsame[4] = { "\nOk", "dDon't Ask", "nNo", "\033Cancel" }; ++ static char *owdiff[] = { "\nOk", "nNo", "\033Cancel" }; ++ static char *owsame[] = { "\nOk", "aAlways", "nNo", "NNever", "\033Cancel" }; + + if (DEBUG) fprintf(stderr,"copyFile %s %s\n", src, dst); + ++#ifdef AUTO_EXPAND ++ Dirtosubst(src); ++#endif ++ + if (stat(src,&srcSt)) return 0; /* source doesn't exist, it would seem */ + + dstExists = (stat(dst, &dstSt)==0); + + if (dstExists) { /* ask about overwriting... */ +- srcdir = (stat2bf((u_int) srcSt.st_mode) == BF_DIR); +- dstdir = (stat2bf((u_int) dstSt.st_mode) == BF_DIR); ++#ifdef AUTO_EXPAND ++ srcdir = (stat2bf((u_int) srcSt.st_mode , src) == BF_DIR); ++ dstdir = (stat2bf((u_int) dstSt.st_mode , dst) == BF_DIR); ++#else ++ srcdir = (stat2bf((u_int) srcSt.st_mode) == BF_DIR); ++ dstdir = (stat2bf((u_int) dstSt.st_mode) == BF_DIR); ++#endif + + sprintf(buf, "%s '%s' already exists. Replace it with %s '%s'?", + (dstdir) ? "Directory" : "File", dst, + (srcdir) ? "contents of directory" : "file", src); + + if (srcdir == dstdir) { ++ if (overwrite==OWRT_NEVER) return -1; + if (overwrite==OWRT_ASK) { +- i = PopUp(buf, owsame, 4); +- if (i==1) overwrite = OWRT_NOASK; +- if (i==2) return -1; +- else if (i==3) { overwrite = OWRT_CANCEL; return 1; } ++ switch (PopUp(buf, owsame, COUNT(owsame))) { ++ case 1: overwrite = OWRT_ALWAYS; break; ++ case 2: return -1; ++ case 3: overwrite = OWRT_NEVER; return -1; ++ case 4: overwrite = OWRT_CANCEL; return 1; ++ } + } + } + else { /* one's a dir, the other's a file. *ALWAYS* ask! */ +- i = PopUp(buf, owdiff, 3); +- if (i==1) return -1; +- else if (i==2) { overwrite = OWRT_CANCEL; return 1; } ++ switch (PopUp(buf, owdiff, COUNT(owdiff))) { ++ case 1: return -1; ++ case 2: overwrite = OWRT_CANCEL; return 1; ++ } + } + + +@@ -5035,8 +5634,11 @@ + havedst = 1; + } + +- ++#ifdef AUTO_EXPAND ++ switch(stat2bf((u_int) srcSt.st_mode , cpDstPath)) { ++#else + switch(stat2bf((u_int) srcSt.st_mode)) { ++#endif + /* determine how to copy, by filetype */ + + /* NOTE: There is no S_IFLNK case here, since we're using 'stat()' and +@@ -5052,7 +5654,11 @@ + } + } + else { ++#ifdef AUTO_EXPAND ++ if (stat2bf((u_int) dstSt.st_mode , cpDstPath) != BF_DIR) { ++#else + if (stat2bf((u_int) dstSt.st_mode) != BF_DIR) { ++#endif + SetISTR(ISTR_WARNING,"%s: not a directory", cpDstPath); + copyerr++; + return; +@@ -5130,7 +5736,12 @@ + goto done; + } + +- if (stat2bf((u_int) srcSt.st_mode) == BF_DIR) { ++#ifdef AUTO_EXPAND ++ if (stat2bf((u_int) srcSt.st_mode , cpSrcPath) == BF_DIR) ++#else ++ if (stat2bf((u_int) srcSt.st_mode) == BF_DIR) ++#endif ++ { + cpSrcPath[oldsrclen] = '\0'; + continue; /* don't remove from list, just skip */ + } +@@ -5189,9 +5800,9 @@ + int exists; + /*****************************/ + { +- register int srcFd, dstFd, rcount, wcount, i; ++ register int srcFd, dstFd, rcount, wcount; + char buf[8192]; +- static char *owbuts[4] = { "\nOk", "dDon't Ask", "nNo", "\033Cancel" }; ++ static char *owbuts[] = { "\nOk", "aAlways", "nNo", "NNever", "\033Cancel" }; + + if (DEBUG) fprintf(stderr,"cp_file: src='%s', dst='%s'\n", + cpSrcPath, cpDstPath); +@@ -5203,13 +5814,15 @@ + } + + if (exists) { ++ if (overwrite==OWRT_NEVER) return; + if (overwrite==OWRT_ASK) { + sprintf(buf, "File '%s' exists.\n\nOverwrite?", cpDstPath); +- i = PopUp(buf, owbuts, 4); +- +- if (i==1) overwrite = OWRT_NOASK; +- else if (i==2) return; +- else if (i==3) { overwrite = OWRT_CANCEL; return; } ++ switch (PopUp(buf, owbuts, 4)) { ++ case 1: overwrite = OWRT_ALWAYS; break; ++ case 2: return; ++ case 3: overwrite = OWRT_NEVER; return; ++ case 4: overwrite = OWRT_CANCEL; return; ++ } + } + dstFd = open(cpDstPath, O_WRONLY|O_TRUNC, 0); + } +@@ -5303,8 +5916,14 @@ + + + /*********************************/ ++#ifdef AUTO_EXPAND ++static int stat2bf(uistmode, path) ++ u_int uistmode; ++ char *path; ++#else + static int stat2bf(uistmode) + u_int uistmode; ++#endif + { + /* given the 'st.st_mode' field from a successful stat(), returns + BF_FILE, BF_DIR, BF_BLK, BF_CHR, BF_FIFO, or BF_SOCK. Does *NOT* +@@ -5318,6 +5937,9 @@ + else if (S_ISBLK(stmode)) rv = BF_BLK; + else if (S_ISFIFO(stmode)) rv = BF_FIFO; + else if (S_ISSOCK(stmode)) rv = BF_SOCK; ++#ifdef AUTO_EXPAND ++ else if (Isarchive(path)) rv = BF_DIR; ++#endif + else rv = BF_FILE; + + return rv; +@@ -5418,4 +6040,56 @@ + } + + ++static IVIS *icon_vis_list = NULL; ++ ++/***************************************************************/ ++static void recIconVisible(name, icon) ++ char *name; ++ int icon; ++{ ++ IVIS *ptr, *prev = NULL; ++ ++ for (ptr = icon_vis_list; ptr; prev = ptr, ptr = ptr->next) { ++ if (!strcmp(ptr->name, name)) { ++ ptr->icon = icon; ++ return; ++ } ++ } ++ ++ ptr = calloc(sizeof(IVIS), 1); ++ if (!ptr) ++ return; ++ ++ ptr->name = strdup(name); + ++ if (!ptr->name) { ++ free(ptr); ++ return; ++ } ++ ++ if (!prev) { ++ icon_vis_list = ptr; ++ } else { ++ prev->next = ptr; ++ } ++ ++ ptr->next = NULL; ++ ptr->icon = icon; ++} ++ ++/***************************************************************/ ++static void restIconVisible(br) ++ BROWINFO *br; ++{ ++ IVIS *ptr; ++ ++ for (ptr = icon_vis_list; ptr; ptr = ptr->next) { ++ if (!strcmp(ptr->name, br->path)) { ++ if (ptr->icon >= 0) { ++ makeIconVisible(br, ptr->icon); ++ updateSel(br, ptr->icon, 0, 0); ++ } ++ return; ++ } ++ } ++} +diff -ruN xv-3.10a-bugfixes/xvctrl.c xv-3.10a-enhancements/xvctrl.c +--- xv-3.10a-bugfixes/xvctrl.c 2004-05-23 11:56:37.000000000 -0700 ++++ xv-3.10a-enhancements/xvctrl.c 2004-05-23 12:15:18.000000000 -0700 +@@ -104,7 +104,8 @@ + "Root: centered, warp", + "Root: centered, brick", + "Root: symmetrical tiled", +- "Root: symmetrical mirrored" }; ++ "Root: symmetrical mirrored", ++ "Root: upper left corner" }; + + static char *conv24MList[] = { "8-bit mode\t\2448", + "24-bit mode\t\2448", +diff -ruN xv-3.10a-bugfixes/xvdial.c xv-3.10a-enhancements/xvdial.c +--- xv-3.10a-bugfixes/xvdial.c 2004-05-16 18:01:57.000000000 -0700 ++++ xv-3.10a-enhancements/xvdial.c 2004-05-16 18:06:38.000000000 -0700 +@@ -41,20 +41,21 @@ + + + /* local functions */ +-static int whereInDial PARM((DIAL *, int, int)); +-static void drawArrow PARM((DIAL *)); +-static void drawValStr PARM((DIAL *)); +-static void drawButt PARM((DIAL *, int, int)); +-static int computeDialVal PARM((DIAL *, int, int)); +-static void dimDial PARM((DIAL *)); ++static int whereInDial PARM((DIAL *, int, int)); ++static void drawArrow PARM((DIAL *)); ++static void drawValStr PARM((DIAL *)); ++static void drawButt PARM((DIAL *, int, int)); ++static double computeDialVal PARM((DIAL *, int, int)); ++static void dimDial PARM((DIAL *)); + + + /***************************************************/ +-void DCreate(dp, parent, x, y, w, h, minv, maxv, curv, page, ++void DCreate(dp, parent, x, y, w, h, minv, maxv, curv, inc, page, + fg, bg, hi, lo, title, units) + DIAL *dp; + Window parent; +-int x,y,w,h,minv,maxv,curv,page; ++int x,y,w,h; ++double minv,maxv,curv,inc,page; + unsigned long fg,bg,hi,lo; + char *title, *units; + { +@@ -98,18 +99,18 @@ + 1,fg,bg); + if (!dp->win) FatalError("can't create dial window"); + +- DSetRange(dp, minv, maxv, curv, page); ++ DSetRange(dp, minv, maxv, curv, inc, page); + XSelectInput(theDisp, dp->win, ExposureMask | ButtonPressMask); + } + + + /***************************************************/ +-void DSetRange(dp, minv, maxv, curv, page) +-DIAL *dp; +-int minv, maxv, curv, page; ++void DSetRange(dp, minv, maxv, curv, inc, page) ++DIAL *dp; ++double minv, maxv, curv, inc, page; + { + if (maxv<minv) maxv=minv; +- dp->min = minv; dp->max = maxv; dp->page = page; ++ dp->min = minv; dp->max = maxv; dp->inc = inc; dp->page = page; + dp->active = (minv < maxv); + + DSetVal(dp, curv); +@@ -118,8 +119,8 @@ + + /***************************************************/ + void DSetVal(dp, curv) +-DIAL *dp; +-int curv; ++DIAL *dp; ++double curv; + { + RANGE(curv, dp->min, dp->max); /* make sure curv is in-range */ + +@@ -129,7 +130,7 @@ + XSetForeground(theDisp, theGC, dp->bg); + drawArrow(dp); + +- dp->val = curv; ++ dp->val = (double)((int)(curv / dp->inc + (curv > 0 ? 0.5 : -0.5))) * dp->inc; + + /* draw new arrow and string */ + XSetForeground(theDisp, theGC, dp->fg); +@@ -202,7 +203,8 @@ + int mx,my; + { + Window rW,cW; +- int rx,ry, x,y, ipos, pos, lit, i, origval; ++ int rx, ry, x, y, ipos, pos, lit; ++ double origval; + unsigned int mask; + + lit = 0; +@@ -224,9 +226,9 @@ + if (ipos != INDIAL) { + drawButt(dp, ipos, 1); + switch (ipos) { +- case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+1); break; ++ case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+dp->inc); break; + case INCW2: if (dp->val < dp->max) DSetVal(dp, dp->val+dp->page); break; +- case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-1); break; ++ case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->inc); break; + case INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); break; + } + if (dp->drawobj != NULL) (dp->drawobj)(); +@@ -235,8 +237,9 @@ + } + + else { +- i = computeDialVal(dp, mx, my); +- DSetVal(dp, i); ++ double v; ++ v = computeDialVal(dp, mx, my); ++ DSetVal(dp, v); + if (dp->drawobj != NULL) (dp->drawobj)(); + } + +@@ -246,11 +249,11 @@ + if (!(mask & Button1Mask)) break; /* button released */ + + if (ipos == INDIAL) { +- int j; +- i = computeDialVal(dp, x, y); +- j = dp->val; +- DSetVal(dp, i); +- if (j != dp->val) { ++ double v, w; ++ v = computeDialVal(dp, x, y); ++ w = dp->val; ++ DSetVal(dp, v); ++ if (w != dp->val) { + /* track whatever dial controls */ + if (dp->drawobj != NULL) (dp->drawobj)(); + } +@@ -266,11 +269,11 @@ + + if (lit) { + switch (ipos) { +- case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+1); ++ case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+dp->inc); + break; + case INCW2: if (dp->val < dp->max) DSetVal(dp, dp->val+dp->page); + break; +- case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-1); ++ case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->inc); + break; + case INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); + break; +@@ -320,19 +323,20 @@ + static void drawArrow(dp) + DIAL *dp; + { +- int i, rad, cx, cy; ++ int rad, cx, cy; ++ double v; + XPoint arrow[4]; + + rad = dp->rad; cx = dp->cx; cy = dp->cy; + + /* map pos (range minv..maxv) into degrees (range 240..-60) */ +- i = 240 + (-300 * (dp->val - dp->min)) / (dp->max - dp->min); +- arrow[0].x = cx + (int) ((double) rad * .80 * cos(i * DEG2RAD)); +- arrow[0].y = cy - (int) ((double) rad * .80 * sin(i * DEG2RAD)); +- arrow[1].x = cx + (int) ((double) rad * .33 * cos((i+160) * DEG2RAD)); +- arrow[1].y = cy - (int) ((double) rad * .33 * sin((i+160) * DEG2RAD)); +- arrow[2].x = cx + (int) ((double) rad * .33 * cos((i-160) * DEG2RAD)); +- arrow[2].y = cy - (int) ((double) rad * .33 * sin((i-160) * DEG2RAD)); ++ v = 240 + (-300 * (dp->val - dp->min)) / (dp->max - dp->min); ++ arrow[0].x = cx + (int) ((double) rad * .80 * cos(v * DEG2RAD)); ++ arrow[0].y = cy - (int) ((double) rad * .80 * sin(v * DEG2RAD)); ++ arrow[1].x = cx + (int) ((double) rad * .33 * cos((v+160) * DEG2RAD)); ++ arrow[1].y = cy - (int) ((double) rad * .33 * sin((v+160) * DEG2RAD)); ++ arrow[2].x = cx + (int) ((double) rad * .33 * cos((v-160) * DEG2RAD)); ++ arrow[2].y = cy - (int) ((double) rad * .33 * sin((v-160) * DEG2RAD)); + arrow[3].x = arrow[0].x; + arrow[3].y = arrow[0].y; + XDrawLines(theDisp, dp->win, theGC, arrow, 4, CoordModeOrigin); +@@ -343,23 +347,37 @@ + static void drawValStr(dp) + DIAL *dp; + { +- int i, x1, x2; ++ int tot, i, x1, x2; + char foo[60], foo1[60]; + + /* compute longest string necessary so we can right-align this thing */ +- sprintf(foo,"%d",dp->min); x1 = strlen(foo); +- sprintf(foo,"%d",dp->max); x2 = strlen(foo); ++ sprintf(foo,"%d",(int)dp->min); x1 = strlen(foo); ++ sprintf(foo,"%d",(int)dp->max); x2 = strlen(foo); + if (dp->min < 0 && dp->max > 0) x2++; /* put '+' at beginning */ + i = x1; if (x2>x1) i = x2; + if (dp->units) i += strlen(dp->units); + +- if (dp->min < 0 && dp->max > 0) sprintf(foo,"%+d", dp->val); +- else sprintf(foo,"%d", dp->val); ++ sprintf(foo,"%g",dp->inc); /* space for decimal values */ ++ tot = i + strlen(foo) - 1; /* Take away the 0 from the beginning */ ++ ++ if (dp->min < 0.0 && dp->max > 0.0) sprintf(foo,"%+g", dp->val); ++ else sprintf(foo,"%g", dp->val); ++ ++ if (dp->inc < 1.0) ++ { ++ int j; ++ ++ if (dp->val == (double)((int)dp->val)) ++ strcat(foo,"."); ++ ++ for (j = strlen(foo); j < tot; j++) ++ strcat(foo,"0"); ++ } + + if (dp->units) strcat(foo,dp->units); + foo1[0] = '\0'; + if (strlen(foo) < (size_t) i) { +- for (i = i - strlen(foo); i>0; i--) strcat(foo1," "); ++ for (i-=strlen(foo);i>0;i--) strcat(foo1," "); + } + strcat(foo1, foo); + +@@ -411,12 +429,13 @@ + + + /***************************************************/ +-static int computeDialVal(dp, x, y) ++static double computeDialVal(dp, x, y) + DIAL *dp; + int x, y; + { +- int dx, dy, val; +- double angle; ++ int dx, dy; ++ ++ double angle, val; + + /* compute dx, dy (distance from cx, cy). Note: +dy is *up* */ + dx = x - dp->cx; dy = dp->cy - y; +@@ -436,8 +455,10 @@ + if (angle > 270.0) angle -= 360.0; + if (angle < -90.0) angle += 360.0; + +- val = (int) ((dp->max - dp->min) * (240.0 - angle) / 300.0) + dp->min; ++ val = ((dp->max - dp->min) * (240.0 - angle) / 300.0) + dp->min; + ++ /* round value to be an even multiple of dp->inc */ ++ val = (double)((int)(val / dp->inc + 0.5)) * dp->inc; + return val; + } + +diff -ruN xv-3.10a-bugfixes/xvdir.c xv-3.10a-enhancements/xvdir.c +--- xv-3.10a-bugfixes/xvdir.c 2005-03-20 18:38:30.000000000 -0800 ++++ xv-3.10a-enhancements/xvdir.c 2005-04-25 22:24:28.000000000 -0700 +@@ -62,6 +62,9 @@ + #ifdef HAVE_TIFF + "TIFF", + #endif ++#ifdef HAVE_PNG ++ "PNG", ++#endif + "PostScript", + "PBM/PGM/PPM (raw)", + "PBM/PGM/PPM (ascii)", +@@ -73,9 +76,32 @@ + "Targa (24-bit)", + "FITS", + "PM", ++ "Spectrum SCREEN$", /* [JCE] */ ++ "WBMP", ++#ifdef HAVE_MAG ++ "MAG", ++#endif ++#ifdef HAVE_PIC ++ "PIC", ++#endif ++#ifdef HAVE_MAKI ++ "MAKI (640x400 only)", ++#endif ++#ifdef HAVE_PI ++ "PI", ++#endif ++#ifdef HAVE_PIC2 ++ "PIC2", ++#endif ++#ifdef HAVE_MGCSFX ++ "MgcSfx", ++#endif + MBSEP, + "Filename List"}; + ++#ifdef HAVE_PIC2 ++extern int PIC2SaveParams PARM((char *, int)); ++#endif + + static void arrangeButts PARM((int)); + static void RedrawDList PARM((int, SCRL *)); +@@ -570,7 +596,11 @@ + } + #endif + ++#ifdef AUTO_EXPAND ++ if (Chvdir(tmppath)) { ++#else + if (chdir(tmppath)) { ++#endif + char str[512]; + sprintf(str,"Unable to cd to '%s'\n", tmppath); + *trunc_point = '/'; /* restore the path */ +@@ -635,7 +665,11 @@ + xv_getwd(path, sizeof(path)); + #endif + ++#ifdef AUTO_EXPAND ++ if (Chvdir(path)) { ++#else + if (chdir(path)) { ++#endif + ErrPopUp("Current load/save directory seems to have gone away!", + "\nYikes!"); + #ifdef apollo +@@ -643,7 +677,11 @@ + #else + strcpy(path,"/"); + #endif ++#ifdef AUTO_EXPAND ++ Chvdir(path); ++#else + chdir(path); ++#endif + } + + changedDir = strcmp(path, oldpath); +@@ -748,6 +786,9 @@ + else if (S_ISFIFO(ftype)) fnames[i][0] = C_FIFO; + else if (S_ISSOCK(ftype)) fnames[i][0] = C_SOCK; + else if (fnames[i][0] == C_REG && (mode&0111)) fnames[i][0] = C_EXE; ++#ifdef AUTO_EXPAND ++ else if (Isarchive(fnames[i]+1)) fnames[i][0] = C_DIR; ++#endif + } + else { + /* fprintf(stderr,"problems 'stat-ing' files\n");*/ +@@ -847,7 +888,7 @@ + scrollToFileName(); + } + +- else if (c=='\010' || c=='\177') { /* BS or DEL */ ++ else if (c=='\010') { /* BS */ + if (curPos==0) return(-1); /* at beginning of str */ + xvbcopy(&filename[curPos], &filename[curPos-1], (size_t) (len-curPos+1)); + curPos--; +@@ -872,7 +913,7 @@ + curPos = len; + } + +- else if (c=='\004') { /* ^D: delete character at curPos */ ++ else if (c=='\004' || c=='\177') { /* ^D or DEL: delete character at curPos */ + if (curPos==len) return(-1); + xvbcopy(&filename[curPos+1], &filename[curPos], (size_t) (len-curPos)); + } +@@ -1055,6 +1096,25 @@ + + fullname = GetDirFullName(); + ++#ifdef AUTO_EXPAND ++ { ++ char path[MAXPATHLEN]; ++ ++ GetDirPath(path); ++ Mkvdir(path); ++ if ((i = Isvdir(fullname)) & 01) { ++ char buf[128]; ++ sprintf(buf, ++ "Sorry, you can't save file in the virtual directory, '%s'", ++ path); ++ ErrPopUp(buf, "\nBummer!"); ++ return -1; ++ } ++ if (i & 06) ++ Rmvdir(fullname); ++ } ++#endif ++ + fmt = MBWhich(&fmtMB); + col = MBWhich(&colMB); + +@@ -1116,7 +1176,34 @@ + } + #endif + ++#ifdef HAVE_PNG ++ else if (fmt == F_PNG) { /* PNG */ ++ PNGSaveParams(fullname, col); ++ PNGDialog(1); /* open PNG Dialog box */ ++ dbut[S_BOK].lit = 0; BTRedraw(&dbut[S_BOK]); ++ return 0; /* always 'succeeds' */ ++ } ++#endif ++ ++#ifdef HAVE_PIC2 ++ else if (fmt == F_PIC2) { /* PIC2 */ ++ if (PIC2SaveParams(fullname, col) < 0) ++ return 0; ++ PIC2Dialog(1); /* open PIC2 Dialog box */ ++ dbut[S_BOK].lit = 0; BTRedraw(&dbut[S_BOK]); ++ return 0; /* always 'succeeds' */ ++ } ++#endif /* HAVE_PIC2 */ + ++#ifdef HAVE_MGCSFX ++ else if (fmt == F_MGCSFX) { /* MGCSFX */ ++ if (MGCSFXSaveParams(fullname, col) < 0) ++ return 0; ++ MGCSFXDialog(1); /* open MGCSFX Dialog box */ ++ dbut[S_BOK].lit = 0; BTRedraw(&dbut[S_BOK]); ++ return 0; /* always 'succeeds' */ ++ } ++#endif /* HAVE_MGCSFX */ + + + WaitCursor(); +@@ -1164,6 +1251,10 @@ + rv = WriteBMP (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); + break; + ++ case F_WBMP: ++ rv = WriteWBMP (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); ++ break; ++ + case F_IRIS: + rv = WriteIRIS (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); + break; +@@ -1181,6 +1272,35 @@ + rv = WriteFITS (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, + picComments); + break; ++ ++ case F_ZX: /* [JCE] Spectrum SCREEN$ */ ++ rv = WriteZX (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, ++ picComments); ++ break; ++#ifdef HAVE_MAG ++ case F_MAG: ++ rv = WriteMAG (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, ++ picComments); ++ break; ++#endif /* HAVE_MAG */ ++#ifdef HAVE_PIC ++ case F_PIC: ++ rv = WritePIC (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, ++ picComments); ++ break; ++#endif /* HAVE_PIC */ ++#ifdef HAVE_MAKI ++ case F_MAKI: ++ rv = WriteMAKI (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); ++ break; ++#endif /* HAVE_MAKI */ ++ ++#ifdef HAVE_PI ++ case F_PI: ++ rv = WritePi (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, ++ picComments); ++ break; ++#endif /* HAVE_PI */ + } + + +@@ -1310,7 +1430,8 @@ + + else if (group == F_FORMAT) { + MBSelect(&fmtMB, bnum); +- if (MBWhich(&fmtMB) == F_XBM) { /* turn off all but B/W */ ++ if (MBWhich(&fmtMB) == F_XBM || ++ MBWhich(&fmtMB) == F_WBMP) { /* turn off all but B/W */ + colMB.dim[F_FULLCOLOR] = 1; + colMB.dim[F_GREYSCALE] = 1; + colMB.dim[F_BWDITHER] = 0; +@@ -1389,14 +1510,29 @@ + (strcmp(lowsuf,"eps" )==0) || + (strcmp(lowsuf,"rgb" )==0) || + (strcmp(lowsuf,"tga" )==0) || +- (strcmp(lowsuf,"xpm" )==0) || + (strcmp(lowsuf,"fits")==0) || + (strcmp(lowsuf,"fts" )==0) || ++#ifdef HAVE_JPEG + (strcmp(lowsuf,"jpg" )==0) || + (strcmp(lowsuf,"jpeg")==0) || + (strcmp(lowsuf,"jfif")==0) || ++#endif ++#ifdef HAVE_TIFF + (strcmp(lowsuf,"tif" )==0) || +- (strcmp(lowsuf,"tiff")==0)) { ++ (strcmp(lowsuf,"tiff")==0) || ++#endif ++#ifdef HAVE_PNG ++ (strcmp(lowsuf,"png" )==0) || ++#endif ++ (strcmp(lowsuf,"wbmp")==0) || ++ (strcmp(lowsuf,"xpm" )==0) || ++ (strcmp(lowsuf,"tiff")==0) || ++ (strcmp(lowsuf,"mag" )==0) || ++ (strcmp(lowsuf,"pic" )==0) || ++ (strcmp(lowsuf,"mki" )==0) || ++ (strcmp(lowsuf,"pi" )==0) || ++ (strcmp(lowsuf,"p2" )==0) || ++ (strcmp(lowsuf,"pcd" )==0)) { + + /* found one. set lowsuf = to the new suffix, and tack on to filename */ + +@@ -1419,6 +1555,7 @@ + case F_XBM: strcpy(lowsuf,"xbm"); break; + case F_SUNRAS: strcpy(lowsuf,"ras"); break; + case F_BMP: strcpy(lowsuf,"bmp"); break; ++ case F_WBMP: strcpy(lowsuf,"wbmp"); break; + case F_PS: strcpy(lowsuf,"ps"); break; + case F_IRIS: strcpy(lowsuf,"rgb"); break; + case F_TARGA: strcpy(lowsuf,"tga"); break; +@@ -1432,8 +1569,33 @@ + #ifdef HAVE_TIFF + case F_TIFF: strcpy(lowsuf,"tif"); break; + #endif ++ ++#ifdef HAVE_PNG ++ case F_PNG: strcpy(lowsuf,"png"); break; ++#endif ++ ++#ifdef HAVE_MAG ++ case F_MAG: strcpy(lowsuf,"mag"); break; ++#endif ++ ++#ifdef HAVE_PIC ++ case F_PIC: strcpy(lowsuf,"pic"); break; ++#endif ++ ++#ifdef HAVE_MAKI ++ case F_MAKI: strcpy(lowsuf,"mki"); break; ++#endif ++ ++#ifdef HAVE_PI ++ case F_PI: strcpy(lowsuf,"pi"); break; ++#endif ++ ++#ifdef HAVE_PIC2 ++ case F_PIC2: strcpy(lowsuf,"p2"); break; ++#endif + } + ++ + if (allcaps) { /* upper-caseify lowsuf */ + for (sp=lowsuf; *sp; sp++) + *sp = (islower(*sp)) ? toupper(*sp) : *sp; +@@ -1499,6 +1661,11 @@ + } + #endif + ++#ifdef AUTO_EXPAND ++ Mkvdir(newpath); ++ Dirtovd(newpath); ++#endif ++ + if (stat(newpath, &st)==0) { + int isdir; + +@@ -1596,7 +1763,11 @@ + dopipe = 0; + + /* make sure we're in the correct directory */ ++#ifdef AUTO_EXPAND ++ if (strlen(path)) Chvdir(path); ++#else + if (strlen(path)) chdir(path); ++#endif + + if (ISPIPE(filename[0])) { /* do piping */ + /* make up some bogus temp file to put this in */ +@@ -2002,7 +2173,7 @@ + if (stat(namelist[curname], &origStat)==0) { + haveStat = 1; + if (DEBUG) fprintf(stderr," origStat.size=%ld, origStat.mtime=%ld\n", +- origStat.st_size, origStat.st_mtime); ++ (long)origStat.st_size, (long)origStat.st_mtime); + } + } + } +@@ -2027,7 +2198,7 @@ + + if (stat(namelist[curname], &st)==0) { + if (DEBUG) fprintf(stderr," st.size=%ld, st.mtime=%ld\n", +- st.st_size, st.st_mtime); ++ (long)st.st_size, (long)st.st_mtime); + + if ((st.st_size == origStat.st_size) && + (st.st_mtime == origStat.st_mtime)) return 0; /* no change */ +@@ -2080,3 +2251,164 @@ + } + + ++#ifdef HAVE_PIC2 ++/**** Stuff for PIC2Dialog box ****/ ++FILE *pic2_OpenOutFile(filename, append) ++char *filename; ++int *append; ++{ ++ /* opens file for output. does various error handling bits. Returns ++ an open file pointer if success, NULL if failure */ ++ ++ FILE *fp = NULL; ++ struct stat st; ++ ++ if (!filename || filename[0] == '\0') ++ return (NULL); ++ strcpy(outFName, filename); ++ dopipe = 0; ++ ++ /* make sure we're in the correct directory */ ++#ifdef AUTO_EXPAND ++ if (strlen(path)) Chvdir(path); ++#else ++ if (strlen(path)) chdir(path); ++#endif ++ ++ if (ISPIPE(filename[0])) { /* do piping */ ++ /* make up some bogus temp file to put this in */ ++#ifndef VMS ++ sprintf(outFName, "%s/xvXXXXXX", tmpdir); ++#else ++ strcpy(outFName, "[]xvXXXXXX.lis"); ++#endif ++#ifdef USE_MKSTEMP ++ fp = fdopen(mkstemp(outFName), "w"); ++#else ++ mktemp(outFName); ++#endif ++ dopipe = 1; ++ } ++ ++ ++ /* see if file exists (i.e., we're overwriting) */ ++ *append = 0; ++#ifdef USE_MKSTEMP ++ if (!dopipe) ++#endif ++ if (stat(outFName, &st)==0) { /* stat succeeded, file must exist */ ++ if (ReadFileType(outFName) != RFT_PIC2) { ++ static char *foo[] = { "\nOk", "\033Cancel" }; ++ char str[512]; ++ ++ sprintf(str,"Overwrite existing file '%s'?", outFName); ++ if (PopUp(str, foo, 2)) ++ return (NULL); ++ } else { ++ static char *foo[] = { "\nOk", "\033Cancel" }; ++ char str[512]; ++ ++ sprintf(str,"Append to existing file '%s'?", outFName); ++ if (PopUp(str, foo, 2)) { ++ sprintf(str,"Overwrite existing file '%s'?", outFName); ++ if (PopUp(str, foo, 2)) ++ return (NULL); ++ } else ++ *append = 1; ++ } ++ } ++ ++ /* Open file */ ++#ifdef USE_MKSTEMP ++ if (!dopipe) ++#endif ++ fp = *append ? fopen(outFName, "r+") : fopen(outFName, "w"); ++ if (!fp) { ++ char str[512]; ++ sprintf(str,"Can't write file '%s'\n\n %s.",outFName, ERRSTR(errno)); ++ ErrPopUp(str, "\nBummer"); ++ return (NULL); ++ } ++ ++ return (fp); ++} ++ ++ ++/***************************************/ ++void pic2_KillNullFile(fp) ++FILE *fp; ++{ ++ fseek(fp, (size_t) 0, SEEK_END); ++ if (ftell(fp) > 0) { ++ fclose(fp); ++ return; ++ } else { ++ fclose(fp); ++ unlink(outFName); ++ return; ++ } ++} ++#endif /* HAVE_PIC2 */ ++ ++ ++#ifdef HAVE_MGCSFX ++/**** Stuff for MGCSFX Dialog box ****/ ++/***************************************/ ++int OpenOutFileDesc(filename) ++ char *filename; ++{ ++ /* opens file for output. does various error handling bits. Returns ++ an open file pointer if success, NULL if failure */ ++ ++ int fd; ++ struct stat st; ++ ++ if (!filename || filename[0] == '\0') return -1; ++ strcpy(outFName, filename); ++ dopipe = 0; ++ ++ /* make sure we're in the correct directory */ ++#ifdef AUTO_EXPAND ++ if (strlen(path)) Chvdir(path); ++#else ++ if (strlen(path)) chdir(path); ++#endif ++ ++ if (ISPIPE(filename[0])) { /* do piping */ ++ /* make up some bogus temp file to put this in */ ++#ifndef VMS ++ sprintf(outFName, "%s/xvXXXXXX", tmpdir); ++#else ++ strcpy(outFName, "[]xvXXXXXX.lis"); ++#endif ++#ifdef USE_MKSTEMP ++ close(mkstemp(outFName)); ++#else ++ mktemp(outFName); ++#endif ++ dopipe = 1; ++ } ++ ++ ++ /* if didn't just create it, see if file exists (i.e., we're overwriting) */ ++ if (!dopipe && stat(outFName, &st)==0) { /* stat succeeded, file exists */ ++ static char *foo[] = { "\nOk", "\033Cancel" }; ++ char str[512]; ++ ++ sprintf(str,"Overwrite existing file '%s'?", outFName); ++ if (PopUp(str, foo, 2)) return -1; ++ } ++ ++ ++ /* Open file */ ++ fd = open(outFName, O_WRONLY | O_CREAT | O_TRUNC, (0644)); ++ if (fd < 0) { ++ char str[512]; ++ sprintf(str,"Can't write file '%s'\n\n %s.", outFName, ERRSTR(errno)); ++ ErrPopUp(str, "\nBummer"); ++ return -1; ++ } ++ ++ return fd; ++} ++#endif /* HAVE_MGCSFX */ +diff -ruN xv-3.10a-bugfixes/xvevent.c xv-3.10a-enhancements/xvevent.c +--- xv-3.10a-bugfixes/xvevent.c 2004-05-16 18:02:03.000000000 -0700 ++++ xv-3.10a-enhancements/xvevent.c 2005-05-01 09:33:38.000000000 -0700 +@@ -64,6 +64,8 @@ + + static void annotatePic PARM((void)); + ++static int debkludge_offx; ++static int debkludge_offy; + + /****************/ + int EventLoop() +@@ -71,13 +73,25 @@ + { + XEvent event; + int retval,done,waiting; +- time_t orgtime, curtime; ++#ifdef USE_TICKS ++ clock_t waitsec_ticks=0L, orgtime_ticks=0L, curtime_ticks; ++ clock_t elapsed_ticks=0L, remaining_interval; ++#else ++ time_t orgtime=0L, curtime; ++#endif + + + #ifndef NOSIGNAL + signal(SIGQUIT, onInterrupt); + #endif + ++ if (startGrab == 1) { ++ startGrab = 2; ++ FakeButtonPress(&but[BGRAB]); ++ FakeKeyPress(ctrlW, XK_Return); ++ return(1); ++ } ++ + /* note: there's no special event handling if we're using the root window. + if we're using the root window, we will recieve NO events for mainW */ + +@@ -100,18 +114,24 @@ + + while (!done) { + +- if (waitsec > -1 && canstartwait && !waiting && XPending(theDisp)==0) { ++ if (waitsec >= 0.0 && canstartwait && !waiting && XPending(theDisp)==0) { + /* we wanna wait, we can wait, we haven't started waiting yet, and + all pending events (ie, drawing the image the first time) + have been dealt with: START WAITING */ +- time((time_t *) &orgtime); ++#ifdef USE_TICKS ++ waitsec_ticks = (clock_t)(waitsec * CLK_TCK); ++ orgtime_ticks = times(NULL); /* unclear if NULL valid, but OK on Linux */ ++#else ++ orgtime = time(NULL); ++#endif + waiting = 1; + } + + + /* if there's an XEvent pending *or* we're not doing anything + in real-time (polling, flashing the selection, etc.) get next event */ +- if ((waitsec==-1 && !polling && !HaveSelection()) || XPending(theDisp)>0) { ++ if ((waitsec<0.0 && !polling && !HaveSelection()) || XPending(theDisp)>0) ++ { + XNextEvent(theDisp, &event); + retval = HandleEvent(&event,&done); + } +@@ -121,7 +141,7 @@ + DrawSelection(0); + DrawSelection(1); + XFlush(theDisp); +- Timer(200); ++ Timer(200); /* milliseconds */ + } + + if (polling) { +@@ -129,13 +149,32 @@ + else if (!XPending(theDisp)) sleep(1); + } + +- if (waitsec>-1 && waiting) { +- time((time_t *) &curtime); +- if (curtime - orgtime < waitsec) sleep(1); +- else { +- if (waitloop) return NEXTLOOP; +- else return NEXTQUIT; +- } ++ if (waitsec>=0.0 && waiting) { ++#ifdef USE_TICKS ++ curtime_ticks = times(NULL); /* value in ticks */ ++ if (curtime_ticks < orgtime_ticks) { ++ /* clock ticks rolled over: need to correct for that (i.e., ++ * curtime_ticks is presumably quite small, while orgtime_ticks ++ * should be close to LONG_MAX, so do math accordingly--any way ++ * to check whether clock_t is *not* a signed long?) */ ++ elapsed_ticks = curtime_ticks + (LONG_MAX - orgtime_ticks); ++ } else ++ elapsed_ticks = curtime_ticks - orgtime_ticks; ++ remaining_interval = waitsec_ticks - elapsed_ticks; ++ if (remaining_interval >= (clock_t)(1 * CLK_TCK)) ++ sleep(1); ++ else { ++ /* less than one second remaining: do delay in msec, then return */ ++ Timer((remaining_interval * 1000L) / CLK_TCK); /* can't overflow */ ++ return waitloop? NEXTLOOP : NEXTQUIT; ++ } ++#else ++ curtime = time(NULL); /* value in seconds */ ++ if (curtime - orgtime < (time_t)waitsec) ++ sleep(1); ++ else ++ return waitloop? NEXTLOOP : NEXTQUIT; ++#endif + } + } + } /* while (!done) */ +@@ -154,7 +193,24 @@ + int *donep; + { + static int wasInfoUp=0, wasCtrlUp=0, wasDirUp=0, wasGamUp=0, wasPsUp=0; +- static int wasJpegUp=0, wasTiffUp=0; ++#ifdef HAVE_JPEG ++ static int wasJpegUp=0; ++#endif ++#ifdef HAVE_TIFF ++ static int wasTiffUp=0; ++#endif ++#ifdef HAVE_PNG ++ static int wasPngUp=0; ++#endif ++#ifdef HAVE_PCD ++ static int wasPcdUp=0; ++#endif ++#ifdef HAVE_PIC2 ++ static int wasPic2Up=0; ++#endif ++#ifdef HAVE_MGCSFX ++ static int wasMgcSfxUp=0; ++#endif + + static int mainWKludge=0; /* force first mainW expose after a mainW config + to redraw all of mainW */ +@@ -233,6 +289,28 @@ + if (TIFFCheckEvent(event)) break; /* event has been processed */ + #endif + ++#ifdef HAVE_PNG ++ if (PNGCheckEvent (event)) break; /* event has been processed */ ++#endif ++ ++ if (PCDCheckEvent(event)) break; /* event has been processed */ ++ ++#ifdef HAVE_PIC2 ++ if (PIC2CheckEvent(event)) break; /* event has been processed */ ++#endif ++ ++#ifdef HAVE_PCD ++ if (PCDCheckEvent (event)) break; /* event has been processed */ ++#endif ++ ++#ifdef HAVE_MGCSFX ++ if (MGCSFXCheckEvent(event)) break; /* event has been processed */ ++#endif ++ ++#ifdef TV_MULTILINGUAL ++ if (CharsetCheckEvent(event)) break; /* event has been processed */ ++#endif ++ + if (GamCheckEvent (event)) break; /* event has been processed */ + if (BrowseCheckEvent (event, &retval, &done)) break; /* event eaten */ + if (TextCheckEvent (event, &retval, &done)) break; /* event eaten */ +@@ -344,6 +422,9 @@ + + if (BrowseDelWin(client_event->window)) break; + if (TextDelWin(client_event->window)) break; ++#ifdef TV_MULTILINGUAL ++ if (CharsetDelWin(client_event->window)) break; ++#endif + + if (client_event->window == infoW) InfoBox(0); + else if (client_event->window == gamW) GamBox(0); +@@ -359,6 +440,24 @@ + else if (client_event->window == tiffW) TIFFDialog(0); + #endif + ++#ifdef HAVE_PNG ++ else if (client_event->window == pngW) PNGDialog(0); ++#endif ++ ++ else if (client_event->window == pcdW) PCDDialog(0); ++ ++#ifdef HAVE_PIC2 ++ else if (client_event->window == pic2W) PIC2Dialog(0); ++#endif ++ ++#ifdef HAVE_PCD ++ else if (client_event->window == pcdW) PCDDialog(0); ++#endif ++ ++#ifdef HAVE_MGCSFX ++ else if (client_event->window == mgcsfxW) MGCSFXDialog(0); ++#endif ++ + else if (client_event->window == mainW) Quit(0); + } + } +@@ -534,10 +633,21 @@ + #ifdef HAVE_JPEG + if (wasJpegUp) { JPEGDialog(wasJpegUp); wasJpegUp=0; } + #endif +- + #ifdef HAVE_TIFF + if (wasTiffUp) { TIFFDialog(wasTiffUp); wasTiffUp=0; } + #endif ++#ifdef HAVE_PNG ++ if (wasPngUp) { PNGDialog(wasJpegUp); wasPngUp=0; } ++#endif ++#ifdef HAVE_PCD ++ if (wasPcdUp) { PCDDialog(wasPcdUp); wasPcdUp=0; } ++#endif ++#ifdef HAVE_PIC2 ++ if (wasPic2Up) { PIC2Dialog(wasPic2Up); wasPic2Up=0; } ++#endif ++#ifdef HAVE_MGCSFX ++ if (wasMgcSfxUp) { MGCSFXDialog(wasMgcSfxUp); wasMgcSfxUp=0; } ++#endif + } + } + } +@@ -572,10 +682,21 @@ + #ifdef HAVE_JPEG + if (jpegUp) { wasJpegUp = jpegUp; JPEGDialog(0); } + #endif +- + #ifdef HAVE_TIFF + if (tiffUp) { wasTiffUp = tiffUp; TIFFDialog(0); } + #endif ++#ifdef HAVE_PNG ++ if (pngUp) { wasPngUp = pngUp; PNGDialog(0); } ++#endif ++#ifdef HAVE_PCD ++ if (pcdUp) { wasPcdUp = pcdUp; PCDDialog(0); } ++#endif ++#ifdef HAVE_PIC2 ++ if (pic2Up) { wasPic2Up = pic2Up; PIC2Dialog(0); } ++#endif ++#ifdef HAVE_MGCSFX ++ if (mgcsfxUp) { wasMgcSfxUp = mgcsfxUp; MGCSFXDialog(0); } ++#endif + } + } + } +@@ -641,6 +762,30 @@ + p_offy = xwa.y; + } + ++ /* Gather info to keep right border inside */ ++ { ++ Window current; ++ Window root_r; ++ Window parent_r; ++ Window *children_r; ++ int nchildren_r; ++ XWindowAttributes xwa; ++ ++ parent_r=mainW; ++ current=mainW; ++ do { ++ current=parent_r; ++ XQueryTree(theDisp, current, &root_r, &parent_r, ++ &children_r, &nchildren_r); ++ if (children_r!=NULL) { ++ XFree(children_r); ++ } ++ } while(parent_r!=root_r); ++ XGetWindowAttributes(theDisp, current, &xwa); ++ debkludge_offx=eWIDE-xwa.width+p_offx; ++ debkludge_offy=eHIGH-xwa.height+p_offy; ++ } ++ + + /* move window around a bit... */ + { +@@ -997,7 +1142,8 @@ + + int i; + char txt[512], str[PRINTCMDLEN + 10]; +- static char *labels[] = { " Color", " Grayscale", " B/W", "\033Cancel" }; ++ static char *labels[] = { "\03Color", "\07Grayscale", " B/W", "\033Cancel" }; ++ /* ^B ("\02") already used for moving cursor back */ + + strcpy(txt, "Print: Enter a command that will read a PostScript file "); + strcat(txt, "from stdin and print it to the desired printer.\n\n"); +@@ -1147,6 +1293,26 @@ + if (TIFFCheckEvent(event)) break; + #endif + ++#ifdef HAVE_PNG ++ if (PNGCheckEvent (event)) break; ++#endif ++ ++#ifdef HAVE_PCD ++ if (PCDCheckEvent (event)) break; /* event has been processed */ ++#endif ++ ++#ifdef HAVE_PIC2 ++ if (PIC2CheckEvent(event)) break; ++#endif ++ ++#ifdef HAVE_MGCSFX ++ if (MGCSFXCheckEvent(event)) break; ++#endif ++ ++#ifdef TV_MULTILINGUAL ++ if (CharsetCheckEvent(event)) break; ++#endif ++ + if (GamCheckEvent (event)) break; + if (BrowseCheckEvent (event, &retval, &done)) break; + if (TextCheckEvent (event, &retval, &done)) break; +@@ -1276,6 +1442,48 @@ + else if (shift) BlurPaint(); + break; + ++ case Button4: /* note min vs. max, + vs. - */ ++ if (win == ctrlW || win == nList.win || win == nList.scrl.win) { ++ SCRL *sp=&nList.scrl; ++ int halfpage=sp->page/2; ++ ++ if (sp->val > sp->min+halfpage) ++ SCSetVal(sp,sp->val-halfpage); ++ else ++ SCSetVal(sp,sp->min); ++ } ++ else if (win == dirW || win == dList.win || win == dList.scrl.win) { ++ SCRL *sp=&dList.scrl; ++ int halfpage=sp->page/2; ++ ++ if (sp->val > sp->min+halfpage) ++ SCSetVal(sp,sp->val-halfpage); ++ else ++ SCSetVal(sp,sp->min); ++ } ++ break; ++ ++ case Button5: /* note max vs. min, - vs. + */ ++ if (win == ctrlW || win == nList.win || win == nList.scrl.win) { ++ SCRL *sp=&nList.scrl; ++ int halfpage=sp->page/2; ++ ++ if (sp->val < sp->max-halfpage) ++ SCSetVal(sp,sp->val+halfpage); ++ else ++ SCSetVal(sp,sp->max); ++ } ++ else if (win == dirW || win == dList.win || win == dList.scrl.win) { ++ SCRL *sp=&dList.scrl; ++ int halfpage=sp->page/2; ++ ++ if (sp->val < sp->max-halfpage) ++ SCSetVal(sp,sp->val+halfpage); ++ else ++ SCSetVal(sp,sp->max); ++ } ++ break; ++ + default: break; + } + } +@@ -1364,16 +1572,35 @@ + if (TIFFCheckEvent(event)) break; + #endif + ++#ifdef HAVE_PNG ++ if (PNGCheckEvent (event)) break; ++#endif ++ ++ if (PCDCheckEvent (event)) break; ++ ++#ifdef HAVE_PIC2 ++ if (PIC2CheckEvent(event)) break; ++#endif ++ ++#ifdef HAVE_PCD ++ if (PCDCheckEvent (event)) break; ++#endif ++ ++#ifdef HAVE_MGCSFX ++ if (MGCSFXCheckEvent(event)) break; ++#endif ++ + if (GamCheckEvent (event)) break; + if (BrowseCheckEvent (event, &retval, &done)) break; + if (TextCheckEvent (event, &retval, &done)) break; + + +- /* check for pageup/pagedown, 'p' in main window +- (you can use shift-up or shift-down if no crop rectangle drawn) +- (for viewing multipage docs) */ ++ /* Support for multi-image files ("multipage docs"). Check for PgUp/PgDn ++ or 'p' in any window but control or directory; PgUp/PgDn are already ++ used to page through the file list in those windows. If no cropping ++ rectangle is active, shift-Up and shift-Down also work. */ + +- if (key_event->window == mainW) { ++ if (key_event->window != ctrlW && key_event->window != dirW) { + dealt = 1; + + ck = CursorKey(ks, shift, 0); +@@ -1578,13 +1805,13 @@ + } + break; + +- case '\010': +- case '\177': FakeButtonPress(&but[BPREV]); break; ++ case '\010': FakeButtonPress(&but[BPREV]); break; + + + case '\014': FakeButtonPress(&but[BLOAD]); break; /* ^L */ + case '\023': FakeButtonPress(&but[BSAVE]); break; /* ^S */ + case '\020': FakeButtonPress(&but[BPRINT]); break; /* ^P */ ++ case '\177': + case '\004': FakeButtonPress(&but[BDELETE]); break; /* ^D */ + + /* BCOPY, BCUT, BPASTE, BCLEAR handled in 'meta' case */ +@@ -2025,6 +2252,16 @@ + if (xwa->width < dispWIDE && xwc.x < p_offx) xwc.x = p_offx; + if (xwa->height < dispHIGH && xwc.y < p_offy) xwc.y = p_offy; + ++ /* Try to keep bottom right decorations inside */ ++ if (xwc.x+eWIDE-debkludge_offx>dispWIDE) { ++ xwc.x=dispWIDE-eWIDE+debkludge_offx; ++ if (xwc.x<0) xwc.x=0; ++ } ++ if (xwc.y+eHIGH-debkludge_offy>dispHIGH) { ++ xwc.y=dispHIGH-eHIGH+debkludge_offy; ++ if (xwc.y<0) xwc.y=0; ++ } ++ + xwc.width = xwa->width; + xwc.height = xwa->height; + +@@ -2370,6 +2607,24 @@ + if (tiffUp) TIFFDialog(0); /* close tiff window */ + #endif + ++#ifdef HAVE_PNG ++ if (pngUp) PNGDialog(0); /* close png window */ ++#endif ++ ++ if (pcdUp) PCDDialog(0); /* close pcd window */ ++ ++#ifdef HAVE_PIC2 ++ if (pic2Up) PIC2Dialog(0); /* close pic2 window */ ++#endif ++ ++#ifdef HAVE_PCD ++ if (pcdUp) PCDDialog(0); /* close pcd window */ ++#endif ++ ++#ifdef HAVE_MGCSFX ++ if (mgcsfxUp) MGCSFXDialog(0); /* close mgcsfx window */ ++#endif ++ + ClosePopUp(); + + /* make the interrupt signal look like a '\n' keypress in ctrlW */ +@@ -2574,26 +2829,43 @@ + static void paintLine(x,y,x1,y1) + int x,y,x1,y1; + { +- int dx,dy,i,lx,ly,adx,ady; ++ int t,dx,dy,d,dd; + +- dx = x1-x; dy = y1-y; +- adx = abs(dx); ady = abs(dy); ++ dx = abs(x1-x); dy = abs(y1-y); + +- if (dx == 0 && dy == 0) paintPixel(x,y); +- +- else if (adx > ady) { /* X is major axis */ +- for (i=0; i<=adx; i++) { +- lx = x + (i * dx + (adx/2)) / abs(dx); +- ly = y + (i * dy + (adx/2)) / abs(dx); +- paintPixel(lx,ly); ++ if (dx >= dy) { /* X is major axis */ ++ if (x > x1) { ++ t = x; x = x1; x1 = t; ++ t = y; y = y1; y1 = t; ++ } ++ d = dy + dy - dx; ++ dd = y < y1 ? 1 : -1; ++ while (x <= x1) { ++ paintPixel(x,y); ++ if (d > 0) { ++ y += dd; ++ d -= dx + dx; ++ } ++ ++x; ++ d += dy + dy; + } + } + + else { /* Y is major axis */ +- for (i=0; i<=ady; i++) { +- lx = x + (i * dx + (ady/2)) / ady; +- ly = y + (i * dy + (ady/2)) / ady; +- paintPixel(lx,ly); ++ if (y > y1) { ++ t = x; x = x1; x1 = t; ++ t = y; y = y1; y1 = t; ++ } ++ d = dx + dx - dy; ++ dd = x < x1 ? 1 : -1; ++ while (y <= y1) { ++ paintPixel(x,y); ++ if (d > 0) { ++ x += dd; ++ d -= dy + dy; ++ } ++ ++y; ++ d += dx + dx; + } + } + +diff -ruN xv-3.10a-bugfixes/xvfits.c xv-3.10a-enhancements/xvfits.c +--- xv-3.10a-bugfixes/xvfits.c 2005-04-02 21:08:45.000000000 -0800 ++++ xv-3.10a-enhancements/xvfits.c 2005-04-17 14:45:28.000000000 -0700 +@@ -14,7 +14,7 @@ + * provided "as is" without express or implied warranty. + */ + +- ++#define NEEDSDIR /* for S_IRUSR|S_IWUSR */ + #include "xv.h" + + #define NCARDS (36) +@@ -228,7 +228,7 @@ + * If there was a problem writing files, then a error message will be set. + */ + +- int i, npixels=nx * ny, nwrt; ++ int i, npixels=nx * ny, nwrt, tmpfd; + FILE *fp; + char *error; + char filename[70]; +@@ -254,7 +254,12 @@ + + for (i=0; i < nz && !error; i++) { + sprintf(filename, "%s%d", basename, i+1); +- fp = xv_fopen(filename, "w"); ++ tmpfd = open(filename,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR); ++ if (tmpfd < 0) { ++ error = "Unable to open temporary file"; ++ break; ++ } ++ fp = fdopen(tmpfd, "w"); + if (!fp) { + error = "Unable to open temporary file"; + break; +@@ -262,13 +267,17 @@ + + if (wrheader(fp, nx, ny, comment)) { + error = "I/O error writing temporary file"; ++ fflush(fp); + fclose(fp); + unlink(filename); ++ close(tmpfd); + break; + } + + nwrt = fwrite(image+i*npixels, sizeof(byte), (size_t) npixels, fp); ++ fflush(fp); + fclose(fp); ++ close(tmpfd); + + if (nwrt == 0) { /* failed to write any data */ + error = "I/O error writing temporary file"; +diff -ruN xv-3.10a-bugfixes/xvgam.c xv-3.10a-enhancements/xvgam.c +--- xv-3.10a-bugfixes/xvgam.c 2004-05-16 18:02:11.000000000 -0700 ++++ xv-3.10a-enhancements/xvgam.c 2004-05-16 18:06:48.000000000 -0700 +@@ -265,11 +265,11 @@ + BTCreate(&gbut[G_BRNDCOL], cmapF, 5 + 66 + 67 + 2, 189, 66, BUTTH, + "Random", infofg, infobg, hicol, locol); + +- DCreate(&rhDial, cmapF, 5, 215, 66, 100, 0,360,180, 5, ++ DCreate(&rhDial, cmapF, 5, 215, 66, 100, 0.0, 360.0, 180.0, 1.0, 5.0, + infofg, infobg, hicol, locol, "Hue", NULL); +- DCreate(&gsDial, cmapF, 72, 215, 66, 100, 0,360,180, 5, ++ DCreate(&gsDial, cmapF, 72, 215, 66, 100, 0.0, 360.0, 180.0, 1.0, 5.0, + infofg, infobg, hicol, locol, "Sat.", NULL); +- DCreate(&bvDial, cmapF, 139, 215, 66, 100, 0,360,180, 5, ++ DCreate(&bvDial, cmapF, 139, 215, 66, 100, 0.0, 360.0, 180.0, 1.0, 5.0, + infofg, infobg, hicol, locol, "Value", NULL); + + rhDial.drawobj = gsDial.drawobj = bvDial.drawobj = dragEditColor; +@@ -359,7 +359,7 @@ + + srcHD.drawobj = dstHD.drawobj = whtHD.drawobj = dragHueDial; + +- DCreate(&satDial, hsvF, 100, 199, 100, 121, -100, 100, 0, 5, ++ DCreate(&satDial, hsvF, 100, 199, 100, 121, -100.0, 100.0, 0.0, 1.0, 5.0, + infofg, infobg,hicol,locol, "Saturation", "%"); + + hueRB = RBCreate(NULL, hsvF, 7, 153, "1", +@@ -722,7 +722,7 @@ + + if (whtHD.enabCB.val && whtHD.satval) hsvnonlinear++; + +- if (satDial.val != 0) hsvnonlinear++; ++ if (satDial.val != 0.0) hsvnonlinear++; + + /* check intensity graf */ + for (i=0; i<256 && intGraf.func[i]==i; i++); +@@ -1291,14 +1291,14 @@ + rgb2hsv(rcmap[editColor], gcmap[editColor], bcmap[editColor], &h, &s, &v); + if (h<0) h = 0; + +- DSetVal(&rhDial, (int) h); +- DSetVal(&gsDial, (int) (s*100)); +- DSetVal(&bvDial, (int) (v*100)); ++ DSetVal(&rhDial, h); ++ DSetVal(&gsDial, s*100); ++ DSetVal(&bvDial, v*100); + } + else { +- DSetVal(&rhDial, rcmap[editColor]); +- DSetVal(&gsDial, gcmap[editColor]); +- DSetVal(&bvDial, bcmap[editColor]); ++ DSetVal(&rhDial, (double)rcmap[editColor]); ++ DSetVal(&gsDial, (double)gcmap[editColor]); ++ DSetVal(&bvDial, (double)bcmap[editColor]); + } + } + +@@ -1310,16 +1310,15 @@ + + if (hsvmode) { + int rv, gv, bv; +- hsv2rgb((double) rhDial.val, ((double) gsDial.val) / 100.0, +- ((double) bvDial.val) / 100.0, &rv, &gv, &bv); ++ hsv2rgb(rhDial.val, gsDial.val / 100.0, bvDial.val / 100.0, &rv, &gv, &bv); + rcmap[editColor] = rv; + gcmap[editColor] = gv; + bcmap[editColor] = bv; + } + else { +- rcmap[editColor] = rhDial.val; +- gcmap[editColor] = gsDial.val; +- bcmap[editColor] = bvDial.val; ++ rcmap[editColor] = (int)rhDial.val; ++ gcmap[editColor] = (int)gsDial.val; ++ bcmap[editColor] = (int)bvDial.val; + } + } + +@@ -1561,9 +1560,9 @@ + gsDial.title = "Green"; + bvDial.title = "Blue"; + +- DSetRange(&rhDial, 0, 255, rcmap[editColor], 16); +- DSetRange(&gsDial, 0, 255, gcmap[editColor], 16); +- DSetRange(&bvDial, 0, 255, bcmap[editColor], 16); ++ DSetRange(&rhDial, 0.0, 255.0, (double)rcmap[editColor], 1.0, 16.0); ++ DSetRange(&gsDial, 0.0, 255.0, (double)gcmap[editColor], 1.0, 16.0); ++ DSetRange(&bvDial, 0.0, 255.0, (double)bcmap[editColor], 1.0, 16.0); + + XClearWindow(theDisp, rhDial.win); DRedraw(&rhDial); + XClearWindow(theDisp, gsDial.win); DRedraw(&gsDial); +@@ -1581,9 +1580,9 @@ + &h, &s, &v); + + if (h<0.0) h = 0.0; +- DSetRange(&rhDial, 0, 360, (int) h, 5); +- DSetRange(&gsDial, 0, 100, (int) (s*100), 5); +- DSetRange(&bvDial, 0, 100, (int) (v*100), 5); ++ DSetRange(&rhDial, 0.0, 360.0, h, 1.0, 5.0); ++ DSetRange(&gsDial, 0.0, 100.0, s*100, 1.0, 5.0); ++ DSetRange(&bvDial, 0.0, 100.0, v*100, 1.0, 5.0); + + XClearWindow(theDisp, rhDial.win); DRedraw(&rhDial); + XClearWindow(theDisp, gsDial.win); DRedraw(&gsDial); +@@ -1891,7 +1890,7 @@ + } + + /* apply satDial value to s */ +- s = s + ((double) satDial.val) / 100.0; ++ s = s + satDial.val / 100.0; + if (s<0.0) s = 0.0; + if (s>1.0) s = 1.0; + +@@ -2007,7 +2006,7 @@ + + gs->hueRBnum = RBWhich(hueRB); + +- gs->satval = satDial.val; ++ gs->satval = (int)satDial.val; + GetGrafState(&intGraf,&gs->istate); + GetGrafState(&rGraf, &gs->rstate); + GetGrafState(&gGraf, &gs->gstate); +@@ -2064,8 +2063,8 @@ + changed++; + } + +- if (gs->satval != satDial.val) { +- DSetVal(&satDial,gs->satval); ++ if (gs->satval != (int)satDial.val) { ++ DSetVal(&satDial,(double)gs->satval); + changed++; + } + +@@ -3200,7 +3199,7 @@ + + if (whtHD.enabCB.val && whtHD.satval) hsvmod++; + +- if (satDial.val != 0) hsvmod++; ++ if (satDial.val != 0.0) hsvmod++; + + /* check intensity graf */ + for (i=0; i<256; i++) { +@@ -3284,7 +3283,7 @@ + } + + /* apply satDial value to s */ +- s = s + satDial.val; ++ s = s + (int)satDial.val; + if (s< 0) s = 0; + if (s>100) s = 100; + +diff -ruN xv-3.10a-bugfixes/xvgif.c xv-3.10a-enhancements/xvgif.c +--- xv-3.10a-bugfixes/xvgif.c 2005-04-03 11:53:13.000000000 -0700 ++++ xv-3.10a-enhancements/xvgif.c 2005-04-30 21:47:44.000000000 -0700 +@@ -50,6 +50,7 @@ + BytesPerScanline, /* bytes per scanline in output raster */ + ColorMapSize, /* number of colors */ + Background, /* background color */ ++ Transparent, /* transparent color (GRR 19980314) */ + CodeSize, /* Code size, read from GIF header */ + InitCodeSize, /* Starting code size, used during Clear */ + Code, /* Value returned by ReadCode */ +@@ -111,16 +112,20 @@ + + register byte ch, *origptr; + register int i, block; +- int aspect, gotimage; ++ int aspect; ++ char tmpname[256]; ++ byte r[256], g[256], b[256]; + + /* initialize variables */ +- BitOffset = XC = YC = OutCount = gotimage = 0; ++ BitOffset = XC = YC = OutCount = 0; + Pass = -1; + RawGIF = Raster = pic8 = NULL; + gif89 = 0; ++ Transparent = -1; + + pinfo->pic = (byte *) NULL; + pinfo->comment = (char *) NULL; ++ pinfo->numpages= 0; + + bname = BaseName(fname); + fp = xv_fopen(fname,"r"); +@@ -145,7 +150,7 @@ + + if (fread(dataptr, (size_t) filesize, (size_t) 1, fp) != 1) + return( gifError(pinfo, "GIF data read failed") ); +- ++ fclose(fp); + + origptr = dataptr; + +@@ -161,6 +166,7 @@ + RWidth = ch + 0x100 * NEXTBYTE; /* screen dimensions... not used. */ + ch = NEXTBYTE; + RHeight = ch + 0x100 * NEXTBYTE; ++ if (DEBUG) fprintf(stderr,"GIF89 logical screen = %d x %d\n",RWidth,RHeight); + + ch = NEXTBYTE; + HasColormap = ((ch & COLORMAPMASK) ? True : False); +@@ -176,6 +182,8 @@ + if (!gif89) return(gifError(pinfo,"corrupt GIF file (screen descriptor)")); + else normaspect = (float) (aspect + 15) / 64.0; /* gif89 aspect ratio */ + if (DEBUG) fprintf(stderr,"GIF89 aspect = %f\n", normaspect); ++ /* FIXME: apparently this _should_ apply to all frames in a multi-image ++ * GIF (i.e., PgUp/PgDn), but it doesn't */ + } + + +@@ -183,20 +191,23 @@ + + if (HasColormap) + for (i=0; i<ColorMapSize; i++) { +- pinfo->r[i] = NEXTBYTE; +- pinfo->g[i] = NEXTBYTE; +- pinfo->b[i] = NEXTBYTE; ++ r[i] = NEXTBYTE; ++ g[i] = NEXTBYTE; ++ b[i] = NEXTBYTE; + } + else { /* no colormap in GIF file */ + /* put std EGA palette (repeated 16 times) into colormap, for lack of + anything better to do */ + + for (i=0; i<256; i++) { +- pinfo->r[i] = EGApalette[i&15][0]; +- pinfo->g[i] = EGApalette[i&15][1]; +- pinfo->b[i] = EGApalette[i&15][2]; ++ r[i] = EGApalette[i&15][0]; ++ g[i] = EGApalette[i&15][1]; ++ b[i] = EGApalette[i&15][2]; + } + } ++ memcpy(pinfo->r, r, sizeof r); ++ memcpy(pinfo->g, g, sizeof g); ++ memcpy(pinfo->b, b, sizeof b); + + /* possible things at this point are: + * an application extension block +@@ -334,12 +345,28 @@ + if (DEBUG) fprintf(stderr,"Graphic Control extension\n\n"); + + SetISTR(ISTR_INFO, "%s: %s", bname, +- "Graphic Control Extension in GIF file. Ignored."); ++ "Graphic Control Extension ignored."); + +- /* read (and ignore) data sub-blocks */ ++ /* read (and ignore) data sub-blocks, unless compositing with ++ * user-defined background */ + do { +- j = 0; sbsize = NEXTBYTE; +- while (j<sbsize) { SKIPBYTE; j++; } ++ j = 0; ++ sbsize = NEXTBYTE; ++ /* GRR 19980314: get transparent index out of block */ ++ if (have_imagebg && sbsize == 4 && Transparent < 0) { ++ byte packed_fields = NEXTBYTE; ++ ++ j++; ++ SKIPBYTE; j++; ++ SKIPBYTE; j++; ++ if (packed_fields & 1) { ++ Transparent = NEXTBYTE; ++ j++; ++ } ++ } ++ while (j<sbsize) { ++ SKIPBYTE; j++; ++ } + } while (sbsize); + } + +@@ -376,36 +403,42 @@ + + + else if (block == IMAGESEP) { +- if (DEBUG) fprintf(stderr,"imagesep (got=%d) ",gotimage); ++ if (DEBUG) fprintf(stderr,"imagesep (page=%d) ",pinfo->numpages+1); + if (DEBUG) fprintf(stderr," at start: offset=0x%x\n",dataptr-RawGIF); + +- if (gotimage) { /* just skip over remaining images */ +- int i,misc,ch,ch1; ++ BitOffset = XC = YC = Pass = OutCount = 0; + +- /* skip image header */ +- SKIPBYTE; SKIPBYTE; /* left position */ +- SKIPBYTE; SKIPBYTE; /* top position */ +- SKIPBYTE; SKIPBYTE; /* width */ +- SKIPBYTE; SKIPBYTE; /* height */ +- misc = NEXTBYTE; /* misc. bits */ +- +- if (misc & 0x80) { /* image has local colormap. skip it */ +- for (i=0; i< 1 << ((misc&7)+1); i++) { +- SKIPBYTE; SKIPBYTE; SKIPBYTE; ++ if (pinfo->numpages > 0) { /* do multipage stuff */ ++ if (pinfo->numpages == 1) { /* first time only... */ ++ xv_mktemp(pinfo->pagebname, "xvpgXXXXXX"); ++ if (pinfo->pagebname[0] == '\0') { ++ ErrPopUp("LoadGIF: Unable to create temporary filename???", ++ "\nHow unlikely!"); ++ return 0; + } + } +- +- SKIPBYTE; /* minimum code size */ +- +- /* skip image data sub-blocks */ +- do { +- ch = ch1 = NEXTBYTE; +- while (ch--) SKIPBYTE; +- if ((dataptr - RawGIF) > filesize) break; /* EOF */ +- } while(ch1); ++ sprintf(tmpname, "%s%d", pinfo->pagebname, pinfo->numpages); ++ fp = xv_fopen(tmpname, "w"); ++ if (!fp) { ++ ErrPopUp("LoadGIF: Unable to open temp file", "\nDang!"); ++ return 0; ++ } ++ if (WriteGIF(fp, pinfo->pic, pinfo->type, pinfo->w, pinfo->h, pinfo->r, ++ pinfo->g, pinfo->b, numcols, pinfo->colType, NULL)) { ++ fclose(fp); ++ ErrPopUp("LoadGIF: Error writing temp file", "\nBummer!"); ++ return 0; ++ } ++ fclose(fp); ++ free(pinfo->pic); ++ pinfo->pic = (byte *) NULL; ++ if (HasColormap) { ++ memcpy(pinfo->r, r, sizeof r); ++ memcpy(pinfo->g, g, sizeof g); ++ memcpy(pinfo->b, b, sizeof b); ++ } + } +- +- else if (readImage(pinfo)) gotimage = 1; ++ if (readImage(pinfo)) pinfo->numpages++; + if (DEBUG) fprintf(stderr," at end: dataptr=0x%x\n",dataptr-RawGIF); + } + +@@ -425,7 +458,7 @@ + sprintf(str, "Unknown block type (0x%02x) at offset 0x%x", + block, (dataptr - origptr) - 1); + +- if (!gotimage) return gifError(pinfo, str); ++ if (!pinfo->numpages) return gifError(pinfo, str); + else gifWarning(str); + } + +@@ -438,8 +471,34 @@ + free(RawGIF); RawGIF = NULL; + free(Raster); Raster = NULL; + +- if (!gotimage) ++ if (!pinfo->numpages) + return( gifError(pinfo, "no image data found in GIF file") ); ++ if (pinfo->numpages > 1) { ++ /* write the last page temp file */ ++ int numpages = pinfo->numpages; ++ char *comment = pinfo->comment; ++ sprintf(tmpname, "%s%d", pinfo->pagebname, pinfo->numpages); ++ fp = xv_fopen(tmpname, "w"); ++ if (!fp) { ++ ErrPopUp("LoadGIF: Unable to open temp file", "\nDang!"); ++ return 0; ++ } ++ if (WriteGIF(fp, pinfo->pic, pinfo->type, pinfo->w, pinfo->h, pinfo->r, ++ pinfo->g, pinfo->b, numcols, pinfo->colType, NULL)) { ++ fclose(fp); ++ ErrPopUp("LoadGIF: Error writing temp file", "\nBummer!"); ++ return 0; ++ } ++ fclose(fp); ++ free(pinfo->pic); ++ pinfo->pic = (byte *) NULL; ++ ++ /* load the first page temp file */ ++ sprintf(tmpname, "%s%d", pinfo->pagebname, 1); ++ i = LoadGIF(tmpname, pinfo); ++ pinfo->numpages = numpages; ++ pinfo->comment = comment; ++ } + + return 1; + } +@@ -484,6 +543,17 @@ + } + + ++ /* GRR 19980314 */ ++ /* need not worry about size of EGA palette: full 256 colors */ ++ if (have_imagebg && Transparent >= 0 && ++ Transparent < ((Misc&0x80)? (1 << ((Misc&7)+1)) : ColorMapSize) ) ++ { ++ pinfo->r[Transparent] = (imagebgR >> 8); ++ pinfo->g[Transparent] = (imagebgG >> 8); ++ pinfo->b[Transparent] = (imagebgB >> 8); ++ } ++ ++ + + /* Start reading the raster data. First we get the intial code size + * and compute decompressor constant values, based on this code size. +@@ -540,7 +610,7 @@ + return( gifError(pinfo, "image dimensions out of range") ); + picptr = pic8 = (byte *) malloc((size_t) maxpixels); + if (!pic8) FatalError("LoadGIF: couldn't malloc 'pic8'"); +- ++ + + + /* Decompress the file, continuing until you see the GIF EOF code. +@@ -642,11 +712,10 @@ + SetISTR(ISTR_WARNING,"%s: %s", bname, + "This GIF file seems to be truncated. Winging it."); + if (!Interlace) /* clear->EOBuffer */ +- xvbzero((char *) pic8+npixels, (size_t) (maxpixels-npixels)); ++ xvbzero((char *) pic8+npixels, ++ (size_t) (maxpixels-npixels<0 ? 0 : maxpixels-npixels)); + } + +- fclose(fp); +- + /* fill in the PICINFO structure */ + + pinfo->pic = pic8; +diff -ruN xv-3.10a-bugfixes/xvgrab.c xv-3.10a-enhancements/xvgrab.c +--- xv-3.10a-bugfixes/xvgrab.c 2004-05-16 18:03:30.000000000 -0700 ++++ xv-3.10a-enhancements/xvgrab.c 2005-04-25 23:39:32.000000000 -0700 +@@ -14,6 +14,13 @@ + #define NEEDSTIME + #include "xv.h" + ++/* Allow flexibility in use of buttons JPD */ ++#define WINDOWGRABMASK Button1Mask /* JPD prefers Button2Mask */ ++#define RECTGTRACKMASK Button2Mask /* JPD prefers Button1Mask*/ ++#define CANCELGRABMASK Button3Mask ++ ++#define DO_GRABFLASH /* JPD prefers not to do that; just a loss of time ... */ ++ + + union swapun { + CARD32 l; +@@ -69,12 +76,15 @@ + 0 if cancelled */ + + int i, x, y, x1, y1, x2, y2, ix, iy, iw, ih, rv; +- int rx, ry, pretendGotB1, autograb; ++ int rx, ry, GotButton, autograb; ++ int cancelled = 0; + Window rW, cW, clickWin; + unsigned int mask; ++#ifdef RECOLOR_GRAB_CURSOR + XColor fc, bc; ++#endif + +- pretendGotB1 = 0; ++ GotButton = 0; + + if (grabInProgress) return 0; /* avoid recursive grabs during delay */ + +@@ -122,15 +132,23 @@ + free(grabPic); grabPic = (byte *) NULL; + } + +- ++ /* recolor cursor to indicate that grabbing is active? */ ++ /* Instead, change cursor JPD */ ++#ifdef RECOLOR_GRAB_CURSOR + fc.flags = bc.flags = DoRed | DoGreen | DoBlue; + fc.red = fc.green = fc.blue = 0xffff; + bc.red = bc.green = bc.blue = 0x0000; + XRecolorCursor(theDisp, tcross, &fc, &bc); ++#endif + + + XBell(theDisp, 0); /* beep once at start of grab */ + ++ /* Change cursor to top_left_corner JPD */ ++ XGrabPointer(theDisp, rootW, False, ++ PointerMotionMask|ButtonPressMask|ButtonReleaseMask, ++ GrabModeAsync, GrabModeAsync, None, tlcorner, CurrentTime); ++ + if (!autograb) XGrabButton(theDisp, (u_int) AnyButton, 0, rootW, False, 0, + GrabModeAsync, GrabModeSync, None, tcross); + +@@ -142,7 +160,7 @@ + rv = 0; + goto exit; + } +- else { pretendGotB1 = 1; mask = Button1Mask; } ++ else { GotButton = 1; mask = WINDOWGRABMASK; } + } + + else { /* !autograb */ +@@ -170,16 +188,20 @@ + } + } + ++ XUngrabPointer(theDisp, CurrentTime); ++ /* Reset cursor to XC_tcross JPD */ ++ XGrabPointer(theDisp, rootW, False, ++ PointerMotionMask|ButtonPressMask|ButtonReleaseMask, ++ GrabModeAsync, GrabModeAsync, None, tcross, CurrentTime); + + /*** + *** got button click (or pretending we did, if autograb) + ***/ + +- +- if (mask & Button3Mask || rW!=rootW) { /* Button3: CANCEL GRAB */ ++ if (mask & CANCELGRABMASK || rW!=rootW) { /* CANCEL GRAB */ + while (1) { /* wait for button to be released */ + if (XQueryPointer(theDisp,rootW,&rW,&cW,&rx,&ry,&x1,&y1,&mask)) { +- if (!(mask & Button3Mask)) break; ++ if (!(mask & CANCELGRABMASK)) break; + } + } + +@@ -187,19 +209,21 @@ + XBell(theDisp, 0); + XBell(theDisp, 0); + rv = 0; ++ cancelled = 1; + goto exit; + } + + +- +- if (mask & Button1Mask) { /* Button1: GRAB WINDOW (& FRAME, maybe) */ +- while (!pretendGotB1) { /* wait for button to be released, if clicked */ ++ if (mask & WINDOWGRABMASK) { /* GRAB WINDOW (& FRAME, maybe) */ ++ while (!GotButton) { /* wait for button to be released, if clicked */ + int rx,ry,x1,y1; Window rW, cW; + if (XQueryPointer(theDisp,rootW,&rW,&cW,&rx,&ry,&x1,&y1,&mask)) { +- if (!(mask & Button1Mask)) break; ++ if (!(mask & WINDOWGRABMASK)) break; + } + } + ++ grabwin: ++ + clickWin = (cW) ? cW : rootW; + + if (clickWin == rootW) { /* grab entire screen */ +@@ -223,7 +247,6 @@ + } + } + +- + /* range checking: keep rectangle fully on-screen */ + if (ix<0) { iw += ix; ix = 0; } + if (iy<0) { ih += iy; iy = 0; } +@@ -244,8 +267,7 @@ + endflash(); + } + +- +- else { /* Button2: TRACK A RECTANGLE */ ++ else { /* TRACK A RECTANGLE */ + int origrx, origry; + + clickWin = rootW; +@@ -259,7 +281,7 @@ + /* Wait for button release while tracking rectangle on screen */ + while (1) { + if (XQueryPointer(theDisp,rootW,&rW,&cW,&rx,&ry,&x,&y,&mask)) { +- if (!(mask & Button2Mask)) break; ++ if (!(mask & RECTGTRACKMASK)) break; + } + + flashrect(ix, iy, iw, ih, 0); /* turn off rect */ +@@ -276,6 +298,7 @@ + + flashrect(ix, iy, iw, ih, 0); /* turn off rect */ + ++#ifdef DO_GRABFLASH + /* flash the rectangle a bit... */ + for (i=0; i<5; i++) { + flashrect(ix, iy, iw, ih, 1); +@@ -283,13 +306,26 @@ + flashrect(ix, iy, iw, ih, 0); + XFlush(theDisp); Timer(100); + } ++#endif ++ + endflash(); + ++ /* if rectangle has zero width or height, search for child window JPD */ ++ if (iw==0 && ih==0) { ++ int xr, yr; ++ Window childW = 0; ++ if (rW && cW) ++ XTranslateCoordinates(theDisp, rW, cW, rx, ry, &xr, &yr, &childW); ++ if (childW) ++ cW = childW; ++ goto grabwin; ++ } ++ + XUngrabServer(theDisp); + } + +- + /*** ++ *** now that clickWin,ix,iy,iw,ih are known, try to grab the bits : + *** grab screen area (ix,iy,iw,ih) + ***/ + +@@ -303,9 +339,16 @@ + + SetCursors(-1); + +- + exit: + ++ XUngrabPointer(theDisp, CurrentTime); ++ XUngrabServer(theDisp); ++ ++ if (startGrab) { ++ startGrab = 0; ++ if (cancelled) Quit(0); ++ } ++ + if (hidewins) { /* remap XV windows */ + autoclose += 2; /* force it on once */ + if (mainW && dispMode == RMB_WINDOW) { +@@ -1217,7 +1260,3 @@ + + return 1; + } +- +- +- +- +diff -ruN xv-3.10a-bugfixes/xvhips.c xv-3.10a-enhancements/xvhips.c +--- xv-3.10a-bugfixes/xvhips.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvhips.c 2005-04-30 23:49:14.000000000 -0700 +@@ -0,0 +1,406 @@ ++/* ++ * xvhips.c - load routine for 'HIPS' format pictures ++ * ++ * LoadHIPS(fname, numcols) ++ */ ++ ++/* ++ * Copyright 1989, 1990 by the University of Pennsylvania ++ * ++ * Permission to use, copy, and distribute for non-commercial purposes, ++ * is hereby granted without fee, providing that the above copyright ++ * notice appear in all copies and that both the copyright notice and this ++ * permission notice appear in supporting documentation. ++ * ++ * The software may be modified for your own purposes, but modified versions ++ * may not be distributed. ++ * ++ * This software is provided "as is" without any express or implied warranty. ++ */ ++ ++#include "xv.h" ++ ++#ifdef HAVE_HIPS ++ ++#define Boolean FREDDIE ++#include "xvhips.h" ++#undef Boolean ++ ++#include <alloca.h> ++ ++#define LINES 100 ++#define LINELENGTH 132 ++ ++static int fread_header(int fd, struct header *hd); ++static char *getline(int fd, char **s, int *l); ++static int dfscanf(int fd); ++static void make_grayscale(char *r, char *g, char *b); ++static float hls_value (float n1, float n2, float hue); ++static void hls_to_rgb(float h, float l, float s, ++ float *r, float *g, float *b); ++static void make_huescale(char *r, char *g, char *b); ++static void make_heatscale(char *r, char *g, char *b); ++static int load_colourmap(char *filestem, int max_colours, ++ char *r, char *g, char *b); ++ ++/************************************************************************ ++ * ++ * Read Header routines ++ * ++ ************************************************************************/ ++ ++static char *ssave[LINES]; ++static int slmax[LINES]; ++static int lalloc = 0; ++//extern char *calloc(); ++ ++ ++ ++static int fread_header(fd, hd) ++ int fd; ++ struct header *hd; ++{ ++ int lineno, len, i; ++ char *s; ++ ++/*fprintf(stderr,"fread_header: entered\n");*/ ++ if(lalloc<1) { ++ ssave[0] = calloc(LINELENGTH, sizeof (char)); ++ slmax[0] = LINELENGTH; ++ lalloc = 1; ++ } ++/*fprintf(stderr,"fread_header: ssave allocated\n");*/ ++ getline(fd,&ssave[0],&slmax[0]); ++ hd->orig_name = calloc(strlen(ssave[0])+1, sizeof (char)); ++ strcpy(hd->orig_name,ssave[0]); ++ getline(fd,&ssave[0],&slmax[0]); ++ hd->seq_name = calloc(strlen(ssave[0])+1, sizeof (char)); ++ strcpy(hd->seq_name,ssave[0]); ++ hd->num_frame = dfscanf(fd); ++ getline(fd,&ssave[0],&slmax[0]); ++ hd->orig_date = calloc(strlen(ssave[0])+1, sizeof (char)); ++ strcpy(hd->orig_date,ssave[0]); ++ hd->rows = dfscanf(fd); ++ hd->cols = dfscanf(fd); ++ hd->bits_per_pixel = dfscanf(fd); ++ hd->bit_packing = dfscanf(fd); ++ hd->pixel_format = dfscanf(fd); ++ lineno = 0; ++ len = 1; ++ getline(fd,&ssave[0],&slmax[0]); ++ s = ssave[0]; ++ while(*(s += strlen(s)-3) == '|') { ++ len += strlen(ssave[lineno]); ++ lineno++; ++ if (lineno >= LINES) ++ fprintf(stderr, "Too many lines in header history"); ++ if(lineno >= lalloc) { ++ ssave[lineno] = calloc(LINELENGTH, sizeof (char)); ++ slmax[lineno] = LINELENGTH; ++ lalloc++; ++ } ++ getline(fd,&ssave[lineno],&slmax[lineno]); ++ s = ssave[lineno]; ++ } ++ len += strlen(ssave[lineno]); ++ hd->seq_history = calloc(len, sizeof (char)); ++ hd->seq_history[0] = '\0'; ++ for (i=0;i<=lineno;i++) ++ strcat(hd->seq_history,ssave[i]); ++ lineno = 0; ++ len = 1; ++ while(strcmp(getline(fd,&ssave[lineno],&slmax[lineno]),".\n")) { ++ len += strlen(ssave[lineno]); ++ lineno++; ++ if (lineno >= LINES) ++ fprintf(stderr, "Too many lines in header desc."); ++ if(lineno >= lalloc) { ++ ssave[lineno] = calloc(LINELENGTH, sizeof (char)); ++ slmax[lineno] = LINELENGTH; ++ lalloc++; ++ } ++ } ++ hd->seq_desc = calloc(len, sizeof (char)); ++ *hd->seq_desc = '\0'; ++ for (i=0;i<lineno;i++) ++ strcat(hd->seq_desc,ssave[i]); ++/*fprintf(stderr,"fread_header: exiting\n");*/ ++ return 0; ++} ++ ++ ++ ++static char *getline(fd,s,l) ++ int fd; ++ char **s; ++ int *l; ++{ ++ int i,m; ++ char c,*s1,*s2; ++ ++ i = 0; ++ s1 = *s; ++ m = *l; ++ while(read(fd,&c,1) == 1 && c != '\n') { ++ if (m-- <= 2) { ++ s2 = calloc(LINELENGTH+*l,sizeof (char)); ++ strcpy(s2,*s); ++ *s = s2; ++ *l += LINELENGTH; ++ m = LINELENGTH; ++ s1 = s2 + strlen(s2); ++ } ++ *s1++ = c; ++ } ++ if (c == '\n') { ++ *s1++ = '\n'; ++ *s1 = '\0'; ++ return *s; ++ } ++ fprintf(stderr, "Unexpected EOF while reading header."); ++ return NULL; ++} ++ ++ ++ ++static int dfscanf(fd) ++ int fd; ++{ ++ int i; ++ ++ getline(fd,&ssave[0],&slmax[0]); ++ sscanf(ssave[0],"%d",&i); ++ return(i); ++} ++ ++ ++ ++/*******************************************/ ++int LoadHIPS(fname,pinfo) ++ char *fname; ++ PICINFO * pinfo; ++/*******************************************/ ++{ ++ FILE *fp; ++ struct header h; ++ char * pic; ++ ++ /* open the stream, if necesary */ ++ fp=fopen(fname,"r"); ++ if (!fp) return 0; ++ ++ if (!fread_header(fileno(fp), &h)) { ++ SetISTR(ISTR_WARNING,"Can't read HIPS header"); ++ return 0; ++ } ++ ++ pinfo->w = h.cols; ++ pinfo->h = h.rows; ++ pic = pinfo->pic = (byte *) malloc(h.rows * h.cols); // GRR POSSIBLE OVERFLOW / FIXME ++ if (!pic) FatalError("couldn't malloc HIPS file"); ++ ++ if (!fread(pic, 1, h.cols*h.rows, fp)) { ++ SetISTR(ISTR_WARNING,"Error reading HIPS data.\n"); ++ return 0; ++ } ++ fclose (fp); ++ ++ pinfo->frmType = F_SUNRAS; ++ pinfo->colType = F_FULLCOLOR; ++ sprintf(pinfo->fullInfo, "HIPS file (%d bytes)", h.cols*h.rows); ++ sprintf(pinfo->shrtInfo, "HIPS file."); ++ pinfo->comment = (char *) NULL; ++ ++ { ++ char cmapname[256]; ++ /* Check header for colormap spec */ ++ char * s = h.seq_desc - 1; ++ char * cmaptag = "+COLORMAP"; ++ int sl = strlen(cmaptag); ++ cmapname[0] = 0; ++ while (*++s) ++ if (*s == '+') ++ if (strncmp(s, cmaptag, sl) == 0) { ++ char * p = s + sl; ++ while (*p && (*p == ' ' || *p == '\n' || *p == '\t')) p++; ++ sscanf(p, "%s", cmapname); ++ SetISTR(ISTR_INFO, cmapname); ++ fprintf(stderr, "Colormap = [%s]\n", cmapname); ++ } ++ ++ if (strcmp(cmapname, "gray") == 0 || strcmp(cmapname, "grey") == 0) ++ make_grayscale(pinfo->r, pinfo->g, pinfo->b); ++ else if (strcmp(cmapname, "heat") == 0) ++ make_heatscale(pinfo->r, pinfo->g, pinfo->b); ++ else if (strcmp(cmapname, "hues") == 0) ++ make_huescale(pinfo->r, pinfo->g, pinfo->b); ++ else if (!cmapname[0] || !load_colourmap(cmapname, 256, pinfo->r, pinfo->g, pinfo->b)) ++ make_grayscale(pinfo->r, pinfo->g, pinfo->b); ++ sprintf(pinfo->fullInfo, "HIPS file (%d x %d), Colormap = [%s]", h.cols, h.rows, cmapname); ++ } ++ ++ return 1; ++} ++ ++ ++ ++static void make_grayscale(char * r, char * g, char * b) ++{ ++ int i; ++ /* default grayscale colors */ ++ r[0] = 40; g[0] = 150; b[0] = 100; /* "green4" background */ ++ for(i = 1; i < 256; i++) ++ r[i] = g[i] = b[i] = i; ++} ++ ++ ++ ++static float hls_value (n1, n2, hue) ++ float n1,n2,hue; ++{ ++ if (hue>360.0) ++ hue-=360.0 ; ++ else if (hue<0.0) ++ hue+=360.0 ; ++ ++ if (hue<60.0) ++ return( n1+(n2-n1)*hue/60.0 ) ; ++ else if (hue<180.0) ++ return ( n2 ) ; ++ else if (hue<240.0) ++ return ( n1+(n2-n1)*(240.0-hue)/60.0 ) ; ++ else ++ return (n1) ; ++} ++ ++ ++ ++static void hls_to_rgb(h,l,s, r,g,b) ++ float h, l, s; ++ float *r, *g, *b; ++{ ++ static float m1, m2 ; ++ ++ if (l<=0.5) ++ m2=l*(1+s) ; ++ else ++ m2=l+s-l*s ; ++ m1=2.0*l-m2 ; ++ if (s==0.0) *r=*g=*b=l ; ++ else { ++ *r=hls_value(m1,m2,h+120.0) ; ++ *g=hls_value(m1,m2,h) ; ++ *b=hls_value(m1,m2,h-120.0) ; ++ } ++ ++} ++ ++ ++ ++static void make_huescale(char * r, char * g, char * b) ++{ ++ int j; ++ r[0] = g[0] = b[0] = 0; ++ for (j = 1; j<256; j++) ++ { ++ float fr, fg, fb; ++ hls_to_rgb((double)(256.0-j)*360.0/256.0, 0.5, 1.0, &fr, &fg, &fb); ++ r[j] = rint(255*fr); ++ g[j] = rint(255*fg); ++ b[j] = rint(255*fb); ++ } ++} ++ ++ ++ ++static void make_heatscale(char * r, char * g, char * b) ++{ ++ int j; ++ r[0] = g[0] = b[0] = 0; ++ for (j = 1; j<256; j++) ++ { ++ if(j<255/2) ++ r[j] = j*255/(255/2-1); ++ else ++ r[j]=255; ++ if (j>=255/2+255/3) ++ g[j] = 255; ++ else if (j>255/3) ++ g[j] = (j-255/3)*255/(255/2-1); ++ else ++ g[j] = 0; ++ if (j>255/2) ++ b[j] = (j-255/2)*255/(255-255/2-1); ++ else ++ b[j] = 0; ++ } ++} ++ ++ ++ ++static int load_colourmap(char *filestem, int max_colours, ++ char *r, char *g, char *b) ++{ ++ FILE * fp; ++ int numread=0; ++ char * filename; ++ char str[200]; ++ int num_colors; ++ /* ++ * Look for palette file in local directory ++ */ ++ ++ filename = (char*)alloca(strlen(filestem) + 5); ++ strcpy(filename, filestem); ++ strcat(filename, ".PAL"); /* Add the PAL suffix to the name specified */ ++ fp = fopen(filename,"r"); ++ if (!fp) { ++ /* ++ * If not found, try in $IM2HOME/etc/palettes ++ */ ++ char * im2home = (char*)getenv("IM2HOME"); ++ char * palette_subdirectory = "etc/palettes"; ++ char * fullfilename; ++ if (!im2home) ++ { ++ im2home = "/home/jewel/imagine2"; ++ fprintf(stderr,"IM2HOME environment variable not set -- using [%s]\n",im2home); ++ } ++ fullfilename = alloca(strlen(im2home)+strlen(palette_subdirectory)+strlen(filename)+5); ++ sprintf(fullfilename, "%s/%s/%s",im2home,palette_subdirectory,filename); ++ fp = fopen(fullfilename,"r"); ++ if (!fp) ++ { ++ fprintf(stderr,"Couldn't find any palette file -- looked for [%s] and [%s].\n", ++ filename,fullfilename); ++ perror("Last system error message was"); ++ return 0; ++ } ++ } ++ ++ strcpy(str,"(null)"); ++ if (!fscanf(fp,"%s\n",str) || strncmp(str,"Palette",7) != 0) { ++ fprintf(stderr,"error: First line of palette file should be `Palette', not [%s]\n", str); ++ return 0; ++ } ++ ++ fscanf(fp,"%[^\n]",str) ; /* Scan to end of line */ ++ fscanf (fp,"%d",&num_colors);/* Read the number of colours in the file */ ++ fgets(str,120,fp) ; /* Skip the text description, and general info lines */ ++ fgets(str,120,fp) ; ++ ++ while ((numread<max_colours)&&(numread<num_colors)) { ++ int rc, gc, bc; ++ fscanf (fp,"%d %d %d -", &rc, &gc, &bc) ; /* Get the (r,g,b) tuples */ ++ r[numread] = rc; ++ g[numread] = gc; ++ b[numread] = bc; ++ numread++; ++ fgets(str,120,fp) ; /* Skip the description, if present */ ++ } ++ ++ SetISTR(ISTR_INFO,"Read %d colors from palette file [%s]", numread, filename); ++ return (numread) ; /* Return the number of colours ACTUALLY READ */ ++} ++ ++#endif /* HAVE_HIPS */ +diff -ruN xv-3.10a-bugfixes/xvhips.h xv-3.10a-enhancements/xvhips.h +--- xv-3.10a-bugfixes/xvhips.h 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvhips.h 2005-04-25 08:34:14.000000000 -0700 +@@ -0,0 +1,154 @@ ++/* ++ * HIPL Picture Header Format Standard ++ * ++ * Michael Landy - 2/1/82 ++ */ ++ ++#define XHEADER ++#ifdef XHEADER ++struct extended { ++ char *name; ++ char *vals; ++ }; ++#endif ++ ++struct header { ++ char *orig_name; /* The originator of this sequence */ ++ char *seq_name; /* The name of this sequence */ ++ int num_frame; /* The number of frames in this sequence */ ++ char *orig_date; /* The date the sequence was originated */ ++ int rows; /* The number of rows in each image */ ++ int cols; /* The number of columns in each image */ ++ int bits_per_pixel; /* The number of significant bits per pixel */ ++ int bit_packing; /* Nonzero if bits were packed contiguously */ ++ int pixel_format; /* The format of each pixel, see below */ ++ char *seq_history; /* The sequence's history of transformations */ ++ char *seq_desc; /* Descriptive information */ ++#ifdef XHEADER ++ struct extended *xheader; ++#endif ++}; ++ ++/* ++ * Pixel Format Codes ++ */ ++ ++#define PFBYTE 0 /* Bytes interpreted as integers (8 bits) */ ++#define PFSHORT 1 /* Short integers (2 bytes) */ ++#define PFINT 2 /* Integers (4 bytes) */ ++#define PFFLOAT 3 /* Float's (4 bytes)*/ ++#define PFCOMPLEX 4 /* 2 Float's interpreted as (real,imaginary) */ ++#define PFASCII 5 /* ASCII rep, with linefeeds after each row */ ++#define PFDOUBLE 6 /* Double's (8 byte floats) */ ++#define PFDBLCOM 7 /* Double complex's (2 Double's) */ ++#define PFQUAD 10 /* quad-tree encoding (Mimaging) */ ++#define PFQUAD1 11 /* quad-tree encoding */ ++#define PFBHIST 12 /* histogram of byte image (using ints) */ ++#define PFSPAN 13 /* spanning tree format */ ++#define PLOT3D 24 /* plot-3d format */ ++#define PFINTPYR 50 /* integer pyramid */ ++#define PFFLOATPYR 51 /* float pyramid */ ++#define PFPOLYLINE 100 /* 2D points */ ++#define PFCOLVEC 101 /* Set of RGB triplets defining colours */ ++#define PFUKOOA 102 /* Data in standard UKOOA format */ ++#define PFTRAINING 104 /* Set of colour vector training examples */ ++#define PFTOSPACE 105 /* TOspace world model data structure */ ++#define PFSTEREO 106 /* Stereo sequence (l, r, l, r, ...) */ ++#define PFRGPLINE 107 /* 2D points with regions */ ++#define PFRGISPLINE 108 /* 2D points with regions and interfaces */ ++#define PFCHAIN 200 /* Chain code encoding (Mimaging) */ ++#define PFLUT 300 /* LUT format (uses Ints) (Mimaging) */ ++#define PFAHC 400 /* adaptive hierarchical encoding */ ++#define PFOCT 401 /* oct-tree encoding */ ++#define PFBT 402 /* binary tree encoding */ ++#define PFAHC3 403 /* 3-d adaptive hierarchical encoding */ ++#define PFBQ 404 /* binquad encoding */ ++#define PFRLED 500 /* run-length encoding */ ++#define PFRLEB 501 /* run-length encoding, line begins black */ ++#define PFRLEW 502 /* run-length encoding, line begins white */ ++#define PFPOLAR 600 /* rho-theta format (Mimaging) */ ++ ++/* ++ * Bit packing formats ++ */ ++ ++#define MSBFIRST 1 /* bit packing - most significant bit first */ ++#define LSBFIRST 2 /* bit packing - least significant bit first */ ++ ++#define FBUFLIMIT 30000 /* increase this if you use large PLOT3D ++ files */ ++ ++/* ++ * For general readability ++ */ ++ ++#ifndef TRUE ++# define TRUE 1 ++#endif ++ ++#ifndef FALSE ++# define FALSE 0 ++#endif ++ ++typedef long Boolean; ++extern char *strsave(), *memalloc(); ++ ++/* ++ * image and pyramid type declarations for the pyramid routines. ++ * ++ * The pyramid utilities are derived from code originally written by ++ * Raj Hingorani at SRI/David Sarnoff Research Institute. The original ++ * Gaussian and Laplacian pyramid algorithms were designed by Peter Burt (also ++ * currently at SRI/DSRC). See: Computer Graphics and Image Processing, ++ * Volume 16, pp. 20-51, 1981, and IEEE Transactions on Communications, ++ * Volume COM-31, pp. 532-540, 1983. ++ */ ++ ++#define MAXLEV 12 ++ ++ ++typedef struct { ++ float **ptr; ++ int nr; ++ int nc; ++} FIMAGE; ++ ++typedef struct { ++ int **ptr; ++ int nr; ++ int nc; ++} IIMAGE; ++ ++typedef FIMAGE FPYR[MAXLEV]; ++typedef IIMAGE IPYR[MAXLEV]; ++ ++typedef struct { ++ float *k; ++ int taps2; /* the number of taps from the center rightward, ++ total number is 2*taps2-1 */ ++} FILTER; ++ ++/* function definitions */ ++ ++float **_read_fimgstr(); ++int **_read_iimgstr(); ++float **_alloc_fimage(); ++int **_alloc_iimage(); ++ ++/* image macros */ ++ ++#ifndef MAX ++# define MAX(A,B) ((A) > (B) ? (A) : (B)) ++#endif /* MAX */ ++#ifndef MIN ++# define MIN(A,B) ((A) < (B) ? (A) : (B)) ++#endif /* MIN */ ++#ifndef ABS ++# define ABS(A) ((A) > 0 ? (A) : (-(A))) ++#endif /* ABS */ ++#ifndef BETWEEN ++# define BETWEEN(A,B,C) (((A) < (B)) ? (B) : (((A) > (C)) ? (C) : (A))) ++#endif /* BETWEEN */ ++#ifndef SIGN ++# define SIGN(A,B) (((B) > 0) ? (A) : (-(A))) ++#endif /* SIGN */ +diff -ruN xv-3.10a-bugfixes/xvimage.c xv-3.10a-enhancements/xvimage.c +--- xv-3.10a-bugfixes/xvimage.c 2005-03-31 07:23:39.000000000 -0800 ++++ xv-3.10a-enhancements/xvimage.c 2005-04-17 23:00:10.000000000 -0700 +@@ -21,6 +21,16 @@ + * int LoadPad(pinfo, fname); + */ + ++/* The following switch should better be provided at runtime for ++ * comparison purposes. ++ * At the moment it's only compile time, unfortunately. ++ * Who can make adaptions for use as a runtime switch by a menu option? ++ * [GRR 19980607: now via do_fixpix_smooth global; macro renamed to ENABLE_] ++ * [see http://sylvana.net/fixpix/ for home page, further info] ++ */ ++/* #define ENABLE_FIXPIX_SMOOTH */ /* GRR 19980607: moved into xv.h */ ++ ++#define NEEDSDIR /* for S_IRUSR|S_IWUSR */ + #include "copyright.h" + + #include "xv.h" +@@ -36,7 +46,9 @@ + static int doAutoCrop24 PARM((void)); + static void floydDitherize1 PARM((XImage *, byte *, int, int, int, + byte *, byte *,byte *)); ++#if 0 /* NOTUSED */ + static int highbit PARM((unsigned long)); ++#endif + + static int doPadSolid PARM((char *, int, int, int, int)); + static int doPadBggen PARM((char *, int, int, int, int)); +@@ -46,6 +58,267 @@ + static int ReadImageFile1 PARM((char *, PICINFO *)); + + ++/* The following array represents the pixel values for each shade ++ * of the primary color components. ++ * If 'p' is a pointer to a source image rgb-byte-triplet, we can ++ * construct the output pixel value simply by 'oring' together ++ * the corresponding components: ++ * ++ * unsigned char *p; ++ * unsigned long pixval; ++ * ++ * pixval = screen_rgb[0][*p++]; ++ * pixval |= screen_rgb[1][*p++]; ++ * pixval |= screen_rgb[2][*p++]; ++ * ++ * This is both efficient and generic, since the only assumption ++ * is that the primary color components have separate bits. ++ * The order and distribution of bits does not matter, and we ++ * don't need additional variables and shifting/masking code. ++ * The array size is 3 KBytes total and thus very reasonable. ++ */ ++ ++static unsigned long screen_rgb[3][256]; ++ ++/* The following array holds the exact color representations ++ * reported by the system. ++ * This is useful for less than 24 bit deep displays as a base ++ * for additional dithering to get smoother output. ++ */ ++ ++static byte screen_set[3][256]; ++ ++/* The following routine initializes the screen_rgb and screen_set ++ * arrays. ++ * Since it is executed only once per program run, it does not need ++ * to be super-efficient. ++ * ++ * The method is to draw points in a pixmap with the specified shades ++ * of primary colors and then get the corresponding XImage pixel ++ * representation. ++ * Thus we can get away with any Bit-order/Byte-order dependencies. ++ * ++ * The routine uses some global X variables: theDisp, theScreen, ++ * and dispDEEP. Adapt these to your application as necessary. ++ * I've not passed them in as parameters, since for other platforms ++ * than X these may be different (see vfixpix.c), and so the ++ * screen_init() interface is unique. ++ * ++ * BUG: I've read in the "Xlib Programming Manual" from O'Reilly & ++ * Associates, that the DefaultColormap in TrueColor might not ++ * provide the full shade representation in XAllocColor. ++ * In this case one had to provide a 'best' colormap instead. ++ * However, my tests with Xaccel on a Linux-Box with a Mach64 ++ * card were fully successful, so I leave that potential problem ++ * to you at the moment and would appreciate any suggestions... ++ */ ++ ++static void screen_init() ++{ ++ static int init_flag; /* assume auto-init as 0 */ ++ Pixmap check_map; ++ GC check_gc; ++ XColor check_col; ++ XImage *check_image; ++ int ci, i; ++ ++ if (init_flag) return; ++ init_flag = 1; ++ ++ check_map = XCreatePixmap(theDisp, RootWindow(theDisp,theScreen), ++ 1, 1, dispDEEP); ++ check_gc = XCreateGC(theDisp, check_map, 0, NULL); ++ for (ci = 0; ci < 3; ci++) { ++ for (i = 0; i < 256; i++) { ++ check_col.red = 0; ++ check_col.green = 0; ++ check_col.blue = 0; ++ /* Do proper upscaling from unsigned 8 bit (image data values) ++ to unsigned 16 bit (X color representation). */ ++ ((unsigned short *)&check_col.red)[ci] = (unsigned short)((i << 8) | i); ++ if (theVisual->class == TrueColor) ++ XAllocColor(theDisp, theCmap, &check_col); ++ else ++ xvAllocColor(theDisp, theCmap, &check_col); ++ screen_set[ci][i] = ++ (((unsigned short *)&check_col.red)[ci] >> 8) & 0xff; ++ XSetForeground(theDisp, check_gc, check_col.pixel); ++ XDrawPoint(theDisp, check_map, check_gc, 0, 0); ++ check_image = XGetImage(theDisp, check_map, 0, 0, 1, 1, ++ AllPlanes, ZPixmap); ++ if (check_image) { ++ switch (check_image->bits_per_pixel) { ++ case 8: ++ screen_rgb[ci][i] = *(CARD8 *)check_image->data; ++ break; ++ case 16: ++ screen_rgb[ci][i] = *(CARD16 *)check_image->data; ++ break; ++ case 24: ++ screen_rgb[ci][i] = ++ ((unsigned long)*(CARD8 *)check_image->data << 16) | ++ ((unsigned long)*(CARD8 *)(check_image->data + 1) << 8) | ++ (unsigned long)*(CARD8 *)(check_image->data + 2); ++ break; ++ case 32: ++ screen_rgb[ci][i] = *(CARD32 *)check_image->data; ++ break; ++ } ++ XDestroyImage(check_image); ++ } ++ } ++ } ++ XFreeGC(theDisp, check_gc); ++ XFreePixmap(theDisp, check_map); ++} ++ ++ ++#ifdef ENABLE_FIXPIX_SMOOTH ++ ++/* The following code is based in part on: ++ * ++ * jquant1.c ++ * ++ * Copyright (C) 1991-1996, Thomas G. Lane. ++ * This file is part of the Independent JPEG Group's software. ++ * For conditions of distribution and use, see the accompanying README file. ++ * ++ * This file contains 1-pass color quantization (color mapping) routines. ++ * These routines provide mapping to a fixed color map using equally spaced ++ * color values. Optional Floyd-Steinberg or ordered dithering is available. ++ */ ++ ++/* Declarations for Floyd-Steinberg dithering. ++ * ++ * Errors are accumulated into the array fserrors[], at a resolution of ++ * 1/16th of a pixel count. The error at a given pixel is propagated ++ * to its not-yet-processed neighbors using the standard F-S fractions, ++ * ... (here) 7/16 ++ * 3/16 5/16 1/16 ++ * We work left-to-right on even rows, right-to-left on odd rows. ++ * ++ * We can get away with a single array (holding one row's worth of errors) ++ * by using it to store the current row's errors at pixel columns not yet ++ * processed, but the next row's errors at columns already processed. We ++ * need only a few extra variables to hold the errors immediately around the ++ * current column. (If we are lucky, those variables are in registers, but ++ * even if not, they're probably cheaper to access than array elements are.) ++ * ++ * We provide (#columns + 2) entries per component; the extra entry at each ++ * end saves us from special-casing the first and last pixels. ++ */ ++ ++typedef INT16 FSERROR; /* 16 bits should be enough */ ++typedef int LOCFSERROR; /* use 'int' for calculation temps */ ++ ++typedef struct { byte *colorset; ++ FSERROR *fserrors; ++ } FSBUF; ++ ++/* Floyd-Steinberg initialization function. ++ * ++ * It is called 'fs2_init' since it's specialized for our purpose and ++ * could be embedded in a more general FS-package. ++ * ++ * Returns a malloced FSBUF pointer which has to be passed as first ++ * parameter to subsequent 'fs2_dither' calls. ++ * The FSBUF structure does not need to be referenced by the calling ++ * application, it can be treated from the app like a void pointer. ++ * ++ * The current implementation does only require to free() this returned ++ * pointer after processing. ++ * ++ * Returns NULL if malloc fails. ++ * ++ * NOTE: The FSBUF structure is designed to allow the 'fs2_dither' ++ * function to work with an *arbitrary* number of color components ++ * at runtime! This is an enhancement over the IJG code base :-). ++ * Only fs2_init() specifies the (maximum) number of components. ++ */ ++ ++static FSBUF *fs2_init(width) ++int width; ++{ ++ FSBUF *fs; ++ FSERROR *p; ++ ++ fs = (FSBUF *) ++ malloc(sizeof(FSBUF) * 3 + ((size_t)width + 2) * sizeof(FSERROR) * 3); ++ if (fs == 0) return fs; ++ ++ fs[0].colorset = screen_set[0]; ++ fs[1].colorset = screen_set[1]; ++ fs[2].colorset = screen_set[2]; ++ ++ p = (FSERROR *)(fs + 3); ++ memset(p, 0, ((size_t)width + 2) * sizeof(FSERROR) * 3); ++ ++ fs[0].fserrors = p; ++ fs[1].fserrors = p + 1; ++ fs[2].fserrors = p + 2; ++ ++ return fs; ++} ++ ++/* Floyd-Steinberg dithering function. ++ * ++ * NOTE: ++ * (1) The image data referenced by 'ptr' is *overwritten* (input *and* ++ * output) to allow more efficient implementation. ++ * (2) Alternate FS dithering is provided by the sign of 'nc'. Pass in ++ * a negative value for right-to-left processing. The return value ++ * provides the right-signed value for subsequent calls! ++ * (3) This particular implementation assumes *no* padding between lines! ++ * Adapt this if necessary. ++ */ ++ ++static int fs2_dither(fs, ptr, nc, num_rows, num_cols) ++FSBUF *fs; ++byte *ptr; ++int nc, num_rows, num_cols; ++{ ++ int abs_nc, ci, row, col; ++ LOCFSERROR delta, cur, belowerr, bpreverr; ++ byte *dataptr, *colsetptr; ++ FSERROR *errorptr; ++ ++ if ((abs_nc = nc) < 0) abs_nc = -abs_nc; ++ for (row = 0; row < num_rows; row++) { ++ for (ci = 0; ci < abs_nc; ci++, ptr++) { ++ dataptr = ptr; ++ colsetptr = fs[ci].colorset; ++ errorptr = fs[ci].fserrors; ++ if (nc < 0) { ++ dataptr += (num_cols - 1) * abs_nc; ++ errorptr += (num_cols + 1) * abs_nc; ++ } ++ cur = belowerr = bpreverr = 0; ++ for (col = 0; col < num_cols; col++) { ++ cur += errorptr[nc]; ++ cur += 8; cur >>= 4; ++ if ((cur += *dataptr) < 0) cur = 0; ++ else if (cur > 255) cur = 255; ++ *dataptr = cur & 0xff; ++ cur -= colsetptr[cur]; ++ delta = cur << 1; cur += delta; ++ bpreverr += cur; cur += delta; ++ belowerr += cur; cur += delta; ++ errorptr[0] = (FSERROR)bpreverr; ++ bpreverr = belowerr; ++ belowerr = delta >> 1; ++ dataptr += nc; ++ errorptr += nc; ++ } ++ errorptr[0] = (FSERROR)bpreverr; ++ } ++ ptr += (num_cols - 1) * abs_nc; ++ nc = -nc; ++ } ++ return nc; ++} ++ ++#endif /* ENABLE_FIXPIX_SMOOTH */ ++ + + #define DO_CROP 0 + #define DO_ZOOM 1 +@@ -1348,7 +1621,7 @@ + SetISTR(ISTR_WARNING, "Invalid image dimensions for dithering"); + return (byte *)NULL; + } +- ++ + outpic = (byte *) malloc((size_t) npixels); + if (!outpic) return outpic; + +@@ -1838,7 +2111,7 @@ + unsigned int wide, high; + { + /* +- * this has to do the none-to-simple bit of converting the data in 'pic24' ++ * This has to do the none-too-simple bit of converting the data in 'pic24' + * into something usable by X. + * + * There are two major approaches: if we're displaying on a TrueColor +@@ -1852,7 +2125,7 @@ + * mode. (In that by this point, a 3/3/2 standard colormap has been + * created for our use (though all 256 colors may not be unique...), and + * we're just going to display the 24-bit picture by dithering with those +- * colors ++ * colors.) + * + */ + +@@ -1890,33 +2163,17 @@ + /* Non-ColorMapped Visuals: TrueColor, DirectColor */ + /************************************************************************/ + +- unsigned long r, g, b, rmask, gmask, bmask, xcol; +- int rshift, gshift, bshift, bperpix, bperline, border, cshift; +- int maplen; ++ unsigned long xcol; ++ int bperpix, bperline; + byte *imagedata, *lip, *ip, *pp; + + +- /* compute various shifting constants that we'll need... */ +- +- rmask = theVisual->red_mask; +- gmask = theVisual->green_mask; +- bmask = theVisual->blue_mask; +- +- rshift = 7 - highbit(rmask); +- gshift = 7 - highbit(gmask); +- bshift = 7 - highbit(bmask); +- +- maplen = theVisual->map_entries; +- if (maplen>256) maplen=256; +- cshift = 7 - highbit((u_long) (maplen-1)); +- + xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, + wide, high, 32, 0); + if (!xim) FatalError("couldn't create X image!"); + + bperline = xim->bytes_per_line; + bperpix = xim->bits_per_pixel; +- border = xim->byte_order; + + imagedata = (byte *) malloc((size_t) (high * bperline)); + if (!imagedata) FatalError("couldn't malloc imagedata"); +@@ -1930,85 +2187,141 @@ + FatalError(buf); + } + ++ screen_init(); + +- lip = imagedata; pp = pic24; +- for (i=0; i<high; i++, lip+=bperline) { +- for (j=0, ip=lip; j<wide; j++) { +- r = *pp++; g = *pp++; b = *pp++; +- +- /* shift r,g,b so that high bit of 8-bit color specification is +- * aligned with high bit of r,g,b-mask in visual, +- * AND each component with its mask, +- * and OR the three components together +- */ +- +- if (theVisual->class == DirectColor) { +- r = (u_long) directConv[(r>>cshift) & 0xff] << cshift; +- g = (u_long) directConv[(g>>cshift) & 0xff] << cshift; +- b = (u_long) directConv[(b>>cshift) & 0xff] << cshift; +- } +- +- +- /* shift the bits around */ +- if (rshift<0) r = r << (-rshift); +- else r = r >> rshift; +- +- if (gshift<0) g = g << (-gshift); +- else g = g >> gshift; +- +- if (bshift<0) b = b << (-bshift); +- else b = b >> bshift; +- +- r = r & rmask; +- g = g & gmask; +- b = b & bmask; +- +- xcol = r | g | b; +- +- if (bperpix == 32) { +- if (border == MSBFirst) { +- *ip++ = (xcol>>24) & 0xff; +- *ip++ = (xcol>>16) & 0xff; +- *ip++ = (xcol>>8) & 0xff; +- *ip++ = xcol & 0xff; +- } +- else { /* LSBFirst */ +- *ip++ = xcol & 0xff; +- *ip++ = (xcol>>8) & 0xff; +- *ip++ = (xcol>>16) & 0xff; +- *ip++ = (xcol>>24) & 0xff; +- } +- } +- +- else if (bperpix == 24) { +- if (border == MSBFirst) { +- *ip++ = (xcol>>16) & 0xff; +- *ip++ = (xcol>>8) & 0xff; +- *ip++ = xcol & 0xff; +- } +- else { /* LSBFirst */ +- *ip++ = xcol & 0xff; +- *ip++ = (xcol>>8) & 0xff; +- *ip++ = (xcol>>16) & 0xff; +- } +- } ++#ifdef ENABLE_FIXPIX_SMOOTH ++ if (do_fixpix_smooth) { ++#if 0 ++ /* If we wouldn't have to save the original pic24 image data, ++ * the following code would do the dither job by overwriting ++ * the image data, and the normal render code would then work ++ * without any change on that data. ++ * Unfortunately, this approach would hurt the xv assumptions... ++ */ ++ if (bperpix < 24) { ++ FSBUF *fs = fs2_init(wide); ++ if (fs) { ++ fs2_dither(fs, pic24, 3, high, wide); ++ free(fs); ++ } ++ } ++#else ++ /* ...so we have to take a different approach with linewise ++ * dithering/rendering in a loop using a temporary line buffer. ++ */ ++ if (bperpix < 24) { ++ FSBUF *fs = fs2_init(wide); ++ if (fs) { ++ byte *row_buf = malloc((size_t)wide * 3); ++ if (row_buf) { ++ int nc = 3; ++ byte *picp = pic24; lip = imagedata; ++ ++ switch (bperpix) { ++ case 8: ++ for (i=0; i<high; i++, lip+=bperline, picp+=(size_t)wide*3) { ++ memcpy(row_buf, picp, (size_t)wide * 3); ++ nc = fs2_dither(fs, row_buf, nc, 1, wide); ++ for (j=0, ip=lip, pp=row_buf; j<wide; j++) { ++ xcol = screen_rgb[0][*pp++]; ++ xcol |= screen_rgb[1][*pp++]; ++ xcol |= screen_rgb[2][*pp++]; ++ *ip++ = xcol & 0xff; ++ } ++ } ++ break; ++ ++ case 16: ++ for (i=0; i<high; i++, lip+=bperline, picp+=(size_t)wide*3) { ++ CARD16 *ip16 = (CARD16 *)lip; ++ memcpy(row_buf, picp, (size_t)wide * 3); ++ nc = fs2_dither(fs, row_buf, nc, 1, wide); ++ for (j=0, pp=row_buf; j<wide; j++) { ++ xcol = screen_rgb[0][*pp++]; ++ xcol |= screen_rgb[1][*pp++]; ++ xcol |= screen_rgb[2][*pp++]; ++ *ip16++ = (CARD16)xcol; ++ } ++ } ++ break; ++ } /* end switch */ ++ ++ free(row_buf); ++ free(fs); + +- else if (bperpix == 16) { +- if (border == MSBFirst) { +- *ip++ = (xcol>>8) & 0xff; +- *ip++ = xcol & 0xff; +- } +- else { /* LSBFirst */ +- *ip++ = xcol & 0xff; +- *ip++ = (xcol>>8) & 0xff; ++ return xim; + } +- } +- +- else if (bperpix == 8) { +- *ip++ = xcol & 0xff; +- } ++ free(fs); ++ } + } ++#endif /* 0? */ + } ++#endif /* ENABLE_FIXPIX_SMOOTH */ ++ ++ lip = imagedata; pp = pic24; ++ ++ switch (bperpix) { ++ case 8: ++ for (i=0; i<high; i++, lip+=bperline) { ++ for (j=0, ip=lip; j<wide; j++) { ++ xcol = screen_rgb[0][*pp++]; ++ xcol |= screen_rgb[1][*pp++]; ++ xcol |= screen_rgb[2][*pp++]; ++ *ip++ = xcol & 0xff; ++ } ++ } ++ break; ++ ++ case 16: ++ for (i=0; i<high; i++, lip+=bperline) { ++ CARD16 *ip16 = (CARD16 *)lip; ++ for (j=0; j<wide; j++) { ++ xcol = screen_rgb[0][*pp++]; ++ xcol |= screen_rgb[1][*pp++]; ++ xcol |= screen_rgb[2][*pp++]; ++ *ip16++ = (CARD16)xcol; ++ } ++ } ++ break; ++ ++ case 24: ++ for (i=0; i<high; i++, lip+=bperline) { ++ for (j=0, ip=lip; j<wide; j++) { ++ xcol = screen_rgb[0][*pp++]; ++ xcol |= screen_rgb[1][*pp++]; ++ xcol |= screen_rgb[2][*pp++]; ++#ifdef USE_24BIT_ENDIAN_FIX ++ if (border == MSBFirst) { ++ *ip++ = (xcol>>16) & 0xff; ++ *ip++ = (xcol>>8) & 0xff; ++ *ip++ = xcol & 0xff; ++ } ++ else { /* LSBFirst */ ++ *ip++ = xcol & 0xff; ++ *ip++ = (xcol>>8) & 0xff; ++ *ip++ = (xcol>>16) & 0xff; ++ } ++#else /* GRR: this came with the FixPix patch, but I don't think it's right */ ++ *ip++ = (xcol >> 16) & 0xff; /* (no way to test, however, so */ ++ *ip++ = (xcol >> 8) & 0xff; /* it's left enabled by default) */ ++ *ip++ = xcol & 0xff; ++#endif ++ } ++ } ++ break; ++ ++ case 32: ++ for (i=0; i<high; i++, lip+=bperline) { ++ CARD32 *ip32 = (CARD32 *)lip; ++ for (j=0; j<wide; j++) { ++ xcol = screen_rgb[0][*pp++]; ++ xcol |= screen_rgb[1][*pp++]; ++ xcol |= screen_rgb[2][*pp++]; ++ *ip32++ = (CARD32)xcol; ++ } ++ } ++ break; ++ } /* end switch */ + } + + else { +@@ -2458,6 +2771,7 @@ + + + /***********************/ ++#if 0 /* NOTUSED */ + static int highbit(ul) + unsigned long ul; + { +@@ -2470,6 +2784,7 @@ + for (i=31; ((ul & hb) == 0) && i>=0; i--, ul<<=1); + return i; + } ++#endif /* 0 - NOTUSED */ + + + +@@ -2680,6 +2995,9 @@ + char *str; + int wide, high, opaque,omode; + { ++#ifndef USE_MKSTEMP ++ int tmpfd; ++#endif + int i; + byte *bgpic24; + char syscmd[512], fname[128], errstr[512]; +@@ -2705,6 +3023,13 @@ + close(mkstemp(fname)); + #else + mktemp(fname); ++ tmpfd = open(fname, O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR); ++ if (tmpfd < 0) { ++ sprintf(errstr, "Error: can't create temporary file %s", fname); ++ ErrPopUp(errstr, "\nDoh!"); ++ return 0; ++ } ++ close(tmpfd); + #endif + + /* run bggen to generate the background */ +@@ -2978,7 +3303,7 @@ + + ftype = ReadFileType(name); + +- if (ftype == RFT_COMPRESS) { /* handle compressed/gzipped files */ ++ if ((ftype == RFT_COMPRESS) || (ftype == RFT_BZIP2)) { /* handle .Z,gz,bz2 */ + #ifdef VMS + basefname[0] = '\0'; + strcpy(basefname, name); /* remove trailing .Z */ +@@ -2988,7 +3313,7 @@ + uncName = name; + #endif + +- if (UncompressFile(uncName, uncompname)) { ++ if (UncompressFile(uncName, uncompname, ftype)) { + ftype = ReadFileType(uncompname); + readname = uncompname; + } +@@ -3029,9 +3354,3 @@ + + return 1; + } +- +- +- +- +- +- +diff -ruN xv-3.10a-bugfixes/xvinfo.c xv-3.10a-enhancements/xvinfo.c +--- xv-3.10a-bugfixes/xvinfo.c 2004-05-16 18:03:43.000000000 -0700 ++++ xv-3.10a-enhancements/xvinfo.c 2005-05-01 00:05:53.000000000 -0700 +@@ -265,7 +265,7 @@ + if (stnum == ISTR_WARNING && !ctrlUp && !infoUp && !anyBrowUp && + strlen(istrs[stnum])) { + OpenAlert(istrs[stnum]); +- sleep(3); ++ sleep(1); /* was 3, but _really_ slow for TIFFs with unknown tags... */ + CloseAlert(); + } + } +diff -ruN xv-3.10a-bugfixes/xvjpeg.c xv-3.10a-enhancements/xvjpeg.c +--- xv-3.10a-bugfixes/xvjpeg.c 2005-03-27 16:23:06.000000000 -0800 ++++ xv-3.10a-enhancements/xvjpeg.c 2005-04-17 14:45:28.000000000 -0700 +@@ -51,11 +51,21 @@ + static void clickJD PARM((int, int)); + static void doCmd PARM((int)); + static void writeJPEG PARM((void)); ++#if JPEG_LIB_VERSION > 60 ++METHODDEF(void) xv_error_exit PARM((j_common_ptr)); ++METHODDEF(void) xv_error_output PARM((j_common_ptr)); ++METHODDEF(void) xv_prog_meter PARM((j_common_ptr)); ++#else + METHODDEF void xv_error_exit PARM((j_common_ptr)); + METHODDEF void xv_error_output PARM((j_common_ptr)); + METHODDEF void xv_prog_meter PARM((j_common_ptr)); ++#endif + static unsigned int j_getc PARM((j_decompress_ptr)); ++#if JPEG_LIB_VERSION > 60 ++METHODDEF(boolean) xv_process_comment PARM((j_decompress_ptr)); ++#else + METHODDEF boolean xv_process_comment PARM((j_decompress_ptr)); ++#endif + static int writeJFIF PARM((FILE *, byte *, int,int,int)); + + +@@ -85,10 +95,10 @@ + + XSelectInput(theDisp, jpegW, ExposureMask | ButtonPressMask | KeyPressMask); + +- DCreate(&qDial, jpegW, 10, 10, 80, 100, 1, 100, 75, 5, ++ DCreate(&qDial, jpegW, 10, 10, 80, 100, 1.0, 100.0, 75.0, 1.0, 5.0, + infofg, infobg, hicol, locol, "Quality", "%"); + +- DCreate(&smDial, jpegW, 120, 10, 80, 100, 0, 100, 0, 5, ++ DCreate(&smDial, jpegW, 120, 10, 80, 100, 0.0, 100.0, 0.0, 1.0, 5.0, + infofg, infobg, hicol, locol, "Smoothing", "%"); + + BTCreate(&jbut[J_BOK], jpegW, JWIDE-180-1, JHIGH-10-BUTTH-1, 80, BUTTH, +@@ -415,7 +425,11 @@ + + + /**************************************************/ +-METHODDEF void xv_error_exit(cinfo) ++#if JPEG_LIB_VERSION > 60 ++METHODDEF(void) xv_error_exit(cinfo) ++#else ++METHODDEF void xv_error_exit(cinfo) ++#endif + j_common_ptr cinfo; + { + my_error_ptr myerr; +@@ -427,7 +441,11 @@ + + + /**************************************************/ +-METHODDEF void xv_error_output(cinfo) ++#if JPEG_LIB_VERSION > 60 ++METHODDEF(void) xv_error_output(cinfo) ++#else ++METHODDEF void xv_error_output(cinfo) ++#endif + j_common_ptr cinfo; + { + my_error_ptr myerr; +@@ -441,7 +459,11 @@ + + + /**************************************************/ +-METHODDEF void xv_prog_meter(cinfo) ++#if JPEG_LIB_VERSION > 60 ++METHODDEF(void) xv_prog_meter(cinfo) ++#else ++METHODDEF void xv_prog_meter(cinfo) ++#endif + j_common_ptr cinfo; + { + struct jpeg_progress_mgr *prog; +@@ -706,7 +728,11 @@ + + + /**************************************************/ +-METHODDEF boolean xv_process_comment(cinfo) ++#if JPEG_LIB_VERSION > 60 ++METHODDEF(boolean) xv_process_comment(cinfo) ++#else ++METHODDEF boolean xv_process_comment(cinfo) ++#endif + j_decompress_ptr cinfo; + { + int length, hasnull; +@@ -794,8 +820,8 @@ + + + jpeg_set_defaults(&cinfo); +- jpeg_set_quality(&cinfo, qDial.val, TRUE); +- cinfo.smoothing_factor = smDial.val; ++ jpeg_set_quality(&cinfo, (int)qDial.val, TRUE); ++ cinfo.smoothing_factor = (int)smDial.val; + + + jpeg_start_compress(&cinfo, TRUE); +@@ -804,7 +830,7 @@ + /*** COMMENT HANDLING ***/ + + sprintf(xvcmt, "%sXV %s Quality = %d, Smoothing = %d\n", +- CREATOR_STR, REVDATE, qDial.val, smDial.val); ++ CREATOR_STR, REVDATE, (int)qDial.val, (int)smDial.val); + + if (picComments) { /* append XV comment */ + char *sp, *sp1; int done; +@@ -866,4 +892,27 @@ + + + ++ ++/*******************************************/ ++void ++VersionInfoJPEG() /* GRR 19980605, 19980607 */ ++{ ++ int major = JPEG_LIB_VERSION / 10; ++ int minor = JPEG_LIB_VERSION % 10; ++ char minoralpha[2]; ++ ++ if (minor) { ++ minoralpha[0] = (char)(minor - 1 + 'a'); ++ minoralpha[1] = '\0'; ++ } else ++ minoralpha[0] = '\0'; ++ ++/* fprintf(stderr, " Compiled with libjpeg %d.%d.\n", major, minor); */ ++ fprintf(stderr, " Compiled with libjpeg %d%s.\n", major, minoralpha); ++} ++ ++ ++ ++ ++ + #endif /* HAVE_JPEG */ +diff -ruN xv-3.10a-bugfixes/xvmag.c xv-3.10a-enhancements/xvmag.c +--- xv-3.10a-bugfixes/xvmag.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvmag.c 2005-04-17 22:56:58.000000000 -0700 +@@ -0,0 +1,866 @@ ++/* ++ * xvmag.c - load routine for `MAG' format pictures. ++ * ++ * The `MAG' format is used by many Japanese personal computer users. ++ * This program is based on MAGBIBLE.DOC which is the specification ++ * for `MAG' format written by Woody RINN. It is written in Japanese, ++ * and exists in some anon-ftp sites. ++ */ ++ ++#include "xv.h" ++#include <setjmp.h> ++ ++#ifdef HAVE_MAG ++ ++typedef unsigned short data16; ++ ++struct mag { ++ jmp_buf jmp; ++ FILE *fp; ++ long fsize; ++ int m_256, m_dig, m_8, m_200; ++ int x1, y1, x2, y2, left_pad, right_pad; ++ int p_width, p_height, width, height; ++ long h_off, a_off, a_size, b_off, b_size, p_off, p_size; ++ byte *a, *b, *p; ++}; ++ ++static void mag_open_file PARM((struct mag*, char*)); ++static void mag_read_check_data PARM((struct mag*)); ++static void mag_read_comment PARM((struct mag*, char**)); ++static void mag_read_header PARM((struct mag*)); ++static void mag_read_palette PARM((struct mag*, byte*, byte*, byte*)); ++static void mag_read_flags PARM((struct mag*)); ++static void mag_read_pixel_data PARM((struct mag*)); ++static void mag_expand_body PARM((struct mag*, byte**)); ++ ++static void mag_compress_data PARM((struct mag*, byte*)); ++static void mag_write_check_data PARM((struct mag*)); ++static void mag_write_comment PARM((struct mag*, char *)); ++static void mag_write_palette PARM((struct mag*, int, ++ byte*, byte*, byte*, int)); ++static void mag_write_flags PARM((struct mag*)); ++static void mag_write_pixel_data PARM((struct mag*)); ++static void mag_write_header PARM((struct mag*)); ++static void mag_set_double_word PARM((long, byte *)); ++ ++static void mag_init_info PARM((struct mag*)); ++static void mag_cleanup_mag_info PARM((struct mag*, int)); ++static void mag_cleanup_pinfo PARM((PICINFO*)); ++static void mag_memory_error PARM((char*, char*)); ++static void mag_error PARM((struct mag*, int)); ++static void mag_file_error PARM((struct mag*, int)); ++static void mag_file_warning PARM((struct mag*, int)); ++static void mag_show_struct PARM((struct mag*)); ++static void *mag_malloc PARM((size_t, char*)); ++static void *mag_realloc PARM((void*, size_t, char*)); ++ ++ ++static char *mag_id = "MAKI02 "; ++static struct{ ++ int dx, dy; ++}points[16] = { ++ { 0, 0}, { 1, 0}, { 2, 0}, { 4, 0}, ++ { 0, 1}, { 1, 1}, ++ { 0, 2}, { 1, 2}, { 2, 2}, ++ { 0, 4}, { 1, 4}, { 2, 4}, ++ { 0, 8}, { 1, 8}, { 2, 8}, ++ { 0, 16}, ++}; ++static int try[15] = {1, 4, 5, 6, 7, 9, 10, 2, 8, 11, 12, 13, 14, 3, 15}; ++ ++static char *mag_msgs[] = { ++ NULL, ++#define MAG_OPEN 1 ++ "can't open file", ++#define MAG_CORRUPT 2 ++ "file currupted.", ++#define MAG_FORMAT 3 ++ "not MAG format.", ++#define MAG_WRITE 4 ++ "write failed.", ++}; ++ ++ ++#define H4(x) (((int) (x) >> 4) & 0x0f) /* operates on a byte */ ++#define L4(x) ((x) & 0x0f) ++#define H8(x) (((x) >> 8) & 0xff) /* operates on a data16 */ ++#define L8(x) ((x) & 0xff) ++ ++#define error(msgnum) longjmp(mi->jmp, msgnum) ++ ++ ++/* The main routine to load a MAG file. */ ++int LoadMAG(fname, pinfo) ++ char *fname; ++ PICINFO *pinfo; ++{ ++ struct mag mag; ++ int e; ++ ++ if(DEBUG) fputs("LoadMAG:\n", stderr); ++ ++ pinfo->comment = NULL; ++ mag_init_info(&mag); ++ if((e = setjmp(mag.jmp)) != 0){ ++ /* When an error occurs, comes here. */ ++ mag_cleanup_mag_info(&mag, 0); ++ mag_cleanup_pinfo(pinfo); ++ return 0; ++ } ++ ++ mag_open_file(&mag, fname); ++ mag_read_check_data(&mag); ++ mag_read_comment(&mag, &pinfo->comment); ++ mag_read_header(&mag); ++ mag_read_palette(&mag, pinfo->r, pinfo->g, pinfo->b); ++ mag_read_flags(&mag); ++ mag_read_pixel_data(&mag); ++ mag_expand_body(&mag, &pinfo->pic); ++ ++ pinfo->w = pinfo->normw = mag.width; ++ pinfo->h = pinfo->normh = mag.height; ++ pinfo->type = PIC8; ++ pinfo->frmType = F_MAG; ++ pinfo->colType = F_FULLCOLOR; ++ sprintf(pinfo->fullInfo, "MAG, %d colors%s (%ld bytes)", ++ mag.m_256 ? 256 : (mag.m_8 ? 8 : 16), ++ mag.m_200 ? ", aspect 0.5" : "", mag.fsize); ++ sprintf(pinfo->shrtInfo, "%dx%d MAG", mag.width, mag.height); ++ if(mag.m_200) ++ normaspect = 0.5; ++ ++ mag_cleanup_mag_info(&mag, 0); ++ return 1; ++} ++ ++static void mag_open_file(mi, fname) ++ struct mag *mi; ++ char *fname; ++{ ++ if((mi->fp = fopen(fname, "rb")) == NULL) ++ mag_file_error(mi, MAG_OPEN); ++ fseek(mi->fp, (size_t) 0, SEEK_END); ++ mi->fsize = ftell(mi->fp); ++ fseek(mi->fp, (size_t) 0, SEEK_SET); ++} ++ ++static void mag_read_check_data(mi) ++ struct mag *mi; ++{ ++ char buffer[8]; ++ ++ if(fread(buffer, (size_t) 8, (size_t) 1, mi->fp) != 1) ++ mag_file_error(mi, MAG_CORRUPT); ++ if(strncmp(buffer, mag_id, (size_t) 8) != 0) ++ mag_error(mi, MAG_FORMAT); ++} ++ ++static void mag_read_comment(mi, p) ++ struct mag *mi; ++ char **p; ++{ ++ int max = -1, i = 0; ++ int c; ++ ++ while((c = fgetc(mi->fp)) != EOF){ ++ if(c == 0x1a) ++ break; ++ if(max < i){ ++ max += 16; ++ *p = mag_realloc(*p, (size_t) max + 1, "mag_read_comment#1"); ++ } ++ (*p)[i++] = c; ++ } ++ ++ if(c == EOF) ++ mag_file_error(mi, MAG_CORRUPT); ++ ++ if(max < i){ ++ *p = mag_realloc(*p, (size_t) max + 2, "mag_read_comment#2"); ++ } ++ if(i > 24){ ++ (*p)[i] = '\0'; ++ strcpy(*p, &(*p)[24]); ++ }else{ ++ (*p)[0] = '\0'; ++ } ++} ++ ++static void mag_read_header(mi) ++ struct mag *mi; ++{ ++ byte buf[32]; ++ ++ mi->h_off = ftell(mi->fp); ++ ++ if(fread(buf, (size_t) 32, (size_t) 1, mi->fp) != 1) ++ mag_file_error(mi, MAG_CORRUPT); ++ ++ mi->m_256 = buf[3] & 0x80; ++ mi->m_dig = buf[3] & 0x04; ++ mi->m_8 = buf[3] & 0x02; ++ mi->m_200 = buf[3] & 0x01; ++ ++ mi->x1 = buf[ 4] + buf[ 5] * 256; ++ mi->y1 = buf[ 6] + buf[ 7] * 256; ++ mi->x2 = buf[ 8] + buf[ 9] * 256; ++ mi->y2 = buf[10] + buf[11] * 256; ++ ++#define get_dword(a, b, c, d) \ ++ ((long)(a) << 24 | (long)(b) << 16 | (long)(c) << 8 | (long)(d)) ++ ++ mi->a_off = get_dword(buf[15], buf[14], buf[13], buf[12]); ++ mi->b_off = get_dword(buf[19], buf[18], buf[17], buf[16]); ++ mi->b_size = get_dword(buf[23], buf[22], buf[21], buf[20]); ++ mi->p_off = get_dword(buf[27], buf[26], buf[25], buf[24]); ++ mi->p_size = get_dword(buf[31], buf[30], buf[29], buf[28]); ++#undef get_dword ++ ++ mi->a_size = mi->b_off - mi->a_off; ++ mi->a_off += mi->h_off; ++ mi->b_off += mi->h_off; ++ mi->p_off += mi->h_off; ++ ++ mi->width = mi->x2 - mi->x1 + 1; ++ mi->height = mi->y2 - mi->y1 + 1; ++ mi->left_pad = mi->x1 & 07; ++ mi->right_pad = 07 - (mi->x2 & 07); ++ mi->x1 -= mi->left_pad; /* x1 = 8m */ ++ mi->x2 += mi->right_pad; /* x2 = 8n+7 */ ++ mi->p_width = ((mi->x2 + 1) - mi->x1) / (mi->m_256 ? 2 : 4); ++ mi->p_height = (mi->y2 + 1) - mi->y1; ++ ++ if(DEBUG) mag_show_struct(mi); ++} ++ ++static void mag_read_palette(mi, r, g, b) ++ struct mag *mi; ++ byte *r, *g, *b; ++{ ++ int num_palettes; ++ byte *buf; ++ ++ if(mi->m_256) ++ num_palettes = 256; ++ else ++ num_palettes = 16; ++ ++ buf = mag_malloc((size_t)num_palettes * 3, "mag_read_palette"); ++ ++ if(fread(buf, (size_t) 3, (size_t) num_palettes, mi->fp) != num_palettes){ ++ free(buf); ++ mag_file_error(mi, MAG_CORRUPT); ++ } ++ ++ for(num_palettes--; num_palettes >= 0; num_palettes--){ ++ g[num_palettes] = buf[num_palettes * 3 ]; ++ r[num_palettes] = buf[num_palettes * 3 + 1]; ++ b[num_palettes] = buf[num_palettes * 3 + 2]; ++ } ++ ++ free(buf); ++} ++ ++static void mag_read_flags(mi) ++ struct mag *mi; ++{ ++ mi->a = mag_malloc((size_t) mi->a_size, "mag_read_flags#1"); ++ mi->b = mag_malloc((size_t) mi->b_size, "mag_read_flags#2"); ++ ++ fseek(mi->fp, mi->a_off, SEEK_SET); ++ if(fread(mi->a, (size_t) mi->a_size, (size_t) 1, mi->fp) != 1) ++ mag_file_warning(mi, MAG_CORRUPT); ++ if(fread(mi->b, (size_t) mi->b_size, (size_t) 1, mi->fp) != 1) ++ mag_file_warning(mi, MAG_CORRUPT); ++} ++ ++static void mag_read_pixel_data(mi) ++ struct mag *mi; ++{ ++ mi->p = mag_malloc((size_t) mi->p_size, "mag_read_pixel_data"); ++ ++ fseek(mi->fp, mi->p_off, SEEK_SET); ++ if(fread(mi->p, (size_t) mi->p_size, (size_t) 1, mi->fp) != 1) ++ mag_file_warning(mi, MAG_CORRUPT); ++} ++ ++/* MAG expanding routine */ ++static void mag_expand_body(mi, pic0) ++ struct mag *mi; ++ byte **pic0; ++{ ++ int ai, bi, fi, pi; ++ int px, py, x, y; ++ byte *flag; ++ byte mask; ++ data16 *pixel0; ++ ++ flag = mag_malloc((size_t) mi->p_width / 2, "mag_expand_body#1"); ++ *pic0 = mag_malloc((size_t) mi->width * mi->height, "mag_expand_body#2"); // GRR POSSIBLE OVERFLOW / FIXME ++ pixel0 = mag_malloc((size_t) 2 * mi->p_width * 17, "mag_expand_body#3"); // GRR POSSIBLE OVERFLOW / FIXME ++ ++#define pixel(x, y) pixel0[(y) % 17 * mi->p_width + (x)] ++ ++ ai = bi = pi = 0; ++ mask = 0x80; ++ for(y = py = 0; py < mi->p_height; py++){ ++ for(fi = 0; fi < mi->p_width / 2; fi++){ ++ if(py == 0){ ++ if(mi->a[ai] & mask) ++ flag[fi] = mi->b[bi++]; ++ else ++ flag[fi] = 0; ++ }else{ ++ if(mi->a[ai] & mask) ++ flag[fi] ^= mi->b[bi++]; ++ } ++ if((mask >>= 1) == 0){ ++ mask = 0x80; ++ ai++; ++ } ++ } ++ ++ for(px = fi = 0; fi < mi->p_width / 2; fi++){ ++ int f = H4(flag[fi]); ++ if(f == 0){ ++ pixel(px, py) = mi->p[pi] + mi->p[pi + 1] * 256; ++ px++; ++ pi+=2; ++ }else{ ++ int dx = points[f].dx, dy = points[f].dy; ++ pixel(px, py) = pixel(px - dx, py - dy); ++ px++; ++ } ++ ++ f = L4(flag[fi]); ++ if(f == 0){ ++ pixel(px, py) = mi->p[pi] + mi->p[pi + 1] * 256; ++ px++; ++ pi+=2; ++ }else{ ++ int dx = points[f].dx, dy = points[f].dy; ++ pixel(px, py) = pixel(px - dx, py - dy); ++ px++; ++ } ++ } ++ ++#define inside(x) ((unsigned int)(x) < mi->width) ++#define pic(x, y) (*pic0)[(y) * mi->width + (x)] ++ for(x = -mi->left_pad, px = 0; px < mi->p_width; px++){ ++ data16 p = pixel(px, py); ++ if(mi->m_256){ ++ if(inside(x)) ++ pic(x, y) = L8(p); ++ x++; ++ if(inside(x)) ++ pic(x, y) = H8(p); ++ x++; ++ }else{ ++ if(inside(x)) ++ pic(x, y) = H4(L8(p)); ++ x++; ++ if(inside(x)) ++ pic(x, y) = L4(L8(p)); ++ x++; ++ if(inside(x)) ++ pic(x, y) = H4(H8(p)); ++ x++; ++ if(inside(x)) ++ pic(x, y) = L4(H8(p)); ++ x++; ++ } ++ } ++ y++; ++ } ++#undef pic ++#undef inside ++#undef pixel ++ ++ free(flag); ++ free(pixel0); ++} ++ ++ ++/* The main routine to write a MAG file. */ ++int WriteMAG(fp, pic, ptype, w, h, rmap, gmap, bmap, numcols, colorstyle, ++ comment) ++ FILE *fp; ++ byte *pic; ++ int ptype, w, h; ++ byte *rmap, *gmap, *bmap; ++ int numcols, colorstyle; ++ char *comment; ++{ ++ byte rtemp[256], gtemp[256], btemp[256]; ++ struct mag mag; ++ int e; ++ ++ if(DEBUG) fputs("WriteMag\n", stderr); ++ ++ mag_init_info(&mag); ++ mag.fp = fp; ++ ++ if(ptype == PIC24){ ++ if(!(pic = Conv24to8(pic, w, h, 256, rtemp, gtemp, btemp))) ++ mag_memory_error("Conv24to8", "WriteMAG"); ++ rmap = rtemp; ++ gmap = gtemp; ++ bmap = btemp; ++ numcols = 256; ++ mag.m_256 = 1; ++ }else{ ++ if(numcols > 16) ++ mag.m_256 = 1; ++ } ++ ++ if((e = setjmp(mag.jmp)) != 0){ ++ /* When an error occurs, comes here. */ ++ mag_cleanup_mag_info(&mag, 1); ++ return -1; ++ } ++ ++ mag.x2 = w - 1; ++ mag.y2 = h - 1; ++ mag.right_pad = 07 - (mag.x2 & 07); ++ mag.p_width = (w + mag.right_pad) / (mag.m_256 ? 2 : 4); ++ mag.p_height = h; ++ mag.width = w; ++ mag.height = h; ++ mag.a_size = (mag.p_width * mag.p_height + 15) / 16; /* x/2/8 */ // GRR POSSIBLE OVERFLOW / FIXME ++ if(mag.a_size % 2) ++ mag.a_size++; ++ ++ mag_compress_data(&mag, pic); ++ mag_write_check_data(&mag); ++ mag_write_comment(&mag, comment); ++ ++ mag.h_off = ftell(mag.fp); ++ ++ mag_write_palette(&mag, numcols, rmap, gmap, bmap, ++ colorstyle == F_GREYSCALE); ++ mag_write_flags(&mag); ++ mag_write_pixel_data(&mag); ++ mag_write_header(&mag); ++ ++ mag_cleanup_mag_info(&mag, 1); ++ return 0; ++} ++ ++/* MAG compressing routine */ ++static void mag_compress_data(mi, pic0) ++ struct mag *mi; ++ byte *pic0; ++{ ++ int ai, bi, pi, i; ++ int bmax, pmax; ++ byte mask; ++ byte *flag0; ++ data16 *pixel0; ++ int px, py, x, y; ++ ++ pixel0 = mag_malloc((size_t) 2 * mi->p_width * mi->p_height, // GRR POSSIBLE OVERFLOW / FIXME ++ "mag_compress_data#1"); ++ flag0 = mag_malloc((size_t) mi->p_width * mi->p_height, // GRR POSSIBLE OVERFLOW / FIXME ++ "mag_compress_data#2"); ++ ++#define pic(x, y) pic0[(y) * mi->width + (x)] ++ /* convert dots to pixels */ ++ i = 0; ++ for(y = py = 0; py < mi->p_height; py++){ ++ for(x = px = 0; px < mi->p_width; px++){ ++ data16 p = 0; ++ if(mi->m_256){ ++ if(x < mi->width) ++ p += pic(x, y); ++ x++; ++ if(x < mi->width) ++ p += pic(x, y) * 256; ++ x++; ++ }else{ ++ if(x < mi->width) ++ p += pic(x, y) * 16; ++ x++; ++ if(x < mi->width) ++ p += pic(x, y); ++ x++; ++ if(x < mi->width) ++ p += pic(x, y) * 4096; ++ x++; ++ if(x < mi->width) ++ p += pic(x, y) * 256; ++ x++; ++ } ++ pixel0[i++] = p; ++ } ++ y++; ++ } ++#undef pic ++ ++#define pixel(x, y) pixel0[(y) * mi->p_width + (x)] ++#define flag(x, y) flag0[(y) * mi->p_width + (x)] ++ /* get flags */ ++ pmax = pi = 0; ++ for(py = 0; py < mi->p_height; py++){ ++ for(px = 0; px < mi->p_width; px++){ ++ int t; ++ for(t = 0; t < 15; t++){ ++ int dx = points[try[t]].dx, dy = points[try[t]].dy; ++ if(dx <= px && dy <= py){ ++ if(pixel(px - dx, py - dy) == pixel(px, py)) ++ break; ++ } ++ } ++ if(t < 15){ ++ flag(px, py) = try[t]; ++ }else{ ++ flag(px, py) = 0; ++ if(pmax <= pi + 1){ ++ pmax += 128; ++ mi->p = mag_realloc(mi->p, (size_t) pmax, ++ "mag_compress_data#3"); ++ } ++ mi->p[pi++] = L8(pixel(px, py)); ++ mi->p[pi++] = H8(pixel(px, py)); ++ } ++ } ++ } ++#undef flag ++#undef pixel ++ ++ /* pack 2 flags into 1 byte */ ++ for(i = 0; i < mi->p_width / 2 * mi->p_height; i++) ++ flag0[i] = flag0[i * 2] * 16 + flag0[i * 2 + 1]; ++ ++#define flag(x, y) flag0[(y) * mi->p_width / 2 + (x)] ++ for(py = mi->p_height - 1; py >= 1; py--){ ++ for(px = 0; px < mi->p_width / 2; px++) ++ flag(px, py) ^= flag(px, py - 1); ++ } ++#undef flag ++ ++ mask = 0x80; ++ ai = bi = bmax = 0; ++ mi->a = mag_malloc((size_t) mi->a_size, "mag_compress_data#4"); // GRR POSSIBLE OVERFLOW / FIXME ++ for(i = 0; i < mi->p_width / 2 * mi->p_height; i++){ ++ if(flag0[i] == 0){ ++ mi->a[ai] &= ~mask; ++ }else{ ++ if(bmax == bi){ ++ bmax += 128; ++ mi->b = mag_realloc(mi->b, (size_t) bmax, ++ "mag_compress_data#4"); ++ } ++ mi->b[bi++] = flag0[i]; ++ mi->a[ai] |= mask; ++ } ++ ++ if((mask >>= 1) == 0){ ++ mask = 0x80; ++ ai++; ++ } ++ } ++ ++ if(bi % 2) ++ bi++; ++ mi->b_size = bi; ++ ++ mi->p_size = pi; ++ ++ free(pixel0); ++ free(flag0); ++} ++ ++static void mag_write_check_data(mi) ++ struct mag *mi; ++{ ++ if(fwrite(mag_id, (size_t) 8, (size_t) 1, mi->fp) != 1) ++ mag_file_error(mi, MAG_WRITE); ++} ++ ++static void mag_write_comment(mi, comment) ++ struct mag *mi; ++ char *comment; ++{ ++ char *p; ++ int i; ++ ++ if(fputs("XV ", mi->fp) == EOF) ++ mag_file_error(mi, MAG_WRITE); ++ ++ if((p = (char *) getenv("USER")) == NULL) ++ p = "????????"; ++ for(i = 5; i < 24; i++){ ++ if(*p == '\0') ++ break; ++ if(fputc(*p++, mi->fp) == EOF) ++ mag_file_error(mi, MAG_WRITE); ++ } ++ for( ; i < 24; i++){ ++ if(fputc(' ', mi->fp) == EOF) ++ mag_file_error(mi, MAG_WRITE); ++ } ++ ++ if(comment){ ++ int l = strlen(comment); ++ if(l > 0){ ++ int i; ++ for(i = 0; i < l; i++){ ++ if(comment[i] == 0x1a) ++ comment[i] = ' '; ++ } ++ if(fwrite(comment, (size_t) l, (size_t) 1, mi->fp) != 1) ++ mag_file_error(mi, MAG_WRITE); ++ } ++ } ++ ++ if(fputc(0x1a, mi->fp) == EOF) ++ mag_file_error(mi, MAG_WRITE); ++} ++ ++static void mag_write_palette(mi, num, r, g, b, grey) ++ struct mag *mi; ++ int num; ++ byte *r, *g, *b; ++ int grey; ++{ ++ int i, left; ++ char buf[3]; ++ ++ fseek(mi->fp, 32L, SEEK_CUR); /* skip header area */ ++ for(i = 0; i < num; i++){ ++ buf[0] = *g++; ++ buf[1] = *r++; ++ buf[2] = *b++; ++ if(grey) ++ buf[0] = buf[1] = buf[2] = MONO(buf[1], buf[0], buf[2]); ++ if(fwrite(buf, (size_t) 3, (size_t) 1, mi->fp) != 1) ++ mag_file_error(mi, MAG_WRITE); ++ } ++ if(num < 16){ ++ left = 16 - num; ++ }else if(num == 16){ ++ left = 0; ++ }else if(num < 256){ ++ left = 256 - num; ++ }else if(num == 256){ ++ left = 0; ++ }else ++ left = 0; /* shouldn't happen */ ++ ++ if(left > 0){ ++ for(i = 0; i < left; i++){ ++ if(fwrite(buf, (size_t) 3, (size_t) 1, mi->fp) != 1) ++ mag_file_error(mi, MAG_WRITE); ++ } ++ } ++} ++ ++static void mag_write_flags(mi) ++ struct mag *mi; ++{ ++ int i; ++ ++ mi->a_off = ftell(mi->fp); ++ for(i = 0; i < mi->a_size; i++){ ++ if(fputc(mi->a[i], mi->fp) == EOF) ++ mag_file_error(mi, MAG_WRITE); ++ } ++ ++ mi->b_off = ftell(mi->fp); ++ for(i = 0; i < mi->b_size; i++){ ++ if(fputc(mi->b[i], mi->fp) == EOF) ++ mag_file_error(mi, MAG_WRITE); ++ } ++} ++ ++static void mag_write_pixel_data(mi) ++ struct mag *mi; ++{ ++ int i; ++ ++ mi->p_off = ftell(mi->fp); ++ for(i = 0; i < mi->p_size; i++){ ++ if(fputc(mi->p[i], mi->fp) == EOF) ++ mag_file_error(mi, MAG_WRITE); ++ } ++} ++ ++static void mag_write_header(mi) ++ struct mag *mi; ++{ ++ byte buf[32]; ++ ++ if(DEBUG) mag_show_struct(mi); ++ ++ mi->a_off -= mi->h_off; ++ mi->b_off -= mi->h_off; ++ mi->p_off -= mi->h_off; ++ ++ buf[ 0] = buf[1] = buf[2] = 0; ++ buf[ 3] = (mi->m_256 ? 0x80 : 0); ++ buf[ 4] = buf[5] = 0; ++ buf[ 6] = buf[7] = 0; ++ buf[ 8] = L8(mi->x2); ++ buf[ 9] = H8(mi->x2); ++ buf[10] = L8(mi->y2); ++ buf[11] = H8(mi->y2); ++ mag_set_double_word(mi->a_off, &buf[12]); ++ mag_set_double_word(mi->b_off, &buf[16]); ++ mag_set_double_word(mi->b_size, &buf[20]); ++ mag_set_double_word(mi->p_off, &buf[24]); ++ mag_set_double_word(mi->p_size, &buf[28]); ++ ++ fseek(mi->fp, mi->h_off, SEEK_SET); ++ if(fwrite(buf, (size_t) 32, (size_t) 1, mi->fp) != 1) ++ mag_file_error(mi, MAG_WRITE); ++} ++ ++static void mag_set_double_word(n, p) ++ long n; ++ byte *p; ++{ ++ p[0] = n % 256; /* ugly...anything wrong with shift/mask operations? */ ++ p[1] = n / 256 % 256; /* (n >> 8) & 0xff */ ++ p[2] = n / 256 / 256 % 256; /* (n >> 16) & 0xff */ ++ p[3] = n / 256 / 256 / 256 % 256; /* (n >> 24) & 0xff */ ++} ++ ++/* ++ * The routines to initialize or clean up. ++ * mag_init_info: ++ * initializes a mag structure. ++ * mag_cleanup_mag_info: ++ * cleans up a mag structure. ++ * mag_cleanup_pinfo: ++ * cleans up a PICINFO structure. ++ */ ++static void mag_init_info(mi) ++ struct mag *mi; ++{ ++ mi->fp = NULL; ++ mi->fsize = 0; ++ mi->m_256 = mi->m_dig = mi->m_8 = mi->m_200 = 0; ++ mi->x1 = mi->y1 = mi->x2 = mi->y2 = 0; ++ mi->left_pad = mi->right_pad = 0; ++ mi->p_width = mi->p_height = mi->width = mi->height = 0; ++ mi->h_off = mi->p_off = mi->p_size = 0; ++ mi->a_off = mi->a_size = mi->b_off = mi->b_size = 0; ++ mi->a = NULL; ++ mi->b = NULL; ++ mi->p = NULL; ++} ++ ++static void mag_cleanup_mag_info(mi, writing) ++ struct mag *mi; ++ int writing; ++{ ++ if(mi->fp && !writing) ++ fclose(mi->fp); ++ if(mi->a) ++ free(mi->a); ++ if(mi->b) ++ free(mi->b); ++ if(mi->p) ++ free(mi->p); ++} ++ ++static void mag_cleanup_pinfo(pinfo) ++ PICINFO *pinfo; ++{ ++ if(pinfo->comment){ ++ free(pinfo->comment); ++ pinfo->comment = NULL; ++ } ++ if(pinfo->pic){ ++ free(pinfo->pic); ++ pinfo->pic = NULL; ++ } ++} ++ ++/* ++ * Error handler. ++ * mag_memory_error: ++ * shows an error message, and terminates. ++ * mag_error: ++ * shows an non-file error message, and jumps to the entry for errors. ++ * mag_file_error: ++ * shows an file error message, and jumps to the entry for errors. ++ * mag_file_warning: ++ * shows an file warning message. ++ */ ++static void mag_memory_error(scm, fn) ++ char *scm, *fn; ++{ ++ char buf[128]; ++ sprintf(buf, "%s: can't allocate memory. (%s)", scm, fn); ++ FatalError(buf); ++} ++ ++static void mag_error(mi, mn) ++ struct mag *mi; ++ int mn; ++{ ++ SetISTR(ISTR_WARNING, "%s", mag_msgs[mn]); ++ longjmp(mi->jmp, 1); ++} ++ ++static void mag_file_error(mi, mn) ++ struct mag *mi; ++ int mn; ++{ ++ if(feof(mi->fp)) ++ SetISTR(ISTR_WARNING, "%s (end of file)", mag_msgs[mn]); ++ else ++ SetISTR(ISTR_WARNING, "%s (%s)", mag_msgs[mn], ERRSTR(errno)); ++ longjmp(mi->jmp, 1); ++} ++ ++static void mag_file_warning(mi, mn) ++ struct mag *mi; ++ int mn; ++{ ++ if(feof(mi->fp)) ++ SetISTR(ISTR_WARNING, "%s (end of file)", mag_msgs[mn]); ++ else ++ SetISTR(ISTR_WARNING, "%s (%s)", mag_msgs[mn], ERRSTR(errno)); ++} ++ ++static void mag_show_struct (mi) ++ struct mag *mi; ++{ ++ fprintf(stderr, " 256 colors: %s\n", mi->m_256 ? "true" : "false"); ++ fprintf(stderr, " 8 colors: %s\n", mi->m_8 ? "true" : "false"); ++ fprintf(stderr, " digital colors: %s\n", mi->m_dig ? "true" : "false"); ++ fprintf(stderr, " aspect ratio: %f\n", mi->m_200 ? 0.5 : 1.0); ++ fprintf(stderr, " image size: %dx%d\n", mi->width, mi->height); ++ fprintf(stderr, " left pad: %d\n", mi->left_pad); ++ fprintf(stderr, " right pad: %d\n", mi->right_pad); ++ fprintf(stderr, " h_off: %ld\n", mi->h_off); ++ fprintf(stderr, " A: off:%ld, size:%ld\n", mi->a_off, mi->a_size); ++ fprintf(stderr, " B: off:%ld, size:%ld\n", mi->b_off, mi->b_size); ++ fprintf(stderr, " P: off:%ld, size:%ld\n", mi->p_off, mi->p_size); ++} ++ ++/* Memory related routines. */ ++static void *mag_malloc(n, fn) ++ size_t n; ++ char *fn; ++{ ++ void *r = (void *) malloc(n); ++ if(r == NULL) ++ mag_memory_error("malloc", fn); ++ return r; ++} ++ ++static void *mag_realloc(p, n, fn) ++ void *p; ++ size_t n; ++ char *fn; ++{ ++ void *r = (p == NULL) ? (void *) malloc(n) : (void *) realloc(p, n); ++ if(r == NULL) ++ mag_memory_error("realloc", fn); ++ return r; ++} ++#endif /* HAVE_MAG */ +diff -ruN xv-3.10a-bugfixes/xvmaki.c xv-3.10a-enhancements/xvmaki.c +--- xv-3.10a-bugfixes/xvmaki.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvmaki.c 2005-04-17 22:57:01.000000000 -0700 +@@ -0,0 +1,794 @@ ++/* ++ * xvmaki.c - load routine for `MAKI' format pictures. ++ * ++ * The `MAKI' format was used by some Japanese personal computer users. ++ */ ++ ++#include "xv.h" ++#include <setjmp.h> ++ ++#ifdef HAVE_MAKI ++ ++typedef unsigned short data16; ++typedef unsigned int data32; ++ ++struct maki_info { ++ jmp_buf jmp; ++ FILE *fp; ++ long fsize; ++ int x0, y0, x1, y1; ++ int width, height; ++ float aspect; ++ long fb_size; ++ long pa_size, pb_size; ++ int m_maki01b, m_200, m_dig8; ++ data16 ext_flag; ++ byte *fa, *fb, *pa, *pb; ++ byte *vs; ++ int numcols; ++ byte *forma, *formb; ++}; ++ ++ ++static void maki_open_file PARM((struct maki_info*, char*)); ++static void maki_check_id PARM((struct maki_info*)); ++static void maki_skip_comment PARM((struct maki_info*)); ++static void maki_read_header PARM((struct maki_info*)); ++static void maki_read_palette PARM((struct maki_info*, ++ byte*, byte*, byte*)); ++static void maki_read_flags PARM((struct maki_info*)); ++static void maki_read_pixel_data PARM((struct maki_info*)); ++static void maki_expand_virtual_screen PARM((struct maki_info*)); ++static void maki_expand_pixel_data PARM((struct maki_info*, byte**)); ++static void maki_init_info PARM((struct maki_info*)); ++ ++static void maki_make_pixel_data PARM((struct maki_info*, byte*)); ++static void maki_make_virtual_screen PARM((struct maki_info*)); ++static void maki_make_flags PARM((struct maki_info*)); ++static void maki_write_check_id PARM((struct maki_info*)); ++static void maki_write_comment PARM((struct maki_info*)); ++static void maki_write_header PARM((struct maki_info*)); ++static void maki_write_palette PARM((struct maki_info*, ++ byte*, byte*, byte*, int)); ++static void maki_write_flags PARM((struct maki_info*)); ++static void maki_write_pixel_data PARM((struct maki_info*)); ++ ++static void maki_cleanup_maki_info PARM((struct maki_info*, int)); ++static void maki_cleanup_pinfo PARM((PICINFO*)); ++static void maki_memory_error PARM((char*, char*)); ++static void maki_error PARM((struct maki_info*, int)); ++static void maki_file_error PARM((struct maki_info*, int)); ++static void maki_file_warning PARM((struct maki_info*, int)); ++static void maki_show_maki_info PARM((struct maki_info*)); ++static void *maki_malloc PARM((size_t, char*)); ++static void *maki_realloc PARM((void *, size_t, char*)); ++ ++static char maki_id_a[] = "MAKI01A "; ++static char maki_id_b[] = "MAKI01B "; ++ ++static char *maki_msgs[] = { ++ NULL, ++#define MAKI_OPEN 1 ++ "can't open file.", ++#define MAKI_CORRUPT 2 ++ "file corrupted.", ++#define MAKI_FORMAT 3 ++ "not MAKI format.", ++#define MAKI_BAD_DATA 4 ++ "bad data.", ++#define MAKI_COMMENT 5 ++ "no '^Z' after comment.", ++#define MAKI_SIZE 6 ++ "bad size.", ++#define MAKI_WRITE 7 ++ "write failed.", ++}; ++ ++#define H4(b) ((b) >> 4 & 0xf) ++#define L4(b) ((b) & 0xf) ++#define error(msg_num) longjmp(mi->jmp, msg_num) ++ ++int LoadMAKI(fname, pinfo) ++ char *fname; ++ PICINFO *pinfo; ++{ ++ struct maki_info maki; ++ int e; ++ ++ if(DEBUG) fputs("LoadMAKI:\n", stderr); ++ ++ pinfo->comment = NULL; ++ maki_init_info(&maki); ++ if((e = setjmp(maki.jmp)) != 0){ ++ /* When an error occurs, comes here. */ ++ maki_cleanup_maki_info(&maki, 0); ++ maki_cleanup_pinfo(pinfo); ++ return 0; ++ } ++ ++ maki_open_file(&maki, fname); ++ maki_check_id(&maki); ++ maki_skip_comment(&maki); ++ maki_read_header(&maki); ++ maki_read_palette(&maki, pinfo->r, pinfo->g, pinfo->b); ++ maki_read_flags(&maki); ++ maki_read_pixel_data(&maki); ++ maki_expand_virtual_screen(&maki); ++ maki_expand_pixel_data(&maki, &pinfo->pic); ++ ++ pinfo->w = pinfo->normw = maki.width; ++ pinfo->h = pinfo->normh = maki.height; ++ pinfo->type = PIC8; ++ pinfo->frmType = F_MAKI; ++ pinfo->colType = F_FULLCOLOR; ++ sprintf(pinfo->fullInfo, "MAKI, 16 colors (%ld bytes)", maki.fsize); ++ sprintf(pinfo->shrtInfo, "%dx%d MAKI", maki.width, maki.height); ++ normaspect = maki.aspect; ++ ++ maki_cleanup_maki_info(&maki, 0); ++ return 1; ++} ++ ++static void maki_open_file(mi, fname) ++ struct maki_info *mi; ++ char *fname; ++{ ++ if((mi->fp = fopen(fname, "rb")) == NULL) ++ maki_file_error(mi, MAKI_OPEN); ++ fseek(mi->fp, (size_t) 0, SEEK_END); ++ mi->fsize = ftell(mi->fp); ++ fseek(mi->fp, (size_t) 0, SEEK_SET); ++} ++ ++static void maki_check_id(mi) ++ struct maki_info *mi; ++{ ++ char buf[8]; ++ if(fread(buf, (size_t) 8, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_CORRUPT); ++ if(strncmp(buf, maki_id_a, (size_t) 8) != 0 && ++ strncmp(buf, maki_id_b, (size_t) 8) != 0) ++ maki_error(mi, MAKI_FORMAT); ++ mi->m_maki01b = (buf[6] == 'B'); ++} ++ ++static void maki_skip_comment(mi) ++ struct maki_info *mi; ++{ ++ int i; ++ int c; ++ ++ for(i = 0; i < 24; i++){ ++ if((c = fgetc(mi->fp)) == EOF) ++ maki_file_error(mi, MAKI_CORRUPT); ++ if(c == '\032') /* ^Z, 0x1a */ ++ break; ++ } ++ if(c != '\032') ++ maki_file_error(mi, MAKI_COMMENT); ++ ++ fseek(mi->fp, 32L, SEEK_SET); ++} ++ ++static void maki_read_header(mi) ++ struct maki_info *mi; ++{ ++ byte buf[16]; ++ ++ if(fread(buf, (size_t) 16, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_CORRUPT); ++ ++ mi->fb_size = (long)buf[ 0] << 8 | (long)buf[ 1]; ++ mi->pa_size = (long)buf[ 2] << 8 | (long)buf[ 3]; ++ mi->pb_size = (long)buf[ 4] << 8 | (long)buf[ 5]; ++ mi->ext_flag = (long)buf[ 6] << 8 | (long)buf[ 7]; ++ mi->x0 = (long)buf[ 8] << 8 | (long)buf[ 9]; ++ mi->y0 = (long)buf[10] << 8 | (long)buf[11]; ++ mi->x1 = (long)buf[12] << 8 | (long)buf[13]; ++ mi->y1 = (long)buf[14] << 8 | (long)buf[15]; ++ ++ mi->width = mi->x1-- - mi->x0; ++ mi->height = mi->y1-- - mi->y0; ++ mi->m_200 = mi->ext_flag & 1; ++ mi->m_dig8 = mi->ext_flag & 2; ++ mi->aspect = mi->m_200 ? 0.5 : 1.0; ++ ++ if(DEBUG) maki_show_maki_info(mi); ++} ++ ++static void maki_read_palette(mi, r, g, b) ++ struct maki_info *mi; ++ byte *r, *g, *b; ++{ ++ byte buf[48], *p; ++ ++ if(fread(buf, (size_t) 48, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_CORRUPT); ++ ++ for(p = buf; p < &buf[48]; ){ ++ *g++ = *p++; ++ *r++ = *p++; ++ *b++ = *p++; ++ } ++} ++ ++static void maki_read_flags(mi) ++ struct maki_info *mi; ++{ ++ mi->fa = maki_malloc((size_t) 1000 , "maki_read_flags#1"); ++ mi->fb = maki_malloc((size_t) mi->fb_size, "maki_read_flags#2"); ++ ++ if(fread(mi->fa, (size_t) 1000, (size_t) 1, mi->fp) != 1) ++ maki_file_warning(mi, MAKI_CORRUPT); ++ if(fread(mi->fb, (size_t) mi->fb_size, (size_t) 1, mi->fp) != 1) ++ maki_file_warning(mi, MAKI_CORRUPT); ++} ++ ++static void maki_read_pixel_data(mi) ++ struct maki_info *mi; ++{ ++ mi->pa = maki_malloc((size_t) mi->pa_size, "maki_read_pixel_data#1"); ++ mi->pb = maki_malloc((size_t) mi->pb_size, "maki_read_pixel_data#2"); ++ ++ if(fread(mi->pa, (size_t) mi->pa_size, (size_t) 1, mi->fp) != 1) ++ maki_file_warning(mi, MAKI_CORRUPT); ++ if(fread(mi->pb, (size_t) mi->pb_size, (size_t) 1, mi->fp) != 1) ++ maki_file_warning(mi, MAKI_CORRUPT); ++} ++ ++static void maki_expand_virtual_screen(mi) ++ struct maki_info *mi; ++{ ++ int x, y, fai, fbi; ++ int bpl = mi->width / 2 / 8; /* bytes per line */ ++ byte mask; ++ mi->vs = maki_malloc((size_t) bpl * mi->height, // GRR POSSIBLE OVERFLOW / FIXME ++ "maki_expand_virtual_screen"); ++ ++ fai = fbi = 0; ++ mask = 0x80; ++ for(y = 0; y < mi->height; y += 4){ ++ for(x = 0; x < mi->width / 2; x += 4){ ++ if(mi->fa[fai] & mask){ ++ byte bh, bl; ++ bh = mi->fb[fbi++]; ++ bl = mi->fb[fbi++]; ++ if(x % 8 == 0){ ++ mi->vs[ y * bpl + x / 8] = H4(bh) << 4; ++ mi->vs[(y + 1) * bpl + x / 8] = L4(bh) << 4; ++ mi->vs[(y + 2) * bpl + x / 8] = H4(bl) << 4; ++ mi->vs[(y + 3) * bpl + x / 8] = L4(bl) << 4; ++ }else{ ++ mi->vs[ y * bpl + x / 8] |= H4(bh); ++ mi->vs[(y + 1) * bpl + x / 8] |= L4(bh); ++ mi->vs[(y + 2) * bpl + x / 8] |= H4(bl); ++ mi->vs[(y + 3) * bpl + x / 8] |= L4(bl); ++ } ++ }else{ ++ if(x % 8 == 0){ ++ mi->vs[ y * bpl + x / 8] = 0; ++ mi->vs[(y + 1) * bpl + x / 8] = 0; ++ mi->vs[(y + 2) * bpl + x / 8] = 0; ++ mi->vs[(y + 3) * bpl + x / 8] = 0; ++ }else{ ++/* mi->vs[ y * bpl + x / 8] |= 0; ++ mi->vs[(y + 1) * bpl + x / 8] |= 0; ++ mi->vs[(y + 2) * bpl + x / 8] |= 0; ++ mi->vs[(y + 3) * bpl + x / 8] |= 0; */ ++ } ++ } ++ ++ if((mask >>= 1) == 0){ ++ mask = 0x80; ++ fai++; ++ } ++ } ++ } ++} ++ ++static void maki_expand_pixel_data(mi, pic) ++ struct maki_info *mi; ++ byte **pic; ++{ ++ int x, y; ++ int vsi, pi, max_pi; ++ byte *p; ++ byte mask; ++ int gap; ++ *pic = maki_malloc((size_t) mi->width * mi->height, // GRR POSSIBLE OVERFLOW / FIXME ++ "maki_expand_pixel_data"); ++ ++ vsi = pi = 0; ++ p = mi->pa; ++ max_pi = mi->pa_size - 1; ++ mask = 0x80; ++ for(y = 0; y < mi->height; y++){ ++ for(x = 0; x < mi->width; x += 2){ ++ if(mi->vs[vsi] & mask){ ++ if(pi > max_pi){ ++ if(p == mi->pb) ++ maki_error(mi, MAKI_BAD_DATA); ++ pi = 0; ++ p = mi->pb; ++ max_pi = mi->pb_size - 1; ++ } ++ (*pic)[y * mi->width + x ] = H4(p[pi]); ++ (*pic)[y * mi->width + x + 1] = L4(p[pi]); ++ pi++; ++ }else{ ++ (*pic)[y * mi->width + x ] = 0; ++ (*pic)[y * mi->width + x + 1] = 0; ++ } ++ ++ if((mask >>= 1) == 0){ ++ mask = 0x80; ++ vsi++; ++ } ++ } ++ } ++ ++ gap = mi->m_maki01b ? 4 : 2; ++ ++ for(y = gap; y < mi->height; y++){ ++ for(x = 0; x < mi->width; x++) ++ (*pic)[y * mi->width + x] ^= (*pic)[(y - gap) * mi->width + x]; ++ } ++} ++ ++ ++int WriteMAKI(fp, pic, ptype, w, h, rmap, gmap, bmap, numcols, colorstyle) ++ FILE *fp; ++ byte *pic; ++ int ptype, w, h; ++ byte *rmap, *gmap, *bmap; ++ int numcols, colorstyle; ++{ ++ byte rtemp[256], gtemp[256], btemp[256]; ++ struct maki_info maki, *mi = &maki; ++ int e; ++ ++ if(DEBUG) fputs("WriteMAKI:\n", stderr); ++ ++ maki_init_info(&maki); ++ if((e = setjmp(maki.jmp)) != 0){ ++ /* An error occurs */ ++ maki_cleanup_maki_info(&maki, 1); ++ return -1; ++ } ++ ++ if(w != 640 || h != 400) { ++ char str[512]; ++ sprintf(str,"MAKI: %s Should be 640x400", maki_msgs[MAKI_SIZE]); ++ ErrPopUp(str, "\nBummer!"); ++ maki_error(mi, MAKI_SIZE); ++ } ++ ++ maki.fp = fp; ++ maki.width = w; ++ maki.height = h; ++ maki.x1 = w - 1; ++ maki.y1 = h - 1; ++ ++ if(ptype == PIC24){ ++ if(!(pic = Conv24to8(pic, w, h, 16, rtemp, gtemp, btemp))) ++ maki_memory_error("Conv24to8#1", "WriteMAKI"); ++ rmap = rtemp; ++ gmap = gtemp; ++ bmap = btemp; ++ }else if(numcols > 16){ ++ if(!(pic = Conv8to24(pic, w, h, rmap, gmap, bmap))) ++ maki_memory_error("Conv8to24", "WriteMAKI"); ++ if(!(pic = Conv24to8(pic, w, h, 16, rtemp, gtemp, btemp))) ++ maki_memory_error("Conv24to8#2", "WriteMAKI"); ++ rmap = rtemp; ++ gmap = gtemp; ++ bmap = btemp; ++ }else ++ maki.numcols = numcols; ++ ++ maki_make_pixel_data(&maki, pic); ++ maki_make_virtual_screen(&maki); ++ maki_make_flags(&maki); ++ maki_write_check_id(&maki); ++ maki_write_comment(&maki); ++ maki_write_header(&maki); ++ maki_write_palette(&maki, rmap, gmap, bmap, colorstyle == F_GREYSCALE); ++ maki_write_flags(&maki); ++ maki_write_pixel_data(&maki); ++ ++ maki_cleanup_maki_info(&maki, 1); ++ return 0; ++} ++ ++static void maki_make_pixel_data(mi, pic) ++ struct maki_info *mi; ++ byte *pic; ++{ ++ int x, y, i; ++ int nza, nzb; ++ ++ mi->forma = maki_malloc((size_t) mi->width / 2 * mi->height, // GRR POSSIBLE OVERFLOW / FIXME ++ "maki_make_pixel_data#1"); ++ mi->formb = maki_malloc((size_t) mi->width / 2 * mi->height, // GRR POSSIBLE OVERFLOW / FIXME ++ "maki_make_pixel_data#2"); ++ ++ for(y = 0; y < mi->height; y++){ ++ for(x = 0; x < mi->width; x += 2){ ++ byte b; ++ b = pic[y * mi->width + x] << 4 | pic[y * mi->width + x + 1]; ++ mi->forma[y * mi->width / 2 + x / 2] = b; ++ mi->formb[y * mi->width / 2 + x / 2] = b; ++ } ++ } ++ ++ for(y = mi->height - 1; y >= 2; y--){ ++ for(x = 0; x < mi->width / 2; x++){ ++ mi->forma[y * mi->width / 2 + x] ^= ++ mi->forma[(y - 2) * mi->width / 2 + x]; ++ } ++ } ++ ++ for(y = mi->height - 1; y >= 4; y--){ ++ for(x = 0; x < mi->width / 2; x++){ ++ mi->formb[y * mi->width / 2 + x] ^= ++ mi->formb[(y - 4) * mi->width / 2 + x]; ++ } ++ } ++ ++ nza = nzb = 0; ++ for(i = 0; i < mi->width / 2 * mi->height; i++){ ++ if(mi->forma[i] != 0) ++ nza++; ++ if(mi->formb[i] != 0) ++ nzb++; ++ } ++ if(nza > nzb){ ++ mi->m_maki01b = 1; ++ free(mi->forma); ++ mi->forma = NULL; ++ }else{ ++ mi->m_maki01b = 0; ++ free(mi->formb); ++ mi->formb = NULL; ++ } ++} ++ ++static void maki_make_virtual_screen(mi) ++ struct maki_info *mi; ++{ ++ int bpl = mi->width / 2 / 8; ++ int vsi, pai, pbi, max_pai, max_pbi; ++ byte mask; ++ byte *pixels; ++ int x, y; ++ ++ mi->vs = maki_malloc((size_t) bpl * mi->height, // GRR POSSIBLE OVERFLOW / FIXME ++ "maki_make_virtual_screen#1"); ++ ++ if(mi->m_maki01b) ++ pixels = mi->formb; ++ else ++ pixels = mi->forma; ++ ++ vsi = pai = pbi = 0; ++ max_pai = max_pbi = -1; ++ mask = 0x80; ++ for(y = 0; y < mi->height; y++){ ++ for(x = 0; x < mi->width / 2; x++){ ++ if(pixels[y * mi->width / 2 + x] == 0){ ++ mi->vs[vsi] &= ~mask; ++ }else{ ++ mi->vs[vsi] |= mask; ++ if(y < 200){ ++ if(pai > max_pai){ ++ max_pai += 1024; ++ mi->pa = maki_realloc(mi->pa, (size_t) max_pai + 1, ++ "maki_make_virtual_screen#2"); ++ } ++ mi->pa[pai++] = pixels[y * mi->width / 2 + x]; ++ }else{ ++ if(pbi > max_pbi){ ++ max_pbi += 1024; ++ mi->pb = maki_realloc(mi->pb, (size_t) max_pbi + 2, ++ "maki_make_virtual_screen#3"); ++ } ++ mi->pb[pbi++] = pixels[y * mi->width / 2 + x]; ++ } ++ } ++ ++ if((mask >>= 1) == 0){ ++ mask = 0x80; ++ vsi++; ++ } ++ } ++ } ++ ++ mi->pa_size = pai; ++ mi->pb_size = pbi; ++} ++ ++static void maki_make_flags(mi) ++ struct maki_info *mi; ++{ ++ int bpl = mi->width / 2 / 8; ++ int fbi, max_fbi; ++ int fai; ++ int x, y; ++ byte mask; ++ ++ mi->fa = maki_malloc((size_t) bpl * mi->height, "maki_make_flags#1"); // GRR POSSIBLE OVERFLOW / FIXME ++ ++ fbi = fai = 0; ++ max_fbi = -1; ++ mask = 0x80; ++ for(y = 0; y < mi->height; y += 4){ ++ for(x = 0; x < mi->width / 2; x += 4){ ++ if(x % 8 == 0){ ++ if(H4(mi->vs[ y * bpl + x / 8]) == 0 && ++ H4(mi->vs[(y + 1) * bpl + x / 8]) == 0 && ++ H4(mi->vs[(y + 2) * bpl + x / 8]) == 0 && ++ H4(mi->vs[(y + 3) * bpl + x / 8]) == 0){ ++ mi->fa[fai] &= ~mask; ++ }else{ ++ mi->fa[fai] |= mask; ++ if(fbi + 1 > max_fbi){ ++ max_fbi += 1024; ++ mi->fb = maki_realloc(mi->fb, (size_t) max_fbi + 1, ++ "maki_make_flags#2"); ++ } ++ mi->fb[fbi++] = H4(mi->vs[ y * bpl + x / 8]) << 4 ++ | H4(mi->vs[(y + 1) * bpl + x / 8]); ++ mi->fb[fbi++] = H4(mi->vs[(y + 2) * bpl + x / 8]) << 4 ++ | H4(mi->vs[(y + 3) * bpl + x / 8]); ++ } ++ }else{ ++ if(L4(mi->vs[ y * bpl + x / 8]) == 0 && ++ L4(mi->vs[(y + 1) * bpl + x / 8]) == 0 && ++ L4(mi->vs[(y + 2) * bpl + x / 8]) == 0 && ++ L4(mi->vs[(y + 3) * bpl + x / 8]) == 0){ ++ mi->fa[fai] &= ~mask; ++ }else{ ++ mi->fa[fai] |= mask; ++ if(fbi + 1 > max_fbi){ ++ max_fbi += 1024; ++ mi->fb = maki_realloc(mi->fb, (size_t) max_fbi + 1, ++ "maki_make_flags#3"); ++ } ++ mi->fb[fbi++] = L4(mi->vs[ y * bpl + x / 8]) << 4 ++ | L4(mi->vs[(y + 1) * bpl + x / 8]); ++ mi->fb[fbi++] = L4(mi->vs[(y + 2) * bpl + x / 8]) << 4 ++ | L4(mi->vs[(y + 3) * bpl + x / 8]); ++ } ++ } ++ ++ if((mask >>= 1) == 0){ ++ mask = 0x80; ++ fai++; ++ } ++ } ++ } ++ ++ mi->fb_size = fbi; ++} ++ ++static void maki_write_check_id(mi) ++ struct maki_info *mi; ++{ ++ char *id = mi->m_maki01b ? maki_id_b : maki_id_a; ++ if(fwrite(id, (size_t) 8, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_WRITE); ++} ++ ++static void maki_write_comment(mi) ++ struct maki_info *mi; ++{ ++ char buf[24]; ++ char *p; ++ int i = 0; ++ ++ strcpy(buf, "XV "); ++ ++ if((p = (char *) getenv("USER")) == NULL) ++ p = "????????"; ++ for(i = 5; i < 23; i++){ ++ if(*p == '\0') ++ break; ++ buf[i] = *p++; ++ } ++ for( ; i < 23; i++) ++ buf[i] = ' '; ++ ++ buf[i] = '\032'; /* ^Z, 0x1a */ ++ ++ if(fwrite(buf, (size_t) 24, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_WRITE); ++} ++ ++static void maki_write_header(mi) ++ struct maki_info *mi; ++{ ++ byte buf[16]; ++ ++ if(DEBUG) maki_show_maki_info(mi); ++ ++#define set_word(i, v) {buf[i]=(v)>>8&0xff;buf[i+1]=(v)&0xff;} ++ set_word(0, mi->fb_size); ++ set_word(2, mi->pa_size); ++ set_word(4, mi->pb_size); ++ set_word(6, mi->ext_flag); ++ set_word(8, mi->x0); ++ set_word(10, mi->y0); ++ set_word(12, mi->x1 + 1); ++ set_word(14, mi->y1 + 1); ++#undef set_word ++ ++ if(fwrite(buf, (size_t) 16, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_WRITE); ++} ++ ++static void maki_write_palette(mi, r, g, b, grey) ++ struct maki_info *mi; ++ byte *r, *g, *b; ++ int grey; ++{ ++ int i; ++ char buf[3]; ++ for(i = 0; i < mi->numcols; i++){ ++ buf[0] = *g++; ++ buf[1] = *r++; ++ buf[2] = *b++; ++ if(grey) ++ buf[0] = buf[1] = buf[2] = MONO(buf[1], buf[0], buf[2]); ++ if(fwrite(buf, (size_t) 3, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_WRITE); ++ } ++ for( ; i < 16; i++){ ++ if(fwrite(buf, (size_t) 3, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_WRITE); ++ } ++} ++ ++static void maki_write_flags(mi) ++ struct maki_info *mi; ++{ ++ int bpl = mi->width / 2 / 8; ++ if(fwrite(mi->fa, (size_t) bpl * mi->height / 16, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_WRITE); ++ ++ if(fwrite(mi->fb, (size_t) mi->fb_size, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_WRITE); ++} ++ ++static void maki_write_pixel_data(mi) ++ struct maki_info *mi; ++{ ++ if(fwrite(mi->pa, (size_t) mi->pa_size, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_WRITE); ++ ++ if(fwrite(mi->pb, (size_t) mi->pb_size, (size_t) 1, mi->fp) != 1) ++ maki_file_error(mi, MAKI_WRITE); ++} ++ ++ ++ ++static void maki_init_info(mi) ++ struct maki_info *mi; ++{ ++ xvbzero((char *)mi, sizeof(struct maki_info)); ++ mi->fp = NULL; ++ mi->fsize = 0; ++ mi->x0 = mi->y0 = mi->x1 = mi->y1 = 0; ++ mi->width = mi->height = 0; ++ mi->aspect = 1.0; ++ mi->fb_size = mi->pa_size = mi->pb_size = 0; ++ mi->m_maki01b = mi->m_200 = mi->m_dig8 = 0; ++ mi->ext_flag = 0; ++ mi->fa = mi->fb = mi->pa = mi->pb = NULL; ++ mi->vs = NULL; ++ mi->numcols = 16; ++ mi->forma = mi->formb = NULL; ++} ++ ++static void maki_cleanup_maki_info(mi, writing) ++ struct maki_info *mi; ++ int writing; ++{ ++ if(mi->fp && !writing) ++ fclose(mi->fp); ++ if(mi->fa) ++ free(mi->fa); ++ if(mi->fb) ++ free(mi->fb); ++ if(mi->pa) ++ free(mi->pa); ++ if(mi->pb) ++ free(mi->pb); ++ if(mi->vs) ++ free(mi->vs); ++ if(mi->forma) ++ free(mi->forma); ++ if(mi->formb) ++ free(mi->formb); ++} ++ ++static void maki_cleanup_pinfo(pi) ++ PICINFO *pi; ++{ ++ if(pi->pic){ ++ free(pi->pic); ++ pi->pic = NULL; ++ } ++} ++ ++static void maki_memory_error(scm, fn) ++ char *scm, *fn; ++{ ++ char buf[128]; ++ sprintf(buf, "%s: coulndn't allocate memory. (%s)", scm, fn); ++ FatalError(buf); ++} ++ ++static void maki_error(mi, mn) ++ struct maki_info *mi; ++ int mn; ++{ ++ SetISTR(ISTR_WARNING, "%s", maki_msgs[mn]); ++ longjmp(mi->jmp, 1); ++} ++ ++static void maki_file_error(mi, mn) ++ struct maki_info *mi; ++ int mn; ++{ ++ if(feof(mi->fp)) ++ SetISTR(ISTR_WARNING, "%s (end of file)", maki_msgs[mn]); ++ else ++ SetISTR(ISTR_WARNING, "%s (%s)", maki_msgs[mn], ERRSTR(errno)); ++ longjmp(mi->jmp, 1); ++} ++ ++static void maki_file_warning(mi, mn) ++ struct maki_info *mi; ++ int mn; ++{ ++ if(feof(mi->fp)) ++ SetISTR(ISTR_WARNING, "%s (end of file)", maki_msgs[mn]); ++ else ++ SetISTR(ISTR_WARNING, "%s (%s)", maki_msgs[mn], ERRSTR(errno)); ++} ++ ++static void maki_show_maki_info(mi) ++ struct maki_info *mi; ++{ ++ fprintf(stderr, " file size: %ld.\n", mi->fsize); ++ fprintf(stderr, " image size: %dx%d.\n", mi->width, mi->height); ++ fprintf(stderr, " aspect: %f.\n", mi->aspect); ++ fprintf(stderr, " flag B size: %ld.\n", mi->fb_size); ++ fprintf(stderr, " pixel data size: A:%ld, B:%ld.\n", ++ mi->pa_size, mi->pb_size); ++ fprintf(stderr, " MAKI01B: %s.\n", mi->m_maki01b ? "true" : "false"); ++ fprintf(stderr, " 200 line mode: %s.\n", mi->m_200 ? "true" : "false"); ++ fprintf(stderr, " digital 8 colors: %s.\n", mi->m_dig8 ? "true" : "false"); ++} ++ ++static void *maki_malloc(n, fn) ++ size_t n; ++ char *fn; ++{ ++ void *r = (void *) malloc(n); ++ if(r == NULL) ++ maki_memory_error("malloc", fn); ++ return r; ++} ++ ++static void *maki_realloc(p, n, fn) ++ void *p; ++ size_t n; ++ char *fn; ++{ ++ void *r = (p == NULL) ? (void *) malloc(n) : (void *) realloc(p, n); ++ if(r == NULL) ++ maki_memory_error("realloc", fn); ++ return r; ++} ++#endif /* HAVE_MAKI */ +diff -ruN xv-3.10a-bugfixes/xvmgcsfx.c xv-3.10a-enhancements/xvmgcsfx.c +--- xv-3.10a-bugfixes/xvmgcsfx.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvmgcsfx.c 2005-05-01 10:20:12.000000000 -0700 +@@ -0,0 +1,2276 @@ ++/* ++ * $Id: xvmgcsfx.c,v 1.23 95/11/27 19:03:36 tin329 Exp Locker: tin329 $ ++ * xvmgcsfx.c - Use the filters as input and output method. ++ * ++ * Features ++ * ======== ++ * Use the filters as input and output method for load and save unsupported ++ * image format file. The filter command is recognized by definition of ++ * magic number or suffix in "~/.xv_mgcsfx" . ++ * ++ * Bugs ++ * ==== ++ * There are many bugs. ++ * Let's go hunting for insects with an insect net. (it's all joke.) ++ * ++ * Author ++ * ====== ++ * Tetsuya INOUE <tin329@chino.it.okayama-u.ac.jp> ++ */ ++ ++/* ++ * Known Bugs and Todo / $B$"$l$3$l5$$K$J$k$3$H(B ++ * ++ * ~/.xv_mgcsfx $BFb(B ++ * $B!&Dj5A$,IT40A4$@$H%(%i!<(B (':'$B$N?t(B)$B!#(B ++ * $B!&%G%j%_%?$H$7$F(B ':' $B$r;H$&$N$G!"%9%?!<%H%"%C%W%U%!%$%kFb$G(B ++ * ':' $B$rMQ$$$FDj5A$O$G$-$J$$!#(B'\:'$B$G$b%@%a!#(B ++ * $B!&(B magic $B%?%$%W$G!"#8?J?t$O#37eJ,#0!A#7$rD4$Y!"#1#6?J?t$O(B ++ * isxdigit $B$,??$rJV$94VCf=hM}$5$l$k!#$7$+$7!"#1#b#y#t#e$H(B ++ * $B$7$F$7$+I>2A$5$l$J$$!#(B ++ * $B!&%W%j%W%m%;%C%5$r;H$&$H$-$O!"%3%a%s%H$N=q$-J}$KCm0U$7$J$1$l$P$J(B ++ * $B$i$J$$!#%W%j%W%m%;%C%5$K$h$C$F$O%3%a%s%H$,%(%i!<$K$J$k!#(B ++ * $B!&%Q%$%W$X$NF~=PNO$N%U%)!<%^%C%H$N<oN`$,(B PNM $B$N$_(B ++ * $BF~NO(B ++ * $B%U%!%$%k%]%$%s%?$r(B seek $B$7$F$O$$$1$J$$(B ++ * $B%U%!%$%k%5%$%:$rMQ$$$F$O$$$1$J$$(B ++ * $B=PNO(B ++ * $B%U%!%$%k%]%$%s%?$r(B seek $B$7$F$O$$$1$J$$(B ++ * exec $B$G$-$J$/$F=*N;$7$?%W%m%;%9$K=q$-9~$_IT2D(B ++ * $B!&%5%U%#%C%/%9$H%^%8%C%/%J%s%P!<$N;H$$J,$1$r$I$&$9$k$+!#(B ++ * $B%^%8%C%/%J%s%P!<$,F1$8$G!"%5%U%#%C%/%9$,0[$J$k>l9g$rG'$a$k$+!)(B ++ * $B!&(Bcompress(gzip)$B$N%U%!%$%k$O%F%s%]%i%j$G$O(B xvtmp??? $B$H$$$&L>A0$J(B ++ * $B$N$G(B suffix $B$G$O<1JL$G$-$J$$!#(B ++ * ++ * $BG'<1$9$k;~$K(B MACBINARY $B$K$OIi$1$k(B(in xv.c)$B!#(B ++ * ++ * $BB?=E$K(B pipe $B$rDL$9$3$H$,$G$-$J$$!#(B(pipe $B$,(B seek $B$G$-$J$$$+$i(B) ++ * $B!&(Bsocketpair $B$G!"(Brecv $B$K(B MSG_PEEK $B%U%i%0$r$D$+$C$F6uFI$_$9$k!#(B ++ * $B!&$3$l$r$d$k$H%U%!%$%k$NG'<1$,$a$A$c$a$A$cCY$/$J$k!#(B ++ * ++ * $B%j%=!<%9$G@_Dj(B ++ * $B!&%j%=!<%9$G@_Dj$9$kJ}$,LLE]$/$5$$(B ++ * ++ * $B%^%8%C%/%J%s%P!<$N@_Dj$K@55,I=8=(B ++ * ++ * $B%;!<%VMQ%W%m%;%9$,<:GT$9$k>l9g$NBP:v$,:#0l$D(B ++ * ++ * DEC OSF/1 V3.0 $B$G$O!"%Q%$%W$K%G!<%?$,$^$@$J$$;~$KFI$_9~$b$&$H$9$k$H!"(B ++ * read $B$,IT40A4$K$J$k!#(B(in xvpbm.c) ++ * $BF1MM$K=q$-9~$_;~$K$bLdBj$,@8$8$k$+$b$7$l$J$$!#(B ++ */ ++ ++#define NEEDSDIR /* for stat() */ ++#include "xv.h" ++ ++ ++#ifdef HAVE_MGCSFX ++ ++ ++#ifdef __osf__ ++# ifdef __alpha ++# define ARCHITECTURE64 1 ++# endif /* __alpha */ ++#endif /* __osf__ */ ++ ++#ifdef ARCHITECTURE64 ++typedef short int16; ++typedef int int32; ++typedef long int64; ++#else ++typedef short int16; ++typedef long int32; ++#endif /* ARCHITECTURE64 */ ++ ++#ifdef sgi ++# define vfork fork ++#endif ++ ++#define USE_SIGCHLD ++#if 0 ++# undef USE_SIGCHLD ++#endif ++ ++#ifdef USE_SIGCHLD ++# include <sys/wait.h> ++#endif ++ ++typedef struct _mgcsfxtab ++{ ++ struct _mgcsfxtab *next; ++ char *description; ++ int mgcsfx_type; ++ int offset; ++ union{ ++ int16 int16_data; ++ int32 int32_data; ++ char *string_data; ++ } dt; ++ int string_len; ++ char *suffix; ++ int input_image_type; ++ char *input_command; ++ int output_image_type; ++ char *output_command; ++} mgcsfxtab; ++ ++ ++#ifndef MGCSFXDIR ++# define MGCSFXDIR "/usr/local/lib" ++#endif ++#ifndef SYSCONFDIR ++# define SYSCONFDIR MGCSFXDIR ++#endif ++#ifndef MGCSFX_SITE_RC ++# define MGCSFX_SITE_RC "xv_mgcsfx" ++#endif ++#ifndef MGCSFX_RC ++# define MGCSFX_RC ".xv_mgcsfx" ++#endif ++ ++#ifdef USE_MGCSFX_PREPROCESSOR ++# ifndef MGCSFX_PREPROCESSOR ++# define MGCSFX_PREPROCESSOR "/usr/lib/cpp" ++# endif ++#endif ++ ++ ++/* Check type for Magic number and Suffix */ ++enum {T_UNKNOWN, ++ T_MAGIC, T_SUFFIX, ++ T_BEINT16, T_BEINT32, T_BEINT64, ++ T_LEINT16, T_LEINT32, T_LEINT64}; ++ ++/* Image Type for input and output format */ ++enum {IT_UNKNOWN, ++#ifdef HAVE_MGCSFX_AUTO ++ IT_AUTO, ++#endif /* HAVE_MGCSFX_AUTO */ ++ IT_PNM, IT_PPM, IT_PGM, IT_PBM, ++ IT_PNM_RAW, IT_PPM_RAW, IT_PGM_RAW, IT_PBM_RAW, ++ IT_PNM_ASCII, IT_PPM_ASCII, IT_PGM_ASCII, IT_PBM_ASCII, ++ IT_GIF, IT_JPEG, IT_TIFF, IT_JFIF, /* IT_PS, IT_COMPRESS,*/ ++ IT_XBM, IT_XPM, IT_BMP, IT_SUNRAS, IT_IRIS, IT_XWD, ++ /* IT_TARGA, IT_FITS, IT_PM, IT_UTAHRLE, IT_PCX, IT_PDSVICAR, IT_IFF, */ ++ IT_MAG, IT_MAKI, IT_PI, IT_PIC, IT_PIC2 /* , IT_PCD */}; ++ ++ ++/*--------------------------------------------------------------------------*/ ++void mgcsfx_handler PARM((int)); ++void mgcsfx_handler_setup PARM((void)); ++ ++#ifdef USE_MGCSFX_PREPROCESSOR ++static char *get_tmp_fname PARM((void)); ++static char *make_preprocessed_file PARM((char *)); ++#endif /* USE_MGCSFX_PREPROCESSOR */ ++ ++int is_mgcsfx PARM((char *, unsigned char *, int)); ++ ++char *mgcsfx_auto_input_com PARM((char *)); ++ ++ ++static mgcsfxtab *free_mgcsfx PARM((mgcsfxtab *)); ++static char *fgettoken PARM((FILE*, int)); ++static int string_fin PARM((char *)); ++static int type_mgcsfx PARM((char *)); ++static int type_image PARM((char *)); ++ ++static void read_mgcsfx PARM((mgcsfxtab **, char *)); ++static void init_mgcsfx PARM((void)); ++static mgcsfxtab *find_mgcsfx PARM((char *, unsigned char *, int)); ++ ++int LoadMGCSFX PARM((char *, PICINFO *)); ++ ++#ifdef SVR4 ++typedef void Sigfunc(int); ++static Sigfunc *xv_signal PARM((int , Sigfunc *)); ++#endif ++ ++/*--------------------------------------------------------------------------*/ ++mgcsfxtab *mgcsfx_table = NULL; ++int mgcsfx_setup_flag = 0; ++ ++int nitem_mgcsfx = 0; ++int desc_width = 0; ++ ++int max_offset_mgcsfx = 0; ++int max_length_mgcsfx = 0; ++int need_buf_size = 0; ++ ++static char input_command_ex[1024]; ++static int input_command_ex_flag = 0; ++ ++#ifdef USE_SIGCHLD ++static int w_p_fail=0; ++#endif ++ ++/*--------------------------------------------------------------------------*/ ++ ++/***************************************************/ ++void mgcsfx_handler(sig) ++ int sig; ++{ ++#ifdef USE_SIGCHLD ++ int pid, pst; ++#endif ++ ++#if defined(SYSV) || defined(SVR4) ++ sighold(sig); ++#else ++ sigblock(sigmask(sig)); ++#endif ++ ++#ifdef USE_SIGCHLD ++ if(w_p_fail == 1){ ++ /* ++ * At this point, process write to broken pipe. ++ * Probably external command was can't exec. ++ */ ++ w_p_fail = 2; ++ pid = wait(&pst); ++ } ++#endif ++ ++ return; ++ ++ /* Quit(1); */ /*exit(1);*/ ++} ++ ++void mgcsfx_handler_setup() ++{ ++#ifdef SVR4 ++ xv_signal(SIGPIPE, (void (*)PARM((int))) mgcsfx_handler); ++ xv_signal(SIGCHLD, (void (*)PARM((int))) mgcsfx_handler); ++#else ++# ifdef SYSV ++ sigset(SIGPIPE, (void (*)PARM((int))) mgcsfx_handler); ++ sigset(SIGCHLD, (void (*)PARM((int))) mgcsfx_handler); ++# else ++ signal(SIGPIPE, (void (*)PARM((int))) mgcsfx_handler); ++ signal(SIGCHLD, (void (*)PARM((int))) mgcsfx_handler); ++# endif ++#endif ++} ++ ++/***************************************************/ ++#ifdef USE_MGCSFX_PREPROCESSOR ++static char *get_tmp_fname() ++{ ++ static char tmp[MAXPATHLEN+1]; ++ ++#ifndef VMS ++ sprintf(tmp, "%s/xvmgcsfxXXXXXX",tmpdir); ++#else ++ /* sprintf(tmp, "Sys$Scratch:xvmgcsfxXXXXXX"); */ ++ strcpy(tmp, "[]xvmgcsfxXXXXXX"); ++#endif /* VMS */ ++ ++#ifdef USE_MKSTEMP ++ close(mkstemp(tmp)); ++#else ++ mktemp(tmp); ++#endif ++ ++ return tmp; ++} ++ ++static char *make_preprocessed_file(fname) ++ char *fname; ++{ ++ char buf[512]; ++ char *tmp_name; ++ ++ tmp_name = get_tmp_fname(); ++ ++#ifndef VMS ++ sprintf(buf,"%s %s > %s", MGCSFX_PREPROCESSOR, fname, tmp_name); ++#else ++ sprintf(buf,"%s %s > %s", MGCSFX_PREPROCESSOR, fname, tmp_name); /* really OK? */ ++#endif ++ ++ SetISTR(ISTR_INFO, "Preprocessing '%s'...", BaseName(fname)); ++#ifndef VMS ++ if (system(buf)) ++#else ++ if (!system(buf)) ++#endif ++ { ++ SetISTR(ISTR_INFO, "Unable to preprocess '%s'.", BaseName(fname)); ++ Warning(); ++ return NULL; ++ } ++ ++ return tmp_name; ++} ++#endif /* USE_MGCSFX_PREPROCESSOR */ ++ ++/***************************************************/ ++/* $BG'<1$G$-$k%U%!%$%k$+$I$&$+D4$Y$k(B */ ++int is_mgcsfx(fname,buffer,size) ++ char *fname; ++ unsigned char *buffer; ++ int size; ++{ ++ mgcsfxtab *magic; ++ FILE *fp; ++ unsigned char *buf; ++ int s; ++ ++ if(nomgcsfx){ ++ return 0; ++ }else{ ++ if(size < need_buf_size){ ++ if((buf = (unsigned char *)calloc(need_buf_size, sizeof(char)))==NULL){ ++ fprintf(stderr,"Can't allocate memory\n"); ++ return 0; ++ } ++ if((fp = xv_fopen(fname, "r"))==NULL){ ++ fprintf(stderr,"Can't open file %s\n", fname); ++ free(buf); ++ return 0; ++ } ++ s = fread(buf, 1, need_buf_size, fp); ++ if((magic = find_mgcsfx(fname, buf, s))!=NULL && ++ magic->input_command != NULL){ ++ free(buf); ++ fclose(fp); ++ return 1; ++ }else{ ++ free(buf); ++ fclose(fp); ++ return 0; ++ } ++ }else{ ++ if((magic = find_mgcsfx(fname, buffer, size))!=NULL && ++ magic->input_command != NULL){ ++ return 1; ++ }else{ ++ return 0; ++ } ++ } ++ } ++} ++ ++#ifdef HAVE_MGCSFX_AUTO ++char *mgcsfx_auto_input_com(fname) ++char *fname; ++{ ++ static char command[1024]; ++ mgcsfxtab *magic; ++ char *ptr; ++ ++ FILE *fp; ++ unsigned char *buf; ++ int s; ++ ++ if((buf = (unsigned char *)calloc(need_buf_size, sizeof(char)))==NULL){ ++ fprintf(stderr,"Can't allocate memory\n"); ++ return NULL; ++ } ++ if((fp = xv_fopen(fname, "r"))==NULL){ ++ fprintf(stderr,"Can't open file %s\n", fname); ++ free(buf); ++ return NULL; ++ } ++ s = fread(buf, 1, need_buf_size, fp); ++ if((magic = find_mgcsfx(fname, buf, s))!=NULL && ++ magic->input_command != NULL && magic->input_image_type == IT_AUTO){ ++ if ((ptr = strstr(magic->input_command, "%s"))){ ++ sprintf(command, magic->input_command, fname); ++ }else{ ++ sprintf(command, "%s < %s", magic->input_command, fname); ++ } ++ free(buf); ++ fclose(fp); ++ return command; ++ }else{ ++ free(buf); ++ fclose(fp); ++ return NULL; ++ } ++} ++#endif /* HAVE_MGCSFX_AUTO */ ++ ++/***************************************************/ ++static mgcsfxtab *free_mgcsfx(m) ++ mgcsfxtab *m; ++{ ++ mgcsfxtab *next; ++ if(m == NULL) return NULL; ++ next = m->next; ++ if(m->description != NULL) free(m->description); ++ if(m->mgcsfx_type == T_MAGIC && m->dt.string_data != NULL) ++ free(m->dt.string_data); ++ if(m->suffix != NULL) free(m->suffix); ++ if(m->input_command != NULL) free(m->input_command); ++ if(m->output_command != NULL) free(m->output_command); ++ free(m); ++ return next; ++} ++ ++ ++ ++/***************************************************/ ++/* char c $B$^$?$O(B '\n' $B$G6h@Z$i$l$?J8;zNs$r<h$j=P$9(B ++ * $B%U%!%$%k$N:G8e$^$GFI$s$@$i(B NULL $B$rJV$9(B ++ * $B2~9T$J$i2~9T$rJV$9(B($B2~9T$G6h@Z$i$l$?>l9g$O(B '\n' $B$r%9%H%j!<%`$KLa$9(B) ++ */ ++#define CBUF_SIZE 1024 ++static char *fgettoken(fp, c) ++ FILE *fp; ++ int c; /* Real mean is char */ ++{ ++ char *buf; ++ char *buf2; ++ int i; ++ int n=0; ++ int max=0; ++ int count = 1; ++ ++ char *ss; ++ char *se; ++ ++ if((buf = (char *)calloc(CBUF_SIZE, sizeof(char))) == NULL){ ++ fprintf(stderr,"Can't allocate memory\n"); ++ exit(1); ++ } ++ max = CBUF_SIZE; ++ count = 2; ++ ++ do{ ++ if((i = getc(fp))==EOF || i == '\n' || i == c) break; ++ ++ buf[n] = (char)i; ++ ++ if(i != c && n == max-1){ ++ buf[max] = '\0'; ++ if((buf2 = (char *)calloc(CBUF_SIZE * count, sizeof(char))) == NULL){ ++ fprintf(stderr,"Can't allocate memory\n"); ++ exit(1); ++ } ++ strcpy(buf2, buf); ++ free(buf); ++ buf = buf2; ++ buf2 = NULL; ++ max = CBUF_SIZE * count; ++ count++; ++ } ++ ++ n++; ++ }while(i != c); ++ ++ buf[n] = '\0'; ++ ++ /* $B:G=i$H:G8e$N6uGrJ8;z$r@Z$j5M$a$k(B */ ++ ss = buf + strspn(buf, " \t\b\r\n"); /* find the first non-white space */ ++ se = buf + strlen(buf); /* find the end of the string */ ++ ++ /* strip from the end first */ ++ while ((--se >= ss) && strchr(" \t\b\r\n", *se)); ++ *(++se) = '\0'; ++ ++ if(i == EOF && strlen(ss)==0){ /* EOF $B$J$i(B NULL $B$rJV$9(B */ ++ free(buf); ++ return NULL; ++ }else if(i == '\n' && strlen(ss)==0){ /* $B2~9T$N$_$N>l9g(B */ ++ static char cr[2] = {'\n','\0'}; ++ buf2 = strdup(cr); ++ free(buf); ++ return buf2; ++ }else{ /* $BDL>o(B */ ++ if(i == '\n' && strlen(ss)>0) ungetc(i,fp); ++ buf2 = strdup(ss); ++ free(buf); ++ return buf2; ++ } ++} ++ ++ ++ ++/***************************************************/ ++/* $BJ8;zNsCf$NFC<l5-9f(B(\)$B$r@5$7$$$b$N$K$9$k(B ++ */ ++static int string_fin(string_data) ++ char *string_data; ++{ ++ char *cptr; ++ char *ptr; ++ int length; ++ ++ /* Change all the \xx sequences into a single character */ ++ cptr = string_data; ++ ++ for (ptr = cptr; *ptr; ++ptr){ ++ if (*ptr != '\\'){ ++ *cptr = *ptr; ++ }else{ ++ switch (*(++ptr)){ ++#if defined(__STDC__) ++ case 'a': /* Audible alert (terminal bell) */ ++ *cptr = '\007'; ++ break; ++ case '?': /* Question mark */ ++ *cptr = '\?'; ++ break; ++#endif ++ case 'b': /* Backspace */ ++ *cptr = '\b'; ++ break; ++ case 'f': /* Form feed */ ++ *cptr = '\f'; ++ break; ++ case 'n': /* Line feed */ ++ *cptr = '\n'; ++ break; ++ case 'r': /* Carriage return */ ++ *cptr = '\r'; ++ break; ++ case 't': /* Horizontal tab */ ++ *cptr = '\t'; ++ break; ++ case 'v': /* Vertical tab */ ++ *cptr = '\v'; ++ break; ++ case '\\': /* Backslash */ ++ *cptr = '\\'; ++ break; ++ case '\'': /* Single quote */ ++ *cptr = '\''; ++ break; ++ case '"': /* Double quote */ ++ *cptr = '\"'; ++ break; ++ case '0': /* Octal constant \0 ... \377 */ ++ case '1': ++ case '2': ++ case '3': ++ case '4': ++ case '5': ++ case '6': ++ case '7': ++ if ((ptr[1] >= '0') && (ptr[1] <= '7')){ ++ if ((ptr[2] >= '0') && (ptr[2] <= '7')){ /* \000 ...\377 */ ++ *cptr = ((*ptr - '0') * 64) +((ptr[1] - '0') * 8) +(ptr[1] - '0'); ++ ptr += 2; ++ }else{ /* \00 ...\77 */ ++ *cptr = ((*ptr - '0') * 8) + (ptr[1] - '0'); ++ ++ptr; ++ } ++ }else{ /* \0 ...\7 */ ++ *cptr = *ptr - '0'; ++ } ++ break; ++ case 'x': /* Hexadecimal constant \x0 .. \xff */ ++ if (isxdigit (ptr[1])){ ++ *cptr = 0; ++ while (isxdigit (*(++ptr))) ++ *cptr = (*cptr * 16) + ++ (*ptr > '9' ? tolower (*ptr) - ('a' - 10) : *ptr - '0'); ++ --ptr; ++ break; ++ } ++ default: ++ /* *(cptr++) = '\\'; No use for treat '\z' as 'z' */ ++ *cptr = *ptr; ++ break; ++ } ++ } ++ ++cptr; ++ } ++ *cptr = '\0'; ++ length = cptr - string_data; ++ return length; ++} ++ ++/***************************************************/ ++static int type_mgcsfx(str) ++ char *str; ++{ ++ if(str == NULL){ ++ return T_UNKNOWN; ++ }else if(!strcmp(str, "magic") || !strcmp(str, "MAGIC")){ ++ return T_MAGIC; ++ }else if(!strcmp(str, "string") || !strcmp(str, "STRING")){ ++ return T_MAGIC; ++ }else if(!strcmp(str, "suffix") || !strcmp(str, "SUFFIX")){ ++ return T_SUFFIX; ++ }else if(!strcmp(str, "beint16") || !strcmp(str, "BEINT16")){ ++ return T_BEINT16; ++ }else if(!strcmp(str, "leint16") || !strcmp(str, "LEINT16")){ ++ return T_LEINT16; ++ }else if(!strcmp(str, "beint32") || !strcmp(str, "BEINT32")){ ++ return T_BEINT32; ++ }else if(!strcmp(str, "leint32") || !strcmp(str, "LEINT32")){ ++ return T_LEINT32; ++ }else{ ++ return T_UNKNOWN; ++ } ++} ++ ++/***************************************************/ ++static int type_image(str) ++ char *str; ++{ ++ if(str == NULL){ ++ return IT_UNKNOWN; ++#ifdef HAVE_MGCSFX_AUTO ++ }else if(!strcmp(str, "auto") || !strcmp(str, "AUTO")){ ++ return IT_AUTO; ++#endif /* HAVE_MGCSFX_AUTO */ ++ }else if(!strcmp(str, "pnm") || !strcmp(str, "PNM")){ ++ return IT_PNM; ++ }else if(!strcmp(str, "ppm") || !strcmp(str, "PPM")){ ++ return IT_PPM; ++ }else if(!strcmp(str, "pgm") || !strcmp(str, "PGM")){ ++ return IT_PGM; ++ }else if(!strcmp(str, "pbm") || !strcmp(str, "PBM")){ ++ return IT_PBM; ++ }else if(!strcmp(str, "pnm_raw") || !strcmp(str, "PNM_RAW")){ ++ return IT_PNM_RAW; ++ }else if(!strcmp(str, "ppm_raw") || !strcmp(str, "PPM_RAW")){ ++ return IT_PPM_RAW; ++ }else if(!strcmp(str, "pgm_raw") || !strcmp(str, "PGM_RAW")){ ++ return IT_PGM_RAW; ++ }else if(!strcmp(str, "pbm_raw") || !strcmp(str, "PBM_RAW")){ ++ return IT_PBM_RAW; ++ }else if(!strcmp(str, "pnm_ascii") || !strcmp(str, "PNM_ASCII")){ ++ return IT_PNM_ASCII; ++ }else if(!strcmp(str, "ppm_ascii") || !strcmp(str, "PPM_ASCII")){ ++ return IT_PPM_ASCII; ++ }else if(!strcmp(str, "pgm_ascii") || !strcmp(str, "PGM_ASCII")){ ++ return IT_PGM_ASCII; ++ }else if(!strcmp(str, "pbm_ascii") || !strcmp(str, "PBM_ASCII")){ ++ return IT_PBM_ASCII; ++ ++ }else if(!strcmp(str, "gif") || !strcmp(str, "GIF")){ ++ return IT_GIF; ++ }else if(!strcmp(str, "jpeg") || !strcmp(str, "JPEG")){ ++ return IT_JPEG; ++ }else if(!strcmp(str, "tiff") || !strcmp(str, "TIFF")){ ++ return IT_TIFF; ++ }else if(!strcmp(str, "jfif") || !strcmp(str, "JFIF")){ ++ return IT_JFIF; ++ ++ }else if(!strcmp(str, "xbm") || !strcmp(str, "XBM")){ ++ return IT_XBM; ++ }else if(!strcmp(str, "xpm") || !strcmp(str, "XPM")){ ++ return IT_XPM; ++ }else if(!strcmp(str, "bmp") || !strcmp(str, "BMP")){ ++ return IT_BMP; ++ }else if(!strcmp(str, "sunras") || !strcmp(str, "SUNRAS")){ ++ return IT_SUNRAS; ++ }else if(!strcmp(str, "iris") || !strcmp(str, "IRIS")){ ++ return IT_IRIS; ++ }else if(!strcmp(str, "xwd") || !strcmp(str, "XWD")){ ++ return IT_XWD; ++ ++ }else if(!strcmp(str, "mag") || !strcmp(str, "MAG")){ ++ return IT_MAG; ++ }else if(!strcmp(str, "maki") || !strcmp(str, "MAKI")){ ++ return IT_MAKI; ++ }else if(!strcmp(str, "pi") || !strcmp(str, "PI")){ ++ return IT_PI; ++ }else if(!strcmp(str, "pic") || !strcmp(str, "PIC")){ ++ return IT_PIC; ++ }else if(!strcmp(str, "pic2") || !strcmp(str, "PIC2")){ ++ return IT_PIC2; ++ ++ }else{ ++ return IT_UNKNOWN; ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++#define mgcsfx_read_error(FILENAME, LINENUM, AFTERFIELD) \ ++fprintf (stderr,\ ++"%s: line %d: missing fields of %s field\n",\ ++FILENAME, LINENUM, AFTERFIELD); ++ ++#define magic_type_error(FILENAME, LINENUM, MAGICNUMBER) \ ++fprintf (stderr,\ ++"%s: line %d: invalid <magic type> field '%s'\n",\ ++FILENAME, LINENUM, MAGICNUMBER); ++/*--------------------------------------------------------------------------*/ ++ ++/***************************************************/ ++static void read_mgcsfx(mgcsfx_table, fname) ++ mgcsfxtab **mgcsfx_table; ++ char *fname; ++{ ++ FILE *fp; ++ char *s; ++ int line_number = 0; ++ int str_len; ++ int reach_end; ++ int def_err; ++ ++ char *description; ++ char *mgcsfx_type; ++ char *offset; ++ char *magic; ++ char *suffix; ++ char *i_img; ++ char *i_com; ++ char *o_img; ++ char *o_com; ++ ++ mgcsfxtab *ent; ++ mgcsfxtab **entry; ++ ++ ++ if((fp=fopen(fname, "r"))==NULL){ ++ /* fprintf(stderr, "Can't open %s\n",fname); */ ++ return; ++ } ++ ++ while(1){ ++retry: ++ line_number++; ++ def_err = 0; ++ ++ s= NULL; ++ description = mgcsfx_type = offset = magic = suffix ++ = i_img = i_com = o_img = o_com = NULL; ++ reach_end = 0; ++ ++ if((s = fgettoken(fp, ':'))==NULL) break; /* EOF $B$J$i=*$j(B */ ++ if(*s == '#'){/* $B@hF,$,(B '#' $B$J$iFI$_$H$P$9(B */ ++ while((s = fgettoken(fp, '\n'))!=NULL){ ++ if(*s == '\n'){ ++ free(s); ++ goto retry; ++ } ++ free(s); ++ } ++ if(s == NULL) break; ++ }else if(*s == '\n'){/* $B6u9T$OL5;k(B */ ++ free(s); ++ goto retry; ++ } ++ if(strlen(s) > 0) description = s; ++ else free(s); ++ ++ if((s = fgettoken(fp, ':'))==NULL || *s == '\n'){/* $B2?$b$J$$$J$i@_Dj%_%9(B */ ++ if(s != NULL) free(s); ++ mgcsfx_read_error(fname, line_number, "data type"); ++ goto next; ++ } ++ if(strlen(s) > 0) mgcsfx_type = s; ++ else free(s); ++ ++ if((s = fgettoken(fp, ':'))==NULL || *s == '\n'){/* $B2?$b$J$$$J$i@_Dj%_%9(B */ ++ if(s != NULL) free(s); ++ mgcsfx_read_error(fname, line_number, "byte offset"); ++ goto next; ++ } ++ if(strlen(s) > 0) offset = s; ++ else free(s); ++ ++ if((s = fgettoken(fp, ':'))==NULL || *s == '\n'){/* $B2?$b$J$$$J$i@_Dj%_%9(B */ ++ if(s != NULL) free(s); ++ mgcsfx_read_error(fname, line_number, "magic number"); ++ goto next; ++ } ++ if(strlen(s) > 0) magic = s; ++ else free(s); ++ ++ if((s = fgettoken(fp, ':'))==NULL || *s == '\n'){/* $B2?$b$J$$$J$i@_Dj%_%9(B */ ++ if(s != NULL) free(s); ++ mgcsfx_read_error(fname, line_number, "suffix"); ++ goto next; ++ } ++ if(strlen(s) > 0) suffix = s; ++ else free(s); ++ ++ if((s = fgettoken(fp, ':'))==NULL || *s == '\n'){/* $B2?$b$J$$$J$i@_Dj%_%9(B */ ++ if(s != NULL) free(s); ++ mgcsfx_read_error(fname, line_number, "input image type"); ++ goto next; ++ } ++ if(strlen(s) > 0) i_img = s; ++ else free(s); ++ ++ if((s = fgettoken(fp, ':'))==NULL || *s == '\n'){/* $B2?$b$J$$$J$i@_Dj%_%9(B */ ++ if(s != NULL) free(s); ++ mgcsfx_read_error(fname, line_number, "input command"); ++ goto next; ++ } ++ if(strlen(s) > 0) i_com = s; ++ else free(s); ++ ++ if((s = fgettoken(fp, ':'))==NULL || *s == '\n'){/* $B2?$b$J$$$J$i@_Dj%_%9(B */ ++ if(s != NULL) free(s); ++ mgcsfx_read_error(fname, line_number, "output image type"); ++ goto next; ++ } ++ if(strlen(s) > 0) o_img = s; ++ else free(s); ++ ++ if((s = fgettoken(fp, '#'))==NULL || *s == '\n'){/* $B2?$b$J$$$J$i@_Dj%_%9(B */ ++ /* ++ free(s); ++ mgcsfx_read_error(fname, line_number, "output command"); ++ goto next; ++ */ ++ if(s != NULL){ ++ *s = '\0'; ++ reach_end = 1; ++ } ++ } ++ if(s != NULL){ ++ if(strlen(s) > 0) o_com = s; ++ else free(s); ++ } ++ ++ if(reach_end == 0){ ++ while((s = fgettoken(fp, '\n'))!=NULL){/* $B9TKv$N%4%_$r<N$F$k(B */ ++ if(*s == '\n'){ ++ free(s); ++ break; /* goto next; */ ++ } ++ free(s); ++ } ++ }else{ ++ reach_end = 0; ++ } ++ ++ ++ ++ /* --------------------------------------------------------------------- */ ++next:; ++ ++ if(DEBUG){ ++ fprintf(stderr,"Read: file %s: line %d.\n", fname, line_number); ++ fprintf(stderr,"Description : %s\n", ++ description ? description : "-- error --"); ++ fprintf(stderr,"Type : %s\n", ++ mgcsfx_type ? mgcsfx_type : "-- error --"); ++ fprintf(stderr,"Offset : %s\n", offset ? offset : "--+--"); ++ fprintf(stderr,"Magic : %s\n", magic ? magic : "--+--"); ++ fprintf(stderr,"Suffix : %s\n", suffix ? suffix : "--+--"); ++ fprintf(stderr,"i Image : %s\n", i_img ? i_img : "--+--"); ++ fprintf(stderr,"i Command : %s\n", i_com ? i_com : "--+--"); ++ fprintf(stderr,"o Image : %s\n", o_img ? o_img : "--+--"); ++ fprintf(stderr,"o Command : %s\n", o_com ? o_com : "--+--"); ++ fprintf(stderr,"\n"); ++ } ++ ++ /* create mgcsfxtab */ ++ if((ent = (mgcsfxtab *) malloc (sizeof (mgcsfxtab)))==NULL){ ++ fprintf(stderr,"Can't allocate memory\n"); ++ exit(1); ++ } ++ ent->next = NULL; ++ ent->description = NULL; ++ ent->mgcsfx_type = T_UNKNOWN; ++ ent->offset = 0; ++ ent->string_len = 0; ++ ent->suffix = NULL; ++ ent->input_image_type = IT_UNKNOWN; ++ ent->input_command = NULL; ++ ent->output_image_type = IT_UNKNOWN; ++ ent->output_command = NULL; ++ ++ if(description != NULL){ ++ ent->description = description; ++ description = NULL; ++ }else{ ++ fprintf (stderr,"%s: line %d: undefined <description> field.\n", ++ fname, line_number); ++ def_err ++; ++ goto next2; ++ } ++ ++ if(mgcsfx_type == NULL){ ++ fprintf (stderr,"%s: line %d: undefined <mgcsfx type> field.\n", ++ fname, line_number); ++ def_err ++; ++ goto next2; ++ } ++ ent->mgcsfx_type = type_mgcsfx(mgcsfx_type); ++ switch(ent->mgcsfx_type){ ++ case T_SUFFIX: ++ if(suffix == NULL){ ++ fprintf (stderr, ++ "%s: line %d: conflict definition : undefined <suffix> field.\n", ++ fname, line_number); ++ def_err ++; ++ goto next2; ++ } ++ break; ++ case T_BEINT16: ++ if (sscanf(magic, "%hi", &(ent->dt.int16_data)) != 1){ ++ magic_type_error(fname, line_number, magic); ++ def_err ++; ++ goto next2; ++ } ++ break; ++ case T_LEINT16: ++ if (sscanf(magic, "%hi", &(ent->dt.int16_data)) != 1){ ++ magic_type_error(fname, line_number, magic); ++ def_err ++; ++ goto next2; ++ } ++ break; ++#ifdef ARCHITECTURE64 ++ case T_BEINT32: ++ if (sscanf(magic, "%i", &(ent->dt.int32_data)) != 1){ ++ magic_type_error(fname, line_number, magic); ++ def_err ++; ++ goto next2; ++ } ++ break; ++ case T_LEINT32: ++ if (sscanf(magic, "%i", &(ent->dt.int32_data)) != 1){ ++ magic_type_error(fname, line_number, magic); ++ def_err ++; ++ goto next2; ++ } ++ break; ++#else ++ case T_BEINT32: ++ if (sscanf(magic, "%li", &(ent->dt.int32_data)) != 1){ ++ magic_type_error(fname, line_number, magic); ++ def_err ++; ++ goto next2; ++ } ++ break; ++ case T_LEINT32: ++ if (sscanf(magic, "%li", &(ent->dt.int32_data)) != 1){ ++ magic_type_error(fname, line_number, magic); ++ def_err ++; ++ goto next2; ++ } ++ break; ++#endif /* ARCHITECTURE64 */ ++ case T_MAGIC: ++ if(magic == NULL){ ++ fprintf (stderr,"%s: line %d: undefined <magic> field.\n", ++ fname, line_number); ++ def_err ++; ++ goto next2; ++ } ++ if((str_len = string_fin(magic))<=0){ ++ fprintf (stderr,"%s: line %d: invalid <magic> field.\n", ++ fname, line_number); ++ def_err ++; ++ goto next2; ++ } ++ ++ ent->string_len = str_len; ++ if((ent->dt.string_data = (char *)malloc(str_len + 1))==NULL){ ++ fprintf(stderr,"Can't allocate memory\n"); ++ exit(1); ++ } ++ memcpy(ent->dt.string_data, magic, str_len + 1); ++ break; ++ case T_UNKNOWN: ++ default: ++ fprintf (stderr,"%s: line %d: invalid <mgcsfx type> field.\n", ++ fname, line_number); ++ def_err ++; ++ goto next2; ++ break; ++ }; ++ ++ ++ if(offset == NULL){ ++ if(ent->mgcsfx_type == T_MAGIC || ++ ent->mgcsfx_type == T_BEINT16 || ++ ent->mgcsfx_type == T_LEINT16 || ++ ent->mgcsfx_type == T_BEINT32 || ++ ent->mgcsfx_type == T_LEINT32){ ++ fprintf (stderr, ++ "%s: line %d: conflict definition : undefined <offset> field.\n", ++ fname, line_number); ++ def_err ++; ++ goto next2; ++ } ++ }else{ ++ if(ent->mgcsfx_type != T_SUFFIX) sscanf(offset, "%i", &(ent->offset)); ++ } ++ ++ if(suffix != NULL){ ++ ent->suffix = suffix; ++ suffix = NULL; ++ } ++ ++ if((i_img == NULL && i_com == NULL) && (o_img == NULL || o_com == NULL)){ ++ fprintf (stderr,"%s: line %d: invalid definition.\n", ++ fname, line_number); ++ def_err ++; ++ goto next2; ++ } ++ if((o_img == NULL && o_com == NULL) && (i_img == NULL || i_com == NULL)){ ++ fprintf (stderr,"%s: line %d: invalid definition.\n", ++ fname, line_number); ++ def_err ++; ++ goto next2; ++ } ++ ++ if(i_img != NULL && i_com != NULL){ ++ ent->input_image_type = type_image(i_img); ++ ent->input_command = i_com; ++ i_com = NULL; ++ }else{ ++ ent->input_image_type = IT_UNKNOWN; ++ ent->input_command = NULL; ++ } ++ ++ if(o_img != NULL && o_com != NULL){ ++ ent->output_image_type = type_image(o_img); ++ ent->output_command = o_com; ++ o_com = NULL; ++ }else{ ++ ent->output_image_type = IT_UNKNOWN; ++ ent->output_command = NULL; ++ } ++ /* end of create mgcsfxtab */ ++ ++ ++next2:; ++ ++ if(def_err != 0 || DEBUG){ ++ fprintf(stderr,"Description : %s \t -> %s\n", ++ description ? description : "--+--", ++ ent->description ? ent->description : "-- error --"); ++ fprintf(stderr,"Type : %s \t -> %d\n", ++ mgcsfx_type ? mgcsfx_type : "--+--", ++ ent->mgcsfx_type); ++ fprintf(stderr,"Offset : %s \t -> %d\n", ++ offset ? offset : "--+--", ++ ent->offset); ++ ++ fprintf(stderr,"Magic : %s", magic ? magic : "--+--"); ++ switch(ent->mgcsfx_type){ ++ case T_BEINT16: ++ case T_LEINT16: ++ fprintf(stderr," \t -> %d\n",ent->dt.int16_data); ++ break; ++ case T_BEINT32: ++ case T_LEINT32: ++ fprintf(stderr," \t -> %ld\n",ent->dt.int32_data); ++ break; ++ case T_MAGIC: ++ fprintf(stderr," \t -> %s\n",ent->dt.string_data); ++ break; ++ default: ++ fprintf(stderr,"\n"); ++ break; ++ }; ++ ++ fprintf(stderr,"Suffix : %s \t -> %s\n", ++ suffix ? suffix : "--+--", ++ ent->suffix ? ent->suffix : "--+--"); ++ fprintf(stderr,"i Image : %s \t -> %d\n", ++ i_img ? i_img : "--+--", ++ ent->input_image_type); ++ fprintf(stderr,"i Command : %s \t -> %s\n", ++ i_com ? i_com : "--+--", ++ ent->input_command ? ent->input_command : "--+--"); ++ fprintf(stderr,"o Image : %s \t -> %d\n", ++ o_img ? o_img : "--+--", ++ ent->output_image_type); ++ fprintf(stderr,"o Command : %s \t -> %s\n", ++ o_com ? o_com : "--+--", ++ ent->output_command ? ent->output_command : "--+--"); ++ fprintf(stderr,"\n"); ++ } ++ ++ if(description != NULL) free(description); ++ if(mgcsfx_type != NULL) free(mgcsfx_type); ++ if(offset != NULL) free(offset); ++ if(magic != NULL) free(magic); ++ if(suffix != NULL) free(suffix); ++ if(i_img != NULL) free(i_img); ++ if(i_com != NULL) free(i_com); ++ if(o_img != NULL) free(o_img); ++ if(o_com != NULL) free(o_com); ++ ++ ++ if(def_err != 0) goto next3; ++ ++ /* Override any existing entry for this magic number/file type */ ++ for(entry = mgcsfx_table; *entry; entry = &((*entry)->next)){ ++ if((ent->mgcsfx_type == (*entry)->mgcsfx_type) && ++ ( ++ ((ent->offset == (*entry)->offset) && ++ (((ent->mgcsfx_type == T_BEINT16) && ++ (ent->dt.int16_data == (*entry)->dt.int16_data)) || ++ ((ent->mgcsfx_type == T_BEINT32) && ++ (ent->dt.int32_data == (*entry)->dt.int32_data)) || ++ ((ent->mgcsfx_type == T_LEINT16) && ++ (ent->dt.int16_data == (*entry)->dt.int16_data)) || ++ ((ent->mgcsfx_type == T_LEINT32) && ++ (ent->dt.int32_data == (*entry)->dt.int32_data)) || ++ ++ ((ent->mgcsfx_type == T_MAGIC) && ++ !memcmp(ent->dt.string_data, (*entry)->dt.string_data, ++ ent->string_len)) ++ )) || ++ ((ent->mgcsfx_type == T_SUFFIX) && ++ !strcmp(ent->suffix, (*entry)->suffix)) ++ ) ++ ){ ++ ++ free ((*entry)->description); ++ (*entry)->description = ent->description; ++ ent->description = NULL; ++ ++ (*entry)->input_image_type = ent->input_image_type; ++ if ((*entry)->input_command) free ((*entry)->input_command); ++ (*entry)->input_command = ent->input_command; ++ ent->input_command = NULL; ++ ++ (*entry)->output_image_type = ent->output_image_type; ++ if ((*entry)->output_command) free ((*entry)->output_command); ++ (*entry)->output_command = ent->output_command; ++ ent->output_command = NULL; ++ ++ free_mgcsfx(ent); ++ break; ++ } ++ } ++ if (!*entry){ ++ ent->next = NULL; ++ *entry = ent; ++ } ++ ++ /* if(s == NULL) break; */ ++next3:; ++ if(def_err != 0) free_mgcsfx(ent); ++ } /* end of while(1) */ ++} ++ ++ ++/***************************************************/ ++/* $B%^%8%C%/%J%s%P!<Dj5A%U%!%$%kL>$rF@$F!"FI$_9~$^$;$k(B */ ++static void init_mgcsfx () ++{ ++ extern char *getenv (); ++ ++ char *home_dir; ++ char fname[1024]; ++ mgcsfxtab *entry; ++ int len; ++ struct stat st; ++ ++#ifdef USE_MGCSFX_PREPROCESSOR ++ char *pp_fname; ++#endif /* USE_MGCSFX_PREPROCESSOR */ ++ ++ mgcsfx_table = NULL; ++ ++ mgcsfx_handler_setup(); ++ ++ if(nomgcsfx){ ++ mgcsfx_setup_flag = 1; ++ nitem_mgcsfx = 0; ++ desc_width = 0; ++ }else{ ++ sprintf (fname, "%s/%s", SYSCONFDIR, MGCSFX_SITE_RC); ++ if(stat(fname, &st) == 0 && S_ISREG(st.st_mode)){ ++ /* Read the site MagicSuffix table into a linked list */ ++#ifdef USE_MGCSFX_PREPROCESSOR ++ if((pp_fname = make_preprocessed_file(fname)) != NULL){ ++ read_mgcsfx (&mgcsfx_table, pp_fname); ++ } ++ unlink(pp_fname); ++#else ++ read_mgcsfx (&mgcsfx_table, fname); ++#endif /* USE_MGCSFX_PREPROCESSOR */ ++ } ++ ++ /* Read the personal MgcSfx table into the list overriding site entries */ ++ if ((home_dir = getenv ("HOME"))){ ++ sprintf (fname, "%s/%s", home_dir, MGCSFX_RC); ++ if(stat(fname, &st) == 0 && S_ISREG(st.st_mode)){ ++#ifdef USE_MGCSFX_PREPROCESSOR ++ if((pp_fname = make_preprocessed_file(fname)) != NULL){ ++ read_mgcsfx (&mgcsfx_table, pp_fname); ++ } ++ unlink(pp_fname); ++#else ++ read_mgcsfx (&mgcsfx_table, fname); ++#endif /* USE_MGCSFX_PREPROCESSOR */ ++ } ++ } ++ ++ mgcsfx_setup_flag = 1; ++ ++ nitem_mgcsfx = 0; ++ desc_width = 0; ++ for (entry = mgcsfx_table; entry; entry = entry->next){ ++ nitem_mgcsfx ++; ++ len = strlen(entry->description); ++ if(len > desc_width) desc_width = len; ++ if(max_offset_mgcsfx < entry->offset) max_offset_mgcsfx = entry->offset; ++ if(entry->mgcsfx_type == T_MAGIC && ++ max_length_mgcsfx < entry->string_len) ++ max_length_mgcsfx = entry->string_len; ++ } ++ if(max_length_mgcsfx == 0) max_length_mgcsfx = sizeof(int32); ++ need_buf_size = max_offset_mgcsfx + max_length_mgcsfx + 1;/* 1 is safety */ ++ } ++} ++ ++/***************************************************/ ++/* $B%^%8%C%/%J%s%P!<$rD4$Y$F!"Dj5A$7$F$$$k%F!<%V%k$r8!:w$9$k(B ++ $B%^%8%C%/%J%s%P!<$N%F!<%V%k$rFI$_9~$s$G$$$J$$$J$iFI$_9~$`(B */ ++static mgcsfxtab *find_mgcsfx (fname, buffer, buffer_size) ++ char *fname; ++ unsigned char *buffer; ++ int buffer_size; ++{ ++ mgcsfxtab *entry; ++ int16 buf16; ++ int32 buf32; ++ char *suf; ++ ++ if (mgcsfx_setup_flag == 0) init_mgcsfx (); ++ ++ for (entry = mgcsfx_table; entry; entry = entry->next){ ++ switch (entry->mgcsfx_type){ ++ case T_BEINT16: ++ if ((buffer_size > 0) && ++ ((entry->offset + sizeof (int16)) <= buffer_size)){ ++ buf16 = ((char)*(buffer + entry->offset) << 8) | ++ ((char)*(buffer + entry->offset +1)); ++ if(entry->dt.int16_data == buf16) return entry; ++ } ++ break; ++ case T_LEINT16: ++ if ((buffer_size > 0) && ++ ((entry->offset + sizeof (int16)) <= buffer_size)){ ++ buf16 = ((char)*(buffer + entry->offset +1) << 8) | ++ ((char)*(buffer + entry->offset)); ++ if(entry->dt.int16_data == buf16) return entry; ++ } ++ break; ++ case T_BEINT32: ++ if ((buffer_size > 0) && ++ ((entry->offset + sizeof (int32)) <= buffer_size)){ ++ buf32 = ((char)*(buffer + entry->offset) << 24) | ++ ((char)*(buffer + entry->offset +1) << 16) | ++ ((char)*(buffer + entry->offset +2) << 8) | ++ ((char)*(buffer + entry->offset +3)); ++ if(entry->dt.int32_data == buf32) return entry; ++ } ++ break; ++ case T_LEINT32: ++ if ((buffer_size > 0) && ++ ((entry->offset + sizeof (int32)) <= buffer_size)){ ++ buf32 = ((char)*(buffer + entry->offset +3) << 24) | ++ ((char)*(buffer + entry->offset +2) << 16) | ++ ((char)*(buffer + entry->offset +1) << 8) | ++ ((char)*(buffer + entry->offset)); ++ if(entry->dt.int32_data == buf32) return entry; ++ } ++ break; ++ case T_MAGIC: ++ if ((buffer_size > 0) && ++ ((entry->offset + entry->string_len) ++ <= buffer_size) && ++ !memcmp (entry->dt.string_data, buffer + entry->offset, ++ entry->string_len )) ++ return entry; ++ break; ++ case T_SUFFIX: ++ if(fname != NULL && entry->suffix != NULL){ ++ if(strlen(fname) - strlen(entry->suffix) > 0){ ++ suf = fname + (strlen(fname) - strlen(entry->suffix)); ++ if(!strcmp(suf, entry->suffix)) return entry; ++ } ++ } ++ break; ++ case T_UNKNOWN: ++ default: ++ return NULL; ++ break; ++ } ++ } ++ return NULL; ++} ++ ++ ++ ++ ++ ++/***************************************************/ ++/* $B%^%8%C%/%J%s%P!<$NDj5A$rD4$Y$F!"$=$l$K$"$o$;$?%3%^%s%I$r<B9T$9$k(B */ ++/* if OK return 1, else if ERROR return 0 */ ++int ++LoadMGCSFX(file_name, pinfo) ++ char *file_name; ++ PICINFO *pinfo; ++{ ++ unsigned char *buffer; ++ int size; ++ mgcsfxtab *magic; ++ mgcsfxtab *magic_cur; ++ char *ptr; ++ char command[1024]; ++ int fd[2]; ++ int pid = -2; ++ int file; ++ char *fname; ++ int rv; ++ int pst; ++ ++ int i_it; ++ char *i_com; ++ ++ WaitCursor(); ++ ++ fname = file_name; ++ if((file = open (fname, O_RDONLY))<0){ ++ SetISTR(ISTR_WARNING, "Can't open %s",fname); ++ return 0; ++ } ++ ++ if((buffer = (unsigned char *)calloc(need_buf_size, sizeof(char))) == NULL){ ++ SetISTR(ISTR_WARNING, "Can't allocate memory"); ++ return 0; ++ } ++ ++ magic_cur = NULL; ++ ++/* do{ */ ++ size = read (file, buffer, need_buf_size); ++ ++ if (lseek (file, 0L, 0) < 0){ /* can't seek pipe !! */ ++ fprintf (stderr, "Can't lseek %s\n", file_name); ++ close(file); ++ return 0; ++ } ++ ++ magic = find_mgcsfx (fname, buffer, size); ++ ++ if ((magic != NULL && magic->input_command) || ++ (magic == NULL && mgcsfx && input_command_ex_flag)){ ++ ++ if(magic == NULL){ ++ if (fname != NULL && (ptr = strstr(input_command_ex, "%s"))){ ++ sprintf (command, input_command_ex, fname); ++ }else{ ++ strcpy (command, input_command_ex); ++ fname=NULL; ++ } ++ }else{ ++ /* Use stdin or give file name */ ++ if (fname != NULL && (ptr = strstr(magic->input_command, "%s"))){ ++ sprintf (command, magic->input_command, fname); ++ }else{ ++ strcpy (command, magic->input_command); ++ fname=NULL; ++ } ++ } ++ ++ /* Do the pipe/fork/exec here */ ++ if (pipe (fd) < 0){ ++ fprintf (stderr, "Can't pipe : %s\n", file_name); ++ close(file); ++ return 0; ++ } ++ ++ if ((pid = vfork ()) < 0){ ++ fprintf (stderr, "Can't vfork : %s\n", file_name); ++ close (fd[0]); ++ close (fd[1]); ++ close(file); ++ return 0; ++ } ++ ++ if (!pid){ ++ close(0); ++ if (fname == NULL || (open ("/dev/null", O_RDONLY) < 0)){ ++ dup(file); ++ } ++ close(file); ++ close(1); ++ dup(fd[1]); ++ close(2); ++ open("/dev/null", O_WRONLY); ++ close(fd[0]); ++ execl("/bin/sh", "/bin/sh", "-c", command, 0); ++ _exit(127); ++ } ++ ++ close (fd[1]); ++ dup2(fd[0], file); ++ close (fd[0]); ++ fname = NULL; ++ magic_cur = magic; ++ } ++/* } while(magic != NULL); */ ++ ++ free(buffer); ++ ++ if(magic_cur == NULL && mgcsfx && input_command_ex_flag){ ++ i_it = IT_PNM; ++ i_com = input_command_ex; ++ }else{ ++ i_it = magic_cur->input_image_type; ++ i_com = magic_cur->input_command; ++ } ++ ++ if((magic_cur != NULL && i_com) || ++ (magic_cur == NULL && mgcsfx && input_command_ex_flag)){ ++ switch(i_it){ ++ case IT_PNM: ++ case IT_PPM: ++ case IT_PGM: ++ case IT_PBM: ++ case IT_PNM_RAW: ++ case IT_PPM_RAW: ++ case IT_PGM_RAW: ++ case IT_PBM_RAW: ++ case IT_PNM_ASCII: ++ case IT_PPM_ASCII: ++ case IT_PGM_ASCII: ++ case IT_PBM_ASCII: ++ rv = LoadPBM(file_name, pinfo, file); ++ break; ++ case IT_GIF: ++ case IT_JPEG: ++ case IT_TIFF: ++ case IT_JFIF: ++ case IT_XBM: ++ case IT_XPM: ++ case IT_BMP: ++ case IT_SUNRAS: ++ case IT_IRIS: ++ case IT_XWD: ++ case IT_MAG: ++ case IT_MAKI: ++ case IT_PI: ++ case IT_PIC: ++ case IT_PIC2: ++ SetISTR(ISTR_WARNING, "Yet supported input image type (from filter output)"); ++ rv = 0; ++ break; ++ case IT_UNKNOWN: ++ SetISTR(ISTR_WARNING, "Unknown input image type (from filter output)"); ++ rv = 0; ++ break; ++#ifdef HAVE_MGCSFX_AUTO ++ case IT_AUTO: ++#endif ++ default: ++ SetISTR(ISTR_WARNING, "Error in input image type (from filter output)"); ++ rv = 0; ++ break; ++ } ++ }else{ ++ rv = 0; ++ } ++ ++ /* fail if pid still == -2? */ ++ while(wait(&pst) != pid); /* FIXME? pid isn't necessarily initialized... */ ++ if( *((char *)&pst) != 0 ) rv = 0; ++ ++ input_command_ex_flag = 0; ++ ++ return rv; ++ ++ /* fclose(fp); close in Load??? */ ++ /* return 0; error */ ++ /* return 1; ok */ ++} ++ ++ ++ ++ ++ ++/*--------------------------------------------------------------------------*/ ++#ifndef MGCSFX_DEFAULT_INPUT_COMMAND ++# define MGCSFX_DEFAULT_INPUT_COMMAND "tifftopnm" ++#endif ++#ifndef MGCSFX_DEFAULT_OUTPUT_COMMAND ++# define MGCSFX_DEFAULT_OUTPUT_COMMAND "pnmtotiff" ++#endif ++ ++int MSWIDE = 0; ++int MSHIGH = 0; ++ ++#define MS_NBUTTS 2 ++#define MS_BOK 0 ++#define MS_BCANC 1 ++#define BUTTW 60 /* width of buttons (OK or Cancel) */ ++#define BUTTH 24 /* height of buttons (OK or Cancel) */ ++#define RBSIZE 15 /* width and height of RB button (select, ON or OFF)*/ ++#define CWIDE 8 /* width of character */ ++/* #define CHIGH height of character defined in xv.h */ ++#define MARGIN 3 /* margin of button and label SPACING */ ++ ++#define MSD_TITLE "Save file with external command..." ++#define MSD_RBTITLE "Type of Magic and Suffix" ++#define MSD_IC_TITLE "input command" ++ ++static BUTT msbut[MS_NBUTTS]; ++static RBUTT *typeRB; ++ ++static char output_command_ex[1024]; ++static int output_command_ex_flag = 0; ++ ++static int colorType; ++ ++static int w_pid; ++static int w_pstatus; ++ ++#define MSNAMWIDE 252 /* width of 'file name' entry window */ ++#define MAXFNLEN 256 /* max len of filename being entered */ ++static char DialogFileName[MAXFNLEN+100]; /* filename being entered */ ++static int curPos, stPos, enPos; /* filename textedit stuff */ ++ ++ ++static mgcsfxtab *get_mgcsfx PARM((int)); ++static void changeSuffix PARM((int)); ++ ++static int WriteMGCSFX PARM((FILE**,byte*,int,int,int, ++ byte*,byte*,byte*,int,int,char*, ++ int, int, char*)); ++void CreateMGCSFXW PARM((void)); ++void MGCSFXDialog PARM((int)); ++int MGCSFXCheckEvent PARM((XEvent *)); ++int MGCSFXSaveParams PARM((char *, int)); ++ ++static void drawMSD PARM((int,int,int,int)); ++static void clickMSD PARM((int,int)); ++static void doCmd PARM((int)); ++static int writeMGCSFX PARM((void)); ++ ++static void changeSuffix PARM((int)); ++static void redrawNamMSD PARM((void)); ++static void showFNamMSD PARM((void)); ++static int keyinMSD PARM((int)); ++ ++int getInputCom PARM((void)); ++int getOutputCom PARM((void)); ++/*--------------------------------------------------------------------------*/ ++ ++/***************************************************/ ++/* $B$I$l$rA*$s$@$+D4$Y$k!##0$O%3%^%s%I$rF~NO$9$k$b$N$H$9$k(B */ ++static mgcsfxtab *get_mgcsfx(ms_type) ++ int ms_type; ++{ ++ mgcsfxtab *magic; ++ int i; ++ ++ magic = NULL; ++ if(ms_type != 0){ ++ i = 1; ++ for(magic = mgcsfx_table; (magic && i<ms_type); magic = magic->next){i++;} ++ } ++ return magic; ++} ++ ++/***************************************************/ ++/* $B30It%3%^%s%I$r<B9T$7$F!"$=$l$K=PNO$9$k(B */ ++/* if OK return 0, else if ERROR return -1 */ ++static ++int WriteMGCSFX(fp,pic,ptype,w,h,rmap,gmap,bmap,numcols,colorstyle,file_name, ++ ms_type, file, comment) ++ FILE **fp; ++ byte *pic; ++ int ptype, w,h; ++ byte *rmap, *gmap, *bmap; ++ int numcols, colorstyle; ++ char *file_name; ++ int ms_type; ++ int file; /* file descriptor */ ++ char *comment; ++{ ++ mgcsfxtab *magic; ++ ++ int fd[2]; ++ int pid; ++ int rv; ++ ++ WaitCursor(); ++ ++#ifdef USE_SIGCHLD ++ w_p_fail = 1; ++#endif ++ ++ magic = get_mgcsfx(ms_type); ++ if(ms_type != 0 && magic == NULL) return -1; ++ ++ if ((ms_type == 0 && output_command_ex_flag) || ++ (ms_type !=0 && magic != NULL && magic->output_command)){ ++ ++ /* Do the pipe/fork/exec here */ ++ if (pipe (fd) < 0){ ++ fprintf (stderr, "Can't pipe : %s\n", file_name); ++ return -1; ++ } ++ ++ if ((pid = vfork ()) < 0){ ++ fprintf (stderr, "Can't vfork : %s\n", file_name); ++ close (fd[0]); ++ close (fd[1]); ++ return -1; ++ } ++ ++ if (!pid){ ++ close(1); ++ dup(file); ++ close(file); ++ close(0); ++ dup(fd[0]); ++ close(2); ++ open("/dev/null", O_WRONLY); ++ close(fd[1]); ++ if(ms_type == 0){ ++ execl("/bin/sh", "/bin/sh", "-c", output_command_ex, 0); ++ }else{ ++ execl("/bin/sh", "/bin/sh", "-c", magic->output_command, 0); ++ } ++ _exit(127); ++ } ++ ++ close (fd[0]); ++ dup2(fd[1], file); ++ close (fd[1]); ++ ++ }else{ ++ return -1; ++ } ++ ++ ++ *fp = fdopen(file, "w"); ++ ++ /* sleep(1); Best way is wait for checking SIGCHLD, but it's feel waist.*/ ++ ++#ifdef USE_SIGCHLD ++ if(w_p_fail != 2){ ++#endif ++ if(ms_type == 0){ ++ rv = WritePBM(*fp,pic,ptype,w,h,rmap,gmap,bmap,numcols,colorstyle, ++ 1, comment); ++ }else{ ++ switch(magic -> output_image_type){ ++ case IT_PNM: ++ case IT_PPM: ++ case IT_PGM: ++ case IT_PBM: ++ case IT_PNM_RAW: ++ case IT_PPM_RAW: ++ case IT_PGM_RAW: ++ case IT_PBM_RAW: ++ rv = WritePBM(*fp,pic,ptype,w,h,rmap,gmap,bmap,numcols,colorstyle, ++ 1, comment); ++ break; ++ case IT_PNM_ASCII: ++ case IT_PPM_ASCII: ++ case IT_PGM_ASCII: ++ case IT_PBM_ASCII: ++ rv = WritePBM(*fp,pic,ptype,w,h,rmap,gmap,bmap,numcols,colorstyle, ++ 0, comment); ++ break; ++ case IT_GIF: ++ case IT_JPEG: ++ case IT_TIFF: ++ case IT_JFIF: ++ case IT_XBM: ++ case IT_XPM: ++ case IT_BMP: ++ case IT_SUNRAS: ++ case IT_IRIS: ++ case IT_XWD: ++ case IT_MAG: ++ case IT_MAKI: ++ case IT_PI: ++ case IT_PIC: ++ case IT_PIC2: ++ SetISTR(ISTR_WARNING, "Yet supported output image type (to filter input)"); ++ rv = -1; ++ break; ++ case IT_UNKNOWN: ++ SetISTR(ISTR_WARNING, "Unknown output image type (to filter input)"); ++ rv = -1; ++ break; ++#ifdef HAVE_MGCSFX_AUTO ++ case IT_AUTO: ++#endif ++ default: ++ SetISTR(ISTR_WARNING, "Error in output image type (to filter input)"); ++ rv = -1; ++ break; ++ } ++ } ++#ifdef USE_SIGCHLD ++ }else{ ++ rv = -1; ++ } ++#endif ++ ++#ifdef USE_SIGCHLD ++ if(w_p_fail != 2){ ++#endif ++ w_pid = pid; ++#ifdef USE_SIGCHLD ++ w_p_fail = 0; ++ }else{ ++ rv = -1; ++ } ++#endif ++ ++ output_command_ex_flag = 0; ++ ++ return rv; ++ ++ /* fclose(*fp); close in CloseOutFile in writeMGCSFX */ ++ /* return 0; ok */ ++ /* return -1; error */ ++} ++ ++/***************************************************/ ++void CreateMGCSFXW() ++{ ++ int y; ++ int type_num; ++ mgcsfxtab *entry; ++ ++ if (mgcsfx_setup_flag == 0) init_mgcsfx (); ++ ++ if(desc_width < strlen(MSD_IC_TITLE)) desc_width = strlen(MSD_IC_TITLE); ++ nitem_mgcsfx ++; ++ ++ MSWIDE = desc_width * CWIDE + RBSIZE + 36; /* 36 is start of RB button */ ++ MSHIGH = nitem_mgcsfx * (RBSIZE + MARGIN); ++ ++ if(MSWIDE < strlen(MSD_TITLE) + 20) MSWIDE = strlen(MSD_TITLE) + 20; ++ if(MSWIDE < strlen(MSD_RBTITLE) + 16) MSWIDE = strlen(MSD_RBTITLE) + 16; ++ if(MSWIDE < MSNAMWIDE + 10) MSWIDE = MSNAMWIDE + 10; ++ if(MSWIDE < BUTTW * 2 + 10) MSWIDE = BUTTW * 2 + 10; ++ ++ MSHIGH += 55 + LINEHIGH + 10 + BUTTH + 10; ++ ++ MSWIDE += 20; /* right side margin */ ++ MSHIGH += 10; /* RB buttun down side margin */ ++ ++ ++ mgcsfxW = CreateWindow("xv mgcsfx", "XVmgcsfx", NULL, ++ MSWIDE, MSHIGH, infofg, infobg, 0); ++ if (!mgcsfxW) FatalError("can't create mgcsfx window!"); ++ ++ XSelectInput(theDisp, mgcsfxW, ++ ExposureMask | ButtonPressMask | KeyPressMask); ++ ++ mgcsfxNameW = XCreateSimpleWindow(theDisp, mgcsfxW, ++ 10, MSHIGH-LINEHIGH-10-BUTTH-10-1, ++ (u_int) MSNAMWIDE+6, (u_int) LINEHIGH+5, ++ 1, infofg, infobg); ++ if (!mgcsfxNameW) FatalError("can't create mgcsfx name window"); ++ XSelectInput(theDisp, mgcsfxNameW, ExposureMask); ++ ++ /* Ok $B%\%?%s(B */ ++ BTCreate(&msbut[MS_BOK], mgcsfxW, ++ MSWIDE-BUTTW-10-BUTTW-10-1, MSHIGH-BUTTH-10-1, ++ BUTTW, BUTTH, ++ "Ok", infofg, infobg, hicol, locol); ++ /* Cancel $B%\%?%s(B*/ ++ BTCreate(&msbut[MS_BCANC], mgcsfxW, ++ MSWIDE-BUTTW-10-1, MSHIGH-BUTTH-10-1, ++ BUTTW, BUTTH, ++ "Cancel", infofg, infobg, hicol, locol); ++ ++ y = 55; ++ /* User should input command to exec external command */ ++ typeRB = RBCreate(NULL, mgcsfxW, 36, y, MSD_IC_TITLE, ++ infofg, infobg,hicol,locol); ++ y += (RBSIZE + MARGIN); /* 18 */ ++ ++ type_num = 1; ++ for (entry = mgcsfx_table; entry; entry = entry->next){ ++ RBCreate(typeRB, mgcsfxW, 36, y, entry->description, ++ infofg, infobg,hicol,locol); ++ y += (RBSIZE + MARGIN); /* 18 */ ++ if(entry->output_command == NULL){ ++ RBSetActive(typeRB, type_num, 0); /* if no command, off */ ++ } ++ type_num++; ++ } ++ ++ XMapSubwindows(theDisp, mgcsfxW); ++} ++ ++ ++/***************************************************/ ++void MGCSFXDialog(vis) ++ int vis; ++{ ++ if (vis) { ++ CenterMapWindow(mgcsfxW, msbut[MS_BOK].x + msbut[MS_BOK].w/2, ++ msbut[MS_BOK].y + msbut[MS_BOK].h/2, MSWIDE, MSHIGH); ++ } ++ else XUnmapWindow(theDisp, mgcsfxW); ++ mgcsfxUp = vis; ++} ++ ++ ++/***************************************************/ ++int MGCSFXCheckEvent(xev) ++ XEvent *xev; ++{ ++ /* check event to see if it's for one of our subwindows. If it is, ++ deal accordingly, and return '1'. Otherwise, return '0' */ ++ ++ int rv; ++ rv = 1; ++ ++ if (!mgcsfxUp) return (0); ++ ++ if (xev->type == Expose) { ++ int x,y,w,h; ++ XExposeEvent *e = (XExposeEvent *) xev; ++ x = e->x; y = e->y; w = e->width; h = e->height; ++ ++ if (e->window == mgcsfxW) drawMSD(x, y, w, h); ++ else rv = 0; ++ } ++ ++ else if (xev->type == ButtonPress) { ++ XButtonEvent *e = (XButtonEvent *) xev; ++ int x,y; ++ x = e->x; y = e->y; ++ ++ if (e->button == Button1) { ++ if (e->window == mgcsfxW) clickMSD(x,y); ++ else rv = 0; ++ } /* button1 */ ++ else rv = 0; ++ } /* button press */ ++ ++ else if (xev->type == KeyPress) { ++ XKeyEvent *e = (XKeyEvent *) xev; ++ char buf[128]; KeySym ks; XComposeStatus status; ++ int stlen; ++ ++ stlen = XLookupString(e,buf,128,&ks,&status); ++ buf[stlen] = '\0'; ++ ++ if (e->window == mgcsfxW) { ++ if (stlen) { ++ keyinMSD(buf[0]); ++ } ++ } ++ else rv = 0; ++ } ++ else rv = 0; ++ ++ if (rv == 0 && (xev->type == ButtonPress || xev->type == KeyPress)) { ++ XBell(theDisp, 50); ++ rv = 1; /* eat it */ ++ } ++ ++ return (rv); ++} ++ ++ ++/***************************************************/ ++int MGCSFXSaveParams(fname, col) ++ char *fname; ++ int col; ++{ ++ colorType = col; ++ strcpy(DialogFileName, GetDirFName()); ++ return (0); ++} ++ ++/***************************************************/ ++/* $B%@%$%"%m%0$rI=<($9$k$H$-$N=hM}(B */ ++static void drawMSD(x,y,w,h) ++ int x,y,w,h; ++{ ++ int i; ++ XRectangle xr; ++ ++ xr.x = x; xr.y = y; xr.width = w; xr.height = h; ++ XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted); ++ ++ XSetForeground(theDisp, theGC, infofg); ++ XSetBackground(theDisp, theGC, infobg); ++ ++ for (i = 0; i < MS_NBUTTS; i++) BTRedraw(&msbut[i]); ++ ++ ULineString(mgcsfxW, typeRB->x-16, typeRB->y-3-DESCENT, ++ MSD_RBTITLE); ++ RBRedraw(typeRB, -1); ++ ++ DrawString(mgcsfxW, 20, 29, MSD_TITLE); ++ ++ XSetClipMask(theDisp, theGC, None); ++ ++ showFNamMSD(); ++} ++ ++/***************************************************/ ++/* $B%@%$%"%m%0$r%/%j%C%/$7$?$H$-$N=hM}(B */ ++static void clickMSD(x,y) ++ int x,y; ++{ ++ int i; ++ BUTT *bp; ++ ++ /* check BUTTs */ ++ ++ /* check the RBUTTS first, since they don't DO anything */ ++ if ((i = RBClick(typeRB, x,y)) >= 0) { /* $BA*Br(B(type)$B%\%?%s$N=hM}(B */ ++ (void) RBTrack(typeRB, i); /* $BA*Br(B(type)$B%\%?%s$r2!$7$?$H$-(B */ ++ changeSuffix(i); ++ return; ++ } ++ ++ for (i = 0; i < MS_NBUTTS; i++) { /* Ok,Cancel $B%\%?%s$N=hM}(B */ ++ bp = &msbut[i]; ++ if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) ++ break; ++ } ++ if (i < MS_NBUTTS) /* found one */ /* Ok,Cancel $B%\%?%s$r2!$7$?$H$-(B */ ++ if (BTTrack(bp)) doCmd(i); ++} ++ ++/***************************************************/ ++/* $B%\%?%s(B(Ok, Cancel) $B$N=hM}(B */ ++static void doCmd(cmd) ++ int cmd; ++{ ++ int rv; ++ ++ switch (cmd) { ++ case MS_BOK: /* Ok button */ { ++ char *fullname; ++ ++ rv = writeMGCSFX(); /* Save with filter(MGCSFX) */ ++ MGCSFXDialog(0); ++ ++ fullname = GetDirFullName(); ++ if (!ISPIPE(fullname[0])) { ++ XVCreatedFile(fullname); ++ if(!rv) StickInCtrlList(0); ++ } ++ } ++ break; ++ case MS_BCANC: /* Cancel button */ ++ DialogFileName[0] = '\0'; ++ curPos = stPos = enPos = 0; ++ MGCSFXDialog(0); ++ break; ++ default: ++ break; ++ } ++} ++ ++/*******************************************/ ++static int writeMGCSFX() ++{ ++ int rv, type; ++ int ptype, w, h, pfree, nc; ++ byte *inpix, *rmap, *gmap, *bmap; ++ ++ FILE *fp = NULL; ++ int file; ++ char *fullname; ++ ++ rv = -1; ++ type = RBWhich(typeRB); ++ ++ SetDirFName(DialogFileName); /* change filename in dir dialog */ ++ fullname = GetDirFullName(); ++ ++ if(type == 0){ ++ if(getOutputCom() == 0) return rv; ++ } ++ ++ file = OpenOutFileDesc(fullname); ++ if(file < 0) return rv; ++ ++ WaitCursor(); ++ inpix = GenSavePic(&ptype, &w, &h, &pfree, &nc, &rmap, &gmap, &bmap); ++ ++ rv = WriteMGCSFX(&fp, inpix, ptype, w, h, ++ rmap, gmap, bmap, nc, colorType, fullname, ++ type, file, picComments); ++ ++ SetCursors(-1); ++ ++ if (CloseOutFile(fp, fullname, rv) == 0) DirBox(0); ++ ++ WaitCursor(); ++#ifdef USE_SIGCHLD ++ if(w_p_fail == 0){ ++#endif ++ while(wait(&w_pstatus) != w_pid); /* if( *((char *)&w_pstatus) != 0 ) ; */ ++#ifdef USE_SIGCHLD ++ }else{ ++ w_p_fail = 0; ++ } ++#endif ++ w_pid = 0; ++ w_pstatus = 0; ++ ++ if (pfree) free(inpix); ++ return rv; ++} ++ ++ ++/***************************************/ ++static void changeSuffix(ms_type) ++ int ms_type; ++{ ++ /* see if there's a common suffix at the end of the DialogFileName. ++ if there is, remember what case it was (all caps or all lower), lop ++ it off, and replace it with a new appropriate suffix, in the ++ same case */ ++ ++ int allcaps; ++ char *suffix, *sp, *dp, lowsuf[512]; ++ mgcsfxtab *magic; ++ ++ /* find the last '.' in the DialogFileName */ ++ suffix = (char *) rindex(DialogFileName, '.'); ++ if (!suffix) return; ++ suffix++; /* point to first letter of the suffix */ ++ ++ /* check for all-caposity */ ++ for (sp = suffix, allcaps=1; *sp; sp++) ++ if (islower(*sp)) allcaps = 0; ++ ++ /* copy the suffix into an all-lower-case buffer */ ++ for (sp=suffix, dp=lowsuf; *sp; sp++, dp++) { ++ *dp = (isupper(*sp)) ? tolower(*sp) : *sp; ++ } ++ *dp = '\0'; ++ ++ ++ magic = get_mgcsfx(ms_type); ++ if(magic != NULL && magic->suffix != NULL){ ++ strcpy(lowsuf,(magic->suffix)+1); ++ ++ if (allcaps) { /* upper-caseify lowsuf */ ++ for (sp=lowsuf; *sp; sp++) ++ *sp = (islower(*sp)) ? toupper(*sp) : *sp; ++ } ++ ++ /* one other case: if the original suffix started with a single ++ capital letter, make the new suffix start with a single cap */ ++ if (isupper(suffix[0])) lowsuf[0] = toupper(lowsuf[0]); ++ ++ strcpy(suffix, lowsuf); /* tack onto DialogFileName */ ++ showFNamMSD(); ++ } ++} ++ ++/***************************************************/ ++/* $B%@%$%"%m%0Fb$K%U%!%$%k%M!<%`$rI=<($9$k$H$-$N=hM}(B ($B2<@A$1(B)*/ ++static void redrawNamMSD() ++{ ++ int cpos; ++ ++ /* draw substring DialogFileName[stPos:enPos] and cursor */ ++ ++ Draw3dRect(mgcsfxNameW, 0, 0, (u_int) MSNAMWIDE+5, (u_int) LINEHIGH+4, R3D_IN, 2, ++ hicol, locol, infobg); ++ ++ XSetForeground(theDisp, theGC, infofg); ++ ++ if (stPos>0) { /* draw a "there's more over here" doowah */ ++ XDrawLine(theDisp, mgcsfxNameW, theGC, 0,0,0,LINEHIGH+5); ++ XDrawLine(theDisp, mgcsfxNameW, theGC, 1,0,1,LINEHIGH+5); ++ XDrawLine(theDisp, mgcsfxNameW, theGC, 2,0,2,LINEHIGH+5); ++ } ++ ++ if ((size_t) enPos < strlen(DialogFileName)) { ++ /* draw a "there's more over here" doowah */ ++ XDrawLine(theDisp, mgcsfxNameW, theGC, MSNAMWIDE+5,0,MSNAMWIDE+5,LINEHIGH+5); ++ XDrawLine(theDisp, mgcsfxNameW, theGC, MSNAMWIDE+4,0,MSNAMWIDE+4,LINEHIGH+5); ++ XDrawLine(theDisp, mgcsfxNameW, theGC, MSNAMWIDE+3,0,MSNAMWIDE+3,LINEHIGH+5); ++ } ++ ++ XDrawString(theDisp, mgcsfxNameW, theGC,3,ASCENT+3,DialogFileName+stPos, enPos-stPos); ++ ++ cpos = XTextWidth(mfinfo, &DialogFileName[stPos], curPos-stPos); ++ XDrawLine(theDisp, mgcsfxNameW, theGC, 3+cpos, 2, 3+cpos, 2+CHIGH+1); ++ XDrawLine(theDisp, mgcsfxNameW, theGC, 3+cpos, 2+CHIGH+1, 5+cpos, 2+CHIGH+3); ++ XDrawLine(theDisp, mgcsfxNameW, theGC, 3+cpos, 2+CHIGH+1, 1+cpos, 2+CHIGH+3); ++} ++ ++/***************************************************/ ++/* $B%@%$%"%m%0Fb$K%U%!%$%k%M!<%`$rI=<($9$k(B */ ++static void showFNamMSD() ++{ ++ int len; ++ ++ len = strlen(DialogFileName); ++ ++ if (curPos<stPos) stPos = curPos; ++ if (curPos>enPos) enPos = curPos; ++ ++ if (stPos>len) stPos = (len>0) ? len-1 : 0; ++ if (enPos>len) enPos = (len>0) ? len-1 : 0; ++ ++ /* while substring is shorter than window, inc enPos */ ++ ++ while (XTextWidth(mfinfo, &DialogFileName[stPos], enPos-stPos) < MSNAMWIDE ++ && enPos<len) { enPos++; } ++ ++ /* while substring is longer than window, dec enpos, unless enpos==curpos, ++ in which case, inc stpos */ ++ ++ while (XTextWidth(mfinfo, &DialogFileName[stPos], enPos-stPos) > MSNAMWIDE) { ++ if (enPos != curPos) enPos--; ++ else stPos++; ++ } ++ ++ ++ if (ctrlColor) XClearArea(theDisp, mgcsfxNameW, 2,2, (u_int) MSNAMWIDE+5-3, ++ (u_int) LINEHIGH+4-3, False); ++ else XClearWindow(theDisp, mgcsfxNameW); ++ ++ redrawNamMSD(); ++ BTSetActive(&msbut[MS_BOK], strlen(DialogFileName)!=0); ++} ++ ++/***************************************************/ ++/* $B%-!<F~NO$7$?$H$-$N=hM}(B */ ++static int keyinMSD(c) ++ int c; ++{ ++ /* got keypress in dirW. stick on end of DialogFileName */ ++ int len; ++ ++ len = strlen(DialogFileName); ++ ++ if (c>=' ' && c<'\177') { /* printable characters */ ++ /* note: only allow 'piped commands' in savemode... */ ++ ++ /* only allow spaces in 'piped commands', not filenames */ ++ if (c==' ' && (!ISPIPE(DialogFileName[0]) || curPos==0)) return (-1); ++ ++ /* only allow vertbars in 'piped commands', not filenames */ ++ if (c=='|' && curPos!=0 && !ISPIPE(DialogFileName[0])) return(-1); ++ ++ if (len >= MAXFNLEN-1) return(-1); /* max length of string */ ++ xvbcopy(&DialogFileName[curPos], &DialogFileName[curPos+1], (size_t) (len-curPos+1)); ++ DialogFileName[curPos]=c; curPos++; ++ } ++ ++ else if (c=='\010' || c=='\177') { /* BS or DEL */ ++ if (curPos==0) return(-1); /* at beginning of str */ ++ xvbcopy(&DialogFileName[curPos], &DialogFileName[curPos-1], (size_t) (len-curPos+1)); ++ curPos--; ++ } ++ ++ else if (c=='\025') { /* ^U: clear entire line */ ++ DialogFileName[0] = '\0'; ++ curPos = 0; ++ } ++ ++ else if (c=='\013') { /* ^K: clear to end of line */ ++ DialogFileName[curPos] = '\0'; ++ } ++ ++ else if (c=='\001') { /* ^A: move to beginning */ ++ curPos = 0; ++ } ++ ++ else if (c=='\005') { /* ^E: move to end */ ++ curPos = len; ++ } ++ ++ else if (c=='\004') { /* ^D: delete character at curPos */ ++ if (curPos==len) return(-1); ++ xvbcopy(&DialogFileName[curPos+1], &DialogFileName[curPos], (size_t) (len-curPos)); ++ } ++ ++ else if (c=='\002') { /* ^B: move backwards char */ ++ if (curPos==0) return(-1); ++ curPos--; ++ } ++ ++ else if (c=='\006') { /* ^F: move forwards char */ ++ if (curPos==len) return(-1); ++ curPos++; ++ } ++ ++ else if (c=='\012' || c=='\015') { /* CR(\r) or LF(\n) */ ++ FakeButtonPress(&msbut[MS_BOK]); ++ } ++ ++ else if (c=='\033') { /* ESC = Cancel */ ++ FakeButtonPress(&msbut[MS_BCANC]); ++ } ++ ++ else if (c=='\011') { /* tab = filename expansion */ ++ if (1 /* !autoComplete() */) XBell(theDisp, 0); ++ else { ++ curPos = strlen(DialogFileName); ++ } ++ } ++ ++ else return(-1); /* unhandled character */ ++ ++ showFNamMSD(); ++ ++ return(0); ++} ++ ++ ++/*******************************************/ ++int getInputCom() ++{ ++ static char *labels[] = { "\nOk", "\033Cancel" }; ++ int i; ++ ++ strcpy(input_command_ex, MGCSFX_DEFAULT_INPUT_COMMAND); ++ i = GetStrPopUp("Input External Command (Input is PNM):", labels, 2, ++ input_command_ex, 1024, "",0); ++ if (i == 0 && strlen(input_command_ex) != 0){ ++ input_command_ex_flag = 1; ++ return 1; ++ }else{ ++ input_command_ex_flag = 0; ++ return 0; ++ } ++} ++ ++int getOutputCom() ++{ ++ static char *labels[] = { "\nOk", "\033Cancel" }; ++ int i; ++ ++ strcpy(output_command_ex, MGCSFX_DEFAULT_OUTPUT_COMMAND); ++ i = GetStrPopUp("Input External Command (Output is PNM_RAW):", labels, 2, ++ output_command_ex, 1024, "",0); ++ if (i == 0 && strlen(output_command_ex) != 0){ ++ output_command_ex_flag = 1; ++ return 1; ++ }else{ ++ output_command_ex_flag = 0; ++ return 0; ++ } ++} ++ ++#ifdef SVR4 ++Sigfunc * ++xv_signal(signo, func) ++ int signo; ++ Sigfunc *func; ++{ ++ struct sigaction act, oact; ++ ++ act.sa_handler = func; ++ sigemptyset(&act.sa_mask); ++ act.sa_flags = 0; ++ act.sa_flags |= SA_RESTART; ++ ++ if (sigaction(signo, &act, &oact) < 0) ++ return SIG_ERR; ++ ++ return oact.sa_handler; ++} ++#endif ++ ++#endif /* HAVE_MGCSFX */ +diff -ruN xv-3.10a-bugfixes/xvmisc.c xv-3.10a-enhancements/xvmisc.c +--- xv-3.10a-bugfixes/xvmisc.c 2005-03-20 22:47:06.000000000 -0800 ++++ xv-3.10a-enhancements/xvmisc.c 2005-04-17 14:45:28.000000000 -0700 +@@ -103,10 +103,18 @@ + if (!usesize || !(i&WidthValue)) w = defw; + if (!usesize || !(i&HeightValue)) h = defh; + +- hints.flags |= USSize; ++ hints.flags |= USSize | PWinGravity; + +- if (i&XValue && i&XNegative) x = dispWIDE - w - abs(x); +- if (i&YValue && i&YNegative) y = dispHIGH - h - abs(y); ++ hints.win_gravity = NorthWestGravity; ++ if (i&XValue && i&XNegative) { ++ hints.win_gravity = NorthEastGravity; ++ x = dispWIDE - (w + 2 * bwidth) - abs(x); ++ } ++ if (i&YValue && i&YNegative) { ++ hints.win_gravity = (hints.win_gravity == NorthWestGravity) ? ++ SouthWestGravity : SouthEastGravity; ++ y = dispHIGH - (h + 2 * bwidth) - abs(y); ++ } + + + #define VROOT_TRANS +@@ -142,20 +150,19 @@ + if (!win) return(win); /* leave immediately if couldn't create */ + + +- XSetStandardProperties(theDisp, win, name, name, None, NULL, 0, &hints); +- + xwmh.input = True; + xwmh.flags = InputHint; + if (iconPix) { xwmh.icon_pixmap = iconPix; xwmh.flags |= IconPixmapHint; } +- XSetWMHints(theDisp, win, &xwmh); + + if (clname && strlen(clname)) { + classh.res_name = "xv"; + classh.res_class = clname; +- XSetClassHint(theDisp, win, &classh); + StoreDeleteWindowProp(win); + } + ++ XmbSetWMProperties(theDisp, win, name, name, NULL, 0, &hints, &xwmh, ++ clname ? &classh : NULL); ++ + return(win); + } + +@@ -232,28 +239,28 @@ + int i = CK_NONE; + + if (ks==XK_Up || ks==XK_KP_Up || +- ks==XK_KP_8 || ks==XK_F28) i=CK_UP; ++ ks==XK_F28) i=CK_UP; + + else if (ks==XK_Down || ks==XK_KP_Down || +- ks==XK_KP_2 || ks==XK_F34) i=CK_DOWN; ++ ks==XK_F34) i=CK_DOWN; + + else if (ks==XK_Left || ks==XK_KP_Left || +- ks==XK_KP_4 || ks==XK_F30) i=CK_LEFT; ++ ks==XK_F30) i=CK_LEFT; + + else if (ks==XK_Right || ks==XK_KP_Right || +- ks==XK_KP_6 || ks==XK_F32) i=CK_RIGHT; ++ ks==XK_F32) i=CK_RIGHT; + + else if (ks==XK_Prior || ks==XK_KP_Prior || +- ks==XK_KP_9 || ks==XK_F29) i=CK_PAGEUP; ++ ks==XK_F29) i=CK_PAGEUP; + + else if (ks==XK_Next || ks==XK_KP_Next || +- ks==XK_KP_3 || ks==XK_F35) i=CK_PAGEDOWN; ++ ks==XK_F35) i=CK_PAGEDOWN; + + else if (ks==XK_Home || ks==XK_KP_Home || +- ks==XK_KP_7 || ks==XK_F27) i=CK_HOME; ++ ks==XK_F27) i=CK_HOME; + + else if (ks==XK_End || ks==XK_KP_End || +- ks==XK_KP_1 || ks==XK_F33) i=CK_END; ++ ks==XK_F33) i=CK_END; + + else i = CK_NONE; + +@@ -503,6 +510,11 @@ + as we have to keep the alloc'd colors around, but we don't want anything + else to stay */ + ++#ifdef AUTO_EXPAND ++ chdir(initdir); ++ Vdsettle(); ++#endif ++ + if (!theDisp) exit(i); /* called before connection opened */ + + if (useroot && i==0) { /* save the root info */ +@@ -526,6 +538,26 @@ + if (tiffW) XDestroyWindow(theDisp, tiffW); + #endif + ++#ifdef HAVE_PNG ++ if (pngW) XDestroyWindow(theDisp, pngW); ++#endif ++ ++#ifdef HAVE_PCD ++ if (pcdW) XDestroyWindow(theDisp, pcdW); ++#endif ++ ++#ifdef HAVE_PIC2 ++ if (pic2W) XDestroyWindow(theDisp, pic2W); ++#endif ++ ++#ifdef HAVE_MGCSFX ++ if (mgcsfxW) XDestroyWindow(theDisp, mgcsfxW); ++#endif ++ ++#ifdef HAVE_PNG ++ if (pngW) XDestroyWindow(theDisp, pngW); ++#endif ++ + /* if NOT using stdcmap for images, free stdcmap */ + if (colorMapMode != CM_STDCMAP) { + int j; +@@ -722,6 +754,26 @@ + #ifdef HAVE_TIFF + if (tiffW) XDefineCursor(theDisp, tiffW, otherc); + #endif ++ ++#ifdef HAVE_PNG ++ if (pngW) XDefineCursor(theDisp, pngW, otherc); ++#endif ++ ++#ifdef HAVE_PNG ++ if (pngW) XDefineCursor(theDisp, pngW, otherc); ++#endif ++ ++#ifdef HAVE_PCD ++ if (pcdW) XDefineCursor(theDisp, pcdW, otherc); ++#endif ++ ++#ifdef HAVE_PIC2 ++ if (pic2W) XDefineCursor(theDisp, pic2W, otherc); ++#endif ++ ++#ifdef HAVE_MGCSFX ++ if (mgcsfxW) XDefineCursor(theDisp, mgcsfxW, otherc); ++#endif + } + + +@@ -921,7 +973,7 @@ + void XVCreatedFile(fullname) + char *fullname; + { +- /* called whenever a file has been deleted. Updates browser & dir windows, ++ /* called whenever a file has been created. Updates browser & dir windows, + if necessary */ + + BRCreatedFile(fullname); +@@ -1006,6 +1058,9 @@ + ((rv=(char *) getenv("cwd"))==NULL)) rv = "./"; + strcpy(buf, rv); + } ++#ifdef AUTO_EXPAND ++ Vdtodir(buf); ++#endif + } + + +diff -ruN xv-3.10a-bugfixes/xvml.c xv-3.10a-enhancements/xvml.c +--- xv-3.10a-bugfixes/xvml.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvml.c 2005-04-17 22:57:34.000000000 -0700 +@@ -0,0 +1,989 @@ ++/* ++ * xvml.c - makes text item structure for multi-lingual textviewer. ++ * ++ * Entry Points: ++ * struct ml_text *ml_draw_text() ++ * struct context *ml_create_context() ++ * int ml_set_charsets() ++ * void get_monofont_size() ++ */ ++ ++#include "xv.h" ++#include <X11/Xresource.h> ++ ++#ifdef TV_MULTILINGUAL /* whole this file. */ ++ ++#include "xvml.h" ++#define HAVE_STRDUP 1 ++#define USE_MULE_EXTENSION ++ ++#ifndef __STDC__ ++#define CHAR char ++#else ++#define CHAR int ++#endif ++ ++#define CODE_SI 0x0e /* LS0 */ ++#define CODE_SO 0x0f /* LS1 */ ++#define CODE_SS2 ((unsigned char) 0x8e) ++#define CODE_SS3 ((unsigned char) 0x8f) ++ ++int ml_tab_width = 64; /* dots */ ++ ++struct charset { ++ int bpc; /* bytes per char */ ++ int noc; /* number of chars */ ++ char designator; ++ char *registry; ++ int bit7; ++ ++ int loaded; ++ char *fontname; ++ ++ XFontStruct *fs; ++} charset[] = { ++ { 1, 94, 'B', "iso8859-1", 0, 0, NULL, NULL}, ++ { 1, 96, 'A', "iso8859-1", 1, 0, NULL, NULL}, ++ { 1, 94, '0', "omron_udc_zh-0", 0, 0, NULL, NULL}, ++ { 1, 94, '2', "mulearabic-0", 0, 0, NULL, NULL}, ++ { 1, 94, '3', "mulearabic-1", 0, 0, NULL, NULL}, ++ { 1, 94, '4', "mulearabic-2", 0, 0, NULL, NULL}, ++ { 1, 94, 'J', "jisx0201.1976-0", 0, 0, NULL, NULL}, ++ { 1, 96, '0', "muleipa-1", 1, 0, NULL, NULL}, ++ { 1, 96, '1', "viscii1.1-1", 1, 0, NULL, NULL}, ++ { 1, 96, '2', "viscii1.1-1", 1, 0, NULL, NULL}, ++ { 1, 96, 'B', "iso8859-2", 1, 0, NULL, NULL}, ++ { 1, 96, 'C', "iso8859-3", 1, 0, NULL, NULL}, ++ { 1, 96, 'D', "iso8859-4", 1, 0, NULL, NULL}, ++ { 1, 96, 'T', "tis620.1986-0", 1, 0, NULL, NULL}, ++ { 1, 96, 'F', "iso8859-7", 1, 0, NULL, NULL}, ++ { 1, 96, 'G', "iso8859-6", 1, 0, NULL, NULL}, ++ { 1, 96, 'H', "iso8859-8", 1, 0, NULL, NULL}, ++ { 1, 94, 'I', "jisx0201.1976-0", 1, 0, NULL, NULL}, ++ { 1, 96, 'L', "iso8859-5", 1, 0, NULL, NULL}, ++ { 1, 96, 'M', "iso8859-9", 1, 0, NULL, NULL}, ++ { 2, 94, '2', "ethio-0", 0, 0, NULL, NULL}, ++ { 2, 94, '@', "jisx0208.1978", 0, 0, NULL, NULL}, ++ { 2, 94, 'A', "gb2312.1980-0", 0, 0, NULL, NULL}, ++ { 2, 94, 'B', "jisx0208.1983-0", 0, 0, NULL, NULL}, ++ { 2, 94, 'C', "ksc5601.1987-0", 0, 0, NULL, NULL}, ++ { 2, 94, 'D', "jisx0212.1990-0", 0, 0, NULL, NULL}, ++ { 2, 94, '0', "big5.eten-0", 0, 0, NULL, NULL}, ++ { 2, 94, '1', "big5.hku-0", 0, 0, NULL, NULL}, ++ /* End Mark */ ++ { 0, 0, 0, NULL, 0, 0, NULL, NULL}, ++}; ++#define NR_CHARSETS ((int) (sizeof charset / sizeof charset[0])) ++ ++static struct charset *ascii = NULL; ++ ++struct context { ++ struct charset *g[4]; ++ struct charset **gl, **gr; ++ struct charset **ss; ++ int eol; /* 0: \n, 1: \r\n, 2: \r, 3: any */ ++ int valid[4]; /* g[i] is valid? */ ++ int short_form; /* allow shortened designator sequence? */ ++ int lock_shift; /* allow locking shift? */ ++ ++ unsigned char *cbuf, *cbp; ++ struct ml_text text; ++ int line; ++ int delta; ++ int toolong; ++ ++ Display *dpy; ++ Screen *scr; ++ Window root_win; ++}; ++#define DPY (context->dpy) ++#define SCR (context->scr) ++#define ROOT_WIN (context->root_win) ++ ++static unsigned char *escape_sequence PARM((unsigned char *)); ++static unsigned char *designator_sequence PARM((unsigned char *)); ++static void locking_shift PARM((unsigned CHAR)); ++static void single_shift PARM((unsigned CHAR)); ++static void put_unknown_char PARM((unsigned CHAR)); ++static struct charset *search_charset PARM((int, int, int)); ++static void pack_string PARM((struct charset *, ++ unsigned char *, int)); ++static void init_xrm PARM((void)); ++static void init_xrm_fonts PARM((void)); ++static void init_xrm_tab PARM((void)); ++#ifndef HAVE_STRDUP ++static char *strdup PARM((char *)); ++#endif ++ ++static char *default_fonts[] = { /* default for xrm_fonts */ ++ "-sony-fixed-medium-r-normal--16-*-*-*-*-*-iso8859-1", ++ "-jis-fixed-medium-r-normal--16-*-*-*-*-*-jisx0208.1983-0", ++}; ++static int xrm_nfonts; ++static char **xrm_fonts; ++ ++static struct context *context; /* current context */ ++ ++struct ml_text *ml_draw_text(ctx, string, len) ++ struct context *ctx; ++ char *string; ++ int len; ++{ ++ unsigned char *str = (unsigned char *) string; ++ unsigned char *estr = str + len; ++ ++ context = ctx; ++ ++ if(ascii == NULL){ ++ fputs("ml_draw_text: call ml_set_charsets, first.\n", stderr); ++ return NULL; ++ } ++ ++ if(!str) ++ return &context->text; ++ ++ WaitCursor(); ++ ++ if (context->text.maxlines != 0) { ++ struct ml_text *tp = &context->text; ++ struct ml_line *lp; ++ int i; ++ for (i = tp->nlines, lp = tp->lines; i > 0; i--, lp++) { ++ if (lp->maxitems != 0) ++ free((char *) lp->items); ++ } ++ free((char *) tp->lines); ++ tp->maxlines = tp->nlines = 0; ++ } ++ if (context->cbuf != NULL) ++ free((char *) context->cbuf); ++ context->cbp = (unsigned char *) malloc((size_t) len * 8);/* all \xxx */ ++ context->cbuf = context->cbp; ++ context->line = 0; ++ context->delta = 0; ++ context->ss = NULL; ++ ++ while(str < estr){ ++ if((*str & 0x80) == 0){ /* left half */ ++ struct charset *cs = context->ss ? *context->ss : *context->gl; ++ unsigned char min_char, max_char; ++ if (cs != NULL) { ++ if(cs->noc == 94){ ++ min_char = 0x21; ++ max_char = 0x7e; ++ }else{ ++ min_char = 0x20; ++ max_char = 0x7f; ++ } ++ } ++ ++ if (cs == NULL) ++ put_unknown_char(*str++); ++ else if(*str < min_char || *str > max_char){ /* C1 */ ++ switch(*str){ ++ case ' ': ++ { ++ unsigned char *p = str + 1; ++ while (*p == ' ' && p < estr) ++ p++; ++ pack_string(ascii, str, (int) (p - str)); ++ str = p; ++ } ++ break; ++ ++ case '\t': ++ pack_string(ascii, str++, 0); ++ break; ++ ++ case '\n': ++ switch (context->eol) { ++ case 0: /* unix type eol */ ++ pack_string(ascii, str, 0); ++ WaitCursor(); ++ str++; ++ break; ++ case 1: /* dos type eol */ ++ case 2: /* mac type eol */ ++ put_unknown_char('\n'); ++ str++; ++ break; ++ case 3: /* any type eol */ ++ pack_string(ascii, str++, 0); ++ while (*str == '\n' || *str == '\r') ++ str++; ++ WaitCursor(); ++ break; ++ } ++ break; ++ ++ case '\r': ++ switch (context->eol) { ++ case 0: ++ put_unknown_char('\r'); ++ str++; ++ break; ++ case 1: ++ str++; ++ if (*str == '\n') ++ pack_string(ascii, str++, 0); ++ else ++ put_unknown_char('\r'); ++ break; ++ case 2: ++ pack_string(ascii, str, 0); ++ WaitCursor(); ++ str++; ++ break; ++ case 3: ++ pack_string(ascii, str++, 0); ++ while (*str == '\n' || *str == '\r') ++ str++; ++ WaitCursor(); ++ break; ++ } ++ break; ++ ++ case '\033': ++ { ++ unsigned char *p; ++ str++; ++ if((p = escape_sequence(str)) == str) ++ put_unknown_char('\033'); ++ else ++ str = p; ++ } ++ break; ++ ++ case CODE_SI: ++ case CODE_SO: ++ if (!context->lock_shift) ++ put_unknown_char((unsigned int) *str++); ++ else ++ locking_shift((unsigned int) *str++); ++ break; ++ ++ default: ++ put_unknown_char((unsigned int) *str++); ++ } ++ }else{ /* GL */ ++ if (context->ss != NULL) { ++ pack_string(cs, str, 1); ++ str += cs->bpc; ++ context->ss = NULL; ++ } else { ++ int n; ++ ++ if (cs->bpc == 1) { ++ unsigned char *p = str; ++ for (n = 0; p < estr; n++) { ++ if (*p < min_char || *p > max_char) ++ break; ++ p++; ++ } ++ pack_string(cs, str, n); ++ str = p; ++ } else { ++ unsigned char *p = str; ++ for (n = 0; p < estr - 1; n++) { ++ if (*p < min_char || *p > max_char || ++ *(p + 1) < min_char || *(p + 1) > max_char) ++ break; ++ p += 2; ++ } ++ if (n > 0) ++ pack_string(cs, str, n); ++ else ++ put_unknown_char(*p++); ++ str = p; ++ } ++ } ++ } ++ }else{ /* right half */ ++ struct charset *cs = context->ss ? *context->ss : *context->gr; ++ unsigned char min_char, max_char; ++ if (cs != NULL) { ++ if(cs->noc == 94){ ++ min_char = 0xa1; ++ max_char = 0xfe; ++ }else{ ++ min_char = 0xa0; ++ max_char = 0xff; ++ } ++ } ++ ++ if (cs == NULL) ++ put_unknown_char(*str++); ++ else if(*str < min_char || *str > max_char){ /* C2 */ ++ unsigned char c = *str++; ++ switch(c){ ++ case CODE_SS2: ++ case CODE_SS3: ++ single_shift((unsigned CHAR) c); ++ break; ++ default: ++ put_unknown_char(c); ++ } ++ }else{ /* GR */ ++ if (context->ss != NULL) { ++ pack_string(cs, str, 1); ++ str += cs->bpc; ++ context->ss = NULL; ++ } else { ++ int n; ++ ++ if (cs->bpc == 1) { ++ unsigned char *p = str; ++ for (n = 0; p < estr; n++) { ++ if (*p < min_char || *p > max_char) ++ break; ++ p++; ++ } ++ pack_string(cs, str, n); ++ str = p; ++ } else { ++ unsigned char *p = str; ++ for (n = 0; p < estr - 1; n++) { ++ if (*p < min_char || *p > max_char || ++ *(p + 1) < min_char || *(p + 1) > max_char) ++ break; ++ p += 2; ++ } ++ if (n > 0) ++ pack_string(cs, str, n); ++ else ++ put_unknown_char(*p++); ++ str = p; ++ } ++ } ++ } ++ } ++ } ++ ++ { ++ struct ml_text *tp = &context->text; ++ struct ml_line *lp; ++ int i; ++ ++ tp->width = 0; ++ tp->height = 0; ++ for (lp = tp->lines, i = tp->nlines; i > 0; lp++, i--) { ++ if (lp->nitems == 0) { ++ lp->ascent = ascii->fs->ascent; ++ lp->descent = ascii->fs->descent; ++ } ++ if (tp->width < lp->width) ++ tp->width = lp->width; ++ tp->height += lp->ascent + lp->descent; ++ } ++ } ++ ++ SetCursors(-1); ++ return &context->text; ++} ++ ++static unsigned char *escape_sequence(str) ++ unsigned char *str; ++{ ++ unsigned char *p; ++ switch(*str){ ++ case '$': ++ case '(': case ')': case '*': case '+': ++ case '-': case '.': case '/': case ',': ++ if((p = designator_sequence(str)) == NULL) ++ return str; ++ return p; ++ case 'n': case 'o': case '~': case '}': case '|': ++ if (!context->lock_shift) ++ return str; ++ locking_shift(*str); ++ return str + 1; ++ case 'N': case 'O': ++ single_shift(*str); ++ return str + 1; ++ } ++ return str; ++ ++} ++ ++static unsigned char *designator_sequence(str) ++ unsigned char *str; ++{ ++ unsigned char *p = str; ++ int noc, bpc, n_g, shortened; ++ unsigned char des; ++ struct charset *cs; ++ ++ if(*p == '$'){ ++ bpc = 2; ++ p++; ++ }else ++ bpc = 1; ++ ++ switch(*p++){ ++ case '(': noc = 94; n_g = 0; des = *p++; shortened = 0; break; ++ case ')': noc = 94; n_g = 1; des = *p++; shortened = 0; break; ++ case '*': noc = 94; n_g = 2; des = *p++; shortened = 0; break; ++ case '+': noc = 94; n_g = 3; des = *p++; shortened = 0; break; ++#ifdef USE_MULE_EXTENSION ++ case ',': noc = 96; n_g = 0; des = *p++; shortened = 0; break; ++#endif ++ case '-': noc = 96; n_g = 1; des = *p++; shortened = 0; break; ++ case '.': noc = 96; n_g = 2; des = *p++; shortened = 0; break; ++ case '/': noc = 96; n_g = 3; des = *p++; shortened = 0; break; ++ case '@': noc = 94; n_g = 0; des = 'B'; shortened = 0; break; ++ case 'A': noc = 94; n_g = 0; des = 'A'; shortened = 1; break; ++ case 'B': noc = 94; n_g = 0; des = 'B'; shortened = 1; break; ++ default: return NULL; ++ } ++ if (!context->short_form && shortened) ++ return NULL; ++ ++ if((cs = search_charset(bpc, noc, des)) == NULL){ ++ if(DEBUG){ ++ fprintf(stderr, "designator_sequence: (%d,%d,%c) not found.\n", ++ bpc, noc, des); ++ } ++ return NULL; ++ } ++ if (!context->valid[n_g]) ++ return NULL; ++ context->g[n_g] = cs; ++ if(DEBUG){ ++ fprintf(stderr, ++ "designator_sequence: G%d is `%s'.\n", n_g, cs->registry); ++ } ++ return p; ++} ++ ++static void locking_shift(c) ++ unsigned CHAR c; ++{ ++ switch((unsigned char) c){ ++ case CODE_SI: context->gl = &context->g[0]; break; ++ case CODE_SO: context->gl = &context->g[1]; break; ++ case 'n': context->gl = &context->g[2]; break; ++ case 'o': context->gl = &context->g[3]; break; ++ case '~': context->gr = &context->g[1]; break; ++ case '}': context->gr = &context->g[2]; break; ++ case '|': context->gr = &context->g[3]; break; ++ } ++ if(DEBUG){ ++ fprintf(stderr, "locking_shift: (%d,%d).\n", ++ (int)(context->gl - context->g), ++ (int)(context->gr - context->g)); ++ } ++} ++ ++static void single_shift(c) ++ unsigned CHAR c; ++{ ++ switch((unsigned char) c){ ++ case CODE_SS2: context->ss = &context->g[2]; break; ++ case CODE_SS3: context->ss = &context->g[3]; break; ++ } ++} ++ ++ ++static void put_unknown_char(chr) ++ unsigned CHAR chr; ++{ ++ unsigned char c = chr; ++ ++ if(c < 0x20){ ++ unsigned char buf[2]; ++ buf[0] = '^'; ++ buf[1] = c + 0x40; ++ pack_string(ascii, buf, 2); ++ }else{ ++ unsigned char buf[4]; ++ buf[0] = '\\'; ++ buf[1] = ((c >> 6) & 07) + '0'; ++ buf[2] = ((c >> 3) & 07) + '0'; ++ buf[3] = ((c ) & 07) + '0'; ++ pack_string(ascii, buf, 4); ++ } ++} ++ ++struct context *ml_create_context(s) ++ Screen *s; ++{ ++ context = (struct context *) malloc(sizeof *context); ++ ++ context->g[0] = NULL; ++ context->g[1] = NULL; ++ context->g[2] = NULL; ++ context->g[3] = NULL; ++ context->gl = NULL; ++ context->gr = NULL; ++ context->ss = NULL; ++ ++ context->cbuf = NULL; ++ context->text.maxlines = context->text.nlines = 0; ++ context->line = 0; ++ context->delta = 0; ++ context->toolong = 0; ++ ++ DPY = DisplayOfScreen(s); ++ SCR = s; ++ ROOT_WIN = RootWindowOfScreen(s); ++ ++ return context; ++} ++ ++ ++int ml_set_charsets(ctx, sys) ++ struct context *ctx; ++ struct coding_system *sys; ++{ ++ int retval = 0; ++ int i; ++ ++ context = ctx; ++ ++ if(ascii == NULL){ ++ init_xrm(); ++ if((ascii = search_charset(1, 94, 'B')) == NULL){ ++ fputs("ml_set_charsets: ascii charset not found.\n", stderr); ++ Quit(1); ++ } ++ if (ascii->fs == NULL) { ++ fputs("ml_set_charsets: iso8859-1 font not found.\n", stderr); ++ Quit(1); ++ } ++ } ++ for(i = 0; i < 4; i++){ ++ switch(sys->design[i].bpc){ ++ case -1: /* make G[i] invalid */ ++ context->valid[i] = 0; ++ break; ++ ++ case 0: /* don't change */ ++ break; ++ ++ case 1: case 2: /* change it */ ++ if((context->g[i] = search_charset(sys->design[i].bpc, ++ sys->design[i].noc, ++ sys->design[i].des)) == NULL){ ++ fputs("ml_set_charsets: ", stderr); ++ fprintf(stderr, "(%d,%d,%c) is specified as G%d, ", ++ sys->design[i].bpc, sys->design[i].noc, ++ sys->design[i].des, i); ++ fputs("but not found. using `iso8859-1'.\n", stderr); ++ context->g[i] = ascii; ++ retval++; ++ } ++ context->valid[i] = 1; ++ break; ++ ++ default: /* error */ ++ fprintf(stderr,"ml_set_charsets: bad arguments of G%d. ", i); ++ fputs("using `iso8859-1'.\n", stderr); ++ context->g[i] = ascii; ++ retval++; ++ } ++ } ++ if((unsigned int) sys->gl < 4) ++ context->gl = &context->g[sys->gl]; ++ else{ ++ fprintf(stderr, "ml_set_charsets: bad number as GL. using G0.\n"); ++ context->gl = &context->g[0]; ++ } ++ if((unsigned int) sys->gr < 4) ++ context->gr = &context->g[sys->gr]; ++ else{ ++ fprintf(stderr, "ml_set_charsets: bad number as GR. using G0.\n"); ++ context->gr = &context->g[0]; ++ } ++ context->eol = sys->eol; ++ context->short_form = sys->short_form; ++ context->lock_shift = sys->lock_shift; ++ return retval; ++} ++ ++static struct charset *search_charset(bpc, noc, des) ++ int bpc, noc; ++ int des; ++{ ++ struct charset *cset; ++ for(cset = charset; cset->bpc != 0; cset++){ ++ if(cset->bpc == bpc && ++ cset->noc == noc && ++ cset->designator == (char) des){ ++ if(!cset->loaded){ ++#if 0 ++ int i, l; ++ l = strlen(cset->registry); ++ for (i = 0; i < xrm_nfonts; i++) { ++ int li = strlen(xrm_fonts[i]); ++ if (li > l) { ++ if (xrm_fonts[i][li - l - 1] == '-' && ++ strcmp(xrm_fonts[i] + li - l, ++ cset->registry) == 0) { ++ if ((cset->fs = XLoadQueryFont(DPY, xrm_fonts[i])) ++ != NULL) { ++ if (DEBUG) { ++ fprintf(stderr, "%s for %s\n", ++ xrm_fonts[i], cset->registry); ++ } ++ cset->fontname = xrm_fonts[i]; ++ break; ++ } else ++ SetISTR(ISTR_WARNING, ++ "%s: font not found.", xrm_fonts[i]); ++ } ++ } ++ } ++#else ++ int i, l; ++ l = strlen(cset->registry); ++ for (i = 0; i < xrm_nfonts && cset->fs == NULL; i++) { ++ int j, nfnts = 0; ++ char **fnts = XListFonts(DPY, xrm_fonts[i], ++ 65535, &nfnts); ++ for (j = 0 ; j < nfnts; j++) { ++ int ll = strlen(fnts[j]); ++ if (*(fnts[j] + ll - l - 1) == '-' && ++ strcmp(fnts[j] + ll - l, cset->registry)== 0) { ++ if ((cset->fs = XLoadQueryFont(DPY, fnts[j])) ++ != NULL) { ++ if (DEBUG) { ++ fprintf(stderr, "%s for %s\n", ++ fnts[j], cset->registry); ++ } ++ cset->fontname = strdup(fnts[j]); ++ break; ++ } else ++ SetISTR(ISTR_WARNING, ++ "%s: font not found", fnts[j]); ++ } ++ } ++ if (fnts != NULL) ++ XFreeFontNames(fnts); ++ } ++#endif ++ if(cset->fs == NULL){ ++ SetISTR(ISTR_WARNING, ++ "font for %s not found.\nusing ascii font.", ++ cset->registry); ++ if (ascii != NULL) ++ cset->fs = ascii->fs; ++ } ++ ++ cset->loaded = 1; ++ } ++ return cset; ++ } ++ } ++ return NULL; ++} ++ ++static void pack_string(cs, str, len) ++ struct charset *cs; ++ unsigned char *str; ++ int len; /* number of chars(not bytes) */ ++{ ++ struct ml_text *mt = &context->text; ++ struct ml_line *lp; ++ XTextItem16 *ip; ++ ++ if (context->line == mt->maxlines) { ++ int oldmax = mt->maxlines; ++ if (mt->maxlines < 1) ++ mt->maxlines = 1; ++ else ++ mt->maxlines = 2 * mt->maxlines; ++ if (oldmax == 0) ++ mt->lines = (struct ml_line *) ++ malloc(sizeof(struct ml_line) * mt->maxlines); ++ else { ++ mt->lines = (struct ml_line *) ++ realloc(mt->lines, ++ sizeof(struct ml_line) * mt->maxlines); ++ } ++ } ++ lp = &mt->lines[context->line]; ++ if (mt->nlines == context->line) { ++ mt->nlines++; ++ lp->maxitems = 0; ++ lp->nitems = 0; ++ lp->width = 0; ++ lp->ascent = lp->descent = 0; ++ } ++ ++ if (len == 0) { ++ switch (*str) { ++ case '\n': ++ context->line++; ++ context->delta = 0; ++ context->toolong = 0; ++ break; ++ case '\t': ++ { ++ int nx, x = lp->width + context->delta; ++ nx = (x + ml_tab_width) / ml_tab_width * ml_tab_width; ++ context->delta += nx - x; ++ } ++ break; ++ } ++ return; ++ } ++ ++ if (context->toolong) ++ return; ++ if (lp->width > 30000) { ++ context->toolong = 1; ++ cs = ascii; ++ str = (unsigned char *) "..."; ++ len = 3; ++ } ++ ++ if (lp->nitems == lp->maxitems) { ++ int oldmax = lp->maxitems; ++ if (lp->maxitems < 1) ++ lp->maxitems = 1; ++ else ++ lp->maxitems = 2 * lp->maxitems; ++ if (oldmax == 0) ++ lp->items = (XTextItem16 *) ++ malloc(sizeof(XTextItem16) * lp->maxitems); ++ else ++ lp->items = (XTextItem16 *) ++ realloc(lp->items, ++ sizeof(XTextItem16) * lp->maxitems); ++ } ++ ip = &lp->items[lp->nitems++]; ++ ip->chars = (XChar2b *) context->cbp; ++ ip->nchars = len; ++ ip->delta = context->delta; ++ ip->font = cs->fs->fid; ++ context->cbp += 2 * len; ++ context->delta = 0; ++ ++ if (cs->bpc == 1) { ++ XChar2b *p; ++ unsigned char b7 = cs->bit7 ? 0x80 : 0; ++ int i; ++ for (i = len, p = ip->chars; i > 0; i--, p++) { ++ p->byte1 = '\0'; ++ p->byte2 = (*str++ & 0x7f) | b7; ++ } ++ } else { ++ XChar2b *p; ++ unsigned char b7 = cs->bit7 ? 0x80 : 0; ++ int i; ++ for (i = len, p = ip->chars; i > 0; i--, p++) { ++ p->byte1 = (*str++ & 0x7f) | b7; ++ p->byte2 = (*str++ & 0x7f) | b7; ++ } ++ } ++ ++ lp->width += XTextWidth16(cs->fs, ip->chars, ip->nchars); ++ if (lp->ascent < cs->fs->ascent) ++ lp->ascent = cs->fs->ascent; ++ if (lp->descent < cs->fs->descent) ++ lp->descent = cs->fs->descent; ++} ++ ++void get_monofont_size(wide, high) ++ int *wide, *high; ++{ ++ if (ascii == NULL) { ++ fputs("ml_draw_text: call ml_set_charsets, first.\n", stderr); ++ return; ++ } ++ *wide = ascii->fs->max_bounds.width; ++ *high = ascii->fs->ascent + ascii->fs->descent; ++} ++ ++static void init_xrm() ++{ ++ init_xrm_fonts(); ++ init_xrm_tab(); ++} ++ ++static void init_xrm_fonts() ++{ ++ char *p, *fns = XGetDefault(theDisp, "xv", "fontSet"); ++ int n; ++ if (fns == NULL) { ++ xrm_fonts = default_fonts; ++ xrm_nfonts = sizeof default_fonts / sizeof *default_fonts; ++ return; ++ } ++ while(*fns == ' ' || *fns == '\t') ++ fns++; ++ if (*fns == '\0') { ++ xrm_fonts = default_fonts; ++ xrm_nfonts = sizeof default_fonts / sizeof *default_fonts; ++ return; ++ } ++ fns = strdup(fns); ++ ++ n = 1; ++ for (p = fns; *p != '\0'; p++) { ++ if (*p == ',') ++ n++; ++ } ++ xrm_nfonts = n; ++ xrm_fonts = (char **) malloc(sizeof (char *) * xrm_nfonts); ++ for (n = 0, p = fns; n < xrm_nfonts && *p != '\0'; ) { ++ while (*p == ' ' || *p == '\t') ++ p++; ++ xrm_fonts[n++] = p; ++ while (1) { ++ char *q; ++ while (*p != ' ' && *p != '\t' && *p != ',' && *p != '\0') ++ p++; ++ q = p; ++ while (*q == ' ' || *q == '\t') ++ q++; ++ if (*q == ',' || *q == '\0') { ++ *p = '\0'; ++ p = q + 1; ++ break; ++ } else ++ p = q; ++ } ++ } ++ for ( ; n < xrm_nfonts; n++) ++ xrm_fonts[n] = ""; ++} ++ ++static void init_xrm_tab() ++{ ++ char *ts = XGetDefault(theDisp, "xv", "tabWidth"); ++ unsigned short tab; ++ if (ts == NULL) ++ tab = 64; ++ else { ++ char *ep; ++ long t; ++ int bad = 0; ++ t = strtol(ts, &ep, 0); ++ tab = (unsigned short) t; ++ if (ep != NULL) { ++ while (*ep == ' ' && *ep == '\t') ++ ep++; ++ if (*ep != '\0') ++ bad = 1; ++ } ++ if (tab != (long) (unsigned long) t) ++ bad = 1; ++ if (bad) { ++ SetISTR(ISTR_WARNING, "bad tab width."); ++ tab = 64; ++ } ++ } ++ ml_tab_width = tab; ++} ++ ++ ++#ifndef HAVE_STRDUP ++static char *strdup(str) ++ char *str; ++{ ++ return strcpy(malloc(strlen(str) + 1), str); ++} ++#endif ++ ++char *lookup_registry(d, b7) ++ struct design d; ++ int *b7; ++{ ++ int i; ++ for (i = 0; i < NR_CHARSETS; i++) { ++ if (charset[i].bpc == d.bpc && charset[i].noc == d.noc && ++ charset[i].designator == d.des) { ++ *b7 = charset[i].bit7; ++ return charset[i].registry; ++ } ++ } ++ return NULL; ++} ++ ++struct design lookup_design(registry, b7) ++ char *registry; ++ int b7; ++{ ++ struct design d; ++ int i; ++ d.bpc = 0; ++ d.noc = 0; ++ d.des = '\0'; ++ for (i = 0; i < NR_CHARSETS; i++) { ++ if (strcmp(charset[i].registry, registry) == 0 && ++ charset[i].bit7 == b7) { ++ d.bpc = charset[i].bpc; ++ d.noc = charset[i].noc; ++ d.des = charset[i].designator; ++ break; ++ } ++ } ++ return d; ++} ++ ++char *sjis_to_jis(orig, len, newlen) ++ char *orig; ++ int len, *newlen; ++{ ++ unsigned char *new; ++ unsigned char *p, *q, *endp; ++ if (len == 0) { ++ *newlen = 0; ++ return (char *) malloc((size_t) 1); ++ } ++ new = (unsigned char *) malloc((size_t) len * 4); /* big enough */ ++ for (p = (unsigned char *) orig, endp = p + len, q = new; p < endp; ) { ++ if ((*p & 0x80) == 0) /* 1 byte char */ ++ *q++ = *p++; ++ else if (*p >= 0x81 && *p <= 0x9f) { /* kanji 1st byte */ ++ unsigned char c1 = *p++; ++ unsigned char c2 = *p++; ++ if (c2 < 0x40 || c2 > 0xfc) { /* bad 2nd byte */ ++ *q++ = CODE_SS2; ++ *q++ = c1; ++ *q++ = CODE_SS2; ++ *q++ = c2; ++ } else { /* right 2nd byte */ ++ if (c2 <= 0x9e) { ++ if (c2 > 0x7f) ++ c2--; ++ c1 = (c1 - 0x81) * 2 + 1 + 0xa0; ++ c2 = (c2 - 0x40) + 1 + 0xa0; ++ } else { ++ c1 = (c1 - 0x81) * 2 + 2 + 0xa0; ++ c2 = (c2 - 0x9f) + 1 + 0xa0; ++ } ++ *q++ = c1; ++ *q++ = c2; ++ } ++ } else if (*p >= 0xe0 && *p <= 0xef) { /* kanji 1st byte */ ++ unsigned char c1 = *p++; ++ unsigned char c2 = *p++; ++ if (c2 < 0x40 || c2 > 0xfc) { /* bad 2nd byte */ ++ *q++ = CODE_SS2; ++ *q++ = c1; ++ *q++ = CODE_SS2; ++ *q++ = c2; ++ } else { /* right 2nd byte */ ++ if (c2 <= 0x9e) { ++ c1 = (c1 - 0xe0) * 2 + 63 + 0xa0; ++ c2 = (c2 - 0x40) + 1 + 0xa0; ++ } else { ++ c1 = (c1 - 0xe0) * 2 + 64 + 0xa0; ++ c2 = (c2 - 0x9f) + 1 + 0xa0; ++ } ++ *q++ = c1; ++ *q++ = c2; ++ } ++ } else { /* katakana or something */ ++ *q++ = CODE_SS2; ++ *q++ = *p++; ++ } ++ } ++ *newlen = q - new; ++ ++ return (char *) realloc(new, (size_t) *newlen); ++} ++ ++#endif /* TV_MULTILINGUAL */ +diff -ruN xv-3.10a-bugfixes/xvml.h xv-3.10a-enhancements/xvml.h +--- xv-3.10a-bugfixes/xvml.h 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvml.h 2005-04-17 22:57:45.000000000 -0700 +@@ -0,0 +1,96 @@ ++#ifndef MLVIEW_H ++#define MLVIEW_H ++ ++/* ++ * What is this? ++ * ++ * It is a package to show multi-lingual text. ++ * ++ * How to use? ++ * ++ * 1. Call ml_set_screen(Screen *scr); ++ * Tell this package the screen you use. ++ * ++ * 2. Call ml_set_charsets(struct char_spec spec[4], int gl, int gr); ++ * Tell this package the initial charsets. ++ * Gn is set to the charset specified by spec[n], respectively. ++ * GL and GR are set to G[gl] and G[gr], respectively. ++ * If first call, iso8859-1 font is loaded. ++ * ++ * 3. Call ml_draw_text(char *string); ++ * It Creates a bitmap, and returns it to you. ++ * If something goes wrong, it returns None. ++ * DON'T free the returned pixmaps!! ++ * ++ * BUGS: ++ * - Amharic and Tigrigna characters are strange. ++ * - Big5 is not supported. ++ * - Reverse direction is not supported. ++ * - Composing is not supported. ++ * - Cantonese can't be shown. ++ * - Texts which have many lines are buggy. ++ * ++ * NOTE: ++ * - Shifted JIS and Shifted GB must be converted to iso2022 in advance. ++ * ++ * Example of parameters to ml_set_charsets: ++ * - EUC-Japan ++ * spec = { {1, 94, 'B'}, G0 is US-ASCII ++ * {2, 94, 'B'}, G1 is JIS X0208 ++ * {1, 94, 'J'}, G2 is (right-half of)JIS X0201 ++ * {2, 94, 'D'} }; G3 is JIS X0212 ++ * gl = 0; GL is G0 ++ * gr = 1; GR is G1 ++ * ++ * - Compound Text ++ * spec = { {1, 94, 'B'}, G0 is US-ASCII ++ * {1, 96, 'A'}, G1 is Latin-1 ++ * {1, 94, 'B'}, G2 is US-ASCII (maybe unused) ++ * {1, 94, 'B'} }; G3 is US-ASCII (maybe unused) ++ * gl = 0; GL is G0 ++ * gr = 1; GR is G1 ++ * ++ * - Korean Mail ++ * spec = { {1, 94, 'B'}, G0 is US-ASCII ++ * {2, 94, 'C'}, G1 is KSC5601 ++ * {1, 94, 'B'}, G2 is US-ASCII (maybe unused) ++ * {1, 94, 'B'} }; G3 is US-ASCII (maybe unused) ++ * gl = 0; GL is G0 ++ * gl = 1; GR is G1 ++ */ ++ ++struct coding_system { ++ struct design { ++ int bpc; /* byte per char if 1 or 2, ++ don't touch if 0, or ++ don't use if -1.*/ ++ int noc; /* number of chars (94 or 96) */ ++ char des; /* designator ('A', 'B', ...) */ ++ } design[4]; ++ int gl, gr; ++ int eol; ++ int short_form; ++ int lock_shift; ++}; ++ ++struct ml_text { ++ int maxlines, nlines; ++ struct ml_line { ++ int maxitems, nitems; ++ int width, ascent, descent; ++ XTextItem16 *items; ++ } *lines; ++ int width, height; ++}; ++ ++struct context; ++struct ml_text *ml_draw_text PARM((struct context *, char *, int)); ++struct context *ml_create_context PARM((Screen *)); ++int ml_set_charsets PARM((struct context *, ++ struct coding_system *)); ++void get_monofont_size PARM((int *, int *)); ++char *sjis_to_jis PARM((char *, int, int *)); ++char *lookup_registry PARM((struct design, int *)); ++struct design lookup_design PARM((char *, int)); ++ ++#endif +diff -ruN xv-3.10a-bugfixes/xvpbm.c xv-3.10a-enhancements/xvpbm.c +--- xv-3.10a-bugfixes/xvpbm.c 2005-04-03 14:25:28.000000000 -0700 ++++ xv-3.10a-enhancements/xvpbm.c 2005-04-17 14:04:22.000000000 -0700 +@@ -23,6 +23,15 @@ + */ + + ++typedef unsigned short ush; ++typedef unsigned char uch; ++ ++#define alpha_composite(composite, fg, alpha, bg) { \ ++ ush temp = ((ush)(fg)*(ush)(alpha) + \ ++ (ush)(bg)*(ush)(255 - (ush)(alpha)) + (ush)128); \ ++ (composite) = (uch)((temp + (temp >> 8)) >> 8); \ ++} ++ + #define TRUNCSTR "File appears to be truncated." + + static int garbage; +@@ -31,6 +40,7 @@ + static int loadpbm PARM((FILE *, PICINFO *, int)); + static int loadpgm PARM((FILE *, PICINFO *, int, int)); + static int loadppm PARM((FILE *, PICINFO *, int, int)); ++static int loadpam PARM((FILE *, PICINFO *, int, int)); + static int getint PARM((FILE *, PICINFO *)); + static int getbit PARM((FILE *, PICINFO *)); + static int getshort PARM((FILE *)); +@@ -38,10 +48,83 @@ + + static char *bname; + ++ ++#ifdef HAVE_MGCSFX ++/* ++ * When file read or file write is fail, probably it's caused by ++ * reading from pipe which has no data yet, or writing to pipe ++ * which is not ready yet. ++ * Then we can use system call select() on descriptor of pipe and wait. ++ * If you want, change 'undef' to 'define' in the following line. ++ * This feature is performance-killer. ++ */ ++#undef FIX_PIPE_ERROR ++ ++#ifdef __osf__ ++# ifdef __alpha ++# define FIX_PIPE_ERROR ++# endif ++#endif ++ ++#endif /* HAVE_MGCSFX */ ++ ++ ++#ifdef FIX_PIPE_ERROR ++ ++int pipefdr; ++ ++struct timeval timeout; ++int width; ++fd_set fds; ++ ++static void ready_read() ++{ ++ if(pipefdr < 0) return; /* if file descriptor is not pipe, OK */ ++ WaitCursor(); ++ ++reselect: ++ /* setting of timeout */ ++ timeout.tv_sec = 1; /* 1 sec */ ++ timeout.tv_usec = 0; /* 0 usec */ ++ ++ FD_ZERO(&fds); /* clear bits */ ++ FD_SET(pipefdr, &fds); /* set bit of fd in fds */ ++ ++ /* number of file descriptor to want check (0 $B!A(B width-1) */ ++ width = pipefdr + 1; ++ ++ /* select returns number of file descriptors */ ++ if (select(width, &fds, NULL, NULL, &timeout) < 0){ ++ if(DEBUG){ ++ fprintf(stderr, "No file descriptors can't selected, waiting...\n"); ++ } ++ goto reselect; ++ } ++ ++ if (FD_ISSET(pipefdr, &fds)){ ++ /* Now, descriptor of pipe is ready to read */ ++ return; ++ }else{ ++ if(DEBUG){ ++ fprintf(stderr, "Can't read from pipe yet, waiting...\n"); ++ } ++ goto reselect; ++ } ++ ++} ++#endif /* FIX_PIPE_ERROR */ ++ + /*******************************************/ ++#ifdef HAVE_MGCSFX ++int LoadPBM(fname, pinfo, fd) ++ char *fname; ++ PICINFO *pinfo; ++ int fd; ++#else + int LoadPBM(fname, pinfo) + char *fname; + PICINFO *pinfo; ++#endif /* HAVE_MGCSFX */ + /*******************************************/ + { + /* returns '1' on success */ +@@ -50,6 +133,10 @@ + int c, c1; + int maxv, rv; + ++#ifdef FIX_PIPE_ERROR ++ pipefdr = fd; ++#endif ++ + garbage = maxv = rv = 0; + bname = BaseName(fname); + +@@ -57,6 +144,22 @@ + pinfo->comment = (char *) NULL; + + ++#ifdef HAVE_MGCSFX ++ if(fd < 0){ ++ /* open the file */ ++ fp = xv_fopen(fname,"r"); ++ if (!fp) return (pbmError(bname, "can't open file")); ++ ++ /* compute file length */ ++ fseek(fp, 0L, 2); ++ filesize = ftell(fp); ++ fseek(fp, 0L, 0); ++ }else{ ++ fp = fdopen(fd, "r"); ++ if (!fp) return (pbmError(bname, "can't open file")); ++ filesize = 0; /* dummy */ ++ } ++#else + /* open the file */ + fp = xv_fopen(fname,"r"); + if (!fp) return (pbmError(bname, "can't open file")); +@@ -65,6 +168,7 @@ + fseek(fp, 0L, 2); + filesize = ftell(fp); + fseek(fp, 0L, 0); ++#endif /* HAVE_MGCSFX */ + + + /* read the first two bytes of the file to determine which format +@@ -73,7 +177,8 @@ + "P6" = raw pixmap */ + + c = getc(fp); c1 = getc(fp); +- if (c!='P' || c1<'1' || c1>'6') return(pbmError(bname, "unknown format")); ++ if (c!='P' || c1<'1' || (c1>'6' && c1!='8')) /* GRR alpha */ ++ return(pbmError(bname, "unknown format")); + + /* read in header information */ + pinfo->w = getint(fp, pinfo); pinfo->h = getint(fp, pinfo); +@@ -104,6 +209,7 @@ + if (c1=='1' || c1=='4') rv = loadpbm(fp, pinfo, c1=='4' ? 1 : 0); + else if (c1=='2' || c1=='5') rv = loadpgm(fp, pinfo, c1=='5' ? 1 : 0, maxv); + else if (c1=='3' || c1=='6') rv = loadppm(fp, pinfo, c1=='6' ? 1 : 0, maxv); ++ else if (c1=='8') rv = loadpam(fp, pinfo, 1 , maxv); + + fclose(fp); + +@@ -248,7 +354,20 @@ + } + } + else { ++#ifdef FIX_PIPE_ERROR ++ reread: ++ numgot += fread(pic8 + numgot, (size_t) 1, (size_t) w*h - numgot, fp); /* read raw data */ ++ if(errno == EINTR){ ++ if(DEBUG){ ++ fprintf(stderr, ++ "Can't read all data from pipe, call select and waiting...\n"); ++ } ++ ready_read(); ++ goto reread; ++ } ++#else + numgot = fread(pic8, (size_t)1, (size_t)npixels, fp); /* read raw data */ ++#endif + } + } + +@@ -315,7 +434,20 @@ + } + } + else { ++#ifdef FIX_PIPE_ERROR ++ reread: ++ numgot += fread(pic24 + numgot, (size_t) 1, (size_t) w*h*3 - numgot, fp); /* read data */ ++ if(errno == EINTR){ ++ if(DEBUG){ ++ fprintf(stderr, ++ "Can't read all data from pipe, call select and waiting...\n"); ++ } ++ ready_read(); ++ goto reread; ++ } ++#else + numgot = fread(pic24, (size_t) 1, (size_t) bufsize, fp); /* read data */ ++#endif + } + } + +@@ -341,6 +473,122 @@ + } + + ++/*******************************************/ ++static int loadpam(fp, pinfo, raw, maxv) /* unofficial RGBA extension */ ++ FILE *fp; ++ PICINFO *pinfo; ++ int raw, maxv; ++{ ++ byte *p, *pix, *pic24, *linebuf, scale[256], bgR, bgG, bgB, r, g, b, a; ++ int i, j, bitshift, w, h, npixels, bufsize, linebufsize, holdmaxv; ++ ++ w = pinfo->w; ++ h = pinfo->h; ++ ++ npixels = w * h; ++ bufsize = 3*npixels; ++ linebufsize = 4*w; ++ if (w <= 0 || h <= 0 || npixels/w != h || bufsize/3 != npixels || ++ linebufsize/4 != w) ++ return pbmError(bname, "image dimensions too large"); ++ ++ /* allocate 24-bit image */ ++ pic24 = (byte *) calloc((size_t) bufsize, (size_t) 1); ++ if (!pic24) FatalError("couldn't malloc 'pic24' for PAM"); ++ ++ /* allocate line buffer for pre-composited RGBA data */ ++ linebuf = (byte *) malloc((size_t) linebufsize); ++ if (!linebuf) { ++ free(pic24); ++ FatalError("couldn't malloc 'linebuf' for PAM"); ++ } ++ ++ pinfo->pic = pic24; ++ pinfo->type = PIC24; ++ sprintf(pinfo->fullInfo, "PAM, %s format. (%ld bytes)", ++ (raw) ? "raw" : "ascii", filesize); ++ sprintf(pinfo->shrtInfo, "%dx%d PAM.", w, h); ++ pinfo->colType = F_FULLCOLOR; ++ ++ ++ /* if maxv>255, keep dropping bits until it's reasonable */ ++ holdmaxv = maxv; ++ bitshift = 0; ++ while (maxv>255) { maxv = maxv>>1; bitshift++; } ++ ++ ++ numgot = 0; ++ ++ if (!raw) { /* GRR: not alpha-ready */ ++ return pbmError(bname, "can't handle non-raw PAM image"); ++/* ++ for (i=0, pix=pic24; i<h; i++) { ++ if ((i&0x3f)==0) WaitCursor(); ++ for (j=0; j<w*3; j++, pix++) ++ *pix = (byte) (getint(fp, pinfo) >> bitshift); ++ } ++ */ ++ } ++ else { /* raw */ ++ if (holdmaxv>255) { /* GRR: not alpha-ready */ ++ return pbmError(bname, "can't handle PAM image with maxval > 255"); ++/* ++ for (i=0, pix=pic24; i<h; i++) { ++ if ((i&0x3f)==0) WaitCursor(); ++ for (j=0; j<w*3; j++,pix++) ++ *pix = (byte) (getshort(fp) >> bitshift); ++ } ++ */ ++ } ++ else { ++ if (have_imagebg) { /* GRR: alpha-ready */ ++ bgR = (imagebgR >> 8); ++ bgG = (imagebgG >> 8); ++ bgB = (imagebgB >> 8); ++ } else { ++ bgR = bgG = bgB = 0; ++ } ++ for (i=0, pix=pic24; i<h; i++) { ++ numgot += fread(linebuf, (size_t) 1, (size_t) linebufsize, fp); /* read data */ ++ if ((i&0x3f)==0) WaitCursor(); ++ for (j=0, p=linebuf; j<w; j++) { ++ r = *p++; ++ g = *p++; ++ b = *p++; ++ a = *p++; ++ alpha_composite(*pix++, r, a, bgR) ++ alpha_composite(*pix++, g, a, bgG) ++ alpha_composite(*pix++, b, a, bgB) ++ } ++ } ++ } ++ } ++ ++ free(linebuf); ++ ++ /* in principle this could overflow, but not critical */ ++ if (numgot != w*h*4) pbmError(bname, TRUNCSTR); ++ ++ if (garbage) ++ return(pbmError(bname, "Garbage characters in image data.")); ++ ++ ++ /* have to scale up all RGB values (Conv24to8 expects RGB values to ++ range from 0-255) */ ++ ++ if (maxv<255) { ++ for (i=0; i<=maxv; i++) scale[i] = (i * 255) / maxv; ++ ++ for (i=0, pix=pic24; i<h; i++) { ++ if ((i&0x3f)==0) WaitCursor(); ++ for (j=0; j<w*3; j++, pix++) *pix = scale[*pix]; ++ } ++ } ++ ++ return 1; ++} ++ ++ + + /*******************************************/ + static int getint(fp, pinfo) +diff -ruN xv-3.10a-bugfixes/xvpcd.c xv-3.10a-enhancements/xvpcd.c +--- xv-3.10a-bugfixes/xvpcd.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvpcd.c 2005-04-26 00:25:13.000000000 -0700 +@@ -0,0 +1,1307 @@ ++/* ++ * xvpcd.c - load routine for 'PhotoCD' format pictures ++ * ++ * LoadPCD(fname, pinfo, size) - loads a PhotoCD file ++ * ++ * This routine will popup a choice of which of the 5 available resolutions ++ * the user wants to choose, then load it as a 24 bit image. ++ * ++ * Copyright 1993 David Clunie, Melbourne, Australia. ++ * ++ * The outline of this is shamelessly derived from xvpbm.c to read the ++ * file, and xvtiffwr.c to handle the popup window and X stuff (X never ++ * has been my forte !), and the PhotoCD format information (though not ++ * the code) was found in Hadmut Danisch's (danisch@ira.uka.de) hpcdtoppm ++ * program in which he has reverse engineered the format by studying ++ * hex dumps of PhotoCDs ! After all who can afford the Kodak developer's ++ * kit, which none of us have seen yet ? Am I even allowed to mention these ++ * words (Kodak, PhotoCD) ? I presume they are registered trade marks. ++ * ++ * PS. I have no idea how Halmut worked out the YCC <-> RGB conversion ++ * factors, but I have calculated them from his tables and the results ++ * look good enough to me. ++ * ++ * Added size parameter to allow the schnautzer to create thumnails ++ * without requesting the size every time. ++ */ ++ ++#include "xv.h" ++#include <memory.h> ++ ++#ifdef HAVE_PCD ++ ++#define TRACE 0 ++#if TRACE ++# define trace(x) fprintf x ++#else ++# define trace(x) ++#endif ++ ++/* Comments on error-handling: ++ A truncated file is not considered a Major Error. The file is loaded, ++ and the rest of the pic is filled with 0's. ++ ++ Not being able to malloc is a Fatal Error. The program is aborted. */ ++ ++ ++#ifdef __STDC__ ++static void magnify(int, int, int, int, int, byte *); ++static int pcdError(char *, char *); ++static int gethuffdata(byte *, byte *, byte *, int, int); ++#else ++static void magnify(); ++static int pcdError(); ++static int gethuffdata(); ++#endif ++ ++#define wcurfactor 16 /* Call WaitCursor() every n rows */ ++ ++static int size; /* Set by window routines */ ++static int leaveitup;/* Cleared by docmd() when OK or CANCEL pressed */ ++static int goforit; /* Set to 1 if OK or 0 if CANCEL */ ++static FILE *fp; ++static CBUTT lutCB; ++ ++/* ++ * This "beyond 100%" table is taken from ImageMagick (gamma 2.2). ++ * Why there are 351 entries and not 346 as per Kodak documentation ++ * is a mystery. ++ */ ++static double rscale = 1.00, ++ gscale = 1.00, ++ bscale = 1.00; ++ ++static byte Y[351] = { ++ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ++ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ++ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, ++ 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, ++ 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, ++ 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, ++ 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, ++ 74, 76, 77, 78, 79, 80, 81, 82, 83, 84, ++ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, ++ 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, ++ 107, 108, 110, 111, 112, 113, 114, 115, 116, 117, ++ 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, ++ 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, ++ 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, ++ 149, 150, 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, 176, 177, ++ 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, ++ 188, 189, 190, 191, 192, 193, 193, 194, 195, 196, ++ 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, ++ 206, 207, 207, 208, 209, 210, 211, 211, 212, 213, ++ 214, 215, 215, 216, 217, 218, 218, 219, 220, 221, ++ 221, 222, 223, 224, 224, 225, 226, 226, 227, 228, ++ 228, 229, 230, 230, 231, 232, 232, 233, 234, 234, ++ 235, 236, 236, 237, 237, 238, 238, 239, 240, 240, ++ 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, ++ 245, 246, 246, 247, 247, 247, 248, 248, 248, 249, ++ 249, 249, 249, 250, 250, 250, 250, 251, 251, 251, ++ 251, 251, 252, 252, 252, 252, 252, 253, 253, 253, ++ 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, ++ 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, ++ 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, ++ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ++ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ++ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ++ 255 ++}; ++ ++/*******************************************/ ++/* The size should be -1 for the popup to ask otherwise fast is assumed */ ++/* returns '1' on success */ ++/*******************************************/ ++int ++LoadPCD(char *fname, PICINFO *pinfo, int theSize) ++{ ++ long offset; ++ int mag; ++ int rotate; ++ byte header[3*0x800]; ++ byte *pic24, *luma, *chroma1, *chroma2, *ptr, *lptr, *c1ptr, *c2ptr; ++ int w, h, npixels, bufsize; ++ int row, col; ++ int huffplanes; ++ char *bname; ++ ++ bname = BaseName(fname); ++ pinfo->pic = NULL; ++ pinfo->comment = NULL; ++ ++ ++ /* ++ * open the file ++ */ ++ if((fp=fopen(fname,"r")) == NULL) ++ return pcdError(bname, "can't open file"); ++ ++ /* ++ * inspect the header ++ */ ++ if(fread(&header[0], 1, sizeof(header), fp) != sizeof(header)) ++ return pcdError(bname, "could not load PCD header"); ++ if(strncmp(&header[0x800], "PCD_", 4) != 0) ++ return pcdError(bname, "not a PCD file"); ++ rotate = header[0x0E02] & 0x03; ++ ++/* base/16 ++ - plain data starts at sector 1+2+1=4 ++ (numbered from 0, ie. the 5th sector) ++ - luma 192*128 = 24576 bytes (12 sectors) ++ + chroma1 96*64 = 6144 bytes (3 sectors) ++ + chroma2 96*64 = 6144 bytes (3 sectors) ++ = total 18 sectors ++ ++ - NB. "Plain" data is interleaved - 2 luma rows 192 wide, ++ then 1 of each of the chroma rows 96 wide ! ++ ++ base/4 ++ - plain data starts at sector 1+2+1+18+1=23 ++ - luma 384*256 = 98304 bytes (48 sectors) ++ + chroma1 192*128 = 24576 bytes (12 sectors) ++ + chroma2 192*128 = 24576 bytes (12 sectors) ++ = total 72 sectors ++ ++ - NB. "Plain" data is interleaved - 2 luma rows 384 wide, ++ then 1 of each of the chroma rows 192 wide ! ++ ++ base ++ - plain data starts at sector 1+2+1+18+1+72+1=96 ++ ++ - luma 768*512 = 393216 bytes (192 sectors) ++ + chroma1 384*256 = 98304 bytes (48 sectors) ++ + chroma2 384*256 = 98304 bytes (48 sectors) ++ = total 288 sectors ++ ++ - NB. "Plain" data is interleaved - 2 luma rows 768 wide, ++ then 1 of each of the chroma rows 384 wide ! ++ ++ 4base ++ - plain data for base is read ++ - luma data interpolated *2 ++ - chroma data interpolated *4 ++ ++ - cd_offset is 1+2+1+18+1+72+1+288=384 ++ - at cd_offset+4 (388) is huffman table ++ - at cd_offset+5 (389) is 4base luma plane ++ ++ (the sector at cd_offset+3 seems to contain 256 words each of ++ which is an offset presumably to the sector containing certain ++ rows ? rows/4 given 1024 possible rows. The rest of this sector ++ is filled with zeroes) ++ ++ ++ 16base ++ - plain data for base is read ++ - luma data interpolated *2 ++ - chroma data interpolated *4 ++ ++ - cd_offset is 1+2+1+18+1+72+1+288=384 ++ - at cd_offset+4 (388) is huffman table for 4 base ++ - at cd_offset+5 (389) is 4base luma plane ++ - luma plane interpolated *2 ++ ++ - cd_offset is set to current position (should be start of sector) ++ - at cd_offset+12 is huffman table for 16 base ++ - at cd_offset+14 is 16 base luma & 2 chroma planes which are read ++ (note that the luma plane comes first, with a sync pattern ++ announcing each row from 0 to 2047, then the two chroma planes ++ are interleaved by row, the row # being even from 0 to 2046, with ++ each row containing 1536 values, the chroma1 row coming first, ++ finally followed by a sync pattern with a row of 2048 announcing ++ the end (its plane seems to be set to 3, ie. chroma2) ++ - chroma planes interpolated *2 ++ ++ (the sector at cd_offset+10 & 11 seem to contain 1024 pairs of words ++ the first for luma and the second for chroma, each of ++ which is an offset presumably to the sector containing certain ++ rows ? rows/2 given 2048 possible rows) ++ ++Not yet implemented: ++ ++In order to do overskip for base and 4base, one has to reach the chroma ++data for 16 base: ++ ++ - for 4base, after reading the 4base luma plane (and presumably ++ skipping the chroma planes) one sets cd_offset to the start of ++ the "current" sector ++ ++ - for base, one has to skip the 4base data first: ++ - cd_offset is set to 384 ++ - at (cd_offset+3 sectors)[510] is a 16 bit word high byte 1st ++ containing an offset to the beginning of the 16base stuff ++ though there is then a loop until >30 0xff's start a sector ! ++ ++ - being now positioned after the end of the 4base stuff, ++ - at (cd_offset+10 sectors)[2] is a 16 bit word high byte 1st ++ containing an offset to the chroma planes. ++ - at cd_offset+12 is the set of huffman tables ++ ++ - for base, the 16base chroma planes are then halved ++*/ ++ ++ PCDSetParamOptions(bname); ++ if (theSize == -1) ++ { ++ PCDDialog(1); /* Open PCD Dialog box */ ++ SetCursors(-1); /* Somebody has already set it to wait :( */ ++ leaveitup=1; ++ goforit=0; ++ size = 1; ++ /* block until the popup window gets closed */ ++ while (leaveitup) { ++ int i; ++ XEvent event; ++ XNextEvent(theDisp, &event); ++ HandleEvent(&event, &i); ++ } ++ /* At this point goforit and size will have been set */ ++ if (!goforit) { ++ /* nothing allocated so nothing needs freeing */ ++ return 0; ++ } ++ WaitCursor(); ++ } ++ else ++ { ++ size = theSize; ++ goforit = 1; ++ } ++ ++ if(lutCB.val) ++ rscale = gscale = bscale = 255.0/346.0; ++ else ++ rscale = gscale = bscale = 1.0; ++ ++ switch (size) { ++ case 0: ++ pinfo->w = 192; ++ pinfo->h = 128; ++ offset=4*0x800; ++ mag=1; ++ huffplanes=0; ++ sprintf(pinfo->fullInfo, "PhotoCD, base/16 resolution"); ++ break; ++ ++ case 1: ++ pinfo->w = 384; ++ pinfo->h = 256; ++ offset=23*0x800; ++ mag=1; ++ huffplanes=0; ++ sprintf(pinfo->fullInfo, "PhotoCD, base/4 resolution"); ++ break; ++ ++ case 2: ++ default: ++ pinfo->w = 768; ++ pinfo->h = 512; ++ offset=96*0x800; ++ mag=1; ++ huffplanes=0; ++ sprintf(pinfo->fullInfo, "PhotoCD, base resolution"); ++ break; ++ ++ case 3: ++ pinfo->w = 1536; ++ pinfo->h = 1024; ++ offset=96*0x800; ++ mag=2; ++ huffplanes=1; ++ sprintf(pinfo->fullInfo, "PhotoCD, 4base resolution"); ++ break; ++ ++ case 4: ++ pinfo->w=3072; ++ pinfo->h=2048; ++ offset=96*0x800; ++ mag=4; ++ huffplanes=2; ++ sprintf(pinfo->fullInfo, "PhotoCD, 16base resolution"); ++ break; ++ } ++ ++ /* ++ * rotate? ++ */ ++ w = pinfo->w; ++ h = pinfo->h; ++ switch(rotate) { ++ case 0: ++ break; ++ ++ case 1: ++ case 3: ++ pinfo->w = h; ++ pinfo->h = w; ++ break; ++ ++ default: ++ fprintf(stderr, "unknown image rotate %d; assuming none\n", ++ rotate); ++ rotate = 0; ++ } ++ ++ /* ++ * allocate 24-bit image ++ */ ++ npixels = pinfo->w * pinfo->h; ++ bufsize = 3 * npixels; ++ if (pinfo->w <= 0 || pinfo->h <= 0 || npixels/pinfo->w != pinfo->h || ++ bufsize/3 != npixels) ++ FatalError("image dimensions out of range"); ++ ++ pinfo->pic = (byte *)malloc((size_t) bufsize); ++ if(!pinfo->pic) ++ FatalError("couldn't malloc '24-bit RGB plane'"); ++ ++ pinfo->type = PIC24; ++ sprintf(pinfo->shrtInfo, "%dx%d PhotoCD.", pinfo->w, pinfo->h); ++ pinfo->colType = F_FULLCOLOR; ++ pinfo->frmType = -1; ++ ++ if(fseek(fp, offset, SEEK_SET) == -1) { ++ free(pinfo->pic); ++ return pcdError(bname,"Can't find start of data."); ++ } ++ ++ pic24 = pinfo->pic; ++ ++ luma=(byte *)calloc(npixels,1); ++ if(!luma) { ++ free(pinfo->pic); ++ FatalError("couldn't malloc 'luma plane'"); ++ } ++ ++ chroma1=(byte *)calloc(npixels/4,1); ++ if(!chroma1) { ++ free(pinfo->pic); ++ free(luma); ++ FatalError("couldn't malloc 'chroma1 plane'"); ++ } ++ ++ chroma2=(byte *)calloc(npixels/4,1); ++ if(!chroma2) { ++ free(pinfo->pic); ++ free(luma); ++ free(chroma1); ++ FatalError("couldn't malloc 'chroma2 plane'"); ++ } ++ ++ /* Read 2 luma rows length w, then one of each chroma rows w/2 */ ++ /* If a mag factor is active, the small image is read into the */ ++ /* top right hand corner of the larger allocated image */ ++ ++ trace((stderr, "base image: start @ 0x%08lx (sector %ld.%ld)\n", ++ ftell(fp), ftell(fp)/0x800, ftell(fp) % 0x800)); ++ for(row=0,lptr=luma,c1ptr=chroma1,c2ptr=chroma2; row <h/mag; ++ row+=2,lptr+=w*2,c1ptr+=w/2,c2ptr+=w/2) { ++ if(fread(lptr, 1, w/mag, fp) != w/mag) { ++ pcdError(bname, "Luma plane too short."); ++ break; ++ } ++ if(fread(lptr+w, 1, w/mag, fp) != w/mag) { ++ pcdError(bname, "Luma plane too short."); ++ break; ++ } ++ if(fread(c1ptr, 1, w/2/mag, fp) != w/2/mag) { ++ pcdError(bname, "Chroma1 plane too short."); ++ break; ++ } ++ if(fread(c2ptr, 1, w/2/mag, fp) != w/2/mag) { ++ pcdError(bname, "Chroma2 plane too short."); ++ break; ++ } ++ if(row%wcurfactor == 0) ++ WaitCursor(); ++ } ++ trace((stderr, "base image: done @ 0x%08lx (sector %ld.%ld)\n", ++ ftell(fp), ftell(fp)/0x800, ftell(fp) % 0x800)); ++ ++ if(huffplanes) { ++ if(fseek(fp, 388*0x800, SEEK_SET) == -1) ++ return pcdError(bname, ++ "Can't find start of huffman tables."); ++ ++ magnify(2, h/mag, w/mag, h, w, luma); ++ magnify(2, h/2/mag, w/2/mag, h/2, w/2, chroma1); ++ magnify(2, h/2/mag, w/2/mag, h/2, w/2, chroma2); ++ ++ /* ++ * doesn't really touch the chroma planes which aren't ++ * present in 4base ++ */ ++ gethuffdata(luma, chroma1, chroma2, w, h/mag*2); ++ ++ /* ++ * if only doing 4base should probably fetch 16bases ++ * chroma planes here ++ */ ++ if(huffplanes == 2) { ++ /* ++ * This depends on gethuffdata() having grabbed ++ * things in 0x800 sectors AND still being ++ * positioned in the "last" sector of the data ++ * (cf. Hadmut's code which is positioned at start ++ * of the next sector) ++ */ ++ long offset = ftell(fp)/0x800+12; ++ ++ if(fseek(fp, offset*0x800, SEEK_SET) == 0) { ++ magnify(2,h/2,w/2,h,w,luma); ++ magnify(2,h/4,w/4,h/2,w/2,chroma1); ++ magnify(2,h/4,w/4,h/2,w/2,chroma2); ++ gethuffdata(luma,chroma1,chroma2,w,h); ++ } else ++ fprintf(stderr, "can't seek to 2nd huffman tables\n"); ++ } ++ } ++ fclose(fp); ++ ++ /* ++ * YCC -> R'G'B' and image rotate ++ */ ++ ptr=pic24; ++ lptr=luma; c1ptr=chroma1; c2ptr=chroma2; ++ for(row = 0; row < h; ++row) { ++ byte *rowc1ptr = c1ptr, ++ *rowc2ptr = c2ptr; ++ int k = 0; ++ ++ switch(rotate) { ++ case 1: ++ ptr = &pic24[row*3 + (w - 1)*h*3]; ++ k = -3*(h + 1); ++ break; ++ ++ case 3: ++ ptr = &pic24[(h - 1 - row)*3]; ++ k = 3*(h - 1); ++ break; ++ ++ default: ++ ptr = &pic24[row*w*3]; ++ k = 0; ++ break; ++ } ++ for(col = 0; col < w; ++col) { ++ double L = 1.3584*(double) *lptr++, ++ C1 = 2.2179*(double) (*c1ptr - 156), ++ C2 = 1.8215*(double) (*c2ptr - 137); ++ int r = rscale*(L + C2), ++ g = gscale*(L - 0.194*C1 - 0.509*C2), ++ b = bscale*(L + C1); ++ ++ if(lutCB.val) { ++ if(r < 0) r = 0; else if(r >= 255) r = 255; ++ if(g < 0) g = 0; else if(g >= 255) g = 255; ++ if(b < 0) b = 0; else if(b >= 255) b = 255; ++ } else { ++ if(r < 0) r = 0; else if(r >= 351) r = 350; ++ if(g < 0) g = 0; else if(g >= 351) g = 350; ++ if(b < 0) b = 0; else if(b >= 351) b = 350; ++ r = Y[r]; g = Y[g]; b = Y[b]; ++ } ++ *ptr++ = r; ++ *ptr++ = g; ++ *ptr++ = b; ++ ptr += k; ++ if(col & 1) { ++ ++c1ptr; ++ ++c2ptr; ++ } ++ } ++ if((row & 1) == 0) { ++ c1ptr = rowc1ptr; ++ c2ptr = rowc2ptr; ++ } ++ if(row%wcurfactor == 0) ++ WaitCursor(); ++ } ++ free(luma); free(chroma1); free(chroma2); ++ return 1; ++} ++ ++/* ++ * derived from Hadmut Danisch's interpolate() ++ */ ++static void ++magnify(int mag, /* power of 2 by which to magnify in place */ ++ int h, int w, /* the "start" unmag'd dimensions of the array */ ++ int mh, int mw, /* the real (maximum) dimensions of the array */ ++ byte *p) /* pointer to the data */ ++{ ++ int x,y,yi; ++ byte *optr,*nptr,*uptr; /* MUST be unsigned, else averaging fails */ ++ ++ while (mag > 1) { ++ ++ /* create every 2nd new row from 0 */ ++ /* even pixels being equal to the old, odd ones averaged with successor */ ++ /* special case being the last column which is just set equal to the */ ++ /* second last) ... */ ++ ++ for(y=0;y<h;y++) { ++ yi=h-1-y; ++ optr=p+ yi*mw + (w-1); /* last pixel of an old row */ ++ nptr=p+2*yi*mw + (2*w - 2); /* last pixel of a new row */ ++ ++ nptr[0]=nptr[1]=optr[0]; /* special cases */ ++ ++ for(x=1;x<w;x++) { ++ optr--; nptr-=2; /* next lower pixel(s) */ ++ nptr[0]=optr[0]; /* even pixels duped */ ++ nptr[1]=(((int)optr[0])+ ++ ((int)optr[1])+1)>>1; /* odd averaged */ ++ } ++ } ++ ++ /* Fill in odd rows, as average of prior & succeeding rows, with */ ++ /* even pixels average of one column, odd pixels average of two */ ++ ++ for(y=0;y<h-1;y++) { /* all but the last old row */ ++ optr=p + 2*y*mw; /* start of the new "even" rows */ ++ nptr=optr+mw; /* start of the next empty row */ ++ uptr=nptr+mw; /* start of the next again (even) */ ++ ++ for(x=0;x<w-1;x++) { /* for all cols except the last */ ++ nptr[0]=(((int)optr[0])+ ++ ((int)uptr[0])+1)>>1; /* even pixels */ ++ nptr[1]=(((int)optr[0])+ ++ ((int)optr[2])+ ++ ((int)uptr[0])+ ++ ((int)uptr[2])+2)>>2; /* odd pixels */ ++ nptr+=2; optr+=2; uptr+=2; ++ } ++ *(nptr++)=(((int)*(optr++))+ ++ ((int)*(uptr++))+1)>>1; /* 2nd last pixel */ ++ *(nptr++)=(((int)*(optr++))+ ++ ((int)*(uptr++))+1)>>1; /* last pixel */ ++ } ++ ++ xvbcopy(p + (2*h-2)*mw, /* 2nd last row */ ++ p + (2*h-1)*mw, /* the last row */ ++ 2*w); /* length of a new row */ ++ ++ h*=2; w*=2; ++ mag>>=1; /* Obviously mag must be a power of 2 ! */ ++ } ++} ++ ++/*******************************************/ ++static int ++pcdError(char *fname, char *st) ++{ ++ SetISTR(ISTR_WARNING,"%s: %s", fname, st); ++ return 0; ++} ++ ++ ++/**** Stuff for PCDDialog box ****/ ++ ++#define TWIDE 380 ++#define THIGH 160 ++#define T_NBUTTS 2 ++#define T_BOK 0 ++#define T_BCANC 1 ++#define BUTTH 24 ++ ++static void drawTD PARM((int, int, int, int)); ++static void clickTD PARM((int, int)); ++static void doCmd PARM((int)); ++static void PCDSetParams PARM((void)); ++ ++/* local variables */ ++static BUTT tbut[T_NBUTTS]; ++static RBUTT *resnRB; ++ ++ ++ ++/***************************************************/ ++void CreatePCDW() ++{ ++ int y; ++ ++ pcdW = CreateWindow("xv pcd", "XVpcd", NULL, ++ TWIDE, THIGH, infofg, infobg, 0); ++ if (!pcdW) FatalError("can't create pcd window!"); ++ ++ XSelectInput(theDisp, pcdW, ExposureMask | ButtonPressMask | KeyPressMask); ++ ++ BTCreate(&tbut[T_BOK], pcdW, TWIDE-140-1, THIGH-10-BUTTH-1, 60, BUTTH, ++ "Ok", infofg, infobg, hicol, locol); ++ ++ BTCreate(&tbut[T_BCANC], pcdW, TWIDE-70-1, THIGH-10-BUTTH-1, 60, BUTTH, ++ "Cancel", infofg, infobg, hicol, locol); ++ ++ y = 55; ++ resnRB = RBCreate(NULL, pcdW, 36, y, "192*128 Base/16", ++ infofg, infobg,hicol,locol); ++ RBCreate(resnRB, pcdW, 36, y+18, "384*256 Base/4", ++ infofg, infobg,hicol,locol); ++ RBCreate(resnRB, pcdW, 36, y+36, "768*512 Base", ++ infofg, infobg, hicol, locol); ++ RBCreate(resnRB, pcdW, TWIDE/2, y, "1536*1024 4Base", ++ infofg, infobg, hicol, locol); ++ RBCreate(resnRB, pcdW, TWIDE/2, y+18, "3072*2048 16Base", ++ infofg, infobg, hicol, locol); ++ ++ CBCreate(&lutCB, pcdW, TWIDE/2, y+36, "Linear LUT", ++ infofg, infobg, hicol, locol); ++ ++ RBSelect(resnRB, 2); ++ ++ XMapSubwindows(theDisp, pcdW); ++} ++ ++ ++/***************************************************/ ++void PCDDialog(vis) ++int vis; ++{ ++ if (vis) { ++ CenterMapWindow(pcdW, tbut[T_BOK].x + tbut[T_BOK].w/2, ++ tbut[T_BOK].y + tbut[T_BOK].h/2, TWIDE, THIGH); ++ } ++ else XUnmapWindow(theDisp, pcdW); ++ pcdUp = vis; ++} ++ ++ ++/***************************************************/ ++int PCDCheckEvent(xev) ++XEvent *xev; ++{ ++ /* check event to see if it's for one of our subwindows. If it is, ++ deal accordingly, and return '1'. Otherwise, return '0' */ ++ ++ int rv; ++ rv = 1; ++ ++ if (!pcdUp) return 0; ++ ++ if (xev->type == Expose) { ++ int x,y,w,h; ++ XExposeEvent *e = (XExposeEvent *) xev; ++ x = e->x; y = e->y; w = e->width; h = e->height; ++ ++ if (e->window == pcdW) drawTD(x, y, w, h); ++ else rv = 0; ++ } ++ ++ else if (xev->type == ButtonPress) { ++ XButtonEvent *e = (XButtonEvent *) xev; ++ int x,y; ++ x = e->x; y = e->y; ++ ++ if (e->button == Button1) { ++ if (e->window == pcdW) clickTD(x,y); ++ else rv = 0; ++ } /* button1 */ ++ else rv = 0; ++ } /* button press */ ++ ++ ++ else if (xev->type == KeyPress) { ++ XKeyEvent *e = (XKeyEvent *) xev; ++ char buf[128]; KeySym ks; XComposeStatus status; ++ int stlen; ++ ++ stlen = XLookupString(e,buf,128,&ks,&status); ++ buf[stlen] = '\0'; ++ ++ RemapKeyCheck(ks, buf, &stlen); ++ ++ if (e->window == pcdW) { ++ if (stlen) { ++ if (buf[0] == '\r' || buf[0] == '\n') { /* enter */ ++ FakeButtonPress(&tbut[T_BOK]); ++ } ++ else if (buf[0] == '\033') { /* ESC */ ++ FakeButtonPress(&tbut[T_BCANC]); ++ } ++ } ++ } ++ else rv = 0; ++ } ++ else rv = 0; ++ ++ if (rv==0 && (xev->type == ButtonPress || xev->type == KeyPress)) { ++ XBell(theDisp, 50); ++ rv = 1; /* eat it */ ++ } ++ ++ return rv; ++} ++ ++ ++/***************************************************/ ++void ++PCDSetParamOptions(char *fname) ++{ ++ int cur; ++ cur = RBWhich(resnRB); ++ ++ RBSetActive(resnRB,0,1); ++ RBSetActive(resnRB,1,1); ++ RBSetActive(resnRB,2,1); ++ RBSetActive(resnRB,3,1); ++ RBSetActive(resnRB,4,1); ++ CBSetActive(&lutCB,1); ++} ++ ++ ++/***************************************************/ ++static void ++drawTD(int x, int y, int w, int h) ++{ ++ char *title = "Load PhotoCD file..."; ++ int i; ++ XRectangle xr; ++ ++ xr.x = x; xr.y = y; xr.width = w; xr.height = h; ++ XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted); ++ ++ XSetForeground(theDisp, theGC, infofg); ++ XSetBackground(theDisp, theGC, infobg); ++ ++ for (i=0; i<T_NBUTTS; i++) BTRedraw(&tbut[i]); ++ ++ ULineString(pcdW, resnRB->x-16, resnRB->y-10-DESCENT, "Resolution"); ++ RBRedraw(resnRB, -1); ++ CBRedraw(&lutCB); ++ ++ XDrawString(theDisp, pcdW, theGC, 20, 19, title, strlen(title)); ++ ++ XSetClipMask(theDisp, theGC, None); ++} ++ ++ ++/***************************************************/ ++static void clickTD(x,y) ++int x,y; ++{ ++ int i; ++ BUTT *bp; ++ ++ /* check BUTTs */ ++ ++ /* check the RBUTTS first, since they don't DO anything */ ++ if ( (i=RBClick(resnRB, x,y)) >= 0) { ++ (void) RBTrack(resnRB, i); ++ return; ++ } ++ ++ if(CBClick(&lutCB, x, y)) { ++ (void) CBTrack(&lutCB); ++ return; ++ } ++ ++ for (i=0; i<T_NBUTTS; i++) { ++ bp = &tbut[i]; ++ if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break; ++ } ++ ++ if (i<T_NBUTTS) { /* found one */ ++ if (BTTrack(bp)) doCmd(i); ++ } ++} ++ ++ ++ ++/***************************************************/ ++static void doCmd(cmd) ++int cmd; ++{ ++ leaveitup=0; ++ goforit=0; ++ switch (cmd) { ++ case T_BOK: PCDSetParams(); ++ goforit=1; ++ case T_BCANC: PCDDialog(0); ++ break; ++ ++ default: break; ++ } ++} ++ ++ ++/*******************************************/ ++static void PCDSetParams() ++{ ++ switch (RBWhich(resnRB)) { ++ case 0: size = 0; break; ++ case 1: size = 1; break; ++ case 2: size = 2; break; ++ case 3: size = 3; break; ++ case 4: size = 4; break; ++ case 5: size = 0; break; ++ default: size = 0; break; ++ } ++} ++ ++/* ++ * Read the Huffman tables which consist of an unsigned byte # of entries ++ * (less 1) followed by up to 256 entries, each of which is a series of 4 ++ * unsigned bytes - length, highseq, lowseq, and key. ++ * ++ * Store the huffman table into tree type structure: ++ * ++ * int int[n of entries*2] ++ * ++ * Each entry consists of two words (the 1st for zero and the 2nd for one). ++ * ++ * If the word is negative, then subtract it from the current pointer to ++ * get the next entry (ie. it is the negative offset from the current ++ * position*2 in order to skip entries not words) with which to ++ * make a decision. ++ * ++ * If the word is not negative, then the low 8 bits contain the value (which ++ * is supposed to be a signed char) and the rest of the word is zero. ++ */ ++static void ++dumphufftab(int n, const byte *h, int m, const int *t) ++{ ++ int j; ++ ++ for(j = 0; j < n || j < m; ++j) { ++ if(j < m) ++ fprintf(stderr, "%04x %04x ::", 0xffff & t[2*j + 0], ++ 0xffff & t[2*j + 1]); ++ else ++ fprintf(stderr, "%s %s ::", " ", " "); ++ if(j < n) { ++ int k; ++ unsigned l = (h[4*j + 1] << 8) | h[4*j + 2]; ++ ++ fprintf(stderr, " %02x %2d ", h[4*j + 3], h[4*j + 0]); ++ for(k = 0; k <= h[4*j + 0]; ++k, l *= 2) ++ fprintf(stderr, "%c", '0'+((l & 0x8000) != 0)); ++ } ++ fprintf(stderr, "\n"); ++ } ++} ++ ++static int * ++gethufftable(void) ++{ ++ int *hufftab, *h, i, j, N, num, bufsize, huffptr, hufftop; ++ byte *huf; ++ ++ /* ++ * absorb the entirety of the table in one chunk (for better ++ * dumps in case of error) ++ */ ++ trace((stderr, "hufftab 0x%08lx ", ftell(fp))); ++ num = 1 + fgetc(fp); /* 256 max */ ++ huf = (byte *)alloca(4*num*sizeof(byte)); ++ if((i = fread(huf, 1, 4*num, fp)) != 4*num) { ++ fprintf(stderr, "unexpected EOF: got %d bytes, wanted %d\n", ++ i, 4*num); ++ return NULL; ++ } ++ ++ /* ++ * guess an initial size and prepare the initial entry ++ */ ++ trace((stderr, "length %u\n", num)); ++ N = 2*num; /* 512 max */ ++ bufsize = N * sizeof(int); ++/* this case can't happen, but added for symmetry with loop below ++ if (N/2 != num || bufsize/N != sizeof(int)) { ++ SetISTR(ISTR_WARNING, "Huffman table size out of range"); ++ return NULL; ++ } ++ */ ++ if((hufftab = (int *)malloc(bufsize)) == NULL) ++ FatalError("couldn't malloc initial Huffman table"); ++ hufftab[0] = hufftab[1] = 0; ++ ++ /* ++ * we check the table for reasonableness; there is a lack of detailed ++ * documentation on this format. in particular, for the base16, ++ * the position of the huffman tables is uncertain to within one ++ * "sector", and we have to detect his before trying to read ++ * bogusness. ++ */ ++ hufftop = 0; ++ for(i = 0; i < num; ++i) { ++ unsigned length = huf[4*i + 0], ++ codeword = (huf[4*i + 1] << 8) | huf[4*i + 2]; ++ ++ /* ++ * some sanity checks ++ */ ++ if(length >= 16) { ++ fprintf(stderr, ++ "gethufftable: improbable length @ %d/%d\n", ++ i, num); ++ dumphufftab(num, huf, hufftop/2, hufftab); ++ free(hufftab); ++ return NULL; ++ } ++ ++ /* ++ * walk the whole set of codes ++ */ ++ huffptr = 0; ++ for(j = 0; j < 16; ++j, codeword *= 2) { ++ /* ++ * choose the child node ++ */ ++ if(codeword & 0x8000) ++ ++huffptr; ++ ++ /* ++ * store value at end-of-code ++ */ ++ if(j == length) { ++ /* ++ * more sanity ++ */ ++ if((codeword *= 2) & 0xffff) { ++ fprintf(stderr, ++ "gethufftable: " ++ ":probable invalid code @ %d\n", ++ i); ++ dumphufftab(num, huf, ++ hufftop/2, hufftab); ++ free(hufftab); ++ return NULL; ++ } ++ hufftab[huffptr] = 1 + (int) huf[4*i + 3]; ++ break; ++ } ++ ++ /* ++ * otherwise, follow the tree to date ++ */ ++ if(hufftab[huffptr] < 0) { ++ huffptr -= hufftab[huffptr]; ++ continue; ++ } else if(hufftab[huffptr] > 0) { ++ fprintf(stderr, "duplicate code %d %d/%d\n", ++ huffptr, i, num); ++ dumphufftab(num, huf, hufftop/2, hufftab); ++ free(hufftab); ++ return NULL; ++ } ++ ++ /* ++ * and if necessary, make the tree bigger ++ */ ++ if((hufftop += 2) >= N) { ++ int oldN = N; ++#if TRACE ++ dumphufftab(num, huf, hufftop/2, hufftab); ++#endif ++ N *= 2; ++ bufsize = N*sizeof(int); ++ if (N/2 != oldN || bufsize/N != sizeof(int)) { ++ SetISTR(ISTR_WARNING, ++ "new Huffman table is too large"); ++ free(hufftab); ++ return NULL; ++ } ++ h = (int *)realloc(hufftab, bufsize); ++ if(h == NULL) { ++ fprintf(stderr, ++ "Table overflow %d/%d\n", ++ i, num); ++ dumphufftab(num, huf, ++ hufftop/2, hufftab); ++ free(hufftab); ++ FatalError( ++ "couldn't realloc Huffman table"); ++ } ++ hufftab = h; ++ } ++ ++ /* ++ * then add new ptr ++ */ ++ hufftab[huffptr] = huffptr - hufftop; ++ huffptr = hufftop; ++ hufftab[huffptr + 0] = ++ hufftab[huffptr + 1] = 0; ++ } ++ } ++ return hufftab; ++} ++ ++/* WORDTYPE & char buffer must be unsigned else */ ++/* fills with sign bit not 0 on right shifts */ ++typedef unsigned int WORDTYPE; ++typedef int SWORDTYPE; ++#define WORDSIZE sizeof(WORDTYPE) ++#define NBYTESINBUF 0x800 ++ ++static byte buffer[NBYTESINBUF]; ++static int bitsleft=0; ++static int bytesleft=0; ++static byte *bufptr; ++static WORDTYPE word; ++ ++#if 0 ++static void ++dumpbuffer(void) ++{ ++ int i,left; ++ byte *ptr=buffer; ++ ++ fprintf(stderr,"dumpbuffer: bytesleft=%d bitsleft= %d word=0x%08lx\n", ++ bytesleft,bitsleft,(unsigned long)word); ++ for (left=NBYTESINBUF; left>0; left-=16) { ++ fprintf(stderr,"%05d ",left); ++ for (i=0; i<8; i++) { ++ fprintf(stderr,"%02x",*ptr++); ++ fprintf(stderr,"%02x ",*ptr++); ++ } ++ fprintf(stderr,"\n"); ++ } ++} ++#endif /* 0 */ ++ ++static void ++loadbuffer(void) ++{ ++ if ((bytesleft=fread(buffer,1,NBYTESINBUF,fp)) == 0) { ++ fprintf(stderr,"Truncation error\n"); ++ exit(1); ++ } ++ bufptr=buffer; ++ /* dumpbuffer(); */ ++} ++ ++static void ++loadbyte(void) ++{ ++ if (bytesleft <= 0) loadbuffer(); ++ --bytesleft; ++ word|=(WORDTYPE)(*bufptr++)<<(sizeof(WORDTYPE)*8-8-bitsleft); ++ bitsleft+=8; ++} ++ ++static int ++getbit(void) ++{ ++ int bit; ++ ++ while (bitsleft <= 0) loadbyte(); ++ --bitsleft; ++ bit=(SWORDTYPE)(word)<0; /* assumes word is signed */ ++ /* bit=word>>(sizeof(WORDTYPE)*8-1); */ ++ word<<=1; ++ return bit; ++} ++ ++static WORDTYPE ++getnn(int nn) ++{ ++ WORDTYPE value; ++ ++ while (bitsleft <= nn) loadbyte(); ++ bitsleft-=nn; ++ value=word>>(sizeof(WORDTYPE)*8-nn); ++ word<<=nn; ++ return value; ++} ++ ++static WORDTYPE ++isnn(int nn) ++{ ++ WORDTYPE value; ++ ++ while (bitsleft <= nn) loadbyte(); ++ value=word>>(sizeof(WORDTYPE)*8-nn); ++ return value; ++} ++ ++static void ++skipnn(int nn) ++{ ++ while (bitsleft <= nn) loadbyte(); ++ bitsleft-=nn; ++ word<<=nn; ++} ++ ++#define get1() (getbit()) ++#define get2() (getnn(2)) ++#define get8() (getnn(8)) ++#define get13() (getnn(13)) ++#define get16() (getnn(16)) ++#define get24() (getnn(24)) ++ ++#define is24() (isnn(24)) ++ ++#define skip1() (skipnn(1)) ++#define skip24() (skipnn(24)) ++ ++static int ++gethuffdata( byte *luma, ++ byte *chroma1, ++ byte *chroma2, ++ int realrowwidth, ++ int maxrownumber) ++{ ++static byte clip[3*256]; ++ int *hufftable[3], *huffstart = NULL, *huffptr = NULL; ++ int row, col, plane, i, result = 1; ++#if TRACE ++ int uflow = 0, oflow = 0; ++#endif ++ byte *pixelptr = NULL; ++ ++ trace((stderr,"gethuffdata: start @ 0x%08lx (sector %ld.%ld)\n", ++ ftell(fp), ftell(fp)/0x800, ftell(fp) % 0x800)); ++ ++ /* ++ * correction clipping ++ */ ++ if(clip[256+255] == 0) { ++ for(i = 0; i < 256; ++i) ++ clip[i + 0] = 0x00, ++ clip[i + 256] = (byte) i, ++ clip[i + 512] = 0xff; ++ } ++ ++ /* ++ * should really only look for luma plane for 4base, but the ++ * there are zeroes in the rest of the sector that give both ++ * chroma tables 0 length ++ */ ++ for(i = 0; i < 3; ++i) ++ hufftable[i] = NULL; ++ for(i = 0; i < 3; ++i) { ++ if((hufftable[i] = gethufftable()) == NULL) { ++ result = 0; ++ break; ++ } ++ } ++ if(result == 0) ++ goto oops; ++ ++ /* ++ * skip remainder of current sector ++ */ ++ i = (ftell(fp) | 0x7ff) + 1; ++ if(fseek(fp, i, SEEK_SET) < 0) { ++ fprintf(stderr, "gethuffdata: sector skip failed\n"); ++ return 0; ++ } ++ ++ /* ++ * skip remainder of "sector" ++ */ ++ i = 0; ++ while (is24() != 0xfffffe) { ++ (void)get24(); ++ if(++i == 1) ++ trace((stderr,"gethuffdata: skipping for sync ...")); ++ } ++ if(i != 0) ++ trace((stderr, " %d times\n", i)); ++ ++ while(result) { ++ if(is24() == 0xfffffe) { ++ skip24(); ++ plane = get2(); ++ row = get13(); col = 0; ++ skip1(); ++ if(row >= maxrownumber) { ++ trace((stderr, ++ "gethuffdata: stopping at row %d\n", ++ row)); ++ break; ++ } ++ switch (plane) { ++ case 0: ++ huffstart = hufftable[0]; ++ pixelptr = luma + row*realrowwidth; ++ break; ++ ++ case 2: ++ huffstart = hufftable[1]; ++ pixelptr = chroma1 + row/2*realrowwidth/2; ++ break; ++ ++ case 3: ++ huffstart = hufftable[2]; ++ pixelptr = chroma2 + row/2*realrowwidth/2; ++ break; ++ ++ default: ++ fprintf(stderr, "gethuffdata: bad plane %d\n", ++ plane); ++ result = 0; ++ break; ++ } ++ WaitCursor(); ++ continue; ++ } ++ ++ /* ++ * locate correction in huffman tree ++ */ ++ for(huffptr = huffstart;;) { ++ huffptr += get1(); ++ if(*huffptr < 0) { ++ huffptr -= *huffptr; ++ } else if(*huffptr == 0) { ++ fprintf(stderr, ++ "gethuffdata: invalid code: " ++ "image quality reduced\n"); ++ result = 0; ++ break; ++ } else ++ break; ++ } ++ if(!result) ++ break; ++ ++ /* ++ * apply correction to the pixel ++ * ++ * eeeek!! the corrections can sometimes over or underflow! ++ * this strongly suggested that the 'magnify' method was in ++ * some way wrong. however, experiments showed that the ++ * over/under flows even occured for the pixels that are ++ * copied through magnify without change (ie, the even ++ * row/even column case). curiously, though, the odd ++ * column and odd row cases were about 3x more likely to have ++ * the over/underflow, and the odd row/odd column case was ++ * about 5x higher, so maybe the use of a bi-linear ++ * interpolation is not correct -- just *close*? ++ * ++ * the other clue in this area is that the overflows are ++ * by far most frequenct along edges of very bright ++ * areas -- rarely in the interior of such regions. ++ */ ++ i = (int) *pixelptr + (signed char) (*huffptr - 1); ++#if TRACE ++ if(i > 255) ++ ++oflow; ++/* trace((stderr, ++ "gethuffdata: oflow %d %d %d\n", row, col, i));*/ ++ else if(i < 0) ++ ++uflow; ++/* trace((stderr, ++ "gethuffdata: uflow %d %d %d\n", row, col, i));*/ ++ ++col; ++#endif ++ *pixelptr++ = clip[i + 256]; ++ } ++ ++oops: ++ for(i = 0; i < 3; ++i) ++ free(hufftable[i]); ++ trace((stderr, "gethuffdata: uflow=%d oflow=%d\n", uflow, oflow)); ++ trace((stderr, "gethuffdata: done @ 0x%08lx (sector %ld.%d)\n", ++ ftell(fp), ftell(fp)/0x800, 0x800 - bytesleft)); ++ return result; ++} ++ ++#endif /* HAVE_PCD */ +diff -ruN xv-3.10a-bugfixes/xvpds.c xv-3.10a-enhancements/xvpds.c +--- xv-3.10a-bugfixes/xvpds.c 2005-04-03 11:31:30.000000000 -0700 ++++ xv-3.10a-enhancements/xvpds.c 2005-04-17 21:40:40.000000000 -0700 +@@ -77,8 +77,7 @@ + * Huffman-encoded, and the encoding histogram follows the ASCII headers. + * To decode these, we use a slightly modified version of "vdcomp.c" from the + * NASA Viking CD-ROMS. For xv to work, you need to have vdcomp compiled +- * and in your search path. vdcomp.c should be included with this +-distribution. ++ * and in your search path. vdcomp.c should be included with this distribution. + * + * I've heard that newer discs have FITS images on them. If they do, support + * for them will be added when I get one. Until then, you can use fitstopgm. +@@ -102,7 +101,7 @@ + * This software is provided "as is" without any express or implied warranty. + */ + +- ++#define NEEDSDIR /* for S_IRUSR|S_IWUSR */ + #include "xv.h" + + #ifdef HAVE_PDS +@@ -129,27 +128,32 @@ + + /* This is arbitrary. Everything I've seen so far fits in 50 chars */ + #define COMMENTSIZE 50 ++#define INOTESIZE 1000 + + + static int lastwasinote = FALSE; +-static char scanbuff [MAX_SIZE], +- rtbuff [RTBUFFSIZE], +- inote [20*COMMENTSIZE], +- infobuff [COMMENTSIZE], +- spacecraft [COMMENTSIZE], +- target [COMMENTSIZE], +- filtname [COMMENTSIZE], +- gainmode [COMMENTSIZE], +- editmode [COMMENTSIZE], +- scanmode [COMMENTSIZE], +- exposure [COMMENTSIZE], +- shuttermode [COMMENTSIZE], +- mphase [COMMENTSIZE], +- iname [COMMENTSIZE], +- itime [COMMENTSIZE], +- garbage [1020], ++static char scanbuff [MAX_SIZE+1], ++ rtbuff [RTBUFFSIZE+1], ++ inote [INOTESIZE+1], ++ infobuff [COMMENTSIZE+1], ++ spacecraft [COMMENTSIZE+1], ++ target [COMMENTSIZE+1], ++ filtname [COMMENTSIZE+1], ++ gainmode [COMMENTSIZE+1], ++ editmode [COMMENTSIZE+1], ++ scanmode [COMMENTSIZE+1], ++ exposure [COMMENTSIZE+1], ++ shuttermode [COMMENTSIZE+1], ++ mphase [COMMENTSIZE+1], ++ iname [COMMENTSIZE+1], ++ itime [COMMENTSIZE+1], ++ garbage [1024], + *tmptmp, + pdsuncompfname[FNAMESIZE]; ++ ++#define SSTR(l) "%" #l "s" ++#define S(l) SSTR(l) ++ + byte *image; + static int elaphe; + +@@ -251,6 +255,9 @@ + /* returns '1' on success, '0' on failure */ + + int tempnum, bytewidth, bufsize; ++#ifndef USE_MKSTEMP ++ int tmpfd; ++#endif + FILE *zf; + static int isfixed,teco,i,j,itype,vaxbyte, + recsize,hrecsize,irecsize,isimage,labelrecs,labelsofar, +@@ -397,7 +404,7 @@ + + if (strcmp(scanbuff,"END") == 0) { + break; +- } else if (sscanf(scanbuff," RECORD_TYPE = %s",rtbuff) == 1) { ++ } else if (sscanf(scanbuff, " RECORD_TYPE = " S(RTBUFFSIZE), rtbuff) == 1) { + if (strncmp(rtbuff,"VARIABLE_LENGTH", (size_t) 15) == 0) { + /* itype=PDSVARIABLE; */ + } else if (strncmp(rtbuff,"FIXED_LENGTH", (size_t) 12) == 0) { +@@ -416,7 +423,7 @@ + if (irecsize == 0) irecsize=recsize; + lastwasinote=FALSE; + continue; +- } else if (sscanf(scanbuff," FILE_TYPE = %s", rtbuff) != 0) { ++ } else if (sscanf(scanbuff, " FILE_TYPE = " S(RTBUFFSIZE), rtbuff) != 0) { + lastwasinote=FALSE; + if (strncmp(rtbuff,"IMAGE", (size_t) 5) == 0) { + isimage=TRUE; +@@ -445,74 +452,74 @@ + lastwasinote=FALSE; continue; + } else if (sscanf(scanbuff," SAMPLE_BITS = %d", &samplesize) == 1) { + lastwasinote=FALSE; continue; +- } else if (sscanf(scanbuff," SAMPLE_TYPE = %s", sampletype) == 1) { ++ } else if (sscanf(scanbuff, " SAMPLE_TYPE = " S(64), sampletype) == 1) { + lastwasinote=FALSE; continue; +- } else if (sscanf(scanbuff," SPACECRAFT_NAME = %s %s", ++ } else if (sscanf(scanbuff," SPACECRAFT_NAME = " S(COMMENTSIZE) " " S(1023), + spacecraft,garbage) == 2 ) { +- strcat(spacecraft,xv_strstr(scanbuff, spacecraft)+strlen(spacecraft)); ++ const char *tmp = xv_strstr(scanbuff, spacecraft) + strlen(spacecraft); ++ strncat(spacecraft, tmp, COMMENTSIZE - strlen(spacecraft)); + lastwasinote=FALSE; continue; +- } else if (sscanf(scanbuff," SPACECRAFT_NAME = %s", spacecraft) == 1) { ++ } else if (sscanf(scanbuff, " SPACECRAFT_NAME = " S(COMMENTSIZE), spacecraft) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," TARGET_NAME = %s", target) == 1) { ++ } else if (sscanf(scanbuff, " TARGET_NAME = " S(COMMENTSIZE), target) == 1) { + lastwasinote=FALSE; continue; +- } else if (sscanf(scanbuff," TARGET_BODY = %s", target) == 1) { ++ } else if (sscanf(scanbuff, " TARGET_BODY = " S(COMMENTSIZE), target) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," MISSION_PHASE_NAME = %s", mphase) == 1) { ++ } else if (sscanf(scanbuff, " MISSION_PHASE_NAME = " S(COMMENTSIZE), mphase) == 1) { + lastwasinote=FALSE; continue; +- } else if (sscanf(scanbuff," MISSION_PHASE = %s", mphase) == 1) { ++ } else if (sscanf(scanbuff, " MISSION_PHASE = " S(COMMENTSIZE), mphase) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," INSTRUMENT_NAME = %s", iname) == 1) { ++ } else if (sscanf(scanbuff, " INSTRUMENT_NAME = " S(COMMENTSIZE), iname) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," GAIN_MODE_ID = %s", gainmode) == 1) { ++ } else if (sscanf(scanbuff, " GAIN_MODE_ID = " S(COMMENTSIZE), gainmode) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," INSTRUMENT_GAIN_STATE = %s",gainmode)==1) { ++ } else if (sscanf(scanbuff, " INSTRUMENT_GAIN_STATE = " S(COMMENTSIZE), gainmode) ==1 ) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," EDIT_MODE_ID = %s", editmode) == 1) { ++ } else if (sscanf(scanbuff, " EDIT_MODE_ID = " S(COMMENTSIZE), editmode) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," INSTRUMENT_EDIT_MODE = %s", editmode)==1) { ++ } else if (sscanf(scanbuff, " INSTRUMENT_EDIT_MODE = " S(COMMENTSIZE), editmode) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," SCAN_MODE_ID = %s", scanmode) == 1) { ++ } else if (sscanf(scanbuff, " SCAN_MODE_ID = " S(COMMENTSIZE), scanmode) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," INSTRUMENT_SCAN_RATE = %s", scanmode)==1) { ++ } else if (sscanf(scanbuff, " INSTRUMENT_SCAN_RATE = " S(COMMENTSIZE), scanmode) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," SHUTTER_MODE_ID = %s", shuttermode) == 1) { ++ } else if (sscanf(scanbuff, " SHUTTER_MODE_ID = " S(COMMENTSIZE), shuttermode) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," INSTRUMENT_SHUTTER_MODE = %s", +- shuttermode) == 1) { ++ } else if (sscanf(scanbuff, " INSTRUMENT_SHUTTER_MODE = " S(COMMENTSIZE), shuttermode) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," SCAN_MODE_ID = %s", scanmode) == 1) { ++ } else if (sscanf(scanbuff, " SCAN_MODE_ID = " S(COMMENTSIZE), scanmode) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," INSTRUMENT_SCAN_RATE = %s", scanmode)==1) { ++ } else if (sscanf(scanbuff, " INSTRUMENT_SCAN_RATE = " S(COMMENTSIZE), scanmode) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," SPACECRAFT_EVENT_TIME = %s", itime) == 1) { ++ } else if (sscanf(scanbuff, " SPACECRAFT_EVENT_TIME = " S(COMMENTSIZE), itime) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," IMAGE_TIME = %s", itime) == 1) { ++ } else if (sscanf(scanbuff, " IMAGE_TIME = " S(COMMENTSIZE), itime) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," FILTER_NAME = %s", filtname) == 1) { ++ } else if (sscanf(scanbuff, " FILTER_NAME = " S(COMMENTSIZE), filtname) == 1) { + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff," INSTRUMENT_FILTER_NAME = %s",filtname)==1) { ++ } else if (sscanf(scanbuff, " INSTRUMENT_FILTER_NAME = " S(COMMENTSIZE), filtname) == 1) { + lastwasinote=FALSE; continue; + +- } else if ((sscanf(scanbuff," EXPOSURE_DURATION = %s", exposure) == 1) +- || (sscanf(scanbuff," INSTRUMENT_EXPOSURE_DURATION = %s", +- exposure) == 1)) { ++ } else if ((sscanf(scanbuff, " EXPOSURE_DURATION = " S(COMMENTSIZE), exposure) == 1) ++ || (sscanf(scanbuff, " INSTRUMENT_EXPOSURE_DURATION = " S(COMMENTSIZE), ++ exposure)) == 1) { + tmptmp = (char *) index(scanbuff,'='); + tmptmp++; + while((*tmptmp) == ' ') +@@ -520,10 +527,10 @@ + strcpy(exposure,tmptmp); + lastwasinote=FALSE; continue; + +- } else if (sscanf(scanbuff, "NOTE = %s", inote) == 1) { ++ } else if (sscanf(scanbuff, "NOTE = " S(INOTESIZE), inote) == 1) { + tmptmp = (char *) index(scanbuff,'='); tmptmp++; + while (((*tmptmp) == ' ') || ((*tmptmp) == '"')) tmptmp++; +- strcpy(inote,tmptmp); ++ strncpy(inote, tmptmp, INOTESIZE - 1); + strcat(inote," "); + + /* evil and somewhat risky: A "note" (really, any textual +@@ -548,7 +555,7 @@ + } else if (lastwasinote) { + tmptmp=scanbuff; + while (((*tmptmp) == ' ') || ((*tmptmp) == '"')) tmptmp++; +- strcat(inote,tmptmp); ++ strncat(inote, tmptmp, INOTESIZE - strlen(inote) - 1); + strcat(inote," "); + if (index(tmptmp,'"') != NULL) + lastwasinote=FALSE; +@@ -647,27 +654,27 @@ + + *infobuff='\0'; + if (*spacecraft) { +- strcat(infobuff,spacecraft); ++ strncat(infobuff, spacecraft, sizeof(infobuff) - 1); + } + + if (*target) { +- strcat(infobuff,", "); +- strcat(infobuff,target); ++ strncat(infobuff, ", ", sizeof(infobuff) - strlen(infobuff) - 1); ++ strncat(infobuff, target, sizeof(infobuff) - strlen(infobuff) - 1); + } + + if (*filtname) { +- strcat(infobuff,", "); +- strcat(infobuff,filtname); ++ strncat(infobuff, ", ", sizeof(infobuff) - strlen(infobuff) - 1); ++ strncat(infobuff, filtname, sizeof(infobuff) - strlen(infobuff) - 1); + } + + if (*itime) { +- strcat(infobuff,", "); +- strcat(infobuff,itime); ++ strncat(infobuff, ", ", sizeof(infobuff) - strlen(infobuff) - 1); ++ strncat(infobuff, itime, sizeof(infobuff) - strlen(infobuff) - 1); + } + +- SetISTR(ISTR_WARNING,infobuff); ++ SetISTR(ISTR_WARNING, "%s", infobuff); + +- strcpy(pdsuncompfname,fname); ++ strncpy(pdsuncompfname,fname,sizeof(pdsuncompfname) - 1); + ftypstr = ""; + + switch (itype) { +@@ -695,7 +702,7 @@ + fclose(zf); + + #ifndef VMS +- sprintf(pdsuncompfname,"%s/xvhuffXXXXXX", tmpdir); ++ snprintf(pdsuncompfname, sizeof(pdsuncompfname) - 1, "%s/xvhuffXXXXXX", tmpdir); + #else + strcpy(pdsuncompfname,"sys$disk:[]xvhuffXXXXXX"); + #endif +@@ -704,10 +711,16 @@ + close(mkstemp(pdsuncompfname)); + #else + mktemp(pdsuncompfname); ++ tmpfd = open(pdsuncompfname,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR); ++ if (tmpfd < 0) { ++ SetISTR(ISTR_WARNING,"Unable to create temporary file."); ++ return 0; ++ } ++ close(tmpfd); + #endif + + #ifndef VMS +- sprintf(scanbuff,"%s %s - 4 >%s",PDSUNCOMP,fname,pdsuncompfname); ++ sprintf(scanbuff,"%s '%s' - 4 > %s", PDSUNCOMP, fname, pdsuncompfname); + #else + sprintf(scanbuff,"%s %s %s 4",PDSUNCOMP,fname,pdsuncompfname); + #endif +@@ -823,26 +836,26 @@ + char tmp[256]; + *(pinfo->comment) = '\0'; + +- sprintf(tmp, "Spacecraft: %-28sTarget: %-32s\n", spacecraft, target); +- strcat(pinfo->comment, tmp); ++ sprintf(tmp, "Spacecraft: %-28.28sTarget: %-32.32s\n", spacecraft, target); ++ strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); + +- sprintf(tmp, "Filter: %-32sMission phase: %-24s\n", filtname, mphase); +- strcat(pinfo->comment, tmp); ++ sprintf(tmp, "Filter: %-32.32sMission phase: %-24.24s\n", filtname, mphase); ++ strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); + +- sprintf(tmp, "Image time: %-28sGain mode: %-29s\n", itime, gainmode); +- strcat(pinfo->comment, tmp); ++ sprintf(tmp, "Image time: %-28.28sGain mode: %-29.29s\n", itime, gainmode); ++ strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); + +- sprintf(tmp, "Edit mode: %-29sScan mode: %-29s\n", editmode, scanmode); +- strcat(pinfo->comment, tmp); ++ sprintf(tmp, "Edit mode: %-29.29sScan mode: %-29.29s\n", editmode, scanmode); ++ strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); + +- sprintf(tmp, "Exposure: %-30sShutter mode: %-25s\n", exposure,shuttermode); +- strcat(pinfo->comment, tmp); ++ sprintf(tmp, "Exposure: %-30.30sShutter mode: %-25.25s\n", exposure,shuttermode); ++ strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); + +- sprintf(tmp, "Instrument: %-28sImage time: %-28s\n", iname, itime); +- strcat(pinfo->comment, tmp); ++ sprintf(tmp, "Instrument: %-28.28sImage time: %-28.28s\n", iname, itime); ++ strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); + +- sprintf(tmp, "Image Note: %-28s", inote); +- strcat(pinfo->comment, tmp); ++ sprintf(tmp, "Image Note: %-28.28s", inote); ++ strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); + } + + if (LoadPDSPalette(fname, pinfo)) return 1; +diff -ruN xv-3.10a-bugfixes/xvpi.c xv-3.10a-enhancements/xvpi.c +--- xv-3.10a-bugfixes/xvpi.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvpi.c 2005-04-17 22:57:04.000000000 -0700 +@@ -0,0 +1,1060 @@ ++/* ++ * xvpi.c - load routine for `Pi' format pictures. ++ * ++ * The `Pi' format is made by Yanagisawa. ++ * It is common among many Japanese personal computer users. ++ * ++ */ ++ ++#include "xv.h" ++#include <setjmp.h> ++ ++#ifdef HAVE_PI ++ ++typedef unsigned short data16; ++typedef unsigned int data32; ++ ++struct pi_info { ++ jmp_buf jmp; ++ FILE *fp; ++ struct { ++ int rest; ++ byte cur; ++ }bs; ++ long fsize; ++ byte mode; ++ int width, height; ++ float aspect; ++ int cbits; ++ int numcols; ++ byte *cmap; ++ struct ct_t{ ++ struct elt_t *top; ++ struct elt_t{ ++ struct elt_t *old, *recent; ++ byte val; ++ } *elt; ++ }*ct; ++ int defcmap; ++ int writing_grey; ++}; ++ ++static void pi_open_file PARM((struct pi_info*, char*)); ++static void pi_read_header PARM((struct pi_info*, char**)); ++static void pi_check_id PARM((struct pi_info*)); ++static void pi_read_comment PARM((struct pi_info*, char**)); ++static void pi_read_palette PARM((struct pi_info*)); ++static void pi_expand PARM((struct pi_info*, byte**)); ++static byte pi_read_color PARM((struct pi_info*, int)); ++static int pi_read_position PARM((struct pi_info*)); ++static data32 pi_read_length PARM((struct pi_info*)); ++static int pi_copy_pixels PARM((struct pi_info*, ++ byte*, int, int, data32)); ++ ++static void pi_write_header PARM((struct pi_info*, ++ char*, byte*, byte*, byte*)); ++static void pi_write_id PARM((struct pi_info*)); ++static void pi_write_comment PARM((struct pi_info*, char*)); ++static void pi_write_palette PARM((struct pi_info*, byte*, byte*, byte*)); ++static void pi_compress PARM((struct pi_info*, byte*)); ++static void pi_write_gabage PARM((struct pi_info*)); ++static void pi_write_color PARM((struct pi_info*, int, int)); ++static int pi_test_matching PARM((struct pi_info*, ++ byte*, int, int, data32*)); ++static void pi_write_position PARM((struct pi_info*, int)); ++static void pi_write_length PARM((struct pi_info*, data32)); ++ ++static void pi_table_create PARM((struct pi_info*)); ++static byte pi_table_get_value PARM((struct pi_info*, int, int)); ++static int pi_table_lookup_value PARM((struct pi_info*, int, int)); ++static data32 pi_read_bits PARM((struct pi_info*, int)); ++static void pi_write_bits PARM((struct pi_info*, data32, int)); ++static void pi_init_pi_info PARM((struct pi_info*)); ++static void pi_cleanup_pi_info PARM((struct pi_info*, int)); ++static void pi_cleanup_pinfo PARM((PICINFO*)); ++static void pi_memory_error PARM((char*, char*)); ++static void pi_error PARM((struct pi_info*, int)); ++static void pi_file_error PARM((struct pi_info*, int)); ++static void pi_file_warning PARM((struct pi_info*, int)); ++static void pi_show_pi_info PARM((struct pi_info*)); ++static void *pi_malloc PARM((size_t, char*)); ++static void *pi_realloc PARM((void*, size_t, char*)); ++ ++ ++static char *pi_id = "Pi"; ++static char *pi_msgs[] = { ++ NULL, ++#define PI_OPEN 1 ++ "couldn't open.", ++#define PI_CORRUPT 2 ++ "file corrupted.", ++#define PI_FORMAT 3 ++ "not PI format.", ++#define PI_PLANES 4 ++ "bad number of planes.", ++#define PI_WRITE 5 ++ "write failed.", ++}; ++ ++ ++/* The main routine of `Pi' loader. */ ++int LoadPi(fname, pinfo) ++ char *fname; ++ PICINFO *pinfo; ++{ ++ struct pi_info pi; ++ int e; ++ int i; ++ if(DEBUG) fputs("LoadPi:\n", stderr); ++ ++ pinfo->comment = NULL; ++ pi_init_pi_info(&pi); ++ if((e = setjmp(pi.jmp)) != 0){ ++ /* When an error occurs, comes here. */ ++ pi_cleanup_pi_info(&pi, 0); ++ pi_cleanup_pinfo(pinfo); ++ if(DEBUG) fputs("\n", stderr); ++ return 0; ++ } ++ ++ pi_open_file(&pi, fname); ++ pi_read_header(&pi, &pinfo->comment); ++ pi_expand(&pi, &pinfo->pic); ++ ++ pinfo->normw = pinfo->w = pi.width; ++ pinfo->normh = pinfo->h = pi.height; ++ pinfo->type = PIC8; ++ if(pi.numcols > 256) /* shouldn't happen. */ ++ pi.numcols = 256; ++ for(i = 0; i < pi.numcols; i++){ ++ pinfo->r[i] = pi.cmap[i * 3 ]; ++ pinfo->g[i] = pi.cmap[i * 3 + 1]; ++ pinfo->b[i] = pi.cmap[i * 3 + 2]; ++ } ++ pinfo->frmType = F_PI; ++ pinfo->colType = F_FULLCOLOR; ++ sprintf(pinfo->fullInfo, "Pi, %d colors (%ld bytes)", ++ pi.numcols, pi.fsize); ++ sprintf(pinfo->shrtInfo, "%dx%d Pi.", pi.width, pi.height); ++ normaspect = pi.aspect; ++ ++ pi_cleanup_pi_info(&pi, 0); ++ if(DEBUG) fputs("\n", stderr); ++ return 1; ++} ++ ++static void pi_open_file(pi, fname) ++ struct pi_info *pi; ++ char *fname; ++{ ++ if((pi->fp = fopen(fname, "rb")) == NULL) ++ pi_file_error(pi, PI_OPEN); ++ fseek(pi->fp, (size_t) 0, SEEK_END); ++ pi->fsize = ftell(pi->fp); ++ fseek(pi->fp, (size_t) 0, SEEK_SET); ++} ++ ++static void pi_read_header(pi, comm) ++ struct pi_info *pi; ++ char **comm; ++{ ++ byte buf[10]; ++ int mda; ++ int i; ++ ++ pi_check_id(pi); ++ pi_read_comment(pi, comm); ++ ++ if(fread(buf, (size_t) 10, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_CORRUPT); ++ ++ pi->mode = buf[0]; ++ pi->defcmap = pi->mode & 0x80; ++ if(buf[1] != 0 && buf[2] != 0) ++ pi->aspect = (float) buf[2] / (int) buf[1]; ++ pi->cbits = buf[3]; ++ pi->numcols = 1 << pi->cbits; ++ ++ if(pi->cbits != 4 && pi->cbits != 8) ++ pi_error(pi, PI_PLANES); ++ ++ mda = (int) buf[8] << 8 | (int) buf[9]; ++ for(i = 0; i < mda; i++){ ++ if(fgetc(pi->fp) == EOF) ++ pi_file_error(pi, PI_CORRUPT); ++ } ++ ++ if(fread(buf, (size_t) 4, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_CORRUPT); ++ pi->width = (int) buf[0] << 8 | (int) buf[1]; ++ pi->height = (int) buf[2] << 8 | (int) buf[3]; ++ ++ pi_read_palette(pi); ++ ++ if(DEBUG) pi_show_pi_info(pi); ++} ++ ++static void pi_check_id(pi) ++ struct pi_info *pi; ++{ ++ char buf[2]; ++ ++ if(fread(buf, (size_t) 2, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_CORRUPT); ++ if(strncmp(buf, pi_id, (size_t) 2) != 0) ++ pi_error(pi, PI_FORMAT); ++} ++ ++static void pi_read_comment(pi, comm) ++ struct pi_info *pi; ++ char **comm; ++{ ++/* ++ * The comment format is like: ++ * comment string `^Z' dummy string `\0' ++ */ ++ int max = -1, i = 0; ++ int c; ++ ++ while(1){ ++ if((c = fgetc(pi->fp)) == EOF) ++ pi_file_error(pi, PI_CORRUPT); ++ if(c == '\032') /* 0x1a, '^Z' */ ++ break; ++ if(max < i){ ++ max += 32; ++ *comm = pi_realloc(*comm, (size_t) max + 1, "pi_read_comment(1)"); ++ } ++ (*comm)[i++] = c; ++ } ++ if(max < i){ ++ max++; ++ *comm = pi_realloc(*comm, (size_t) max + 1, "pi_read_comment(2)"); ++ } ++ (*comm)[i] = '\0'; ++ ++ while((c = fgetc(pi->fp)) != '\0'){ /* skip the dummy area */ ++ if(c == EOF) ++ pi_file_error(pi, PI_CORRUPT); ++ } ++} ++ ++static void pi_read_palette(pi) ++ struct pi_info *pi; ++{ ++ pi->cmap = pi_malloc((size_t) pi->numcols * 3, "pi_read_palette"); ++ if(pi->mode & 0x80){ ++ if(pi->numcols == 16){ ++ int i; ++ byte on; ++ ++ on = 0x77; ++ for(i = 0; i < 8; i++){ ++ pi->cmap[i * 3 ] = i & 2 ? on : 0; ++ pi->cmap[i * 3 + 1] = i & 4 ? on : 0; ++ pi->cmap[i * 3 + 2] = i & 1 ? on : 0; ++ } ++ on = 0xff; ++ for(; i < 16; i++){ ++ pi->cmap[i * 3 ] = i & 2 ? on : 0; ++ pi->cmap[i * 3 + 1] = i & 4 ? on : 0; ++ pi->cmap[i * 3 + 2] = i & 1 ? on : 0; ++ } ++ }else{ /* pi->numcols == 256 */ ++ int i; ++ byte r, g, b; ++ r = g = b = 0; ++ for(i = 0; i < 256; i++){ ++ pi->cmap[i * 3 ] = r; ++ pi->cmap[i * 3 + 1] = g; ++ pi->cmap[i * 3 + 2] = b; ++ if((b += 0x40) == 0){ ++ if((r += 0x20) == 0) ++ g += 0x20; ++ } ++ } ++ } ++ }else{ ++ if(fread(pi->cmap, (size_t) pi->numcols * 3, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_CORRUPT); ++ } ++} ++ ++/* The main routine to expand `Pi' file. */ ++static void pi_expand(pi, pic) ++ struct pi_info *pi; ++ byte **pic; ++{ ++ byte prev_col = 0; ++ int prev_pos = -1; ++ int cnt = 0, max_cnt = pi->width * pi->height; ++ ++ *pic = pi_malloc((size_t) max_cnt, "pi_expand"); // GRR POSSIBLE OVERFLOW / FIXME ++ ++ pi_table_create(pi); ++ ++ if(pi->width > 2){ ++ (*pic)[0] = pi_read_color(pi, 0); ++ (*pic)[1] = pi_read_color(pi, (*pic)[0]); ++ ++ while(cnt < max_cnt){ ++ int pos = pi_read_position(pi); ++ if(pos != prev_pos){ ++ data32 len = pi_read_length(pi); ++ cnt = pi_copy_pixels(pi, *pic, cnt, pos, len); ++ prev_col = (*pic)[cnt - 1]; ++ prev_pos = pos; ++ }else{ ++ do{ ++ prev_col = pi_read_color(pi, (int) prev_col); ++ (*pic)[cnt++] = prev_col; ++ prev_col = pi_read_color(pi, (int) prev_col); ++ (*pic)[cnt++] = prev_col; ++ }while(pi_read_bits(pi, 1) == 1); ++ ++ prev_pos = -1; ++ } ++ } ++ }else{ ++ while(cnt < max_cnt){ ++ prev_col = pi_read_color(pi, (int) prev_col); ++ (*pic)[cnt++] = prev_col; ++ } ++ } ++} ++ ++static byte pi_read_color(pi, prev) ++ struct pi_info *pi; ++ int prev; ++{ ++ byte n; ++ if(pi->cbits == 4){ ++ if(pi_read_bits(pi, 1) == 1) ++ n = pi_read_bits(pi, 1); /* 1x */ ++ else{ ++ if(pi_read_bits(pi, 1) == 0) ++ n = pi_read_bits(pi, 1) + 2; /* 00x */ ++ else{ ++ if(pi_read_bits(pi, 1) == 0) ++ n = pi_read_bits(pi, 2) + 4; /* 010xx */ ++ else ++ n = pi_read_bits(pi, 3) + 8; /* 011xxx */ ++ } ++ } ++ }else{ /* cbits == 8 */ ++ if(pi_read_bits(pi, 1) == 1) ++ n = pi_read_bits(pi, 1); ++ else{ ++ int bits = 0; ++ byte base = 2; ++ while(bits < 6){ ++ if(pi_read_bits(pi, 1) == 0) ++ break; ++ bits++; ++ base <<= 1; ++ } ++ n = pi_read_bits(pi, bits + 1) + base; ++ } ++ } ++ ++ return pi_table_get_value(pi, prev, (int) n); ++} ++ ++static int pi_read_position(pi) ++ struct pi_info *pi; ++{ ++ byte r; ++ if((r = pi_read_bits(pi, 2)) != 3) ++ return (int) r; ++ else ++ return (int) pi_read_bits(pi, 1) + 3; ++} ++ ++static data32 pi_read_length(pi) ++ struct pi_info *pi; ++{ ++ data32 r = 1; ++ int bits = 0; ++ while(pi_read_bits(pi, 1) == 1){ ++ r <<= 1; ++ bits++; ++ } ++ if(bits > 0) ++ return r + pi_read_bits(pi, bits); ++ return 1; ++} ++ ++static int pi_copy_pixels(pi, pic, cnt, pos, len) ++ struct pi_info *pi; ++ byte *pic; ++ int cnt, pos; ++ data32 len; ++{ ++ int s = 0, d = cnt; ++ int max = pi->width * pi->height; ++ switch(pos){ ++ case 0: ++ if(cnt < 2){ ++ if(pic[0] == pic[1]) ++ s = cnt - 2; ++ else ++ s = cnt - 4; ++ }else{ ++ if(pic[cnt - 2] == pic[cnt - 1]) ++ s = cnt - 2; ++ else ++ s = cnt - 4; ++ } ++ break; ++ case 1: ++ s = cnt - pi->width; ++ break; ++ case 2: ++ s = cnt - pi->width * 2; ++ break; ++ case 3: ++ s = cnt - pi->width + 1; ++ break; ++ case 4: ++ s = cnt - pi->width - 1; ++ } ++ ++ len *= 2; ++ while(s < 0 && len != 0 && d < max){ ++ pic[d++] = pic[-(s++) % 2]; ++ len--; ++ } ++ while(len != 0 && d < max){ ++ pic[d++] = pic[s++]; ++ len--; ++ } ++ return d; ++} ++ ++/* The main routine of `Pi' saver. */ ++int WritePi(fp, pic, ptype, w, h, rmap, gmap, bmap, numcols, colorstyle, ++ comment) ++ FILE *fp; ++ byte *pic; ++ int ptype, w, h; ++ byte *rmap, *gmap, *bmap; ++ int numcols, colorstyle; ++ char *comment; ++{ ++ byte rtemp[256], gtemp[256], btemp[256]; ++ struct pi_info pi; ++ int e; ++ ++ if(DEBUG) fputs("WritePi\n", stderr); ++ pi_init_pi_info(&pi); ++ pi.fp = fp; ++ pi.width = w; ++ pi.height = h; ++ pi.writing_grey = (colorstyle == F_GREYSCALE); ++ if(ptype == PIC24){ ++ if(!(pic = Conv24to8(pic, w, h, 256, rtemp, gtemp, btemp))) ++ pi_memory_error("Conv24to8", "WritePi"); ++ rmap = rtemp; ++ gmap = gtemp; ++ bmap = btemp; ++ numcols = 256; ++ } ++ ++ if((e = setjmp(pi.jmp)) != 0){ ++ /* When an error occurs, comes here. */ ++ pi_cleanup_pi_info(&pi, 1); ++ if(DEBUG) fputs("\n", stderr); ++ return -1; ++ } ++ ++ pi.numcols = numcols; ++ pi_write_header(&pi, comment, rmap, gmap, bmap); ++ pi_compress(&pi, pic); ++ pi_write_gabage(&pi); ++ ++ pi_cleanup_pi_info(&pi, 1); ++ if(DEBUG) fputs("\n", stderr); ++ return 0; ++} ++ ++static void pi_write_header(pi, comm, r, g, b) ++ struct pi_info *pi; ++ char *comm; ++ byte *r, *g, *b; ++{ ++ byte buf[14]; ++ ++ if(DEBUG) pi_show_pi_info(pi); ++ ++ pi_write_id(pi); ++ pi_write_comment(pi, comm); ++ ++ buf[0] = buf[1] = buf[2] = 0; ++ buf[3] = pi->cbits = pi->numcols > 16 ? 8 : 4; ++ buf[4] = 'X'; ++ buf[5] = 'V'; ++ buf[6] = ' '; ++ buf[7] = ' '; ++ buf[8] = buf[9] = 0; ++ buf[10] = pi->width >> 8; ++ buf[11] = pi->width; ++ buf[12] = pi->height >> 8; ++ buf[13] = pi->height; ++ if(fwrite(buf, (size_t) 14, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_WRITE); ++ ++ pi_write_palette(pi, r, g, b); ++} ++ ++static void pi_write_id(pi) ++ struct pi_info *pi; ++{ ++ if(fwrite(pi_id, (size_t) 2, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_WRITE); ++} ++ ++static void pi_write_comment(pi, comm) ++ struct pi_info *pi; ++ char *comm; ++{ ++ if(comm){ ++ int i; ++ for(i = 0; comm[i]; i++){ ++ if(comm[i] == '\032') /* 0x1a, '^Z' */ ++ comm[i] = ' '; ++ } ++ if(i > 0){ ++ if(fwrite(comm, (size_t) i, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_WRITE); ++ } ++ } ++ ++ if(fwrite("\032\0", (size_t) 2, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_WRITE); ++} ++ ++static void pi_write_palette(pi, r, g, b) ++ struct pi_info *pi; ++ byte *r, *g, *b; ++{ ++ int i; ++ int pinum = 1 << pi->cbits; ++ char buf[3]; ++ ++ for(i = 0; i < pi->numcols; i++){ ++ buf[0] = *r++; ++ buf[1] = *g++; ++ buf[2] = *b++; ++ if(pi->writing_grey) ++ buf[0] = buf[1] = buf[2] = MONO(buf[0], buf[1], buf[2]); ++ if(fwrite(buf, (size_t) 3, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_WRITE); ++ } ++ for( ; i < pinum; i++){ ++ if(fwrite(buf, (size_t) 3, (size_t) 1, pi->fp) != 1) ++ pi_file_error(pi, PI_WRITE); ++ } ++ pi->numcols = pinum; ++} ++ ++/* The main routine to compress `Pi' format. */ ++static void pi_compress(pi, pic) ++ struct pi_info *pi; ++ byte *pic; ++{ ++ byte prev_col = 0; ++ int prev_pos = -1; ++ int cnt = 0, max_cnt = pi->width * pi->height; ++ pi_table_create(pi); ++ ++ if(pi->width > 2){ ++ int pos; ++ data32 len; ++ ++ pi_write_color(pi, 0, pic[0]); ++ pi_write_color(pi, pic[0], pic[1]); ++ pos = pi_test_matching(pi, pic, prev_pos, cnt, &len); ++ while(cnt < max_cnt){ ++ if(pos >= 0){ ++ pi_write_position(pi, pos); ++ pi_write_length(pi, len); ++ if((cnt += len * 2) >= max_cnt) ++ break; ++ prev_col = pic[cnt - 1]; ++ prev_pos = pos; ++ pos = pi_test_matching(pi, pic, prev_pos, cnt, &len); ++ }else{ ++ pi_write_position(pi, prev_pos); ++ prev_pos = -1; ++ while(pos < 0){ ++ pi_write_color(pi, (int) prev_col, pic[cnt]); ++ prev_col = pic[cnt]; ++ if(++cnt >= max_cnt) ++ break; ++ pi_write_color(pi, (int) prev_col, pic[cnt]); ++ prev_col = pic[cnt]; ++ if(++cnt >= max_cnt) ++ break; ++ pos = pi_test_matching(pi, pic, -1, cnt, &len); ++ if(pos < 0) ++ pi_write_bits(pi, 1, 1); ++ else ++ pi_write_bits(pi, 0, 1); ++ } ++ } ++ } ++ }else{ ++ while(cnt < max_cnt){ ++ pi_write_color(pi, (int) prev_col, pic[cnt]); ++ prev_col = pic[cnt++]; ++ } ++ } ++} ++ ++static void pi_write_gabage(pi) ++ struct pi_info *pi; ++{ ++ pi_write_bits(pi, 0, 32); ++} ++ ++static void pi_write_color(pi, prev, col) ++ struct pi_info *pi; ++ int prev, col; ++{ ++ int n = pi_table_lookup_value(pi, prev, col); ++ ++ if(pi->cbits == 4){ ++ if(n < 2) ++ pi_write_bits(pi, (data32) n | 2, 2); ++ else if(n < 4) ++ pi_write_bits(pi, (data32) n - 2, 3); ++ else if(n < 8) ++ pi_write_bits(pi, (data32) (n - 4) | 8, 5); ++ else ++ pi_write_bits(pi, (data32) (n - 8) | 24, 6); ++ }else{ /* cbits == 8 */ ++ if(n < 2){ ++ pi_write_bits(pi, (data32) n | 2, 2); ++ }else{ ++ int bits = 0; ++ byte base = 2; ++ while(bits < 6){ ++ if(n < (int) base * 2) ++ break; ++ bits++; ++ base <<= 1; ++ } ++ pi_write_bits(pi, 0, 1); ++ if(bits > 0) ++ pi_write_bits(pi, 0xffffffff, bits); ++ if(bits < 6) ++ pi_write_bits(pi, 0, 1); ++ pi_write_bits(pi, (data32) n - base, bits + 1); ++ } ++ } ++} ++ ++static int pi_test_matching(pi, pic, prev, cnt, len) ++ struct pi_info *pi; ++ byte *pic; ++ int prev, cnt; ++ data32 *len; ++{ ++ data32 lens[5]; ++ int pos, p; ++ int s, d = 0; ++ int max = pi->width * pi->height; ++ ++ for(pos = 0; pos < 5; pos++){ ++ switch(pos){ ++ case 0: ++ if(cnt < 2){ ++ if(pic[0] == pic[1]) ++ d = cnt - 2; ++ else ++ d = cnt - 4; ++ }else{ ++ if(pic[cnt - 2] == pic[cnt - 1]) ++ d = cnt - 2; ++ else ++ d = cnt - 4; ++ } ++ break; ++ case 1: ++ d = cnt - pi->width; ++ break; ++ case 2: ++ d = cnt - pi->width * 2; ++ break; ++ case 3: ++ d = cnt - pi->width + 1; ++ break; ++ case 4: ++ d = cnt - pi->width - 1; ++ } ++ s = cnt; ++ lens[pos] = 0; ++ ++ if(prev == 0 && pos == 0) ++ continue; ++ ++ while(d < max){ ++ if(pic[(d < 0) ? (-d) % 2 : d] != pic[s]) ++ break; ++ lens[pos]++; ++ d++; ++ s++; ++ } ++ ++ } ++ ++ for(pos = 0, p = 1; p < 5; p++){ ++ if(lens[p] >= lens[pos]) ++ pos = p; ++ } ++ ++ if(lens[pos] / 2 == 0) ++ return -1; ++ *len = lens[pos] / 2; ++ return pos; ++} ++ ++static void pi_write_position(pi, pos) ++ struct pi_info *pi; ++ int pos; ++{ ++ switch(pos){ ++ case 0: ++ pi_write_bits(pi, 0, 2); ++ break; ++ case 1: ++ pi_write_bits(pi, 1, 2); ++ break; ++ case 2: ++ pi_write_bits(pi, 2, 2); ++ break; ++ case 3: ++ pi_write_bits(pi, 6, 3); ++ break; ++ case 4: ++ pi_write_bits(pi, 7, 3); ++ break; ++ } ++} ++ ++static void pi_write_length(pi, len) ++ struct pi_info *pi; ++ data32 len; ++{ ++ int bits = 0; ++ data32 base = 1; ++ ++ while(len >= base * 2){ ++ bits++; ++ base <<= 1; ++ } ++ if(bits > 0){ ++ pi_write_bits(pi, 0xffffffff, bits); ++ pi_write_bits(pi, 0, 1); ++ pi_write_bits(pi, len - base, bits); ++ }else ++ pi_write_bits(pi, 0, 1); ++} ++ ++/* ++ * These pi_table_* functions manipulate the color table. ++ * pi_table_create: ++ * allocates and initializes a color table. ++ * pi_table_get_value: ++ * get the specified value, and move it to the top of the list. ++ * pi_table_lookup_value: ++ * look up the specified value, and move it to the top of the list. ++ */ ++static void pi_table_create(pi) ++ struct pi_info *pi; ++{ ++ struct ct_t *t; ++ int i; ++ byte mask = pi->numcols - 1; ++ pi->ct = pi_malloc(sizeof *pi->ct * pi->numcols, "pi_table_create(1)"); ++ for(i = 0, t = pi->ct; i < pi->numcols; i++, t++){ ++ int j; ++ byte v = i; ++ t->elt = pi_malloc(sizeof *t->elt * pi->numcols, "pi_table_create(2)"); ++ t->top = &t->elt[pi->numcols - 1]; ++ for(j = 0; j < pi->numcols; j++){ ++ v = (v + 1) & mask; ++ if(j > 0) ++ t->elt[j].old = &t->elt[j - 1]; ++ else ++ t->elt[0].old = t->top; ++ if(j < pi->numcols - 1) ++ t->elt[j].recent = &t->elt[j + 1]; ++ else ++ t->elt[j].recent = &t->elt[0]; ++ t->elt[j].val = v; ++ } ++ t->elt[0].old = t->top; ++ t->top->recent = &t->elt[0]; ++ } ++} ++ ++static byte pi_table_get_value(pi, left, num) ++ struct pi_info *pi; ++ int left, num; ++{ ++ struct ct_t *t = &pi->ct[left]; ++ struct elt_t *e = t->top; ++ if(left >= pi->numcols || num >= pi->numcols) ++ abort(); ++ if(num != 0){ ++ do { ++ e = e->old; ++ }while(--num != 0); ++ ++ e->old->recent = e->recent; ++ e->recent->old = e->old; ++ ++ e->recent = t->top->recent; ++ e->recent->old = e; ++ e->old = t->top; ++ t->top->recent = e; ++ ++ t->top = e; ++ } ++ return e->val; ++} ++ ++static int pi_table_lookup_value(pi, left, v) ++ struct pi_info *pi; ++ int left, v; ++{ ++ struct ct_t *t = &pi->ct[left]; ++ struct elt_t *e = t->top; ++ int num = 0; ++ ++ if(left >= pi->numcols || v >= pi->numcols) ++ abort(); ++ ++ while(e->val != v){ ++ e = e->old; ++ num++; ++ } ++ ++ if(num != 0){ ++ e->old->recent = e->recent; ++ e->recent->old = e->old; ++ ++ e->recent = t->top->recent; ++ e->recent->old = e; ++ e->old = t->top; ++ t->top->recent = e; ++ ++ t->top = e; ++ } ++ ++ return num; ++} ++ ++/* ++ * These 2 functions read or write to a bit stream. ++ * pi_read_bits: ++ * reads a specified-bit data from the bit stream. ++ * pi_write_bits: ++ * writes a specified-bit data to the bit stream. ++ */ ++static data32 pi_read_bits(pi, numbits) ++ struct pi_info *pi; ++ int numbits; ++{ ++ data32 r = 0; ++ ++ while(numbits > 0){ ++ while(pi->bs.rest > 0 && numbits > 0){ ++ r = (r << 1) | (pi->bs.cur & 0x80 ? 1 : 0); ++ pi->bs.cur <<= 1; ++ pi->bs.rest--; ++ numbits--; ++ } ++ if(numbits > 0){ ++ int c; ++ if((c = fgetc(pi->fp)) == EOF) ++ pi_file_warning(pi, PI_CORRUPT); ++ pi->bs.cur = c; ++ pi->bs.rest = 8; ++ } ++ } ++ ++ return r; ++} ++ ++static void pi_write_bits(pi, dat, bits) ++ struct pi_info *pi; ++ data32 dat; ++ int bits; ++{ ++ data32 dat_mask = 1 << (bits - 1); ++ while(bits > 0){ ++ while(pi->bs.rest < 8 && bits > 0){ ++ pi->bs.cur <<= 1; ++ if(dat & dat_mask) ++ pi->bs.cur |= 1; ++ pi->bs.rest++; ++ bits--; ++ dat_mask >>= 1; ++ } ++ if(pi->bs.rest >= 8){ ++ if(fputc((int)pi->bs.cur, pi->fp) == EOF) ++ pi_file_error(pi, PI_WRITE); ++ pi->bs.cur = 0; ++ pi->bs.rest = 0; ++ } ++ } ++} ++ ++/* ++ * The routines to initialize or clean up. ++ * pi_inif_pi_info: ++ * initializes a pi_info structure. ++ * pi_cleanup_pi_info: ++ * cleanup pi_info structure. It frees allocated memories. ++ * pi_cleanup_pinfo: ++ * cleanup PICINFO structure when an error occurs. ++ */ ++static void pi_init_pi_info(pi) ++ struct pi_info *pi; ++{ ++ pi->fp = NULL; ++ pi->bs.rest = 0; ++ pi->bs.cur = 0; ++ pi->fsize = 0; ++ pi->mode = 0; ++ pi->width = pi->mode = 0; ++ pi->aspect = 1.0; ++ pi->cbits = 0; ++ pi->numcols = 0; ++ pi->cmap = NULL; ++ pi->ct = NULL; ++ pi->defcmap = 0; ++ pi->writing_grey = 0; ++} ++ ++static void pi_cleanup_pi_info(pi, writing) ++ struct pi_info *pi; ++ int writing; ++{ ++ if(pi->fp && !writing){ ++ fclose(pi->fp); ++ pi->fp = NULL; ++ } ++ if(pi->cmap){ ++ free(pi->cmap); ++ pi->cmap = NULL; ++ } ++ if(pi->ct){ ++ int i; ++ for(i = 0; i < pi->numcols; i++) ++ free(pi->ct[i].elt); ++ free(pi->ct); ++ pi->ct = NULL; ++ } ++} ++ ++static void pi_cleanup_pinfo(pinfo) ++ PICINFO *pinfo; ++{ ++ if(pinfo->pic){ ++ free(pinfo->pic); ++ pinfo->pic = NULL; ++ } ++ if(pinfo->comment){ ++ free(pinfo->comment); ++ pinfo->comment = NULL; ++ } ++} ++ ++/* ++ * Error handling routins. ++ * pi_memory_error: ++ * shows a error message, and terminates. ++ * pi_error: ++ * shows a non-file error message. ++ * pi_file_error: ++ * shows a file error message. ++ */ ++static void pi_memory_error(scm, fn) ++ char *scm, *fn; ++{ ++ char buf[128]; ++ sprintf(buf, "%s: couldn't allocate memory. (%s)", scm ,fn); ++ FatalError(buf); ++} ++ ++static void pi_error(pi, mn) ++ struct pi_info *pi; ++ int mn; ++{ ++ SetISTR(ISTR_WARNING, "%s", pi_msgs[mn]); ++ longjmp(pi->jmp, 1); ++} ++ ++static void pi_file_error(pi, mn) ++ struct pi_info *pi; ++ int mn; ++{ ++ if(feof(pi->fp)) ++ SetISTR(ISTR_WARNING, "%s (end of file)", pi_msgs[mn]); ++ else ++ SetISTR(ISTR_WARNING, "%s (%s)", pi_msgs[mn], ERRSTR(errno)); ++ longjmp(pi->jmp, 1); ++} ++ ++static void pi_file_warning(pi, mn) ++ struct pi_info *pi; ++ int mn; ++{ ++ if(feof(pi->fp)) ++ SetISTR(ISTR_WARNING, "%s (end of file)", pi_msgs[mn]); ++ else ++ SetISTR(ISTR_WARNING, "%s (%s)", pi_msgs[mn], ERRSTR(errno)); ++} ++ ++static void pi_show_pi_info(pi) ++ struct pi_info *pi; ++{ ++ fprintf(stderr, " file size: %ld.\n", pi->fsize); ++ fprintf(stderr, " mode: 0x%02x.\n", pi->mode); ++ fprintf(stderr, " image size: %dx%d.\n", pi->width, pi->height); ++ fprintf(stderr, " aspect: %f.\n", pi->aspect); ++ fprintf(stderr, " number of color bits: %d.\n", pi->cbits); ++ fprintf(stderr, " number of colors: %d.\n", pi->numcols); ++ fprintf(stderr, " using default colormap: %s.\n", ++ pi->defcmap ? "true" : "false"); ++ fprintf(stderr, " writing greyscale image: %s.\n", ++ pi->writing_grey ? "true" : "false"); ++} ++ ++/* ++ * Memory related routines. If failed, they calls pi_memory_error. ++ */ ++static void *pi_malloc(n, fn) ++ size_t n; ++ char *fn; ++{ ++ void *r = (void *) malloc(n); ++ if(r == NULL) ++ pi_memory_error("malloc", fn); ++ return r; ++} ++ ++static void *pi_realloc(p, n, fn) ++ void *p; ++ size_t n; ++ char *fn; ++{ ++ void *r = (p == NULL) ? (void *) malloc(n) : (void *) realloc(p, n); ++ if(r == NULL) ++ pi_memory_error("realloc", fn); ++ return r; ++} ++#endif /* HAVE_PI */ +diff -ruN xv-3.10a-bugfixes/xvpic.c xv-3.10a-enhancements/xvpic.c +--- xv-3.10a-bugfixes/xvpic.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvpic.c 2005-04-17 22:57:08.000000000 -0700 +@@ -0,0 +1,1285 @@ ++/* ++ * xvpic.c - load routine for `PIC' format pictures. ++ * ++ * The `PIC' format is used by many Japanese personal computer users. ++ */ ++ ++#include "xv.h" ++#include <setjmp.h> ++ ++#ifdef HAVE_PIC ++ ++typedef unsigned short data16; ++typedef unsigned int data32; ++ ++struct pic_info { ++ jmp_buf jmp; ++ FILE *fp; ++ struct { ++ int rest; ++ byte cur; ++ }bs; ++ long fsize; ++ int type, mode; ++ int width, height; ++ float aspect; ++ int cbits; ++ int cmapped; ++ byte *cmap; ++ int cached; ++ struct cache_t { ++ int newest; ++ struct cachenode_t { ++ data32 dat; ++ int newer, older; ++ } *node; ++ } cache; ++ int g_bits, r_bits, b_bits, i_bits; ++ int inv_gr; ++ int tiled256; ++ int numcols; ++ int writing_grey; ++ data32 *data; ++}; ++ ++static void pic_open_file PARM((struct pic_info*,char*)); ++static void pic_check_id PARM((struct pic_info*)); ++static void pic_read_comment PARM((struct pic_info*, char**)); ++static void pic_read_header PARM((struct pic_info*)); ++static void pic_expand_data PARM((struct pic_info*)); ++static int pic_expanding_read_len PARM((struct pic_info*)); ++static data32 pic_expanding_read_color PARM((struct pic_info*)); ++static void pic_expanding_read_chain ++ PARM((struct pic_info*, int, int, data32)); ++static void pic_make_xvpic ++ PARM((struct pic_info*, byte**, byte*, byte*, byte*)); ++ ++static void pic_write_id PARM((struct pic_info*)); ++static void pic_write_comment PARM((struct pic_info*, char*)); ++static void pic_write_header PARM((struct pic_info*)); ++static void pic_write_palette ++ PARM((struct pic_info*, byte*, byte*, byte*)); ++static void pic_make_sparse_data PARM((struct pic_info*, byte*)); ++static void pic_write_data PARM((struct pic_info*)); ++static void pic_write_length PARM((struct pic_info*, data32)); ++static void pic_write_color PARM((struct pic_info*, data32)); ++static void pic_write_chain ++ PARM((struct pic_info*, int, int, data32)); ++ ++static data32 pic_read_rgb PARM((struct pic_info*)); ++static data32 pic_read_color_code PARM((struct pic_info*)); ++static void pic_write_rgb PARM((struct pic_info*, data32)); ++static void pic_write_color_code PARM((struct pic_info*, data32)); ++ ++static void pic_cache_init PARM((struct pic_info*)); ++static data32 pic_cache_get_value PARM((struct pic_info*, int)); ++static void pic_cache_add_value PARM((struct pic_info*, data32)); ++static int pic_cache_lookup PARM((struct pic_info*, data32)); ++ ++static data32 pic_read_bits PARM((struct pic_info*, int)); ++static void pic_write_bits PARM((struct pic_info*, data32, int)); ++static byte pic_pad_bit PARM((int, data32)); ++ ++static void pic_init_info PARM((struct pic_info*)); ++static void pic_cleanup_pic_info PARM((struct pic_info*, int)); ++static void pic_cleanup_pinfo PARM((PICINFO*)); ++static void pic_memory_error PARM((char*, char*)); ++static void pic_error PARM((struct pic_info*, int)); ++static void pic_file_error PARM((struct pic_info*, int)); ++static void pic_file_warning PARM((struct pic_info*, int)); ++static void pic_show_pic_info PARM((struct pic_info*)); ++static void *pic_malloc PARM((size_t, char*)); ++static void *pic_realloc PARM((void*, size_t, char*)); ++ ++ ++static char *pic_id = "PIC"; ++ ++/* Error Messages */ ++static char *pic_msgs[] = { ++ NULL, ++#define PIC_OPEN 1 ++ "can't open file.", ++#define PIC_CORRUPT 2 ++ "file corrupted.", ++#define PIC_FORMAT 3 ++ "not PIC format.", ++#define PIC_SUPPORT 4 ++ "unsupported type.", ++#define PIC_COMMENT 5 ++ "can't read comment.", ++#define PIC_TYPE 6 ++ "bad machine type.", ++#define PIC_MODE 7 ++ "bad machine-dependent mode.", ++#define PIC_NUM_COLORS 8 ++ "bad number of colors.", ++#define PIC_SIZE 9 ++ "bad size.", ++#define PIC_ASPECT 10 ++ "bad aspect.", ++#define PIC_WRITE 11 ++ "write failed.", ++}; ++ ++#define H4(b) (((b) >> 4) & 0x0f) ++#define L4(b) ( (b) & 0x0f) ++ ++ ++/* The main routine to load a PIC file. */ ++int LoadPIC(fname, pinfo) ++ char *fname; ++ PICINFO *pinfo; ++{ ++ int e; ++ struct pic_info pic; ++ char buf[128]; ++ ++ if(DEBUG) fputs("LoadPIC:\n", stderr); ++ ++ pic_init_info(&pic); ++ ++ pinfo->comment = NULL; ++ if((e = setjmp(pic.jmp)) != 0){ ++ /* When an error occurs, comes here. */ ++ pic_cleanup_pic_info(&pic, 0); ++ pic_cleanup_pinfo(pinfo); ++ if(DEBUG) fputs("\n", stderr); ++ return 0; ++ } ++ ++ pic_open_file(&pic, fname); ++ pic_check_id(&pic); ++ pic_read_comment(&pic, &pinfo->comment); ++ pic_read_header(&pic); ++ pic_expand_data(&pic); ++ pic_make_xvpic(&pic, &pinfo->pic, pinfo->r, pinfo->g, pinfo->b); ++ ++ pinfo->w = pic.width; ++ if(pic.tiled256) ++ pinfo->h = pic.height * 2; ++ else ++ pinfo->h = pic.height; ++ pinfo->normw = pinfo->w; ++ pinfo->normh = pinfo->h; ++ pinfo->type = pic.cmapped ? PIC8 : PIC24; ++ pinfo->frmType = F_PIC; ++ pinfo->colType = F_FULLCOLOR; ++ strcpy(pinfo->fullInfo, "PIC"); ++ switch(pic.type){ ++ case 0x0: ++ strcat(pinfo->fullInfo, ", X68k"); ++ break; ++ case 0x1: ++ strcat(pinfo->fullInfo, ", PC-88VA"); ++ if(pic.mode & 1) ++ strcat(pinfo->fullInfo, ", HR"); ++ if(pic.mode & 2) ++ strcat(pinfo->fullInfo, ", tiled 256"); ++ break; ++ case 0x2: ++ strcat(pinfo->fullInfo, ", FM-TOWNS"); ++ if(pic.mode == 0x5){ ++ strcat(pinfo->fullInfo, ", low-resolution"); ++ }else{ ++ strcat(pinfo->fullInfo, ", high-resolution"); ++ } ++ break; ++ case 0x3: ++ strcat(pinfo->fullInfo, ", Macintosh"); ++ break; ++ case 0xf: ++ ; ++ } ++ sprintf(buf, " (%ld bytes)", pic.fsize); ++ strcat(pinfo->fullInfo, buf); ++ sprintf(pinfo->shrtInfo, "%dx%d(aspect %4.2f) PIC.", ++ pinfo->w, pinfo->h, pic.aspect); ++ if (!nopicadjust) ++ normaspect = pic.aspect; ++ ++ pic_cleanup_pic_info(&pic, 0); ++ if(DEBUG) fputs("\n", stderr); ++ return 1; ++} ++ ++static void pic_open_file(pi, fname) ++ struct pic_info *pi; ++ char *fname; ++{ ++ if((pi->fp = fopen(fname, "rb")) == NULL) ++ pic_file_error(pi, PIC_OPEN); ++ fseek(pi->fp, (size_t) 0, SEEK_END); ++ pi->fsize = ftell(pi->fp); ++ fseek(pi->fp, (size_t) 0, SEEK_SET); ++} ++ ++static void pic_check_id(pi) ++ struct pic_info *pi; ++{ ++ char buf[3]; ++ if(fread(buf, (size_t) 3, (size_t) 1, pi->fp) != 1) ++ pic_file_error(pi, PIC_CORRUPT); ++ if(strncmp(buf, pic_id, (size_t) 3) != 0) ++ pic_error(pi, PIC_FORMAT); ++} ++ ++static void pic_read_comment(pi, comm) ++ struct pic_info *pi; ++ char **comm; ++{ ++ /* The comment field is like: ++ * comment-string ^Z dummy \0 \0 ++ */ ++ int max = -1, i = 0; ++ int c; ++ ++ while(1){ ++ if((c = fgetc(pi->fp)) == EOF) ++ pic_file_error(pi, PIC_CORRUPT); ++ if(c == '\032') /* 0x1a, '^Z' */ ++ break; ++ if(max < i){ ++ max += 32; ++ *comm = pic_realloc(*comm, (size_t) max + 1, "pic_read_comment#1"); ++ } ++ (*comm)[i++] = c; ++ } ++ ++ if(max < i){ ++ max++; ++ *comm = pic_realloc(*comm, (size_t) max + 1, "pic_read_comment#2"); ++ } ++ (*comm)[i] = '\0'; ++ ++ while((c = fgetc(pi->fp)) != '\0'){ /* skip the dummy area */ ++ if(c == EOF) ++ pic_file_error(pi, PIC_CORRUPT); ++ } ++ ++ if(fgetc(pi->fp) != '\0') /* check the reserved byte */ ++ pic_error(pi, PIC_SUPPORT); ++} ++ ++static void pic_read_header(pi) ++ struct pic_info *pi; ++{ ++ pi->mode = pic_read_bits(pi, 4); ++ pi->type = pic_read_bits(pi, 4); ++ pi->cbits = pic_read_bits(pi, 16); ++ pi->width = pic_read_bits(pi, 16); ++ pi->height = pic_read_bits(pi, 16); ++ ++ /* machine-dependent setup. */ ++ switch(pi->type){ ++ case 0x0: /* X68K */ ++ if(pi->mode != 0) ++ pic_error(pi, PIC_MODE); ++ switch(pi->cbits){ ++ case 4: ++ pi->aspect = 1.0; ++ pi->g_bits = pi->r_bits = pi->b_bits = 5; ++ pi->i_bits = 1; ++ pi->cmapped = 1; ++ break; ++ ++ case 8: ++ pi->aspect = 4.0 / 3.0; ++ pi->g_bits = pi->r_bits = pi->b_bits = 5; ++ pi->i_bits = 1; ++ pi->cmapped = 1; ++ break; ++ ++ case 15: ++ pi->aspect = 4.0 / 3.0; ++ pi->g_bits = pi->r_bits = pi->b_bits = 5; ++ pi->cached = 1; ++ break; ++ ++ case 16: ++ pi->aspect = 4.0 / 3.0; ++ pi->g_bits = pi->r_bits = pi->b_bits = 5; ++ pi->i_bits = 1; ++ pi->cached = 1; ++ break; ++ ++ default: ++ pic_error(pi, PIC_NUM_COLORS); ++ } ++ break; ++ ++ case 0x1: /* PC-88VA */ ++ if(pi->height > 1000) ++ pic_error(pi, PIC_SIZE); ++ switch(pi->width * 1000 + pi->height){ ++ case 640400: ++ case 640204: ++ case 640200: ++ case 320408: ++ case 320400: ++ case 320200: ++ break; ++ default: ++ pic_error(pi, PIC_SIZE); ++ } ++ pi->aspect = 400.0 / pi->height; ++ pi->aspect *= pi->width / 640.0; ++ if(pi->mode & 0x1) /* HR mode */ ++ pi->aspect *= 2.0; ++ if(pi->mode & 0x2){ /* tiled 256 format */ ++ if(pi->cbits != 16) ++ pic_error(pi, PIC_NUM_COLORS); ++ pi->tiled256 = 1; ++ } ++ switch(pi->cbits){ ++ case 8: ++ pi->g_bits = pi->r_bits = 3; ++ pi->b_bits = 2; ++ break; ++ ++ case 12: ++ pi->g_bits = pi->r_bits = pi->b_bits = 4; ++ pi->cached = 1; ++ break; ++ ++ case 16: ++ pi->g_bits = 6; ++ pi->r_bits = pi->b_bits = 5; ++ pi->cached = 1; ++ break; ++ ++ default: ++ pic_error(pi, PIC_NUM_COLORS); ++ } ++ break; ++ ++ case 0x2: /* FM-TOWNS */ ++ if(pi->cbits != 15) ++ pic_error(pi, PIC_NUM_COLORS); ++ switch(pi->mode){ ++ case 0x5: ++ case 0xc: ++ break; ++ default: ++ pic_error(pi, PIC_MODE); ++ } ++ pi->g_bits = pi->r_bits = pi->b_bits = 5; ++ pi->cached = 1; ++ break; ++ ++ case 0x3: /* MAC */ ++ if(pi->cbits != 15) ++ pic_error(pi, PIC_NUM_COLORS); ++ pi->r_bits = pi->g_bits = pi->b_bits = 5; ++ pi->inv_gr = 1; ++ break; ++ ++ case 0xf: /* misc */ ++ { ++ byte ah, al; ++ ++ switch(pi->mode){ ++ case 0x0: ++ break; ++ case 0x1: ++ pi->aspect = 4.0 / 3.0; ++ break; ++ case 0xf: ++ break; ++ default: ++ pic_error(pi, PIC_MODE); ++ } ++ pic_read_bits(pi, 16); /* x */ ++ pic_read_bits(pi, 16); /* y */ ++ ah = pic_read_bits(pi, 8); ++ al = pic_read_bits(pi, 8); ++ if(ah > 0 && al > 0) ++ pi->aspect = (float) al / (int) ah; ++ else if(pi->mode == 0xf) ++ pic_error(pi, PIC_ASPECT); ++ switch(pi->cbits){ ++ case 4: ++ case 8: ++ pi->g_bits = pi->r_bits = pi->b_bits = pic_read_bits(pi, 8); ++ pi->cmapped = 1; ++ break; ++ ++ case 12: ++ pi->g_bits = pi->r_bits = pi->b_bits = 4; ++ pi->cached = 1; ++ break; ++ ++ case 15: ++ pi->g_bits = pi->r_bits = pi->b_bits = 5; ++ pi->cached = 1; ++ break; ++ ++ case 16: ++ pi->g_bits = pi->r_bits = pi->b_bits = 5; ++ pi->i_bits = 1; ++ pi->cached = 1; ++ break; ++ ++ case 24: ++ pi->g_bits = pi->r_bits = pi->b_bits = 8; ++ pi->cached = 1; ++ break; ++ ++ case 32: ++ pic_error(pi, PIC_SUPPORT); ++ break; ++ ++ default: ++ pic_error(pi, PIC_NUM_COLORS); ++ } ++ } ++ break; ++ ++ default: ++ pic_error(pi, PIC_TYPE); ++ } ++ ++ pi->numcols = 1 << pi->cbits; ++ ++ /* read palette data */ ++ if(pi->cmapped){ ++ int i; ++ pi->cmap = pic_malloc((size_t) 3 * pi->numcols, "pic_read_header#1"); ++ for(i = 0; i < pi->numcols; i++){ ++ data32 c = pic_read_rgb(pi); ++ pi->cmap[i * 3 ] = c >> 16 & 0xff; ++ pi->cmap[i * 3 + 1] = c >> 8 & 0xff; ++ pi->cmap[i * 3 + 2] = c & 0xff; ++ } ++ } ++ ++ /* setup color code cache */ ++ if(pi->cached) ++ pic_cache_init(pi); ++ ++ ++ pi->data = pic_malloc(sizeof(data32) * pi->width * pi->height, // GRR POSSIBLE OVERFLOW / FIXME ++ "pic_read_header#2"); ++ { ++ int i; ++ for(i = 0; i < pi->width * pi->height; i++) ++ pi->data[i] = 0xffffffff; ++ } ++ ++ if(DEBUG) ++ pic_show_pic_info(pi); ++} ++ ++/* The main routine to expand a PIC file. */ ++static void pic_expand_data(pi) ++ struct pic_info *pi; ++{ ++ int cnt; ++ data32 c; ++ pi->data[0] = c = 0; ++ for(cnt = -1; cnt < pi->width * pi->height; ){ ++ int len = pic_expanding_read_len(pi); ++ cnt += len; ++ if(cnt < pi->width * pi->height){ ++ int x = cnt % pi->width; ++ int y = cnt / pi->width; ++ data32 c = pic_expanding_read_color(pi); ++ pic_expanding_read_chain(pi, x, y, c); ++ } ++ } ++} ++ ++static int pic_expanding_read_len(pi) ++ struct pic_info *pi; ++{ ++ int len; ++ byte bits; ++ for(len = 2, bits = 1; pic_read_bits(pi, 1) == 1; bits++) ++ len <<= 1; ++ return len - 1 + pic_read_bits(pi, bits); ++} ++ ++static data32 pic_expanding_read_color(pi) ++ struct pic_info *pi; ++{ ++ if(pi->cached){ ++ byte b = pic_read_bits(pi, 1); ++ if(b){ ++ return pic_cache_get_value(pi, (int) pic_read_bits(pi, 7)); ++ }else{ ++ data32 c = pic_read_color_code(pi); ++ pic_cache_add_value(pi, c); ++ return c; ++ } ++ } ++ return pic_read_color_code(pi); ++} ++ ++static void pic_expanding_read_chain(pi, x, y, c) ++ struct pic_info *pi; ++ int x, y; ++ data32 c; ++{ ++ pi->data[y * pi->width + x] = c; ++ if(pic_read_bits(pi, 1) == 1){ ++ int fin = 0; ++ while(!fin){ ++ switch(pic_read_bits(pi, 2)){ ++ case 1: /* left */ ++ pi->data[(++y) * pi->width + (--x)] = c; ++ break; ++ case 2: /* middle */ ++ pi->data[(++y) * pi->width + x ] = c; ++ break; ++ case 3: /* right */ ++ pi->data[(++y) * pi->width + (++x)] = c; ++ break; ++ case 0: /* far or nothing */ ++ if(pic_read_bits(pi, 1) == 0) ++ fin = 1; ++ else{ ++ if(pic_read_bits(pi, 1) == 0) ++ pi->data[(++y) * pi->width + (x -= 2)] = c; ++ else ++ pi->data[(++y) * pi->width + (x += 2)] = c; ++ } ++ } ++ } ++ } ++} ++ ++/* ++ * Make a picture from the expanded data. ++ */ ++static void pic_make_xvpic(pi, xp, rp, gp, bp) ++ struct pic_info *pi; ++ byte **xp, *rp, *gp, *bp; ++{ ++ if(pi->cmapped){ ++ if(pi->tiled256) ++ *xp = pic_malloc((size_t) pi->width * pi->height * 2, // GRR POSSIBLE OVERFLOW / FIXME ++ "pic_make_xvpic#1"); ++ else ++ *xp = pic_malloc((size_t) pi->width * pi->height, // GRR POSSIBLE OVERFLOW / FIXME ++ "pic_make_xvpic#2"); ++ }else ++ *xp = pic_malloc((size_t) pi->width * pi->height * 3, // GRR POSSIBLE OVERFLOW / FIXME ++ "pic_make_xvpic#3"); ++ ++ if(pi->cmapped){ ++ int i; ++ ++ for(i = 0; i < pi->numcols; i++){ ++ rp[i] = pi->cmap[i * 3 ]; ++ gp[i] = pi->cmap[i * 3 + 1]; ++ bp[i] = pi->cmap[i * 3 + 2]; ++ } ++ ++ if(pi->tiled256){ ++ int pic_idx = 0, dat_idx; ++ data16 col = 0; ++ for(dat_idx = 0; dat_idx < pi->width * pi->height; dat_idx++){ ++ if(pi->data[dat_idx] != 0xffffffff) ++ col = pi->data[dat_idx]; ++ (*xp)[pic_idx++] = col & 0xff; ++ (*xp)[pic_idx++] = col >> 8 & 0xff; ++ dat_idx++; ++ } ++ }else{ ++ int pic_idx = 0, dat_idx; ++ byte col = 0; ++ for(dat_idx = 0; dat_idx < pi->width * pi->height; dat_idx++){ ++ if(pi->data[dat_idx] != 0xffffffff) ++ col = pi->data[dat_idx]; ++ (*xp)[pic_idx++] = col; ++ } ++ } ++ }else{ ++ int pic_idx = 0, dat_idx; ++ byte r = 0, g = 0, b = 0; ++ for(dat_idx = 0; dat_idx < pi->width * pi->height; dat_idx++){ ++ if(pi->data[dat_idx] != 0xffffffff){ ++ data32 col = pi->data[dat_idx]; ++ r = col >> 16 & 0xff; ++ g = col >> 8 & 0xff; ++ b = col & 0xff; ++ } ++ (*xp)[pic_idx++] = r; ++ (*xp)[pic_idx++] = g; ++ (*xp)[pic_idx++] = b; ++ } ++ } ++} ++ ++ ++/* The main routine to write PIC file. */ ++int WritePIC(fp, pic0, ptype, w, h, rmap, gmap, bmap, numcols, colorstyle, ++ comment) ++ FILE *fp; ++ byte *pic0; ++ int ptype, w, h; ++ byte *rmap, *gmap, *bmap; ++ int numcols, colorstyle; ++ char *comment; ++{ ++ struct pic_info pic; ++ int e; ++ ++ if(DEBUG) fputs("WritePIC:\n", stderr); ++ ++ pic_init_info(&pic); ++ pic.fp = fp; ++ pic.width = w; ++ pic.height = h; ++ pic.writing_grey = (colorstyle == F_GREYSCALE); ++ if(ptype != PIC24){ /* PIC8 */ ++ pic.cmapped = 1; ++ pic.cached = 0; ++ pic.cbits = 8; ++ pic.g_bits = ++ pic.r_bits = ++ pic.b_bits = 8; ++ pic.i_bits = 0; ++ pic.numcols = numcols; ++ }else{ /* PIC24 */ ++ pic.cmapped = 0; ++ pic.cached = 1; ++ pic.cbits = 24; ++ pic.g_bits = ++ pic.r_bits = ++ pic.b_bits = 8; ++ pic.i_bits = 0; ++ pic.numcols = 1 << 24; ++ pic_cache_init(&pic); ++ } ++ ++ if((e = setjmp(pic.jmp)) != 0){ ++ /* When an error occurs while writing, comes here. */ ++ pic_cleanup_pic_info(&pic, 1); ++ if(DEBUG) fputs("\n", stderr); ++ return -1; ++ } ++ ++ pic_write_id(&pic); ++ pic_write_comment(&pic, comment); ++ pic_write_header(&pic); ++ if(pic.cmapped) ++ pic_write_palette(&pic, rmap, gmap, bmap); ++ pic_make_sparse_data(&pic, pic0); ++ pic_write_data(&pic); ++ pic_write_bits(&pic, 0, 8); ++ ++ pic_cleanup_pic_info(&pic, 1); ++ if(DEBUG) fputs("\n", stderr); ++ return 0; ++} ++ ++static void pic_write_id(pi) ++ struct pic_info *pi; ++{ ++ if(fwrite("PIC", (size_t) 3, (size_t) 1, pi->fp) != 1) ++ pic_file_error(pi, PIC_WRITE); ++} ++ ++static void pic_write_comment(pi, comm) ++ struct pic_info *pi; ++ char *comm; ++{ ++ if(comm){ ++ while(*comm){ ++ int c = *comm; ++ if(c == '\032') ++ c = ' '; ++ if(fputc(*comm, pi->fp) == EOF) ++ pic_file_error(pi, PIC_WRITE); ++ comm++; ++ } ++ } ++ /* write ^Z, 0, and reserved. */ ++ if(fwrite("\032\0\0", (size_t)3, (size_t) 1, pi->fp) != 1) ++ pic_file_error(pi, PIC_WRITE); ++} ++ ++static void pic_write_header(pi) ++ struct pic_info *pi; ++{ ++ if(DEBUG) pic_show_pic_info(pi); ++ pic_write_bits(pi, (data32) 0, 4); /* mode: 1:1 */ ++ pic_write_bits(pi, (data32) 0xf, 4); /* type: misc */ ++ pic_write_bits(pi, (data32) pi->cbits, 16); /* bits */ ++ pic_write_bits(pi, (data32) pi->width, 16); /* width */ ++ pic_write_bits(pi, (data32) pi->height, 16); /* height */ ++ pic_write_bits(pi, (data32) 0xffff, 16); /* x: unused */ ++ pic_write_bits(pi, (data32) 0xffff, 16); /* y: unused */ ++ pic_write_bits(pi, (data32) 0x0101, 16); /* real aspect */ ++} ++ ++static void pic_write_palette(pi, r, g, b) ++ struct pic_info *pi; ++ byte *r, *g, *b; ++{ ++ int i; ++ data32 rgb = 0; ++ pic_write_bits(pi, (data32) pi->g_bits, 8); ++ for(i = 0; i < pi->numcols; i++){ ++ rgb = (data32) *r++ << 16 | (data32) *g++ << 8 | (data32) *b++; ++ pic_write_rgb(pi, rgb); ++ } ++ for( ; i < 256; i++) ++ pic_write_rgb(pi, rgb); ++} ++ ++static void pic_make_sparse_data(pi, dat) ++ struct pic_info *pi; ++ byte *dat; ++{ ++ int i; ++ data32 c; ++ ++ pi->data = pic_malloc(sizeof(data32) * pi->width * pi->height, // GRR POSSIBLE OVERFLOW / FIXME ++ "pic_make_sparse_data"); ++ ++ if(pi->cmapped){ ++ c = 0; ++ for(i = 0; i < pi->width * pi->height; i++){ ++ if(c != dat[i]) ++ c = pi->data[i] = dat[i]; ++ else ++ pi->data[i] = 0xffffffff; ++ } ++ }else{ ++ int j = 0; ++ c = 0; ++ for(i = 0; i < pi->width * pi->height; i++){ ++ data32 r, g, b, t; ++ r = dat[j++]; ++ g = dat[j++]; ++ b = dat[j++]; ++ t = r << 16 | g << 8 | b; ++ if(c != t) ++ c = pi->data[i] = t; ++ else ++ pi->data[i] = 0xffffffff; ++ } ++ } ++} ++ ++static void pic_write_data(pi) ++ struct pic_info *pi; ++{ ++ int i; ++ int max = pi->width * pi->height; ++ data32 c = 0; ++ ++ i = -1; ++ while(i < max){ ++ int j; ++ for(j = i + 1; j < max; j++){ ++ if(pi->data[j] != 0xffffffff) ++ break; ++ } ++ pic_write_length(pi, (data32) j - i); ++ i = j; ++ if(i < max){ ++ pic_write_color(pi, c = pi->data[i]); ++ pic_write_chain(pi, i % pi->width, i / pi->width, c); ++ } ++ } ++} ++ ++static void pic_write_length(pi, len) ++ struct pic_info *pi; ++ data32 len; ++{ ++ int bits = 0; /* leading 1's */ ++ int max = 2; ++ ++ while(len > max){ ++ max = (max + 1) * 2; ++ bits++; ++ } ++ pic_write_bits(pi, 0xffffffff, bits); ++ pic_write_bits(pi, 0, 1); ++ pic_write_bits(pi, len - max / 2, bits + 1); ++} ++ ++static void pic_write_color(pi, c) ++ struct pic_info *pi; ++ data32 c; ++{ ++ if(pi->cached){ ++ int idx = pic_cache_lookup(pi, c); ++ if(idx < 0){ /* not found */ ++ pic_write_bits(pi, 0, 1); ++ pic_write_color_code(pi, c); ++ pic_cache_add_value(pi, c); ++ }else{ /* found */ ++ pic_write_bits(pi, (data32) 0xffffffff, 1); ++ pic_write_bits(pi, (data32) idx, 7); ++ } ++ }else ++ pic_write_color_code(pi, c); ++} ++ ++static void pic_write_chain(pi, x, y, c) ++ struct pic_info *pi; ++ int x, y; ++ data32 c; ++{ ++ int ctr = (y + 1) * pi->width + x; ++ ++ if(y < pi->height - 1 && ++ ( pi->data[ctr ] == c || ++ (x > 0 && pi->data[ctr - 1] == c) || ++ (x < pi->width - 1 && pi->data[ctr + 1] == c) || ++ (x > 1 && pi->data[ctr - 2] == c) || ++ (x < pi->width - 2 && pi->data[ctr + 2] == c))){ ++ pic_write_bits(pi, 1, 1); ++ while(++y < pi->height){ ++ if(pi->data[ctr] == c){ /* center */ ++ pic_write_bits(pi, 2, 2); ++ pi->data[ctr] = 0xffffffff; ++ ctr += pi->width; ++ }else if(x > 0 && pi->data[ctr - 1] == c){ /* left */ ++ pic_write_bits(pi, 1, 2); ++ pi->data[ctr - 1] = 0xffffffff; ++ ctr += pi->width - 1; ++ }else if(x < pi->width - 1 && pi->data[ctr + 1] == c){/* right */ ++ pic_write_bits(pi, 3, 2); ++ pi->data[ctr + 1] = 0xffffffff; ++ ctr += pi->width + 1; ++ }else if(x > 1 && pi->data[ctr - 2] == c){ /* 2-left */ ++ pic_write_bits(pi, 2, 4); ++ pi->data[ctr - 2] = 0xffffffff; ++ ctr += pi->width - 2; ++ }else if(x < pi->width - 2 && pi->data[ctr + 2] == c){/* 2-right */ ++ pic_write_bits(pi, 3, 4); ++ pi->data[ctr + 2] = 0xffffffff; ++ ctr += pi->width + 2; ++ }else /* nothing */ ++ break; ++ } ++ pic_write_bits(pi, 0, 3); ++ }else ++ pic_write_bits(pi, 0, 1); ++} ++ ++ ++/* ++ * These 4 functions read or write a color. ++ * ++ * pic_read_rgb: ++ * reads an RGB. Each bit length is [rgb]_bits, but ++ * it is expanded to 8bits when returned. ++ * ++ * pic_read_color_code: ++ * reads a color code, whose length is cbits. ++ * It is the index to the colormap or RGB itself. ++ * ++ * pic_write_rgb: ++ * writes an RGB value. ++ * ++ * pic_write_color_code: ++ * writes a color code. ++ */ ++static data32 pic_read_rgb(pi) ++ struct pic_info *pi; ++{ ++ int rb = pi->r_bits, gb = pi->g_bits, bb = pi->b_bits; ++ byte r, g, b; ++ if(pi->inv_gr){ ++ r = pic_read_bits(pi, rb); ++ g = pic_read_bits(pi, gb); ++ }else{ ++ g = pic_read_bits(pi, gb); ++ r = pic_read_bits(pi, rb); ++ } ++ b = pic_read_bits(pi, bb); ++ if(pi->i_bits){ ++ byte i; ++ i = pic_read_bits(pi, pi->i_bits); ++ r = r << pi->i_bits | i; ++ g = g << pi->i_bits | i; ++ b = b << pi->i_bits | i; ++ rb += pi->i_bits; ++ gb += pi->i_bits; ++ bb += pi->i_bits; ++ } ++ r = pic_pad_bit(rb, r); ++ g = pic_pad_bit(gb, g); ++ b = pic_pad_bit(bb, b); ++ ++ return (data32) r << 16 | (data32) g << 8 | (data32) b; ++} ++ ++static data32 pic_read_color_code(pi) ++ struct pic_info *pi; ++{ ++ if(pi->cmapped) ++ return pic_read_bits(pi, pi->cbits); ++ return pic_read_rgb(pi); ++} ++ ++static void pic_write_rgb(pi, rgb) ++ struct pic_info *pi; ++ data32 rgb; ++{ ++ byte r = rgb >> 16; ++ byte g = rgb >> 8; ++ byte b = rgb; ++ if(pi->writing_grey) ++ r = g = b = MONO(r, g, b); ++ pic_write_bits(pi, g, pi->g_bits); ++ pic_write_bits(pi, r, pi->r_bits); ++ pic_write_bits(pi, b, pi->b_bits); ++} ++ ++static void pic_write_color_code(pi, code) ++ struct pic_info *pi; ++ data32 code; ++{ ++ if(pi->cmapped){ ++ pic_write_bits(pi, code, pi->cbits); ++ }else{ ++ pic_write_rgb(pi, code); ++ } ++} ++ ++ ++/* ++ * These pic_cache_* functions are an implementation of the color cache. ++ * ++ * pic_cache_init: ++ * initializes the cache. ++ * ++ * pic_cache_get_value: ++ * gets a color indexed by the argument `idx'. ++ * It updates the `most recently used' time. ++ * ++ * pic_cache_add_value: ++ * adds a color to the top of the cache list. ++ */ ++static void pic_cache_init(pi) ++ struct pic_info *pi; ++{ ++ int i; ++ pi->cache.node = pic_malloc(sizeof(struct cachenode_t) * 128, ++ "pic_cache_init"); ++ for(i = 0; i < 128; i++){ ++ pi->cache.node[i].newer = i + 1; ++ pi->cache.node[i].older = i - 1; ++ pi->cache.node[i].dat = 0; ++ } ++ pi->cache.node[ 0].older = 127; ++ pi->cache.node[127].newer = 0; ++ pi->cache.newest = 0; ++} ++ ++static data32 pic_cache_get_value(pi, idx) ++ struct pic_info *pi; ++ int idx; ++{ ++ struct cachenode_t *p = pi->cache.node; ++ int n = pi->cache.newest; ++ if(n != idx){ ++ p[p[idx].newer].older = p[idx].older; ++ p[p[idx].older].newer = p[idx].newer; ++ ++ p[p[n].newer].older = idx; ++ p[idx].newer = p[n].newer; ++ p[n].newer = idx; ++ p[idx].older = n; ++ ++ pi->cache.newest = idx; ++ } ++ return pi->cache.node[idx].dat; ++} ++ ++static void pic_cache_add_value(pi, dat) ++ struct pic_info *pi; ++ data32 dat; ++{ ++ pi->cache.newest = pi->cache.node[pi->cache.newest].newer; ++ pi->cache.node[pi->cache.newest].dat = dat; ++} ++ ++static int pic_cache_lookup(pi, dat) ++ struct pic_info *pi; ++ data32 dat; ++{ ++ int i; ++ for(i = 0; i < 128; i++){ ++ if(pi->cache.node[i].dat == dat){ ++ pic_cache_get_value(pi, i); ++ return i; ++ } ++ } ++ return -1; ++} ++ ++ ++/* ++ * These pic_{read,write}_bits functions access the bit stream. ++ * pic_read_bits: ++ * reads the specified bits from the file. ++ * ++ * pic_write_bits: ++ * writes the specified bits to the file. ++ */ ++static data32 pic_read_bits(pi, bits) ++ struct pic_info *pi; ++ int bits; ++{ ++ data32 r = 0; ++ ++ while(bits > 0){ ++ while(pi->bs.rest > 0 && bits > 0){ ++ r = (r << 1) | (pi->bs.cur & 0x80 ? 1 : 0); ++ pi->bs.cur <<= 1; ++ pi->bs.rest--; ++ bits--; ++ } ++ if(bits > 0){ ++ int c; ++ if((c = fgetc(pi->fp)) == EOF){ ++ pic_file_warning(pi, PIC_CORRUPT); ++ c = 0; ++ } ++ pi->bs.cur = c; ++ pi->bs.rest = 8; ++ } ++ } ++ ++ return r; ++} ++ ++static void pic_write_bits(pi, dat, bits) ++ struct pic_info *pi; ++ data32 dat; ++ int bits; ++{ ++ data32 dat_mask = 1 << (bits - 1); ++ while(bits > 0){ ++ while(pi->bs.rest < 8 && bits > 0){ ++ pi->bs.cur <<= 1; ++ if(dat & dat_mask) ++ pi->bs.cur |= 1; ++ pi->bs.rest++; ++ bits--; ++ dat_mask >>= 1; ++ } ++ if(pi->bs.rest >= 8){ ++ if(fputc((int)pi->bs.cur, pi->fp) == EOF) ++ pic_error(pi, PIC_WRITE); ++ pi->bs.cur = 0; ++ pi->bs.rest = 0; ++ } ++ } ++} ++ ++ ++/* ++ * This function extends sub-8-bit data to 8-bit data using bit-replication. ++ */ ++static byte pic_pad_bit(bits, dat) ++ int bits; ++ data32 dat; ++{ ++ switch(bits){ ++ case 1: ++ if(dat & 1) ++ dat = 0xff; ++ else ++ dat = 0; ++ break; ++ case 2: ++ dat = dat << 6 | dat << 4 | dat << 2 | dat; ++ break; ++ case 3: ++ dat = dat << 5 | dat << 2 | dat >> 1; ++ break; ++ case 4: ++ dat = dat << 4 | dat; ++ break; ++ case 5: ++ dat = dat << 3 | dat >> 2; ++ break; ++ case 6: ++ dat = dat << 2 | dat >> 4; ++ break; ++ case 7: ++ dat = dat << 1 | dat >> 6; ++ } ++ ++ return dat; ++} ++ ++/* ++ * These functions initialize or clean up structures. ++ * pic_init_info: ++ * initializes a pic_info structure. ++ * pic_cleanup_pic_info: ++ * cleans up a pic_info structure. ++ * pic_cleanup_pinfo: ++ * cleans up a PICINFO structure. ++ */ ++static void pic_init_info(pi) ++ struct pic_info *pi; ++{ ++ pi->fp = NULL; ++ pi->bs.rest = 0; ++ pi->bs.cur = '\0'; ++ pi->type = pi->mode = 0; ++ pi->width = pi->height = 0; ++ pi->aspect = 1.0; ++ pi->cbits = 0; ++ pi->cmapped = pi->cached = 0; ++ pi->cache.node = NULL; ++ pi->cmap = NULL; ++ pi->g_bits = pi->r_bits = pi->b_bits = pi->i_bits = 0; ++ pi->inv_gr = 0; ++ pi->tiled256 = 0; ++ pi->numcols = 0; ++ pi->writing_grey = 0; ++} ++ ++static void pic_cleanup_pic_info(pi, writing) ++ struct pic_info *pi; ++ int writing; ++{ ++ if(!writing && pi->fp) ++ fclose(pi->fp); ++ if(pi->cmap) ++ free(pi->cmap); ++ if(pi->cache.node) ++ free(pi->cache.node); ++ if(pi->data) ++ free(pi->data); ++ pi->fp = NULL; ++ pi->cmap = NULL; ++ pi->cache.node = NULL; ++ pi->data = NULL; ++} ++ ++static void pic_cleanup_pinfo(pinfo) ++ PICINFO *pinfo; ++{ ++ if(pinfo->pic){ ++ free(pinfo->pic); ++ pinfo->pic = NULL; ++ } ++ if(pinfo->comment){ ++ free(pinfo->comment); ++ pinfo->comment = NULL; ++ } ++} ++ ++/* ++ * Error Handlers. ++ * pic_memory_error: ++ * shows an error message and terminates. ++ * pic_error: ++ * shows a non-file error message and jumps to the entry for errors. ++ * pic_file_error: ++ * shows a file error message and jumps to the entry for errors. ++ * pic_file_warning: ++ * shows a file warning message. ++ */ ++static void pic_memory_error(scm, fn) ++ char *scm, *fn; ++{ ++ char buf[128]; ++ sprintf(buf, "%s: can't allocate memory. (%s)", scm, fn); ++ FatalError(buf); ++} ++ ++static void pic_error(pi, mn) ++ struct pic_info *pi; ++ int mn; ++{ ++ SetISTR(ISTR_WARNING, "%s", pic_msgs[mn]); ++ longjmp(pi->jmp, 1); ++} ++ ++static void pic_file_error(pi, mn) ++ struct pic_info *pi; ++ int mn; ++{ ++ if(feof(pi->fp)) ++ SetISTR(ISTR_WARNING, "%s (end of file)", pic_msgs[mn]); ++ else ++ SetISTR(ISTR_WARNING, "%s (%s)", pic_msgs[mn], ERRSTR(errno)); ++ longjmp(pi->jmp, 1); ++} ++ ++static void pic_file_warning(pi, mn) ++ struct pic_info *pi; ++ int mn; ++{ ++ if(feof(pi->fp)) ++ SetISTR(ISTR_WARNING, "%s (end of file)", pic_msgs[mn]); ++ else ++ SetISTR(ISTR_WARNING, "%s (%s)", pic_msgs[mn], ERRSTR(errno)); ++} ++ ++static void pic_show_pic_info(pi) ++ struct pic_info *pi; ++{ ++ fprintf(stderr, " file size: %ld.\n", pi->fsize); ++ ++ fputs(" machine: ", stderr); ++ switch(pi->type){ ++ case 0x0: ++ fputs("X68k", stderr); ++ break; ++ case 0x1: ++ fputs("PC-88VA", stderr); ++ if(pi->mode & 1) ++ fputs(",HR", stderr); ++ if(pi->mode & 2) ++ fputs(",tiled256", stderr); ++ break; ++ case 0x2: ++ fprintf(stderr, ++ "FM-TOWNS,%s-resolution", pi->mode == 5 ? "low" : "high"); ++ break; ++ case 0x3: ++ fputs("Macintosh", stderr); ++ break; ++ case 0xf: ++ fputs("misc", stderr); ++ } ++ fputs("\n", stderr); ++ ++ fprintf(stderr, " image size: %dx%d\n", pi->width, pi->height); ++ fprintf(stderr, " aspect: %f\n", pi->aspect); ++ fprintf(stderr, " cache: %s\n", pi->cached ? "on" : "off"); ++ fprintf(stderr, " colormap: %s\n", pi->cmapped ? "on" : "off"); ++ fprintf(stderr, " number of color bits: %d\n", pi->cbits); ++ fprintf(stderr, " number of RGB bits: R%d,G%d,B%d,I%d\n", ++ pi->r_bits, pi->g_bits, pi->b_bits, pi->i_bits); ++ fprintf(stderr, " inverted G&R: %s\n", pi->inv_gr ? "true" : "false"); ++ fprintf(stderr, " number of colors: %d\n", pi->numcols); ++} ++ ++/* Memory related routines. */ ++static void *pic_malloc(n, fn) ++ size_t n; ++ char *fn; ++{ ++ void *r = (void *) malloc(n); ++ if(r == NULL) ++ pic_memory_error("malloc", fn); ++ return r; ++} ++ ++static void *pic_realloc(p, n, fn) ++ void *p; ++ size_t n; ++ char *fn; ++{ ++ void *r = (p == NULL) ? (void *) malloc(n) : (void *) realloc(p, n); ++ if(r == NULL) ++ pic_memory_error("realloc", fn); ++ return r; ++} ++#endif /* HAVE_PIC */ +diff -ruN xv-3.10a-bugfixes/xvpic2.c xv-3.10a-enhancements/xvpic2.c +--- xv-3.10a-bugfixes/xvpic2.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvpic2.c 2005-04-17 22:56:07.000000000 -0700 +@@ -0,0 +1,3608 @@ ++/* ++ * $Id: xvpic2.c,v 2.9.1.14 1995/04/24 15:34:15 ikeyan Exp $ ++ * xvpic2.c - load and save routines for `PIC2' format pictures. ++ * ++ * ++ * Outline ++ * ======= ++ * xvpic2.c supports the PIC2 format image file. It is used some ++ * Japanese personal computer users. ++ * ++ * The PIC2 format is designed by A.Yanagisawa. It is an excellent ++ * format except for its encode/decode speed. ;-) ++ * ++ * The features of the PIC2 format: ++ * - Powerful header information (included author, filename, title, ++ * saver, product number, created date and comment). ++ * - Reversible compression, and very high compression ratio (in many ++ * cases, a higher compression ratio than the JPEG compression; ++ * because of its compression method, PIC2 is especially good at ++ * pictures like cell animation). ++ * - Can handle full-color (24 bits) image. ++ * - Can include multi image blocks into one PIC2 file. ++ * - Have four different block format (P2SS, P2SF, P2BM and ++ * P2BI). P2SS format uses arithmetic compression for storing ++ * data. P2SF uses normal run-length compression. P2BM and P2BI is ++ * raw image format. Select any one according to the situation. ++ * ++ * Explanation of the PIC2 compression: ++ ++ * - In the first place, try to record pixel color, uses color caches ++ * which keep some recent colors, and formed according to color's ++ * frequency. PIC2 has some color cache spaces that are switched by ++ * upper pixel value of current pixel. If cache is hit, record ++ * that. ++ * - Unfortunately, in the case of color cache didn't hit, record the ++ * difference from the value estimated with the value of upper and ++ * left pixel of current pixel (similar to PNG's AVG predictor). ++ * - And extract image's color chain if exist, and record that (it ++ * results in image's outline). ++ * - In all cases, arithmetic compression is used in the final stage ++ * before writing the file, which in theory produces the ideal ++ * compression ratio (P2SS). ++ * ++ * Features ++ * ======== ++ * - Support 3,6,9,12,15,18,21,24bit PIC2 format (Load/Save). ++ * - Support all image block formats of PIC2 (Load/Save). ++ * - Support multi block PIC2 file (Load/Save). ++ * ++ * ++ * Bugs ++ * ==== ++ * - Unsupport 8bit PIC2 image file. ++ * ++ * If you find other bugs (surely exist :-)), send me bug-report. ++ * ++ * ++ * Author ++ * ====== ++ * IKEMOTO Masahiro <ikeyan@airlab.cs.ritsumei.ac.jp> ++ */ ++ ++#define PIC2_IGNORE_UNUSED_FUNCTIONS ++#define NEEDSDIR ++ ++#include "xv.h" ++#include <setjmp.h> ++ ++#ifdef HAVE_PIC2 ++ ++typedef unsigned long pixel; ++ ++#define pic2_cextoshort(addr) ( \ ++ (((short) (((byte *) addr)[0])) << 8) | \ ++ ( (short) (((byte *) addr)[1])) \ ++) ++#define pic2_cextolong(addr) ( \ ++ (((long) (((byte *) addr)[0])) << 24) | \ ++ (((long) (((byte *) addr)[1])) << 16) | \ ++ (((long) (((byte *) addr)[2])) << 8) | \ ++ ( (long) (((byte *) addr)[3])) \ ++) ++#define pic2_shorttocex(addr, n) { \ ++ ((byte *) addr)[0] = (((unsigned short) (n) >> 8) & 0xff); \ ++ ((byte *) addr)[1] = ( (unsigned short) (n) & 0xff); \ ++} ++#define pic2_longtocex(addr, n) { \ ++ ((byte *) addr)[0] = (((unsigned long) (n) >> 24) & 0xff); \ ++ ((byte *) addr)[1] = (((unsigned long) (n) >> 16) & 0xff); \ ++ ((byte *) addr)[2] = (((unsigned long) (n) >> 8) & 0xff); \ ++ ((byte *) addr)[3] = ( (unsigned long) (n) & 0xff); \ ++} ++#define pic2_shift_bits(b, n) (((n) > 0) ? ((b) << (n)) : ((b) >> -(n))) ++ ++#define PIC2_READ_MODE 0 ++#define PIC2_WRITE_MODE 1 ++ ++#define PIC2_ARITH_CACHE 32 ++#define PIC2_ARITH_CONTEXT 128 ++#define PIC2_FAST_CACHE 64 ++ ++#define PIC2_HEADER_SIZE 124 ++#define PIC2_BLOCK_HEADER_SIZE 26 ++ ++struct pic2_header { ++ char magic[4]; ++ char name[18]; ++ char subtitle[8]; ++ char crlf0[2]; ++ char title[30]; ++ char crlf1[2]; ++ char saver[30]; ++ char crlf2[2]; ++ char eof[1]; ++ char reserve0[1]; ++ short flag; ++ short no; ++ long time; ++ long size; ++ short depth; ++ short x_aspect; ++ short y_aspect; ++ short x_max; ++ short y_max; ++ long reserve1; ++}; ++ ++struct pic2_block { ++ char id[4]; ++ long size; ++ short flag; ++ short x_wid; ++ short y_wid; ++ short x_offset; ++ short y_offset; ++ long opaque; ++ long reserve; ++}; ++ ++struct pic2_info { ++ jmp_buf jmp; ++ FILE *fp; ++ struct { ++ int rest; ++ byte cur; ++ int bits; ++ char zero; ++ }bs; ++ long fsize; ++ struct pic2_header *header; ++ struct pic2_block *block; ++ int n_pal; ++ int pal_bits; ++ byte pal[256][3]; ++ char *comment; ++ char mode; ++ long next_pos; ++ long block_pos; ++ short x_max; ++ short y_max; ++ int ynow; ++ byte *buf; ++ pixel *vram_prev; ++ pixel *vram_now; ++ pixel *vram_next; ++ short *flag_now; ++ short *flag_next; ++ short *flag2_now; ++ short *flag2_next; ++ short *flag2_next2; ++ pixel (*cache)[PIC2_ARITH_CACHE]; ++ unsigned short *cache_pos; ++ unsigned short *mulu_tab; ++ long aa; ++ long cc; ++ long dd; ++ char cache_hit_c; ++ int (*next_line) PARM((struct pic2_info *, pixel **)); ++ char writing_grey; ++ char pagebname[64]; ++ int pnum; ++}; ++ ++static void pic2_open_file PARM((struct pic2_info*,char*)); ++static void pic2_read_header PARM((struct pic2_info*)); ++static void pic2_read_block_header1 PARM((struct pic2_info*)); ++static void pic2_read_block_header2 PARM((struct pic2_info*)); ++static short pic2_arith_decode_bit PARM((struct pic2_info*,int)); ++static short pic2_arith_decode_nn PARM((struct pic2_info*,int)); ++static void pic2_arith_expand_chain PARM((struct pic2_info*,int,int,pixel)); ++static short pic2_arith_get_number PARM((struct pic2_info*,int,int)); ++static pixel pic2_arith_read_color PARM((struct pic2_info*,int)); ++static int pic2_arith_expand_line PARM((struct pic2_info*,pixel**)); ++static int pic2_arith_loader_init PARM((struct pic2_info*)); ++static int pic2_fast_read_length PARM((struct pic2_info*)); ++static void pic2_fast_expand_chain PARM((struct pic2_info*,int,pixel)); ++static pixel pic2_fast_read_color PARM((struct pic2_info*,pixel)); ++static int pic2_fast_expand_line PARM((struct pic2_info*,pixel**)); ++static int pic2_fast_loader_init PARM((struct pic2_info*)); ++static int pic2_beta_expand_line PARM((struct pic2_info*,pixel**)); ++static int pic2_beta_loader_init PARM((struct pic2_info*)); ++static void pic2_make_xvpic PARM((struct pic2_info*,byte**, ++ byte*,byte*,byte*)); ++static void pic2_make_pagefile PARM((struct pic2_info*,char*,int)); ++static void pic2_setup_pic2_info PARM((struct pic2_info*, ++ char*,char*,char*,char*, ++ int,int,int,int,int,int,char *)); ++static void pic2_append PARM((struct pic2_info*)); ++static void pic2_write_header1 PARM((struct pic2_info*)); ++static void pic2_write_header2 PARM((struct pic2_info*)); ++static void pic2_write_block_header PARM((struct pic2_info*)); ++static void pic2_arith_write_zero_bit PARM((struct pic2_info*)); ++static void pic2_arith_flush_bit_buf PARM((struct pic2_info*)); ++static void pic2_arith_carry_bit PARM((struct pic2_info*)); ++static void pic2_arith_encode_bit PARM((struct pic2_info*,int,int)); ++static void pic2_arith_encode_nbyte PARM((struct pic2_info*,int,int,int)); ++static void pic2_arith_encode_nn PARM((struct pic2_info*,int,int)); ++static void pic2_arith_press_chain PARM((struct pic2_info*,int)); ++static void pic2_arith_put_number PARM((struct pic2_info*,int,int,int)); ++static void pic2_arith_write_color PARM((struct pic2_info*,int)); ++static void pic2_arith_press_line2 PARM((struct pic2_info*)); ++static int pic2_arith_press_line PARM((struct pic2_info*,pixel**)); ++static int pic2_arith_saver_init PARM((struct pic2_info*,pixel**)); ++static void pic2_fast_write_length PARM((struct pic2_info*,int)); ++static void pic2_fast_press_chain PARM((struct pic2_info*,int)); ++static void pic2_fast_press_chain2 PARM((struct pic2_info*,int)); ++static void pic2_fast_flush_chain PARM((struct pic2_info*)); ++static void pic2_fast_write_color PARM((struct pic2_info*,int)); ++static void pic2_fast_press_line2 PARM((struct pic2_info*)); ++static int pic2_fast_press_line PARM((struct pic2_info*,pixel**)); ++static int pic2_fast_saver_init PARM((struct pic2_info*,pixel**)); ++static int pic2_beta_press_line PARM((struct pic2_info*,pixel**)); ++static int pic2_beta_saver_init PARM((struct pic2_info*,pixel**)); ++static void pic2_write_data PARM((struct pic2_info*,byte*, ++ int,int,int,int,int, ++ byte*,byte*,byte*,int,int)); ++static int pic2_next_line PARM((struct pic2_info*,pixel**)); ++static int pic2_next_block PARM((struct pic2_info*)); ++static int pic2_find_block PARM((struct pic2_info*)); ++static int pic2_load_block PARM((struct pic2_info*)); ++static int pic2_save_block PARM((struct pic2_info*,pixel**, ++ int,int,int,int,char*,pixel)); ++#ifndef PIC2_IGNORE_UNUSED_FUNCTIONS ++static void pic2_read_palette PARM((struct pic2_info*, ++ byte*,byte*,byte*)); ++static void pic2_write_palette PARM((struct pic2_info*,int,int, ++ byte*,byte*,byte*)); ++#endif /* !PIC2_IGNORE_UNUSED_FUNCTIONS */ ++static byte pic2_convert_color_bits PARM((int,int,int)); ++static byte pic2_pad_color_bits PARM((int,int,int)); ++static byte pic2_reduce_color_bits PARM((int,int,int)); ++static pixel pic2_exchange_rg PARM((pixel,int)); ++static void pic2_handle_para PARM((struct pic2_info*,int)); ++static int pic2_alloc_buffer PARM((struct pic2_info*)); ++static void pic2_free_buffer PARM((struct pic2_info*)); ++static long pic2_seek_file PARM((struct pic2_info*,long,int)); ++static long pic2_tell_file PARM((struct pic2_info*)); ++static int pic2_read_file PARM((struct pic2_info*,void*,size_t)); ++static long pic2_read_long PARM((struct pic2_info*)); ++static short pic2_read_short PARM((struct pic2_info*)); ++static char pic2_read_char PARM((struct pic2_info*)); ++static int pic2_write_file PARM((struct pic2_info*,void*,size_t)); ++static int pic2_write_long PARM((struct pic2_info*,long)); ++static int pic2_write_short PARM((struct pic2_info*,int)); ++static int pic2_write_char PARM((struct pic2_info*,int)); ++static unsigned long pic2_read_bits PARM((struct pic2_info*,int)); ++static void pic2_write_bits PARM((struct pic2_info*, ++ unsigned long,int)); ++static void pic2_flush_bits PARM((struct pic2_info*)); ++static void pic2_memory_error PARM((char*,char*)); ++static void pic2_error PARM((struct pic2_info*,int)); ++static void pic2_file_error PARM((struct pic2_info*,int)); ++static void pic2_init_info PARM((struct pic2_info*)); ++static void pic2_cleanup_pic2_info PARM((struct pic2_info*,int)); ++static void pic2_cleanup_pinfo PARM((PICINFO*)); ++static void pic2_show_pic2_info PARM((struct pic2_info*)); ++static char *pic2_strncpy PARM((char*,char*,size_t)); ++static void *pic2_malloc PARM((size_t,char*)); ++static void *pic2_new PARM((size_t,char*)); ++ ++static int WritePIC2 PARM((FILE*,byte*,int,int,int, ++ byte*,byte*,byte*,int,int,char*, ++ int,int,int,int,int,char*)); ++ ++static char *pic2_id = "P2DT"; ++ ++/* Error Messages */ ++static char *pic2_msgs[] = { ++ NULL, ++#define PIC2_OPEN 1 ++ "can't open file.", ++#define PIC2_CORRUPT 2 ++ "file corrupted.", ++#define PIC2_FORMAT 3 ++ "not PIC2 format.", ++#define PIC2_DEPTH 4 ++ "bit depths not divisible by 3 are unsupported.", ++#define PIC2_TMPFILE 5 ++ "unable to create temporary filename???", ++#define PIC2_PAGE 6 ++ "couldn't load the page.", ++#define PIC2_APPEND 7 ++ "cannot append.", ++#define PIC2_WRITE 8 ++ "write failed.", ++}; ++ ++struct _form_tab { ++ char *id; ++ int (*loader_init) PARM((struct pic2_info *)); ++ int (*saver_init) PARM((struct pic2_info *, pixel **)); ++} form_tab[] = { ++ { "P2SS", pic2_arith_loader_init, pic2_arith_saver_init}, ++ { "P2SF", pic2_fast_loader_init, pic2_fast_saver_init}, ++ { "P2BM", pic2_beta_loader_init, pic2_beta_saver_init}, ++ { "P2BI", pic2_beta_loader_init, pic2_beta_saver_init}, ++}; ++#define n_form_tab (sizeof(form_tab) / sizeof(struct _form_tab)) ++#define P2SS 0 ++#define P2SF 1 ++#define P2BM 2 ++#define P2BI 3 ++ ++/* The main routine to load a PIC2 file. */ ++int LoadPIC2(fname, pinfo, quick) ++char *fname; ++PICINFO *pinfo; ++int quick; ++{ ++ int e, i, block; ++ struct pic2_info pic2; ++ ++ if (DEBUG) ++ fputs("LoadPIC2:\n", stderr); ++ ++ pic2_init_info(&pic2); ++ ++ if ((e = setjmp(pic2.jmp)) != 0){ ++ /* When an error occurs, comes here. */ ++ pic2_free_buffer(&pic2); ++ pic2_cleanup_pic2_info(&pic2, 0); ++ pic2_cleanup_pinfo(pinfo); ++ if (pic2split) ++ KillPageFiles(pic2.pagebname, pic2.pnum); ++ SetCursors(-1); ++ if (DEBUG) ++ fputs("\n", stderr); ++ return (0); ++ } ++ pic2_open_file(&pic2, fname); ++ pic2_read_header(&pic2); ++ ++ if ((i = pic2_find_block(&pic2)) == 0) ++ pic2_file_error(&pic2, PIC2_CORRUPT); ++ ++ block = 1; ++ while(i == 2) { ++ SetISTR(ISTR_WARNING, "unknown or invalid block #%d.", block); ++ i = pic2_next_block(&pic2); ++ block++; ++ } ++ ++ if (pic2split && !quick) { ++ char firstpage[512]; ++ struct stat st; ++#ifndef USE_MKSTEMP ++ int tmpfd; ++#endif ++ ++#ifndef VMS ++ sprintf(pic2.pagebname, "%s/xvpic2XXXXXX", tmpdir); ++#else ++ sprintf(pic2.pagebname, "Sys$Scratch:xvpic2XXXXXX"); ++#endif ++#ifdef USE_MKSTEMP ++ close(mkstemp(pic2.pagebname)); ++#else ++ mktemp(pic2.pagebname); ++ tmpfd = open(pic2.pagebname, O_WRONLY|O_CREAT|O_EXCL, S_IRWUSR); ++ if (tmpfd < 0) FatalError("LoadPIC2(): can't create temporary file"); ++ close(tmpfd); ++#endif ++ if (pic2.pagebname[0] == '\0') ++ pic2_error(&pic2, PIC2_TMPFILE); ++ strcat(pic2.pagebname, "."); ++ ++ sprintf(firstpage, "%s%d", pic2.pagebname, 1); ++ if (stat(firstpage, &st)) { ++ for (pic2.pnum = 1; i >= 1; pic2.pnum++) { ++ pic2_load_block(&pic2); ++ pic2_make_pagefile(&pic2, pic2.pagebname, pic2.pnum); ++ while(block++, (i = pic2_next_block(&pic2)) == 2) ++ SetISTR(ISTR_WARNING, ++ "unknown or invalid block #%d.", block); ++ } ++ pinfo->numpages = --pic2.pnum; ++ if (!LoadPIC2(firstpage, pinfo, 1)) ++ pic2_error(&pic2, PIC2_PAGE); ++ if (pic2.pnum == 1) ++ unlink(firstpage); ++ else ++ strcpy(pinfo->pagebname, pic2.pagebname); ++ } else ++ if (!LoadPIC2(fname, pinfo, 1)) ++ pic2_error(&pic2, PIC2_PAGE); ++ } else { ++ char buf[128], format[64]; ++ int j; ++ ++ pinfo->w = pic2.x_max; ++ pinfo->h = pic2.y_max; ++ pinfo->normw = pinfo->w; ++ pinfo->normh = pinfo->h; ++ pinfo->type = PIC24; ++ for (j = 0; j < n_form_tab; j++) { ++ if (xvbcmp(pic2.block->id, form_tab[j].id, (size_t) 4) == 0) ++ break; ++ } ++ pinfo->frmType = F_PIC2; ++ pinfo->colType = F_FULLCOLOR; ++ pinfo->comment = pic2.comment; ++ ++ if (pic2split) { ++ pic2_make_xvpic(&pic2, &pinfo->pic, pinfo->r, pinfo->g, pinfo->b); ++ strcpy(format, form_tab[j].id); ++ } else { ++ for (pic2.pnum = 1; i >= 1; pic2.pnum++) { ++ SetISTR(ISTR_INFO, "composing block #%d", block); ++ pic2_make_xvpic(&pic2, &pinfo->pic, ++ pinfo->r, pinfo->g, pinfo->b); ++ while(block++, (i = pic2_next_block(&pic2)) == 2) ++ SetISTR(ISTR_WARNING, ++ "unknown or invalid block #%d.", block); ++ } ++ if (--block > 1) ++ if (block != --pic2.pnum) ++ sprintf(format, "MultiBlock[%d/%d]", block, pic2.pnum); ++ else ++ sprintf(format, "MultiBlock[%d]", block); ++ else ++ strcpy(format, form_tab[j].id); ++ } ++ sprintf(buf, "PIC2(%s). %d colors (%ld bytes)", format, ++ (int) 1 << pic2.header->depth, pic2.fsize); ++ strcat(pinfo->fullInfo, buf); ++ sprintf(pinfo->shrtInfo, "%dx%d(aspect %4.2f) PIC2(%s).", ++ pinfo->w, pinfo->h, ++ (float) pic2.header->x_aspect / (float) pic2.header->y_aspect, ++ format); ++ if (!nopicadjust) ++ normaspect = (float) pic2.header->x_aspect ++ / (float) pic2.header->y_aspect; ++ } ++ pic2_cleanup_pic2_info(&pic2, 0); ++ SetCursors(-1); ++ if (DEBUG) ++ fputs("\n", stderr); ++ return (1); ++} ++ ++/* ++ * This function opens the file, and set its size. ++ */ ++static void pic2_open_file(pi, fname) ++ struct pic2_info *pi; ++ char *fname; ++{ ++ if ((pi->fp = fopen(fname, "rb")) == NULL) ++ pic2_file_error(pi, PIC2_OPEN); ++ fseek(pi->fp, (size_t) 0, SEEK_END); ++ pi->fsize = ftell(pi->fp); ++ fseek(pi->fp, (size_t) 0, SEEK_SET); ++} ++ ++/* ++ * These functions read the PIC2 header informations. ++ * pic2_read_header: ++ * reads the PIC2 header. ++ * pic2_read_block_header1: ++ * reads the id number of block header and the size of block. ++ * pic2_read_block_header2: ++ * reads the rest of block header. ++ */ ++static void pic2_read_header(pi) ++struct pic2_info *pi; ++{ ++ long s_comment; ++ ++ pi->mode = PIC2_READ_MODE; ++ ++ /* read header image */ ++ pic2_read_file(pi, pi->header->magic, 4); ++ pic2_read_file(pi, pi->header->name, 18); ++ pic2_read_file(pi, pi->header->subtitle, 8); ++ pic2_read_file(pi, pi->header->crlf0, 2); ++ pic2_read_file(pi, pi->header->title, 30); ++ pic2_read_file(pi, pi->header->crlf1, 2); ++ pic2_read_file(pi, pi->header->saver, 30); ++ pic2_read_file(pi, pi->header->crlf2, 2); ++ pic2_read_file(pi, pi->header->eof, 1); ++ pic2_read_file(pi, pi->header->reserve0, 1); ++ pi->header->flag = pic2_read_short(pi); ++ pi->header->no = pic2_read_short(pi); ++ pi->header->time = pic2_read_long(pi); ++ pi->header->size = pic2_read_long(pi); ++ pi->header->depth = pic2_read_short(pi); ++ pi->header->x_aspect = pic2_read_short(pi); ++ pi->header->y_aspect = pic2_read_short(pi); ++ pi->header->x_max = pic2_read_short(pi); ++ pi->header->y_max = pic2_read_short(pi); ++ pi->header->reserve1 = pic2_read_long(pi); ++ ++ /* check magic number */ ++ if (strncmp(pi->header->magic, pic2_id, (size_t) 4) != 0) ++ pic2_error(pi, PIC2_FORMAT); ++ ++ /* read palette data, if exists */ ++ if (pi->header->flag & 1) { ++ pi->pal_bits = pic2_read_char(pi); ++ pi->n_pal = pic2_read_short(pi); ++ pic2_read_file(pi, pi->pal, (size_t) (pi->n_pal * 3)); ++ } ++ ++ /* read comments */ ++ s_comment = pi->header->size - pic2_tell_file(pi); ++ pi->comment = pic2_new(s_comment + 1, "pic2_read_header"); ++ pic2_read_file(pi, pi->comment, (size_t) s_comment); ++ pi->comment[s_comment] = '\0'; ++ ++ pi->x_max = pi->header->x_max; ++ pi->y_max = pi->header->y_max; ++ ++ /* set initial block point */ ++ pi->next_pos = pic2_tell_file(pi); ++} ++ ++static void pic2_read_block_header1(pi) ++struct pic2_info *pi; ++{ ++ pic2_read_file(pi, pi->block->id, 4); ++ pi->block->size = pic2_read_long(pi); ++} ++ ++static void pic2_read_block_header2(pi) ++struct pic2_info *pi; ++{ ++ pi->block->flag = pic2_read_short(pi); ++ pi->block->x_wid = pic2_read_short(pi); ++ pi->block->y_wid = pic2_read_short(pi); ++ pi->block->x_offset = pic2_read_short(pi); ++ pi->block->y_offset = pic2_read_short(pi); ++ pi->block->opaque = pic2_read_long(pi); ++ pi->block->reserve = pic2_read_long(pi); ++} ++ ++/* ++ * These functions are arithmetic pic2 format extractor. ++ */ ++static short pic2_arith_decode_bit(pi, c) ++struct pic2_info *pi; ++int c; ++{ ++ unsigned short pp; ++ ++ pp = pi->mulu_tab[(pi->aa & 0x7f00) / 2 + c]; ++ if (pi->dd >= (int) pp) { ++ pi->dd -= pp; ++ pi->aa -= pp; ++ ++ while ((short) pi->aa >= 0) { ++ pi->dd *= 2; ++ if (pic2_read_bits(pi, 1)) ++ pi->dd++; ++ pi->aa *= 2; ++ } ++ return (1); ++ } else { ++ pi->aa = pp; ++ ++ while ((short) pi->aa >= 0) { ++ pi->dd *= 2; ++ if (pic2_read_bits(pi, 1)) ++ pi->dd++; ++ pi->aa *= 2; ++ } ++ return (0); ++ } ++} ++ ++static short pic2_arith_decode_nn(pi, c) ++struct pic2_info *pi; ++int c; ++{ ++ int n; ++ ++ if (pic2_arith_decode_bit(pi, c)) { ++ /* n < 1 */ ++ n = 0; ++ } else if (pic2_arith_decode_bit(pi, c + 1)) { ++ /* n < 1 + 2 */ ++ n = 1; ++ if (pic2_arith_decode_bit(pi, c + 8)) ++ n += 1; ++ } else if (pic2_arith_decode_bit(pi, c + 2)) { ++ /* n < 1 + 2 + 4 */ ++ n = 1 + 2; ++ if (pic2_arith_decode_bit(pi, c + 8)) ++ n += 1; ++ if (pic2_arith_decode_bit(pi, c + 9)) ++ n += 2; ++ } else if (pic2_arith_decode_bit(pi, c + 3)) { ++ /* n < 1 + 2 + 4 + 8 */ ++ n = 1 + 2 + 4; ++ if (pic2_arith_decode_bit(pi, c + 8)) ++ n += 1; ++ if (pic2_arith_decode_bit(pi, c + 9)) ++ n += 2; ++ if (pic2_arith_decode_bit(pi, c + 10)) ++ n += 4; ++ } else if (pic2_arith_decode_bit(pi, c + 4)) { ++ /* n < 1 + 2 + 4 + 8 + 16 */ ++ n = 1 + 2 + 4 + 8; ++ if (pic2_arith_decode_bit(pi, c + 8)) ++ n += 1; ++ if (pic2_arith_decode_bit(pi, c + 9)) ++ n += 2; ++ if (pic2_arith_decode_bit(pi, c + 10)) ++ n += 4; ++ if (pic2_arith_decode_bit(pi, c + 11)) ++ n += 8; ++ } else if (pic2_arith_decode_bit(pi, c + 5)) { ++ /* n < 1 + 2 + 4 + 8 + 16 + 32 */ ++ n = 1 + 2 + 4 + 8 + 16; ++ if (pic2_arith_decode_bit(pi, c + 8)) ++ n += 1; ++ if (pic2_arith_decode_bit(pi, c + 9)) ++ n += 2; ++ if (pic2_arith_decode_bit(pi, c + 10)) ++ n += 4; ++ if (pic2_arith_decode_bit(pi, c + 11)) ++ n += 8; ++ if (pic2_arith_decode_bit(pi, c + 12)) ++ n += 16; ++ ++ } else if (pic2_arith_decode_bit(pi, c + 6)) { ++ /* n < 1 + 2 + 4 + 8 + 16 + 32 + 64 */ ++ n = 1 + 2 + 4 + 8 + 16 + 32; ++ if (pic2_arith_decode_bit(pi, c + 8)) ++ n += 1; ++ if (pic2_arith_decode_bit(pi, c + 9)) ++ n += 2; ++ if (pic2_arith_decode_bit(pi, c + 10)) ++ n += 4; ++ if (pic2_arith_decode_bit(pi, c + 11)) ++ n += 8; ++ if (pic2_arith_decode_bit(pi, c + 12)) ++ n += 16; ++ if (pic2_arith_decode_bit(pi, c + 13)) ++ n += 32; ++ ++ } else if (pic2_arith_decode_bit(pi, c + 7)) { ++ /* n < 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 */ ++ n = 1 + 2 + 4 + 8 + 16 + 32 + 64; ++ if (pic2_arith_decode_bit(pi, c + 8)) ++ n += 1; ++ if (pic2_arith_decode_bit(pi, c + 9)) ++ n += 2; ++ if (pic2_arith_decode_bit(pi, c + 10)) ++ n += 4; ++ if (pic2_arith_decode_bit(pi, c + 11)) ++ n += 8; ++ if (pic2_arith_decode_bit(pi, c + 12)) ++ n += 16; ++ if (pic2_arith_decode_bit(pi, c + 13)) ++ n += 32; ++ if (pic2_arith_decode_bit(pi, c + 14)) ++ n += 64; ++ ++ } else { ++ n = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128; ++ } ++ return (n); ++} ++ ++static void pic2_arith_expand_chain(pi, x, y, cc) ++struct pic2_info *pi; ++int x, y; ++pixel cc; ++{ ++ static const unsigned short c_tab[] = { ++ 80 + 6 * 5, /* -5 */ ++ 80 + 6 * 4, ++ 80 + 6 * 3, ++ 80 + 6 * 2, ++ 80 + 6 * 1, ++ 80 + 6 * 0, /* 0 */ ++ 80 + 6 * 0, /* 1 */ ++ }; ++ unsigned short b; ++ ++ b = c_tab[pi->flag_now[x] + 5]; ++ if (!pic2_arith_decode_bit(pi, b++)) { ++ if (pic2_arith_decode_bit(pi, b++)) { /* down */ ++ pi->vram_next[x ] = cc; ++ pi->flag_next[x ] = -1; ++ } else if (pic2_arith_decode_bit(pi, b++)) { /* left */ ++ pi->vram_next[x - 1] = cc; ++ pi->flag_next[x - 1] = -2; ++ } else if (pic2_arith_decode_bit(pi, b++)) { /* right */ ++ pi->vram_next[x + 1] = cc; ++ pi->flag_next[x + 1] = -3; ++ } else if (pic2_arith_decode_bit(pi, b++)) { /* left2 */ ++ pi->vram_next[x - 2] = cc; ++ pi->flag_next[x - 2] = -4; ++ } else { /* right2 */ ++ pi->vram_next[x + 2] = cc; ++ pi->flag_next[x + 2] = -5; ++ } ++ } ++} ++ ++static short pic2_arith_get_number(pi, c, bef) ++struct pic2_info *pi; ++int c, bef; ++{ ++ unsigned short n; ++ byte maxcol; ++ ++ maxcol = 0xff >> (8 - pi->header->depth / 3); ++ ++ n = pic2_arith_decode_nn(pi, c); ++ if (bef > ((int) maxcol >> 1)) { ++ if (n > ((int) maxcol - bef) * 2) ++ n = maxcol - n; ++ else if (n & 1) ++ n = n / 2 + bef + 1; ++ else ++ n = bef - n / 2; ++ } else { ++ if ((int) n > (bef * 2)) ++ n = n; ++ else if (n & 1) ++ n = n / 2 + bef + 1; ++ else ++ n = bef - n / 2; ++ } ++ return (n); ++} ++ ++static pixel pic2_arith_read_color(pi, x) ++struct pic2_info *pi; ++int x; ++{ ++ pixel c1, c2, cc; ++ unsigned short i, j, k, m; ++ short r, g, b, r0, g0, b0; ++ short colbits; ++ pixel rmask, gmask, bmask; ++ byte maxcol; ++ ++ colbits = pi->header->depth / 3; ++ rmask = (0xff >> (8 - colbits)) << (colbits * 2); ++ gmask = (0xff >> (8 - colbits)) << colbits; ++ bmask = (0xff >> (8 - colbits)); ++ maxcol = (byte) bmask; ++ ++ c1 = pi->vram_prev[x]; ++ k = ((c1 >> ((colbits - 3) * 3)) & 0x1c0) ++ | ((c1 >> ((colbits - 3) * 2)) & 0x038) ++ | ((c1 >> (colbits - 3) ) & 0x007); ++ if (colbits == 5) ++ k = pic2_exchange_rg(k, 3); ++ ++ if (pic2_arith_decode_bit(pi, pi->cache_hit_c)) { /* ouch */ ++ pi->cache_hit_c = 16; ++ ++ c2 = pi->vram_now[x - 1]; ++ r = ((c1 & rmask) + (c2 & rmask)) >> (colbits * 2 + 1); ++ g = ((c1 & gmask) + (c2 & gmask)) >> (colbits + 1); ++ b = ((c1 & bmask) + (c2 & bmask)) >> ( 1); ++ ++ g0 = pic2_arith_get_number(pi, 32, g); ++ r = r + g0 - g; ++ if (r > (short) maxcol) ++ r = maxcol; ++ else if (r < 0) ++ r = 0; ++ ++ b = b + g0 - g; ++ if (b > (short) maxcol) ++ b = maxcol; ++ else if (b < 0) ++ b = 0; ++ ++ r0 = pic2_arith_get_number(pi, 48, r); ++ b0 = pic2_arith_get_number(pi, 64, b); ++ ++ pi->cache_pos[k] = j = (pi->cache_pos[k] - 1) & (PIC2_ARITH_CACHE - 1); ++ pi->cache[k][j] = cc = (r0 << (colbits * 2)) | (g0 << colbits) | b0; ++ } else { ++ pi->cache_hit_c = 15; ++ ++ j = pic2_arith_decode_nn(pi, 17); ++ m = pi->cache_pos[k]; ++ i = (m + j / 2) & (PIC2_ARITH_CACHE - 1); ++ j = (m + j) & (PIC2_ARITH_CACHE - 1); ++ ++ cc = pi->cache[k][j]; ++ pi->cache[k][j] = pi->cache[k][i]; ++ pi->cache[k][i] = pi->cache[k][m]; ++ pi->cache[k][m] = cc; ++ } ++ return (cc); ++} ++ ++static int pic2_arith_expand_line(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ int ymax; ++ int x, xw; ++ pixel cc; ++ ++ pic2_handle_para(pi, 0); ++ ++ xw = pi->block->x_wid; ++ ymax = pi->block->y_wid - 1; ++ ++ if (pi->ynow > ymax) ++ return (-2); /* end */ ++ ++ /* set right end of previous line before left end of current line. */ ++ if (pi->ynow == 0) { ++ cc = 0; ++ } else ++ cc = pi->vram_prev[xw - 1]; ++ pi->vram_now[-1] = cc; ++ ++ /* clear flag for change point */ ++ xvbzero((char *) pi->flag_next, xw * sizeof(pi->flag_next[0])); ++ ++ /* clear flag for position probability space */ ++ xvbzero((char *) pi->flag2_next2, xw * sizeof(pi->flag2_next2[0])); ++ ++ for (x = 0; x < xw; x++) { ++ if (pi->flag_now[x] < 0) { ++ cc = pi->vram_now[x]; ++ if (pi->ynow < ymax) ++ pic2_arith_expand_chain(pi, x, pi->ynow, cc); ++ } else if (pic2_arith_decode_bit(pi, pi->flag2_now[x])) { ++ /* ajust probability space around of change point */ ++ pi->flag2_now [x + 1]++; ++ pi->flag2_now [x + 2]++; ++ pi->flag2_next [x - 1]++; ++ pi->flag2_next [x ]++; ++ pi->flag2_next [x + 1]++; ++ pi->flag2_next2[x - 1]++; ++ pi->flag2_next2[x ]++; ++ pi->flag2_next2[x + 1]++; ++ ++ pi->vram_now[x] = cc = pic2_arith_read_color(pi, x); ++ if (pi->ynow < ymax) ++ pic2_arith_expand_chain(pi, x, pi->ynow, cc); ++ } else ++ pi->vram_now[x] = cc; ++ } ++ if (line != NULL) ++ *line = pi->vram_now; ++ pi->ynow++; ++ ++ pic2_handle_para(pi, 1); ++ ++ return (pi->ynow - 1); ++} ++ ++static int pic2_arith_loader_init(pi) ++struct pic2_info *pi; ++{ ++ unsigned short p2b[256]; ++ int i, xw; ++ ++ pi->ynow = 0; ++ ++ /* check the color depth */ ++ if (pi->header->depth % 3) ++ pic2_error(pi, PIC2_DEPTH); ++ ++ /* set function for extract next line */ ++ pi->next_line = pic2_arith_expand_line; ++ ++ /* clear cache and flags */ ++ xw = pi->block->x_wid; ++ xvbzero((char *) pi->cache, 8 * 8 * 8 * sizeof(pi->cache[0])); ++ xvbzero((char *) pi->cache_pos, 8 * 8 * 8 * sizeof(pi->cache_pos[0])); ++ ++ xvbzero((char *) pi->flag_now, xw * sizeof(pi->flag_now[0])); ++ xvbzero((char *) pi->flag2_now, 8 + xw * sizeof(pi->flag2_now[0])); ++ xvbzero((char *) pi->flag2_next, 8 + xw * sizeof(pi->flag2_next[0])); ++ ++ /* go to picture data field */ ++ pic2_seek_file(pi, pi->block_pos + PIC2_BLOCK_HEADER_SIZE, SEEK_SET); ++ ++ /* clear bit field marker */ ++ pi->bs.rest = 0; ++ pi->bs.cur = 0; ++ ++ /* read probability table */ ++ for (i = 0; i < PIC2_ARITH_CONTEXT; i++) ++ p2b[i] = pic2_read_short(pi); ++ ++ /* make multiplication table */ ++ for (i = 0; i < 16384; i++) { ++ pi->mulu_tab[i] = (long) (i / 128 + 128) * (int) p2b[i & 127] / 256; ++ if (pi->mulu_tab[i] == 0) pi->mulu_tab[i] = 1; ++ } ++ /* initialize some valuables */ ++ pi->aa = 0xffff; ++ pi->dd = 0; ++ for (i = 0; i < 16; i++) { ++ pi->dd *= 2; ++ if (pic2_read_bits(pi, 1)) ++ pi->dd |= 1; ++ } ++ pi->cache_hit_c = 16; ++ ++ return (0); ++} ++ ++/* ++ * These functions are fast pic2 compression extractor. ++ */ ++static int pic2_fast_read_length(pi) ++struct pic2_info *pi; ++{ ++ int a; ++ ++ a = 0; ++ while (pic2_read_bits(pi, 1)) { ++ a++; ++ } ++ if (a == 0) ++ return (0); ++ return (pic2_read_bits(pi, a) + (1 << a) - 1); ++} ++ ++static void pic2_fast_expand_chain(pi, x, cc) ++struct pic2_info *pi; ++int x; ++pixel cc; ++{ ++ if (pic2_read_bits(pi, 1) != 0) { ++ if (pic2_read_bits(pi, 1) != 0) { /* down */ ++ pi->vram_next[x] = cc; ++ pi->flag_next[x] = -1; ++ } else if (pic2_read_bits(pi, 1) != 0) { ++ if (pic2_read_bits(pi, 1) == 0) { /* left2down */ ++ pi->vram_next[x - 2] = cc; ++ pi->flag_next[x - 2] = -1; ++ } else { /* left1down */ ++ pi->vram_next[x - 1] = cc; ++ pi->flag_next[x - 1] = -1; ++ } ++ } else { ++ if (pic2_read_bits(pi, 1) == 0) { /* right2down */ ++ pi->vram_next[x + 2] = cc; ++ pi->flag_next[x + 2] = -1; ++ } else { /* left1down */ ++ pi->vram_next[x + 1] = cc; ++ pi->flag_next[x + 1] = -1; ++ } ++ } ++ } ++} ++ ++static pixel pic2_fast_read_color(pi, bc) ++struct pic2_info *pi; ++pixel bc; ++{ ++ pixel cc; ++ unsigned short j, k, m; ++ short depth, colbits; ++ pixel (*cache)[PIC2_FAST_CACHE]; ++ ++ depth = pi->header->depth; ++ colbits = depth / 3; ++ cache = (pixel (*)[PIC2_FAST_CACHE]) pi->cache; ++ ++ bc = pic2_exchange_rg(bc, colbits); ++ k = pic2_shift_bits(bc, 8 - depth); ++ if (pic2_read_bits(pi, 1) == 0) { ++ pi->cache_pos[k] = m = (pi->cache_pos[k] - 1) & (PIC2_FAST_CACHE - 1); ++ cc = pic2_read_bits(pi, depth); ++ cc = pic2_exchange_rg(cc, colbits); ++ cache[k][m] = cc; ++ } else { ++ j = pic2_read_bits(pi, 6); /* 6= log2(PIC2_FAST_CACHE) */ ++ m = pi->cache_pos[k]; ++ cc = cache[k][(m + j) & (PIC2_FAST_CACHE - 1)]; ++ } ++ return (cc); ++} ++ ++static int pic2_fast_expand_line(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ int ymax; ++ int x, xw; ++ pixel cc; ++ ++ pic2_handle_para(pi, 0); ++ ++ xw = pi->block->x_wid; ++ ymax = pi->block->y_wid - 1; ++ ++ if (pi->ynow > ymax) ++ return (-2); ++ ++ if (pi->ynow == 0) { ++ pi->dd = 0; ++ pi->aa = pic2_fast_read_length(pi); ++ if (pi->aa == 1023) ++ pi->dd = 1023; ++ else if (pi->aa > 1023) ++ pi->aa--; ++ cc = 0; ++ } else ++ cc = pi->vram_prev[xw - 1]; ++ ++ xvbzero((char *) pi->flag_next, xw * sizeof(pi->flag_next[0])); ++ ++ for (x = 0; x < xw; x++) { ++ if (pi->dd > 0) { ++ if (pi->flag_now[x] < 0) { /* on chain ? */ ++ cc = pi->vram_now[x]; ++ pic2_fast_expand_chain(pi, x, cc); ++ if (--pi->dd == 0) { ++ pi->aa = pic2_fast_read_length(pi); ++ if (pi->aa == 1023) ++ pi->dd = 1023; ++ else if (pi->aa > 1023) ++ pi->aa--; ++ } ++ } else ++ pi->vram_now[x] = cc; ++ } else { ++ if (pi->flag_now[x] < 0) { /* on chain ? */ ++ cc = pi->vram_now[x]; ++ pic2_fast_expand_chain(pi, x, cc); ++ } else if (--pi->aa < 0) { ++ cc = pi->vram_now[x] = pic2_fast_read_color(pi, cc); ++ pic2_fast_expand_chain(pi, x, cc); ++ pi->aa = pic2_fast_read_length(pi); ++ if (pi->aa == 1023) ++ pi->dd = 1023; ++ else if (pi->aa > 1023) ++ pi->aa--; ++ } else ++ pi->vram_now[x] = cc; ++ } ++ } ++ if (line != NULL) ++ *line = pi->vram_now; ++ pi->ynow++; ++ ++ pic2_handle_para(pi, 1); ++ ++ return (pi->ynow - 1); ++} ++ ++static int pic2_fast_loader_init(pi) ++struct pic2_info *pi; ++{ ++ int xw; ++ ++ pi->ynow = 0; ++ ++ /* check the color depth */ ++ if (pi->header->depth % 3) ++ pic2_error(pi, PIC2_DEPTH); ++ ++ /* set function for extract next line */ ++ pi->next_line = pic2_fast_expand_line; ++ ++ /* clear cache and flags */ ++ xw = pi->block->x_wid; ++ xvbzero((char *) pi->cache, sizeof(pi->cache[0]) * 256); ++ xvbzero((char *) pi->cache_pos, sizeof(pi->cache_pos[0]) * 8 * 8 * 8); ++ xvbzero((char *) pi->flag_now, (xw + 8) * sizeof(pi->flag_now[0])); ++ xvbzero((char *) pi->flag_next, (xw + 8) * sizeof(pi->flag_next[0])); ++ ++ /* go to picture data field */ ++ pic2_seek_file(pi, pi->block_pos + PIC2_BLOCK_HEADER_SIZE, SEEK_SET); ++ ++ /* clear bit field marker */ ++ pi->bs.rest = 0; ++ pi->bs.cur = 0; ++ ++ return (0); ++} ++ ++/* ++ * These functions are beta pic2 format extractor. ++ */ ++static int pic2_beta_expand_line(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ int i, xw, ymax; ++ byte a, b, c, *p; ++ pixel *pc; ++ short depth, pixbyte, colbits; ++ ++ depth = pi->header->depth; ++ pixbyte = depth / 8 + ((depth % 8) > 0); ++ colbits = depth / 3; ++ ++ xw = pi->block->x_wid; ++ ymax = pi->block->y_wid - 1; ++ ++ if (pi->ynow > ymax) ++ return (-2); /* end */ ++ ++ pc = pi->vram_now; ++ p = (byte *) pi->vram_prev; ++ if (pixbyte == 3) { ++ pic2_read_file(pi, pi->vram_prev, (size_t) (xw * pixbyte)); ++ for (i = 0; i < xw; i++, pc++) { ++ a = *p++; ++ b = *p++; ++ c = *p++; ++ *pc = ((pixel) a << 16) | ((pixel) b << 8) | (pixel) c; ++ } ++ } else if (pixbyte == 2) { ++ pic2_read_file(pi, pi->vram_prev, (size_t) (xw * 2)); ++ if (strncmp(pi->block->id, "P2BM", 4) == 0) { ++ for (i = 0; i < xw; i++, pc++) { ++ a = *p++; ++ b = *p++; ++ *pc = ((pixel) a << 8) | (pixel) b; ++ if (colbits == 5) { ++ *pc >>= 1; ++ *pc = pic2_exchange_rg(*pc, colbits); ++ } ++ } ++ } else { ++ for (i = 0; i < xw; i++, pc++) { ++ a = *p++; ++ b = *p++; ++ *pc = ((pixel) b << 8) | (pixel) a; ++ if (colbits == 5) { ++ *pc >>= 1; ++ *pc = pic2_exchange_rg(*pc, colbits); ++ } ++ } ++ } ++ } else { ++ pic2_read_file(pi, pi->vram_prev, (size_t) xw); ++ for (i = 0; i < xw; i++) ++ *pc++ = *p++; ++ } ++ if (line != NULL) ++ *line = pi->vram_now; ++ ++ pc = pi->vram_prev; ++ pi->vram_prev = pi->vram_now; ++ pi->vram_now = pi->vram_next; ++ pi->vram_next = pc; ++ ++ pi->ynow++; ++ return (pi->ynow - 1); ++} ++ ++static int pic2_beta_loader_init(pi) ++struct pic2_info *pi; ++{ ++ pi->ynow = 0; ++ pi->next_line = pic2_beta_expand_line; ++ pic2_seek_file(pi, pi->block_pos + PIC2_BLOCK_HEADER_SIZE, SEEK_SET); ++ return (0); ++} ++ ++/* ++ * Make a picture from the expanded data. ++ */ ++static void pic2_make_xvpic(pi, xp, rp, gp, bp) ++struct pic2_info *pi; ++byte **xp, *rp, *gp, *bp; ++{ ++ int line, i; ++ pixel *linep, opaque; ++ short colbits; ++ byte colmask; ++ ++ if (*xp == NULL) ++ *xp = pic2_new((size_t) pi->x_max * pi->y_max * 3, "pic2_make_xvpic"); // GRR POSSIBLE OVERFLOW / FIXME ++ ++ if (pi->block->flag & 1) ++ opaque = pi->block->opaque; ++ else ++ opaque = 0xffffffff; ++ ++ colbits = pi->header->depth / 3; ++ colmask = 0xff >> (8 - colbits); ++ ++ line = pic2_load_block(pi); ++ for (;;) { ++ int pic_idx; ++ ++ line = pic2_next_line(pi, &linep); ++ if (line < 0) ++ break; ++ pic_idx = ((line + pi->block->y_offset) * pi->x_max ++ + pi->block->x_offset) * 3; ++ ++ for (i = 0; i < pi->block->x_wid; i++, linep++) { ++ byte r, g, b; ++ ++ if (*linep != opaque) { ++ r = ((*linep >> (colbits * 2)) & colmask); ++ r = pic2_convert_color_bits(r, colbits, 8); ++ g = ((*linep >> colbits ) & colmask); ++ g = pic2_convert_color_bits(g, colbits, 8); ++ b = ( *linep & colmask); ++ b = pic2_convert_color_bits(b, colbits, 8); ++ (*xp)[pic_idx++] = r; ++ (*xp)[pic_idx++] = g; ++ (*xp)[pic_idx++] = b; ++ } else ++ pic_idx += 3; ++ ++ WaitCursor(); ++ } ++ } ++} ++ ++/* ++ * This function splits a multiblock PIC2 file into several pages. ++ */ ++static void pic2_make_pagefile(pi, pagebname, pnum) ++struct pic2_info *pi; ++char *pagebname; ++int pnum; ++{ ++ struct pic2_info pic2; ++ FILE *fp; ++ char pagefile[64], *buf; ++ size_t imagesize; ++ ++ sprintf(pagefile, "%s%d", pagebname, pnum); ++ if ((fp = fopen(pagefile, "wb")) == NULL) ++ pic2_error(pi, PIC2_WRITE); ++ ++ xvbcopy((char *) pi, (char *) &pic2, sizeof(struct pic2_info)); ++ pic2.fp = fp; ++ ++ pic2_write_header1(&pic2); ++ ++ pic2_write_block_header(&pic2); ++ ++ imagesize = pi->block->size - PIC2_BLOCK_HEADER_SIZE; ++ buf = (char *) pic2_malloc(imagesize, "pic2_make_pagefile"); ++ ++ pic2_seek_file(pi, pi->block_pos + PIC2_BLOCK_HEADER_SIZE, SEEK_SET); ++ if (fread(buf, (size_t) 1, imagesize, pi->fp) < imagesize) { ++ free(buf); ++ pic2_file_error(pi, PIC2_CORRUPT); ++ } ++ if (fwrite(buf, (size_t) 1, imagesize, fp) < imagesize) { ++ free(buf); ++ pic2_error(pi, PIC2_WRITE); ++ } ++ free(buf); ++ ++ pic2.next_pos = pic2_tell_file(&pic2); ++ pic2_write_header2(&pic2); ++ ++ fclose(fp); ++} ++ ++/* The main routine to save a PIC2 file. */ ++static int WritePIC2(fp, pic0, ptype, w, h, rmap, gmap, bmap, numcols, ++ colorstyle, fname, type, depth, x_offset, y_offset, ++ append, comment) ++FILE *fp; ++byte *pic0; ++int ptype, w, h; ++byte *rmap, *gmap, *bmap; ++int numcols, colorstyle; ++char *fname; ++int type, depth; ++int x_offset, y_offset; ++int append; ++char *comment; ++{ ++ struct pic2_info pic2; ++ char creator[256], title[256], saver[256]; ++ int e; ++ ++ if (DEBUG) ++ fputs("WritePIC2:\n", stderr); ++ ++ pic2_init_info(&pic2); ++ pic2.fp = fp; ++ pic2.writing_grey = (colorstyle == F_GREYSCALE); ++ ++ if ((e = setjmp(pic2.jmp)) != 0){ ++ /* When an error occurs while writing, comes here. */ ++ pic2_free_buffer(&pic2); ++ pic2_cleanup_pic2_info(&pic2, 1); ++ SetCursors(-1); ++ if (DEBUG) ++ fputs("\n", stderr); ++ return (-1); ++ } ++ sprintf(creator, "XV Version %s", VERSTR); ++ pic2_strncpy(title, comment, 30); ++ sprintf(saver, "XV %s/UNIX/Bradley", VERSTR); ++ ++ if (!append) { ++ pic2_setup_pic2_info(&pic2, creator, fname, title, saver, ++ 0, depth, 1, 1, w, h, comment); ++ pic2_write_header1(&pic2); ++ } else { ++ pic2_read_header(&pic2); ++ pic2_append(&pic2); ++ free(pic2.comment); ++ pic2_setup_pic2_info(&pic2, creator, fname, title, saver, ++ 0, depth, 1, 1, w, h, comment); ++ } ++ ++ pic2_write_data(&pic2, pic0, ptype, x_offset, y_offset, w, h, ++ rmap, gmap, bmap, type, depth); ++ pic2_write_header2(&pic2); ++ ++ pic2_cleanup_pic2_info(&pic2, 1); ++ SetCursors(-1); ++ if (DEBUG) ++ fputs("\n", stderr); ++ return (0); ++} ++ ++/* ++ * This function initializes pic2_info. ++ */ ++static void pic2_setup_pic2_info(pi, name, fname, title, saver, no, depth, ++ x_aspect, y_aspect, x_max, y_max, comment) ++struct pic2_info *pi; ++char *name, *fname, *title, *saver; ++int no, depth; ++int x_aspect, y_aspect; ++int x_max, y_max; ++char *comment; ++{ ++ char basename[256], *suffix; ++ ++ pi->mode = PIC2_WRITE_MODE; ++ ++ /* set magic number */ ++ strncpy(pi->header->magic, pic2_id, 4); ++ ++ /* set creator's name */ ++ pic2_strncpy(pi->header->name, (char *) name, 18); ++ ++ /* set title and subtitle */ ++ pic2_strncpy(pi->header->title, (char *) title, 30); ++ strcpy(basename, BaseName(fname)); ++ suffix = (char *) rindex(basename, '.'); ++ if (suffix) { ++ suffix++; ++ if (!strcmp(suffix, "p2") || !strcmp(suffix, "P2")) ++ *(suffix - 1) = '\0'; ++ } ++ pic2_strncpy(pi->header->subtitle, basename, 8); ++ ++ /* set saver */ ++ pic2_strncpy(pi->header->saver, saver, 30); ++ ++ /* set picture number */ ++ pi->header->no = no; ++ ++ /* import comment */ ++ pi->comment = comment; ++ ++ /* set some picture's info */ ++ pi->header->depth = depth; ++ pi->header->x_aspect = x_aspect; ++ pi->header->y_aspect = y_aspect; ++ pi->header->x_max = x_max; ++ pi->header->y_max = y_max; ++ ++ /* set some gaps */ ++ pi->header->crlf0[0] = pi->header->crlf1[0] = pi->header->crlf2[0] = 0x0d; ++ pi->header->crlf0[1] = pi->header->crlf1[1] = pi->header->crlf2[1] = 0x0a; ++ ++ pi->header->eof[0] = 0x1a; ++ pi->header->reserve0[0] = 0; ++ pi->header->reserve1 = 0; ++ ++ /* set palettes */ ++ if (pi->n_pal > 0) ++ pi->header->flag = 1; ++ else ++ pi->header->flag = 0; ++} ++ ++/* ++ * This function appends to existing pic2 file. ++ */ ++static void pic2_append(pi) ++struct pic2_info *pi; ++{ ++ int block; ++ ++ block = pic2_find_block(pi); ++ while (block > 0) ++ block = pic2_next_block(pi); ++ ++ if (block != 0) ++ pic2_error(pi, PIC2_APPEND); ++} ++ ++/* ++ * These functions write the PIC2 header. ++ * pic2_write_header1: ++ * write palette data and comment. ++ * pic2_write_header2: ++ * write the terminate block and rest header. ++ * pic2_write_block_header: ++ * write the block header. ++ */ ++static void pic2_write_header1(pi) ++struct pic2_info *pi; ++{ ++ char *comment; ++ ++ /* seek to block start position */ ++ pic2_seek_file(pi, PIC2_HEADER_SIZE, SEEK_SET); ++ ++ /* write palette */ ++ if (pi->n_pal > 0) { ++ pic2_write_char(pi, pi->pal_bits); ++ pic2_write_short(pi, pi->n_pal); ++ pic2_write_file(pi, pi->pal, (size_t) (pi->n_pal * 3)); ++ } ++ /* save comment */ ++ comment = pi->comment; ++ if (pi->comment != NULL) { ++ for (comment = pi->comment; *comment; comment++) { ++ if (*comment == '\n') { ++ pic2_write_char(pi, '\r'); ++ pic2_write_char(pi, '\n'); ++ } else if (*comment != '\r') ++ pic2_write_char(pi, *comment); ++ } ++ pic2_write_char(pi, 0); ++ } ++ /* set the next block position */ ++ pi->next_pos = pic2_tell_file(pi); ++ pi->header->size = pi->next_pos; ++} ++ ++static void pic2_write_header2(pi) ++struct pic2_info *pi; ++{ ++ pic2_seek_file(pi, pi->next_pos, SEEK_SET); ++ ++ /* write terminate block */ ++ pic2_write_long(pi, 0); ++ pic2_write_long(pi, 0); ++ ++ /* set some header information */ ++ if (pi->header->x_max < pi->x_max) ++ pi->header->x_max = pi->x_max; ++ if (pi->header->y_max < pi->x_max) ++ pi->header->y_max = pi->y_max; ++ ++ pi->header->time = time(NULL); ++ pic2_seek_file(pi, 0, SEEK_SET); ++ ++ /* write header image */ ++ pic2_write_file(pi, pi->header->magic, 4); ++ pic2_write_file(pi, pi->header->name, 18); ++ pic2_write_file(pi, pi->header->subtitle, 8); ++ pic2_write_file(pi, pi->header->crlf0, 2); ++ pic2_write_file(pi, pi->header->title, 30); ++ pic2_write_file(pi, pi->header->crlf1, 2); ++ pic2_write_file(pi, pi->header->saver, 30); ++ pic2_write_file(pi, pi->header->crlf2, 2); ++ pic2_write_file(pi, pi->header->eof, 1); ++ pic2_write_file(pi, pi->header->reserve0, 1); ++ pic2_write_short(pi, pi->header->flag); ++ pic2_write_short(pi, pi->header->no); ++ pic2_write_long(pi, pi->header->time); ++ pic2_write_long(pi, pi->header->size); ++ pic2_write_short(pi, pi->header->depth); ++ pic2_write_short(pi, pi->header->x_aspect); ++ pic2_write_short(pi, pi->header->y_aspect); ++ pic2_write_short(pi, pi->header->x_max); ++ pic2_write_short(pi, pi->header->y_max); ++ pic2_write_long(pi, pi->header->reserve1); ++} ++ ++static void pic2_write_block_header(pi) ++struct pic2_info *pi; ++{ ++ pic2_write_file(pi, pi->block->id, 4); ++ pic2_write_long(pi, pi->block->size); ++ pic2_write_short(pi, pi->block->flag); ++ pic2_write_short(pi, pi->block->x_wid); ++ pic2_write_short(pi, pi->block->y_wid); ++ pic2_write_short(pi, pi->block->x_offset); ++ pic2_write_short(pi, pi->block->y_offset); ++ pic2_write_long(pi, pi->block->opaque); ++ pic2_write_long(pi, pi->block->reserve); ++} ++ ++/* ++ * These functions implement the arithmetic-format compressor. ++ */ ++#define pic2_arith_write_one_bit(pi) (pi->bs.bits++) ++ ++static void pic2_arith_write_zero_bit(pi) ++struct pic2_info *pi; ++{ ++ if (pi->bs.zero) ++ pic2_write_bits(pi, 0, 1); ++ ++ while (pi->bs.bits--) ++ pic2_write_bits(pi, 1, 1); ++ ++ pi->bs.bits = 0; ++ pi->bs.zero = 1; ++} ++ ++static void pic2_arith_flush_bit_buf(pi) ++struct pic2_info *pi; ++{ ++ int i; ++ ++ for (i = 0; i < 16; i++) { ++ if (pi->cc & 0x8000) ++ pic2_arith_write_one_bit(pi); ++ else ++ pic2_arith_write_zero_bit(pi); ++ pi->cc <<= 1; ++ } ++ pic2_arith_write_zero_bit(pi); ++ pic2_flush_bits(pi); ++} ++ ++static void pic2_arith_carry_bit(pi) ++struct pic2_info *pi; ++{ ++ pic2_write_bits(pi, 1, 1); ++ ++ if (pi->bs.bits == 0) { ++ pi->bs.zero = 0; ++ } else { ++ while (--pi->bs.bits) ++ pic2_write_bits(pi, 0, 1); ++ pi->bs.zero = 1; ++ } ++} ++ ++static void pic2_arith_encode_bit(pi, n, c) ++struct pic2_info *pi; ++int n, c; ++{ ++ int pp; ++ long *c_sum, *c_0_sum; ++ ++ c_sum = (long *) pi->mulu_tab; ++ c_0_sum = c_sum + PIC2_ARITH_CONTEXT + 1; ++ ++ if (pi->dd == 0) { ++ c_sum[c]++; ++ if (n == 0) ++ c_0_sum[c]++; ++ return; ++ } ++ pp = pi->mulu_tab[(pi->aa & 0x7f00) / 2 + c]; ++ if (n != 0) { ++ pi->cc = pi->cc + pp; ++ if (pi->cc > 0xffff) { ++ pic2_arith_carry_bit(pi); ++ pi->cc = pi->cc & 0xffff; ++ } ++ pi->aa = pi->aa - pp; ++ while (pi->aa < 0x8000) { ++ if (pi->cc & 0x8000) ++ pic2_arith_write_one_bit(pi); ++ else ++ pic2_arith_write_zero_bit(pi); ++ pi->cc = (pi->cc * 2) & 0xffff; ++ pi->aa = pi->aa * 2; ++ } ++ } else { ++ pi->aa = pp; ++ ++ while (pi->aa < 0x8000) { ++ if (pi->cc & 0x8000) ++ pic2_arith_write_one_bit(pi); ++ else ++ pic2_arith_write_zero_bit(pi); ++ pi->cc = (pi->cc * 2) & 0xffff; ++ pi->aa = pi->aa * 2; ++ } ++ } ++} ++ ++static void pic2_arith_encode_nbyte(pi, n, c, max) ++struct pic2_info *pi; ++int n, c, max; ++{ ++ short i; ++ ++ for (i = 0; i < n; i++) { ++ pic2_arith_encode_bit(pi, 0, c + i); ++ } ++ if (n < max) ++ pic2_arith_encode_bit(pi, 1, c + n); ++} ++ ++static void pic2_arith_encode_nn(pi, n, c) ++struct pic2_info *pi; ++int n, c; ++{ ++ if (n < 1) { ++ pic2_arith_encode_bit(pi, 1, c); ++ } else if (n < 1 + 2) { ++ pic2_arith_encode_bit(pi, 0, c); ++ pic2_arith_encode_bit(pi, 1, c + 1); ++ n -= 1; ++ pic2_arith_encode_bit(pi, n & 1, c + 8); ++ } else if (n < 1 + 2 + 4) { ++ pic2_arith_encode_bit(pi, 0, c); ++ pic2_arith_encode_bit(pi, 0, c + 1); ++ pic2_arith_encode_bit(pi, 1, c + 2); ++ n -= 1 + 2; ++ pic2_arith_encode_bit(pi, n & 1, c + 8); ++ pic2_arith_encode_bit(pi, n & 2, c + 9); ++ } else if (n < 1 + 2 + 4 + 8) { ++ pic2_arith_encode_bit(pi, 0, c); ++ pic2_arith_encode_bit(pi, 0, c + 1); ++ pic2_arith_encode_bit(pi, 0, c + 2); ++ pic2_arith_encode_bit(pi, 1, c + 3); ++ n -= 1 + 2 + 4; ++ pic2_arith_encode_bit(pi, n & 1, c + 8); ++ pic2_arith_encode_bit(pi, n & 2, c + 9); ++ pic2_arith_encode_bit(pi, n & 4, c + 10); ++ } else if (n < 1 + 2 + 4 + 8 + 16) { ++ pic2_arith_encode_bit(pi, 0, c); ++ pic2_arith_encode_bit(pi, 0, c + 1); ++ pic2_arith_encode_bit(pi, 0, c + 2); ++ pic2_arith_encode_bit(pi, 0, c + 3); ++ pic2_arith_encode_bit(pi, 1, c + 4); ++ n -= 1 + 2 + 4 + 8; ++ pic2_arith_encode_bit(pi, n & 1, c + 8); ++ pic2_arith_encode_bit(pi, n & 2, c + 9); ++ pic2_arith_encode_bit(pi, n & 4, c + 10); ++ pic2_arith_encode_bit(pi, n & 8, c + 11); ++ } else if (n < 1 + 2 + 4 + 8 + 16 + 32) { ++ pic2_arith_encode_bit(pi, 0, c); ++ pic2_arith_encode_bit(pi, 0, c + 1); ++ pic2_arith_encode_bit(pi, 0, c + 2); ++ pic2_arith_encode_bit(pi, 0, c + 3); ++ pic2_arith_encode_bit(pi, 0, c + 4); ++ pic2_arith_encode_bit(pi, 1, c + 5); ++ n -= 1 + 2 + 4 + 8 + 16; ++ pic2_arith_encode_bit(pi, n & 1, c + 8); ++ pic2_arith_encode_bit(pi, n & 2, c + 9); ++ pic2_arith_encode_bit(pi, n & 4, c + 10); ++ pic2_arith_encode_bit(pi, n & 8, c + 11); ++ pic2_arith_encode_bit(pi, n & 16, c + 12); ++ } else if (n < 1 + 2 + 4 + 8 + 16 + 32 + 64) { ++ pic2_arith_encode_bit(pi, 0, c); ++ pic2_arith_encode_bit(pi, 0, c + 1); ++ pic2_arith_encode_bit(pi, 0, c + 2); ++ pic2_arith_encode_bit(pi, 0, c + 3); ++ pic2_arith_encode_bit(pi, 0, c + 4); ++ pic2_arith_encode_bit(pi, 0, c + 5); ++ pic2_arith_encode_bit(pi, 1, c + 6); ++ n -= 1 + 2 + 4 + 8 + 16 + 32; ++ pic2_arith_encode_bit(pi, n & 1, c + 8); ++ pic2_arith_encode_bit(pi, n & 2, c + 9); ++ pic2_arith_encode_bit(pi, n & 4, c + 10); ++ pic2_arith_encode_bit(pi, n & 8, c + 11); ++ pic2_arith_encode_bit(pi, n & 16, c + 12); ++ pic2_arith_encode_bit(pi, n & 32, c + 13); ++ } else if (n < 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128) { ++ pic2_arith_encode_bit(pi, 0, c); ++ pic2_arith_encode_bit(pi, 0, c + 1); ++ pic2_arith_encode_bit(pi, 0, c + 2); ++ pic2_arith_encode_bit(pi, 0, c + 3); ++ pic2_arith_encode_bit(pi, 0, c + 4); ++ pic2_arith_encode_bit(pi, 0, c + 5); ++ pic2_arith_encode_bit(pi, 0, c + 6); ++ pic2_arith_encode_bit(pi, 1, c + 7); ++ n -= 1 + 2 + 4 + 8 + 16 + 32 + 64; ++ pic2_arith_encode_bit(pi, n & 1, c + 8); ++ pic2_arith_encode_bit(pi, n & 2, c + 9); ++ pic2_arith_encode_bit(pi, n & 4, c + 10); ++ pic2_arith_encode_bit(pi, n & 8, c + 11); ++ pic2_arith_encode_bit(pi, n & 16, c + 12); ++ pic2_arith_encode_bit(pi, n & 32, c + 13); ++ pic2_arith_encode_bit(pi, n & 64, c + 14); ++ } else { ++ pic2_arith_encode_bit(pi, 0, c); ++ pic2_arith_encode_bit(pi, 0, c + 1); ++ pic2_arith_encode_bit(pi, 0, c + 2); ++ pic2_arith_encode_bit(pi, 0, c + 3); ++ pic2_arith_encode_bit(pi, 0, c + 4); ++ pic2_arith_encode_bit(pi, 0, c + 5); ++ pic2_arith_encode_bit(pi, 0, c + 6); ++ pic2_arith_encode_bit(pi, 0, c + 7); ++ } ++} ++ ++static void pic2_arith_press_chain(pi, x) ++struct pic2_info *pi; ++int x; ++{ ++ int b, d; ++ pixel c; ++ ++ b = -(pi->flag_now[x]); ++ c = pi->vram_now[x]; ++ d = 0; ++ ++ if (b < 0) ++ b = 0; ++ ++ if (pi->flag_next[x] == 1 && pi->vram_next[x] == c) { ++ d = 1; ++ pi->flag_next[x] = -1; ++ } else if (pi->flag_next[x - 1] == 1 && pi->vram_next[x - 1] == c) { ++ d = 2; ++ pi->flag_next[x - 1] = -2; ++ } else if (pi->flag_next[x + 1] == 1 && pi->vram_next[x + 1] == c) { ++ d = 3; ++ pi->flag_next[x + 1] = -3; ++ } else if (pi->flag_next[x - 2] == 1 && pi->vram_next[x - 2] == c) { ++ d = 4; ++ pi->flag_next[x - 2] = -4; ++ } else if (pi->flag_next[x + 2] == 1 && pi->vram_next[x + 2] == c) { ++ if ((pi->flag_now[x + 2] != 0 && pi->vram_now[x + 2] == c) ++ || (pi->flag_now[x + 1] != 0 && pi->vram_now[x + 1] == c) ++ || (pi->flag_now[x + 3] != 0 && pi->vram_now[x + 3] == c)) { ++ pic2_arith_encode_nbyte(pi, 0, 80 + 6 * b, 5); ++ return; ++ } ++ d = 5; ++ pi->flag_next[x + 2] = -5; ++ } ++ pic2_arith_encode_nbyte(pi, d, 80 + 6 * b, 5); ++} ++ ++static void pic2_arith_put_number(pi, xn, xa, xb) ++struct pic2_info *pi; ++int xn, xa, xb; ++{ ++ short n; ++ byte maxcol; ++ ++ maxcol = 0xff >> (8 - pi->header->depth / 3); ++ ++ if (xa > ((int) maxcol >> 1)) { ++ if (xb > xa) ++ n = (xb - xa) * 2 - 1; ++ else if (xa - ((int) maxcol - xa) > xb) ++ n = maxcol - xb; ++ else ++ n = (xa - xb) * 2; ++ } else { ++ if (xb <= xa) ++ n = (xa - xb) * 2; ++ else if (2 * xa < xb) ++ n = xb; ++ else ++ n = (xb - xa) * 2 - 1; ++ } ++ pic2_arith_encode_nn(pi, n, xn); ++} ++ ++static void pic2_arith_write_color(pi, x) ++struct pic2_info *pi; ++int x; ++{ ++ pixel c1, c2, cc; ++ short g0, r0, b0, r, g, b; ++ int i, j; ++ unsigned short k; ++ pixel *p, *pp; ++ short colbits; ++ pixel rmask, gmask, bmask; ++ byte maxcol; ++ ++ colbits = pi->header->depth / 3; ++ rmask = (0xff >> (8 - colbits)) << (colbits * 2); ++ gmask = (0xff >> (8 - colbits)) << colbits; ++ bmask = (0xff >> (8 - colbits)); ++ maxcol = (byte) bmask; ++ ++ cc = pi->vram_now[x]; ++ c1 = pi->vram_prev[x]; ++ k = ((c1 >> ((colbits - 3) * 3)) & 0x1c0) ++ | ((c1 >> ((colbits - 3) * 2)) & 0x038) ++ | ((c1 >> (colbits - 3) ) & 0x007); ++ if (colbits == 5) ++ k = pic2_exchange_rg(k, 3); ++ ++ p = pi->cache[k]; ++ for (i = 0; i < (PIC2_ARITH_CACHE - 1); i++) { ++ if (cc == *p++) ++ break; ++ } ++ if (i == (PIC2_ARITH_CACHE - 1)) { ++ pp = p - 1; ++ for (j = i; j > 0; j--) { ++ *--p = *--pp; ++ } ++ pi->cache[k][0] = cc; ++ pic2_arith_encode_bit(pi, 1, pi->cache_hit_c); ++ pi->cache_hit_c = 16; ++ ++ c2 = pi->vram_now[x - 1]; ++ r = ((c1 & rmask) + (c2 & rmask)) >> (colbits * 2 + 1); ++ g = ((c1 & gmask) + (c2 & gmask)) >> (colbits + 1); ++ b = ((c1 & bmask) + (c2 & bmask)) >> ( 1); ++ ++ r0 = (cc >> (colbits * 2)) & maxcol; ++ g0 = (cc >> colbits ) & maxcol; ++ b0 = cc & maxcol; ++ ++ r = r + g0 - g; ++ if (r < 0) ++ r = 0; ++ else if (r > (short) maxcol) ++ r = maxcol; ++ ++ b = b + g0 - g; ++ if (b < 0) ++ b = 0; ++ else if (b > (short) maxcol) ++ b = maxcol; ++ ++ pic2_arith_put_number(pi, 32, g, g0); ++ pic2_arith_put_number(pi, 48, r, r0); ++ pic2_arith_put_number(pi, 64, b, b0); ++ } else { ++ *--p = pi->cache[k][i / 2]; ++ pi->cache[k][i / 2] = pi->cache[k][0]; ++ pi->cache[k][0] = cc; ++ ++ pic2_arith_encode_bit(pi, 0, pi->cache_hit_c); ++ pi->cache_hit_c = 15; ++ pic2_arith_encode_nn(pi, i, 17); ++ } ++} ++ ++static void pic2_arith_press_line2(pi) ++struct pic2_info *pi; ++{ ++ int x, xw, ymax; ++ pixel cc; ++ ++ xw = pi->block->x_wid; ++ ymax = pi->block->y_wid -1; ++ cc = pi->vram_now[xw - 1]; /* last color */ ++ pi->vram_next[-1] = cc; ++ ++ /* mark change point */ ++ for (x = 0; x < xw; x++) ++ if (cc != pi->vram_next[x]) { ++ pi->flag_next[x] = 1; ++ cc = pi->vram_next[x]; ++ } else ++ pi->flag_next[x] = 0; ++ ++ for (x = 0; x < xw; x++) { ++ if (pi->flag_now[x] == 1) { /* change point */ ++ pi->flag2_now [x + 1]++; ++ pi->flag2_now [x + 2]++; ++ pi->flag2_next [x - 1]++; ++ pi->flag2_next [x ]++; ++ pi->flag2_next [x + 1]++; ++ pi->flag2_next2[x - 1]++; ++ pi->flag2_next2[x ]++; ++ pi->flag2_next2[x + 1]++; ++ ++ /* write change point */ ++ pic2_arith_encode_bit(pi, 1, pi->flag2_now[x]); ++ ++ /* write color */ ++ pic2_arith_write_color(pi, x); ++ ++ /* if not last line, write chain */ ++ if (pi->ynow - 1 < ymax) ++ pic2_arith_press_chain(pi, x); ++ } else if (pi->flag_now[x] == 0) /* not on chain */ ++ /* write change point */ ++ pic2_arith_encode_bit(pi, 0, pi->flag2_now[x]); ++ else /* on chain */ ++ /* if not on last line, write next chain */ ++ if (pi->ynow - 1 < ymax) ++ pic2_arith_press_chain(pi, x); ++ } ++} ++ ++static int pic2_arith_press_line(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ int i, xw, ymax; ++ long *c_sum, *c_0_sum; ++ ++ xw = pi->block->x_wid; ++ ymax = pi->block->y_wid -1; ++ c_sum = (long *) pi->mulu_tab; ++ c_0_sum = c_sum + PIC2_ARITH_CONTEXT +1; ++ ++ pic2_handle_para(pi, 0); ++ ++ xvbzero((char *) pi->flag2_next2 - 4, ++ (8 + xw) * sizeof(pi->flag2_next2[0])); ++ ++ if (pi->ynow == 0) { /* first line */ ++ int x; ++ pixel cc = 0; ++ ++ if (pi->dd != 0) { /* compress pass */ ++ unsigned short c_tab[PIC2_ARITH_CONTEXT]; ++ ++ for (i = 0; i < PIC2_ARITH_CONTEXT; i++) { ++ unsigned long a, b; ++ a = c_0_sum[i]; ++ b = c_sum[i]; ++ while (a > 32767) { ++ a /= 2; ++ b /= 2; ++ } ++ if (a == b) ++ c_tab[i] = 0xffff; /* b==0 here, too */ ++ else ++ c_tab[i] = (65536 * a) / b; /* a < b, so less 65536 */ ++ } ++ for (i = 0; i < 16384; i++) { ++ pi->mulu_tab[i] = (long) (i / 128 + 128) * (int) c_tab[i & 127] / 256; ++ if (pi->mulu_tab[i] == 0) ++ pi->mulu_tab[i] = 1; /* 0 is wrong */ ++ } ++ for (i = 0; i < PIC2_ARITH_CONTEXT; i++) ++ pic2_write_short(pi, c_tab[i]); ++ ++ xvbzero((char *) pi->vram_now, xw * sizeof(pi->vram_now[0])); ++ } else { /* statistical pass */ ++ xvbzero((char *) c_0_sum, PIC2_ARITH_CONTEXT * sizeof(c_0_sum[0])); ++ xvbzero((char *) c_sum, PIC2_ARITH_CONTEXT * sizeof(c_sum[0])); ++ } ++ ++ /* initialize flags */ ++ xvbzero((char *) pi->cache, 8 * 8 * 8 * sizeof(pi->cache[0])); ++ xvbzero((char *) pi->cache_pos, 8 * 8 * 8 * sizeof(pi->cache_pos[0])); ++ ++ xvbzero((char *) pi->flag2_next - 4, ++ (8 + xw) * sizeof(pi->flag2_next[0])); ++ xvbzero((char *) pi->flag2_next2 - 4, ++ (8 + xw) * sizeof(pi->flag2_next2[0])); ++ ++ pi->vram_next[-1] = cc; ++ for (x = 0; x < xw; x++) ++ if (cc != pi->vram_next[x]) { ++ pi->flag_next[x] = 1; ++ cc = pi->vram_next[x]; ++ } else ++ pi->flag_next[x] = 0; ++ ++ pi->aa = 0xffff; ++ cc = 0; ++ pi->cache_hit_c = 16; ++ } else /* after second line */ ++ pic2_arith_press_line2(pi); ++ ++ if (pi->ynow == ymax) { ++ pi->ynow++; ++ pic2_handle_para(pi, 1); ++ pic2_handle_para(pi, 0); ++ pic2_arith_press_line2(pi); ++ } ++ /* line buffer for next data */ ++ if (line != NULL) ++ *line = pi->vram_prev; ++ ++ pi->ynow++; ++ ++ if (pi->ynow - 1 < ymax) { ++ pic2_handle_para(pi, 1); ++ return (pi->ynow); ++ } else { /* end */ ++ if (pi->dd == 0) { /* statistical pass */ ++ pi->dd = 1; ++ pi->ynow = 0; ++ pic2_handle_para(pi, 1); ++ return (0); ++ } else { ++ pic2_handle_para(pi, 1); ++ pic2_arith_flush_bit_buf(pi); ++ return (-2); /* end */ ++ } ++ } ++} ++ ++static int pic2_arith_saver_init(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ pi->ynow = 0; ++ ++ /* check the color depth */ ++ if (pi->header->depth % 3) ++ pic2_error(pi, PIC2_DEPTH); ++ ++ /* set next line function */ ++ pi->next_line = pic2_arith_press_line; ++ ++ if (line != NULL) ++ *line = pi->vram_next + 4; ++ ++ pic2_seek_file(pi, pi->next_pos + PIC2_BLOCK_HEADER_SIZE, SEEK_SET); ++ ++ /* clear bit field marker */ ++ pi->bs.rest = 0; ++ pi->bs.cur = 0; ++ pi->bs.zero = 0; ++ pi->bs.bits = 0; ++ ++ return (0); ++} ++ ++/* ++ * These functions are fast pic2 format compressor. ++ */ ++static void pic2_fast_write_length(pi, n) ++struct pic2_info *pi; ++int n; ++{ ++ int a, b; ++ static const unsigned short len_data[8][2] = { ++ {1, 0}, ++ {1, 0}, ++ {3, 4}, ++ {3, 5}, ++ {5, 24}, ++ {5, 25}, ++ {5, 26}, ++ {5, 27}, ++ }; ++ ++ n++; ++ if (n < 8) ++ pic2_write_bits(pi, len_data[n][1], len_data[n][0]); ++ else { ++ a = 0; ++ b = 2; ++ while (n > b - 1) { ++ a = a + 1; ++ b = b * 2; ++ } ++ pic2_write_bits(pi, 0xfffffffe, a + 1); ++ if (a > 0) ++ pic2_write_bits(pi, n - b / 2, a); ++ } ++} ++ ++static void pic2_fast_press_chain(pi, x) ++struct pic2_info *pi; ++int x; ++{ ++ int ymax; ++ pixel cc; ++ ++ ymax = pi->block->y_wid -1; ++ cc = pi->vram_now[x]; ++ ++ if (pi->ynow - 1 == ymax) { ++ pic2_write_bits(pi, 0, 1); ++ return; ++ } ++ if (pi->flag_next[x] == 1 && pi->vram_next[x] == cc) { ++ pi->flag_next[x] = -1; ++ pic2_write_bits(pi, 3, 2); ++ } else if (pi->flag_next[x - 1] == 1 && pi->vram_next[x - 1] == cc) { ++ pi->flag_next[x - 1] = -1; ++ pic2_write_bits(pi, 11, 4); ++ } else if (pi->flag_next[x + 1] == 1 && pi->vram_next[x + 1] == cc) { ++ pi->flag_next[x + 1] = -1; ++ pic2_write_bits(pi, 9, 4); ++ } else if (pi->flag_next[x - 2] == 1 && pi->vram_next[x - 2] == cc) { ++ pi->flag_next[x - 2] = -1; ++ pic2_write_bits(pi, 10, 4); ++ } else if ((pi->flag_next[x + 2] == 1 && pi->vram_next[x + 2] == cc) ++ && !(pi->flag_now[x + 2] != 0 && pi->vram_now[x + 2] == cc)) { ++ pi->flag_next[x + 2] = -1; ++ pic2_write_bits(pi, 8, 4); ++ } else ++ pic2_write_bits(pi, 0, 1); ++} ++ ++static void pic2_fast_press_chain2(pi, x) ++struct pic2_info *pi; ++int x; ++{ ++ int ymax; ++ pixel cc; ++ char *chain_buff; ++ ++ ymax = pi->block->y_wid -1; ++ chain_buff = (char *) pi->mulu_tab; ++ cc = pi->vram_now[x]; ++ ++ if (pi->ynow - 1 == ymax) { ++ chain_buff[pi->cc++] = 0; ++ return; ++ } ++ if (pi->flag_next[x] == 1 && pi->vram_next[x] == cc) { ++ pi->flag_next[x] = -1; ++ chain_buff[pi->cc++] = 1; ++ } else if (pi->flag_next[x - 1] == 1 && pi->vram_next[x - 1] == cc) { ++ pi->flag_next[x - 1] = -1; ++ chain_buff[pi->cc++] = 2; ++ } else if (pi->flag_next[x + 1] == 1 && pi->vram_next[x + 1] == cc) { ++ pi->flag_next[x + 1] = -1; ++ chain_buff[pi->cc++] = 3; ++ } else if (pi->flag_next[x - 2] == 1 && pi->vram_next[x - 2] == cc) { ++ pi->flag_next[x - 2] = -1; ++ chain_buff[pi->cc++] = 4; ++ } else if ((pi->flag_next[x + 2] == 1 && pi->vram_next[x + 2] == cc) ++ && !(pi->flag_now[x + 2] != 0 && pi->vram_now[x + 2] == cc)) { ++ pi->flag_next[x + 2] = -1; ++ chain_buff[pi->cc++] = 5; ++ } else ++ chain_buff[pi->cc++] = 0; ++} ++ ++static void pic2_fast_flush_chain(pi) ++struct pic2_info *pi; ++{ ++ int i; ++ char *chain_buf; ++ ++ chain_buf = (char *) pi->mulu_tab; ++ for (i = 0; i < pi->cc; i++){ ++ switch (chain_buf[i]) { ++ case 0: ++ pic2_write_bits(pi, 0, 1); ++ break; ++ case 1: ++ pic2_write_bits(pi, 3, 2); ++ break; ++ case 2: ++ pic2_write_bits(pi, 11, 4); ++ break; ++ case 3: ++ pic2_write_bits(pi, 9, 4); ++ break; ++ case 4: ++ pic2_write_bits(pi, 10, 4); ++ break; ++ case 5: ++ pic2_write_bits(pi, 8, 4); ++ break; ++ } ++ } ++ pi->cc = 0; ++} ++ ++static void pic2_fast_write_color(pi, x) ++struct pic2_info *pi; ++int x; ++{ ++ pixel cc, bc; ++ unsigned short j, k, m; ++ short depth, colbits; ++ pixel (*cache)[PIC2_FAST_CACHE]; ++ ++ depth = pi->header->depth; ++ colbits = depth / 3; ++ cache = (pixel (*)[PIC2_FAST_CACHE]) pi->cache; ++ ++ bc = pi->vram_now[x - 1]; ++ bc = pic2_exchange_rg(bc, colbits); ++ k = pic2_shift_bits(bc, 8 - depth); ++ cc = pi->vram_now[x]; ++ m = pi->cache_pos[k]; ++ ++ for (j = 0; j < PIC2_FAST_CACHE; j++) ++ if (cache[k][(m + j) & (PIC2_FAST_CACHE - 1)] == cc) ++ break; ++ ++ if (j == PIC2_FAST_CACHE) { ++ m = (m - 1) & (PIC2_FAST_CACHE - 1); ++ pi->cache_pos[k] = m; ++ cache[k][m] = cc; ++ ++ cc = pic2_exchange_rg(cc, colbits); ++ pic2_write_bits(pi, 0, 1); ++ pic2_write_bits(pi, cc, depth); ++ } else { ++ pic2_write_bits(pi, 1, 1); ++ pic2_write_bits(pi, j, 6); ++ } ++} ++ ++static void pic2_fast_press_line2(pi) ++struct pic2_info *pi; ++{ ++ int x, xw; ++ pixel cc; ++ ++ xw = pi->block->x_wid; ++ cc = pi->vram_now[xw - 1]; /* last color */ ++ pi->vram_next[-1] = cc; ++ ++ /* mark change point */ ++ for (x = 0; x < xw; x++) ++ if (cc != pi->vram_next[x]) { ++ pi->flag_next[x] = 1; ++ cc = pi->vram_next[x]; ++ } else ++ pi->flag_next[x] = 0; ++ ++ for (x = 0; x < xw; x++) ++ if (pi->flag_now[x] == 1) { /* change point */ ++ if (pi->aa >= 1023) ++ pi->aa++; ++ pic2_fast_write_length(pi, pi->aa); ++ pic2_fast_flush_chain(pi); ++ pi->aa = 0; ++ pic2_fast_write_color(pi, x); ++ pic2_fast_press_chain(pi, x); ++ } else if (pi->flag_now[x] == 0) { ++ pi->aa++; ++ } else { ++ pic2_fast_press_chain2(pi, x); ++ if (pi->cc == 1023) { ++ pic2_fast_write_length(pi, 1023); ++ pic2_fast_flush_chain(pi); ++ pi->aa = 0; ++ } ++ } ++} ++ ++static int pic2_fast_press_line(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ int xw, ymax; ++ ++ xw = pi->block->x_wid; ++ ymax = pi->block->y_wid -1; ++ ++ pic2_handle_para(pi, 0); ++ ++ if (pi->ynow == 0) { /* first line */ ++ int x; ++ pixel cc = 0; ++ ++ /* initialize flags */ ++ xvbzero((char *) pi->cache, 256 * sizeof(pi->cache[0])); ++ xvbzero((char *) pi->cache_pos, ++ PIC2_FAST_CACHE * sizeof(pi->cache_pos[0])); ++ ++ /* mark change point */ ++ pi->vram_next[-1] = cc; ++ for (x = 0; x < xw; x++) ++ if (cc != pi->vram_next[x]) { ++ pi->flag_next[x] = 1; ++ cc = pi->vram_next[x]; ++ } else ++ pi->flag_next[x] = 0; ++ ++ pi->cc = 0; ++ pi->aa = 0; ++ } else /* after second line */ ++ pic2_fast_press_line2(pi); ++ ++ if (pi->ynow == ymax) { ++ pi->ynow++; ++ pic2_handle_para(pi, 1); ++ pic2_handle_para(pi, 0); ++ pic2_fast_press_line2(pi); ++ } ++ /* line buffer for next data */ ++ if (line != NULL) ++ *line = pi->vram_prev; ++ ++ pi->ynow++; ++ ++ if (pi->ynow - 1 < ymax) { ++ pic2_handle_para(pi, 1); ++ return (pi->ynow); ++ } else { /* end */ ++ pic2_handle_para(pi, 1); ++ if (pi->aa >= 1023) ++ pi->aa++; ++ pic2_fast_write_length(pi, pi->aa); ++ pic2_fast_flush_chain(pi); ++ return (-2); /* end */ ++ } ++} ++ ++static int pic2_fast_saver_init(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ pi->ynow = 0; ++ ++ /* check the color depth */ ++ if (pi->header->depth % 3) ++ pic2_error(pi, PIC2_DEPTH); ++ ++ /* set next line function */ ++ pi->next_line = pic2_fast_press_line; ++ if (line != NULL) ++ *line = pi->vram_next + 4; ++ ++ pic2_seek_file(pi, pi->next_pos + PIC2_BLOCK_HEADER_SIZE, SEEK_SET); ++ ++ /* clear bit field marker */ ++ pi->bs.rest = 0; ++ pi->bs.cur = 0; ++ ++ return (0); ++} ++ ++/* ++ * These functions are beta pic2 format compressor. ++ */ ++static int pic2_beta_press_line(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ int i, xw, ymax; ++ byte *p; ++ pixel *pc; ++ short depth, pixbyte, colbits; ++ ++ depth = pi->header->depth; ++ pixbyte = depth / 8 + ((depth % 8) > 0); ++ colbits = depth / 3; ++ ++ xw = pi->block->x_wid; ++ ymax = pi->block->y_wid - 1; ++ ++ pc = pi->vram_now; ++ p = (byte *) pi->vram_prev; ++ if (pixbyte == 3) { ++ for (i = 0; i < xw; i++, pc++) { ++ *p++ = *pc >> 16; ++ *p++ = *pc >> 8; ++ *p++ = *pc; ++ } ++ pic2_write_file(pi, pi->vram_prev, (size_t) (xw * 3)); ++ } else if (pixbyte == 2) { ++ if (strncmp(pi->block->id, "P2BM", 4) == 0) ++ for (i = 0; i < xw; i++, pc++) { ++ if (colbits == 5) { ++ *pc = pic2_exchange_rg(*pc, colbits); ++ *pc <<= 1; ++ } ++ *p++ = *pc >> 8; ++ *p++ = *pc; ++ } ++ else ++ for (i = 0; i < xw; i++, pc++) { ++ if (colbits == 5) { ++ *pc = pic2_exchange_rg(*pc, colbits); ++ *pc <<= 1; ++ } ++ *p++ = *pc; ++ *p++ = *pc >> 8; ++ } ++ pic2_write_file(pi, pi->vram_prev, (size_t) (xw * 2)); ++ } else { ++ for (i = 0; i < xw; i++, pc++) ++ *p++ = *pc; ++ pic2_write_file(pi, pi->vram_prev, (size_t) xw); ++ } ++ if (line != NULL) ++ *line = pi->vram_now; ++ ++ pi->ynow++; ++ if (pi->ynow > ymax) ++ return (-2); ++ return (pi->ynow); ++} ++ ++static int pic2_beta_saver_init(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ pi->ynow = 0; ++ ++ *line = pi->vram_now; ++ pi->next_line = pic2_beta_press_line; ++ pic2_seek_file(pi, pi->next_pos + PIC2_BLOCK_HEADER_SIZE, SEEK_SET); ++ return (0); ++} ++ ++/* ++ * This function saves compressed data. ++ */ ++static void pic2_write_data(pi, data, ptype, x_offset, y_offset, w, h, ++ rmap, gmap, bmap, type, depth) ++struct pic2_info *pi; ++byte *data; ++int ptype; ++int x_offset, y_offset; ++int w, h; ++byte *rmap, *gmap, *bmap; ++int type, depth; ++{ ++ int i, line; ++ pixel *linep; ++ short colbits; ++ ++ colbits = pi->header->depth / 3; ++ ++ line = pic2_save_block(pi, &linep, x_offset, y_offset, w, h, ++ form_tab[type].id, 0xffffffff); ++ while (line >= 0) { ++ byte r, g, b; ++ int pic_idx; ++ ++ pic_idx = line * w * ((ptype == PIC24) ? 3 : 1); ++ ++ for (i = 0; i < w; i++) { ++ if (ptype != PIC24) { ++ r = rmap[data[pic_idx]]; ++ g = gmap[data[pic_idx]]; ++ b = bmap[data[pic_idx]]; ++ pic_idx++; ++ } else { ++ r = data[pic_idx++]; ++ g = data[pic_idx++]; ++ b = data[pic_idx++]; ++ } ++ if (pi->writing_grey) ++ r = g = b = MONO(r, g, b); ++ ++ r = pic2_convert_color_bits(r, 8, colbits); ++ g = pic2_convert_color_bits(g, 8, colbits); ++ b = pic2_convert_color_bits(b, 8, colbits); ++ ++ linep[i] = ((pixel) r << (colbits * 2)) ++ | ((pixel) g << colbits ) ++ | ((pixel) b ); ++ } ++ line = pic2_next_line(pi, &linep); ++ WaitCursor(); ++ } ++} ++ ++/* ++ * This function compresses/extracts one line buffer. ++ */ ++static int pic2_next_line(pi, line) ++struct pic2_info *pi; ++pixel **line; ++{ ++ int res; ++ ++ res = pi->next_line(pi, line); ++ if (res == -2) { ++ if (pi->mode == PIC2_WRITE_MODE) { ++ long new_pos; ++ ++ new_pos = pic2_tell_file(pi); ++ pi->block->size = new_pos - pi->next_pos; ++ pic2_seek_file(pi, pi->next_pos, SEEK_SET); ++ pic2_write_block_header(pi); ++ pi->next_pos = new_pos; ++ if (DEBUG) ++ pic2_show_pic2_info(pi); ++ } ++ pic2_free_buffer(pi); ++ } ++ return (res); ++} ++ ++/* ++ * These functions find the pic2 image block. ++ * pic2_next_block: ++ * moves the file pointer to the next image block. ++ * pic2_find_block: ++ * finds the first image block and moves the file pointer there. ++ */ ++static int pic2_next_block(pi) ++struct pic2_info *pi; ++{ ++ int i; ++ ++ if (pi->mode != PIC2_READ_MODE) ++ return (-1); ++ ++ /* go to block for read */ ++ pic2_seek_file(pi, pi->next_pos, SEEK_SET); ++ ++ /* read the head of block header */ ++ pic2_read_block_header1(pi); ++ ++ /* end block ? */ ++ if (pi->block->id[0] == 0) ++ return (0); ++ ++ /* set current block */ ++ pi->block_pos = pi->next_pos; ++ ++ /* set next block */ ++ pi->next_pos += pi->block->size; ++ ++ /* check block id */ ++ for (i = 0; i < n_form_tab; i++) { ++ if (xvbcmp(pi->block->id, form_tab[i].id, (size_t) 4) == 0) ++ break; ++ } ++ if (i == n_form_tab) ++ return (2); ++ ++ /* read the rest of block header */ ++ pic2_read_block_header2(pi); ++ ++ if (pi->block->x_offset + pi->block->x_wid > pi->x_max) ++ pi->x_max = pi->block->x_offset + pi->block->x_wid; ++ ++ if (pi->block->y_offset + pi->block->y_wid > pi->y_max) ++ pi->y_max = pi->block->y_offset + pi->block->y_wid; ++ ++ if (DEBUG) ++ pic2_show_pic2_info(pi); ++ return (1); ++} ++ ++static int pic2_find_block(pi) ++struct pic2_info *pi; ++{ ++ if (pi->mode != PIC2_READ_MODE) ++ return (-1); ++ ++ pi->next_pos = pi->header->size; ++ return (pic2_next_block(pi)); ++} ++ ++/* ++ * These functions load/save the pic2 image block. ++ * pic2_load_block: ++ * initializes loader information with current block information. ++ * pic2_save_block: ++ * initializes saver information. ++ */ ++static int pic2_load_block(pi) ++struct pic2_info *pi; ++{ ++ int i; ++ ++ for (i = 0; i < n_form_tab; i++) { ++ if (xvbcmp(pi->block->id, form_tab[i].id, (size_t) 4) == 0) ++ break; ++ } ++ if (i == n_form_tab) ++ return (2); ++ ++ pic2_alloc_buffer(pi); ++ return (form_tab[i].loader_init(pi)); ++} ++ ++static int pic2_save_block(pi, line, x, y, xw, yw, id, opaque) ++struct pic2_info *pi; ++pixel **line; ++int x, y, xw, yw; ++char *id; ++pixel opaque; ++{ ++ int i; ++ ++ for (i = 0; i < n_form_tab; i++) { ++ if (xvbcmp(id, form_tab[i].id, (size_t) 4) == 0) ++ break; ++ } ++ if (i == n_form_tab) ++ return (2); ++ ++ strncpy(pi->block->id, id, 4); ++ pi->block->x_wid = xw; ++ pi->block->y_wid = yw; ++ pi->block->x_offset = x; ++ pi->block->y_offset = y; ++ pi->block->reserve = 0; ++ ++ if (x < 0) ++ x = 0; ++ if (y < 0) ++ y = 0; ++ if (x + xw > pi->x_max) ++ pi->x_max = x + xw; ++ if (y + yw > pi->y_max) ++ pi->y_max = y + yw; ++ ++ if (opaque != 0xffffffff) { ++ pi->block->flag = 1; ++ pi->block->opaque = opaque; ++ } else { ++ pi->block->flag = 0; ++ pi->block->opaque = 0; ++ } ++ pic2_alloc_buffer(pi); ++ ++ return (form_tab[i].saver_init(pi, line)); ++} ++ ++/* ++ * These functions set/get palettes. ++ * pic2_read_palette: ++ * copy the palettes from pic2_info to PICINFO. ++ * pic2_write_palette: ++ * copy the palettes from PICINFO to pic2_info. ++ */ ++#ifndef PIC2_IGNORE_UNUSED_FUNCTIONS ++static void pic2_read_palette(pi, r, g, b) ++struct pic2_info *pi; ++byte *r, *g, *b; ++{ ++ int i; ++ ++ if (pi->n_pal > 256) ++ pi->n_pal = 256; ++ ++ if (pi->pal_bits > 8) ++ pi->pal_bits = 8; ++ ++ for (i = 0; i < pi->n_pal; i++) { ++ *r++ =pic2_convert_color_bits(pi->pal[i][0] >> (8 - pi->pal_bits), ++ pi->pal_bits, 8); ++ *g++ =pic2_convert_color_bits(pi->pal[i][1] >> (8 - pi->pal_bits), ++ pi->pal_bits, 8); ++ *b++ =pic2_convert_color_bits(pi->pal[i][2] >> (8 - pi->pal_bits), ++ pi->pal_bits, 8); ++ } ++} ++ ++static void pic2_write_palette(pi, n_pal, pal_bits, r, g, b) ++struct pic2_info *pi; ++int n_pal, pal_bits; ++byte *r, *g, *b; ++{ ++ int i; ++ ++ if (n_pal > 256) ++ pi->n_pal = 256; ++ else ++ pi->n_pal = n_pal; ++ ++ if (pal_bits > 8) ++ pi->pal_bits = 8; ++ else ++ pi->pal_bits = pal_bits; ++ ++ for (i = 0; i < n_pal; i++) { ++ pi->pal[i][0] = pic2_convert_color_bits(*r++, 8, pal_bits) ++ << (8 - pal_bits); ++ pi->pal[i][1] = pic2_convert_color_bits(*g++, 8, pal_bits) ++ << (8 - pal_bits); ++ pi->pal[i][2] = pic2_convert_color_bits(*b++, 8, pal_bits) ++ << (8 - pal_bits); ++ } ++} ++#endif /* PIC2_IGNORE_UNUSED_FUNCTIONS */ ++ ++/* ++ * These functions handle color bits. ++ * pic2_convert_color_bits: ++ * converts color bits. ++ * pic2_pad_color_bits: ++ * pads color bits. ++ * pic2_reduce_color_bits: ++ * reduces color bits. ++ * pic2_exchange_rg: ++ * exchanges red and green values. ++ */ ++static byte pic2_convert_color_bits(c, from, to) ++int c, from, to; ++{ ++ if (from == to) ++ return ((byte) c); ++ else if (from < to) ++ return (pic2_pad_color_bits(c, from, to)); ++ else ++ return (pic2_reduce_color_bits(c, from, to)); ++} ++ ++static byte pic2_pad_color_bits(c, from, to) ++int c, from, to; ++{ ++ byte p = 0; ++ ++ do { ++ to -= from; ++ p |= pic2_shift_bits(c, to); ++ } while (to >= 0); ++ return (p); ++} ++ ++static byte pic2_reduce_color_bits(c, from, to) ++int c, from, to; ++{ ++ return ((byte) (c >> (from - to))); ++} ++ ++static pixel pic2_exchange_rg(p, colbits) ++pixel p; ++int colbits; ++{ ++ pixel rmask, gmask, bmask; ++ ++ rmask = (0xff >> (8 - colbits)) << (colbits * 2); ++ gmask = (0xff >> (8 - colbits)) << colbits; ++ bmask = (0xff >> (8 - colbits)); ++ ++ p = ((p << colbits) & rmask) ++ | ((p >> colbits) & gmask) ++ | ( p & bmask); ++ return (p); ++} ++ ++/* ++ * This function handles work memory buffer. ++ */ ++static void pic2_handle_para(pi, mode) ++struct pic2_info *pi; ++int mode; ++{ ++ static pixel *vram_prev, *vram_now, *vram_next; ++ static short *flag_now, *flag_next; ++ static short *flag2_now, *flag2_next, *flag2_next2; ++ ++ switch (mode) { ++ case 0: ++ vram_prev = pi->vram_prev; ++ vram_now = pi->vram_now; ++ vram_next = pi->vram_next; ++ flag_now = pi->flag_now; ++ flag_next = pi->flag_next; ++ flag2_now = pi->flag2_now; ++ flag2_next = pi->flag2_next; ++ flag2_next2 = pi->flag2_next2; ++ pi->vram_prev += 4; ++ pi->vram_now += 4; ++ pi->vram_next += 4; ++ pi->flag_now += 4; ++ pi->flag_next += 4; ++ pi->flag2_now += 4; ++ pi->flag2_next += 4; ++ pi->flag2_next2 += 4; ++ break; ++ case 1: ++ pi->vram_prev = vram_now; ++ pi->vram_now = vram_next; ++ pi->vram_next = vram_prev; ++ pi->flag_now = flag_next; ++ pi->flag_next = flag_now; ++ pi->flag2_now = flag2_next; ++ pi->flag2_next = flag2_next2; ++ pi->flag2_next2 = flag2_now; ++ break; ++ } ++} ++ ++/* ++ * These functions alloc/free work memory. ++ * pic2_alloc_buffer: ++ * alloc work memory buffer. ++ * pic2_free_buffer: ++ * free work memory buffer. ++ */ ++static int pic2_alloc_buffer(pi) ++struct pic2_info *pi; ++{ ++ int wid; ++ byte *p; ++ ++ if (pi->buf != NULL) ++ return (-1); ++ ++ wid = pi->block->x_wid; ++ ++ p = pi->buf = (byte *) pic2_new((wid + 8) * sizeof(pixel) * 3 // GRR POSSIBLE OVERFLOW / FIXME ++ + sizeof(pi->cache[0]) * 8 * 8 * 8 ++ + sizeof(pi->cache_pos[0]) * 8 * 8 * 8 ++ + sizeof(pi->mulu_tab[0]) * 16384 ++ + sizeof(pi->flag_now[0]) * ((wid+8) * 5), ++ "pic2_alloc_buffer"); ++ ++ pi->vram_prev = (pixel *) p; ++ p += (wid + 8) * sizeof(pixel); ++ pi->vram_now = (pixel *) p; ++ p += (wid + 8) * sizeof(pixel); ++ pi->vram_next = (pixel *) p; ++ p += (wid + 8) * sizeof(pixel); ++ pi->cache = (pixel (*)[PIC2_ARITH_CACHE]) p; ++ p += sizeof(pi->cache[0]) * 8 * 8 * 8; ++ pi->cache_pos = (unsigned short *) p; ++ p += sizeof(pi->cache_pos[0]) * 8 * 8 * 8; ++ pi->mulu_tab = (unsigned short *) p; ++ p += sizeof(pi->mulu_tab[0]) * 16384; ++ pi->flag_now = (short *) p; ++ p += sizeof(pi->flag_now[0]) * (wid + 8); ++ pi->flag_next = (short *) p; ++ p += sizeof(pi->flag_next[0]) * (wid + 8); ++ pi->flag2_now = (short *) p; ++ p += sizeof(pi->flag2_now[0]) * (wid + 8); ++ pi->flag2_next = (short *) p; ++ p += sizeof(pi->flag2_next[0]) * (wid + 8); ++ pi->flag2_next2 = (short *) p; ++ p += sizeof(pi->flag2_next2[0]) * (wid + 8); ++ return (0); ++} ++ ++static void pic2_free_buffer(pi) ++struct pic2_info *pi; ++{ ++ free(pi->buf); ++ pi->buf = NULL; ++} ++ ++/* ++ * These functions handle the file pointer. ++ * pic2_seek_file: ++ * moves the file pointer. ++ * pic2_tell_file: ++ * tells the location of the file pointer. ++ */ ++static long pic2_seek_file(pi, offset, whence) ++struct pic2_info *pi; ++long offset; ++int whence; ++{ ++ long n; ++ ++ n = fseek(pi->fp, offset, whence); ++ if (n < 0) ++ pic2_file_error(pi, PIC2_CORRUPT); ++ ++ return (n); ++} ++ ++static long pic2_tell_file(pi) ++struct pic2_info *pi; ++{ ++ return (ftell(pi->fp)); ++} ++ ++/* ++ * These functions handle file. ++ * pic2_read_file: ++ * reads data from the file. ++ * pic2_read_long: ++ * reads long word data from the file and converts to internal expression. ++ * pic2_read_short: ++ * reads word data from the file and converts to internal expression. ++ * pic2_read_char: ++ * reads byte data from the file. ++ * pic2_write_file: ++ * writes data to the file. ++ * pic2_write_long: ++ * converts long word data to common expression and writes to the file. ++ * pic2_write_short: ++ * converts word data to common expression and writes to the file. ++ * pic2_write_char: ++ * writes byte data to the file. ++ */ ++static int pic2_read_file(pi, buf, size) ++struct pic2_info *pi; ++void *buf; ++size_t size; ++{ ++ if (fread(buf, (size_t) 1, size, pi->fp) < size) ++ pic2_file_error(pi, PIC2_CORRUPT); ++ return (0); ++} ++ ++static long pic2_read_long(pi) ++struct pic2_info *pi; ++{ ++ byte buf[4]; ++ ++ if (fread(buf, (size_t) 4, (size_t) 1, pi->fp) < 1) ++ pic2_file_error(pi, PIC2_CORRUPT); ++ return (pic2_cextolong(buf)); ++} ++ ++static short pic2_read_short(pi) ++struct pic2_info *pi; ++{ ++ byte buf[2]; ++ ++ if (fread(buf, (size_t) 2, (size_t) 1, pi->fp) < 1) ++ pic2_file_error(pi, PIC2_CORRUPT); ++ return (pic2_cextoshort(buf)); ++} ++ ++static char pic2_read_char(pi) ++struct pic2_info *pi; ++{ ++ int c; ++ ++ if ((c = fgetc(pi->fp)) == EOF) ++ pic2_file_error(pi, PIC2_CORRUPT); ++ return ((char) c); ++} ++ ++static int pic2_write_file(pi, buf, size) ++struct pic2_info *pi; ++void *buf; ++size_t size; ++{ ++ if (fwrite(buf, (size_t) 1, size, pi->fp) < size) ++ pic2_error(pi, PIC2_WRITE); ++ return (0); ++} ++ ++static int pic2_write_long(pi, n) ++struct pic2_info *pi; ++long n; ++{ ++ byte buf[4]; ++ ++ pic2_longtocex(buf, n); ++ if (fwrite(buf, (size_t) 4, (size_t) 1, pi->fp) < 1) ++ pic2_error(pi, PIC2_WRITE); ++ return (0); ++} ++ ++static int pic2_write_short(pi, n) ++struct pic2_info *pi; ++int n; ++{ ++ byte buf[2]; ++ ++ pic2_shorttocex(buf, n); ++ if (fwrite(buf, (size_t) 2, (size_t) 1, pi->fp) < 1) ++ pic2_error(pi, PIC2_WRITE); ++ return (0); ++} ++ ++static int pic2_write_char(pi, c) ++struct pic2_info *pi; ++int c; ++{ ++ if (fputc(c, pi->fp) == EOF) ++ pic2_error(pi, PIC2_WRITE); ++ return (0); ++} ++ ++/* ++ * These functions access the bit stream. ++ * pic2_read_bits: ++ * reads the specified bits from the file. ++ * pic2_write_bits: ++ * writes the specified bits to the file. ++ * pic2_flush_bits: ++ * flushes bit buffer to the file. ++ */ ++static unsigned long pic2_read_bits(pi, bits) ++struct pic2_info *pi; ++int bits; ++{ ++ unsigned long r = 0; ++ ++ while (bits > 0) { ++ while (pi->bs.rest > 0 && bits > 0) { ++ r = (r << 1) | (pi->bs.cur & 0x80 ? 1 : 0); ++ pi->bs.cur <<= 1; ++ pi->bs.rest--; ++ bits--; ++ } ++ if (bits > 0) { ++ int c; ++ if ((c = fgetc(pi->fp)) == EOF) ++ pic2_file_error(pi, PIC2_CORRUPT); ++ pi->bs.cur = (byte) c; ++ pi->bs.rest = 8; ++ } ++ } ++ return r; ++} ++ ++static void pic2_write_bits(pi, dat, bits) ++struct pic2_info *pi; ++unsigned long dat; ++int bits; ++{ ++ unsigned long dat_mask = 1 << (bits - 1); ++ ++ while (bits > 0) { ++ while (pi->bs.rest < 8 && bits > 0) { ++ pi->bs.cur <<= 1; ++ if (dat & dat_mask) ++ pi->bs.cur |= 1; ++ pi->bs.rest++; ++ bits--; ++ dat_mask >>= 1; ++ } ++ if (pi->bs.rest >= 8) { ++ if ((fputc((int) pi->bs.cur, pi->fp)) == EOF) ++ pic2_error(pi, PIC2_WRITE); ++ pi->bs.cur = 0; ++ pi->bs.rest = 0; ++ } ++ } ++} ++ ++static void pic2_flush_bits(pi) ++struct pic2_info *pi; ++{ ++ if (pi->bs.rest < 8) { ++ pi->bs.cur <<= 8 - pi->bs.rest; ++ if (fputc((int) pi->bs.cur, pi->fp) == EOF) ++ pic2_error(pi, PIC2_WRITE); ++ pi->bs.cur = 0; ++ pi->bs.rest = 0; ++ } ++} ++ ++/* ++ * These functions initialize or clean up structures. ++ * pic2_init_info: ++ * initializes a pic2_info structure. ++ * pic2_cleanup_pic2_info: ++ * cleans up a pic_info structure. ++ * pic2_cleanup_pinfo: ++ * cleans up a PICINFO structure. ++ */ ++static void pic2_init_info(pi) ++struct pic2_info *pi; ++{ ++ xvbzero((char *) pi, sizeof(struct pic2_info)); ++ pi->header = pic2_new(sizeof(struct pic2_header), "pic2_init_info#1"); ++ pi->block = pic2_new(sizeof(struct pic2_block), "pic2_init_info#2"); ++} ++ ++static void pic2_cleanup_pic2_info(pi, writing) ++struct pic2_info *pi; ++int writing; ++{ ++ if (!writing && pi->fp) ++ fclose(pi->fp); ++ if (pi->header) ++ free(pi->header); ++ if (pi->block) ++ free(pi->block); ++ pi->fp = NULL; ++ pi->header = NULL; ++ pi->block = NULL; ++ pi->comment = NULL; ++} ++ ++static void pic2_cleanup_pinfo(pinfo) ++PICINFO *pinfo; ++{ ++ if (pinfo->pic){ ++ free(pinfo->pic); ++ pinfo->pic = NULL; ++ } ++ if (pinfo->comment){ ++ free(pinfo->comment); ++ pinfo->comment = NULL; ++ } ++} ++ ++/* ++ * Error Handlers. ++ * pic2_memory_error: ++ * shows an error message and terminates. ++ * pic2_error: ++ * shows a non-file error message and jumps to the entry for errors. ++ * pic2_file_error: ++ * shows a file error message and jumps to the entry for errors. ++ */ ++static void pic2_memory_error(scm, fn) ++char *scm, *fn; ++{ ++ char buf[128]; ++ sprintf(buf, "%s: can't allocate memory. (%s)", scm, fn); ++ FatalError(buf); ++} ++ ++static void pic2_error(pi, mn) ++struct pic2_info *pi; ++int mn; ++{ ++ SetISTR(ISTR_WARNING, "%s", pic2_msgs[mn]); ++ longjmp(pi->jmp, 1); ++} ++ ++static void pic2_file_error(pi, mn) ++ struct pic2_info *pi; ++ int mn; ++{ ++ if (feof(pi->fp)) ++ SetISTR(ISTR_WARNING, "%s (end of file)", pic2_msgs[mn]); ++ else ++ SetISTR(ISTR_WARNING, "%s (%s)", pic2_msgs[mn], ERRSTR(errno)); ++ longjmp(pi->jmp, 1); ++} ++ ++static void pic2_show_pic2_info(pi) ++ struct pic2_info *pi; ++{ ++ fprintf(stderr, "file size: %ld.\n", pi->fsize); ++ fprintf(stderr, "full image size: %dx%d\n", pi->x_max, pi->y_max); ++ fprintf(stderr, "number of palettes: %d\n", pi->n_pal); ++ fprintf(stderr, "depth of palettes: %d\n", pi->pal_bits); ++ fprintf(stderr, "current block position: %ld\n", pi->block_pos); ++ fprintf(stderr, "next block position: %ld\n\n", pi->next_pos); ++ ++ fprintf(stderr, "header flag: %x\n", pi->header->flag); ++ fprintf(stderr, "header size: %ld\n", pi->header->size); ++ fprintf(stderr, "x_aspect: %d, y_aspect: %d\n", ++ pi->header->x_aspect, pi->header->y_aspect); ++ fprintf(stderr, "number of color bits: %d\n\n", pi->header->depth); ++ ++ fprintf(stderr, "image block id: %s\n", pi->block->id); ++ fprintf(stderr, "image block size: %ld\n", pi->block->size); ++ fprintf(stderr, "block flag: %x\n", pi->block->flag); ++ ++ fprintf(stderr, "block image size: %dx%d\n", ++ pi->block->x_wid, pi->block->y_wid); ++ fprintf(stderr, "x_offset: %d\n", pi->block->x_offset); ++ fprintf(stderr, "y_offset: %d\n", pi->block->y_offset); ++ fprintf(stderr, "opaque color: %lx\n\n", pi->block->opaque); ++} ++ ++/* ++ * This function is similar to strncpy. ++ * But this pads with whitespace after the null character. ++ */ ++static char *pic2_strncpy(dest, src, n) ++char *dest, *src; ++size_t n; ++{ ++ char *r; ++ ++ r = dest; ++ while (n--) ++ if ((src != NULL) && (*src != '\r') && (*src != '\n') && *src) ++ *dest++ = *src++; ++ else ++ *dest++ = ' '; ++ return (r); ++} ++ ++/* ++ * These functions create a memory block. ++ */ ++static void *pic2_malloc(size, fn) ++size_t size; ++char *fn; ++{ ++ void *p; ++ ++ p = (void *) malloc(size); ++ if (p == NULL) ++ pic2_memory_error("malloc", fn); ++ return (p); ++} ++ ++static void *pic2_new(size, fn) ++size_t size; ++char *fn; ++{ ++ void *p; ++ ++ p = (void *) pic2_malloc(size, fn); ++ xvbzero((char *) p, size); ++ return (p); ++} ++ ++ ++ ++ ++/**** Stuff for PIC2Dialog box ****/ ++ ++#define TWIDE 320 ++#define THIGH 178 ++#define T_NBUTTS 2 ++#define T_BOK 0 ++#define T_BCANC 1 ++#define BUTTH 24 ++ ++static void drawTD PARM((int,int,int,int)); ++static void clickTD PARM((int,int)); ++static void doCmd PARM((int)); ++static void writePIC2 PARM((void)); ++ ++/* local variables */ ++static FILE *fp; ++static char *filename; ++static int colorType; ++static int append; ++static int x_offset; ++static int y_offset; ++static BUTT tbut[T_NBUTTS]; ++static RBUTT *typeRB; ++static RBUTT *depthRB; ++ ++ ++ ++/***************************************************/ ++void CreatePIC2W() ++{ ++ int y; ++ ++ pic2W = CreateWindow("xv pic2", "XVpic2", NULL, ++ TWIDE, THIGH, infofg, infobg, 0); ++ if (!pic2W) ++ FatalError("can't create pic2 window!"); ++ ++ XSelectInput(theDisp, pic2W, ++ ExposureMask | ButtonPressMask | KeyPressMask); ++ ++ BTCreate(&tbut[T_BOK], pic2W, TWIDE-140-1, THIGH-10-BUTTH-1, 60, BUTTH, ++ "Ok", infofg, infobg, hicol, locol); ++ ++ BTCreate(&tbut[T_BCANC], pic2W, TWIDE-70-1, THIGH-10-BUTTH-1, 60, BUTTH, ++ "Cancel", infofg, infobg, hicol, locol); ++ ++ y = 55; ++ typeRB = RBCreate(NULL, pic2W, 36, y, "P2SS", ++ infofg, infobg,hicol,locol); ++ RBCreate(typeRB, pic2W, 36, y+18, "P2SF", ++ infofg, infobg,hicol,locol); ++ RBCreate(typeRB, pic2W, 36, y+36, "P2BM", ++ infofg, infobg, hicol, locol); ++ RBCreate(typeRB, pic2W, 36, y+54, "P2BI", ++ infofg, infobg, hicol, locol); ++ ++ depthRB = RBCreate(NULL, pic2W, TWIDE/2-16, y, " 3bit", ++ infofg, infobg,hicol,locol); ++ RBCreate(depthRB, pic2W, TWIDE/2-16, y+18, " 6bit", ++ infofg, infobg,hicol,locol); ++ RBCreate(depthRB, pic2W, TWIDE/2-16, y+36, " 9bit", ++ infofg, infobg, hicol, locol); ++ RBCreate(depthRB, pic2W, TWIDE/2-16, y+54, "12bit", ++ infofg, infobg, hicol, locol); ++ RBCreate(depthRB, pic2W, TWIDE/4*3-16, y, "15bit", ++ infofg, infobg, hicol, locol); ++ RBCreate(depthRB, pic2W, TWIDE/4*3-16, y+18, "18bit", ++ infofg, infobg, hicol, locol); ++ RBCreate(depthRB, pic2W, TWIDE/4*3-16, y+36, "21bit", ++ infofg, infobg, hicol, locol); ++ RBCreate(depthRB, pic2W, TWIDE/4*3-16, y+54, "24bit", ++ infofg, infobg, hicol, locol); ++ ++ XMapSubwindows(theDisp, pic2W); ++} ++ ++ ++/***************************************************/ ++void PIC2Dialog(vis) ++int vis; ++{ ++ if (vis) { ++ CenterMapWindow(pic2W, tbut[T_BOK].x + tbut[T_BOK].w/2, ++ tbut[T_BOK].y + tbut[T_BOK].h/2, TWIDE, THIGH); ++ } ++ else XUnmapWindow(theDisp, pic2W); ++ pic2Up = vis; ++} ++ ++ ++/***************************************************/ ++int PIC2CheckEvent(xev) ++XEvent *xev; ++{ ++ /* check event to see if it's for one of our subwindows. If it is, ++ deal accordingly and return '1'. Otherwise, return '0'. */ ++ ++ int rv; ++ rv = 1; ++ ++ if (!pic2Up) ++ return (0); ++ ++ if (xev->type == Expose) { ++ int x,y,w,h; ++ XExposeEvent *e = (XExposeEvent *) xev; ++ x = e->x; y = e->y; w = e->width; h = e->height; ++ ++ if (e->window == pic2W) drawTD(x, y, w, h); ++ else rv = 0; ++ } ++ ++ else if (xev->type == ButtonPress) { ++ XButtonEvent *e = (XButtonEvent *) xev; ++ int x,y; ++ x = e->x; y = e->y; ++ ++ if (e->button == Button1) { ++ if (e->window == pic2W) clickTD(x,y); ++ else rv = 0; ++ } /* button1 */ ++ else rv = 0; ++ } /* button press */ ++ ++ ++ else if (xev->type == KeyPress) { ++ XKeyEvent *e = (XKeyEvent *) xev; ++ char buf[128]; KeySym ks; XComposeStatus status; ++ int stlen; ++ ++ stlen = XLookupString(e,buf,128,&ks,&status); ++ buf[stlen] = '\0'; ++ ++ if (e->window == pic2W) { ++ if (stlen) { ++ if (buf[0] == '\r' || buf[0] == '\n') { /* enter */ ++ FakeButtonPress(&tbut[T_BOK]); ++ } ++ else if (buf[0] == '\033') { /* ESC */ ++ FakeButtonPress(&tbut[T_BCANC]); ++ } ++ } ++ } ++ else rv = 0; ++ } ++ else rv = 0; ++ ++ if (rv == 0 && (xev->type == ButtonPress || xev->type == KeyPress)) { ++ XBell(theDisp, 50); ++ rv = 1; /* eat it */ ++ } ++ ++ return (rv); ++} ++ ++ ++/***************************************************/ ++int PIC2SaveParams(fname, col) ++char *fname; ++int col; ++{ ++ filename = fname; ++ colorType = col; ++ ++ /* see if we can open the output file before proceeding */ ++ fp = pic2_OpenOutFile(filename, &append); ++ if (!fp) ++ return (-1); ++ ++ RBSetActive(typeRB,0,1); ++ RBSetActive(typeRB,1,1); ++ RBSetActive(typeRB,2,1); ++ RBSetActive(typeRB,3,1); ++ RBSelect(typeRB,0); ++ ++ ++ if (append) { ++ struct pic2_info pic2; ++ ++ pic2_init_info(&pic2); ++ pic2.fp = fp; ++ pic2_read_header(&pic2); ++ ++ RBSetActive(depthRB,0,0); ++ RBSetActive(depthRB,1,0); ++ RBSetActive(depthRB,2,0); ++ RBSetActive(depthRB,3,0); ++ RBSetActive(depthRB,4,0); ++ RBSetActive(depthRB,5,0); ++ RBSetActive(depthRB,6,0); ++ RBSetActive(depthRB,7,0); ++ ++ switch (pic2.header->depth) { ++ case 3: ++ RBSetActive(depthRB,0,1); ++ RBSelect(depthRB,0); ++ RBSetActive(typeRB,3,0); ++ break; ++ case 6: ++ RBSetActive(depthRB,1,1); ++ RBSelect(depthRB,1); ++ RBSetActive(typeRB,3,0); ++ break; ++ case 9: ++ RBSetActive(depthRB,2,1); ++ RBSelect(depthRB,2); ++ break; ++ case 12: ++ RBSetActive(depthRB,3,1); ++ RBSelect(depthRB,3); ++ break; ++ case 15: ++ RBSetActive(depthRB,4,1); ++ RBSelect(depthRB,4); ++ break; ++ case 18: ++ RBSetActive(depthRB,5,1); ++ RBSelect(depthRB,5); ++ RBSetActive(typeRB,3,0); ++ break; ++ case 21: ++ RBSetActive(depthRB,6,1); ++ RBSelect(depthRB,6); ++ RBSetActive(typeRB,3,0); ++ break; ++ case 24: ++ RBSetActive(depthRB,7,1); ++ RBSelect(depthRB,7); ++ RBSetActive(typeRB,3,0); ++ break; ++ default: { ++ char str[512]; ++ sprintf(str, "unsupported PIC2 file '%s'.", filename); ++ ErrPopUp(str, "\nBummer"); ++ CloseOutFile(fp, filename, 0); ++ fp = OpenOutFile(fname); ++ if (!fp) ++ return (-1); ++ break; ++ } ++ } ++ pic2_seek_file(&pic2, 0, SEEK_SET); ++ pic2_cleanup_pic2_info(&pic2, 1); ++ } else { ++ RBSetActive(depthRB,0,1); ++ RBSetActive(depthRB,1,1); ++ RBSetActive(depthRB,2,1); ++ RBSetActive(depthRB,3,1); ++ RBSetActive(depthRB,4,1); ++ RBSetActive(depthRB,5,1); ++ RBSetActive(depthRB,6,1); ++ RBSetActive(depthRB,7,1); ++ RBSelect(depthRB,7); ++ RBSetActive(typeRB,3,0); ++ } ++ return (0); ++} ++ ++ ++/***************************************************/ ++static void drawTD(x,y,w,h) ++int x,y,w,h; ++{ ++ char *title = "Save PIC2 file..."; ++ int i; ++ XRectangle xr; ++ ++ xr.x = x; xr.y = y; xr.width = w; xr.height = h; ++ XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted); ++ ++ XSetForeground(theDisp, theGC, infofg); ++ XSetBackground(theDisp, theGC, infobg); ++ ++ for (i = 0; i < T_NBUTTS; i++) ++ BTRedraw(&tbut[i]); ++ ++ ULineString(pic2W, typeRB->x-16, typeRB->y-3-DESCENT, "FormatType"); ++ ULineString(pic2W, depthRB->x-16, depthRB->y-3-DESCENT, "ColorDepth"); ++ RBRedraw(typeRB, -1); ++ RBRedraw(depthRB, -1); ++ ++ DrawString(pic2W, 20, 29, title); ++ ++ XSetClipMask(theDisp, theGC, None); ++} ++ ++static void clickTD(x,y) ++int x,y; ++{ ++ int i; ++ BUTT *bp; ++ ++ /* check BUTTs */ ++ ++ /* check the RBUTTS first, since they don't DO anything */ ++ if ((i = RBClick(typeRB, x,y)) >= 0) { ++ (void) RBTrack(typeRB, i); ++ return; ++ } else if ((i = RBClick(depthRB, x,y)) >= 0) { ++ (void) RBTrack(depthRB, i); ++ if ((2 <= i) && (i <= 4)) ++ RBSetActive(typeRB,3,1); ++ else { ++ RBSetActive(typeRB,3,0); ++ if (RBWhich(typeRB) == 3) ++ RBSelect(typeRB,0); ++ return; ++ } ++ } ++ for (i = 0; i < T_NBUTTS; i++) { ++ bp = &tbut[i]; ++ if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) ++ break; ++ } ++ if (i < T_NBUTTS) /* found one */ ++ if (BTTrack(bp)) ++ doCmd(i); ++} ++ ++ ++ ++/***************************************************/ ++static void doCmd(cmd) ++int cmd; ++{ ++ switch (cmd) { ++ case T_BOK: { ++ char *fullname; ++ char buf[64], *x_offsetp, *y_offsetp; ++ static char *labels[] = { "\nOk", "\033Cancel" }; ++ XEvent event; ++ int i; ++ ++ strcpy(buf, "0,0"); ++ i = GetStrPopUp("Enter offset (x,y):", labels, 2, buf, 64, ++ "01234567890,", 1); ++ ++ if (i) ++ return; ++ if (strlen(buf)==0) ++ return; ++ ++ x_offsetp = buf; ++ y_offsetp = index(buf, ','); ++ if (!y_offsetp) ++ return; ++ *(y_offsetp++) = '\0'; ++ if ((*x_offsetp == '\0') || (*y_offsetp == '\0')) ++ return; ++ x_offset = atoi(x_offsetp); ++ y_offset = atoi(y_offsetp); ++ ++ XNextEvent(theDisp, &event); ++ HandleEvent(&event, &i); ++ ++ writePIC2(); ++ PIC2Dialog(0); ++ ++ fullname = GetDirFullName(); ++ if (!ISPIPE(fullname[0])) { ++ XVCreatedFile(fullname); ++ StickInCtrlList(0); ++ } ++ } ++ break; ++ case T_BCANC: ++ pic2_KillNullFile(fp); ++ PIC2Dialog(0); ++ break; ++ default: ++ break; ++ } ++} ++ ++ ++/*******************************************/ ++static void writePIC2() ++{ ++ int w, h, nc, rv, type, depth, ptype, pfree; ++ byte *inpix, *rmap, *gmap, *bmap; ++ ++ ++ WaitCursor(); ++ inpix = GenSavePic(&ptype, &w, &h, &pfree, &nc, &rmap, &gmap, &bmap); ++ ++ if (colorType == F_REDUCED) ++ colorType = F_FULLCOLOR; ++ ++ switch (RBWhich(typeRB)) { ++ case 0: type = P2SS; break; ++ case 1: type = P2SF; break; ++ case 2: type = P2BM; break; ++ case 3: type = P2BI; break; ++ default: type = P2SS; break; ++ } ++ switch (RBWhich(depthRB)) { ++ case 0: depth = 3; break; ++ case 1: depth = 6; break; ++ case 2: depth = 9; break; ++ case 3: depth = 12; break; ++ case 4: depth = 15; break; ++ case 5: depth = 18; break; ++ case 6: depth = 21; break; ++ case 7: depth = 24; break; ++ default: depth = 24; break; ++ } ++ rv = WritePIC2(fp, inpix, ptype, w, h, ++ rmap, gmap, bmap, nc, colorType, filename, ++ type, depth, x_offset, y_offset, append, picComments); ++ ++ if (CloseOutFile(fp, filename, rv) == 0) ++ DirBox(0); ++ ++ if (pfree) ++ free(inpix); ++} ++#endif /* HAVE_PIC2 */ +diff -ruN xv-3.10a-bugfixes/xvpng.c xv-3.10a-enhancements/xvpng.c +--- xv-3.10a-bugfixes/xvpng.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvpng.c 2005-04-17 15:00:08.000000000 -0700 +@@ -0,0 +1,1081 @@ ++/* ++ * xvpng.c - load and write routines for 'PNG' format pictures ++ * ++ * callable functions ++ * ++ * CreatePNGW() ++ * PNGDialog(vis) ++ * PNGCheckEvent(xev) ++ * PNGSaveParams(fname, col) ++ * LoadPNG(fname, pinfo) ++ * VersionInfoPNG() ++ */ ++ ++/*#include "copyright.h"*/ ++/* (c) 1995 by Alexander Lehmann <lehmann@mathematik.th-darmstadt.de> ++ * This file is a suplement to xv and is supplied under the same copying ++ * conditions (except the shareware part). ++ * Modified by Andreas Dilger <adilger@enel.ucalgary.ca> to fix ++ * error handling for bad PNGs, add dialogs for interlacing and ++ * compression selection, and upgrade to libpng-0.89. ++ * Modified by Greg Roelofs, TenThumbs and others to fix bugs and add ++ * features. ++ * The copyright will be passed on to JB at some future point if he ++ * so desires. ++ */ ++ ++#include "xv.h" ++ ++#ifdef HAVE_PNG ++ ++#include "png.h" ++ ++/*** Stuff for PNG Dialog box ***/ ++#define PWIDE 318 ++#define PHIGH 215 ++ ++#define DISPLAY_GAMMA 2.20 /* default display gamma */ ++#define COMPRESSION 6 /* default zlib compression level, not max ++ (Z_BEST_COMPRESSION) */ ++ ++#define HAVE_tRNS (info_ptr->valid & PNG_INFO_tRNS) ++ ++#define DWIDE 86 ++#define DHIGH 104 ++#define PFX PWIDE-93 ++#define PFY 44 ++#define PFH 20 ++ ++#define P_BOK 0 ++#define P_BCANC 1 ++#define P_NBUTTS 2 ++ ++#define BUTTH 24 ++ ++#define LF 10 /* a.k.a. '\n' on ASCII machines */ ++#define CR 13 /* a.k.a. '\r' on ASCII machines */ ++ ++/*** local functions ***/ ++static void drawPD PARM((int, int, int, int)); ++static void clickPD PARM((int, int)); ++static void doCmd PARM((int)); ++static void writePNG PARM((void)); ++static int WritePNG PARM((FILE *, byte *, int, int, int, ++ byte *, byte *, byte *, int)); ++ ++static void png_xv_error PARM((png_structp png_ptr, ++ png_const_charp message)); ++static void png_xv_warning PARM((png_structp png_ptr, ++ png_const_charp message)); ++ ++/*** local variables ***/ ++static char *filename; ++static char *fbasename; ++static int colorType; ++static int read_anything; ++static double Display_Gamma = DISPLAY_GAMMA; ++ ++static DIAL cDial, gDial; ++static BUTT pbut[P_NBUTTS]; ++static CBUTT interCB; ++static CBUTT FdefCB, FnoneCB, FsubCB, FupCB, FavgCB, FPaethCB; ++ ++/**************************************************************************/ ++/* PNG SAVE DIALOG ROUTINES ***********************************************/ ++/**************************************************************************/ ++ ++ ++/*******************************************/ ++void CreatePNGW() ++{ ++ pngW = CreateWindow("xv png", "XVPNG", NULL, ++ PWIDE, PHIGH, infofg, infobg, 0); ++ if (!pngW) FatalError("can't create PNG window!"); ++ ++ XSelectInput(theDisp, pngW, ExposureMask | ButtonPressMask | KeyPressMask); ++ ++ DCreate(&cDial, pngW, 12, 25, DWIDE, DHIGH, (double)Z_NO_COMPRESSION, ++ (double)Z_BEST_COMPRESSION, COMPRESSION, 1.0, 3.0, ++ infofg, infobg, hicol, locol, "Compression", NULL); ++ ++ DCreate(&gDial, pngW, DWIDE+27, 25, DWIDE, DHIGH, 1.0, 3.5,DISPLAY_GAMMA,0.01,0.2, ++ infofg, infobg, hicol, locol, "Disp. Gamma", NULL); ++ ++ CBCreate(&interCB, pngW, DWIDE+30, DHIGH+3*LINEHIGH+2, "interlace", ++ infofg, infobg, hicol, locol); ++ ++ CBCreate(&FdefCB, pngW, PFX, PFY, "Default", ++ infofg, infobg, hicol, locol); ++ FdefCB.val = 1; ++ ++ CBCreate(&FnoneCB, pngW, PFX, FdefCB.y + PFH + 4, "none", ++ infofg, infobg, hicol, locol); ++ CBCreate(&FsubCB, pngW, PFX, FnoneCB.y + PFH, "sub", ++ infofg, infobg, hicol, locol); ++ CBCreate(&FupCB, pngW, PFX, FsubCB.y + PFH, "up", ++ infofg, infobg, hicol, locol); ++ CBCreate(&FavgCB, pngW, PFX, FupCB.y + PFH, "average", ++ infofg, infobg, hicol, locol); ++ CBCreate(&FPaethCB, pngW, PFX, FavgCB.y + PFH, "Paeth", ++ infofg, infobg, hicol, locol); ++ ++ FnoneCB.val = FsubCB.val = FupCB.val = FavgCB.val = FPaethCB.val = 1; ++ CBSetActive(&FnoneCB, !FdefCB.val); ++ CBSetActive(&FsubCB, !FdefCB.val); ++ CBSetActive(&FupCB, !FdefCB.val); ++ CBSetActive(&FavgCB, !FdefCB.val); ++ CBSetActive(&FPaethCB, !FdefCB.val); ++ ++ BTCreate(&pbut[P_BOK], pngW, PWIDE-180-1, PHIGH-10-BUTTH-1, 80, BUTTH, ++ "Ok", infofg, infobg, hicol, locol); ++ BTCreate(&pbut[P_BCANC], pngW, PWIDE-90-1, PHIGH-10-BUTTH-1, 80, BUTTH, ++ "Cancel", infofg, infobg, hicol, locol); ++ ++ XMapSubwindows(theDisp, pngW); ++} ++ ++ ++/*******************************************/ ++void PNGDialog(vis) ++ int vis; ++{ ++ if (vis) { ++ CenterMapWindow(pngW, pbut[P_BOK].x + (int) pbut[P_BOK].w/2, ++ pbut[P_BOK].y + (int) pbut[P_BOK].h/2, ++ PWIDE, PHIGH); ++ } ++ else XUnmapWindow(theDisp, pngW); ++ pngUp = vis; ++} ++ ++ ++/*******************************************/ ++int PNGCheckEvent(xev) ++ XEvent *xev; ++{ ++ /* check event to see if it's for one of our subwindows. If it is, ++ deal accordingly, and return '1'. Otherwise, return '0' */ ++ ++ int rv; ++ rv = 1; ++ ++ if (!pngUp) return 0; ++ ++ if (xev->type == Expose) { ++ int x,y,w,h; ++ XExposeEvent *e = (XExposeEvent *) xev; ++ x = e->x; y = e->y; w = e->width; h = e->height; ++ ++ /* throw away excess expose events for 'dumb' windows */ ++ if (e->count > 0 && (e->window == cDial.win)) {} ++ ++ else if (e->window == pngW) drawPD(x, y, w, h); ++ else if (e->window == cDial.win) DRedraw(&cDial); ++ else if (e->window == gDial.win) DRedraw(&gDial); ++ else rv = 0; ++ } ++ ++ else if (xev->type == ButtonPress) { ++ XButtonEvent *e = (XButtonEvent *) xev; ++ int x,y; ++ x = e->x; y = e->y; ++ ++ if (e->button == Button1) { ++ if (e->window == pngW) clickPD(x,y); ++ else if (e->window == cDial.win) DTrack(&cDial,x,y); ++ else if (e->window == gDial.win) DTrack(&gDial,x,y); ++ else rv = 0; ++ } /* button1 */ ++ else rv = 0; ++ } /* button press */ ++ ++ else if (xev->type == KeyPress) { ++ XKeyEvent *e = (XKeyEvent *) xev; ++ char buf[128]; KeySym ks; ++ int stlen; ++ ++ stlen = XLookupString(e,buf,128,&ks,(XComposeStatus *) NULL); ++ buf[stlen] = '\0'; ++ ++ RemapKeyCheck(ks, buf, &stlen); ++ ++ if (e->window == pngW) { ++ if (stlen) { ++ if (buf[0] == '\r' || buf[0] == '\n') { /* enter */ ++ FakeButtonPress(&pbut[P_BOK]); ++ } ++ else if (buf[0] == '\033') { /* ESC */ ++ FakeButtonPress(&pbut[P_BCANC]); ++ } ++ } ++ } ++ else rv = 0; ++ } ++ else rv = 0; ++ ++ if (rv==0 && (xev->type == ButtonPress || xev->type == KeyPress)) { ++ XBell(theDisp, 50); ++ rv = 1; /* eat it */ ++ } ++ ++ return rv; ++} ++ ++ ++/*******************************************/ ++void PNGSaveParams(fname, col) ++ char *fname; ++ int col; ++{ ++ filename = fname; ++ colorType = col; ++} ++ ++ ++/*******************************************/ ++static void drawPD(x, y, w, h) ++ int x, y, w, h; ++{ ++ char *title = "Save PNG file..."; ++ ++ char ctitle1[20]; ++ char *ctitle2 = "Useful range"; ++ char *ctitle3 = "is 2 - 7."; ++ char *ctitle4 = "Uncompressed = 0"; ++ ++ char *ftitle = "Row Filters:"; ++ ++ char gtitle[20]; ++ ++ int i; ++ XRectangle xr; ++ ++ xr.x = x; xr.y = y; xr.width = w; xr.height = h; ++ XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted); ++ ++ XSetForeground(theDisp, theGC, infofg); ++ XSetBackground(theDisp, theGC, infobg); ++ ++ for (i=0; i<P_NBUTTS; i++) BTRedraw(&pbut[i]); ++ ++ DrawString(pngW, 15, 6+ASCENT, title); ++ ++ sprintf(ctitle1, "Default = %d", COMPRESSION); ++ DrawString(pngW, 18, 6+DHIGH+cDial.y+ASCENT, ctitle1); ++ DrawString(pngW, 17, 6+DHIGH+cDial.y+ASCENT+LINEHIGH, ctitle2); ++ DrawString(pngW, 17, 6+DHIGH+cDial.y+ASCENT+2*LINEHIGH, ctitle3); ++ DrawString(pngW, 17, 6+DHIGH+cDial.y+ASCENT+3*LINEHIGH, ctitle4); ++ ++ sprintf(gtitle, "Default = %g", DISPLAY_GAMMA); ++ DrawString(pngW, DWIDE+30, 6+DHIGH+gDial.y+ASCENT, gtitle); ++ ++ ULineString(pngW, FdefCB.x, FdefCB.y-3-DESCENT, ftitle); ++ XDrawRectangle(theDisp, pngW, theGC, FdefCB.x-11, FdefCB.y-LINEHIGH-3, ++ 93, 8*LINEHIGH+15); ++ CBRedraw(&FdefCB); ++ XDrawLine(theDisp, pngW, theGC, FdefCB.x-11, FdefCB.y+LINEHIGH+4, ++ FdefCB.x+82, FdefCB.y+LINEHIGH+4); ++ ++ CBRedraw(&FnoneCB); ++ CBRedraw(&FupCB); ++ CBRedraw(&FsubCB); ++ CBRedraw(&FavgCB); ++ CBRedraw(&FPaethCB); ++ ++ CBRedraw(&interCB); ++ ++ XSetClipMask(theDisp, theGC, None); ++} ++ ++ ++/*******************************************/ ++static void clickPD(x,y) ++ int x,y; ++{ ++ int i; ++ BUTT *bp; ++ ++ /* check BUTTs */ ++ ++ for (i=0; i<P_NBUTTS; i++) { ++ bp = &pbut[i]; ++ if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break; ++ } ++ ++ if (i<P_NBUTTS) { /* found one */ ++ if (BTTrack(bp)) doCmd(i); ++ } ++ ++ /* check CBUTTs */ ++ ++ else if (CBClick(&FdefCB,x,y)) { ++ int oldval = FdefCB.val; ++ ++ CBTrack(&FdefCB); ++ ++ if (oldval != FdefCB.val) ++ { ++ CBSetActive(&FnoneCB, !FdefCB.val); ++ CBSetActive(&FsubCB, !FdefCB.val); ++ CBSetActive(&FupCB, !FdefCB.val); ++ CBSetActive(&FavgCB, !FdefCB.val); ++ CBSetActive(&FPaethCB, !FdefCB.val); ++ ++ CBRedraw(&FnoneCB); ++ CBRedraw(&FupCB); ++ CBRedraw(&FsubCB); ++ CBRedraw(&FavgCB); ++ CBRedraw(&FPaethCB); ++ } ++ } ++ else if (CBClick(&FnoneCB,x,y)) CBTrack(&FnoneCB); ++ else if (CBClick(&FsubCB,x,y)) CBTrack(&FsubCB); ++ else if (CBClick(&FupCB,x,y)) CBTrack(&FupCB); ++ else if (CBClick(&FavgCB,x,y)) CBTrack(&FavgCB); ++ else if (CBClick(&FPaethCB,x,y)) CBTrack(&FPaethCB); ++ else if (CBClick(&interCB,x,y)) CBTrack(&interCB); ++} ++ ++ ++/*******************************************/ ++static void doCmd(cmd) ++ int cmd; ++{ ++ switch (cmd) { ++ case P_BOK: ++ { ++ char *fullname; ++ ++ writePNG(); ++ PNGDialog(0); ++ ++ fullname = GetDirFullName(); ++ if (!ISPIPE(fullname[0])) { ++ XVCreatedFile(fullname); ++ StickInCtrlList(0); ++ } ++ } ++ break; ++ ++ case P_BCANC: ++ PNGDialog(0); ++ break; ++ ++ default: ++ break; ++ } ++} ++ ++ ++/*******************************************/ ++static void writePNG() ++{ ++ FILE *fp; ++ int w, h, nc, rv, ptype, pfree; ++ byte *inpix, *rmap, *gmap, *bmap; ++ ++ fp = OpenOutFile(filename); ++ if (!fp) return; ++ ++ fbasename = BaseName(filename); ++ ++ WaitCursor(); ++ inpix = GenSavePic(&ptype, &w, &h, &pfree, &nc, &rmap, &gmap, &bmap); ++ ++ rv = WritePNG(fp, inpix, ptype, w, h, rmap, gmap, bmap, nc); ++ ++ SetCursors(-1); ++ ++ if (CloseOutFile(fp, filename, rv) == 0) DirBox(0); ++ ++ if (pfree) free(inpix); ++} ++ ++ ++/*******************************************/ ++int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, numcols) ++ FILE *fp; ++ byte *pic; ++ int ptype, w, h; ++ byte *rmap, *gmap, *bmap; ++ int numcols; ++{ ++ png_struct *png_ptr; ++ png_info *info_ptr; ++ png_color palette[256]; ++ png_textp text; ++ byte remap[256]; ++ int i, filter, linesize, pass; ++ byte *p, *png_line; ++ char software[256]; ++ char *savecmnt; ++ ++ if ((png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, ++ png_xv_error, png_xv_warning)) == NULL) { ++ sprintf(software, "png_create_write_struct() failure in WritePNG (ver. %s)", ++ PNG_LIBPNG_VER_STRING); ++ FatalError(software); ++ } ++ ++ if ((info_ptr = png_create_info_struct(png_ptr)) == NULL) ++ { ++ png_destroy_write_struct(&png_ptr, &info_ptr); ++ sprintf(software, "png_create_info_struct() failure in WritePNG"); ++ FatalError(software); ++ } ++ ++ if (setjmp(png_ptr->jmpbuf)) { ++ png_destroy_write_struct(&png_ptr, &info_ptr); ++ return -1; ++ } ++ ++ png_init_io(png_ptr, fp); ++ ++ png_set_compression_level(png_ptr, (int)cDial.val); ++ ++ /* Don't bother filtering if we aren't compressing the image */ ++ if (FdefCB.val) ++ { ++ if ((int)cDial.val == 0) ++ png_set_filter(png_ptr, 0, PNG_FILTER_NONE); ++ } ++ else ++ { ++ filter = FnoneCB.val ? PNG_FILTER_NONE : 0; ++ filter |= FsubCB.val ? PNG_FILTER_SUB : 0; ++ filter |= FupCB.val ? PNG_FILTER_UP : 0; ++ filter |= FavgCB.val ? PNG_FILTER_AVG : 0; ++ filter |= FPaethCB.val ? PNG_FILTER_PAETH : 0; ++ ++ png_set_filter(png_ptr, 0, filter); ++ } ++ ++ info_ptr->width = w; ++ info_ptr->height = h; ++ if (w <= 0 || h <= 0) { ++ SetISTR(ISTR_WARNING, "%s: image dimensions out of range (%dx%d)", ++ fbasename, w, h); ++ png_destroy_write_struct(&png_ptr, &info_ptr); ++ return -1; ++ } ++ ++ info_ptr->interlace_type = interCB.val ? 1 : 0; ++ ++ linesize = 0; /* quiet a compiler warning */ ++ ++ if (colorType == F_FULLCOLOR || colorType == F_REDUCED) { ++ if(ptype == PIC24) { ++ linesize = 3*w; ++ if (linesize/3 < w) { ++ SetISTR(ISTR_WARNING, "%s: image dimensions too large (%dx%d)", ++ fbasename, w, h); ++ png_destroy_write_struct(&png_ptr, &info_ptr); ++ return -1; ++ } ++ info_ptr->color_type = PNG_COLOR_TYPE_RGB; ++ info_ptr->bit_depth = 8; ++ } else { ++ linesize = w; ++ info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; ++ if(numcols <= 2) ++ info_ptr->bit_depth = 1; ++ else ++ if(numcols <= 4) ++ info_ptr->bit_depth = 2; ++ else ++ if(numcols <= 16) ++ info_ptr->bit_depth = 4; ++ else ++ info_ptr->bit_depth = 8; ++ ++ for(i = 0; i < numcols; i++) { ++ palette[i].red = rmap[i]; ++ palette[i].green = gmap[i]; ++ palette[i].blue = bmap[i]; ++ } ++ info_ptr->num_palette = numcols; ++ info_ptr->palette = palette; ++ info_ptr->valid |= PNG_INFO_PLTE; ++ } ++ } ++ ++ else if(colorType == F_GREYSCALE || colorType == F_BWDITHER) { ++ info_ptr->color_type = PNG_COLOR_TYPE_GRAY; ++ if(colorType == F_BWDITHER) { ++ /* shouldn't happen */ ++ if (ptype == PIC24) FatalError("PIC24 and B/W Stipple in WritePNG()"); ++ ++ info_ptr->bit_depth = 1; ++ if(MONO(rmap[0], gmap[0], bmap[0]) > MONO(rmap[1], gmap[1], bmap[1])) { ++ remap[0] = 1; ++ remap[1] = 0; ++ } ++ else { ++ remap[0] = 0; ++ remap[1] = 1; ++ } ++ linesize = w; ++ } ++ else { ++ if(ptype == PIC24) { ++ linesize = 3*w; ++ if (linesize/3 < w) { ++ SetISTR(ISTR_WARNING, "%s: image dimensions too large (%dx%d)", ++ fbasename, w, h); ++ png_destroy_write_struct(&png_ptr, &info_ptr); ++ return -1; ++ } ++ info_ptr->bit_depth = 8; ++ } ++ else { ++ int low_precision; ++ ++ linesize = w; ++ ++ for(i = 0; i < numcols; i++) ++ remap[i] = MONO(rmap[i], gmap[i], bmap[i]); ++ ++ for(; i < 256; i++) ++ remap[i]=0; ++ ++ info_ptr->bit_depth = 8; ++ ++ /* Note that this fails most of the time because of gamma */ ++ /* try to adjust to 4-bit precision grayscale */ ++ ++ low_precision=1; ++ ++ for(i = 0; i < numcols; i++) { ++ if((remap[i] & 0x0f) * 0x11 != remap[i]) { ++ low_precision = 0; ++ break; ++ } ++ } ++ ++ if(low_precision) { ++ for(i = 0; i < numcols; i++) { ++ remap[i] &= 0xf; ++ } ++ info_ptr->bit_depth = 4; ++ ++ /* try to adjust to 2-bit precision grayscale */ ++ ++ for(i = 0; i < numcols; i++) { ++ if((remap[i] & 0x03) * 0x05 != remap[i]) { ++ low_precision = 0; ++ break; ++ } ++ } ++ } ++ ++ if(low_precision) { ++ for(i = 0; i < numcols; i++) { ++ remap[i] &= 3; ++ } ++ info_ptr->bit_depth = 2; ++ ++ /* try to adjust to 1-bit precision grayscale */ ++ ++ for(i = 0; i < numcols; i++) { ++ if((remap[i] & 0x01) * 0x03 != remap[i]) { ++ low_precision = 0; ++ break; ++ } ++ } ++ } ++ ++ if(low_precision) { ++ for(i = 0; i < numcols; i++) { ++ remap[i] &= 1; ++ } ++ info_ptr->bit_depth = 1; ++ } ++ } ++ } ++ } ++ ++ else ++ png_error(png_ptr, "Unknown colorstyle in WritePNG"); ++ ++ if ((text = (png_textp)malloc(sizeof(png_text)))) { ++ sprintf(software, "XV %s", REVDATE); ++ ++ text->compression = -1; ++ text->key = "Software"; ++ text->text = software; ++ text->text_length = strlen(text->text); ++ ++ info_ptr->max_text = 1; ++ info_ptr->num_text = 1; ++ info_ptr->text = text; ++ } ++ ++ Display_Gamma = gDial.val; /* Save the current gamma for loading */ ++ ++ info_ptr->gamma = 1.0/gDial.val; ++ info_ptr->valid |= PNG_INFO_gAMA; ++ ++ png_write_info(png_ptr, info_ptr); ++ ++ if(info_ptr->bit_depth < 8) ++ png_set_packing(png_ptr); ++ ++ pass=png_set_interlace_handling(png_ptr); ++ ++ if((png_line = malloc(linesize)) == NULL) ++ png_error(png_ptr, "cannot allocate temp image line"); ++ ++ for(i = 0; i < pass; i++) { ++ int j; ++ p = pic; ++ for(j = 0; j < h; j++) { ++ if(info_ptr->color_type == PNG_COLOR_TYPE_GRAY) { ++ int k; ++ for(k = 0; k < w; k++) ++ png_line[k] = ptype==PIC24 ? MONO(p[k*3], p[k*3+1], p[k*3+2]) : ++ remap[p[k]]; ++ png_write_row(png_ptr, png_line); ++ } else /* RGB or palette */ ++ png_write_row(png_ptr, p); ++ if((j & 0x1f) == 0) WaitCursor(); ++ p += linesize; ++ } ++ } ++ ++ free(png_line); ++ ++ savecmnt = NULL; /* quiet a compiler warning */ ++ ++ if (text) ++ { ++ if (picComments && strlen(picComments) && ++ (savecmnt = (char *)malloc((strlen(picComments) + 1)*sizeof(char)))) { ++ png_textp tp; ++ char *comment, *key; ++ ++ strcpy(savecmnt, picComments); ++ key = savecmnt; ++ tp = text; ++ info_ptr->num_text = 0; ++ ++ comment = strchr(key, ':'); ++ ++ do { ++ /* Allocate a larger structure for comments if necessary */ ++ if (info_ptr->num_text >= info_ptr->max_text) ++ { ++ if ((tp = ++ realloc(text, (info_ptr->num_text + 2)*sizeof(png_text))) == NULL) ++ { ++ break; ++ } ++ else ++ { ++ text = tp; ++ tp = &text[info_ptr->num_text]; ++ info_ptr->max_text += 2; ++ } ++ } ++ ++ /* See if it looks like a PNG keyword from LoadPNG */ ++ /* GRR: should test for strictly < 80, right? (key = 1-79 chars only) */ ++ if(comment && comment[1] == ':' && comment - key <= 80) { ++ *(comment++) = '\0'; ++ *(comment++) = '\0'; ++ ++ /* If the comment is the 'Software' chunk XV writes, we remove it, ++ since we have already stored one */ ++ if (strcmp(key, "Software") == 0 && strncmp(comment, "XV", 2) == 0) { ++ key = strchr(comment, '\n'); ++ if(key) ++ key++; /* skip \n */ ++ comment = strchr(key, ':'); ++ } ++ /* We have another keyword and/or comment to write out */ ++ else { ++ tp->key = key; ++ tp->text = comment; ++ ++ /* We have to find the end of this comment, and the next keyword ++ if there is one */ ++ for (; NULL != (key = comment = strchr(comment, ':')); comment++) ++ if (key[1] == ':') ++ break; ++ ++ /* It looks like another keyword, go backward to the beginning */ ++ if (key) { ++ while(key > tp->text && *key != '\n') ++ key--; ++ ++ if (key > tp->text && comment - key <= 80) { ++ *key = '\0'; ++ key++; ++ } ++ } ++ ++ tp->text_length = strlen(tp->text); ++ ++ /* We don't have another keyword, so remove the last newline */ ++ if (!key && tp->text[tp->text_length - 1] == '\n') ++ { ++ tp->text[tp->text_length] = '\0'; ++ tp->text_length--; ++ } ++ ++ tp->compression = tp->text_length > 640 ? 0 : -1; ++ info_ptr->num_text++; ++ tp++; ++ } ++ } ++ /* Just a generic comment: make sure line-endings are valid for PNG */ ++ else { ++ char *p=key, *q=key; /* only deleting chars, not adding any */ ++ ++ while (*p) { ++ if (*p == CR) { /* lone CR or CR/LF: EOL either way */ ++ *q++ = LF; /* LF is the only allowed PNG line-ending */ ++ if (p[1] == LF) /* get rid of any original LF */ ++ ++p; ++ } else if (*p == LF) /* lone LF */ ++ *q++ = LF; ++ else ++ *q++ = *p; ++ ++p; ++ } ++ *q = '\0'; /* unnecessary...but what the heck */ ++ tp->key = "Comment"; ++ tp->text = key; ++ tp->text_length = q - key; ++ tp->compression = tp->text_length > 750 ? 0 : -1; ++ info_ptr->num_text++; ++ key = NULL; ++ } ++ } while (key && *key); ++ } ++ else ++ { ++ info_ptr->num_text = 0; ++ } ++ } ++ info_ptr->text = text; ++ ++ png_convert_from_time_t(&(info_ptr->mod_time), time(NULL)); ++ info_ptr->valid |= PNG_INFO_tIME; ++ ++ png_write_end(png_ptr, info_ptr); ++ fflush(fp); /* just in case we core-dump before finishing... */ ++ ++ if (text) ++ { ++ free(text); ++ /* must do this or png_destroy_write_struct() 0.97+ will free text again: */ ++ info_ptr->text = (png_textp)NULL; ++ if (savecmnt) ++ { ++ free(savecmnt); ++ savecmnt = (char *)NULL; ++ } ++ } ++ ++ png_destroy_write_struct(&png_ptr, &info_ptr); ++ ++ return 0; ++} ++ ++ ++/*******************************************/ ++int LoadPNG(fname, pinfo) ++ char *fname; ++ PICINFO *pinfo; ++/*******************************************/ ++{ ++ /* returns '1' on success */ ++ ++ FILE *fp; ++ png_struct *png_ptr; ++ png_info *info_ptr; ++ png_color_16 my_background; ++ int i,j; ++ int linesize, bufsize; ++ int filesize; ++ int pass; ++ int gray_to_rgb; ++ size_t commentsize; ++ ++ fbasename = BaseName(fname); ++ ++ pinfo->pic = (byte *) NULL; ++ pinfo->comment = (char *) NULL; ++ ++ read_anything=0; ++ ++ /* open the file */ ++ fp = xv_fopen(fname,"r"); ++ if (!fp) { ++ SetISTR(ISTR_WARNING,"%s: can't open file", fname); ++ return 0; ++ } ++ ++ /* find the size of the file */ ++ fseek(fp, 0L, 2); ++ filesize = ftell(fp); ++ fseek(fp, 0L, 0); ++ ++ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, ++ png_xv_error, png_xv_warning); ++ if(!png_ptr) { ++ fclose(fp); ++ FatalError("malloc failure in LoadPNG"); ++ } ++ ++ info_ptr = png_create_info_struct(png_ptr); ++ ++ if(!info_ptr) { ++ fclose(fp); ++ png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); ++ FatalError("malloc failure in LoadPNG"); ++ } ++ ++ if(setjmp(png_ptr->jmpbuf)) { ++ fclose(fp); ++ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); ++ if(!read_anything) { ++ if(pinfo->pic) { ++ free(pinfo->pic); ++ pinfo->pic = NULL; ++ } ++ if(pinfo->comment) { ++ free(pinfo->comment); ++ pinfo->comment = NULL; ++ } ++ } ++ return read_anything; ++ } ++ ++ png_init_io(png_ptr, fp); ++ png_read_info(png_ptr, info_ptr); ++ ++ pinfo->w = pinfo->normw = info_ptr->width; ++ pinfo->h = pinfo->normh = info_ptr->height; ++ if (pinfo->w <= 0 || pinfo->h <= 0) { ++ SetISTR(ISTR_WARNING, "%s: image dimensions out of range (%dx%d)", ++ fbasename, pinfo->w, pinfo->h); ++ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); ++ return read_anything; ++ } ++ ++ pinfo->frmType = F_PNG; ++ ++ sprintf(pinfo->fullInfo, "PNG, %d bit ", ++ info_ptr->bit_depth * info_ptr->channels); ++ ++ switch(info_ptr->color_type) { ++ case PNG_COLOR_TYPE_PALETTE: ++ strcat(pinfo->fullInfo, "palette color"); ++ break; ++ ++ case PNG_COLOR_TYPE_GRAY: ++ strcat(pinfo->fullInfo, "grayscale"); ++ break; ++ ++ case PNG_COLOR_TYPE_GRAY_ALPHA: ++ strcat(pinfo->fullInfo, "grayscale+alpha"); ++ break; ++ ++ case PNG_COLOR_TYPE_RGB: ++ strcat(pinfo->fullInfo, "truecolor"); ++ break; ++ ++ case PNG_COLOR_TYPE_RGB_ALPHA: ++ strcat(pinfo->fullInfo, "truecolor+alpha"); ++ break; ++ } ++ ++ sprintf(pinfo->fullInfo + strlen(pinfo->fullInfo), ++ ", %sinterlaced. (%d bytes)", ++ info_ptr->interlace_type ? "" : "non-", filesize); ++ ++ sprintf(pinfo->shrtInfo, "%lux%lu PNG", info_ptr->width, info_ptr->height); ++ ++ if (info_ptr->bit_depth < 8) ++ png_set_packing(png_ptr); ++ ++ if (info_ptr->valid & PNG_INFO_gAMA) ++ png_set_gamma(png_ptr, Display_Gamma, info_ptr->gamma); ++ else ++ png_set_gamma(png_ptr, Display_Gamma, 0.45); ++ ++ gray_to_rgb = 0; /* quiet a compiler warning */ ++ ++ if (have_imagebg) { ++ if (info_ptr->bit_depth == 16) { ++ my_background.red = imagebgR; ++ my_background.green = imagebgG; ++ my_background.blue = imagebgB; ++ my_background.gray = imagebgG; /* only used if all three equal... */ ++ } else { ++ my_background.red = (imagebgR >> 8); ++ my_background.green = (imagebgG >> 8); ++ my_background.blue = (imagebgB >> 8); ++ my_background.gray = my_background.green; ++ } ++ png_set_background(png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, ++ 0, Display_Gamma); ++ if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA || ++ (info_ptr->color_type == PNG_COLOR_TYPE_GRAY && HAVE_tRNS)) && ++ (imagebgR != imagebgG || imagebgR != imagebgB)) /* i.e., colored bg */ ++ { ++ png_set_gray_to_rgb(png_ptr); ++ png_set_expand(png_ptr); ++ gray_to_rgb = 1; ++ } ++ } else { ++ if (info_ptr->valid & PNG_INFO_bKGD) { ++ png_set_background(png_ptr, &info_ptr->background, ++ PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); ++ } else { ++ my_background.red = my_background.green = my_background.blue = ++ my_background.gray = 0; ++ png_set_background(png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, ++ 0, Display_Gamma); ++ } ++ } ++ ++ if (info_ptr->bit_depth == 16) ++ png_set_strip_16(png_ptr); ++ ++ if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY || ++ info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) ++ { ++ if (info_ptr->bit_depth == 1) ++ pinfo->colType = F_BWDITHER; ++ else ++ pinfo->colType = F_GREYSCALE; ++ png_set_expand(png_ptr); ++ } ++ ++ pass=png_set_interlace_handling(png_ptr); ++ ++ png_read_update_info(png_ptr, info_ptr); ++ ++ if(info_ptr->color_type == PNG_COLOR_TYPE_RGB || ++ info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || gray_to_rgb) ++ { ++ linesize = 3 * pinfo->w; ++ if (linesize/3 < pinfo->w) { /* know pinfo->w > 0 (see above) */ ++ SetISTR(ISTR_WARNING, "%s: image dimensions too large (%dx%d)", ++ fbasename, pinfo->w, pinfo->h); ++ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); ++ return read_anything; ++ } ++ pinfo->colType = F_FULLCOLOR; ++ pinfo->type = PIC24; ++ } else { ++ linesize = pinfo->w; ++ pinfo->type = PIC8; ++ if(info_ptr->color_type == PNG_COLOR_TYPE_GRAY || ++ info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { ++ for(i = 0; i < 256; i++) ++ pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i; ++ } else { ++ pinfo->colType = F_FULLCOLOR; ++ for(i = 0; i < info_ptr->num_palette; i++) { ++ pinfo->r[i] = info_ptr->palette[i].red; ++ pinfo->g[i] = info_ptr->palette[i].green; ++ pinfo->b[i] = info_ptr->palette[i].blue; ++ } ++ } ++ } ++ ++ bufsize = linesize * pinfo->h; ++ if (bufsize/linesize < pinfo->h) { /* know linesize, pinfo->h > 0 (above) */ ++ SetISTR(ISTR_WARNING, "%s: image dimensions too large (%dx%d)", ++ fbasename, pinfo->w, pinfo->h); ++ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); ++ return read_anything; ++ } ++ pinfo->pic = calloc((size_t)bufsize, (size_t)1); ++ ++ if(!pinfo->pic) { ++ png_error(png_ptr, "can't allocate space for PNG image"); ++ } ++ ++ png_start_read_image(png_ptr); ++ ++ for(i = 0; i < pass; i++) { ++ byte *p = pinfo->pic; ++ for(j = 0; j < pinfo->h; j++) { ++ png_read_row(png_ptr, p, NULL); ++ read_anything = 1; ++ if((j & 0x1f) == 0) WaitCursor(); ++ p += linesize; ++ } ++ } ++ ++ png_read_end(png_ptr, info_ptr); ++ ++ if(info_ptr->num_text > 0) { ++ commentsize = 1; ++ ++ for(i = 0; i < info_ptr->num_text; i++) ++ commentsize += strlen(info_ptr->text[i].key) + 1 + ++ info_ptr->text[i].text_length + 2; ++ ++ if((pinfo->comment = malloc(commentsize)) == NULL) { ++ png_warning(png_ptr,"can't allocate comment string"); ++ } ++ else { ++ pinfo->comment[0] = '\0'; ++ for(i = 0; i < info_ptr->num_text; i++) { ++ strcat(pinfo->comment, info_ptr->text[i].key); ++ strcat(pinfo->comment, "::"); ++ strcat(pinfo->comment, info_ptr->text[i].text); ++ strcat(pinfo->comment, "\n"); ++ } ++ } ++ } ++ ++ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); ++ ++ fclose(fp); ++ ++ return 1; ++} ++ ++ ++/*******************************************/ ++static void ++png_xv_error(png_ptr, message) ++ png_structp png_ptr; ++ png_const_charp message; ++{ ++ SetISTR(ISTR_WARNING,"%s: libpng error: %s", fbasename, message); ++ ++ longjmp(png_ptr->jmpbuf, 1); ++} ++ ++ ++/*******************************************/ ++static void ++png_xv_warning(png_ptr, message) ++ png_structp png_ptr; ++ png_const_charp message; ++{ ++ if (!png_ptr) ++ return; ++ ++ SetISTR(ISTR_WARNING,"%s: libpng warning: %s", fbasename, message); ++} ++ ++ ++/*******************************************/ ++void ++VersionInfoPNG() /* GRR 19980605 */ ++{ ++ fprintf(stderr, " Compiled with libpng %s; using libpng %s.\n", ++ PNG_LIBPNG_VER_STRING, png_libpng_ver); ++ fprintf(stderr, " Compiled with zlib %s; using zlib %s.\n", ++ ZLIB_VERSION, zlib_version); ++} ++ ++#endif /* HAVE_PNG */ +diff -ruN xv-3.10a-bugfixes/xvpopup.c xv-3.10a-enhancements/xvpopup.c +--- xv-3.10a-bugfixes/xvpopup.c 2004-05-16 18:04:13.000000000 -0700 ++++ xv-3.10a-enhancements/xvpopup.c 2005-04-25 08:21:34.000000000 -0700 +@@ -23,7 +23,7 @@ + #define OMIT_ICON_BITS + #include "bits/icon" /* icon_bits[] not used, but icon_width/height are */ + +-#define PUWIDE 400 ++#define PUWIDE 480 + #define PUHIGH 170 + + #define PAD_PUWIDE 480 +@@ -201,14 +201,14 @@ + + if (!padHaveDooDads) { + DCreate(&padWDial, popW, 16, puhigh-16-100-1,75,100, +- 1, 2048, pWIDE, 10, ++ 1.0, 2048.0, (double)pWIDE, 1.0, 10.0, + infofg, infobg, hicol, locol, "Width", NULL); + DCreate(&padHDial, popW, 16+1+75, puhigh-16-100-1,75,100, +- 1, 2048, pHIGH, 10, ++ 1.0, 2048.0, (double)pHIGH, 1.0, 10.0, + infofg, infobg, hicol, locol, "Height", NULL); + + DCreate(&padODial, popW, 16+1+75+75+9, puhigh-16-100-1,75,100, +- 0, 100, 100, 10, ++ 0.0, 100.0, 100.0, 1.0, 10.0, + infofg, infobg, hicol, locol, "Opaque", NULL); + + MBCreate(&padMthdMB, popW, 100-2+44, 10, 140, 19, NULL, +@@ -259,9 +259,9 @@ + else if (poptyp == ISPAD) { + BTSetActive(&bts[0], (int) strlen(gsBuf)); + i = pWIDE * 3; RANGE(i,2048,9999); +- DSetRange(&padWDial, 1, i, padWDial.val, 10); ++ DSetRange(&padWDial, 1.0, (double)i, padWDial.val, 1.0, 10.0); + i = pHIGH * 3; RANGE(i,2048,9999); +- DSetRange(&padHDial, 1, i, padHDial.val, 10); ++ DSetRange(&padHDial, 1.0, (double)i, padHDial.val, 1.0, 10.0); + + DSetActive(&padWDial, (padMode!=PAD_LOAD)); /* DSetRange activates dial */ + DSetActive(&padHDial, (padMode!=PAD_LOAD)); +@@ -287,15 +287,19 @@ + /* center first button in window around mouse position, with constraint that + window be fully on the screen */ + +- CenterMapWindow(popW, 40 + bts[0].x, BUTTH/2 + bts[0].y, puwide, puhigh); + popUp = poptyp; ++ if (startGrab == 2) ++ startGrab = 4; ++ else { ++ CenterMapWindow(popW, 40 + bts[0].x, BUTTH/2 + bts[0].y, puwide, puhigh); + +- /* MUST wait for VisibilityNotify event to come in, else we run the risk +- of UnMapping the window *before* the Map request completed. This +- appears to be bad, (It leaves an empty window frame up.) though it +- generally only happens on slow servers. Better safe than screwed... */ ++ /* MUST wait for VisibilityNotify event to come in, else we run the risk ++ of UnMapping the window *before* the Map request completed. This ++ appears to be bad, (It leaves an empty window frame up.) though it ++ generally only happens on slow servers. Better safe than screwed... */ + +- XWindowEvent(theDisp, popW, VisibilityChangeMask, &event); ++ XWindowEvent(theDisp, popW, VisibilityChangeMask, &event); ++ } + + /* block until this window gets closed */ + while (popUp) { +@@ -466,9 +470,9 @@ + changedGSBuf(); /* careful! popW doesn't exist yet! */ + + if (padHaveDooDads) { +- oldW = padWDial.val; +- oldH = padHDial.val; +- oldO = padODial.val; ++ oldW = (int)padWDial.val; ++ oldH = (int)padHDial.val; ++ oldO = (int)padODial.val; + } + else { oldW = pWIDE; oldH = pHIGH; oldO = 100; } + +@@ -487,9 +491,9 @@ + } + + if (rv == 1) { /* cancelled: restore normal values */ +- DSetVal(&padWDial, oldW); +- DSetVal(&padHDial, oldH); +- DSetVal(&padODial, oldO); ++ DSetVal(&padWDial, (double)oldW); ++ DSetVal(&padHDial, (double)oldH); ++ DSetVal(&padODial, (double)oldO); + } + + XUnmapWindow(theDisp, padWDial.win); +@@ -499,9 +503,9 @@ + /* load up return values */ + *pMode = padMode; + *pStr = padBuf; +- *pWide = padWDial.val; +- *pHigh = padHDial.val; +- *pOpaque = padODial.val; ++ *pWide = (int)padWDial.val; ++ *pHigh = (int)padHDial.val; ++ *pOpaque = (int)padODial.val; + *pOmode = padOMode; + + return rv; +@@ -956,14 +960,14 @@ + int x,y; + { + int i; +- BUTT *bp; ++ BUTT *bp = NULL; + + for (i=0; i<nbts; i++) { + bp = &bts[i]; + if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break; + } + +- if (i<nbts && BTTrack(bp)) { ++ if (i<nbts && bp && BTTrack(bp)) { + popUp = 0; selected = i; return; + } + +@@ -972,8 +976,8 @@ + else if (popUp == ISPAD) { + if (PTINRECT(x, y, padDButt.x, padDButt.y, padDButt.w, padDButt.h)) { + if (BTTrack(&padDButt)) { +- DSetVal(&padWDial, pWIDE); +- DSetVal(&padHDial, pHIGH); ++ DSetVal(&padWDial, (double)pWIDE); ++ DSetVal(&padHDial, (double)pHIGH); + } + } + +@@ -1105,7 +1109,7 @@ + } + + +- else if (c=='\010' || c=='\177') { /* BS or DEL */ ++ else if (c=='\010') { /* BS */ + if (gsCurPos==0) return 1; /* at beginning of str */ + xvbcopy(&gsBuf[gsCurPos], &gsBuf[gsCurPos-1], (size_t) len-gsCurPos+1); + gsCurPos--; +@@ -1128,7 +1132,7 @@ + gsCurPos = len; + } + +- else if (c=='\004') { /* ^D: delete character at gsCurPos */ ++ else if (c=='\004' || c=='\177') { /* ^D or DEL: delete character at gsCurPos */ + if (gsCurPos==len) return 1; + xvbcopy(&gsBuf[gsCurPos+1], &gsBuf[gsCurPos], (size_t) len-gsCurPos); + } +diff -ruN xv-3.10a-bugfixes/xvps.c xv-3.10a-enhancements/xvps.c +--- xv-3.10a-bugfixes/xvps.c 2005-03-30 08:18:17.000000000 -0800 ++++ xv-3.10a-enhancements/xvps.c 2005-04-17 14:45:28.000000000 -0700 +@@ -142,9 +142,9 @@ + CBCreate(&encapsCB, psW, 240, 7, "preview", infofg, infobg, hicol, locol); + CBCreate(&pscompCB, psW, 331, 7, "compress", infofg, infobg, hicol, locol); + +- DCreate(&xsDial, psW, 240, 30, 80, 100, 10, 800, 100, 5, ++ DCreate(&xsDial, psW, 240, 30, 80, 100, 10.0, 800.0, 100.0, 0.5, 5.0, + infofg, infobg, hicol, locol, "Width", "%"); +- DCreate(&ysDial, psW, 331, 30, 80, 100, 10, 800, 100, 5, ++ DCreate(&ysDial, psW, 331, 30, 80, 100, 10.0, 800.0, 100.0, 0.5, 5.0, + infofg, infobg, hicol, locol, "Height", "%"); + xsDial.drawobj = changedScale; + ysDial.drawobj = changedScale; +@@ -239,10 +239,10 @@ + + if (rd_int("psres")) { /* xv.psres: default paper resolution */ + if (def_int >= 10 && def_int <= 720) { +- int i = (int) ((PIX2INCH * 100) / def_int); ++ double v = (PIX2INCH * 100) / def_int; + +- DSetVal(&xsDial, i); +- DSetVal(&ysDial, i); ++ DSetVal(&xsDial, v); ++ DSetVal(&ysDial, v); + } + } + +@@ -839,7 +839,7 @@ + if (scx < scy) { sz_iny = h * scx; } + else { sz_inx = w * scy; } + +- DSetVal(&xsDial, (int) ((100 * (sz_inx * PIX2INCH) / w) + .5)); ++ DSetVal(&xsDial, 100 * (sz_inx * PIX2INCH) / w); + DSetVal(&ysDial, xsDial.val); + + sz_inx = (double) w / PIX2INCH * (xsDial.val / 100.0); +@@ -1561,9 +1561,9 @@ + the first one is loaded (but not deleted) */ + + #ifdef GS_PATH +- char tmp[512], gscmd[512], cmdstr[512], tmpname[64]; ++ #define CMDSIZE 1024 ++ char tmp[512], gscmd[512], cmdstr[CMDSIZE], tmpname[64]; + int gsresult, nump, i, filetype, doalert, epsf; +- char *rld; + #endif + + pinfo->pic = (byte *) NULL; +@@ -1596,7 +1596,7 @@ + /* build 'gscmd' string */ + + #ifndef VMS /* VMS needs quotes around mixed case command lines */ +- sprintf(gscmd, "%s -sDEVICE=%s -r%d -q -dNOPAUSE -sOutputFile=%s%%d ", ++ sprintf(gscmd, "%s -sDEVICE=%s -r%d -q -dSAFER -dNOPAUSE -sOutputFile=%s%%d ", + GS_PATH, gsDev, gsRes, tmpname); + #else + sprintf(gscmd, +@@ -1734,32 +1734,48 @@ + + /******************************************************************/ + #ifdef GS_PATH +-void buildCmdStr(str, gscmd, fname, quick, epsf) +- char *str, *gscmd, *fname; ++void buildCmdStr(str, gscmd, xname, quick, epsf) ++ char *str, *gscmd, *xname; + int quick, epsf; + { + /* note 'epsf' set only on files that don't have a showpage cmd */ ++ char *x, *y, *fname; ++ ++ x = (char *) malloc((5 * strlen(xname))+3); ++ if (!x) ++ FatalError("malloc failure in xvps.c buildCmdStr"); ++ fname = x; ++ *x++ = 0x27; ++ ++ for (y = xname; *y; ++y) { ++ if (0x27 == *y) { ++ strcpy(x, "'\"'\"'"); ++ x += strlen(x); ++ } else *x++ = *y; ++ } ++ strcpy (x, "'"); + + #ifndef VMS + +- if (epsf) sprintf(str, "echo '\n showpage ' | cat '%s' - | %s -", ++ if (epsf) snprintf(str, CMDSIZE, "echo '\n showpage ' | cat %s - | %s -", + fname, gscmd); + +- else if (quick) sprintf(str, "echo '%s' | cat - '%s' | %s -", ++ else if (quick) snprintf(str, CMDSIZE, "echo %s | cat - %s | %s -", + "/showpage { showpage quit } bind def", + fname, gscmd); + +- else sprintf(str, "%s -- %s", gscmd, fname); ++ else snprintf(str, CMDSIZE, "%s -- %s", gscmd, fname); + + #else /* VMS */ + /* VMS doesn't have pipes or an 'echo' command and GS doesn't like +- Unix-style file names as input files in the VMS version */ ++ Unix-style filenames as input files in the VMS version */ + strcat(tmp, " -- "); + rld = strrchr(fname, '/'); /* Pointer to last '/' */ + if (rld) rld++; /* Pointer to filename */ + else rld = fname; /* No path - use original string */ + strcat(tmp, rld); + #endif /* VMS */ ++ free(fname); + } + #endif /* GS_PATH */ + +diff -ruN xv-3.10a-bugfixes/xvrle.c xv-3.10a-enhancements/xvrle.c +--- xv-3.10a-bugfixes/xvrle.c 2005-03-29 23:29:14.000000000 -0800 ++++ xv-3.10a-enhancements/xvrle.c 2004-05-16 18:07:46.000000000 -0700 +@@ -43,7 +43,7 @@ + byte bgcol[256]; + byte maps[3][256]; + int xpos, ypos, w, h, flags, ncolors, pixelbits, ncmap, cmaplen; +- int cmtlen, npixels, bufsize=0; ++ int cmtlen; + byte *img; + long filesize; + char *bname, *errstr; +@@ -176,44 +176,32 @@ + + errstr = NULL; + if (ncolors == 0 || ncolors == 2) +- errstr = "Unsupported number of channels in RLE file"; ++ errstr = "Unsupt. # of channels in RLE file.\n"; + + if (pixelbits != 8) +- errstr = "Only 8-bit pixels supported in RLE files"; ++ errstr = "Only 8-bit pixels supported in RLE files.\n"; + + if (ncmap==0 || ncmap==1 || ncmap == 3 || ncmap == ncolors) { /* ok */ } +- else errstr = "Invalid number of colormap channels in RLE file"; ++ else errstr = "Invalid # of colormap channels in RLE file.\n"; + +- npixels = w * h; +- if (w <= 0 || h <= 0 || npixels/w != h) +- errstr = "RLE image dimensions out of range"; ++ if (w<1 || h<1) ++ errstr = "Bogus size in RLE header.\n"; + + + if (errstr) { + fclose(fp); +- if (pinfo->comment) +- free(pinfo->comment); +- pinfo->comment = (char *) NULL; ++ if (pinfo->comment) free(pinfo->comment); pinfo->comment = (char *) NULL; + return rleError(bname, errstr); + } + + + /* allocate image memory */ +- if (ncolors == 1) +- img = (byte *) calloc((size_t) npixels, (size_t) 1); +- else { +- bufsize = 3*npixels; +- if (bufsize/3 != npixels) +- return rleError(bname, "RLE image dimensions out of range"); +- img = (byte *) calloc((size_t) bufsize, (size_t) 1); +- } +- ++ if (ncolors == 1) img = (byte *) calloc((size_t) w * h, (size_t) 1); ++ else img = (byte *) calloc((size_t) w * h * 3, (size_t) 1); + if (!img) { + fclose(fp); +- if (pinfo->comment) +- free(pinfo->comment); +- pinfo->comment = (char *) NULL; +- return rleError(bname, "Unable to allocate RLE image data"); ++ if (pinfo->comment) free(pinfo->comment); pinfo->comment = (char *) NULL; ++ return rleError(bname, "unable to allocate image data.\n"); + } + + +@@ -221,10 +209,10 @@ + if ((flags & H_CLEARFIRST) && !(flags & H_NO_BACKGROUND)) { + byte *ip; + if (ncolors == 1) { +- for (i=0, ip=img; i<npixels; i++, ip++) *ip = bgcol[0]; ++ for (i=0, ip=img; i<w*h; i++, ip++) *ip = bgcol[0]; + } + else { +- for (i=0, ip=img; i<npixels; i++) ++ for (i=0, ip=img; i<w*h; i++) + for (j=0; j<3; j++, ip++) *ip = bgcol[j]; + } + } +@@ -242,7 +230,7 @@ + if (ncmap) { + byte *ip; + int imagelen, cmask; +- imagelen = (ncolors==1) ? npixels : bufsize; ++ imagelen = (ncolors==1) ? w*h : w*h*3; + cmask = (cmaplen-1); + + if (ncmap == 1) { /* single gamma curve */ +@@ -250,7 +238,7 @@ + } + + else if (ncmap >= 3 && ncolors >=3) { /* one curve per band */ +- for (i=0, ip=img; i<npixels; i++) { ++ for (i=0, ip=img; i<w*h; i++) { + *ip = maps[0][*ip & cmask]; ip++; + *ip = maps[1][*ip & cmask]; ip++; + *ip = maps[2][*ip & cmask]; ip++; +diff -ruN xv-3.10a-bugfixes/xvroot.c xv-3.10a-enhancements/xvroot.c +--- xv-3.10a-bugfixes/xvroot.c 2004-05-16 18:04:21.000000000 -0700 ++++ xv-3.10a-enhancements/xvroot.c 2004-05-16 18:07:52.000000000 -0700 +@@ -44,6 +44,7 @@ + case RM_MIRROR: + case RM_IMIRROR: rpixw = 2*eWIDE; rpixh = 2*eHIGH; break; + case RM_CSOLID: ++ case RM_UPLEFT: + case RM_CWARP: + case RM_CBRICK: rpixw = dispWIDE; rpixh = dispHIGH; break; + +@@ -101,7 +102,7 @@ + + + else if (rmode == RM_CENTER || rmode == RM_CENTILE || rmode == RM_CSOLID || +- rmode == RM_CWARP || rmode == RM_CBRICK) { ++ rmode == RM_CWARP || rmode == RM_CBRICK || rmode == RM_UPLEFT) { + /* do some stuff to set up the border around the picture */ + + if (rmode != RM_CENTILE) { +@@ -138,6 +139,12 @@ + + else if (rmode == RM_CSOLID) { } + ++ else if (rmode == RM_UPLEFT) { ++ ++ XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, 0,0, ++ (u_int) eWIDE, (u_int) eHIGH); ++ } ++ + else if (rmode == RM_CWARP) { /* warp effect */ + XSetForeground(theDisp, theGC, rootfg); + for (i=0; i<=dispWIDE; i+=8) +@@ -157,7 +164,7 @@ + + + /* draw the image centered on top of the background */ +- if (rmode != RM_CENTILE) ++ if ((rmode != RM_CENTILE) && (rmode != RM_UPLEFT)) + XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, + ((int) dispWIDE-eWIDE)/2, ((int) dispHIGH-eHIGH)/2, + (u_int) eWIDE, (u_int) eHIGH); +diff -ruN xv-3.10a-bugfixes/xvsmooth.c xv-3.10a-enhancements/xvsmooth.c +--- xv-3.10a-bugfixes/xvsmooth.c 2004-05-16 18:04:28.000000000 -0700 ++++ xv-3.10a-enhancements/xvsmooth.c 2004-05-16 18:07:59.000000000 -0700 +@@ -105,7 +105,7 @@ + /* we can save a lot of time by precomputing cxtab[] and pxtab[], both + dwide arrays of ints that contain values for the equations: + cx = (ex * swide) / dwide; +- px = ((ex * swide * 100) / dwide) - (cx * 100) - 50; */ ++ px = ((ex * swide * 128) / dwide) - (cx * 128) - 64; */ + + cxtab = (int *) malloc(dwide * sizeof(int)); + if (!cxtab) { free(pic24); return NULL; } +@@ -115,8 +115,8 @@ + + for (ex=0; ex<dwide; ex++) { + cxtab[ex] = (ex * swide) / dwide; +- pxtab[ex] = (((ex * swide)* 100) / dwide) +- - (cxtab[ex] * 100) - 50; ++ pxtab[ex] = (((ex * swide)* 128) / dwide) ++ - (cxtab[ex] * 128) - 64; + } + + for (ey=0; ey<dhigh; ey++) { +@@ -125,7 +125,7 @@ + ProgressMeter(0, (dhigh)-1, ey, "Smooth"); + + cy = (ey * shigh) / dhigh; +- py = (((ey * shigh) * 100) / dhigh) - (cy * 100) - 50; ++ py = (((ey * shigh) * 128) / dhigh) - (cy * 128) - 64; + if (py<0) { y1 = cy-1; if (y1<0) y1=0; } + else { y1 = cy+1; if (y1>shigh-1) y1=shigh-1; } + +@@ -172,30 +172,30 @@ + else { + /* compute weighting factors */ + apx = abs(px); apy = abs(py); +- pA = (apx * apy) / 100; +- pB = (apy * (100 - apx)) / 100; +- pC = (apx * (100 - apy)) / 100; +- pD = 100 - (pA + pB + pC); ++ pA = (apx * apy) >> 7; /* div 128 */ ++ pB = (apy * (128 - apx)) >> 7; /* div 128 */ ++ pC = (apx * (128 - apy)) >> 7; /* div 128 */ ++ pD = 128 - (pA + pB + pC); + + if (is24) { +- *pp++ = ((int) (pA * rA))/100 + ((int) (pB * rB))/100 + +- ((int) (pC * rC))/100 + ((int) (pD * rD))/100; ++ *pp++ = (((int) (pA * rA))>>7) + (((int) (pB * rB))>>7) + ++ (((int) (pC * rC))>>7) + (((int) (pD * rD))>>7); + +- *pp++ = ((int) (pA * gA))/100 + ((int) (pB * gB))/100 + +- ((int) (pC * gC))/100 + ((int) (pD * gD))/100; ++ *pp++ = (((int) (pA * gA))>>7) + (((int) (pB * gB))>>7) + ++ (((int) (pC * gC))>>7) + (((int) (pD * gD))>>7); + +- *pp++ = ((int) (pA * bA))/100 + ((int) (pB * bB))/100 + +- ((int) (pC * bC))/100 + ((int) (pD * bD))/100; ++ *pp++ = (((int) (pA * bA))>>7) + (((int) (pB * bB))>>7) + ++ (((int) (pC * bC))>>7) + (((int) (pD * bD))>>7); + } + else { /* 8-bit pic */ +- *pp++ = ((int) (pA * rmap[cA]))/100 + ((int)(pB * rmap[cB]))/100 + +- ((int) (pC * rmap[cC]))/100 + ((int)(pD * rmap[cD]))/100; ++ *pp++ = (((int)(pA * rmap[cA]))>>7) + (((int)(pB * rmap[cB]))>>7) + ++ (((int)(pC * rmap[cC]))>>7) + (((int)(pD * rmap[cD]))>>7); + +- *pp++ = ((int) (pA * gmap[cA]))/100 + ((int)(pB * gmap[cB]))/100 + +- ((int) (pC * gmap[cC]))/100 + ((int)(pD * gmap[cD]))/100; ++ *pp++ = (((int)(pA * gmap[cA]))>>7) + (((int)(pB * gmap[cB]))>>7) + ++ (((int)(pC * gmap[cC]))>>7) + (((int)(pD * gmap[cD]))>>7); + +- *pp++ = ((int)(pA * bmap[cA]))/100 + ((int)(pB * bmap[cB]))/100 + +- ((int)(pC * bmap[cC]))/100 + ((int)(pD * bmap[cD]))/100; ++ *pp++ = (((int)(pA * bmap[cA]))>>7) + (((int)(pB * bmap[cB]))>>7) + ++ (((int)(pC * bmap[cC]))>>7) + (((int)(pD * bmap[cD]))>>7); + } + } + } +diff -ruN xv-3.10a-bugfixes/xvtext.c xv-3.10a-enhancements/xvtext.c +--- xv-3.10a-bugfixes/xvtext.c 2004-05-16 18:04:38.000000000 -0700 ++++ xv-3.10a-enhancements/xvtext.c 2005-05-01 13:04:23.000000000 -0700 +@@ -19,9 +19,13 @@ + #include "copyright.h" + + #include "xv.h" ++#ifdef TV_MULTILINGUAL ++#include "xvml.h" ++#endif + +- +-#define BUTTW 80 ++#define BUTTW1 80 ++#define BUTTW2 60 ++#define BUTTW3 110 + #define BUTTH 24 + + #define TOPMARGIN 30 /* from top of window to top of text window */ +@@ -36,11 +40,28 @@ + #define TV_ASCII 0 + #define TV_HEX 1 + #define TV_CLOSE 2 +-#define TV_NBUTTS 3 + ++#define TV_E_NBUTTS 3 ++ ++#ifdef TV_L10N ++# define TV_RESCAN 3 ++# define TV_USASCII 4 ++# define TV_JIS 5 ++# define TV_EUCJ 6 ++# define TV_MSCODE 7 ++ ++# define TV_J_NBUTTS 8 ++#endif + + #define TITLELEN 128 + ++#ifdef TV_MULTILINGUAL ++struct coding_spec { ++ struct coding_system coding_system; ++ char *(*converter)PARM((char *, int, int *)); ++}; ++#endif ++ + /* data needed per text window */ + typedef struct { Window win, textW; + int vis, wasvis; +@@ -57,16 +78,89 @@ + int chwide, chhigh; /* size of textW, in chars */ + int hexmode; /* true if disp Hex, else Ascii */ + SCRL vscrl, hscrl; +- BUTT but[TV_NBUTTS], nopBut; ++#ifdef TV_L10N ++ int code; /* current character code */ ++ BUTT but[TV_J_NBUTTS], nopBut; ++#else ++ BUTT but[TV_E_NBUTTS], nopBut; ++#endif ++#ifdef TV_MULTILINGUAL ++/* int codeset; */ ++ struct coding_spec ccs; /* current coding_spec */ ++ BUTT csbut; ++ char *cv_text; ++ int cv_len; ++ struct context *ctx; ++ struct ml_text *txt; ++ struct csinfo_t *cs; ++#endif + } TVINFO; + + + static TVINFO tinfo[MAXTVWIN]; + static int hasBeenSized = 0; + static int haveWindows = 0; ++static int nbutts; /* # of buttons */ + static int mfwide, mfhigh, mfascent; /* size of chars in mono font */ + static int *event_retP, *event_doneP; /* used in tvChkEvent() */ +- ++#ifdef TV_MULTILINGUAL ++# define TV_PLAIN 0 ++# define TV_ISO_8859_1 1 ++# define TV_ISO_2022_JP 2 ++# define TV_EUC_JAPAN 3 ++# define TV_ISO_2022_INT_1 4 ++# define TV_ISO_2022_KR 5 ++# define TV_EUC_KOREA 6 ++# define TV_ISO_2022_SS2_8 7 ++# define TV_ISO_2022_SS2_7 8 ++# define TV_SHIFT_JIS 9 ++# define TV_NCSS 10 ++static char *codeSetNames[TV_NCSS] = { ++ "plain", ++ "iso-8859-1", ++ "iso-2022-jp", ++ "euc-japan", ++ "iso-2022-int-1", ++ "iso-2022-kr", ++ "euc-korea", ++ "iso-2022-ss2-8", ++ "iso-2022-ss2-7", ++ "Shift JIS", ++}; ++static struct coding_spec coding_spec[TV_NCSS] = { ++ /* --- G0 --- --- G1 --- --- G2 --- --- G3 --- GL GR EOL SF LS */ ++ /* plain */ ++ {{{{ 1,94,'B'}, { 1,94,'B'}, { 1,94,'B'}, { 1,94,'B'}}, 0, 0, 0, 1, 1}, ++ NULL}, ++ /* iso-8859-1 */ ++ {{{{ 1,94,'B'}, { 1,96,'A'}, {-1,94,'B'}, {-1,94,'B'}}, 0, 1, 0, 0, 0}, ++ NULL}, ++ /* iso-2022-jp */ ++ {{{{ 1,94,'B'}, {-1,94,'B'}, {-1,94,'B'}, {-1,94,'B'}}, 0, 0, 0, 1, 0}, ++ NULL}, ++ /* euc-japan */ ++ {{{{ 1,94,'B'}, { 2,94,'B'}, { 1,94,'J'}, { 2,94,'D'}}, 0, 1, 0, 1, 0}, ++ NULL}, ++ /* iso-2022-int-1 */ ++ {{{{ 1,94,'B'}, { 2,94,'C'}, {-1,94,'B'}, {-1,94,'B'}}, 0, 1, 0, 1, 1}, ++ NULL}, ++ /* iso-2022-kr */ ++ {{{{ 1,94,'B'}, { 2,94,'C'}, {-1,94,'B'}, {-1,94,'B'}}, 0, 1, 0, 0, 1}, ++ NULL}, ++ /* euc-korea */ ++ {{{{ 1,94,'B'}, { 2,94,'C'}, {-1,94,'B'}, {-1,94,'B'}}, 0, 1, 0, 0, 0}, ++ NULL}, ++ /* iso-2022-ss2-8 */ ++ {{{{ 1,94,'B'}, {-1,94,'C'}, { 0,94,'B'}, {-1,94,'B'}}, 0, 1, 0, 0, 0}, ++ NULL}, ++ /* iso-2022-ss2-7 */ ++ {{{{ 1,94,'B'}, {-1,94,'C'}, { 0,94,'B'}, {-1,94,'B'}}, 0, 1, 0, 1, 0}, ++ NULL}, ++ /* shift jis */ ++ {{{{ 1,94,'B'}, { 2,94,'B'}, { 1,94,'J'}, { 2,94,'D'}}, 0, 1, 1, 1, 0}, ++ sjis_to_jis}, ++}; ++#endif + + static void closeText PARM((TVINFO *)); + static int tvChkEvent PARM((TVINFO *, XEvent *)); +@@ -82,7 +176,15 @@ + static void textKey PARM((TVINFO *, int)); + static void doHexAsciiCmd PARM((TVINFO *, int)); + static void computeText PARM((TVINFO *)); +- ++#ifdef TV_L10N ++static int selectCodeset PARM((TVINFO *)); ++#endif ++#ifdef TV_MULTILINGUAL ++static void setCodingSpec PARM((TVINFO *, struct coding_spec *)); ++static void createCsWins PARM((char *)); ++static void openCsWin PARM((TVINFO *)); ++static void closeCsWin PARM((TVINFO *)); ++#endif + + /* HEXMODE output looks like this: + 0x00000000: 00 11 22 33 44 55 66 77 - 88 99 aa bb cc dd ee ff 0123456789abcdef +@@ -98,12 +200,51 @@ + XSizeHints hints; + XSetWindowAttributes xswa; + TVINFO *tv; ++#ifdef TV_MULTILINGUAL ++ int default_codeset; ++#endif + ++#ifdef TV_L10N ++ if (!xlocale) { ++#endif ++ mfwide = monofinfo->max_bounds.width; ++ mfhigh = monofinfo->ascent + monofinfo->descent; ++ mfascent = monofinfo->ascent; + +- mfwide = monofinfo->max_bounds.width; +- mfhigh = monofinfo->ascent + monofinfo->descent; +- mfascent = monofinfo->ascent; ++ nbutts = TV_E_NBUTTS; /* # of buttons */ ++#ifdef TV_L10N ++ } ++ else { ++ mfwide = monofsetinfo->max_logical_extent.width / 2; /* shit! */ ++ mfhigh = monofsetinfo->max_logical_extent.height + 1; ++ mfascent = mfhigh; ++ ++ nbutts = TV_J_NBUTTS; /* # of buttons */ ++ } ++#endif + ++#ifdef TV_MULTILINGUAL ++ { ++ char *dc = XGetDefault(theDisp, "xv", "codeSet"); ++ if (dc == NULL) ++ default_codeset = TV_DEFAULT_CODESET; ++ else { ++ for (i = 0; i < TV_NCSS; i++) { ++ if (strcmp(dc, codeSetNames[i]) == 0) ++ break; ++ } ++ if (i >= TV_NCSS) { ++ if (strcmp(dc, "iso-2022") == 0) ++ default_codeset = TV_PLAIN; ++ else { ++ SetISTR(ISTR_WARNING, "%s: unknown codeset.", dc); ++ default_codeset = TV_PLAIN; ++ } ++ } else ++ default_codeset = i; ++ } ++ } ++#endif + /* compute default size of textview windows. should be big enough to + hold an 80x24 text window */ + +@@ -118,6 +259,14 @@ + for (i=0; i<MAXTVWIN; i++) { + tv = &tinfo[i]; + ++#ifdef TV_MULTILINGUAL ++ tv->ctx = ml_create_context(ScreenOfDisplay(theDisp, theScreen)); ++ tv->txt = NULL; ++ tv->cv_text = NULL; ++ tv->cv_len = 0; ++ ml_set_charsets(tv->ctx, &coding_spec[TV_PLAIN].coding_system); ++#endif ++ + tv->win = CreateWindow((i<CMTWIN) ? "xv text viewer" : "xv image comments", + "XVtextview", + (i<CMTWIN) ? geom : cmtgeom, +@@ -162,24 +311,56 @@ + XSelectInput(theDisp, tv->textW, ExposureMask | ButtonPressMask); + + +- BTCreate(&(tv->but[TV_ASCII]), tv->win, 0,0,BUTTW,BUTTH, ++ BTCreate(&(tv->but[TV_ASCII]), tv->win, 0,0,BUTTW1,BUTTH, + "Ascii",infofg,infobg,hicol,locol); +- BTCreate(&(tv->but[TV_HEX]), tv->win, 0,0,BUTTW,BUTTH, ++ BTCreate(&(tv->but[TV_HEX]), tv->win, 0,0,BUTTW1,BUTTH, + "Hex",infofg,infobg,hicol,locol); +- BTCreate(&(tv->but[TV_CLOSE]), tv->win, 0,0,BUTTW,BUTTH, ++ BTCreate(&(tv->but[TV_CLOSE]), tv->win, 0,0,BUTTW1,BUTTH, + "Close",infofg,infobg,hicol,locol); + ++#ifdef TV_L10N ++ if (xlocale) { ++ BTCreate(&(tv->but[TV_RESCAN]), tv->win, 0,0,BUTTW2,BUTTH, ++ "RESCAN",infofg,infobg,hicol,locol); ++ BTCreate(&(tv->but[TV_USASCII]), tv->win, 0,0,BUTTW2,BUTTH, ++ "ASCII",infofg,infobg,hicol,locol); ++ BTCreate(&(tv->but[TV_JIS]), tv->win, 0,0,BUTTW2,BUTTH, ++ "JIS",infofg,infobg,hicol,locol); ++ BTCreate(&(tv->but[TV_EUCJ]), tv->win, 0,0,BUTTW2,BUTTH, ++ "EUC-j",infofg,infobg,hicol,locol); ++ BTCreate(&(tv->but[TV_MSCODE]), tv->win, 0,0,BUTTW2,BUTTH, ++ "MS Kanji",infofg,infobg,hicol,locol); ++ } ++#endif ++ + BTCreate(&(tv->nopBut), tv->win, 0,0, (u_int) tv->vscrl.tsize+1, + (u_int) tv->vscrl.tsize+1, "", infofg, infobg, hicol, locol); + tv->nopBut.active = 0; + + XMapSubwindows(theDisp, tv->win); + ++#ifdef TV_MULTILINGUAL ++ BTCreate(&tv->csbut, tv->win, 0, 0, BUTTW1, BUTTH, "Code Sets", ++ infofg, infobg, hicol, locol); ++#endif ++ + tv->text = (char *) NULL; + tv->textlen = 0; + tv->title[0] = '\0'; ++#ifdef TV_L10N ++ tv->code = (xlocale ? LOCALE_DEFAULT : 0); ++#endif ++#ifdef TV_MULTILINGUAL ++ tv->ccs = coding_spec[default_codeset]; ++#endif + } +- ++#ifdef TV_MULTILINGUAL ++ get_monofont_size(&mfwide, &mfhigh); ++ /* recalculate sizes. */ ++ defwide = 80 * mfwide + 2*LRMARGINS + 8 + 20; /* -ish */ ++ defhigh = 24 * mfhigh + TOPMARGIN + BOTMARGIN + 8 + 20; /* ish */ ++ cmthigh = 6 * mfhigh + TOPMARGIN + BOTMARGIN + 8 + 20; /* ish */ ++#endif + + for (i=0; i<MAXTVWIN; i++) { + resizeText(&tinfo[i], defwide, (i<CMTWIN) ? defhigh : cmthigh); +@@ -190,44 +371,54 @@ + + hasBeenSized = 1; /* we can now start looking at textview events */ + ++#ifdef TV_MULTILINGUAL ++ createCsWins("+100+100"); ++#endif + } + + + /***************************************************************/ +-void TextView(fname) ++int TextView(fname) + char *fname; + { + /* given a filename, attempts to read in the file and open a textview win */ + ++ int filetype; + long textlen; + char *text, buf[512], title[128], rfname[MAXPATHLEN+1]; + char *basefname[128]; /* just current fname, no path */ + FILE *fp; ++ char filename[MAXPATHLEN+1]; ++ ++ strncpy(filename, fname, sizeof(filename) - 1); ++#ifdef AUTO_EXPAND ++ Mkvdir(filename); ++ Dirtovd(filename); ++#endif + + basefname[0] = '\0'; +- strcpy(rfname, fname); ++ strncpy(rfname, filename, sizeof(rfname) - 1); + + /* see if this file is compressed. if it is, uncompress it, and view + the uncompressed version */ + +- if (ReadFileType(fname) == RFT_COMPRESS) { ++ filetype = ReadFileType(filename); ++ if ((filetype == RFT_COMPRESS) || (filetype == RFT_BZIP2)) { + #ifndef VMS +- if (!UncompressFile(fname, rfname)) return; /* failed to uncompress */ ++ if (!UncompressFile(filename, rfname, filetype)) return FALSE; + #else + /* chop off trailing '.Z' from friendly displayed basefname, if any */ +- strcpy (basefname, fname); ++ strncpy (basefname, filename, 128 - 1); + *rindex (basefname, '.') = '\0'; +- if (!UncompressFile(basefname, rfname)) return;/* failed to uncompress */ ++ if (!UncompressFile(basefname, rfname, filetype)) return FALSE; + #endif + } + +- +- + fp = fopen(rfname, "r"); + if (!fp) { + sprintf(buf,"Couldn't open '%s': %s", rfname, ERRSTR(errno)); + ErrPopUp(buf,"\nOh well"); +- return; ++ return FALSE; + } + + +@@ -239,16 +430,16 @@ + sprintf(buf, "File '%s' contains no data. (Zero length file.)", rfname); + ErrPopUp(buf, "\nOk"); + fclose(fp); +- return; ++ return FALSE; + } + +- text = (char *) malloc((size_t) textlen); ++ text = (char *) malloc((size_t) textlen + 1); + if (!text) { + sprintf(buf, "Couldn't malloc %ld bytes to read file '%s'", + textlen, rfname); + ErrPopUp(buf, "\nSo what!"); + fclose(fp); +- return; ++ return FALSE; + } + + if (fread(text, (size_t) 1, (size_t) textlen, fp) != textlen) { +@@ -256,6 +447,9 @@ + rfname); + ErrPopUp(buf, "\nHmm..."); + } ++#ifdef TV_MULTILINGUAL ++ text[textlen] = '\0'; ++#endif + + fclose(fp); + +@@ -263,6 +457,7 @@ + OpenTextView(text, (int) textlen, title, 1); + + /* note: text gets freed when window gets closed */ ++ return TRUE; + } + + +@@ -504,6 +699,10 @@ + tv->text = (char *) NULL; + tv->lines = (char **) NULL; + tv->numlines = tv->textlen = tv->hexmode = 0; ++ ++#ifdef TV_MULTILINGUAL ++ closeCsWin(tv); ++#endif + } + + +@@ -591,6 +790,40 @@ + else if (e->window == tv->textW) { } + else rv = 0; + } ++ else if (e->button == Button4) { /* note min vs. max, + vs. - */ ++ /* scroll regardless of where we are in the text window */ ++ if (e->window == tv->win || ++ e->window == tv->vscrl.win || ++ e->window == tv->hscrl.win || ++ e->window == tv->textW) ++ { ++ SCRL *sp=&(tv->vscrl); ++ int halfpage=sp->page/2; ++ ++ if (sp->val > sp->min+halfpage) ++ SCSetVal(sp,sp->val-halfpage); ++ else ++ SCSetVal(sp,sp->min); ++ } ++ else rv = 0; ++ } ++ else if (e->button == Button5) { /* note max vs. min, - vs. + */ ++ /* scroll regardless of where we are in the text window */ ++ if (e->window == tv->win || ++ e->window == tv->vscrl.win || ++ e->window == tv->hscrl.win || ++ e->window == tv->textW) ++ { ++ SCRL *sp=&(tv->vscrl); ++ int halfpage=sp->page/2; ++ ++ if (sp->val < sp->max-halfpage) ++ SCSetVal(sp,sp->val+halfpage); ++ else ++ SCSetVal(sp,sp->max); ++ } ++ else rv = 0; ++ } + else rv = 0; + } + +@@ -633,7 +866,9 @@ + int i, maxw, maxh; + XSizeHints hints; + ++#ifndef TV_MULTILINGUAL + if (tv->wide == w && tv->high == h) return; /* no change in size */ ++#endif + + if (XGetNormalHints(theDisp, tv->win, &hints)) { + hints.width = w; +@@ -657,10 +892,23 @@ + XMoveResizeWindow(theDisp, tv->textW, LRMARGINS, TOPMARGIN, + (u_int) tv->twWide, (u_int) tv->twHigh); + +- for (i=0; i<TV_NBUTTS; i++) { +- tv->but[i].x = tv->wide - (TV_NBUTTS-i) * (BUTTW+5); ++ for (i=0; i<TV_E_NBUTTS; i++) { ++ tv->but[i].x = tv->wide - (TV_E_NBUTTS-i) * (BUTTW1+5); + tv->but[i].y = tv->high - BUTTH - 5; + } ++#ifdef TV_MULTILINGUAL ++ tv->csbut.x = 5; ++ tv->csbut.y = tv->high - BUTTH - 5; ++#endif ++ ++#ifdef TV_L10N ++ if (xlocale) { ++ for (; i<TV_J_NBUTTS; i++) { ++ tv->but[i].x = 5 + (i-TV_E_NBUTTS) * (BUTTW2+5); ++ tv->but[i].y = tv->high - BUTTH - 5; ++ } ++ } ++#endif + + computeScrlVals(tv); + +@@ -711,6 +959,29 @@ + case TV_CLOSE: if (tv == &tinfo[CMTWIN]) CloseCommentText(); + else closeText(tv); + break; ++ ++#ifdef TV_L10N ++ case TV_RESCAN: ++ tv->code = selectCodeset(tv); ++ drawTextW(0, &tv->vscrl); ++ break; ++ case TV_USASCII: ++ tv->code = LOCALE_USASCII; ++ drawTextW(0, &tv->vscrl); ++ break; ++ case TV_JIS: ++ tv->code = LOCALE_JIS; ++ drawTextW(0, &tv->vscrl); ++ break; ++ case TV_EUCJ: ++ tv->code = LOCALE_EUCJ; ++ drawTextW(0, &tv->vscrl); ++ break; ++ case TV_MSCODE: ++ tv->code = LOCALE_MSCODE; ++ drawTextW(0, &tv->vscrl); ++ break; ++#endif /* TV_L10N */ + } + } + +@@ -745,8 +1016,10 @@ + drawNumLines(tv); + + /* draw the buttons */ +- for (i=0; i<TV_NBUTTS; i++) BTRedraw(&(tv->but[i])); +- ++ for (i=0; i<nbutts; i++) BTRedraw(&(tv->but[i])); ++#ifdef TV_MULTILINGUAL ++ BTRedraw(&tv->csbut); ++#endif + BTRedraw(&tv->nopBut); + } + +@@ -816,7 +1089,14 @@ + int delta; + SCRL *sptr; + { +- int i, j, lnum, hpos, cpos, extrach, lwide; ++ int i, j, lnum, hpos, vpos, cpos, lwide; ++#ifndef TV_MULTILINGUAL ++ int extrach; ++#endif ++#ifdef TV_L10N ++ int desig_stat; /* for ISO 2022-JP */ ++ /* 0: ASCII, 1: JIS X 0208, 2: GL is JIS X 0201 kana */ ++#endif + TVINFO *tv; + char linestr[512]; + u_char *sp, *ep, *lp; +@@ -839,12 +1119,38 @@ + XSetFont(theDisp, theGC, monofont); + + hpos = tv->hscrl.val; ++ vpos = tv->vscrl.val; + lwide = (tv->chwide < 500) ? tv->chwide : 500; + + /* draw text */ + if (!tv->hexmode) { /* ASCII mode */ ++#ifdef TV_MULTILINGUAL ++ XClearArea(theDisp, tv->textW, 0, 0, ++ (u_int) tv->twWide, (u_int) tv->twHigh, False); ++ if(tv->txt == NULL) ++ return; ++ else { ++ int i; ++ int y; ++ struct ml_text *tp = tv->txt; ++ struct ml_line *lp; ++ ++ XSetFunction(theDisp, theGC, GXcopy); ++ XSetClipMask(theDisp, theGC, None); ++ y = 3; ++ for (lp = &tp->lines[vpos], i = tp->nlines - vpos; ++ i > 0; lp++, i--) { ++ XDrawText16(theDisp, tv->textW, theGC, ++ -mfwide * hpos + 3, y + lp->ascent, ++ lp->items, lp->nitems); ++ y += lp->ascent + lp->descent; ++ if (y > tv->twHigh) ++ break; ++ } ++ } ++#else + for (i=0; i<tv->chhigh; i++) { /* draw each line */ +- lnum = i + tv->vscrl.val; ++ lnum = i + vpos; + if (lnum < tv->numlines-1) { + + /* find start of displayed portion of line. This is *wildly* +@@ -865,7 +1171,13 @@ + cpos--; sp++; + } + else if (*sp < 32) extrach = 1; ++ ++#ifdef TV_L10N ++ else if (!tv->code && *sp > 127) extrach = 3; ++#else + else if (*sp > 127) extrach = 3; ++#endif ++ + else sp++; + } + else { +@@ -881,6 +1193,10 @@ + + /* build up the linestr buffer, which is the current line, padded + with blanks to a width of exactly tv->chwide chars */ ++#ifdef TV_L10N ++ desig_stat = 0; /* for ISO 2022-JP */ ++ /* 0: ASCII, 1: JIS X 0208, 2: GL is JIS X 0201 kana */ ++#endif + for (cpos=0, lp=(byte *) linestr; cpos<lwide; cpos++, lp++) { + if (sp>=ep) *lp = ' '; + else { +@@ -894,13 +1210,117 @@ + cpos--; lp--; sp++; + } + ++#ifdef TV_L10N ++ else if (*sp < 32 && !(tv->code == LOCALE_JIS && *sp == 0x1b)) { ++#else + else if (*sp < 32) { ++#endif + if (!extrach) extrach = 2; + if (extrach == 2) *lp = '^'; + else if (extrach == 1) *lp = *sp + 64; + } + ++#ifdef TV_L10N ++ /* convert to EUC-Japan */ ++ else if (tv->code == LOCALE_JIS) { ++ if (*sp == 0x1b) { /* ESC */ ++ if (*(sp+1) == '$') { ++ if (*(sp+2) == 'B' || *(sp+2) == 'A' || *(sp+2) == '@') { ++ /* ESC $ B, ESC $ A, ESC $ @ */ ++ desig_stat = 1; ++ sp += 3; cpos--; lp--; ++ } ++ else if (*(sp+2) == '(' && *(sp+3) == 'B') { ++ /* ESC $ ( B */ ++ desig_stat = 1; ++ sp += 4; cpos--; lp--; ++ } ++ } ++ else if (*(sp+1) == '(') { ++ if (*(sp+2) == 'B' || *(sp+2) == 'J' || *(sp+2) == 'H') { ++ /* ESC ( B, ESC ( J, ESC ( H */ ++ desig_stat = 0; ++ sp += 3; cpos--; lp--; ++ } ++ else if (*(sp+2) == 'I') { ++ /* ESC ( I */ ++ desig_stat = 2; ++ sp += 3; cpos--; lp--; ++ } ++ } ++ else if (*(sp+1) == ')' && *(sp+2) == 'I') { ++ /* ESC ) I */ ++ desig_stat = 2; ++ sp += 3; cpos--; lp--; ++ } ++ else { /* error */ ++ *lp = ' '; sp++; ++ } ++ } ++ ++ else { ++ switch (desig_stat) { ++ case 0: /* ASCII */ ++ *lp = *sp++; ++ break; ++ case 1: /* JIS X 0208 */ ++ *lp++ = *sp++ | 0x80; ++ *lp = *sp++ | 0x80; ++ cpos++; ++ break; ++ case 2: /* JIS X 0201 kana */ ++#if defined(__osf__) && !defined(X_LOCALE) ++ *lp = '='; sp++; ++#else ++ *lp++ = 0x8e; /* ^N | 0x80 */ ++ *lp = *sp++ | 0x80; ++#endif ++ break; ++ default: /* error */ ++ *lp = *sp++; ++ break; ++ } ++ } ++ } ++ ++ else if (tv->code == LOCALE_MSCODE) { ++ if ((*sp >= 0x81 && *sp <= 0x9f) ++ || (*sp >= 0xe0 && *sp <= 0xef)) { ++ static u_char c1, c2; ++ ++/*fprintf(stderr, "(%x,%x)->", *sp, *(sp+1));*/ ++ c1 = ((*sp - ((*sp>=0xe0) ? 0xb0 : 0x70)) << 1) ++ - ((*(sp+1)<=0x9e) ? 1 : 0); ++ c2 = *(sp+1); ++ if (c2 >= 0x9f) c2 -= 0x7e; /* 0x9F - 0xFC */ ++ else if (c2 >= 0x80) c2 -= 0x20; /* 0x80 - 0x9E */ ++ else c2 -= 0x1f; /* 0x40 - 0x7E */ ++ ++ *lp++ = c1 | 0x80; ++ *lp = c2 | 0x80; ++ sp += 2; ++/*fprintf(stderr, "(%x %x) ", c1 | 0x80, c2 | 0x80);*/ ++ cpos++; ++ } ++ ++ else if (*sp >= 0xa1 && *sp <= 0xdf) { /* JIS X 0201 kana */ ++#if defined(__osf__) && !defined(X_LOCALE) ++ *lp = '='; sp++; ++#else ++ *lp++ = 0x8e; /* ^N | 0x80 */ ++ *lp = *sp++; ++#endif ++ } ++ ++ else *lp = *sp++; ++ } ++#endif /* TV_L10N */ ++ ++#ifdef TV_L10N ++ else if (!tv->code && *sp > 127) { ++#else + else if (*sp > 127) { ++#endif + if (!extrach) extrach = 4; + if (extrach == 4) *lp = '\\'; + else if (extrach == 3) *lp = ((u_char)(*sp & 0700) >> 6) + '0'; +@@ -916,6 +1336,9 @@ + } + } + } ++#ifdef TV_L10N ++ *lp = '\0'; /* terminate linestr */ ++#endif + } + + else { /* below bottom of file. Just build a blank str */ +@@ -923,15 +1346,22 @@ + } + + /* draw the line */ +- XDrawImageString(theDisp, tv->textW, theGC, +- 3, i*mfhigh + 3 + mfascent, linestr, lwide); ++#ifdef TV_L10N ++ if (xlocale) ++ XmbDrawImageString(theDisp, tv->textW, monofset, theGC, ++ 3, i*mfhigh + 1 + mfascent, linestr, strlen(linestr)); ++ else ++#endif ++ XDrawImageString(theDisp, tv->textW, theGC, ++ 3, i*mfhigh + 3 + mfascent, linestr, lwide); + } /* for i ... */ ++#endif /* TV_MULTILINGUAL */ + } /* if hexmode */ + + + else { /* HEX MODE */ + for (i=0; i<tv->chhigh; i++) { /* draw each line */ +- lnum = i + tv->vscrl.val; ++ lnum = i + vpos; + if (lnum < tv->hexlines) { + + char hexstr[80], tmpstr[16]; +@@ -957,7 +1387,11 @@ + + for (j=0; j<16; j++) { + if (sp+j < ep) { ++#ifdef TV_L10N ++ if (sp[j] >= 32 && (sp[j] <= 127 || tv->code)) *lp++ = sp[j]; ++#else + if (sp[j] >= 32 && sp[j] <= 127) *lp++ = sp[j]; ++#endif + else *lp++ = '.'; + } + else *lp++ = ' '; +@@ -1005,14 +1439,21 @@ + int i; + BUTT *bp; + +- for (i=0, bp=tv->but; i<TV_NBUTTS; i++, bp++) { ++ for (i=0, bp=tv->but; i<nbutts; i++, bp++) { + if (PTINRECT(x,y,bp->x,bp->y,bp->w,bp->h)) break; + } + +- if (i<TV_NBUTTS) { ++ if (i<nbutts) { + if (BTTrack(bp)) doCmd(tv, i); + return; + } ++ ++#ifdef TV_MULTILINGUAL ++ if (PTINRECT(x, y, tv->csbut.x, tv->csbut.y, tv->csbut.w, tv->csbut.h)) { ++ if (BTTrack(&tv->csbut)) ++ openCsWin(tv); ++ } ++#endif + } + + +@@ -1042,13 +1483,38 @@ + + /* keyboard equivalents */ + switch (buf[0]) { +- case '\001': doCmd(tv, TV_ASCII); break; /* ^A = Ascii */ +- case '\010': doCmd(tv, TV_HEX); break; /* ^H = Hex */ +- +- case '\033': doCmd(tv, TV_CLOSE); break; /* ESC = Close window */ ++ case '\001': case 'a': case 'A': ++ doCmd(tv, TV_ASCII); break; /* ^A = Ascii */ ++ case '\010': case 'h': case 'H': ++ doCmd(tv, TV_HEX); break; /* ^H = Hex */ ++ ++ case '\021': case 'q': case 'Q': ++ case '\003': case 'c': case 'C': ++ case '\033': ++ doCmd(tv, TV_CLOSE); break; /* ESC = Close window */ + + default: break; + } ++ ++#ifdef TV_L10N ++ if (xlocale) { ++ switch (buf[0]) { ++ case '\022': case 'r': case 'R': ++ doCmd(tv, TV_RESCAN); break; ++ case '\012': case 'j': case 'J': ++ doCmd(tv, TV_JIS); break; ++ case '\005': case 'e': case 'E': ++ case '\025': case 'u': case 'U': ++ doCmd(tv, TV_EUCJ); break; ++ case '\015': case 'm': case 'M': ++ case '\023': case 's': case 'S': ++ doCmd(tv, TV_MSCODE); break; ++ ++ default: break; ++ } ++ } ++#endif /* TV_L10N */ ++ + } + + +@@ -1109,7 +1575,20 @@ + if (i<tv->numlines-1) SCSetVal(&tv->vscrl, i); + } + ++#ifdef TV_L10N ++ /* redraw text */ ++ if (xlocale) { ++ XClearArea(theDisp, tv->textW, 0, 0, ++ (u_int) tv->twWide, (u_int) tv->twHigh, False); ++ ++ drawTextW(0, &tv->vscrl); ++ } ++#endif ++#ifdef TV_MULTILINGUAL ++ XClearArea(theDisp, tv->textW, 0, 0, ++ (u_int) tv->twWide, (u_int) tv->twHigh, False); + drawTextW(0, &tv->vscrl); ++#endif + } + + +@@ -1122,9 +1601,22 @@ + int i,j,wide,maxwide,space; + byte *sp; + ++#ifdef TV_L10N ++ /* select code-set */ ++ if (xlocale) ++ tv->code = selectCodeset(tv); ++#endif /* TV_L10N */ ++ + if (!tv->text) { + tv->numlines = tv->hexlines = 0; + tv->lines = (char **) NULL; ++#ifdef TV_MULTILINGUAL ++ if (tv->cv_text != NULL) { ++ free(tv->cv_text); ++ tv->cv_text = NULL; ++ } ++ tv->txt = NULL; ++#endif + return; + } + +@@ -1172,17 +1664,129 @@ + wide += space; + } + else if (*sp < 32) wide += 2; ++#ifdef TV_L10N ++ else if (*sp > 127 && !tv->code) wide += 4; ++#else + else if (*sp > 127) wide += 4; ++#endif + else wide++; + } + if (wide > maxwide) maxwide = wide; + } + tv->maxwide = maxwide; + ++#ifdef TV_MULTILINGUAL ++ ml_set_charsets(tv->ctx, &tv->ccs.coding_system); ++ if (tv->cv_text != NULL) { ++ free(tv->cv_text); ++ tv->cv_text = NULL; ++ } ++ if (tv->ccs.converter == NULL) { ++ tv->txt = ml_draw_text(tv->ctx, tv->text, tv->textlen); ++ } else { ++ tv->cv_text = (*tv->ccs.converter)(tv->text, tv->textlen, &tv->cv_len); ++ tv->txt = ml_draw_text(tv->ctx, tv->cv_text, tv->cv_len); ++ } ++ tv->maxwide = tv->txt->width / mfwide; ++ tv->numlines = tv->txt->height / mfhigh + 1; ++#endif ++ + tv->hexlines = (tv->textlen + 15) / 16; + } + + ++/***************************************************/ ++#ifdef TV_L10N ++static int selectCodeset(tv) ++ TVINFO *tv; ++{ ++ u_char *sp; ++ int i, len; ++ int code = LOCALE_USASCII; /* == 0 */ ++ ++ ++ len = tv->textlen; ++ ++ /* select code-set */ ++ if (xlocale) { ++ sp = (u_char *) tv->text; i = 0; ++ while (i < len - 1) { ++ if (*sp == 0x1b && ++ (*(sp+1) == '$' || *(sp+1) == '(' || *(sp+1) == ')')) { ++ code = LOCALE_JIS; ++ break; ++ } ++ ++ else if (*sp >= 0xa1 && *sp <= 0xdf) { ++ if (*(sp+1) >= 0xf0 && *(sp+1) <= 0xfe) { ++ code = LOCALE_EUCJ; ++ break; ++ } ++# if (LOCALE_DEFAULT == LOCALE_EUCJ) ++ else { ++ sp++; i++; ++ } ++# endif ++ } ++ ++ else if ((*sp >= 0x81 && *sp <= 0x9f) || (*sp >= 0xe0 && *sp <= 0xef)) { ++ if ((*(sp+1) >= 0x40 && *(sp+1) <= 0x7e) || *(sp+1) == 0x80) { ++ code = LOCALE_MSCODE; ++ break; ++ } ++ else if (*(sp+1) == 0xfd || *(sp+1) == 0xfe) { ++ code = LOCALE_EUCJ; ++ break; ++ } ++ else { ++ sp++; i++; ++ } ++ } ++ ++ else if (*sp >= 0xf0 && *sp <= 0xfe) { ++ code = LOCALE_EUCJ; ++ break; ++ } ++ ++ sp++; i++; ++ } ++ if (!code) code = LOCALE_DEFAULT; ++ } ++ ++ return code; ++} ++#endif /* TV_L10N */ ++ ++#ifdef TV_MULTILINGUAL ++static void setCodingSpec(tv, cs) ++ TVINFO *tv; ++ struct coding_spec *cs; ++{ ++ if (xvbcmp((char *) &tv->ccs, (char *) cs, sizeof *cs) == 0) ++ return; ++ ++ tv->ccs = *cs; ++#if 0 ++ ml_set_charsets(tv->ctx, &tv->ccs.coding_system); ++ if (tv->cv_text != NULL) { ++ free(tv->cv_text); ++ tv->cv_text = NULL; ++ } ++ if (tv->ccs.converter == NULL) { ++ tv->txt = ml_draw_text(tv->ctx, tv->text, tv->textlen); ++ } else { ++ tv->cv_text = (*tv->ccs.converter)(tv->text, tv->textlen, &tv->cv_len); ++ tv->txt = ml_draw_text(tv->ctx, tv->cv_text, tv->cv_len); ++ } ++#else ++ computeText(tv); ++ computeScrlVals(tv); ++#endif ++ /* drawTextW(0, &tv->vscrl); */ ++} ++#endif ++ ++ + /**********************************************************************/ + /* BUILT-IN TEXT FILES ************************************************/ + /**********************************************************************/ +@@ -1555,8 +2159,509 @@ + OpenTextView(keyhelp, (int) strlen(keyhelp), "XV Help", 0); + } + ++#ifdef TV_MULTILINGUAL ++ ++#define TV_ML_ACCEPT TV_NCSS ++#define TV_ML_CLOSE (TV_ML_ACCEPT + 1) ++#define TV_ML_NBUTTS (TV_ML_CLOSE + 1) ++ ++#define TV_ML_RETCODE 0 ++# define TV_ML_RET_LF 0 ++# define TV_ML_RET_CRLF 1 ++# define TV_ML_RET_CR 2 ++# define TV_ML_RET_ANY 3 ++#define TV_ML_GL 1 ++#define TV_ML_GR 2 ++#define TV_ML_CVTR 3 ++#define TV_ML_NRBUTTS 4 ++ ++#define TV_ML_SHORT 0 ++#define TV_ML_LOCK 1 ++#define TV_ML_NCBUTTS 2 ++ ++#define TV_ML_NLISTS 4 ++ ++#define CSWIDE (BUTTW3 * 5 + 5 * 6) ++#define CSHIGH 450 ++ ++typedef struct csinfo_t { ++ TVINFO *tv; ++ RBUTT *rbt[TV_ML_NRBUTTS]; ++ CBUTT cbt[TV_ML_NCBUTTS]; ++ LIST ls[TV_ML_NLISTS]; ++ BUTT bt[TV_ML_NBUTTS]; ++ int up; ++ Window win; ++ struct coding_spec tcs; /* temporary coding_spec */ ++} CSINFO; ++CSINFO csinfo[MAXTVWIN]; ++static char **regs; ++static int nregs; ++ ++static int csCheckEvent PARM((CSINFO *, XEvent *)); ++static void csReflect PARM((CSINFO *)); ++static void csRedraw PARM((CSINFO *)); ++static void csListRedraw PARM((LIST *)); ++static void csLsRedraw PARM((int, SCRL *)); ++static void create_registry_list PARM((void)); ++ ++static char *(*cvtrtab[])PARM((char *, int, int *)) = { ++ NULL, ++ sjis_to_jis, ++}; ++ ++static void createCsWins(geom) ++ char *geom; ++{ ++ XSetWindowAttributes xswa; ++ int i, j; ++ ++ create_registry_list(); ++ ++ xswa.backing_store = WhenMapped; ++ for (i = 0; i < MAXTVWIN; i++) { ++ char nam[8]; ++ TVINFO *tv = &tinfo[i]; ++ CSINFO *cs = &csinfo[i]; ++ tv->cs = cs; ++ cs->tv = tv; ++ sprintf(nam, "XVcs%d", i); ++ cs->win = CreateWindow("xv codeset", nam, geom, ++ CSWIDE, CSHIGH, infofg, infobg, 0); ++ if (!cs->win) FatalError("couldn't create 'charset' window!"); ++#ifdef BACKING_STORE ++ XChangeWindowAttributes(theDisp, cs->win, CWBackingStore, &xswa); ++#endif ++ XSelectInput(theDisp, cs->win, ExposureMask | ButtonPressMask); ++ ++ DrawString(cs->win, 5, 5 + ASCENT, "Initial States"); ++ for (i = 0; i < TV_ML_NLISTS; i++) { ++ int x, y; ++ char buf[80]; ++ ++ if (i / 2 == 0) ++ x = 15; ++ else ++ x = 280; ++ if (i % 2 == 0) ++ y = 5 + LINEHIGH * 1; ++ else ++ y = 5 + LINEHIGH * 7 + SPACING * 3; ++ ++ sprintf(buf, "Designation for G%d:", i + 1); ++ DrawString(cs->win, x, y + ASCENT, buf); ++ ++ LSCreate(&cs->ls[i], cs->win, x + 15, y + LINEHIGH, ++ 200, LINEHIGH * 5, 5, ++ regs, nregs + 2, ++ infofg, infobg, hicol, locol, csLsRedraw, 0, 0); ++ cs->ls[i].selected = 0; ++ } ++ ++ for (i = 0; i < 2; i++) { ++ char *p; ++ int n; ++ int x, y; ++ ++ if ((p = (char *) malloc(3 * 4)) == NULL) ++ FatalError("out of memory in createCsWins()."); ++ strcpy(p, "G1 G2 G3 G4"); ++ p[2] = p[5] = p[8] = '\0'; ++ n = (i == 0 ? TV_ML_GL : TV_ML_GR); ++ x = (i == 0 ? 15 : 280); ++ y = 235; ++ DrawString(cs->win, x, y + ASCENT, "Assignment for GL:"); ++ x += 15; ++ y += LINEHIGH; ++ cs->rbt[n] = RBCreate(NULL, cs->win, ++ x, y, p, infofg, infobg, hicol, locol); ++ for (j = 1; j < 4; j++) { ++ p += 3; ++ x += 50; ++ RBCreate(cs->rbt[n], cs->win, ++ x, y, p, infofg, infobg, hicol, locol); ++ } ++ } ++ ++ DrawString(cs->win, 5, 280 + ASCENT, "Ret Code:"); ++ cs->rbt[TV_ML_RETCODE] = ++ RBCreate(NULL, cs->win, 20, 300, "LF", infofg,infobg, hicol,locol); ++ RBCreate(cs->rbt[TV_ML_RETCODE], cs->win, 20, 300 + 20, "CR+LF", ++ infofg, infobg, hicol, locol); ++ RBCreate(cs->rbt[TV_ML_RETCODE], cs->win, 90, 300, "CR", ++ infofg, infobg, hicol, locol); ++ RBCreate(cs->rbt[TV_ML_RETCODE], cs->win, 90, 300 + 20, "Any", ++ infofg, infobg, hicol, locol); ++ ++ DrawString(cs->win, 350, 280 + ASCENT, "Converter:"); ++ cs->rbt[TV_ML_CVTR] = ++ RBCreate(NULL, cs->win, 365, 300, "Nothing", ++ infofg, infobg, hicol, locol); ++ RBCreate(cs->rbt[TV_ML_CVTR], cs->win, 365, 300 + 20, "Shift JIS", ++ infofg, infobg, hicol, locol); ++ ++ CBCreate(&cs->cbt[TV_ML_SHORT], cs->win, 200, 300, "Short Form", ++ infofg, infobg, hicol, locol); ++ CBCreate(&cs->cbt[TV_ML_LOCK], cs->win, 200, 320, "Locking Shift", ++ infofg, infobg, hicol, locol); ++ ++ for (j = 0; j < TV_NCSS; j++) { ++ BTCreate(&cs->bt[j], cs->win, ++ 5 + (BUTTW3 + 5) * (j % 5), ++ 350 + 5 + (BUTTH + 5) * (j / 5), ++ BUTTW3, BUTTH, codeSetNames[j], ++ infofg, infobg, hicol, locol); ++ } ++ BTCreate(&cs->bt[TV_ML_ACCEPT], cs->win, ++ CSWIDE - 10 - BUTTW3 * 2, CSHIGH - 5 - BUTTH, BUTTW3, BUTTH, ++ "Accept", infofg, infobg, hicol, locol); ++ BTCreate(&cs->bt[TV_ML_CLOSE], cs->win, ++ CSWIDE - 5 - BUTTW3, CSHIGH - 5 - BUTTH, BUTTW3, BUTTH, ++ "Close", infofg, infobg, hicol, locol); + ++ XMapSubwindows(theDisp, cs->win); ++ cs->up = 0; ++ } ++} + ++static void openCsWin(tv) ++ TVINFO *tv; ++{ ++ CSINFO *cs = tv->cs; ++ if (cs->up) ++ return; + ++ XMapRaised(theDisp, cs->win); ++ cs->up = 1; ++ cs->tcs = cs->tv->ccs; ++ csReflect(cs); ++} + ++static void closeCsWin(tv) ++ TVINFO *tv; ++{ ++ CSINFO *cs = tv->cs; ++ if (!cs->up) ++ return; ++ cs->up = 0; ++ XUnmapWindow(theDisp, cs->win); ++} ++ ++int CharsetCheckEvent(xev) ++ XEvent *xev; ++{ ++ int i; ++ CSINFO *cs; ++ ++ for (cs = csinfo, i = 0; i < MAXTVWIN; cs++, i++) { ++ if (!cs->up) ++ continue; ++ if (csCheckEvent(cs, xev)) ++ break; ++ } ++ if (i < MAXTVWIN) ++ return 1; ++ return 0; ++} ++ ++static int csCheckEvent(cs, xev) ++ CSINFO *cs; ++ XEvent *xev; ++{ ++ RBUTT **rbp; ++ CBUTT *cbp; ++ LIST *ls; ++ BUTT *bp; ++ int i, n; ++ ++ if (xev->type == Expose) { ++ int x, y, w, h; ++ XExposeEvent *e = (XExposeEvent *) xev; ++ x = e->x; y = e->y; w = e->width; h = e->height; ++ ++ if (cs->win == e->window){ ++ csRedraw(cs); ++ return 1; ++ } else { ++ for (i = 0; i < TV_ML_NLISTS; i++) { ++ if (cs->ls[i].win == e->window) { ++ LSRedraw(&cs->ls[i], 0); ++ return 1; ++ } ++ } ++ for (i = 0; i < TV_ML_NLISTS; i++) { ++ if (cs->ls[i].scrl.win == e->window) { ++ SCRedraw(&cs->ls[i].scrl); ++ return 1; ++ } ++ } ++ } ++ } else if (xev->type == ButtonPress) { ++ int x, y; ++ XButtonEvent *e = (XButtonEvent *) xev; ++ x = e->x; y = e->y; ++ if (cs->win == e->window) { ++ for (bp = cs->bt, i = 0; i < TV_ML_NBUTTS; bp++, i++) { ++ if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) ++ break; ++ } ++ if (i < TV_ML_NBUTTS) { ++ if (BTTrack(bp)) { ++ if (i < TV_NCSS) { ++ cs->tcs = coding_spec[i]; ++ csReflect(cs); ++ } else { ++ switch (i) { ++ case TV_ML_ACCEPT: ++ setCodingSpec(cs->tv, &cs->tcs); ++ break; ++ case TV_ML_CLOSE: ++ closeCsWin(cs->tv); ++ break; ++ } ++ } ++ } ++ return 1; ++ } ++ for (cbp = cs->cbt, i = 0; i < TV_ML_NCBUTTS; cbp++, i++) { ++ if (CBClick(cbp, x, y) && CBTrack(cbp)) ++ break; ++ } ++ if (i < TV_ML_NCBUTTS) { ++ switch (i) { ++ case TV_ML_SHORT: ++ cs->tcs.coding_system.short_form = cbp->val; ++ break; ++ case TV_ML_LOCK: ++ cs->tcs.coding_system.lock_shift = cbp->val; ++ break; ++ } ++ return 1; ++ } ++ for (rbp = cs->rbt, i = 0; i < TV_ML_NRBUTTS; rbp++, i++) { ++ if ((n = RBClick(*rbp, x, y)) >= 0 && RBTrack(*rbp, n)) { ++ break; ++ } ++ } ++ if (i < TV_ML_NRBUTTS) { ++ switch (i) { ++ case TV_ML_RETCODE: ++ cs->tcs.coding_system.eol = n; ++ break; ++ case TV_ML_GL: ++ cs->tcs.coding_system.gl = n; ++ break; ++ case TV_ML_GR: ++ cs->tcs.coding_system.gr = n; ++ break; ++ case TV_ML_CVTR: ++ cs->tcs.converter = cvtrtab[n]; ++ break; ++ } ++ return 1; ++ } ++ } else { ++ for (ls = cs->ls, i = 0; i < TV_ML_NLISTS; ls++, i++) { ++ if (ls->win == e->window) { ++ LSClick(ls, e); ++ n = ls->selected; ++ if (n < nregs) { ++ char r[32], *p = r; ++ int b7; ++ strcpy(r, regs[n]); ++ if ((p = strrchr(r, '/')) != NULL) { ++ *p = '\0'; ++ b7 = (*(p + 1) == 'R' ? 1 : 0); ++ } else ++ b7 = 0; /* shouldn't occur */ ++ cs->tcs.coding_system.design[i] = lookup_design(r, b7); ++ } else if (n == nregs) /* initially none is designed. */ ++ cs->tcs.coding_system.design[i].bpc = 0; ++ else ++ cs->tcs.coding_system.design[i].bpc = -1; ++ return 1; ++ } ++ } ++ for (ls = cs->ls, i = 0; i < TV_ML_NLISTS; ls++, i++) { ++ if (ls->scrl.win == e->window) { ++ SCTrack(&ls->scrl, x, y); ++ return 1; ++ } ++ } ++ } ++ } ++ return 0; ++} ++ ++static void csReflect(cs) ++ CSINFO *cs; ++{ ++ int i; ++ ++ RBSelect(cs->rbt[TV_ML_RETCODE], cs->tcs.coding_system.eol); ++ RBSelect(cs->rbt[TV_ML_GL], cs->tcs.coding_system.gl); ++ RBSelect(cs->rbt[TV_ML_GR], cs->tcs.coding_system.gr); ++ for (i = 0; i < sizeof cvtrtab / sizeof cvtrtab[0]; i++) { ++ if (cs->tcs.converter == cvtrtab[i]) ++ break; ++ } ++ if (i >= sizeof cvtrtab / sizeof cvtrtab[0]) ++ FatalError("program error in csReflect()."); ++ RBSelect(cs->rbt[TV_ML_CVTR], i); ++ ++ cs->cbt[TV_ML_SHORT].val = cs->tcs.coding_system.short_form; ++ cs->cbt[TV_ML_LOCK].val = cs->tcs.coding_system.lock_shift; ++ for (i = 0; i < TV_ML_NLISTS; i++) { ++ struct design design = cs->tcs.coding_system.design[i]; ++ char *reg, r[32]; ++ int b7; ++ int n = 0; ++ switch (design.bpc) { ++ case -1: ++ n = nregs + 1; ++ break; ++ case 0: ++ n = nregs; ++ break; ++ case 1: ++ case 2: ++ if ((reg = lookup_registry(design, &b7)) == NULL) ++ FatalError("internal error in csReflect."); ++ sprintf(r, "%s/%s", reg, b7 ? "Right" : "Left"); ++ for (n = 0; n < nregs; n++) { ++ if (strcmp(regs[n], r) == 0) ++ break; ++ } ++ } ++ cs->ls[i].selected = n; ++ ScrollToCurrent(&cs->ls[i]); ++ } ++ csRedraw(cs); ++ for (i = 0; i < TV_ML_NLISTS; i++) ++ csListRedraw(&cs->ls[i]); ++} ++ ++static void csRedraw(cs) ++ CSINFO *cs; ++{ ++ int i; ++ ++ XSetForeground(theDisp, theGC, infofg); ++ DrawString(cs->win, 5,5 + ASCENT, "Initial States"); ++ for (i = 0; i < TV_ML_NLISTS; i++) { ++ int x, y; ++ char buf[80]; ++ ++ if (i / 2 == 0) ++ x = 15; ++ else ++ x = 280; ++ if (i % 2 == 0) ++ y = 5 + LINEHIGH * 1; ++ else ++ y = 5 + LINEHIGH * 7 + SPACING * 3; ++ ++ sprintf(buf, "Designation for G%d:", i); ++ DrawString(cs->win, x, y + ASCENT, buf); ++ } ++ ++ DrawString(cs->win, 15, 235 + ASCENT, "Invocation for GL:"); ++ DrawString(cs->win, 280, 235 + ASCENT, "Invocation for GR:"); ++ DrawString(cs->win, 5, 280 + ASCENT, "Ret Code:"); ++ DrawString(cs->win, 350, 280 + ASCENT, "Converter:"); ++ ++ for (i = 0; i < TV_ML_NBUTTS; i++) ++ BTRedraw(&cs->bt[i]); ++ for (i = 0; i < TV_ML_NCBUTTS; i++) ++ CBRedraw(&cs->cbt[i]); ++ for (i = 0; i < TV_ML_NRBUTTS; i++) ++ RBRedraw(cs->rbt[i], -1); ++} ++ ++static void csListRedraw(ls) ++ LIST *ls; ++{ ++ int i; ++ for (i = 0; i < TV_ML_NLISTS; i++) { ++ LSRedraw(ls, 0); ++ SCRedraw(&ls->scrl); ++ } ++} ++ ++static void csLsRedraw(delta, sptr) ++ int delta; ++ SCRL *sptr; ++{ ++ int i, j; ++ for (i = 0; i < MAXTVWIN; i++) { ++ for (j = 0; j < TV_ML_NLISTS; j++) { ++ if (sptr == &csinfo[i].ls[j].scrl) { ++ LSRedraw(&csinfo[i].ls[j], delta); ++ return; ++ } ++ } ++ } ++} ++ ++int CharsetDelWin(win) ++ Window win; ++{ ++ CSINFO *cs; ++ int i; ++ ++ for (cs = csinfo, i = 0; i < TV_NCSS; cs++, i++) { ++ if (cs->win == win) { ++ if (cs->up) { ++ XUnmapWindow(theDisp, cs->win); ++ cs->up = 0; ++ } ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++static int reg_comp PARM((const void *, const void *)); ++static void create_registry_list() ++{ ++ struct design d; ++ char *names, *p; ++ int i; ++ ++ if ((p = names = (char *) malloc(32 * 0x80 * 2 * 2)) == NULL) ++ FatalError("out of memory in create_name_list#1."); ++ nregs = 0; ++ for (d.bpc = 1; d.bpc <=2; d.bpc++) { ++ for (d.noc = 94; d.noc <= 96; d.noc += 2) { ++ for (d.des = ' '; (unsigned char) d.des < 0x80; d.des++) { ++ int b7; ++ char *r; ++ if ((r = lookup_registry(d, &b7)) != NULL) { ++ sprintf(p, "%s/%s", r, b7 ? "Right" : "Left"); ++ p += strlen(p) + 1; ++ nregs++; ++ } ++ } ++ } ++ } ++ if ((names = (char *) realloc(names, (size_t) (p - names))) == NULL) ++ FatalError("out of memory in create_name_list#2."); ++ if ((regs = (char **) malloc(sizeof(char *) * (nregs + 3))) == NULL) ++ FatalError("out of memory in create_name_list#3."); ++ p = names; ++ for (i = 0; i < nregs; i++) { ++ regs[i] = p; ++ p += strlen(p) + 1; ++ } ++ qsort(regs, (size_t) nregs, sizeof(char *), reg_comp); ++ regs[i++] = "nothing"; ++ regs[i++] = "unused"; ++ regs[i++] = NULL; ++} ++static int reg_comp(dst, src) ++ const void *dst, *src; ++{ ++ return strcmp(*(char **) dst, *(char **) src); ++} + ++#endif /* TV_MULTILINGUAL */ +diff -ruN xv-3.10a-bugfixes/xvtiff.c xv-3.10a-enhancements/xvtiff.c +--- xv-3.10a-bugfixes/xvtiff.c 2005-03-27 17:25:31.000000000 -0800 ++++ xv-3.10a-enhancements/xvtiff.c 2005-04-17 14:11:55.000000000 -0700 +@@ -512,7 +512,7 @@ + vsprintf(cp, fmt, ap); + strcat(cp, "."); + +- SetISTR(ISTR_WARNING,buf); ++ SetISTR(ISTR_WARNING, "%s", buf); + + error_occurred = 1; + } +@@ -536,7 +536,7 @@ + vsprintf(cp, fmt, ap); + strcat(cp, "."); + +- SetISTR(ISTR_WARNING,buf); ++ SetISTR(ISTR_WARNING, "%s", buf); + } + + +@@ -564,6 +564,10 @@ + static byte **BWmap; + static byte **PALmap; + ++/* XXXX Work around some collisions with the new library. */ ++#define tileContigRoutine _tileContigRoutine ++#define tileSeparateRoutine _tileSeparateRoutine ++ + typedef void (*tileContigRoutine) PARM((byte*, u_char*, RGBvalue*, + uint32, uint32, int, int)); + +@@ -603,7 +607,7 @@ + uint32, uint32, int, int)); + static void put4bitbwtile PARM((byte *, u_char *, RGBvalue *, + uint32, uint32, int, int)); +-static void put16bitbwtile PARM((byte *, u_char *, RGBvalue *, ++static void put16bitbwtile PARM((byte *, u_short *, RGBvalue *, + uint32, uint32, int, int)); + + static void putRGBcontig8bittile PARM((byte *, u_char *, RGBvalue *, +@@ -653,7 +657,7 @@ + + default: + TIFFError(TIFFFileName(tif), +- "Sorry, can not handle %d-bit pictures", bitspersample); ++ "Sorry, cannot handle %d-bit pictures", bitspersample); + return (0); + } + +@@ -666,7 +670,7 @@ + + default: + TIFFError(TIFFFileName(tif), +- "Sorry, can not handle %d-channel images", samplesperpixel); ++ "Sorry, cannot handle %d-channel images", samplesperpixel); + return (0); + } + +@@ -1157,7 +1161,7 @@ + b = g + stripsize; + put = pickTileSeparateCase(Map); + if (put == 0) { +- TIFFError(filename, "Can not handle format"); ++ TIFFError(filename, "Cannot handle format"); + return (0); + } + y = setorientation(tif, h); +@@ -1197,7 +1201,7 @@ + /* + * Greyscale images with less than 8 bits/sample are handled + * with a table to avoid lots of shifts and masks. The table +- * is setup so that put*bwtile (below) can retrieve 8/bitspersample ++ * is set up so that put*bwtile (below) can retrieve 8/bitspersample + * pixel values simply by indexing into the table with one + * number. + */ +@@ -1249,11 +1253,11 @@ + + + /* +- * Palette images with <= 8 bits/sample are handled +- * with a table to avoid lots of shifts and masks. The table +- * is setup so that put*cmaptile (below) can retrieve 8/bitspersample +- * pixel values simply by indexing into the table with one +- * number. ++ * Palette images with <= 8 bits/sample are handled with ++ * a table to avoid lots of shifts and masks. The table ++ * is set up so that put*cmaptile (below) can retrieve ++ * (8/bitspersample) pixel-values simply by indexing into ++ * the table with one number. + */ + static int makecmap() + { +@@ -1305,7 +1309,7 @@ + /* + * The following routines move decoded data returned + * from the TIFF library into rasters filled with packed +- * ABGR pixels (i.e. suitable for passing to lrecwrite.) ++ * ABGR pixels (i.e., suitable for passing to lrecwrite.) + * + * The routines have been created according to the most + * important cases and optimized. pickTileContigCase and +@@ -1376,7 +1380,7 @@ + int fromskew, toskew; + { + while (h-- > 0) { +- UNROLL8(w, , *cp++ = PALmap[*pp++][0]) ++ UNROLL8(w, , *cp++ = PALmap[*pp++][0]); + cp += toskew; + pp += fromskew; + } +@@ -1529,7 +1533,7 @@ + */ + static void put16bitbwtile(cp, pp, Map, w, h, fromskew, toskew) + byte *cp; +- u_char *pp; ++ u_short *pp; + RGBvalue *Map; + uint32 w, h; + int fromskew, toskew; +@@ -1538,8 +1542,7 @@ + + while (h-- > 0) { + for (x=w; x>0; x--) { +- *cp++ = Map[(pp[0] << 8) + pp[1]]; +- pp += 2; ++ *cp++ = Map[*pp++]; + } + cp += toskew; + pp += fromskew; +@@ -1577,7 +1580,7 @@ + *cp++ = pp[0]; + *cp++ = pp[1]; + *cp++ = pp[2]; +- pp += samplesperpixel) ++ pp += samplesperpixel); + cp += toskew; + pp += fromskew; + } +@@ -1650,7 +1653,7 @@ + *cp++ = *r++; + *cp++ = *g++; + *cp++ = *b++; +- ) ++ ); + SKEW(r, g, b, fromskew); + cp += toskew; + } +@@ -1857,7 +1860,7 @@ + case PHOTOMETRIC_MINISWHITE: + case PHOTOMETRIC_MINISBLACK: + switch (bitspersample) { +- case 16: put = put16bitbwtile; break; ++ case 16: put = (tileContigRoutine) put16bitbwtile; break; + case 8: put = putgreytile; break; + case 4: put = put4bitbwtile; break; + case 2: put = put2bitbwtile; break; +@@ -1872,7 +1875,7 @@ + break; + } + +- if (put==0) TIFFError(filename, "Can not handle format"); ++ if (put==0) TIFFError(filename, "Cannot handle format"); + return (put); + } + +@@ -1880,8 +1883,8 @@ + /* + * Select the appropriate conversion routine for unpacked data. + * +- * NB: we assume that unpacked single channel data is directed +- * to the "packed routines. ++ * NB: we assume that unpacked single-channel data is directed ++ * to the "packed" routines. + */ + static tileSeparateRoutine pickTileSeparateCase(Map) + RGBvalue* Map; +@@ -1897,10 +1900,32 @@ + break; + } + +- if (put==0) TIFFError(filename, "Can not handle format"); ++ if (put==0) TIFFError(filename, "Cannot handle format"); + return (put); + } + + + ++/*******************************************/ ++void ++VersionInfoTIFF() /* GRR 19980605 */ ++{ ++ char temp[1024], *p, *q; ++ ++ strcpy(temp, TIFFGetVersion()); ++ p = temp; ++ while (!isdigit(*p)) ++ ++p; ++ if ((q = strchr(p, '\n')) != NULL) ++ *q = '\0'; ++ ++ fprintf(stderr, " Compiled with libtiff %s", p); ++#ifdef TIFFLIB_VERSION ++ fprintf(stderr, " of %d", TIFFLIB_VERSION); /* e.g., 19960307 */ ++#endif ++ fprintf(stderr, ".\n"); ++} ++ ++ ++ + #endif /* HAVE_TIFF */ +diff -ruN xv-3.10a-bugfixes/xvtiffwr.c xv-3.10a-enhancements/xvtiffwr.c +--- xv-3.10a-bugfixes/xvtiffwr.c 2005-03-28 08:39:52.000000000 -0800 ++++ xv-3.10a-enhancements/xvtiffwr.c 2005-04-17 14:45:28.000000000 -0700 +@@ -86,6 +86,9 @@ + TIFFSetField(tif, TIFFTAG_GROUP3OPTIONS, + GROUP3OPT_2DENCODING+GROUP3OPT_FILLBITS); + ++ if (comp == COMPRESSION_LZW) ++ TIFFSetField(tif, TIFFTAG_PREDICTOR, 2); ++ + TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); + TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); +diff -ruN xv-3.10a-bugfixes/xvvd.c xv-3.10a-enhancements/xvvd.c +--- xv-3.10a-bugfixes/xvvd.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvvd.c 2005-04-17 22:56:02.000000000 -0700 +@@ -0,0 +1,1101 @@ ++ ++/* ++ * xvvd.c - extract archived file automatically and regard it as a ++ * (virtual) directory. ++ */ ++ ++#define NEEDSDIR ++ ++#include "xv.h" ++ ++#ifdef AUTO_EXPAND ++ ++static void vd_Dirtovd PARM((char *)); ++static void vd_Vdtodir PARM((char *)); ++static int vd_Mkvdir PARM((char *)); ++static int vd_Rmvdir PARM((char *)); ++static int vd_Movevdir PARM((char *, char *)); ++static void vd_addvdtable PARM((char *)); ++static void vd_packvdtable PARM((void)); ++static int vd_recursive_mkdir PARM((char *)); ++static int vd_recursive_rmdir PARM((char *)); ++static void vd_optimize_path PARM((char *)); ++static int vd_ftype PARM((char *)); ++static int vd_compp PARM((char *, char *)); ++static int vd_UncompressFile PARM((char *, char *)); ++static int vd_tarc PARM((char *)); ++static u_int vd_tar_sumchk PARM((char *)); ++ ++#define VD_VDTABLESIZE 100 ++ ++#define VD_ERR -2 ++#define VD_UKN -1 ++ ++static char *ext_command[] = { ++/* KEEP 0 */ ++ NULL, ++#define VD_ARC 1 ++ "arc xo %s", ++#define VD_ARJ 2 ++ "unarj x %s", ++#define VD_LZH 3 ++ "lha -xf %s", ++#define VD_TAR 4 ++ "tar xvf %s", ++#define VD_ZIP 5 ++ "unzip -xo %s", ++#define VD_ZOO 6 ++ "zoo xOS %s", ++}; ++ ++int vdcount = 0; ++ ++static char vdroot[MAXPATHLEN+1]; ++static char *vdtable[VD_VDTABLESIZE]; ++ ++/* ++ * These functions initialize and settle virtual directory system. ++ * Vdinit: ++ * creates root of virtual directory. ++ * Vdsettle: ++ * sweeps virtual directories. ++ */ ++void Vdinit() ++{ ++#ifndef VMS ++ char tmp[MAXPATHLEN+1]; ++ ++ xv_getwd(tmp, MAXPATHLEN+1); ++ if (chdir(tmpdir)) { ++ fprintf(stderr, "Warning: cannot chdir to tmpdir = '%s'.\n", tmpdir); ++ fprintf(stderr, ++ " I will use current directory '%s' instead of tmpdir.\n", ++ tmp); ++ } ++ xv_getwd(vdroot, MAXPATHLEN+1); ++ strcat(vdroot, "/.xvvdXXXXXX"); ++ chdir(tmp); ++#else ++ sprintf(vdroot, "Sys$Scratch:xvvdXXXXXX"); ++#endif /* VMS */ ++#ifdef USE_MKSTEMP ++ close(mkstemp(vdroot)); ++#else ++ mktemp(vdroot); ++#endif ++ ++ if (!vd_recursive_mkdir(vdroot)) ++ tmpdir = vdroot; ++} ++ ++void Vdsettle() ++{ ++ int i; ++ ++ for (i = 0; i < vdcount; i++) ++ free(vdtable[i]); ++ ++ vdcount = 0; ++ ++ vd_recursive_rmdir(vdroot); ++} ++ ++/* ++ * This function chdir to virtual directory, if specified path is in ++ * virtual directlry. ++ */ ++int Chvdir(dir) ++char *dir; ++{ ++ char buf[MAXPATHLEN+1]; ++ ++ if (Mkvdir(dir) == VD_ERR) ++ return -1; ++ ++ strcpy(buf, dir); ++ Dirtovd(buf); ++ ++ return (chdir(buf)); ++} ++ ++/* ++ * These functions convert directory <-> virtual directory. ++ * Dirtovd: ++ * front interface of vd_Dirtovd. ++ * vd_Dirtovd: ++ * converts directory to virtual directory. ++ * Vdtodir: ++ * front interface of vd_Vdtodir. ++ * vd_Vdtodir: ++ * converts virtual directory to normal directory. ++ * Dirtosubst: ++ * converts directory to substance of archive. ++ */ ++void Dirtovd(dir) ++char *dir; ++{ ++ vd_optimize_path(dir); ++ ++ vd_Dirtovd(dir); ++} ++ ++static void vd_Dirtovd(dir) ++char *dir; ++{ ++ int i; ++ ++ for (i = 0; i < vdcount; i++) ++ if (!strncmp(dir, vdtable[i], strlen(vdtable[i]))) { ++ char tmp[MAXPATHLEN+1]; ++ ++ sprintf(tmp, "%s%s", vdroot, dir); ++ strcpy(dir, tmp); ++ Dirtovd(dir); ++ } ++} ++ ++void Vdtodir(dir) ++char *dir; ++{ ++ vd_optimize_path(dir); ++ ++ vd_Vdtodir(dir); ++} ++ ++static void vd_Vdtodir(vd) ++char *vd; ++{ ++ int i; ++ char tmp[MAXPATHLEN+1]; ++ ++ for (i = vdcount-1; i >= 0; i--) { ++ sprintf(tmp, "%s%s", vdroot, vdtable[i]); ++ if(!strncmp(vd, tmp, strlen(tmp))) { ++ strcpy(tmp, vd+strlen(vdroot)); ++ strcpy(vd, tmp); ++ Vdtodir(vd); ++ } ++ } ++} ++ ++void Dirtosubst(dir) ++char *dir; ++{ ++ char tmp[MAXPATHLEN+1]; ++ ++ Dirtovd(dir); ++ ++ strcpy(tmp, dir+strlen(vdroot)); ++ ++ if (Isarchive(tmp)) ++ strcpy(dir, tmp); ++} ++ ++/* ++ * These functions make virtual directory and extracts archive, if ++ * specified path is archive. ++ * Mkvdir: ++ * front interface of vd_Mkvdir. ++ * vd_Mkvdir: ++ * does real work. ++ * Mkvdir_force: (used by makeThumbDir(in xvbrowse.c) only) ++ * make virtual directory by force. ++ */ ++int Mkvdir(dir) ++char *dir; ++{ ++ char dir1[MAXPATHLEN+1], dir2[MAXPATHLEN+1]; ++ char *d1, *d2; ++ int rv; ++ ++#if defined(SYSV) || defined(SVR4) || defined(__USE_XOPEN_EXTENDED) ++ sighold(SIGHUP); ++ sighold(SIGCHLD); ++#else ++ int mask; ++ mask = sigblock(sigmask(SIGHUP)|sigmask(SIGCHLD)); ++#endif ++ ++ strcpy(dir1, dir); ++ vd_optimize_path(dir1); ++ ++ if ((rv = vd_Mkvdir(dir1)) != VD_ERR) ++ goto MKVDIR_END; ++ ++ strcpy(dir2, dir1); ++ d2 = dir2 + strlen(dir2); ++ while (rv == VD_ERR) { ++ d2--; ++ while (*d2 != '/') ++ d2--; ++ *d2 = '\0'; ++ rv = vd_Mkvdir(dir2); ++ } ++ d1 = dir1 + strlen(dir2); ++ while ((rv != VD_ERR) && (*d1 != '\0')) { ++ *d2++ = *d1++; ++ while ((*d1 != '/') && (*d1 != '\0')) ++ *d2++ = *d1++; ++ *d2 = '\0'; ++ rv = vd_Mkvdir(dir2); ++ } ++ ++MKVDIR_END: ++#if defined(SYSV) || defined(SVR4) || defined(__USE_XOPEN_EXTENDED) ++ sigrelse(SIGHUP); ++ sigrelse(SIGCHLD); ++#else ++ sigsetmask(mask); ++#endif ++ ++ return rv; ++} ++ ++static int vd_Mkvdir(dir) ++char *dir; ++{ ++ char dir1[MAXPATHLEN+1], dir2[MAXPATHLEN+1], tmp[MAXPATHLEN+1]; ++ int ftype, i; ++ struct stat st; ++ FILE *pfp; ++ ++ strcpy(dir1, dir); ++ Dirtovd(dir1); ++ strcpy(dir2, dir1); ++ ++ WaitCursor(); ++ ++ if ((ftype = vd_ftype(dir1)) < 0) { ++ SetCursors(-1); ++ return ftype; ++ } ++ if (ftype == RFT_COMPRESS) { ++ if (!(ftype = vd_compp(dir1, tmp))) { ++ SetCursors(-1); ++ return ftype; ++ } ++ strcpy(dir1, tmp); ++ } ++ ++ if (!stat(dir1, &st)) { ++ for(i = 0; i < vdcount; i++) ++ if (!strcmp(vdtable[i], dir2)) { ++ SetCursors(-1); ++ return 0; ++ } ++ ++ if (!S_ISDIR(st.st_mode)) { ++ char origdir[MAXPATHLEN+1], buf[MAXPATHLEN+10], buf1[100]; ++ ++ if (vdcount >= VD_VDTABLESIZE) { ++ ErrPopUp("Sorry, you can't make virtual directory any more.", ++ "\nBummer!"); ++ goto VD_MKVDIR_ERR; ++ } ++ ++ WaitCursor(); ++ ++ xv_getwd(origdir, MAXPATHLEN+1); ++ ++ sprintf(tmp, "%s%s", vdroot, dir2); ++ if (vd_recursive_mkdir(tmp) || chdir(tmp)) { ++ SetISTR(ISTR_INFO, "fail to make virtual directory."); ++ Warning(); ++ goto VD_MKVDIR_ERR; ++ } ++ sprintf(buf, ext_command[ftype], dir1); ++ ++ WaitCursor(); ++ ++ if((pfp = popen(buf, "r")) == NULL) { ++ SetISTR(ISTR_INFO, "fail to extract archive '%s'.", ++ BaseName(dir2)); ++ Warning(); ++ goto VD_MKVDIR_ERR; ++ } ++ while (1) { ++ if (fread(buf1, 1, sizeof(buf1), pfp) < sizeof(buf1)) ++ break; ++ WaitCursor(); ++ } ++ if (!feof(pfp)) { ++ SetISTR(ISTR_INFO, "Pipe was broken."); ++ Warning(); ++ pclose(pfp); ++ goto VD_MKVDIR_ERR; ++ } ++ pclose(pfp); ++ ++ if (strcmp(dir1, dir2)) ++ unlink(dir1); ++ ++ vd_addvdtable(dir2); ++ Dirtovd(origdir); ++ chdir(origdir); ++ SetCursors(-1); ++ return 0; ++ ++VD_MKVDIR_ERR: ++ if (strcmp(dir1, dir2)) ++ unlink(dir1); ++ SetCursors(-1); ++ return VD_ERR; ++ } ++ } ++ SetCursors(-1); ++ return VD_ERR; ++} ++ ++#ifdef VIRTUAL_TD ++void Mkvdir_force(dir) ++char *dir; ++{ ++ char tmp[MAXPATHLEN+1]; ++ ++ if (vdcount >= VD_VDTABLESIZE) { ++ ErrPopUp("Sorry, you can't make virtual directory any more.", ++ "\nBummer!"); ++ return; ++ } ++ ++ sprintf(tmp, "%s%s", vdroot, dir); ++ if (vd_recursive_mkdir(tmp)) { ++ SetISTR(ISTR_INFO, "Failed to make virtual directory."); ++ Warning(); ++ return; ++ } ++ ++ vd_addvdtable(dir); ++} ++#endif /* VIRTUAL_TD */ ++ ++/* ++ * These functions remove virtual directory, if exists. ++ * Rmvdir: ++ * front interface of vd_Rmvdir. ++ * vd_Rmvdir: ++ * remove virtual directory function. ++ */ ++int Rmvdir(dir) ++char *dir; ++{ ++ int rv; ++ char buf[MAXPATHLEN+1]; ++ ++ strcpy(buf, dir); ++ vd_optimize_path(buf); ++ ++ rv = vd_Rmvdir(buf); ++ vd_packvdtable(); ++ return rv; ++} ++ ++static int vd_Rmvdir(dir) ++char *dir; ++{ ++ int i; ++ char tmp[MAXPATHLEN+1]; ++ ++ for(i = 0; i < vdcount; i++) ++ if (!strncmp(dir, vdtable[i], strlen(dir))) { ++ sprintf(tmp, "%s%s", vdroot, vdtable[i]); ++ if (vd_Rmvdir(tmp)) ++ return 1; ++ if (vd_recursive_rmdir(tmp)) ++ return 1; ++ vdtable[i][0] = '\0'; ++ } ++ return 0; ++} ++ ++/* ++ * These functions move virtual directory, if exists. ++ * Movevdir: ++ * front interface of move virtual directory function. ++ * vd_Movevdir: ++ * does real work. ++ */ ++int Movevdir(src, dst) ++char *src, *dst; ++{ ++/* ++ char sbuf[MAXPATHLEN+1], dbuf[MAXPATHLEN+1]; ++ ++ strcpy(sbuf, src); ++ vd_optimize_path(sbuf); ++ ++ strcpy(dbuf, dst); ++ vd_optimize_path(dbuf); ++ ++ return (vd_Movevdir(sbuf, dbuf)); ++*/ ++ return (vd_Movevdir(src, dst)); ++} ++ ++static int vd_Movevdir(src, dst) ++char *src, *dst; ++{ ++ int i; ++ char *p, *pp; ++ char tmp[MAXPATHLEN+1], tmps[MAXPATHLEN+1], tmpd[MAXPATHLEN+1]; ++ ++ for (i = 0; i < vdcount; i++) ++ if (!strncmp(src, vdtable[i], strlen(src))) { ++ sprintf(tmps, "%s%s", vdroot, vdtable[i]); ++ sprintf(tmp, "%s%s", dst, vdtable[i]+strlen(src)); ++ sprintf(tmpd, "%s%s", vdroot, tmp); ++ ++ if (vd_Movevdir(tmps, tmpd)) ++ return 1; ++ ++ pp = vdtable[i]; ++ p = (char *) malloc(strlen(tmp)+1); ++ strcpy(p, tmp); ++ vdtable[i] = p; ++ ++ strcpy(tmp, tmpd); ++ for (p = tmp+strlen(tmp); *p != '/'; p--) ++ ; ++ *p = '\0'; ++ ++ if (vd_recursive_mkdir(tmp)) ++ goto VD_MOVEVDIR_ERR; ++ ++ if (rename(tmps, tmpd) < 0) ++ goto VD_MOVEVDIR_ERR; ++ ++ free(pp); ++ } ++ return 0; ++ ++VD_MOVEVDIR_ERR: ++ free(vdtable[i]); ++ vdtable[i] = pp; ++ return 1; ++} ++ ++/* ++ * These functions handle table of virtual directories. ++ * vd_addvdtable: ++ * adds virtual directory to table. ++ * vd_packvdtable: ++ * removes disused virtual directories from table. ++ */ ++static void vd_addvdtable(vd) ++char *vd; ++{ ++ char *p; ++ p = (char *) malloc(strlen(vd)+1); ++ strcpy(p, vd); ++ vdtable[vdcount] = p; ++ vdcount++; ++} ++ ++static void vd_packvdtable() ++{ ++ int i, j; ++ ++ for (i = j = 0; i < vdcount; i++) ++ if (vdtable[i][0] != '\0') ++ vdtable[j++] = vdtable[i]; ++ else ++ free(vdtable[i]); ++ ++ vdcount = j; ++} ++ ++/* ++ * These are utility functions. ++ * vd_recursive_mkdir: ++ * makes directories recursively. ++ * vd_recursive_rmdir ++ * removes directories recursively. ++ */ ++static int vd_recursive_mkdir(dir) ++char *dir; ++{ ++ char buf[MAXPATHLEN+1], *p; ++ struct stat st; ++ ++ strcpy(buf, dir); ++ ++ if (buf[strlen(buf) - 1] == '/') ++ buf[strlen(buf) - 1] = '\0'; ++ ++ p = rindex(buf, '/'); ++ *p = '\0'; ++ ++ if (stat(buf, &st) < 0) ++ if (vd_recursive_mkdir(buf) < 0) ++ return (-1); ++ ++ *p = '/'; ++ if (mkdir(buf, 0700) < 0) ++ return (-1); ++ ++ return (0); ++} ++ ++static int vd_recursive_rmdir(dir) ++char *dir; ++{ ++ char buf[MAXPATHLEN+1], buf2[MAXPATHLEN+1]; ++ DIR *dp; ++ struct dirent *di; ++ ++ strcpy(buf, dir); ++ ++ if (buf[strlen(buf) - 1] == '/') ++ buf[strlen(buf) - 1] = '\0'; ++ ++ if ((dp = opendir(buf)) == NULL) ++ return (-1); ++ ++ while ((di = readdir(dp)) != NULL) { ++ struct stat st; ++ ++ if (!strcmp(di->d_name, ".") || !strcmp(di->d_name, "..")) ++ continue; ++ ++ sprintf(buf2, "%s/%s", dir, di->d_name); ++ ++ stat(buf2, &st); ++ if (S_ISDIR(st.st_mode)) { ++ if (vd_recursive_rmdir(buf2) < 0) ++ goto VD_RECURSIVE_RMDIR_ERR; ++ } else ++ unlink(buf2); ++ } ++ if (rmdir(buf) < 0) ++ goto VD_RECURSIVE_RMDIR_ERR; ++ ++ closedir(dp); ++ return (0); ++ ++VD_RECURSIVE_RMDIR_ERR: ++ closedir(dp); ++ return (-1); ++} ++ ++/* ++ * These functions test specified path. ++ * Isarchive: ++ * tests whether it's an archive? ++ * Isvdir: ++ * tests whether it's in the virtual directory? ++ */ ++int Isarchive(path) ++char *path; ++{ ++ int ftype; ++ ++ if ((ftype = vd_ftype(path)) < 0) ++ return 0; ++ ++ if (ftype == RFT_COMPRESS) ++ if (!(ftype = vd_compp(path, NULL))) ++ return 0; ++ ++ return ftype; ++} ++ ++int Isvdir(path) ++char *path; ++{ ++ int rv = 0; ++ char tmp1[MAXPATHLEN+1], tmp2[MAXPATHLEN+1]; ++ int archive1, archive2; ++ ++ strcpy(tmp1, path); ++ strcpy(tmp2, path); ++ ++ vd_optimize_path(tmp1); ++ Dirtovd(tmp2); ++ ++ archive1 = Isarchive(tmp1); ++ archive2 = Isarchive(tmp2); ++ ++ if (strcmp(tmp1, tmp2)) { ++ char tmp3[MAXPATHLEN+1], tmp4[MAXPATHLEN+1]; ++ int archive3, archive4; ++ ++ sprintf(tmp3, "%s%s", vdroot, tmp1); ++ strcpy(tmp4, tmp2+strlen(vdroot)); ++ ++ archive3 = Isarchive(tmp3); ++ archive4 = Isarchive(tmp4); ++ ++ if (archive4 && !strcmp(tmp1, tmp4)) { ++ rv |= 06; ++ return rv; ++ } ++ rv |= 01; ++ if (archive2) ++ rv |= 02; ++ else if (archive4) ++ rv |= 06; ++ return rv; ++ } ++ if (archive1) ++ rv |= 02; ++ ++ return rv; ++} ++ ++/* ++ * This function optimizes given path. ++ * Expand '~' to home directory and removes '.', and treat '..'. ++ */ ++static void vd_optimize_path(path) ++char *path; ++{ ++ char *tmp, *reserve; ++ ++ if (!strcmp(path, STDINSTR)) ++ return; ++ ++ if (*path == '\0') { ++ xv_getwd(path, MAXPATHLEN+1); ++ return; ++ } ++ if (*path == '~') ++ Globify(path); ++ if (*path != '/') { ++ char tmp[MAXPATHLEN+1]; ++ ++ strcpy(tmp, path); ++ xv_getwd(path, MAXPATHLEN+1); ++ strcat(path, "/"); ++ strcat(path, tmp); ++ } ++ ++ reserve = tmp = path; ++ while(*path != '\0') { ++ if (*path == '/') { ++ *tmp++ = *path; ++ while (*++path == '/') ++ ; ++ continue; ++ } ++ if ((*path == '.') && (*(path-1) == '/')) { ++ if (*(path+1) == '/') { ++ tmp--; ++ path++; ++ continue; ++ } else if (*(path+1) == '\0') { ++ tmp--; ++ break; ++ } else if (*(path+1) == '.') { ++ if (*(path+2) == '/') { ++ if ((tmp - reserve) > 1) ++ for (tmp-=2; (*tmp != '/'); tmp--) ++ ; ++ else ++ tmp = reserve; ++ path+=2; ++ continue; ++ } else if (*(path+2) == '\0') { ++ if ((tmp - reserve) > 1) ++ for (tmp-=2; (*tmp != '/'); tmp--) ++ ; ++ else ++ tmp = reserve+1; ++ break; ++ } ++ } ++ } ++ *tmp++ = *path++; ++ } ++ if (((tmp - reserve) > 1) && *(tmp-1) == '/') ++ tmp--; ++ if (tmp == reserve) ++ *tmp++ = '/'; ++ ++ *tmp = '\0'; ++} ++ ++/* ++ * These functions detect file type. ++ */ ++static int vd_ftype(fname) ++char *fname; ++{ ++ /* check archive type */ ++ ++ FILE *fp; ++ byte magicno[30]; /* first 30 bytes of file */ ++ int rv, n; ++ struct stat st; ++ ++ if (!fname) return VD_ERR; /* shouldn't happen */ ++ ++ if ((!stat(fname, &st)) && (st.st_mode & S_IFMT) == S_IFDIR) ++ return VD_UKN; ++ fp = xv_fopen(fname, "r"); ++ if (!fp) return VD_ERR; ++ ++ n = fread(magicno, (size_t) 1, (size_t) 30, fp); ++ fclose(fp); ++ ++ if (n<30) return VD_UKN; /* files less than 30 bytes long... */ ++ ++ rv = VD_UKN; ++ ++ if (magicno[0] == 0x60 && magicno[1]==0xea) rv = VD_ARJ; ++ ++ else if (magicno[2] == '-' && magicno[3] == 'l' && ++ magicno[4] == 'h') rv = VD_LZH; ++ ++ else if (strncmp((char *) magicno,"PK", (size_t) 2)==0) rv = VD_ZIP; ++ ++ else if (magicno[20]==0xdc && magicno[21]==0xa7 && ++ magicno[22]==0xc4 && magicno[23]==0xfd) rv = VD_ZOO; ++ ++ else if (vd_tarc(fname)) rv = VD_TAR; ++ ++ else if (magicno[0]==0x1f && magicno[1]==0x9d) rv = RFT_COMPRESS; ++ ++ else if (!strncmp((char *) &magicno[11], "MAJYO", (size_t) 5)) ++ rv = VD_UKN; /* XXX */ ++ ++ else if (magicno[0] == 26) rv = VD_ARC; ++ ++#ifdef GUNZIP ++ else if (magicno[0]==0x1f && magicno[1]==0x8b) rv = RFT_COMPRESS;/* gzip */ ++ else if (magicno[0]==0x1f && magicno[1]==0x9e) rv = RFT_COMPRESS;/* old */ ++ else if (magicno[0]==0x1f && magicno[1]==0x1e) rv = RFT_COMPRESS;/* pack */ ++#endif ++ ++ return rv; ++} ++ ++static int vd_compp(path, newpath) ++char *path, *newpath; ++{ ++ /* ++ * uncompress and check archive type. ++ * ++ * If newpath is NULL, uncompress only 512 byte of 'path' and ++ * check archive type, so it is for SPEED-UP strategy. ++ * In this case, caller this function does not have to unlink ++ * tempoary file. ++ * Unfortunately it does not work in VMS system. ++ */ ++ ++ int file_type, r; ++ char uncompname[128], basename[128]; ++ int comptype; ++ ++ if (newpath) *newpath = '\0'; ++ strncpy(basename, path, 127); ++ comptype = ReadFileType(path); ++#if (defined(VMS) && !defined(GUNZIP)) ++ /* VMS decompress doesn't like the file to have a trailing .Z in fname ++ however, GUnZip is OK with it, which we are calling UnCompress */ ++ *rindex (basename, '.') = '\0'; ++#endif ++#ifdef VMS ++ if (UncompressFile(basename, uncompname)) { ++#else ++ if (newpath == NULL) ++ r = vd_UncompressFile(basename, uncompname); ++ else ++ r = UncompressFile(basename, uncompname, comptype); ++ if (r) { ++#endif ++ if ((file_type = vd_ftype(uncompname)) < 0) { ++ unlink(uncompname); ++ return 0; ++ } ++ if (newpath) strcpy(newpath, uncompname); ++ else unlink(uncompname); ++ } else { ++ return 0; ++ } ++ return file_type; ++} ++ ++#define HEADERSIZE 512 ++ ++static void vd_Dirtovd PARM((char *)); ++static int stderr_on PARM((void)); ++static int stderr_off PARM((void)); ++static FILE *popen_nul PARM((char *, char *)); ++ ++static int vd_UncompressFile(name, uncompname) ++char *name, *uncompname; ++{ ++ /* Yap, I`m nearly same as original `UncompnameFile' function, but, ++ 1) I extract `name' file ONLY first 512 byte. ++ 2) I'm called only from UNIX and UNIX like OS, *NOT* VMS */ ++ /* returns '1' on success, with name of uncompressed file in uncompname ++ returns '0' on failure */ ++ ++ char namez[128], *fname, buf[512], tmp[HEADERSIZE]; ++ int n, tmpfd; ++ FILE *pfp, *tfp; ++ ++ fname = name; ++ namez[0] = '\0'; ++ ++ ++#ifndef GUNZIP ++ /* see if compressed file name ends with '.Z'. If it *doesn't*, we need ++ to temporarily rename it so it *does*, uncompress it, and rename it ++ *back* to what it was. necessary because uncompress doesn't handle ++ files that don't end with '.Z' */ ++ ++ if (strlen(name) >= (size_t) 2 && ++ strcmp(name + strlen(name)-2,".Z")!=0 && ++ strcmp(name + strlen(name)-2,".z")!=0) { ++ strcpy(namez, name); ++ strcat(namez,".Z"); ++ ++ if (rename(name, namez) < 0) { ++ sprintf(buf, "Error renaming '%s' to '%s': %s", ++ name, namez, ERRSTR(errno)); ++ ErrPopUp(buf, "\nBummer!"); ++ return 0; ++ } ++ ++ fname = namez; ++ } ++#endif /* not GUNZIP */ ++ ++ sprintf(uncompname, "%s/xvuXXXXXX", tmpdir); ++#ifdef USE_MKSTEMP ++ tmpfd = mkstemp(uncompname); ++#else ++ mktemp(uncompname); ++#endif ++ ++ sprintf(buf,"%s -c %s", UNCOMPRESS, fname); ++ SetISTR(ISTR_INFO, "Uncompressing Header '%s'...", BaseName(fname)); ++ if ((pfp = popen_nul(buf, "r")) == NULL) { ++ SetISTR(ISTR_INFO, "Cannot extract for archive '%s'.", ++ BaseName(fname)); ++ Warning(); ++#ifdef USE_MKSTEMP ++ if (tmpfd >= 0) ++ close(tmpfd); ++#endif ++ return 0; ++ } ++#ifdef USE_MKSTEMP ++ if (tmpfd < 0) ++#else ++ if ((tmpfd = open(uncompname,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR)) < 0) ++#endif ++ { ++ SetISTR(ISTR_INFO, "Unable to create temporary file.", ++ BaseName(uncompname)); ++ Warning(); ++ pclose(pfp); ++ } ++ if ((tfp = fdopen(tmpfd, "w")) == NULL) { ++ SetISTR(ISTR_INFO, "Unable to create temporary file.", ++ BaseName(uncompname)); ++ Warning(); ++ close(tmpfd); ++ pclose(pfp); ++ return 0; ++ } ++ if ((n = fread(tmp, 1, sizeof(tmp), pfp)) != HEADERSIZE) { ++ SetISTR(ISTR_INFO, "Unable to read '%s'.", ++ BaseName(fname)); ++ Warning(); ++ pclose(pfp); ++ fflush(tfp); ++ fclose(tfp); ++ close(tmpfd); ++ return 0; ++ } ++ fwrite(tmp, 1, n, tfp); ++ fflush(tfp); ++ fclose(tfp); ++ close(tmpfd); ++ pclose(pfp); ++ ++ /* if we renamed the file to end with a .Z for the sake of 'uncompress', ++ rename it back to what it once was... */ ++ ++ if (strlen(namez)) { ++ if (rename(namez, name) < 0) { ++ sprintf(buf, "Error renaming '%s' to '%s': %s", ++ namez, name, ERRSTR(errno)); ++ ErrPopUp(buf, "\nBummer!"); ++ } ++ } ++ ++ return 1; ++} ++ ++#define TARBLOCK 512 ++#define CKSTART 148 /* XXX */ ++#define CKSIZE 8 ++ ++/* ++ * Tar file: 1, other: 0 ++ */ ++static int vd_tarc(fname) ++char *fname; ++{ ++ FILE *fp; ++ unsigned int sum; ++ char *ckp, buf[TARBLOCK]; ++ ++ if ((fp = fopen(fname, "r")) == NULL) ++ return 0; ++ ++ fread(buf, TARBLOCK, 1, fp); ++ fclose(fp); ++ ++ for (sum = 0, ckp = buf + CKSTART; ++ (ckp < buf + CKSTART + CKSIZE) && *ckp != '\0'; ++ ckp++) { ++ sum *= 8; ++ if (*ckp == ' ') ++ continue; ++ if (*ckp < '0' || '7' < *ckp) ++ return 0; ++ sum += *ckp - '0'; ++ } ++ if (sum != vd_tar_sumchk(buf)) ++ return 0; ++ ++ return 1; ++} ++ ++static unsigned int vd_tar_sumchk(buf) ++char *buf; ++{ ++ int i; ++ unsigned int sum = 0; ++ ++ for (i = 0; i < CKSTART; i++) { ++ sum += *(buf + i); ++ } ++ sum += ' ' * 8; ++ for (i += 8; i < TARBLOCK; i++) { ++ sum += *(buf + i); ++ } ++ return sum; ++} ++ ++ ++static int stde = -1; /* fd of stderr */ ++static int nul = -1; /* fd of /dev/null */ ++ ++/* ++ * switch off the output to stderr(bypass to /dev/null). ++ */ ++static int stderr_off() ++{ ++ if (nul < 0) ++ nul = open("/dev/null", O_RDONLY); ++ if (nul < 0) { ++ fprintf(stderr, "/dev/null open failure\n"); ++ return -1; ++ } ++ if (stde < 0) ++ stde = dup(2); ++ if (stde < 0) { ++ fprintf(stderr, "duplicate stderr failure\n"); ++ return -1; ++ } ++ close(2); ++ dup(nul); ++ return 0; ++} ++ ++/* ++ * turn on stderr output. ++ */ ++static int stderr_on() ++{ ++ if ((stde < 0) || (nul < 0)) { ++ fprintf(stderr, "stderr_on should call after stderr_off\n"); ++ return -1; ++ } ++ close(2); ++ dup(stde); ++ return 0; ++} ++ ++/* ++ * popen with no output to stderr. ++ */ ++static FILE *popen_nul(prog, mode) ++char *prog, *mode; ++{ ++ FILE *fp; ++ ++ stderr_off(); ++ fp = popen(prog, mode); ++ stderr_on(); ++ return fp; ++} ++ ++/* ++ * These functions are for SIGNAL. ++ * If XV end by C-c, there are dust of directory which name is .xvvd???, ++ * made by xvvd. Then, I handle SIGINT, and add good finish. ++ */ ++void vd_HUPhandler() ++{ ++#if defined(SYSV) || defined(SVR4) || defined(__USE_XOPEN_EXTENDED) ++ sighold(SIGHUP); ++#else ++ int mask; ++ mask = sigblock(sigmask(SIGHUP)); ++#endif ++ ++ Vdsettle(); ++ ++#if defined(SYSV) || defined(SVR4) || defined(__USE_XOPEN_EXTENDED) ++ sigrelse(SIGHUP); ++ signal(SIGHUP, (void (*)PARM((int))) vd_HUPhandler); ++#else ++ sigsetmask(mask); ++#endif ++} ++ ++void vd_handler(sig) ++int sig; ++{ ++#if defined(SYSV) || defined(SVR4) || defined(__USE_XOPEN_EXTENDED) ++ sighold(sig); ++#else ++ sigblock(sigmask(sig)); ++#endif ++ ++ Quit(1); /*exit(1);*/ ++} ++ ++int vd_Xhandler(disp,event) ++Display *disp; ++XErrorEvent *event; ++{ ++ Quit(1); /*exit(1);*/ ++ return (1); /* Not reached */ ++} ++ ++int vd_XIOhandler(disp) ++Display *disp; ++{ ++ fprintf(stderr, "XIO fatal IO error ? (?) on X server\n"); ++ fprintf(stderr, "You must exit normally in xv usage.\n"); ++ Quit(1); /*exit(1);*/ ++ return (1); /* Not reached */ ++} ++ ++void vd_handler_setup() ++{ ++ signal(SIGHUP, (void (*)PARM((int))) vd_HUPhandler); ++ signal(SIGINT, (void (*)PARM((int))) vd_handler); ++ signal(SIGTERM,(void (*)PARM((int))) vd_handler); ++ ++ (void)XSetErrorHandler(vd_Xhandler); ++ (void)XSetIOErrorHandler(vd_XIOhandler); ++} ++#endif /* AUTO_EXPAND */ +diff -ruN xv-3.10a-bugfixes/xvwbmp.c xv-3.10a-enhancements/xvwbmp.c +--- xv-3.10a-bugfixes/xvwbmp.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvwbmp.c 2005-04-03 14:02:18.000000000 -0700 +@@ -0,0 +1,323 @@ ++/* ++ * xvwbmp.c - i/o routings for WBMP files ++ * defined by OMA (http://www.openmobilealliance.com) ++ * as a standard for images for micro devices. ++ * ++ * exports : ++ * ++ * LoadWBMP(fname, numcols); ++ * WriteWBMP(fp, pic, ptype, w, h, r, g, b, numcols, style); ++ * ++ * author: Pawel S. Veselov <vps@manticore.2y.net> ++ * http://manticore.2y.net/ ++ * ++ */ ++ ++#include "xv.h" ++ ++typedef short int16; ++typedef unsigned char uint8; ++typedef unsigned short uint16; /* sizeof (uint16) must == 2 */ ++#if defined(__alpha) || _MIPS_SZLONG == 64 ++typedef int int32; ++typedef unsigned int uint32; /* sizeof (uint32) must == 4 */ ++#else ++typedef long int32; ++typedef unsigned long uint32; /* sizeof (uint32) must == 4 */ ++#endif ++ ++#define MUST(a) if (!(a)) {\ ++ return fail(st_fname, st_err);\ ++ close(fd); \ ++ } ++#define READU8(fd,u) if ((read(fd, &u, 1)<1)) {\ ++ myfree(); \ ++ close(fd); \ ++ return fail(st_fname, err_ueof); } ++#define SREADU8(fd, u) if ((read(fd, &u, 1,)<1)) {\ ++ { st_err = err_ueof; return 0; } ++ ++#define SREADC(fd, str, l) { \ ++ str = (char*)mymalloc(l); \ ++ if (!str) { \ ++ myfree(); \ ++ FatalError("LoadWBMP: can't malloc extension buffer"); \ ++ } \ ++ if (read(fd, str, l)<l) { \ ++ st_err = err_ueof; \ ++ return 0; \ ++ } ++ ++static char * err_ueof = "Unexpected EOF"; ++static char * err_unst = "Unsupported image type"; ++static char * err_extf = "Extensions are forbidden"; ++static char * err_inmb = "Invalid multibyte integer"; ++ ++static char * st_fname; ++static char * st_err; ++ ++static int fail PARM((char *, char *)); ++static int read_mb PARM((int *, int)); ++static void write_mb PARM((uint32, FILE *)); ++static int read_ext PARM((int, uint8)); ++static void * mymalloc PARM((int)); ++static void myfree PARM((void)); ++static uint8 * render1 PARM((uint8 *, int, int)); ++ ++void ** mymem = NULL; ++int mymems = 0; ++ ++int LoadWBMP(char * fname, PICINFO * pinfo) ++{ ++ int fd; ++ int im_type; /* image type (only type 0 supported) */ ++ uint8 fix_header; /* fixed header field */ ++ int width, height; ++ int npixels, raw_size, aux; ++ uint8 * raw; ++ ++ st_fname = fname; ++ ++ fd = open(fname, O_RDONLY); ++ if (fd < 0) { ++ return fail(fname, "Couldn't open the file"); ++ } ++ ++ MUST(read_mb(&im_type, fd)); ++ if (im_type) { ++ return fail(fname, err_unst); ++ } ++ ++ READU8(fd, fix_header); ++ ++ MUST(read_ext(fd, fix_header)); ++ ++ MUST(read_mb(&width, fd)); ++ MUST(read_mb(&height, fd)); ++ ++ npixels = width * height; ++ raw_size = (npixels+7) / 8; ++ if (width <= 0 || height <= 0 || npixels/width != height || ++ npixels+7 < npixels) ++ { ++ return fail(fname, "image dimensions out of range"); ++ } ++ ++ raw = mymalloc(raw_size); ++ if (!raw) { ++ myfree(); ++ FatalError("LoadWBMP: can't malloc image buffer"); ++ } ++ ++ aux = read(fd, raw, raw_size); ++ if (aux < raw_size) { ++ fail(fname, "Image size shrank"); ++ raw_size = aux; ++ } ++ ++ pinfo->r[0] = 0; ++ pinfo->g[0] = 0; ++ pinfo->b[0] = 0; ++ pinfo->r[1] = 255; ++ pinfo->g[1] = 255; ++ pinfo->b[1] = 255; ++ ++ pinfo->pic = render1(raw, raw_size, npixels); ++ pinfo->type = PIC8; ++ ++ pinfo->w = pinfo->normw = width; ++ pinfo->h = pinfo->normh = height; ++ pinfo->frmType = F_BWDITHER; ++ ++ sprintf(pinfo->fullInfo, "WBMP, 1 bit per pixel, %d bytes", raw_size); ++ sprintf(pinfo->shrtInfo, "%dx%d WBMP (WAP/OMA).", width, height); ++ pinfo->comment = (char*)NULL; ++ ++ close(fd); ++ ++ myfree(); ++ return 1; ++} ++ ++int WriteWBMP(FILE * fp, byte * pic, int ptype, int w, int h, ++ byte * rmap, byte *gmap, byte *bmap, ++ int numcols, int colorstyle) ++{ ++ int count = 0; ++ uint8 bit = 0; ++ int i; ++ ++ write_mb(0, fp); /* type : always 0 */ ++ putc(0, fp); /* fixed header : always 0 for type 0 */ ++ write_mb((uint32)w, fp); ++ write_mb((uint32)h, fp); ++ ++ /* ready to write data */ ++ ++ for (i=0; i<w*h; i++) { ++ bit |= (((pic[i]&1)<<(7-(count++)))); ++ if (count == 8) { ++ putc(bit, fp); ++ count = 0; ++ } ++ } ++ ++ if (!count) { ++ putc(bit, fp); ++ } ++ ++ return 0; ++} ++ ++int fail(char * name, char * msg) ++{ ++ SetISTR(ISTR_WARNING, "%s : %s", name, msg); ++ return 0; ++} ++ ++void write_mb(uint32 data, FILE * f) ++{ ++ int i = 32; ++ uint32 aux = data; ++ int no; ++ ++ if (!aux) { ++ i = 1; ++ } else { ++ while (!(aux & 0x80000000)) { ++ aux <<= 1; ++ i--; ++ } ++ } ++ ++ /* i tells us how many bits are left to encode */ ++ ++ no = (i / 7 + ((i % 7)?1:0))-1; ++ ++ /* ++ fprintf(stderr, "writing %x, bits to write=%d, passes=%d\n", ++ data, i, no); ++ */ ++ ++ do { ++ uint8 value = no?0x80:0x0; ++ value |= ((data >> (no*7)) & 0x7f); ++ putc(value, f); ++ } while ((no--)>0); ++ ++} ++ ++int read_mb(int * dst, int fd) ++{ ++ int ac = 0; ++ int ct = 0; ++ ++ while (1) { ++ uint8 bt; ++ if ((ct++)==6) { ++ st_err = err_inmb; ++ return 0; ++ } ++ ++ if ((read(fd, &bt, 1)) < 1) { ++ st_err = err_ueof; ++ return 0; ++ } ++ ac = (ac << 7) | (bt & 0x7f); /* accumulates up to 42 bits?? FIXME */ ++ if (!(bt & 0x80)) ++ break; ++ } ++ *dst = ac; ++ return 1; ++} ++ ++int read_ext(int fd, uint8 fixed) ++{ ++ if (!(fixed&0x7f)) { /* no extensions */ ++ return 1; ++ } ++ ++ /* ++ * The only described type is WBMP 0, that must not ++ * have extensions. ++ */ ++ ++ st_err = err_extf; ++ return 0; ++ ++ /* ++ ++ fixed = (fixed >> 5)&0x3; ++ ++ switch (fixed) { ++ case 0: ++ while (true) { ++ SREADU8(fd, fixed); ++ if (!(fixed & 0x7f)) { break; } ++ } ++ break; ++ case 0x3: ++ { ++ char * par; ++ char * val; ++ SREADU8(fd, fixed); ++ SREADC(fd, par, (fixed>>4)&0x6); ++ SREADC(fd, val, fixed&0xf); ++ } ++ break; ++ } ++ */ ++} ++ ++void * mymalloc(int l) ++{ ++ mymem = (void**)realloc(mymem, mymems+1); ++ if (!mymem) ++ FatalError("LoadWBMP: can't realloc buffer"); ++ return (mymem[mymems++] = malloc(l)); ++} ++ ++void myfree() ++{ ++ int i; ++ ++ if (mymem) { ++ for (i=0; i<mymems; i++) { ++ if (mymem[i]) ++ free(mymem[i]); ++ } ++ free(mymem); ++ } ++ mymem = (void**)NULL; ++ mymems = 0; ++} ++ ++uint8 * render1(uint8 * data, int size, int npixels) ++{ ++ byte * pic; ++ int i; ++ int cnt = 0; ++ uint8 cb = *data; ++ ++ pic = calloc(npixels,1); /* checked for overflow by caller */ ++ if (!pic) { ++ myfree(); ++ FatalError("LoadWBMP: can't allocate 'pic' buffer"); ++ } ++ ++ /* expand bits into bytes */ ++ /* memset(pic, 0, npixels); */ ++ ++ for (i=0; i<npixels; i++) { ++ ++ pic[i] = (cb>>7)&1; ++ ++ if ((++cnt)==8) { ++ cb = *(++data); ++ cnt = 0; ++ } else { ++ cb <<=1; ++ } ++ } ++ return pic; ++} +diff -ruN xv-3.10a-bugfixes/xvxpm.c xv-3.10a-enhancements/xvxpm.c +--- xv-3.10a-bugfixes/xvxpm.c 2005-03-28 22:22:50.000000000 -0800 ++++ xv-3.10a-enhancements/xvxpm.c 2005-04-17 14:45:28.000000000 -0700 +@@ -175,7 +175,15 @@ + + do { + char key[3]; +- char color[40]; /* Need to figure a good size for this... */ ++ char color[80]; /* Need to figure a good size for this... */ ++ ++/* ++ * Problem with spaces in color names ++ * ++ * X s Color Name m Other Name c Last Name ++ * ++ * ... this parser doesn't find `Any Name' ++ */ + + for (j=0; j<2 && (c != ' ') && (c != '\t') && (c != EOF); j++) { + key[j] = c; +@@ -187,7 +195,7 @@ + if (c == EOF) /* The failure condition of getc() */ + return (XpmLoadError(bname, "Error parsing colormap line")); + +- for (j=0; j<39 && (c!=' ') && (c!='\t') && (c!='"') && c!=EOF; j++) { ++ for (j=0; j<79 && (c!=' ') && (c!='\t') && (c!='"') && c!=EOF; j++) { + color[j] = c; + c = XpmGetc(fp); + } +@@ -248,7 +256,7 @@ + else { /* 'None' or unrecognized color spec */ + int rgb; + +- if (strcmp(color, "None") == 0) rgb = 0xb2c0dc; /* infobg */ ++ if (strcasecmp(color, "None") == 0) rgb = 0xb2c0dc; /* infobg */ + else { + SetISTR(ISTR_INFO, "%s: unknown color spec '%s'", bname, color); + Timer(1000); +@@ -321,7 +329,8 @@ + *i_sptr++ = mapentry->cv_rgb[2]; + } + } /* for ( j < w ) */ +- (void)XpmGetc(fp); /* Throw away the close " */ ++ while (((c = XpmGetc(fp))!=EOF) && /* Throw away the close " and */ ++ (c != '"')); /* erase all remaining pixels */ + + if (!(i%7)) WaitCursor(); + } /* for ( i < h ) */ +diff -ruN xv-3.10a-bugfixes/xvzx.c xv-3.10a-enhancements/xvzx.c +--- xv-3.10a-bugfixes/xvzx.c 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-enhancements/xvzx.c 2004-05-16 18:08:33.000000000 -0700 +@@ -0,0 +1,349 @@ ++/* ++ * xvzx.c - load routine for Spectrum screen$ ++ * ++ * John Elliott, 7 August 1998 ++ * ++ * LoadZX(fname, pinfo) - load file ++ * WriteZX(fp,pic,ptype,w,h,r,g,b,numcols,style,cmt,comment) - convert to ++ * 256x192 SCREEN$ and save. ++ */ ++ ++#include "copyright.h" ++ ++#include "xv.h" ++ ++ ++ ++/* ++ * comments on error handling: ++ * a file with a bad header checksum is a warning error. ++ * ++ * not being able to malloc is a Fatal Error. The program is aborted. ++ */ ++ ++ ++#define TRUNCSTR "File appears to be truncated." ++ ++static int zxError PARM((char *, char *)); ++ ++static char *bname; ++ ++/*******************************************/ ++int LoadZX(fname, pinfo) ++ char *fname; ++ PICINFO *pinfo; ++/*******************************************/ ++{ ++ /* returns '1' on success */ ++ ++ FILE *fp; ++ unsigned int c, c1; ++ int x,y, trunc; ++ byte *zxfile; ++ ++ bname = BaseName(fname); ++ ++ pinfo->pic = (byte *) NULL; ++ pinfo->comment = (char *) NULL; ++ ++ /* Allocate memory for a 256x192x8bit image */ ++ ++ pinfo->pic = (byte *)malloc(256*192); ++ if (!pinfo->pic) FatalError("malloc failure in xvzx.c LoadZX"); ++ ++ /* Allocate 1B80h bytes and slurp the whole file into memory */ ++ ++ zxfile = (byte *)malloc(7040); ++ if (!zxfile) FatalError("malloc failure in xvzx.c LoadZX"); ++ ++ /* open the file */ ++ fp = xv_fopen(fname,"r"); ++ if (!fp) return (zxError(bname, "can't open file")); ++ ++ /* Load it in en bloc */ ++ memset(zxfile, 0, 7040); ++ if (fread(zxfile, 1, 7040, fp) < 7040) trunc = 1; ++ ++ /* Transform to 8-bit */ ++ ++ for (y = 0; y < 192; y++) for (x = 0; x < 256; x++) ++ { ++ /* Spectrum screen layout: three 2k segments at y=0, y=64, y=128 */ ++ /* In each segment: Scan lines 0,8,16,...,56,1,9,...,57 etc. Each ++ scanline is 32 bytes, so line 1 is 256 bytes after line 0 ++ ++ So address of line start is ((y>>6) * 2048) + ((y & 7) * 256) ++ + ((y & 0x38) * 4) ++ ++ The colour byte for a cell is at screen + 6k + (y >> 3)*32 + (x>>3) ++ ++ */ ++ ++ int offset; ++ byte *dst = pinfo->pic + 256*y + x; ++ byte attr, pt, mask; ++ ++ offset = (y >> 6) * 2048; ++ offset += (y & 7) * 256; ++ offset += (y & 0x38) * 4; ++ offset += (x >> 3); ++ ++ pt = zxfile[offset + 128]; /* Ink/paper map */ ++ ++ offset = 0x1880; ++ offset += (y >> 3) * 32; ++ offset += (x >> 3); ++ ++ attr = zxfile[offset]; /* Colours for cell */ ++ ++ mask = 0x80; ++ ++ if (x & 7) mask >>= (x & 7); ++ ++ if (pt & mask) *dst = attr & 7; /* Ink */ ++ else *dst = (attr >> 3) & 7; /* Paper */ ++ ++ if (attr & 0x40) *dst |= 8; /* High intensity */ ++ } ++ ++ /* Picture bytes converted; now build the colour maps */ ++ ++ pinfo->normw = pinfo->w = 256; ++ pinfo->normh = pinfo->h = 192; ++ pinfo->type = PIC8; ++ ++ for (c = 0; c < 16; c++) ++ { ++ if (c < 8) c1 = 192; else c1 = 255; /* low-intensity colours use 192 */ ++ /* high-intensity colours use 255 */ ++ pinfo->b[c] = (c & 1 ? c1 : 0); ++ pinfo->r[c] = (c & 2 ? c1 : 0); ++ pinfo->g[c] = (c & 4 ? c1 : 0); ++ } ++ ++ pinfo->colType = F_FULLCOLOR; ++ pinfo->frmType = F_ZX; /* Save as SCREEN$ */ ++ sprintf(pinfo->fullInfo, "Spectrum SCREEN$, load address %04x", ++ zxfile[16]+256*zxfile[17]); ++ strcpy(pinfo->shrtInfo, "Spectrum SCREEN$."); ++ ++ /* Almost as an afterthought, check that the +3DOS header is valid. ++ ++ If it isn't, then odds are that the file isn't a graphic. But it ++ had the right magic number, so it might be. Let them see it anyway. ++ ++ The check is: Byte 127 of the header should be the 8-bit sum of bytes ++ 0-126 of the header. The header should also have the ++ +3DOS magic number, but we know it does or we wouldn't ++ have got this far. ++ */ ++ ++ c1 = 0; ++ for (c1 = c = 0; c < 127; c++) c1 = ((c1 + zxfile[c]) & 0xFF); ++ if (c1 != zxfile[127]) zxError(bname, "Bad header checksum."); ++ ++ fclose(fp); ++ free(zxfile); ++ return 1; ++} ++ ++ ++ ++ ++ ++/*******************************************/ ++static int zxError(fname, st) ++ char *fname, *st; ++{ ++ SetISTR(ISTR_WARNING,"%s: %s", fname, st); ++ return 0; ++} ++ ++ ++/* Spectrum screen file header. The first 18 bytes are used in the magic ++ number test */ ++ ++byte ZXheader[128] = ++{ ++ 'P', 'L', 'U', 'S', '3', 'D', 'O', 'S', 26, /* Spectrum +3DOS file */ ++ 1, 0, /* Header type 1.0 */ ++ 128, 27, 0, 0, /* 7040 bytes */ ++ 3, /* Binary format */ ++ 0, 27, /* 6912 data bytes */ ++ 0, 64 /* load address 0x4000 */ ++}; ++ ++ ++ ++/* Get the Spectrum colour/bright byte (0-15) from a pixel */ ++ ++static int PointZX(pic, w, h, rmap, gmap, bmap, x, y) ++ byte *pic; ++ int w,h; ++ byte *rmap, *gmap, *bmap; ++ int x,y; ++{ ++ int index, r, g, b, zxc; ++ ++ /* If the picture is smaller than the screen, pad out the edges ++ with "bright black" - a colour not otherwise returned */ ++ ++ if (x >= w || y >= h) return 8; ++ ++ /* Get colour index */ ++ ++ index = pic[y*w + x]; ++ ++ /* Convert to rgb */ ++ ++ r = rmap[index]; ++ g = gmap[index]; ++ b = bmap[index]; ++ zxc = 0; ++ ++ /* Work out Spectrum colour by a simplistic "nearest colour" method */ ++ ++ if (b >= 160) zxc |= 1; /* Blue */ ++ if (r >= 160) zxc |= 2; /* Red */ ++ if (g >= 160) zxc |= 4; /* Green */ ++ if (r > 208 || g >= 208 || b >= 208) zxc |= 8; /* High intensity */ ++ ++ return zxc; ++} ++ ++ ++/* Work out what colours should be used in a cell */ ++ ++static void CellZX(pic, w, h, rmap, gmap, bmap, cx, cy, zxfile) ++ byte *pic; ++ int w,h; ++ byte *rmap, *gmap, *bmap; ++ int cx,cy; ++ byte *zxfile; ++{ ++ byte counts[16]; /* Count of no. of colours */ ++ int offset, ink, paper, n, m, x, y, x0, y0, di, dp; ++ ++ x0 = cx * 8; /* Convert from cell to pixel coords */ ++ y0 = cy * 8; ++ ++ for (n = 0; n < 16; n++) counts[n] = 0; /* Reset all counts */ ++ ++ /* Count no. of pixels of various colours */ ++ ++ for (y = y0; y < y0+8; y++) for (x = x0; x < x0+8; x++) ++ { ++ m = PointZX(pic, w, h, rmap, gmap, bmap, x, y); ++ ++ counts[m]++; ++ } ++ counts[8] = 0; /* Discard Bright Black (pixels not in the picture area) ++ */ ++ ++ /* Assign the most popular colour as ink */ ++ for (n = m = ink = 0; n < 16; n++) if (counts[n] > m) ++ { ++ ink = n; ++ m = counts[n]; ++ } ++ counts[ink] = 0; ++ ++ /* Assign the next most popular colour as paper */ ++ for (n = m = paper = 0; n < 16; n++) if (counts[n] > m) ++ { ++ paper = n; ++ m = counts[n]; ++ } ++ /* We have ink and paper. Set cell's attributes */ ++ ++ offset = cy*32 + cx + 0x1880; ++ ++ /* Set the high-intensity bit if ink is high-intensity */ ++ if (ink & 8) zxfile[offset] = 0x40; else zxfile[offset] = 0; ++ zxfile[offset] |= ((paper & 7) << 3); ++ zxfile[offset] |= (ink & 7); ++ ++ /* Plot the points */ ++ for (y = y0; y < y0+8; y++) ++ { ++ byte mask = 0x80; ++ ++ offset = (y >> 6) * 2048; ++ offset += (y & 7) * 256; ++ offset += (y & 0x38) * 4; ++ offset += (x0 >> 3); ++ ++ for (x = x0; x < x0+8; x++) ++ { ++ /* Work out whether the point should be plotted as ink or ++ paper */ ++ m = PointZX(pic, w, h, rmap, gmap, bmap, x, y); ++ ++ di = (ink & 7) - (m & 7); /* "Difference" from ink */ ++ dp = (paper & 7) - (m & 7); /* "Difference" from paper */ ++ ++ if (di < 0) di = -di; ++ if (dp < 0) dp = -dp; ++ ++ if (di < dp) /* Point is more like ink */ ++ zxfile[offset+128] |= mask; ++ ++ mask = (mask >> 1); ++ } ++ } ++ ++} ++ ++ ++ ++/*******************************************/ ++int WriteZX(fp,pic,ptype,w,h,rmap,gmap,bmap,numcols,colorstyle,comment) ++ FILE *fp; ++ byte *pic; ++ int ptype, w,h; ++ byte *rmap, *gmap, *bmap; ++ int numcols, colorstyle; ++ char *comment; ++{ ++ int rv, x, y; ++ byte *zxfile; ++ byte *pic8; ++ byte rtemp[256],gtemp[256],btemp[256]; ++ ++ /* To simplify matters, reduce 24-bit to 8-bit. Since the Spectrum ++ screen is 3.5-bit anyway, it doesn't make much difference */ ++ ++ if (ptype == PIC24) ++ { ++ pic8 = Conv24to8(pic, w, h, 256, rtemp,gtemp,btemp); ++ if (!pic8) FatalError("Unable to malloc in WriteZX()"); ++ rmap = rtemp; gmap = gtemp; bmap = btemp; numcols=256; ++ } ++ else pic8 = pic; ++ ++ ZXheader[127] = 0x71; /* The correct checksum. */ ++ ++ /* Create a memory image of the SCREEN$ */ ++ ++ zxfile = (byte *)malloc(7040); ++ if (!zxfile) FatalError("malloc failure in xvzx.c WriteZX"); ++ ++ memset(zxfile, 0, 7040); /* Reset all points to black */ ++ memcpy(zxfile, ZXheader, 128); /* Create +3DOS header */ ++ ++ /* Convert the image, character cell by character cell */ ++ for (y = 0; y < 24; y++) for (x = 0; x < 32; x++) ++ { ++ CellZX(pic8, w, h, rmap, gmap, bmap, x, y, zxfile); ++ } ++ rv = 0; ++ if (fwrite(zxfile, 1, 7040, fp) < 7040) rv = -1; ++ ++ if (ptype == PIC24) free(pic8); ++ free(zxfile); ++ ++ if (ferror(fp)) rv = -1; ++ ++ return rv; ++} ++ diff --git a/source/xap/xv/xv-3.10a-jumbo-fix-patch-20050410.txt b/source/xap/xv/xv-3.10a-jumbo-fix-patch-20050410.txt new file mode 100644 index 00000000..cc4e72d3 --- /dev/null +++ b/source/xap/xv/xv-3.10a-jumbo-fix-patch-20050410.txt @@ -0,0 +1,28743 @@ +diff : xv-3.10a-jumbo-fix-patch-20050410.txt + +This is a unified diff. It should be applied (using Larry Wall's "patch" +program) to the stock XV 3.10a sources. If desired, the jumbo-enhancements +patch may be applied afterward. + +diffs below: + Makefile + Makefile.std + README.jumbo + bggen.c + bits/icon + cleandir + config.h + copyright.h + tiff/Makefile + tiff/Makefile.std + tiff/RANLIB.sh + vdcomp.c + xcmap.c + xv.c + xv.h + xv24to8.c + xvalg.c + xvbmp.c + xvbrowse.c + xvbutt.c + xvcolor.c + xvctrl.c + xvcut.c + xvdflt.c + xvdial.c + xvdir.c + xvevent.c + xvfits.c + xvgam.c + xvgif.c + xvgifwr.c + xvgrab.c + xvgraf.c + xviff.c + xvimage.c + xvinfo.c + xviris.c + xvjpeg.c + xvmisc.c + xvpbm.c + xvpcx.c + xvpds.c + xvpictoppm.c + xvpm.c + xvpopup.c + xvps.c + xvrle.c + xvroot.c + xvscrl.c + xvsmooth.c + xvsunras.c + xvtarga.c + xvtext.c + xvtiff.c + xvtiffwr.c + xvxbm.c + xvxpm.c + xvxwd.c + + +diff -ruN xv-3.10a/Makefile xv-3.10a-bugfixes/Makefile +--- xv-3.10a/Makefile 1995-01-23 12:20:54.000000000 -0800 ++++ xv-3.10a-bugfixes/Makefile 2005-04-06 08:17:13.000000000 -0700 +@@ -2,7 +2,11 @@ + + # your C compiler (and options) of choice + CC = cc +-# CC = gcc -ansi ++#CC = gcc -ansi ++# note that -ansi kills __USE_MISC (gcc 2.95.3), which (at least in Linux) ++# determines whether stdlib.h includes prototypes for mktemp(), random(), etc. ++# (i.e., if you use it, you will get unnecessary compiler warnings) ++#CC = gcc + + # use this if you're using 'cc' on a DEC Alpha (OSF/1) or MIPS (Ultrix) system: + # CC = cc -std1 -Olimit 750 +@@ -14,8 +18,13 @@ + # -Wuninitialized -Wparentheses + + +-CCOPTS = -O +- ++CCOPTS = -O ++# these are the usual optimization and warning options for gcc; all such ++# warnings but one (mktemp() use) have been eliminated (at least on Linux): ++#CCOPTS = -O3 -Wall ++# for the next step up in gcc noise, try adding -W (but note that it adds a ++# huge number of unused-parameter and signed/unsigned comparison warnings): ++#CCOPTS = -O3 -Wall -W + + ### NOTE: Sun running OpenWindows: + ### if you're using a SUN running OPENWINDOWS, you need to add these two +@@ -27,6 +36,10 @@ + ### '-I' options on the CCOPTS line to tell the compiler where said files are. + + ++# BeOS _may_ need to use a different version (below), but probably not ++CLEANDIR = cleandir ++ ++ + ### Installation locations + BINDIR = /usr/local/bin + MANDIR = /usr/local/man/man1 +@@ -38,7 +51,7 @@ + + + ########################### CONFIGURATION OPTIONS ############################ +-### NOTE: be sure to check 'config.h', for a few other configuration options ++### NOTE: be sure to check 'config.h', for a few other configuration options + ############################################################################## + + ### +@@ -59,18 +72,25 @@ + ### if, for whatever reason, you're unable to get the TIFF library to compile + ### on your machine, *COMMENT OUT* the following lines + ### +-TIFF = -DDOTIFF ++### GRR 20050319: USE_TILED_TIFF_BOTLEFT_FIX enables an experimental fix for ++### tiled TIFFs with ORIENTATION_BOTLEFT. It may break other tiled TIFFs, ++### or it may be required for certain other TIFF types (e.g., strips with ++### ORIENTATION_BOTLEFT). I don't have a sufficient variety of TIFF test ++### images at hand. ++### ++#TIFF = -DDOTIFF ++TIFF = -DDOTIFF -DUSE_TILED_TIFF_BOTLEFT_FIX + TIFFDIR = tiff + TIFFINC = -I$(TIFFDIR) + TIFFLIB = $(TIFFDIR)/libtiff.a + $(TIFFLIB): +- ( cd $(TIFFDIR) ; make CC='$(CC)' ) ++ ( cd $(TIFFDIR) ; make CC='$(CC)' COPTS='$(CCOPTS) $(MCHN)' ) + + + ### + ### if, for whatever reason, you're unable to get the PDS/VICAR support + ### to compile (xvpds.c, and vdcomp.c), *COMMENT OUT* the following line, +-### and also remove 'vdcomp' from the 'all:' dependancy ++### and also remove 'vdcomp' from the 'all:' dependancy + ### + PDS = -DDOPDS + +@@ -78,17 +98,25 @@ + #----------System V---------- + + # if you are running on a SysV-based machine, such as HP, Silicon Graphics, +-# Solaris, etc., uncomment the following line to get mostly there. ++# Solaris, etc., uncomment the following line to get mostly there. + #UNIX = -DSVR4 + + +-#----------Machine Specific Configurations---------- ++#----------Machine-Specific Configurations---------- ++ ++### If you are using a BeOS system, uncomment the following line ++#MCHN = -DUSE_GETCWD -I/usr/X11/include -L/usr/X11/lib ++### ++### The stock version of cleandir now should work for BeOS, too, so try ++### leaving this commented out: ++#CLEANDIR = cleandir.BeOS ++ + + ### If you are using an SGI system, uncomment the following line + #MCHN = -Dsgi + + +-### For HP-UX, uncomment the following line: ++### For HP-UX, uncomment the following line + #MCHN= -Dhpux -D_HPUX_SOURCE + # To use old HP compilers (HPUX 7.0 or so), you may need + #MCHN= -Dhpux -D_HPUX_SOURCE +Ns4000 +@@ -102,22 +130,22 @@ + + + ### for LINUX, uncomment the following line +-#MCHN = -DLINUX ++#MCHN = -DLINUX -L/usr/X11R6/lib + + + # For SCO 1.1 (UNIX 3.2v2) machines, uncomment the following: + #MCHN = -Dsco -DPOSIX + # + # For ODT 2.0 (UNIX 3.2v4) machines, uncomment the following: +-#MCHN= -Dsco -DPOSIX -DNO_RANDOM ++#MCHN= -Dsco -DPOSIX -DNO_RANDOM + # + # Also, you should add '-lc -lx' to the end of the LIBS def below + # -lx must be after -lc so you get the right directory routines. + + + # for UMAX V by Encore Computers uncomment the following line for +-# the portable c compiler, system specific definitions and +-# location of local X11 library(if site specific, modify -L option) ++# the portable C compiler, system-specific definitions and ++# location of local X11 library (if site-specific, modify -L option) + # No other switches should be necessary, or so I'm told... + # + #MCHN = -q extensions=pcc_c -D__UMAXV__ -L/usr2/usr/lib/X11 -DSVR4 +@@ -147,8 +175,8 @@ + #TIMERS = -DUSLEEP + + +-# if XV locks up whenever you click on *any* of the buttons, the Timer() +-# function in xvmisc.c is going out to lunch. A simple workaround is to ++# if XV locks up whenever you click on *any* of the buttons, the Timer() ++# function in xvmisc.c is going out to lunch. A simple workaround is to + # uncomment the following line: + #TIMERS = -DNOTIMER + +@@ -160,7 +188,7 @@ + #DXWM = -DDXWM + + +-# if, during compilation, your system complains about the types ++# if, during compilation, your system complains about the types + # 'u_long', 'u_short', 'u_int', etc. as being undefined, uncomment the + # following line: + #BSDTYPES = -DBSDTYPES +@@ -188,7 +216,9 @@ + $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ + $(DXWM) $(MCHN) + ++### remove -lm for BeOS: + LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm ++#LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) + + OBJS = xv.o xvevent.o xvroot.o xvmisc.o xvimage.o xvcolor.o xvsmooth.o \ + xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o xvalg.o \ +@@ -231,9 +261,10 @@ + + clean: xvclean + rm -f bggen vdcomp xcmap xvpictoppm +- ./cleandir $(JPEGDIR) +- rm -f $(JPEGDIR)/jconfig.h $(JPEGDIR)/Makefile +- ./cleandir $(TIFFDIR) ++# clean only local jpeg and tiff dirs, not user's or system's copies: ++ ./$(CLEANDIR) jpeg ++ rm -f jpeg/jconfig.h jpeg/Makefile ++ ./$(CLEANDIR) tiff + + + install: all +@@ -246,8 +277,9 @@ + cp docs/xvdocs.ps* $(LIBDIR) + + tar: ++# tar only local jpeg and tiff dirs, not user's or system's copies: + tar cvf xv.tar Makefile* Imakefile *.c *.h bits \ +- docs unsupt vms $(JPEGDIR) $(TIFFDIR) $(MISC) ++ docs unsupt vms jpeg tiff $(MISC) + + xvtar: + tar cvf xv.tar Makefile* Imakefile *.c *.h bits +@@ -257,26 +289,26 @@ + + ################# bitmap dependencies #################### + +-xv.o: bits/icon bits/iconmask bits/runicon bits/runiconm +-xv.o: bits/cboard50 bits/gray25 ++xv.o: bits/icon bits/iconmask bits/runicon bits/runiconm ++xv.o: bits/cboard50 bits/gray25 + + xvbrowse.o: bits/br_file bits/br_dir bits/br_exe bits/br_chr bits/br_blk +-xvbrowse.o: bits/br_sock bits/br_fifo bits/br_error bits/br_unknown ++xvbrowse.o: bits/br_sock bits/br_fifo bits/br_error # bits/br_unknown + xvbrowse.o: bits/br_cmpres bits/br_gif bits/br_pm bits/br_pbm + xvbrowse.o: bits/br_sunras bits/br_bmp bits/br_utah bits/br_iris +-xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds ++xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds + xvbrowse.o: bits/br_ps bits/br_iff bits/br_targa bits/br_xpm + xvbrowse.o: bits/br_trash bits/fcurs bits/fccurs bits/fdcurs bits/fcursm +-xvbrowse.o: bits/br_xwd ++xvbrowse.o: bits/br_xwd + + xvbutt.o: bits/cboard50 bits/rb_frame bits/rb_frame1 bits/rb_top + xvbutt.o: bits/rb_bot bits/rb_dtop bits/rb_dbot bits/rb_body + xvbutt.o: bits/rb_dot bits/cb_check bits/mb_chk + + xvctrl.o: bits/gray25 bits/gray50 bits/i_fifo bits/i_chr bits/i_dir +-xvctrl.o: bits/i_blk bits/i_lnk bits/i_sock bits/i_exe bits/i_reg ++xvctrl.o: bits/i_blk bits/i_lnk bits/i_sock bits/i_exe bits/i_reg + xvctrl.o: bits/h_rotl bits/h_rotr bits/fliph bits/flipv bits/p10 +-xvctrl.o: bits/m10 bits/cut bits/copy bits/paste bits/clear ++xvctrl.o: bits/m10 bits/cut bits/copy bits/paste bits/clear + xvctrl.o: bits/uicon bits/oicon1 bits/oicon2 bits/icon + xvctrl.o: bits/padimg bits/annot + +@@ -285,13 +317,13 @@ + xvdflt.o: bits/logo_top bits/logo_bot bits/logo_out bits/xv_jhb + xvdflt.o: bits/xv_cpyrt bits/xv_rev bits/xv_ver + xvdflt.o: bits/xf_left bits/xf_right bits/font5x9.h +-xvdflt.o: xvdflt.h ++xvdflt.o: xvdflt.h + + xvdial.o: bits/dial_cw1 bits/dial_ccw1 bits/dial_cw2 bits/dial_ccw2 + + xvdir.o: bits/d_load bits/d_save + +-xvevent.o: bits/dropper bits/dropperm bits/pen bits/penm ++xvevent.o: bits/dropper bits/dropperm bits/pen bits/penm + xvevent.o: bits/blur bits/blurm + + xvgam.o: bits/h_rotl bits/h_rotr bits/h_flip bits/h_sinc bits/h_sdec +diff -ruN xv-3.10a/Makefile.std xv-3.10a-bugfixes/Makefile.std +--- xv-3.10a/Makefile.std 1995-01-23 17:06:26.000000000 -0800 ++++ xv-3.10a-bugfixes/Makefile.std 2005-04-06 08:17:13.000000000 -0700 +@@ -2,7 +2,11 @@ + + # your C compiler (and options) of choice + CC = cc +-# CC = gcc -ansi ++#CC = gcc -ansi ++# note that -ansi kills __USE_MISC (gcc 2.95.3), which (at least in Linux) ++# determines whether stdlib.h includes prototypes for mktemp(), random(), etc. ++# (i.e., if you use it, you will get unnecessary compiler warnings) ++#CC = gcc + + # use this if you're using 'cc' on a DEC Alpha (OSF/1) or MIPS (Ultrix) system: + # CC = cc -std1 -Olimit 750 +@@ -14,8 +18,13 @@ + # -Wuninitialized -Wparentheses + + +-CCOPTS = -O +- ++CCOPTS = -O ++# these are the usual optimization and warning options for gcc; all such ++# warnings but one (mktemp() use) have been eliminated (at least on Linux): ++#CCOPTS = -O3 -Wall ++# for the next step up in gcc noise, try adding -W (but note that it adds a ++# huge number of unused-parameter and signed/unsigned comparison warnings): ++#CCOPTS = -O3 -Wall -W + + ### NOTE: Sun running OpenWindows: + ### if you're using a SUN running OPENWINDOWS, you need to add these two +@@ -27,6 +36,10 @@ + ### '-I' options on the CCOPTS line to tell the compiler where said files are. + + ++# BeOS _may_ need to use a different version (below), but probably not ++CLEANDIR = cleandir ++ ++ + ### Installation locations + BINDIR = /usr/local/bin + MANDIR = /usr/local/man/man1 +@@ -38,7 +51,7 @@ + + + ########################### CONFIGURATION OPTIONS ############################ +-### NOTE: be sure to check 'config.h', for a few other configuration options ++### NOTE: be sure to check 'config.h', for a few other configuration options + ############################################################################## + + ### +@@ -59,18 +72,25 @@ + ### if, for whatever reason, you're unable to get the TIFF library to compile + ### on your machine, *COMMENT OUT* the following lines + ### +-TIFF = -DDOTIFF ++### GRR 20050319: USE_TILED_TIFF_BOTLEFT_FIX enables an experimental fix for ++### tiled TIFFs with ORIENTATION_BOTLEFT. It may break other tiled TIFFs, ++### or it may be required for certain other TIFF types (e.g., strips with ++### ORIENTATION_BOTLEFT). I don't have a sufficient variety of TIFF test ++### images at hand. ++### ++#TIFF = -DDOTIFF ++TIFF = -DDOTIFF -DUSE_TILED_TIFF_BOTLEFT_FIX + TIFFDIR = tiff + TIFFINC = -I$(TIFFDIR) + TIFFLIB = $(TIFFDIR)/libtiff.a + $(TIFFLIB): +- ( cd $(TIFFDIR) ; make CC='$(CC)' ) ++ ( cd $(TIFFDIR) ; make CC='$(CC)' COPTS='$(CCOPTS) $(MCHN)' ) + + + ### + ### if, for whatever reason, you're unable to get the PDS/VICAR support + ### to compile (xvpds.c, and vdcomp.c), *COMMENT OUT* the following line, +-### and also remove 'vdcomp' from the 'all:' dependancy ++### and also remove 'vdcomp' from the 'all:' dependancy + ### + PDS = -DDOPDS + +@@ -78,17 +98,25 @@ + #----------System V---------- + + # if you are running on a SysV-based machine, such as HP, Silicon Graphics, +-# Solaris, etc., uncomment the following line to get mostly there. ++# Solaris, etc., uncomment the following line to get mostly there. + #UNIX = -DSVR4 + + +-#----------Machine Specific Configurations---------- ++#----------Machine-Specific Configurations---------- ++ ++### If you are using a BeOS system, uncomment the following line ++#MCHN = -DUSE_GETCWD -I/usr/X11/include -L/usr/X11/lib ++### ++### The stock version of cleandir now should work for BeOS, too, so try ++### leaving this commented out: ++#CLEANDIR = cleandir.BeOS ++ + + ### If you are using an SGI system, uncomment the following line + #MCHN = -Dsgi + + +-### For HP-UX, uncomment the following line: ++### For HP-UX, uncomment the following line + #MCHN= -Dhpux -D_HPUX_SOURCE + # To use old HP compilers (HPUX 7.0 or so), you may need + #MCHN= -Dhpux -D_HPUX_SOURCE +Ns4000 +@@ -102,22 +130,22 @@ + + + ### for LINUX, uncomment the following line +-#MCHN = -DLINUX ++#MCHN = -DLINUX -L/usr/X11R6/lib + + + # For SCO 1.1 (UNIX 3.2v2) machines, uncomment the following: + #MCHN = -Dsco -DPOSIX + # + # For ODT 2.0 (UNIX 3.2v4) machines, uncomment the following: +-#MCHN= -Dsco -DPOSIX -DNO_RANDOM ++#MCHN= -Dsco -DPOSIX -DNO_RANDOM + # + # Also, you should add '-lc -lx' to the end of the LIBS def below + # -lx must be after -lc so you get the right directory routines. + + + # for UMAX V by Encore Computers uncomment the following line for +-# the portable c compiler, system specific definitions and +-# location of local X11 library(if site specific, modify -L option) ++# the portable C compiler, system-specific definitions and ++# location of local X11 library (if site-specific, modify -L option) + # No other switches should be necessary, or so I'm told... + # + #MCHN = -q extensions=pcc_c -D__UMAXV__ -L/usr2/usr/lib/X11 -DSVR4 +@@ -147,8 +175,8 @@ + #TIMERS = -DUSLEEP + + +-# if XV locks up whenever you click on *any* of the buttons, the Timer() +-# function in xvmisc.c is going out to lunch. A simple workaround is to ++# if XV locks up whenever you click on *any* of the buttons, the Timer() ++# function in xvmisc.c is going out to lunch. A simple workaround is to + # uncomment the following line: + #TIMERS = -DNOTIMER + +@@ -160,7 +188,7 @@ + #DXWM = -DDXWM + + +-# if, during compilation, your system complains about the types ++# if, during compilation, your system complains about the types + # 'u_long', 'u_short', 'u_int', etc. as being undefined, uncomment the + # following line: + #BSDTYPES = -DBSDTYPES +@@ -188,7 +216,9 @@ + $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ + $(DXWM) $(MCHN) + ++### remove -lm for BeOS: + LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm ++#LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) + + OBJS = xv.o xvevent.o xvroot.o xvmisc.o xvimage.o xvcolor.o xvsmooth.o \ + xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o xvalg.o \ +@@ -231,9 +261,10 @@ + + clean: xvclean + rm -f bggen vdcomp xcmap xvpictoppm +- ./cleandir $(JPEGDIR) +- rm -f $(JPEGDIR)/jconfig.h $(JPEGDIR)/Makefile +- ./cleandir $(TIFFDIR) ++# clean only local jpeg and tiff dirs, not user's or system's copies: ++ ./$(CLEANDIR) jpeg ++ rm -f jpeg/jconfig.h jpeg/Makefile ++ ./$(CLEANDIR) tiff + + + install: all +@@ -246,8 +277,9 @@ + cp docs/xvdocs.ps* $(LIBDIR) + + tar: ++# tar only local jpeg and tiff dirs, not user's or system's copies: + tar cvf xv.tar Makefile* Imakefile *.c *.h bits \ +- docs unsupt vms $(JPEGDIR) $(TIFFDIR) $(MISC) ++ docs unsupt vms jpeg tiff $(MISC) + + xvtar: + tar cvf xv.tar Makefile* Imakefile *.c *.h bits +@@ -257,26 +289,26 @@ + + ################# bitmap dependencies #################### + +-xv.o: bits/icon bits/iconmask bits/runicon bits/runiconm +-xv.o: bits/cboard50 bits/gray25 ++xv.o: bits/icon bits/iconmask bits/runicon bits/runiconm ++xv.o: bits/cboard50 bits/gray25 + + xvbrowse.o: bits/br_file bits/br_dir bits/br_exe bits/br_chr bits/br_blk +-xvbrowse.o: bits/br_sock bits/br_fifo bits/br_error bits/br_unknown ++xvbrowse.o: bits/br_sock bits/br_fifo bits/br_error # bits/br_unknown + xvbrowse.o: bits/br_cmpres bits/br_gif bits/br_pm bits/br_pbm + xvbrowse.o: bits/br_sunras bits/br_bmp bits/br_utah bits/br_iris +-xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds ++xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds + xvbrowse.o: bits/br_ps bits/br_iff bits/br_targa bits/br_xpm + xvbrowse.o: bits/br_trash bits/fcurs bits/fccurs bits/fdcurs bits/fcursm +-xvbrowse.o: bits/br_xwd ++xvbrowse.o: bits/br_xwd + + xvbutt.o: bits/cboard50 bits/rb_frame bits/rb_frame1 bits/rb_top + xvbutt.o: bits/rb_bot bits/rb_dtop bits/rb_dbot bits/rb_body + xvbutt.o: bits/rb_dot bits/cb_check bits/mb_chk + + xvctrl.o: bits/gray25 bits/gray50 bits/i_fifo bits/i_chr bits/i_dir +-xvctrl.o: bits/i_blk bits/i_lnk bits/i_sock bits/i_exe bits/i_reg ++xvctrl.o: bits/i_blk bits/i_lnk bits/i_sock bits/i_exe bits/i_reg + xvctrl.o: bits/h_rotl bits/h_rotr bits/fliph bits/flipv bits/p10 +-xvctrl.o: bits/m10 bits/cut bits/copy bits/paste bits/clear ++xvctrl.o: bits/m10 bits/cut bits/copy bits/paste bits/clear + xvctrl.o: bits/uicon bits/oicon1 bits/oicon2 bits/icon + xvctrl.o: bits/padimg bits/annot + +@@ -285,13 +317,13 @@ + xvdflt.o: bits/logo_top bits/logo_bot bits/logo_out bits/xv_jhb + xvdflt.o: bits/xv_cpyrt bits/xv_rev bits/xv_ver + xvdflt.o: bits/xf_left bits/xf_right bits/font5x9.h +-xvdflt.o: xvdflt.h ++xvdflt.o: xvdflt.h + + xvdial.o: bits/dial_cw1 bits/dial_ccw1 bits/dial_cw2 bits/dial_ccw2 + + xvdir.o: bits/d_load bits/d_save + +-xvevent.o: bits/dropper bits/dropperm bits/pen bits/penm ++xvevent.o: bits/dropper bits/dropperm bits/pen bits/penm + xvevent.o: bits/blur bits/blurm + + xvgam.o: bits/h_rotl bits/h_rotr bits/h_flip bits/h_sinc bits/h_sdec +diff -ruN xv-3.10a/README.jumbo xv-3.10a-bugfixes/README.jumbo +--- xv-3.10a/README.jumbo 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-bugfixes/README.jumbo 2005-04-10 19:55:23.000000000 -0700 +@@ -0,0 +1,387 @@ ++These are the latest versions of the XV jumbo patches I originally created ++in February 2000 (but never distributed) and eventually updated and released ++in May 2004, prompted by a discussion on LWN (http://lwn.net/Articles/76391/). ++Information about the patches, updates to the patches, and the patches ++themselves can all be found here: ++ ++ http://pobox.com/~newt/greg_xv.html ++ http://freshmeat.net/projects/xvjumbopatches/ ++ ++(Use the "Subscribe to new releases" link on the latter page if you want to ++be notified of new versions automatically; trivial registration required.) ++ ++These two patches incorporate all of the fix- and enhancement-patches ++available from John's XV site (http://www.trilon.com/xv/downloads.html ++and ftp://ftp.trilon.com/pub/xv/patches/), plus a number of my own fixes ++and additions, plus quite a few from other people--though not all of the ++ones I'd intended to (sorry, SJT, AT, and JPD!) due to lack of time after ++dealing with the latest security issue (which I discovered, sigh). They're ++still not fully complete, and it's possible they never will be, but I do ++plan to continue working on them whenever the mood strikes--and I may even ++release them publicly on rare occasions. (At the current rate, it looks ++like once a year may be the best we can hope for...we'll see.) ++ ++Also be aware that several other people have had the same idea over the ++years. Ones I've found, more or less by accident, include: ++ ++ - Landon Curt "chongo" Noll (http://www.isthe.com/chongo/) ++ http://www.isthe.com/chongo/src/xv-patch/ ++ - Mark Ashley <mark@ibiblio.org> ++ http://www.ibiblio.org/pub/packages/solaris/sparc/html/xv.3.10a.p19.html ++ - Peter Jordan <pete@dc.seflin.org> ++ http://www.ibiblio.org/pub/Linux/apps/graphics/viewers/X/xv-3.10a.patch.* ++ - Uwe F. Mayer (http://www.tux.org/~mayer/) ++ http://www.tux.org/~mayer/linux/book/node311.html ++ - Kurt Wall <kwall@kurtwerks.com> ++ http://www.kurtwerks.com/software/xv.html ++ - Chisato Yamauchi (http://phe.phyas.aichi-edu.ac.jp/~cyamauch/index_en.html) ++ http://phe.phyas.aichi-edu.ac.jp/~cyamauch/xv.html ++ - Daisuke Yabuki <dxy@optix.org> ++ http://www.optix.org/~dxy/solaris/xv/ ++ - Pekoe (http://pekoe.lair.net/) ++ http://pekoe.lair.net/diary/xv.html ++ - FreeBSD FreshPorts ++ http://www.freshports.org/graphics/xv/ ++ - <sudakyo@fat.coara.or.jp> ++ http://www.coara.or.jp/~sudakyo/XV_jp.html ++ ++I very much doubt that this is an exhaustive list. So far, most of the other ++patch-sets appear not to be quite as extensive or as up-to-date as my own, ++although the last three or four do include the [large] Japanese extension ++patches that I omitted--not because they're unworthy, but simply because I ++didn't find them until collisions between the two sets of patches had become ++a large problem. (Maybe for the next release... I'd intended to try for ++this release, but the security issues ended up taking almost all of my ++available time. And, to be honest, from my perspective, inclusion of the ++jp-extension patches is more for completeness' sake than personal interest, ++so their priority is fairly low.) ++ ++Below I summarize the component patches that are encompassed by my jumbo ++bugfixes and jumbo enhancements patches. Unfortunately, some of my own ++additions never saw the light of day as standalone patches, but considering ++the number of overlaps (collisions) already implicit in this list, it would ++have been difficult to accomplish even if I'd had the time. In any case, ++they're present in these jumbo patches but not chongo's, so those who _really_ ++care can "subtract" the two sets of patches to see what I did. ++ ++Here's a quick guide to the "third-party" credits in the lists below: ++ ++ AAC = Andrey A. Chernov [ache] ++ (http://cvsweb.freebsd.org/ports/graphics/xv/files/patch-ab) ++ AD = Andreas Dilger (adilger@clusterfs.com) ++ AL = Alexander Lehmann (lehmann@usa.net) ++ AT = Anthony Thyssen (http://www.cit.gu.edu.au/~anthony/) ++ DAC = David A. Clunie (http://www.dclunie.com/xv-pcd.html) ++ EK = Egmont Koblinger (egmont@users.sourceforge.net) ++ GRR = Greg Roelofs (http://pobox.com/~newt/) ++ GV = Guido Vollbeding (http://sylvana.net/guido/) ++ JCE = John C. Elliott (http://www.seasip.demon.co.uk/ZX/zxdload.html) ++ JHB = John H. Bradley, of course (http://www.trilon.com/xv/) ++ JPD = Jean-Pierre Demailly (http://www-fourier.ujf-grenoble.fr/~demailly/) ++ JR = John Rochester (http://www.freebsd.org/cgi/query-pr.cgi?pr=2920) ++ (also http://cvsweb.freebsd.org/ports/graphics/xv/files/patch-af, -ag) ++ JZ = Joe Zbiciak (http://spatula-city.org/~im14u2c/) ++ LCN = Landon Curt "chongo" Noll (http://www.isthe.com/chongo/) ++ PBJ = Peter Jordan (http://www.ibiblio.org/pub/Linux/apps/graphics/viewers/X/) ++ PSV = Pawel S. Veselov (http://manticore.2y.net/wbmp.html) ++ SB = Sean Borman (http://www.nd.edu/~sborman/software/xvwheelmouse.html) ++ SJT = TenThumbs (tenthumbs@cybernex.net) ++ TA = Tim Adye (http://hepwww.rl.ac.uk/Adye/xv-psnewstyle.html) ++ ++Other credits are as listed on the XV Downloads page or in the respective ++patches (e.g., the jp-extension patches or within the PNG patch). ++ ++Finally, please note that these patches have not been blessed by John Bradley ++in any way (although I copied him on the May 2004 announcement--no response). ++Nor have I personally tested every change and feature! (See the BIG SCARY ++WARNING below for further caveats.) In other words, they're both completely ++unofficial and completely unguaranteed. But they seem to work for me. (And ++when they don't, I fix 'em. Eventually, anyway... ;-) ) ++ ++One further "final" note: this may well be the last release to include ++separate fix- and enhancements-patches. It is too much of a timesink to ++maintain parallel trees--not to mention parallel makefiles (generic/public ++vs. local/personal, old vs. new libjpeg/libtiff) and xv.h (unregistered/ ++public vs. registered/personal), particularly when some fixes come about ++while working on an enhancement. Henceforth--assuming, of course, that ++there _is_ a "henceforth"--I expect to merge the patches into a single ++jumbo patch. (Alternatively, I may simply freeze the current fix-patch ++and continue to evolve only the enhancements patch; in particular, new ++fixes would appear only in it. Either approach would be simple enough; ++feedback as to which would be preferable is welcomed.) ++ ++GRR 20050410 ++ ++ ++How to build ++------------ ++ ++The following assumes you, the user, already have the libtiff,[1] ++libjpeg,[2] libpng,[3] and zlib[4] libraries downloaded, patched (if ++necessary), compiled, and installed, not to mention a C compiler and ++the bzip2,[5] tar,[6] patch,[7] and make[8] utilities. You should also ++have downloaded the original XV 3.10a source distribution from the XV ++Downloads page[9] and be able to edit its Makefile and config.h files ++as indicated in the INSTALL file. Finally, you should know what a ++Unix(-style) command line is, where to find one, and how to wield it ++with abandon (or at least with adult supervision)--and preferably not ++as the root user until the make install step. (A filesystem is a ++terrible thing to waste.) ++ ++ [1] http://www.remotesensing.org/libtiff/ ++ [2] http://www.ijg.org/ ++ [3] http://www.libpng.org/pub/png/libpng.html ++ [4] http://www.zlib.net/ ++ [5] http://sources.redhat.com/bzip2/ ++ [6] http://www.gnu.org/directory/devel/specific/tar.html ++ [7] http://www.gnu.org/directory/devel/specific/patch.html ++ [8] http://www.gnu.org/directory/devel/specific/make.html ++ [9] http://www.trilon.com/xv/downloads.html#src-distrib ++ +++-------------------------------------------------------------------------+ ++| | ++| BIG SCARY WARNING | ++| | ++| These patches work for Greg (and parts of them apparently work for | ++| various other people), and so far Greg's CPU still computes and his | ++| hard disks haven't been wiped. But there's no guarantee that that | ++| will be the case for you! In particular, not every incorporated patch | ++| has been explicitly tested, nor has every possible subcase of the | ++| explicitly tested subset. (Read that again; it's grammatical.) Nor are | ++| these patches officially blessed by John Bradley in any way. In other | ++| words, if you use these patches, you do so at your own risk. (Greg | ++| doesn't believe there are any serious problems remaining, but then, | ++| what programmer ever does? Bugs happen.) | ++| | +++-------------------------------------------------------------------------+ ++ ++Assuming you have the prerequisites out of the way and aren't scared ++off by the Big Scary Warning, here's the build procedure: ++ ++ bzip2 -dc xv-3.10a-jumbo-patches-20050410.tar.bz2 | tar xvf - ++ (or tar xvzf xv-3.10a-jumbo-patches-20050410.tar.gz) ++ ++ tar xvzf xv-3.10a.tar.gz ++ ++ cd xv-3.10a ++ ++ patch -p1 < ../xv-3.10a-jumbo-fix-patch-20050410.txt ++ ++ [optional] patch -p1 < ../xv-3.10a-jumbo-enh-patch-20050410.txt ++ ++ edit Makefile and config.h as directed in INSTALL file (in particular, ++ ensure paths to external libraries and header files are correct) ++ ++ make ++ ++ ./xv your_favorite_image your_other_favorite_image etc. ++ ++If everything seems to be working to your satisfaction, go ahead and install: ++ ++ make -n install (and double-check that things will be installed ++ where you want them to be) ++ ++ become root if necessary (e.g., type su) ++ ++ make install ++ ++That wasn't so hard, was it? ++ ++ ++Summary of incorporated and unincorporated patches ++-------------------------------------------------- ++ ++fixes ((*) = listed on XV Downloads page, (f) = on ftp site only): ++ ++20040516: ++ - grabpatch (*) [obsoleted by new-xvgrab.c below] ++ - vispatch (*) ++ - mp-tiff-patch (*) [technically an enhancement, but JHB says...] ++ - longname.patch (*) [*SECURITY*] ++ - xpm.patch (*) ++ - deepcolor.patch (*) [slightly modified for language conformance] ++ - gifpatch (*) ++ - exceed_grab.patch (*) ++ - xv-redhat6-readme.txt (*) [slightly modified for portability] ++ - beos.patch (*) [modified for portability] ++ - croppad.patch (f) ++ - epsfpatch (f) ++ - tiff1200.patch (*) ++ - gssafer.patch (*) [*SECURITY*] ++ - new-xvgrab.c (f) [includes grabpatch but not exceed_grab.patch] ++ - xcmap.diff (AD) [part of xv-3.10a-png-1.2d.tar.gz] ++ - fixes for huge number gcc -Wall warnings--including two bugs (GRR) ++ - fix for cleandir script when no makefile exists (GRR) ++ - *SECURITY* fix for gets() in vdcomp.c (GRR, LCN vdcomp-security.patch) ++ - *SECURITY* fix for getwd() on Linux (GRR, LCN Linux-compile.patch) ++ - fix for "no fuss" Linux compiles (LCN Linux-compile.patch) ++ - partial *SECURITY* fix for mktemp() in xv.c and xvdir.c (GRR) ++ (remaining instances in xv.c (2), xvimage.c, xvfits.c, xvpds.c, xvps.c, and ++ possibly xvtiff.c--most involve system()) ++ - freebsd-vdcomp-newline.patch (AAC) ++ - xv-3.10a.patch.linux (PBJ) [/bin/sh versions of cleandir, RANLIB.sh only] ++ - removed trailing white space (GRR) [purely cosmetic] ++20050410: ++ - fix for YCbCr oversaturated-green bug(s) in TIFF decoder (GRR) ++ - provisional fix for contiguous tiled TIFFs with bottom-* orientation (GRR) ++ - fixes for gcc 3.3 -Wall warnings (GRR) ++ - fix for incorrect 16/24-bit display of xwd dumps (SJT) ++ - *SECURITY* fix for multiple input-validation bugs (OpenBSD/SuSE, Gentoo, GRR) ++ (this also completes the partial mktemp() security fix listed above) ++ - fix for (probable) 24-bit endianness bug in fixpix code (GRR) ++ ++ ++enhancements ((*) = listed on XV Downloads page, (<who>) = third-party): ++ ++20040516: ++ - xv-3.10a.JPEG-patch (*) ++ (xv-3.10a.JPEG-patch.old differs only in ftp site listed in comments at top) ++ - xv-3.10a.TIFF-patch (*) ++ - xv-3.10a-png-1.2d.tar.gz (AL, AD) (*) ++ (xvjpeg.diff and xvtiff.diff ignored; xcmap.diff included in fixes) ++ - xvpng-1.2d-fix3.patch (GRR, SJT) (*) ++ - pdf.patch (*) ++ - windowid.patch + windowid.patch.readme (*) ++ - bmp32.patch (*) ++ - fixpix-20000610.tar.gz (GV) ++ (identical to 19961127 version except for README updates and new Win32 file) ++ [modified to be runtime-selectable via -/+fixpix option] ++ - browse-remember.patch (JZ) ++ - faster-smooth.patch (JZ) ++ - PAM support (GRR) ++ - PNG/GIF -ibg ("image background") transparency option (GRR) ++ (does not yet support TIFF, XPM or TGA) ++ - VersionInfo* in help screen (GRR) ++ - minor grammar/spelling fixes (GRR) ++ - floating-point support for -wait when USE_TICKS enabled (GRR) ++ - wheelmouse.patch (SB) ++ - freebsd-gravity-hints-patch (JR) ++ - xv-zx.patch (JCE) ++ - xv3.10a.wapbmp.patch (PSV) ++ - xv-3.10a-pcd.patch.20010708 (DAC) ++ - jp-ext-bzip2-1.1.patch ++ (from ftp://ftp.freebsd.org/pub/FreeBSD/ports/local-distfiles/shige/xv/) ++20050410: ++ - boosted maximum number of files from 4096 to 32768 (GRR) ++ (note that OS kernel limits may also apply; for example, in Linux see ++ MAX_ARG_PAGES in linux-<version>/include/linux/binfmts.h) ++ - xv-3.10a-bmp16.patch ++ (from http://www.coara.or.jp/~sudakyo/XV_jp.html) ++ - final-image delay (e.g., "-wait 0.2,3" : pause 3 secs on final image) (GRR) ++ - xv-numpad.patch (EK) ++ - xv-delete-is-not-backspace.patch (EK) ++ - made browser window (schnauzer) and icons configurable (AT, GRR) ++ ++ ++not (yet?) included: ++ ++ - others from http://www.coara.or.jp/~sudakyo/XV_jp.html (some are duplicates): ++ -rw-r--r-- 4644 Mar 11 2004 xv-3.10a-directory.patch ++ -rw-r--r-- 462 Mar 11 2004 xv-3.10a-dirwkey.patch ++ -rw-r--r-- 688 Mar 11 2004 xv-3.10a-docdir.patch ++ -rw-r--r-- 11952 Mar 11 2004 xv-3.10a-download-test0.patch ++ -rw-r--r-- 41786 Mar 11 2004 xv-3.10a-download-test1.patch ++ -rw-r--r-- 42397 Mar 11 2004 xv-3.10a-download-test2.patch ++ -rw-r--r-- 47679 Mar 11 2004 xv-3.10a-download-test3.patch ++ -rw-r--r-- 52745 Mar 11 2004 xv-3.10a-download-test4.patch ++ -rw-r--r-- 415 Mar 11 2004 xv-3.10a-formatstr.patch ++ -rw-r--r-- 3423 Apr 24 2004 xv-3.10a-keyzoom.patch ++ -rw-r--r-- 1461 Mar 11 2004 xv-3.10a-locale-linux.patch ++ -rw-r--r-- 12387 Mar 15 2004 xv-3.10a-menubutton.patch ++ -rw-r--r-- 1178 Apr 24 2004 xv-3.10a-noblink.patch ++ -rw-r--r-- 484 Mar 11 2004 xv-3.10a-printkey.patch ++ -rw-r--r-- 57092 Jul 9 2004 xv-3.10a-resolution.patch ++ -rw-r--r-- 4645 Apr 24 2004 xv-3.10a-selall.patch ++ -rw-r--r-- 360 Mar 11 2004 xv-3.10a-shortsleep.patch ++ -rw-r--r-- 702 Apr 24 2004 xv-3.10a-showlongname.patch ++ -rw-r--r-- 1205 Apr 24 2004 xv-3.10a-staytoppdir.patch ++ -rw-r--r-- 1591 Mar 15 2004 xv-3.10a-sysconfdir.patch ++ -rw-r--r-- 4228 Apr 24 2004 xv-3.10a-wheelmouse.patch ++ -rw-r--r-- 744 Apr 24 2004 xv-3.10a-xvbutt_wait.patch ++ -rw-r--r-- 712 Mar 11 2004 xv-3.10a-xvexecpath.patch ++ -rw-r--r-- 3757 Jul 9 2004 xv-3.10a-xvscrl_button2.patch ++ -rw-r--r-- 1494 Jul 9 2004 xv-3.10a-xvscrl_wait.patch ++ -rw-r--r-- 19352 Jul 9 2004 xv-3.10a-xvzoom.patch ++ -rw-r--r-- 1827 Apr 24 2004 xv-3.10a-zeroquit.patch ++ ++ - xv310a-jp-extension-rev5.3.3.tar.gz [extensive] ++ - xv-3.10a-jp-extension-5.3.3-png-1.2d.patch [PNG patch relative to jp-ext] ++ - xv-3.10a+jp-extension-rev5.3.3+FLmask.v2.1+png+misc.patch [??] ++ ++ - xv-grab-imake-hips.patch (JPD) [HIPS format, -startgrab option] ++ - xv-psnewstyle.patch (TA) [coming later in 2005?] ++ - xv-3.10a.patch.linux (PBJ) [maybe use vdcomp.c changes?] ++ - xvxpm-anthony-thyssen.c (AT) ["slate grey" bug already gone?] ++ ++ - stuff in xv/unsupt: ++ -rw-r--r-- 30527 Dec 22 1994 FITS.rite ++ -rw-r--r-- 49152 Dec 22 1994 FITS.tar ++ -rw-r--r-- 3753 Dec 22 1994 G3.patch1 ++ -rw-r--r-- 24576 Dec 22 1994 G3.tar ++ -rw-r--r-- 1098 Dec 22 1994 INFO.cgm ++ -rw-r--r-- 1941 Dec 22 1994 README ++ -rwxr-xr-x 1059 Dec 22 1994 getweather ++ -rwxr-xr-x 2186 Dec 22 1994 getweather.ksh ++ -rw-r--r-- 856 Dec 22 1994 twm.fix ++ -rw-r--r-- 844 Dec 22 1994 vargs.c ++ -rw-r--r-- 47626 Dec 22 1994 vis ++ -rw-r--r-- 21097 Dec 22 1994 xscm ++ ++ ++ ++not finished (and/or even started ;-) ): ++ ++ - fix xvpng.c not to use direct struct access ++ - fix for never-ending pile of SLOW popups when viewing TIFFs with unknown tags ++ (or truncated/corrupted images) ++ - fix for minor .Z inefficiency in xv.c ("FIXME") ++ - fix for filename entry-field mouse/cursor bogosity ++ (want at least positioning to work; preferably also select/cut/paste) ++ - fix for spacebar-for-next-image getting stuck at first text file ++ - fix for .ppm.gz "disk leak" [can't reproduce...already fixed?] ++ (maybe occurs only if filesystem is already nearly full? bad .gz?) ++ ++ - transparency support for TIFF, XPM and TGA images ++ - support for tiled background image (with transparent foreground image) ++ - MNG/JNG support ++ ++ ++ChangeLog ++--------- ++ ++ 20000220 ++ original pair of jumbo patches, comprising perhaps 16 fix-patches and a ++ dozen enhancement-patches; never publicly released ++ ++ 20040516 ++ first public release, incorporating 25 fix-patches and 21 enhancement- ++ patches ++ ++ 20040523 ++ minor fix to xvctrl.c to support registered versions (GRR warnings-patch ++ was slightly overzealous); switched to tarball packaging ++ ++ 20040531 ++ fixed undefined CLK_TCK with gcc -ansi (enh/USE_TICKS option); made ++ libjpeg, libtiff, libpng and zlib sections of makefile more consistent ++ (enh); ++ ++ 20040606 ++ added freshmeat link, build instructions, and changelog to jumbo README ++ (this file) ++ ++ 20050213 ++ increased max number of files from 4096 to 32768 (enh) ++ ++ 20050320-20050410 ++ fixed two very long-standing YCbCr bugs in TIFF decoder (fix); ++ provisionally fixed bug in TIFF decoder for contiguous tiled TIFFs with ++ bottom-* orientation (fix/USE_TILED_TIFF_BOTLEFT_FIX option); fixed new ++ gcc 3.3 warnings (fix); fixed incorrect 16/24-bit display of xwd dumps ++ (fix); fixed multiple input-validation bugs (potential heap overflows) ++ and mktemp() dependencies (*SECURITY* fixes: CAN-2004-1725, CAN-2004- ++ 1726, CAN-2005-0665, CERT VU#622622, and others); added support for 16- ++ and 32-bit BMPs using bitfields "compression" (enh); fixed probable byte- ++ sex bug in 24-bit FixPix display code (enh/USE_24BIT_ENDIAN_FIX option); ++ fixed numerical-keypad NumLock behavior and delete-key behavior in file- ++ load/save window (enh); made schnauzer window and icons configurable (enh) +diff -ruN xv-3.10a/bggen.c xv-3.10a-bugfixes/bggen.c +--- xv-3.10a/bggen.c 1994-12-22 14:34:41.000000000 -0800 ++++ xv-3.10a-bugfixes/bggen.c 2004-05-16 17:50:52.000000000 -0700 +@@ -18,6 +18,11 @@ + #include <stdio.h> + #include <math.h> + ++#ifdef __STDC__ ++# include <stdlib.h> /* atoi() */ ++# include <ctype.h> /* isdigit() */ ++#endif ++ + #ifndef M_PI + # define M_PI 3.1415926535897932385 + #endif +@@ -46,8 +51,8 @@ + + typedef unsigned char byte; + +-struct color { int r,g,b; +- int y; ++struct color { int r,g,b; ++ int y; + } colors[MAXCOLS], *cur, *nex; + + int numcols; +@@ -62,7 +67,7 @@ + double computeDist PARM((int, int, int, int, int)); + void writePPM PARM((byte *, int, int, int)); + +- ++ + /*************************************/ + int main(argc,argv) + int argc; +@@ -80,18 +85,18 @@ + char *geom = NULL; + char *rptgeom = NULL; + +- ++ + #ifdef VMS + getredirection(&argc, &argv); + #endif +- ++ + + for (i=1; i<argc; i++) { + if (!strncmp(argv[i],"-d",(size_t) 2)) { /* -d disp */ + i++; if (i<argc) dname = argv[i]; + } + } +- ++ + if ((theDisp = XOpenDisplay(dname)) == NULL) { + fprintf(stderr,"bggen: Warning - can't open display, screen %s", + "size unknown, color names not accepted.\n"); +@@ -99,41 +104,41 @@ + + + cnt = 0; numcols = 0; +- ++ + /* parse cmd-line args */ + for (i=1; i<argc; i++) { + if (!strcmp(argv[i],"-h")) { /* -h high */ + i++; if (i<argc) high = atoi(argv[i]); + hset++; + } +- ++ + else if (!strcmp(argv[i],"-w")) { /* -w wide */ + i++; if (i<argc) wide = atoi(argv[i]); + wset++; + } +- ++ + else if (!strcmp(argv[i],"-b")) { /* -b bits */ + i++; if (i<argc) bits = atoi(argv[i]); + } +- ++ + else if (!strncmp(argv[i],"-g",(size_t) 2)) { /* -g geom */ + i++; if (i<argc) geom = argv[i]; + } +- ++ + else if (!strncmp(argv[i],"-d",(size_t) 2)) { /* -d disp */ + i++; if (i<argc) dname = argv[i]; + } +- ++ + else if (!strcmp(argv[i],"-G")) { /* -G rptgeom */ + i++; if (i<argc) rptgeom = argv[i]; + } +- ++ + else if (!strncmp(argv[i],"-a",(size_t) 2)) doascii++; /* -a */ +- ++ + else if (!strcmp(argv[i],"-r")) { /* -r rot */ + i++; if (i<argc) rot = atoi(argv[i]); + } +- ++ + else if (argv[i][0]=='-') usage(); /* any other '-' option is unknown */ + + else if (isdigit(argv[i][0])) { +@@ -143,7 +148,7 @@ + case 2: colors[numcols].b = atoi(argv[i]); break; + } + cnt++; +- ++ + if (cnt==3) { + if (numcols<MAXCOLS) numcols++; + cnt = 0; +@@ -176,50 +181,50 @@ + } + } + } +- +- +- ++ ++ ++ + /* print error/usage message, if appropriate */ + if (cnt || numcols==0 || high<1 || wide<1 || bits<1 || bits>8) usage(); +- +- ++ ++ + if (geom) { + int x,y; unsigned int w,h; + i = XParseGeometry(geom, &x, &y, &w, &h); + if (i&WidthValue) { wset++; wide = (int) w; } + if (i&HeightValue) { hset++; high = (int) h; } + } +- +- ++ ++ + /* attempt to connect to X server and get screen dimensions */ + if (theDisp) { + i = DefaultScreen(theDisp); + if (!wset) wide = DisplayWidth(theDisp, i); + if (!hset) high = DisplayHeight(theDisp, i); + } +- +- ++ ++ + /* normalize 'rot' */ + while (rot< 0) rot += 360; + while (rot>=360) rot -= 360; +- +- ++ ++ + rptwide = wide; rpthigh = high; + if (rptgeom) { + int x,y; unsigned int w,h; + i = XParseGeometry(rptgeom, &x, &y, &w, &h); + if (i&WidthValue) rptwide = (int) w; + if (i&HeightValue) rpthigh = (int) h; +- ++ + RANGE(rptwide, 1, wide); + RANGE(rpthigh, 1, high); + } +- +- + +- ++ ++ ++ + rpic24 = (byte *) malloc(rptwide * rpthigh * 3 * sizeof(byte)); +- if (rptwide != wide || rpthigh != high) ++ if (rptwide != wide || rpthigh != high) + pic24 = (byte *) malloc(wide * high * 3 * sizeof(byte)); + else pic24 = rpic24; + +@@ -229,7 +234,7 @@ + exit(1); + } + for (i=0, pp=pic24; i<wide*high*3; i++) *pp++ = 0; +- ++ + + + /*** generate image ***/ +@@ -244,34 +249,34 @@ + } + } + } +- +- ++ ++ + else if (rot==0) { /* un-rotated linear (vertical) gradient */ + for (i=0; i<numcols; i++) + colors[i].y = ((rpthigh-1) * i) / (numcols-1); +- ++ + cur = &colors[0]; nex = cur+1; +- ++ + for (i=0; i<rpthigh; i++) { + pp = rpic24 + (i * rptwide * 3); + + /* advance to next pair of colors if we're outside region */ + while (nex->y < i) { cur++; nex++; } +- ++ + r = cur->r + ((nex->r - cur->r) * (i - cur->y)) / (nex->y - cur->y); + g = cur->g + ((nex->g - cur->g) * (i - cur->y)) / (nex->y - cur->y); + b = cur->b + ((nex->b - cur->b) * (i - cur->y)) / (nex->y - cur->y); +- ++ + r = r & bmask[bits-1]; + g = g & bmask[bits-1]; + b = b & bmask[bits-1]; +- ++ + for (j=0; j<rptwide; j++) { + *pp++ = (byte) r; *pp++ = (byte) g; *pp++ = (byte) b; + } + } + } +- ++ + else dorot(rpic24, rptwide, rpthigh, rot); + + +@@ -293,7 +298,7 @@ + y = ((i-ay) % rpthigh); + + sp = rpic24 + (y * rptwide + x) * 3; +- ++ + pp[0] = *sp++; pp[1] = *sp++; pp[2] = *sp++; + } + } +@@ -355,12 +360,12 @@ + mind = computeDist(w-1, 0, cx, cy, rot); + maxd = computeDist(0, h-1, cx, cy, rot); + } +- ++ + del = maxd - mind; /* maximum distance */ +- ++ + distdebug = 0; +- +- ++ ++ + for (y=0; y<h; y++) { + pp = pic + (y * w * 3); + for (x=0; x<w; x++) { +@@ -368,11 +373,11 @@ + rat = (d - mind) / del; + if (rat<0.0) rat = 0.0; + if (rat>1.0) rat = 1.0; +- ++ + cval = rat * nc1; + bc = floor(cval); + crat = cval - bc; +- ++ + if (bc < nc1) { + r = colors[bc].r + crat * (colors[bc+1].r - colors[bc].r); + g = colors[bc].g + crat * (colors[bc+1].g - colors[bc].g); +@@ -383,7 +388,7 @@ + g = colors[nc1].g; + b = colors[nc1].b; + } +- ++ + *pp++ = (byte) r; *pp++ = (byte) g; *pp++ = (byte) b; + } + } +@@ -395,9 +400,9 @@ + int x,y,cx,cy,rot; + { + /* rot has to be in range 0-359 */ +- +- double x1, y1, x2, y2, x3, y3, d, d1, b, theta; +- ++ ++ double x1, y1, x2, y2, x3, y3, d, d1, b; ++ + if (rot == 0) return (double) (y - cy); + if (rot == 180) return (double) (cy - y); + +@@ -407,7 +412,7 @@ + /* x2,y2 = vertical projection onto a || line that runs through cx,cy */ + x2 = x1; + y2 = cy - (cx-x2)*tant1; +- ++ + d1 = y2 - y1; /* vertical distance between lines */ + b = d1 * cost1; + +@@ -435,11 +440,11 @@ + int w,h,doascii; + { + /* dumps a pic24 in PPM format to stdout */ +- ++ + int x,y; +- ++ + printf("P%s %d %d 255\n", (doascii) ? "3" : "6", w, h); +- ++ + for (y=0; y<h; y++) { + if (doascii) { + for (x=0; x<w; x++, pic+=3) +diff -ruN xv-3.10a/bits/icon xv-3.10a-bugfixes/bits/icon +--- xv-3.10a/bits/icon 1994-12-22 14:35:28.000000000 -0800 ++++ xv-3.10a-bugfixes/bits/icon 2004-04-28 00:53:10.000000000 -0700 +@@ -1,5 +1,6 @@ + #define icon_width 40 + #define icon_height 32 ++#ifndef OMIT_ICON_BITS + static unsigned char icon_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, +@@ -15,3 +16,4 @@ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; ++#endif +diff -ruN xv-3.10a/cleandir xv-3.10a-bugfixes/cleandir +--- xv-3.10a/cleandir 1994-12-22 14:34:50.000000000 -0800 ++++ xv-3.10a-bugfixes/cleandir 2004-05-10 23:19:16.000000000 -0700 +@@ -1,9 +1,13 @@ +-#!/bin/csh -f ++#!/bin/sh -f + # cleandir: if called with an argument, cd's there and does a 'make clean' + # + +-if ( x$1 != x ) then +- echo "cleaning $1 subdirectory" +- cd $1 +- make clean +-endif ++if [ x"$1" != x ]; then ++ if [ -f "$1"/makefile -o -f "$1"/Makefile ]; then ++ echo "cleaning '$1' subdirectory" ++ cd "$1" ++ make clean ++# else ++# echo "no makefile found; NOT cleaning '$1' subdirectory" ++ fi ++fi +diff -ruN xv-3.10a/config.h xv-3.10a-bugfixes/config.h +--- xv-3.10a/config.h 1995-01-05 10:49:21.000000000 -0800 ++++ xv-3.10a-bugfixes/config.h 2005-03-21 23:21:31.000000000 -0800 +@@ -8,9 +8,9 @@ + * + * if you have the gnu uncompression utility 'gunzip', XV can use it to + * automatically 'unzip' any gzip'd files. To enable this feature, +- * change 'undef' to 'define' in the following line. Needless to say, if ++ * change 'undef' to 'define' in the following line. Needless to say, if + * your gunzip is installed elsewhere on your machine, change the 'GUNZIP' +- * definition appropriately. (use 'which gunzip' to find if you have gunzip, ++ * definition appropriately. (use 'which gunzip' to find if you have gunzip, + * and where it lives) + */ + #undef USE_GUNZIP +@@ -19,7 +19,8 @@ + # ifdef VMS + # define GUNZIP "UNCOMPRESS" + # else +-# define GUNZIP "/usr/local/bin/gunzip -q" ++/* define GUNZIP "/usr/local/bin/gunzip -q" */ ++# define GUNZIP "/usr/bin/gzip -dq" /* more portable */ + # endif + #endif + +@@ -70,18 +71,18 @@ + * PostScript file input support: + * + * if you have the 'ghostscript' package installed (version 2.6 or later), +- * XV can use it to read and display PostScript files. To do so, ++ * XV can use it to read and display PostScript files. To do so, + * uncomment the '#define GS_PATH' line, below. You probably will not + * need to modify the GS_LIB or GS_DEV lines, but if you do modify them, + * be sure to uncomment them, as well. + * +- * the ghostscript package can be acquired via anonymous ftp on ++ * the ghostscript package can be acquired via anonymous ftp on + * prep.ai.mit.edu, in the 'pub/gnu' directory + * +- * GS_PATH specifies the complete path to your gs executable. ++ * GS_PATH specifies the complete path to your gs executable. + * +- * GS_LIB should be set if there's some other gs libs that should be +- * searched, but aren't by default. (In which case you should probably ++ * GS_LIB should be set if there's some other gs libs that should be ++ * searched, but aren't by default. (In which case you should probably + * just fix your 'gs' so it looks in the right places without being told...) + * + * GS_DEV is the file format that ghostscript will convert PS into. It +@@ -97,7 +98,7 @@ + * 'old-style' XV logo image: + * + * XV now has a nifty, new logo image. The downside is that it increases +- * the size of the 'xv' executable by 250K or so, and it's possible that ++ * the size of the 'xv' executable by 250K or so, and it's possible that + * your compiler may choke while compiling 'xvdflt.c'. If you're compiler + * can't handle it, or you're running Linux on a system with minimal memory, + * change 'undef' to 'define' in the following line +@@ -108,8 +109,8 @@ + + /*************************************************************************** + * Backing Store: +- * +- * XV can request that 'Backing Store' may be turned on ('WhenMapped') for ++ * ++ * XV can request that 'Backing Store' may be turned on ('WhenMapped') for + * several of its windows, which may help performance over a slow network + * connection. However, it has been known to behave strangely (or crash) + * on some X servers, so it's left here as an option. If you run into trouble +diff -ruN xv-3.10a/copyright.h xv-3.10a-bugfixes/copyright.h +--- xv-3.10a/copyright.h 1994-12-22 14:34:56.000000000 -0800 ++++ xv-3.10a-bugfixes/copyright.h 2004-05-16 17:53:11.000000000 -0700 +@@ -1,11 +1,11 @@ + /* Copyright Notice + * ================ + * Copyright 1989, 1994 by John Bradley +- * +- * Permission to copy and distribute XV in its entirety, for non-commercial +- * purposes, is hereby granted without fee, provided that this license ++ * ++ * Permission to copy and distribute XV in its entirety, for non-commercial ++ * purposes, is hereby granted without fee, provided that this license + * information and copyright notice appear unmodified in all copies. +- * ++ * + * Note that distributing XV 'bundled' in with any product is considered + * to be a 'commercial purpose'. + * +@@ -13,16 +13,16 @@ + * and/or configured to be in their 'unregistered copy' mode, so that it + * is made obvious to the user that XV is shareware, and that they should + * consider donating, or at least reading this License Info. +- * ++ * + * The software may be modified for your own purposes, but modified + * versions may not be distributed without prior consent of the author. +- * ++ * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the author be held liable for any damages + * arising from the use of this software. +- * ++ * + * If you would like to do something with XV that this copyright +- * prohibits (such as distributing it with a commercial product, ++ * prohibits (such as distributing it with a commercial product, + * using portions of the source in some other program, etc.), please + * contact the author (preferably via email). Arrangements can + * probably be worked out. +@@ -34,13 +34,13 @@ + * larger donations are quite welcome. Folks who donate $25 or more + * can receive a Real Nice bound copy of the XV manual for no extra + * charge. +- * ++ * + * Commercial, government, and institutional users must register their + * copies of XV, for the price of $25 per workstation/X terminal or per + * XV user, whichever is less. Note that it does NOT say 'simultaneous user', +- * but rather, the total number of people who use XV on any sort of +- * recurring basis. Site licenses are available (and recommended) for those +- * who wish to run XV on a large (>10) number of machines. ++ * but rather, the total number of people who use XV on any sort of ++ * recurring basis. Site licenses are available (and recommended) for those ++ * who wish to run XV on a large (>10) number of machines. + * Contact the author for more details. + * + * The author may be contacted via: +diff -ruN xv-3.10a/tiff/Makefile xv-3.10a-bugfixes/tiff/Makefile +--- xv-3.10a/tiff/Makefile 1994-12-22 14:35:12.000000000 -0800 ++++ xv-3.10a-bugfixes/tiff/Makefile 2004-05-16 18:49:11.000000000 -0700 +@@ -30,8 +30,10 @@ + # OF THIS SOFTWARE. + # + +-AR= ar +-RANLIB= ./RANLIB.csh ++AR= ar ++CHMOD= chmod ++#RANLIB= ./RANLIB.csh ++RANLIB= ./RANLIB.sh + + IPATH= -I. + +@@ -60,6 +62,7 @@ + + ${ALL}: ${OBJS} + ${AR} rc libtiff.a $? ++ ${CHMOD} +x ${RANLIB} + ${RANLIB} libtiff.a + + ${OBJS}: tiffio.h tiff.h tiffcomp.h tiffiop.h tiffconf.h +diff -ruN xv-3.10a/tiff/Makefile.std xv-3.10a-bugfixes/tiff/Makefile.std +--- xv-3.10a/tiff/Makefile.std 1994-12-22 14:35:16.000000000 -0800 ++++ xv-3.10a-bugfixes/tiff/Makefile.std 2004-05-16 18:50:39.000000000 -0700 +@@ -30,8 +30,10 @@ + # OF THIS SOFTWARE. + # + +-AR= /bin/ar +-RANLIB= ./RANLIB.csh ++AR= /bin/ar ++CHMOD= chmod ++#RANLIB= ./RANLIB.csh ++RANLIB= ./RANLIB.sh + + IPATH= -I. + +@@ -60,6 +62,7 @@ + + ${ALL}: ${OBJS} + ${AR} rc libtiff.a $? ++ ${CHMOD} +x ${RANLIB} + ${RANLIB} libtiff.a + + ${OBJS}: tiffio.h tiff.h tiffcomp.h tiffiop.h tiffconf.h +diff -ruN xv-3.10a/tiff/RANLIB.sh xv-3.10a-bugfixes/tiff/RANLIB.sh +--- xv-3.10a/tiff/RANLIB.sh 1969-12-31 16:00:00.000000000 -0800 ++++ xv-3.10a-bugfixes/tiff/RANLIB.sh 2004-05-10 23:31:38.000000000 -0700 +@@ -0,0 +1,22 @@ ++#!/bin/sh -f ++# ++# tests to see if the program 'ranlib' exists. If it does, runs ranlib on ++# the first argument (a library name). Otherwise, does nothing, and returns ++# ++# written by John Bradley for the XV 3.00 release ++# thanks to John Hagan for shell-script hackery ++# ++ ++echo "executing 'ranlib $1'..." ++ ++# Is there a ranlib? Let's try and then suffer the consequences... ++ranlib $1 >& /dev/null ++ ++if [ $? -ne 0 ]; then ++ echo "There doesn't seem to be a ranlib on this system..." ++ echo "Don't worry about it." ++fi ++ ++echo "" ++echo "" ++ +diff -ruN xv-3.10a/vdcomp.c xv-3.10a-bugfixes/vdcomp.c +--- xv-3.10a/vdcomp.c 1994-12-22 14:34:47.000000000 -0800 ++++ xv-3.10a-bugfixes/vdcomp.c 2005-03-20 17:48:59.000000000 -0800 +@@ -5,8 +5,8 @@ + /* Decompresses images using Kris Becker's subroutine DECOMP.C */ + /* which is included in this program in a shortened version. */ + /* */ +-/* Reads a variable length compressed PDS image and outputs a */ +-/* fixed length uncompressed image file in PDS format with */ ++/* Reads a variable-length compressed PDS image and outputs a */ ++/* fixed-length uncompressed image file in PDS format with */ + /* labels, image histogram, engineering table, line header table */ + /* and an image with PDS, FITS, VICAR or no labels. If used on */ + /* a non-byte-swapped machine the image histogram is un-swapped. */ +@@ -108,7 +108,9 @@ + !defined(bsd43) && \ + !defined(aux) && \ + !defined(__bsdi__) && \ +- !defined(sequent) ++ !defined(sequent) && \ ++ !defined(__FreeBSD__) && \ ++ !defined(__OpenBSD__) + + # if defined(hp300) || defined(hp800) || defined(NeXT) + # include <sys/malloc.h> /* it's in 'sys' on HPs and NeXT */ +@@ -121,15 +123,17 @@ + + #include <X11/Xos.h> + +-#define TRUE 1 +-#define FALSE 0 ++#define TRUE 1 ++#define FALSE 0 + +- /* pc i/o defines */ +-#define O_BINARY 0x8000 /* file mode is binary */ ++#define NAMELEN 1024 /* inname and outname sizes */ + +- /* vax i/o defines */ +-#define RECORD_TYPE "rfm=fix" /* VAX fixed length output */ +-#define CTX "ctx=bin" /* no translation of \n */ ++ /* PC I/O defines */ ++#define O_BINARY 0x8000 /* file mode is binary */ ++ ++ /* VAX/VMS I/O defines */ ++#define RECORD_TYPE "rfm=fix" /* VAX/VMS fixed-length output */ ++#define CTX "ctx=bin" /* no translation of \n */ + #define FOP "fop=cif,sup" /* file processing ops */ + + typedef struct leaf { struct leaf *right; +@@ -176,7 +180,7 @@ + + int infile; + FILE *outfile; +-char inname[1024],outname[1024]; ++char inname[NAMELEN], outname[NAMELEN]; + int output_format; + int record_bytes, max_lines; + int line_samples, fits_pad; +@@ -185,8 +189,8 @@ + + /*************************************************/ + int main(argc,argv) +- int argc; +- char **argv; ++ int argc; ++ char **argv; + { + unsigned char ibuf[2048],obuf[2048]; + unsigned char blank=32; +@@ -200,12 +204,12 @@ + /* */ + /*********************************************************************/ + +- strcpy(inname," "); ++ strcpy(inname," "); + strcpy(outname," "); + output_format = 0; + + if (argc == 1); /* prompt user for parameters */ +- else if (argc == 2 && (strncmp(argv[1],"help",(size_t) 4) == 0 || ++ else if (argc == 2 && (strncmp(argv[1],"help",(size_t) 4) == 0 || + strncmp(argv[1],"HELP",(size_t) 4) == 0 || + strncmp(argv[1],"?", (size_t) 1) == 0)) { + fprintf(stderr, +@@ -214,18 +218,22 @@ + fprintf(stderr," infile - name of compressed image file. \n"); + fprintf(stderr," outfile - name of uncompressed output file.\n"); + fprintf(stderr," output format - selected from the following list:\n"); +- fprintf(stderr,"\n"); +- fprintf(stderr," 1 SFDU/PDS format [DEFAULT].\n"); +- fprintf(stderr," 2 FITS format. \n"); +- fprintf(stderr," 3 VICAR format. \n"); +- fprintf(stderr," 4 Unlabelled binary array. \n\n"); ++ fprintf(stderr,"\n"); ++ fprintf(stderr," 1 SFDU/PDS format [DEFAULT].\n"); ++ fprintf(stderr," 2 FITS format. \n"); ++ fprintf(stderr," 3 VICAR format. \n"); ++ fprintf(stderr," 4 Unlabelled binary array. \n\n"); + exit(1); +- } ++ } + else { +- strcpy(inname,argv[1]); +- if (argc >= 3) strcpy(outname,argv[2]); ++ strncpy(inname, argv[1], sizeof(inname)-1); ++ inname[sizeof(inname)-1] = '\0'; ++ if (argc >= 3) { ++ strncpy(outname, argv[2], sizeof(outname)-1); ++ outname[sizeof(outname)-1] = '\0'; ++ } + if (argc == 3) output_format = 1; +- if (argc == 4) sscanf(argv[3],"%d",&output_format); ++ if (argc == 4) sscanf(argv[3],"%d",&output_format); + } + + host = check_host(); +@@ -244,13 +252,13 @@ + case 4: no_labels(host); break; + } + +- if (record_bytes == 836) { /* set up values for image sizes */ ++ if (record_bytes == 836) { /* set up values for image sizes */ + max_lines = 800; + fits_pad = 2240; + line_samples = 800; + } + else { +- max_lines = 1056; ++ max_lines = 1056; + fits_pad = 1536; + line_samples = 1204; + } +@@ -394,12 +402,12 @@ + if (record_bytes == 1204) /* do checksum for viking */ + for (i=0; i<record_bytes; i++) checksum += (int)obuf[i]; + +- if ((line % 100 == 0) && (outfile != stdout)) ++ if ((line % 100 == 0) && (outfile != stdout)) + fprintf(stderr,"\nline %d",line); + + } while (length > 0 && line < max_lines); + +- if (record_bytes == 1204 && (outfile != stdout)) ++ if (record_bytes == 1204 && (outfile != stdout)) + /* print checksum for viking */ + fprintf(stderr,"\n Image label checksum = %d computed checksum = %d\n", + label_checksum,checksum); +@@ -425,33 +433,36 @@ + /*********************************************************************/ + + int get_files(host) +-int host; ++ int host; + { +- short shortint; + typedef long off_t; ++ short shortint; ++ char *s; + + if (inname[0] == ' ') { + printf("\nEnter name of file to be decompressed: "); +- gets (inname); ++ fgets(inname, sizeof(inname), stdin); ++ if ((s = strchr(inname, '\n')) != NULL) ++ *s = '\0'; + } + +- if (host == 1 | host == 2) { +- if ((infile = open(inname,O_RDONLY | O_BINARY)) <= 0) { +- fprintf(stderr,"\ncan't open input file: %s\n",inname); ++ if (host == 1 || host == 2) { ++ if ((infile = open(inname, O_RDONLY | O_BINARY)) <= 0) { ++ fprintf(stderr,"\ncan't open input file: %s\n", inname); + exit(1); + } + } +- else if (host == 3 | host == 5) { +- if ((infile = open(inname,O_RDONLY)) <= 0) { +- fprintf(stderr,"\ncan't open input file: %s\n",inname); ++ else if (host == 3 || host == 5) { ++ if ((infile = open(inname, O_RDONLY)) <= 0) { ++ fprintf(stderr,"\ncan't open input file: %s\n", inname); + exit(1); + } + + /****************************************************************/ +- /* If we are on a vax see if the file is in var length format. */ +- /* This logic is in here in case the vax file has been stored */ ++ /* If we are on a VAX see if the file is in var length format. */ ++ /* This logic is in here in case the VAX file has been stored */ + /* in fixed or undefined format. This might be necessary since */ +- /* vax variable length files can't be moved to other computer */ ++ /* VAX variable-length files can't be moved to other computer */ + /* systems with standard comm programs (kermit, for example). */ + /****************************************************************/ + +@@ -459,9 +470,9 @@ + read(infile,&shortint, (size_t) 2); + if (shortint > 0 && shortint < 80) { + host = 4; /* change host to 4 */ +- printf("This is not a VAX variable length file."); ++ printf("This is not a VAX variable-length file."); + } +- else printf("This is a VAX variable length file."); ++ else printf("This is a VAX variable-length file."); + lseek(infile,(off_t) 0,0); /* reposition to beginning of file */ + } + } +@@ -474,13 +485,17 @@ + printf("\n 3. VICAR format."); + printf("\n 4. Unlabelled binary array.\n"); + printf("\n Enter format number:"); +- gets(inname); ++ fgets(inname, sizeof(inname), stdin); ++ if ((s = strchr(inname, '\n')) != NULL) ++ *s = '\0'; + output_format = atoi(inname); + } while (output_format < 1 || output_format > 4); + + if (outname[0] == ' ') { + printf("\nEnter name of uncompressed output file: "); +- gets (outname); ++ fgets(outname, sizeof(outname), stdin); ++ if ((s = strchr(outname, '\n')) != NULL) ++ *s = '\0'; + } + + return(host); +@@ -495,68 +510,68 @@ + /*********************************************************************/ + + void open_files(host) +-int *host; ++ int *host; + { + if (*host == 1 || *host == 2 || *host == 5) { + if (outname[0] == '-') outfile=stdout; +- else if ((outfile = fopen(outname,"wb"))==NULL) { +- fprintf(stderr,"\ncan't open output file: %s\n",outname); ++ else if ((outfile = fopen(outname, "wb"))==NULL) { ++ fprintf(stderr,"\ncan't open output file: %s\n", outname); + exit(1); + } + } + + else if (*host == 3 || *host == 4) { + if (output_format == 1) { /* write PDS format blocks */ +- if (record_bytes == 836) { +- if ((outfile=fopen(outname,"w" ++ if (record_bytes == 836) { ++ if ((outfile=fopen(outname, "w" + #ifdef VMS + ,"mrs=836",FOP,CTX,RECORD_TYPE + #endif + ))==NULL) { +- fprintf(stderr,"\ncan't open output file: %s\n",outname); ++ fprintf(stderr,"\ncan't open output file: %s\n", outname); + exit(1); + } + } + else { +- if ((outfile=fopen(outname,"w" ++ if ((outfile=fopen(outname, "w" + #ifdef VMS + ,"mrs=1204",FOP,CTX,RECORD_TYPE + #endif + ))==NULL) { +- fprintf(stderr,"\ncan't open output file: %s\n",outname); ++ fprintf(stderr,"\ncan't open output file: %s\n", outname); + exit(1); + } + } + } + else if (output_format == 2) { /* write FITS format blocks */ +- if ((outfile=fopen(outname,"w" ++ if ((outfile=fopen(outname, "w" + #ifdef VMS + ,"mrs=2880",FOP,CTX,RECORD_TYPE + #endif + ))==NULL) { +- fprintf(stderr,"\ncan't open output file: %s\n",outname); ++ fprintf(stderr,"\ncan't open output file: %s\n", outname); + exit(1); + } + } + +- else { /* write fixed length records */ +- if (record_bytes == 836) { +- if ((outfile=fopen(outname,"w" ++ else { /* write fixed-length records */ ++ if (record_bytes == 836) { ++ if ((outfile=fopen(outname, "w" + #ifdef VMS + ,"mrs=800",FOP,CTX,RECORD_TYPE + #endif + ))==NULL) { +- fprintf(stderr,"\ncan't open output file: %s\n",outname); ++ fprintf(stderr,"\ncan't open output file: %s\n", outname); + exit(1); + } + } + else { +- if ((outfile=fopen(outname,"w" ++ if ((outfile=fopen(outname, "w" + #ifdef VMS + ,"mrs=1204",FOP,CTX,RECORD_TYPE + #endif + ))==NULL) { +- fprintf(stderr,"\ncan't open output file: %s\n",outname); ++ fprintf(stderr,"\ncan't open output file: %s\n", outname); + exit(1); + } + } +@@ -572,11 +587,11 @@ + /*********************************************************************/ + + void pds_labels(host) +- int host; ++ int host; + { +- char outstring[80],ibuf[2048]; ++ char ibuf[2048]; + unsigned char cr=13,lf=10,blank=32; +- short length,nlen,total_bytes,line,i; ++ short length,total_bytes,i; + + + total_bytes = 0; +@@ -613,11 +628,11 @@ + (size_t) 53,(size_t) 1,outfile); + else + fwrite("CCSD3ZF0000100000001NJPL3IF0PDS200000001 = SFDU_LABEL", +- (size_t) 53,(size_t) 1,outfile); ++ (size_t) 53,(size_t) 1,outfile); + + fprintf(outfile,"%c%c",cr,lf); + fwrite("/* FILE FORMAT AND LENGTH */",(size_t) 37,(size_t) 1, +- outfile); ++ outfile); + fprintf(outfile,"%c%c",cr,lf); + fwrite("RECORD_TYPE = FIXED_LENGTH",(size_t) 47, + (size_t) 1,outfile); +@@ -710,7 +725,7 @@ + } + else { + strcpy(ibuf+35,"60"); +- length = length - 2; ++ length = length - 2; + } + + fwrite(ibuf,(size_t) length,(size_t) 1,outfile); +@@ -730,7 +745,7 @@ + } + + else if ((i = strncmp(ibuf," ENCODING",(size_t) 9)) == 0); +- ++ + /*****************************************************************/ + /* delete the encoding type label in the image object */ + /*****************************************************************/ +@@ -787,10 +802,10 @@ + /*********************************************************************/ + + void fits_labels(host) +-int host; ++ int host; + { + char ibuf[2048],outstring[80]; +- short length,nlen,total_bytes,line,i; ++ short length,total_bytes,i; + unsigned char cr=13,lf=10,blank=32; + + do { +@@ -799,7 +814,7 @@ + /*****************************************************************/ + /* find the checksum and store in label_checksum */ + /*****************************************************************/ +- if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) { ++ if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) { + ibuf[length] = '\0'; + label_checksum = atol(ibuf+35); + } +@@ -842,7 +857,7 @@ + + if (record_bytes == 836) + strcpy(outstring,"NAXIS1 = 800"); +- else ++ else + strcpy(outstring,"NAXIS1 = 1204"); + + strcat(outstring," "); +@@ -862,7 +877,7 @@ + + strcpy(outstring,"END "); + strcat(outstring," "); +- ++ + fwrite(outstring,(size_t) 78,(size_t) 1,outfile); + fprintf(outfile,"%c%c",cr,lf); + total_bytes = total_bytes + 80; +@@ -871,6 +886,7 @@ + for (i=total_bytes; i<2880; i++) fputc(blank,outfile); + } + ++ + /*********************************************************************/ + /* */ + /* subroutine vicar_labels - write vicar labels to output file */ +@@ -878,11 +894,10 @@ + /*********************************************************************/ + + void vicar_labels(host) +-int host; +- ++ int host; + { + char ibuf[2048],outstring[80]; +- short length,nlen,total_bytes,line,i; ++ short length,total_bytes,i; + unsigned char cr=13,lf=10,blank=32; + + do { +@@ -890,7 +905,7 @@ + /*****************************************************************/ + /* find the checksum and store in label_checksum */ + /*****************************************************************/ +- if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) { ++ if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) { + ibuf[length] = '\0'; + label_checksum = atol(ibuf+35); + } +@@ -950,10 +965,10 @@ + /*********************************************************************/ + + void no_labels(host) +-int host; ++ int host; + { +- char ibuf[2048],outstring[80]; +- short length,nlen,total_bytes,line,i; ++ char ibuf[2048]; ++ short length,i; + + do { + length = read_var(ibuf,host); +@@ -961,7 +976,7 @@ + /*****************************************************************/ + /* find the checksum and store in label_checksum */ + /*****************************************************************/ +- if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) { ++ if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) { + ibuf[length] = '\0'; + label_checksum = atol(ibuf+35); + } +@@ -984,15 +999,16 @@ + open_files(&host); + } + ++ + /*********************************************************************/ + /* */ +-/* subroutine read_var - read variable length records from input file*/ ++/* subroutine read_var - read variable-length records from input file*/ + /* */ + /*********************************************************************/ + + int read_var(ibuf,host) +-char *ibuf; +-int host; ++ char *ibuf; ++ int host; + { + int length,result,nlen; + char temp; +@@ -1027,19 +1043,19 @@ + return (length); + + case 3: /*******************************************************/ +- /* VAX host with variable length support */ ++ /* VAX host with variable-length support */ + /*******************************************************/ + length = read(infile,ibuf,(size_t) 2048/* upper bound */); + return (length); + + case 4: /*******************************************************/ +- /* VAX host, but not a variable length file */ ++ /* VAX host, but not a variable-length file */ + /*******************************************************/ + length = 0; + result = read(infile,&length,(size_t) 2); + nlen = read(infile,ibuf,(size_t) length+(length%2)); + +- /* check to see if we crossed a vax record boundary */ ++ /* check to see if we crossed a VAX record boundary */ + while (nlen < length) + nlen += read(infile,ibuf+nlen,(size_t) length+(length%2)-nlen); + return (length); +@@ -1061,6 +1077,7 @@ + return 0; + } + ++ + /*********************************************************************/ + /* */ + /* subroutine check_host - find out what kind of machine we are on */ +@@ -1115,23 +1132,23 @@ + "Host 5 - 32 bit integers without swapping, no var len support."); + } + +- if ((*outname)!='-') fprintf(stderr,"%s\n",hostname); ++ if ((*outname) != '-') fprintf(stderr, "%s\n", hostname); + return(host); + } + + +-int swap_int(inval) /* swap 4 byte integer */ +- int inval; ++int swap_int(inval) /* swap 4 byte integer */ ++ int inval; + { +- union /* this union is used to swap 16 and 32 bit integers */ ++ union /* this union is used to swap 16 and 32 bit integers */ + { + char ichar[4]; + short slen; + int llen; + } onion; + char temp; +- +- /* byte swap the input field */ ++ ++ /* byte swap the input field */ + onion.llen = inval; + temp = onion.ichar[0]; + onion.ichar[0]=onion.ichar[3]; +@@ -1146,17 +1163,16 @@ + /**************************************************************************** + *_TITLE decompress - decompresses image lines stored in compressed format * + *_ARGS TYPE NAME I/O DESCRIPTION */ +- char *ibuf; /* I Compressed data buffer */ +- char *obuf; /* O Decompressed image line */ +- int *nin; /* I Number of bytes on input buffer */ +- int *nout; /* I Number of bytes in output buffer */ +- ++ char *ibuf; /* I Compressed data buffer */ ++ char *obuf; /* O Decompressed image line */ ++ int *nin; /* I Number of bytes on input buffer */ ++ int *nout; /* I Number of bytes in output buffer */ + { + /* The external root pointer to tree */ + extern NODE *tree; + + dcmprs(ibuf,obuf,nin,nout,tree); +- ++ + return; + } + +@@ -1165,8 +1181,7 @@ + /*************************************************************************** + *_TITLE decmpinit - initializes the Huffman tree * + *_ARGS TYPE NAME I/O DESCRIPTION */ +- int *hist; /* I First-difference histogram. */ +- ++ int *hist; /* I First-difference histogram. */ + { + extern NODE *tree; /* Huffman tree root pointer */ + tree = huff_tree(hist); +@@ -1178,8 +1193,7 @@ + /**************************************************************************** + *_TITLE huff_tree - constructs the Huffman tree; returns pointer to root * + *_ARGS TYPE NAME I/O DESCRIPTION */ +- int *hist; /* I First difference histogram */ +- ++ int *hist; /* I First difference histogram */ + { + /* Local variables used */ + int freq_list[512]; /* Histogram frequency list */ +@@ -1189,7 +1203,6 @@ + NODE **np; /* Node list pointer */ + + int num_freq; /* Number non-zero frequencies in histogram */ +- int sum; /* Sum of all frequencies */ + + short int num_nodes; /* Counter for DN initialization */ + short int cnt; /* Miscellaneous counter */ +@@ -1228,7 +1241,7 @@ + + j = 0; + for (i=4 ; --i >= 0 ; j = (j << 8) | *(cp+i)); +- ++ + /* Now make the assignment */ + *fp++ = j; + temp = new_node(num_nodes); +@@ -1341,7 +1354,7 @@ + l--; + if ( j <= freq_list) break; + } +- ++ + } + return; + } +@@ -1362,9 +1375,9 @@ + NODE *ptr = root; /* pointer to position in tree */ + unsigned char test; /* test byte for bit set */ + unsigned char idn; /* input compressed byte */ +- ++ + char odn; /* last dn value decompressed */ +- ++ + char *ilim = ibuf + *nin; /* end of compressed bytes */ + char *olim = obuf + *nout; /* end of output buffer */ + +@@ -1406,10 +1419,9 @@ + /**************************************************************************** + *_TITLE free_tree - free memory of all allocated nodes * + *_ARGS TYPE NAME I/O DESCRIPTION */ +- int *nfreed; /* O Return of total count of nodes * ++ int *nfreed; /* O Return of total count of nodes * + * freed. */ +- +-/* ++/* * + *_DESCR This routine is supplied to the programmer to free up all the * + * allocated memory required to build the huffman tree. The count * + * of the nodes freed is returned in the parameter 'nfreed'. The * +@@ -1417,11 +1429,10 @@ + * than one file per run, the program will not keep allocating new * + * memory without first deallocating all previous nodes associated * + * with the previous file decompression. * +- ++* * + *_HIST 16-AUG-89 Kris Becker USGS, Flagstaff Original Version * + *_END * + ****************************************************************************/ +- + { + int total_free = 0; + +@@ -1435,36 +1446,33 @@ + + int free_node(pnode,total_free) + /*************************************************************************** +-*_TITLE free_node - deallocates an allocated NODE pointer ++*_TITLE free_node - deallocates an allocated NODE pointer * + *_ARGS TYPE NAME I/O DESCRIPTION */ + NODE *pnode; /* I Pointer to node to free */ +- int total_free; /* I Total number of freed nodes */ +- +-/* ++ int total_free; /* I Total number of freed nodes */ ++/* * + *_DESCR free_node will check both right and left pointers of a node * + * and then free the current node using the free() C utility. * + * Note that all nodes attached to the node via right or left * + * pointers area also freed, so be sure that this is the desired * + * result when calling this routine. * +- ++* * + * This routine is supplied to allow successive calls to the * + * decmpinit routine. It will free up the memory allocated * + * by previous calls to the decmpinit routine. The call to free * +-* a previous huffman tree is: total = free_node(tree,(int) 0); * ++* a previous huffman tree is: total = free_node(tree,(int) 0); * + * This call must be done by the programmer application routine * + * and is not done by any of these routines. * + *_HIST 16-AUG-89 Kris Becker U.S.G.S Flagstaff Original Version */ + { + if (pnode == (NODE *) NULL) return(total_free); +- ++ + if (pnode->right != (NODE *) NULL) + total_free = free_node(pnode->right,total_free); + if (pnode->left != (NODE *) NULL) + total_free = free_node(pnode->left,total_free); +- ++ + free((char *) pnode); + return(total_free + 1); + } + +- +- +diff -ruN xv-3.10a/xcmap.c xv-3.10a-bugfixes/xcmap.c +--- xv-3.10a/xcmap.c 1995-01-03 13:14:52.000000000 -0800 ++++ xv-3.10a-bugfixes/xcmap.c 2005-03-20 15:51:59.000000000 -0800 +@@ -9,6 +9,9 @@ + + /* include files */ + #include <stdio.h> ++#ifdef __STDC__ ++# include <stdlib.h> /* exit(), abs() */ ++#endif + #include <sys/types.h> + #include <ctype.h> + +@@ -18,7 +21,7 @@ + #include <X11/cursorfont.h> + + #ifdef VMS +-#define index strchr ++# define index strchr + #endif + + typedef unsigned char byte; +@@ -75,50 +78,50 @@ + int i; + char *display, *geom; + XEvent event; +- ++ + cmd = argv[0]; + display = geom = NULL; +- +- ++ ++ + /*********************Options*********************/ +- ++ + for (i = 1; i < argc; i++) { + char *strind; +- ++ + if (!strncmp(argv[i],"-g", (size_t)2)) { /* geometry */ + i++; + geom = argv[i]; + continue; + } +- ++ + if (argv[i][0] == '=') { /* old-style geometry */ + geom = argv[i]; + continue; + } +- ++ + if (!strncmp(argv[i],"-d",(size_t) 2)) { /* display */ + i++; + display = argv[i]; + continue; + } +- ++ + strind = (char *) index(argv[i], ':'); /* old-style display */ + if(strind != NULL) { + display = argv[i]; + continue; + } +- ++ + Syntax(); + } +- +- ++ ++ + /*****************************************************/ +- ++ + /* Open up the display. */ +- ++ + if ( (theDisp=XOpenDisplay(display)) == NULL) + FatalError("can't open display"); +- ++ + theScreen = DefaultScreen(theDisp); + theCmap = DefaultColormap(theDisp, theScreen); + rootW = RootWindow(theDisp,theScreen); +@@ -126,9 +129,9 @@ + fcol = WhitePixel(theDisp,theScreen); + bcol = BlackPixel(theDisp,theScreen); + theVisual = DefaultVisual(theDisp,theScreen); +- ++ + dispcells = DisplayCells(theDisp, theScreen); +- ++ + if (dispcells>256) { + sprintf(tmpstr,"dispcells = %d. %s", + dispcells, "This program can only deal with <= 8-bit displays."); +@@ -140,27 +143,32 @@ + nxcells = nycells = 8; + else if (dispcells>4) + nxcells = nycells = 4; +- else ++ else if (dispcells>2) + nxcells = nycells = 2; +- ++ else ++ { ++ nxcells = 2; ++ nycells = 1; ++ } ++ + /**************** Create/Open X Resources ***************/ + if ((mfinfo = XLoadQueryFont(theDisp,FONT))==NULL) { + sprintf(tmpstr,"couldn't open '%s' font",FONT); + FatalError(tmpstr); + } +- ++ + mfont=mfinfo->fid; + XSetFont(theDisp,theGC,mfont); + XSetForeground(theDisp,theGC,fcol); + XSetBackground(theDisp,theGC,bcol); +- ++ + CreateMainWindow(cmd,geom,argc,argv); + Resize(WIDE,HIGH); +- +- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask ++ ++ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask + | StructureNotifyMask | ButtonPressMask); + XMapWindow(theDisp,mainW); +- ++ + /**************** Main loop *****************/ + while (1) { + XNextEvent(theDisp, &event); +@@ -177,41 +185,41 @@ + switch (event->type) { + case Expose: { + XExposeEvent *exp_event = (XExposeEvent *) event; +- +- if (exp_event->window==mainW) ++ ++ if (exp_event->window==mainW) + DrawWindow(exp_event->x,exp_event->y, + exp_event->width, exp_event->height); + } + break; +- ++ + case ButtonPress: { + XButtonEvent *but_event = (XButtonEvent *) event; +- +- if (but_event->window == mainW && but_event->button == Button1) ++ ++ if (but_event->window == mainW && but_event->button == Button1) + TrackMouse(but_event->x, but_event->y); + } + break; +- ++ + case KeyPress: { + XKeyEvent *key_event = (XKeyEvent *) event; + KeySym ks; + XComposeStatus status; +- ++ + XLookupString(key_event,tmpstr,128,&ks,&status); + if (tmpstr[0]=='q' || tmpstr[0]=='Q') Quit(); + } + break; +- ++ + case ConfigureNotify: { + XConfigureEvent *conf_event = (XConfigureEvent *) event; +- +- if (conf_event->window == mainW && ++ ++ if (conf_event->window == mainW && + (conf_event->width != WIDE || conf_event->height != HIGH)) + Resize(conf_event->width, conf_event->height); + } + break; +- +- ++ ++ + case CirculateNotify: + case MapNotify: + case DestroyNotify: +@@ -220,7 +228,7 @@ + case UnmapNotify: + case MappingNotify: + case ClientMessage: break; +- ++ + default: /* ignore unexpected events */ + break; + } /* end of switch */ +@@ -262,24 +270,31 @@ + XSizeHints hints; + int i,x,y; + unsigned int w,h; +- ++ + WIDE = HIGH = 256; /* default window size */ +- ++ + x=y=w=h=1; + i=XParseGeometry(geom,&x,&y,&w,&h); +- if (i&WidthValue) WIDE = (int) w; +- if (i&HeightValue) HIGH = (int) h; +- +- if (i&XValue || i&YValue) hints.flags = USPosition; +- else hints.flags = PPosition; +- +- hints.flags |= USSize; +- +- if (i&XValue && i&XNegative) +- x = XDisplayWidth(theDisp,theScreen)-WIDE-abs(x); +- if (i&YValue && i&YNegative) +- y = XDisplayHeight(theDisp,theScreen)-HIGH-abs(y); +- ++ if (i&WidthValue) ++ { ++ WIDE = (int) w; ++ hints.flags |= USSize; ++ } ++ if (i&HeightValue) ++ { ++ HIGH = (int) h; ++ hints.flags |= USSize; ++ } ++ ++ if (i&XValue || i&YValue) ++ { ++ if (i&XNegative) ++ x = XDisplayWidth(theDisp,theScreen)-WIDE-abs(x); ++ if (i&YNegative) ++ y = XDisplayHeight(theDisp,theScreen)-HIGH-abs(y); ++ hints.flags |= USPosition; ++ } ++ + hints.x=x; hints.y=y; + hints.width = WIDE; hints.height = HIGH; + hints.max_width = DisplayWidth(theDisp,theScreen); +@@ -288,22 +303,22 @@ + hints.min_height = 16; + hints.width_inc = hints.height_inc = 16; + hints.flags |= PMaxSize | PMinSize | PResizeInc; +- ++ + xswa.background_pixel = bcol; + xswa.border_pixel = fcol; + xswa.cursor = XCreateFontCursor (theDisp, XC_top_left_arrow); + xswamask = CWBackPixel | CWBorderPixel | CWCursor; +- ++ + mainW = XCreateWindow(theDisp,rootW,x,y,(unsigned int) WIDE, +- (unsigned int) HIGH, 2, 0, ++ (unsigned int) HIGH, 2, 0, + (unsigned int) CopyFromParent, + CopyFromParent, xswamask, &xswa); +- ++ + XSetStandardProperties(theDisp,mainW,"xcmap","xcmap",None, + argv,argc,&hints); +- ++ + if (!mainW) FatalError("Can't open main window"); +- ++ + } + + +@@ -312,11 +327,11 @@ + int x,y,w,h; + { + int i,j,x1,y1,x2,y2; +- ++ + x1 = x / cWIDE; y1 = y / cHIGH; /* (x1,y1) (x2,y2): bounding */ + x2 = ((x+w) + cWIDE - 1) / cWIDE; /* rect in cell coords */ + y2 = ((y+h) + cHIGH - 1) / cHIGH; +- ++ + for (i=y1; i<y2; i++) { + for (j=x1; j<x2; j++) { + XSetForeground(theDisp,theGC,(unsigned long) (i*nycells+j) ); +@@ -343,18 +358,18 @@ + { + /* called when there's a button press in the window. draws the pixel + value, and loops until button is released */ +- ++ + Window rootW,childW; + int rx,ry,x,y; + unsigned int mask; +- ++ + pvalup = 0; + DrawPixValue(mx,my); +- ++ + while (1) { + if (XQueryPointer(theDisp,mainW,&rootW,&childW,&rx,&ry,&x,&y,&mask)) { + if (!(mask & Button1Mask)) break; /* button released */ +- ++ + DrawPixValue(x,y); + } + } +@@ -367,10 +382,10 @@ + { + static unsigned long pix, lastpix; + static int pvaly; +- ++ + if (x<0) x=0; if (x>=WIDE) x=WIDE-1; + if (y<0) y=0; if (y>=HIGH) y=HIGH-1; +- ++ + if (!pvalup) { /* it's not up. make it so */ + if (y >= HIGH/2) pvaly = 0; else pvaly = HIGH - 12; + pvalup = 1; +@@ -378,30 +393,30 @@ + XClearArea(theDisp,mainW,0,pvaly, + (unsigned int) WIDE, (unsigned int) 13,True); + } +- ++ + x /= cWIDE; y /= cHIGH; +- ++ + pix = y * nxcells + x; +- ++ + if (pix != lastpix) { + XColor def; + char *sp; +- ++ + XSetForeground(theDisp,theGC,fcol); + lastpix = def.pixel = pix; + if (pix<dispcells) { + XQueryColor(theDisp, theCmap, &def); + sprintf(tmpstr, "Pix %3ld = ($%04x, $%04x, $%04x)", + pix, def.red, def.green, def.blue); +- +- /* make the hex uppercase */ +- for (sp=tmpstr+4; *sp; sp++) ++ ++ /* make the hex uppercase */ ++ for (sp=tmpstr+4; *sp; sp++) + if (islower(*sp)) *sp = toupper(*sp); + } + else { + sprintf(tmpstr, "Pix %3ld is out of legal range. ", pix); + } +- ++ + XDrawImageString(theDisp,mainW,theGC,5,pvaly+10,tmpstr, + (int) strlen(tmpstr)); + } +diff -ruN xv-3.10a/xv.c xv-3.10a-bugfixes/xv.c +--- xv-3.10a/xv.c 1995-01-19 10:08:43.000000000 -0800 ++++ xv-3.10a-bugfixes/xv.c 2005-03-20 22:25:22.000000000 -0800 +@@ -33,9 +33,9 @@ + + /* a mono-spaced font needed for the 'pixel value tracking' feature */ + #define MFONT1 "-misc-fixed-medium-r-normal-*-13-*" +-#define MFONT2 "6x13" ++#define MFONT2 "6x13" + #define MFONT3 "-*-courier-medium-r-*-*-12-*" +-#define MFONT4 "fixed" ++#define MFONT4 "fixed" + + + /* default positions for various windows */ +@@ -116,13 +116,13 @@ + + /* formerly local vars in main, made local to this module when + parseResources() and parseCmdLine() were split out of main() */ +- ++ + int imap, ctrlmap, gmap, browmap, cmtmap, clrroot, nopos, limit2x; + char *display, *whitestr, *blackstr, *histr, *lostr, + *infogeom, *fgstr, *bgstr, *ctrlgeom, *gamgeom, *browgeom, *tmpstr; + char *rootfgstr, *rootbgstr, *visualstr, *textgeom, *cmtgeom; + char *monofontname, *flistName; +-int curstype, stdinflag, browseMode, savenorm, preview, pscomp, preset, ++int curstype, stdinflag, browseMode, savenorm, preview, pscomp, preset, + rmodeset, gamset, cgamset, perfect, owncmap, rwcolor, stdcmap; + int nodecor; + double gamval, rgamval, ggamval, bgamval; +@@ -177,16 +177,16 @@ + + LocalCmap = browCmap = 0; + stdinflag = 0; +- autoclose = autoDelete = 0; ++ autoclose = autoDelete = 0; + cmapInGam = 0; + grabDelay = 0; + showzoomcursor = 0; + perfect = owncmap = stdcmap = rwcolor = 0; + + ignoreConfigs = 0; +- browPerfect = 1; ++ browPerfect = 1; + gamval = rgamval = ggamval = bgamval = 1.0; +- ++ + picType = -1; /* gets set once file is loaded */ + colorMapMode = CM_NORMAL; + haveStdCmap = STD_NONE; +@@ -230,11 +230,11 @@ + } + + /* init command-line options flags */ +- infogeom = DEFINFOGEOM; ctrlgeom = DEFCTRLGEOM; ++ infogeom = DEFINFOGEOM; ctrlgeom = DEFCTRLGEOM; + gamgeom = DEFGAMGEOM; browgeom = DEFBROWGEOM; + textgeom = DEFTEXTGEOM; cmtgeom = DEFCMTGEOM; + +- ncols = -1; mono = 0; ++ ncols = -1; mono = 0; + ninstall = 0; fixedaspect = 0; noFreeCols = nodecor = 0; + DEBUG = 0; bwidth = 2; + nolimits = useroot = clrroot = noqcheck = 0; +@@ -306,7 +306,7 @@ + /*****************************************************/ + /*** X Setup ***/ + /*****************************************************/ +- ++ + theScreen = DefaultScreen(theDisp); + theCmap = DefaultColormap(theDisp, theScreen); + rootW = RootWindow(theDisp,theScreen); +@@ -321,52 +321,66 @@ + rootDEEP = dispDEEP; + + /* things dependant on theVisual: +- * dispDEEP, theScreen, rootW, ncells, theCmap, theGC, ++ * dispDEEP, theScreen, rootW, ncells, theCmap, theGC, + * vrWIDE, dispWIDE, vrHIGH, dispHIGH, maxWIDE, maxHIGH + */ + + +- + /* if we *haven't* had a non-default visual specified, +- see if we have a TrueColor or DirectColor visual of 24 or 32 bits, ++ see if we have a TrueColor or DirectColor visual of 24 or 32 bits, + and if so, use that as the default visual (prefer TrueColor) */ + + if (!visualstr && !useroot) { ++ VisualID defvid; + XVisualInfo *vinfo, rvinfo; + int best, numvis; + long flags; + +- best = -1; ++ best = -1; + rvinfo.class = TrueColor; + rvinfo.screen = theScreen; +- flags = VisualClassMask | VisualScreenMask; +- ++ flags = VisualClassMask | VisualScreenMask; ++ defvid = XVisualIDFromVisual(DefaultVisual(theDisp, ++ DefaultScreen(theDisp))); ++ + vinfo = XGetVisualInfo(theDisp, flags, &rvinfo, &numvis); +- if (vinfo) { /* look for a TrueColor, 24-bit or more (pref 24) */ +- for (i=0, best = -1; i<numvis; i++) { ++ if (vinfo) { ++ /* Check list, use 'default', first 24-bit, or first >24-bit */ ++ for (i=0; i<numvis && best==-1; i++) { /* default? */ ++ if ((vinfo[i].visualid == defvid) && (vinfo[i].depth >= 24)) best=i; ++ } ++ for (i=0; i<numvis && best==-1; i++) { /* 24-bit ? */ + if (vinfo[i].depth == 24) best = i; +- else if (vinfo[i].depth>24 && best<0) best = i; ++ } ++ for (i=0; i<numvis && best==-1; i++) { /* >24-bit ? */ ++ if (vinfo[i].depth >= 24) best = i; + } + } + + if (best == -1) { /* look for a DirectColor, 24-bit or more (pref 24) */ + rvinfo.class = DirectColor; + if (vinfo) XFree((char *) vinfo); ++ + vinfo = XGetVisualInfo(theDisp, flags, &rvinfo, &numvis); + if (vinfo) { +- for (i=0, best = -1; i<numvis; i++) { ++ for (i=0; i<numvis && best==-1; i++) { /* default? */ ++ if ((vinfo[i].visualid == defvid) && (vinfo[i].depth >= 24)) best=i; ++ } ++ for (i=0; i<numvis && best==-1; i++) { /* 24-bit ? */ + if (vinfo[i].depth == 24) best = i; +- else if (vinfo[i].depth>24 && best<0) best = i; ++ } ++ for (i=0; i<numvis && best==-1; i++) { /* >24-bit ? */ ++ if (vinfo[i].depth >= 24) best = i; + } + } + } +- ++ + if (best>=0 && best<numvis) useOtherVisual(vinfo, best); + if (vinfo) XFree((char *) vinfo); + } + + +- ++ + if (visualstr && useroot) { + fprintf(stderr, "%s: %sUsing default visual.\n", + cmd, "Warning: Can't use specified visual on root. "); +@@ -401,11 +415,11 @@ + long vinfomask; + int numvis, best; + +- if (vclass >= 0) { ++ if (vclass >= 0) { + rvinfo.class = vclass; vinfomask = VisualClassMask; + } + else { rvinfo.visualid = vid; vinfomask = VisualIDMask; } +- ++ + rvinfo.screen = theScreen; + vinfomask |= VisualScreenMask; + +@@ -429,9 +443,9 @@ + /* make linear colormap for DirectColor visual */ + if (theVisual->class == DirectColor) makeDirectCmap(); + +- defaultVis = (XVisualIDFromVisual(theVisual) == ++ defaultVis = (XVisualIDFromVisual(theVisual) == + XVisualIDFromVisual(DefaultVisual(theDisp, DefaultScreen(theDisp)))); +- ++ + + /* turn GraphicsExposures OFF in the default GC */ + { +@@ -456,12 +470,12 @@ + Atom actual_type; + int actual_format; + unsigned long nitems, bytesafter; +- Window *newRoot = NULL; ++ byte *newRoot = NULL; /* byte instead of Window avoids type-pun warning */ + XWindowAttributes xwa; + if (XGetWindowProperty (theDisp, children[i], __SWM_VROOT, 0L, 1L, + False, XA_WINDOW, &actual_type, &actual_format, &nitems, + &bytesafter, (unsigned char **) &newRoot) == Success && newRoot) { +- vrootW = *newRoot; ++ vrootW = *(Window *)newRoot; + XGetWindowAttributes(theDisp, vrootW, &xwa); + vrWIDE = xwa.width; vrHIGH = xwa.height; + dispDEEP = xwa.depth; +@@ -492,7 +506,7 @@ + XColor fc, bc; + fc.red = fc.green = fc.blue = 0xffff; + bc.red = bc.green = bc.blue = 0x0000; +- ++ + XRecolorCursor(theDisp, zoom, &fc, &bc); + } + +@@ -541,7 +555,7 @@ + + + /* set up fg,bg colors */ +- fg = black; bg = white; ++ fg = black; bg = white; + if (fgstr && XParseColor(theDisp, theCmap, fgstr, &ecdef) && + xvAllocColor(theDisp, theCmap, &ecdef)) { + fg = ecdef.pixel; +@@ -590,7 +604,7 @@ + if (theVisual->class == StaticGray || theVisual->class == GrayScale) + mono = 1; + } +- ++ + + + iconPix = MakePix1(rootW, icon_bits, icon_width, icon_height); +@@ -598,27 +612,27 @@ + riconPix = MakePix1(rootW, runicon_bits, runicon_width, runicon_height); + riconmask= MakePix1(rootW, runiconm_bits, runiconm_width,runiconm_height); + +- if (!iconPix || !iconmask || !riconPix || !riconmask) ++ if (!iconPix || !iconmask || !riconPix || !riconmask) + FatalError("Unable to create icon pixmaps\n"); + +- gray50Tile = XCreatePixmapFromBitmapData(theDisp, rootW, ++ gray50Tile = XCreatePixmapFromBitmapData(theDisp, rootW, + (char *) cboard50_bits, +- cboard50_width, cboard50_height, ++ cboard50_width, cboard50_height, + infofg, infobg, dispDEEP); + if (!gray50Tile) FatalError("Unable to create gray50Tile bitmap\n"); + +- gray25Tile = XCreatePixmapFromBitmapData(theDisp, rootW, ++ gray25Tile = XCreatePixmapFromBitmapData(theDisp, rootW, + (char *) gray25_bits, +- gray25_width, gray25_height, ++ gray25_width, gray25_height, + infofg, infobg, dispDEEP); + if (!gray25Tile) FatalError("Unable to create gray25Tile bitmap\n"); + + + /* try to load fonts */ +- if ( (mfinfo = XLoadQueryFont(theDisp,FONT1))==NULL && +- (mfinfo = XLoadQueryFont(theDisp,FONT2))==NULL && +- (mfinfo = XLoadQueryFont(theDisp,FONT3))==NULL && +- (mfinfo = XLoadQueryFont(theDisp,FONT4))==NULL && ++ if ( (mfinfo = XLoadQueryFont(theDisp,FONT1))==NULL && ++ (mfinfo = XLoadQueryFont(theDisp,FONT2))==NULL && ++ (mfinfo = XLoadQueryFont(theDisp,FONT3))==NULL && ++ (mfinfo = XLoadQueryFont(theDisp,FONT4))==NULL && + (mfinfo = XLoadQueryFont(theDisp,FONT5))==NULL) { + sprintf(str, + "couldn't open the following fonts:\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s", +@@ -632,14 +646,14 @@ + + if (monofontname) { + monofinfo = XLoadQueryFont(theDisp, monofontname); +- if (!monofinfo) fprintf(stderr,"xv: unable to load font '%s'\n", ++ if (!monofinfo) fprintf(stderr,"xv: unable to load font '%s'\n", + monofontname); +- } ++ } + + if (!monofinfo) { +- if ((monofinfo = XLoadQueryFont(theDisp,MFONT1))==NULL && +- (monofinfo = XLoadQueryFont(theDisp,MFONT2))==NULL && +- (monofinfo = XLoadQueryFont(theDisp,MFONT3))==NULL && ++ if ((monofinfo = XLoadQueryFont(theDisp,MFONT1))==NULL && ++ (monofinfo = XLoadQueryFont(theDisp,MFONT2))==NULL && ++ (monofinfo = XLoadQueryFont(theDisp,MFONT3))==NULL && + (monofinfo = XLoadQueryFont(theDisp,MFONT4))==NULL) { + sprintf(str,"couldn't open %s fonts:\n\t%s\n\t%s\n\t%s\n\t%s", + "any of the following", +@@ -649,28 +663,28 @@ + } + + monofont=monofinfo->fid; +- + +- +- ++ ++ ++ + /* if ncols wasn't set, set it to 2^dispDEEP, unless dispDEEP=1, in which + case ncols = 0; (ncols = max number of colors allocated. on 1-bit + displays, no colors are allocated */ +- ++ + if (ncols == -1) { + if (dispDEEP>1) ncols = 1 << ((dispDEEP>8) ? 8 : dispDEEP); + else ncols = 0; + } + else if (ncols>256) ncols = 256; /* so program doesn't blow up */ +- +- ++ ++ + GenerateFSGamma(); /* has to be done before 'OpenBrowse()' is called */ +- +- +- ++ ++ ++ + /* no filenames. build one-name (stdio) list (if stdinflag) */ + if (numnames==0) { +- if (stdinflag) { ++ if (stdinflag) { + /* have to malloc namelist[0] so we can free it in deleteFromList() */ + namelist[0] = (char *) malloc(strlen(STDINSTR) + 1); + if (!namelist[0]) FatalError("unable to to build namelist[0]"); +@@ -679,16 +693,16 @@ + } + else namelist[0] = NULL; + } +- ++ + if (numnames) makeDispNames(); +- +- +- if (viewonly || autoquit) { +- imap = ctrlmap = gmap = browmap = cmtmap = 0; ++ ++ ++ if (viewonly || autoquit) { ++ imap = ctrlmap = gmap = browmap = cmtmap = 0; + novbrowse = 1; + } +- +- ++ ++ + /* create the info box window */ + CreateInfo(infogeom); + XSelectInput(theDisp, infoW, ExposureMask | ButtonPressMask | KeyPressMask +@@ -698,12 +712,12 @@ + RedrawInfo(0,0,1000,1000); /* explicit draw if mapped */ + XFlush(theDisp); + } +- +- ++ ++ + /* create the control box window */ + CreateCtrl(ctrlgeom); + epicMode = EM_RAW; SetEpicMode(); +- ++ + XSelectInput(theDisp, ctrlW, ExposureMask | ButtonPressMask | KeyPressMask + | StructureNotifyMask); + if (ctrlmap < 0) { /* map iconified */ +@@ -719,22 +733,22 @@ + RedrawCtrl(0,0,1000,1000); /* explicit draw if mapped */ + XFlush(theDisp); + } +- ++ + fixDispNames(); + ChangedCtrlList(); +- ++ + /* disable root modes if using non-default visual */ + if (!defaultVis) { + for (i=RMB_ROOT; i<RMB_MAX; i++) rootMB.dim[i] = 1; + } +- +- ++ ++ + /* create the directory window */ + CreateDirW(NULL); + XSelectInput(theDisp, dirW, ExposureMask | ButtonPressMask | KeyPressMask); + browseCB.val = browseMode; + savenormCB.val = savenorm; +- ++ + /* create the gamma window */ + CreateGam(gamgeom, (gamset) ? gamval : -1.0, + (cgamset) ? rgamval : -1.0, +@@ -744,60 +758,60 @@ + XSelectInput(theDisp, gamW, ExposureMask | ButtonPressMask | KeyPressMask + | StructureNotifyMask + | (cmapInGam ? ColormapChangeMask : 0)); +- ++ + GamBox(gmap); /* map it (or not) */ +- +- +- ++ ++ ++ + stdnfcols = 0; /* so we don't try to free any if we don't create any */ +- ++ + if (!novbrowse) { + MakeBrowCmap(); + /* create the visual browser window */ + CreateBrowse(browgeom, fgstr, bgstr, histr, lostr); +- ++ + if (browmap) OpenBrowse(); + } + else windowMB.dim[WMB_BROWSE] = 1; /* disable visual schnauzer */ +- +- ++ ++ + CreateTextWins(textgeom, cmtgeom); + if (cmtmap) OpenCommentText(); +- +- ++ ++ + /* create the ps window */ + CreatePSD(NULL); + XSetTransientForHint(theDisp, psW, dirW); + encapsCB.val = preview; + pscompCB.val = pscomp; +- +- ++ ++ + #ifdef HAVE_JPEG + CreateJPEGW(); + XSetTransientForHint(theDisp, jpegW, dirW); + #endif +- ++ + #ifdef HAVE_TIFF + CreateTIFFW(); + XSetTransientForHint(theDisp, tiffW, dirW); + #endif +- +- ++ ++ + LoadFishCursors(); + SetCursors(-1); +- +- ++ ++ + /* if we're not on a colormapped display, turn off rwcolor */ + if (!CMAPVIS(theVisual)) { + if (rwcolor) fprintf(stderr, "xv: not a colormapped display. %s\n", + "'rwcolor' turned off."); +- ++ + allocMode = AM_READONLY; + dispMB.flags[DMB_COLRW] = 0; /* de-'check' */ + dispMB.dim[DMB_COLRW] = 1; /* and dim it */ + } +- +- ++ ++ + if (force24) { + Set824Menus(PIC24); + conv24MB.flags[CONV24_LOCK] = 1; +@@ -812,15 +826,15 @@ + Set824Menus(PIC8); /* default mode */ + picType = PIC8; + } +- +- +- ++ ++ ++ + /* make std colormap, maybe */ + ChangeCmapMode(colorMapMode, 0, 0); + + +- +- ++ ++ + /* Do The Thing... */ + mainLoop(); + Quit(0); +@@ -832,12 +846,12 @@ + /*****************************************************/ + static void makeDirectCmap() + { +- int i, j, cmaplen, numgot; ++ int i, cmaplen, numgot; + byte origgot[256]; + XColor c; + u_long rmask, gmask, bmask; + int rshift, gshift, bshift; +- ++ + + rmask = theVisual->red_mask; + gmask = theVisual->green_mask; +@@ -849,22 +863,22 @@ + + if (rshift<0) rmask = rmask << (-rshift); + else rmask = rmask >> rshift; +- ++ + if (gshift<0) gmask = gmask << (-gshift); + else gmask = gmask >> gshift; +- ++ + if (bshift<0) bmask = bmask << (-bshift); + else bmask = bmask >> bshift; + + + cmaplen = theVisual->map_entries; + if (cmaplen>256) cmaplen=256; +- ++ + + /* try to alloc a 'cmaplen' long grayscale colormap. May not get all + entries for whatever reason. Build table 'directConv[]' that + maps range [0..(cmaplen-1)] into set of colors we did get */ +- ++ + for (i=0; i<256; i++) { origgot[i] = 0; directConv[i] = 0; } + + for (i=numgot=0; i<cmaplen; i++) { +@@ -882,9 +896,9 @@ + } + } + +- ++ + if (numgot == 0) FatalError("Got no entries in DirectColor cmap!\n"); +- ++ + /* directConv may or may not have holes in it. */ + for (i=0; i<cmaplen; i++) { + if (!origgot[i]) { +@@ -892,10 +906,10 @@ + numbak = numfwd = 0; + while ((i - numbak) >= 0 && !origgot[i-numbak]) numbak++; + while ((i + numfwd) < cmaplen && !origgot[i+numfwd]) numfwd++; +- ++ + if (i-numbak<0 || !origgot[i-numbak]) numbak = 999; + if (i+numfwd>=cmaplen || !origgot[i+numfwd]) numfwd = 999; +- ++ + if (numbak<numfwd) directConv[i] = directConv[i-numbak]; + else if (numfwd<999) directConv[i] = directConv[i+numfwd]; + else FatalError("DirectColor cmap: can't happen!"); +@@ -926,14 +940,14 @@ + { + if (!vinfo || best<0) return; + +- if (vinfo[best].visualid == ++ if (vinfo[best].visualid == + XVisualIDFromVisual(DefaultVisual(theDisp, theScreen))) return; + + theVisual = vinfo[best].visual; + + if (DEBUG) { + fprintf(stderr,"%s: using %s visual (0x%0x), depth = %d, screen = %d\n", +- cmd, ++ cmd, + (vinfo[best].class==StaticGray) ? "StaticGray" : + (vinfo[best].class==StaticColor) ? "StaticColor" : + (vinfo[best].class==TrueColor) ? "TrueColor" : +@@ -947,41 +961,41 @@ + (int) vinfo[best].red_mask, (int) vinfo[best].green_mask, + (int) vinfo[best].blue_mask, vinfo[best].bits_per_rgb); + } +- ++ + dispDEEP = vinfo[best].depth; + theScreen = vinfo[best].screen; + rootW = RootWindow(theDisp, theScreen); + ncells = vinfo[best].colormap_size; + theCmap = XCreateColormap(theDisp, rootW, theVisual, AllocNone); +- ++ + { + /* create a temporary window using this visual so we can + create a GC for this visual */ +- +- Window win; ++ ++ Window win; + XSetWindowAttributes xswa; + XGCValues xgcv; + unsigned long xswamask; +- ++ + XFlush(theDisp); + XSync(theDisp, False); +- ++ + xswa.background_pixel = 0; + xswa.border_pixel = 1; + xswa.colormap = theCmap; + xswamask = CWBackPixel | CWBorderPixel | CWColormap; +- ++ + win = XCreateWindow(theDisp, rootW, 0, 0, 100, 100, 2, (int) dispDEEP, + InputOutput, theVisual, xswamask, &xswa); +- ++ + XFlush(theDisp); + XSync(theDisp, False); +- ++ + theGC = XCreateGC(theDisp, win, 0L, &xgcv); +- ++ + XDestroyWindow(theDisp, win); + } +- ++ + vrWIDE = dispWIDE = DisplayWidth(theDisp,theScreen); + vrHIGH = dispHIGH = DisplayHeight(theDisp,theScreen); + maxWIDE = dispWIDE; maxHIGH = dispHIGH; +@@ -1037,8 +1051,8 @@ + fprintf(stderr,"%s: unable to parse 'aspect' resource\n",cmd); + else defaspect = (float) n / (float) d; + } +- +- if (rd_flag("2xlimit")) limit2x = def_int; ++ ++ if (rd_flag("2xlimit")) limit2x = def_int; + if (rd_flag("auto4x3")) auto4x3 = def_int; + if (rd_flag("autoClose")) autoclose = def_int; + if (rd_flag("autoCrop")) autocrop = def_int; +@@ -1073,7 +1087,7 @@ + + if (rd_str ("expand")) { + if (index(def_str, ':')) { +- if (sscanf(def_str, "%lf:%lf", &hexpand, &vexpand)!=2) ++ if (sscanf(def_str, "%lf:%lf", &hexpand, &vexpand)!=2) + { hexpand = vexpand = 1.0; } + } + else hexpand = vexpand = atof(def_str); +@@ -1108,7 +1122,7 @@ + if (rd_flag("ownCmap")) owncmap = def_int; + if (rd_flag("perfect")) perfect = def_int; + if (rd_flag("popupKludge")) winCtrPosKludge = def_int; +- if (rd_str ("print")) strncpy(printCmd, def_str, ++ if (rd_str ("print")) strncpy(printCmd, def_str, + (size_t) PRINTCMDLEN); + if (rd_flag("pscompress")) pscomp = def_int; + if (rd_flag("pspreview")) preview = def_int; +@@ -1146,7 +1160,7 @@ + + not_in_first_half = 0; + +- if (argv[i][0] != '-' && argv[i][0] != '+') { ++ if (argv[i][0] != '-' && argv[i][0] != '+') { + /* a file name. put it in list */ + + if (!nostat) { +@@ -1186,54 +1200,54 @@ + + else if (!argcmp(argv[i],"-best24",3,0,&pm)) /* -best */ + conv24 = CONV24_BEST; +- ++ + else if (!argcmp(argv[i],"-bg",3,0,&pm)) /* bg color */ + { if (++i<argc) bgstr = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-black",3,0,&pm)) /* black color */ + { if (++i<argc) blackstr = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-bw",3,0,&pm)) /* border width */ + { if (++i<argc) bwidth=atoi(argv[i]); } +- ++ + else if (!argcmp(argv[i],"-cecmap",4,1,&cmapInGam)); /* cmapInGam */ +- ++ + else if (!argcmp(argv[i],"-cegeometry",4,0,&pm)) /* gammageom */ + { if (++i<argc) gamgeom = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-cemap",4,1,&gmap)); /* gmap */ +- ++ + else if (!argcmp(argv[i],"-cgamma",4,0,&pm)) { /* color gamma */ + if (i+3<argc) { +- rgamval = atof(argv[++i]); +- ggamval = atof(argv[++i]); +- bgamval = atof(argv[++i]); ++ rgamval = atof(argv[++i]); ++ ggamval = atof(argv[++i]); ++ bgamval = atof(argv[++i]); + } + cgamset++; + } +- ++ + else if (!argcmp(argv[i],"-cgeometry",4,0,&pm)) /* ctrlgeom */ + { if (++i<argc) ctrlgeom = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-clear",4,1,&clrroot)); /* clear */ + else if (!argcmp(argv[i],"-close",4,1,&autoclose)); /* close */ + else if (!argcmp(argv[i],"-cmap", 3,1,&ctrlmap)); /* ctrlmap */ + + else if (!argcmp(argv[i],"-cmtgeometry",5,0,&pm)) /* comment geom */ + { if (++i<argc) cmtgeom = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-cmtmap",5,1,&cmtmap)); /* map cmt window */ +- ++ + else if (!argcmp(argv[i],"-crop",3,0,&pm)) { /* crop */ + if (i+4<argc) { +- acropX = atoi(argv[++i]); +- acropY = atoi(argv[++i]); +- acropW = atoi(argv[++i]); +- acropH = atoi(argv[++i]); ++ acropX = atoi(argv[++i]); ++ acropY = atoi(argv[++i]); ++ acropW = atoi(argv[++i]); ++ acropH = atoi(argv[++i]); + } + acrop++; + } +- ++ + else if (!argcmp(argv[i],"-cursor",3,0,&pm)) /* cursor */ + { if (++i<argc) curstype = atoi(argv[i]); } + +@@ -1265,7 +1279,7 @@ + else if (!argcmp(argv[i],"-expand",2,0,&pm)) { /* expand factor */ + if (++i<argc) { + if (index(argv[i], ':')) { +- if (sscanf(argv[i], "%lf:%lf", &hexpand, &vexpand)!=2) ++ if (sscanf(argv[i], "%lf:%lf", &hexpand, &vexpand)!=2) + { hexpand = vexpand = 1.0; } + } + else hexpand = vexpand = atof(argv[i]); +@@ -1274,47 +1288,47 @@ + + else if (!argcmp(argv[i],"-fg",3,0,&pm)) /* fg color */ + { if (++i<argc) fgstr = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-fixed",3,1,&fixedaspect)); /* fix asp. ratio */ +- ++ + else if (!argcmp(argv[i],"-flist",3,0,&pm)) /* file list */ + { if (++i<argc) flistName = argv[i]; } + + else if (!argcmp(argv[i],"-gamma",3,0,&pm)) /* gamma */ + { if (++i<argc) gamval = atof(argv[i]); gamset++; } +- ++ + else if (!argcmp(argv[i],"-geometry",3,0,&pm)) /* geometry */ + { if (++i<argc) maingeom = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-grabdelay",3,0,&pm)) /* grabDelay */ + { if (++i<argc) grabDelay = atoi(argv[i]); } +- ++ + else if (!argcmp(argv[i],"-gsdev",4,0,&pm)) /* gsDevice */ + { if (++i<argc) gsDev = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-gsgeom",4,0,&pm)) /* gsGeometry */ + { if (++i<argc) gsGeomStr = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-gsres",4,0,&pm)) /* gsResolution */ + { if (++i<argc) gsRes=abs(atoi(argv[i])); } +- ++ + else if (!argcmp(argv[i],"-hflip",3,1,&autohflip)); /* hflip */ + + else if (!argcmp(argv[i],"-hi",3,0,&pm)) /* highlight */ + { if (++i<argc) histr = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-hist", 4,1,&autohisteq)); /* hist eq */ + + else if (!argcmp(argv[i],"-hsv", 3,1,&hsvmode)); /* hsvmode */ + + else if (!argcmp(argv[i],"-icgeometry",4,0,&pm)) /* icon geometry */ + { if (++i<argc) icongeom = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-iconic",4,1,&startIconic)); /* iconic */ +- ++ + else if (!argcmp(argv[i],"-igeometry",3,0,&pm)) /* infogeom */ + { if (++i<argc) infogeom = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-imap", 3,1,&imap)); /* imap */ + else if (!argcmp(argv[i],"-lbrowse", 3,1,&browseMode)); /* browse mode */ + +@@ -1323,8 +1337,8 @@ + + else if (!argcmp(argv[i],"-loadclear",4,1,&clearonload)); /* clearonload */ + +- +- else not_in_first_half = 1; ++ ++ else not_in_first_half = 1; + + + +@@ -1339,18 +1353,18 @@ + if (!argcmp(argv[i],"-max",4,1,&automax)); /* auto maximize */ + else if (!argcmp(argv[i],"-maxpect",5,1,&pm)) /* auto maximize */ + { automax=pm; fixedaspect=pm; } +- ++ + else if (!argcmp(argv[i],"-mfn",3,0,&pm)) /* mono font name */ + { if (++i<argc) monofontname = argv[i]; } + + else if (!argcmp(argv[i],"-mono",3,1,&mono)); /* mono */ +- ++ + else if (!argcmp(argv[i],"-name",3,0,&pm)) /* name */ + { if (++i<argc) winTitle = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-ncols",3,0,&pm)) /* ncols */ + { if (++i<argc) ncols=abs(atoi(argv[i])); } +- ++ + else if (!argcmp(argv[i],"-ninstall", 3,1,&ninstall)); /* inst cmaps?*/ + else if (!argcmp(argv[i],"-nodecor", 4,1,&nodecor)); + else if (!argcmp(argv[i],"-nofreecols",4,1,&noFreeCols)); +@@ -1367,61 +1381,61 @@ + + else if (!argcmp(argv[i],"-preset",3,0,&pm)) /* preset */ + { if (++i<argc) preset=abs(atoi(argv[i])); } +- ++ + else if (!argcmp(argv[i],"-quick24",5,0,&pm)) /* quick 24-to-8 conv */ + conv24 = CONV24_FAST; +- ++ + else if (!argcmp(argv[i],"-quit", 2,1,&autoquit)); /* auto-quit */ + else if (!argcmp(argv[i],"-random", 4,1,&randomShow)); /* random */ + else if (!argcmp(argv[i],"-raw", 4,1,&autoraw)); /* force raw */ + + else if (!argcmp(argv[i],"-rbg",3,0,&pm)) /* root background color */ + { if (++i<argc) rootbgstr = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-rfg",3,0,&pm)) /* root foreground color */ + { if (++i<argc) rootfgstr = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-rgb",4,1,&pm)) /* rgb mode */ + hsvmode = !pm; +- ++ + else if (!argcmp(argv[i],"-RM",3,0,&pm)) /* auto-delete */ + autoDelete = 1; +- ++ + else if (!argcmp(argv[i],"-rmode",3,0,&pm)) /* root pattern */ +- { if (++i<argc) rootMode = atoi(argv[i]); ++ { if (++i<argc) rootMode = atoi(argv[i]); + useroot++; rmodeset++; + } +- ++ + else if (!argcmp(argv[i],"-root",4,1,&useroot)); /* use root window */ +- ++ + else if (!argcmp(argv[i],"-rotate",4,0,&pm)) /* rotate */ + { if (++i<argc) autorotate = atoi(argv[i]); } +- ++ + else if (!argcmp(argv[i],"-rv",3,1,&revvideo)); /* reverse video */ + else if (!argcmp(argv[i],"-rw",3,1,&rwcolor)); /* use r/w color */ + + else if (!argcmp(argv[i],"-slow24",3,0,&pm)) /* slow 24->-8 conv.*/ + conv24 = CONV24_SLOW; +- ++ + else if (!argcmp(argv[i],"-smooth",3,1,&autosmooth)); /* autosmooth */ + else if (!argcmp(argv[i],"-stdcmap",3,1,&stdcmap)); /* use stdcmap */ + + else if (!argcmp(argv[i],"-tgeometry",2,0,&pm)) /* textview geom */ + { if (++i<argc) textgeom = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-vflip",3,1,&autovflip)); /* vflip */ + else if (!argcmp(argv[i],"-viewonly",4,1,&viewonly)); /* viewonly */ + + else if (!argcmp(argv[i],"-visual",4,0,&pm)) /* visual */ + { if (++i<argc) visualstr = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-vsdisable",4,1,&novbrowse)); /* disable sch? */ +- ++ + else if (!argcmp(argv[i],"-vsgeometry",4,0,&pm)) /* visSchnauzer geom */ + { if (++i<argc) browgeom = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-vsmap",4,1,&browmap)); /* visSchnauzer map */ +- ++ + else if (!argcmp(argv[i],"-vsperfect",3,1,&browPerfect)); /* vs perf. */ + + else if (!argcmp(argv[i],"-wait",3,0,&pm)) { /* secs betwn pics */ +@@ -1430,12 +1444,12 @@ + if (waitsec<0) waitsec = 0; + } + } +- ++ + else if (!argcmp(argv[i],"-white",3,0,&pm)) /* white color */ + { if (++i<argc) whitestr = argv[i]; } +- ++ + else if (!argcmp(argv[i],"-wloop",3,1,&waitloop)); /* waitloop */ +- ++ + else if (not_in_first_half) cmdSyntax(); + } + +@@ -1462,7 +1476,7 @@ + } + + +- if (flistName) ++ if (flistName) + add_filelist_to_namelist(flistName, namelist, &numnames, MAXNAMES); + + RANGE(curstype,0,254); +@@ -1475,16 +1489,16 @@ + + /* if using root, generally gotta map ctrl window, 'cause there won't be + any way to ask for it. (no kbd or mouse events from rootW) */ +- if (useroot && !autoquit) ctrlmap = -1; ++ if (useroot && !autoquit) ctrlmap = -1; ++ + +- + if (abs(autorotate) != 0 && abs(autorotate) != 90 && + abs(autorotate) != 180 && abs(autorotate) != 270) { + fprintf(stderr,"Invalid auto rotation value (%d) ignored.\n", autorotate); + fprintf(stderr," (Valid values: 0, +-90, +-180, +-270)\n"); + + autorotate = 0; +- } ++ } + + + if (grabDelay < 0 || grabDelay > 15) { +@@ -1498,7 +1512,7 @@ + fprintf(stderr," (Valid values: 1, 2, 3, 4)\n"); + + preset = 0; +- } ++ } + + if (waitsec < 0) noFreeCols = 0; /* disallow nfc if not doing slideshow */ + if (noFreeCols && perfect) { perfect = 0; owncmap = 1; } +@@ -1512,13 +1526,13 @@ + + defaultCmapMode = colorMapMode; /* default mode for 8-bit images */ + +- if (nopos) { ++ if (nopos) { + maingeom = infogeom = ctrlgeom = gamgeom = browgeom = textgeom = NULL; + cmtgeom = NULL; + } + + /* if -root and -maxp, disallow 'integer' tiling modes */ +- if (useroot && fixedaspect && automax && !rmodeset && ++ if (useroot && fixedaspect && automax && !rmodeset && + (rootMode == RM_TILE || rootMode == RM_IMIRROR)) + rootMode = RM_CSOLID; + } +@@ -1656,7 +1670,7 @@ + /***********************************/ + static void rmodeSyntax() + { +- fprintf(stderr,"%s: unknown root mode '%d'. Valid modes are:\n", ++ fprintf(stderr,"%s: unknown root mode '%d'. Valid modes are:\n", + cmd, rootMode); + fprintf(stderr,"\t0: tiling\n"); + fprintf(stderr,"\t1: integer tiling\n"); +@@ -1679,13 +1693,11 @@ + int minlen, plusallowed; + int *plusminus; + { +- /* does a string compare between a1 and a2. To return '0', a1 and a2 ++ /* does a string compare between a1 and a2. To return '0', a1 and a2 + must match to the length of a2, and that length has to + be at least 'minlen'. Otherwise, return non-zero. plusminus set to '1' + if '-option', '0' if '+option' */ + +- int i; +- + if ((strlen(a1) < (size_t) minlen) || (strlen(a2) < (size_t) minlen)) + return 1; + if (strlen(a1) > strlen(a2)) return 1; +@@ -1694,7 +1706,7 @@ + + if (a1[0]=='-' || (plusallowed && a1[0]=='+')) { + /* only set if we match */ +- *plusminus = (a1[0] == '-'); ++ *plusminus = (a1[0] == '-'); + return 0; + } + +@@ -1721,8 +1733,7 @@ + int oldCXOFF, oldCYOFF, oldCWIDE, oldCHIGH, wascropped; + char *tmp; + char *fullname, /* full name of the original file */ +- filename[512], /* full name of file to load (could be /tmp/xxx)*/ +- globnm[512]; /* globbed version of fullname of orig file */ ++ filename[512]; /* full name of file to load (could be /tmp/xxx)*/ + + xvbzero((char *) &pinfo, sizeof(PICINFO)); + +@@ -1748,7 +1759,7 @@ + + /* if we're not loading next or prev page in a multi-page doc, kill off + page files */ +- if (strlen(pageBaseName) && filenum!=OP_PAGEDN && filenum!=OP_PAGEUP) ++ if (strlen(pageBaseName) && filenum!=OP_PAGEDN && filenum!=OP_PAGEUP) + killpage = 1; + + +@@ -1799,7 +1810,7 @@ + } + + else if (filenum == PADDED) { +- /* need fullfname (used for window/icon name), ++ /* need fullfname (used for window/icon name), + basefname(compute from fullfname) */ + + i = LoadPad(&pinfo, fullfname); +@@ -1864,7 +1875,7 @@ + + + /* chop off trailing ".Z", ".z", or ".gz" from displayed basefname, if any */ +- if (strlen(basefname) > (size_t) 2 && ++ if (strlen(basefname) > (size_t) 2 && + strcmp(basefname+strlen(basefname)-2,".Z")==0) + basefname[strlen(basefname)-2]='\0'; + else { +@@ -1872,7 +1883,7 @@ + if (strlen(basefname)>2 && strcmp(basefname+strlen(basefname)-2,".Z")==0) + basefname[strlen(basefname)-2]='\0'; + +- else if (strlen(basefname)>3 && ++ else if (strlen(basefname)>3 && + strcmp(basefname+strlen(basefname)-3,".gz")==0) + basefname[strlen(basefname)-3]='\0'; + #endif /* GUNZIP */ +@@ -1881,7 +1892,7 @@ + + if (filenum == LOADPIC && ISPIPE(fullname[0])) { + /* if we're reading from a pipe, 'filename' will have the /tmp/xvXXXXXX +- filename, and we can skip a lot of stuff: (such as prepending ++ filename, and we can skip a lot of stuff: (such as prepending + 'initdir' to relative paths, dealing with reading from stdin, etc. */ + + /* at this point, fullname = "! do some commands", +@@ -1891,11 +1902,11 @@ + + else { /* NOT reading from a PIPE */ + +- /* if fullname doesn't start with a '/' (ie, it's a relative path), +- (and it's not LOADPIC and it's not the special case '<stdin>') ++ /* if fullname doesn't start with a '/' (ie, it's a relative path), ++ (and it's not LOADPIC and it's not the special case '<stdin>') + then we need to prepend a directory name to it: +- +- prepend 'initdir', ++ ++ prepend 'initdir', + if we have a searchdir (ie, we have multiple places to look), + see if such a file exists (via fopen()), + if it does, we're done. +@@ -1904,7 +1915,7 @@ + if it does, we're done. + if it doesn't, remove all prepended directories, and fall through + to error code below. */ +- ++ + if (filenum!=LOADPIC && fullname[0]!='/' && strcmp(fullname,STDINSTR)!=0) { + char *tmp1; + +@@ -1954,26 +1965,30 @@ + } + } + } +- ++ + strcpy(filename, fullname); +- +- ++ ++ + /* if the file is STDIN, write it out to a temp file */ + + if (strcmp(filename,STDINSTR)==0) { +- FILE *fp; ++ FILE *fp = NULL; + +-#ifndef VMS ++#ifndef VMS + sprintf(filename,"%s/xvXXXXXX",tmpdir); + #else /* it is VMS */ + sprintf(filename, "[]xvXXXXXX"); + #endif ++ ++#ifdef USE_MKSTEMP ++ fp = fdopen(mkstemp(filename), "w"); ++#else + mktemp(filename); ++ fp = fopen(filename, "w"); ++#endif ++ if (!fp) FatalError("openPic(): can't write temporary file"); + + clearerr(stdin); +- fp = fopen(filename,"w"); +- if (!fp) FatalError("openPic(): can't write temporary file"); +- + while ( (i=getchar()) != EOF) putc(i,fp); + fclose(fp); + +@@ -2003,7 +2018,7 @@ + ) { + + filetype = ReadFileType(tmpname); /* and try again */ +- ++ + /* if we made a /tmp file (from stdin, etc.) won't need it any more */ + if (strcmp(fullname,filename)!=0) unlink(filename); + +@@ -2084,7 +2099,7 @@ + /**************/ + /* SUCCESS!!! */ + /**************/ +- ++ + + GOTIMAGE: + /* successfully read this picture. No failures from here on out +@@ -2097,7 +2112,7 @@ + if (conv24MB.flags[CONV24_LOCK]) { /* locked */ + if (pinfo.type==PIC24 && picType==PIC8) { /* 24 -> 8 bit */ + byte *pic8; +- pic8 = Conv24to8(pinfo.pic, pinfo.w, pinfo.h, ncols, ++ pic8 = Conv24to8(pinfo.pic, pinfo.w, pinfo.h, ncols, + pinfo.r, pinfo.g, pinfo.b); + free(pinfo.pic); + pinfo.pic = pic8; +@@ -2108,7 +2123,7 @@ + + else if (pinfo.type!=PIC24 && picType==PIC24) { /* 8 -> 24 bit */ + byte *pic24; +- pic24 = Conv8to24(pinfo.pic, pinfo.w, pinfo.h, ++ pic24 = Conv8to24(pinfo.pic, pinfo.w, pinfo.h, + pinfo.r, pinfo.g, pinfo.b); + free(pinfo.pic); + pinfo.pic = pic24; +@@ -2144,7 +2159,7 @@ + + if (mainW && !useroot) { + /* avoid generating excess configure events while we resize the window */ +- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask ++ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask + | StructureNotifyMask + | ButtonPressMask | KeyReleaseMask + | EnterWindowMask | LeaveWindowMask); +@@ -2162,7 +2177,7 @@ + pHIGH = pinfo.h; + if (pinfo.frmType >=0) SetDirSaveMode(F_FORMAT, pinfo.frmType); + if (pinfo.colType >=0) SetDirSaveMode(F_COLORS, pinfo.colType); +- ++ + SetISTR(ISTR_FORMAT, pinfo.fullInfo); + strcpy(formatStr, pinfo.shrtInfo); + picComments = pinfo.comment; +@@ -2195,11 +2210,11 @@ + + + SetISTR(ISTR_INFO,formatStr); +- ++ + SetInfoMode(INF_PART); +- SetISTR(ISTR_FILENAME, +- (filenum==DFLTPIC || filenum==GRABBED || frompipe) +- ? "<none>" : basefname); ++ SetISTR(ISTR_FILENAME, "%s", ++ (filenum==DFLTPIC || filenum==GRABBED || frompipe) ? ++ "<none>" : basefname); + + SetISTR(ISTR_RES,"%d x %d",pWIDE,pHIGH); + SetISTR(ISTR_COLOR, ""); +@@ -2219,7 +2234,7 @@ + + + /* handle various 'auto-whatever' command line options +- Note that if 'frompoll' is set, things that have to do with ++ Note that if 'frompoll' is set, things that have to do with + setting the expansion factor are skipped, as we'll want it to + display in the (already-existing) window at the same size */ + +@@ -2254,7 +2269,7 @@ + w = eWIDE; h = (w*3) / 4; + eWIDE = w; eHIGH = h; + } +- ++ + + if (eWIDE != cWIDE || eHIGH != cHIGH) epic = (byte *) NULL; + +@@ -2306,14 +2321,14 @@ + aspWIDE = eWIDE; aspHIGH = eHIGH; /* aspect-corrected eWIDE,eHIGH */ + + if (hexpand < 0.0) eWIDE=(int)(aspWIDE / -hexpand); /* neg: reciprocal */ +- else eWIDE=(int)(aspWIDE * hexpand); ++ else eWIDE=(int)(aspWIDE * hexpand); + if (vexpand < 0.0) eHIGH=(int)(aspHIGH / -vexpand); /* neg: reciprocal */ +- else eHIGH=(int)(aspHIGH * vexpand); ++ else eHIGH=(int)(aspHIGH * vexpand); + + if (maingeom) { + /* deal with geometry spec. Note, they shouldn't have given us + *both* an expansion factor and a geomsize. The geomsize wins out */ +- ++ + int i,x,y,gewide,gehigh; u_int w,h; + + gewide = eWIDE; gehigh = eHIGH; +@@ -2321,11 +2336,11 @@ + + if (i&WidthValue) gewide = (int) w; + if (i&HeightValue) gehigh = (int) h; +- ++ + /* handle case where the pinheads only specified width *or * height */ + if (( i&WidthValue && ~i&HeightValue) || + (~i&WidthValue && i&HeightValue)) { +- ++ + if (i&WidthValue) { gehigh = (aspHIGH * gewide) / pWIDE; } + else { gewide = (aspWIDE * gehigh) / pHIGH; } + } +@@ -2391,7 +2406,7 @@ + + /* if we're using an integer tiled root mode, truncate eWIDE/eHIGH to + be an integer divisor of the display size */ +- ++ + if (useroot && (rootMode == RM_TILE || rootMode == RM_IMIRROR)) { + /* make picture size a divisor of the rootW size. round down */ + i = (dispWIDE + eWIDE-1) / eWIDE; eWIDE = (dispWIDE + i-1) / i; +@@ -2419,7 +2434,7 @@ + + /* 'dithering' makes no sense in 24-bit mode */ + if (picType == PIC24 && epicMode == EM_DITH) epicMode = EM_RAW; +- ++ + SetEpicMode(); + } /* end of !frompoll */ + +@@ -2450,7 +2465,7 @@ + if (useroot) mainW = vrootW; + if (eWIDE != cWIDE || eHIGH != cHIGH) epic = (byte *) NULL; + +- NewPicGetColors(autonorm, autohisteq); ++ NewPicGetColors(autonorm, autohisteq); + + GenerateEpic(eWIDE, eHIGH); /* want to dither *after* color allocs */ + CreateXImage(); +@@ -2474,7 +2489,7 @@ + SetISTR(ISTR_INFO,"%s %s %s", formatStr, + (picType==PIC8) ? "8-bit mode." : "24-bit mode.", + tmp); +- ++ + SetInfoMode(INF_FULL); + if (freename) free(fullname); + +@@ -2499,16 +2514,16 @@ + + return 1; + +- ++ + FAILED: + SetCursors(-1); + KillPageFiles(pinfo.pagebname, pinfo.numpages); + +- if (fullname && strcmp(fullname,filename)!=0) ++ if (fullname && strcmp(fullname,filename)!=0) + unlink(filename); /* kill /tmp file */ + if (freename) free(fullname); + +- if (!fromint && !polling && filenum>=0 && filenum<nList.nstr) ++ if (!fromint && !polling && filenum>=0 && filenum<nList.nstr) + deleteFromList(filenum); + + if (polling) sleep(1); +@@ -2546,7 +2561,7 @@ + fp = xv_fopen(fname, "r"); + if (!fp) return RFT_ERROR; + +- n = fread(magicno, (size_t) 1, (size_t) 30, fp); ++ n = fread(magicno, (size_t) 1, (size_t) 30, fp); + fclose(fp); + + if (n<30) return RFT_UNKNOWN; /* files less than 30 bytes long... */ +@@ -2559,7 +2574,7 @@ + else if (strncmp((char *) magicno,"VIEW", (size_t) 4)==0 || + strncmp((char *) magicno,"WEIV", (size_t) 4)==0) rv = RFT_PM; + +- else if (magicno[0] == 'P' && magicno[1]>='1' && ++ else if (magicno[0] == 'P' && magicno[1]>='1' && + magicno[1]<='6') rv = RFT_PBM; + + /* note: have to check XPM before XBM, as first 2 chars are the same */ +@@ -2586,7 +2601,7 @@ + + else if (magicno[0]==0x0a && magicno[1] <= 5) rv = RFT_PCX; + +- else if (strncmp((char *) magicno, "FORM", (size_t) 4)==0 && ++ else if (strncmp((char *) magicno, "FORM", (size_t) 4)==0 && + strncmp((char *) magicno+8, "ILBM", (size_t) 4)==0) rv = RFT_IFF; + + else if (magicno[0]==0 && magicno[1]==0 && +@@ -2597,12 +2612,12 @@ + else if (magicno[4]==0x00 && magicno[5]==0x00 && + magicno[6]==0x00 && magicno[7]==0x07) rv = RFT_XWD; + +- else if (strncmp((char *) magicno,"SIMPLE ", (size_t) 8)==0 && ++ else if (strncmp((char *) magicno,"SIMPLE ", (size_t) 8)==0 && + magicno[29] == 'T') rv = RFT_FITS; +- ++ + + #ifdef HAVE_JPEG +- else if (magicno[0]==0xff && magicno[1]==0xd8 && ++ else if (magicno[0]==0xff && magicno[1]==0xd8 && + magicno[2]==0xff) rv = RFT_JFIF; + #endif + +@@ -2668,7 +2683,7 @@ + #endif + + #ifdef HAVE_TIFF +- case RFT_TIFF: rv = LoadTIFF (fname, pinfo); break; ++ case RFT_TIFF: rv = LoadTIFF (fname, pinfo, quick); break; + #endif + + #ifdef HAVE_PDS +@@ -2703,7 +2718,7 @@ + to what it was. necessary because uncompress doesn't handle files + that don't end with '.Z' */ + +- if (strlen(name) >= (size_t) 2 && ++ if (strlen(name) >= (size_t) 2 && + strcmp(name + strlen(name)-2,".Z")!=0 && + strcmp(name + strlen(name)-2,".z")!=0) { + strcpy(namez, name); +@@ -2721,34 +2736,42 @@ + #endif /* not VMS and not GUNZIP */ + + +- + #ifndef VMS + sprintf(uncompname, "%s/xvuXXXXXX", tmpdir); ++#else ++ strcpy(uncompname, "[]xvuXXXXXX"); ++#endif ++ ++#ifdef USE_MKSTEMP ++ close(mkstemp(uncompname)); ++#else + mktemp(uncompname); ++#endif ++ ++#ifndef VMS + sprintf(buf,"%s -c %s >%s", UNCOMPRESS, fname, uncompname); + #else /* it IS VMS */ +- strcpy(uncompname, "[]xvuXXXXXX"); +- mktemp(uncompname); +-# ifdef GUNZIP ++# ifdef GUNZIP + sprintf(buf,"%s %s %s", UNCOMPRESS, fname, uncompname); +-# else ++# else + sprintf(buf,"%s %s", UNCOMPRESS, fname); +-# endif ++# endif + #endif + + SetISTR(ISTR_INFO, "Uncompressing '%s'...", BaseName(fname)); + #ifndef VMS +- if (system(buf)) { ++ if (system(buf)) + #else +- if (!system(buf)) { ++ if (!system(buf)) + #endif ++ { + SetISTR(ISTR_INFO, "Unable to uncompress '%s'.", BaseName(fname)); + Warning(); + return 0; + } + +-#ifndef VMS +- /* if we renamed the file to end with a .Z for the sake of 'uncompress', ++#ifndef VMS ++ /* if we renamed the file to end with a .Z for the sake of 'uncompress', + rename it back to what it once was... */ + + if (strlen(namez)) { +@@ -2769,7 +2792,7 @@ + } + */ + #endif /* not VMS */ +- ++ + return 1; + } + +@@ -2798,11 +2821,11 @@ + { + int i; + +- /* some stuff that necessary whenever running an algorithm or ++ /* some stuff that necessary whenever running an algorithm or + installing a new 'pic' (or switching 824 modes) */ + + numcols = 0; /* gets set by SortColormap: set to 0 for PIC24 images */ +- for (i=0; i<256; i++) cols[i]=infobg; ++ for (i=0; i<256; i++) cols[i]=infobg; + + if (picType == PIC8) { + byte trans[256]; +@@ -2811,18 +2834,18 @@ + } + + if (picType == PIC8) { +- /* see if image is a b/w bitmap. ++ /* see if image is a b/w bitmap. + If so, use '-black' and '-white' colors */ + if (numcols == 2) { + if ((rMap[0] == gMap[0] && rMap[0] == bMap[0] && rMap[0] == 255) && + (rMap[1] == gMap[1] && rMap[1] == bMap[1] && rMap[1] == 0)) { + /* 0=wht, 1=blk */ +- rMap[0] = (whtRGB>>16)&0xff; +- gMap[0] = (whtRGB>>8)&0xff; ++ rMap[0] = (whtRGB>>16)&0xff; ++ gMap[0] = (whtRGB>>8)&0xff; + bMap[0] = whtRGB&0xff; + + rMap[1] = (blkRGB>>16)&0xff; +- gMap[1] = (blkRGB>>8)&0xff; ++ gMap[1] = (blkRGB>>8)&0xff; + bMap[1] = blkRGB&0xff; + } + +@@ -2852,10 +2875,10 @@ + } + + /* save the desired RGB colormap (before dicking with it) */ +- for (i=0; i<numcols; i++) { +- rorg[i] = rcmap[i] = rMap[i]; +- gorg[i] = gcmap[i] = gMap[i]; +- borg[i] = bcmap[i] = bMap[i]; ++ for (i=0; i<numcols; i++) { ++ rorg[i] = rcmap[i] = rMap[i]; ++ gorg[i] = gcmap[i] = gMap[i]; ++ borg[i] = bcmap[i] = bMap[i]; + } + } + +@@ -2888,7 +2911,7 @@ + { + /* cmd is something like: "! bggen 100 0 0" + * +- * runs command (with "> /tmp/xv******" appended). ++ * runs command (with "> /tmp/xv******" appended). + * returns "/tmp/xv******" in fname + * returns '0' if everything's cool, '1' on error + */ +@@ -2899,8 +2922,12 @@ + if (!cmd || (strlen(cmd) < (size_t) 2)) return 1; + + sprintf(tmpname,"%s/xvXXXXXX", tmpdir); ++#ifdef USE_MKSTEMP ++ close(mkstemp(tmpname)); ++#else + mktemp(tmpname); +- if (tmpname[0] == '\0') { /* mktemp() blew up */ ++#endif ++ if (tmpname[0] == '\0') { /* mktemp() or mkstemp() blew up */ + sprintf(str,"Unable to create temporary filename."); + ErrPopUp(str, "\nHow unlikely!"); + return 1; +@@ -2946,7 +2973,7 @@ + while (numnames>0) { + if (openPic(0)) return; /* success */ + else { +- if (polling && !i) ++ if (polling && !i) + fprintf(stderr,"%s: POLLING: Waiting for file '%s' \n\tto %s\n", + cmd, namelist[0], "be created, or whatever..."); + i = 1; +@@ -2970,11 +2997,11 @@ + int i; + + if (curname>=0) i = curname+1; +- else if (nList.selected >= 0 && nList.selected < numnames) ++ else if (nList.selected >= 0 && nList.selected < numnames) + i = nList.selected; + else i = 0; + +- ++ + while (i<numnames && !openPic(i)); + if (i<numnames) return; /* success */ + +@@ -2989,7 +3016,7 @@ + + if (!randomShow) { + if (curname>=0) i = curname+1; +- else if (nList.selected >= 0 && nList.selected < numnames) ++ else if (nList.selected >= 0 && nList.selected < numnames) + i = nList.selected; + else i = 0; + +@@ -3015,7 +3042,7 @@ + if (!randomShow) { + + if (curname>=0) i = curname+1; +- else if (nList.selected >= 0 && nList.selected < numnames) ++ else if (nList.selected >= 0 && nList.selected < numnames) + i = nList.selected; + else i = 0; + +@@ -3044,7 +3071,7 @@ + int i; + + if (curname>0) i = curname-1; +- else if (nList.selected>0 && nList.selected < numnames) ++ else if (nList.selected>0 && nList.selected < numnames) + i = nList.selected - 1; + else i = numnames-1; + +@@ -3089,7 +3116,7 @@ + loadList = (byte *) malloc((size_t) listLen); + for (k=0; k<listLen; k++) loadList[k] = 0; + } +- ++ + if (left_to_load <= 0) { /* we've loaded all the pics */ + for (k=0; k<listLen; k++) loadList[k] = 0; /* clear flags */ + left_to_load = listLen; +@@ -3097,7 +3124,7 @@ + } + + for (k=abs(random()) % listLen; loadList[k]; k = (k+1) % listLen); +- ++ + left_to_load--; + loadList[k] = TRUE; + +@@ -3107,13 +3134,13 @@ + /****************/ + static void mainLoop() + { +- /* search forward until we manage to display a picture, +- then call EventLoop. EventLoop will eventually return ++ /* search forward until we manage to display a picture, ++ then call EventLoop. EventLoop will eventually return + NEXTPIC, PREVPIC, NEXTQUIT, QUIT, or, if >= 0, a filenum to GOTO */ + + int i; + +- /* if curname<0 (there is no 'current' file), 'Next' means view the ++ /* if curname<0 (there is no 'current' file), 'Next' means view the + selected file (or the 0th file, if no selection either), and 'Prev' means + view the one right before the selected file */ + +@@ -3133,7 +3160,7 @@ + } + + else if (i==PREVPIC) { +- if (curname>0 || (curname<0 && nList.selected>0)) ++ if (curname>0 || (curname<0 && nList.selected>0)) + openPrevPic(); + } + +@@ -3151,7 +3178,7 @@ + + else if (i==THISNEXT) { /* open current sel, 'next' until success */ + int j; +- j = nList.selected; ++ j = nList.selected; + if (j<0) j = 0; + while (j<numnames && !openPic(j)); + if (!pic) openPic(DFLTPIC); +@@ -3219,12 +3246,12 @@ + hints.width = eWIDE; hints.height = eHIGH; + hints.max_width = maxWIDE; hints.max_height = maxHIGH; + hints.flags |= USSize | PMaxSize; +- ++ + xswa.bit_gravity = StaticGravity; + xswa.background_pixel = bg; + xswa.border_pixel = fg; + xswa.colormap = theCmap; +- ++ + xswa.backing_store = WhenMapped; + + /* NOTE: I've turned 'backing-store' off on the image window, as some +@@ -3233,9 +3260,9 @@ + improvement anyway (for the image window), unless you're on a slow + network. In any event, I'm not *turning off* backing store, I'm + just not explicitly turning it *on*. If your X server is set up +- that windows, by default, have backing-store turned on, then the ++ that windows, by default, have backing-store turned on, then the + image window will, too */ +- ++ + xswamask = CWBackPixel | CWBorderPixel | CWColormap /* | CWBackingStore */; + if (!clearonload) xswamask |= CWBitGravity; + +@@ -3251,11 +3278,11 @@ + + SetWindowPos(&xwa); + hints.flags = PSize | PMaxSize; +- } ++ } + + else { + mainW = XCreateWindow(theDisp,rootW,x,y, (u_int) eWIDE, (u_int) eHIGH, +- (u_int) bwidth, (int) dispDEEP, InputOutput, ++ (u_int) bwidth, (int) dispDEEP, InputOutput, + theVisual, xswamask, &xswa); + if (!mainW) FatalError("can't create window!"); + +@@ -3274,8 +3301,8 @@ + xwmh.input = True; + xwmh.flags = InputHint; + +- xwmh.icon_pixmap = iconPix; +- xwmh.icon_mask = iconmask; ++ xwmh.icon_pixmap = iconPix; ++ xwmh.icon_mask = iconmask; + xwmh.flags |= (IconPixmapHint | IconMaskHint); + + +@@ -3302,7 +3329,7 @@ + XSetClassHint(theDisp, mainW, &classh); + + +- if (nodecor) { /* turn of image window decorations (in MWM) */ ++ if (nodecor) { /* turn of image window decorations (in MWM) */ + Atom mwm_wm_hints; + struct s_mwmhints { + long flags; +@@ -3311,7 +3338,7 @@ + u_long input_mode; + long status; + } mwmhints; +- ++ + mwm_wm_hints = XInternAtom(theDisp, "_MOTIF_WM_HINTS", False); + if (mwm_wm_hints != None) { + xvbzero((char *) &mwmhints, sizeof(mwmhints)); +@@ -3319,13 +3346,13 @@ + mwmhints.decorations = 4; + + XChangeProperty(theDisp, mainW, mwm_wm_hints, mwm_wm_hints, 32, +- PropModeReplace, (byte *) &mwmhints, +- (int) (sizeof(mwmhints))/4); ++ PropModeReplace, (byte *) &mwmhints, ++ (int) (sizeof(mwmhints))/4); + XSync(theDisp, False); + } + } + +- ++ + firstTime = 0; + } + +@@ -3366,8 +3393,8 @@ + int *w, *h; + { + /* computes new values of eWIDE and eHIGH which will have aspect ratio +- 'normaspect'. If 'grow' it will preserve aspect by enlarging, +- otherwise, it will shrink to preserve aspect ratio. ++ 'normaspect'. If 'grow' it will preserve aspect by enlarging, ++ otherwise, it will shrink to preserve aspect ratio. + Returns these values in 'w' and 'h' */ + + float xr,yr,curaspect,a,exp; +@@ -3380,14 +3407,14 @@ + curaspect = xr / yr; + + /* if too narrow & shrink, shrink height. too wide and grow, grow height */ +- if ((curaspect < normaspect && !grow) || ++ if ((curaspect < normaspect && !grow) || + (curaspect > normaspect && grow)) { /* modify height */ + exp = curaspect / normaspect; + *h = (int) (eHIGH * exp + .5); + } + + /* if too narrow & grow, grow width. too wide and shrink, shrink width */ +- if ((curaspect < normaspect && grow) || ++ if ((curaspect < normaspect && grow) || + (curaspect > normaspect && !grow)) { /* modify width */ + exp = normaspect / curaspect; + *w = (int) (eWIDE * exp + .5); +@@ -3423,22 +3450,22 @@ + suffix = namelist[0]; + prelen = 0; /* length of prefix to be removed */ + n = i = 0; /* shut up pesky compiler warnings */ +- ++ + done = 0; + while (!done) { + suffix = (char *) index(suffix,'/'); /* find next '/' in file name */ + if (!suffix) break; +- ++ + suffix++; /* go past it */ + n = suffix - namelist[0]; + for (i=1; i<numnames; i++) { + if (strncmp(namelist[0], namelist[i], (size_t) n)!=0) { done=1; break; } + } +- ++ + if (!done) prelen = n; + } +- +- for (i=0; i<numnames; i++) ++ ++ for (i=0; i<numnames; i++) + dispnames[i] = namelist[i] + prelen; + } + +@@ -3447,20 +3474,20 @@ + static void fixDispNames() + { + /* fix dispnames array so that names don't go off right edge */ +- ++ + int i,j; + char *tmp; +- ++ + for (i=j=0; i<numnames; i++) { + char *dname; +- ++ + dname = dispnames[i]; + if (StringWidth(dname) > (nList.w-10-16)) { /* have to trunc. */ + tmp = dname; + while (1) { + tmp = (char *) index(tmp,'/'); /* find next '/' in filename */ + if (!tmp) { tmp = dname; break; } +- ++ + tmp++; /* move to char following the '/' */ + if (StringWidth(tmp) <= (nList.w-10-16)) { /* is cool now */ + j++; break; +@@ -3484,9 +3511,9 @@ + + name = GetDirFName(); + GetDirPath(cwd); +- ++ + AddFNameToCtrlList(cwd, name); +- ++ + if (select) { + nList.selected = numnames-1; + curname = numnames - 1; +@@ -3501,32 +3528,32 @@ + char *fpath, *fname; + { + /* stick given path/name into 'namelist'. Doesn't redraw list */ +- +- char *fullname, *dname; ++ ++ char *fullname; + char cwd[MAXPATHLEN], globnm[MAXPATHLEN+100]; + int i; +- ++ + if (!fpath) fpath = ""; /* bulletproofing... */ +- if (!fname) fname = ""; +- ++ if (!fname) fname = ""; ++ + if (numnames == MAXNAMES) return; /* full up */ +- ++ + /* handle globbing */ + if (fname[0] == '~') { + strcpy(globnm, fname); + Globify(globnm); + fname = globnm; + } +- ++ + if (fname[0] != '/') { /* prepend path */ + strcpy(cwd, fpath); /* copy it to a modifiable place */ +- ++ + /* make sure fpath has a trailing '/' char */ + if (strlen(cwd)==0 || cwd[strlen(cwd)-1]!='/') strcat(cwd, "/"); +- ++ + fullname = (char *) malloc(strlen(cwd) + strlen(fname) + 2); + if (!fullname) FatalError("couldn't alloc name in AddFNameToCtrlList()\n"); +- ++ + sprintf(fullname, "%s%s", cwd, fname); + } + else { /* copy name to fullname */ +@@ -3534,15 +3561,15 @@ + if (!fullname) FatalError("couldn't alloc name in AddFNameToCtrlList()\n"); + strcpy(fullname, fname); + } +- +- ++ ++ + /* see if this name is a duplicate. Don't add it if it is. */ + for (i=0; i<numnames; i++) + if (strcmp(fullname, namelist[i]) == 0) { + free(fullname); + return; + } +- ++ + namelist[numnames] = fullname; + numnames++; + makeDispNames(); +@@ -3578,7 +3605,7 @@ + /* called to enable/disable the Prev/Next buttons whenever curname and/or + numnames and/or nList.selected change */ + +- /* if curname<0 (there is no 'current' file), 'Next' means view the ++ /* if curname<0 (there is no 'current' file), 'Next' means view the + selected file (or the 0th file, if no selection either), and 'Prev' means + view the one right before the selected file */ + +@@ -3591,15 +3618,15 @@ + BTSetActive(&but[BPREV], (curname>0)); + } + } +- ++ + + /***********************************/ + int DeleteCmd() + { + /* 'delete' button was pressed. Pop up a dialog box to determine + what should be deleted, then do it. +- returns '1' if THE CURRENTLY VIEWED entry was deleted from the list, +- in which case the 'selected' filename on the ctrl list is now ++ returns '1' if THE CURRENTLY VIEWED entry was deleted from the list, ++ in which case the 'selected' filename on the ctrl list is now + different, and should be auto-loaded, or something */ + + static char *bnames[] = { "\004Disk File", "\nList Entry", "\033Cancel" }; +@@ -3616,9 +3643,9 @@ + "'Disk File' deletes file associated with selection."); + + del = PopUp(str, bnames, 3); +- ++ + if (del == 2) return 0; /* cancel */ +- ++ + if (del == 0) { /* 'Disk File' */ + char *name; + if (namelist[delnum][0] != '/') { /* prepend 'initdir' */ +@@ -3669,13 +3696,13 @@ + + if (delnum != numnames-1) { + /* snip out of namelist and dispnames lists */ +- xvbcopy((char *) &namelist[delnum+1], (char *) &namelist[delnum], ++ xvbcopy((char *) &namelist[delnum+1], (char *) &namelist[delnum], + (numnames - delnum - 1) * sizeof(namelist[0])); + +- xvbcopy((char *) &dispnames[delnum+1], (char *) &dispnames[delnum], ++ xvbcopy((char *) &dispnames[delnum+1], (char *) &dispnames[delnum], + (numnames - delnum - 1) * sizeof(dispnames[0])); + } +- ++ + numnames--; + if (numnames==0) BTSetActive(&but[BDELETE],0); + windowMB.dim[WMB_TEXTVIEW] = (numnames==0); +@@ -3686,7 +3713,7 @@ + if (nList.selected >= numnames) nList.selected = numnames-1; + if (nList.selected < 0) nList.selected = 0; + +- SCSetRange(&nList.scrl, 0, numnames - nList.nlines, ++ SCSetRange(&nList.scrl, 0, numnames - nList.nlines, + nList.scrl.val, nList.nlines-1); + ScrollToCurrent(&nList); + DrawCtrlNumFiles(); +@@ -3753,7 +3780,7 @@ + if (useroot && resetroot) ClearRoot(); + + if (mainW == (Window) NULL || useroot) { /* window not visible */ +- useroot = 0; ++ useroot = 0; + + if (haveoldinfo) { /* just remap mainW and resize it */ + XWMHints xwmh; +@@ -3771,8 +3798,8 @@ + xwmh.input = True; + xwmh.flags = InputHint; + +- xwmh.icon_pixmap = iconPix; +- xwmh.icon_mask = iconmask; ++ xwmh.icon_pixmap = iconPix; ++ xwmh.icon_mask = iconmask; + xwmh.flags |= ( IconPixmapHint | IconMaskHint) ; + + xwmh.flags |= StateHint; +@@ -3787,7 +3814,7 @@ + else { /* first time. need to create mainW */ + mainW = (Window) NULL; + createMainWindow(maingeom, fnam); +- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask ++ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask + | StructureNotifyMask | ButtonPressMask + | KeyReleaseMask | ColormapChangeMask + | EnterWindowMask | LeaveWindowMask ); +@@ -3802,7 +3829,7 @@ + + else { /* mainW already visible */ + createMainWindow(maingeom, fnam); +- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask ++ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask + | StructureNotifyMask | ButtonPressMask + | KeyReleaseMask | ColormapChangeMask + | EnterWindowMask | LeaveWindowMask ); +@@ -3845,13 +3872,13 @@ + if (LocalCmap) regen=1; + + /* this reallocs the colors */ +- if (colorMapMode==CM_PERFECT || colorMapMode==CM_OWNCMAP) ++ if (colorMapMode==CM_PERFECT || colorMapMode==CM_OWNCMAP) + ChangeCmapMode(CM_NORMAL, 0, 0); +- +- ++ ++ + XUnmapWindow(theDisp, mainW); + mainW = vrootW; +- ++ + if (!ctrlUp) { /* make sure ctrl is up when going to 'root' mode */ + XWMHints xwmh; + xwmh.input = True; +@@ -3861,7 +3888,7 @@ + CtrlBox(1); + } + } +- ++ + useroot = 1; + rootMode = dispMode - RMB_ROOT; + ew = eWIDE; eh = eHIGH; +@@ -3877,7 +3904,7 @@ + GenerateEpic(ew, eh); + CreateXImage(); + } +- else if (regen) CreateXImage(); ++ else if (regen) CreateXImage(); + + KillOldRootInfo(); + MakeRootPic(); +@@ -3954,7 +3981,7 @@ + if (rd_str_cl(name, "", 0)) { /* sets def_str */ + if (sscanf(def_str, "%d", &def_int) == 1) return 1; + else { +- fprintf(stderr, "%s: couldn't read integer value for %s resource\n", ++ fprintf(stderr, "%s: couldn't read integer value for %s resource\n", + cmd, name); + return 0; + } +@@ -3976,14 +4003,14 @@ + char *name; + { + /* returns '1' if successful. result in def_int */ +- ++ + char buf[256]; + + if (rd_str_cl(name, "", 0)) { /* sets def_str */ + strcpy(buf, def_str); + lower_str(buf); + +- def_int = (strcmp(buf, "on")==0) || ++ def_int = (strcmp(buf, "on")==0) || + (strcmp(buf, "1")==0) || + (strcmp(buf, "true")==0) || + (strcmp(buf, "yes")==0); +@@ -3992,12 +4019,12 @@ + + else return 0; + } +- ++ + + + + static int xrm_initted = 0; +- ++ + /***********************************/ + int rd_str_cl (name_str, class_str, reinit) + char *name_str; +@@ -4044,14 +4071,14 @@ + byte *data; + + i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0), +- resAtom, 0L, 1L, False, +- XA_STRING, &actType, &actFormat, &nitems, &nleft, ++ resAtom, 0L, 1L, False, ++ XA_STRING, &actType, &actFormat, &nitems, &nleft, + (unsigned char **) &data); + if (i==Success && actType==XA_STRING && actFormat==8) { + if (nitems>0 && data) XFree(data); +- i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0), resAtom, 0L, ++ i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0), resAtom, 0L, + (long) ((nleft+4+3)/4), +- False, XA_STRING, &actType, &actFormat, ++ False, XA_STRING, &actType, &actFormat, + &nitems, &nleft, (unsigned char **) &data); + if (i==Success && actType==XA_STRING && actFormat==8 && data) { + def_resource = XrmGetStringDatabase((char *) data); +@@ -4064,8 +4091,8 @@ + + + if (!gotit) { +- xrm_str = XResourceManagerString(theDisp); +- ++ xrm_str = XResourceManagerString(theDisp); ++ + if (xrm_str) { + def_resource = XrmGetStringDatabase(xrm_str); + if (DEBUG) fprintf(stderr,"rd_str_cl: Using RESOURCE_MANAGER prop.\n"); +@@ -4073,7 +4100,7 @@ + else { /* no RESOURCE_MANAGER prop. read from 'likely' file */ + char foo[256], *homedir, *xenviron; + XrmDatabase res1; +- ++ + #ifdef VMS + strcpy(foo, "SYS$LOGIN:DECW$XDEFAULTS.DAT"); + #else +@@ -4081,33 +4108,33 @@ + if (!homedir) homedir = "."; + sprintf(foo,"%s/.Xdefaults", homedir); + #endif +- ++ + def_resource = XrmGetFileDatabase(foo); +- ++ + if (DEBUG) { + fprintf(stderr,"rd_str_cl: No RESOURCE_MANAGER prop.\n"); + fprintf(stderr,"rd_str_cl: Using file '%s' (%s) ", + foo, (def_resource) ? "success" : "failure"); + } +- +- ++ ++ + /* merge file pointed to by XENVIRONMENT */ + xenviron = (char *) getenv("XENVIRONMENT"); + if (xenviron) { + res1 = XrmGetFileDatabase(xenviron); +- ++ + if (DEBUG) { + fprintf(stderr,"merging XENVIRONMENT='%s' (%s) ", + xenviron, (res1) ? "success" : "failure"); + } +- ++ + if (res1) { /* merge databases */ + if (!def_resource) def_resource = res1; + else XrmMergeDatabases(res1, &def_resource); + } + } +- +- ++ ++ + if (DEBUG) fprintf(stderr,"\n\n"); + } + } +@@ -4120,13 +4147,13 @@ + strcpy (q_name, PROGNAME); + strcat (q_name, "."); + strcat (q_name, name_str); +- ++ + strcpy (q_class, "Program"); + strcat (q_class, "."); + strcat (q_class, class_str); + + (void) XrmGetResource(def_resource, q_name, q_class, &type, &result); +- ++ + def_str = result.addr; + if (def_str) return (1); + else return (0); +diff -ruN xv-3.10a/xv.h xv-3.10a-bugfixes/xv.h +--- xv-3.10a/xv.h 1995-01-23 12:22:23.000000000 -0800 ++++ xv-3.10a-bugfixes/xv.h 2005-04-10 09:37:18.000000000 -0700 +@@ -1,6 +1,6 @@ + /* + * xv.h - header file for xv, but you probably guessed as much +- * ++ * + * Author: John Bradley (bradley@cis.upenn.edu) + */ + +@@ -8,8 +8,14 @@ + #include "config.h" + + +-#define REVDATE "Version 3.10a Rev: 12/29/94" +-#define VERSTR "3.10a" ++/* xv 3.10a: 19941229 */ ++/* PNG patch 1.2d: 19960731 */ ++/* GRR orig jumbo fixes patch: 20000213 */ ++/* GRR orig jumbo enhancements patch: 20000220 */ ++/* GRR 1st public jumbo F+E patches: 20040531 */ ++/* GRR 2nd public jumbo F+E patches: 20050410 */ ++#define REVDATE "version 3.10a-jumboFix of 20050410" ++#define VERSTR "3.10a-20050410" + + /* + * uncomment the following, and modify for your site, but only if you've +@@ -62,15 +68,27 @@ + #endif + + +-#ifdef LINUX ++/* at least on Linux, the following file (1) includes sys/types.h and ++ * (2) defines __USE_BSD (which was not defined before here), so __linux__ ++ * block is now moved after this #include */ ++#include <X11/Xos.h> /* need type declarations immediately */ ++ ++ ++#ifdef __linux__ + # ifndef _LINUX_LIMITS_H + # include <linux/limits.h> + # endif ++# define USLEEP ++ /* want only one or the other defined, not both: */ ++# if !defined(BSDTYPES) && !defined(__USE_BSD) ++# define BSDTYPES ++# endif ++# if defined(BSDTYPES) && defined(__USE_BSD) ++# undef BSDTYPES ++# endif + #endif + + +-#include <X11/Xos.h> /* need type declarations immediately */ +- + /*********************************************************/ + + +@@ -115,17 +133,21 @@ + #ifndef VMS + # include <errno.h> + extern int errno; /* SHOULD be in errno.h, but often isn't */ +-# ifndef __NetBSD__ ++# if !defined(__NetBSD__) && !(defined(__linux__) && defined(__USE_BSD)) + extern char *sys_errlist[]; /* this too... */ + # endif + #endif + + + /* not everyone has the strerror() function, or so I'm told */ +-#ifndef VMS +-# define ERRSTR(x) sys_errlist[x] +-#else ++#ifdef VMS + # define ERRSTR(x) strerror(x, vaxc$errno) ++#else ++# if defined(__BEOS__) || defined(__linux__) /* or all modern/glibc systems? */ ++# define ERRSTR(x) strerror(x) ++# else ++# define ERRSTR(x) sys_errlist[x] ++# endif + #endif + + +@@ -159,7 +181,9 @@ + !defined(bsd43) && \ + !defined(aux) && \ + !defined(__bsdi__) && \ +- !defined(sequent) ++ !defined(sequent) && \ ++ !defined(__FreeBSD__) && \ ++ !defined(__OpenBSD__) + + # if defined(hp300) || defined(hp800) || defined(NeXT) + # include <sys/malloc.h> /* it's in 'sys' on HPs and NeXT */ +@@ -205,6 +229,10 @@ + # include <limits.h> + # endif + ++# ifdef __BEOS__ ++# include <socket.h> ++# endif ++ + /*** for select() call ***/ + # ifdef __hpux + # define XV_FDTYPE (int *) +@@ -259,7 +287,7 @@ + * make them if missing, along with a few fictitious ones + * Cameron Simpson (cameron@cse.unsw.edu.au) + */ +- ++ + #ifndef S_ISDIR /* missing POSIX-type macros */ + # define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR) + # define S_ISBLK(mode) (((mode)&S_IFMT) == S_IFBLK) +@@ -308,10 +336,18 @@ + + #ifndef VMS /* VMS hates multi-line definitions */ + # if defined(SVR4) || defined(SYSV) || defined(sco) || \ +- defined(XENIX) || defined(__osf__) ++ defined(XENIX) || defined(__osf__) || defined(__linux__) + # undef USE_GETCWD + # define USE_GETCWD /* use 'getcwd()' instead of 'getwd()' */ +-# endif ++# endif /* >> SECURITY ISSUE << */ ++#endif ++ ++ ++/* GRR 20040430: This is new and still only partially implemented. No doubt ++ * there are many other systems that have mkstemp() (SUSv3), ++ * but let's start small... */ ++#if defined(__linux__) || defined(__OpenBSD__) ++# define USE_MKSTEMP /* use 'mkstemp()' instead of 'mktemp()' */ + #endif + + +@@ -320,15 +356,15 @@ + /*****************************/ + + #ifdef DOJPEG +-#define HAVE_JPEG ++# define HAVE_JPEG + #endif + + #ifdef DOTIFF +-#define HAVE_TIFF ++# define HAVE_TIFF + #endif + + #ifdef DOPDS +-#define HAVE_PDS ++# define HAVE_PDS + #endif + + +@@ -442,7 +478,7 @@ + + /* following list gives indicies into 'saveFormats[]' array in xvdir.c + note that JPEG and TIFF entries may or may not exist, and following +- constants have to be adjusted accordingly. Also, don't worry about ++ constants have to be adjusted accordingly. Also, don't worry about + duplicate cases if JPGINC or TIFINC = 0. All code that references + F_JPEG or F_TIFF is #ifdef'd, so it won't be a problem */ + +@@ -482,7 +518,7 @@ + /* return values from ReadFileType() + * positive values are *definitely* readable formats (HAVE_*** is defined) + * negative values are random files that XV can't read, but display as +- * different icons in the visual browser ++ * different icons in the visual browser + */ + #define RFT_ERROR -1 /* couldn't open file, or whatever... */ + #define RFT_UNKNOWN 0 +@@ -742,7 +778,7 @@ + + typedef unsigned char byte; + +-typedef struct scrl { ++typedef struct scrl { + Window win; /* window ID */ + int x,y,w,h; /* window coords in parent */ + int len; /* length of major axis */ +@@ -972,12 +1008,12 @@ + /* this is converted to 'theImage' */ + WHERE int eWIDE, eHIGH; /* size of epic */ + +-WHERE byte *egampic; /* expanded, gammified cpic ++WHERE byte *egampic; /* expanded, gammified cpic + (only used in 24-bit mode) */ + + WHERE int p_offx, p_offy; /* offset of reparented windows */ + WHERE int ch_offx,ch_offy; /* ChngAttr ofst for reparented windows */ +-WHERE int kludge_offx, /* WM kludges for SetWindowPos routine */ ++WHERE int kludge_offx, /* WM kludges for SetWindowPos routine */ + kludge_offy; + WHERE int winCtrPosKludge; /* kludge for popup positioning... */ + +@@ -1072,7 +1108,7 @@ + WHERE int autoDelete; /* delete cmd-line files on exit? */ + + #define PRINTCMDLEN 256 +-WHERE char printCmd[PRINTCMDLEN]; ++WHERE char printCmd[PRINTCMDLEN]; + + /* stuff used for 'info' box */ + WHERE Window infoW; +@@ -1135,7 +1171,7 @@ + /* stuff used for 'ps' box */ + WHERE Window psW; + WHERE int psUp; /* is psW mapped, or what? */ +-WHERE CBUTT encapsCB, pscompCB; ++WHERE CBUTT encapsCB, pscompCB; + WHERE char *gsDev, *gsGeomStr; + WHERE int gsRes; + +@@ -1210,7 +1246,7 @@ + + /*************************** XVMISC.C ***************************/ + void StoreDeleteWindowProp PARM((Window)); +-Window CreateWindow PARM((char *, char *, char *, int, int, ++Window CreateWindow PARM((char *, char *, char *, int, int, + u_long, u_long, int)); + void DrawString PARM((Window, int, int, char *)); + void CenterString PARM((Window, int, int, char *)); +@@ -1222,7 +1258,7 @@ + void GenExpose PARM((Window, int, int, u_int, u_int)); + void DimRect PARM((Window, int, int, u_int, u_int, u_long)); + +-void Draw3dRect PARM((Window, int, int, u_int, u_int, int, int, ++void Draw3dRect PARM((Window, int, int, u_int, u_int, int, int, + u_long, u_long, u_long)); + + void RemapKeyCheck PARM((KeySym, char *, int *)); +@@ -1237,7 +1273,7 @@ + void SetCursors PARM((int)); + char *BaseName PARM((char *)); + +-void DrawTempGauge PARM((Window, int, int, int, int, double, ++void DrawTempGauge PARM((Window, int, int, int, int, double, + u_long, u_long, u_long, u_long, char *)); + void ProgressMeter PARM((int, int, int, char *)); + void XVDeletedFile PARM((char *)); +@@ -1248,6 +1284,7 @@ + void xv_getwd PARM((char *, size_t)); + char *xv_strstr PARM((char *, char *)); + FILE *xv_fopen PARM((char *, char *)); ++void xv_mktemp PARM((char *, char *)); + void Timer PARM((int)); + + /*************************** XVCOLOR.C ***************************/ +@@ -1282,11 +1319,11 @@ + void DrawEpic PARM((void)); + void KillOldPics PARM((void)); + +-byte *FSDither PARM((byte *, int, int, int, ++byte *FSDither PARM((byte *, int, int, int, + byte *, byte *, byte *, int, int)); + + void CreateXImage PARM((void)); +-XImage *Pic8ToXImage PARM((byte *, u_int, u_int, u_long *, ++XImage *Pic8ToXImage PARM((byte *, u_int, u_int, u_long *, + byte *, byte *, byte *)); + + XImage *Pic24ToXImage PARM((byte *, u_int, u_int)); +@@ -1306,21 +1343,21 @@ + void DoAlg PARM((int)); + + /*************************** XVSMOOTH.C ***************************/ +-byte *SmoothResize PARM((byte *, int, int, int, int, byte *, byte *, ++byte *SmoothResize PARM((byte *, int, int, int, int, byte *, byte *, + byte *, byte *, byte *, byte *, int)); + +-byte *Smooth24 PARM((byte *, int, int, int, int, int, ++byte *Smooth24 PARM((byte *, int, int, int, int, int, + byte *, byte *, byte *)); + +-byte *DoColorDither PARM((byte *, byte *, int, int, byte *, byte *, ++byte *DoColorDither PARM((byte *, byte *, int, int, byte *, byte *, + byte *, byte *, byte *, byte *, int)); + +-byte *Do332ColorDither PARM((byte *, byte *, int, int, byte *, byte *, ++byte *Do332ColorDither PARM((byte *, byte *, int, int, byte *, byte *, + byte *, byte *, byte *, byte *, int)); + + /*************************** XV24TO8.C **************************/ + void Init24to8 PARM((void)); +-byte *Conv24to8 PARM((byte *, int, int, int, ++byte *Conv24to8 PARM((byte *, int, int, int, + byte *, byte *, byte *)); + + byte *Conv8to24 PARM((byte *, int, int, byte *, byte *, byte *)); +@@ -1337,7 +1374,7 @@ + void DrawCtrlStr PARM((void)); + void ScrollToCurrent PARM((LIST *)); + +-void LSCreate PARM((LIST *, Window, int, int, int, int, int, ++void LSCreate PARM((LIST *, Window, int, int, int, int, int, + char **, int, u_long, u_long, u_long, u_long, + void (*)(int, SCRL *), int, int)); + +@@ -1384,7 +1421,7 @@ + FILE *OpenOutFile PARM((char *)); + int CloseOutFile PARM((FILE *, char *, int)); + +-byte *GenSavePic PARM((int*, int*,int*, int*, int*, ++byte *GenSavePic PARM((int*, int*,int*, int*, int*, + byte**, byte**, byte**)); + void GetSaveSize PARM((int *, int *)); + +@@ -1451,11 +1488,11 @@ + void GamSetAutoApply PARM((int)); + + /*************************** XVSCRL.C ***************************/ +-void SCCreate PARM((SCRL *, Window, int, int, int, int, +- int, int, int, int, u_long, u_long, ++void SCCreate PARM((SCRL *, Window, int, int, int, int, ++ int, int, int, int, u_long, u_long, + u_long, u_long, void (*)(int, SCRL *))); + +-void SCChange PARM((SCRL *, int, int, int, int, int, ++void SCChange PARM((SCRL *, int, int, int, int, int, + int, int, int)); + + void SCSetRange PARM((SCRL *, int, int, int, int)); +@@ -1465,8 +1502,8 @@ + + + /*************************** XVDIAL.C ***************************/ +-void DCreate PARM((DIAL *, Window, int, int, int, int, int, +- int, int, int, u_long, u_long, u_long, ++void DCreate PARM((DIAL *, Window, int, int, int, int, int, ++ int, int, int, u_long, u_long, u_long, + u_long, char *, char *)); + + void DSetRange PARM((DIAL *, int, int, int, int)); +@@ -1477,7 +1514,7 @@ + + + /**************************** XVBUTT.C ***************************/ +-void BTCreate PARM((BUTT *, Window, int, int, u_int, u_int, ++void BTCreate PARM((BUTT *, Window, int, int, u_int, u_int, + char *, u_long, u_long, u_long, u_long)); + + void BTSetActive PARM((BUTT *, int)); +@@ -1485,7 +1522,7 @@ + int BTTrack PARM((BUTT *)); + + +-RBUTT *RBCreate PARM((RBUTT *, Window, int, int, char *, ++RBUTT *RBCreate PARM((RBUTT *, Window, int, int, char *, + u_long, u_long, u_long, u_long)); + + void RBRedraw PARM((RBUTT *, int)); +@@ -1497,7 +1534,7 @@ + int RBTrack PARM((RBUTT *, int)); + + +-void CBCreate PARM((CBUTT *, Window, int, int, char *, ++void CBCreate PARM((CBUTT *, Window, int, int, char *, + u_long, u_long, u_long, u_long)); + + void CBRedraw PARM((CBUTT *)); +@@ -1506,8 +1543,8 @@ + int CBTrack PARM((CBUTT *)); + + +-void MBCreate PARM((MBUTT *, Window, int, int, u_int, u_int, +- char *, ++void MBCreate PARM((MBUTT *, Window, int, int, u_int, u_int, ++ char *, + char **, int,u_long,u_long, u_long, u_long)); + + void MBRedraw PARM((MBUTT *)); +@@ -1519,7 +1556,7 @@ + + + /**************************** XVGRAF.C ***************************/ +-void CreateGraf PARM((GRAF *, Window, int, int, ++void CreateGraf PARM((GRAF *, Window, int, int, + u_long, u_long, char *)); + + void InitGraf PARM((GRAF *)); +@@ -1539,32 +1576,32 @@ + int LoadGIF PARM((char *, PICINFO *)); + + /*************************** XVGIFWR.C **************************/ +-int WriteGIF PARM((FILE *, byte *, int, int, int, ++int WriteGIF PARM((FILE *, byte *, int, int, int, + byte *, byte *, byte *, int, int, char *)); + + /**************************** XVPM.C ****************************/ + int LoadPM PARM((char *, PICINFO *)); +-int WritePM PARM((FILE *, byte *, int, int, int, byte *, ++int WritePM PARM((FILE *, byte *, int, int, int, byte *, + byte *, byte *, int, int, char *)); + + /**************************** XVPBM.C ***************************/ + int LoadPBM PARM((char *, PICINFO *)); +-int WritePBM PARM((FILE *, byte *, int, int, int, byte *, ++int WritePBM PARM((FILE *, byte *, int, int, int, byte *, + byte *, byte *, int, int, int, char *)); + + /**************************** XVXBM.C ***************************/ + int LoadXBM PARM((char *, PICINFO *)); +-int WriteXBM PARM((FILE *, byte *, int, int, byte *, byte *, ++int WriteXBM PARM((FILE *, byte *, int, int, byte *, byte *, + byte *, char *)); + + /**************************** XVSUNRAS.C ***************************/ + int LoadSunRas PARM((char *, PICINFO *)); +-int WriteSunRas PARM((FILE *, byte *, int, int, int, byte *, ++int WriteSunRas PARM((FILE *, byte *, int, int, int, byte *, + byte *, byte*, int, int, int)); + + /**************************** XVBMP.C ***************************/ + int LoadBMP PARM((char *, PICINFO *)); +-int WriteBMP PARM((FILE *, byte *, int, int, int, byte *, ++int WriteBMP PARM((FILE *, byte *, int, int, int, byte *, + byte *, byte *, int, int)); + + /**************************** XVRLE.C ***************************/ +@@ -1572,7 +1609,7 @@ + + /**************************** XVIRIS.C ***************************/ + int LoadIRIS PARM((char *, PICINFO *)); +-int WriteIRIS PARM((FILE *, byte *, int, int, int, byte *, ++int WriteIRIS PARM((FILE *, byte *, int, int, int, byte *, + byte *, byte *, int, int)); + + /**************************** XVPCX.C ***************************/ +@@ -1583,12 +1620,12 @@ + + /**************************** XVTARGA.C ***************************/ + int LoadTarga PARM((char *, PICINFO *)); +-int WriteTarga PARM((FILE *, byte *, int, int, int, byte *, ++int WriteTarga PARM((FILE *, byte *, int, int, int, byte *, + byte *, byte *, int, int)); + + /**************************** XVXPM.C ***************************/ + int LoadXPM PARM((char *, PICINFO *)); +-int WriteXPM PARM((FILE *, byte *, int, int, int, byte *, ++int WriteXPM PARM((FILE *, byte *, int, int, int, byte *, + byte *, byte *, int, int, char *, char *)); + + /**************************** XVXWD.C ***************************/ +@@ -1607,7 +1644,7 @@ + void JPEGSaveParams PARM((char *, int)); + + /**************************** XVTIFF.C ***************************/ +-int LoadTIFF PARM((char *, PICINFO *)); ++int LoadTIFF PARM((char *, PICINFO *, int)); + void CreateTIFFW PARM((void)); + void TIFFDialog PARM((int)); + int TIFFCheckEvent PARM((XEvent *)); +@@ -1628,7 +1665,7 @@ + void CenterMapWindow PARM((Window, int, int, int, int)); + int PopUp PARM((char *, char **, int)); + void ErrPopUp PARM((char *, char *)); +-int GetStrPopUp PARM((char *, char **, int, char *, int, ++int GetStrPopUp PARM((char *, char **, int, char *, int, + char *, int)); + int GrabPopUp PARM((int *, int *)); + int PadPopUp PARM((int *, char **, int *, int *, int *, int *)); +diff -ruN xv-3.10a/xv24to8.c xv-3.10a-bugfixes/xv24to8.c +--- xv-3.10a/xv24to8.c 1995-01-13 11:49:21.000000000 -0800 ++++ xv-3.10a-bugfixes/xv24to8.c 2004-05-16 18:00:58.000000000 -0700 +@@ -14,15 +14,15 @@ + * + * The Conv24to8 procedure will set up the following: it will allocate, make + * & return 'pic8', a 'w' by 'h' (passed in values) 8-bit picture. +- * it will load up the rmap, gmap and bmap colormap arrays. it will NOT ++ * it will load up the rmap, gmap and bmap colormap arrays. it will NOT + * calculate numcols, since the cmap sort procedure has to be called anyway + * +- * Conv24to8 returns 'pic8' if successful, 'NULL' on failure (presumably on a ++ * Conv24to8 returns 'pic8' if successful, 'NULL' on failure (presumably on a + * malloc()) + * +- * The 'slow' code, while still based on Heckbert's Median Cut algorithm, ++ * The 'slow' code, while still based on Heckbert's Median Cut algorithm, + * has been shamelessly lifted from the Independent JPEG Group's software +- * (jquant2.c), as (for a variety of reasons) theirs was far better than ++ * (jquant2.c), as (for a variety of reasons) theirs was far better than + * the version I was previously using. Thanks guys! + * + * Also, as is my way, I've stripped out most of the IJG's well-written +@@ -65,10 +65,10 @@ + { + /* returns pointer to new 8-bit-per-pixel image (w*h) if successful, or + NULL if unsuccessful */ +- ++ + int i; + byte *pic8; +- ++ + if (!pic24) return NULL; + + pic8 = (byte *) malloc((size_t) (w * h)); +@@ -79,9 +79,9 @@ + + if (nc<=0) nc = 255; /* 'nc == 0' breaks code */ + +- if (!noqcheck && quick_check(pic24, w,h, pic8, rm,gm,bm, nc)) { ++ if (!noqcheck && quick_check(pic24, w,h, pic8, rm,gm,bm, nc)) { + SetISTR(ISTR_INFO,"No color compression was necessary.\n"); +- return pic8; ++ return pic8; + } + + switch (conv24) { +@@ -89,19 +89,19 @@ + SetISTR(ISTR_INFO,"Doing 'quick' 24-bit to 8-bit conversion."); + i = quick_quant(pic24, w, h, pic8, rm, gm, bm, nc); + break; +- ++ + case CONV24_BEST: + SetISTR(ISTR_INFO,"Doing 'best' 24-bit to 8-bit conversion."); + i = ppm_quant(pic24, w, h, pic8, rm, gm, bm, nc); + break; +- ++ + case CONV24_SLOW: + default: + SetISTR(ISTR_INFO,"Doing 'slow' 24-bit to 8-bit conversion."); + i = slow_quant(pic24, w, h, pic8, rm, gm, bm, nc); + break; + } +- ++ + if (i) { free(pic8); pic8 = NULL; } + return pic8; + } +@@ -134,7 +134,7 @@ + + return pic24; + } +- ++ + + /****************************/ + static int quick_check(pic24, w,h, pic8, rmap,gmap,bmap, maxcol) +@@ -154,10 +154,10 @@ + if (maxcol>256) maxcol = 256; + + /* put the first color in the table by hand */ +- nc = 0; mid = 0; ++ nc = 0; mid = 0; + + for (i=w*h,p=pic24; i; i--) { +- col = (((u_long) *p++) << 16); ++ col = (((u_long) *p++) << 16); + col += (((u_long) *p++) << 8); + col += *p++; + +@@ -184,7 +184,7 @@ + pic24 into colormap offsets into 'colors' */ + + for (i=w*h,p=pic24, pix=pic8; i; i--,pix++) { +- col = (((u_long) *p++) << 16); ++ col = (((u_long) *p++) << 16); + col += (((u_long) *p++) << 8); + col += *p++; + +@@ -206,7 +206,7 @@ + + /* and load up the 'desired colormap' */ + for (i=0; i<nc; i++) { +- rmap[i] = colors[i]>>16; ++ rmap[i] = colors[i]>>16; + gmap[i] = (colors[i]>>8) & 0xff; + bmap[i] = colors[i] & 0xff; + } +@@ -224,7 +224,7 @@ + { + /* called after 'pic8' has been alloced, pWIDE,pHIGH set up, mono/1-bit + checked already */ +- ++ + /* up to 256 colors: 3 bits R, 3 bits G, 2 bits B (RRRGGGBB) */ + #define RMASK 0xe0 + #define RSHIFT 0 +@@ -252,7 +252,7 @@ + gmap[i] = (((i<<GSHIFT) & GMASK) * 255 + GMASK/2) / GMASK; + bmap[i] = (((i<<BSHIFT) & BMASK) * 255 + BMASK/2) / BMASK; + } +- ++ + + thisline = (int *) malloc(pwide3 * sizeof(int)); + nextline = (int *) malloc(pwide3 * sizeof(int)); +@@ -262,40 +262,40 @@ + fprintf(stderr,"%s: unable to allocate memory in quick_quant()\n", cmd); + return(1); + } +- ++ + /* get first line of picture */ + for (j=pwide3, tmpptr=nextline; j; j--) *tmpptr++ = (int) *p24++; +- ++ + for (i=0; i<h; i++) { + tmpptr = thisline; thisline = nextline; nextline = tmpptr; /* swap */ +- ++ + if ((i&0x3f) == 0) WaitCursor(); + + if (i!=imax) /* get next line */ + for (j=pwide3, tmpptr=nextline; j; j--) + *tmpptr++ = (int) *p24++; +- ++ + for (j=0, thisptr=thisline, nextptr=nextline; j<w; j++,pp++) { + r1 = *thisptr++; g1 = *thisptr++; b1 = *thisptr++; +- RANGE(r1,0,255); RANGE(g1,0,255); RANGE(b1,0,255); +- ++ RANGE(r1,0,255); RANGE(g1,0,255); RANGE(b1,0,255); ++ + /* choose actual pixel value */ +- val = (((r1&RMASK)>>RSHIFT) | ((g1&GMASK)>>GSHIFT) | ++ val = (((r1&RMASK)>>RSHIFT) | ((g1&GMASK)>>GSHIFT) | + ((b1&BMASK)>>BSHIFT)); + *pp = val; +- ++ + /* compute color errors */ + r1 -= rmap[val]; + g1 -= gmap[val]; + b1 -= bmap[val]; +- ++ + /* Add fractions of errors to adjacent pixels */ + if (j!=jmax) { /* adjust RIGHT pixel */ + thisptr[0] += (r1*7) / 16; + thisptr[1] += (g1*7) / 16; + thisptr[2] += (b1*7) / 16; + } +- ++ + if (i!=imax) { /* do BOTTOM pixel */ + nextptr[0] += (r1*5) / 16; + nextptr[1] += (g1*5) / 16; +@@ -316,7 +316,7 @@ + } + } + } +- ++ + free(thisline); + free(nextline); + return 0; +@@ -329,7 +329,7 @@ + #undef BMASK + #undef BSHIFT + } +- ++ + + + +@@ -381,7 +381,7 @@ + + /* Luminance macro. */ + +-/* ++/* + * #define PPM_LUMIN(p) \ + * ( 0.299 * PPM_GETR(p) + 0.587 * PPM_GETG(p) + 0.114 * PPM_GETB(p) ) + */ +@@ -472,7 +472,7 @@ + + if (DEBUG) fprintf(stderr,"%s: remapping to ppm-style internal fmt\n", fn); + WaitCursor(); +- ++ + pixels = (pixel **) malloc(rows * sizeof(pixel *)); + if (!pixels) FatalError("couldn't allocate 'pixels' array"); + for (row=0; row<rows; row++) { +@@ -488,7 +488,7 @@ + if (DEBUG) fprintf(stderr,"%s: done format remapping\n", fn); + + +- ++ + + /* + * attempt to make a histogram of the colors, unclustered. +@@ -503,7 +503,7 @@ + + chv = ppm_computechist(pixels, cols, rows, MAXCOLORS, &colors); + if (chv != (chist_vec) 0) break; +- ++ + if (DEBUG) fprintf(stderr, "%s: too many colors!\n", fn); + newmaxval = maxval / 2; + if (DEBUG) fprintf(stderr, "%s: rescaling colors (maxval=%d) %s\n", +@@ -635,7 +635,7 @@ + int boxes; + + bv = (box_vector) malloc(sizeof(struct box) * newcolors); +- colormap = (chist_vec) ++ colormap = (chist_vec) + malloc(sizeof(struct chist_item) * newcolors ); + + if (!bv || !colormap) FatalError("unable to malloc in mediancut()"); +@@ -723,7 +723,7 @@ + else if (gl >= bl) + qsort((char*) &(chv[indx]), (size_t) clrs, sizeof(struct chist_item), + greencompare ); +- else ++ else + qsort((char*) &(chv[indx]), (size_t) clrs, sizeof(struct chist_item), + bluecompare ); + } +@@ -750,7 +750,7 @@ + ++boxes; + qsort((char*) bv, (size_t) boxes, sizeof(struct box), sumcompare); + } /* while (boxes ... */ +- ++ + /* + ** Ok, we've got enough boxes. Now choose a representative color for + ** each box. There are a number of possible ways to make this choice. +@@ -761,7 +761,7 @@ + ** method is used by switching the commenting on the REP_ defines at + ** the beginning of this source file. + */ +- ++ + for (bi=0; bi<boxes; bi++) { + /* REP_AVERAGE_PIXELS version */ + register int indx = bv[bi].index; +@@ -791,7 +791,7 @@ + static int redcompare(p1, p2) + const void *p1, *p2; + { +- return (int) PPM_GETR( ((chist_vec)p1)->color ) - ++ return (int) PPM_GETR( ((chist_vec)p1)->color ) - + (int) PPM_GETR( ((chist_vec)p2)->color ); + } + +@@ -799,7 +799,7 @@ + static int greencompare(p1, p2) + const void *p1, *p2; + { +- return (int) PPM_GETG( ((chist_vec)p1)->color ) - ++ return (int) PPM_GETG( ((chist_vec)p1)->color ) - + (int) PPM_GETG( ((chist_vec)p2)->color ); + } + +@@ -807,7 +807,7 @@ + static int bluecompare(p1, p2) + const void *p1, *p2; + { +- return (int) PPM_GETB( ((chist_vec)p1)->color ) - ++ return (int) PPM_GETB( ((chist_vec)p1)->color ) - + (int) PPM_GETB( ((chist_vec)p2)->color ); + } + +@@ -821,7 +821,7 @@ + + + /****************************************************************************/ +-static chist_vec ++static chist_vec + ppm_computechist(pixels, cols, rows, maxcolors, colorsP) + pixel** pixels; + int cols, rows, maxcolors; +@@ -840,7 +840,7 @@ + + + /****************************************************************************/ +-static chash_table ppm_computechash(pixels, cols, rows, ++static chash_table ppm_computechash(pixels, cols, rows, + maxcolors, colorsP ) + pixel** pixels; + int cols, rows, maxcolors; +@@ -861,14 +861,14 @@ + + for (chl = cht[hash]; chl != (chist_list) 0; chl = chl->next) + if (PPM_EQUAL(chl->ch.color, *pP)) break; +- ++ + if (chl != (chist_list) 0) ++(chl->ch.value); + else { + if ((*colorsP)++ > maxcolors) { + ppm_freechash(cht); + return (chash_table) 0; + } +- ++ + chl = (chist_list) malloc(sizeof(struct chist_list_item)); + if (!chl) FatalError("ran out of memory computing hash table"); + +@@ -878,7 +878,7 @@ + cht[hash] = chl; + } + } +- ++ + return cht; + } + +@@ -1114,7 +1114,7 @@ + register int i; + register long maxc = 0; + boxptr which = NULL; +- ++ + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->colorcount > maxc && boxp->volume > 0) { + which = boxp; +@@ -1133,7 +1133,7 @@ + register int i; + register INT32 maxv = 0; + boxptr which = NULL; +- ++ + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->volume > maxv) { + which = boxp; +@@ -1153,11 +1153,11 @@ + int c0min,c0max,c1min,c1max,c2min,c2max; + INT32 dist0,dist1,dist2; + long ccount; +- ++ + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; +- ++ + if (c0max > c0min) + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { +@@ -1229,7 +1229,7 @@ + dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE; + dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE; + boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2; +- ++ + ccount = 0; + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { +@@ -1315,11 +1315,11 @@ + long c0total = 0; + long c1total = 0; + long c2total = 0; +- ++ + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; +- ++ + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; +@@ -1332,7 +1332,7 @@ + } + } + } +- ++ + sl_colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total); + sl_colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total); + sl_colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total); +@@ -1505,12 +1505,12 @@ + bptr = bestdist; + for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--) + *bptr++ = 0x7FFFFFFFL; +- ++ + /* Nominal steps between cell centers ("x" in Thomas article) */ + #define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE) + #define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE) + #define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) +- ++ + for (i = 0; i < numcolors; i++) { + icolor = colorlist[i]; + /* Compute (square of) distance from minc0/c1/c2 to this color */ +@@ -1576,7 +1576,7 @@ + minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); + minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); + minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); +- ++ + numcolors = find_nearby_colors(minc0, minc1, minc2, colorlist); + + /* Determine the actually nearest colors. */ +diff -ruN xv-3.10a/xvalg.c xv-3.10a-bugfixes/xvalg.c +--- xv-3.10a/xvalg.c 1994-12-22 14:34:47.000000000 -0800 ++++ xv-3.10a-bugfixes/xvalg.c 2004-05-16 18:01:13.000000000 -0700 +@@ -38,7 +38,7 @@ + double, int)); + static void doPixel PARM((byte *,int,int,byte *, int,int,int,int, + int, int)); +-static void doSpread PARM((byte *,int,int,byte *, int,int,int,int, ++static void doSpread PARM((byte *,int,int,byte *, int,int,int,int, + int, int)); + static void doMedianFilter PARM((byte *,int,int,byte *, int,int,int,int, int)); + +@@ -89,7 +89,7 @@ + /************************************************************/ + void AlgInit() + { +- /* called whenver an image file is loaded. disposes of origPic ++ /* called whenver an image file is loaded. disposes of origPic + if neccessary, and points it to null */ + + if (origPic) free(origPic); +@@ -160,7 +160,7 @@ + { + /* runs a n*n convolution mask (all 1's) over 'pic', + producing a 24-bit version. Then calls 24to8 to generate a new 8-bit +- image, and installs it. ++ image, and installs it. + + Note that 'n' must be odd for things to work properly */ + +@@ -169,7 +169,7 @@ + static char *labels[] = { "\nOk", "\033Cancel" }; + char txt[256]; + static char buf[64] = { '3', '\0' }; +- ++ + sprintf(txt, "Blur: \n\n%s", + "Enter mask size (ex. 3, 5, 7, ...)"); + +@@ -178,7 +178,7 @@ + n = atoi(buf); + + if (n < 1 || (n&1)!=1) { +- ErrPopUp("Error: The value entered must be odd and greater than zero.", ++ ErrPopUp("Error: The value entered must be odd and greater than zero.", + "\nOh!"); + return; + } +@@ -194,7 +194,7 @@ + + if (start24bitAlg(&pic24, &tmpPic)) return; + xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3)); +- ++ + doBlurConvolv(pic24, pWIDE,pHIGH, tmpPic, sx,sy,sw,sh, n); + + end24bitAlg(pic24, tmpPic); +@@ -212,7 +212,7 @@ + static char *labels[] = { "\nOk", "\033Cancel" }; + char txt[256]; + static char buf[64] = { '7', '5', '\0' }; +- ++ + sprintf(txt, "Sharpen: \n\n%s", + "Enter enhancement factor (0-99%)"); + +@@ -236,7 +236,7 @@ + + if (start24bitAlg(&pic24, &tmpPic)) return; + xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3)); +- ++ + doSharpConvolv(pic24, pWIDE,pHIGH, tmpPic, sx,sy,sw,sh, n); + + end24bitAlg(pic24, tmpPic); +@@ -264,7 +264,7 @@ + xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3)); + + doEdgeConvolv(pic24, pWIDE, pHIGH, tmpPic, sx,sy,sw,sh); +- ++ + SetISTR(ISTR_INFO, "%snormalizing...", str); + + /* Normalize results */ +@@ -292,19 +292,19 @@ + /************************/ + static void TinFoil() + { +- byte *pic24, *p24, *tmpPic, *tp, *tlp; ++ byte *pic24, *tmpPic, *tp, *tlp; + char *str; +- int i, j, v, maxv,sx,sy,sw,sh; +- ++ int i, j, v, sx,sy,sw,sh; ++ + WaitCursor(); +- ++ + str = "Doing cheesy embossing effect..."; + SetISTR(ISTR_INFO, str); +- ++ + if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh); + else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; } + CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH); +- ++ + if (start24bitAlg(&pic24, &tmpPic)) return; + xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3)); + +@@ -315,9 +315,9 @@ + *tp++ = 128; *tp++ = 128; *tp++ = 128; + } + } +- ++ + doAngleConvolv(pic24, pWIDE, pHIGH, tmpPic, sx,sy,sw,sh); +- ++ + /* mono-ify selected area of tmpPic */ + for (i=sy; i<sy+sh; i++) { + tp = tlp = tmpPic + (i*pWIDE + sx) * 3; +@@ -327,9 +327,9 @@ + tp[0] = tp[1] = tp[2] = (byte) v; + } + } +- ++ + end24bitAlg(pic24, tmpPic); +-} ++} + + + /************************/ +@@ -345,7 +345,7 @@ + if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh); + else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; } + CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH); +- ++ + if (start24bitAlg(&pic24, &tmpPic)) return; + xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3)); + +@@ -365,7 +365,7 @@ + if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh); + else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; } + CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH); +- ++ + WaitCursor(); + + if (start24bitAlg(&pic24, &tmpPic)) return; +@@ -396,12 +396,12 @@ + rotval = atof(buf); + + if (rotval == 0.0) return; +- ++ + + if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh); + else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; } + CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH); +- ++ + WaitCursor(); + + if (start24bitAlg(&pic24, &tmpPic)) return; +@@ -443,11 +443,11 @@ + return; + } + +- ++ + if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh); + else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; } + CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH); +- ++ + WaitCursor(); + + if (start24bitAlg(&pic24, &tmpPic)) return; +@@ -493,11 +493,11 @@ + return; + } + +- ++ + if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh); + else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; } + CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH); +- ++ + WaitCursor(); + + if (start24bitAlg(&pic24, &tmpPic)) return; +@@ -521,7 +521,7 @@ + static char *labels[] = { "\nOk", "\033Cancel" }; + char txt[256]; + static char buf[64] = { '3', '\0' }; +- ++ + sprintf(txt, "DeSpeckle (median filter): \n\n%s", + "Enter mask size (ex. 3, 5, 7, ...)"); + +@@ -530,7 +530,7 @@ + n = atoi(buf); + + if (n < 1 || (n&1)!=1) { +- ErrPopUp("Error: The value entered must be odd and greater than zero.", ++ ErrPopUp("Error: The value entered must be odd and greater than zero.", + "\nOh!"); + return; + } +@@ -546,7 +546,7 @@ + + if (start24bitAlg(&pic24, &tmpPic)) return; + xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3)); +- ++ + doMedianFilter(pic24, pWIDE,pHIGH, tmpPic, sx,sy,sw,sh, n); + + end24bitAlg(pic24, tmpPic); +@@ -560,7 +560,7 @@ + int w,h, selx,sely,selw,selh, n; + { + +- /* convolves with an n*n array, consisting of only 1's. ++ /* convolves with an n*n array, consisting of only 1's. + Operates on rectangular region 'selx,sely,selw,selh' (in pic coords) + Region is guaranteed to be completely within pic boundaries + 'n' must be odd */ +@@ -568,7 +568,7 @@ + register byte *p24; + register int rsum,gsum,bsum; + byte *rp; +- int i,j,k,x,y,x1,y1,count,n2; ++ int x,y,x1,y1,count,n2; + + + printUTime("start of blurConvolv"); +@@ -589,7 +589,7 @@ + for (y1=y-n2; y1<=y+n2; y1++) { + + if (y1>=sely && y1<sely+selh) { +- p24 = pic24 + y1*w*3 +(x-n2)*3; ++ p24 = pic24 + y1*w*3 +(x-n2)*3; + + for (x1=x-n2; x1<=x+n2; x1++) { + if (x1>=selx && x1<selx+selw) { +@@ -631,7 +631,7 @@ + byte *p24; + int rv, gv, bv; + byte *rp; +- int i,j,k,x,y,x1,y1; ++ int i,x,y; + double fact, ifact, hue,sat,val, vsum; + double *linem1, *line0, *linep1, *tmpptr; + +@@ -673,7 +673,7 @@ + for (y=sely+1; y<(sely+selh)-1; y++) { + ProgressMeter(sely+1, (sely+selh)-2, y, "Sharpen"); + if ((y & 15) == 0) WaitCursor(); +- ++ + tmpptr = linem1; linem1 = line0; line0 = linep1; linep1 = tmpptr; + + /* get next line */ +@@ -691,7 +691,7 @@ + vsum = linem1[i-1] + linem1[i] + linem1[i+1] + + line0 [i-1] + line0 [i] + line0 [i+1] + + linep1[i-1] + linep1[i] + linep1[i+1]; +- ++ + rgb2hsv((int) p24[0], (int) p24[1], (int) p24[2], &hue, &sat, &val); + + val = ((val - (fact * vsum) / 9) / ifact); +@@ -723,22 +723,22 @@ + { + + /* convolves with two edge detection masks (vertical and horizontal) +- simultaneously, taking Max(abs(results)) +- ++ simultaneously, taking Max(abs(results)) ++ + The two masks are (hard coded): + + -1 0 1 -1 -1 -1 + H = -1 0 1 and V = 0 0 0 + -1 0 1 1 1 1 + +- divided into ++ divided into + -1 0 0 0 0 0 0 0 1 0 1 0 + a = 0 0 0 , b = -1 0 1 , c = 0 0 0 , d = 0 0 0 . + 0 0 1 0 0 0 -1 0 0 0 -1 0 + + So H = a + b + c, V = a - c - d. + gradient = max(abs(H),abs(V)). +- ++ + Also, only does pixels in which the masks fit fully onto the picture + (no pesky boundary conditionals) */ + +@@ -746,7 +746,7 @@ + register byte *p24; + register int bperlin, a, b, c, d, rsum, gsum, bsum; + byte *rp; +- int i, x, y; ++ int x, y; + + + printUTime("start of edgeConvolv"); +@@ -818,13 +818,13 @@ + { + + /* convolves with edge detection mask, at 45 degrees to horizontal. +- ++ + The mask is (hard coded): + + -2 -1 0 + -1 0 1 + 0 1 2 +- ++ + Also, only does pixels in which the masks fit fully onto the picture + (no pesky boundary conditionals) + +@@ -833,7 +833,7 @@ + register byte *p24; + register int bperlin,rsum,gsum,bsum; + byte *rp; +- int i, x,y; ++ int x,y; + + + printUTime("start of doAngleConvolv"); +@@ -912,14 +912,14 @@ + for each pixel in the image (assume, for a second, a grayscale image), + compute a histogram of the n*n rectangle centered on the pixel. + replace the pixel with the color that had the greatest # of hits in +- the histogram. Note that 'n' should be odd. ++ the histogram. Note that 'n' should be odd. + + I've modified the algorithm to do the *right* thing for RGB images. + (jhb, 6/94) */ + + + register byte *pp; +- register int bperlin, rsum,gsum,bsum; ++ register int bperlin; + byte *rp, *p24, *plin; + int i,j,k,x,y,n2,col,cnt,maxcnt; + int *nnrect; +@@ -933,7 +933,7 @@ + + /* nnrect[] is an n*n array of ints, with '-1' meaning 'outside the region' + otherwise they'll have 24-bit RGB values */ +- ++ + nnrect = (int *) malloc(n * n * sizeof(int)); + if (!nnrect) FatalError("can't malloc nnrect[] in doOilPaint()\n"); + +@@ -943,13 +943,13 @@ + + p24 = pic24 + ((y-n2)*w + selx-n2)*3; /* pts to top-left of mask */ + rp = results + (y*w + selx)*3; +- ++ + for (x=selx; x<selx+selw; x++) { + /* fill 'nnrect' with valid pixels from n*n region centered round x,y */ + pp = plin = p24; + for (i=y-n2, k=0; i<y+n2; i++) { + for (j=x-n2; j<x+n2; j++, k++, pp+=3) { +- if (i>=sely && i<sely+selh && j>=selx && j<selx+selw) { ++ if (i>=sely && i<sely+selh && j>=selx && j<selx+selw) { + nnrect[k] = (((int) pp[0])<<16) | (((int) pp[1])<<8) | pp[2]; + } + else nnrect[k] = -1; +@@ -957,7 +957,7 @@ + plin += bperlin; pp = plin; + } + +- ++ + /* find 'most popular color' in nnrect, not counting '-1' */ + maxcnt = cnt = col = 0; + for (i=0; i<n*n; i++) { +@@ -1021,7 +1021,7 @@ + p24 = pic24 + (y*w + selx) * 3; + rf += (double) p24[0]; gf += (double) p24[1]; bf += (double) p24[2]; + i++; +- ++ + p24 = pic24 + (y*w + (selx+selw-1)) * 3; + rf += (double) p24[0]; gf += (double) p24[1]; bf += (double) p24[2]; + i++; +@@ -1047,7 +1047,7 @@ + if (dx==0 && dy==0) { ex = selx; ey = sely; } /* don't care */ + else if (dx==0) { ex = cx; ey = (dy<0) ? sely : sely+selh-1; } + else if (dy==0) { ey = cy; ex = (dx<0) ? selx : selx+selw-1; } +- else { ++ else { + slope = ((double) dy) / dx; + if (fabs(slope) > fabs(dslope)) { /* y axis is major */ + ey = (dy<0) ? sely : sely+selh-1; +@@ -1092,7 +1092,7 @@ + printUTime("end of blend"); + } + +- ++ + + /************************/ + static void doRotate(pic24, w, h, results, selx,sely,selw,selh, rotval, clear) +@@ -1104,7 +1104,7 @@ + by the amount specified in degrees (rotval), and stores the result in + 'results', which is also a w*h 24-bit image. The rotated bits are + clipped to fit in 'results'. If 'clear', the (unrotated) rectangular +- region is cleared (in results) first. ++ region is cleared (in results) first. + sel[x,y,w,h] is guaranteed to be within image bounds */ + + byte *pp, *dp; +@@ -1118,7 +1118,7 @@ + printUTime("start of rotate"); + + /* +- * cfx,cfy - center point of sel rectangle (double) ++ * cfx,cfy - center point of sel rectangle (double) + * rx1,ry1 - top-left of sel, rotated + * rx2,ry2 - bot-left of sel, rotated + * rx3,ry3 - top-right of sel, rotated +@@ -1174,7 +1174,7 @@ + /* now, for each pixel in rb[x,y,w,h], do the inverse rotation to see if + it would be in the original unrotated selection rectangle. if it *is*, + compute and store an appropriate color, otherwise skip it */ +- ++ + for (y=rby; y<rby+rbh; y++) { + dp = results + (y * w + rbx) * 3; + +@@ -1194,7 +1194,7 @@ + int p0r,p0g,p0b, p1r,p1g,p1b, p2r,p2g,p2b, p3r,p3g,p3b; + int rv,gv,bv; + double rd,gd,bd, p0wgt, p1wgt, p2wgt, p3wgt; +- ++ + /* compute the color, same idea as in Smooth**(). The color + will be a linear combination of the colors of the center pixel, + its left-or-right neighbor, its top-or-bottom neighbor, and +@@ -1265,9 +1265,9 @@ + } + #endif /* ROTATE_FOO */ + +- dp[0] = (byte) (rv&0xff); +- dp[1] = (byte) (gv&0xff); +- dp[2] = (byte) (bv&0xff); ++ dp[0] = (byte) (rv&0xff); ++ dp[1] = (byte) (gv&0xff); ++ dp[2] = (byte) (bv&0xff); + } + } + } +@@ -1311,11 +1311,11 @@ + #ifdef FOO + fprintf(stderr,"rotXfer: rotating (%4d,%4d) %7.2f degrees around", + x,y, rad*180.0 / M_PI); +- fprintf(stderr,"(%4d,%4d) -> %7.2f %7.2f (d=%f ang=%f)\n", ++ fprintf(stderr,"(%4d,%4d) -> %7.2f %7.2f (d=%f ang=%f)\n", + cx,cy, *rx,*ry, d, ang); + #endif + } +- ++ + + + /************************/ +@@ -1323,29 +1323,29 @@ + byte *pic24, *results; + int w, h, selx,sely,selw,selh, pixX,pixY; + { +- /* runs 'pixelization' algorithm. replaces each pixX-by-pixY region ++ /* runs 'pixelization' algorithm. replaces each pixX-by-pixY region + (smaller on edges) with the average color within that region */ +- ++ + byte *pp; + int nwide, nhigh, i,j, x,y, x1,y1, stx,sty; + int nsum, rsum, gsum, bsum; +- ++ + printUTime("start of pixelize"); +- ++ + /* center grid on selection */ + nwide = (selw + pixX-1) / pixX; + nhigh = (selh + pixY-1) / pixY; +- ++ + stx = selx - (nwide*pixX - selw)/2; + sty = sely - (nhigh*pixY - selh)/2; +- ++ + y = sty; + for (i=0; i<nhigh; i++, y+=pixY) { + ProgressMeter(0, nhigh-1, i, "Pixelize"); +- ++ + x = stx; + for (j=0; j<nwide; j++, x+=pixX) { +- ++ + /* COMPUTE AVERAGE COLOR FOR RECT:[x,y,pixX,pixY] */ + nsum = rsum = gsum = bsum = 0; + for (y1=y; y1<y+pixY; y1++) { +@@ -1357,17 +1357,17 @@ + } + } + } +- ++ + if (nsum>0) { /* just to be safe... */ + rsum /= nsum; gsum /= nsum; bsum /= nsum; + RANGE(rsum,0,255); RANGE(gsum,0,255); RANGE(bsum,0,255); + } +- +- ++ ++ + /* STORE color in rect:[x,y,pixX,pixY] */ + for (y1=y; y1<y+pixY; y1++) { + if (!j && (y1 & 255)==0) WaitCursor(); +- ++ + pp = results + (y1 * w + x) * 3; + for (x1=x; x1<x+pixX; x1++, pp+=3) { + if (PTINRECT(x1,y1, selx,sely,selw,selh)) { +@@ -1381,7 +1381,7 @@ + printUTime("end of pixelize"); + } + +- ++ + + /************************/ + static void doSpread(pic24, w, h, results, selx,sely,selw,selh, pixX, pixY) +@@ -1393,17 +1393,17 @@ + by pixX,pixY. If pixX<0, it is treated as a single 'distance' value + (after being abs()'d). */ + +- /* assumes that initially 'results' is a copy of pic24. Doesn't ++ /* assumes that initially 'results' is a copy of pic24. Doesn't + even look at pic24 */ +- ++ + byte *pp, *dp, r,g,b; +- int x,y, dx,dy, x1,y1, d, xrng, xoff, yrng, yoff, i,j; ++ int x,y, x1,y1, d; + int minx, maxx, miny, maxy, rdist; + time_t nowT; + + time(&nowT); + srandom((unsigned int) nowT); +- ++ + printUTime("start of spread"); + + for (y=sely; y<sely+selh; y++) { +@@ -1453,7 +1453,7 @@ + printUTime("end of spread"); + } + +- ++ + + /************************/ + static void doMedianFilter(pic24, w, h, results, selx,sely,selw,selh, n) +@@ -1468,7 +1468,7 @@ + register byte *p24; + register int rsum,gsum,bsum; + byte *rp; +- int i,j,k,x,y,x1,y1,count,n2,nsq,c2; ++ int x,y,x1,y1,count,n2,nsq,c2; + int *rtab, *gtab, *btab; + + printUTime("start of doMedianFilter"); +@@ -1494,7 +1494,7 @@ + for (y1=y-n2; y1<=y+n2; y1++) { + + if (y1>=sely && y1<sely+selh) { +- p24 = pic24 + y1*w*3 +(x-n2)*3; ++ p24 = pic24 + y1*w*3 +(x-n2)*3; + + for (x1=x-n2; x1<=x+n2; x1++) { + if (x1>=selx && x1<selx+selw) { +@@ -1509,12 +1509,12 @@ + } + + +- /* now sort the rtab,gtab,btab arrays, (using shell sort) +- and pick the middle value. doing it in-line, rather than ++ /* now sort the rtab,gtab,btab arrays, (using shell sort) ++ and pick the middle value. doing it in-line, rather than + as a function call (ie, 'qsort()') , for speed */ +- { ++ { + int i,j,t,d; +- ++ + for (d=count/2; d>0; d=d/2) { + for (i=d; i<count; i++) { + for (j=i-d; j>=0 && rtab[j]>rtab[j+d]; j-=d) { +@@ -1531,14 +1531,14 @@ + } + } + } +- ++ + c2 = count/2; + *rp++ = (byte) ( (count&1) ? rtab[c2] : (rtab[c2] + rtab[c2-1])/2); + *rp++ = (byte) ( (count&1) ? gtab[c2] : (gtab[c2] + gtab[c2-1])/2); + *rp++ = (byte) ( (count&1) ? btab[c2] : (btab[c2] + btab[c2-1])/2); + } + } +- ++ + free(rtab); free(gtab); free(btab); + printUTime("end of doMedianFilter"); + } +@@ -1549,7 +1549,7 @@ + static void intsort(a, n) + int *a, n; + { +- /* uses the shell-sort algorithm. for the relatively small data sets ++ /* uses the shell-sort algorithm. for the relatively small data sets + we'll be using, should be quicker than qsort() because of all the + function calling overhead associated with qsort(). */ + +@@ -1571,7 +1571,7 @@ + byte **pic24, **tmpPic; + { + /* generates a 24-bit version of 'pic', if neccessary, and also mallocs +- * a pWIDE*pHIGH*3 24-bit output pic. ++ * a pWIDE*pHIGH*3 24-bit output pic. + * + * Returns '1' if there's some sort of screwup, '0' if cool + */ +@@ -1588,7 +1588,7 @@ + *tmpPic = (byte *) calloc((size_t) (pWIDE * pHIGH * 3), (size_t) 1); + if (!(*tmpPic)) { + SetCursors(-1); +- ErrPopUp("Unable to malloc() tmp 24-bit image in start24bitAlg()", ++ ErrPopUp("Unable to malloc() tmp 24-bit image in start24bitAlg()", + "\nTough!"); + if (picType == PIC8) free(*pic24); + return 1; +@@ -1609,16 +1609,16 @@ + saveOrigPic(); /* also kills pic/cpic/epic/egampic/theImage, NOT pic24 */ + + /* copy results to pic24 */ +- xvbcopy((char *) outPic, (char *) pic24, (size_t) (pWIDE*pHIGH*3)); ++ xvbcopy((char *) outPic, (char *) pic24, (size_t) (pWIDE*pHIGH*3)); + free(outPic); + + if (picType == PIC8) { + pic = Conv24to8(pic24, pWIDE, pHIGH, ncols, rMap,gMap,bMap); + free(pic24); +- if (!pic) { ++ if (!pic) { + SetCursors(-1); + ErrPopUp("Some sort of failure occured in 24to8 conversion\n","\nDamn!"); +- NoAlg(); ++ NoAlg(); + return; + } + } +@@ -1632,7 +1632,7 @@ + static void saveOrigPic() + { + /* saves original picture into origPic, if it hasn't already been done. +- This allows us to undo algorithms... ++ This allows us to undo algorithms... + + Also, frees all pics, (except 'pic', if we're in PIC24 mode) */ + +@@ -1649,7 +1649,7 @@ + /* make a backup copy of 'pic' */ + origPic = (byte *) malloc((size_t)(pWIDE*pHIGH*((picType==PIC8) ? 1 : 3))); + if (!origPic) FatalError("out of memory in 'saveOrigPic()'"); +- xvbcopy((char *) pic, (char *) origPic, ++ xvbcopy((char *) pic, (char *) origPic, + (size_t) (pWIDE * pHIGH * ((picType==PIC8) ? 1 : 3))); + + origPicType = picType; +diff -ruN xv-3.10a/xvbmp.c xv-3.10a-bugfixes/xvbmp.c +--- xv-3.10a/xvbmp.c 1994-12-22 14:34:42.000000000 -0800 ++++ xv-3.10a-bugfixes/xvbmp.c 2005-03-27 18:12:17.000000000 -0800 +@@ -14,7 +14,7 @@ + rest of the pic is filled with 0's. + + a file with garbage characters in it is an unloadable file. All allocated +- stuff is tossed, and LoadPBM returns non-zero ++ stuff is tossed, and LoadBMP returns non-zero + + not being able to malloc is a Fatal Error. The program is aborted. */ + +@@ -54,9 +54,9 @@ + { + FILE *fp; + int i, c, c1, rv; +- unsigned int bfSize, bfOffBits, biSize, biWidth, biHeight, biPlanes; +- unsigned int biBitCount, biCompression, biSizeImage, biXPelsPerMeter; +- unsigned int biYPelsPerMeter, biClrUsed, biClrImportant; ++ u_int bfSize, bfOffBits, biSize, biWidth, biHeight, biPlanes; ++ u_int biBitCount, biCompression, biSizeImage, biXPelsPerMeter; ++ u_int biYPelsPerMeter, biClrUsed, biClrImportant; + int bPad; + char *cmpstr; + byte *pic24, *pic8; +@@ -69,7 +69,7 @@ + + fp = xv_fopen(fname,"r"); + if (!fp) return (bmpError(bname, "couldn't open file")); +- ++ + fseek(fp, 0L, 2); /* figure out the file size */ + filesize = ftell(fp); + fseek(fp, 0L, 0); +@@ -104,11 +104,11 @@ + biHeight = getshort(fp); + biPlanes = getshort(fp); + biBitCount = getshort(fp); +- ++ + /* Not in old versions so have to compute them*/ + biSizeImage = (((biPlanes * biBitCount*biWidth)+31)/32)*4*biHeight; +- +- biCompression = BI_RGB; ++ ++ biCompression = BI_RGB; + biXPelsPerMeter = biYPelsPerMeter = 0; + biClrUsed = biClrImportant = 0; + } +@@ -127,11 +127,14 @@ + + + /* error checking */ +- if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 && biBitCount!=24) || +- biPlanes!=1 || biCompression>BI_RLE4) { +- +- sprintf(buf,"Bogus BMP File! (bitCount=%d, Planes=%d, Compression=%d)", +- biBitCount, biPlanes, biCompression); ++ if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 && biBitCount!=24) || ++ biPlanes!=1 || biCompression>BI_RLE4 || ++ biWidth<=0 || biHeight<=0 || ++ (biClrUsed && biClrUsed > (1 << biBitCount))) { ++ ++ sprintf(buf, ++ "Bogus BMP File! (%dx%d, Bits=%d, Colors=%d, Planes=%d, Compr=%d)", ++ biWidth, biHeight, biBitCount, biClrUsed, biPlanes, biCompression); + + bmpError(bname, buf); + goto ERROR; +@@ -154,7 +157,7 @@ + /* skip ahead to colormap, using biSize */ + c = biSize - 40; /* 40 bytes read from biSize to biClrImportant */ + for (i=0; i<c; i++) getc(fp); +- ++ + bPad = bfOffBits - (biSize + 14); + } + +@@ -162,6 +165,11 @@ + if (biBitCount!=24) { + int i, cmaplen; + ++/* this is superfluous; see identical test in "error checking" block above ++ if (biClrUsed > (1 << biBitCount)) ++ biClrUsed = (1 << biBitCount); ++ */ ++ + cmaplen = (biClrUsed) ? biClrUsed : 1 << biBitCount; + for (i=0; i<cmaplen; i++) { + pinfo->b[i] = getc(fp); +@@ -173,7 +181,7 @@ + } + } + +- if (FERROR(fp)) ++ if (FERROR(fp)) + { bmpError(bname,"EOF reached in BMP colormap"); goto ERROR; } + + if (DEBUG>1) { +@@ -188,7 +196,7 @@ + if (biSize != WIN_OS2_OLD) { + /* Waste any unused bytes between the colour map (if present) + and the start of the actual bitmap data. */ +- ++ + while (bPad > 0) { + (void) getc(fp); + bPad--; +@@ -198,11 +206,21 @@ + /* create pic8 or pic24 */ + + if (biBitCount==24) { +- pic24 = (byte *) calloc((size_t) biWidth * biHeight * 3, (size_t) 1); ++ u_int npixels = biWidth * biHeight; ++ u_int count = 3 * npixels; ++ ++ if (biWidth == 0 || biHeight == 0 || npixels/biWidth != biHeight || ++ count/3 != npixels) ++ return (bmpError(bname, "image dimensions too large")); ++ pic24 = (byte *) calloc((size_t) count, (size_t) 1); + if (!pic24) return (bmpError(bname, "couldn't malloc 'pic24'")); + } + else { +- pic8 = (byte *) calloc((size_t) biWidth * biHeight, (size_t) 1); ++ u_int npixels = biWidth * biHeight; ++ ++ if (biWidth == 0 || biHeight == 0 || npixels/biWidth != biHeight) ++ return (bmpError(bname, "image dimensions too large")); ++ pic8 = (byte *) calloc((size_t) npixels, (size_t) 1); + if (!pic8) return(bmpError(bname, "couldn't malloc 'pic8'")); + } + +@@ -216,7 +234,7 @@ + biCompression); + else rv = loadBMP24(fp,pic24,biWidth,biHeight); + +- if (rv) bmpError(bname, "File appears truncated. Winging it.\n"); ++ if (rv) bmpError(bname, "File appears truncated. Winging it."); + + fclose(fp); + +@@ -254,7 +272,7 @@ + ERROR: + fclose(fp); + return 0; +-} ++} + + + /*******************************************/ +@@ -277,7 +295,7 @@ + c = getc(fp); + bitnum = 0; + } +- ++ + if (j<w) { + *pp++ = (c & 0x80) ? 1 : 0; + c <<= 1; +@@ -287,7 +305,7 @@ + } + + return (FERROR(fp)); +-} ++} + + + +@@ -299,24 +317,24 @@ + { + int i,j,c,c1,x,y,nybnum,padw,rv; + byte *pp; +- +- ++ ++ + rv = 0; + c = c1 = 0; +- ++ + if (comp == BI_RGB) { /* read uncompressed data */ + padw = ((w + 7)/8) * 8; /* 'w' padded to a multiple of 8pix (32 bits) */ +- ++ + for (i=h-1; i>=0; i--) { + pp = pic8 + (i * w); + if ((i&0x3f)==0) WaitCursor(); +- ++ + for (j=nybnum=0; j<padw; j++,nybnum++) { + if ((nybnum & 1) == 0) { /* read next byte */ + c = getc(fp); + nybnum = 0; + } +- ++ + if (j<w) { + *pp++ = (c & 0xf0) >> 4; + c <<= 4; +@@ -325,55 +343,55 @@ + if (FERROR(fp)) break; + } + } +- ++ + else if (comp == BI_RLE4) { /* read RLE4 compressed data */ +- x = y = 0; ++ x = y = 0; + pp = pic8 + x + (h-y-1)*w; +- ++ + while (y<h) { + c = getc(fp); if (c == EOF) { rv = 1; break; } +- ++ + if (c) { /* encoded mode */ + c1 = getc(fp); +- for (i=0; i<c; i++,x++,pp++) ++ for (i=0; i<c; i++,x++,pp++) + *pp = (i&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f); + } +- ++ + else { /* c==0x00 : escape codes */ + c = getc(fp); if (c == EOF) { rv = 1; break; } +- ++ + if (c == 0x00) { /* end of line */ + x=0; y++; pp = pic8 + x + (h-y-1)*w; +- } +- ++ } ++ + else if (c == 0x01) break; /* end of pic8 */ +- ++ + else if (c == 0x02) { /* delta */ + c = getc(fp); x += c; + c = getc(fp); y += c; + pp = pic8 + x + (h-y-1)*w; + } +- ++ + else { /* absolute mode */ + for (i=0; i<c; i++, x++, pp++) { + if ((i&1) == 0) c1 = getc(fp); + *pp = (i&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f); + } +- ++ + if (((c&3)==1) || ((c&3)==2)) getc(fp); /* read pad byte */ + } + } /* escape processing */ + if (FERROR(fp)) break; + } /* while */ + } +- ++ + else { + fprintf(stderr,"unknown BMP compression type 0x%0x\n", comp); + } +- ++ + if (FERROR(fp)) rv = 1; + return rv; +-} ++} + + + +@@ -385,7 +403,7 @@ + { + int i,j,c,c1,padw,x,y,rv; + byte *pp; +- ++ + rv = 0; + + if (comp == BI_RGB) { /* read uncompressed data */ +@@ -404,7 +422,7 @@ + } + + else if (comp == BI_RLE8) { /* read RLE8 compressed data */ +- x = y = 0; ++ x = y = 0; + pp = pic8 + x + (h-y-1)*w; + + while (y<h) { +@@ -420,7 +438,7 @@ + + if (c == 0x00) { /* end of line */ + x=0; y++; pp = pic8 + x + (h-y-1)*w; +- } ++ } + + else if (c == 0x01) break; /* end of pic8 */ + +@@ -435,21 +453,21 @@ + c1 = getc(fp); + *pp = c1; + } +- ++ + if (c & 1) getc(fp); /* odd length run: read an extra pad byte */ + } + } /* escape processing */ + if (FERROR(fp)) break; + } /* while */ + } +- ++ + else { + fprintf(stderr,"unknown BMP compression type 0x%0x\n", comp); + } + + if (FERROR(fp)) rv = 1; + return rv; +-} ++} + + + +@@ -469,7 +487,7 @@ + for (i=h-1; i>=0; i--) { + pp = pic24 + (i * w * 3); + if ((i&0x3f)==0) WaitCursor(); +- ++ + for (j=0; j<w; j++) { + pp[2] = getc(fp); /* blue */ + pp[1] = getc(fp); /* green */ +@@ -484,30 +502,30 @@ + } + + return rv; +-} ++} + + + + /*******************************************/ +-static unsigned int getshort(fp) ++static u_int getshort(fp) + FILE *fp; + { + int c, c1; + c = getc(fp); c1 = getc(fp); +- return ((unsigned int) c) + (((unsigned int) c1) << 8); ++ return ((u_int) c) + (((u_int) c1) << 8); + } + + + /*******************************************/ +-static unsigned int getint(fp) ++static u_int getint(fp) + FILE *fp; + { + int c, c1, c2, c3; + c = getc(fp); c1 = getc(fp); c2 = getc(fp); c3 = getc(fp); +- return ((unsigned int) c) + +- (((unsigned int) c1) << 8) + +- (((unsigned int) c2) << 16) + +- (((unsigned int) c3) << 24); ++ return ((u_int) c) + ++ (((u_int) c1) << 8) + ++ (((u_int) c2) << 16) + ++ (((u_int) c3) << 24); + } + + +@@ -518,7 +536,7 @@ + { + int c, c1; + +- c = ((unsigned int ) i) & 0xff; c1 = (((unsigned int) i)>>8) & 0xff; ++ c = ((u_int) i) & 0xff; c1 = (((u_int) i)>>8) & 0xff; + putc(c, fp); putc(c1,fp); + } + +@@ -529,10 +547,10 @@ + int i; + { + int c, c1, c2, c3; +- c = ((unsigned int ) i) & 0xff; +- c1 = (((unsigned int) i)>>8) & 0xff; +- c2 = (((unsigned int) i)>>16) & 0xff; +- c3 = (((unsigned int) i)>>24) & 0xff; ++ c = ((u_int) i) & 0xff; ++ c1 = (((u_int) i)>>8) & 0xff; ++ c2 = (((u_int) i)>>16) & 0xff; ++ c3 = (((u_int) i)>>24) & 0xff; + + putc(c, fp); putc(c1,fp); putc(c2,fp); putc(c3,fp); + } +@@ -562,11 +580,11 @@ + * 8-bit image + * note that PIC24 and F_BWDITHER/F_REDUCED won't happen + * +- * if colorstyle == F_BWDITHER, it writes a 1-bit image ++ * if colorstyle == F_BWDITHER, it writes a 1-bit image + * + */ + +- int i,j, nc, nbits, bperlin, cmaplen; ++ int i,j, nc, nbits, bperlin, cmaplen, npixels; + byte *graypic, *sp, *dp, graymap[256]; + + nc = nbits = cmaplen = 0; +@@ -576,10 +594,16 @@ + /* generate a faked 8-bit per pixel image with a grayscale cmap, + so that it can just fall through existing 8-bit code */ + +- graypic = (byte *) malloc((size_t) w*h); ++ npixels = w * h; ++ if (w <= 0 || h <= 0 || npixels/w != h) { ++ SetISTR(ISTR_WARNING, "image dimensions too large"); ++ return -1; ++ } ++ ++ graypic = (byte *) malloc((size_t) npixels); + if (!graypic) FatalError("unable to malloc in WriteBMP()"); + +- for (i=0,sp=pic824,dp=graypic; i<w*h; i++,sp+=3, dp++) { ++ for (i=0,sp=pic824,dp=graypic; i<npixels; i++,sp+=3, dp++) { + *dp = MONO(sp[0],sp[1],sp[2]); + } + +@@ -611,7 +635,7 @@ + for (i=0; i<numcols; i++) { + /* see if color #i is a duplicate */ + for (j=0; j<i; j++) { +- if (rmap[i] == rmap[j] && gmap[i] == gmap[j] && ++ if (rmap[i] == rmap[j] && gmap[i] == gmap[j] && + bmap[i] == bmap[j]) break; + } + +@@ -689,13 +713,13 @@ + #else + if (!FERROR(fp)) return -1; + #endif +- ++ + return 0; + } + + +- +- ++ ++ + /*******************************************/ + static void writeBMP1(fp, pic8, w, h) + FILE *fp; +@@ -708,7 +732,7 @@ + padw = ((w + 31)/32) * 32; /* 'w', padded to be a multiple of 32 */ + + for (i=h-1; i>=0; i--) { +- pp = pic8 + (i * w); ++ pp = pic8 + (i * w); + if ((i&0x3f)==0) WaitCursor(); + + for (j=bitnum=c=0; j<=padw; j++,bitnum++) { +@@ -716,7 +740,7 @@ + putc(c,fp); + bitnum = c = 0; + } +- ++ + c <<= 1; + + if (j<w) { +@@ -724,7 +748,7 @@ + } + } + } +-} ++} + + + +@@ -758,7 +782,7 @@ + } + } + } +-} ++} + + + +@@ -768,7 +792,7 @@ + byte *pic8; + int w,h; + { +- int i,j,c,padw; ++ int i,j,padw; + byte *pp; + + padw = ((w + 3)/4) * 4; /* 'w' padded to a multiple of 4pix (32 bits) */ +@@ -780,7 +804,7 @@ + for (j=0; j<w; j++) putc(pc2nc[*pp++], fp); + for ( ; j<padw; j++) putc(0, fp); + } +-} ++} + + + /*******************************************/ +@@ -789,7 +813,7 @@ + byte *pic24; + int w,h; + { +- int i,j,c,padb; ++ int i,j,padb; + byte *pp; + + padb = (4 - ((w*3) % 4)) & 0x03; /* # of pad bytes to write at EOscanline */ +@@ -807,7 +831,7 @@ + + for (j=0; j<padb; j++) putc(0, fp); + } +-} ++} + + + +diff -ruN xv-3.10a/xvbrowse.c xv-3.10a-bugfixes/xvbrowse.c +--- xv-3.10a/xvbrowse.c 1995-01-19 09:49:17.000000000 -0800 ++++ xv-3.10a-bugfixes/xvbrowse.c 2004-05-16 18:01:25.000000000 -0700 +@@ -1,6 +1,6 @@ + /* + * xvbrowse.c - visual schnauzer routines +- * ++ * + * includes: + * void CreateBrowse(char *, char *, char *, char *, char *); + * void OpenBrowse(); +@@ -34,7 +34,7 @@ + #include "bits/br_sock" + #include "bits/br_fifo" + #include "bits/br_error" +-#include "bits/br_unknown" ++/* #include "bits/br_unknown" commented out (near line 492) */ + #include "bits/br_cmpres" + + #include "bits/br_gif" +@@ -97,7 +97,7 @@ + #define BF_MAX 28 /* # of built-in icons */ + + #define ISLOADABLE(ftyp) (ftyp!=BF_DIR && ftyp!=BF_CHR && ftyp!=BF_BLK && \ +- ftyp!=BF_SOCK && ftyp!=BF_FIFO) ++ ftyp!=BF_SOCK && ftyp!=BF_FIFO) + + #define DEF_BROWWIDE 615 /* default size of window */ + #define DEF_BROWHIGH 356 +@@ -150,12 +150,12 @@ + static char *hideHstr = "Hide 'hidden' files"; + + static char *cmdMList[] = { "Change directory...\t^c", +- "Delete file(s)\t^d", +- "New directory...\t^n", +- "Rename file...\t^r", ++ "Delete file(s)\t^d", ++ "New directory...\t^n", ++ "Rename file...\t^r", + "Rescan directory\t^s", +- "Update icons\t^u", +- "Open new window\t^w", ++ "Update icons\t^u", ++ "Open new window\t^w", + "Generate icon(s)\t^g", + "Select all files\t^a", + "Text view\t^t", +@@ -260,7 +260,7 @@ + static void genSelectedIcons PARM((BROWINFO *)); + static void genIcon PARM((BROWINFO *, BFIL *)); + static void loadThumbFile PARM((BROWINFO *, BFIL *)); +-static void writeThumbFile PARM((BROWINFO *, BFIL *, byte *, int, ++static void writeThumbFile PARM((BROWINFO *, BFIL *, byte *, int, + int, char *)); + + static void makeThumbDir PARM((BROWINFO *)); +@@ -284,7 +284,7 @@ + static void rm_dir PARM((BROWINFO *, char *)); + static void rm_dir1 PARM((BROWINFO *)); + +-static void dragFiles PARM((BROWINFO *, BROWINFO *, char *, char *, ++static void dragFiles PARM((BROWINFO *, BROWINFO *, char *, char *, + char *, char **, int, int)); + static int moveFile PARM((char *, char *)); + static int copyFile PARM((char *, char *)); +@@ -369,8 +369,8 @@ + if (gset & YNegative) gy1 = gy - i * 20; + else gy1 = gy + i * 20; + +- if ((gset & WidthValue) && (gset & HeightValue)) +- sprintf(wgeom, "%dx%d%s%d%s%d", gw, gh, ++ if ((gset & WidthValue) && (gset & HeightValue)) ++ sprintf(wgeom, "%dx%d%s%d%s%d", gw, gh, + (gset & XNegative) ? "-" : "+", abs(gx1), + (gset & YNegative) ? "-" : "+", abs(gy1)); + else +@@ -402,11 +402,11 @@ + + /* note: everything is sized and positioned in ResizeBrowse() */ + +- br->iconW = XCreateSimpleWindow(theDisp, br->win, 1,1, 100,100, ++ br->iconW = XCreateSimpleWindow(theDisp, br->win, 1,1, 100,100, + 1,browfg,browbg); + if (!br->iconW) FatalError("can't create schnauzer icon window!"); + +- SCCreate(&(br->scrl), br->win, 0,0, 1,100, 0,0,0,0, ++ SCCreate(&(br->scrl), br->win, 0,0, 1,100, 0,0,0,0, + browfg, browbg, browhi, browlo, drawIconWin); + + +@@ -486,7 +486,7 @@ + bfIcons[BF_SOCK]=MakePix1(br->win,br_sock_bits,br_sock_width,br_sock_height); + bfIcons[BF_FIFO]=MakePix1(br->win,br_fifo_bits,br_fifo_width,br_fifo_height); + +- bfIcons[BF_ERROR] = MakePix1(br->win, br_error_bits, ++ bfIcons[BF_ERROR] = MakePix1(br->win, br_error_bits, + br_error_width, br_error_height); + + /* bfIcons[BF_UNKNOWN] = MakePix1(br->win, br_unknown_bits, +@@ -501,9 +501,9 @@ + + bfIcons[BF_SUNRAS] = MakePix1(br->win, br_sunras_bits, + br_sunras_width, br_sunras_height); +- bfIcons[BF_BMP] = MakePix1(br->win,br_bmp_bits, ++ bfIcons[BF_BMP] = MakePix1(br->win,br_bmp_bits, + br_bmp_width, br_bmp_height); +- bfIcons[BF_UTAHRLE] = MakePix1(br->win, br_utahrle_bits, ++ bfIcons[BF_UTAHRLE] = MakePix1(br->win, br_utahrle_bits, + br_utahrle_width, br_utahrle_height); + + bfIcons[BF_IRIS]=MakePix1(br->win,br_iris_bits,br_iris_width,br_iris_height); +@@ -528,13 +528,13 @@ + + /* check that they all got built */ + for (i=0; i<BF_MAX && bfIcons[i]; i++); +- if (i<BF_MAX) ++ if (i<BF_MAX) + FatalError("unable to create all built-in icons for schnauzer"); + + for (i=0; i<MAXBRWIN; i++) { + resizeBrowse(&binfo[i], DEF_BROWWIDE, DEF_BROWHIGH); + +- XSelectInput(theDisp, binfo[i].win, ExposureMask | ButtonPressMask | ++ XSelectInput(theDisp, binfo[i].win, ExposureMask | ButtonPressMask | + KeyPressMask | StructureNotifyMask); + } + +@@ -557,7 +557,7 @@ + movecurs = XCreatePixmapCursor(theDisp,mcpix,fcmpix,&cursfg,&cursbg,13,13); + copycurs = XCreatePixmapCursor(theDisp,ccpix,fcmpix,&cursfg,&cursbg,13,13); + delcurs = XCreatePixmapCursor(theDisp,dcpix,fcmpix,&cursbg,&cursfg,13,13); +- if (!movecurs || !copycurs || !delcurs) ++ if (!movecurs || !copycurs || !delcurs) + FatalError("unable to create schnauzer cursors..."); + } + else FatalError("unable to create schnauzer cursors..."); +@@ -566,7 +566,7 @@ + XFreePixmap(theDisp, ccpix); + XFreePixmap(theDisp, dcpix); + XFreePixmap(theDisp, fcmpix); +- ++ + + hasBeenSized = 1; /* we can now start looking at browse events */ + } +@@ -586,11 +586,11 @@ + if (!br->vis) break; + } + if (i==MAXBRWIN) return; /* full up: shouldn't happen */ +- ++ + anyBrowUp = 1; + XMapRaised(theDisp, br->win); + br->vis = 1; +- ++ + freeBfList(br); + + /* see if some browser is pointing to the same path as CWD. If so, +@@ -645,7 +645,7 @@ + /* free all info for this browse window */ + freeBfList(br); + sprintf(br->path, BOGUSPATH); +- ++ + /* turn on 'open new window' command doodads */ + windowMB.dim[WMB_BROWSE] = 0; + for (i=0; i<MAXBRWIN; i++) { +@@ -739,8 +739,7 @@ + /* checks event to see if it's a browse-window related thing. If it + is, it eats the event and returns '1', otherwise '0'. */ + +- int i, rv; +- char buf[1024]; ++ int rv; + + rv = 1; + +@@ -788,7 +787,7 @@ + fprintf(stderr,"grouped %d expose events into %d,%d %dx%d rect\n", + count, rect.x, rect.y, rect.width, rect.height); + } +- ++ + if (e->window == br->win) drawBrow(br); + + else if (e->window == br->iconW) +@@ -811,7 +810,7 @@ + if (e->window == br->win) clickBrow(br,x,y); + else if (e->window == br->scrl.win) SCTrack(&(br->scrl),x,y); + else if (e->window == br->iconW) { +- i = clickIconWin(br, x,y,(unsigned long) e->time, ++ i = clickIconWin(br, x,y,(unsigned long) e->time, + (e->state&ControlMask) || (e->state&ShiftMask)); + + } +@@ -837,7 +836,7 @@ + + if (br->wide != e->width || br->high != e->height) { + if (DEBUG) fprintf(stderr,"Forcing a redraw! (from configure)\n"); +- XClearArea(theDisp, br->win, 0, 0, ++ XClearArea(theDisp, br->win, 0, 0, + (u_int) e->width, (u_int) e->height, True); + resizeBrowse(br, e->width, e->height); + } +@@ -877,7 +876,7 @@ + int w,h; + { + XSizeHints hints; +- int i, minv, maxv, curv, page, maxh; ++ int i, maxv, page, maxh; + + if (br->wide == w && br->high == h) return; /* no change in size */ + +@@ -895,7 +894,7 @@ + br->iwHigh = (maxh / ISPACE_HIGH) * ISPACE_HIGH; + if (br->iwHigh < ISPACE_HIGH) br->iwHigh = ISPACE_HIGH; + +- XMoveResizeWindow(theDisp, br->iconW, LRMARGINS, TOPMARGIN, ++ XMoveResizeWindow(theDisp, br->iconW, LRMARGINS, TOPMARGIN, + (u_int) br->iwWide, (u_int) br->iwHigh); + + +@@ -907,11 +906,11 @@ + for (i=0; i<BR_NBUTTS; i++) { + /* 'close' always goes on right-most edge */ + +- if (i<br->numbutshown) ++ if (i<br->numbutshown) + br->but[i].x = br->wide - (1+br->numbutshown-i) * (BUTTW+5); + else if (i==BR_CLOSE) + br->but[i].x = br->wide - (BUTTW+5); +- else ++ else + br->but[i].x = br->wide + 10; /* offscreen */ + + br->but[i].y = br->high - BUTTH - 5; +@@ -928,11 +927,11 @@ + br->numWide = br->iwWide / ISPACE_WIDE; + br->visHigh = br->iwHigh / ISPACE_HIGH; + +- /* compute minv,maxv,curv,page values based on new current size */ ++ /* compute maxv,page values based on new current size */ + computeScrlVals(br, &maxv, &page); + if (br->scrl.val>maxv) br->scrl.val = maxv; +- +- SCChange(&br->scrl, LRMARGINS+br->iwWide+1, TOPMARGIN, ++ ++ SCChange(&br->scrl, LRMARGINS+br->iwWide+1, TOPMARGIN, + 1, br->iwHigh, 0, maxv, br->scrl.val, page); + } + +@@ -945,7 +944,7 @@ + /* put string in *all* browse windows */ + int i; + +- for (i=0; i<MAXBRWIN; i++) ++ for (i=0; i<MAXBRWIN; i++) + setBrowStr(&binfo[i], str); + } + +@@ -956,6 +955,7 @@ + char *str; + { + strncpy(br->dispstr, str, (size_t) 256); ++ br->dispstr[255] = '\0'; + drawBrowStr(br); + XFlush(theDisp); + } +@@ -992,7 +992,7 @@ + + char tmp[64]; + +- sprintf(tmp, "Re-coloring icons: processed %d out of %d...", ++ sprintf(tmp, "Re-coloring icons: processed %d out of %d...", + i+1, br->bfLen); + setBrowStr(br, tmp); + } +@@ -1011,14 +1011,14 @@ + { + /* called when file 'name' has been deleted. If any of the browsers + were showing the directory that the file was in, does a rescan() */ +- ++ + int i; + char buf[MAXPATHLEN + 2], *tmp; + + strcpy(buf, name); + tmp = BaseName(buf); + *tmp = '\0'; /* truncate after last '/' */ +- ++ + for (i=0; i<MAXBRWIN; i++) { + if (strcmp(binfo[i].path, buf)==0) rescanDir(&binfo[i]); + } +@@ -1070,9 +1070,9 @@ + case BR_GENICON: genSelectedIcons(br); break; + + case BR_SELALL: { +- int i; char buf[128]; ++ int i; + +- for (i=0; i<br->bfLen; i++) ++ for (i=0; i<br->bfLen; i++) + br->bfList[i].lit = 1; + br->numlit = br->bfLen; + +@@ -1087,13 +1087,13 @@ + break; + + case BR_TEXTVIEW: doTextCmd(br); break; +- ++ + case BR_QUIT: Quit(0); break; + + case BR_CLOSE: closeBrowse(br); break; + + case BR_HIDDEN: br->showhidden = !br->showhidden; +- br->cmdMB.list[cmd] = (br->showhidden) ++ br->cmdMB.list[cmd] = (br->showhidden) + ? hideHstr : showHstr; + rescanDir(br); + break; +@@ -1137,16 +1137,16 @@ + + if (br->bfLen != 1) sprintf(foo, "%d files", br->bfLen); + else strcpy(foo, "1 file"); +- ++ + XSetForeground(theDisp, theGC, browbg); +- XFillRectangle(theDisp,br->win, theGC, x+1,y+1, ++ XFillRectangle(theDisp,br->win, theGC, x+1,y+1, + (u_int) StringWidth(foo)+6, (u_int) br->dirMB.h-1); + + XSetForeground(theDisp,theGC,browfg); + XDrawRectangle(theDisp,br->win, theGC, x,y, + (u_int) StringWidth(foo)+7, (u_int) br->dirMB.h); + +- Draw3dRect(br->win, x+1, y+1, (u_int) StringWidth(foo)+5, ++ Draw3dRect(br->win, x+1, y+1, (u_int) StringWidth(foo)+5, + (u_int) br->dirMB.h-2, R3D_IN, 2, browhi, browlo, browbg); + + XSetForeground(theDisp,theGC,browfg); +@@ -1163,7 +1163,7 @@ + + if (nf != 1) sprintf(foo,"%d files",nf); + else strcpy(foo,"1 file"); +- ++ + XClearArea(theDisp,br->win, 30, br->dirMB.y, + (u_int) StringWidth(foo)+8, (u_int) br->dirMB.h+1, False); + } +@@ -1185,13 +1185,13 @@ + + XSetForeground(theDisp,theGC,browfg); + XDrawRectangle(theDisp,br->win, theGC, x,y, (u_int) w, (u_int) h); +- Draw3dRect(br->win, x+1, y+1, (u_int) w-2, (u_int) h-2, ++ Draw3dRect(br->win, x+1, y+1, (u_int) w-2, (u_int) h-2, + R3D_IN, 2, browhi, browlo, browbg); + + XSetForeground(theDisp,theGC,browfg); + XSetBackground(theDisp,theGC,browbg); +- XCopyPlane(theDisp, trashPix, br->win, theGC, +- 0,0,(u_int) br_trash_width, (u_int) br_trash_height, ++ XCopyPlane(theDisp, trashPix, br->win, theGC, ++ 0,0,(u_int) br_trash_width, (u_int) br_trash_height, + x+(w-br_trash_width)/2, y+(h-br_trash_height)/2, + 1L); + } +@@ -1222,7 +1222,7 @@ + y = br->high - (BUTTH+10) - (CHIGH + 6); + + XSetForeground(theDisp, theGC, browbg); +- XFillRectangle(theDisp, br->win, theGC, 0, y+3, ++ XFillRectangle(theDisp, br->win, theGC, 0, y+3, + (u_int) br->wide, (u_int) CHIGH+1); + + XSetForeground(theDisp, theGC, browfg); +@@ -1277,7 +1277,7 @@ + { + /* sets the '# files selected' string in the brow window appropriately */ + +- /* criteria: ++ /* criteria: + * if no files are lit, display '' + * if 1 file is lit, pretend it was selected, fall through... + * if 1 or more files are lit +@@ -1316,7 +1316,7 @@ + + else if (bf->ftype != BF_DIR) { /* no info. display file size */ + struct stat st; +- ++ + sprintf(buf, "%s%s", br->path, bf->name); /* build filename */ + if (stat(buf, &st) == 0) { + sprintf(buf, "%s: %ld bytes", bf->name, st.st_size); +@@ -1360,8 +1360,8 @@ + if (j>=0 && j < br->bfLen) drawIcon(br,j); + } + } +- +- Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1, ++ ++ Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1, + R3D_IN, 2, browhi, browlo, browbg); + } + +@@ -1371,10 +1371,8 @@ + int delta; + SCRL *sptr; + { +- int i,indx, x,y, ix,iy, num; +- BFIL *bf; ++ int i,indx, num; + BROWINFO *br; +- char tmpstr[64], *nstr; + + /* figure out BROWINFO pointer from SCRL pointer */ + for (i=0; i<MAXBRWIN; i++) { +@@ -1385,7 +1383,7 @@ + br = &binfo[i]; + + /* make sure we've been sized. Necessary, as creating/modifying the +- scrollbar calls this routine directly, rather than through ++ scrollbar calls this routine directly, rather than through + BrowseCheckEvent() */ + + if (!hasBeenSized) return; +@@ -1413,12 +1411,12 @@ + if (y+h > br->iwHigh-4) h = (br->iwHigh-4)-y + 2; + } + XFillRectangle(theDisp, br->iconW, theGC, x, y, ISPACE_WIDE, (u_int) h); +- ++ + if (indx>=0 && indx < br->bfLen) drawIcon(br, indx); + } + } + +- Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1, ++ Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1, + R3D_IN, 2, browhi, browlo, browbg); + } + +@@ -1431,7 +1429,10 @@ + { + int i,x,y,ix,iy,sw,sh,sx,sy; + BFIL *bf; +- char tmpstr[64], fixedname[64], *nstr, *str; ++ char tmpstr[64], *nstr, *str; ++#ifdef VMS ++ char fixedname[64]; ++#endif + + + if (num<0 || num >= br->bfLen) return; +@@ -1463,12 +1464,12 @@ + } + + else if (bf->ftype == BF_HAVEIMG && bf->ximage) { +- XPutImage(theDisp, br->iconW, theGC, bf->ximage, 0,0, ix,iy, ++ XPutImage(theDisp, br->iconW, theGC, bf->ximage, 0,0, ix,iy, + (u_int) bf->w, (u_int) bf->h); + } + + else { /* shouldn't happen */ +- XDrawRectangle(theDisp, br->iconW, theGC, ix, iy, ++ XDrawRectangle(theDisp, br->iconW, theGC, ix, iy, + (u_int) bf->w, (u_int) bf->h); + } + +@@ -1488,24 +1489,25 @@ + + /* decide if the title is too big, and shorten if neccesary */ + if (StringWidth(str) > ISPACE_WIDE-6) { +- int dotpos; ++ int dotpos; + strncpy(tmpstr, str, (size_t) 56); ++ tmpstr[56] = '\0'; /* MR: otherwise it dies on long file names */ + dotpos = strlen(tmpstr); + strcat(tmpstr,"..."); + + while(StringWidth(tmpstr) > ISPACE_WIDE-6 && dotpos>0) { + /* change last non-dot char in tmpstr to a dot, and lop off + last dot */ +- ++ + dotpos--; + tmpstr[dotpos] = '.'; + tmpstr[dotpos+3] = '\0'; + } +- ++ + nstr = tmpstr; + } + else nstr = str; +- ++ + + /* draw the title */ + sw = StringWidth(nstr); +@@ -1516,12 +1518,12 @@ + + XSetForeground(theDisp, theGC, + (bf->lit && bf->lit!=ICON_ONLY) ? browfg : browbg); +- XFillRectangle(theDisp, br->iconW, theGC, sx, sy, ++ XFillRectangle(theDisp, br->iconW, theGC, sx, sy, + (u_int) sw + 4, (u_int) sh + 2); + + XSetForeground(theDisp, theGC, + (bf->lit && bf->lit!=ICON_ONLY) ? browbg : browfg); +- CenterString(br->iconW, x + ISPACE_WIDE/2, ++ CenterString(br->iconW, x + ISPACE_WIDE/2, + y + ISPACE_TOP + ISIZE_HIGH + ISPACE_TTOP + CHIGH/2, nstr); + } + +@@ -1535,7 +1537,6 @@ + + int i,x,y,ix,iy,w,h; + BFIL *bf; +- char tmpstr[64], *nstr; + + if (num<0 || num >= br->bfLen) return; + bf = &(br->bfList[num]); +@@ -1579,12 +1580,12 @@ + y = (i / br->numWide) * ISPACE_HIGH; + + XSetForeground(theDisp, theGC, browbg); +- XFillRectangle(theDisp, br->iconW, theGC, ++ XFillRectangle(theDisp, br->iconW, theGC, + x, y + ISPACE_TOP + ISIZE_HIGH + ISPACE_TTOP - 1, + (u_int) ISPACE_WIDE, (u_int) LINEHIGH); + +- if (ctrlColor) +- Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1, ++ if (ctrlColor) ++ Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1, + R3D_IN, 2, browhi, browlo, browbg); + } + +@@ -1658,7 +1659,7 @@ + /* returns '-1' normally, returns an index into bfList[] if the user + double-clicks an icon */ + +- int i,j, base, num, x,y,ix,iy, rv, sel, cpymode, dodel; ++ int i,j, rv, sel, cpymode, dodel; + BROWINFO *destBr; + BFIL *bf; + char buf[256], *destFolderName; +@@ -1681,7 +1682,7 @@ + } + + changedNumLit(br, sel, 0); +- br->lastIconClicked = -1; ++ br->lastIconClicked = -1; + } + + +@@ -1725,10 +1726,9 @@ + + changedNumLit(br, sel, 0); + +- ++ + /* see if we've double-clicked something */ + if (sel==br->lastIconClicked && mtime-br->lastClickTime < DBLCLICKTIME) { +- int k; + br->lastIconClicked = -1; /* YES */ + + doubleClick(br, sel); +@@ -1759,10 +1759,10 @@ + first = 1; hasrect = 0; cpymode = 0; + origsval = br->scrl.val; + +- if ( (sel>=0 && !multi) || sel==-1) { ++ if ( (sel>=0 && !multi) || sel==-1) { + /* clicked on an icon, or clicked on nothing... */ + +- while (!XQueryPointer(theDisp, rootW, &rW, &cW, &rootx, &rooty, ++ while (!XQueryPointer(theDisp, rootW, &rW, &cW, &rootx, &rooty, + &x,&y,&mask)); + if (mask & Button1Mask) { /* still held down */ + +@@ -1773,7 +1773,7 @@ + else curs = movecurs; + + /* change cursors */ +- for (i=0; i<MAXBRWIN; i++) ++ for (i=0; i<MAXBRWIN; i++) + XDefineCursor(theDisp,binfo[i].iconW, curs); + + samepos = oldx = oldy = oldbrnum = 0; +@@ -1785,43 +1785,43 @@ + + if (sel>=0) { /* see if changed copy/move status (and cursor) */ + int cmod; +- ++ + cmod = (mask&ControlMask || mask&ShiftMask) ? 1 : 0; + + if (cmod != cpymode && !dodel) { + curs = (cmod) ? copycurs : movecurs; +- for (i=0; i<MAXBRWIN; i++) ++ for (i=0; i<MAXBRWIN; i++) + XDefineCursor(theDisp,binfo[i].iconW, curs); + } + cpymode = cmod; +- +- ++ ++ + /* see if cursor is in any of the trash can areas */ + for (i=0; i<MAXBRWIN; i++) { + if (binfo[i].vis) { +- XTranslateCoordinates(theDisp, rW, binfo[i].win, rootx,rooty, ++ XTranslateCoordinates(theDisp, rW, binfo[i].win, rootx,rooty, + &bwx,&bwy, &cW); + if (inTrash(&binfo[i], bwx, bwy)) break; + } + } +- ++ + if (dodel && i==MAXBRWIN) { /* moved out */ + dodel = 0; + curs = (cpymode) ? copycurs : movecurs; +- for (i=0; i<MAXBRWIN; i++) ++ for (i=0; i<MAXBRWIN; i++) + XDefineCursor(theDisp,binfo[i].iconW, curs); + } +- ++ + else if (!dodel && i<MAXBRWIN) { /* moved in */ + dodel = 1; +- for (i=0; i<MAXBRWIN; i++) ++ for (i=0; i<MAXBRWIN; i++) + XDefineCursor(theDisp,binfo[i].iconW, delcurs); + } + } + + + +- XTranslateCoordinates(theDisp, rW, br->iconW, rootx,rooty, ++ XTranslateCoordinates(theDisp, rW, br->iconW, rootx,rooty, + &iwx,&iwy, &cW); + + /* find deepest child that the mouse is in */ +@@ -1837,12 +1837,12 @@ + /* if it's in any icon window, and we're doing icon-dragging + OR we're doing a rectangle-drag */ + +- if (i<MAXBRWIN || sel == -1) { ++ if (i<MAXBRWIN || sel == -1) { + if (i<MAXBRWIN) destBr = &binfo[i]; + if (sel == -1) destBr = br; + +- /* AUTO-SCROLLING: scroll any icon window if we're doing an +- icon-drag. Only scroll the original window if we're doing ++ /* AUTO-SCROLLING: scroll any icon window if we're doing an ++ icon-drag. Only scroll the original window if we're doing + a rect drag */ + + if (sel>=0 && (oldx!=x || oldy!=y || oldbrnum!=i)) { /* moved */ +@@ -1873,7 +1873,7 @@ + } + } + +- ++ + /* if we clicked on an icon (originally), and therefore are + showing the 'move files' cursor, see if the cursor is within + the icon region of any folders. If so, light up *the icon +@@ -1904,9 +1904,9 @@ + + /* Dragging a selection rectangle. */ + +- else { ++ else { + static int prevx, prevy, prevcnt; +- int origy, top, left, wide, high, cnt; ++ int origy, cnt; + + if (first) { prevx = mx; prevy = my; first=0; prevcnt = -1; } + +@@ -1922,18 +1922,18 @@ + + rx = (mx < x) ? mx : x; + ry = (origy < y) ? origy : y; +- rw = abs(mx - x); ++ rw = abs(mx - x); + rh = abs(origy - y); + + /* figure out which icons need to be lit/unlit. Only + redraw those that have changed state */ +- ++ + for (i=0,cnt=0, bf=br->bfList; i<br->bfLen; i++,bf++) { +- int ix, iy, isin, light; ++ int ix, iy, isin; + +- ix = ((i%br->numWide) * ISPACE_WIDE) ++ ix = ((i%br->numWide) * ISPACE_WIDE) + + ISPACE_WIDE/2 - bf->w/2; +- iy = ((i/br->numWide) * ISPACE_HIGH) ++ iy = ((i/br->numWide) * ISPACE_HIGH) + + ISPACE_TOP + ISIZE_HIGH - bf->h; + + iy = iy - br->scrl.val * ISPACE_HIGH; +@@ -1994,7 +1994,7 @@ + } + + /* RELEASED BUTTON: back to normal arrow cursor */ +- for (i=0; i<MAXBRWIN; i++) ++ for (i=0; i<MAXBRWIN; i++) + XDefineCursor(theDisp, binfo[i].iconW, None); + + if (sel == -1) { /* was dragging rectangle */ +@@ -2007,7 +2007,7 @@ + if (bf->lit == TEMP_LIT || bf->lit == TEMP_LIT1) { + bf->lit = 1; drawIcon(br, i); + } +- ++ + if (bf->lit) br->numlit++; + } + +@@ -2020,7 +2020,6 @@ + + /* if doing a copy or a move, do the thing to the files */ + if (sel >= 0) { +- char *destFolder; + + if (DEBUG) { + fprintf(stderr,"---------------\n"); +@@ -2029,7 +2028,7 @@ + fprintf(stderr,"Dest Folder: '%s'\n", destFolderName); + } + +- ++ + if (!br->numlit) { + if (DEBUG) fprintf(stderr, "no selected files. Nothing to do!\n"); + } +@@ -2042,7 +2041,7 @@ + if (DEBUG) fprintf(stderr, "no destination. Nothing to do!\n"); + } + +- else if (strcmp(destFolderName,".") == 0 && ++ else if (strcmp(destFolderName,".") == 0 && + strcmp(br->path, destBr->path) == 0) { + if (DEBUG) fprintf(stderr,"source == destination. Nothing to do!\n"); + } +@@ -2067,12 +2066,12 @@ + } + } + if (DEBUG) fprintf(stderr,"\n\n"); +- ++ + #ifdef VMS + /* +- * For VMS, our directory file names are identifed by the +- * special filename extension, ".DIR". Unfortunately, this +- * needs to be stripped before we ever actually use the name ++ * For VMS, our directory file names are identifed by the ++ * special filename extension, ".DIR". Unfortunately, this ++ * needs to be stripped before we ever actually use the name + * in a copy command... :( RLD 26-FEB-1993 + */ + +@@ -2080,7 +2079,7 @@ + #endif + + +- dragFiles(br, destBr, br->path, destBr->path, destFolderName, nlist, ++ dragFiles(br, destBr, br->path, destBr->path, destFolderName, nlist, + ncnt, cpymode); + + /* free namelist */ +@@ -2155,7 +2154,7 @@ + } + + +- ++ + /* double-clicked something. We should do something about it */ + if (br->bfList[sel].ftype == BF_DIR) { /* try to cd */ + #ifndef VMS +@@ -2193,7 +2192,7 @@ + *event_retP = THISNEXT; + } + else { *event_retP = LOADPIC; SetDirFName(buf); } +- ++ + *event_doneP = 1; /* make MainLoop load image */ + } + } +@@ -2259,7 +2258,7 @@ + stlen = XLookupString(kevt, buf, 128, &ks, (XComposeStatus *) NULL); + shift = kevt->state & ShiftMask; + ck = CursorKey(ks, shift, 1); +- dealt = 1; ++ dealt = 1; + + RemapKeyCheck(ks, buf, &stlen); + +@@ -2306,7 +2305,7 @@ + char fname[MAXPATHLEN]; + + /* if 'shift-space' find last lit icon, select the next one after it, +- and load it. If 'space' do the same, but lose prior lit. These ++ and load it. If 'space' do the same, but lose prior lit. These + are the only cases where br->numlit >1 allowed */ + + if (br->numlit>1 && buf[0] != ' ') return; +@@ -2314,7 +2313,7 @@ + if (buf[0]==' ' && (br->numlit>1 || (br->numlit==1 && shift))) { + for (i=br->bfLen-1; i>=0 && !br->bfList[i].lit; i--); /* i=last lit */ + if (i==br->bfLen-1) return; +- ++ + i++; + if (!shift) { + for (j=0; j<br->bfLen; j++) { +@@ -2364,7 +2363,7 @@ + for (i=0; i<br->bfLen && !br->bfList[i].lit; i++); /* find lit one */ + sprintf(fname, "%s%s", br->path, br->bfList[i].name); + viewsel = !(strcmp(fname, fullfname)); +- ++ + if (viewsel) { + if (buf[0]==' ') browKey(br, CK_RIGHT); + else browKey(br, CK_LEFT); +@@ -2372,7 +2371,7 @@ + + if (!br->bfList[i].lit || !viewsel) { /* changed selection */ + for (i=0; i<br->bfLen && !br->bfList[i].lit; i++); /* find it */ +- if (br->bfList[i].ftype != BF_DIR) ++ if (br->bfList[i].ftype != BF_DIR) + doubleClick(br, -1); + } + } +@@ -2410,10 +2409,10 @@ + /* handle up/down/left/right keys + * + * if precisely *one* item is lit, than the up/down/left/right keys move +- * the selection. ++ * the selection. + * + * if NO items are lit, then left/right select the first/last fully-displayed +- * icon, and up/down simply scroll window up or down, without selecting ++ * icon, and up/down simply scroll window up or down, without selecting + * anything + * + * if more than one item is lit, up/down/left/right keys BEEP +@@ -2443,8 +2442,8 @@ + if (key == CK_DOWN) j = i + br->numWide; + if (key == CK_LEFT) j = i - 1; + if (key == CK_RIGHT) j = i + 1; +- +- if (j >= 0 && j < br->bfLen) { ++ ++ if (j >= 0 && j < br->bfLen) { + br->bfList[i].lit = 0; + br->bfList[j].lit = 1; + makeIconVisible(br,j); +@@ -2455,7 +2454,7 @@ + } + } + +- ++ + if (br->numlit == 0) { /* no current selection */ + if (key == CK_UP) SCSetVal(&br->scrl, br->scrl.val - 1); + if (key == CK_DOWN) SCSetVal(&br->scrl, br->scrl.val + 1); +@@ -2541,13 +2540,13 @@ + * The VMS chdir always needs 2 components (device and directory), + * so convert "/device" to "/device/000000" and convert + * "/" to "/XV_Root_Device/000000" (XV_RootDevice will need to be +- * a special concealed device setup to provide list of available ++ * a special concealed device setup to provide list of available + * disks). + * + * End 'tmppath' by changing trailing '/' (of dir name) to a '\0' + */ + *rindex ( tmppath, '/') = '\0'; +- if ( ((br->ndirs-sel) == 2) && (strlen(tmppath) > 1) ) ++ if ( ((br->ndirs-sel) == 2) && (strlen(tmppath) > 1) ) + strcat ( tmppath, "/000000" ); /* add root dir for device */ + else if ((br->ndirs-sel) == 1 ) + strcpy ( tmppath, "/XV_Root_Device/000000" ); /* fake top level */ +@@ -2599,7 +2598,7 @@ + static void copyDirInfo(srcbr, dstbr) + BROWINFO *srcbr, *dstbr; + { +- /* copies br info from an already existing browser window ++ /* copies br info from an already existing browser window + (ie, one that is already showing the same directory) */ + + int i, oldnum, maxv, page; +@@ -2619,7 +2618,7 @@ + dstbr->dirMB.list = srcbr->mblist; + dstbr->dirMB.nlist = srcbr->ndirs; + +- XClearArea(theDisp, dstbr->dirMB.win, dstbr->dirMB.x, dstbr->dirMB.y, ++ XClearArea(theDisp, dstbr->dirMB.win, dstbr->dirMB.x, dstbr->dirMB.y, + dstbr->dirMB.w+3, dstbr->dirMB.h+3, False); + + i = StringWidth(dstbr->mblist[0]) + 10; +@@ -2644,7 +2643,7 @@ + + if ((i&0x03) == 0) drawTemp(dstbr, i, dstbr->bfLen); + if ((i & 0x3f) == 0) WaitCursor(); +- ++ + sbf = &(srcbr->bfList[i]); + dbf = &(dstbr->bfList[i]); + +@@ -2670,7 +2669,7 @@ + if (sbf->pimage) { + dbf->pimage = (byte *) malloc((size_t) dbf->w * dbf->h); + if (!dbf->pimage) FatalError("ran out of memory for dbf->pimage"); +- xvbcopy((char *) sbf->pimage, (char *) dbf->pimage, ++ xvbcopy((char *) sbf->pimage, (char *) dbf->pimage, + (size_t) (dbf->w * dbf->h)); + } + else dbf->pimage = (byte *) NULL; +@@ -2681,10 +2680,10 @@ + xvbcopy((char *) sbf->ximage, (char *) dbf->ximage, sizeof(XImage)); + + if (sbf->ximage->data) { +- dbf->ximage->data = (char *) malloc((size_t) dbf->ximage->height * ++ dbf->ximage->data = (char *) malloc((size_t) dbf->ximage->height * + dbf->ximage->bytes_per_line); + if (!dbf->ximage->data) FatalError("ran out of memory for ximg data"); +- xvbcopy((char *) sbf->ximage->data, (char *) dbf->ximage->data, ++ xvbcopy((char *) sbf->ximage->data, (char *) dbf->ximage->data, + (size_t) dbf->ximage->height * dbf->ximage->bytes_per_line); + } + } +@@ -2701,15 +2700,15 @@ + computeScrlVals(dstbr, &maxv, &page); + if (dstbr->scrl.val > maxv) dstbr->scrl.val = maxv; + +- XClearArea(theDisp, dstbr->iconW, 0, 0, (u_int) dstbr->iwWide, ++ XClearArea(theDisp, dstbr->iconW, 0, 0, (u_int) dstbr->iwWide, + (u_int) dstbr->iwHigh, True); + SCSetRange(&dstbr->scrl, 0, maxv, dstbr->scrl.val, page); + + SetCursors(-1); + } + +- +- ++ ++ + + /***************************************************************/ + static void scanDir(br) +@@ -2726,7 +2725,7 @@ + * and it's reasonable to expect folks to want to add their own bitmaps + */ + +- int i,j,k,oldbflen,vmsparent; ++ int i,j,oldbflen,vmsparent; + BFIL *bf; + + DIR *dirp; +@@ -2775,7 +2774,7 @@ + + /* build brMBlist */ + for (i = br->ndirs-1,j=0; i>=0; i--,j++) { +- size_t stlen = (i<(br->ndirs-1)) ? dirnames[i+1] - dirnames[i] ++ size_t stlen = (i<(br->ndirs-1)) ? dirnames[i+1] - dirnames[i] + : strlen(dirnames[i]); + + br->mblist[j] = (char *) malloc(stlen+1); +@@ -2784,13 +2783,13 @@ + strncpy(br->mblist[j], dirnames[i], stlen); + br->mblist[j][stlen] = '\0'; + } +- ++ + + /* refresh the brdirMB button */ + br->dirMB.list = br->mblist; + br->dirMB.nlist = br->ndirs; + +- XClearArea(theDisp, br->dirMB.win, br->dirMB.x, br->dirMB.y, ++ XClearArea(theDisp, br->dirMB.win, br->dirMB.x, br->dirMB.y, + br->dirMB.w+3, br->dirMB.h+3, False); + + i = StringWidth(br->mblist[0]) + 10; +@@ -2815,7 +2814,7 @@ + /* count how many files are in the list */ + + dirp = opendir("."); +- if (!dirp) { ++ if (!dirp) { + endScan(br, oldbflen); + setBrowStr(br, "Couldn't read current directory."); + SetCursors(-1); +@@ -2827,11 +2826,11 @@ + #endif + + while ( (dp = readdir(dirp)) != NULL) { +- if (strcmp(dp->d_name, ".") && ++ if (strcmp(dp->d_name, ".") && + strcmp(dp->d_name, THUMBDIR)) { +- if (!br->showhidden && dp->d_name[0] == '.' && ++ if (!br->showhidden && dp->d_name[0] == '.' && + strcmp(dp->d_name,"..")!=0) continue; +- else ++ else + br->bfLen++; + } + if ((br->bfLen & 0x3f) == 0) WaitCursor(); +@@ -2877,13 +2876,13 @@ + } + else { + do { dp = readdir(dirp); } +- while (dp && (strcmp(dp->d_name, ".")==0 || ++ while (dp && (strcmp(dp->d_name, ".")==0 || + strcmp(dp->d_name, THUMBDIR)==0 || + strcmp(dp->d_name, THUMBDIRNAME)==0 || + (br->ndirs==1 && strcmp(dp->d_name,"..")==0) || +- (!br->showhidden && dp->d_name[0] == '.' && ++ (!br->showhidden && dp->d_name[0] == '.' && + strcmp(dp->d_name,"..")!=0))); +- ++ + if (!dp) { br->bfLen = i; break; } /* dir got shorter... */ + } + +@@ -2940,11 +2939,11 @@ + if (w<1) w = 1; + if (h<1) h = 1; + +- XClearArea(theDisp, br->iconW, (ctrlColor) ? 2 : 0, (ctrlColor) ? 2 : 0, ++ XClearArea(theDisp, br->iconW, (ctrlColor) ? 2 : 0, (ctrlColor) ? 2 : 0, + (u_int) w, (u_int) h, False); + + SCSetRange(&br->scrl, 0, maxv, br->scrl.val, page); +- ++ + SetCursors(-1); + } + +@@ -2972,7 +2971,7 @@ + bf->pimage = (byte *) NULL; + bf->ximage = (XImage *) NULL; + bf->lit = 0; +- ++ + + if (stat(bf->name, &st)==0) { + bf->ftype = stat2bf((u_int) st.st_mode); +@@ -3048,11 +3047,11 @@ + bfcompares++; + if ((bfcompares & 0x7f)==0) WaitCursor(); + +- /* sort critera: directories first, in alphabetical order, ++ /* sort critera: directories first, in alphabetical order, + followed by everything else, in alphabetical order */ +- ++ + if ((b1->ftype == BF_DIR && b2->ftype == BF_DIR) || +- (b1->ftype != BF_DIR && b2->ftype != BF_DIR)) ++ (b1->ftype != BF_DIR && b2->ftype != BF_DIR)) + return strcmp(b1->name, b2->name); + + else if (b1->ftype == BF_DIR && b2->ftype != BF_DIR) return -1; +@@ -3108,7 +3107,7 @@ + for (i=0; i<bflen; i++) { + bfnames[i] = (char *) malloc(strlen(br->bfList[i].name) + 1); + if (!bfnames[i]) FatalError("couldn't alloc bfnames in rescanDir()"); +- ++ + strcpy(bfnames[i], br->bfList[i].name); + } + } +@@ -3121,7 +3120,7 @@ + + /* note, either (or both) dirnames/bfnames can be NULL, in which case + their respective 'len's will be zero */ +- ++ + /* sort the two name lists */ + if (bflen) qsort((char *) bfnames, (size_t) bflen, sizeof(char *),namcmp); + if (dirlen) qsort((char *) dirnames, (size_t) dirlen,sizeof(char *),namcmp); +@@ -3153,7 +3152,7 @@ + } + } + bflen = j; +- ++ + + for (i=j=0; i<dirlen; i++) { + if (dirnames[i] && strcmp(dirnames[i],".") && strcmp(dirnames[i],"..") && +@@ -3162,21 +3161,21 @@ + } + } + dirlen = j; +- ++ + + if (DEBUG) { + fprintf(stderr,"%d files seem to have gone away: ", bflen); +- for (i=0; i<bflen; i++) ++ for (i=0; i<bflen; i++) + fprintf(stderr,"%s ", bfnames[i]); + fprintf(stderr,"\n\n"); + + fprintf(stderr,"%d files seem to have appeared: ", dirlen); +- for (i=0; i<dirlen; i++) ++ for (i=0; i<dirlen; i++) + fprintf(stderr,"%s ", dirnames[i]); + fprintf(stderr,"\n\n"); + } +- +- ++ ++ + /* create a new bfList */ + newlen = br->bfLen - bflen + dirlen; /* oldlen - #del'd + #created */ + if (newlen>0) { +@@ -3241,7 +3240,7 @@ + if (bf->pimage) free(bf->pimage); + if (bf->ximage) xvDestroyImage(bf->ximage); + } +- ++ + free(br->bfList); + } + +@@ -3267,13 +3266,13 @@ + int *lenP; + int dohidden; + { +- /* loads up all directory entries into an array. This *isn't* a great +- way to do it, but I can't count on 'scandir()' existing on ++ /* loads up all directory entries into an array. This *isn't* a great ++ way to do it, but I can't count on 'scandir()' existing on + every system. Returns 'NULL' on failure, or pointer to array of + 'lenP' strings on success. '.' and '..' ARE included in list + if !dohidden, all '.*' files are skipped (except . and ..) */ + +- int i, j, dirlen; ++ int i, dirlen; + DIR *dirp; + char **names; + #ifdef NODIRENT +@@ -3294,9 +3293,9 @@ + /* count # of entries in dir (worst case) */ + for (dirlen=0; (dp = readdir(dirp)) != NULL; dirlen++); + if (!dirlen) { +- closedir(dirp); ++ closedir(dirp); + *lenP = dirlen; +- return (char **) NULL; ++ return (char **) NULL; + } + + +@@ -3312,7 +3311,7 @@ + + if (!dohidden) { + #ifndef VMS +- if (dp->d_name[0] == '.' && ++ if (dp->d_name[0] == '.' && + strcmp(dp->d_name,"." )!=0 && + strcmp(dp->d_name,"..")!=0) continue; + #endif +@@ -3324,7 +3323,7 @@ + strcpy(names[i], dp->d_name); + i++; + } +- ++ + if (i<dirlen) dirlen = i; /* dir got shorter... */ + + closedir(dirp); +@@ -3359,7 +3358,7 @@ + static void genSelectedIcons(br) + BROWINFO *br; + { +- int i, sval, first, numvis, cnt; ++ int i, cnt; + + setBrowStr(br, ""); + +@@ -3395,7 +3394,7 @@ + BFIL *bf; + { + /* given a BFIL entry, load up the file. +- * if we succeeded in loading up the file, ++ * if we succeeded in loading up the file, + * generate an aspect-correct 8-bit image using brow Cmap + * otherwise + * replace this icon with the BF_UNKNOWN, or BF_ERR icons +@@ -3408,20 +3407,20 @@ + byte *icon24, *icon8; + char str[256], str1[256], *readname, uncompname[128]; + char basefname[128], *uncName; +- +- ++ ++ + if (!bf || !bf->name || bf->name[0] == '\0') return; /* shouldn't happen */ + str[0] = '\0'; + basefname[0] = '\0'; + pinfo.pic = (byte *) NULL; + pinfo.comment = (char *) NULL; + readname = bf->name; +- ++ + /* free any old info in 'bf' */ + if (bf->imginfo) free (bf->imginfo); + if (bf->pimage) free (bf->pimage); + if (bf->ximage) xvDestroyImage(bf->ximage); +- ++ + bf->imginfo = (char *) NULL; + bf->pimage = (byte *) NULL; + bf->ximage = (XImage *) NULL; +@@ -3429,9 +3428,9 @@ + + /* skip all 'special' files */ + if (!ISLOADABLE(bf->ftype)) return; +- ++ + filetype = ReadFileType(bf->name); +- ++ + if (filetype == RFT_COMPRESS) { + #if (defined(VMS) && !defined(GUNZIP)) + /* VMS decompress doesn't like the file to have a trailing .Z in fname +@@ -3442,7 +3441,7 @@ + #else + uncName = bf->name; + #endif +- ++ + if (UncompressFile(uncName, uncompname)) { + filetype = ReadFileType(uncompname); + readname = uncompname; +@@ -3453,61 +3452,61 @@ + bf->ftype = BF_ERROR; + } + } +- ++ + /* get rid of comments. don't need 'em */ + if (pinfo.comment) free(pinfo.comment); pinfo.comment = (char *) NULL; +- +- if (filetype == RFT_ERROR) { ++ ++ if (filetype == RFT_ERROR) { + sprintf(str,"Couldn't open file '%s'", bf->name); + setBrowStr(br, str); + bf->ftype = BF_ERROR; + } +- ++ + else if (filetype == RFT_UNKNOWN) { + /* if it *was* an 'exe', leave it that way */ + if (bf->ftype != BF_EXE) bf->ftype = BF_UNKNOWN; + } +- ++ + else { + /* otherwise it's a known filetype... do the *hard* part now... */ +- ++ + i = ReadPicFile(readname, filetype, &pinfo, 1); + KillPageFiles(pinfo.pagebname, pinfo.numpages); +- ++ + if (!i) bf->ftype = BF_ERROR; +- ++ + if (i && (pinfo.w<=0 || pinfo.h<=0)) { /* bogus size */ + bf->ftype = BF_ERROR; + free(pinfo.pic); pinfo.pic = (byte *) NULL; + } +- ++ + if (bf->ftype==BF_ERROR && filetype==RFT_XBM) bf->ftype = BF_UNKNOWN; + } +- ++ + /* get rid of comment, as we don't need it */ +- if (pinfo.comment) { ++ if (pinfo.comment) { + free(pinfo.comment); pinfo.comment = (char *) NULL; + } +- ++ + /* if we made an uncompressed file, we can rm it now */ + if (readname != bf->name) unlink(readname); +- +- ++ ++ + /* at this point either BF_ERROR, BF_UNKNOWN, BF_EXE or pic */ +- ++ + if (!pinfo.pic) { + if (bf->ftype == BF_EXE) return; /* don't write thumbfiles for exe's */ +- ++ + bf->w = br_file_width; bf->h = br_file_height; + writeThumbFile(br, bf, NULL, 0, 0, NULL); /* BF_ERROR, BF_UNKNOWN */ + return; + } +- ++ + /* at this point, we have a pic, so it must be an image file */ +- +- ++ ++ + /* compute size of icon (iwide,ihigh) */ +- ++ + wexpand = (double) pinfo.w / (double) ISIZE_WIDE; + hexpand = (double) pinfo.h / (double) ISIZE_HIGH; + +@@ -3527,13 +3526,13 @@ + + + /* generate icon */ +- icon24 = Smooth24(pinfo.pic, pinfo.type==PIC24, pinfo.w, pinfo.h, ++ icon24 = Smooth24(pinfo.pic, pinfo.type==PIC24, pinfo.w, pinfo.h, + iwide, ihigh, pinfo.r,pinfo.g,pinfo.b); + if (!icon24) { bf->ftype = BF_FILE; free(pinfo.pic); return; } + + sprintf(str, "%dx%d ", pinfo.normw, pinfo.normh); + switch (filetype) { +- case RFT_GIF: if (xv_strstr(pinfo.shrtInfo, "GIF89")) ++ case RFT_GIF: if (xv_strstr(pinfo.shrtInfo, "GIF89")) + strcat(str,"GIF89 file"); + else + strcat(str,"GIF87 file"); +@@ -3543,12 +3542,12 @@ + + case RFT_PBM: if (xv_strstr(pinfo.fullInfo, "raw")) strcat(str,"Raw "); + else strcat(str,"Ascii "); +- ++ + for (i=0; i<3 && (strlen(pinfo.fullInfo)>(size_t)3); i++){ + str1[0] = pinfo.fullInfo[i]; str1[1] = '\0'; + strcat(str, str1); + } +- ++ + strcat(str," file"); + break; + +@@ -3569,19 +3568,19 @@ + case RFT_FITS: strcat(str,"FITS file"); break; + default: strcat(str,"file of unknown type"); break; + } +- +- ++ ++ + /* find out length of original file */ + { FILE *fp; + long filesize; + char buf[64]; +- ++ + fp = fopen(bf->name, "r"); + if (fp) { + fseek(fp, 0L, 2); + filesize = ftell(fp); + fclose(fp); +- ++ + sprintf(buf," (%ld bytes)", filesize); + strcat(str, buf); + } +@@ -3609,17 +3608,17 @@ + bf->w = iwide; + bf->h = ihigh; + bf->ftype = BF_HAVEIMG; +- ++ + bf->ximage = Pic8ToXImage(icon8, (u_int) iwide, (u_int) ihigh, browcols, + browR, browG, browB); +- ++ + free(icon24); + free(pinfo.pic); + } + + + +- ++ + + + /* +@@ -3682,7 +3681,7 @@ + /* read comments until we see '#END_OF_COMMENTS', or hit EOF */ + while (1) { + if (!fgets(buf, 256, fp)) goto errexit; +- ++ + if (!strncmp(buf, "#END_OF_COMMENTS", strlen("#END_OF_COMMENTS"))) + break; + +@@ -3714,7 +3713,7 @@ + + + /* read width, height, maxval */ +- if (!fgets(buf, 256, fp) || sscanf(buf, "%d %d %d", &w, &h, &mv) != 3) ++ if (!fgets(buf, 256, fp) || sscanf(buf, "%d %d %d", &w, &h, &mv) != 3) + goto errexit; + + +@@ -3738,14 +3737,14 @@ + bf->h = h; + bf->ftype = BF_HAVEIMG; + bf->imginfo = info; +- +- bf->ximage = Pic8ToXImage(icon8, (u_int) w, (u_int) h, browcols, ++ ++ bf->ximage = Pic8ToXImage(icon8, (u_int) w, (u_int) h, browcols, + browR, browG, browB); + } + else { + if (info) free(info); + } +- ++ + fclose(fp); + return; + +@@ -3757,7 +3756,7 @@ + } + + +- ++ + /***************************************************************/ + static void writeThumbFile(br, bf, icon8, w, h, info) + BROWINFO *br; +@@ -3787,7 +3786,7 @@ + + fp = fopen(thFname, "w"); + if (!fp) { +- sprintf(buf, "Can't create thumbnail file '%s': %s", thFname, ++ sprintf(buf, "Can't create thumbnail file '%s': %s", thFname, + ERRSTR(errno)); + setBrowStr(br, buf); + return; /* can't write... */ +@@ -3829,9 +3828,9 @@ + setBrowStr(br, buf); + return; /* can't write... */ + } +- ++ + fclose(fp); +- ++ + chmod(thFname, (mode_t) perm); + } + +@@ -3915,7 +3914,7 @@ + + if (s1 || s2 || filest.st_mtime > thumbst.st_mtime || + filest.st_ctime > thumbst.st_ctime) { +- /* either stat'ing the file or the thumbfile failed, or ++ /* either stat'ing the file or the thumbfile failed, or + both stat's succeeded and the file has a newer mod or creation + time than the thumbnail file */ + +@@ -3926,8 +3925,8 @@ + + if (bf->ftype != BF_EXE) { + iconsBuilt++; +- if (DEBUG) +- fprintf(stderr,"icon made:fname='%s' thfname='%s' %d,%d,%d,%d\n", ++ if (DEBUG) ++ fprintf(stderr,"icon made:fname='%s' thfname='%s' %d,%d,%ld,%ld\n", + bf->name, thfname, s1,s2,filest.st_mtime,thumbst.st_mtime); + } + } +@@ -3974,7 +3973,7 @@ + } + } + statcount++; +- ++ + if ((statcount % 30)==0) WaitCursor(); + } + closedir(dirp); +@@ -3998,16 +3997,16 @@ + { + if (maxcnt<1) return; /* none of that naughty ol' divide by zero stuff */ + +- DrawTempGauge(br->win, 5, br->dirMB.y, ++ DrawTempGauge(br->win, 5, br->dirMB.y, + (int) br->dirMB.x-10, (int) br->dirMB.h, + (double) cnt / (double) maxcnt, + browfg, browbg, browhi, browlo, ""); + } +- ++ + static void clearTemp(br) + BROWINFO *br; + { +- XClearArea(theDisp, br->win, 5, br->dirMB.y, ++ XClearArea(theDisp, br->win, 5, br->dirMB.y, + (u_int) br->dirMB.x-10+1, (u_int) br->dirMB.h + 1, True); + } + +@@ -4048,7 +4047,7 @@ + /* find the selected file */ + for (i=0; i<br->bfLen && !br->bfList[i].lit; i++); + if (i==br->bfLen) return; /* shouldn't happen */ +- ++ + origname = br->bfList[i].name; num = i; + + if (strcmp(origname, "..")==0) { +@@ -4058,7 +4057,7 @@ + return; + } + +- sprintf(txt, "Enter a new name for the %s '%s':", ++ sprintf(txt, "Enter a new name for the %s '%s':", + (br->bfList[i].ftype==BF_DIR) ? "directory" : "file", + origname); + +@@ -4107,7 +4106,7 @@ + drawIcon(br, num); + + for (i=0; i<MAXBRWIN; i++) { +- if (&binfo[i] != br && strcmp(binfo[i].path, br->path)==0) ++ if (&binfo[i] != br && strcmp(binfo[i].path, br->path)==0) + rescanDir(&binfo[i]); + } + +@@ -4133,7 +4132,7 @@ + if (cdBrow(br)) return; + + buf[0] = '\0'; +- i = GetStrPopUp("Enter name for new directory:", labels, 2, ++ i = GetStrPopUp("Enter name for new directory:", labels, 2, + buf, 128, "/ |\'\"<>,", 0); + if (i) return; /* cancelled */ + +@@ -4161,7 +4160,7 @@ + + /* rescan current br, and all other br's pointing to same directory */ + for (i=0; i<MAXBRWIN; i++) { +- if (strcmp(binfo[i].path, br->path)==0) ++ if (strcmp(binfo[i].path, br->path)==0) + rescanDir(&binfo[i]); + } + +@@ -4179,7 +4178,7 @@ + int i; + static char buf[MAXPATHLEN+100]; + static char *labels[] = { "\nOk", "\033Cancel" }; +- char str[512]; ++ char str[512]; + + buf[0] = '\0'; + i = GetStrPopUp("Change to directory:", labels, 2, buf, MAXPATHLEN, " ", 0); +@@ -4226,7 +4225,7 @@ + */ + + BFIL *bf; +- int i, j, numdirs, numfiles, slen, firstdel; ++ int i, numdirs, numfiles, slen, firstdel; + char buf[512]; + static char *yesno[] = { "\004Delete", "\033Cancel" }; + +@@ -4258,7 +4257,7 @@ + } + + +- /* if any plain files are being toasted, bring up the low-key ++ /* if any plain files are being toasted, bring up the low-key + confirmation box */ + + if (numfiles) { +@@ -4281,7 +4280,7 @@ + i = PopUp(buf, yesno, 2); + if (i) return; /* cancelled */ + } +- ++ + + /* if any directories are being toasted, bring up the are you REALLY sure + confirmation box */ +@@ -4309,7 +4308,7 @@ + + + /* okay, at this point they've been warned. do the deletion */ +- ++ + for (i=0, bf=br->bfList; i<br->bfLen; i++,bf++) { + if (bf->lit) { + if (bf->ftype == BF_DIR) rm_dir (br, bf->name); +@@ -4340,7 +4339,7 @@ + + /* rescan other br's that are looking at this directory */ + for (i=0; i<MAXBRWIN; i++) { +- if (&binfo[i] != br && strcmp(binfo[i].path, br->path)==0) ++ if (&binfo[i] != br && strcmp(binfo[i].path, br->path)==0) + rescanDir(&binfo[i]); + } + +@@ -4356,7 +4355,7 @@ + int i; + static char buf[MAXPATHLEN+100]; + static char *labels[] = { "\nOk", "\033Cancel" }; +- char str[512]; ++ char str[512]; + + buf[0] = '\0'; + strcpy(str,"Select file name(s). Wildcard '*' is allowed. "); +@@ -4396,7 +4395,7 @@ + { + int i; + static char *labels[] = { "\nOk", "\033Cancel" }; +- char str[512]; ++ char str[512]; + + strcpy(str,"Recursive Update: This could take *quite* a while.\n"); + strcat(str,"Are you sure?"); +@@ -4415,7 +4414,7 @@ + + + /*******************************************/ +-static void recurseUpdate(br, subdir) ++static void recurseUpdate(br, subdir) + BROWINFO *br; + char *subdir; + { +@@ -4430,7 +4429,7 @@ + * and for each subdir in this dir, recurse + * + * if cur dir != orig dir, cd back to orig dir and reload 'br' +- */ ++ */ + + int i; + char orgDir[MAXPATHLEN + 2]; +@@ -4449,7 +4448,7 @@ + } + + xv_getwd(curDir, sizeof(curDir)); +- ++ + /* have we looped? */ + for (i=0; i<dirStackLen && strcmp(curDir, dirStack[i]); i++); + if (i<dirStackLen) { /* YES */ +@@ -4481,8 +4480,8 @@ + /* do subdirectories of this directory, not counting . .. and .xvpics */ + for (i=0; i<br->bfLen; i++) { + bf = &(br->bfList[i]); +- if (bf && +- bf->ftype == BF_DIR && ++ if (bf && ++ bf->ftype == BF_DIR && + strcmp(bf->name, ".") && + strcmp(bf->name, "..") && + strcmp(bf->name, THUMBDIRNAME) ) { +@@ -4524,7 +4523,7 @@ + tmp = (char *) rindex(buf1, '/'); + if (!tmp) strcpy(buf1,"."); + else *tmp = '\0'; +- ++ + sprintf(buf, "%s/%s/%s", buf1, THUMBDIR, BaseName(name)); + if (DEBUG) fprintf(stderr," (%s)\n", buf); + +@@ -4548,7 +4547,7 @@ + BROWINFO *br; + { + /* recursively delete this directory, and all things under it */ +- ++ + int i, dirlen, longpath, oldpathlen; + char **names, *name, buf[512]; + struct stat st; +@@ -4569,7 +4568,7 @@ + name = names[i]; + + /* skip . and .. (not that we should ever see them... */ +- if (name[0] == '.' && (name[1]=='\0' || ++ if (name[0] == '.' && (name[1]=='\0' || + (name[1]=='.' && name[2]=='\0'))) goto done; + + if (strlen(name) + oldpathlen >= (MAXPATHLEN-3)) { +@@ -4586,7 +4585,7 @@ + rmdirPath[oldpathlen] = '\0'; + goto done; + } +- ++ + if (stat2bf((u_int) st.st_mode) == BF_DIR) { /* skip, for now */ + rmdirPath[oldpathlen] = '\0'; + continue; /* don't remove from list */ +@@ -4594,7 +4593,7 @@ + + rm_file(br, rmdirPath); + rmdirPath[oldpathlen] = '\0'; +- ++ + done: /* remove name from list */ + free(name); + names[i] = (char *) NULL; +@@ -4645,19 +4644,19 @@ + + + /*******************************************/ +-static void dragFiles(srcBr, dstBr, srcpath, dstpath, dstdir, ++static void dragFiles(srcBr, dstBr, srcpath, dstpath, dstdir, + names, nlen, cpymode) + BROWINFO *srcBr, *dstBr; + char *srcpath, *dstpath, *dstdir, **names; + int nlen, cpymode; + { +- /* move or copy file(s) and their associated thumbnail files. ++ /* move or copy file(s) and their associated thumbnail files. + srcpath and dstpath will have trailing '/'s. dstdir is name of + folder in dstpath (or "." or "..") to write to. names is an nlen + long array of strings (the simple filenames of the files to move) + if 'cpymode' copy files, otherwise move them */ + +- int i, j, k, dothumbs, fail; ++ int i, j, dothumbs, fail; + char dstp[MAXPATHLEN + 1]; + char src[MAXPATHLEN+1], dst[MAXPATHLEN+1]; + char buf[128]; +@@ -4750,7 +4749,7 @@ + + + /* clear all files in the destination folder */ +- for (i=0; i<dstBr->bfLen; i++) { ++ for (i=0; i<dstBr->bfLen; i++) { + dstBr->bfList[i].lit = 0; + } + dstBr->numlit = 0; +@@ -4760,10 +4759,10 @@ + for (i=0; i<nlen; i++) { + char *name; BFIL *bf; + name = names[i]; +- for (j=0, bf=dstBr->bfList; ++ for (j=0, bf=dstBr->bfList; + j<dstBr->bfLen && strcmp(name, bf->name)!=0; j++, bf++); +- if (j<dstBr->bfLen) { +- bf->lit = 1; dstBr->numlit++; ++ if (j<dstBr->bfLen) { ++ bf->lit = 1; dstBr->numlit++; + } + } + +@@ -4783,10 +4782,10 @@ + changedNumLit(srcBr, -1, 0); + + +- if (fail) sprintf(buf, "Some files were not %s because of errors.", ++ if (fail) sprintf(buf, "Some files were not %s because of errors.", + cpymode ? "copied" : "moved"); + +- else if (nlen>1) sprintf(buf, "%d files %s", nlen, ++ else if (nlen>1) sprintf(buf, "%d files %s", nlen, + (cpymode) ? "copied" : "moved"); + else buf[0] = '\0'; + setBrowStr(srcBr, buf); +@@ -4824,7 +4823,7 @@ + dstdir = (stat2bf((u_int) st.st_mode) == BF_DIR); + + if (overwrite==OWRT_ASK) { +- sprintf(buf, "%s '%s' exists.\n\nOverwrite?", ++ sprintf(buf, "%s '%s' exists.\n\nOverwrite?", + dstdir ? "Directory" : "File", dst); + i = PopUp(buf, owbuts, 4); + +@@ -4848,7 +4847,7 @@ + } + } + +- ++ + if (!rename(src, dst)) return 0; /* Ok */ + if (errno != EXDEV) return 1; /* failure, of some sort */ + +@@ -4896,7 +4895,7 @@ + /* possible cases: source is either a file or a directory, or doesn't exist, + destination is either a file, a directory, or doesn't exist. + +- if source doesn't exist, nothing to do. ++ if source doesn't exist, nothing to do. + if source is a file: + if dest is a file, popup 'overwriting' question, delete file if ok + if dest is a dir, popup 'overwriting dir' question, delete dir if ok +@@ -4957,7 +4956,7 @@ + /* destination doesn't exist no more, if it ever did... */ + userMask = umask(0); /* grab the umask */ + umask((mode_t) userMask); /* put it back... */ +- ++ + + strcpy(cpSrcPath, src); + strcpy(cpDstPath, dst); +@@ -5017,7 +5016,7 @@ + called recursively by cp_dir, there are *no* guarantees that either file + exists or not */ + +- int i, havedst; ++ int havedst; + struct stat srcSt, dstSt; + + if (stat(cpSrcPath, &srcSt)) { /* src doesn't exist, usefully... */ +@@ -5037,7 +5036,7 @@ + } + + +- switch(stat2bf((u_int) srcSt.st_mode)) { ++ switch(stat2bf((u_int) srcSt.st_mode)) { + /* determine how to copy, by filetype */ + + /* NOTE: There is no S_IFLNK case here, since we're using 'stat()' and +@@ -5059,12 +5058,12 @@ + return; + } + } +- ++ + cp_dir(); + if (!havedst) chmod(cpDstPath, srcSt.st_mode); +- ++ + break; +- ++ + + case BF_CHR: + case BF_BLK: cp_special(&srcSt, havedst); break; +@@ -5089,12 +5088,12 @@ + { + int i, dirlen, oldsrclen, olddstlen, longpath; + char **names, *name; +- struct stat srcSt, dstSt; ++ struct stat srcSt; + + + /* src and dst directories both exists now. copy entries */ + +- if (DEBUG) fprintf(stderr,"cp_dir: src='%s', dst='%s'\n", ++ if (DEBUG) fprintf(stderr,"cp_dir: src='%s', dst='%s'\n", + cpSrcPath, cpDstPath); + + longpath = 0; +@@ -5110,9 +5109,9 @@ + + for (i=0; i<dirlen && overwrite!=OWRT_CANCEL; i++) { + name = names[i]; +- if (name[0] == '.' && (name[1]=='\0' || ++ if (name[0] == '.' && (name[1]=='\0' || + (name[1]=='.' && name[2]=='\0'))) goto done; +- ++ + /* add name to src and dst paths */ + if ((strlen(name) + oldsrclen >= (MAXPATHLEN-3)) || + (strlen(name) + olddstlen >= (MAXPATHLEN-3))) { +@@ -5130,12 +5129,12 @@ + cpSrcPath[oldsrclen] = '\0'; + goto done; + } +- ++ + if (stat2bf((u_int) srcSt.st_mode) == BF_DIR) { + cpSrcPath[oldsrclen] = '\0'; + continue; /* don't remove from list, just skip */ + } +- ++ + strcat(cpDstPath, "/"); + strcat(cpDstPath, name); + cp(); /* RECURSE */ +@@ -5169,7 +5168,7 @@ + strcat(cpDstPath, name); + + cp(); /* RECURSE */ +- ++ + cpSrcPath[oldsrclen] = '\0'; + cpDstPath[olddstlen] = '\0'; + } +@@ -5191,10 +5190,10 @@ + /*****************************/ + { + register int srcFd, dstFd, rcount, wcount, i; +- char str[512], buf[8192]; ++ char buf[8192]; + static char *owbuts[4] = { "\nOk", "dDon't Ask", "nNo", "\033Cancel" }; + +- if (DEBUG) fprintf(stderr,"cp_file: src='%s', dst='%s'\n", ++ if (DEBUG) fprintf(stderr,"cp_file: src='%s', dst='%s'\n", + cpSrcPath, cpDstPath); + + if ((srcFd = open(cpSrcPath, O_RDONLY, 0)) == -1) { +@@ -5255,7 +5254,7 @@ + int exists; + /*********************************/ + { +- if (DEBUG) fprintf(stderr,"cp_spec: src='%s', dst='%s'\n", ++ if (DEBUG) fprintf(stderr,"cp_spec: src='%s', dst='%s'\n", + cpSrcPath, cpDstPath); + + if (exists && unlink(cpDstPath)) { +@@ -5281,7 +5280,7 @@ + int exists; + /*********************************/ + { +- if (DEBUG) fprintf(stderr,"cp_fifo: src='%s', dst='%s'\n", ++ if (DEBUG) fprintf(stderr,"cp_fifo: src='%s', dst='%s'\n", + cpSrcPath, cpDstPath); + + #ifdef S_IFIFO +@@ -5302,12 +5301,12 @@ + + + +- ++ + /*********************************/ + static int stat2bf(uistmode) + u_int uistmode; + { +- /* given the 'st.st_mode' field from a successful stat(), returns ++ /* given the 'st.st_mode' field from a successful stat(), returns + BF_FILE, BF_DIR, BF_BLK, BF_CHR, BF_FIFO, or BF_SOCK. Does *NOT* + return BF_EXE */ + +@@ -5357,8 +5356,8 @@ + static int selmatch1(name, arg) + char *name, *arg; + { +- /* returns non-zero if 'name' matches 'arg'. Any '*' chars found in arg +- are considered wildcards that match any number of characters, ++ /* returns non-zero if 'name' matches 'arg'. Any '*' chars found in arg ++ are considered wildcards that match any number of characters, + including zero. */ + + char *sp, *oldnp; +@@ -5379,7 +5378,7 @@ + while (*name) name++; + while (*arg ) arg++; + name--; arg--; +- ++ + while (*arg != '*') { + if (*arg != *name || name<oldnp) return 0; + arg--; name--; +@@ -5388,7 +5387,7 @@ + } + + else { /* there are more '*'s in arg... */ +- /* find the first occurrence of the string between the two '*'s. ++ /* find the first occurrence of the string between the two '*'s. + if the '*'s are next to each other, just throw away the first one */ + + arg++; /* points to char after first '*' */ +@@ -5410,7 +5409,7 @@ + arg = sp+1; + } + } +- } ++ } + } + + if (!*arg && !*name) return 1; +diff -ruN xv-3.10a/xvbutt.c xv-3.10a-bugfixes/xvbutt.c +--- xv-3.10a/xvbutt.c 1995-01-03 13:19:51.000000000 -0800 ++++ xv-3.10a-bugfixes/xvbutt.c 2004-05-16 18:01:29.000000000 -0700 +@@ -1,4 +1,4 @@ +-/* ++/* + * xvbutt.c - regular, 'radio', 'checkbox', and 'menu' pushbuttons + * + * callable functions: +@@ -16,7 +16,7 @@ + * RBSetActive() - sets active status of an RBUTT + * RBClick() - finds clicked-on rb in a list + * RBTrack() - tracks rb after click, until release +- * ++ * + * CBCreate() - create a CBUTT (checkbox button) + * CBRedraw() - redraw a CBUTT + * CBSetActive() - change active status of a CBUTT +@@ -26,7 +26,7 @@ + * MBCreate() - create a MBUTT (menu button) + * MBRedraw() - redraw a MBUTT + * MBSetActive() - change active status of a MBUTT +- * MBWhich() - returns # of first checked selection ++ * MBWhich() - returns # of first checked selection + * MBSelect() - similar to RBSelect() ... + * MBClick() - returns true if given MB was clicked on + * MBTrack() - tracks MBUTT after click, until release +@@ -116,7 +116,7 @@ + void BTRedraw(bp) + BUTT *bp; + { +- int i,x,y,r,x1,y1; ++ int x,y,r,x1,y1; + unsigned int w,h; + XPoint tpts[10], bpts[10], ipts[5]; + +@@ -170,13 +170,13 @@ + XSetForeground(theDisp, theGC, bp->fg); + XDrawLines(theDisp, bp->win, theGC, ipts, 5, CoordModeOrigin); /* inset */ + +- XDrawLine(theDisp, bp->win, theGC, x+1, y + 1, ++ XDrawLine(theDisp, bp->win, theGC, x+1, y + 1, + ipts[0].x, ipts[0].y); + XDrawLine(theDisp, bp->win, theGC, x+1, y + (int) h - 1, + ipts[1].x, ipts[1].y); + XDrawLine(theDisp, bp->win, theGC, x + (int) w - 1, y + (int) h - 1, + ipts[2].x, ipts[2].y); +- XDrawLine(theDisp, bp->win, theGC, x + (int) w - 1, y+1, ++ XDrawLine(theDisp, bp->win, theGC, x + (int) w - 1, y+1, + ipts[3].x, ipts[3].y); + + if (bp->lit) { +@@ -184,12 +184,12 @@ + XDrawRectangle(theDisp, bp->win, theGC, x+1, y+1, w-2, h-2); + } + } +- ++ + else { /* ctrlColor */ + XSetForeground(theDisp, theGC, bp->bg); + XFillRectangle(theDisp, bp->win, theGC, x+1, y+1, w-1, h-1); + +- Draw3dRect(bp->win, x+1, y+1, w-2, h-2, R3D_OUT, bp->fwidth, ++ Draw3dRect(bp->win, x+1, y+1, w-2, h-2, R3D_OUT, bp->fwidth, + bp->hi, bp->lo, bp->bg); + + XSetForeground(theDisp, theGC, bp->fg); +@@ -198,7 +198,7 @@ + if (bp->lit) + XDrawRectangle(theDisp, bp->win, theGC, x+1, y+1, w-2, h-2); + } +- ++ + + + +@@ -210,7 +210,7 @@ + + XSetBackground(theDisp, theGC, bp->bg); + +- if (bp->colorpix) ++ if (bp->colorpix) + XCopyArea (theDisp,bp->pix, bp->win, theGC, 0,0,bp->pw,bp->ph, x1,y1); + else + XCopyPlane(theDisp,bp->pix, bp->win, theGC, 0,0,bp->pw,bp->ph, x1,y1,1L); +@@ -262,15 +262,15 @@ + if (bp->lit==inval && PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) { + bp->lit = !inval; BTRedraw(bp); XFlush(theDisp); + } +- ++ + if (bp->lit!=inval && !PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) { + bp->lit = inval; BTRedraw(bp); XFlush(theDisp); + } + } + + rval = (bp->lit != inval); +- +- if (bp->lit && !bp->toggle) ++ ++ if (bp->lit && !bp->toggle) + { bp->lit = 0; BTRedraw(bp); XFlush(theDisp); } + + return(rval); +@@ -295,13 +295,13 @@ + { + /* mallocs an RBUTT, fills in the fields, and appends it to rblist + if rblist is NULL, this is the first rb in the list. It will +- be made the 'selected' one ++ be made the 'selected' one + +- Note: no need to check return status. It'll fatal error if it ++ Note: no need to check return status. It'll fatal error if it + can't malloc */ + + RBUTT *rb, *rbptr; +- Pixmap rb_frame, rb_frame1, rb_top, rb_bot, rb_dtop, rb_dbot, rb_body, ++ Pixmap rb_frame, rb_frame1, rb_top, rb_bot, rb_dtop, rb_dbot, rb_body, + rb_dot; + + rb = (RBUTT *) malloc(sizeof(RBUTT)); +@@ -348,7 +348,7 @@ + rb_off = XCreatePixmap(theDisp, rootW, RBSIZE, RBSIZE, dispDEEP); + rb_off1 = XCreatePixmap(theDisp, rootW, RBSIZE, RBSIZE, dispDEEP); + +- if (!rb_frame || !rb_frame1 || !rb_top || !rb_bot || !rb_dtop || ++ if (!rb_frame || !rb_frame1 || !rb_top || !rb_bot || !rb_dtop || + !rb_dbot || !rb_body || !rb_dot || !rb_on || !rb_on1 || + !rb_off || !rb_off1) + FatalError("unable to create radio-button pixmaps"); +@@ -410,7 +410,7 @@ + XFillRectangle(theDisp, rb_on, theGC, 0,0,RBSIZE,RBSIZE); + XFillRectangle(theDisp, rb_on1, theGC, 0,0,RBSIZE,RBSIZE); + } +- ++ + XSetStipple(theDisp, theGC, rb_frame); + XSetForeground(theDisp, theGC, fg); + XFillRectangle(theDisp, rb_on, theGC, 0,0,RBSIZE,RBSIZE); +@@ -437,7 +437,7 @@ + + return(rb); + } +- ++ + + + +@@ -475,23 +475,23 @@ + int lit; + { + /* draws the rb being pointed at */ +- ++ + Pixmap pix; +- ++ + if (!rb) return; /* rb = NULL */ +- ++ + XSetForeground(theDisp, theGC, rb->fg); +- ++ + if (rb->selected) { pix = (lit) ? rb_on1 : rb_on; } + else { pix = (lit) ? rb_off1 : rb_off; } +- ++ + XCopyArea(theDisp, pix, rb->win, theGC, 0,0,RBSIZE,RBSIZE, rb->x, rb->y); +- DrawString(rb->win, rb->x + RBSIZE + 4, ++ DrawString(rb->win, rb->x + RBSIZE + 4, + rb->y + RBSIZE/2 - CHIGH/2 + ASCENT, rb->str); + + if (!rb->active) { /* if non-active, dim button and string */ + DimRect(rb->win, rb->x, rb->y, RBSIZE, RBSIZE, rb->bg); +- DimRect(rb->win, rb->x + RBSIZE + 4, rb->y + RBSIZE/2 - CHIGH/2, ++ DimRect(rb->win, rb->x + RBSIZE + 4, rb->y + RBSIZE/2 - CHIGH/2, + (u_int) StringWidth(rb->str), (u_int) CHIGH, rb->bg); + } + } +@@ -527,19 +527,19 @@ + } + + +- ++ + /***********************************************/ + int RBWhich(rblist) + RBUTT *rblist; + { + int i; +- ++ + /* returns index of currently selected rb. if none, returns -1 */ +- ++ + i = 0; +- while (rblist && !rblist->selected) ++ while (rblist && !rblist->selected) + { rblist = (RBUTT *) rblist->next; i++; } +- ++ + if (!rblist) return -1; /* didn't find one */ + return i; + } +@@ -550,9 +550,9 @@ + RBUTT *rblist; + { + int i; +- ++ + /* returns # of rb's in the list */ +- ++ + i = 0; + while (rblist) { rblist = (RBUTT *) rblist->next; i++; } + return i; +@@ -566,13 +566,13 @@ + { + RBUTT *rb; + int i; +- ++ + /* sets 'active' status of rb #n. does redrawing */ +- ++ + rb=rblist; i=0; + while (rb && i!=n) { rb = (RBUTT *) rb->next; i++; } + if (!rb) return; /* n out of range. do nothing */ +- ++ + if (rb->active != act) { + rb->active = act; + drawRB(rb, 0); +@@ -588,13 +588,13 @@ + int i; + + /* searches through rblist to see if mouse click at mx,my is in the +- clickable region of any of the rb's. If it finds one, it returns ++ clickable region of any of the rb's. If it finds one, it returns + it's index in the list. If not, returns -1 */ + + i = 0; + while (rblist) { + if (PTINRECT(mx, my, rblist->x, rblist->y, RBSIZE, RBSIZE)) break; +- ++ + rblist = (RBUTT *) rblist->next; + i++; + } +@@ -613,9 +613,9 @@ + Window rW, cW; + int i, x, y, rx, ry, lit, rv; + unsigned int mask; +- ++ + /* returns '1' if selection changed */ +- ++ + rb=rblist; i=0; + while (rb && i!=n) { rb = (RBUTT *) rb->next; i++; } + if (!rb) return 0; /* n out of range */ +@@ -637,7 +637,7 @@ + drawRB(rb, lit); + XFlush(theDisp); + } +- ++ + if (lit && !PTINRECT(x, y, rb->x, rb->y, RBSIZE, RBSIZE)) { + lit=0; + drawRB(rb, lit); +@@ -690,14 +690,14 @@ + do so. We'll be needing them, y'see... */ + + if (!cbpixmade) { +- cbcheck = XCreatePixmapFromBitmapData(theDisp, rootW, ++ cbcheck = XCreatePixmapFromBitmapData(theDisp, rootW, + (char *) cb_check_bits, + cb_check_width, cb_check_height, fg, bg, dispDEEP); + + cbpixmade = 1; + } + } +- ++ + + + +@@ -708,25 +708,25 @@ + /* draws the cb being pointed at */ + + XSetForeground(theDisp, theGC, cb->bg); +- XFillRectangle(theDisp, cb->win, theGC, cb->x+2, cb->y+2, ++ XFillRectangle(theDisp, cb->win, theGC, cb->x+2, cb->y+2, + XVCBSIZE-3,XVCBSIZE-3); + + XSetForeground(theDisp, theGC, cb->fg); + XDrawRectangle(theDisp, cb->win, theGC, cb->x, cb->y, XVCBSIZE, XVCBSIZE); + Draw3dRect(cb->win, cb->x+1, cb->y+1, XVCBSIZE-2, XVCBSIZE-2, R3D_OUT, 2, +- cb->hi, cb->lo, cb->bg); ++ cb->hi, cb->lo, cb->bg); + +- if (cb->val) XCopyArea(theDisp, cbcheck, cb->win, theGC, +- 0, 0, cb_check_width, cb_check_height, ++ if (cb->val) XCopyArea(theDisp, cbcheck, cb->win, theGC, ++ 0, 0, cb_check_width, cb_check_height, + cb->x+3, cb->y+3); +- ++ + XSetForeground(theDisp, theGC, cb->fg); +- DrawString(cb->win, cb->x + XVCBSIZE+4, ++ DrawString(cb->win, cb->x + XVCBSIZE+4, + cb->y+XVCBSIZE/2 - CHIGH/2 + ASCENT, cb->str); + + if (!cb->active) { /* if non-active, dim button and string */ + DimRect(cb->win, cb->x, cb->y, XVCBSIZE, XVCBSIZE, cb->bg); +- DimRect(cb->win, cb->x + XVCBSIZE+4, cb->y+XVCBSIZE/2 - CHIGH/2, ++ DimRect(cb->win, cb->x + XVCBSIZE+4, cb->y+XVCBSIZE/2 - CHIGH/2, + (u_int) StringWidth(cb->str), (u_int) CHIGH, cb->bg); + } + } +@@ -761,7 +761,6 @@ + Window rW, cW; + int x, y, rx, ry, lit; + unsigned int mask; +- Pixmap litpix, darkpix; + + /* called once we've figured out that the mouse clicked in 'cb' */ + +@@ -782,7 +781,7 @@ + drawCB(cb,lit); + XFlush(theDisp); + } +- ++ + if (lit && !PTINRECT(x, y, cb->x, cb->y, XVCBSIZE, XVCBSIZE)) { + lit=0; + drawCB(cb,lit); +@@ -809,28 +808,28 @@ + { + /* draws highlighting */ + if (lit) { +- if (ctrlColor) ++ if (ctrlColor) + Draw3dRect(cb->win, cb->x+1, cb->y+1, XVCBSIZE-2, XVCBSIZE-2, R3D_IN, 2, + cb->hi, cb->lo, cb->bg); + else { + XSetForeground(theDisp, theGC, cb->fg); +- XDrawRectangle(theDisp, cb->win, theGC, cb->x+1, cb->y+1, ++ XDrawRectangle(theDisp, cb->win, theGC, cb->x+1, cb->y+1, + XVCBSIZE-2, XVCBSIZE-2); + } + } + + else { +- if (ctrlColor) ++ if (ctrlColor) + Draw3dRect(cb->win, cb->x+1, cb->y+1, XVCBSIZE-2, XVCBSIZE-2, R3D_OUT, 2, + cb->hi, cb->lo, cb->bg); + else { + XSetForeground(theDisp, theGC, cb->bg); +- XDrawRectangle(theDisp, cb->win, theGC, cb->x+1, cb->y+1, ++ XDrawRectangle(theDisp, cb->win, theGC, cb->x+1, cb->y+1, + XVCBSIZE-2, XVCBSIZE-2); + } + } + } +- ++ + + + /******************* MBUTT ROUTINES ************************/ +@@ -851,7 +850,7 @@ + XSetWindowAttributes xswa; + unsigned long xswamask; + int i; +- ++ + if (!mbpixmade) { + mbchk = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) mb_chk_bits, + mb_chk_width, mb_chk_height, fg, bg, dispDEEP); +@@ -889,7 +888,7 @@ + xswa.save_under = True; + xswamask = CWBackPixel | CWBorderPixel | CWSaveUnder; + +- mb->mwin = XCreateWindow(theDisp, mb->win, x, y, w, h, ++ mb->mwin = XCreateWindow(theDisp, mb->win, x, y, w, h, + (u_int) 2, (int) dispDEEP, InputOutput, + theVisual, xswamask, &xswa); + +@@ -898,7 +897,7 @@ + XSelectInput(theDisp, mb->mwin, ExposureMask | VisibilityChangeMask); + XSetTransientForHint(theDisp, mb->mwin, mb->win); + } +- ++ + + + +@@ -908,15 +907,15 @@ + { + /* draws a menu button in it's normal state. (When it's actively being + used (to select an item), all drawing is handled in MBTrack) */ +- ++ + int x,y,i,r,x1,y1; + unsigned int w,h; +- ++ + r = 2; /* amt of shadow */ + x = mb->x; y = mb->y; w = mb->w; h = mb->h; +- x1 = x + (int) w; ++ x1 = x + (int) w; + y1 = y + (int) h; +- ++ + XSetForeground(theDisp, theGC, mb->bg); + XFillRectangle(theDisp, mb->win, theGC, x+1, y+1, w-1, h-1); + +@@ -940,7 +939,7 @@ + XSetBackground(theDisp, theGC, mb->bg); + XCopyPlane(theDisp, mb->pix, mb->win, theGC, 0,0, + (u_int) mb->pw, (u_int) mb->ph, x1,y1, 1L); +- if (!mb->active) ++ if (!mb->active) + DimRect(mb->win, x1,y1, (u_int) mb->pw, (u_int) mb->ph, mb->bg); + } + +@@ -997,14 +996,14 @@ + MBUTT *mb; + { + /* returns index of first checked selection, or '-1' if nothing selected */ +- ++ + int i; + + if (!mb->hascheck) return -1; + + for (i=0; i<mb->nlist; i++) + if (mb->flags[i]) return i; +- ++ + return -1; + } + +@@ -1017,13 +1016,13 @@ + /* makes entry #n the selected entry (ie, the only one with a check mark) + Does all redrawing. Does nothing if entry #n already selected. + Don't let it select 'dim' entries */ +- ++ + int i; +- ++ + if (n<0 || n>mb->nlist) return; /* # out of range */ + if (!mb->hascheck) return; /* shouldn't happen */ + if (mb->flags[n]) return; /* already selected */ +- ++ + for (i=0; i<MAXMBLEN; i++) mb->flags[i] = 0; + + mb->flags[n] = 1; +@@ -1083,7 +1082,7 @@ + } + } + mwide += 8; /* extra room at edges */ +- ++ + /* make wider if any checked menu items */ + for (i=0; i<mb->nlist && !mb->flags[i]; i++); + hascheck = (i<mb->nlist || mb->hascheck); +@@ -1091,7 +1090,7 @@ + if (hascheck && mb->title) mwide += 8; + + if (mwide < (mb->w+1)) mwide = mb->w+1; /* at least as wide as button */ +- ++ + mhigh = mb->nlist * LINEHIGH + 2 + extratop; + + mx = mb->x-1; my = mb->y - 1; +@@ -1144,10 +1143,10 @@ + } + + if (mb->flags[i]) { +- XCopyArea(theDisp, mbchk, win, theGC, 0, 0, mb_chk_width, mb_chk_height, ++ XCopyArea(theDisp, mbchk, win, theGC, 0, 0, mb_chk_width, mb_chk_height, + x - 10, y - 8); + } +- ++ + if (!strcmp(mb->list[i], MBSEP)) { + mb->dim[i] = 1; /* don't select this one */ + if (ctrlColor) { +@@ -1161,15 +1160,15 @@ + XDrawLine(theDisp,win,theGC,4,y-(ASCENT/2)+1, mwide-5, y-(ASCENT/2)+1); + XSetForeground(theDisp, theGC, mb->fg); + } +- else ++ else + XDrawLine(theDisp, win, theGC, 4, y-(ASCENT/2), mwide-5, y-(ASCENT/2)); + } + else { + DrawString(win, x, y, txtstr); +- if (tabstr) ++ if (tabstr) + DrawString(win, mwide - mtabwide - 4, y, tabstr); + +- if (mb->dim[i]) ++ if (mb->dim[i]) + DimRect(win, x, y-ASCENT, (u_int) mwide, (u_int) CHIGH, mb->bg); + XSetForeground(theDisp, theGC, mb->fg); + } +diff -ruN xv-3.10a/xvcolor.c xv-3.10a-bugfixes/xvcolor.c +--- xv-3.10a/xvcolor.c 1995-01-06 11:29:23.000000000 -0800 ++++ xv-3.10a-bugfixes/xvcolor.c 2004-05-16 18:01:37.000000000 -0700 +@@ -52,7 +52,7 @@ + int pwide, phigh, *pnumcols; + { + /* operates on 8-bit images. sorts the colormap into 'best' order +- * 'order' is the 'best' order to allocate the colors. 'trans' is a ++ * 'order' is the 'best' order to allocate the colors. 'trans' is a + * transformation to be done to pic, cpic, and epic (in PIC8 mode) to + * compress the colormap + */ +@@ -67,22 +67,22 @@ + /* initialize histogram and compute it */ + for (i=0; i<256; i++) hist[i]=0; + for (i=pwide*phigh, p=pic; i; i--, p++) hist[*p]++; +- ++ + if (DEBUG>1) { + fprintf(stderr,"%s: Desired colormap\n",cmd); +- for (i=0; i<256; i++) ++ for (i=0; i<256; i++) + if (hist[i]) fprintf(stderr,"(%3d %02x,%02x,%02x %d)\n", + i,rmap[i],gmap[i],bmap[i], hist[i]); + fprintf(stderr,"\n\n"); + } +- +- ++ ++ + /* put the actually-used colors into the 'c' array in the order they occur + also, while we're at it, calculate ncols, and close up gaps in + colortable */ +- ++ + for (i=ncols=0; i<256; i++) { +- if (hist[i]) { ++ if (hist[i]) { + rmap[ncols] = rmap[i]; + gmap[ncols] = gmap[i]; + bmap[ncols] = bmap[i]; +@@ -104,8 +104,8 @@ + } + xvbcopy((char *) &c[entry], (char *) &c1[0], sizeof(CMAPENT)); + c[entry].use = 0; /* dealt with */ +- +- ++ ++ + /* sort rest of colormap. Half of the entries are allocated on the + basis of distance from already allocated colors, and half on the + basis of usage. (NB: 'taxicab' distance is used throughout this file.) +@@ -116,7 +116,7 @@ + To obtain O(n^2) performance, we keep each unselected color + (in c[], with use>0) marked with the minimum distance to any of + the selected colors (in c1[]). Each time we select a color, we +- can update the minimum distances in O(n) time. ++ can update the minimum distances in O(n) time. + + mod by Tom Lane Tom.Lane@g.gp.cs.cmu.edu */ + +@@ -134,8 +134,8 @@ + for (j=0, cj=c; j<ncols; j++,cj++) { + if (cj->use) { /* this color has not been marked already */ + /* update mindist */ +- d = (cj->r - ckR)*(cj->r - ckR) + +- (cj->g - ckG)*(cj->g - ckG) + ++ d = (cj->r - ckR)*(cj->r - ckR) + ++ (cj->g - ckG)*(cj->g - ckG) + + (cj->b - ckB)*(cj->b - ckB); + if (cj->mindist > d) cj->mindist = d; + if (cj->mindist > mdist) { mdist = cj->mindist; entry = j; } +@@ -148,8 +148,8 @@ + for (j=0, cj=c; j<ncols; j++,cj++) { + if (cj->use) { /* this color has not been marked already */ + /* update mindist */ +- d = (cj->r - ckR)*(cj->r - ckR) + +- (cj->g - ckG)*(cj->g - ckG) + ++ d = (cj->r - ckR)*(cj->r - ckR) + ++ (cj->g - ckG)*(cj->g - ckG) + + (cj->b - ckB)*(cj->b - ckB); + if (cj->mindist > d) cj->mindist = d; + if (cj->use > mdist) { mdist = cj->use; entry = j; } +@@ -162,18 +162,18 @@ + xvbcopy((char *) &c[entry], (char *) &c1[i], sizeof(CMAPENT)); + c[entry].use = 0; + } +- ++ + + for (i=0; i<ncols; i++) order[i] = (byte) c1[i].oldindex; + + if (DEBUG>1) { + fprintf(stderr,"%s: result of sorting colormap\n",cmd); +- for (i=0; i<ncols; i++) ++ for (i=0; i<ncols; i++) + fprintf(stderr,"(%3d %02x,%02x,%02x) ",i,rmap[i],gmap[i],bmap[i]); + fprintf(stderr,"\n\n"); +- ++ + fprintf(stderr,"%s: allocation order table\n",cmd); +- for (i=0; i<ncols; i++) ++ for (i=0; i<ncols; i++) + fprintf(stderr,"order[%d] = -> %d\n", i, order[i]); + fprintf(stderr,"\n"); + } +@@ -240,7 +240,7 @@ + SetISTR(ISTR_COLOR,"Using %s colormap.", + (haveStdCmap == STD_111 ? "2x2x2" : + haveStdCmap == STD_222 ? "4x4x4" : +- haveStdCmap == STD_232 ? "4x8x4" : ++ haveStdCmap == STD_232 ? "4x8x4" : + haveStdCmap == STD_666 ? "6x6x6" : "8x8x4")); + + if (ncols>0) SetISTR(ISTR_COLOR2,stdCmapSuccess); +@@ -251,7 +251,7 @@ + + for (i=0; i<numcols; i++) { + int i332; +- i332 = ((int)rMap[i]&0xe0) | (((int)gMap[i]&0xe0)>>3) | ++ i332 = ((int)rMap[i]&0xe0) | (((int)gMap[i]&0xe0)>>3) | + (((int)bMap[i]&0xc0)>>6); + + cols[i] = stdcols[i332]; +@@ -291,7 +291,7 @@ + } + + else { +- for (i=0; i<nfcols; i++) ++ for (i=0; i<nfcols; i++) + xvFreeColors(theDisp, theCmap, &freecols[i], 1, 0L); + + nfcols = 0; +@@ -314,19 +314,19 @@ + unique = p2alloc = 0; + rwthistime = 0; + +- /* FIRST PASS COLOR ALLOCATION: ++ /* FIRST PASS COLOR ALLOCATION: + for each color in the 'desired colormap', try to get it via + xvAllocColor(). If for any reason it fails, mark that pixel + 'unallocated' and worry about it later. Repeat. */ + +- /* attempt to allocate first ncols entries in colormap ++ /* attempt to allocate first ncols entries in colormap + note: On displays with less than 8 bits per RGB gun, it's quite + possible that different colors in the original picture will be + mapped to the same color on the screen. X does this for you +- silently. However, this is not-desirable for this application, ++ silently. However, this is not-desirable for this application, + because when I say 'allocate me 32 colors' I want it to allocate + 32 different colors, not 32 instances of the same 4 shades... */ +- ++ + + for (i=0; i<256; i++) failed[i] = 1; + +@@ -334,7 +334,7 @@ + + for (i=0; i<numcols && unique<ncols; i++) { + c = colAllocOrder[i]; +- if (mono) { ++ if (mono) { + int intens = MONO(rMap[c], gMap[c], bMap[c]); + defs[c].red = defs[c].green = defs[c].blue = intens<<8; + } +@@ -346,8 +346,8 @@ + + defs[c].flags = DoRed | DoGreen | DoBlue; + +- if (!(colorMapMode==CM_OWNCMAP && cmap==theCmap && CMAPVIS(theVisual)) +- && xvAllocColor(theDisp,cmap,&defs[c])) { ++ if (!(colorMapMode==CM_OWNCMAP && cmap==theCmap && CMAPVIS(theVisual)) ++ && xvAllocColor(theDisp,cmap,&defs[c])) { + unsigned long pixel, *fcptr; + + pixel = cols[c] = defs[c].pixel; +@@ -355,7 +355,7 @@ + gdisp[c] = defs[c].green >> 8; + bdisp[c] = defs[c].blue >> 8; + failed[c]= 0; +- ++ + /* see if the newly allocated color is new and different */ + for (j=0, fcptr=freecols; j<nfcols && *fcptr!=pixel; j++,fcptr++); + if (j==nfcols) unique++; +@@ -365,24 +365,24 @@ + } + + else { +- /* the allocation failed. If we want 'perfect' color, and we haven't ++ /* the allocation failed. If we want 'perfect' color, and we haven't + already created our own colormap, we'll want to do so */ + if ((colorMapMode == CM_PERFECT || colorMapMode == CM_OWNCMAP) + && !LocalCmap && CMAPVIS(theVisual)) { + LocalCmap = XCreateColormap(theDisp, vrootW, theVisual, AllocNone); +- ++ + if (LocalCmap) { /* succeeded, presumably */ + /* free all colors that were allocated, and try again with the + new colormap. This is necessary because 'XCopyColormapAndFree()' + has the unpleasant side effect of freeing up the various + colors I need for the control panel, etc. */ + +- for (i=0; i<nfcols; i++) ++ for (i=0; i<nfcols; i++) + xvFreeColors(theDisp, theCmap, &freecols[i], 1, 0L); +- ++ + if (mainW && !useroot) XSetWindowColormap(theDisp,mainW, LocalCmap); + +- if (mainW && !useroot && cmapInGam) ++ if (mainW && !useroot && cmapInGam) + XSetWindowColormap(theDisp,gamW, LocalCmap); + cmap = LocalCmap; + +@@ -402,9 +402,9 @@ + } + } + } /* FIRST PASS */ +- +- +- ++ ++ ++ + if (nfcols==numcols) { + if (numcols != unique) + SetISTR(ISTR_COLOR,"Got all %d colors. (%d unique)", numcols, +@@ -415,7 +415,7 @@ + SetISTR(ISTR_COLOR2,""); + return; + } +- ++ + + + /* SECOND PASS COLOR ALLOCATION: +@@ -427,7 +427,7 @@ + is in the X colormap. Try to allocate that color (read only). + If that fails, the THIRD PASS will deal with it */ + +- SetISTR(ISTR_COLOR,"Got %d of %d colors. (%d unique)", ++ SetISTR(ISTR_COLOR,"Got %d of %d colors. (%d unique)", + nfcols,numcols,unique); + + /* read entire colormap (or first 256 entries) into 'ctab' */ +@@ -436,28 +436,28 @@ + if (dc>0) { /* only do SECOND PASS if there IS a colormap to read */ + for (i=0; i<dc; i++) ctab[i].pixel = (unsigned long) i; + XQueryColors(theDisp, cmap, ctab, dc); +- ++ + for (i=0; i<numcols && unique<ncols; i++) { + c = colAllocOrder[i]; +- ++ + if (failed[c]) { /* an unallocated pixel */ + int d, mdist, close; + int rd, gd, bd, ri, gi, bi; +- ++ + mdist = 1000000; close = -1; + ri = rMap[c]; gi = gMap[c]; bi = bMap[c]; +- ++ + for (j=0; j<dc; j++) { + rd = ri - (ctab[j].red >>8); + gd = gi - (ctab[j].green>>8); + bd = bi - (ctab[j].blue >>8); +- ++ + d = rd*rd + gd*gd + bd*bd; + if (d<mdist) { mdist=d; close=j; } + } +- ++ + if (close<0) FatalError("This Can't Happen! (How reassuring.)"); +- if (xvAllocColor(theDisp, cmap, &ctab[close])) { ++ if (xvAllocColor(theDisp, cmap, &ctab[close])) { + xvbcopy((char *) &ctab[close], (char *) &defs[c], sizeof(XColor)); + failed[c]= 0; + cols[c] = ctab[close].pixel; +@@ -487,7 +487,7 @@ + + mdist = 1000000; close = -1; + ri = rMap[c]; gi = gMap[c]; bi = bMap[c]; +- ++ + /* search the alloc'd colors */ + for (j=0; j<nfcols; j++) { + k = fc2pcol[j]; +@@ -535,7 +535,7 @@ + unsigned long pmr[1], pix[1]; + c = colAllocOrder[i]; + +- if (cellgroup[c]) { ++ if (cellgroup[c]) { + int n; + /* this color is part of a group. see if its group's + been seen already, and if so, skip this */ +@@ -548,11 +548,11 @@ + } + } + +- if (!(colorMapMode==CM_OWNCMAP && cmap==theCmap && CMAPVIS(theVisual)) && ++ if (!(colorMapMode==CM_OWNCMAP && cmap==theCmap && CMAPVIS(theVisual)) && + XAllocColorCells(theDisp, cmap, False, pmr, 0, pix, 1)) { + defs[c].pixel = cols[c] = pix[0]; + failed[c] = 0; +- if (mono) { ++ if (mono) { + int intens = MONO(rMap[c], gMap[c], bMap[c]); + defs[c].red = defs[c].green = defs[c].blue = intens<<8; + } +@@ -573,20 +573,20 @@ + } + + else { +- if ((colorMapMode == CM_PERFECT || colorMapMode == CM_OWNCMAP) ++ if ((colorMapMode == CM_PERFECT || colorMapMode == CM_OWNCMAP) + && !LocalCmap && CMAPVIS(theVisual)) { + LocalCmap = XCreateColormap(theDisp, vrootW, theVisual, AllocNone); +- ++ + /* free all colors that were allocated, and try again with the + new colormap. This is necessary because 'XCopyColormapAndFree()' + has the unpleasant side effect of freeing up the various + colors I need for the control panel, etc. */ + +- for (i=0; i<nfcols; i++) ++ for (i=0; i<nfcols; i++) + xvFreeColors(theDisp, theCmap, &freecols[i], 1, 0L); +- ++ + if (mainW && !useroot) XSetWindowColormap(theDisp,mainW, LocalCmap); +- if (mainW && !useroot && cmapInGam) ++ if (mainW && !useroot && cmapInGam) + XSetWindowColormap(theDisp,gamW, LocalCmap); + cmap = LocalCmap; + +@@ -608,7 +608,7 @@ + } + + else { +- /* Failed to allocate all colors in picture. Map remaining desired ++ /* Failed to allocate all colors in picture. Map remaining desired + colors into closest allocated desired colors */ + + if (nfcols==0 && !LocalCmap) { +@@ -623,7 +623,7 @@ + allocROColors(); + return; + } +- ++ + SetISTR(ISTR_COLOR,"Got %d of %d colors.", nfcols,numcols); + + for (i=0; i<numcols; i++) { +@@ -662,7 +662,7 @@ + j = fc2pcol[i]; + defs[j].pixel = freecols[i]; + +- if (mono) { ++ if (mono) { + int intens = MONO(rMap[j], gMap[j], bMap[j]); + defs[j].red = defs[j].green = defs[j].blue = intens<<8; + } +@@ -706,9 +706,9 @@ + if (theVisual->class == TrueColor || theVisual->class == DirectColor) { + unsigned long r, g, b, rmask, gmask, bmask, origr, origg, origb; + int rshift, gshift, bshift; +- +- /* shift r,g,b so that high bit of 16-bit color specification is +- * aligned with high bit of r,g,b-mask in visual, ++ ++ /* shift r,g,b so that high bit of 16-bit color specification is ++ * aligned with high bit of r,g,b-mask in visual, + * AND each component with its mask, + * and OR the three components together + */ +@@ -781,7 +781,7 @@ + " mask=%04lx,%04lx,%04lx pix=%08lx\n", + rmask, gmask, bmask, cdef->pixel); + } +- ++ + return 1; + } + else { +@@ -811,7 +811,7 @@ + { + int i, j; + +- /* if regroup is set, we *must* do a full realloc, as the cols[] array ++ /* if regroup is set, we *must* do a full realloc, as the cols[] array + isn't correct anymore. (cell groupings changed) */ + + ApplyECctrls(); /* set {r,g,b}cmap[editColor] based on dial settings */ +@@ -830,16 +830,16 @@ + } + } + +- ++ + /* do something clever if we're using R/W color and this colorcell isn't + shared */ + + if (!regroup && allocMode==AM_READWRITE && rwthistime) { + /* let's try to be clever */ +- /* determine if the editColor cell is unique, or shared (among ++ /* determine if the editColor cell is unique, or shared (among + non-group members, that is) */ + +- for (i=j=0; i<numcols; i++) ++ for (i=j=0; i<numcols; i++) + if (rwpc2pc[i] == rwpc2pc[editColor]) j++; + + /* if this is a group, subtract off the non-this-one pixels from group */ +@@ -901,7 +901,7 @@ + } + + /* shift 0..i-1 down one position */ +- xvbcopy((char *) colAllocOrder, (char *) colAllocOrder+1, ++ xvbcopy((char *) colAllocOrder, (char *) colAllocOrder+1, + i * sizeof(colAllocOrder[0])); + colAllocOrder[0] = editColor; + } +@@ -930,9 +930,9 @@ + * stdfreecols[256] - list of colors to free on exit + * stdnfcols - # of colors to free + * +- * possibly modifies browR, browG, browB, and browcols arrays ++ * possibly modifies browR, browG, browB, and browcols arrays + * (if !browPerfect) +- */ ++ */ + + /* returns '1' if the colors were reallocated, '0' otherwise */ + +@@ -946,18 +946,18 @@ + + /* note: + * if (ncols==0) (ie, we're either on, or emulating a b/w display), +- * build std*[], std*disp[], colormaps, but don't actually ++ * build std*[], std*disp[], colormaps, but don't actually + * allocate any colors. + */ + +- int i,j,r,g,b, desMode, screwed; ++ int i, r,g,b, desMode, screwed; + XColor def; + byte rmap[256],gmap[256],bmap[256],order[256]; + unsigned long descols[256]; + int des2got[256], failed[256]; + int maplen, exactCnt, nearCnt; +- +- ++ ++ + /* generate stdr,stdg,stdb cmap. Same in all cases */ + for (r=0, i=0; r<8; r++) + for (g=0; g<8; g++) +@@ -966,10 +966,10 @@ + stdg[i] = (g*255)/7; + stdb[i] = (b*255)/3; + } +- +- ++ ++ + /* determine what size cmap we should build */ +- if (theVisual->class == TrueColor || ++ if (theVisual->class == TrueColor || + theVisual->class == DirectColor) desMode = STD_332; + else if (colorMapMode == CM_STDCMAP) desMode = STD_232; + else desMode = STD_222; +@@ -983,9 +983,9 @@ + } + + +- if (DEBUG) fprintf(stderr,"MakeStdCmaps: have=%d, des=%d, ncols=%d\n", ++ if (DEBUG) fprintf(stderr,"MakeStdCmaps: have=%d, des=%d, ncols=%d\n", + haveStdCmap, desMode, ncols); +- ++ + if (haveStdCmap != STD_NONE && haveStdCmap == desMode) return 0; + freeStdCmaps(); + +@@ -997,7 +997,7 @@ + for (i=0; i<256; i++) des2got[i] = i; + exactCnt = nearCnt = 0; + +- ++ + if (desMode == STD_111) { /* try to alloc 8 colors */ + /* generate a 1/1/1 desired colormap */ + maplen = 8; +@@ -1009,7 +1009,7 @@ + bmap[i] = (b*255); + } + } +- ++ + else if (desMode == STD_222) { /* try to alloc 64 colors */ + /* generate a 2/2/2 desired colormap */ + maplen = 64; +@@ -1021,7 +1021,7 @@ + bmap[i] = (b*255)/3; + } + } +- ++ + else if (desMode == STD_232) { /* try to alloc 128 colors */ + /* generate a 2/3/2 desired colormap */ + maplen = 128; +@@ -1033,7 +1033,7 @@ + bmap[i] = (b*255)/3; + } + } +- ++ + else if (desMode == STD_666) { /* try to alloc 216 colors */ + /* generate a 6*6*6 desired colormap */ + maplen = 216; +@@ -1045,14 +1045,14 @@ + bmap[i] = (b*255)/5; + } + } +- ++ + else { /* desMode == STD_332 */ + maplen = 256; + for (i=0; i<maplen; i++) { + rmap[i] = stdr[i]; gmap[i] = stdg[i]; bmap[i] = stdb[i]; + } + } +- ++ + + /* sort the colors according to the diversity algorithm... */ + diverseOrder(rmap,gmap,bmap,maplen,order); +@@ -1072,7 +1072,7 @@ + def.red = rmap[order[i]] << 8; + def.green = gmap[order[i]] << 8; + def.blue = bmap[order[i]] << 8; +- ++ + def.flags = DoRed | DoGreen | DoBlue; + + if (xvAllocColor(theDisp, theCmap, &def)) { /* success */ +@@ -1090,34 +1090,34 @@ + + if (numgot != maplen) { + /* PHASE 2: find 'close' colors in colormap, try to alloc those */ +- ++ + /* read entire colormap (or first 256 entries) into 'ctab' */ + dc = (ncells<256) ? ncells : 256; + if (dc>0) { + for (i=0; i<dc; i++) ctab[i].pixel = (unsigned long) i; + XQueryColors(theDisp, theCmap, ctab, dc); +- ++ + for (i=0; i<maplen; i++) { + if (failed[i]) { +- ++ + /* find closest color in colormap, and try to alloc it */ + mind = 1000000; /* greater than 3 * (256^2) */ + for (j=0,num = -1; j<dc; j++) { + rd = rmap[i] - (ctab[j].red >>8); + gd = gmap[i] - (ctab[j].green>>8); + bd = bmap[i] - (ctab[j].blue >>8); +- ++ + d = CDIST(rd, gd, bd); + if (d<mind) { mind = d; num = j; } + } +- ++ + if (num < 0) screwed = 1; + else if (xvAllocColor(theDisp, theCmap, &ctab[num])) { /*success*/ + des2got[i] = i; + descols[i] = ctab[num].pixel; + failed[i] = 0; +- nearCnt++; +- /* for (j=0; j<stdnfcols && stdfreecols[j]!=ctab[num].pixel; ++ nearCnt++; ++ /* for (j=0; j<stdnfcols && stdfreecols[j]!=ctab[num].pixel; + j++); */ + stdfreecols[stdnfcols++] = ctab[num].pixel; + } +@@ -1125,12 +1125,12 @@ + } + } + } +- +- /* PHASE 3: map remaining unallocated colors into closest we got */ +- ++ ++ /* PHASE 3: map remaining unallocated colors into closest we got */ ++ + for (i=0; i<maplen; i++) { + if (failed[i]) { +- ++ + /* find closest alloc'd color */ + mind = 1000000; /* greater than 3 * (256^2) */ + for (j=0,num=0; j<maplen; j++) { +@@ -1139,7 +1139,7 @@ + if (d<mind) { mind = d; num = j; } + } + } +- ++ + if (failed[num]) screwed = 1; + else { + descols[i] = descols[num]; +@@ -1151,8 +1151,8 @@ + } + + +- /* at this point, we have 'descols', a maplen long array of +- X pixel values that maps 1/1/1, 2/2/2, 6*6*6, or 3/3/2 values ++ /* at this point, we have 'descols', a maplen long array of ++ X pixel values that maps 1/1/1, 2/2/2, 6*6*6, or 3/3/2 values + into an X pixel value */ + + /* build stdcols and stdrdisp,stdgdisp,stdbdisp colormap */ +@@ -1170,7 +1170,7 @@ + + stdcols[i332] = descols[des2got[i111]]; + } +- } ++ } + + else if (desMode == STD_222) { + for (r=0; r<8; r++) +@@ -1186,7 +1186,7 @@ + + stdcols[i332] = descols[des2got[i222]]; + } +- } ++ } + + else if (desMode == STD_232) { + for (r=0; r<8; r++) +@@ -1201,7 +1201,7 @@ + stdbdisp[i332] = bmap[des2got[i232]]; + stdcols[i332] = descols[des2got[i232]]; + } +- } ++ } + + else if (desMode == STD_666) { + for (r=0,i=0; r<8; r++) +@@ -1221,7 +1221,7 @@ + + stdcols[i] = descols[des2got[i666]]; + } +- } ++ } + + else { /* desMode == STD_332 */ + for (i=0; i<256; i++) { +@@ -1249,22 +1249,22 @@ + if (DEBUG > 1) { + fprintf(stderr,"MakeStdCmaps: ncols=%d maplen=%d\n", ncols, maplen); + fprintf(stderr," std*[]= "); +- for (i=0; i<256; i++) ++ for (i=0; i<256; i++) + fprintf(stderr,"%02x,%02x,%02x ",stdr[i],stdg[i],stdb[i]); + fprintf(stderr,"\n\n"); + + fprintf(stderr," disp[]= "); +- for (i=0; i<256; i++) ++ for (i=0; i<256; i++) + fprintf(stderr,"%02x,%02x,%02x ",stdrdisp[i],stdgdisp[i],stdbdisp[i]); + fprintf(stderr,"\n\n"); + + fprintf(stderr," stdcols[]= "); +- for (i=0; i<256; i++) ++ for (i=0; i<256; i++) + fprintf(stderr,"%02lx ",stdcols[i]); + fprintf(stderr,"\n\n"); + + fprintf(stderr," stdfreecols[%d] = ", stdnfcols); +- for (i=0; i<stdnfcols; i++) ++ for (i=0; i<stdnfcols; i++) + fprintf(stderr,"%02lx ",stdfreecols[i]); + fprintf(stderr,"\n\n"); + } +@@ -1272,8 +1272,8 @@ + if (exactCnt == maplen) + sprintf(stdCmapSuccess, "Got all %d colors.", exactCnt); + else { +- if (nearCnt>0) +- sprintf(stdCmapSuccess, "Got %d out of %d colors. (%d close color%s)", ++ if (nearCnt>0) ++ sprintf(stdCmapSuccess, "Got %d out of %d colors. (%d close color%s)", + exactCnt, maplen, nearCnt, (nearCnt>1) ? "s" : ""); + else + sprintf(stdCmapSuccess, "Got %d out of %d colors.", exactCnt, maplen); +@@ -1292,11 +1292,11 @@ + /* This function should only be called once, at the start of the program. + * + * produces many things: +- * browR,browG,browB[256] ++ * browR,browG,browB[256] + * - a 3/3/2 colormap used by genIcon + * browcols[256] - maps 3/3/2 values into X colors + * browCmap - local cmap used in browse window, if browPerfect +- */ ++ */ + + int i,j,r,g,b, screwed, num, exactCnt, nearCnt; + XColor def; +@@ -1306,8 +1306,8 @@ + long d, mind; + + +- if (DEBUG) +- fprintf(stderr,"MakeBrowCmap: perfect = %d, ncols = %d\n", ++ if (DEBUG) ++ fprintf(stderr,"MakeBrowCmap: perfect = %d, ncols = %d\n", + browPerfect, ncols); + + if (ncols == 0 || !CMAPVIS(theVisual)) browPerfect = 0; +@@ -1350,7 +1350,7 @@ + def.red = rmap[order[i]] << 8; + def.green = gmap[order[i]] << 8; + def.blue = bmap[order[i]] << 8; +- ++ + def.flags = DoRed | DoGreen | DoBlue; + + if (xvAllocColor(theDisp, browCmap, &def)) { /* success */ +@@ -1358,14 +1358,14 @@ + descols[order[i]] = def.pixel; + + if (DEBUG>1) +- fprintf(stderr,"makebrowcmap: Phase 1: Alloc %x,%x,%x succeeded!\n", ++ fprintf(stderr,"makebrowcmap: Phase 1: Alloc %x,%x,%x succeeded!\n", + rmap[order[i]], gmap[order[i]], bmap[order[i]]); + } + else failed[order[i]] = 1; + } + +- +- /* PHASE 2: map remaining unallocated colors into closest we got */ ++ ++ /* PHASE 2: map remaining unallocated colors into closest we got */ + + for (i=0; i<256; i++) { + if (failed[i]) { +@@ -1377,9 +1377,9 @@ + if (d<mind) { mind = d; num = j; } + } + } +- ++ + if (DEBUG>1) +- fprintf(stderr,"makebrowcmap: closest to %x,%x,%x = %x,%x,%x\n", ++ fprintf(stderr,"makebrowcmap: closest to %x,%x,%x = %x,%x,%x\n", + rmap[i],gmap[i],bmap[i], rmap[num], gmap[num], bmap[num]); + + if (failed[num]) screwed = 1; +@@ -1406,7 +1406,7 @@ + byte *rmap, *gmap, *bmap, *order; + int maplen; + { +- /* takes a colormap (maxlen 256) and produces an order array that ++ /* takes a colormap (maxlen 256) and produces an order array that + contains the most-diverse order for allocating these colors */ + + int dist[256], i, pick, maxv, ocnt, d; +@@ -1422,7 +1422,7 @@ + + ocnt = 0; + order[ocnt++] = pick; +- ++ + /* init dist[] array */ + for (i=0; i<maplen; i++) dist[i] = 1000000; + +@@ -1509,14 +1509,14 @@ + else if (cmode == CM_NORMAL) { + if (novbrowse || browPerfect || haveStdCmap != iconCmapSize) + freeStdCmaps(); +- ++ + /* if using browser, and killed stdcmap, make icon stdcmap */ + if (!novbrowse && !browPerfect && haveStdCmap == STD_NONE) { + if (MakeStdCmaps() && anyBrowUp && CMAPVIS(theVisual)) + RegenBrowseIcons(); + } + } +- ++ + else if (cmode == CM_PERFECT) { } + else if (cmode == CM_OWNCMAP) { } + +@@ -1540,7 +1540,7 @@ + SetEpicMode(); + if (genepic) GenerateEpic(eWIDE, eHIGH); + } +- else { ++ else { + if (oldmode == CM_STDCMAP && cmode != CM_STDCMAP && epicMode != EM_RAW) { + /* just left STDCMAP mode. Switch to using 'RAW' */ + epicMode = EM_RAW; +diff -ruN xv-3.10a/xvctrl.c xv-3.10a-bugfixes/xvctrl.c +--- xv-3.10a/xvctrl.c 1994-12-22 14:34:41.000000000 -0800 ++++ xv-3.10a-bugfixes/xvctrl.c 2004-05-23 11:56:37.000000000 -0700 +@@ -1,4 +1,4 @@ +-/* ++/* + * xvctrl.c - Control box handling functions + * + * callable functions: +@@ -9,7 +9,7 @@ + * RedrawCtrl(x,y,w,h) - called by 'expose' events + * ClickCtrl(x,y) + * DrawCtrlStr() - called to redraw 'ISTR_INFO' string in ctrlW +- * ScrollToCurrent() - called when list selection is changed ++ * ScrollToCurrent() - called when list selection is changed + * + * LSCreate() - creates a listbox + * LSRedraw() - redraws 'namelist' box +@@ -49,7 +49,10 @@ + #include "bits/uicon" + #include "bits/oicon1" + #include "bits/oicon2" +-#include "bits/icon" ++#ifdef REGSTR ++# define OMIT_ICON_BITS ++# include "bits/icon" ++#endif + + #define CTRLWIDE 440 /* (fixed) size of control window */ + #define CTRLHIGH 348 /* 379 */ +@@ -80,7 +83,7 @@ + in xv.h */ + + +-static char *dispMList[] = { "Raw\tr", ++static char *dispMList[] = { "Raw\tr", + "Dithered\td", + "Smooth\ts", + MBSEP, +@@ -91,7 +94,7 @@ + "Use Own Colormap", + "Use Std. Colormap" }; + +-static char *rootMList[] = { "Window", ++static char *rootMList[] = { "Window", + "Root: tiled", + "Root: integer tiled", + "Root: mirrored", +@@ -159,12 +162,12 @@ + void CreateCtrl(geom) + char *geom; + { +- int i, listh, topskip; ++ int listh, topskip; + double skip; + XSetWindowAttributes xswa; + Pixmap oicon1Pix, oicon2Pix; + +- ctrlW = CreateWindow("xv controls", "XVcontrols", geom, ++ ctrlW = CreateWindow("xv controls", "XVcontrols", geom, + CTRLWIDE, CTRLHIGH, infofg, infobg, 0); + if (!ctrlW) FatalError("can't create controls window!"); + +@@ -205,10 +208,10 @@ + oicon2Pix = MakePix1(ctrlW, oicon2_bits, oicon2_width, oicon2_height); + + if (!grayTile || !dimStip || !fifoPix || !chrPix || !dirPix || +- !blkPix || !lnkPix || !regPix || !rotlPix || !fliphPix || ++ !blkPix || !lnkPix || !regPix || !rotlPix || !fliphPix || + !flipvPix || !p10Pix || !m10Pix || !cutPix || !copyPix || + !pastePix || !clearPix || !uiconPix || !oiconPix || !oicon1Pix || +- !oicon2Pix || !padPix || !annotPix) ++ !oicon2Pix || !padPix || !annotPix) + FatalError("unable to create all pixmaps in CreateCtrl()\n"); + + +@@ -226,7 +229,7 @@ + XFreePixmap(theDisp, oicon1Pix); + XFreePixmap(theDisp, oicon2Pix); + +- ++ + + if (ctrlColor) XSetWindowBackground(theDisp, ctrlW, locol); + else XSetWindowBackgroundPixmap(theDisp, ctrlW, grayTile); +@@ -234,7 +237,7 @@ + listh = LINEHIGH * NLINES; + + LSCreate(&nList, ctrlW, 5, 52, (CTRLWIDE-BUTTW-18), +- LINEHIGH*NLINES, NLINES, dispnames, numnames, ++ LINEHIGH*NLINES, NLINES, dispnames, numnames, + infofg, infobg, hicol, locol, RedrawNList, 0, 0); + nList.selected = 0; /* default to first name selected */ + +@@ -245,8 +248,8 @@ + + topskip = nList.y; + skip = ((double) (nList.h - (CHIGH+5))) / 6.0; +- if (skip > SBUTTH+8) { +- skip = SBUTTH + 7; ++ if (skip > SBUTTH+8) { ++ skip = SBUTTH + 7; + topskip = nList.y + (nList.h - (6*skip + (CHIGH+5))) / 2; + } + +@@ -258,7 +261,7 @@ + #define R_BY3 (topskip + (int)(3*skip)) + #define R_BY4 (topskip + (int)(4*skip)) + #define R_BY5 (topskip + (int)(5*skip)) +- ++ + BTCreate(&but[BNEXT], ctrlW, R_BX0, R_BY0, R_BW1, SBUTTH, "Next", BCLS); + BTCreate(&but[BPREV], ctrlW, R_BX0, R_BY1, R_BW1, SBUTTH, "Prev", BCLS); + BTCreate(&but[BLOAD], ctrlW, R_BX0, R_BY2, R_BW1, SBUTTH, "Load", BCLS); +@@ -309,7 +312,7 @@ + BTCreate(&but[BABOUT], ctrlW,BX4, BY1,BUTTW,BUTTH,"About XV",BCLS); + BTCreate(&but[BQUIT], ctrlW,BX5, BY1,BUTTW,BUTTH,"Quit", BCLS); + +- BTCreate(&but[BXV], ctrlW,5,5, 100, (u_int) nList.y - 5 - 2 - 5, ++ BTCreate(&but[BXV], ctrlW,5,5, 100, (u_int) nList.y - 5 - 2 - 5, + "", BCLS); + + SetButtPix(&but[BCOPY], copyPix, copy_width, copy_height); +@@ -329,7 +332,7 @@ + if (ctrlColor) { + SetButtPix(&but[BXV], oiconPix, oicon1_width, oicon1_height); + but[BXV].colorpix = 1; +- } ++ } + else SetButtPix(&but[BXV], iconPix, icon_width, icon_height); + #else + SetButtPix(&but[BXV], uiconPix, uicon_width, uicon_height); +@@ -338,21 +341,21 @@ + XMapSubwindows(theDisp, ctrlW); + + +- /* have to create menu buttons after XMapSubWindows, as we *don't* want ++ /* have to create menu buttons after XMapSubWindows, as we *don't* want + the popup menus mapped */ + +- MBCreate(&dispMB, ctrlW, CTRLWIDE - 8 - 112 - 2*(112+2), 5,112,19, ++ MBCreate(&dispMB, ctrlW, CTRLWIDE - 8 - 112 - 2*(112+2), 5,112,19, + "Display", dispMList, DMB_MAX, BCLS); +- MBCreate(&conv24MB, ctrlW, CTRLWIDE - 8 - 112 - (112+2), 5,112,19, ++ MBCreate(&conv24MB, ctrlW, CTRLWIDE - 8 - 112 - (112+2), 5,112,19, + "24/8 Bit", conv24MList, CONV24_MAX, BCLS); +- MBCreate(&algMB, ctrlW, CTRLWIDE - 8 - 112, 5,112,19, ++ MBCreate(&algMB, ctrlW, CTRLWIDE - 8 - 112, 5,112,19, + "Algorithms", algMList, ALG_MAX, BCLS); + +- MBCreate(&rootMB, ctrlW, CTRLWIDE - 8 - 112 - 2*(112+2), 5+21,112,19, ++ MBCreate(&rootMB, ctrlW, CTRLWIDE - 8 - 112 - 2*(112+2), 5+21,112,19, + "Root", rootMList, RMB_MAX, BCLS); +- MBCreate(&windowMB, ctrlW, CTRLWIDE - 8 - 112 - (112+2), 5+21,112,19, ++ MBCreate(&windowMB, ctrlW, CTRLWIDE - 8 - 112 - (112+2), 5+21,112,19, + "Windows", windowMList, WMB_MAX, BCLS); +- MBCreate(&sizeMB, ctrlW, CTRLWIDE - 8 - 112, 5+21,112,19, ++ MBCreate(&sizeMB, ctrlW, CTRLWIDE - 8 - 112, 5+21,112,19, + "Image Size", sizeMList, SZMB_MAX, BCLS); + + +@@ -395,7 +398,7 @@ + byte *bits; + int w,h; + { +- return XCreatePixmapFromBitmapData(theDisp, win, (char *) bits, ++ return XCreatePixmapFromBitmapData(theDisp, win, (char *) bits, + (u_int) w, (u_int) h, 1L,0L,1); + } + +@@ -404,7 +407,7 @@ + void CtrlBox(vis) + int vis; + { +- if (vis) XMapRaised(theDisp, ctrlW); ++ if (vis) XMapRaised(theDisp, ctrlW); + else XUnmapWindow(theDisp, ctrlW); + + ctrlUp = vis; +@@ -416,7 +419,6 @@ + int x,y,w,h; + { + int i; +- XRectangle xr; + + RANGE(w, 0, CTRLWIDE); + RANGE(h, 0, CTRLHIGH); +@@ -452,7 +454,7 @@ + /***************************************************/ + void DrawCtrlNumFiles() + { +- int x,y,w,h; ++ int x,y,w; + char foo[40]; + + x = but[BNEXT].x; +@@ -463,14 +465,14 @@ + XSetBackground(theDisp, theGC, infobg); + + sprintf(foo, "%d file%s", numnames, (numnames==1) ? "" : "s"); +- ++ + XSetForeground(theDisp, theGC, infobg); + XFillRectangle(theDisp,ctrlW, theGC, x+1,y+1, (u_int) w-1, (u_int) CHIGH+5); + + XSetForeground(theDisp,theGC,infofg); + XDrawRectangle(theDisp,ctrlW, theGC, x,y, (u_int) w, (u_int) CHIGH+6); + +- Draw3dRect(ctrlW, x+1,y+1, (u_int) w-2, (u_int) CHIGH+4, ++ Draw3dRect(ctrlW, x+1,y+1, (u_int) w-2, (u_int) CHIGH+4, + R3D_IN, 2, hicol, locol, infobg); + + XSetForeground(theDisp,theGC,infofg); +@@ -489,7 +491,7 @@ + st1 = GetISTR(ISTR_WARNING); + + XSetForeground(theDisp, theGC, infobg); +- XFillRectangle(theDisp, ctrlW, theGC, 0, y+1, ++ XFillRectangle(theDisp, ctrlW, theGC, 0, y+1, + CTRLWIDE, (u_int)((CHIGH+4)*2+1)); + + XSetForeground(theDisp, theGC, infofg); +@@ -501,7 +503,7 @@ + XSetForeground(theDisp, theGC, locol); + XDrawLine(theDisp, ctrlW, theGC, 0, y+1, CTRLWIDE, y+1); + XDrawLine(theDisp, ctrlW, theGC, 0, y+CHIGH+5, CTRLWIDE, y+CHIGH+5); +- XDrawLine(theDisp, ctrlW, theGC, 0, y+(CHIGH+4)*2+1, ++ XDrawLine(theDisp, ctrlW, theGC, 0, y+(CHIGH+4)*2+1, + CTRLWIDE, y+(CHIGH+4)*2+1); + } + +@@ -542,16 +544,16 @@ + void ScrollToCurrent(lst) + LIST *lst; + { +- /* called when selected item on list is changed. Makes the selected ++ /* called when selected item on list is changed. Makes the selected + item visible. If it already is, nothing happens. Otherwise, it +- attempts to scroll so that the selection appears in the middle of ++ attempts to scroll so that the selection appears in the middle of + the list window */ + + int halfway; + + if (lst->selected < 0) return; /* no selection, do nothing */ + +- if (lst->selected > lst->scrl.val && ++ if (lst->selected > lst->scrl.val && + lst->selected < lst->scrl.val + lst->nlines-1) LSRedraw(lst, 0); + else { + halfway = (lst->nlines)/2; /* offset to the halfway pt. of the list */ +@@ -590,7 +592,7 @@ + lp->win = XCreateSimpleWindow(theDisp,win,x,y,(u_int) w, (u_int) h,1,fg,bg); + if (!lp->win) FatalError("can't create list window!"); + +- lp->x = x; lp->y = y; ++ lp->x = x; lp->y = y; + lp->w = w; lp->h = h; + lp->fg = fg; lp->bg = bg; + lp->hi = hi; lp->lo = lo; +@@ -603,7 +605,7 @@ + + XSelectInput(theDisp, lp->win, ExposureMask | ButtonPressMask); + +- SCCreate(&lp->scrl, lp->win, w-20, -1, 1, h, 0, ++ SCCreate(&lp->scrl, lp->win, w-20, -1, 1, h, 0, + nstr-nlines, 0, nlines-1, fg, bg, hi, lo, fptr); + + XMapSubwindows(theDisp, lp->win); +@@ -646,7 +648,7 @@ + LIST *lp; + { + /* redraws lists 3d-effect, which can be trounced by drawSel() */ +- Draw3dRect(lp->win, 0, 0, lp->w-1, lp->h-1, R3D_IN, 2, ++ Draw3dRect(lp->win, 0, 0, lp->w-1, lp->h-1, R3D_IN, 2, + lp->hi, lp->lo, lp->bg); + } + +@@ -675,43 +677,43 @@ + else { fg = lp->fg; bg = lp->bg; } + + XSetForeground(theDisp, theGC, bg); +- XFillRectangle(theDisp, lp->win, theGC, x0, y0+i*LINEHIGH, ++ XFillRectangle(theDisp, lp->win, theGC, x0, y0+i*LINEHIGH, + (u_int) wide+1, (u_int) LINEHIGH); + + if (j>=0 && j<lp->nstr) { /* only draw string if valid */ + XSetForeground(theDisp, theGC, fg); + XSetBackground(theDisp, theGC, bg); + +- if (!lp->filetypes) ++ if (!lp->filetypes) + DrawString(lp->win, x0+3, y0+i*LINEHIGH + ASCENT + 1, lp->str[j]); + else { + int ypos = y0 + i*LINEHIGH + (LINEHIGH - i_fifo_height)/2; + +- if (lp->str[j][0] == C_FIFO) ++ if (lp->str[j][0] == C_FIFO) + XCopyPlane(theDisp, fifoPix, lp->win, theGC, 0, 0, + i_fifo_width, i_fifo_height, x0+3, ypos, 1L); + +- else if (lp->str[j][0] == C_CHR) ++ else if (lp->str[j][0] == C_CHR) + XCopyPlane(theDisp, chrPix, lp->win, theGC, 0, 0, + i_chr_width, i_chr_height, x0+3, ypos, 1L); + +- else if (lp->str[j][0] == C_DIR) ++ else if (lp->str[j][0] == C_DIR) + XCopyPlane(theDisp, dirPix, lp->win, theGC, 0, 0, + i_dir_width, i_dir_height, x0+3, ypos, 1L); + +- else if (lp->str[j][0] == C_BLK) ++ else if (lp->str[j][0] == C_BLK) + XCopyPlane(theDisp, blkPix, lp->win, theGC, 0, 0, + i_blk_width, i_blk_height, x0+3, ypos, 1L); + +- else if (lp->str[j][0] == C_LNK) ++ else if (lp->str[j][0] == C_LNK) + XCopyPlane(theDisp, lnkPix, lp->win, theGC, 0, 0, + i_lnk_width, i_lnk_height, x0+3, ypos, 1L); + +- else if (lp->str[j][0] == C_SOCK) ++ else if (lp->str[j][0] == C_SOCK) + XCopyPlane(theDisp, sockPix, lp->win, theGC, 0, 0, + i_sock_width, i_sock_height, x0+3, ypos, 1L); + +- else if (lp->str[j][0] == C_EXE) ++ else if (lp->str[j][0] == C_EXE) + XCopyPlane(theDisp, exePix, lp->win, theGC, 0, 0, + i_exe_width, i_exe_height, x0+3, ypos, 1L); + +@@ -720,8 +722,8 @@ + i_reg_width, i_reg_height, x0+3, ypos, 1L); + + +- DrawString(lp->win, x0+3 + i_fifo_width + 3, +- y0+i*LINEHIGH + ASCENT + 1, ++ DrawString(lp->win, x0+3 + i_fifo_width + 3, ++ y0+i*LINEHIGH + ASCENT + 1, + lp->str[j]+1); + } + } +@@ -735,7 +737,7 @@ + { + int i; + +- for (i = lp->scrl.val; i < lp->scrl.val + lp->nlines; i++) ++ for (i = lp->scrl.val; i < lp->scrl.val + lp->nlines; i++) + drawSel(lp,i); + ls3d(lp); + } +@@ -762,7 +764,7 @@ + if (sel >= lp->nstr) sel = lp->selected; + + /* see if it's a double click */ +- if (ev->time - lasttime < DBLCLKTIME && sel==lastsel ++ if (ev->time - lasttime < DBLCLKTIME && sel==lastsel + && (lp->scrl.val + (y-y0)/LINEHIGH) < lp->nstr + && !INACTIVE(lp,sel)) { + return (sel); +@@ -782,7 +784,7 @@ + while (XQueryPointer(theDisp,lp->win,&rW,&cW,&rx,&ry,&x,&y,&mask)) { + if (!(mask & Button1Mask)) break; /* button released */ + +- if (y<y0) { /* scroll up in list */ ++ if (y<y0) { /* scroll up in list */ + if (lp->scrl.val > lp->scrl.min) { + lp->selected = lp->scrl.val - 1; + SCSetVal(&lp->scrl, lp->scrl.val - 1); +@@ -804,7 +806,7 @@ + if (sel >= lp->nstr) sel = lp->nstr - 1; + + if (sel != lp->selected && sel >= lp->scrl.val && +- sel < lp->scrl.val + lp->nlines) { ++ sel < lp->scrl.val + lp->nlines) { + /* dragged to another on current page */ + oldsel = lp->selected; + lp->selected = sel; +@@ -829,17 +831,17 @@ + else if (key==LS_PAGEDOWN) SCSetVal(&lp->scrl,lp->scrl.val + (lp->nlines-1)); + else if (key==LS_HOME) SCSetVal(&lp->scrl,lp->scrl.min); + else if (key==LS_END) SCSetVal(&lp->scrl,lp->scrl.max); +- ++ + else if (key==LS_LINEUP) { + /* if the selected item visible, but not the top line */ +- if (lp->selected > lp->scrl.val && ++ if (lp->selected > lp->scrl.val && + lp->selected <= lp->scrl.val + lp->nlines - 1) { + /* then just move it */ + lp->selected--; + drawSel(lp, lp->selected); drawSel(lp, lp->selected+1); + ls3d(lp); + } +- ++ + /* if it's the top line... */ + else if (lp->selected == lp->scrl.val) { + if (lp->selected > 0) { +@@ -847,7 +849,7 @@ + SCSetVal(&lp->scrl, lp->selected); + } + } +- ++ + /* if it's not visible, put it on the bottom line */ + else { + lp->selected = lp->scrl.val + lp->nlines - 1; +@@ -856,10 +858,10 @@ + ls3d(lp); + } + } +- ++ + else if (key==LS_LINEDOWN) { + /* if the selected item visible, but not the bottom line */ +- if (lp->selected >= lp->scrl.val && ++ if (lp->selected >= lp->scrl.val && + lp->selected < lp->scrl.val + lp->nlines - 1) { + if (lp->selected < lp->nstr-1) { + /* then just move it */ +@@ -868,7 +870,7 @@ + ls3d(lp); + } + } +- ++ + /* if it's the bottom line... */ + else if (lp->selected == lp->scrl.val + lp->nlines - 1) { + if (lp->selected < lp->nstr-1) { +@@ -876,7 +878,7 @@ + SCSetVal(&lp->scrl, lp->scrl.val+1); + } + } +- ++ + /* if it's not visible, put it on the top line */ + else { + lp->selected = lp->scrl.val; +diff -ruN xv-3.10a/xvcut.c xv-3.10a-bugfixes/xvcut.c +--- xv-3.10a/xvcut.c 1995-01-13 11:55:48.000000000 -0800 ++++ xv-3.10a-bugfixes/xvcut.c 2004-05-16 18:01:43.000000000 -0700 +@@ -15,7 +15,7 @@ + * static void clearSelectedArea(); + * static void makeClipFName (); + * static int countcols24 (byte *, int,int, int,int,int,int)); +- * static int countNewCols (byte*, int, int, byte*, int, ++ * static int countNewCols (byte*, int, int, byte*, int, + * int, int, int, int); + * + * void InitSelection (); +@@ -72,7 +72,7 @@ + static void clearSelectedArea PARM((void)); + static void makeClipFName PARM((void)); + static int countcols24 PARM((byte *, int, int, int, int, int, int)); +-static int countNewCols PARM((byte *, int, int, byte *, int, ++static int countNewCols PARM((byte *, int, int, byte *, int, + int, int, int, int)); + static int dragHandle PARM((XButtonEvent *)); + static void dragSelection PARM((XButtonEvent *, u_int, int)); +@@ -210,7 +210,7 @@ + if (!PasteAllowed()) { XBell(theDisp, 0); return; } + + cimg = getFromClip(); +- if (!cimg) return; ++ if (!cimg) return; + + /* if there's no selection, make one! */ + if (!HaveSelection()) makePasteSel(cimg); +@@ -231,7 +231,7 @@ + + byte *dp, *dpic, *clippic, *clipcmap; + int clipw, cliph, clipis24, len, istran, trval; +- int i, j, sx,sy,sw,sh, cx,cy,cw,ch, dx,dy,dw,dh,dx2,dy2; ++ int i, j, sx,sy,sw,sh, cx,cy,cw,ch, dx,dy,dw,dh; + + + /* +@@ -245,7 +245,7 @@ + ((int) (cimg[CIMG_LEN + 2]<<16)) | + ((int) (cimg[CIMG_LEN + 3]<<24)); + +- if (len < CIMG_PIC24) return; ++ if (len < CIMG_PIC24) return; + + istran = cimg[CIMG_TRANS]; + trval = cimg[CIMG_TRVAL]; +@@ -268,7 +268,7 @@ + * already, because if we *are*, we'd prefer to do any clipboard rescaling + * in 24-bit space for the obvious reasons. + * +- * possibilities: ++ * possibilities: + * PIC24 - easy, do clipboard rescale in 24-bit space + * PIC8, and clipboard is 8 bits, (or 24-bits, but with <=256 colors) + * and total unique colors < 256: +@@ -283,7 +283,7 @@ + + /* dx,dy,dw,dh is the rectangle (in PIC coords) where the paste will occur + (cropped to be entirely within PIC */ +- ++ + dx = sx; dy = sy; dw = sw; dh = sh; + CropRect2Rect(&dx, &dy, &dw, &dh, 0, 0, pWIDE, pHIGH); + +@@ -291,7 +291,7 @@ + /* cx,cy,cw,ch is the rectangle of the clipboard data (in clipboard coords) + that will actually be used in the paste operation */ + +- cx = (sx>=0) ? 0 : ((-sx) * clipw) / sw; ++ cx = (sx>=0) ? 0 : ((-sx) * clipw) / sw; + cy = (sy>=0) ? 0 : ((-sy) * cliph) / sh; + cw = (dw * clipw) / sw; + ch = (dh * cliph) / sh; +@@ -302,26 +302,26 @@ + if (picType == PIC8) { + int ncc, keep8; + char buf[512]; +- ++ + if (clipis24) { /* pasting in a 24-bit image that *requires* promotion */ + static char *bnames[] = { "\nOkay", "\033Cancel" }; + strcpy(buf, "Warning: Pasting this 24-bit image will require "); + strcat(buf, "promoting the current image to 24 bits."); +- ++ + if (PopUp(buf, bnames, 2)) goto exit; /* Cancelled */ + else Change824Mode(PIC24); /* promote pic to 24 bits */ + } + + else { /* clip is 8 bits */ + ncc = countNewCols(clippic,clipw,cliph,clipcmap,clipis24,cx,cy,cw,ch); +- ++ + if (ncc + numcols > 256) { + static char *bnames[] = { "\nPromote", "8Keep 8-bit", "\033Cancel" }; + strcpy(buf,"Warning: The image and the clipboard combine to have "); + strcat(buf,"more than 256 unique colors. Promoting the "); + strcat(buf,"image to 24 bits is recommended, otherwise the contents "); + strcat(buf,"of the clipboard will probably lose some colors."); +- ++ + keep8 = PopUp(buf, bnames, 3); + if (keep8==2) goto exit; /* Cancel */ + else if (keep8==0) Change824Mode(PIC24); /* promote pic to 24 bits */ +@@ -331,8 +331,8 @@ + + + +- +- ++ ++ + /* legal possibilities at this point: + * pic is PIC24: clip is 8 or 24 + * pic is PIC8: clip is 8, or clip is 24 but has 256 or fewer colors +@@ -342,18 +342,18 @@ + + if (picType == PIC8) { + int clx, cly, r,g,b,k,mind,close,newcols; +- byte *cp, *clp, *pp, *ccp, newr[256], newg[256], newb[256], remap[256]; ++ byte *cp, *clp, *pp, newr[256], newg[256], newb[256], remap[256]; + byte order[256], trans[256]; + int bperpix, dpncols; +- ++ + dpic = (byte *) malloc((size_t) dw * dh); + if (!dpic) FatalError("Out of memory in DoImgPaste()\n"); +- ++ + bperpix = (clipis24) ? 3 : 1; + newcols = 0; +- ++ + /* dpic = a scaled, 8-bit representation of clippic[cx,cy,cw,ch] */ +- ++ + if (!clipis24) { /* copy colormap from clip data into newr,g,b[] */ + for (i=0; i<256; i++) { + newr[i] = clipcmap[i*3]; +@@ -366,22 +366,22 @@ + dp = dpic + i*dw; + cly = cy + (i * ch) / dh; + clp = clippic + (cly*clipw * bperpix); +- ++ + for (j=0; j<dw; j++, dp++) { + /* get appropriate pixel from clippic */ + clx = cx + (j * cw) / dw; + cp = clp + (clx * bperpix); +- ++ + if (!clipis24) *dp = *cp; + else { /* build colormap as we go... */ + r = *cp++; g = *cp++; b = *cp++; +- ++ + /* look it up in new colormap, add if not there */ + for (k=0; k<newcols && (r!=newr[k] || g!=newg[k] ||b!=newb[k]); k++); + if (k==newcols && k<256) { + newr[k]=r; newg[k]=g; newb[k]=b; newcols++; + } +- ++ + *dp = (byte) (k & 0xff); + } + } +@@ -401,23 +401,23 @@ + } + } + } +- +- +- ++ ++ ++ + /* COLORMAP MERGING */ +- ++ + newcols = 0; +- ++ + for (i=0; i<dpncols; i++) { + if (istran && i==trval) continue; +- ++ + for (j=0; j<numcols; j++) { /* look for an exact match */ + if (rMap[j]==newr[i] && gMap[j]==newg[i] && bMap[j]==newb[i]) break; + } + if (j<numcols) remap[i] = j; + else { /* no exact match */ + newcols++; +- ++ + if (numcols < 256) { + rMap[numcols] = newr[i]; + gMap[numcols] = newg[i]; +@@ -429,7 +429,7 @@ + r = newr[i]; g=newg[i]; b=newb[i]; + mind = 256*256 + 256*256 + 256*256; + for (j=close=0; j<numcols; j++) { +- k = ((rMap[j]-r) * (rMap[j]-r)) + ++ k = ((rMap[j]-r) * (rMap[j]-r)) + + ((gMap[j]-g) * (gMap[j]-g)) + + ((bMap[j]-b) * (bMap[j]-b)); + if (k<mind) { mind = k; close = j; } +@@ -438,10 +438,10 @@ + } + } + } +- +- ++ ++ + /* copy the data into PIC */ +- ++ + dp = dpic; + for (i=dy; i<dy+dh; i++) { + pp = pic + (i*pWIDE) + dx; +@@ -451,7 +451,7 @@ + } + } + free(dpic); +- ++ + if (newcols) InstallNewPic(); /* does color reallocation, etc. */ + else { + GenerateCpic(); +@@ -459,16 +459,16 @@ + DrawEpic(); + } + } +- ++ + + /******************** PIC24 handling **********************/ +- +- ++ ++ + else { + byte *tmppic, *cp, *pp, *clp; + int bperpix; + int trr, trg, trb, clx, cly; +- ++ + trr = trg = trb = 0; + if (istran) { + if (clipis24) { +@@ -482,24 +482,24 @@ + trb = clipcmap[trval*3+2]; + } + } +- ++ + bperpix = (clipis24) ? 3 : 1; + + if (!istran && (cw != dw || ch != dh)) { /* need to resize, can smooth */ + byte rmap[256], gmap[256], bmap[256]; +- ++ + tmppic = (byte *) malloc((size_t) cw * ch * bperpix); + if (!tmppic) FatalError("Out of memory in DoImgPaste()\n"); +- +- /* copy relevant hunk of clippic into tmppic (Smooth24 only works on ++ ++ /* copy relevant hunk of clippic into tmppic (Smooth24 only works on + complete images */ +- ++ + for (i=0; i<ch; i++) { + dp = tmppic + i*cw*bperpix; + cp = clippic + ((i+cy)*clipw + cx) * bperpix; + for (j=0; j<cw*bperpix; j++) *dp++ = *cp++; + } +- ++ + if (!clipis24) { + for (i=0; i<256; i++) { + rmap[i] = clipcmap[i*3]; +@@ -507,15 +507,15 @@ + bmap[i] = clipcmap[i*3+2]; + } + } +- ++ + dpic = Smooth24(tmppic, clipis24, cw,ch, dw,dh, rmap,gmap,bmap); + if (!dpic) FatalError("Out of memory (2) in DoImgPaste()\n"); + free(tmppic); +- ++ + /* copy the resized, smoothed, 24-bit data into 'pic' */ +- ++ + /* XXX: (deal with smooth-resized transparent imgs) */ +- ++ + dp = dpic; + for (i=dy; i<dy+dh; i++) { + pp = pic + (i*pWIDE + dx) * 3; +@@ -536,11 +536,11 @@ + pp = pic + ((i+dy)*pWIDE + dx) * 3; + cly = cy + (i * ch) / dh; + clp = clippic + (cly*clipw * bperpix); +- ++ + for (j=0; j<dw; j++, pp+=3) { + clx = cx + (j * cw) / dw; + cp = clp + (clx * bperpix); +- ++ + if (clipis24) { + if (!istran || cp[0]!=trr || cp[1]!=trg || cp[2]==trb) { + pp[0] = *cp++; pp[1] = *cp++; pp[2] = *cp++; +@@ -557,14 +557,14 @@ + } + } + +- ++ + GenerateCpic(); + GenerateEpic(eWIDE, eHIGH); + DrawEpic(); + } +- +- +- exit: ++ ++ ++ exit: + SetCursors(-1); + } + +@@ -577,20 +577,20 @@ + XColor cfg, cbg; + + dragcurs = XCreateFontCursor(theDisp, XC_fleur); +- p1 = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) cut_bits, ++ p1 = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) cut_bits, + cut_width, cut_height, 1L, 0L, 1); +- p2 = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) cutm_bits, ++ p2 = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) cutm_bits, + cutm_width, cutm_height, 1L, 0L, 1); +- p3 = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) copy_bits, ++ p3 = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) copy_bits, + copy_width, copy_height, 1L, 0L, 1); +- p4 = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) copym_bits, ++ p4 = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) copym_bits, + copym_width, copym_height, 1L, 0L, 1); + if (p1 && p2 && p3 && p4) { + cfg.red = cfg.green = cfg.blue = 0; + cbg.red = cbg.green = cbg.blue = 0xffff; +- cutcurs = XCreatePixmapCursor(theDisp, p1,p2, &cfg, &cbg, ++ cutcurs = XCreatePixmapCursor(theDisp, p1,p2, &cfg, &cbg, + cut_x_hot, cut_y_hot); +- copycurs = XCreatePixmapCursor(theDisp, p3,p4, &cfg, &cbg, ++ copycurs = XCreatePixmapCursor(theDisp, p3,p4, &cfg, &cbg, + copy_x_hot, copy_y_hot); + if (!cutcurs || !copycurs) FatalError("can't create cut/copy cursors..."); + } +@@ -619,7 +619,7 @@ + + if (!CutAllowed()) { XBell(theDisp, 0); return (byte *) NULL; } + if (!HaveSelection()) return (byte *) NULL; +- ++ + GetSelRCoords(&x,&y,&w,&h); + CropRect2Rect(&x,&y,&w,&h, 0,0,pWIDE,pHIGH); + +@@ -663,15 +663,15 @@ + if (picType == PIC24 && !do24) { /* 24-bit data as 8-bit */ + int nc,pr,pg,pb; + byte *cm; +- ++ + nc = 0; + dp = cimg + CIMG_PIC8; +- ++ + for (i=y; i<y+h; i++) { + pp = pic + i*pWIDE*3 + x*3; + for (j=x; j<x+w; j++, pp+=3) { + pr = pp[0]; pg = pp[1]; pb = pp[2]; +- ++ + cm = cimg + CIMG_CMAP; + for (k=0; k<nc; k++,cm+=3) { + if (pr==cm[0] && pg==cm[1] && pb==cm[2]) break; +@@ -682,12 +682,12 @@ + cimg[CIMG_CMAP + nc*3 + 1] = pg; + cimg[CIMG_CMAP + nc*3 + 2] = pb; + } +- ++ + *dp++ = (byte) k; + } + } + } +- ++ + + else if (picType == PIC24) { /* 24-bit data as 24-bit */ + dp = cimg + CIMG_PIC24; +@@ -705,26 +705,26 @@ + else if (picType == PIC8) { /* 8-bit selection */ + byte *cm = cimg + CIMG_CMAP; + for (i=0; i<256; i++) { /* copy colormap */ +- if (i<numcols) { ++ if (i<numcols) { + *cm++ = rMap[i]; + *cm++ = gMap[i]; + *cm++ = bMap[i]; + } + } +- ++ + dp = cimg + CIMG_PIC8; + for (i=y; i<y+h; i++) { /* copy image */ + pp = pic + i*pWIDE + x; + for (j=x; j<x+w; j++) *dp++ = *pp++; + } + } +- ++ + return cimg; + } + + + +- ++ + /********************************************/ + static byte *getFromClip() + { +@@ -743,14 +743,14 @@ + clipAtom = XInternAtom(theDisp, CLIPPROP, True); + if (clipAtom != None) XDeleteProperty(theDisp, rootW, clipAtom); + } +- +- ++ ++ + clipAtom = XInternAtom(theDisp, CLIPPROP, True); /* find prop */ + if (clipAtom != None) { + + /* try to retrieve the length of the data in the property */ +- i = XGetWindowProperty(theDisp, rootW, clipAtom, 0L, 1L, False, XA_STRING, +- &actType, &actFormat, &nitems, &nleft, ++ i = XGetWindowProperty(theDisp, rootW, clipAtom, 0L, 1L, False, XA_STRING, ++ &actType, &actFormat, &nitems, &nleft, + (unsigned char **) &data); + + if (i==Success && actType==XA_STRING && actFormat==8 && nleft>0) { +@@ -763,9 +763,9 @@ + XFree((void *) data); + + /* read the rest of the data (len bytes) */ +- i = XGetWindowProperty(theDisp, rootW, clipAtom, 1L, +- (long) ((len-4)+3)/4, +- False, XA_STRING, &actType, &actFormat, &nitems, ++ i = XGetWindowProperty(theDisp, rootW, clipAtom, 1L, ++ (long) ((len-4)+3)/4, ++ False, XA_STRING, &actType, &actFormat, &nitems, + &nleft, (unsigned char **) &data); + + if (i==Success) { +@@ -791,8 +791,8 @@ + } + } + +- +- /* if we're still here, then the prop method was less than successful. ++ ++ /* if we're still here, then the prop method was less than successful. + use the file method, instead */ + + if (!clipfname) makeClipFName(); +@@ -800,7 +800,7 @@ + fp = fopen(clipfname, "r"); + if (!fp) { + unlink(clipfname); +- sprintf(str, "Can't read clipboard file '%s'\n\n %s.", ++ sprintf(str, "Can't read clipboard file '%s'\n\n %s.", + clipfname, ERRSTR(errno)); + ErrPopUp(str,"\nBletch!"); + return (byte *) NULL; +@@ -877,19 +877,19 @@ + clipAtom = XInternAtom(theDisp, CLIPPROP, True); + if (clipAtom != None) XDeleteProperty(theDisp, rootW, clipAtom); + } +- +- ++ ++ + if (!forceClipFile) { + clipAtom = XInternAtom(theDisp, CLIPPROP, False); /* find or make prop */ + if (clipAtom != None) { + /* try to store the data in the property */ +- ++ + xerrcode = 0; + XChangeProperty(theDisp, rootW, clipAtom, XA_STRING, 8, PropModeReplace, + cimg, len); + XSync(theDisp, False); /* make it happen *now* */ + if (!xerrcode) return; /* success! */ +- ++ + /* failed, use file method */ + XDeleteProperty(theDisp, rootW, clipAtom); + } +@@ -903,7 +903,7 @@ + fp = fopen(clipfname, "w"); + if (!fp) { + unlink(clipfname); +- sprintf(str, "Can't write clipboard file '%s'\n\n %s.", ++ sprintf(str, "Can't write clipboard file '%s'\n\n %s.", + clipfname, ERRSTR(errno)); + ErrPopUp(str,"\nBletch!"); + return; +@@ -996,7 +996,7 @@ + byte *pp; + + nc = 0; +- ++ + for (i=y; nc<257 && i<y+h; i++) { + pp = pic + i*pwide*3 + x*3; + for (j=x; nc<257 && j<x+w; j++, pp+=3) { +@@ -1022,7 +1022,7 @@ + */ + + int i, j, k, nc, r,g,b; +- byte *pp, *cp; ++ byte *pp; + byte newr[257], newg[257], newb[257]; + + if (picType != PIC8) return 0; /* shouldn't happen */ +@@ -1034,7 +1034,7 @@ + pp = newpic + i*w*3 + cx*3; + for (j=cx; j<cx+cw; j++) { + r = *pp++; g = *pp++; b = *pp++; +- ++ + /* lookup r,g,b in 'pic's colormap and the newcolors colormap */ + for (k=0; k<nc && (r!=newr[k] || g!=newg[k] || b!=newb[k]); k++); + if (k==nc) { +@@ -1062,11 +1062,11 @@ + /* now see which of the used colors are new */ + for (i=0, nc=0; i<256; i++) { + if (!coluse[i]) continue; +- +- r = newcmap[i*3]; +- g = newcmap[i*3+1]; ++ ++ r = newcmap[i*3]; ++ g = newcmap[i*3+1]; + b = newcmap[i*3+2]; +- ++ + /* lookup r,g,b in pic's colormap */ + for (k=0; k<numcols && (r!=rMap[k] || g!=gMap[k] || b!=bMap[k]);k++); + if (k==numcols) { /* it's a new color, alright */ +@@ -1075,7 +1075,7 @@ + } + } + } +- ++ + return nc; + } + +@@ -1143,7 +1143,7 @@ + /* NOTE: SELECTION IS *NOT* GUARANTEED to be within the bounds of 'pic'. + It is only guaranteed to *intersect* pic. */ + +- *xp = selrx; *yp = selry; ++ *xp = selrx; *yp = selry; + *wp = selrw; *hp = selrh; + } + +@@ -1200,7 +1200,7 @@ + if (lastClickButton==Button1 && (ev->time - lastClickTime) < DBLCLKTIME) { + lastClickButton=Button3; + if (HaveSelection() && PTINRECT(px, py, selrx, selry, selrw, selrh)) { +- EnableSelection(0); ++ EnableSelection(0); + rv = 1; + } + else { +@@ -1225,7 +1225,7 @@ + else if (ev->button == Button2) { /* do a drag & drop operation */ + if (HaveSelection() && PTINRECT(px,py,selrx,selry,selrw,selrh)) { + /* clip selection rect to pic */ +- EnableSelection(0); ++ EnableSelection(0); + CropRect2Rect(&selrx, &selry, &selrw, &selrh, 0, 0, pWIDE, pHIGH); + + if (selrw<1 || selrh<1) rv = 0; +@@ -1253,8 +1253,8 @@ + * holding SHIFT constrains selection to be square, + * holding CTRL constrains selection to keep original aspect ratio + */ +- +- int i, mex, mey, mpx, mpy, offx,offy; ++ ++ int mex, mey, mpx, mpy, offx,offy; + int sex, sey, sex2, sey2, sew, seh, sew2, seh2, hs, h2; + int istp, isbt, islf, isrt, isvm, ishm; + int cnstsq, cnstasp; +@@ -1272,7 +1272,7 @@ + sew2 = sew/2; + seh2 = seh/2; + sex2--; sey2--; +- ++ + if (sew>=35 && seh>=35) hs=7; + else if (sew>=20 && seh>=20) hs=5; + else if (sew>= 9 && seh>= 9) hs=3; +@@ -1307,7 +1307,7 @@ + + + /* it's definitely in a handle... track 'til released */ +- ++ + DrawSelection(0); + selFilled = 1; + selTracking = 1; +@@ -1366,12 +1366,12 @@ + else { chwide=1; newwide = (int) (seh*orgaspect); } + } + } +- ++ + if (chwide) { + if (islf) { sex = (sex+sew) - newwide; } + sew = newwide; + } +- ++ + if (chhigh) { + if (istp) { sey = (sey+seh) - newhigh; } + seh = newhigh; +@@ -1380,7 +1380,7 @@ + + if (sew<1) sew=1; + if (seh<1) seh=1; +- ++ + if (sex!=selrx || sey!=selry || sew!=selrw || seh!=selrh) { + DrawSelection(0); + selrx = sex; selry = sey; selrw = sew; selrh = seh; +@@ -1395,14 +1395,14 @@ + Timer(100); + } + } +- ++ + EnableSelection(0); + + selFilled = 0; + selTracking = 0; + + /* only 'enable' the selection if it intersects CPIC */ +- if (selrx < cXOFF+cWIDE && selrx+selrw > cXOFF && ++ if (selrx < cXOFF+cWIDE && selrx+selrw > cXOFF && + selry < cYOFF+cHIGH && selry+selrh > cYOFF) EnableSelection(1); + + return 1; +@@ -1422,7 +1422,7 @@ + * + * if 'dragndrop', changes cursor, monitors CTRL status + */ +- ++ + int mpx, mpy, offx, offy; + int newsx, newsy, orgsx, orgsy, cnstrain, docopy, lastdocopy; + Window rW, cW; +@@ -1436,9 +1436,9 @@ + + CoordE2P(ev->x, ev->y, &mpx, &mpy); + offx = mpx - selrx; offy = mpy - selry; +- ++ + /* track rectangle until we get a release */ +- ++ + DrawSelection(0); + selFilled = 1; + selTracking = 1; +@@ -1467,7 +1467,7 @@ + dx = newsx - orgsx; dy = newsy - orgsy; + if (abs(dx) > abs(dy)) dy = 0; + else if (abs(dy) > abs(dx)) dx = 0; +- ++ + newsx = orgsx + dx; newsy = orgsy + dy; + } + +@@ -1485,7 +1485,7 @@ + Timer(100); + } + } +- ++ + EnableSelection(0); + + selFilled = 0; +@@ -1495,7 +1495,7 @@ + + /* only do <whatever> if the selection intersects CPIC */ + +- if (selrx < cXOFF+cWIDE && selrx+selrw > cXOFF && ++ if (selrx < cXOFF+cWIDE && selrx+selrw > cXOFF && + selry < cYOFF+cHIGH && selry+selrh > cYOFF) { + + EnableSelection(1); +@@ -1503,10 +1503,10 @@ + if (dragndrop) { + int tmpsx, tmpsy; + byte *data; +- ++ + tmpsx = selrx; tmpsy = selry; + selrx = orgsx; selry = orgsy; +- ++ + data = getSelection(); /* copy old data */ + if (data) { + if (!docopy) clearSelectedArea(); +@@ -1531,29 +1531,29 @@ + int rx,ry,ox,oy,x,y,active, x1, y1, x2, y2, cnstrain; + int i, px,py,px2,py2,pw,ph; + unsigned int mask; +- ++ + /* called on a B1 press in mainW to draw a new rectangular selection. + * any former selection has already been removed. holding shift down +- * while tracking constrains selection to a square ++ * while tracking constrains selection to a square + */ +- ++ + active = 0; +- ++ + x1 = ox = ev->x; y1 = oy = ev->y; /* nail down one corner */ + selrx = selry = selrw = selrh = 0; + selTracking = 1; +- ++ + while (1) { + if (!XQueryPointer(theDisp,mainW,&rW,&cW,&rx,&ry,&x,&y,&mask)) continue; + if (!(mask & Button1Mask)) break; /* button released */ + cnstrain = (mask & ShiftMask); +- ++ + if (x!=ox || y!=oy) { /* moved. erase and redraw (?) */ + x2 = x; y2 = y; +- ++ + /* x1,y1,x2,y2 are in epic coords. sort, convert to pic coords, + and if changed, erase+redraw */ +- ++ + CoordE2P(x1, y1, &px, &py); + CoordE2P(x2, y2, &px2, &py2); + if (px>px2) { i=px; px=px2; px2=i; } +@@ -1561,17 +1561,17 @@ + pw = px2-px+1; ph=py2-py+1; + + /* keep px,py,pw,ph inside 'pic' */ +- ++ + if (px<0) { pw+=px; px=0; } + if (py<0) { ph+=py; py=0; } + if (px>pWIDE-1) px = pWIDE-1; + if (py>pHIGH-1) py = pHIGH-1; +- ++ + if (pw<0) pw=0; + if (ph<0) ph=0; + if (px+pw>pWIDE) pw = pWIDE - px; + if (py+ph>pHIGH) ph = pHIGH - py; +- ++ + if (cnstrain) { /* make a square at smaller of w,h */ + if (ph>pw) { if (y2<y1) py += (ph-pw); ph=pw; } + else if (pw>ph) { if (x2<x1) px += (pw-ph); pw=ph; } +@@ -1579,12 +1579,12 @@ + + /* put x,y,w,h -> selr{x,y,w,h} + if the rectangle has changed, erase old and draw new */ +- ++ + if (px!=selrx || py!=selry || pw!=selrw || ph!=selrh) { + DrawSelection(0); + selrx = px; selry = py; selrw = pw; selrh = ph; + DrawSelection(1); +- ++ + haveSel = active = (pw>0 && ph>0); + if (infoUp) SetSelectionString(); + XFlush(theDisp); +@@ -1615,7 +1615,7 @@ + set, pick a new 'color' to invert the selection with */ + + int x,y,x1,y1,w,h; +- ++ + if (newcol) selColor = (selColor+1) & 0x7; + + /* convert selr{x,y,w,h} into epic coords */ +@@ -1650,7 +1650,7 @@ + if (y<0 && y+h>eHIGH && selFilled!=1) + XDrawLine(theDisp, mainW, theGC, x, eHIGH/2, x+w, eHIGH/2); + +- ++ + if (selFilled==0 || selFilled == 1) { + /* one little kludge: if w or h == eWIDE or eHIGH, make it one smaller */ + if (x+w == eWIDE) w--; +@@ -1664,17 +1664,17 @@ + else if (w>=20 && h>=20) { hs=5; h1=4; h2=2; } + else if (w>= 9 && h>= 9) { hs=3; h1=2; h2=1; } + else hs=h1=h2=0; +- ++ + if (hs) { + XFillRectangle(theDisp,mainW,theGC,x+1, y+1, (u_int)h1,(u_int)h1); + XFillRectangle(theDisp,mainW,theGC,x+w/2-h2,y+1, (u_int)hs,(u_int)h1); + XFillRectangle(theDisp,mainW,theGC,x+w-h1, y+1, (u_int)h1,(u_int)h1); +- ++ + XFillRectangle(theDisp,mainW,theGC,x+1, y+h/2-h2, + (u_int)h1, (u_int)hs); + XFillRectangle(theDisp,mainW,theGC,x+w-h1,y+h/2-h2, + (u_int)h1, (u_int)hs); +- ++ + XFillRectangle(theDisp,mainW,theGC,x+1, y+h-h1, + (u_int)h1,(u_int)h1); + XFillRectangle(theDisp,mainW,theGC,x+w/2-h2,y+h-h1, +@@ -1683,7 +1683,7 @@ + (u_int)h1,(u_int)h1); + } + } +- ++ + if (selFilled==1) { + XDrawLine(theDisp, mainW, theGC, x+1, y+1, x+w-1, y+h-1); + XDrawLine(theDisp, mainW, theGC, x+1, y+h-1, x+w-1, y+1); +@@ -1692,8 +1692,8 @@ + else if (selFilled==2) { + XFillRectangle(theDisp, mainW, theGC, x,y,(u_int) w, (u_int) h); + } +- +- ++ ++ + XSetFunction(theDisp,theGC,GXcopy); + XSetPlaneMask(theDisp, theGC, AllPlanes); + } +@@ -1703,7 +1703,7 @@ + void MoveGrowSelection(dx,dy,dw,dh) + int dx,dy,dw,dh; + { +- /* moves and/or grows the selection by the specified amount ++ /* moves and/or grows the selection by the specified amount + (in pic coords). keeps the selection entirely within 'pic'. + (called by 'CropKey()') */ + +@@ -1729,7 +1729,7 @@ + } + } + +- ++ + /***********************************/ + void BlinkSelection(cnt) + int cnt; +diff -ruN xv-3.10a/xvdflt.c xv-3.10a-bugfixes/xvdflt.c +--- xv-3.10a/xvdflt.c 1994-12-22 14:34:42.000000000 -0800 ++++ xv-3.10a-bugfixes/xvdflt.c 2004-05-16 18:01:46.000000000 -0700 +@@ -16,12 +16,12 @@ + #include "bits/xv_rev" + #include "bits/xv_ver" + #include "bits/xf_left" +-#include "bits/xf_right" ++/* #include "bits/xf_right" not used */ + #include "bits/font5x9.h" + + + #ifndef USEOLDPIC +-# include "xvdflt.h" ++# include "xvdflt.h" + #endif + + +@@ -100,21 +100,21 @@ + setcolor(pinfo, 252, 0, 0, 0); /* black background for text */ + + +- xbm2pic((byte *) xv_cpyrt_bits, xv_cpyrt_width, xv_cpyrt_height, ++ xbm2pic((byte *) xv_cpyrt_bits, xv_cpyrt_width, xv_cpyrt_height, + dfltpic, DWIDE, DHIGH, DWIDE/2+1, 203+1, 252); +- xbm2pic((byte *) xv_cpyrt_bits, xv_cpyrt_width, xv_cpyrt_height, ++ xbm2pic((byte *) xv_cpyrt_bits, xv_cpyrt_width, xv_cpyrt_height, + dfltpic, DWIDE, DHIGH, DWIDE/2, 203, 250); + + i = xv_ver_width + xv_rev_width + 30; + +- xbm2pic((byte *) xv_ver_bits, xv_ver_width, xv_ver_height, ++ xbm2pic((byte *) xv_ver_bits, xv_ver_width, xv_ver_height, + dfltpic, DWIDE, DHIGH, DWIDE/2 - (i/2) + xv_ver_width/2+1, 220+1,252); +- xbm2pic((byte *) xv_rev_bits, xv_rev_width, xv_rev_height, ++ xbm2pic((byte *) xv_rev_bits, xv_rev_width, xv_rev_height, + dfltpic, DWIDE, DHIGH, DWIDE/2 + (i/2) - xv_rev_width/2+1, 220+1,252); + +- xbm2pic((byte *) xv_ver_bits, xv_ver_width, xv_ver_height, ++ xbm2pic((byte *) xv_ver_bits, xv_ver_width, xv_ver_height, + dfltpic, DWIDE, DHIGH, DWIDE/2 - (i/2) + xv_ver_width/2, 220, 250); +- xbm2pic((byte *) xv_rev_bits, xv_rev_width, xv_rev_height, ++ xbm2pic((byte *) xv_rev_bits, xv_rev_width, xv_rev_height, + dfltpic, DWIDE, DHIGH, DWIDE/2 + (i/2) - xv_rev_width/2, 220, 250); + + strcpy(str,"Press <right> mouse button for menu."); +@@ -169,7 +169,7 @@ + for (i=k=0; i<DHIGH; i+=xf_left_height) { + for (j=0; j<DWIDE; j+=xf_left_width) { + k++; +- if (k&1) ++ if (k&1) + xbm2pic((byte *) xf_left_bits, xf_left_width, xf_left_height, + dfltpic, DWIDE, DHIGH, j + xf_left_width/2, + i + xf_left_height/2, 1); +@@ -179,29 +179,29 @@ + + + +- xbm2pic((byte *) xvpic_logo_out_bits, xvpic_logo_out_width, ++ xbm2pic((byte *) xvpic_logo_out_bits, xvpic_logo_out_width, + xvpic_logo_out_height, dfltpic, DWIDE, DHIGH, DWIDE/2 + 10, 80, 103); + +- xbm2pic((byte *) xvpic_logo_top_bits, xvpic_logo_top_width, ++ xbm2pic((byte *) xvpic_logo_top_bits, xvpic_logo_top_width, + xvpic_logo_top_height, dfltpic, DWIDE, DHIGH, DWIDE/2 + 10, 80, 100); + +- xbm2pic((byte *) xvpic_logo_bot_bits, xvpic_logo_bot_width, ++ xbm2pic((byte *) xvpic_logo_bot_bits, xvpic_logo_bot_width, + xvpic_logo_bot_height, dfltpic, DWIDE, DHIGH, DWIDE/2 + 10, 80, 101); + + + +- xbm2pic((byte *) xv_jhb_bits, xv_jhb_width, xv_jhb_height, ++ xbm2pic((byte *) xv_jhb_bits, xv_jhb_width, xv_jhb_height, + dfltpic, DWIDE, DHIGH, DWIDE/2, 160, 102); + +- xbm2pic((byte *) xv_cpyrt_bits, xv_cpyrt_width, xv_cpyrt_height, ++ xbm2pic((byte *) xv_cpyrt_bits, xv_cpyrt_width, xv_cpyrt_height, + dfltpic, DWIDE, DHIGH, DWIDE/2, 203, 102); + + i = xv_ver_width + xv_rev_width + 30; + +- xbm2pic((byte *) xv_ver_bits, xv_ver_width, xv_ver_height, ++ xbm2pic((byte *) xv_ver_bits, xv_ver_width, xv_ver_height, + dfltpic, DWIDE, DHIGH, DWIDE/2 - (i/2) + xv_ver_width/2, 220, 102); + +- xbm2pic((byte *) xv_rev_bits, xv_rev_width, xv_rev_height, ++ xbm2pic((byte *) xv_rev_bits, xv_rev_width, xv_rev_height, + dfltpic, DWIDE, DHIGH, DWIDE/2 + (i/2) - xv_rev_width/2, 220, 102); + + strcpy(str,"Press <right> mouse button for menu."); +@@ -281,7 +281,7 @@ + } + } + } +-} ++} + + + /*******************************************/ +@@ -300,7 +300,7 @@ + byte *dfltpic; + PICINFO *pinfo; + { +- int i,j,k, dr, dg, db; ++ int i,j, dr, dg, db; + byte *pp; + + pp = dfltpic; +@@ -357,7 +357,7 @@ + + for ( ; *str; str++, cx+=6) { + i = (byte) *str; +- if (i >= 32 && i < 128) ++ if (i >= 32 && i < 128) + xbm2pic(font5x9[i - 32], 5, 9, pic, pw, ph, cx, cy, col); + } + } +diff -ruN xv-3.10a/xvdial.c xv-3.10a-bugfixes/xvdial.c +--- xv-3.10a/xvdial.c 1995-01-03 13:20:31.000000000 -0800 ++++ xv-3.10a-bugfixes/xvdial.c 2004-05-16 18:01:57.000000000 -0700 +@@ -1,11 +1,11 @@ +-/* ++/* + * xvdial.c - DIAL handling functions + * + * callable functions: + * + * DCreate() - creates a dial + * DSetRange() - sets min/max/current values of control +- * DSetVal() - sets value of control ++ * DSetVal() - sets value of control + * DSetActive() - turns dial '.active' on and off + * DRedraw() - redraws the dial + * DTrack() - called when clicked. Operates control 'til mouseup +@@ -50,7 +50,7 @@ + + + /***************************************************/ +-void DCreate(dp, parent, x, y, w, h, minv, maxv, curv, page, ++void DCreate(dp, parent, x, y, w, h, minv, maxv, curv, page, + fg, bg, hi, lo, title, units) + DIAL *dp; + Window parent; +@@ -60,13 +60,13 @@ + { + + if (!pixmaps_built) { +- cw1Pix = XCreatePixmapFromBitmapData(theDisp, parent, ++ cw1Pix = XCreatePixmapFromBitmapData(theDisp, parent, + (char *) dial_cw1_bits, PW, PH, fg, bg, dispDEEP); +- ccw1Pix = XCreatePixmapFromBitmapData(theDisp, parent, ++ ccw1Pix = XCreatePixmapFromBitmapData(theDisp, parent, + (char *) dial_ccw1_bits, PW, PH, fg, bg, dispDEEP); +- cw2Pix = XCreatePixmapFromBitmapData(theDisp, parent, ++ cw2Pix = XCreatePixmapFromBitmapData(theDisp, parent, + (char *) dial_cw2_bits, PW, PH, fg, bg, dispDEEP); +- ccw2Pix = XCreatePixmapFromBitmapData(theDisp, parent, ++ ccw2Pix = XCreatePixmapFromBitmapData(theDisp, parent, + (char *) dial_ccw2_bits, PW, PH, fg, bg, dispDEEP); + } + +@@ -126,14 +126,14 @@ + if (curv == dp->val) return; + + /* erase old arrow */ +- XSetForeground(theDisp, theGC, dp->bg); ++ XSetForeground(theDisp, theGC, dp->bg); + drawArrow(dp); + + dp->val = curv; + + /* draw new arrow and string */ + XSetForeground(theDisp, theGC, dp->fg); +- XSetBackground(theDisp, theGC, dp->bg); ++ XSetBackground(theDisp, theGC, dp->bg); + drawArrow(dp); + drawValStr(dp); + if (!dp->active) dimDial(dp); +@@ -229,18 +229,18 @@ + case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-1); break; + case INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); break; + } +- if (dp->drawobj != NULL) (dp->drawobj)(); ++ if (dp->drawobj != NULL) (dp->drawobj)(); + Timer(INC1WAIT); + lit = 1; + } + +- else { ++ else { + i = computeDialVal(dp, mx, my); + DSetVal(dp, i); +- if (dp->drawobj != NULL) (dp->drawobj)(); ++ if (dp->drawobj != NULL) (dp->drawobj)(); + } + +- ++ + /* loop until mouse is released */ + while (XQueryPointer(theDisp,dp->win,&rW,&cW,&rx,&ry,&x,&y,&mask)) { + if (!(mask & Button1Mask)) break; /* button released */ +@@ -252,7 +252,7 @@ + DSetVal(dp, i); + if (j != dp->val) { + /* track whatever dial controls */ +- if (dp->drawobj != NULL) (dp->drawobj)(); ++ if (dp->drawobj != NULL) (dp->drawobj)(); + } + } + +@@ -266,7 +266,7 @@ + + if (lit) { + switch (ipos) { +- case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+1); ++ case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+1); + break; + case INCW2: if (dp->val < dp->max) DSetVal(dp, dp->val+dp->page); + break; +@@ -277,7 +277,7 @@ + } + + /* track whatever dial controls */ +- if (dp->drawobj != NULL) (dp->drawobj)(); ++ if (dp->drawobj != NULL) (dp->drawobj)(); + + Timer(INC2WAIT); + } +@@ -305,17 +305,17 @@ + + /* returns region * that x,y is in. returns -1 if none */ + +- for (i=0; i<4; i++) ++ for (i=0; i<4; i++) + if (PTINRECT(x,y, dp->bx[i], dp->by[i], 14, 10)) return i; + +- if (PTINRECT(x,y, dp->cx - dp->rad, dp->cy - dp->rad, ++ if (PTINRECT(x,y, dp->cx - dp->rad, dp->cy - dp->rad, + 2*dp->rad, 2*dp->rad)) + return INDIAL; + + return -1; + } + +- ++ + /***************************************************/ + static void drawArrow(dp) + DIAL *dp; +@@ -366,10 +366,10 @@ + XSetForeground(theDisp, theGC, dp->fg); + XSetBackground(theDisp, theGC, dp->bg); + XSetFont(theDisp, theGC, monofont); +- XDrawImageString(theDisp, dp->win, theGC, ++ XDrawImageString(theDisp, dp->win, theGC, + dp->w/2 - XTextWidth(monofinfo, foo1, (int) strlen(foo1))/2, + dp->h-14 - (monofinfo->ascent + monofinfo->descent)/2 +- + monofinfo->ascent, ++ + monofinfo->ascent, + foo1, (int) strlen(foo1)); + XSetFont(theDisp, theGC, mfont); + } +@@ -431,7 +431,7 @@ + } + else if (dx>0) angle = atan((double) dy / (double) dx) * RAD2DEG; + else angle = atan((double) -dy / (double) -dx) * RAD2DEG + 180.0; +- ++ + /* map angle into range: -90..270, then into to value */ + if (angle > 270.0) angle -= 360.0; + if (angle < -90.0) angle += 360.0; +diff -ruN xv-3.10a/xvdir.c xv-3.10a-bugfixes/xvdir.c +--- xv-3.10a/xvdir.c 1995-01-03 13:21:39.000000000 -0800 ++++ xv-3.10a-bugfixes/xvdir.c 2005-03-20 18:38:30.000000000 -0800 +@@ -1,4 +1,4 @@ +-/* ++/* + * xvdir.c - Directory changin', file i/o dialog box + * + * callable functions: +@@ -50,7 +50,7 @@ + #define COLWIDE 150 /* width of colMB */ + + /* NOTE: make sure these match up with F_* definitions in xv.h */ +-static char *saveColors[] = { "Full Color", ++static char *saveColors[] = { "Full Color", + "Greyscale", + "B/W Dithered", + "Reduced Color" }; +@@ -83,14 +83,16 @@ + static int dnamcmp PARM((const void *, const void *)); + static int FNameCdable PARM((void)); + static void loadCWD PARM((void)); ++#ifdef FOO + static int cd_able PARM((char *)); ++#endif + static void scrollToFileName PARM((void)); + static void setFName PARM((char *)); + static void showFName PARM((void)); + static void changeSuffix PARM((void)); + static int autoComplete PARM((void)); + +-static byte *handleBWandReduced PARM((byte *, int,int,int, int, int *, ++static byte *handleBWandReduced PARM((byte *, int,int,int, int, int *, + byte **, byte **, byte **)); + static byte *handleNormSel PARM((int *, int *, int *, int *)); + +@@ -119,7 +121,7 @@ + static char oldfname[MAXFNLEN+100]; + + /* the name of the file actually opened. (the temp file if we are piping) */ +-static char outFName[256]; ++static char outFName[256]; + static int dopipe; + + +@@ -127,48 +129,46 @@ + void CreateDirW(geom) + char *geom; + { +- int w, y; +- + path[0] = '\0'; + + xv_getwd(loadpath, sizeof(loadpath)); + xv_getwd(savepath, sizeof(savepath)); + +- ++ + dirW = CreateWindow("","XVdir", geom, DIRWIDE, DIRHIGH, infofg, infobg, 0); + if (!dirW) FatalError("couldn't create 'directory' window!"); + +- LSCreate(&dList, dirW, 10, 5 + 3*(6+LINEHIGH) + 6, LISTWIDE, +- LINEHIGH*NLINES, NLINES, fnames, numfnames, infofg, infobg, ++ LSCreate(&dList, dirW, 10, 5 + 3*(6+LINEHIGH) + 6, LISTWIDE, ++ LINEHIGH*NLINES, NLINES, fnames, numfnames, infofg, infobg, + hicol, locol, RedrawDList, 1, 0); + +- dnamW = XCreateSimpleWindow(theDisp, dirW, 80, dList.y + (int) dList.h + 30, +- (u_int) DNAMWIDE+6, (u_int) LINEHIGH+5, ++ dnamW = XCreateSimpleWindow(theDisp, dirW, 80, dList.y + (int) dList.h + 30, ++ (u_int) DNAMWIDE+6, (u_int) LINEHIGH+5, + 1, infofg, infobg); + if (!dnamW) FatalError("can't create name window"); + XSelectInput(theDisp, dnamW, ExposureMask); + + +- CBCreate(&browseCB, dirW, DIRWIDE/2, dList.y + (int) dList.h + 6, ++ CBCreate(&browseCB, dirW, DIRWIDE/2, dList.y + (int) dList.h + 6, + "Browse", infofg, infobg, hicol,locol); + +- CBCreate(&savenormCB, dirW, 220, dList.y + (int) dList.h + 6, ++ CBCreate(&savenormCB, dirW, 220, dList.y + (int) dList.h + 6, + "Normal Size", infofg, infobg,hicol,locol); + +- CBCreate(&saveselCB, dirW, 80, dList.y + (int) dList.h + 6, ++ CBCreate(&saveselCB, dirW, 80, dList.y + (int) dList.h + 6, + "Selected Area", infofg, infobg,hicol,locol); + + + /* y-coordinates get filled in when window is opened */ +- BTCreate(&dbut[S_BOK], dirW, 259, 0, 80, BUTTH, ++ BTCreate(&dbut[S_BOK], dirW, 259, 0, 80, BUTTH, + "Ok", infofg, infobg,hicol,locol); +- BTCreate(&dbut[S_BCANC], dirW, 259, 0, 80, BUTTH, ++ BTCreate(&dbut[S_BCANC], dirW, 259, 0, 80, BUTTH, + "Cancel", infofg,infobg,hicol,locol); +- BTCreate(&dbut[S_BRESCAN], dirW, 259, 0, 80, BUTTH, ++ BTCreate(&dbut[S_BRESCAN], dirW, 259, 0, 80, BUTTH, + "Rescan", infofg,infobg,hicol,locol); +- BTCreate(&dbut[S_BOLDSET], dirW, 259, 0, 80, BUTTH, ++ BTCreate(&dbut[S_BOLDSET], dirW, 259, 0, 80, BUTTH, + "Prev Set", infofg,infobg,hicol,locol); +- BTCreate(&dbut[S_BOLDNAM], dirW, 259, 0, 80, BUTTH, ++ BTCreate(&dbut[S_BOLDNAM], dirW, 259, 0, 80, BUTTH, + "Prev Name", infofg,infobg,hicol,locol); + + SetDirFName(""); +@@ -180,33 +180,33 @@ + * create MBUTTs *after* calling XMapSubWindows() to keep popup unmapped + */ + +- MBCreate(&dirMB, dirW, 50, dList.y -(LINEHIGH+6), ++ MBCreate(&dirMB, dirW, 50, dList.y -(LINEHIGH+6), + (u_int) DDWIDE, (u_int) LINEHIGH, NULL, NULL, 0, + infofg,infobg,hicol,locol); + +- MBCreate(&fmtMB, dirW, DIRWIDE-FMTWIDE-10, 5, +- (u_int) FMTWIDE, (u_int) LINEHIGH, NULL, saveFormats, F_MAXFMTS, ++ MBCreate(&fmtMB, dirW, DIRWIDE-FMTWIDE-10, 5, ++ (u_int) FMTWIDE, (u_int) LINEHIGH, NULL, saveFormats, F_MAXFMTS, + infofg,infobg,hicol,locol); + fmtMB.hascheck = 1; + MBSelect(&fmtMB, 0); + +- MBCreate(&colMB, dirW, DIRWIDE-COLWIDE-10, 5+LINEHIGH+6, +- (u_int) COLWIDE, (u_int) LINEHIGH, NULL, saveColors, F_MAXCOLORS, ++ MBCreate(&colMB, dirW, DIRWIDE-COLWIDE-10, 5+LINEHIGH+6, ++ (u_int) COLWIDE, (u_int) LINEHIGH, NULL, saveColors, F_MAXCOLORS, + infofg,infobg,hicol,locol); + colMB.hascheck = 1; + MBSelect(&colMB, 0); + + +- d_loadPix = XCreatePixmapFromBitmapData(theDisp, dirW, +- (char *) d_load_bits, d_load_width, d_load_height, ++ d_loadPix = XCreatePixmapFromBitmapData(theDisp, dirW, ++ (char *) d_load_bits, d_load_width, d_load_height, + infofg, infobg, dispDEEP); + +- d_savePix = XCreatePixmapFromBitmapData(theDisp, dirW, +- (char *) d_save_bits, d_save_width, d_save_height, ++ d_savePix = XCreatePixmapFromBitmapData(theDisp, dirW, ++ (char *) d_save_bits, d_save_width, d_save_height, + infofg, infobg, dispDEEP); + + } +- ++ + + /***************************************************/ + void DirBox(mode) +@@ -261,7 +261,7 @@ + + BTSetActive(&dbut[S_BOLDSET], haveoldinfo); + BTSetActive(&dbut[S_BOLDNAM], haveoldinfo); +- ++ + CBSetActive(&saveselCB, HaveSelection()); + + MBSetActive(&fmtMB, 1); +@@ -303,15 +303,15 @@ + if (gap>16) { + gap = 16; + top = dList.y + (dList.h - (nbts*BUTTH) - (ngaps*gap))/2; +- ++ + for (i=0; i<nbts; i++) dbut[i].y = top + i*(BUTTH+gap); + } + else { +- for (i=0; i<nbts; i++) ++ for (i=0; i<nbts; i++) + dbut[i].y = dList.y + ((dList.h-BUTTH)*i) / ngaps; + } + } +- ++ + + + /***************************************************/ +@@ -320,23 +320,22 @@ + { + int i, ypos, txtw; + char foo[30], *str; +- XRectangle xr; + + if (dList.nstr==1) strcpy(foo,"1 file"); + else sprintf(foo,"%d files",dList.nstr); + + ypos = dList.y + dList.h + 8 + ASCENT; + XSetForeground(theDisp, theGC, infobg); +- XFillRectangle(theDisp, dirW, theGC, 10, ypos-ASCENT, ++ XFillRectangle(theDisp, dirW, theGC, 10, ypos-ASCENT, + (u_int) DIRWIDE, (u_int) CHIGH); + XSetForeground(theDisp, theGC, infofg); + DrawString(dirW, 10, ypos, foo); + + +- if (dirUp == BLOAD) str = "Load file:"; ++ if (dirUp == BLOAD) str = "Load file:"; + else str = "Save file:"; + DrawString(dirW, 10, dList.y + (int) dList.h + 30 + 4 + ASCENT, str); +- ++ + /* draw dividing line */ + XSetForeground(theDisp, theGC, infofg); + XDrawLine(theDisp, dirW, theGC, 0, dirMB.y-6, DIRWIDE, dirMB.y-6); +@@ -346,11 +345,11 @@ + XSetForeground(theDisp, theGC, hicol); + } + XDrawLine(theDisp, dirW, theGC, 0, dirMB.y-4, DIRWIDE, dirMB.y-4); +- +- +- ++ ++ ++ + for (i=0; i<(savemode ? S_NBUTTS : S_LOAD_NBUTTS); i++) BTRedraw(&dbut[i]); +- ++ + MBRedraw(&dirMB); + MBRedraw(&fmtMB); + MBRedraw(&colMB); +@@ -362,7 +361,7 @@ + if (StringWidth(COLLABEL) > txtw) txtw = StringWidth(COLLABEL); + + if (!savemode) { +- XCopyArea(theDisp, d_loadPix, dirW, theGC, 0,0,d_load_width,d_load_height, ++ XCopyArea(theDisp, d_loadPix, dirW, theGC, 0,0,d_load_width,d_load_height, + 10, (dirMB.y-6)/2 - d_load_height/2); + + XSetFillStyle(theDisp, theGC, FillStippled); +@@ -399,18 +398,18 @@ + i = v = 0; + if (MBClick(&fmtMB, x,y) && (v=MBTrack(&fmtMB))>=0) i=1; + else if (MBClick(&colMB, x,y) && (v=MBTrack(&colMB))>=0) i=2; +- ++ + if (i) { /* changed one of them */ + if (i==1) SetDirSaveMode(F_FORMAT, v); + else SetDirSaveMode(F_COLORS, v); + changeSuffix(); + } + } +- +- ++ ++ + if (!savemode) { /* LOAD */ + if (CBClick(&browseCB,x,y)) CBTrack(&browseCB); +- } ++ } + else { /* SAVE */ + if (CBClick(&savenormCB,x,y)) CBTrack(&savenormCB); + else if (CBClick(&saveselCB,x,y)) CBTrack(&saveselCB); +@@ -482,7 +481,7 @@ + } + + if (oldnumnames != numnames) { /* added some */ +- if (numnames>0) BTSetActive(&but[BDELETE],1); ++ if (numnames>0) BTSetActive(&but[BDELETE],1); + windowMB.dim[WMB_TEXTVIEW] = (numnames==0); + + LSNewData(&nList, dispnames, numnames); +@@ -564,7 +563,7 @@ + * a special concealed device setup to provide a list of available + * disks). + */ +- if ( ((ndirs-sel) == 2) && (strlen(tmppath) > 1) ) ++ if ( ((ndirs-sel) == 2) && (strlen(tmppath) > 1) ) + strcat ( tmppath, "/000000" ); /* add root dir for device */ + else if ((ndirs-sel) == 1 ) { + strcpy ( tmppath, "/XV_Root_Device/000000" ); /* fake top level */ +@@ -602,7 +601,7 @@ + xv_getwd(path, sizeof(path)); + LoadCurrentDirectory(); + } +- ++ + + + /***************************************************/ +@@ -621,7 +620,7 @@ + #else + struct dirent *dp; + #endif +- ++ + + /* get rid of previous file names */ + for (i=0; i<numfnames; i++) free(fnames[i]); +@@ -680,12 +679,12 @@ + strncpy(dirMBlist[j], dirs[i], stlen); + dirMBlist[j][stlen] = '\0'; + } +- ++ + + lastdir = dirs[ndirs-1]; + dirMB.list = dirMBlist; + dirMB.nlist = ndirs; +- XClearArea(theDisp, dirMB.win, dirMB.x, dirMB.y, ++ XClearArea(theDisp, dirMB.win, dirMB.x, dirMB.y, + (u_int) dirMB.w+3, (u_int) dirMB.h+3, False); + i = StringWidth(dirMBlist[0]) + 10; + dirMB.x = dirMB.x + dirMB.w/2 - i/2; +@@ -704,8 +703,8 @@ + + i=0; + while ( (dp = readdir(dirp)) != NULL) { +- if (strcmp(dp->d_name, ".")==0 || +- (strcmp(dp->d_name, "..")==0 && ++ if (strcmp(dp->d_name, ".")==0 || ++ (strcmp(dp->d_name, "..")==0 && + (strcmp(path,"/")==0 || strcmp(path,"//")==0)) || + strcmp(dp->d_name, THUMBDIR)==0) { + /* skip over '.' and '..' and THUMBDIR */ +@@ -733,7 +732,7 @@ + /* For VMS we will default all files EXCEPT directories to avoid + the high cost of the VAX C implementation of the stat function. + Suggested by Kevin Oberman (OBERMAN@icdc.llnl.gov) */ +- ++ + if (xv_strstr (fnames[i]+1, ".DIR") != NULL) fnames[i][0] = C_DIR; + if (xv_strstr (fnames[i]+1, ".EXE") != NULL) fnames[i][0] = C_EXE; + if (xv_strstr (fnames[i]+1, ".OBJ") != NULL) fnames[i][0] = C_BLK; +@@ -784,11 +783,13 @@ + + + /***************************************************/ ++#ifdef FOO + static int cd_able(str) + char *str; + { + return ((str[0] == C_DIR || str[0] == C_LNK)); + } ++#endif /* FOO */ + + + /***************************************************/ +@@ -829,7 +830,7 @@ + int len; + + len = strlen(filename); +- ++ + if (c>=' ' && c<'\177') { /* printable characters */ + /* note: only allow 'piped commands' in savemode... */ + +@@ -918,19 +919,19 @@ + { + /* called to 'auto complete' a filename being entered. If the name that + has been entered so far is anything but a simple filename (ie, has +- spaces, pipe char, '/', etc) fails. If it is a simple filename, ++ spaces, pipe char, '/', etc) fails. If it is a simple filename, + looks through the name list to find something that matches what's already + been typed. If nothing matches, it fails. If more than one thing + matches, it sets the name to the longest string that the multiple +- matches have in common, and succeeds (and beeps). ++ matches have in common, and succeeds (and beeps). + If only one matches, sets the string to the match and succeeds. +- ++ + returns zero on failure, non-zero on success */ +- ++ + int i, firstmatch, slen, nummatch, cnt; + + /* is filename a simple filename? */ +- if (strlen(filename)==0 || ++ if (strlen(filename)==0 || + ISPIPE(filename[0]) || + index(filename, '/') || + filename[0]=='~' ) return 0; +@@ -946,7 +947,7 @@ + firstmatch = i; + + /* count # of matches */ +- for (i=firstmatch, nummatch=0; ++ for (i=firstmatch, nummatch=0; + i<dList.nstr && strncmp(filename, dList.str[i]+1, (size_t) slen)==0; + i++, nummatch++); + +@@ -960,14 +961,14 @@ + while (dList.str[firstmatch][slen+1]!='\0') { + filename[slen] = dList.str[firstmatch][slen+1]; + slen++; filename[slen] = '\0'; +- ++ + for (i=firstmatch, cnt=0; + i<dList.nstr && strncmp(filename, dList.str[i]+1, (size_t) slen)==0; + i++, cnt++); + + if (cnt != nummatch) { slen--; filename[slen] = '\0'; break; } +- } +- ++ } ++ + XBell(theDisp, 0); + + return 1; +@@ -1003,7 +1004,7 @@ + i = pos - (NLINES/2); + SCSetVal(&dList.scrl, i); + } +- ++ + + /***************************************************/ + void RedrawDNamW() +@@ -1012,7 +1013,7 @@ + + /* draw substring filename[stPos:enPos] and cursor */ + +- Draw3dRect(dnamW, 0, 0, (u_int) DNAMWIDE+5, (u_int) LINEHIGH+4, R3D_IN, 2, ++ Draw3dRect(dnamW, 0, 0, (u_int) DNAMWIDE+5, (u_int) LINEHIGH+4, R3D_IN, 2, + hicol, locol, infobg); + + XSetForeground(theDisp, theGC, infofg); +@@ -1023,7 +1024,7 @@ + XDrawLine(theDisp, dnamW, theGC, 2,0,2,LINEHIGH+5); + } + +- if ((size_t) enPos < strlen(filename)) { ++ if ((size_t) enPos < strlen(filename)) { + /* draw a "there's more over here" doowah */ + XDrawLine(theDisp, dnamW, theGC, DNAMWIDE+5,0,DNAMWIDE+5,LINEHIGH+5); + XDrawLine(theDisp, dnamW, theGC, DNAMWIDE+4,0,DNAMWIDE+4,LINEHIGH+5); +@@ -1057,7 +1058,7 @@ + fmt = MBWhich(&fmtMB); + col = MBWhich(&colMB); + +- if (fmt<0 || col<0) ++ if (fmt<0 || col<0) + FatalError("xv: no 'checked' format or color. shouldn't happen!\n"); + + +@@ -1068,19 +1069,19 @@ + dbut[S_BOK].lit = 0; BTRedraw(&dbut[S_BOK]); + return -1; + } +- ++ + for (i=0; i<numnames; i++) { + if ((i&0x3f)==0) WaitCursor(); + if (namelist[i][0] != '/') fprintf(fp, "%s/%s\n", initdir, namelist[i]); + else fprintf(fp, "%s\n", namelist[i]); + } +- ++ + i = (ferror(fp)) ? 1 : 0; + if (CloseOutFile(fp, fullname, i) == 0) { + DirBox(0); + XVCreatedFile(fullname); + } +- ++ + SetCursors(-1); + dbut[S_BOK].lit = 0; BTRedraw(&dbut[S_BOK]); + return i; +@@ -1147,34 +1148,41 @@ + rv = WritePBM (fp, thepic, ptype, w, h, rp,gp,bp, nc,col,1,picComments); + break; + +- case F_PBMASCII: ++ case F_PBMASCII: + rv = WritePBM (fp, thepic, ptype, w, h, rp,gp,bp, nc,col,0,picComments); + break; + + case F_XBM: +- rv = WriteXBM (fp, thepic, w, h, rp, gp, bp, fullname); break; ++ rv = WriteXBM (fp, thepic, w, h, rp, gp, bp, fullname); ++ break; + + case F_SUNRAS: +- rv = WriteSunRas(fp, thepic, ptype, w, h, rp, gp, bp, nc, col,0); break; ++ rv = WriteSunRas(fp, thepic, ptype, w, h, rp, gp, bp, nc, col,0); ++ break; + + case F_BMP: +- rv = WriteBMP (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); break; ++ rv = WriteBMP (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); ++ break; + + case F_IRIS: +- rv = WriteIRIS (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); break; +- ++ rv = WriteIRIS (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); ++ break; ++ + case F_TARGA: +- rv = WriteTarga (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); break; +- ++ rv = WriteTarga (fp, thepic, ptype, w, h, rp, gp, bp, nc, col); ++ break; ++ + case F_XPM: +- rv = WriteXPM (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, +- fullname, picComments); ++ rv = WriteXPM (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, ++ fullname, picComments); ++ break; ++ + case F_FITS: +- rv = WriteFITS (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, +- picComments); ++ rv = WriteFITS (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, ++ picComments); + break; + } +- ++ + + if (CloseOutFile(fp, fullname, rv) == 0) { + DirBox(0); +@@ -1184,12 +1192,12 @@ + } + } + +- ++ + if (pfree) free(thepic); +- ++ + SetCursors(-1); + dbut[S_BOK].lit = 0; BTRedraw(&dbut[S_BOK]); +- ++ + return rv; + } + +@@ -1200,6 +1208,7 @@ + char *st; + { + strncpy(deffname, st, (size_t) MAXFNLEN-1); ++ deffname[MAXFNLEN-1] = '\0'; + setFName(st); + } + +@@ -1212,7 +1221,7 @@ + filename[MAXFNLEN-1] = '\0'; /* make sure it's terminated */ + curPos = strlen(st); + stPos = 0; enPos = curPos; +- ++ + showFName(); + } + +@@ -1221,17 +1230,17 @@ + static void showFName() + { + int len; +- ++ + len = strlen(filename); +- ++ + if (curPos<stPos) stPos = curPos; + if (curPos>enPos) enPos = curPos; +- ++ + if (stPos>len) stPos = (len>0) ? len-1 : 0; + if (enPos>len) enPos = (len>0) ? len-1 : 0; +- ++ + /* while substring is shorter than window, inc enPos */ +- ++ + while (XTextWidth(mfinfo, &filename[stPos], enPos-stPos) < DNAMWIDE + && enPos<len) { enPos++; } + +@@ -1244,7 +1253,7 @@ + } + + +- if (ctrlColor) XClearArea(theDisp, dnamW, 2,2, (u_int) DNAMWIDE+5-3, ++ if (ctrlColor) XClearArea(theDisp, dnamW, 2,2, (u_int) DNAMWIDE+5-3, + (u_int) LINEHIGH+4-3, False); + else XClearWindow(theDisp, dnamW); + +@@ -1270,7 +1279,7 @@ + else { + strcpy(globname, filename); + if (globname[0] == '~') Globify(globname); +- ++ + if (globname[0] != '/') sprintf(fullname, "%s%s", path, globname); + else strcpy(fullname, globname); + } +@@ -1294,10 +1303,10 @@ + MBRedraw(&fmtMB); + } + } +- ++ + if (bnum>=0) MBSelect(&colMB, bnum); + } +- ++ + + else if (group == F_FORMAT) { + MBSelect(&fmtMB, bnum); +@@ -1322,10 +1331,10 @@ + colMB.dim[F_GREYSCALE] = 0; + colMB.dim[F_BWDITHER] = 0; + colMB.dim[F_REDUCED] = (picType==PIC8) ? 0 : 1; +- if (picType!=PIC8 && MBWhich(&colMB)==F_REDUCED) ++ if (picType!=PIC8 && MBWhich(&colMB)==F_REDUCED) + MBSelect(&colMB, F_FULLCOLOR); + } +- ++ + if (MBWhich(&fmtMB) == F_FILELIST) { + MBSetActive(&colMB, 0); + CBSetActive(&savenormCB, 0); +@@ -1337,12 +1346,12 @@ + } + } + +- ++ + + /***************************************/ + static void changeSuffix() + { +- /* see if there's a common suffix at the end of the filename. ++ /* see if there's a common suffix at the end of the filename. + if there is, remember what case it was (all caps or all lower), lop + it off, and replace it with a new appropriate suffix, in the + same case */ +@@ -1356,7 +1365,7 @@ + suffix++; /* point to first letter of the suffix */ + + /* check for all-caposity */ +- for (sp = suffix, allcaps=1; *sp; sp++) ++ for (sp = suffix, allcaps=1; *sp; sp++) + if (islower(*sp)) allcaps = 0; + + /* copy the suffix into an all-lower-case buffer */ +@@ -1401,7 +1410,7 @@ + case F_GIF: strcpy(lowsuf,"gif"); break; + case F_PM: strcpy(lowsuf,"pm"); break; + case F_PBMRAW: +- case F_PBMASCII: if (col == F_FULLCOLOR || col == F_REDUCED) ++ case F_PBMASCII: if (col == F_FULLCOLOR || col == F_REDUCED) + strcpy(lowsuf,"ppm"); + else if (col == F_GREYSCALE) strcpy(lowsuf,"pgm"); + else if (col == F_BWDITHER) strcpy(lowsuf,"pbm"); +@@ -1426,10 +1435,10 @@ + } + + if (allcaps) { /* upper-caseify lowsuf */ +- for (sp=lowsuf; *sp; sp++) ++ for (sp=lowsuf; *sp; sp++) + *sp = (islower(*sp)) ? toupper(*sp) : *sp; + } +- ++ + /* one other case: if the original suffix started with a single + capital letter, make the new suffix start with a single cap */ + if (isupper(suffix[0])) lowsuf[0] = toupper(lowsuf[0]); +@@ -1439,7 +1448,7 @@ + } + + } +- ++ + + /***************************************************/ + int DirCheckCD() +@@ -1462,7 +1471,7 @@ + static int FNameCdable() + { + /* returns '1' if filename is a directory, and goes there */ +- ++ + char newpath[1024]; + struct stat st; + int retval = 0; +@@ -1518,7 +1527,7 @@ + retval = 1; + } + } +- ++ + return retval; + } + +@@ -1550,7 +1559,7 @@ + + if (*uname=='\0') { /* no name. substitute ~ with $HOME */ + char *homedir; +- homedir = (char *) getenv("HOME"); ++ homedir = (char *) getenv("HOME"); + if (homedir == NULL) homedir = "."; + strcpy(tmp,homedir); + strcat(tmp,sp); +@@ -1579,7 +1588,7 @@ + /* opens file for output. does various error handling bits. Returns + an open file pointer if success, NULL if failure */ + +- FILE *fp; ++ FILE *fp = NULL; + struct stat st; + + if (!filename || filename[0] == '\0') return NULL; +@@ -1596,23 +1605,34 @@ + #else + strcpy(outFName, "[]xvXXXXXX.lis"); + #endif ++#ifdef USE_MKSTEMP ++ fp = fdopen(mkstemp(outFName), "w"); ++#else + mktemp(outFName); ++#endif + dopipe = 1; + } + + +- /* see if file exists (ie, we're overwriting) */ +- if (stat(outFName, &st)==0) { /* stat succeeded, file must exist */ +- static char *foo[] = { "\nOk", "\033Cancel" }; +- char str[512]; ++#ifdef USE_MKSTEMP /* (prior) nonexistence of file is already guaranteed by */ ++ if (!dopipe) /* mkstemp(), but now mkstemp() itself has created it */ ++#endif ++ /* see if file exists (i.e., we're overwriting) */ ++ if (stat(outFName, &st)==0) { /* stat succeeded, file must exist */ ++ static char *foo[] = { "\nOk", "\033Cancel" }; ++ char str[512]; + +- sprintf(str,"Overwrite existing file '%s'?", outFName); +- if (PopUp(str, foo, 2)) return NULL; +- } +- ++ sprintf(str,"Overwrite existing file '%s'?", outFName); ++ if (PopUp(str, foo, 2)) return NULL; ++ } ++ ++ ++ /* Open file (if not already open via mkstemp()) */ ++#ifdef USE_MKSTEMP ++ if (!dopipe) ++#endif ++ fp = fopen(outFName, "w"); + +- /* Open file */ +- fp = fopen(outFName, "w"); + if (!fp) { + char str[512]; + sprintf(str,"Can't write file '%s'\n\n %s.",outFName, ERRSTR(errno)); +@@ -1622,7 +1642,7 @@ + + return fp; + } +- ++ + + /***************************************/ + int CloseOutFile(fp, filename, failed) +@@ -1642,9 +1662,8 @@ + return 1; + } + +- ++ + if (fclose(fp) == EOF) { +- static char *foo[] = { "\nWeird!" }; + char str[512]; + sprintf(str,"Can't close file '%s'\n\n %s.",outFName, ERRSTR(errno)); + ErrPopUp(str, "\nWeird!"); +@@ -1666,7 +1685,7 @@ + } + + SetISTR(ISTR_INFO,"Successfully wrote '%s'%s", outFName, buf); +- ++ + if (dopipe) { + char cmd[512], str[1024]; + int i; +@@ -1709,7 +1728,7 @@ + return 0; + } + +- ++ + + + static byte rBW[2], gBW[2], bBW[2]; +@@ -1732,7 +1751,7 @@ + bwpic = (byte *) NULL; + *nc = numcols; *rpp = rMap; *gpp = gMap; *bpp = bMap; + +- /* quick check: if we're saving a 24-bit image, then none of this ++ /* quick check: if we're saving a 24-bit image, then none of this + complicated 'reduced'/dithered/smoothed business comes into play. + 'reduced' is disabled, for semi-obvious reasons, in 24-bit mode, + as is 'dithered'. If 'smoothed', and we're saving at current +@@ -1744,32 +1763,32 @@ + if we're saving B/W DITHERED, and deal accordingly */ + + +- if (ptype == PIC24) { ++ if (ptype == PIC24) { + if (color != F_BWDITHER) return NULL; + else { /* generate a bw-dithered version */ + byte *p24, *thepic; +- ++ + thepic = pic; + p24 = GammifyPic24(thepic, pw, ph); + if (p24) thepic = p24; +- ++ + /* generate a FSDithered 1-byte per pixel image */ + bwpic = FSDither(thepic, PIC24, pw, ph, NULL,NULL,NULL, 0, 1); + if (!bwpic) FatalError("unable to malloc dithered picture (DoSave)"); +- ++ + if (p24) free(p24); /* won't need it any more */ +- ++ + /* build a BW colormap */ + rBW[0] = gBW[0] = bBW[0] = 0; + rBW[1] = gBW[1] = bBW[1] = 255; +- ++ + *rpp = rBW; *gpp = gBW; *bpp = bBW; + *nc = 2; +- ++ + return bwpic; + } + } +- ++ + + + /* ptype == PIC8 ... */ +@@ -1777,7 +1796,7 @@ + *nc = numcols; *rpp = rMap; *gpp = gMap; *bpp = bMap; + if (color==F_REDUCED) { *rpp = rdisp; *gpp = gdisp; *bpp = bdisp; } + +- /* if DITHER or SMOOTH, and color==FULLCOLOR or GREY, ++ /* if DITHER or SMOOTH, and color==FULLCOLOR or GREY, + make color=REDUCED, so it will be written with the correct colortable */ + + if ((epicMode == EM_DITH || epicMode == EM_SMOOTH) && color != F_REDUCED) { +@@ -1789,7 +1808,7 @@ + *rpp = gray; *gpp = gray; *bpp = gray; + } + } +- ++ + + + +@@ -1823,8 +1842,8 @@ + * and whether or not it should be freed when we're done with it. The 'pic' + * returned is the desired portion of 'cpic' or 'epic' if there is a + * selection, and the saveselCB is enabled, or alternately, it's the +- * whole cpic or epic. +- * ++ * whole cpic or epic. ++ * + * if selection does not intersect cpic/epic, returns cpic/epic + * NEVER RETURNS NULL + */ +@@ -1837,7 +1856,7 @@ + if (savenormCB.val) { thepic = cpic; pw = cWIDE; ph = cHIGH; } + else { thepic = epic; pw = eWIDE; ph = eHIGH; } + +- *pwide = pw; *phigh = ph; ++ *pwide = pw; *phigh = ph; + + + if (saveselCB.active && saveselCB.val && HaveSelection()) { +@@ -1862,7 +1881,7 @@ + CoordP2E(x2,y2, &x2, &y2); + slx = x1; sly = y1; slw = x2-x1; slh = y2-y1; + CropRect2Rect(&slx, &sly, &slw, &slh, 0,0,pw,ph); +- ++ + if (slw<1 || slh<1) { slx = sly = 0; slw=pw; slh=ph; } + + if (slx!=0 || sly!=0 || slw!=pw || slh!=ph) { +@@ -1871,7 +1890,7 @@ + } + } + +- *pwide = slw; *phigh = slh; ++ *pwide = slw; *phigh = slh; + } + + return thepic; +@@ -1884,11 +1903,11 @@ + byte **rmapP, **gmapP, **bmapP; + { + /* handles the whole ugly mess of the various save options. +- * returns an image, of type 'ptypeP', size 'wP,hP'. ++ * returns an image, of type 'ptypeP', size 'wP,hP'. + * if (*ptypeP == PIC8), also returns numcols 'ncP', and the r,g,b map + * to use rmapP, gmapP, bmapP. + * +- * if freeP is set, image can safely be freed after it is saved ++ * if freeP is set, image can safely be freed after it is saved + */ + + byte *pic1, *pic2; +@@ -1896,9 +1915,9 @@ + + pic1 = handleNormSel(&ptype, &w, &h, &pfree); + +- pic2 = handleBWandReduced(pic1, ptype, w,h, MBWhich(&colMB), ++ pic2 = handleBWandReduced(pic1, ptype, w,h, MBWhich(&colMB), + ncP, rmapP, gmapP, bmapP); +- if (pic2) { ++ if (pic2) { + if (pfree) free(pic1); + pic1 = pic2; + pfree = 1; +@@ -1906,7 +1925,7 @@ + } + + +- if (ptype == PIC24) { ++ if (ptype == PIC24) { + pic2 = GammifyPic24(pic1, w, h); + if (pic2) { + if (pfree) free(pic1); +@@ -1920,7 +1939,7 @@ + return pic1; + } + +- ++ + /***************************************/ + void GetSaveSize(wP, hP) + int *wP, *hP; +@@ -1947,7 +1966,7 @@ + CoordP2E(x2,y2, &x2, &y2); + slx = x1; sly = y1; slw = x2-x1; slh = y2-y1; + CropRect2Rect(&slx, &sly, &slw, &slh, 0,0,eWIDE,eHIGH); +- ++ + if (slw<1 || slh<1) { slx = sly = 0; slw=eWIDE; slh=eHIGH; } + } + } +@@ -1982,7 +2001,7 @@ + + if (stat(namelist[curname], &origStat)==0) { + haveStat = 1; +- if (DEBUG) fprintf(stderr," origStat.size=%ld, origStat.mtime=%d\n", ++ if (DEBUG) fprintf(stderr," origStat.size=%ld, origStat.mtime=%ld\n", + origStat.st_size, origStat.st_mtime); + } + } +@@ -1993,7 +2012,7 @@ + int CheckPoll(del) + int del; + { +- /* returns '1' if the file has been modified, and either ++ /* returns '1' if the file has been modified, and either + A) the file has stabilized (st = lastStat), or + B) 'del' seconds have gone by since the file last changed size + */ +@@ -2007,14 +2026,14 @@ + (strcmp(namelist[curname], STDINSTR)!=0)) { + + if (stat(namelist[curname], &st)==0) { +- if (DEBUG) fprintf(stderr," st.size=%ld, st.mtime=%d\n", ++ if (DEBUG) fprintf(stderr," st.size=%ld, st.mtime=%ld\n", + st.st_size, st.st_mtime); + + if ((st.st_size == origStat.st_size) && + (st.st_mtime == origStat.st_mtime)) return 0; /* no change */ + + /* if it's changed since last looked ... */ +- if (!haveLastStat || ++ if (!haveLastStat || + st.st_size != lastStat.st_size || + st.st_mtime != lastStat.st_mtime) { + xvbcopy((char *) &st, (char *) &lastStat, sizeof(struct stat)); +@@ -2031,7 +2050,7 @@ + } + } + } +- ++ + return 0; + } + +@@ -2042,14 +2061,13 @@ + { + /* called when file 'name' has been deleted. If any of the browsers + were showing the directory that the file was in, does a rescan() */ +- +- int i; ++ + char buf[MAXPATHLEN + 2], *tmp; + + strcpy(buf, name); + tmp = BaseName(buf); + *tmp = '\0'; /* truncate after last '/' */ +- ++ + if (strcmp(path, buf)==0) LoadCurrentDirectory(); + } + +diff -ruN xv-3.10a/xvevent.c xv-3.10a-bugfixes/xvevent.c +--- xv-3.10a/xvevent.c 1995-01-23 15:20:24.000000000 -0800 ++++ xv-3.10a-bugfixes/xvevent.c 2004-05-16 18:02:03.000000000 -0700 +@@ -101,15 +101,15 @@ + while (!done) { + + if (waitsec > -1 && canstartwait && !waiting && XPending(theDisp)==0) { +- /* we wanna wait, we can wait, we haven't started waiting yet, and +- all pending events (ie, drawing the image the first time) ++ /* we wanna wait, we can wait, we haven't started waiting yet, and ++ all pending events (ie, drawing the image the first time) + have been dealt with: START WAITING */ + time((time_t *) &orgtime); + waiting = 1; + } + + +- /* if there's an XEvent pending *or* we're not doing anything ++ /* if there's an XEvent pending *or* we're not doing anything + in real-time (polling, flashing the selection, etc.) get next event */ + if ((waitsec==-1 && !polling && !HaveSelection()) || XPending(theDisp)>0) { + XNextEvent(theDisp, &event); +@@ -187,7 +187,7 @@ + + #ifdef VMS + static int borders_sized = 0; +- ++ + if (!borders_sized && !useroot && exp_event->window == mainW) { + /* + * Initial expose of main window, find the size of the ancestor +@@ -198,13 +198,13 @@ + int status, count, mwid, mhgt, x, y, w, h, b, d, mbrd; + Window root, parent, *children, crw = exp_event->window; + borders_sized = 1; +- status = XGetGeometry(theDisp, crw, ++ status = XGetGeometry(theDisp, crw, + &root, &x, &y, &mwid, &mhgt, &mbrd, &d); +- ++ + for ( parent = crw, w=mwid, h=mhgt; + status && (parent != root) && (parent != vrootW); ) { + crw = parent; +- status = XQueryTree ( theDisp, crw, &root, &parent, ++ status = XQueryTree ( theDisp, crw, &root, &parent, + &children, &count ); + if ( children != NULL ) XFree ( children ); + } +@@ -221,7 +221,7 @@ + win = exp_event->window; + x = exp_event->x; y = exp_event->y; + w = exp_event->width; h = exp_event->height; +- ++ + if (PUCheckEvent (event)) break; /* event has been processed */ + if (PSCheckEvent (event)) break; /* event has been processed */ + +@@ -238,7 +238,7 @@ + if (TextCheckEvent (event, &retval, &done)) break; /* event eaten */ + + /* if the window doesn't do intelligent redraw, drop but last expose */ +- if (exp_event->count>0 && ++ if (exp_event->count>0 && + win != mainW && win != ctrlW && win != dirW && win != infoW) break; + + +@@ -301,7 +301,7 @@ + if (DEBUG) fprintf(stderr,"No configs pending.\n"); + /* if (DEBUG) XClearArea(theDisp, mainW, x,y,w,h, False); */ + DrawWindow(x,y,w,h); +- ++ + if (HaveSelection()) DrawSelection(0); + + canstartwait = 1; /* finished drawing */ +@@ -314,7 +314,7 @@ + else if (win == infoW) RedrawInfo(x,y,w,h); + else if (win == ctrlW) RedrawCtrl(x,y,w,h); + else if (win == dirW) RedrawDirW(x,y,w,h); +- ++ + XSetClipMask(theDisp, theGC, None); + XDestroyRegion(reg); + } +@@ -324,10 +324,10 @@ + else if (win == dList.win) LSRedraw(&dList,0); + else if (win == dList.scrl.win) SCRedraw(&dList.scrl); + else if (win == dnamW) RedrawDNamW(); +- } ++ } + break; + +- ++ + + case ClientMessage: { + Atom proto, delwin; +@@ -382,8 +382,8 @@ + XSizeHints hints; + + /* +- * if there's a virtual window manager running (e.g. tvtwm / olvwm), +- * we're going to get 'cevt' values in terms of the ++ * if there's a virtual window manager running (e.g. tvtwm / olvwm), ++ * we're going to get 'cevt' values in terms of the + * 'real' root window (the one that is the size of the screen). + * We'll want to translate them into values that are in terms of + * the 'virtual' root window (the 'big' one) +@@ -392,7 +392,7 @@ + if (vrootW != rootW) { + int x1,y1; Window child; + +- XTranslateCoordinates(theDisp, rootW, vrootW, cevt->x, cevt->y, ++ XTranslateCoordinates(theDisp, rootW, vrootW, cevt->x, cevt->y, + &x1, &y1, &child); + if (DEBUG) fprintf(stderr," CONFIG trans %d,%d root -> %d,%d vroot\n", + cevt->x, cevt->y, x1, y1); +@@ -401,11 +401,11 @@ + + #ifndef VMS + /* read hints for this window and adjust any position hints, but +- only if this is a 'synthetic' event sent to us by the WM ++ only if this is a 'synthetic' event sent to us by the WM + ('real' events from the server have useless x,y info, since the + mainW has been reparented by the WM) */ + +- if (cevt->send_event && ++ if (cevt->send_event && + XGetNormalHints(theDisp, cevt->window, &hints)) { + + if (DEBUG) fprintf(stderr," CONFIG got hints (0x%x %d,%d)\n", +@@ -439,11 +439,11 @@ + * This sucks! + * + * So, if we have just loaded an image, and we get a Synthetic conf +- * that is not the desired size (eWIDExeHIGH), ignore it, as it's ++ * that is not the desired size (eWIDExeHIGH), ignore it, as it's + * just the conf generated by moving the old window. And stop + * ignoring further config events + * +- * EVIL KLUDGE: do *not* ignore configs that are <100x100. Not ++ * EVIL KLUDGE: do *not* ignore configs that are <100x100. Not + * ignoring them won't be a big performance problem, and it'll get + * around the 'I only got one config in the wrong size' problem when + * initially displaying small images +@@ -453,7 +453,7 @@ + + /* fprintf(stderr,"***mainw, ignore=%d, send_event=%d, evtSize=%d,%d, size=%d,%d\n", ignoreConfigs, cevt->send_event, cevt->width, cevt->height, eWIDE, eHIGH); */ + +- if (ignoreConfigs==1 && cevt->send_event && ++ if (ignoreConfigs==1 && cevt->send_event && + (cevt->width != eWIDE || cevt->height != eHIGH)) { + ignoreConfigs=0; /* ignore this one only */ + break; +@@ -470,7 +470,7 @@ + else { + XEvent xev; + if (DEBUG) fprintf(stderr,"No configs pend."); +- ++ + if (cevt->width == eWIDE && cevt->height == eHIGH) { + if (DEBUG) fprintf(stderr,"No redraw\n"); + } +@@ -478,12 +478,12 @@ + if (DEBUG) fprintf(stderr,"Do full redraw\n"); + + Resize(cevt->width, cevt->height); +- ++ + /* eat any pending expose events and do a full redraw */ + while (XCheckTypedWindowEvent(theDisp, mainW, Expose, &xev)) { + XExposeEvent *exp = (XExposeEvent *) &xev; + +- if (DEBUG) ++ if (DEBUG) + fprintf(stderr," ate expose (%s) (count=%d) %d,%d %dx%d\n", + exp->send_event ? "synth" : "real", exp->count, + exp->x, exp->y, exp->width, exp->height); +@@ -508,9 +508,9 @@ + + } + break; +- + +- ++ ++ + case CirculateNotify: + case DestroyNotify: + case GravityNotify: break; +@@ -554,7 +554,7 @@ + + /* don't do it if we've just switched to a root mode */ + if ((unmap_event->window == mainW && dispMode == 0) || +- (unmap_event->window == ctrlW && dispMode != 0)) { ++ (unmap_event->window == ctrlW && dispMode != 0)) { + + if (autoclose) { + if (autoclose>1) autoclose -= 2; /* grab kludge */ +@@ -586,8 +586,8 @@ + XReparentEvent *reparent_event = (XReparentEvent *) event; + + if (DEBUG) { +- fprintf(stderr,"Reparent: mainW=%x ->win=%x ->ev=%x ->parent=%x ", +- (u_int) mainW, (u_int) reparent_event->window, ++ fprintf(stderr,"Reparent: mainW=%x ->win=%x ->ev=%x ->parent=%x ", ++ (u_int) mainW, (u_int) reparent_event->window, + (u_int) reparent_event->event, (u_int) reparent_event->parent); + fprintf(stderr,"%d,%d\n", reparent_event->x, reparent_event->y); + } +@@ -598,7 +598,7 @@ + + p_offx = p_offy = 0; /* topleft correction for WMs titlebar */ + +- if (ch_offx == 0 && ch_offy == 0) { ++ if (ch_offx == 0 && ch_offy == 0) { + /* looks like the user is running MWM or OLWM */ + + XWindowAttributes xwa; +@@ -609,8 +609,8 @@ + + XSync(theDisp, False); + XGetWindowAttributes(theDisp, mainW, &xwa); +- +- if (DEBUG) ++ ++ if (DEBUG) + fprintf(stderr,"XGetAttr: mainW %d,%d %dx%d\n", xwa.x, xwa.y, + xwa.width, xwa.height); + +@@ -620,8 +620,8 @@ + + XSync(theDisp, False); + XGetWindowAttributes(theDisp, reparent_event->parent, &xwa); +- +- if (DEBUG) ++ ++ if (DEBUG) + fprintf(stderr,"XGetAttr: parent %d,%d %dx%d\n", xwa.x, xwa.y, + xwa.width, xwa.height); + } +@@ -641,42 +641,42 @@ + p_offy = xwa.y; + } + +- ++ + /* move window around a bit... */ + { + XWindowAttributes xwa; + GetWindowPos(&xwa); + xwa.width = eWIDE; xwa.height = eHIGH; +- ++ + /* try to keep the damned thing on-screen, if possible */ + if (xwa.x + xwa.width > dispWIDE) xwa.x = dispWIDE - xwa.width; + if (xwa.y + xwa.height > dispHIGH) xwa.y = dispHIGH - xwa.height; + if (xwa.x < 0) xwa.x = 0; + if (xwa.y < 0) xwa.y = 0; +- ++ + SetWindowPos(&xwa); + } + + } + } + break; +- ++ + + case EnterNotify: + case LeaveNotify: { + XCrossingEvent *cross_event = (XCrossingEvent *) event; + if (cross_event->window == mainW || 0 + /* (cross_event->window == gamW && cmapInGam) */ ) { +- ++ + if (cross_event->type == EnterNotify && cross_event->window == mainW) { + zoomCurs(cross_event->state); + } + + +- if (cross_event->type == EnterNotify && LocalCmap && !ninstall) ++ if (cross_event->type == EnterNotify && LocalCmap && !ninstall) + XInstallColormap(theDisp,LocalCmap); + +- if (cross_event->type == LeaveNotify && LocalCmap && !ninstall) ++ if (cross_event->type == LeaveNotify && LocalCmap && !ninstall) + XUninstallColormap(theDisp,LocalCmap); + } + } +@@ -685,12 +685,12 @@ + + case SelectionClear: break; + +- case SelectionRequest: ++ case SelectionRequest: + { + XSelectionRequestEvent *xsrevt = (XSelectionRequestEvent *) event; + XSelectionEvent xse; + +- if (xsrevt->owner != ctrlW || ++ if (xsrevt->owner != ctrlW || + xsrevt->selection != XA_PRIMARY || + xsrevt->target != XA_STRING) { /* can't do it. */ + xse.property = None; +@@ -702,7 +702,7 @@ + if (xse.property != None) { + xerrcode = 0; + XChangeProperty(theDisp, xsrevt->requestor, xse.property, +- XA_STRING, 8, PropModeReplace, ++ XA_STRING, 8, PropModeReplace, + (byte *) ((xevPriSel) ? xevPriSel : "\0"), + (int) ((xevPriSel) ? strlen(xevPriSel)+1 : 1)); + XSync(theDisp, False); +@@ -721,9 +721,9 @@ + XSync(theDisp, False); + } + break; +- +- +- ++ ++ ++ + default: break; /* ignore unexpected events */ + } /* switch */ + +@@ -738,7 +738,7 @@ + int i; + { + /* called to handle selection of a dispMB item */ +- ++ + if (i<0 || i>=DMB_MAX) return; + + if (dispMB.dim[i]) return; /* disabled */ +@@ -747,36 +747,36 @@ + if (i==DMB_RAW) epicMode = EM_RAW; + else if (i==DMB_DITH) epicMode = EM_DITH; + else epicMode = EM_SMOOTH; +- +- SetEpicMode(); ++ ++ SetEpicMode(); + GenerateEpic(eWIDE, eHIGH); + DrawEpic(); + SetCursors(-1); + } +- ++ + else if (i==DMB_COLRW) { /* toggle rw on/off */ + dispMB.flags[i] = !dispMB.flags[i]; + allocMode = (dispMB.flags[i]) ? AM_READWRITE : AM_READONLY; + ChangeCmapMode(colorMapMode, 1, 0); + } +- ++ + else if (i>=DMB_COLNORM && i<=DMB_COLSTDC && !dispMB.flags[i]) { + switch (i) { +- case DMB_COLNORM: +- ChangeCmapMode(CM_NORMAL, 1, 0); +- defaultCmapMode = CM_NORMAL; ++ case DMB_COLNORM: ++ ChangeCmapMode(CM_NORMAL, 1, 0); ++ defaultCmapMode = CM_NORMAL; + break; +- case DMB_COLPERF: ++ case DMB_COLPERF: + ChangeCmapMode(CM_PERFECT,1, 0); +- defaultCmapMode = CM_PERFECT; ++ defaultCmapMode = CM_PERFECT; + break; +- case DMB_COLOWNC: ++ case DMB_COLOWNC: + ChangeCmapMode(CM_OWNCMAP,1, 0); +- defaultCmapMode = CM_OWNCMAP; ++ defaultCmapMode = CM_OWNCMAP; + break; +- case DMB_COLSTDC: ++ case DMB_COLSTDC: + ChangeCmapMode(CM_STDCMAP,1, 0); +- defaultCmapMode = CM_STDCMAP; ++ defaultCmapMode = CM_STDCMAP; + break; + } + } +@@ -788,17 +788,17 @@ + int i; + { + /* called to handle selection of a rootMB item */ +- ++ + if (i<0 || i>=RMB_MAX) return; + if (rootMB.flags[i]) return; + if (rootMB.dim[i]) return; + + dispMode = i; +- ++ + /* move checkmark */ + for (i=RMB_WINDOW; i<RMB_MAX; i++) rootMB.flags[i] = 0; + rootMB.flags[dispMode] = 1; +- ++ + HandleDispMode(); + } + +@@ -818,25 +818,25 @@ + else if (i==CONV24_24BIT && state824==1) { + /* went 24->8->24 */ + char buf[512]; +- ++ + sprintf(buf,"Warning: You appear to have taken a 24-bit "); + strcat(buf, "image, turned it to an 8-bit image, and turned "); + strcat(buf, "it back into a 24-bit image. Understand that "); + strcat(buf, "image data has probably been lost in this "); + strcat(buf, "transformation. You *may* want to reload the "); + strcat(buf, "original image to avoid this problem."); +- ++ + ErrPopUp(buf, "\nI Know!"); +- ++ + state824 = 2; /* shut up until next image is loaded */ + } + } + } +- ++ + else if (i==CONV24_LOCK) { + conv24MB.flags[i] = !conv24MB.flags[i]; + } +- ++ + else if (i>=CONV24_FAST && i<=CONV24_BEST) { + conv24 = i; + for (i=CONV24_FAST; i<=CONV24_BEST; i++) { +@@ -859,15 +859,15 @@ + else chdir(initdir); + OpenBrowse(); + break; +- ++ + case WMB_COLEDIT: GamBox (!gamUp); break; + case WMB_INFO: InfoBox(!infoUp); break; +- +- case WMB_COMMENT: ++ ++ case WMB_COMMENT: + if (!commentUp) OpenCommentText(); + else CloseCommentText(); + break; +- ++ + case WMB_TEXTVIEW: textViewCmd(); break; + case WMB_ABOUTXV: ShowLicense(); break; + case WMB_KEYHELP: ShowKeyHelp(); break; +@@ -892,19 +892,19 @@ + double r,wr,hr; + wr = ((double) cWIDE) / maxWIDE; + hr = ((double) cHIGH) / maxHIGH; +- ++ + r = (wr>hr) ? wr : hr; /* r is the max(wr,hr) */ + w = (int) ((cWIDE / r) + 0.5); + h = (int) ((cHIGH / r) + 0.5); + } + else { w = cWIDE; h = cHIGH; } +- ++ + WResize(w, h); + break; + + case SZMB_MAXPIC: WMaximize(); break; + +- case SZMB_MAXPECT: ++ case SZMB_MAXPECT: + { + int w1,h1; + w1 = eWIDE; h1 = eHIGH; +@@ -925,24 +925,24 @@ + if (h==eHIGH) h++; + WResize(w,h); + break; +- +- ++ ++ + case SZMB_SETSIZE: setSizeCmd(); break; + case SZMB_ASPECT: FixAspect(1, &w, &h); WResize(w,h); break; + +- case SZMB_4BY3: ++ case SZMB_4BY3: + w = eWIDE; h = (w * 3) / 4; + if (h>maxHIGH) { h = eHIGH; w = (h*4)/3; } + WResize(w,h); + break; + +- case SZMB_INTEXP: ++ case SZMB_INTEXP: + { + /* round (eWIDE/cWIDE),(eHIGH/cHIGH) to nearest + integer expansion/compression values */ +- ++ + double w,h; +- ++ + if (eWIDE >= cWIDE) { + w = ((double) eWIDE) / cWIDE; + w = floor(w + 0.5); +@@ -961,7 +961,7 @@ + } + w = pick; + } +- ++ + if (eHIGH >= cHIGH) { + h = ((double) eHIGH) / cHIGH; + h = floor(h + 0.5); +@@ -980,11 +980,11 @@ + } + h = pick; + } +- ++ + WResize((int) (w*cWIDE), (int) (h*cHIGH)); + } + break; +- ++ + default: break; + } + } +@@ -998,7 +998,7 @@ + int i; + char txt[512], str[PRINTCMDLEN + 10]; + static char *labels[] = { " Color", " Grayscale", " B/W", "\033Cancel" }; +- ++ + strcpy(txt, "Print: Enter a command that will read a PostScript file "); + strcat(txt, "from stdin and print it to the desired printer.\n\n"); + #ifndef VMS +@@ -1011,11 +1011,11 @@ + if (i == 3 || strlen(printCmd)==0) return; /* CANCEL */ + + if (dirUp == BLOAD) DirBox(0); +- ++ + SetDirSaveMode(F_FORMAT, F_PS); + SetDirSaveMode(F_COLORS, i); + +- if (printCmd[0] != '|' && printCmd[0] != '!') ++ if (printCmd[0] != '|' && printCmd[0] != '!') + sprintf(str, "| %s", printCmd); + else strcpy(str, printCmd); + +@@ -1090,7 +1090,7 @@ + Window win; + { + static char foo[16]; +- ++ + if (win == mainW) return "mainW"; + else if (win == rootW) return "rootW"; + else if (win == vrootW) return "vrootW"; +@@ -1106,7 +1106,7 @@ + } + } + +- ++ + /***********************************/ + static void handleButtonEvent(event, donep, retvalp) + XEvent *event; +@@ -1127,38 +1127,36 @@ + case ButtonPress: + /* *always* check for pop-up events, as errors can happen... */ + if (PUCheckEvent (event)) break; +- ++ + if (autoquit && win == mainW) Quit(0); +- ++ + if (viewonly) break; /* ignore all other button presses */ +- ++ + if (win == mainW && !useroot && showzoomcursor) { + DoZoom(x, y, but_event->button); + break; + } +- ++ + if (PSCheckEvent (event)) break; +- ++ + #ifdef HAVE_JPEG + if (JPEGCheckEvent(event)) break; + #endif +- ++ + #ifdef HAVE_TIFF + if (TIFFCheckEvent(event)) break; + #endif +- ++ + if (GamCheckEvent (event)) break; + if (BrowseCheckEvent (event, &retval, &done)) break; + if (TextCheckEvent (event, &retval, &done)) break; +- ++ + switch (but_event->button) { +- +- case Button1: ++ ++ case Button1: + if (win == mainW) DoSelection(but_event); +- ++ + else if (win == ctrlW) { +- int w,h; +- + if (MBClick(&dispMB, x,y)) SelectDispMB (MBTrack(&dispMB) ); + else if (MBClick(&conv24MB, x,y)) Select24to8MB (MBTrack(&conv24MB)); + else if (MBClick(&rootMB, x,y)) SelectRootMB (MBTrack(&rootMB) ); +@@ -1170,9 +1168,9 @@ + if (i>=0) DoAlg(i); + break; + } +- ++ + i=ClickCtrl(x,y); +- ++ + switch (i) { + case BNEXT: retval= NEXTPIC; done=1; break; + case BPREV: retval= PREVPIC; done=1; break; +@@ -1192,21 +1190,21 @@ + case BROTR: Rotate(0); break; + case BFLIPH: Flip(0); break; + case BFLIPV: Flip(1); break; +- ++ + case BCROP: Crop(); break; + case BUNCROP: UnCrop(); break; + case BACROP: AutoCrop(); break; +- ++ + case BPAD: + { + int mode, wide, high, opaque, omode; char *str; +- ++ + while (PadPopUp(&mode, &str, &wide, &high, &opaque, &omode)==0) { +- if (DoPad(mode, str, wide, high, opaque, omode)) { ++ if (DoPad(mode, str, wide, high, opaque, omode)) { + done = 1; retval = PADDED; break; + } +- } +- } ++ } ++ } + break; + + case BANNOT: annotatePic(); break; +@@ -1214,27 +1212,27 @@ + case BABOUT: SelectWindowMB(WMB_ABOUTXV); break; + case BXV: retval = DFLTPIC; done=1; break; + case BQUIT: retval = QUIT; done=1; break; +- ++ + default: break; + } +- ++ + if (i==BFLIPH || i==BFLIPV) { + DrawEpic(); + SetCursors(-1); + } + } +- ++ + else if (win == nList.win) { + i=LSClick(&nList,but_event); + if (curname<0) ActivePrevNext(); + if (i>=0) { done = 1; retval = i; } + } +- ++ + else if (win == nList.scrl.win) SCTrack(&nList.scrl, x, y); +- ++ + else if (win == dirW) { + i=ClickDirW(x,y); +- ++ + switch (i) { + case S_BOK: if (dirUp == BLOAD) { + if (!DirCheckCD()) { +@@ -1246,53 +1244,53 @@ + DoSave(); + } + break; +- ++ + case S_BCANC: DirBox(0); break; +- ++ + case S_BRESCAN: + WaitCursor(); LoadCurrentDirectory(); SetCursors(-1); + break; + } + } +- ++ + else if (win == dList.win) { + i=LSClick(&dList,but_event); + SelectDir(i); + } +- ++ + else if (win == dList.scrl.win) SCTrack(&dList.scrl, x,y); + else if (win == infoW) InfoBox(0); /* close info */ +- ++ + break; +- +- +- case Button2: ++ ++ ++ case Button2: + if (win == mainW && !useroot) { + if (!shift && !DoSelection(but_event)) TrackPicValues(x,y); + else if (shift) Paint(); + } + break; +- ++ + case Button3: /* if using root, MUST NOT get rid of ctrlbox. */ +- if (!shift && !useroot) CtrlBox(!ctrlUp); ++ if (!shift && !useroot) CtrlBox(!ctrlUp); + else if (shift) BlurPaint(); + break; +- ++ + default: break; + } + } +- ++ + *donep = done; *retvalp = retval; + } + +- ++ + /***********************************/ + static void handleKeyEvent(event, donep, retvalp) + XEvent *event; + int *donep, *retvalp; + { + /* handles KeyPress and KeyRelease events, called from HandleEvent */ +- ++ + XKeyEvent *key_event; + KeySym ks; + char buf[128]; +@@ -1306,26 +1304,26 @@ + switch (event->type) { + case KeyRelease: + if (viewonly) break; /* ignore all user input */ +- ++ + stlen = XLookupString(key_event,buf,128,&ks,(XComposeStatus *) NULL); + dealt = 0; +- ++ + if (key_event->window == mainW) { + u_int foo = key_event->state; + +- if (ks == XK_Shift_L || ks == XK_Shift_R) ++ if (ks == XK_Shift_L || ks == XK_Shift_R) + foo = foo & (u_int) (~ShiftMask); +- if (ks == XK_Control_L || ks == XK_Control_R) ++ if (ks == XK_Control_L || ks == XK_Control_R) + foo = foo & (u_int) (~ControlMask); +- if (ks == XK_Meta_L || ks == XK_Meta_R) ++ if (ks == XK_Meta_L || ks == XK_Meta_R) + foo = foo & (u_int) (~Mod1Mask); +- if (ks == XK_Alt_L || ks == XK_Alt_R) ++ if (ks == XK_Alt_L || ks == XK_Alt_R) + foo = foo & (u_int) (~Mod1Mask); + + zoomCurs(foo); + } + break; +- ++ + + case KeyPress: + svkeystate = key_event->state; +@@ -1343,11 +1341,11 @@ + if (PUCheckEvent (event)) break; /* always check popups */ + + if (autoquit && key_event->window == mainW) Quit(0); +- ++ + if (viewonly && !frominterrupt) break; /* ignore all user input */ +- ++ + if (PSCheckEvent (event)) break; +- ++ + if (key_event->window == mainW) { + u_int foo = key_event->state; + +@@ -1371,7 +1369,7 @@ + if (TextCheckEvent (event, &retval, &done)) break; + + +- /* check for pageup/pagedown, 'p' in main window ++ /* check for pageup/pagedown, 'p' in main window + (you can use shift-up or shift-down if no crop rectangle drawn) + (for viewing multipage docs) */ + +@@ -1386,7 +1384,7 @@ + else XBell(theDisp,0); + } + +- else if (ck==CK_PAGEDOWN || ++ else if (ck==CK_PAGEDOWN || + (ck==CK_DOWN && shift && !but[BCROP].active)) { + if (strlen(pageBaseName) && numPages>1) { + done = 1; retval = OP_PAGEDN; +@@ -1429,7 +1427,7 @@ + + if (dealt) break; + } +- ++ + + + /* check for crop rect keys */ +@@ -1468,7 +1466,7 @@ + if (theList == &dList && dealt) { /* changed dir selection */ + SelectDir(-1); /* nothing was double-clicked */ + } +- ++ + if (dealt) break; + } + +@@ -1491,7 +1489,7 @@ + else if (ks==XK_2) FakeButtonPress(&gbut[G_B2]); + else if (ks==XK_3) FakeButtonPress(&gbut[G_B3]); + else if (ks==XK_4) FakeButtonPress(&gbut[G_B4]); +- else if (ks==XK_r || ks==XK_0) ++ else if (ks==XK_r || ks==XK_0) + FakeButtonPress(&gbut[G_BRESET]); + + else if (ks==XK_x) FakeButtonPress(&but[BCUT]); +@@ -1521,7 +1519,7 @@ + + else if (ks==XK_a) FakeButtonPress(&gbut[G_BAPPLY]); + +- else if (ks==XK_8) { ++ else if (ks==XK_8) { + if (picType==PIC8) Select24to8MB(CONV24_24BIT); + else Select24to8MB(CONV24_8BIT); + } +@@ -1530,20 +1528,20 @@ + + if (dealt) break; + } +- ++ + if (!stlen) break; +- ++ + if (key_event->window == dirW) { + if (DirKey(buf[0])) XBell(theDisp,0); + } + else { /* commands valid in any window */ + switch (buf[0]) { +- ++ + /* things in dispMB */ + case 'r': SelectDispMB(DMB_RAW); break; + case 'd': SelectDispMB(DMB_DITH); break; + case 's': SelectDispMB(DMB_SMOOTH); break; +- ++ + /* things in sizeMB */ + case 'n': SelectSizeMB(SZMB_NORM); break; + case 'm': SelectSizeMB(SZMB_MAXPIC); break; +@@ -1556,7 +1554,7 @@ + case 'a': SelectSizeMB(SZMB_ASPECT); break; + case '4': SelectSizeMB(SZMB_4BY3); break; + case 'I': SelectSizeMB(SZMB_INTEXP); break; +- ++ + /* things in windowMB */ + case '\026': + case 'V': SelectWindowMB(WMB_BROWSE); break; /* ^V or V */ +@@ -1565,36 +1563,36 @@ + case '\003': SelectWindowMB(WMB_COMMENT); break; /* ^C */ + case '\024': SelectWindowMB(WMB_TEXTVIEW); break; /* ^T */ + case '\001': SelectWindowMB(WMB_ABOUTXV); break; /* ^A */ +- +- +- ++ ++ ++ + /* buttons in ctrlW */ + case '\t': + case ' ': FakeButtonPress(&but[BNEXT]); break; +- ++ + case '\r': + case '\n': + if (nList.selected >= 0 && nList.selected < nList.nstr) { +- done = 1; retval = nList.selected; ++ done = 1; retval = nList.selected; + if (frominterrupt) retval = RELOAD; + } + break; +- ++ + case '\010': + case '\177': FakeButtonPress(&but[BPREV]); break; +- +- ++ ++ + case '\014': FakeButtonPress(&but[BLOAD]); break; /* ^L */ + case '\023': FakeButtonPress(&but[BSAVE]); break; /* ^S */ + case '\020': FakeButtonPress(&but[BPRINT]); break; /* ^P */ + case '\004': FakeButtonPress(&but[BDELETE]); break; /* ^D */ +- ++ + /* BCOPY, BCUT, BPASTE, BCLEAR handled in 'meta' case */ +- ++ + case '\007': FakeButtonPress(&but[BGRAB]); break; /* ^G */ +- ++ + /* BUP10, BDN10 handled in sizeMB case */ +- ++ + case 'T': FakeButtonPress(&but[BROTL]); break; + case 't': FakeButtonPress(&but[BROTR]); break; + case 'h': FakeButtonPress(&but[BFLIPH]); break; +@@ -1604,24 +1602,24 @@ + case 'C': FakeButtonPress(&but[BACROP]); break; + case 'P': FakeButtonPress(&but[BPAD]); break; + case 'A': FakeButtonPress(&but[BANNOT]); break; +- ++ + /* BABOUT handled in windowMB case */ +- ++ + case '\021': /* ^Q */ + case 'q': FakeButtonPress(&but[BQUIT]); break; +- ++ + case '?': if (!useroot) CtrlBox(!ctrlUp); break; +- ++ + /* things in color editor */ + case 'R': FakeButtonPress(&gbut[G_BRESET]); break; + case 'H': FakeButtonPress(&gbut[G_BHISTEQ]); break; + case 'N': FakeButtonPress(&gbut[G_BMAXCONT]); break; +- ++ + default: break; + } + } + } +- ++ + *donep = done; *retvalp = retval; + } + +@@ -1657,7 +1655,7 @@ + else name = namelist[i]; + + TextView(name); +- ++ + if (name != namelist[i]) free(name); + } + +@@ -1671,7 +1669,7 @@ + int i, arg1, arg2, numargs, pct1, pct2, state, neww, newh; + char txt[512], buf[64], *sp, ch; + static char *labels[] = { "\nOk", "\033Cancel" }; +- ++ + sprintf(txt, "Enter new image display size (ex. '400 x 300'),\n"); + strcat (txt, "expansion ratio (ex. '75%'),\n"); + strcat (txt, "or expansion ratios (ex. '200% x 125%'):"); +@@ -1685,7 +1683,7 @@ + + + /* attempt to parse the string accordingly... +- * parses strings of the type: <num> [%] [ x <num> [%] ] ++ * parses strings of the type: <num> [%] [ x <num> [%] ] + * (-ish. <num> all by itself isn't legal) + * there may be any # of spaces between items, including zero + */ +@@ -1825,7 +1823,7 @@ + + if (theImage) + XPutImage(theDisp,mainW,theGC,theImage,x,y,x,y, (u_int) w, (u_int) h); +- else ++ else + if (DEBUG) fprintf(stderr,"Tried to DrawWindow when theImage was NULL\n"); + } + +@@ -1872,7 +1870,7 @@ + XWindowAttributes xwa; + xvbzero((char *) &xwa, sizeof(XWindowAttributes)); + xwa.x = xwa.y = 0; +- xwa.width = dispWIDE; ++ xwa.width = dispWIDE; + xwa.height = dispHIGH; + SetWindowPos(&xwa); + } +@@ -1898,14 +1896,14 @@ + rotatesLeft++; + XClearWindow(theDisp, mainW); /* get rid of old bits */ + GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH); +- { int ew, eh; ++ { int ew, eh; + ew = eWIDE; eh = eHIGH; + WResize(eWIDE, eHIGH); + if (ew>maxWIDE || eh>maxHIGH) { /* rotated pic too big, scale down */ + double r,wr,hr; + wr = ((double) ew) / maxWIDE; + hr = ((double) eh) / maxHIGH; +- ++ + r = (wr>hr) ? wr : hr; /* r is the max(wr,hr) */ + ew = (int) ((ew / r) + 0.5); + eh = (int) ((eh / r) + 0.5); +@@ -1920,7 +1918,7 @@ + void WCrop(w,h,dx,dy) + int w,h,dx,dy; + { +- int cx, cy, cw, ch, ex, ey; ++ int ex, ey; + XWindowAttributes xwa; + + if (useroot) { +@@ -1931,7 +1929,7 @@ + else { + /* we want to move window to old x,y + dx,dy (in pic coords) */ + GetWindowPos(&xwa); +- ++ + if (!origcropvalid) { /* first crop. remember win pos */ + origcropvalid = 1; + origcropx = xwa.x; +@@ -1939,7 +1937,7 @@ + } + + CoordC2E(dx, dy, &ex, &ey); +- ++ + xwa.x += ex; xwa.y += ey; + xwa.width = w; xwa.height = h; + GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH); +@@ -1980,7 +1978,7 @@ + if (xwa.x<0) xwa.x = 0; + if (xwa.y<0) xwa.y = 0; + xwa.width = w; xwa.height = h; +- ++ + if (!useroot) { + SetWindowPos(&xwa); + GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH); +@@ -1995,8 +1993,8 @@ + XWindowAttributes *xwa; + { + Window child; +- +- /* returns the x,y,w,h coords of mainW. x,y are relative to rootW ++ ++ /* returns the x,y,w,h coords of mainW. x,y are relative to rootW + the border is not included (x,y map to top-left pixel in window) */ + + /* Get the window width/height */ +@@ -2023,7 +2021,7 @@ + + /* if we're less than max size in one axis, allow window manager doohickeys + on the screen */ +- ++ + if (xwa->width < dispWIDE && xwc.x < p_offx) xwc.x = p_offx; + if (xwa->height < dispHIGH && xwc.y < p_offy) xwc.y = p_offy; + +@@ -2034,9 +2032,9 @@ + #ifdef BAD_IDEA + /* if there is a virtual window manager running, then we should translate + the coordinates that are in terms of 'real' screen into coordinates +- that are in terms of the 'virtual' root window ++ that are in terms of the 'virtual' root window + from: Daren W. Latham <dwl@mentat.udev.cdc.com> */ +- ++ + if (vrootW != rootW) { /* virtual window manager running */ + int x1,y1; + Window child; +@@ -2045,14 +2043,14 @@ + xwc.x,xwc.y,x1,y1); + xwc.x = x1; xwc.y = y1; + } +-#endif ++#endif + + + if (DEBUG) { + fprintf(stderr, + "SWP: xwa=%d,%d %dx%d xwc=%d,%d %dx%d off=%d,%d bw=%d klg=%d,%d\n", + xwa->x, xwa->y, xwa->width, xwa->height, +- xwc.x, xwc.y, xwc.width, xwc.height, p_offx, p_offy, ++ xwc.x, xwc.y, xwc.width, xwc.height, p_offx, p_offy, + xwa->border_width, kludge_offx, kludge_offy); + } + +@@ -2080,7 +2078,7 @@ + + /* all non-DXWM window managers (?) */ + /* Move/Resize the window. */ +- XConfigureWindow(theDisp, mainW, ++ XConfigureWindow(theDisp, mainW, + CWX | CWY | CWWidth | CWHeight /*| CWBorderWidth*/, &xwc); + } + +@@ -2090,7 +2088,7 @@ + static void CropKey(dx,dy,grow,crop) + int dx,dy,grow,crop; + { +- int x1,x2,y1,y2,active, ocx, ocy; ++ int ocx, ocy; + + if (crop) { /* chop off a pixel from the appropriate edge */ + int dealt=1; +@@ -2112,7 +2110,7 @@ + } + return; + } +- ++ + if (grow) MoveGrowSelection(0, 0, dx, dy); + else MoveGrowSelection(dx, dy, 0, 0); + } +@@ -2128,7 +2126,7 @@ + u_long wh, bl; + int ty, w, ecol, done1; + char foo[128]; +- char *str = ++ char *str = + "8888,8888 = 123,123,123 #123456 (123,123,123 HSV) [-2345,-2345]"; + + ecol = 0; wh = infobg; bl = infofg; +@@ -2136,14 +2134,14 @@ + if (!dropper) { + Pixmap pix, mask; + XColor cfg, cbg; +- ++ + cfg.red = cfg.green = cfg.blue = 0x0000; + cbg.red = cbg.green = cbg.blue = 0xffff; +- ++ + pix = MakePix1(rootW, dropper_bits, dropper_width, dropper_height); + mask= MakePix1(rootW, dropperm_bits, dropperm_width, dropperm_height); +- if (pix && mask) +- dropper = XCreatePixmapCursor(theDisp, pix, mask, &cfg, &cbg, ++ if (pix && mask) ++ dropper = XCreatePixmapCursor(theDisp, pix, mask, &cfg, &cbg, + dropper_x_hot, dropper_y_hot); + if (pix) XFreePixmap(theDisp, pix); + if (mask) XFreePixmap(theDisp, mask); +@@ -2151,7 +2149,7 @@ + + if (dropper) XDefineCursor(theDisp, mainW, dropper); + +- /* do a colormap search for black and white if LocalCmap ++ /* do a colormap search for black and white if LocalCmap + and use those colors instead of infobg and infofg */ + + if (LocalCmap) { +@@ -2159,7 +2157,7 @@ + + for (i=0; i<nfcols; i++) ctab[i].pixel = freecols[i]; + XQueryColors(theDisp,LocalCmap,ctab,nfcols); +- ++ + /* find 'blackest' pixel */ + cval = 0x10000 * 3; + for (i=0; i<nfcols; i++) +@@ -2176,7 +2174,7 @@ + wh = ctab[i].pixel; + } + } +- ++ + + XSetFont(theDisp, theGC, monofont); + w = XTextWidth(monofinfo, str, (int) strlen(str)); +@@ -2185,7 +2183,7 @@ + else ty = eHIGH-(monofinfo->ascent + mfinfo->descent)-4; + + XSetForeground(theDisp, theGC, bl); +- XFillRectangle(theDisp, mainW, theGC, 0, ty, (u_int) w + 8, ++ XFillRectangle(theDisp, mainW, theGC, 0, ty, (u_int) w + 8, + (u_int) (monofinfo->ascent+monofinfo->descent) + 4); + XSetForeground(theDisp, theGC, wh); + XSetBackground(theDisp, theGC, bl); +@@ -2198,15 +2196,15 @@ + + if (!XQueryPointer(theDisp,mainW,&rW,&cW,&rx,&ry,&x,&y,&mask)) continue; + if (done1 && !(mask & Button2Mask)) break; /* button released */ +- ++ + CoordE2P(x,y, &px, &py); +- RANGE(px,0,pWIDE-1); ++ RANGE(px,0,pWIDE-1); + RANGE(py,0,pHIGH-1); +- ++ + if (px!=ox || py!=oy || !done1) { /* moved, or firsttime. erase & draw */ + double h1, s1, v1; + int rval, gval, bval; +- ++ + if (picType == PIC8) { + ecol = pix = pic[py * pWIDE + px]; + rval = rcmap[pix]; gval = gcmap[pix]; bval = bcmap[pix]; +@@ -2216,7 +2214,7 @@ + gval = pic[py * pWIDE * 3 + px * 3 + 1]; + bval = pic[py * pWIDE * 3 + px * 3 + 2]; + } +- ++ + clearR = rval; clearG = gval; clearB = bval; + + rgb2hsv(rval, gval, bval, &h1, &s1, &v1); +@@ -2229,8 +2227,8 @@ + px, py, rval, gval, bval, rval, gval, bval, + (int) h1, (int) (s1 * 100), (int) (v1 * 100), + px-orgx, py-orgy); +- +- XDrawImageString(theDisp,mainW,theGC, 4, ty + 2 + monofinfo->ascent, ++ ++ XDrawImageString(theDisp,mainW,theGC, 4, ty + 2 + monofinfo->ascent, + foo, (int) strlen(foo)); + ox = px; oy = py; + done1 = 1; +@@ -2275,7 +2273,7 @@ + + /* returns true if there's a config event in which mainW changes size + in the event queue */ +- ++ + XSync(theDisp, False); + foo = 0; + XCheckIfEvent(theDisp, &ev, IsConfig, &foo); +@@ -2328,7 +2326,7 @@ + * BadMatch errors on XGetImage + */ + +- if ((xerrcode == BadAlloc) || ++ if ((xerrcode == BadAlloc) || + (xerrcode == BadAccess && err->request_code==88 /* X_FreeColors */ ) || + (err->request_code == 113 /* X_KillClient */ ) || + (xerrcode == BadLength && err->request_code==18 /* X_ChangeProp */ ) || +@@ -2361,7 +2359,7 @@ + { + /* but first, if any input-grabbing popups are active, we have to 'cancel' + them. */ +- ++ + if (psUp) PSDialog(0); /* close PS window */ + + #ifdef HAVE_JPEG +@@ -2400,14 +2398,14 @@ + if (!pen) { + Pixmap pix, pmask; + XColor cfg, cbg; +- ++ + cfg.red = cfg.green = cfg.blue = 0x0000; + cbg.red = cbg.green = cbg.blue = 0xffff; +- ++ + pix = MakePix1(rootW, pen_bits, pen_width, pen_height); + pmask= MakePix1(rootW, penm_bits, penm_width, penm_height); +- if (pix && pmask) +- pen = XCreatePixmapCursor(theDisp, pix, pmask, &cfg, &cbg, ++ if (pix && pmask) ++ pen = XCreatePixmapCursor(theDisp, pix, pmask, &cfg, &cbg, + pen_x_hot, pen_y_hot); + if (pix) XFreePixmap(theDisp, pix); + if (pmask) XFreePixmap(theDisp, pmask); +@@ -2416,7 +2414,7 @@ + if (pen) XDefineCursor(theDisp, mainW, pen); + + +- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask ++ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask + | StructureNotifyMask /* | ButtonPressMask */ + | KeyReleaseMask | ColormapChangeMask + | EnterWindowMask | LeaveWindowMask ); +@@ -2435,7 +2433,7 @@ + + switch (state) { + case 0: /* initial state: make sure we do one pixel */ +- px1 = lx = px; py1 = ly = py; ++ px1 = lx = px; py1 = ly = py; + paintPixel(px, py); + + if (nmask & ShiftMask ) state = 99; +@@ -2444,7 +2442,7 @@ + else state = 10; + break; + +- ++ + case 1: /* waiting for click */ + if (nmask & ShiftMask) state = 99; + else if ( mask & Button2Mask) { +@@ -2459,7 +2457,7 @@ + } + break; + +- ++ + case 10: /* in freehand drawing mode */ + if (nmask & ShiftMask ) state = 99; + else if (nmask & Button2Mask) state = 1; +@@ -2507,11 +2505,11 @@ + XSync(theDisp, False); + Timer(100); + } +- ++ + if (nmask & Button2Mask) seenRelease = 1; + } + break; +- ++ + case 99: /* EXIT loop: cleanup */ + if (line) { /* erase old xor-line */ + paintXLine(lx, ly, px1, py1, 0); +@@ -2521,11 +2519,11 @@ + break; + } + } +- +- ++ ++ + WaitCursor(); +- +- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask ++ ++ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask + | StructureNotifyMask | ButtonPressMask + | KeyReleaseMask | ColormapChangeMask + | EnterWindowMask | LeaveWindowMask ); +@@ -2557,17 +2555,17 @@ + byte *pp = pic + (y * pWIDE + x) * 3; + pp[0] = clearR; pp[1] = clearG; pp[2] = clearB; + } +- ++ + /* visual feedback */ + CoordP2E(x, y, &ex, &ey); + CoordP2E(x+1, y+1, &ex1, &ey1); +- ++ + ew = ex1-ex; eh = ey1-ey; +- ++ + if (picType == PIC8) XSetForeground(theDisp, theGC, cols[editColor]); + else XSetForeground(theDisp, theGC, RGBToXColor(clearR, clearG, clearB)); +- +- if (ew>0 && eh>0) ++ ++ if (ew>0 && eh>0) + XFillRectangle(theDisp,mainW,theGC, ex,ey, (u_int) ew, (u_int) eh); + } + +@@ -2577,7 +2575,7 @@ + int x,y,x1,y1; + { + int dx,dy,i,lx,ly,adx,ady; +- ++ + dx = x1-x; dy = y1-y; + adx = abs(dx); ady = abs(dy); + +@@ -2598,7 +2596,7 @@ + paintPixel(lx,ly); + } + } +- ++ + + } + +@@ -2618,14 +2616,14 @@ + CoordP2E(x+1,y+1,&tx1,&ty1); + ex = tx + (tx1 - tx)/2; + ey = ty + (ty1 - ty)/2; +- ++ + CoordP2E(x1, y1, &tx, &ty); + CoordP2E(x1+1,y1+1,&tx1,&ty1); + ex1 = tx + (tx1 - tx)/2; + ey1 = ty + (ty1 - ty)/2; +- ++ + if (ex==ex1 && ey==ey1) return; +- ++ + XSetPlaneMask(theDisp, theGC, xorMasks[pntxlcol]); + XSetFunction(theDisp, theGC, GXinvert); + XDrawLine(theDisp, mainW, theGC, ex, ey, ex1, ey1); +@@ -2638,10 +2636,8 @@ + static void BlurPaint() + { + Window rW,cW; +- int rx,ry,ox,oy,x,y, px,py, ex,ey, ex1,ey1, ew, eh, done1, dragging; +- int uppedpic; ++ int rx,ry,ox,oy,x,y, px,py, done1, dragging; + u_int mask; +- byte *pp; + + /* blurs pixels in either editCol (PIC8) or clear{R,G,B} (PIC24) until + 'shift' key is released. */ +@@ -2653,14 +2649,14 @@ + if (!blur) { + Pixmap pix, mask; + XColor cfg, cbg; +- ++ + cfg.red = cfg.green = cfg.blue = 0x0000; + cbg.red = cbg.green = cbg.blue = 0xffff; +- ++ + pix = MakePix1(rootW, blur_bits, blur_width, blur_height); + mask= MakePix1(rootW, blurm_bits, blurm_width, blurm_height); +- if (pix && mask) +- blur = XCreatePixmapCursor(theDisp, pix, mask, &cfg, &cbg, ++ if (pix && mask) ++ blur = XCreatePixmapCursor(theDisp, pix, mask, &cfg, &cbg, + blur_x_hot, blur_y_hot); + if (pix) XFreePixmap(theDisp, pix); + if (mask) XFreePixmap(theDisp, mask); +@@ -2669,7 +2665,7 @@ + if (blur) XDefineCursor(theDisp, mainW, blur); + + +- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask ++ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask + | StructureNotifyMask /* | ButtonPressMask */ + | KeyReleaseMask | ColormapChangeMask + | EnterWindowMask | LeaveWindowMask ); +@@ -2682,12 +2678,12 @@ + if (!(mask & Button3Mask)) { dragging = 0; continue; } + + CoordE2P(x,y, &px, &py); +- ++ + if (!dragging || (dragging && (px!=ox || py!=oy))) { /* click or drag */ + if (!dragging) blurPixel(px,py); + else { + int dx,dy,i,lx,ly; +- ++ + dx = px-ox; dy = py-oy; /* at least one will be non-zero */ + if (abs(dx) > abs(dy)) { /* X is major axis */ + for (i=0; i<=abs(dx); i++) { +@@ -2707,10 +2703,10 @@ + done1 = 1; dragging = 1; ox = px; oy = py; + } + } +- ++ + WaitCursor(); +- +- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask ++ ++ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask + | StructureNotifyMask | ButtonPressMask + | KeyReleaseMask | ColormapChangeMask + | EnterWindowMask | LeaveWindowMask ); +@@ -2731,9 +2727,9 @@ + { + /* returns position of highest set bit in 'ul' as an integer (0-31), + or -1 if none */ +- ++ + int i; unsigned long hb; +- ++ + hb = 0x80; hb = hb << 24; /* hb = 0x80000000UL */ + for (i=31; ((ul & hb) == 0) && i>=0; i--, ul<<=1); + return i; +@@ -2757,7 +2753,7 @@ + + d = 3*(256*256); j=0; + for (i=0; i<numcols; i++) { +- di = ((r-rMap[i]) * (r-rMap[i])) + ++ di = ((r-rMap[i]) * (r-rMap[i])) + + ((g-gMap[i]) + (g-gMap[i])) + + ((b-bMap[i]) * (b-bMap[i])); + if (i==0 || di<d) { j=i; d=di; } +@@ -2771,45 +2767,45 @@ + if (theVisual->class==TrueColor || theVisual->class==DirectColor) { + unsigned long rmask, gmask, bmask; + int rshift, gshift, bshift, cshift, maplen; +- ++ + /* compute various shifting constants that we'll need... */ +- ++ + rmask = theVisual->red_mask; + gmask = theVisual->green_mask; + bmask = theVisual->blue_mask; +- ++ + rshift = 7 - highbit(rmask); + gshift = 7 - highbit(gmask); + bshift = 7 - highbit(bmask); +- ++ + if (theVisual->class == DirectColor) { + maplen = theVisual->map_entries; + if (maplen>256) maplen=256; + cshift = 7 - highbit((u_long) (maplen-1)); +- ++ + r = (u_long) directConv[(r>>cshift) & 0xff] << cshift; + g = (u_long) directConv[(g>>cshift) & 0xff] << cshift; + b = (u_long) directConv[(b>>cshift) & 0xff] << cshift; + } +- +- ++ ++ + /* shift the bits around */ + if (rshift<0) r = r << (-rshift); + else r = r >> rshift; +- ++ + if (gshift<0) g = g << (-gshift); + else g = g >> gshift; +- ++ + if (bshift<0) b = b << (-bshift); + else b = b >> bshift; +- ++ + r = r & rmask; + g = g & gmask; + b = b & bmask; +- ++ + rv =r | g | b; + } +- ++ + else { /* non-TrueColor/DirectColor visual */ + if (!ncols) + rv = ((r + g + b >= 128*3) ? white : black); +@@ -2820,14 +2816,14 @@ + + return rv; + } +- +- ++ ++ + /***********************/ + static void blurPixel(x,y) + int x,y; + { + /* blurs pixel x,y (pic coords) into pic in editColor (PIC8) or clearR,G,B +- (PIC24) and does appropriate screen feedback. Does a 3x3 average ++ (PIC24) and does appropriate screen feedback. Does a 3x3 average + around the pixel, and replaces it with the average value (PIC24), or + the closest existing color to the average value (PIC8) */ + +@@ -2861,7 +2857,7 @@ + if (picType == PIC8) { /* find nearest actual color */ + d = 3*(256*256); j=0; + for (i=0; i<numcols; i++) { +- di = ((ar-rMap[i]) * (ar-rMap[i])) + ++ di = ((ar-rMap[i]) * (ar-rMap[i])) + + ((ag-gMap[i]) + (ag-gMap[i])) + + ((ab-bMap[i]) * (ab-bMap[i])); + if (i==0 || di<d) { j=i; d=di; } +@@ -2874,17 +2870,17 @@ + pp = pic + (y * pWIDE + x) * 3; + pp[0] = ar; pp[1] = ag; pp[2] = ab; + } +- ++ + /* visual feedback */ + CoordP2E(x, y, &ex, &ey); + CoordP2E(x+1, y+1, &ex1, &ey1); +- ++ + ew = ex1-ex; eh = ey1-ey; +- ++ + if (picType == PIC8) XSetForeground(theDisp, theGC, cols[ac]); + else XSetForeground(theDisp, theGC, RGBToXColor(ar, ag, ab)); +- +- if (ew>0 && eh>0) ++ ++ if (ew>0 && eh>0) + XFillRectangle(theDisp,mainW,theGC, ex,ey, (u_int) ew, (u_int) eh); + } + +@@ -2901,13 +2897,13 @@ + static char buf[256] = {'\0'}; + static char *labels[] = {"\nOk", "\033Cancel" }; + +- sprintf(txt, "Image Annotation:\n\n%s", ++ sprintf(txt, "Image Annotation:\n\n%s", + "Enter string to be placed on image."); +- ++ + i = GetStrPopUp(txt, labels, 2, buf, 256, "", 0); + if (i==1 || strlen(buf)==0) return; +- +- ++ ++ + /* build a 'cimg' array to be pasted on clipboard */ + w = strlen(buf) * 6 - 1; h = 9; + len = CIMG_PIC8 + w*h; +diff -ruN xv-3.10a/xvfits.c xv-3.10a-bugfixes/xvfits.c +--- xv-3.10a/xvfits.c 1994-12-27 23:43:29.000000000 -0800 ++++ xv-3.10a-bugfixes/xvfits.c 2005-04-02 21:08:45.000000000 -0800 +@@ -63,7 +63,7 @@ + /* returns '1' on success */ + + FITS fs; +- int i, nx, ny, nz, bitpix, np, nrd, ioerror; ++ int i, nx, ny, nz, bitpix, nrd, ioerror, npixels, bufsize; + byte *image; + char *error; + char basename[64]; +@@ -72,7 +72,7 @@ + fits_block = (char *) malloc((size_t) BLOCKSIZE); + if (!fits_block) FatalError("Insufficient memory for FITS block buffer"); + } +- ++ + error = ftopen3d(&fs, fname, &nx, &ny, &nz, &bitpix); + if (error) { + SetISTR(ISTR_WARNING, "%s", error); +@@ -80,9 +80,15 @@ + } + + if (quick) nz = 1; /* only load first plane */ +- np = nx * ny * nz; ++ npixels = nx * ny; ++ bufsize = nz * npixels; ++ if (nx <= 0 || ny <= 0 || npixels/nx != ny || bufsize/nz != npixels) { ++ SetISTR(ISTR_WARNING, "FITS image dimensions out of range (%dx%dx%d)", ++ nx, ny, nz); ++ return 0; ++ } + +- image = (byte *) malloc((size_t) np); ++ image = (byte *) malloc((size_t) bufsize); + if (!image) FatalError("Insufficient memory for image"); + + /* +@@ -90,7 +96,7 @@ + * to ensure that we get that same scaling for all planes. + */ + +- nrd = ftgbyte(&fs, image, np); ++ nrd = ftgbyte(&fs, image, bufsize); + ioerror = ferror(fs.fp); + ftclose(&fs); + +@@ -104,33 +110,32 @@ + return 0; + } + +- else if (nrd < np) { /* read partial image */ ++ else if (nrd < bufsize) { /* read partial image */ + if (ioerror) + SetISTR(ISTR_WARNING, "%s", "Truncated FITS file due to I/O error"); + else + SetISTR(ISTR_WARNING, "%s", "Truncated FITS file"); +- ++ + { byte *foo; +- for (foo=image+nrd; foo<image+np; foo++) *foo=0x80; /* pad with grey */ ++ for (foo=image+nrd; foo<image+bufsize; foo++) *foo=0x80; /* pad with grey */ + } + } + + if (nz > 1) { + /* how many planes do we actually have? */ +- nz = (nrd-1)/(nx*ny) + 1; ++ nz = (nrd-1)/(npixels) + 1; + + /* returns how many sub-files created */ + nz = splitfits(image, fs.comment, nx, ny, nz, basename); +- np = nx * ny; +- image = (byte *)realloc(image, (size_t) np); /* toss all but first */ ++ image = (byte *)realloc(image, (size_t) npixels); /* toss all but first */ + } +- ++ + /* There seems to be a convention that fits files be displayed using + * a cartesian coordinate system. Thus the first pixel is in the lower left + * corner. Fix this by reflecting in the line y=ny/2. + */ + flip(image, nx, ny); +- ++ + /* Success! */ + pinfo->pic = image; + pinfo->type = PIC8; +@@ -149,12 +154,12 @@ + pinfo->numpages = nz; + strcpy(pinfo->pagebname, basename); + } +- ++ + return 1; +-} ++} ++ + + +- + /*******************************************/ + int WriteFITS(fp,pic,ptype,w,h,rmap,gmap,bmap,numcols,colorstyle,comment) + FILE *fp; +@@ -164,16 +169,16 @@ + int numcols, colorstyle; + char *comment; + { +- int i, j, np, nend; ++ int i, j, npixels, nend; + byte *ptr; + char *error; + byte rgb[256]; +- ++ + if (!fits_block) { + fits_block = (char *) malloc((size_t) BLOCKSIZE); + if (!fits_block) FatalError("Insufficient memory for FITS block buffer"); + } +- ++ + error = wrheader(fp, w, h, comment); + if (error) { + SetISTR(ISTR_WARNING, "%s", error); +@@ -197,12 +202,12 @@ + } + } + +- np = w*h; ++ npixels = w*h; + + /* nend is the number of padding characters at the end of the last block */ +- nend = ((np+BLOCKSIZE-1)/BLOCKSIZE)*BLOCKSIZE - np; ++ nend = ((npixels+BLOCKSIZE-1)/BLOCKSIZE)*BLOCKSIZE - npixels; + if (nend) for (i=0; i<nend; i++) putc('\0', fp); +- ++ + return 0; + } + +@@ -216,17 +221,16 @@ + char *basename; + { + /* +- * Given a 3 dimensional FITS image, this splits it up into nz 2-d files. ++ * Given a 3-dimensional FITS image, this splits it up into nz 2-d files. + * It returns the number of files actually stored. + * If only one file could be written, then no split files are created. + * It returns the basename of the split files in bname. + * If there was a problem writing files, then a error message will be set. + */ +- +- int i, np=nx * ny, ioerror, nwrt; ++ ++ int i, npixels=nx * ny, nwrt; + FILE *fp; + char *error; +- byte *work; + char filename[70]; + + #ifndef VMS +@@ -234,8 +238,12 @@ + #else + sprintf(basename, "Sys$Disk:[]xvpgXXXXXX"); + #endif +- ++ ++#ifdef USE_MKSTEMP ++ close(mkstemp(basename)); ++#else + mktemp(basename); ++#endif + if (basename[0] == '\0') { + SetISTR(ISTR_WARNING, "%s", "Unable to build temporary filename"); + return 1; +@@ -251,7 +259,7 @@ + error = "Unable to open temporary file"; + break; + } +- ++ + if (wrheader(fp, nx, ny, comment)) { + error = "I/O error writing temporary file"; + fclose(fp); +@@ -259,15 +267,15 @@ + break; + } + +- nwrt = fwrite(image+i*np, sizeof(byte), (size_t) np, fp); ++ nwrt = fwrite(image+i*npixels, sizeof(byte), (size_t) npixels, fp); + fclose(fp); + + if (nwrt == 0) { /* failed to write any data */ + error = "I/O error writing temporary file"; + unlink(filename); + break; +- } +- else if (nwrt < np) ++ } ++ else if (nwrt < npixels) + error = "I/O error writing temporary file"; + } + +@@ -291,13 +299,13 @@ + char *comment; + { + /* Writes a minimalist FITS file header */ +- ++ + char *block = fits_block, *bp; +- int i, j, wrotehist, lenhist; ++ int i, j, lenhist; + char history[80]; + + for (i=0, bp=block; i<BLOCKSIZE; i++, bp++) *bp = ' '; +- ++ + sprintf(history, "Written by XV %s", VERSTR); + lenhist = strlen(history); + +@@ -309,7 +317,7 @@ + wrcard(&block[80*i++], "NAXIS2", T_INT, ny, NULL); /* write NAXIS2 card */ + + /* Write HISTORY keyword */ +- wrcard(&block[80*i++], "HISTORY", T_STR, lenhist, history); ++ wrcard(&block[80*i++], "HISTORY", T_STR, lenhist, history); + + if (comment && *comment != '\0') { + while (*comment == '\n') comment++; /* Skip any blank lines */ +@@ -317,7 +325,7 @@ + for (j=0; j<72; j++) + if (comment[j] == '\0' || comment[j] == '\n') break; + +- /* ++ /* + * Check to see if it is an xv history record; if so, then avoid + * duplicating it. + */ +@@ -330,7 +338,7 @@ + for (i=0, bp=block; i<BLOCKSIZE; i++, bp++) *bp = ' '; + i = 0; + } +- ++ + comment += j; + while (*comment == '\n') comment++; /* Skip any blank lines */ + } +@@ -358,40 +366,40 @@ + * Will return an error message if the primary data unit is not a + * 2 or 3-dimensional array. + */ +- ++ + FILE *fp; + int naxis, i; + char *error; +- ++ + fp = xv_fopen(file, "r"); + if (!fp) return "Unable to open FITS file"; +- ++ + fs->fp = fp; + fs->bitpix = 0; + fs->naxis = 0; + fs->cpos = 0; +- ++ + /* read header */ + error = rdheader(fs); + if (error) { + ftclose(fs); + return error; + } +- ++ + naxis = fs->naxis; +- ++ + /* get number of data */ + fs->ndata = 1; +- for (i=0; i<naxis; i++) ++ for (i=0; i<naxis; i++) + fs->ndata = fs->ndata * fs->axes[i]; +- ++ + *nx = fs->axes[0]; + *ny = fs->axes[1]; + if (naxis == 2) *nz = 1; + else *nz = fs->axes[2]; +- ++ + *bitpix = fs->bitpix; +- ++ + return NULL; + } + +@@ -418,11 +426,11 @@ + char *block=fits_block, *p; + char *error; + long int val; /* the value */ +- ++ + fs->comment = NULL; + commlen = 0; + commsize = 256; +- ++ + res = fread(block, sizeof(char), (size_t) BLOCKSIZE, fs->fp); + if (res != BLOCKSIZE) return "Error reading FITS file"; + i = 0; +@@ -464,13 +472,13 @@ + if (res != BLOCKSIZE) return "Error reading FITS file"; + i = 0; + } +- ++ + sprintf(name, "NAXIS%d", j+1); + error = rdcard(&block[i*80], name, T_INT, &val); + if (error) return error; + if (val < 0) return "Bad NAXISn value in FITS file"; + if (val == 0) return "FITS file does not contain an image"; +- ++ + if (j < 3) fs->axes[j] = val; + else if (val != 1) return "FITS file has more than three dimensions"; + i++; +@@ -488,21 +496,21 @@ + if (res != BLOCKSIZE) return "Unexpected eof in FITS file"; + i = 0; + } +- ++ + p = &block[i*80]; + if (strncmp(p, "END ", (size_t) 8) == 0) break; +- if (strncmp(p, "HISTORY ", (size_t) 8) == 0 || ++ if (strncmp(p, "HISTORY ", (size_t) 8) == 0 || + strncmp(p, "COMMENT ", (size_t) 8) == 0) { + p += 8; /* skip keyword */ + for (j=71; j >= 0; j--) if (p[j] != ' ') break; + j++; /* make j length of comment */ + if (j > 0) { /* skip blank comment cards */ + if (fs->comment == NULL) { +- fs->comment = (char *) malloc((size_t) commsize); ++ fs->comment = (char *) malloc((size_t) commsize); /* initially 256 */ + if (fs->comment == NULL) + FatalError("Insufficient memory for comment buffer"); + } +- ++ + if (commlen + j + 2 > commsize) { /* if too small */ + char *new; + commsize += commsize; /* double size of array */ +@@ -515,7 +523,7 @@ + free(fs->comment); + fs->comment = new; + } +- ++ + xvbcopy(p, &fs->comment[commlen], (size_t) j); /* add string */ + commlen += j; + fs->comment[commlen++] = '\n'; /* with trailing cr */ +@@ -556,9 +564,9 @@ + + l = strlen(name); + if (l) xvbcopy(name, card, (size_t) l); /* copy name */ +- ++ + if (dtype == T_NOVAL) return; +- ++ + if (dtype == T_STR) { + l = kvalue; + if (l <= 0) return; +@@ -566,9 +574,9 @@ + xvbcopy(svalue, &card[8], (size_t) l); + return; + } +- ++ + card[8] = '='; +- ++ + if (dtype == T_LOG) + card[29] = kvalue ? 'T' : 'F'; + else { /* T_INT */ +@@ -599,7 +607,7 @@ + int i, ptr; + char namestr[9]; + static char error[45]; +- ++ + xvbcopy(card, namestr, (size_t) 8); + + for (i=7; i>=0 && namestr[i] == ' '; i--); +@@ -609,24 +617,24 @@ + sprintf(error, "Keyword %s not found in FITS file", name); + return error; + } +- ++ + + /* get start of value */ + ptr = 10; + while (ptr < 80 && card[ptr] == ' ') ptr++; + if (ptr == 80) return "FITS file has missing keyword value"; /* no value */ +- ++ + if (dtype == T_LOG) { + if (ptr != 29 || (card[29] != 'T' && card[29] != 'F')) + return "Keyword has bad logical value in FITS file"; + *kvalue = (card[29] == 'T'); +- } ++ } + + else { /* an integer */ + int j; + long int ival; + char num[21]; +- ++ + if (ptr > 29) return "Keyword has bad integer value in FITS file"; + xvbcopy(&card[ptr], num, (size_t) (30-ptr)); + num[30-ptr] = '\0'; +@@ -634,7 +642,7 @@ + if (j != 1) return "Keyword has bad integer value in FITS file"; + *kvalue = ival; + } +- ++ + return NULL; + } + +@@ -660,13 +668,13 @@ + */ + + int res; +- ++ + if (nelem == 0) return 0; +- ++ + res = fread(buffer, (size_t) fs->size, (size_t) nelem, fs->fp); + /* if failed to read all the data because at end of file */ + if (res != nelem && feof(fs->fp)) { +- /* nblock is the number of elements in a record. ++ /* nblock is the number of elements in a record. + size is always a factor of BLOCKSIZE */ + + int loffs, nblock=BLOCKSIZE/fs->size; +@@ -714,7 +722,7 @@ + byte *ptr=buffer; + + /* +- * conversions. Although the data may be signed, reverse using unsigned ++ * conversions. Although the data may be signed, reverse using unsigned + * variables. + * Because the native int types may be larger than the types in the file, + * we start from the end and work backwards to avoid overwriting data +@@ -741,12 +749,12 @@ + ((unsigned int)ptr[2] << 8) | + ((unsigned int)ptr[3]); + } +- ++ + /* convert from IEE 754 single precision to native form */ + else if (fs->bitpix == -32) { + int j, k, expo; + static float *exps=NULL; +- ++ + if (exps == NULL) { + exps = (float *)malloc(256 * sizeof(float)); + if (exps == NULL) FatalError("Insufficient memory for exps store"); +@@ -754,7 +762,7 @@ + for (i=151; i < 256; i++) exps[i] = 2.*exps[i-1]; + for (i=149; i >= 0; i--) exps[i] = 0.5*exps[i+1]; + } +- ++ + for (i=0; i < n; i++, ptr+=4) { + k = (int)*ptr; + j = ((int)ptr[1] << 16) | ((int)ptr[2] << 8) | (int)ptr[3]; +@@ -765,13 +773,13 @@ + } + + } +- ++ + /* convert from IEE 754 double precision to native form */ + else if (fs->bitpix == -64) { + int expo, k, l; + unsigned int j; + static double *exps=NULL; +- ++ + if (exps == NULL) { + exps = (double *)malloc(2048 * sizeof(double)); + if (exps == NULL) FatalError("Insufficient memory for exps store"); +@@ -779,7 +787,7 @@ + for (i=1076; i < 2048; i++) exps[i] = 2.*exps[i-1]; + for (i=1074; i >= 0; i--) exps[i] = 0.5*exps[i+1]; + } +- ++ + for (i=0; i < n; i++, ptr+=8) { + k = (int)*ptr; + j = ((unsigned int)ptr[1] << 24) | ((unsigned int)ptr[2] << 16) | +@@ -813,23 +821,36 @@ + */ + + void *voidbuff; +- int i, n, nrd; ++ int i, n, nrd, bufsize, overflow=0; + + /* if the data is byte, then read it directly */ + if (fs->bitpix == 8) + return ftgdata(fs, cbuff, nelem); +- ++ + /* allocate a buffer to store the image */ +- if (fs->bitpix == 16) +- voidbuff = (void *)malloc(nelem * sizeof(short int)); +- else if (fs->bitpix == 32) +- voidbuff = (void *)malloc(nelem * sizeof(int)); +- else +- voidbuff = (void *)malloc(nelem * (size_t) fs->size); /* float, double */ ++ if (fs->bitpix == 16) { ++ bufsize = nelem * sizeof(short int); ++ if (bufsize/nelem != (int)sizeof(short int)) ++ overflow = 1; ++ } else if (fs->bitpix == 32) { ++ bufsize = nelem * sizeof(int); ++ if (bufsize/nelem != (int)sizeof(short int)) ++ overflow = 1; ++ } else { ++ bufsize = nelem * fs->size; /* float, double */ ++ if (bufsize/nelem != fs->size) ++ overflow = 1; ++ } + ++ if (overflow) { ++ SetISTR(ISTR_WARNING, "FITS image dimensions out of range"); ++ return 0; ++ } ++ ++ voidbuff = (void *)malloc((size_t) bufsize); + if (voidbuff == NULL) { + char emess[60]; +- sprintf(emess, "Insufficient memory for raw image of %d bytes", ++ sprintf(emess, "Insufficient memory for raw image of %d bytes", + nelem*fs->size); + FatalError(emess); + } +@@ -843,28 +864,28 @@ + short int *buffer=voidbuff; + int max, min, maxmin_t; + float scale; +- ++ + min = max = buffer[0]; + for (i=1; i < n; i++, buffer++) maxmin(*buffer, max, min); + scale = (max == min) ? 0. : 255./(float)(max-min); +- ++ + /* rescale and convert */ + for (i=0, buffer=voidbuff; i < n; i++) + cbuff[i] = (byte)(scale*(float)((int)buffer[i]-min)); +- ++ + /* convert long int to byte */ +- } ++ } + + else if (fs->bitpix == 32) { + int *buffer=voidbuff; + int max, min, maxmin_t; + float scale, fmin; +- ++ + min = max = buffer[0]; + for (i=1; i < n; i++, buffer++) maxmin(*buffer, max, min); + scale = (max == min) ? 1. : 255./((double)max-(double)min); + fmin = (float)min; +- ++ + /* rescale and convert */ + if (scale < 255./2.1e9) /* is max-min too big for an int ? */ + for (i=0, buffer=voidbuff; i < n; i++) +@@ -872,34 +893,34 @@ + else /* use integer subtraction */ + for (i=0, buffer=voidbuff; i < n; i++) + cbuff[i] = (byte)(scale*(float)(buffer[i]-min)); +- +- +- } ++ ++ ++ } + + /* convert float to byte */ + else if (fs->bitpix == -32) { + float *buffer=voidbuff; + float max, min, maxmin_t, scale; +- ++ + min = max = buffer[0]; + for (i=1; i < n; i++, buffer++) maxmin(*buffer, max, min); + scale = (max == min) ? 0. : 255./(max-min); +- ++ + /* rescale and convert */ + for (i=0, buffer=voidbuff; i < n; i++) + cbuff[i] = (byte)(scale*(buffer[i]-min)); +- +- } ++ ++ } + + /* convert double to byte */ + else if (fs->bitpix == -64) { + double *buffer=voidbuff; + double max, min, maxmin_t, scale; +- ++ + min = max = buffer[0]; + for (i=1; i < n; i++, buffer++) maxmin(*buffer, max, min); + scale = (max == min) ? 0. : 255./(max-min); +- ++ + /* rescale and convert */ + for (i=0, buffer=voidbuff; i < n; i++) + cbuff[i] = (byte)(scale*(buffer[i]-min)); +@@ -923,7 +944,7 @@ + int i; + int j, v; + byte *buff1, *buff2; +- ++ + for (i=0; i < ny/2; i++) { + buff1 = &buffer[i*nx]; + buff2 = &buffer[(ny-1-i)*nx]; +diff -ruN xv-3.10a/xvgam.c xv-3.10a-bugfixes/xvgam.c +--- xv-3.10a/xvgam.c 1995-01-13 11:51:14.000000000 -0800 ++++ xv-3.10a-bugfixes/xvgam.c 2004-05-16 18:02:11.000000000 -0700 +@@ -1,4 +1,4 @@ +-/* ++/* + * xvgam.c + * + * callable functions: +@@ -87,7 +87,7 @@ + GRAF_STATE istate, rstate, gstate, bstate; + }; + +-static struct gamstate undo[MAXUNDO], preset[4], defstate; ++static struct gamstate undo[MAXUNDO], preset[4], defstate; + static struct gamstate *defLoadState; + + static int uptr, uhead, utail; +@@ -153,7 +153,7 @@ + static void dragHueDial PARM((void)); + static void dragEditColor PARM((void)); + +-static void HDCreate PARM((HDIAL *, Window, int, int, int, int, ++static void HDCreate PARM((HDIAL *, Window, int, int, int, int, + int, int, char *, u_long, u_long)); + + static void HDRedraw PARM((HDIAL *, int)); +@@ -212,13 +212,13 @@ + { + XSetWindowAttributes xswa; + +- gamW = CreateWindow("xv color editor", "XVcedit", geom, ++ gamW = CreateWindow("xv color editor", "XVcedit", geom, + GAMW, GAMH, infofg,infobg, 0); + if (!gamW) FatalError("can't create cedit window!"); +- ++ + cmapF = XCreateSimpleWindow(theDisp,gamW, 10, 8,CMAPF_WIDE,CMAPF_HIGH, + 1,infofg,infobg); +- butF = XCreateSimpleWindow(theDisp,gamW, 10, 336,BUTF_WIDE,BUTF_HIGH, ++ butF = XCreateSimpleWindow(theDisp,gamW, 10, 336,BUTF_WIDE,BUTF_HIGH, + 1,infofg,infobg); + modF = XCreateSimpleWindow(theDisp,gamW, 10, 438,MODF_WIDE,MODF_HIGH, + 1,infofg,infobg); +@@ -227,7 +227,7 @@ + rgbF = XCreateSimpleWindow(theDisp,gamW, 467, 8,RGBF_WIDE,RGBF_HIGH, + 1,infofg,infobg); + +- if (!cmapF || !butF || !modF || !hsvF || !rgbF) ++ if (!cmapF || !butF || !modF || !hsvF || !rgbF) + FatalError("couldn't create frame windows"); + + #ifdef BACKING_STORE +@@ -251,25 +251,25 @@ + /********** COLORMAP editing doo-wahs ***********/ + + +- BTCreate(&gbut[G_BCOLUNDO], cmapF, 5, 165, 66, BUTTH, ++ BTCreate(&gbut[G_BCOLUNDO], cmapF, 5, 165, 66, BUTTH, + "ColUndo", infofg, infobg, hicol, locol); +- BTCreate(&gbut[G_BCOLREV], cmapF, 5 + 66 + 1, 165, 67, BUTTH, ++ BTCreate(&gbut[G_BCOLREV], cmapF, 5 + 66 + 1, 165, 67, BUTTH, + "Revert", infofg, infobg, hicol, locol); +- BTCreate(&gbut[G_BHSVRGB], cmapF, 5+66+67+2, 165, 66, BUTTH, ++ BTCreate(&gbut[G_BHSVRGB], cmapF, 5+66+67+2, 165, 66, BUTTH, + "RGB/HSV", infofg, infobg, hicol, locol); + +- BTCreate(&gbut[G_BMONO], cmapF, 5, 189, 66, BUTTH, ++ BTCreate(&gbut[G_BMONO], cmapF, 5, 189, 66, BUTTH, + "Grey", infofg, infobg, hicol, locol); +- BTCreate(&gbut[G_BRV], cmapF, 5 + 66 + 1, 189, 67, BUTTH, ++ BTCreate(&gbut[G_BRV], cmapF, 5 + 66 + 1, 189, 67, BUTTH, + "RevVid", infofg, infobg, hicol, locol); +- BTCreate(&gbut[G_BRNDCOL], cmapF, 5 + 66 + 67 + 2, 189, 66, BUTTH, ++ BTCreate(&gbut[G_BRNDCOL], cmapF, 5 + 66 + 67 + 2, 189, 66, BUTTH, + "Random", infofg, infobg, hicol, locol); + +- DCreate(&rhDial, cmapF, 5, 215, 66, 100, 0,360,180, 5, ++ DCreate(&rhDial, cmapF, 5, 215, 66, 100, 0,360,180, 5, + infofg, infobg, hicol, locol, "Hue", NULL); +- DCreate(&gsDial, cmapF, 72, 215, 66, 100, 0,360,180, 5, ++ DCreate(&gsDial, cmapF, 72, 215, 66, 100, 0,360,180, 5, + infofg, infobg, hicol, locol, "Sat.", NULL); +- DCreate(&bvDial, cmapF, 139, 215, 66, 100, 0,360,180, 5, ++ DCreate(&bvDial, cmapF, 139, 215, 66, 100, 0,360,180, 5, + infofg, infobg, hicol, locol, "Value", NULL); + + rhDial.drawobj = gsDial.drawobj = bvDial.drawobj = dragEditColor; +@@ -291,44 +291,44 @@ + #define BY2 (BY0 + BYSPACE*2) + #define BY3 (BY0 + BYSPACE*3) + +- BTCreate(&gbut[G_BAPPLY], butF, BX0,BY0, 52,BUTTH,"Apply", ++ BTCreate(&gbut[G_BAPPLY], butF, BX0,BY0, 52,BUTTH,"Apply", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_BNOGAM], butF, BX0,BY1, 52,BUTTH,"NoMod", ++ BTCreate(&gbut[G_BNOGAM], butF, BX0,BY1, 52,BUTTH,"NoMod", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_BMAXCONT],butF, BX0,BY2, 52,BUTTH,"Norm", ++ BTCreate(&gbut[G_BMAXCONT],butF, BX0,BY2, 52,BUTTH,"Norm", + infofg,infobg,hicol,locol); + BTCreate(&gbut[G_BHISTEQ], butF, BX0,BY3, 52,BUTTH,"HistEq", + infofg,infobg,hicol,locol); + + BTCreate(&gbut[G_BUP_BR],butF, BX1,BY0, 52,BUTTH,"Brite", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_BDN_BR],butF, BX1,BY1, 52,BUTTH,"Dim", ++ BTCreate(&gbut[G_BDN_BR],butF, BX1,BY1, 52,BUTTH,"Dim", + infofg,infobg,hicol,locol); + BTCreate(&gbut[G_BUP_CN],butF, BX1,BY2, 52,BUTTH,"Sharp", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_BDN_CN],butF, BX1,BY3, 52,BUTTH,"Dull", ++ BTCreate(&gbut[G_BDN_CN],butF, BX1,BY3, 52,BUTTH,"Dull", + infofg,infobg,hicol,locol); + +- BTCreate(&gbut[G_BRESET],butF, BX2, BY0, 52,BUTTH,"Reset", ++ BTCreate(&gbut[G_BRESET],butF, BX2, BY0, 52,BUTTH,"Reset", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_B1], butF, BX2, BY1, 25,BUTTH,"1", ++ BTCreate(&gbut[G_B1], butF, BX2, BY1, 25,BUTTH,"1", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_B2], butF, BX2+26,BY1, 26,BUTTH,"2", ++ BTCreate(&gbut[G_B2], butF, BX2+26,BY1, 26,BUTTH,"2", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_B3], butF, BX2, BY2, 25,BUTTH,"3", ++ BTCreate(&gbut[G_B3], butF, BX2, BY2, 25,BUTTH,"3", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_B4], butF, BX2+26,BY2, 26,BUTTH,"4", ++ BTCreate(&gbut[G_B4], butF, BX2+26,BY2, 26,BUTTH,"4", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_BSET], butF, BX2, BY3, 52,BUTTH,"Set", ++ BTCreate(&gbut[G_BSET], butF, BX2, BY3, 52,BUTTH,"Set", + infofg,infobg,hicol,locol); + +- BTCreate(&gbut[G_BUNDO], butF, BX3, BY0, 52,BUTTH,"Undo", ++ BTCreate(&gbut[G_BUNDO], butF, BX3, BY0, 52,BUTTH,"Undo", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_BREDO], butF, BX3, BY1, 52,BUTTH,"Redo", ++ BTCreate(&gbut[G_BREDO], butF, BX3, BY1, 52,BUTTH,"Redo", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_BGETRES],butF,BX3, BY2, 52,BUTTH,"CutRes", ++ BTCreate(&gbut[G_BGETRES],butF,BX3, BY2, 52,BUTTH,"CutRes", + infofg,infobg,hicol,locol); +- BTCreate(&gbut[G_BCLOSE],butF, BX3, BY3, 52,BUTTH,"Close", ++ BTCreate(&gbut[G_BCLOSE],butF, BX3, BY3, 52,BUTTH,"Close", + infofg,infobg,hicol,locol); + + +@@ -338,11 +338,11 @@ + + CBCreate(&enabCB, modF,2,2, "Display with HSV/RGB mods.", + infofg,infobg,hicol,locol); +- CBCreate(&autoCB, modF,2,2+17, "Auto-apply HSV/RGB mods.", ++ CBCreate(&autoCB, modF,2,2+17, "Auto-apply HSV/RGB mods.", + infofg,infobg,hicol,locol); + CBCreate(&dragCB, modF,2,2+17*2,"Auto-apply while dragging.", + infofg,infobg,hicol,locol); +- CBCreate(&resetCB,modF,2,2+17*3,"Auto-reset on new image.", ++ CBCreate(&resetCB,modF,2,2+17*3,"Auto-reset on new image.", + infofg,infobg,hicol,locol); + + enabCB.val = autoCB.val = resetCB.val = dragCB.val = 1; +@@ -359,23 +359,23 @@ + + srcHD.drawobj = dstHD.drawobj = whtHD.drawobj = dragHueDial; + +- DCreate(&satDial, hsvF, 100, 199, 100, 121, -100, 100, 0, 5, ++ DCreate(&satDial, hsvF, 100, 199, 100, 121, -100, 100, 0, 5, + infofg, infobg,hicol,locol, "Saturation", "%"); + +- hueRB = RBCreate(NULL, hsvF, 7, 153, "1", ++ hueRB = RBCreate(NULL, hsvF, 7, 153, "1", + infofg, infobg,hicol,locol); +- RBCreate (hueRB,hsvF, 47, 153, "2", ++ RBCreate (hueRB,hsvF, 47, 153, "2", + infofg, infobg,hicol,locol); +- RBCreate (hueRB,hsvF, 87, 153, "3", ++ RBCreate (hueRB,hsvF, 87, 153, "3", + infofg, infobg,hicol,locol); +- RBCreate (hueRB,hsvF, 7, 170, "4", ++ RBCreate (hueRB,hsvF, 7, 170, "4", + infofg, infobg,hicol,locol); +- RBCreate (hueRB,hsvF, 47, 170, "5", ++ RBCreate (hueRB,hsvF, 47, 170, "5", + infofg, infobg,hicol,locol); +- RBCreate (hueRB,hsvF, 87, 170, "6", ++ RBCreate (hueRB,hsvF, 87, 170, "6", + infofg, infobg,hicol,locol); + +- BTCreate(&hueclrB, hsvF, 127, 158, 70, BUTTH, "Reset", ++ BTCreate(&hueclrB, hsvF, 127, 158, 70, BUTTH, "Reset", + infofg, infobg,hicol,locol); + + initHmap(); +@@ -394,13 +394,13 @@ + + InitGraf(&gGraf); + CreateGraf(&gGraf, rgbF, 10, 179, infofg, infobg, "Green"); +- ++ + InitGraf(&bGraf); + CreateGraf(&bGraf, rgbF, 10, 338, infofg, infobg, "Blue"); + + satDial.drawobj = dragGamma; + intGraf.drawobj = rGraf.drawobj = gGraf.drawobj = bGraf.drawobj = dragGamma; +- ++ + SetHSVmode(); + + ctrls2gamstate(&defstate); +@@ -415,14 +415,14 @@ + Str2Graf(&preset[1].rstate,"L 4 : 0,0 : 127,0 : 128,255 : 255,255"); + Str2Graf(&preset[1].gstate,"L 4 : 0,0 : 127,0 : 128,255 : 255,255"); + Str2Graf(&preset[1].bstate,"L 4 : 0,0 : 127,0 : 128,255 : 255,255"); +- ++ + + /* set up preset2 as a 'temperature' pseudo-color preset */ + ctrls2gamstate(&preset[2]); + Str2Graf(&preset[2].rstate,"S 4 : 0,0 : 105,0 : 155,140 : 255,255"); + Str2Graf(&preset[2].gstate,"S 5 : 0,0 : 57,135 : 127,255 : 198,135 : 255,0"); + Str2Graf(&preset[2].bstate,"S 4 : 0,255 : 100,140 : 150,0 : 255,0"); +- ++ + + /* set up preset3 as a 'map' pseudo-color preset */ + ctrls2gamstate(&preset[3]); +@@ -480,7 +480,7 @@ + + computeHSVlinear(); + } +- ++ + + /***************************************************/ + int GamCheckEvent(xev) +@@ -492,14 +492,14 @@ + int rv; + + rv = 1; +- ++ + if (xev->type == Expose) { + int x,y,w,h; + XExposeEvent *e = (XExposeEvent *) xev; + x = e->x; y = e->y; w = e->width; h = e->height; + + /* throw away excess redraws for 'dumb' windows */ +- if (e->count > 0 && ++ if (e->count > 0 && + (e->window == satDial.win || e->window == rhDial.win || + e->window == gsDial.win || e->window == bvDial.win || + e->window == cmapF || e->window == modF || +@@ -600,7 +600,7 @@ + + + else if (e->window == hsvF) { +- if (HDClick(&srcHD, x,y) || HDClick(&dstHD, x,y)) { ++ if (HDClick(&srcHD, x,y) || HDClick(&dstHD, x,y)) { + dials2hmap(); + build_hremap(); + changedGam(); +@@ -654,7 +654,7 @@ + e->window == gsDial.win || + e->window == bvDial.win) { + +- if ((e->window == rhDial.win && DTrack(&rhDial, x,y)) || ++ if ((e->window == rhDial.win && DTrack(&rhDial, x,y)) || + (e->window == gsDial.win && DTrack(&gsDial, x,y)) || + (e->window == bvDial.win && DTrack(&bvDial, x,y))) { + saveCMap(&prevcmap); +@@ -683,7 +683,7 @@ + XKeyEvent *e = (XKeyEvent *) xev; + char buf[128]; KeySym ks; + int stlen; +- ++ + stlen = XLookupString(e,buf,128,&ks,(XComposeStatus *) NULL); + buf[stlen] = '\0'; + +@@ -792,7 +792,7 @@ + int x,y; + { + XPoint pts[8]; +- ++ + pts[0].x = x+10; pts[0].y = y; + pts[1].x = x-4; pts[1].y = y-100; + pts[2].x = x-4; pts[2].y = y-40; +@@ -873,11 +873,11 @@ + XSetForeground(theDisp, theGC, infofg); + + if (picType != PIC8) { +- CenterString(cmapF, CMAPX + CMAPW/2, CMAPY + CMAPH/2, ++ CenterString(cmapF, CMAPX + CMAPW/2, CMAPY + CMAPH/2, + "No colormap in 24-bit mode."); + return; + } +- ++ + + + for (i=0; i<numcols; i++) { +@@ -941,14 +941,14 @@ + if (bp->win == butF && PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break; + } + +- /* if 'Set' is lit, and we didn't click 'set' or 'Reset' or '1'..'4', ++ /* if 'Set' is lit, and we didn't click 'set' or 'Reset' or '1'..'4', + turn it off */ + if (i!=G_BSET && i!=G_B1 && i!=G_B2 && i!=G_B3 && i!=G_B4 && i!=G_BRESET + && gbut[G_BSET].lit) { +- gbut[G_BSET].lit = 0; ++ gbut[G_BSET].lit = 0; + BTRedraw(&gbut[G_BSET]); + } +- ++ + + if (i<G_NBUTTS) { /* found one */ + if (BTTrack(bp)) doCmd(i); +@@ -1003,7 +1003,7 @@ + } /* if i<numcols */ + } /* if but==1 */ + +- ++ + else if (but==2) { /* color smooth */ + int cellnum, delc, col1, j, delr, delg, delb; + +@@ -1025,9 +1025,9 @@ + gcmap[col1 + i] = gcmap[col1] + (delg * i) / delc; + bcmap[col1 + i] = bcmap[col1] + (delb * i) / delc; + +- if (cellgroup[col1 + i]) { ++ if (cellgroup[col1 + i]) { + /* propogate new color to all members of this group */ +- for (j=0; j<numcols; j++) ++ for (j=0; j<numcols; j++) + if (cellgroup[j] == cellgroup[col1 + i]) { + rcmap[j] = rcmap[col1 + i]; + gcmap[j] = gcmap[col1 + i]; +@@ -1043,7 +1043,7 @@ + } + + if (i<numcols) { /* something changed */ +- xvbcopy((char *) &tmpcmap, (char *) &prevcmap, ++ xvbcopy((char *) &tmpcmap, (char *) &prevcmap, + sizeof(struct cmapstate)); + BTSetActive(&gbut[G_BCOLUNDO],1); + applyGamma(1); +@@ -1067,7 +1067,7 @@ + + lastcell = curcell; + +- j = XGrabPointer(theDisp, cmapF, False, 0, GrabModeAsync, ++ j = XGrabPointer(theDisp, cmapF, False, 0, GrabModeAsync, + GrabModeAsync, None, None, (Time) CurrentTime); + while (1) { + Window rW,cW; +@@ -1076,7 +1076,7 @@ + + if (XQueryPointer(theDisp,cmapF,&rW,&cW,&rx,&ry,&x,&y,&mask)) { + /* if button3 and shift released */ +- if (!(mask & (Button3Mask | ShiftMask))) break; ++ if (!(mask & (Button3Mask | ShiftMask))) break; + + /* if user lets go of B3, reset addonly/delonly flag & lastcell */ + if (!(mask & Button3Mask) && (mask & ShiftMask)) { +@@ -1112,7 +1112,7 @@ + + if (recolor) { + /* colors changed. save to color undo area */ +- xvbcopy((char *) &tmpcmap, (char *) &prevcmap, ++ xvbcopy((char *) &tmpcmap, (char *) &prevcmap, + sizeof(struct cmapstate)); + BTSetActive(&gbut[G_BCOLUNDO],1); + applyGamma(1); /* have to regen entire image when groupings chg */ +@@ -1146,12 +1146,12 @@ + /* cases: curgroup>0, clicked on something in same group + remove target from group + curgroup>0, clicked on something in different group +- merge groups. (target group gets ++ merge groups. (target group gets + set equal to current values) + curgroup>0, clicked on something in no group + add target to curgroup + curgroup=0, clicked on something in a group +- add editColor to target group, ++ add editColor to target group, + set curgroup = target group + target group gets current values + curgroup=0, clicked on something in no group +@@ -1185,7 +1185,7 @@ + } + } + +- else if ((mode!=DELONLY) && cellgroup[cnum] != curgroup && ++ else if ((mode!=DELONLY) && cellgroup[cnum] != curgroup && + cellgroup[cnum]>0) { + /* merge clicked-on group into curgroup */ + mode = ADDONLY; +@@ -1196,11 +1196,11 @@ + selectCell(i,1); + rcmap[i] = rcmap[editColor]; + gcmap[i] = gcmap[editColor]; +- bcmap[i] = bcmap[editColor]; ++ bcmap[i] = bcmap[editColor]; + } + } + } +- ++ + else if ((mode!=DELONLY) && cellgroup[cnum] == 0) { + /* merge clicked-on cell into curgroup */ + mode = ADDONLY; +@@ -1209,7 +1209,7 @@ + selectCell(cnum,1); + rcmap[cnum] = rcmap[editColor]; + gcmap[cnum] = gcmap[editColor]; +- bcmap[cnum] = bcmap[editColor]; ++ bcmap[cnum] = bcmap[editColor]; + } + } + +@@ -1224,14 +1224,14 @@ + selectCell(i,1); + rcmap[i] = rcmap[editColor]; + gcmap[i] = gcmap[editColor]; +- bcmap[i] = bcmap[editColor]; ++ bcmap[i] = bcmap[editColor]; + } + } + curgroup = cellgroup[cnum]; + cellgroup[editColor] = curgroup; + } +- +- else if ((mode!=DELONLY) && (cellgroup[cnum] == 0) ++ ++ else if ((mode!=DELONLY) && (cellgroup[cnum] == 0) + && (cnum != editColor)) { + /* create new group for these two cells (cnum and editColor) */ + mode = ADDONLY; +@@ -1247,14 +1247,14 @@ + } + + return rv; +-} +- ++} ++ + + /*********************/ + void ChangeEC(num) + int num; + { +- /* given a color # that is to become the new editColor, do all ++ /* given a color # that is to become the new editColor, do all + highlighting/unhighlighting, copy editColor's rgb values to + the rgb/hsv dials */ + +@@ -1301,8 +1301,8 @@ + DSetVal(&bvDial, bcmap[editColor]); + } + } +- +- ++ ++ + /*********************/ + void ApplyECctrls() + { +@@ -1310,7 +1310,7 @@ + + if (hsvmode) { + int rv, gv, bv; +- hsv2rgb((double) rhDial.val, ((double) gsDial.val) / 100.0, ++ hsv2rgb((double) rhDial.val, ((double) gsDial.val) / 100.0, + ((double) bvDial.val) / 100.0, &rv, &gv, &bv); + rcmap[editColor] = rv; + gcmap[editColor] = gv; +@@ -1330,7 +1330,7 @@ + { + /* this function generates the Floyd-Steinberg gamma curve (fsgamcr) + +- This function generates a 4 point spline curve to be used as a ++ This function generates a 4 point spline curve to be used as a + non-linear grey 'colormap'. Two of the points are nailed down at 0,0 + and 255,255, and can't be changed. You specify the other two. If + you specify points on the line (0,0 - 255,255), you'll get the normal +@@ -1345,7 +1345,7 @@ + double yf[4]; + + InitSpline(x, y, 4, yf); +- ++ + for (i=0; i<256; i++) { + j = (int) EvalSpline(x, y, yf, 4, (double) i); + if (j<0) j=0; +@@ -1364,14 +1364,14 @@ + + switch (cmd) { + +- case G_BAPPLY: ++ case G_BAPPLY: + if (enabCB.val != 1) { enabCB.val = 1; CBRedraw(&enabCB); } +- applyGamma(0); ++ applyGamma(0); + break; + + case G_BNOGAM: + if (enabCB.val != 0) { enabCB.val = 0; CBRedraw(&enabCB); } +- applyGamma(0); ++ applyGamma(0); + break; + + case G_BUNDO: gamUndo(); break; +@@ -1383,7 +1383,7 @@ + + + +- case G_BDN_BR: ++ case G_BDN_BR: + case G_BUP_BR: GetGrafState(&intGraf, &gs); + for (i=0; i < gs.nhands; i++) { + if (cmd==G_BUP_BR) gs.hands[i].y += 10; +@@ -1434,7 +1434,7 @@ + else if (cmd==G_B3) ptr = &preset[2]; + else if (cmd==G_B4) ptr = &preset[3]; + else if (cmd==G_BRESET) ptr = &defstate; +- ++ + if (gbut[G_BSET].lit) { + ctrls2gamstate(ptr); + gbut[G_BSET].lit = 0; +@@ -1454,7 +1454,7 @@ + break; + + +- case G_BCOLREV: ++ case G_BCOLREV: + { + struct cmapstate tmp1cmap; + int gchg; +@@ -1463,9 +1463,9 @@ + gchg = (i!=numcols); + + saveCMap(&tmpcmap); /* buffer current cmapstate */ +- ++ + for (i=0; i<numcols; i++) { /* do reversion */ +- rcmap[i] = rorg[i]; ++ rcmap[i] = rorg[i]; + gcmap[i] = gorg[i]; + bcmap[i] = borg[i]; + cellgroup[i] = 0; +@@ -1473,12 +1473,12 @@ + curgroup = maxgroup = 0; + + saveCMap(&tmp1cmap); /* buffer current cmapstate */ +- ++ + /* prevent multiple 'Undo All's from filling Undo buffer */ +- if (xvbcmp((char *) &tmpcmap, (char *) &tmp1cmap, ++ if (xvbcmp((char *) &tmpcmap, (char *) &tmp1cmap, + sizeof(struct cmapstate))) { + /* the reversion changed the cmapstate */ +- xvbcopy((char *) &tmpcmap, (char *) &prevcmap, ++ xvbcopy((char *) &tmpcmap, (char *) &prevcmap, + sizeof(struct cmapstate)); + BTSetActive(&gbut[G_BCOLUNDO],1); + +@@ -1496,7 +1496,7 @@ + BTSetActive(&gbut[G_BCOLUNDO],1); + rndCols(); + break; +- ++ + case G_BRV: + saveCMap(&prevcmap); + BTSetActive(&gbut[G_BCOLUNDO],1); +@@ -1523,7 +1523,7 @@ + ChangeEC(editColor); + applyGamma(1); + break; +- ++ + + case G_BMONO: + saveCMap(&prevcmap); +@@ -1534,7 +1534,7 @@ + ChangeEC(editColor); + applyGamma(1); + break; +- ++ + + case G_BCOLUNDO: + for (i=0; i<numcols && cellgroup[i]==prevcmap.cellgroup[i]; i++); +@@ -1560,7 +1560,7 @@ + rhDial.title = "Red"; + gsDial.title = "Green"; + bvDial.title = "Blue"; +- ++ + DSetRange(&rhDial, 0, 255, rcmap[editColor], 16); + DSetRange(&gsDial, 0, 255, gcmap[editColor], 16); + DSetRange(&bvDial, 0, 255, bcmap[editColor], 16); +@@ -1615,12 +1615,12 @@ + GammifyColors(); + + /* if current 'desired' colormap hasn't changed, don't DO anything */ +- if (!xvbcmp((char *) rMap, (char *) oldr, (size_t) numcols) && +- !xvbcmp((char *) gMap, (char *) oldg, (size_t) numcols) && ++ if (!xvbcmp((char *) rMap, (char *) oldr, (size_t) numcols) && ++ !xvbcmp((char *) gMap, (char *) oldg, (size_t) numcols) && + !xvbcmp((char *) bMap, (char *) oldb, (size_t) numcols)) return; + + /* special case: if using R/W color, just modify the colors and leave */ +- if (allocMode==AM_READWRITE && rwthistime && ++ if (allocMode==AM_READWRITE && rwthistime && + (!cmapchange || nfcols==numcols)) { + XColor ctab[256]; + +@@ -1647,10 +1647,10 @@ + gdisp[i] = gMap[rwpc2pc[i]]; + bdisp[i] = bMap[rwpc2pc[i]]; + } +- ++ + return; + } +- ++ + FreeColors(); + + { +@@ -1663,10 +1663,10 @@ + AllocColors(); + + +- if (epicMode != EM_RAW) { ++ if (epicMode != EM_RAW) { + /* regen image, as we'll probably want to dither differently, given + new colors and such */ +- ++ + GenerateEpic(eWIDE, eHIGH); + } + } +@@ -1701,7 +1701,7 @@ + for (i=255; i>0 && !hist[i]; i--); + *rmaxv = i; + } +- ++ + else { /* PIC24 */ + int v,minv,maxv; + +@@ -1724,7 +1724,7 @@ + hist[v]++; + } + } +- ++ + *rminv = minv; *rmaxv = maxv; + } + +@@ -1764,13 +1764,13 @@ + int i, histeq[256], minv, maxv; + + calcHistEQ(histeq, &minv, &maxv); /* ignore minv,maxv */ +- +- for (i=0; i<256; i++) ++ ++ for (i=0; i<256; i++) + intGraf.func[i] = histeq[i]; +- ++ + for (i=0; i< intGraf.nhands; i++) + intGraf.hands[i].y = intGraf.func[intGraf.hands[i].x]; +- ++ + intGraf.entergamma = 0; + + if (gamUp) { +@@ -1797,7 +1797,7 @@ + if (v>maxv) maxv = v; + } + } +- else { ++ else { + int histeq[256]; + calcHistEQ(histeq, &minv, &maxv); /* ignore histeq */ + } +@@ -1833,11 +1833,11 @@ + for (i=0; i<numcols; i++) Gammify1(i); + } + else { +- for (i=0; i<numcols; i++) { ++ for (i=0; i<numcols; i++) { + rMap[i] = rcmap[i]; + gMap[i] = gcmap[i]; + bMap[i] = bcmap[i]; +- if (!ncols) ++ if (!ncols) + cols[i] = (((int)rMap[i]) + ((int)gMap[i]) + ((int)bMap[i]) >= 128*3) + ? white : black; + } +@@ -1875,7 +1875,7 @@ + if (DEBUG>1) fprintf(stderr," (v=%f)",v); + + if (h>=0) { +- hi = (int) h; ++ hi = (int) h; + if (hi<0) hi += 360; + if (hi>=360) hi -= 360; + h = (double) hremap[hi]; +@@ -1884,7 +1884,7 @@ + if (whtHD.enabCB.val) { + h = (double) whtHD.stval; + s = (double) whtHD.satval / 100.0; +- ++ + /* special case: if stval = satval = 0, set hue = -1 */ + if (whtHD.stval == 0 && whtHD.satval == 0) h = -1.0; + } +@@ -1899,13 +1899,13 @@ + if (DEBUG>1) fprintf(stderr," -> %d,%d,%d",rv,gv,bv); + } + +- rMap[col] = rGraf.func[rv]; ++ rMap[col] = rGraf.func[rv]; + gMap[col] = gGraf.func[gv]; + bMap[col] = bGraf.func[bv]; + +- if (!ncols) +- cols[col] = +- (((int)rMap[col]) + ((int)gMap[col]) + ((int)bMap[col]) >= 128*3) ++ if (!ncols) ++ cols[col] = ++ (((int)rMap[col]) + ((int)gMap[col]) + ((int)bMap[col]) >= 128*3) + ? white : black; + + if (DEBUG>1) fprintf(stderr," -> %d,%d,%d\n",rMap[col],gMap[col],bMap[col]); +@@ -2001,8 +2001,8 @@ + { + xvbcopy((char *) hmap, (char *) gs->hmap, sizeof(hmap)); + +- gs->wht_stval = whtHD.stval; +- gs->wht_satval = whtHD.satval; ++ gs->wht_stval = whtHD.stval; ++ gs->wht_satval = whtHD.satval; + gs->wht_enab = whtHD.enabCB.val; + + gs->hueRBnum = RBWhich(hueRB); +@@ -2042,7 +2042,7 @@ + srcHD.ccwise = hm->src_ccw; + HDRedraw(&srcHD, HD_ALL | HD_CLEAR); + } +- ++ + if (dstHD.stval != hm->dst_st || + dstHD.enval != hm->dst_en || + dstHD.ccwise != hm->dst_ccw) { +@@ -2051,7 +2051,7 @@ + dstHD.ccwise = hm->dst_ccw; + HDRedraw(&dstHD, HD_ALL | HD_CLEAR); + } +- } ++ } + + + if (whtHD.stval != gs->wht_stval || whtHD.satval != gs->wht_satval || +@@ -2063,7 +2063,7 @@ + HDRedraw(&whtHD, HD_ALL | HD_CLEAR); + changed++; + } +- ++ + if (gs->satval != satDial.val) { + DSetVal(&satDial,gs->satval); + changed++; +@@ -2203,7 +2203,7 @@ + } + + +- ++ + + /*********************/ + static void parseResources() +@@ -2226,7 +2226,7 @@ + if (i) { sprintf(gname,"preset%d",i); gsp = &preset[i-1]; } + else { sprintf(gname,"default"); gsp = &defstate; } + +- xvbcopy((char *) gsp, (char *) &gs, ++ xvbcopy((char *) gsp, (char *) &gs, + sizeof(struct gamstate)); /* load 'gs' with defaults */ + + for (j=0; j<6; j++) { /* xv.*.huemap resources */ +@@ -2239,7 +2239,7 @@ + lower_str(def_str); + if (sscanf(def_str,"%d %d %s %d %d %s", + &fst, &fen, fcw, &tst, &ten, tcw) != 6) { +- fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n", ++ fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n", + cmd, tmp, def_str); + } + else { +@@ -2260,7 +2260,7 @@ + int wst, wsat, enab; + if (DEBUG) fprintf(stderr,"parseResource 'xv.%s: %s'\n",tmp, def_str); + if (sscanf(def_str,"%d %d %d", &wst, &wsat, &enab) != 3) { +- fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n", ++ fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n", + cmd, tmp, def_str); + } + else { /* successful parse */ +@@ -2276,7 +2276,7 @@ + int sat; + if (DEBUG) fprintf(stderr,"parseResource 'xv.%s: %s'\n",tmp, def_str); + if (sscanf(def_str,"%d", &sat) != 1) { +- fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n", ++ fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n", + cmd, tmp, def_str); + } + else { /* successful parse */ +@@ -2304,7 +2304,7 @@ + } + } + } +- ++ + /* copy (potentially) modified gs back to default/preset */ + xvbcopy((char *) &gs, (char *) gsp, sizeof(struct gamstate)); + } +@@ -2324,16 +2324,16 @@ + /* write out current state */ + ctrls2gamstate(&gstate); + strcpy(gname, "xv.default"); +- ++ + /* write out huemap resources */ + for (i=0; i<6; i++) { + if (1 || gstate.hmap[i].src_st != gstate.hmap[i].dst_st || + gstate.hmap[i].src_en != gstate.hmap[i].dst_en || + gstate.hmap[i].src_ccw != gstate.hmap[i].dst_ccw) { +- sprintf(tmp, "%s.huemap%d: %3d %3d %3s %3d %3d %3s\n", gname, i+1, +- gstate.hmap[i].src_st, gstate.hmap[i].src_en, ++ sprintf(tmp, "%s.huemap%d: %3d %3d %3s %3d %3d %3s\n", gname, i+1, ++ gstate.hmap[i].src_st, gstate.hmap[i].src_en, + gstate.hmap[i].src_ccw ? "CCW" : "CW", +- gstate.hmap[i].dst_st, gstate.hmap[i].dst_en, ++ gstate.hmap[i].dst_st, gstate.hmap[i].dst_en, + gstate.hmap[i].dst_ccw ? "CCW" : "CW"); + strcat(rsrc, tmp); + } +@@ -2341,7 +2341,7 @@ + + /* write out whtmap resource */ + if (1 || gstate.wht_stval || gstate.wht_satval || gstate.wht_enab != 1) { +- sprintf(tmp, "%s.whtmap: %d %d %d\n", gname, gstate.wht_stval, ++ sprintf(tmp, "%s.whtmap: %d %d %d\n", gname, gstate.wht_stval, + gstate.wht_satval, gstate.wht_enab); + strcat(rsrc, tmp); + } +@@ -2372,7 +2372,7 @@ + + NewCutBuffer(rsrc); + } +- ++ + + /*****************************/ + static void dragGamma () +@@ -2381,14 +2381,14 @@ + while gamma ctrls are being dragged + applies change to image if dragCB.val is set + does NOT call saveGamState() (as changedGam does) */ +- ++ + if (dragCB.val && dragCB.active) { + hsvnonlinear = 1; /* force HSV calculations during drag */ + applyGamma(0); + } + } + +- ++ + /*****************************/ + static void dragHueDial() + { +@@ -2396,7 +2396,7 @@ + while hue gamma ctrls are being dragged + applies change to image if dragCB.val is set + does NOT call saveGamState() (as changedGam does) */ +- ++ + if (dragCB.val && dragCB.active) { + dials2hmap(); + build_hremap(); +@@ -2413,14 +2413,14 @@ + while color editor ctrls are being dragged + applies change to image if dragCB.val is set + does NOT call saveCMap(&prevcmap); BTSetActive(&gbut[G_BCOLUNDO],1); */ +- ++ + if (dragCB.val && dragCB.active) ApplyEditColor(0); + } + + +- +- +- ++ ++ ++ + + /**********************************************/ + /************* HUE wheel functions ***********/ +@@ -2470,7 +2470,7 @@ + hdbpix2[HDB_ROTR] = hdbpix1[HDB_ROTR]; + } + +- ++ + #define BCOLS fg,bg,hicol,locol + + if (hd->range) { +@@ -2526,7 +2526,7 @@ + XSetForeground(theDisp, theGC, hd->fg); + XDrawArc(theDisp, hd->win, theGC, hd->x - HD_RADIUS, hd->y - HD_RADIUS, + HD_RADIUS*2, HD_RADIUS*2, 0, 360*64); +- ++ + for (i=0; i<6; i++) { + int kldg; + +@@ -2553,8 +2553,8 @@ + a = hdg2xdg(hd->stval) * DEG2RAD; + pol2xy(hd->x, hd->y, a, HD_RADIUS - 4, &x, &y); + XDrawLine(theDisp, hd->win, theGC, hd->x, hd->y, x,y); +- +- if (flags & HD_CLHNDS) ++ ++ if (flags & HD_CLHNDS) + XFillRectangle(theDisp, hd->win, theGC, x-2,y-2, 5,5); + else { + XSetForeground(theDisp, theGC, hd->bg); +@@ -2567,8 +2567,8 @@ + a = hdg2xdg(hd->enval) * DEG2RAD; + pol2xy(hd->x, hd->y, a, HD_RADIUS - 4, &x, &y); + XDrawLine(theDisp, hd->win, theGC, hd->x, hd->y, x,y); +- +- if (flags & HD_CLHNDS) ++ ++ if (flags & HD_CLHNDS) + XFillRectangle(theDisp, hd->win, theGC, x-2,y-2, 5,5); + else { + XSetForeground(theDisp, theGC, hd->bg); +@@ -2587,7 +2587,7 @@ + r = ((HD_RADIUS - 4) * hd->satval) / 100; + pol2xy(hd->x, hd->y, a, r, &x, &y); + +- if (flags & HD_CLHNDS) ++ if (flags & HD_CLHNDS) + XFillRectangle(theDisp, hd->win, theGC, x-2,y-2, 5,5); + else { + XFillRectangle(theDisp, hd->win, theGC, hd->x-1, hd->y-1, 3,3); +@@ -2600,7 +2600,7 @@ + } + } + } +- ++ + + + +@@ -2653,13 +2653,13 @@ + XSetBackground(theDisp, theGC, hd->bg); + + if (hd->range) { +- sprintf(vstr,"%3d\007,%3d\007 %s", hd->stval, hd->enval, ++ sprintf(vstr,"%3d\007,%3d\007 %s", hd->stval, hd->enval, + hd->ccwise ? "CCW" : " CW"); + } + else { + sprintf(vstr,"%3d\007 %3d%%", hd->stval, hd->satval); + } +- ++ + XDrawImageString(theDisp, hd->win, theGC, + hd->x - XTextWidth(monofinfo, vstr, (int) strlen(vstr))/2, + hd->y + HD_RADIUS + 24, vstr, (int) strlen(vstr)); +@@ -2669,7 +2669,7 @@ + + if (flags & HD_TITLE) { + XSetForeground(theDisp, theGC, hd->fg); +- ULineString(hd->win, hd->x - HD_RADIUS - 15, hd->y - HD_RADIUS - 4, ++ ULineString(hd->win, hd->x - HD_RADIUS - 15, hd->y - HD_RADIUS - 4, + hd->str); + } + +@@ -2694,7 +2694,7 @@ + } + + +- ++ + /**************************************************/ + static int HDClick(hd,mx,my) + HDIAL *hd; +@@ -2716,7 +2716,7 @@ + if (!hd->range && !hd->enabCB.val) return 0; /* disabled */ + + +- if ( ((mx - hd->x) * (mx - hd->x) + (my - hd->y) * (my - hd->y)) ++ if ( ((mx - hd->x) * (mx - hd->x) + (my - hd->y) * (my - hd->y)) + < (HD_RADIUS * HD_RADIUS)) { + return HDTrack(hd,mx,my); + } +@@ -2816,14 +2816,14 @@ + hd->satval--; if (hd->satval<0) hd->satval = 0; + HDRedraw(hd, HD_HANDS | HD_VALS); + } +- ++ + else if (bnum == HDB_SAT && hd->satval<100) { + HDRedraw(hd, HD_CLHNDS); + hd->satval++; if (hd->satval>100) hd->satval = 100; + HDRedraw(hd, HD_HANDS | HD_VALS); + } + } +- ++ + break; + } + +@@ -2836,7 +2836,7 @@ + } + + if (bp->lit) { bp->lit = 0; BTRedraw(bp); } +- ++ + return 1; + } + +@@ -2872,7 +2872,7 @@ + + dx = x - hd->x; dy = y - hd->y; + dist = sqrt(dx*dx + dy*dy); +- ++ + newsat = (int) (dist / ((double) (HD_RADIUS - 4)) * 100); + RANGE(newsat,0,100); + +@@ -2899,7 +2899,7 @@ + a = hdg2xdg(hd->enval) * DEG2RAD; + pol2xy(hd->x, hd->y, a, HD_RADIUS-4, &x,&y); + if (PTINRECT(mx,my,x-3,y-3,7,7)) handle = 2; +- ++ + + + if (!handle) { /* not in either, rotate both */ +@@ -2939,7 +2939,7 @@ + } + rv = (origj != j); + } +- ++ + + else { /* in one of the handles */ + if (handle==1) valp = &(hd->stval); else valp = &(hd->enval); +@@ -2958,22 +2958,22 @@ + + if (!hd->ccwise) { + ddist = (hd->enval - hd->stval + 360) % 360; +- if (handle==1) ++ if (handle==1) + ndist = (hd->enval - j + 360) % 360; + else + ndist = (j - hd->stval + 360) % 360; + } + else { + ddist = (hd->stval - hd->enval + 360) % 360; +- if (handle==1) ++ if (handle==1) + ndist = (j - hd->enval + 360) % 360; + else + ndist = (hd->stval - j + 360) % 360; + } + +- if (abs(ddist - ndist) >= 180 && ddist<180) ++ if (abs(ddist - ndist) >= 180 && ddist<180) + hd->ccwise = !hd->ccwise; +- ++ + *valp = j; + HDRedraw(hd, HD_HANDS | HD_DIR | HD_VALS); + +@@ -2986,8 +2986,8 @@ + + return rv; + } +- +- ++ ++ + + /**************************************************/ + static int hdg2xdg(hdg) +@@ -3012,7 +3012,7 @@ + *yp = cy - (int) (sin(ang) * (double) rad); + } + +- ++ + /***************************************************/ + static int computeHDval(hd, x, y) + HDIAL *hd; +@@ -3044,7 +3044,7 @@ + + + +- ++ + /****************************************************/ + static void initHmap() + { +@@ -3117,10 +3117,10 @@ + (hmap[i].src_en != hmap[i].dst_en) || + (hmap[i].src_ccw != hmap[i].dst_ccw)) { /* not a 1:1 mapping */ + +- st1 = hmap[i].src_st; ++ st1 = hmap[i].src_st; + en1 = hmap[i].src_en; + if (hmap[i].src_ccw) { +- inc1 = -1; ++ inc1 = -1; + len1 = (st1 - en1 + 360) % 360; + } + else { +@@ -3131,7 +3131,7 @@ + st2 = hmap[i].dst_st; + en2 = hmap[i].dst_en; + if (hmap[i].dst_ccw) { +- inc2 = -1; ++ inc2 = -1; + len2 = (st2 - en2 + 360) % 360; + } + else { +@@ -3179,7 +3179,7 @@ + + byte *pp, *op; + int i,j; +- int rv, gv, bv, vi, hi; ++ int rv, gv, bv; + byte *outpic; + int min, max, del, h, s, v; + int f, p, q, t, vs100, vsf10000; +@@ -3270,7 +3270,7 @@ + + /* map near-black to black to avoid weird effects */ + if (v <= 16) s = 0; +- ++ + /* apply intGraf.func[] function to 'v' (the intensity) */ + v = intGraf.func[v]; + +@@ -3295,7 +3295,7 @@ + if (h==NOHUE || !s) { rv = gv = bv = v; } + else { + if (h==360) h = 0; +- ++ + h = (h*100) / 60; /* h is in range 000..599 (0.0 - 5.99) */ + j = h - (h%100); /* j = 000, 100, 200, 300, 400, 500 */ + f = h - j; /* 'fractional' part of h (00..99) */ +@@ -3305,7 +3305,7 @@ + p = v - vs100; + q = v - vsf10000; + t = v - vs100 + vsf10000; +- ++ + switch (j) { + case 000: rv = v; gv = t; bv = p; break; + case 100: rv = q; gv = v; bv = p; break; +@@ -3319,7 +3319,7 @@ + } /* if hsvmod */ + + +- *op++ = rGraf.func[rv]; ++ *op++ = rGraf.func[rv]; + *op++ = gGraf.func[gv]; + *op++ = bGraf.func[bv]; + } +diff -ruN xv-3.10a/xvgif.c xv-3.10a-bugfixes/xvgif.c +--- xv-3.10a/xvgif.c 1995-01-10 11:54:41.000000000 -0800 ++++ xv-3.10a-bugfixes/xvgif.c 2005-04-03 11:53:13.000000000 -0700 +@@ -28,13 +28,14 @@ + typedef int boolean; + + #define NEXTBYTE (*dataptr++) ++#define SKIPBYTE (dataptr++) /* quiet some compiler warnings */ + #define EXTENSION 0x21 + #define IMAGESEP 0x2c + #define TRAILER 0x3b + #define INTERLACEMASK 0x40 + #define COLORMAPMASK 0x80 + +- ++ + + FILE *fp; + +@@ -82,11 +83,11 @@ + char *id89 = "GIF89a"; + + static int EGApalette[16][3] = { +- {0,0,0}, {0,0,128}, {0,128,0}, {0,128,128}, ++ {0,0,0}, {0,0,128}, {0,128,0}, {0,128,128}, + {128,0,0}, {128,0,128}, {128,128,0}, {200,200,200}, + {100,100,100}, {100,100,255}, {100,255,100}, {100,255,255}, + {255,100,100}, {255,100,255}, {255,255,100}, {255,255,255} }; +- ++ + + static int readImage PARM((PICINFO *)); + static int readCode PARM((void)); +@@ -108,12 +109,13 @@ + { + /* returns '1' if successful */ + +- register byte ch, ch1, *origptr; ++ register byte ch, *origptr; + register int i, block; + int aspect, gotimage; + + /* initialize variables */ +- BitOffset = XC = YC = Pass = OutCount = gotimage = 0; ++ BitOffset = XC = YC = OutCount = gotimage = 0; ++ Pass = -1; + RawGIF = Raster = pic8 = NULL; + gif89 = 0; + +@@ -129,16 +131,19 @@ + fseek(fp, 0L, 2); + filesize = ftell(fp); + fseek(fp, 0L, 0); +- +- /* the +256's are so we can read truncated GIF files without fear of ++ ++ if (filesize + 256 < filesize) ++ return( gifError(pinfo, "GIF file size is too large") ); ++ ++ /* the +256's are so we can read truncated GIF files without fear of + segmentation violation */ + if (!(dataptr = RawGIF = (byte *) calloc((size_t) filesize+256, (size_t) 1))) +- return( gifError(pinfo, "not enough memory to read gif file") ); +- +- if (!(Raster = (byte *) calloc((size_t) filesize+256,(size_t) 1))) +- return( gifError(pinfo, "not enough memory to read gif file") ); +- +- if (fread(dataptr, (size_t) filesize, (size_t) 1, fp) != 1) ++ FatalError("LoadGIF: not enough memory to read GIF file"); ++ ++ if (!(Raster = (byte *) calloc((size_t) filesize+256,(size_t) 1))) ++ FatalError("LoadGIF: not enough memory to read GIF file"); ++ ++ if (fread(dataptr, (size_t) filesize, (size_t) 1, fp) != 1) + return( gifError(pinfo, "GIF data read failed") ); + + +@@ -147,35 +152,35 @@ + if (strncmp((char *) dataptr, id87, (size_t) 6)==0) gif89 = 0; + else if (strncmp((char *) dataptr, id89, (size_t) 6)==0) gif89 = 1; + else return( gifError(pinfo, "not a GIF file")); +- ++ + dataptr += 6; +- ++ + /* Get variables from the GIF screen descriptor */ +- ++ + ch = NEXTBYTE; + RWidth = ch + 0x100 * NEXTBYTE; /* screen dimensions... not used. */ + ch = NEXTBYTE; + RHeight = ch + 0x100 * NEXTBYTE; +- ++ + ch = NEXTBYTE; + HasColormap = ((ch & COLORMAPMASK) ? True : False); +- ++ + BitsPerPixel = (ch & 7) + 1; + numcols = ColorMapSize = 1 << BitsPerPixel; + BitMask = ColorMapSize - 1; +- ++ + Background = NEXTBYTE; /* background color... not used. */ +- ++ + aspect = NEXTBYTE; + if (aspect) { + if (!gif89) return(gifError(pinfo,"corrupt GIF file (screen descriptor)")); + else normaspect = (float) (aspect + 15) / 64.0; /* gif89 aspect ratio */ + if (DEBUG) fprintf(stderr,"GIF89 aspect = %f\n", normaspect); + } +- +- ++ ++ + /* Read in global colormap. */ +- ++ + if (HasColormap) + for (i=0; i<ColorMapSize; i++) { + pinfo->r[i] = NEXTBYTE; +@@ -221,19 +226,19 @@ + if (blocksize == 2) { + aspnum = NEXTBYTE; + aspden = NEXTBYTE; +- if (aspden>0 && aspnum>0) ++ if (aspden>0 && aspnum>0) + normaspect = (float) aspnum / (float) aspden; + else { normaspect = 1.0; aspnum = aspden = 1; } + +- if (DEBUG) fprintf(stderr,"GIF87 aspect extension: %d:%d = %f\n\n", ++ if (DEBUG) fprintf(stderr,"GIF87 aspect extension: %d:%d = %f\n\n", + aspnum, aspden,normaspect); + } + else { +- for (i=0; i<blocksize; i++) NEXTBYTE; ++ for (i=0; i<blocksize; i++) SKIPBYTE; + } + + while ((sbsize=NEXTBYTE)>0) { /* eat any following data subblocks */ +- for (i=0; i<sbsize; i++) NEXTBYTE; ++ for (i=0; i<sbsize; i++) SKIPBYTE; + } + } + +@@ -254,9 +259,11 @@ + + + if (cmtlen>0) { /* build into one un-blocked comment */ ++ /* this can overflow iff cmtlen == 2G - 1, but then filesize ++ * would have to be > 2GB, which was disallowed above */ + cmt = (byte *) malloc((size_t) (cmtlen + 1)); +- if (!cmt) gifWarning("couldn't malloc space for comments\n"); +- else { ++ if (!cmt) FatalError("LoadGIF: couldn't malloc space for comments"); ++ /* else */ { + sp = cmt; + do { + sbsize = (*ptr1++); +@@ -267,10 +274,10 @@ + if (pinfo->comment) { /* have to strcat onto old comments */ + cmt1 = (byte *) malloc(strlen(pinfo->comment) + cmtlen + 2); + if (!cmt1) { +- gifWarning("couldn't malloc space for comments\n"); + free(cmt); ++ FatalError("LoadGIF: couldn't malloc space for comments"); + } +- else { ++ /* else */ { + strcpy((char *) cmt1, (char *) pinfo->comment); + strcat((char *) cmt1, (char *) "\n"); + strcat((char *) cmt1, (char *) cmt); +@@ -288,8 +295,8 @@ + else if (fn == 0x01) { /* PlainText Extension */ + int j,sbsize,ch; + int tgLeft, tgTop, tgWidth, tgHeight, cWidth, cHeight, fg, bg; +- +- SetISTR(ISTR_INFO, "%s: %s", bname, ++ ++ SetISTR(ISTR_INFO, "%s: %s", bname, + "PlainText extension found in GIF file. Ignored."); + + sbsize = NEXTBYTE; +@@ -302,12 +309,12 @@ + fg = NEXTBYTE; + bg = NEXTBYTE; + i=12; +- for ( ; i<sbsize; i++) NEXTBYTE; /* read rest of first subblock */ +- ++ for ( ; i<sbsize; i++) SKIPBYTE; /* read rest of first subblock */ ++ + if (DEBUG) fprintf(stderr, + "PlainText: tgrid=%d,%d %dx%d cell=%dx%d col=%d,%d\n", + tgLeft, tgTop, tgWidth, tgHeight, cWidth, cHeight, fg, bg); +- ++ + /* read (and ignore) data sub-blocks */ + do { + j = 0; +@@ -326,16 +333,16 @@ + + if (DEBUG) fprintf(stderr,"Graphic Control extension\n\n"); + +- SetISTR(ISTR_INFO, "%s: %s", bname, ++ SetISTR(ISTR_INFO, "%s: %s", bname, + "Graphic Control Extension in GIF file. Ignored."); +- ++ + /* read (and ignore) data sub-blocks */ + do { + j = 0; sbsize = NEXTBYTE; +- while (j<sbsize) { NEXTBYTE; j++; } ++ while (j<sbsize) { SKIPBYTE; j++; } + } while (sbsize); + } +- ++ + + else if (fn == 0xFF) { /* Application Extension */ + int j, sbsize; +@@ -345,10 +352,10 @@ + /* read (and ignore) data sub-blocks */ + do { + j = 0; sbsize = NEXTBYTE; +- while (j<sbsize) { NEXTBYTE; j++; } ++ while (j<sbsize) { SKIPBYTE; j++; } + } while (sbsize); + } +- ++ + + else { /* unknown extension */ + int j, sbsize; +@@ -358,11 +365,11 @@ + SetISTR(ISTR_INFO, + "%s: Unknown extension 0x%02x in GIF file. Ignored.", + bname, fn); +- ++ + /* read (and ignore) data sub-blocks */ + do { + j = 0; sbsize = NEXTBYTE; +- while (j<sbsize) { NEXTBYTE; j++; } ++ while (j<sbsize) { SKIPBYTE; j++; } + } while (sbsize); + } + } +@@ -370,36 +377,36 @@ + + else if (block == IMAGESEP) { + if (DEBUG) fprintf(stderr,"imagesep (got=%d) ",gotimage); +- if (DEBUG) fprintf(stderr," at start: offset=0x%lx\n",dataptr-RawGIF); ++ if (DEBUG) fprintf(stderr," at start: offset=0x%x\n",dataptr-RawGIF); + + if (gotimage) { /* just skip over remaining images */ + int i,misc,ch,ch1; + + /* skip image header */ +- NEXTBYTE; NEXTBYTE; /* left position */ +- NEXTBYTE; NEXTBYTE; /* top position */ +- NEXTBYTE; NEXTBYTE; /* width */ +- NEXTBYTE; NEXTBYTE; /* height */ ++ SKIPBYTE; SKIPBYTE; /* left position */ ++ SKIPBYTE; SKIPBYTE; /* top position */ ++ SKIPBYTE; SKIPBYTE; /* width */ ++ SKIPBYTE; SKIPBYTE; /* height */ + misc = NEXTBYTE; /* misc. bits */ + + if (misc & 0x80) { /* image has local colormap. skip it */ + for (i=0; i< 1 << ((misc&7)+1); i++) { +- NEXTBYTE; NEXTBYTE; NEXTBYTE; ++ SKIPBYTE; SKIPBYTE; SKIPBYTE; + } + } + +- NEXTBYTE; /* minimum code size */ ++ SKIPBYTE; /* minimum code size */ + + /* skip image data sub-blocks */ + do { + ch = ch1 = NEXTBYTE; +- while (ch--) NEXTBYTE; ++ while (ch--) SKIPBYTE; + if ((dataptr - RawGIF) > filesize) break; /* EOF */ + } while(ch1); + } + + else if (readImage(pinfo)) gotimage = 1; +- if (DEBUG) fprintf(stderr," at end: dataptr=0x%lx\n",dataptr-RawGIF); ++ if (DEBUG) fprintf(stderr," at end: dataptr=0x%x\n",dataptr-RawGIF); + } + + +@@ -415,7 +422,7 @@ + + /* don't mention bad block if file was trunc'd, as it's all bogus */ + if ((dataptr - origptr) < filesize) { +- sprintf(str, "Unknown block type (0x%02x) at offset 0x%lx", ++ sprintf(str, "Unknown block type (0x%02x) at offset 0x%x", + block, (dataptr - origptr) - 1); + + if (!gotimage) return gifError(pinfo, str); +@@ -431,7 +438,7 @@ + free(RawGIF); RawGIF = NULL; + free(Raster); Raster = NULL; + +- if (!gotimage) ++ if (!gotimage) + return( gifError(pinfo, "no image data found in GIF file") ); + + return 1; +@@ -448,7 +455,7 @@ + npixels = maxpixels = 0; + + /* read in values from the image descriptor */ +- ++ + ch = NEXTBYTE; + LeftOfs = ch + 0x100 * NEXTBYTE; + ch = NEXTBYTE; +@@ -472,33 +479,33 @@ + + if (!HasColormap && !(Misc&0x80)) { + /* no global or local colormap */ +- SetISTR(ISTR_WARNING, "%s: %s", bname, ++ SetISTR(ISTR_WARNING, "%s: %s", bname, + "No colormap in this GIF file. Assuming EGA colors."); + } +- + +- ++ ++ + /* Start reading the raster data. First we get the intial code size + * and compute decompressor constant values, based on this code size. + */ +- ++ + CodeSize = NEXTBYTE; + + ClearCode = (1 << CodeSize); + EOFCode = ClearCode + 1; + FreeCode = FirstFree = ClearCode + 2; +- ++ + /* The GIF spec has it that the code size is the code size used to + * compute the above values is the code size given in the file, but the + * code size used in compression/decompression is the code size given in + * the file plus one. (thus the ++). + */ +- ++ + CodeSize++; + InitCodeSize = CodeSize; + MaxCode = (1 << CodeSize); + ReadMask = MaxCode - 1; +- ++ + + + /* UNBLOCK: +@@ -506,7 +513,7 @@ + * to the Raster array, turning it from a series of blocks into one long + * data stream, which makes life much easier for readCode(). + */ +- ++ + ptr1 = Raster; + do { + ch = ch1 = NEXTBYTE; +@@ -525,18 +532,21 @@ + fprintf(stderr,"xv: LoadGIF() - picture is %dx%d, %d bits, %sinterlaced\n", + Width, Height, BitsPerPixel, Interlace ? "" : "non-"); + } +- ++ + + /* Allocate the 'pic' */ +- maxpixels = Width*Height; ++ maxpixels = Width*Height; /* 65535*65535 max (but everything is int) */ ++ if (Width <= 0 || Height <= 0 || maxpixels/Width != Height) ++ return( gifError(pinfo, "image dimensions out of range") ); + picptr = pic8 = (byte *) malloc((size_t) maxpixels); +- if (!pic8) return( gifError(pinfo, "couldn't malloc 'pic8'") ); ++ if (!pic8) FatalError("LoadGIF: couldn't malloc 'pic8'"); ++ ++ + +- + /* Decompress the file, continuing until you see the GIF EOF code. + * One obvious enhancement is to add checking for corrupt files here. + */ +- ++ + Code = readCode(); + while (Code != EOFCode) { + /* Clear code sets everything back to its initial value, then reads the +@@ -563,58 +573,58 @@ + break; } + + CurCode = InCode = Code; +- ++ + /* If greater or equal to FreeCode, not in the hash table yet; + * repeat the last character decoded + */ +- ++ + if (CurCode >= FreeCode) { + CurCode = OldCode; + if (OutCount > 4096) { /* printf("outcount1 blew up\n"); */ break; } + OutCode[OutCount++] = FinChar; + } +- ++ + /* Unless this code is raw data, pursue the chain pointed to by CurCode + * through the hash table to its end; each code in the chain puts its + * associated output code on the output queue. + */ +- ++ + while (CurCode > BitMask) { + if (OutCount > 4096) break; /* corrupt file */ + OutCode[OutCount++] = Suffix[CurCode]; + CurCode = Prefix[CurCode]; + } +- ++ + if (OutCount > 4096) { /* printf("outcount blew up\n"); */ break; } +- ++ + /* The last code in the chain is treated as raw data. */ +- ++ + FinChar = CurCode & BitMask; + OutCode[OutCount++] = FinChar; +- ++ + /* Now we put the data out to the Output routine. + * It's been stacked LIFO, so deal with it that way... + */ + + /* safety thing: prevent exceeding range of 'pic8' */ + if (npixels + OutCount > maxpixels) OutCount = maxpixels-npixels; +- ++ + npixels += OutCount; + if (!Interlace) for (i=OutCount-1; i>=0; i--) *picptr++ = OutCode[i]; + else for (i=OutCount-1; i>=0; i--) doInterlace(OutCode[i]); + OutCount = 0; + + /* Build the hash table on-the-fly. No table is stored in the file. */ +- ++ + Prefix[FreeCode] = OldCode; + Suffix[FreeCode] = FinChar; + OldCode = InCode; +- ++ + /* Point to the next slot in the table. If we exceed the current + * MaxCode value, increment the code size unless it's already 12. If it + * is, do nothing: the next code decompressed better be CLEAR + */ +- ++ + FreeCode++; + if (FreeCode >= MaxCode) { + if (CodeSize < 12) { +@@ -627,7 +637,7 @@ + Code = readCode(); + if (npixels >= maxpixels) break; + } +- ++ + if (npixels != maxpixels) { + SetISTR(ISTR_WARNING,"%s: %s", bname, + "This GIF file seems to be truncated. Winging it."); +@@ -640,7 +650,7 @@ + /* fill in the PICINFO structure */ + + pinfo->pic = pic8; +- pinfo->w = Width; ++ pinfo->w = Width; + pinfo->h = Height; + pinfo->type = PIC8; + pinfo->frmType = F_GIF; +@@ -650,8 +660,8 @@ + + sprintf(pinfo->fullInfo, + "GIF%s, %d bit%s per pixel, %sinterlaced. (%d bytes)", +- (gif89) ? "89" : "87", BitsPerPixel, +- (BitsPerPixel==1) ? "" : "s", ++ (gif89) ? "89" : "87", BitsPerPixel, ++ (BitsPerPixel==1) ? "" : "s", + Interlace ? "" : "non-", filesize); + + sprintf(pinfo->shrtInfo, "%dx%d GIF%s.",Width,Height,(gif89) ? "89" : "87"); +@@ -668,13 +678,13 @@ + * maintain our location in the Raster array as a BIT Offset. We compute + * the byte Offset into the raster array by dividing this by 8, pick up + * three bytes, compute the bit Offset into our 24-bit chunk, shift to +- * bring the desired code to the bottom, then mask it off and return it. ++ * bring the desired code to the bottom, then mask it off and return it. + */ + + static int readCode() + { + int RawCode, ByteOffset; +- ++ + ByteOffset = BitOffset / 8; + RawCode = Raster[ByteOffset] + (Raster[ByteOffset + 1] << 8); + if (CodeSize >= 8) +@@ -692,42 +702,47 @@ + { + static byte *ptr = NULL; + static int oldYC = -1; +- ++ ++ if (Pass == -1) { /* first time through - init stuff */ ++ oldYC = -1; ++ Pass = 0; ++ } ++ + if (oldYC != YC) { ptr = pic8 + YC * Width; oldYC = YC; } +- ++ + if (YC<Height) + *ptr++ = Index; +- ++ + /* Update the X-coordinate, and if it overflows, update the Y-coordinate */ +- ++ + if (++XC == Width) { +- ++ + /* deal with the interlace as described in the GIF + * spec. Put the decoded scan line out to the screen if we haven't gone + * past the bottom of it + */ +- ++ + XC = 0; +- ++ + switch (Pass) { + case 0: + YC += 8; + if (YC >= Height) { Pass++; YC = 4; } + break; +- ++ + case 1: + YC += 8; + if (YC >= Height) { Pass++; YC = 2; } + break; +- ++ + case 2: + YC += 4; + if (YC >= Height) { Pass++; YC = 1; } + break; +- ++ + case 3: + YC += 2; break; +- ++ + default: + break; + } +@@ -735,7 +750,7 @@ + } + + +- ++ + /*****************************/ + static int gifError(pinfo, st) + PICINFO *pinfo; +diff -ruN xv-3.10a/xvgifwr.c xv-3.10a-bugfixes/xvgifwr.c +--- xv-3.10a/xvgifwr.c 1995-01-03 13:22:21.000000000 -0800 ++++ xv-3.10a-bugfixes/xvgifwr.c 2004-05-16 18:03:27.000000000 -0700 +@@ -2,11 +2,11 @@ + * xvgifwr.c - handles writing of GIF files. based on flgife.c and + * flgifc.c from the FBM Library, by Michael Maudlin + * +- * Contains: ++ * Contains: + * WriteGIF(fp, pic, ptype, w, h, rmap, gmap, bmap, numcols, colorstyle, + * comment) + * +- * Note: slightly brain-damaged, in that it'll only write non-interlaced ++ * Note: slightly brain-damaged, in that it'll only write non-interlaced + * GIF files (in the interests of speed, or something) + * + */ +@@ -34,7 +34,7 @@ + * James A. Woods (decvax!ihnp4!ames!jaw) + * Joe Orost (decvax!vax135!petsd!joe) + *****************************************************************/ +- ++ + + #include "xv.h" + +@@ -44,7 +44,6 @@ + static int curx, cury; + static long CountDown; + static int Interlace; +-static byte bw[2] = {0, 0xff}; + + static void putword PARM((int, FILE *)); + static void compress PARM((int, FILE *, byte *, int)); +@@ -97,7 +96,7 @@ + for (i=0; i<numcols; i++) { + /* see if color #i is already used */ + for (j=0; j<i; j++) { +- if (rmap[i] == rmap[j] && gmap[i] == gmap[j] && ++ if (rmap[i] == rmap[j] && gmap[i] == gmap[j] && + bmap[i] == bmap[j]) break; + } + +@@ -115,15 +114,15 @@ + /* figure out 'BitsPerPixel' */ + for (i=1; i<8; i++) + if ( (1<<i) >= nc) break; +- ++ + BitsPerPixel = i; + + ColorMapSize = 1 << BitsPerPixel; +- ++ + RWidth = Width = w; + RHeight = Height = h; + LeftOfs = TopOfs = 0; +- ++ + CountDown = w * h; /* # of pixels we'll be doing */ + + if (BitsPerPixel <= 1) InitCodeSize = 2; +@@ -137,7 +136,7 @@ + return (1); + } + +- if (DEBUG) ++ if (DEBUG) + fprintf(stderr,"WrGIF: pic=%lx, w,h=%dx%d, numcols=%d, Bits%d,Cmap=%d\n", + (u_long) pic8, w,h,numcols,BitsPerPixel,ColorMapSize); + +@@ -152,7 +151,7 @@ + i = 0x80; /* Yes, there is a color map */ + i |= (8-1)<<4; /* OR in the color resolution (hardwired 8) */ + i |= (BitsPerPixel - 1); /* OR in the # of bits per pixel */ +- fputc(i,fp); ++ fputc(i,fp); + + fputc(Background, fp); /* background color */ + +@@ -290,7 +289,7 @@ + /* + * compress stdin to stdout + * +- * Algorithm: use open addressing double hashing (no chaining) on the ++ * Algorithm: use open addressing double hashing (no chaining) on the + * prefix code / next character combination. We do a variant of Knuth's + * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime + * secondary probe. Here, the modular division first probe is gives way +@@ -370,7 +369,7 @@ + cl_hash( (count_int) hsize_reg); /* clear hash table */ + + output(ClearCode); +- ++ + while (len) { + c = pc2nc[*data++]; len--; + in_count++; +@@ -399,7 +398,7 @@ + continue; + } + +- if ( (long)HashTabOf (i) >= 0 ) ++ if ( (long)HashTabOf (i) >= 0 ) + goto probe; + + nomatch: +@@ -454,7 +453,7 @@ + cur_accum |= ((long)code << cur_bits); + else + cur_accum = code; +- ++ + cur_bits += n_bits; + + while( cur_bits >= 8 ) { +@@ -482,7 +481,7 @@ + maxcode = MAXCODE(n_bits); + } + } +- ++ + if( code == EOFCode ) { + /* At EOF, write the rest of the buffer */ + while( cur_bits > 0 ) { +@@ -492,11 +491,11 @@ + } + + flush_char(); +- ++ + fflush( g_outfile ); + + #ifdef FOO +- if( ferror( g_outfile ) ) ++ if( ferror( g_outfile ) ) + FatalError("unable to write GIF file"); + #endif + } +@@ -582,7 +581,7 @@ + int c; + { + accum[ a_count++ ] = c; +- if( a_count >= 254 ) ++ if( a_count >= 254 ) + flush_char(); + } + +@@ -596,4 +595,4 @@ + fwrite(accum, (size_t) 1, (size_t) a_count, g_outfile ); + a_count = 0; + } +-} ++} +diff -ruN xv-3.10a/xvgrab.c xv-3.10a-bugfixes/xvgrab.c +--- xv-3.10a/xvgrab.c 1994-12-22 14:34:47.000000000 -0800 ++++ xv-3.10a-bugfixes/xvgrab.c 2004-05-16 18:03:30.000000000 -0700 +@@ -6,7 +6,7 @@ + * Contains: + * int Grab() - handles the GRAB command + * int LoadGrab(); - 'loads' the pic from the last succesful Grab +- * ++ * + */ + + #include "copyright.h" +@@ -14,29 +14,54 @@ + #define NEEDSTIME + #include "xv.h" + +-static byte *grabPic = (byte *) NULL; +-static int gbits; /* either '8' or '24' */ +-static byte grabmapR[256], grabmapG[256], grabmapB[256]; /* colormap */ +-static int gWIDE,gHIGH; +-static int grabInProgress=0; +-static int hidewins = 0; +-static GC rootGC; +- +-static void flashrect PARM((int, int, int, int, int)); +-static void startflash PARM((void)); +-static void endflash PARM((void)); +-static int grabImage PARM((Window, int, int, int, int)); +-static void ungrabX PARM((void)); +-static int convertImage PARM((XImage *, XColor *, int, +- XWindowAttributes *)); +- +-static int lowbitnum PARM((unsigned long)); +-static int getxcolors PARM((XWindowAttributes *, XColor **)); +-static Window xvClientWindow PARM((Display *, Window)); ++ ++union swapun { ++ CARD32 l; ++ CARD16 s; ++ CARD8 b[sizeof(CARD32)]; ++}; + + ++struct rectlist { ++ int x,y,w,h; ++ struct rectlist *next; ++}; + + ++static byte *grabPic = (byte *) NULL; ++static int gptype; ++static byte grabmapR[256], grabmapG[256], grabmapB[256]; ++static int gXOFF, gYOFF, gWIDE,gHIGH; ++static int grabInProgress=0; ++static int hidewins = 0; ++static GC rootGC; ++static struct rectlist *regrabList; ++ ++ ++static void flashrect PARM((int, int, int, int, int)); ++static void startflash PARM((void)); ++static void endflash PARM((void)); ++static void ungrabX PARM((void)); ++static int lowbitnum PARM((unsigned long)); ++static int getxcolors PARM((XWindowAttributes *, XColor **)); ++ ++static void printWinTree PARM((Window, int)); ++static void errSpace PARM((int)); ++ ++static int grabRootRegion PARM((int, int, int, int)); ++static int grabWinImage PARM((Window, VisualID, Colormap, int)); ++static int convertImageAndStuff PARM((XImage *, XColor *, int, ++ XWindowAttributes *, ++ int,int,int,int)); ++ ++static int RectIntersect PARM((int,int,int,int, int,int,int,int)); ++ ++static int CountColors24 PARM((byte *, int, int, ++ int, int, int, int)); ++ ++static int Trivial24to8 PARM((byte *, int, int, byte *, ++ byte *, byte *, byte *, int)); ++ + /***********************************/ + int Grab() + { +@@ -45,8 +70,7 @@ + + int i, x, y, x1, y1, x2, y2, ix, iy, iw, ih, rv; + int rx, ry, pretendGotB1, autograb; +- int oldaclose; +- Window rW, cW, clickWin, tmpwin; ++ Window rW, cW, clickWin; + unsigned int mask; + XColor fc, bc; + +@@ -75,7 +99,7 @@ + grabInProgress = 1; /* guard against recursive grabs during delay */ + time(&startT); + while (1) { +- time(&t); ++ time(&t); + if (t >= startT + grabDelay) break; + if (XPending(theDisp)>0) { + XEvent evt; +@@ -91,25 +115,25 @@ + grabInProgress = 0; + } + +- ++ + rootGC = DefaultGC(theDisp, theScreen); +- ++ + if (grabPic) { /* throw away previous 'grabbed' pic, if there is one */ + free(grabPic); grabPic = (byte *) NULL; + } + + + fc.flags = bc.flags = DoRed | DoGreen | DoBlue; +- fc.red = fc.green = fc.blue = 0xffff; ++ fc.red = fc.green = fc.blue = 0xffff; + bc.red = bc.green = bc.blue = 0x0000; + XRecolorCursor(theDisp, tcross, &fc, &bc); + + + XBell(theDisp, 0); /* beep once at start of grab */ + +- if (!autograb) XGrabButton(theDisp, (u_int) AnyButton, 0, rootW, False, 0, ++ if (!autograb) XGrabButton(theDisp, (u_int) AnyButton, 0, rootW, False, 0, + GrabModeAsync, GrabModeSync, None, tcross); +- ++ + if (autograb) { + XGrabServer(theDisp); /* until we've done the grabImage */ + if (!XQueryPointer(theDisp,rootW,&rW,&cW,&rx,&ry,&x1,&y1,&mask)) { +@@ -136,7 +160,7 @@ + XNextEvent(theDisp, &evt); + i = HandleEvent(&evt, &done); + if (done) { /* only 'new image' cmd accepted=quit */ +- if (i==QUIT) { ++ if (i==QUIT) { + XUngrabButton(theDisp, (u_int) AnyButton, 0, rootW); + Quit(0); + } +@@ -145,12 +169,12 @@ + + } + } +- +- ++ ++ + /*** + *** got button click (or pretending we did, if autograb) + ***/ +- ++ + + if (mask & Button3Mask || rW!=rootW) { /* Button3: CANCEL GRAB */ + while (1) { /* wait for button to be released */ +@@ -158,7 +182,7 @@ + if (!(mask & Button3Mask)) break; + } + } +- ++ + XUngrabButton(theDisp, (u_int) AnyButton, 0, rootW); + XBell(theDisp, 0); + XBell(theDisp, 0); +@@ -175,69 +199,40 @@ + if (!(mask & Button1Mask)) break; + } + } +- +- if (!cW || cW == rootW) clickWin = rootW; +- else { +- int xr, yr; Window chwin; +- XTranslateCoordinates(theDisp, rW, cW, rx, ry, &xr, &yr, &chwin); +- if (chwin != None) { +- XWindowAttributes clickxwa, parentxwa; +- +- clickWin = xvClientWindow(theDisp, chwin); +- +- /* decide if we want to just grab clickWin, or cW. +- basically, if they're different in any important way +- (depth, visual, colormap), grab 'clickWin' only, +- as it's the important part */ +- +- if (!clickWin || +- (XGetWindowAttributes(theDisp, clickWin, &clickxwa) && +- XGetWindowAttributes(theDisp, cW, &parentxwa) && +- clickxwa.visual->class == parentxwa.visual->class && +- clickxwa.colormap == parentxwa.colormap && +- clickxwa.depth == parentxwa.depth) +- ) +- clickWin = cW; /* close enough! */ +- } +- else clickWin = cW; +- +- if (DEBUG) +- fprintf(stderr, "rW = %x, cW = %x, chwin = %x, clickWin = %x\n", +- (u_int) rW, (u_int) cW, (u_int) chwin, (u_int) clickWin); +- } +- +- ++ ++ clickWin = (cW) ? cW : rootW; ++ + if (clickWin == rootW) { /* grab entire screen */ + if (DEBUG) fprintf(stderr,"Grab: clicked on root window.\n"); + ix = iy = 0; iw = dispWIDE; ih = dispHIGH; + } + else { + int x,y; Window win; unsigned int rw,rh,rb,rd; +- ++ + if (XGetGeometry(theDisp,clickWin,&rW, &x, &y, &rw, &rh, &rb, &rd)) { + iw = (int) rw; ih = (int) rh; +- ++ + XTranslateCoordinates(theDisp, clickWin, rootW, 0, 0, &ix,&iy, &win); +- +- if (DEBUG) fprintf(stderr,"clickWin=0x%x: %d,%d %dx%d depth=%ud\n", +- (u_int) clickWin, ix, iy, iw, ih, rd); ++ ++ if (DEBUG) fprintf(stderr,"clickWin=0x%x: %d,%d %dx%d depth=%ud\n", ++ (u_int) clickWin, ix, iy, iw, ih, rd); + } + else { + ix = iy = 0; iw = dispWIDE; ih = dispHIGH; clickWin = rootW; + if (DEBUG) fprintf(stderr,"XGetGeometry failed? (using root win)\n"); + } + } +- +- ++ ++ + /* range checking: keep rectangle fully on-screen */ + if (ix<0) { iw += ix; ix = 0; } + if (iy<0) { ih += iy; iy = 0; } + if (ix+iw>dispWIDE) iw = dispWIDE-ix; + if (iy+ih>dispHIGH) ih = dispHIGH-iy; +- +- ++ ++ + if (DEBUG) fprintf(stderr,"using %d,%d (%dx%d)\n", ix, iy, iw, ih); +- ++ + /* flash the rectangle a bit... */ + startflash(); + for (i=0; i<5; i++) { +@@ -252,13 +247,12 @@ + + else { /* Button2: TRACK A RECTANGLE */ + int origrx, origry; +- Window origcW; + +- clickWin = rootW; origcW = cW; ++ clickWin = rootW; + origrx = ix = x2 = rx; + origry = iy = y2 = ry; + iw = ih = 0; +- ++ + XGrabServer(theDisp); + startflash(); + +@@ -276,51 +270,36 @@ + iw = abs(rx - x1); ih = abs(ry - y1); + x2 = rx; y2 = ry; + } +- ++ + if (iw>1 && ih>1) flashrect(ix,iy,iw,ih,1); /* turn on rect */ + } + + flashrect(ix, iy, iw, ih, 0); /* turn off rect */ ++ ++ /* flash the rectangle a bit... */ ++ for (i=0; i<5; i++) { ++ flashrect(ix, iy, iw, ih, 1); ++ XFlush(theDisp); Timer(100); ++ flashrect(ix, iy, iw, ih, 0); ++ XFlush(theDisp); Timer(100); ++ } + endflash(); +- ++ + XUngrabServer(theDisp); +- +- +- if (origcW == cW) { /* maybe it's entirely in one window??? */ +- if (cW) { /* will be 0 if clicked in rootW */ +- Window stwin, enwin, stwin1, enwin1; +- if (DEBUG) fprintf(stderr,"origcW=%x cW=%x ", +- (u_int) origcW, (u_int) cW); +- XTranslateCoordinates(theDisp,rootW,cW, origrx,origry,&x,&y,&stwin); +- XTranslateCoordinates(theDisp,rootW,cW, rx, ry, &x,&y,&enwin); +- +- if (DEBUG) fprintf(stderr,"stwin=%x enwin=%x ", +- (u_int) stwin, (u_int) enwin); +- if (stwin == enwin && stwin != None) { +- stwin1 = xvClientWindow(theDisp, stwin); +- enwin1 = xvClientWindow(theDisp, enwin); +- if (DEBUG) fprintf(stderr,"stwin1=%x enwin1=%x ", +- (u_int) stwin1, (u_int) enwin1); +- +- if (stwin1 == enwin1 && stwin1) clickWin = stwin1; +- else clickWin = stwin; +- } +- if (DEBUG) fprintf(stderr,"\n"); +- } +- else clickWin = rootW; +- } + } +- ++ + + /*** +- *** now that clickWin,ix,iy,iw,ih are known, try to grab the bits... ++ *** grab screen area (ix,iy,iw,ih) + ***/ + + ++ if (DEBUG>1) printWinTree(clickWin, 0); ++ + WaitCursor(); + + if (!autograb) XGrabServer(theDisp); /* until we've done the grabImage */ +- rv = grabImage(clickWin,ix,iy,iw,ih); /* ungrabs the server & button */ ++ rv = grabRootRegion(ix, iy, iw, ih); /* ungrabs the server & button */ + + SetCursors(-1); + +@@ -337,25 +316,25 @@ + + if (DEBUG) fprintf(stderr,"==remapped mainW. waiting for Config.\n"); + +- /* sit here until we see a MapNotify on mainW followed by a ++ /* sit here until we see a MapNotify on mainW followed by a + ConfigureNotify on mainW */ + + state = 0; +- while (1) { ++ while (state != 3) { + XEvent event; + XNextEvent(theDisp, &event); + HandleEvent(&event, &i); + +- if (state==0 && event.type == MapNotify && +- event.xmap.window == mainW) state = 1; ++ if (!(state&1) && event.type == MapNotify && ++ event.xmap.window == mainW) state |= 1; + +- if (state==1 && event.type == ConfigureNotify && +- event.xconfigure.window == mainW) break; ++ if (!(state&2) && event.type == ConfigureNotify && ++ event.xconfigure.window == mainW) state |= 2; + } + + if (DEBUG) fprintf(stderr,"==after remapping mainW, GOT Config.\n"); + } +- ++ + else if (ctrlW) CtrlBox(1); + } + +@@ -364,6 +343,45 @@ + + + /***********************************/ ++int LoadGrab(pinfo) ++ PICINFO *pinfo; ++{ ++ /* loads up (into XV structures) last image successfully grabbed. ++ returns '0' on failure, '1' on success */ ++ ++ int i; ++ ++ if (!grabPic) return 0; /* no image to use */ ++ ++ pinfo->type = gptype; ++ if (pinfo->type == PIC8) { ++ for (i=0; i<256; i++) { ++ pinfo->r[i] = grabmapR[i]; ++ pinfo->g[i] = grabmapG[i]; ++ pinfo->b[i] = grabmapB[i]; ++ } ++ } ++ ++ pinfo->pic = grabPic; ++ pinfo->normw = pinfo->w = gWIDE; ++ pinfo->normh = pinfo->h = gHIGH; ++ pinfo->frmType = -1; ++ pinfo->colType = -1; ++ ++ sprintf(pinfo->fullInfo,"<%s internal>", ++ (pinfo->type == PIC8) ? "8-bit" : "24-bit"); ++ ++ sprintf(pinfo->shrtInfo,"%dx%d image.",gWIDE, gHIGH); ++ ++ pinfo->comment = (char *) NULL; ++ ++ grabPic = (byte *) NULL; ++ ++ return 1; ++} ++ ++ ++/***********************************/ + static void flashrect(x,y,w,h,show) + int x,y,w,h,show; + { +@@ -373,7 +391,7 @@ + XSetPlaneMask(theDisp, rootGC, xorMasks[maskno]); + + if (!show) { /* turn off rectangle */ +- if (isvis) ++ if (isvis) + XDrawRectangle(theDisp, rootW, rootGC, x, y, (u_int) w-1, (u_int) h-1); + + isvis = 0; +@@ -391,15 +409,16 @@ + + /***********************************/ + static void startflash() +-{ ++{ + /* set up for drawing a flashing rectangle */ + XSetFunction(theDisp, rootGC, GXinvert); + XSetSubwindowMode(theDisp, rootGC, IncludeInferiors); + } + ++ + /***********************************/ + static void endflash() +-{ ++{ + XSetFunction(theDisp, rootGC, GXcopy); + XSetSubwindowMode(theDisp, rootGC, ClipByChildren); + XSetPlaneMask(theDisp, rootGC, AllPlanes); +@@ -408,21 +427,157 @@ + + + /***********************************/ +-static int grabImage(clickWin, x, y, w, h) +- Window clickWin; ++static void ungrabX() ++{ ++ XUngrabServer(theDisp); ++ XUngrabButton(theDisp, (u_int) AnyButton, 0, rootW); ++} ++ ++ ++/**************************************/ ++static int lowbitnum(ul) ++ unsigned long ul; ++{ ++ /* returns position of lowest set bit in 'ul' as an integer (0-31), ++ or -1 if none */ ++ ++ int i; ++ for (i=0; ((ul&1) == 0) && i<32; i++, ul>>=1); ++ if (i==32) i = -1; ++ return i; ++} ++ ++ ++ ++/**********************************************/ ++/* getxcolors() function snarfed from 'xwd.c' */ ++/**********************************************/ ++ ++#define lowbit(x) ((x) & (~(x) + 1)) ++ ++static int getxcolors(win_info, colors) ++ XWindowAttributes *win_info; ++ XColor **colors; ++{ ++ int i, ncolors; ++ ++ *colors = (XColor *) NULL; ++ ++ if (win_info->visual->class == TrueColor) { ++ if (DEBUG>1) fprintf(stderr,"TrueColor visual: no colormap needed\n"); ++ return 0; ++ } ++ ++ else if (!win_info->colormap) { ++ if (DEBUG>1) fprintf(stderr,"no colormap associated with window\n"); ++ return 0; ++ } ++ ++ ncolors = win_info->visual->map_entries; ++ if (DEBUG>1) fprintf(stderr,"%d entries in colormap\n", ncolors); ++ ++ if (!(*colors = (XColor *) malloc (sizeof(XColor) * ncolors))) ++ FatalError("malloc failed in getxcolors()"); ++ ++ ++ if (win_info->visual->class == DirectColor) { ++ Pixel red, green, blue, red1, green1, blue1; ++ ++ if (DEBUG>1) fprintf(stderr,"DirectColor visual\n"); ++ ++ red = green = blue = 0; ++ red1 = lowbit(win_info->visual->red_mask); ++ green1 = lowbit(win_info->visual->green_mask); ++ blue1 = lowbit(win_info->visual->blue_mask); ++ for (i=0; i<ncolors; i++) { ++ (*colors)[i].pixel = red|green|blue; ++ (*colors)[i].pad = 0; ++ red += red1; ++ if (red > win_info->visual->red_mask) red = 0; ++ green += green1; ++ if (green > win_info->visual->green_mask) green = 0; ++ blue += blue1; ++ if (blue > win_info->visual->blue_mask) blue = 0; ++ } ++ } ++ else { ++ for (i=0; i<ncolors; i++) { ++ (*colors)[i].pixel = i; ++ (*colors)[i].pad = 0; ++ } ++ } ++ ++ XQueryColors(theDisp, win_info->colormap, *colors, ncolors); ++ ++ return(ncolors); ++} ++ ++ ++ ++/*******************************************/ ++static void printWinTree(win,tab) ++ Window win; ++ int tab; ++{ ++ u_int i, nchildren; ++ Window root, parent, *children, chwin; ++ XWindowAttributes xwa; ++ int xr, yr; ++ ++ if (!XGetWindowAttributes(theDisp, win, &xwa)) { ++ errSpace(tab); ++ fprintf(stderr,"pWT: can't XGetWindowAttributes(%08x)\n", (u_int) win); ++ return; ++ } ++ ++ XTranslateCoordinates(theDisp, win, rootW, 0,0, &xr,&yr, &chwin); ++ if (xwa.map_state==IsViewable) { ++ errSpace(tab); ++ fprintf(stderr,"%08x: %4d,%4d %4dx%4d vis: %02x cm=%x %s\n", ++ (u_int) win, xr,yr, xwa.width, xwa.height, ++ (u_int) XVisualIDFromVisual(xwa.visual), ++ (u_int) xwa.colormap, ++ ((xwa.map_state==IsUnmapped) ? "unmapped " : ++ (xwa.map_state==IsUnviewable) ? "unviewable" : ++ (xwa.map_state==IsViewable) ? "viewable " : ++ "<unknown> ") ); ++ ++ if (!XQueryTree(theDisp, win, &root, &parent, &children, &nchildren)) { ++ errSpace(tab); ++ fprintf(stderr,"pWT: XQueryTree(%08x) failed\n", (u_int) win); ++ if (children) XFree((char *)children); ++ return; ++ } ++ ++ for (i=0; i<nchildren; i++) printWinTree(children[i], tab+1); ++ if (children) XFree((char *)children); ++ } ++ ++ return; ++} ++ ++ ++/***********************************/ ++static void errSpace(n) ++ int n; ++{ ++ for ( ; n>0; n--) putc(' ', stderr); ++} ++ ++ ++ ++ ++/***********************************/ ++static int grabRootRegion(x, y, w, h) + int x, y, w, h; + { + /* attempts to grab the specified rectangle of the root window +- returns '1' on success. clickWin is used to figure out the depth +- and colormap to use */ ++ returns '1' on success */ + +- XImage *image; +- XWindowAttributes xwa; +- XColor *colors; +- int ncolors, i, ix, iy; +- char str[256]; +- Window win; ++ XWindowAttributes xwa; ++ int i; + ++ regrabList = (struct rectlist *) NULL; + + /* range checking */ + if (x<0) { w += x; x = 0; } +@@ -430,86 +585,246 @@ + if (x+w>dispWIDE) w = dispWIDE-x; + if (y+h>dispHIGH) h = dispHIGH-y; + +- if (w==0 || h==0) { /* selected nothing */ ++ if (w<=0 || h<=0) { /* selected nothing */ + ungrabX(); + return 0; + } + +- if (!XGetWindowAttributes(theDisp, clickWin, &xwa)) { +- sprintf(str,"Unable to get window attributes for clicked-on window\n"); ++ ++ /* grab this region, using the default (root's) visual */ ++ ++ /* now for all top-level windows (children of root), in bottom->top order ++ if they intersect the grabregion ++ are they drawn entirely (including children) using default visual+cmap? ++ yes: if they intersect 'regrab' list, grab'em - else skip'em ++ no: grab them, add their rectangle to 'regrab' list ++ */ ++ ++ ++ /* make a 24bit grabPic */ ++ gptype = PIC24; ++ gXOFF = x; gYOFF = y; gWIDE = w; gHIGH = h; ++ grabPic = (byte *) malloc((size_t) gWIDE * gHIGH * 3); ++ if (!grabPic) { + ungrabX(); +- ErrPopUp(str, "\nThat Sucks!"); ++ ErrPopUp("Unable to malloc() space for grabbed image!", "\nBite Me!"); + return 0; + } + +- +- XTranslateCoordinates(theDisp, rootW, clickWin, x, y, &ix, &iy, &win); +- +- xerrcode = 0; +- image = XGetImage(theDisp, clickWin, ix, iy, (u_int) w, (u_int) h, +- AllPlanes, ZPixmap); +- if (xerrcode || !image || !image->data) { +- sprintf(str, "Unable to get image (%d,%d %dx%d) from display", ix,iy,w,h); ++ if (!XGetWindowAttributes(theDisp, rootW, &xwa)) { + ungrabX(); +- ErrPopUp(str, "\nThat Sucks!"); ++ ErrPopUp("Can't get window attributes for root window!", "\nBite Me!"); + return 0; + } + +- ncolors = getxcolors(&xwa, &colors); ++ i = grabWinImage(rootW, XVisualIDFromVisual(xwa.visual), xwa.colormap,0); + + ungrabX(); + +- if (ncolors && DEBUG) { +- fprintf(stderr, "Colormap:\n"); +- for (i=0; i<ncolors; i++) +- fprintf(stderr,"%02x%02x%02x ",colors[i].red>>8, colors[i].green>>8, +- colors[i].blue>>8); +- fprintf(stderr,"\n"); +- } +- +- + XBell(theDisp, 0); /* beep twice at end of grab */ + XBell(theDisp, 0); + +- i = convertImage(image, colors, ncolors, &xwa); ++ { /* free regrabList */ ++ struct rectlist *rr, *tmprr; ++ rr = regrabList; ++ while (rr) { ++ tmprr = rr->next; ++ free((char *) rr); ++ rr = tmprr; ++ } ++ regrabList = (struct rectlist *) NULL; ++ } ++ ++ if (i) { ++ ErrPopUp("Warning: Problems occurred during grab.","\nWYSInWYG!"); ++ return 0; ++ } + +- /* DO *NOT* use xvDestroyImage(), as the 'data' field was alloc'd by X, not +- necessarily through 'malloc() / free()' */ +- XDestroyImage(image); +- +- if (colors) free((char *) colors); + +- return i; ++ /* if 256 or fewer colors in grabPic, make it a PIC8 */ ++ i = CountColors24(grabPic, gWIDE, gHIGH, 0,0,gWIDE,gHIGH); ++ if (i<=256) { ++ byte *pic8; ++ pic8 = (byte *) malloc((size_t) (gWIDE * gHIGH)); ++ if (pic8) { ++ if (Trivial24to8(grabPic, gWIDE,gHIGH, pic8, ++ grabmapR,grabmapG,grabmapB,256)) { ++ free((char *) grabPic); ++ grabPic = pic8; ++ gptype = PIC8; ++ } ++ } ++ } ++ ++ return 1; /* full success */ + } + + +-static void ungrabX() ++/***********************************/ ++static int grabWinImage(win, parentVid, parentCmap, toplevel) ++ Window win; ++ VisualID parentVid; ++ Colormap parentCmap; ++ int toplevel; + { +- XUngrabServer(theDisp); +- XUngrabButton(theDisp, (u_int) AnyButton, 0, rootW); +-} ++ /* grabs area of window (and its children) that intersects ++ * grab region (root coords: gXOFF,gYOFF,gWIDE,gHIGH), and stuffs ++ * relevant bits into the grabPic (a gWIDE*gHIGH PIC24) ++ * ++ * Note: special kludge for toplevel windows (children of root): ++ * since that's the only case where a window can be obscuring something ++ * that isn't its parent ++ * ++ * returns 0 if okay, 1 if problems occurred ++ */ ++ ++ ++ int i, rv, dograb; ++ int wx, wy, ww, wh; /* root coords of window */ ++ int gx, gy, gw, gh; /* root coords of grab region of win*/ ++ Window chwin; /* unused */ ++ u_int nchildren; ++ Window root, parent, *children; ++ XWindowAttributes xwa; + ++ /* first, quick checks to avoid recursing down useless branches */ + ++ if (!XGetWindowAttributes(theDisp, win, &xwa)) { ++ if (DEBUG) fprintf(stderr,"gWI: can't get win attr (%08x)\n", (u_int) win); ++ return 1; ++ } + ++ if (xwa.class == InputOnly || xwa.map_state != IsViewable) return 0; + ++ rv = 0; ++ dograb = 1; ++ wx = 0; wy = 0; ww = (int) xwa.width; wh = (int) xwa.height; ++ ++ /* if this window doesn't intersect, none of its children will, either */ ++ XTranslateCoordinates(theDisp, win, rootW, 0,0, &wx, &wy, &chwin); ++ if (!RectIntersect(wx,wy,ww,wh, gXOFF,gYOFF,gWIDE,gHIGH)) return 0; ++ ++ gx = wx; gy = wy; gw = ww; gh = wh; ++ CropRect2Rect(&gx,&gy,&gw,&gh, gXOFF,gYOFF,gWIDE,gHIGH); ++ ++ if (win==rootW) { ++ /* always grab */ ++ } ++ ++ else if (XVisualIDFromVisual(xwa.visual) == parentVid && ++ ((xwa.visual->class==TrueColor) || xwa.colormap == parentCmap)) { ++ ++ /* note: if both visuals are TrueColor, don't compare cmaps */ ++ ++ /* normally, if the vis/cmap info of a window is the same as its parent, ++ no need to regrab window. special case if this is a toplevel ++ window, as it can be obscuring windows that *aren't* its parent */ ++ ++ if (toplevel) { ++ /* we probably already have this region. Check it against regrabList ++ If it intersects none, no need to grab. ++ If it intersects one, crop to that rectangle and grab ++ if it intersects >1, don't crop, just grab gx,gy,gw,gh */ ++ ++ struct rectlist *rr, *cr; ++ ++ i=0; cr=rr=regrabList; ++ while (rr) { ++ if (RectIntersect(gx,gy,gw,gh, rr->x,rr->y,rr->w,rr->h)) { ++ i++; cr = rr; ++ } ++ rr = rr->next; ++ } ++ ++ if (i==0) dograb=0; /* no need to grab */ ++ ++ if (i==1) CropRect2Rect(&gx,&gy,&gw,&gh, cr->x,cr->y,cr->w,cr->h); ++ } ++ else dograb = 0; ++ } ++ ++ else { ++ /* different vis/cmap from parent: ++ add to regrab list, if not already fully contained in list */ ++ struct rectlist *rr; ++ ++ /* check to see if fully contained... */ ++ rr=regrabList; ++ while (rr && RectIntersect(gx,gy,gw,gh, rr->x,rr->y,rr->w,rr->h)!=2) ++ rr = rr->next; ++ ++ if (!rr) { /* add to list */ ++ if (DEBUG) ++ fprintf(stderr,"added to regrabList: %d,%d %dx%d\n",gx,gy,gw,gh); ++ ++ rr = (struct rectlist *) malloc(sizeof(struct rectlist)); ++ if (!rr) return 1; ++ else { ++ rr->x = gx; rr->y = gy; rr->w = gw; rr->h = gh; ++ rr->next = regrabList; ++ regrabList = rr; ++ } ++ } ++ } ++ ++ /* at this point, we have to grab gx,gy,gw,gh from 'win' */ ++ ++ if (dograb) { ++ int ix, iy, ncolors; ++ XColor *colors; ++ XImage *image; ++ ++ XTranslateCoordinates(theDisp, rootW, win, gx, gy, &ix, &iy, &chwin); ++ ++ if (DEBUG) ++ fprintf(stderr,"Grabbing win (%08x) %d,%d %dx%d\n", ++ (u_int) win, gx,gy,gw,gh); ++ ++ WaitCursor(); ++ ++ xerrcode = 0; ++ image = XGetImage(theDisp, win, ix, iy, (u_int) gw, (u_int) gh, ++ AllPlanes, ZPixmap); ++ if (xerrcode || !image || !image->data) return 1; ++ ++ ncolors = getxcolors(&xwa, &colors); ++ rv = convertImageAndStuff(image, colors, ncolors, &xwa, ++ gx - gXOFF, gy - gYOFF, gw, gh); ++ XDestroyImage(image); /* can't use xvDestroyImage: alloc'd by X! */ ++ if (colors) free((char *) colors); ++ } ++ ++ ++ /* recurse into children to see if any of them are 'different'... */ ++ ++ if (!XQueryTree(theDisp, win, &root, &parent, &children, &nchildren)) { ++ if (DEBUG) fprintf(stderr,"XQueryTree(%08x) failed\n", (u_int) win); ++ if (children) XFree((char *)children); ++ return rv+1; ++ } ++ ++ for (i=0; i<nchildren; i++) { ++ rv += grabWinImage(children[i], XVisualIDFromVisual(xwa.visual), ++ xwa.colormap, (win==rootW)); ++ } ++ if (children) XFree((char *)children); ++ ++ return rv; ++} + +-union swapun { +- CARD32 l; +- CARD16 s; +- CARD8 b[sizeof(CARD32)]; +-}; + + + /**************************************/ +-static int convertImage(image, colors, ncolors, xwap) ++static int convertImageAndStuff(image, colors, ncolors, xwap, gx,gy,gw,gh) + XImage *image; + XColor *colors; + int ncolors; + XWindowAttributes *xwap; ++ int gx,gy,gw,gh; /* position within grabPic (guaranteed OK) */ + { +- /* attempts to conver the image from whatever weird-ass format it might +- be in into something E-Z to deal with (either an 8-bit colormapped +- image, or a 24-bit image). Returns '1' on success. */ ++ /* attempts to convert the image from whatever weird-ass format it might ++ be in into a 24-bit RGB image, and stuff it into grabPic ++ Returns 0 on success, 1 on failure */ + + /* this code owes a lot to 'xwdtopnm.c', part of the pbmplus package, + written by Jef Poskanzer */ +@@ -528,7 +843,6 @@ + int isLsbMachine, flipBytes; + Visual *visual; + char errstr[256]; +- static char *foo[] = { "\nThat Sucks!" }; + + + /* quiet compiler warnings */ +@@ -538,20 +852,20 @@ + pixvalue = 0; + rmask = gmask = bmask = 0; + rshift = gshift = bshift = 0; +- ++ r8shift = g8shift = b8shift = 0; + + /* determine byte order of the machine we're running on */ + sw.l = 1; + isLsbMachine = (sw.b[0]) ? 1 : 0; + +- if (xwap && xwap->visual) visual = xwap->visual; +- else visual = theVisual; ++ visual = xwap->visual; ++ + +- if (DEBUG) { ++ if (DEBUG>1) { + fprintf(stderr,"convertImage:\n"); + fprintf(stderr," %dx%d (offset %d), %s\n", +- image->width, image->height, image->xoffset, +- (image->format == XYBitmap || image->format == XYPixmap) ++ image->width, image->height, image->xoffset, ++ (image->format == XYBitmap || image->format == XYPixmap) + ? "XYPixmap" : "ZPixmap"); + + fprintf(stderr,"byte_order = %s, bitmap_bit_order = %s, unit=%d, pad=%d\n", +@@ -575,41 +889,17 @@ + sprintf(errstr, "%s\nReturned image bitmap_unit (%d) non-standard.", + "Can't deal with this display.", image->bitmap_unit); + ErrPopUp(errstr, "\nThat Sucks!"); +- return 0; ++ return 1; + } + + if (!ncolors && visual->class != TrueColor) { + sprintf(errstr, "%s\nOnly TrueColor displays can have no colormap.", + "Can't deal with this display."); + ErrPopUp(errstr, "\nThat Sucks!"); +- return 0; ++ return 1; + } + + +- /* build the 'global' grabPic stuff */ +- gWIDE = image->width; gHIGH = image->height; +- +- if (visual->class == TrueColor || visual->class == DirectColor || +- ncolors > 256) { +- grabPic = (byte *) malloc((size_t) gWIDE * gHIGH * 3); +- gbits = 24; +- } +- else { +- grabPic = (byte *) malloc((size_t) gWIDE * gHIGH); +- gbits = 8; +- +- /* load up the colormap */ +- for (i=0; i<ncolors; i++) { +- grabmapR[i] = colors[i].red >> 8; +- grabmapG[i] = colors[i].green >> 8; +- grabmapB[i] = colors[i].blue >> 8; +- } +- } +- +- if (!grabPic) FatalError("unable to malloc grabPic in convertImage()"); +- pptr = grabPic; +- +- + if (visual->class == TrueColor || visual->class == DirectColor) { + unsigned int tmp; + +@@ -634,16 +924,35 @@ + while (tmp >= 256) { tmp >>= 1; b8shift -= 1; } + while (tmp < 128) { tmp <<= 1; b8shift += 1; } + +- if (DEBUG) ++ if (DEBUG>1) + fprintf(stderr,"True/DirectColor: shifts=%d,%d,%d 8shifts=%d,%d,%d\n", + rshift, gshift, bshift, r8shift, g8shift, b8shift); + } + + +- bits_per_item = image->bitmap_unit; +- bits_used = bits_per_item; ++ bits_per_item = image->bitmap_unit; + bits_per_pixel = image->bits_per_pixel; + ++ ++ /* add code for freako 'exceed' server, where bitmapunit = 8 ++ and bitsperpix = 32 (and depth=24)... */ ++ ++ if (bits_per_item < bits_per_pixel) { ++ bits_per_item = bits_per_pixel; ++ ++ /* round bits_per_item up to next legal value, if necc */ ++ if (bits_per_item < 8) bits_per_item = 8; ++ else if (bits_per_item < 16) bits_per_item = 16; ++ else bits_per_item = 32; ++ } ++ ++ ++ /* which raises the question: how (can?) you ever have a 24 bits per pix, ++ (ie, 3 bytes, no alpha/padding) */ ++ ++ ++ bits_used = bits_per_item; /* so it will get a new item first time */ ++ + if (bits_per_pixel == 32) pixmask = 0xffffffff; + else pixmask = (((CARD32) 1) << bits_per_pixel) - 1; + +@@ -652,14 +961,15 @@ + + /* if we're on an lsbfirst machine, or the image came from an lsbfirst + machine, we should flip the bytes around. NOTE: if we're on an +- lsbfirst machine *and* the image came from an lsbfirst machine, ++ lsbfirst machine *and* the image came from an lsbfirst machine, + *don't* flip bytes, as it should work out */ + +- /* pity we don't have a logical exclusive-or */ + flipBytes = ( isLsbMachine && byte_order != LSBFirst) || + (!isLsbMachine && byte_order == LSBFirst); + + for (i=0; i<image->height; i++) { ++ pptr = grabPic + ((i+gy) * gWIDE + gx) * 3; ++ + lineptr = (byte *) image->data + (i * image->bytes_per_line); + bptr = ((CARD8 *) lineptr) - 1; + sptr = ((CARD16 *) lineptr) - 1; +@@ -667,35 +977,39 @@ + bits_used = bits_per_item; + + for (j=0; j<image->width; j++) { +- + /* get the next pixel value from the image data */ + + if (bits_used == bits_per_item) { /* time to move on to next b/s/l */ + switch (bits_per_item) { +- case 8: bptr++; break; +- case 16: sptr++; sval = *sptr; +- if (flipBytes) { /* swap CARD16 */ +- sw.s = sval; +- tmpbyte = sw.b[0]; +- sw.b[0] = sw.b[1]; +- sw.b[1] = tmpbyte; +- sval = sw.s; +- } +- break; +- case 32: lptr++; lval = *lptr; +- if (flipBytes) { /* swap CARD32 */ +- sw.l = lval; +- tmpbyte = sw.b[0]; +- sw.b[0] = sw.b[3]; +- sw.b[3] = tmpbyte; +- tmpbyte = sw.b[1]; +- sw.b[1] = sw.b[2]; +- sw.b[2] = tmpbyte; +- lval = sw.l; +- } +- break; ++ case 8: ++ bptr++; break; ++ ++ case 16: ++ sptr++; sval = *sptr; ++ if (flipBytes) { /* swap CARD16 */ ++ sw.s = sval; ++ tmpbyte = sw.b[0]; ++ sw.b[0] = sw.b[1]; ++ sw.b[1] = tmpbyte; ++ sval = sw.s; ++ } ++ break; ++ ++ case 32: ++ lptr++; lval = *lptr; ++ if (flipBytes) { /* swap CARD32 */ ++ sw.l = lval; ++ tmpbyte = sw.b[0]; ++ sw.b[0] = sw.b[3]; ++ sw.b[3] = tmpbyte; ++ tmpbyte = sw.b[1]; ++ sw.b[1] = sw.b[2]; ++ sw.b[2] = tmpbyte; ++ lval = sw.l; ++ } ++ break; + } +- ++ + bits_used = 0; + if (bit_order == MSBFirst) bit_shift = bits_per_item - bits_per_pixel; + else bit_shift = 0; +@@ -711,11 +1025,11 @@ + else bit_shift += bits_per_pixel; + bits_used += bits_per_pixel; + +- ++ + /* okay, we've got the next pixel value in 'pixvalue' */ +- ++ + if (visual->class == TrueColor || visual->class == DirectColor) { +- /* in either case, we have to take the pixvalue and ++ /* in either case, we have to take the pixvalue and + break it out into individual r,g,b components */ + rval = (pixvalue & rmask) >> rshift; + gval = (pixvalue & gmask) >> gshift; +@@ -741,212 +1055,169 @@ + /* use pixel value as an index into colors array */ + + if (pixvalue >= ncolors) { +- FatalError("convertImage(): pixvalue >= ncolors"); +- } +- +- if (gbits == 24) { /* too many colors for 8-bit colormap */ +- *pptr++ = (colors[pixvalue].red) >> 8; +- *pptr++ = (colors[pixvalue].green) >> 8; +- *pptr++ = (colors[pixvalue].blue) >> 8; ++ fprintf(stderr, "WARNING: convertImage(): pixvalue >= ncolors\n"); ++ return 1; + } +- else *pptr++ = pixvalue & 0xff; + ++ *pptr++ = (colors[pixvalue].red) >> 8; ++ *pptr++ = (colors[pixvalue].green) >> 8; ++ *pptr++ = (colors[pixvalue].blue) >> 8; + } + } + } + +- return 1; ++ return 0; + } + + + +-/**************************************/ +-static int lowbitnum(ul) +- unsigned long ul; ++/***********************************/ ++static int RectIntersect(ax,ay,aw,ah, bx,by,bw,bh) ++ int ax,ay,aw,ah, bx,by,bw,bh; + { +- /* returns position of lowest set bit in 'ul' as an integer (0-31), +- or -1 if none */ +- +- int i; +- for (i=0; ((ul&1) == 0) && i<32; i++, ul>>=1); +- if (i==32) i = -1; +- return i; +-} ++ /* returns 0 if rectangles A and B do not intersect ++ returns 1 if A partially intersects B ++ returns 2 if rectangle A is fully enclosed by B */ + ++ int ax1,ay1, bx1,by1; + ++ ax1 = ax+aw-1; ay1 = ay+ah-1; ++ bx1 = bx+bw-1; by1 = by+bh-1; + +-/**************************************/ +-/* following code snarfed from 'xwd.c' */ +-/**************************************/ ++ if (ax1<bx || ax>bx1 || ay1<by || ay>by1) return 0; + +-#define lowbit(x) ((x) & (~(x) + 1)) ++ if (ax>=bx && ax1<=bx1 && ay>=by && ay1<=by) return 2; + ++ return 1; ++} + +-static int getxcolors(win_info, colors) +- XWindowAttributes *win_info; +- XColor **colors; +-{ +- int i, ncolors; +- Colormap cmap; +- +- *colors = (XColor *) NULL; +- +- if (win_info->visual->class == TrueColor) { +- if (DEBUG) fprintf(stderr,"TrueColor visual: no colormap needed\n"); +- return 0; +- } + +- else if (!win_info->colormap) { +- if (DEBUG) fprintf(stderr,"no colormap associated with window\n"); +- return 0; +- } + +- ncolors = win_info->visual->map_entries; +- if (DEBUG) fprintf(stderr,"%d entries in colormap\n", ncolors); + +- if (!(*colors = (XColor *) malloc (sizeof(XColor) * ncolors))) +- FatalError("malloc failed in getxcolors()"); + ++/** stuff needed to make new xvgrab work in 3.10a. **/ + +- if (win_info->visual->class == DirectColor) { +- Pixel red, green, blue, red1, green1, blue1; ++/********************************************/ ++static int CountColors24(pic, pwide, phigh, x, y, w, h) ++ byte *pic; ++ int pwide, phigh, x,y,w,h; ++{ ++ /* counts the # of unique colors in a selected rect of a PIC24 ++ returns '0-256' or >256 */ + +- if (DEBUG) fprintf(stderr,"DirectColor visual\n"); ++ int i, j, nc; ++ int low, high, mid; ++ u_int colors[257], col; ++ byte *pp; ++ ++ nc = 0; ++ ++ for (i=y; nc<257 && i<y+h; i++) { ++ pp = pic + (i*pwide + x)*3; ++ ++ for (j=x; nc<257 && j<x+w; j++, pp+=3) { ++ col = (((u_int) pp[0])<<16) + (((u_int) pp[1])<<8) + pp[2]; ++ ++ /* binary search the 'colors' array to see if it's in there */ ++ low = 0; high = nc-1; ++ while (low <= high) { ++ mid = (low+high)/2; ++ if (col < colors[mid]) high = mid - 1; ++ else if (col > colors[mid]) low = mid + 1; ++ else break; ++ } + +- red = green = blue = 0; +- red1 = lowbit(win_info->visual->red_mask); +- green1 = lowbit(win_info->visual->green_mask); +- blue1 = lowbit(win_info->visual->blue_mask); +- for (i=0; i<ncolors; i++) { +- (*colors)[i].pixel = red|green|blue; +- (*colors)[i].pad = 0; +- red += red1; +- if (red > win_info->visual->red_mask) red = 0; +- green += green1; +- if (green > win_info->visual->green_mask) green = 0; +- blue += blue1; +- if (blue > win_info->visual->blue_mask) blue = 0; +- } +- } +- else { +- for (i=0; i<ncolors; i++) { +- (*colors)[i].pixel = i; +- (*colors)[i].pad = 0; ++ if (high < low) { /* didn't find color in list, add it. */ ++ xvbcopy((char *) &colors[low], (char *) &colors[low+1], ++ (nc - low) * sizeof(u_int)); ++ colors[low] = col; ++ nc++; ++ } + } + } + +- XQueryColors(theDisp, win_info->colormap, *colors, ncolors); +- +- return(ncolors); ++ return nc; + } +- + + +- +- +-/***********************************/ +-int LoadGrab(pinfo) +- PICINFO *pinfo; ++/****************************/ ++static int Trivial24to8(pic24, w,h, pic8, rmap,gmap,bmap, maxcol) ++ byte *pic24, *pic8, *rmap, *gmap, *bmap; ++ int w,h,maxcol; + { +- /* loads up (into XV structures) last image successfully grabbed. +- returns '0' on failure, '1' on success */ +- +- int i; +- +- if (!grabPic) return 0; /* no image to use */ +- +- if (gbits == 24) pinfo->type = PIC24; +- else { +- pinfo->type = PIC8; ++ /* scans picture until it finds more than 'maxcol' different colors. If it ++ finds more than 'maxcol' colors, it returns '0'. If it DOESN'T, it does ++ the 24-to-8 conversion by simply sticking the colors it found into ++ a colormap, and changing instances of a color in pic24 into colormap ++ indicies (in pic8) */ ++ ++ unsigned long colors[256],col; ++ int i, nc, low, high, mid; ++ byte *p, *pix; ++ ++ if (maxcol>256) maxcol = 256; ++ ++ /* put the first color in the table by hand */ ++ nc = 0; mid = 0; ++ ++ for (i=w*h,p=pic24; i; i--) { ++ col = (((u_long) *p++) << 16); ++ col += (((u_long) *p++) << 8); ++ col += *p++; ++ ++ /* binary search the 'colors' array to see if it's in there */ ++ low = 0; high = nc-1; ++ while (low <= high) { ++ mid = (low+high)/2; ++ if (col < colors[mid]) high = mid - 1; ++ else if (col > colors[mid]) low = mid + 1; ++ else break; ++ } + +- for (i=0; i<256; i++) { +- pinfo->r[i] = grabmapR[i]; +- pinfo->g[i] = grabmapG[i]; +- pinfo->b[i] = grabmapB[i]; ++ if (high < low) { /* didn't find color in list, add it. */ ++ if (nc>=maxcol) return 0; ++ xvbcopy((char *) &colors[low], (char *) &colors[low+1], ++ (nc - low) * sizeof(u_long)); ++ colors[low] = col; ++ nc++; + } + } + +- pinfo->pic = grabPic; +- pinfo->normw = pinfo->w = gWIDE; +- pinfo->normh = pinfo->h = gHIGH; +- pinfo->frmType = -1; +- pinfo->colType = -1; +- +- sprintf(pinfo->fullInfo,"<%s internal>", +- (pinfo->type == PIC8) ? "8-bit" : "24-bit"); +- +- sprintf(pinfo->shrtInfo,"%dx%d image.",gWIDE, gHIGH); +- +- pinfo->comment = (char *) NULL; +- +- grabPic = (byte *) NULL; +- +- return 1; +-} +- +- +- +- +- +-#include <X11/Xlib.h> +-#include <X11/Xatom.h> +- +-static Window TryChildren PARM((Display *, Window, Atom)); + +-/* Find a window with WM_STATE, else return '0' */ ++ /* run through the data a second time, this time mapping pixel values in ++ pic24 into colormap offsets into 'colors' */ + +-static Window xvClientWindow (dpy, win) +- Display *dpy; +- Window win; +-{ +- Atom WM_STATE; +- Atom type = None; +- int format; +- unsigned long nitems, after; +- unsigned char *data; +- Window inf; +- +- WM_STATE = XInternAtom(dpy, "WM_STATE", True); +- if (!WM_STATE) return win; ++ for (i=w*h,p=pic24, pix=pic8; i; i--,pix++) { ++ col = (((u_long) *p++) << 16); ++ col += (((u_long) *p++) << 8); ++ col += *p++; ++ ++ /* binary search the 'colors' array. It *IS* in there */ ++ low = 0; high = nc-1; ++ while (low <= high) { ++ mid = (low+high)/2; ++ if (col < colors[mid]) high = mid - 1; ++ else if (col > colors[mid]) low = mid + 1; ++ else break; ++ } + +- XGetWindowProperty(dpy, win, WM_STATE, 0L, 0L, False, AnyPropertyType, +- &type, &format, &nitems, &after, &data); +- if (type) return win; ++ if (high < low) { ++ fprintf(stderr,"Trivial24to8: impossible situation!\n"); ++ exit(1); ++ } ++ *pix = mid; ++ } + +- inf = TryChildren(dpy, win, WM_STATE); ++ /* and load up the 'desired colormap' */ ++ for (i=0; i<nc; i++) { ++ rmap[i] = colors[i]>>16; ++ gmap[i] = (colors[i]>>8) & 0xff; ++ bmap[i] = colors[i] & 0xff; ++ } + +- return inf; ++ return 1; + } + +-static Window TryChildren (dpy, win, WM_STATE) +- Display *dpy; +- Window win; +- Atom WM_STATE; +-{ +- Window root, parent; +- Window *children; +- unsigned int nchildren; +- unsigned int i; +- Atom type = None; +- int format; +- unsigned long nitems, after; +- unsigned char *data; +- Window inf = 0; +- +- if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren)) +- return 0; + +- for (i = 0; !inf && (i < nchildren); i++) { +- XGetWindowProperty(dpy, children[i], WM_STATE, 0L, 0L, False, +- AnyPropertyType, &type, &format, &nitems, +- &after, &data); +- if (type) +- inf = children[i]; +- } + +- for (i = 0; !inf && (i < nchildren); i++) +- inf = TryChildren(dpy, children[i], WM_STATE); + +- if (children) XFree((char *)children); +- return inf; +-} +diff -ruN xv-3.10a/xvgraf.c xv-3.10a-bugfixes/xvgraf.c +--- xv-3.10a/xvgraf.c 1994-12-22 14:34:42.000000000 -0800 ++++ xv-3.10a-bugfixes/xvgraf.c 2004-05-16 18:03:34.000000000 -0700 +@@ -1,4 +1,4 @@ +-/* ++/* + * xvgraf.c - GRAF window handling functions + * + * callable functions: +@@ -88,7 +88,7 @@ + gp->win = XCreateSimpleWindow(theDisp, parent, x,y, GWIDE, GHIGH, 1, fg,bg); + if (!gp->win) FatalError("can't create graph (main) window"); + +- gp->gwin = XCreateSimpleWindow(theDisp, gp->win, 2, GHIGH-132, ++ gp->gwin = XCreateSimpleWindow(theDisp, gp->win, 2, GHIGH-132, + 128, 128, 1, fg,bg); + if (!gp->gwin) FatalError("can't create graph (sub) window"); + +@@ -96,7 +96,7 @@ + BTCreate(&gp->butts[i], gp->win, GWIDE-GBWIDE-2, 1+i * (GBHIGH + 1), + GBWIDE, GBHIGH, (char *) NULL, fg, bg, hicol, locol); + gp->butts[i].pix = gfbpix[i]; +- gp->butts[i].pw = PW; ++ gp->butts[i].pw = PW; + gp->butts[i].ph = PH; + } + +@@ -132,7 +132,7 @@ + + gp->gammamode = 0; gp->gamma = 1.0; + } +- ++ + + /***************************************************/ + void RedrawGraf(gp, gwin) +@@ -148,7 +148,7 @@ + else { + Draw3dRect(gp->win, 0,0, GWIDE-1, GHIGH-1, R3D_OUT, 1, hicol, locol, + gp->bg); +- ++ + XSetForeground(theDisp, theGC, gp->fg); + XSetBackground(theDisp, theGC, gp->bg); + DrawString(gp->win, 2, 1+ASCENT, gp->str); +@@ -165,7 +165,7 @@ + { + int i,x,y; + XPoint pts[129], *pt; +- ++ + + if (gp->entergamma) { + char *str1 = "Enter gamma"; +@@ -181,15 +181,15 @@ + x = 10 + StringWidth(str2) + 8; + y = 30 + ASCENT + CHIGH + 3; + i = StringWidth(gp->gvstr); +- if (gp->entergamma < 0 && strlen(gp->gvstr)) { ++ if (gp->entergamma < 0 && strlen(gp->gvstr)) { + /* show string highlited */ + XFillRectangle(theDisp, gp->gwin, theGC, x-1, y-ASCENT-1, + (u_int) i+2, (u_int) CHIGH+2); + XSetForeground(theDisp, theGC, gp->bg); + } +- else ++ else + XDrawLine(theDisp, gp->gwin, theGC, x+i, y-ASCENT, x+i, y+DESCENT); +- ++ + DrawString(gp->gwin, x,y, gp->gvstr); + + return; +@@ -267,7 +267,7 @@ + if (i<N_GFB) { /* found one */ + if (BTTrack(bp)) { /* it was selected */ + switch (i) { +- case GFB_SPLINE: ++ case GFB_SPLINE: + case GFB_LINE: + gp->gammamode = 0; + +@@ -312,7 +312,7 @@ + if (gp->nhands < MAX_GHANDS) { + /* find largest x-gap in handles, put new handle in mid */ + int lgap, lpos, x, y; +- ++ + lgap = gp->hands[1].x - gp->hands[0].x; + lpos = 1; + for (j=1; j<gp->nhands-1; j++) +@@ -320,11 +320,11 @@ + lgap = gp->hands[j+1].x - gp->hands[j].x; + lpos = j+1; + } +- ++ + /* open up position in hands[] array */ +- xvbcopy((char *) &gp->hands[lpos], (char *) &gp->hands[lpos+1], ++ xvbcopy((char *) &gp->hands[lpos], (char *) &gp->hands[lpos+1], + (gp->nhands - lpos) * sizeof(XPoint)); +- ++ + x = gp->hands[lpos-1].x + lgap/2; + y = gp->func[x]; + gp->hands[lpos].x = x; +@@ -343,7 +343,7 @@ + BTSetActive(&gp->butts[GFB_DELH], 1); + } + break; +- ++ + case GFB_DELH: + if (gp->nhands > 2) { + /* find (middle) point whose x-distance to previous +@@ -361,9 +361,9 @@ + mdist = dist; mpos = j; + } + } +- ++ + /* delete position 'mpos' in hands[] array */ +- xvbcopy((char *) &gp->hands[mpos+1], (char *) &gp->hands[mpos], ++ xvbcopy((char *) &gp->hands[mpos+1], (char *) &gp->hands[mpos], + (gp->nhands-mpos-1) * sizeof(XPoint)); + + gp->nhands--; +@@ -408,16 +408,16 @@ + + /* keep original mouse position in 'mx,my', and warp mouse to center + of screen */ +- grab = !XGrabPointer(theDisp, gp->gwin, False, 0, GrabModeAsync, ++ grab = !XGrabPointer(theDisp, gp->gwin, False, 0, GrabModeAsync, + GrabModeAsync, None, inviso, (Time) CurrentTime); +- XWarpPointer(theDisp, None, rootW, 0,0,0,0, ++ XWarpPointer(theDisp, None, rootW, 0,0,0,0, + (int) dispWIDE/2, (int) dispHIGH/2); + +- origx = dispWIDE/2; origy = dispHIGH/2; ++ origx = dispWIDE/2; origy = dispHIGH/2; + orighx = gp->hands[h].x; orighy = gp->hands[h].y; + + gp->gammamode = 0; +- offx = gp->hands[h].x - origx; ++ offx = gp->hands[h].x - origx; + offy = gp->hands[h].y - origy; + + vertonly = (h==0 || h==(gp->nhands-1)); +@@ -434,7 +434,7 @@ + + dx = x - origx; dy = origy - y; /* flip y axis */ + +- /* new (virt) position of handle is (desired) ++ /* new (virt) position of handle is (desired) + orighx + dx, orighy + dy */ + + if (!vertonly) { /* keep this handle between its neighbors */ +@@ -448,7 +448,7 @@ + if (newx != gp->hands[h].x || newy != gp->hands[h].y) { + /* this handle has moved... */ + XSetForeground(theDisp, theGC, gp->bg); +- XFillRectangle(theDisp, gp->gwin, theGC, ++ XFillRectangle(theDisp, gp->gwin, theGC, + (gp->hands[h].x/2)-3, ((255-gp->hands[h].y)/2)-3, 7,7); + + gp->hands[h].x = newx; gp->hands[h].y = newy; +@@ -464,7 +464,7 @@ + } + + drawHandPos(gp, -1); +- XWarpPointer(theDisp, None, gp->gwin, 0,0,0,0, ++ XWarpPointer(theDisp, None, gp->gwin, 0,0,0,0, + gp->hands[h].x/2, (255-gp->hands[h].y)/2); + if (grab) XUngrabPointer(theDisp, (Time) CurrentTime); + } +@@ -481,9 +481,9 @@ + { + int w; + char *tstr = "888,888"; +- ++ + /* if hnum < 0, clears the text area */ +- ++ + XSetFont(theDisp, theGC, monofont); + w = XTextWidth(monofinfo, tstr, (int) strlen(tstr)); + +@@ -492,12 +492,12 @@ + + XSetForeground(theDisp, theGC, gp->fg); + XSetBackground(theDisp, theGC, gp->bg); +- XDrawImageString(theDisp, gp->win, theGC, 130-w, 1+ASCENT, ++ XDrawImageString(theDisp, gp->win, theGC, 130-w, 1+ASCENT, + str, (int) strlen(str)); + + XSetFont(theDisp, theGC, mfont); + } +- ++ + + /***************************************************/ + int GrafKey(gp,str) +@@ -518,7 +518,7 @@ + } + + while (*str) { +- if (gp->entergamma == -1 && ++ if (gp->entergamma == -1 && + (*str != '\012' && *str != '\015' && *str != '\033')) { + gp->entergamma = 1; + gp->gvstr[0] = '\0'; +@@ -529,7 +529,7 @@ + len = strlen(gp->gvstr); + + if (*str>= '0' && *str <= '9') { +- if (len < GVMAX) { ++ if (len < GVMAX) { + gp->gvstr[len++] = *str; + gp->gvstr[len] = '\0'; + ok = 1; +@@ -607,18 +607,18 @@ + + /* do sanity check. (x-coords must be sorted (strictly increasing)) */ + +- for (i=0; i<gp->nhands; i++) { +- RANGE(gp->hands[i].x, 0, 255); ++ for (i=0; i<gp->nhands; i++) { ++ RANGE(gp->hands[i].x, 0, 255); + RANGE(gp->hands[i].y, 0, 255); + } + + gp->hands[0].x = 0; gp->hands[gp->nhands-1].x = 255; + for (i=1; i<gp->nhands-1; i++) { + if (gp->hands[i].x < i) gp->hands[i].x = i; +- if (gp->hands[i].x > 256-gp->nhands+i) ++ if (gp->hands[i].x > 256-gp->nhands+i) + gp->hands[i].x = 256-gp->nhands+i; + +- if (gp->hands[i].x <= gp->hands[i-1].x) ++ if (gp->hands[i].x <= gp->hands[i-1].x) + gp->hands[i].x = gp->hands[i-1].x + 1; + } + +@@ -647,17 +647,17 @@ + else { /* gp->gamma == 0.0 */ + for (i=0; i<256; i++) gp->func[i] = 0; + } +- +- ++ ++ + for (i=0; i<gp->nhands; i++) { + gp->hands[i].y = gp->func[gp->hands[i].x]; + } + } +- ++ + else if (!gp->spline) { /* do linear interpolation */ + int y,x1,y1,x2,y2; + double yd; +- ++ + for (i=0; i<gp->nhands-1; i++) { + x1 = gp->hands[ i ].x; y1 = gp->hands[ i ].y; + x2 = gp->hands[i+1].x; y2 = gp->hands[i+1].y; +@@ -676,12 +676,12 @@ + double yf[MAX_GHANDS]; + double yd; + +- for (i=0; i<gp->nhands; i++) { ++ for (i=0; i<gp->nhands; i++) { + x[i] = gp->hands[i].x; y[i] = gp->hands[i].y; + } +- ++ + InitSpline(x, y, gp->nhands, yf); +- ++ + for (i=0; i<256; i++) { + yd = EvalSpline(x, y, yf, gp->nhands, (double) i); + j = (int) floor(yd + 0.5); +@@ -750,7 +750,7 @@ + if (!str) return 1; /* NULL strings don't parse well! */ + + /* first, strip all pesky whitespace from str */ +- for (sp=str, dp=tstr; *sp; sp++) ++ for (sp=str, dp=tstr; *sp; sp++) + if (*sp > ' ') { *dp = *sp; dp++; } + *dp = '\0'; + +@@ -764,7 +764,7 @@ + } + else return 1; + } +- ++ + /* read Spline, or Line (S/L) character */ + sp = tstr; + if (*sp == 'S' || *sp == 's') spline = 1; +@@ -784,7 +784,7 @@ + while (*sp && *sp != ':') {*dp = *sp; dp++; sp++; } + *dp++ = '\0'; + if (sscanf(tstr1,"%d,%d",&x, &y) != 2) return 1; +- if (x < 0 || x > 255 || ++ if (x < 0 || x > 255 || + y < 0 || y > 255) return 1; /* out of range */ + coords[i].x = x; coords[i].y = y; + } +@@ -837,7 +837,7 @@ + IFSET(gp->gamma, gsp->gamma); + IFSET(gp->nhands, gsp->nhands); + +- if (strcmp(gp->gvstr, gsp->gvstr)) ++ if (strcmp(gp->gvstr, gsp->gvstr)) + { strcpy(gp->gvstr, gsp->gvstr); rv++; } + + for (i=0; i<gp->nhands; i++) { +@@ -880,7 +880,7 @@ + sig = ((double) x[i]-x[i-1]) / ((double) x[i+1] - x[i-1]); + p = sig * y2[i-1] + 2.0; + y2[i] = (sig-1.0) / p; +- u[i] = (((double) y[i+1]-y[i]) / (x[i+1]-x[i])) - ++ u[i] = (((double) y[i+1]-y[i]) / (x[i+1]-x[i])) - + (((double) y[i]-y[i-1]) / (x[i]-x[i-1])); + u[i] = (6.0 * u[i]/(x[i+1]-x[i-1]) - sig*u[i-1]) / p; + } +@@ -912,9 +912,9 @@ + if (h==0.0) FatalError("bad xvalues in splint\n"); + a = (xa[khi]-x)/h; + b = (x-xa[klo])/h; +- return (a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] +(b*b*b-b)*y2a[khi]) ++ return (a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] +(b*b*b-b)*y2a[khi]) + * (h*h) / 6.0); + } +- ++ + + +diff -ruN xv-3.10a/xviff.c xv-3.10a-bugfixes/xviff.c +--- xv-3.10a/xviff.c 1995-01-13 11:54:54.000000000 -0800 ++++ xv-3.10a-bugfixes/xviff.c 2005-04-03 11:57:56.000000000 -0700 +@@ -39,7 +39,7 @@ + + static long filesize; + +-static int readID PARM((FILE *, char *)); ++/* static int readID PARM((FILE *, char *)); DOES NOT EXIST */ + static int iffError PARM((char *, char *)); + static void decomprle PARM((byte *, byte *, long, long)); + static unsigned int iff_getword PARM((byte *)); +@@ -65,16 +65,16 @@ + /*******************************************/ + { + /* returns '1' on success */ +- ++ + register byte bitmsk, rval, gval, bval; + register long col, colbit; + FILE *fp; + int rv; +- int BMHDok, CMAPok, CAMGok, BODYok; ++ int BMHDok, CMAPok, CAMGok; + int bmhd_width, bmhd_height, bmhd_bitplanes, bmhd_transcol; + int i, j, k, lineskip, colors, fmt; + byte bmhd_masking, bmhd_compression; +- long chunkLen, camg_viewmode, decomp_bufsize; ++ long chunkLen, camg_viewmode; + byte *databuf, *dataptr, *cmapptr, *picptr, *pic, *bodyptr; + byte *workptr, *workptr2, *workptr3, *decomp_mem; + +@@ -138,6 +138,7 @@ + BODY chunk was found or dataptr ran over end of file */ + + while ((rv<0) && (dataptr < (databuf + filesize))) { ++ int npixels = 0; + chunkLen = (iff_getlong(dataptr + 4) + 1) & 0xfffffffe; /* make even */ + + if (strncmp((char *) dataptr, "BMHD", (size_t) 4)==0) { /* BMHD chunk? */ +@@ -149,25 +150,30 @@ + bmhd_transcol = iff_getword(dataptr + 8 + 12); + BMHDok = 1; /* got BMHD */ + dataptr += 8 + chunkLen; /* to next chunk */ ++ ++ npixels = bmhd_width * bmhd_height; /* 65535*65535 max */ ++ if (bmhd_width <= 0 || bmhd_height <= 0 ++ || npixels/bmhd_width != bmhd_height) ++ return (iffError(bname, "xviff: image dimensions out of range")); + } + + + else if (strncmp((char *) dataptr, "CMAP", (size_t) 4)==0) { /* CMAP ? */ + cmapptr = dataptr + 8; + colors = chunkLen / 3; /* calc no of colors */ +- ++ + /* copy colors to color map */ + for (i=0; i < colors; i++) { + pinfo->r[i] = *cmapptr++; + pinfo->g[i] = *cmapptr++; + pinfo->b[i] = *cmapptr++; + } +- ++ + CMAPok = 1; /* got CMAP */ + dataptr += 8 + chunkLen; /* to next chunk */ + } + +- ++ + else if (strncmp((char *) dataptr, "CAMG", (size_t) 4)==0) { /* CAMG ? */ + camg_viewmode = iff_getlong(dataptr + 8); /* get viewmodes */ + CAMGok = 1; /* got CAMG */ +@@ -176,19 +182,28 @@ + + + else if (strncmp((char *) dataptr, "BODY", (size_t) 4)==0) { /* BODY ? */ ++ int byte_width = (((bmhd_width + 15) >> 4) << 1); /* 8192 max */ ++ + bodyptr = dataptr + 8; /* -> BODY data */ +- ++ + if (BMHDok) { /* BMHD found? */ + /* if BODY is compressed, allocate buffer for decrunched BODY and + decompress it (run length encoding) */ +- ++ + if (bmhd_compression == 1) { + /* calc size of decrunch buffer - (size of the actual picture + decompressed in interleaved Amiga bitplane format) */ + +- decomp_bufsize = (((bmhd_width + 15) >> 4) << 1) +- * bmhd_height * bmhd_bitplanes; +- ++ int bytes_per_bitplane = byte_width * bmhd_height; /* 536862720 max */ ++ long decomp_bufsize = bytes_per_bitplane * bmhd_bitplanes; ++ ++ if (byte_width <= 0 || bmhd_height <= 0 || ++ bytes_per_bitplane/byte_width != bmhd_height || ++ decomp_bufsize/bytes_per_bitplane != bmhd_bitplanes) ++ { ++ return (iffError(bname, "xviff: image dimensions out of range")); ++ } ++ + if ((decomp_mem = (byte *)malloc((size_t) decomp_bufsize)) != NULL) { + decomprle(dataptr + 8, decomp_mem, chunkLen, decomp_bufsize); + bodyptr = decomp_mem; /* -> uncompressed BODY */ +@@ -200,12 +215,13 @@ + FatalError("xviff: cannot malloc() decrunch buffer"); + } + } +- ++ + + /* the following determines the type of the ILBM file. + it's either NORMAL, EHB, HAM, HAM8 or 24BIT */ +- ++ + fmt = ILBM_NORMAL; /* assume normal ILBM */ ++ /* FIXME: does ILBM_NORMAL really support up to 255 bitplanes? */ + + if (bmhd_bitplanes == 24) fmt = ILBM_24BIT; + else if (bmhd_bitplanes == 8) { +@@ -216,7 +232,7 @@ + if (camg_viewmode & 0x80) fmt = ILBM_EHB; + else if (camg_viewmode & 0x800) fmt = ILBM_HAM; + } +- ++ + + if (DEBUG) { + fprintf(stderr, "LoadIFF: %s %dx%d, planes=%d (%d cols), comp=%d\n", +@@ -225,9 +241,9 @@ + (fmt==ILBM_HAM8) ? "HAM8 ILBM" : + (fmt==ILBM_EHB) ? "EHB ILBM" : + (fmt==ILBM_24BIT) ? "24BIT ILBM" : "unknown ILBM", +- bmhd_width, bmhd_height, bmhd_bitplanes, ++ bmhd_width, bmhd_height, bmhd_bitplanes, + 1<<bmhd_bitplanes, bmhd_compression); +- } ++ } + + + if ((fmt==ILBM_NORMAL) || (fmt==ILBM_EHB) || (fmt==ILBM_HAM)) { +@@ -248,8 +264,14 @@ + + + if ((fmt == ILBM_HAM) || (fmt == ILBM_HAM8) || (fmt == ILBM_24BIT)) { +- if ((picptr=(byte *) malloc((size_t)bmhd_width*bmhd_height*3)) +- ==NULL) { ++ int bufsize = 3 * npixels; ++ ++ if (bufsize/3 != npixels) { ++ if (databuf) free(databuf); ++ if (decomp_mem) free(decomp_mem); ++ return (iffError(bname, "xviff: image dimensions out of range")); ++ } ++ if ((picptr=(byte *) malloc((size_t) bufsize)) == NULL) { + if (databuf) free(databuf); + if (decomp_mem) free(decomp_mem); + return (iffError(bname, "xviff: no memory for decoded picture")); +@@ -258,8 +280,8 @@ + else { + pic = picptr; + workptr = bodyptr; +- lineskip = ((bmhd_width + 15) >> 4) << 1; +- ++ lineskip = byte_width; ++ + for (i=0; i<bmhd_height; i++) { + bitmsk = 0x80; + workptr2 = workptr; +@@ -338,28 +360,28 @@ + + + else if ((fmt == ILBM_NORMAL) || (fmt == ILBM_EHB)) { +- if ((picptr = (byte *) malloc((size_t) bmhd_width * bmhd_height)) +- == NULL) { ++ /* if bmhd_width and bmhd_height are OK (checked in BMHD block ++ * above; guaranteed by BMHDok), then npixels is OK, too */ ++ if ((picptr = (byte *) malloc((size_t) npixels)) == NULL) { + if (databuf) free(databuf); + if (decomp_mem) free(decomp_mem); + return (iffError(bname, "xviff: no memory for decoded picture")); + } +- ++ + else if (fmt == ILBM_EHB) { + if (DEBUG) fprintf(stderr,"Doubling CMAP for EHB mode\n"); +- ++ + for (i=0; i<32; i++) { + pinfo->r[i + colors] = pinfo->r[i] >> 1; + pinfo->g[i + colors] = pinfo->g[i] >> 1; + pinfo->b[i + colors] = pinfo->b[i] >> 1; + } + } +- ++ + pic = picptr; /* ptr to chunky buffer */ + workptr = bodyptr; /* ptr to uncmp'd pic, planar format */ +- +- lineskip = ((bmhd_width + 15) >> 4) << 1; /* # of bytes/line */ +- ++ lineskip = byte_width; ++ + for (i=0; i<bmhd_height; i++) { + bitmsk = 0x80; /* left most bit (mask) */ + workptr2 = workptr; /* work ptr to source */ +@@ -367,14 +389,14 @@ + col = 0; + colbit = 1; + workptr3 = workptr2; /* ptr to byte in 1st pln */ +- ++ + for (k=0; k<bmhd_bitplanes; k++) { + if (*workptr3 & bitmsk) /* if bit set in this pln */ + col = col + colbit; /* add bit to chunky byte */ + workptr3 += lineskip; /* go to next line */ + colbit <<= 1; /* shift color bit */ + } +- ++ + *pic++ = col; /* write to chunky buffer */ + bitmsk = bitmsk >> 1; /* shift mask to next bit */ + if (bitmsk == 0) { /* if mask is zero */ +@@ -382,7 +404,7 @@ + workptr2++; /* mv ptr to next byte */ + } + } /* for j ... */ +- ++ + workptr += lineskip * bmhd_bitplanes; /* to next line */ + } /* for i ... */ + +@@ -399,7 +421,7 @@ + pinfo->colType = F_FULLCOLOR; + pinfo->frmType = -1; + +- sprintf(pinfo->fullInfo, "%s (%ld bytes)", ++ sprintf(pinfo->fullInfo, "%s (%ld bytes)", + (fmt==ILBM_NORMAL) ? "IFF ILBM" : + (fmt==ILBM_HAM) ? "HAM ILBM" : + (fmt==ILBM_HAM8) ? "HAM8 ILBM" : +@@ -414,7 +436,8 @@ + } /* if BMHDok */ + + else rv = 0; /* didn't get BMHD header */ +- } ++ ++ } /* "BODY" chunk */ + + else { + if (DEBUG) +@@ -440,10 +463,10 @@ + + /************************************************************************** + void decomprle(source, destination, source length, buffer size) +- ++ + Decompress run-length encoded data from source to destination. Terminates + when source is decoded completely or destination buffer is full. +- ++ + The decruncher is as optimized as I could make it, without risking + safety in case of corrupt BODY chunks. + ***************************************************************************/ +@@ -455,12 +478,12 @@ + register long slen, dlen; + { + register byte codeByte, dataByte; +- ++ + while ((slen > 0) && (dlen > 0)) { +- ++ + /* read control byte */ + codeByte = *sptr++; +- ++ + if (codeByte < 0x80) { + codeByte++; + if ((slen > (long) codeByte) && (dlen >= (long) codeByte)) { +diff -ruN xv-3.10a/xvimage.c xv-3.10a-bugfixes/xvimage.c +--- xv-3.10a/xvimage.c 1995-01-13 16:11:36.000000000 -0800 ++++ xv-3.10a-bugfixes/xvimage.c 2005-03-31 07:23:39.000000000 -0800 +@@ -34,7 +34,7 @@ + static void do_pan_calc PARM((int, int, int *, int *)); + static void crop1 PARM((int, int, int, int, int)); + static int doAutoCrop24 PARM((void)); +-static void floydDitherize1 PARM((XImage *, byte *, int, int, int, ++static void floydDitherize1 PARM((XImage *, byte *, int, int, int, + byte *, byte *,byte *)); + static int highbit PARM((unsigned long)); + +@@ -74,7 +74,7 @@ + GenerateEpic(w,h); + CreateXImage(); + } +- ++ + + + /********************************************/ +@@ -90,15 +90,15 @@ + + cp = cpic; + bperpix = (picType == PIC8) ? 1 : 3; +- ++ + for (i=0; i<cHIGH; i++) { + if ((i&63)==0) WaitCursor(); + pp = pic + (i+cYOFF) * (pWIDE*bperpix) + (cXOFF * bperpix); +- for (j=0; j<cWIDE*bperpix; j++) ++ for (j=0; j<cWIDE*bperpix; j++) + *cp++ = *pp++; + } + } +- ++ + + + /***********************************/ +@@ -112,10 +112,10 @@ + clptr = NULL; cxarrp = NULL; cy = 0; /* shut up compiler */ + + SetISTR(ISTR_EXPAND, "%.5g%% x %.5g%% (%d x %d)", +- 100.0 * ((float) w) / cWIDE, ++ 100.0 * ((float) w) / cWIDE, + 100.0 * ((float) h) / cHIGH, w, h); + +- if (DEBUG) ++ if (DEBUG) + fprintf(stderr,"GenerateEpic(%d,%d) eSIZE=%d,%d cSIZE=%d,%d epicode=%d\n", + w,h,eWIDE,eHIGH,cWIDE,cHIGH, epicMode); + +@@ -124,7 +124,7 @@ + eWIDE = w; eHIGH = h; + + +- if (epicMode == EM_SMOOTH) { ++ if (epicMode == EM_SMOOTH) { + if (picType == PIC8) { + epic = SmoothResize(cpic, cWIDE, cHIGH, eWIDE, eHIGH, + rMap,gMap,bMap, rdisp,gdisp,bdisp, numcols); +@@ -143,7 +143,7 @@ + + + /* generate a 'raw' epic, as we'll need it for ColorDither if EM_DITH */ +- ++ + if (eWIDE==cWIDE && eHIGH==cHIGH) { /* 1:1 expansion. point epic at cpic */ + epic = cpic; + } +@@ -163,13 +163,13 @@ + /* the scaling routine. not really all that scary after all... */ + + /* OPTIMIZATON: Malloc an eWIDE array of ints which will hold the +- values of the equation px = (pWIDE * ex) / eWIDE. Faster than doing ++ values of the equation px = (pWIDE * ex) / eWIDE. Faster than doing + a mul and a div for every point in picture */ + + cxarr = (int *) malloc(eWIDE * sizeof(int)); + if (!cxarr) FatalError("unable to allocate cxarr"); + +- for (ex=0; ex<eWIDE; ex++) ++ for (ex=0; ex<eWIDE; ex++) + cxarr[ex] = bperpix * ((cWIDE * ex) / eWIDE); + + elptr = epptr = epic; +@@ -182,7 +182,7 @@ + clptr = cpic + (cy * cWIDE * bperpix); + + if (bperpix == 1) { +- for (ex=0, cxarrp = cxarr; ex<eWIDE; ex++, epptr++) ++ for (ex=0, cxarrp = cxarr; ex<eWIDE; ex++, epptr++) + *epptr = clptr[*cxarrp++]; + } + else { +@@ -190,7 +190,7 @@ + + for (ex=0, cxarrp = cxarr; ex<eWIDE; ex++,cxarrp++) { + cp = clptr + *cxarrp; +- for (j=0; j<bperpix; j++) ++ for (j=0; j<bperpix; j++) + *epptr++ = *cp++; + } + } +@@ -203,7 +203,7 @@ + if (picType == PIC8 && epicMode == EM_DITH) { + byte *tmp; + +- tmp = DoColorDither(NULL, epic, eWIDE, eHIGH, rMap,gMap,bMap, ++ tmp = DoColorDither(NULL, epic, eWIDE, eHIGH, rMap,gMap,bMap, + rdisp,gdisp,bdisp, numcols); + if (tmp) { /* success */ + FreeEpic(); +@@ -214,7 +214,7 @@ + } + } + } +- ++ + + + /***********************************/ +@@ -233,7 +233,7 @@ + static void do_zoom(mx,my) + int mx,my; + { +- int i,w,h,x,y,x2,y2; ++ int i; + int rx,ry,rx2,ry2, orx, ory, orw, orh; + int px,py,pw,ph,opx,opy,opw,oph,m; + Window rW, cW; unsigned int mask; int rtx, rty; +@@ -254,10 +254,10 @@ + while (1) { + if (!XQueryPointer(theDisp,mainW,&rW,&cW,&rtx,&rty, + &mx,&my,&mask)) continue; +- ++ + if (!(mask & ControlMask)) break; + if (!(mask & Button1Mask)) break; /* button released */ +- ++ + compute_zoom_rect(mx, my, &px, &py, &pw, &ph); + if (px!=opx || py!=opy) { + XDrawRectangle(theDisp,mainW,theGC, orx,ory, (u_int)orw, (u_int)orh); +@@ -283,7 +283,7 @@ + XSetPlaneMask(theDisp, theGC, AllPlanes); + return; + } +- ++ + + for (i=0; i<4; i++) { + XDrawRectangle(theDisp, mainW, theGC, orx, ory, (u_int) orw, (u_int) orh); +@@ -297,7 +297,7 @@ + /* if rectangle is *completely* outside epic, don't zoom */ + if (orx+orw<0 || ory+orh<0 || orx>=eWIDE || ory>=eHIGH) return; + +- ++ + crop1(opx, opy, opw, oph, DO_ZOOM); + } + +@@ -306,15 +306,15 @@ + static void compute_zoom_rect(x, y, px, py, pw, ph) + int x, y, *px, *py, *pw, *ph; + { +- /* given a mouse pos (in epic coords), return x,y,w,h PIC coords for +- a 'zoom in by 2x' rectangle to be tracked. The rectangle stays ++ /* given a mouse pos (in epic coords), return x,y,w,h PIC coords for ++ a 'zoom in by 2x' rectangle to be tracked. The rectangle stays + completely within 'pic' boundaries, and moves in 'pic' increments */ + + CoordE2P(x, y, px, py); +- *pw = (cWIDE+1)/2; ++ *pw = (cWIDE+1)/2; + *ph = (cHIGH+1)/2; + +- *px = *px - (*pw)/2; ++ *px = *px - (*pw)/2; + *py = *py - (*ph)/2; + + RANGE(*px, 0, pWIDE - *pw); +@@ -327,7 +327,7 @@ + { + int x,y,w,h, x2,y2, ex,ey,ew,eh; + +- /* compute a cropping rectangle (in pic coordinates) that's twice ++ /* compute a cropping rectangle (in pic coordinates) that's twice + the size of eWIDE,eHIGH, centered around eWIDE/2, eHIGH/2, but no + larger than pWIDE,PHIGH */ + +@@ -362,7 +362,7 @@ + int i, ox,oy,offx,offy, rw,rh, px, py, dx, dy,m; + Window rW, cW; unsigned int mask; int rx, ry; + +- offx = ox = mx; ++ offx = ox = mx; + offy = oy = my; + rw = eWIDE-1; rh = eHIGH-1; + m = 0; +@@ -374,50 +374,50 @@ + + /* track until Button2 is released */ + while (1) { +- if (!XQueryPointer(theDisp, mainW, &rW, &cW, &rx, &ry, ++ if (!XQueryPointer(theDisp, mainW, &rW, &cW, &rx, &ry, + &mx, &my, &mask)) continue; + if (!(mask & ControlMask)) break; /* cancelled */ + if (!(mask & Button2Mask)) break; /* button released */ +- ++ + if (mask & ShiftMask) { /* constrain mx,my to horiz or vertical */ + if (abs(mx-offx) > abs(my-offy)) my = offy; + else mx = offx; + } +- ++ + do_pan_calc(offx, offy, &mx, &my); +- ++ + if (mx!=ox || my!=oy) { +- XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy, ++ XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy, + (u_int) rw, (u_int) rh); +- XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy, ++ XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy, + (u_int) rw, (u_int) rh); + ox = mx; oy = my; + } + else { +- XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy, ++ XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy, + (u_int) rw, (u_int) rh); + m = (m+1)&7; + XSetPlaneMask(theDisp, theGC, xorMasks[m]); +- XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy, ++ XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy, + (u_int) rw, (u_int) rh); + XFlush(theDisp); + Timer(100); + } + } +- ++ + mx = ox; my = oy; /* in case mx,my changed on button release */ + + if (!(mask & ControlMask)) { /* cancelled */ +- XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy, ++ XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy, + (u_int) rw, (u_int) rh); + XSetFunction(theDisp, theGC, GXcopy); + XSetPlaneMask(theDisp, theGC, AllPlanes); + return; + } +- ++ + + for (i=0; i<4; i++) { +- XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy, ++ XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy, + (u_int) rw, (u_int) rh); + XFlush(theDisp); + Timer(100); +@@ -430,7 +430,7 @@ + dx = px - cXOFF; dy = py - cYOFF; + + if (dx==0 && dy==0) { /* didn't pan anywhere */ +- XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy, ++ XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy, + (u_int) rw, (u_int) rh); + XSetFunction(theDisp, theGC, GXcopy); + XSetPlaneMask(theDisp, theGC, AllPlanes); +@@ -485,7 +485,7 @@ + /***********************************/ + void Crop() + { +- int i, x, y, w, h; ++ int x, y, w, h; + + if (!HaveSelection()) return; + +@@ -499,8 +499,7 @@ + static void crop1(x,y,w,h,zm) + int x,y,w,h,zm; + { +- int i,j,oldew,oldeh,oldcx,oldcy; +- byte *cp, *pp; ++ int oldew,oldeh,oldcx,oldcy; + + oldcx = cXOFF; oldcy = cYOFF; + oldew = eWIDE; oldeh = eHIGH; +@@ -529,7 +528,7 @@ + if (cpic == pic) return; /* not cropped */ + + BTSetActive(&but[BUNCROP],0); +- ++ + if (epicMode == EM_SMOOTH) { /* turn off smoothing */ + epicMode = EM_RAW; SetEpicMode(); + } +@@ -538,7 +537,7 @@ + FreeEpic(); + if (cpic && cpic != pic) free(cpic); + cpic = NULL; +- ++ + + w = (pWIDE * eWIDE) / cWIDE; h = (pHIGH * eHIGH) / cHIGH; + if (w>maxWIDE || h>maxHIGH) { +@@ -566,7 +565,7 @@ + WUnCrop(); + SetCropString(); + } +- ++ + + /***********************************/ + void AutoCrop() +@@ -583,7 +582,7 @@ + WCrop(eWIDE, eHIGH, cXOFF-oldcx, cYOFF-oldcy); + } + } +- ++ + SetCursors(-1); + } + +@@ -650,7 +649,7 @@ + + /* do the actual cropping */ + if (cleft || ctop || cbot || cright) { +- DoCrop(cXOFF+cleft, cYOFF+ctop, ++ DoCrop(cXOFF+cleft, cYOFF+ctop, + cWIDE-(cleft+cright), cHIGH-(ctop+cbot)); + return 1; + } +@@ -673,7 +672,7 @@ + # define NEIGHBOR 16 /* within 6% of neighboring pixels */ + # define MISSPCT 6 /* and up to 6% that don't match */ + # define inabsrange(a,n) ( (a) < n && (a) > -n ) +- ++ + + if (cHIGH<3 || cWIDE<3) return 0; + +@@ -739,7 +738,7 @@ + while (cleft + 1 < cWIDE) { /* see if we can delete this line */ + oldr = bgR; oldg = bgG; oldb = bgB; + +- for (i=0, misses=0, cp1=cp; i<cHIGH && misses<maxmiss; ++ for (i=0, misses=0, cp1=cp; i<cHIGH && misses<maxmiss; + i++, cp1 += (cWIDE * 3)) { + r=cp1[0]-bgR; g=cp1[1]-bgG; b=cp1[2]-bgB; + R=cp1[0]-oldr; G=cp1[1]-oldg; B=cp1[2]-oldb; +@@ -763,7 +762,7 @@ + while (cleft + cright + 1 < cWIDE) { /* see if we can delete this line */ + oldr = bgR; oldg = bgG; oldb = bgB; + +- for (i=0, misses=0, cp1=cp; i<cHIGH && misses<maxmiss; ++ for (i=0, misses=0, cp1=cp; i<cHIGH && misses<maxmiss; + i++, cp1 += (cWIDE*3)) { + r=cp1[0]-bgR; g=cp1[1]-bgG; b=cp1[2]-bgB; + R=cp1[0]-oldr; G=cp1[1]-oldg; B=cp1[2]-oldb; +@@ -784,8 +783,8 @@ + if (cleft || ctop || cbot || cright) { + if (cWIDE - (cleft + cright) < 1 || + cHIGH - (ctop + cbot ) < 1) return 0; /* sanity check */ +- +- DoCrop(cXOFF+cleft, cYOFF+ctop, ++ ++ DoCrop(cXOFF+cleft, cYOFF+ctop, + cWIDE-(cleft+cright), cHIGH-(ctop+cbot)); + return 1; + } +@@ -802,7 +801,7 @@ + and sticks likely values into eWIDE,eHIGH, assuming you wanted to + crop. epic is not regnerated (but is freed) */ + +- int i, j, k, bperpix; ++ int i, j, bperpix; + byte *cp, *pp; + double expw, exph; + +@@ -837,7 +836,7 @@ + else { + /* at this point, we want to generate cpic, which will contain a + cWIDE*cHIGH subsection of 'pic', top-left at cXOFF,cYOFF */ +- ++ + cpic = (byte *) malloc((size_t) (cWIDE * cHIGH * bperpix)); + + if (cpic == NULL) { +@@ -852,7 +851,7 @@ + cp = cpic; + for (i=0; i<cHIGH; i++) { + pp = pic + (i+cYOFF) * (pWIDE*bperpix) + (cXOFF * bperpix); +- for (j=0; j<cWIDE*bperpix; j++) ++ for (j=0; j<cWIDE*bperpix; j++) + *cp++ = *pp++; + } + } +@@ -861,7 +860,7 @@ + SetCropString(); + BTSetActive(&but[BUNCROP], (cpic!=pic)); + +- eWIDE = (int) (cWIDE * expw); ++ eWIDE = (int) (cWIDE * expw); + eHIGH = (int) (cHIGH * exph); + + if (eWIDE>maxWIDE || eHIGH>maxHIGH) { /* make 'normal' size */ +@@ -869,7 +868,7 @@ + double r,wr,hr; + wr = ((double) cWIDE) / maxWIDE; + hr = ((double) cHIGH) / maxHIGH; +- ++ + r = (wr>hr) ? wr : hr; /* r is the max(wr,hr) */ + eWIDE = (int) ((cWIDE / r) + 0.5); + eHIGH = (int) ((cHIGH / r) + 0.5); +@@ -906,12 +905,12 @@ + int dir; + { + int i; +- ++ + /* dir=0: 90 degrees clockwise, else 90 degrees counter-clockwise */ + WaitCursor(); +- ++ + RotatePic(pic, picType, &pWIDE, &pHIGH, dir); +- ++ + /* rotate clipped version and modify 'clip' coords */ + if (cpic != pic && cpic != NULL) { + if (!dir) { +@@ -928,7 +927,7 @@ + RotatePic(cpic, picType, &cWIDE, &cHIGH,dir); + } + else { cWIDE = pWIDE; cHIGH = pHIGH; } +- ++ + /* rotate expanded version */ + if (epic != cpic && epic != NULL) { + WaitCursor(); +@@ -940,7 +939,7 @@ + SetISTR(ISTR_RES,"%d x %d",pWIDE,pHIGH); + + SetISTR(ISTR_EXPAND, "%.5g%% x %.5g%% (%d x %d)", +- 100.0 * ((float) eWIDE) / cWIDE, ++ 100.0 * ((float) eWIDE) / cWIDE, + 100.0 * ((float) eHIGH) / cHIGH, eWIDE, eHIGH); + } + +@@ -951,7 +950,7 @@ + int *wp, *hp; + int ptype, dir; + { +- /* rotates a w*h array of bytes 90 deg clockwise (dir=0) ++ /* rotates a w*h array of bytes 90 deg clockwise (dir=0) + or counter-clockwise (dir != 0). swaps w and h */ + + byte *pic1, *pix1, *pix; +@@ -960,7 +959,7 @@ + + bperpix = (ptype == PIC8) ? 1 : 3; + +- w = *wp; h = *hp; ++ w = *wp; h = *hp; + pix1 = pic1 = (byte *) malloc((size_t) (w*h*bperpix)); + if (!pic1) FatalError("Not enough memory to rotate!"); + +@@ -968,15 +967,15 @@ + if (dir==0) { + for (i=0; i<w; i++) { /* CW */ + if (bperpix == 1) { +- for (j=h-1, pix=pic+(h-1)*w + i; j>=0; j--, pix1++, pix-=w) ++ for (j=h-1, pix=pic+(h-1)*w + i; j>=0; j--, pix1++, pix-=w) + *pix1 = *pix; + } + else { + int bperlin = w*bperpix; + int k; +- +- for (j=h-1, pix=pic+(h-1)*w*bperpix + i*bperpix; +- j>=0; j--, pix -= bperlin) ++ ++ for (j=h-1, pix=pic+(h-1)*w*bperpix + i*bperpix; ++ j>=0; j--, pix -= bperlin) + for (k=0; k<bperpix; k++) *pix1++ = pix[k]; + } + } +@@ -984,25 +983,25 @@ + else { + for (i=w-1; i>=0; i--) { /* CCW */ + if (bperpix == 1) { +- for (j=0, pix=pic+i; j<h; j++, pix1++, pix+=w) ++ for (j=0, pix=pic+i; j<h; j++, pix1++, pix+=w) + *pix1 = *pix; + } + else { + int k; + int bperlin = w*bperpix; +- +- for (j=0, pix=pic+i*bperpix; j<h; j++, pix+=bperlin) ++ ++ for (j=0, pix=pic+i*bperpix; j<h; j++, pix+=bperlin) + for (k=0; k<bperpix; k++) *pix1++ = pix[k]; + } + } + } +- +- ++ ++ + /* copy the rotated buffer into the original buffer */ + xvbcopy((char *) pic1, (char *) pic, (size_t) (w*h*bperpix)); +- ++ + free(pic1); +- ++ + /* swap w and h */ + *wp = h; *hp = w; + } +@@ -1017,7 +1016,7 @@ + * + * Note: flips pic, cpic, and epic. Doesn't touch Ximage, nor does it draw + */ +- ++ + WaitCursor(); + + if (HaveSelection()) { /* only flip selection region */ +@@ -1026,7 +1025,7 @@ + } + + FlipPic(pic, pWIDE, pHIGH, dir); +- ++ + /* flip clipped version */ + if (cpic && cpic != pic) { + WaitCursor(); +@@ -1048,21 +1047,21 @@ + int dir; + { + /* flips a w*h array of bytes horizontally (dir=0) or vertically (dir!=0) */ +- ++ + byte *plin; + int i,j,k,l,bperpix,bperlin; +- ++ + bperpix = (picType == PIC8) ? 1 : 3; + bperlin = w * bperpix; +- ++ + if (dir==0) { /* horizontal flip */ + byte *leftp, *rightp; +- ++ + for (i=0; i<h; i++) { + plin = pic + i*bperlin; + leftp = plin; + rightp = plin + (w-1)*bperpix; +- ++ + for (j=0; j<w/2; j++, rightp -= (2*bperpix)) { + for (l=0; l<bperpix; l++, leftp++, rightp++) { + k = *leftp; *leftp = *rightp; *rightp = k; +@@ -1070,14 +1069,14 @@ + } + } + } +- ++ + else { /* vertical flip */ + byte *topp, *botp; +- ++ + for (i=0; i<w; i++) { + topp = pic + i*bperpix; + botp = pic + (h-1)*bperlin + i*bperpix; +- ++ + for (j=0; j<h/2; j++, topp+=(w-1)*bperpix, botp-=(w+1)*bperpix) { + for (l=0; l<bperpix; l++, topp++, botp++) { + k = *topp; *topp = *botp; *botp = k; +@@ -1093,26 +1092,26 @@ + int dir; + { + /* flips selected area in 'pic', regens cpic and epic appropriately */ +- ++ + int x,y,w,h; + byte *plin; + int i,j,k,l,bperpix; +- ++ + GetSelRCoords(&x,&y,&w,&h); + CropRect2Rect(&x,&y,&w,&h, 0,0,pWIDE,pHIGH); + if (w<1) w=1; + if (h<1) h=1; +- ++ + bperpix = (picType == PIC8) ? 1 : 3; +- ++ + if (dir==0) { /* horizontal flip */ + byte *leftp, *rightp; +- ++ + for (i=y; i<y+h; i++) { + plin = pic + (i*pWIDE + x) * bperpix; + leftp = plin; + rightp = plin + (w-1)*bperpix; +- ++ + for (j=0; j<w/2; j++, rightp -= (2*bperpix)) { + for (l=0; l<bperpix; l++, leftp++, rightp++) { + k = *leftp; *leftp = *rightp; *rightp = k; +@@ -1120,14 +1119,14 @@ + } + } + } +- ++ + else { /* vertical flip */ + byte *topp, *botp; +- ++ + for (i=x; i<x+w; i++) { + topp = pic + ( y * pWIDE + i) * bperpix; + botp = pic + ((y+h-1) * pWIDE + i) * bperpix; +- ++ + for (j=0; j<h/2; j++, topp+=(pWIDE-1)*bperpix, botp-=(pWIDE+1)*bperpix) { + for (l=0; l<bperpix; l++, topp++, botp++) { + k = *topp; *topp = *botp; *botp = k; +@@ -1139,22 +1138,22 @@ + GenerateCpic(); + GenerateEpic(eWIDE,eHIGH); + } +- ++ + + /************************/ + void InstallNewPic() + { + /* given a new pic and colormap, (or new 24-bit pic) installs everything, + regens cpic and epic, and redraws image */ +- ++ + /* toss old cpic and epic, if any */ + FreeEpic(); + if (cpic && cpic != pic) free(cpic); + cpic = NULL; +- ++ + /* toss old colors, and allocate new ones */ + NewPicGetColors(0,0); +- ++ + /* generate cpic,epic,theImage from new 'pic' */ + crop1(cXOFF, cYOFF, cWIDE, cHIGH, DO_ZOOM); + HandleDispMode(); +@@ -1166,15 +1165,15 @@ + void DrawEpic() + { + /* given an 'epic', builds a new Ximage, and draws it. Basically +- called whenever epic is changed, or whenever color allocation +- changes (ie, the created X image will look different for the ++ called whenever epic is changed, or whenever color allocation ++ changes (ie, the created X image will look different for the + same epic) */ +- ++ + CreateXImage(); + + if (useroot) MakeRootPic(); + else DrawWindow(0,0,eWIDE,eHIGH); +- ++ + if (HaveSelection()) DrawSelection(0); + } + +@@ -1189,7 +1188,7 @@ + if (pic) free(pic); + xvDestroyImage(theImage); theImage = NULL; + pic = egampic = epic = cpic = NULL; +- ++ + if (picComments) free(picComments); + picComments = (char *) NULL; + ChangeCommentText(); +@@ -1203,7 +1202,7 @@ + byte *pic824, *rmap, *gmap, *bmap; + int ptype, wide, high; + { +- /* does floyd-steinberg ditherizing algorithm. ++ /* does floyd-steinberg ditherizing algorithm. + * + * takes a wide*high input image, of type 'ptype' (PIC8, PIC24) + * (if PIC8, colormap is specified by rmap,gmap,bmap) +@@ -1212,14 +1211,14 @@ + * + * Note: this algorithm is *only* used when running on a 1-bit display + */ +- ++ + register byte pix8, bit; + int *thisline, *nextline; + int *thisptr, *nextptr, *tmpptr; + int i, j, err, bperpix, bperln, order; + byte *pp, *image, w1, b1, w8, b8, rgb[256]; +- +- ++ ++ + if (ptype == PIC8) { /* monoify colormap */ + for (i=0; i<256; i++) + rgb[i] = MONO(rmap[i], gmap[i], bmap[i]); +@@ -1234,7 +1233,7 @@ + + thisline = (int *) malloc(wide * sizeof(int)); + nextline = (int *) malloc(wide * sizeof(int)); +- if (!thisline || !nextline) ++ if (!thisline || !nextline) + FatalError("ran out of memory in floydDitherize1()\n"); + + +@@ -1249,10 +1248,10 @@ + *tmpptr++ = fsgamcr[rgb[*pp]]; + } + +- ++ + w1 = white&0x1; b1=black&0x1; + w8 = w1<<7; b8 = b1<<7; /* b/w bit in high bit */ +- ++ + + for (i=0; i<high; i++) { + if ((i&0x3f) == 0) WaitCursor(); +@@ -1326,7 +1325,7 @@ + + + /************************/ +-byte *FSDither(inpic, intype, w, h, rmap, gmap, bmap, ++byte *FSDither(inpic, intype, w, h, rmap, gmap, bmap, + bval, wval) + byte *inpic, *rmap, *gmap, *bmap; + int w,h, intype, bval, wval; +@@ -1338,14 +1337,21 @@ + * and 'wval' as the 'black' and 'white' pixel values, respectively + */ + +- int i, j, err, w1, h1; ++ int i, j, err, w1, h1, npixels, linebufsize; + byte *pp, *outpic, rgb[256]; + int *thisline, *nextline, *thisptr, *nextptr, *tmpptr; + + +- outpic = (byte *) malloc((size_t) (w * h)); ++ npixels = w * h; ++ linebufsize = w * sizeof(int); ++ if (w <= 0 || h <= 0 || npixels/w != h || linebufsize/w != sizeof(int)) { ++ SetISTR(ISTR_WARNING, "Invalid image dimensions for dithering"); ++ return (byte *)NULL; ++ } ++ ++ outpic = (byte *) malloc((size_t) npixels); + if (!outpic) return outpic; +- ++ + + if (intype == PIC8) { /* monoify colormap */ + for (i=0; i<256; i++) +@@ -1353,9 +1359,9 @@ + } + + +- thisline = (int *) malloc(w * sizeof(int)); +- nextline = (int *) malloc(w * sizeof(int)); +- if (!thisline || !nextline) ++ thisline = (int *) malloc(linebufsize); ++ nextline = (int *) malloc(linebufsize); ++ if (!thisline || !nextline) + FatalError("ran out of memory in FSDither()\n"); + + +@@ -1394,13 +1400,13 @@ + pp = outpic + i * w; + thisptr = thisline; nextptr = nextline; + +- if (i&1 == 0) { /* go right */ ++ if ((i&1) == 0) { /* go right */ + for (j=0; j<w; j++, pp++, thisptr++, nextptr++) { + if (*thisptr<128) { err = *thisptr; *pp = (byte) bval; } + else { err = *thisptr-255; *pp = (byte) wval; } +- ++ + if (j<w1) thisptr[1] += ((err*7)/16); +- ++ + if (i<h1) { + nextptr[0] += ((err*5)/16); + if (j>0) nextptr[-1] += ((err*3)/16); +@@ -1414,9 +1420,9 @@ + for (j=w-1; j>=0; j--, pp--, thisptr--, nextptr--) { + if (*thisptr<128) { err = *thisptr; *pp = (byte) bval; } + else { err = *thisptr-255; *pp = (byte) wval; } +- ++ + if (j>0) thisptr[-1] += ((err*7)/16); +- ++ + if (i<h1) { + nextptr[0] += ((err*5)/16); + if (j>0) nextptr[-1] += (err/16); +@@ -1449,8 +1455,8 @@ + } + + +- if (picType == PIC8) +- theImage = Pic8ToXImage(epic, (u_int) eWIDE, (u_int) eHIGH, ++ if (picType == PIC8) ++ theImage = Pic8ToXImage(epic, (u_int) eWIDE, (u_int) eHIGH, + cols, rMap, gMap, bMap); + else if (picType == PIC24) + theImage = Pic24ToXImage(egampic, (u_int) eWIDE, (u_int) eHIGH); +@@ -1482,7 +1488,7 @@ + + if (!pic8) return xim; /* shouldn't happen */ + +- if (DEBUG > 1) ++ if (DEBUG > 1) + fprintf(stderr,"Pic8ToXImage(): creating a %dx%d Ximage, %d bits deep\n", + wide, high, dispDEEP); + +@@ -1491,7 +1497,7 @@ + if (dispDEEP == 1) { + byte *imagedata; + +- xim = XCreateImage(theDisp, theVisual, dispDEEP, XYPixmap, 0, NULL, ++ xim = XCreateImage(theDisp, theVisual, dispDEEP, XYPixmap, 0, NULL, + wide, high, 32, 0); + if (!xim) FatalError("couldn't create xim!"); + +@@ -1506,11 +1512,11 @@ + + /* if ncols==0, do a 'black' and 'white' dither */ + if (ncols == 0) { +- /* note that if dispDEEP > 8, dithpic will just have '0' and '1' instead ++ /* note that if dispDEEP > 8, dithpic will just have '0' and '1' instead + of 'black' and 'white' */ + + dithpic = FSDither(pic8, PIC8, (int) wide, (int) high, rmap, gmap, bmap, +- (int) ((dispDEEP <= 8) ? black : 0), ++ (int) ((dispDEEP <= 8) ? black : 0), + (int) ((dispDEEP <= 8) ? white : 1)); + } + +@@ -1521,14 +1527,14 @@ + case 8: { + byte *imagedata, *ip, *pp; + int j, imWIDE, nullCount; +- ++ + nullCount = (4 - (wide % 4)) & 0x03; /* # of padding bytes per line */ + imWIDE = wide + nullCount; +- ++ + /* Now create the image data - pad each scanline as necessary */ + imagedata = (byte *) malloc((size_t) (imWIDE * high)); + if (!imagedata) FatalError("couldn't malloc imagedata"); +- ++ + pp = (dithpic) ? dithpic : pic8; + + for (i=0, ip=imagedata; i<high; i++) { +@@ -1543,9 +1549,9 @@ + + for (j=0; j<nullCount; j++, ip++) *ip = 0; + } +- ++ + xim = XCreateImage(theDisp,theVisual,dispDEEP,ZPixmap,0, +- (char *) imagedata, wide, high, ++ (char *) imagedata, wide, high, + 32, imWIDE); + if (!xim) FatalError("couldn't create xim!"); + } +@@ -1554,13 +1560,13 @@ + + + /*********************************/ +- ++ + case 4: { + byte *imagedata, *ip, *pp; + byte *lip; + int bperline, half, j; + +- xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, ++ xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, + wide, high, 8, 0); + if (!xim) FatalError("couldn't create xim!"); + +@@ -1569,7 +1575,7 @@ + if (!imagedata) FatalError("couldn't malloc imagedata"); + xim->data = (char *) imagedata; + +- ++ + pp = (dithpic) ? dithpic : pic8; + + if (xim->bits_per_pixel == 4) { +@@ -1601,20 +1607,20 @@ + else FatalError("This display's too bizarre. Can't create XImage."); + } + break; +- ++ + + /*********************************/ +- ++ + case 2: { /* by M.Kossa@frec.bull.fr (Marc Kossa) */ + /* MSBFirst mods added by dale@ntg.com (Dale Luck) */ +- /* additional fixes by evol@infko.uni-koblenz.de ++ /* additional fixes by evol@infko.uni-koblenz.de + (Randolf Werner) for NeXT 2bit grayscale with MouseX */ + + byte *imagedata, *ip, *pp; + byte *lip; + int bperline, half, j; + +- xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, ++ xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, + wide, high, 8, 0); + if (!xim) FatalError("couldn't create xim!"); + +@@ -1674,11 +1680,11 @@ + *ip = (dithpic) ? *pp : (byte) xcolors[*pp]; + } + } +- ++ + else FatalError("This display's too bizarre. Can't create XImage."); + } + break; +- ++ + + /*********************************/ + +@@ -1686,8 +1692,8 @@ + case 6: { + byte *imagedata, *ip, *pp; + int bperline; +- +- xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, ++ ++ xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, + wide, high, 8, 0); + if (!xim) FatalError("couldn't create xim!"); + +@@ -1707,17 +1713,16 @@ + } + } + break; +- ++ + + /*********************************/ + + case 12: + case 15: + case 16: { +- unsigned short *imagedata, *ip; +- byte *pp; ++ byte *imagedata, *ip, *pp; + +- imagedata = (unsigned short *) malloc((size_t) (2*wide*high)); ++ imagedata = (byte *) malloc((size_t) (2*wide*high)); + if (!imagedata) FatalError("couldn't malloc imagedata"); + + xim = XCreateImage(theDisp,theVisual,dispDEEP,ZPixmap,0, +@@ -1736,10 +1741,12 @@ + if (xim->byte_order == MSBFirst) { + for (i=wide*high, ip=imagedata; i>0; i--,pp++) { + if (((i+1)&0x1ffff) == 0) WaitCursor(); +- if (dithpic) { +- *ip++ = ((*pp) ? white : black) & 0xffff; +- } +- else *ip++ = xcolors[*pp] & 0xffff; ++ ++ if (dithpic) xcol = ((*pp) ? white : black) & 0xffff; ++ else xcol = xcolors[*pp] & 0xffff; ++ ++ *ip++ = (xcol>>8) & 0xff; ++ *ip++ = (xcol) & 0xff; + } + } + else { /* LSBFirst */ +@@ -1749,14 +1756,14 @@ + if (dithpic) xcol = ((*pp) ? white : black) & 0xffff; + else xcol = xcolors[*pp]; + +- /* WAS *ip++ = ((xcol>>8) & 0xff) | ((xcol&0xff) << 8); */ +- *ip++ = (unsigned short) (xcol); ++ *ip++ = (xcol) & 0xff; ++ *ip++ = (xcol>>8) & 0xff; + } + } + } + break; + +- ++ + /*********************************/ + + case 24: +@@ -1766,7 +1773,7 @@ + + imagedata = (byte *) malloc((size_t) (4*wide*high)); + if (!imagedata) FatalError("couldn't malloc imagedata"); +- ++ + xim = XCreateImage(theDisp,theVisual,dispDEEP,ZPixmap,0, + (char *) imagedata, wide, high, 32, 0); + if (!xim) FatalError("couldn't create xim!"); +@@ -1774,7 +1781,7 @@ + do32 = (xim->bits_per_pixel == 32); + + pp = (dithpic) ? dithpic : pic8; +- ++ + if (xim->byte_order == MSBFirst) { + for (i=0, ip=imagedata; i<high; i++) { + if (((i+1)&0x7f) == 0) WaitCursor(); +@@ -1809,8 +1816,8 @@ + + + /*********************************/ +- +- default: ++ ++ default: + sprintf(str,"no code to handle this display type (%d bits deep)", + dispDEEP); + FatalError(str); +@@ -1823,7 +1830,7 @@ + return(xim); + } + +-static int foo = 0; ++ + + /***********************************/ + XImage *Pic24ToXImage(pic24, wide, high) +@@ -1840,8 +1847,8 @@ + * variation of RGB the X device in question wants. No color allocation + * is involved. + * +- * Alternately, if we're on a PseudoColor, GrayScale, StaticColor or +- * StaticGray display, we're going to continue to operate in an 8-bit ++ * Alternately, if we're on a PseudoColor, GrayScale, StaticColor or ++ * StaticGray display, we're going to continue to operate in an 8-bit + * mode. (In that by this point, a 3/3/2 standard colormap has been + * created for our use (though all 256 colors may not be unique...), and + * we're just going to display the 24-bit picture by dithering with those +@@ -1861,7 +1868,7 @@ + if (dispDEEP == 1) { + byte *imagedata; + +- xim = XCreateImage(theDisp, theVisual, dispDEEP, XYPixmap, 0, NULL, ++ xim = XCreateImage(theDisp, theVisual, dispDEEP, XYPixmap, 0, NULL, + wide, high, 32, 0); + if (!xim) FatalError("couldn't create xim!"); + +@@ -1929,8 +1936,8 @@ + for (j=0, ip=lip; j<wide; j++) { + r = *pp++; g = *pp++; b = *pp++; + +- /* shift r,g,b so that high bit of 8-bit color specification is +- * aligned with high bit of r,g,b-mask in visual, ++ /* shift r,g,b so that high bit of 8-bit color specification is ++ * aligned with high bit of r,g,b-mask in visual, + * AND each component with its mask, + * and OR the three components together + */ +@@ -1945,7 +1952,7 @@ + /* shift the bits around */ + if (rshift<0) r = r << (-rshift); + else r = r >> rshift; +- ++ + if (gshift<0) g = g << (-gshift); + else g = g >> gshift; + +@@ -2019,17 +2026,17 @@ + bwdith = 0; + + if (ncols == 0 && dispDEEP != 1) { /* do 'black' and 'white' dither */ +- /* note that if dispDEEP > 8, pic8 will just have '0' and '1' instead ++ /* note that if dispDEEP > 8, pic8 will just have '0' and '1' instead + of 'black' and 'white' */ + +- pic8 = FSDither(pic24, PIC24, (int) wide, (int) high, NULL, NULL, NULL, +- (int) ((dispDEEP <= 8) ? black : 0), ++ pic8 = FSDither(pic24, PIC24, (int) wide, (int) high, NULL, NULL, NULL, ++ (int) ((dispDEEP <= 8) ? black : 0), + (int) ((dispDEEP <= 8) ? white : 1)); + bwdith = 1; + } + + else { /* do color dither using stdcmap */ +- pic8 = Do332ColorDither(pic24, NULL, (int) wide, (int) high, ++ pic8 = Do332ColorDither(pic24, NULL, (int) wide, (int) high, + NULL, NULL, NULL, + stdrdisp, stdgdisp, stdbdisp, 256); + } +@@ -2046,14 +2053,14 @@ + case 8: { + byte *imagedata, *ip, *pp; + int j, imWIDE, nullCount; +- ++ + nullCount = (4 - (wide % 4)) & 0x03; /* # of padding bytes per line */ + imWIDE = wide + nullCount; +- ++ + /* Now create the image data - pad each scanline as necessary */ + imagedata = (byte *) malloc((size_t) (imWIDE * high)); + if (!imagedata) FatalError("couldn't malloc imagedata"); +- ++ + for (i=0, pp=pic8, ip=imagedata; i<high; i++) { + if (((i+1)&0x7f) == 0) WaitCursor(); + +@@ -2066,7 +2073,7 @@ + } + + xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, +- (char *) imagedata, wide, high, ++ (char *) imagedata, wide, high, + 32, imWIDE); + if (!xim) FatalError("couldn't create xim!"); + } +@@ -2074,14 +2081,14 @@ + + + /*********************************/ +- ++ + case 4: { + byte *imagedata, *ip, *pp; + byte *lip; + int bperline, half, j; + unsigned long xcol; +- +- xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, ++ ++ xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, + wide, high, 32, 0); + if (!xim) FatalError("couldn't create xim!"); + +@@ -2123,14 +2130,14 @@ + else FatalError("This display's too bizarre. Can't create XImage."); + } + break; +- ++ + + + /*********************************/ +- ++ + case 2: { /* by M.Kossa@frec.bull.fr (Marc Kossa) */ + /* MSBFirst mods added by dale@ntg.com (Dale Luck) */ +- /* additional fixes by evol@infko.uni-koblenz.de ++ /* additional fixes by evol@infko.uni-koblenz.de + (Randolf Werner) for NeXT 2bit grayscale with MouseX */ + + byte *imagedata, *ip, *pp; +@@ -2138,7 +2145,7 @@ + int bperline, half, j; + unsigned long xcol; + +- xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, ++ xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, + wide, high, 32, 0); + if (!xim) FatalError("couldn't create xim!"); + +@@ -2201,22 +2208,22 @@ + } + } + } +- ++ + else FatalError("This display's too bizarre. Can't create XImage."); + } + break; +- ++ + + /*********************************/ +- ++ + case 6: { + byte *imagedata, *lip, *ip, *pp; + int bperline; +- +- xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, ++ ++ xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL, + wide, high, 32, 0); + if (!xim) FatalError("couldn't create xim!"); +- ++ + if (xim->bits_per_pixel != 8) + FatalError("This display's too bizarre. Can't create XImage."); + +@@ -2238,7 +2245,7 @@ + } + break; + +- ++ + /*********************************/ + + case 15: +@@ -2282,7 +2289,7 @@ + } + break; + +- ++ + /*********************************/ + + /* this wouldn't seem likely to happen, but what the heck... */ +@@ -2295,7 +2302,7 @@ + + imagedata = (byte *) malloc((size_t) (4*wide*high)); + if (!imagedata) FatalError("couldn't malloc imagedata"); +- ++ + xim = XCreateImage(theDisp,theVisual,dispDEEP,ZPixmap,0, + (char *) imagedata, wide, high, 32, 0); + if (!xim) FatalError("couldn't create xim!"); +@@ -2303,7 +2310,7 @@ + bperpix = xim->bits_per_pixel; + + pp = pic8; +- ++ + if (xim->byte_order == MSBFirst) { + for (i=wide*high, ip=imagedata; i>0; i--,pp++) { + if (((i+1)&0x1ffff) == 0) WaitCursor(); +@@ -2327,7 +2334,7 @@ + if (bperpix == 32) *ip++ = 0; + } + } +- } ++ } + break; + + } /* end of the switch */ +@@ -2346,7 +2353,7 @@ + int mode; + { + /* move checkmark */ +- conv24MB.flags[CONV24_8BIT] = (mode==PIC8); ++ conv24MB.flags[CONV24_8BIT] = (mode==PIC8); + conv24MB.flags[CONV24_24BIT] = (mode==PIC24); + + if (mode == PIC24) { +@@ -2383,15 +2390,13 @@ + void Change824Mode(mode) + int mode; + { +- static int oldcmapmode = -1; +- + if (mode == picType) return; /* same mode, do nothing */ + + Set824Menus(mode); + + if (!pic) { /* done all we wanna do when there's no pic */ + picType = mode; +- return; ++ return; + } + + /* should probably actually *do* something involving colors, regenrating +@@ -2474,7 +2479,7 @@ + int ptype, w,h, sx,sy,sw,sh; + { + /* mallocs and returns the selected subimage (sx,sy,sw,sh) of pic. +- selection is guaranteed to be within pic boundaries. ++ selection is guaranteed to be within pic boundaries. + NEVER RETURNS NULL */ + + byte *rpic, *sp, *dp; +@@ -2520,7 +2525,6 @@ + installs the new pic and all that... Returns '0' on failure */ + + int rv; +- char loadName[256]; + + if (padPic) free(padPic); + if (holdcomment) free(holdcomment); +@@ -2530,8 +2534,8 @@ + + rv = 1; + +- if ((mode != PAD_LOAD) && (wide == pWIDE && high == pHIGH && opaque==100)) { +- ErrPopUp("Padding to same size as pic while fully opaque has no effect.", ++ if ((mode != PAD_LOAD) && (wide == cWIDE && high == cHIGH && opaque==100)) { ++ ErrPopUp("Padding to same size as pic while fully opaque has no effect.", + "\nI see"); + return 0; + } +@@ -2539,8 +2543,8 @@ + WaitCursor(); + + if (mode == PAD_SOLID) rv = doPadSolid(str, wide, high, opaque,omode); +- else if (mode == PAD_BGGEN) rv = doPadBggen(str, wide, high, opaque,omode); +- else if (mode == PAD_LOAD) rv = doPadLoad (str, wide, high, opaque,omode); ++ else if (mode == PAD_BGGEN) rv = doPadBggen(str, wide, high, opaque,omode); ++ else if (mode == PAD_LOAD) rv = doPadLoad (str, wide, high, opaque,omode); + + SetCursors(-1); + +@@ -2556,7 +2560,7 @@ + + return 1; + } +- ++ + + /***********************************/ + int LoadPad(pinfo, fname) +@@ -2645,7 +2649,7 @@ + return 0; + } + } +- ++ + + + pic24 = (byte *) malloc(wide * high * 3 * sizeof(byte)); +@@ -2656,7 +2660,7 @@ + return 0; + } + +- ++ + /* fill pic24 with solidRGB */ + for (i=0,pp=pic24; i<wide*high; i++, pp+=3) { + pp[0] = (solidRGB>>16) & 0xff; +@@ -2697,7 +2701,11 @@ + #else + strcpy(fname, "Sys$Disk:[]xvuXXXXXX"); + #endif ++#ifdef USE_MKSTEMP ++ close(mkstemp(fname)); ++#else + mktemp(fname); ++#endif + + /* run bggen to generate the background */ + sprintf(syscmd, "bggen -g %dx%d %s > %s", wide, high, str, fname); +@@ -2713,7 +2721,7 @@ + ErrPopUp(errstr, "\nDoh!"); + return 0; + } +- ++ + + /* read the file that's been created */ + if (!ReadImageFile1(fname, &pinfo)) { +@@ -2791,7 +2799,7 @@ + int wide, high, opaque,omode; + { + /* copies 'pic' onto the given 24-bit background image, converts back to +- 8-bit (if necessary), and loads up pad* variables. ++ 8-bit (if necessary), and loads up pad* variables. + frees pic24 if necessary */ + + byte *pp, *p24; +@@ -2806,30 +2814,30 @@ + + /* copy 'pic' centered onto pic24. */ + +- sx = (wide - pWIDE) / 2; +- sy = (high - pHIGH) / 2; +- +- for (py = 0; py<pHIGH; py++) { +- ProgressMeter(0, pHIGH-1, py, "Pad"); ++ sx = (wide - cWIDE) / 2; ++ sy = (high - cHIGH) / 2; ++ ++ for (py = 0; py<cHIGH; py++) { ++ ProgressMeter(0, cHIGH-1, py, "Pad"); + if ((py & 0x1f)==0) WaitCursor(); + + p24y = sy + py; + if (p24y >= 0 && p24y < high) { +- for (px=0; px<pWIDE; px++) { ++ for (px=0; px<cWIDE; px++) { + p24x = sx + px; + if (p24x >= 0 && p24x < wide) { + p24 = pic24 + (p24y*wide + p24x)*3; +- +- ++ ++ + if (picType == PIC24) { /* src is PIC24 */ +- pp = pic + (py * pWIDE + px) *3; ++ pp = cpic + (py * cWIDE + px) *3; + r = pp[0]; g = pp[1]; b = pp[2]; + } + else { /* src is PIC8 */ +- pp = pic + (py*pWIDE + px); ++ pp = cpic + (py*cWIDE + px); + r = rMap[*pp]; g = gMap[*pp]; b = bMap[*pp]; + } +- ++ + if (omode == PAD_ORGB) { + rval = (r * fg) / 100 + ((int) p24[0] * bg) / 100; + gval = (g * fg) / 100 + ((int) p24[1] * bg) / 100; +@@ -2845,7 +2853,7 @@ + + if (omode == PAD_OINT) { + h = fh; +- s = fs; ++ s = fs; + /* v = (fv * fg) / 100.0 + (bv * bg) / 100.0; */ + v = (fv * bv * bw) + (fv * fw); + } +@@ -2855,18 +2863,18 @@ + h = fh; + /* s = (fs * fg) / 100.0 + (bs * bg) / 100.0; */ + s = (fs * bs * bw) + (fs * fw); +- v = fv; ++ v = fv; + } + else if (omode == PAD_OHUE) { /* the hard one! */ +- int fdeg,bdeg,len1,len2; +- ++ int fdeg,bdeg; ++ + fdeg = (fh<0) ? -1 : (int) floor(fh + 0.5); + bdeg = (bh<0) ? -1 : (int) floor(bh + 0.5); + + if (fdeg>=0 && bdeg>=0) { /* both are colors */ + /* convert H,S onto x,y coordinates on the colorwheel for + constant V */ +- ++ + double fx,fy, bx,by, ox,oy; + + if (fg == 100 || bg == 100) { /* E-Z special case */ +@@ -2874,17 +2882,17 @@ + else { h = bh; s = fs; v=fv; } + } + else { /* general case */ +- ++ + fh *= (3.14159 / 180.0); /* -> radians */ + bh *= (3.14159 / 180.0); +- ++ + fx = fs * cos(fh); fy = fs * sin(fh); + bx = bs * cos(bh); by = bs * sin(bh); +- ++ + /* compute pt. on line between fx,fy and bx,by */ + ox = (fx * (fg/100.0)) + (bx * (bg/100.0)); + oy = (fy * (fg/100.0)) + (by * (bg/100.0)); +- ++ + /* convert ox,oy back into hue,sat */ + s = sqrt((ox * ox) + (oy * oy)); + if (ox == 0.0) { +@@ -2897,7 +2905,7 @@ + while (h<0.0) h += 360.0; + while (h>=360.0) h -= 360.0; + } +- ++ + v = fv; + } + } +@@ -2924,7 +2932,7 @@ + v = (fv * bv * bw) + (fv * fw); + hsv2rgb(h,s,v, &rval,&gval,&bval); + } +- ++ + RANGE(rval, 0, 255); RANGE(gval, 0, 255); RANGE(bval, 0, 255); + *p24++ = rval; *p24++ = gval; *p24++ = bval; + } +@@ -2958,12 +2966,15 @@ + + + /*******************************/ +-static int ReadImageFile1(name, pinfo) ++static int ReadImageFile1(name, pinfo) + char *name; + PICINFO *pinfo; + { + int i, ftype; +- char basefname[128], uncompname[128], errstr[256], *uncName, *readname; ++ char uncompname[128], errstr[256], *uncName, *readname; ++#ifdef VMS ++ char basefname[128]; ++#endif + + ftype = ReadFileType(name); + +@@ -2976,7 +2987,7 @@ + #else + uncName = name; + #endif +- ++ + if (UncompressFile(uncName, uncompname)) { + ftype = ReadFileType(uncompname); + readname = uncompname; +@@ -3004,7 +3015,7 @@ + KillPageFiles(pinfo->pagebname, pinfo->numpages); + + if (!i || (i && (pinfo->w<=0 || pinfo->h<=0))) { +- if (i) { ++ if (i) { + if (pinfo->pic) free(pinfo->pic); + if (pinfo->comment) free(pinfo->comment); + } +@@ -3021,6 +3032,6 @@ + + + +- ++ + + +diff -ruN xv-3.10a/xvinfo.c xv-3.10a-bugfixes/xvinfo.c +--- xv-3.10a/xvinfo.c 1994-12-22 14:34:41.000000000 -0800 ++++ xv-3.10a-bugfixes/xvinfo.c 2004-05-16 18:03:43.000000000 -0700 +@@ -1,4 +1,4 @@ +-/* ++/* + * xvinfo.c - 'Info' box handling functions + * + * callable functions: +@@ -8,7 +8,7 @@ + * maps/unmaps window, etc. + * RedrawInfo(x,y,w,h) - called by 'expose' events + * SetInfoMode(mode) - changes amount of info Info window shows +- * SetISTR(st, fmt, args) - sprintf's into ISTR #st. Redraws it in window ++ * SetISTR(st, fmt, args) - sprintf's into ISTR #st. Redraws it in window + * char *GetISTR(st) - returns pointer to ISTR #st, or NULL if st bogus + */ + +@@ -45,18 +45,18 @@ + void CreateInfo(geom) + char *geom; + { +- infoW = CreateWindow("xv info", "XVinfo", geom, INFOWIDE, INFOHIGH, ++ infoW = CreateWindow("xv info", "XVinfo", geom, INFOWIDE, INFOHIGH, + infofg, infobg, 0); + if (!infoW) FatalError("can't create info window!"); +- +- pennPix = XCreatePixmapFromBitmapData(theDisp, infoW, ++ ++ pennPix = XCreatePixmapFromBitmapData(theDisp, infoW, + (char *) penn_bits, penn_width, penn_height, infofg, infobg, dispDEEP); + + pnetPix = XCreatePixmapFromBitmapData(theDisp,infoW, +- (char *) pennnet_bits, pennnet_width, pennnet_height, ++ (char *) pennnet_bits, pennnet_width, pennnet_height, + infofg, infobg, dispDEEP); + } +- ++ + + /***************************************************/ + void InfoBox(vis) +@@ -64,7 +64,7 @@ + { + if (vis) XMapRaised(theDisp, infoW); + else XUnmapWindow(theDisp, infoW); +- ++ + infoUp = vis; + } + +@@ -74,15 +74,15 @@ + int x,y,w,h; + { + int i; +- ++ + XSetForeground(theDisp, theGC, infofg); + XSetBackground(theDisp, theGC, infobg); + + /* draw the two icons */ + XCopyArea(theDisp, pennPix, infoW, theGC, 0, 0, penn_width, penn_height, + 36 - penn_width/2, 36 - penn_height/2); +- XCopyArea(theDisp, pnetPix, infoW, theGC, 0, 0, pennnet_width, +- pennnet_height, INFOWIDE - 36 - pennnet_width/2, ++ XCopyArea(theDisp, pnetPix, infoW, theGC, 0, 0, pennnet_width, ++ pennnet_height, INFOWIDE - 36 - pennnet_width/2, + 36 - pennnet_height/2); + + /* draw the credits */ +@@ -90,7 +90,7 @@ + CenterString(infoW, INFOWIDE/2, 36-LINEHIGH, str); + CenterString(infoW, INFOWIDE/2, 36, + "by John Bradley (bradley@dccs.upenn.edu)"); +- CenterString(infoW, INFOWIDE/2, 36+LINEHIGH, ++ CenterString(infoW, INFOWIDE/2, 36+LINEHIGH, + "Copyright 1994, John Bradley - All Rights Reserved"); + + +@@ -139,8 +139,8 @@ + + if (infoMode == INF_NONE || infoMode == INF_STR) return; + if (infoMode == INF_PART && fnum>=3) return; +- +- XDrawString(theDisp, infoW, theGC, 10, TOPBASE + fnum*LINEHIGH, ++ ++ XDrawString(theDisp, infoW, theGC, 10, TOPBASE + fnum*LINEHIGH, + fname[fnum], (int) strlen(fname[fnum])); + } + +@@ -150,7 +150,7 @@ + int st; + { + /* erase area of string, and draw it with new contents */ +- ++ + if (infoMode == INF_NONE) return; + if (infoMode == INF_STR && st > ISTR_WARNING) return; + if (infoMode == INF_PART && st > ISTR_RES) return; +@@ -170,12 +170,12 @@ + } + else { + XSetForeground(theDisp, theGC, infobg); +- XFillRectangle(theDisp, infoW, theGC, +- STLEFT, TOPBASE - ASCENT + (st-ISTR_FILENAME)*LINEHIGH, ++ XFillRectangle(theDisp, infoW, theGC, ++ STLEFT, TOPBASE - ASCENT + (st-ISTR_FILENAME)*LINEHIGH, + (u_int) INFOWIDE-STLEFT, (u_int) LINEHIGH); + XSetForeground(theDisp, theGC, infofg); + XDrawString(theDisp, infoW, theGC, STLEFT, +- TOPBASE + (st-ISTR_FILENAME)*LINEHIGH, istrs[st], ++ TOPBASE + (st-ISTR_FILENAME)*LINEHIGH, istrs[st], + (int) strlen(istrs[st])); + } + } +@@ -187,21 +187,21 @@ + int mode; + { + int y1, y2; +- ++ + infoMode = mode; + if (infoUp) { /* only do this if window is mapped */ + y1 = TOPBASE - ASCENT; + y2 = INFOHIGH-43; +- ++ + XSetForeground(theDisp, theGC, infobg); +- +- XFillRectangle(theDisp,infoW,theGC,0,y1, ++ ++ XFillRectangle(theDisp,infoW,theGC,0,y1, + (u_int) INFOWIDE, (u_int) y2-y1); +- XFillRectangle(theDisp,infoW,theGC,0,INFOHIGH-39, ++ XFillRectangle(theDisp,infoW,theGC,0,INFOHIGH-39, + (u_int) INFOWIDE, (u_int) 17); +- XFillRectangle(theDisp,infoW,theGC,0,INFOHIGH-19, ++ XFillRectangle(theDisp,infoW,theGC,0,INFOHIGH-19, + (u_int) INFOWIDE, (u_int) 17); +- ++ + drawStrings(); + } + } +@@ -237,9 +237,9 @@ + else istrs[stnum][0] = '\0'; + } + va_end(args); +- ++ + if (stnum == ISTR_COLOR) { +- sprintf(istrs[ISTR_INFO], "%s %s %s", formatStr, ++ sprintf(istrs[ISTR_INFO], "%s %s %s", formatStr, + (picType==PIC8) ? "8-bit mode." : "24-bit mode.", + istrs[ISTR_COLOR]); + } +@@ -250,19 +250,19 @@ + XFlush(theDisp); + } + +- if (ctrlUp && (stnum == ISTR_INFO || stnum == ISTR_WARNING || ++ if (ctrlUp && (stnum == ISTR_INFO || stnum == ISTR_WARNING || + stnum == ISTR_COLOR)) { + DrawCtrlStr(); + XFlush(theDisp); + } + +- if (anyBrowUp && (stnum == ISTR_WARNING || stnum == ISTR_INFO) ++ if (anyBrowUp && (stnum == ISTR_WARNING || stnum == ISTR_INFO) + && strlen(istrs[stnum])) { + SetBrowStr(istrs[stnum]); + XFlush(theDisp); + } + +- if (stnum == ISTR_WARNING && !ctrlUp && !infoUp && !anyBrowUp && ++ if (stnum == ISTR_WARNING && !ctrlUp && !infoUp && !anyBrowUp && + strlen(istrs[stnum])) { + OpenAlert(istrs[stnum]); + sleep(3); +diff -ruN xv-3.10a/xviris.c xv-3.10a-bugfixes/xviris.c +--- xv-3.10a/xviris.c 1994-12-22 14:34:47.000000000 -0800 ++++ xv-3.10a-bugfixes/xviris.c 2005-04-03 12:08:03.000000000 -0700 +@@ -14,7 +14,7 @@ + * + * This code should work on machines with any byte order. + * +- * Could someone make this run real fast using multiple processors ++ * Could someone make this run real fast using multiple processors + * or how about using memory mapped files to speed it up? + * + * Paul Haeberli - 1991 +@@ -44,7 +44,7 @@ + u_short zsize; + u_long min; + u_long max; +- u_long wastebytes; ++ u_long wastebytes; + char name[80]; + u_long colormap; + +@@ -112,7 +112,8 @@ + IMAGE img; + byte *rawdata, *rptr; + byte *pic824, *bptr; +- int trunc, i, j; ++ int trunc, i, npixels, bufsize; ++ u_short ii, jj; + long filesize; + + trunc = 0; +@@ -133,11 +134,11 @@ + img.imagic = getshort(fp); + img.type = getshort(fp); + img.dim = getshort(fp); +- img.xsize = getshort(fp); ++ img.xsize = getshort(fp); /* u_short */ + img.ysize = getshort(fp); + img.zsize = getshort(fp); + +- if (FERROR(fp)) { ++ if (FERROR(fp) || img.xsize == 0 || img.ysize == 0 || img.zsize == 0) { + fclose(fp); + return irisError(bname, "error in header info"); + } +@@ -148,7 +149,7 @@ + } + + rawdata = getimagedata(fp, &img); +- if (!rawdata) { ++ if (!rawdata) { + fclose(fp); + if (loaderr) irisError(bname, loaderr); + return 0; +@@ -162,18 +163,22 @@ + /* got the raw image data. Convert to an XV image (1,3 bytes / pix) */ + + ++ npixels = img.xsize * img.ysize; /* 65535*65535 = (2^32 - 131071) max */ ++ if (npixels/img.xsize != img.ysize) ++ return irisError(bname, "IRIS image dimensions out of range"); ++ + if (img.zsize < 3) { /* grayscale */ +- pic824 = (byte *) malloc((size_t) img.xsize * img.ysize); ++ pic824 = (byte *) malloc((size_t) npixels); + if (!pic824) FatalError("couldn't malloc pic824 in LoadIRIS()"); + + /* copy plane 3 from rawdata into pic824, inverting pic vertically */ +- for (i=0, bptr=pic824; i<(int) img.ysize; i++) { +- rptr = rawdata + 3 + ((img.ysize - 1) - i) * (img.xsize * 4); +- for (j=0; j<(int) img.xsize; j++, bptr++, rptr+=4) *bptr = *rptr; ++ for (ii=0, bptr=pic824; ii<img.ysize; ii++) { ++ rptr = rawdata + 3 + ((img.ysize - 1) - ii) * (img.xsize * 4); ++ for (jj=0; jj<img.xsize; jj++, bptr++, rptr+=4) *bptr = *rptr; + } + + +- for (i=0; i<256; i++) ++ for (i=0; i<256; i++) + pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i; + + pinfo->pic = pic824; +@@ -188,13 +193,17 @@ + } + + else { /* truecolor */ +- pic824 = (byte *) malloc((size_t) img.xsize * img.ysize * 3); ++ bufsize = 3 * npixels; ++ if (npixels/img.xsize != img.ysize || bufsize/3 != npixels) { ++ return irisError(bname, "IRIS image dimensions out of range"); ++ } ++ pic824 = (byte *) malloc((size_t) bufsize); + if (!pic824) FatalError("couldn't malloc pic824 in LoadIRIS()"); +- ++ + /* copy plane 3 from rawdata into pic824, inverting pic vertically */ +- for (i=0, bptr=pic824; i<(int) img.ysize; i++) { +- rptr = rawdata + ((img.ysize - 1) - i) * (img.xsize * 4); +- for (j=0; j<(int) img.xsize; j++, rptr+=4) { ++ for (ii=0, bptr=pic824; ii<img.ysize; ii++) { ++ rptr = rawdata + ((img.ysize - 1) - ii) * (img.xsize * 4); ++ for (jj=0; jj<img.xsize; jj++, rptr+=4) { + *bptr++ = rptr[3]; + *bptr++ = rptr[2]; + *bptr++ = rptr[1]; +@@ -220,7 +229,7 @@ + pinfo->comment = (char *) NULL; + + return 1; +-} ++} + + + /*******************************************/ +@@ -237,15 +246,15 @@ + FILE *fp; + IMAGE *img; + { +- /* read in a B/W RGB or RGBA iris image file and return a ++ /* read in a B/W RGB or RGBA iris image file and return a + pointer to an array of 4-byte pixels, arranged ABGR, NULL on error */ + + byte *base, *lptr; + byte *verdat; +- int y, z, pos, len, tablen; ++ int y, z, tablen; + int xsize, ysize, zsize; + int bpp, rle, cur, badorder; +- int rlebuflen; ++ int rlebuflen, npixels, bufsize; + + + rle = ISRLE(img->type); +@@ -257,21 +266,33 @@ + return (byte *) NULL; + } + +- xsize = img->xsize; ++ xsize = img->xsize; /* all three are > 0 (checked by caller), <= 65535 */ + ysize = img->ysize; + zsize = img->zsize; ++ npixels = xsize * ysize; /* 65535*65535 = (2^32 - 131071) max */ ++ if (npixels/xsize != ysize) { ++ loaderr = "IRIS image dimensions out of range"; ++ return (byte *) NULL; ++ } + + if (rle) { + byte *rledat; + u_long *starttab, *lengthtab; + +- rlebuflen = 2 * xsize + 10; ++ rlebuflen = 2 * xsize + 10; /* 10 <= rlebuflen <= 131080 */ + tablen = ysize * zsize; +- starttab = (u_long *) malloc((size_t) tablen * sizeof(long)); +- lengthtab = (u_long *) malloc((size_t) tablen * sizeof(long)); ++ bufsize = tablen * sizeof(long); ++ ++ if (tablen/ysize != zsize || bufsize/tablen != sizeof(long)) { ++ loaderr = "IRIS image dimensions out of range"; ++ return (byte *)NULL; ++ } ++ ++ starttab = (u_long *) malloc((size_t) bufsize); ++ lengthtab = (u_long *) malloc((size_t) bufsize); + rledat = (byte *) malloc((size_t) rlebuflen); + +- if (!starttab || !lengthtab || !rledat) ++ if (!starttab || !lengthtab || !rledat) + FatalError("out of memory in LoadIRIS()"); + + fseek(fp, 512L, 0); +@@ -298,7 +319,13 @@ + fseek(fp, (long) (512 + 2*tablen*4), 0); + cur = 512 + 2*tablen*4; + +- base = (byte *) malloc((size_t) (xsize*ysize+TAGLEN) * 4); ++ bufsize = 4 * (npixels+TAGLEN); ++ if (bufsize/4 != (npixels+TAGLEN)) { ++ loaderr = "Bogus IRIS File!"; ++ free(starttab); free(lengthtab); free(rledat); ++ return (byte *)NULL; ++ } ++ base = (byte *) malloc((size_t) bufsize); + if (!base) FatalError("out of memory in LoadIRIS()"); + + addimgtag(base,xsize,ysize); +@@ -349,12 +376,17 @@ + } /* end of RLE case */ + + else { /* not RLE */ ++ bufsize = 4 * (npixels+TAGLEN); ++ if (bufsize/4 != (npixels+TAGLEN)) { ++ loaderr = "Bogus IRIS File!"; ++ return (byte *)NULL; ++ } ++ base = (byte *) malloc((size_t) bufsize); + verdat = (byte *) malloc((size_t) xsize); +- base = (byte *) malloc((size_t) (xsize*ysize+TAGLEN) * 4); + if (!base || !verdat) FatalError("out of memory in LoadIRIS()"); + + addimgtag(base,xsize,ysize); +- ++ + fseek(fp,512L,0); + + for (z=0; z<zsize; z++) { +@@ -457,7 +489,7 @@ + byte *dptr; + int xsize, ysize; + { +- /* this is used to extract image data from core dumps. ++ /* this is used to extract image data from core dumps. + I doubt this is necessary... --jhb */ + + dptr = dptr + (xsize * ysize * 4); +@@ -499,26 +531,31 @@ + int ptype, w, h, numcols, colorstyle; + { + /* writes a greyscale or 24-bit RGB IRIS file to the already open +- stream, rle compressed */ ++ stream, RLE-compressed; returns 0 on success, -1 on minor error */ + + IMAGE img; +- int i, j, pos, len, tablen, rlebuflen, zsize; ++ int i, j, pos, len, tablen, rlebuflen, zsize, npixels, bufsize; + u_long *starttab, *lengthtab; + byte *rlebuf, *pptr; + byte *lumbuf, *lptr, *longpic; + + xvbzero((char *) &img, sizeof(IMAGE)); +- ++ + /* write header information */ + fwrite(&img, sizeof(IMAGE), (size_t) 1, fp); + fseek(fp, 0L, 0); + ++ if (w <= 0 || h <= 0 || w > 65535 || h > 65535) { ++ SetISTR(ISTR_WARNING, "image dimensions too large for IRIS format"); ++ return -1; ++ } ++ + /* load up header */ + img.imagic = IMAGIC; + img.type = ITYPE_RLE | (1 & BPPMASK); /* RLE, 1 byteperpix */ + img.dim = (colorstyle == F_FULLCOLOR) ? 3 : 2; +- img.xsize = w; +- img.ysize = h; ++ img.xsize = (u_short)w; ++ img.ysize = (u_short)h; + img.zsize = zsize = (colorstyle == F_FULLCOLOR) ? 3 : 1; + img.min = 0; + img.max = 255; +@@ -537,22 +574,33 @@ + if (ferror(fp)) { fclose(fp); return -1; } + + /* allocate RLE compression tables & stuff */ +- rlebuflen = 2*w + 10; +- tablen = h * zsize; ++ rlebuflen = 2*w + 10; /* 10 <= rlebuflen <= 131080 */ ++ tablen = h * zsize; /* 1 <= tablen <= 196605 */ + ++ /* no overflow is possible with any of these (given check on w,h above): */ + starttab = (u_long *) malloc((size_t) tablen * sizeof(long)); + lengthtab = (u_long *) malloc((size_t) tablen * sizeof(long)); + rlebuf = (byte *) malloc((size_t) rlebuflen); +- lumbuf = (byte *) malloc((size_t) w * 4); ++ lumbuf = (byte *) malloc((size_t) w * 4); /* 262140 max */ + +- if (!starttab || !lengthtab || !rlebuf || !lumbuf) ++ if (!starttab || !lengthtab || !rlebuf || !lumbuf) + FatalError("out of memory in WriteIRIS()"); + + pos = 512 + 2 * (tablen * 4); + fseek(fp, (long) pos, 0); + + /* convert image into 4-byte per pix image that the compress routines want */ +- longpic = (byte *) malloc((size_t) w * h * 4); ++ npixels = w * h; ++ bufsize = 4 * npixels; ++ if (npixels/w != h || bufsize/4 != npixels) { ++ SetISTR(ISTR_WARNING, "can't malloc longpic in WriteIRIS()"); ++ free(starttab); ++ free(lengthtab); ++ free(rlebuf); ++ free(lumbuf); ++ return -1; ++ } ++ longpic = (byte *) malloc((size_t) bufsize); + if (!longpic) FatalError("couldn't malloc longpic in WriteIRIS()"); + + for (i=0, pptr=pic; i<h; i++) { +@@ -574,7 +622,7 @@ + } + } + } +- ++ + + + /* compress and write the data */ +@@ -584,12 +632,13 @@ + if (zsize == 1) { + lumrow(lptr, lumbuf, w); + len = compressrow(lumbuf, rlebuf, CHANOFFSET(j), w); +- } ++ } + else { + len = compressrow(lptr, rlebuf, CHANOFFSET(j), w); + } + + if (len > rlebuflen) { ++ /* this condition shouldn't kill XV, just abort writing the image */ + FatalError("WriteIRIS: rlebuf is too small"); + exit(1); + } +@@ -618,10 +667,10 @@ + + return 0; + } +- ++ + + /*************************************/ +-static void lumrow(rgbptr, lumptr, n) ++static void lumrow(rgbptr, lumptr, n) + byte *rgbptr, *lumptr; + int n; + { +@@ -640,7 +689,7 @@ + int z, cnt; + { + byte *iptr, *ibufend, *sptr, *optr; +- short todo, cc; ++ short todo, cc; + long count; + + lbuf += z; +@@ -685,7 +734,7 @@ + cc = *iptr; + iptr += 4; + while ((iptr<ibufend) && (*iptr == cc)) iptr += 4; +- ++ + count = (iptr-sptr)/4; + while (count) { + todo = count>126 ? 126:count; +@@ -694,7 +743,7 @@ + *optr++ = cc; + } + } +- ++ + *optr++ = 0; + return (optr - rlebuf); + } +diff -ruN xv-3.10a/xvjpeg.c xv-3.10a-bugfixes/xvjpeg.c +--- xv-3.10a/xvjpeg.c 1995-01-05 00:17:13.000000000 -0800 ++++ xv-3.10a-bugfixes/xvjpeg.c 2005-03-27 16:23:06.000000000 -0800 +@@ -35,7 +35,7 @@ + This is currently hardcoded to be twice the size of a schnauzer icon, as + the schnauzer's the only thing that does a quick load... */ + +-#define QUICKWIDE 160 ++#define QUICKWIDE 160 + #define QUICKHIGH 120 + + struct my_error_mgr { +@@ -80,28 +80,26 @@ + /***************************************************/ + void CreateJPEGW() + { +- XClassHint classh; +- + jpegW = CreateWindow("xv jpeg","XVjpeg",NULL,JWIDE,JHIGH,infofg,infobg,0); + if (!jpegW) FatalError("can't create jpeg window!"); +- ++ + XSelectInput(theDisp, jpegW, ExposureMask | ButtonPressMask | KeyPressMask); +- +- DCreate(&qDial, jpegW, 10, 10, 80, 100, 1, 100, 75, 5, ++ ++ DCreate(&qDial, jpegW, 10, 10, 80, 100, 1, 100, 75, 5, + infofg, infobg, hicol, locol, "Quality", "%"); +- +- DCreate(&smDial, jpegW, 120, 10, 80, 100, 0, 100, 0, 5, ++ ++ DCreate(&smDial, jpegW, 120, 10, 80, 100, 0, 100, 0, 5, + infofg, infobg, hicol, locol, "Smoothing", "%"); +- +- BTCreate(&jbut[J_BOK], jpegW, JWIDE-180-1, JHIGH-10-BUTTH-1, 80, BUTTH, ++ ++ BTCreate(&jbut[J_BOK], jpegW, JWIDE-180-1, JHIGH-10-BUTTH-1, 80, BUTTH, + "Ok", infofg, infobg, hicol, locol); +- +- BTCreate(&jbut[J_BCANC], jpegW, JWIDE-90-1, JHIGH-10-BUTTH-1, 80, BUTTH, ++ ++ BTCreate(&jbut[J_BCANC], jpegW, JWIDE-90-1, JHIGH-10-BUTTH-1, 80, BUTTH, + "Cancel", infofg, infobg, hicol, locol); +- ++ + XMapSubwindows(theDisp, jpegW); + } +- ++ + + /***************************************************/ + void JPEGDialog(vis) +@@ -122,32 +120,32 @@ + { + /* check event to see if it's for one of our subwindows. If it is, + deal accordingly, and return '1'. Otherwise, return '0' */ +- ++ + int rv; + rv = 1; +- ++ + if (!jpegUp) return 0; +- ++ + if (xev->type == Expose) { + int x,y,w,h; + XExposeEvent *e = (XExposeEvent *) xev; + x = e->x; y = e->y; w = e->width; h = e->height; +- ++ + /* throw away excess expose events for 'dumb' windows */ +- if (e->count > 0 && (e->window == qDial.win || ++ if (e->count > 0 && (e->window == qDial.win || + e->window == smDial.win)) {} +- ++ + else if (e->window == jpegW) drawJD(x, y, w, h); + else if (e->window == qDial.win) DRedraw(&qDial); + else if (e->window == smDial.win) DRedraw(&smDial); + else rv = 0; + } +- ++ + else if (xev->type == ButtonPress) { + XButtonEvent *e = (XButtonEvent *) xev; + int x,y; + x = e->x; y = e->y; +- ++ + if (e->button == Button1) { + if (e->window == jpegW) clickJD(x,y); + else if (e->window == qDial.win) DTrack(&qDial, x,y); +@@ -156,18 +154,18 @@ + } /* button1 */ + else rv = 0; + } /* button press */ +- +- ++ ++ + else if (xev->type == KeyPress) { + XKeyEvent *e = (XKeyEvent *) xev; + char buf[128]; KeySym ks; + int stlen; +- ++ + stlen = XLookupString(e,buf,128,&ks,(XComposeStatus *) NULL); + buf[stlen] = '\0'; +- ++ + RemapKeyCheck(ks, buf, &stlen); +- ++ + if (e->window == jpegW) { + if (stlen) { + if (buf[0] == '\r' || buf[0] == '\n') { /* enter */ +@@ -181,12 +179,12 @@ + else rv = 0; + } + else rv = 0; +- ++ + if (rv==0 && (xev->type == ButtonPress || xev->type == KeyPress)) { + XBell(theDisp, 50); + rv = 1; /* eat it */ + } +- ++ + return rv; + } + +@@ -211,17 +209,17 @@ + char *title3 = "quality = bigger file."; + char *title4 = "Use smoothing if saving"; + char *title5 = "an 8-bit image (eg, a GIF)."; +- ++ + char *qtitle1 = "Default = 75."; + char *qtitle2 = "Useful range"; + char *qtitle3 = "is 5-95."; + char *smtitle1 = "Default = 0 (none)."; + char *smtitle2 = "10-30 is enough"; + char *smtitle3 = "for typical GIFs."; +- ++ + int i; + XRectangle xr; +- ++ + xr.x = x; xr.y = y; xr.width = w; xr.height = h; + XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted); + +@@ -240,11 +238,11 @@ + DrawString(jpegW, 15, 10+100+10+ASCENT, qtitle1); + DrawString(jpegW, 15, 10+100+10+ASCENT+LINEHIGH, qtitle2); + DrawString(jpegW, 15, 10+100+10+ASCENT+LINEHIGH*2, qtitle3); +- ++ + DrawString(jpegW, 115, 10+100+10+ASCENT+LINEHIGH*0, smtitle1); + DrawString(jpegW, 115, 10+100+10+ASCENT+LINEHIGH*1, smtitle2); + DrawString(jpegW, 115, 10+100+10+ASCENT+LINEHIGH*2, smtitle3); +- ++ + XSetClipMask(theDisp, theGC, None); + } + +@@ -255,14 +253,14 @@ + { + int i; + BUTT *bp; +- ++ + /* check BUTTs */ +- ++ + for (i=0; i<J_NBUTTS; i++) { + bp = &jbut[i]; + if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break; + } +- ++ + if (i<J_NBUTTS) { /* found one */ + if (BTTrack(bp)) doCmd(i); + } +@@ -281,7 +279,7 @@ + + writeJPEG(); + JPEGDialog(0); +- ++ + fullname = GetDirFullName(); + if (!ISPIPE(fullname[0])) { + XVCreatedFile(fullname); +@@ -304,7 +302,7 @@ + static void writeJPEG() + { + FILE *fp; +- int i, nc, rv, w, h, ptype, pfree; ++ int i, nc, rv, w, h, npixels, ptype, pfree; + register byte *ip, *ep; + byte *inpix, *rmap, *gmap, *bmap; + byte *image8, *image24; +@@ -322,6 +320,14 @@ + WaitCursor(); + inpix = GenSavePic(&ptype, &w, &h, &pfree, &nc, &rmap, &gmap, &bmap); + ++ /* this case may not be possible to trigger, but not totally clear, so... */ ++ npixels = w*h; ++ if (w <= 0 || h <= 0 || npixels/w < h) { ++ SetISTR(ISTR_WARNING, "%s: image dimensions too large (%dx%d)", ++ fbasename, w, h); ++ return; ++ } ++ + image8 = image24 = (byte *) NULL; + + +@@ -332,37 +338,46 @@ + if (i==nc) colorType = F_GREYSCALE; /* made it all the way through */ + } + else { /* PIC24 */ +- for (i=0,ip=inpix; i<w*h && ip[0]==ip[1] && ip[1]==ip[2]; i++,ip+=3); +- if (i==w*h) colorType = F_GREYSCALE; /* all the way through */ ++ for (i=0,ip=inpix; i<npixels && ip[0]==ip[1] && ip[1]==ip[2]; i++,ip+=3); ++ if (i==npixels) colorType = F_GREYSCALE; /* all the way through */ + } + } +- +- ++ ++ + /* first thing to do is build an 8/24-bit Greyscale/TrueColor image + (meaning: non-colormapped) */ +- ++ + if (colorType == F_GREYSCALE) { /* build an 8-bit Greyscale image */ +- image8 = (byte *) malloc((size_t) w * h); ++ image8 = (byte *) malloc((size_t) npixels); + if (!image8) FatalError("writeJPEG: unable to malloc image8\n"); +- ++ + if (ptype == PIC8) { +- for (i=0,ip=image8,ep=inpix; i<w * h; i++, ip++, ep++) ++ for (i=0,ip=image8,ep=inpix; i<npixels; i++, ip++, ep++) + *ip = MONO(rmap[*ep], gmap[*ep], bmap[*ep]); + } + else { /* PIC24 */ +- for (i=0,ip=image8,ep=inpix; i<w*h; i++, ip++, ep+=3) ++ for (i=0,ip=image8,ep=inpix; i<npixels; i++, ip++, ep+=3) + *ip = MONO(ep[0],ep[1],ep[2]); + } + } + + else { /* *not* F_GREYSCALE */ + if (ptype == PIC8) { +- image24 = (byte *) malloc((size_t) w * h * 3); ++ int count = 3*npixels; ++ ++ /* already know npixels > 0 (above) */ ++ if (count/3 < npixels) { ++ SetISTR(ISTR_WARNING, "%s: image dimensions too large (%dx%d)", ++ fbasename, w, h); ++ return; ++ } ++ ++ image24 = (byte *) malloc((size_t) count); + if (!image24) { /* this simply isn't going to work */ + FatalError("writeJPEG: unable to malloc image24\n"); + } + +- for (i=0, ip=image24, ep=inpix; i<w*h; i++, ep++) { ++ for (i=0, ip=image24, ep=inpix; i<npixels; i++, ep++) { + *ip++ = rmap[*ep]; + *ip++ = gmap[*ep]; + *ip++ = bmap[*ep]; +@@ -374,16 +389,16 @@ + } + } + +- ++ + /* in any event, we've got some valid image. Do the JPEG Thing */ + rv = writeJFIF(fp, (colorType==F_GREYSCALE) ? image8 : image24, + w, h, colorType); +- ++ + if (colorType == F_GREYSCALE) free(image8); + else if (ptype == PIC8) free(image24); + + if (pfree) free(inpix); +- ++ + if (CloseOutFile(fp, filename, rv) == 0) DirBox(0); + SetCursors(-1); + } +@@ -400,7 +415,7 @@ + + + /**************************************************/ +-METHODDEF void xv_error_exit(cinfo) ++METHODDEF void xv_error_exit(cinfo) + j_common_ptr cinfo; + { + my_error_ptr myerr; +@@ -412,7 +427,7 @@ + + + /**************************************************/ +-METHODDEF void xv_error_output(cinfo) ++METHODDEF void xv_error_output(cinfo) + j_common_ptr cinfo; + { + my_error_ptr myerr; +@@ -464,7 +479,7 @@ + FILE *fp; + static byte *pic; + long filesize; +- int i,w,h,bperpix; ++ int i,w,h,bperpix,bperline,count; + + + fbasename = BaseName(fname); +@@ -546,16 +561,16 @@ + if (cinfo.jpeg_color_space == JCS_GRAYSCALE) { + cinfo.out_color_space = JCS_GRAYSCALE; + cinfo.quantize_colors = FALSE; +- ++ + SetISTR(ISTR_INFO,"Loading %dx%d Greyscale JPEG (%ld bytes)...", + w,h,filesize); +- ++ + for (i=0; i<256; i++) pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i; + } + else { + cinfo.out_color_space = JCS_RGB; + cinfo.quantize_colors = FALSE; /* default: give 24-bit image to XV */ +- ++ + if (!quick && picType==PIC8 && conv24MB.flags[CONV24_LOCK] == 1) { + /* + * we're locked into 8-bit mode: +@@ -563,23 +578,23 @@ + * if CONV24_SLOW, use JPEG's two-pass quantizer + * if CONV24_BEST, or other, ask for 24-bit image and hand it to XV + */ +- ++ + cinfo.desired_number_of_colors = 256; +- ++ + if (conv24 == CONV24_FAST || conv24 == CONV24_SLOW) { + cinfo.quantize_colors = TRUE; + state824=1; /* image was converted from 24 to 8 bits */ +- ++ + cinfo.two_pass_quantize = (conv24 == CONV24_SLOW); + } + } +- ++ + SetISTR(ISTR_INFO,"Loading %dx%d Color JPEG (%ld bytes)...", + w,h,filesize); + } +- ++ + jpeg_calc_output_dimensions(&cinfo); /* note colorspace changes... */ +- ++ + + if (cinfo.output_components != 1 && cinfo.output_components != 3) { + SetISTR(ISTR_WARNING, "%s: can't read %d-plane JPEG file!", +@@ -594,7 +609,18 @@ + bperpix = cinfo.output_components; + pinfo->type = (bperpix == 1) ? PIC8 : PIC24; + +- pic = (byte *) malloc((size_t) (w * h * bperpix)); ++ bperline = w * bperpix; ++ count = h * bperline; ++ if (w <= 0 || h <= 0 || bperline/w < bperpix || count/h < bperline) { ++ SetISTR(ISTR_WARNING, "%s: image dimensions too large (%dx%d)", ++ fbasename, w, h); ++ jpeg_destroy_decompress(&cinfo); ++ fclose(fp); ++ if (comment) free(comment); ++ return 0; ++ } ++ ++ pic = (byte *) malloc((size_t) count); + if (!pic) { + SetISTR(ISTR_WARNING, "%s: can't read JPEG file - out of memory", + fbasename); +@@ -603,15 +629,24 @@ + if (comment) free(comment); + return 0; + } +- ++ + jpeg_start_decompress(&cinfo); + + while (cinfo.output_scanline < cinfo.output_height) { ++ if (cinfo.output_scanline < 0) { /* should never happen, but... */ ++ SetISTR(ISTR_WARNING, "%s: invalid negative scanline (%d)", ++ fbasename, cinfo.output_scanline); ++ jpeg_destroy_decompress(&cinfo); ++ fclose(fp); ++ if (comment) free(comment); ++ free(pic); ++ return 0; ++ } + rowptr[0] = (JSAMPROW) &pic[cinfo.output_scanline * w * bperpix]; + (void) jpeg_read_scanlines(&cinfo, rowptr, (JDIMENSION) 1); + } + +- ++ + + /* return 'PICINFO' structure to XV */ + +@@ -623,7 +658,7 @@ + if (cinfo.out_color_space == JCS_GRAYSCALE) { + sprintf(pinfo->fullInfo, "Greyscale JPEG. (%ld bytes)", filesize); + pinfo->colType = F_GREYSCALE; +- ++ + for (i=0; i<256; i++) pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i; + } + else { +@@ -638,10 +673,10 @@ + } + } + } +- +- sprintf(pinfo->shrtInfo, "%dx%d %s JPEG. ", w,h, ++ ++ sprintf(pinfo->shrtInfo, "%dx%d %s JPEG. ", w,h, + (cinfo.out_color_space == JCS_GRAYSCALE) ? "Greyscale " : "Color "); +- ++ + pinfo->comment = comment; + + jpeg_finish_decompress(&cinfo); +@@ -651,8 +686,8 @@ + comment = (char *) NULL; + return 1; + } +- +- ++ ++ + + + /**************************************************/ +@@ -660,7 +695,7 @@ + j_decompress_ptr cinfo; + { + struct jpeg_source_mgr *datasrc = cinfo->src; +- ++ + if (datasrc->bytes_in_buffer == 0) { + if (! (*datasrc->fill_input_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); +@@ -688,7 +723,7 @@ + } + else comment = (char *) realloc(comment, strlen(comment) + length + 1); + if (!comment) FatalError("out of memory in xv_process_comment"); +- ++ + oldsp = sp = comment + strlen(comment); + hasnull = 0; + +@@ -770,19 +805,19 @@ + + sprintf(xvcmt, "%sXV %s Quality = %d, Smoothing = %d\n", + CREATOR_STR, REVDATE, qDial.val, smDial.val); +- ++ + if (picComments) { /* append XV comment */ + char *sp, *sp1; int done; + + i = strlen(picComments); + comment = (char *) malloc(i + strlen(xvcmt) + 2 + 1); + if (!comment) FatalError("out of memory in writeJFIF()"); +- ++ + strcpy(comment, picComments); +- ++ + /* see if there's a line that starts with 'CREATOR: ' in the + comments. If there is, rip it out. */ +- ++ + sp = comment; done = 0; + while (!done && *sp) { + if (strncmp(sp, CREATOR_STR, strlen(CREATOR_STR)) == 0) { +@@ -801,7 +836,7 @@ + } + } + +- /* count # of \n's at end of comment. ++ /* count # of \n's at end of comment. + If none, add 2. If one, add 1. If two or more, add none. */ + + sp = comment + strlen(comment); +@@ -814,15 +849,15 @@ + strcat(comment, xvcmt); + } + else comment = xvcmt; +- +- ++ ++ + jpeg_write_marker(&cinfo,JPEG_COM,(byte *) comment,(u_int) strlen(comment)); +- ++ + while (cinfo.next_scanline < cinfo.image_height) { + rowptr[0] = (JSAMPROW) &pic[cinfo.next_scanline * w * bperpix]; + (void) jpeg_write_scanlines(&cinfo, rowptr, (JDIMENSION) 1); + } +- ++ + jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); + return 0; +diff -ruN xv-3.10a/xvmisc.c xv-3.10a-bugfixes/xvmisc.c +--- xv-3.10a/xvmisc.c 1995-01-13 15:41:34.000000000 -0800 ++++ xv-3.10a-bugfixes/xvmisc.c 2005-03-20 22:47:06.000000000 -0800 +@@ -28,6 +28,8 @@ + * int xvbcmp (s1, s2, length) + * void xvbzero(s, length) + * char *xv_strstr(s1, s2) ++ * FILE *xv_fopen(str, str) ++ * void xv_mktemp(str) + * void Timer(milliseconds) + */ + +@@ -36,6 +38,10 @@ + #define NEEDSTIME + #include "xv.h" + ++#ifdef __linux__ /* probably others, too, but being conservative */ ++# include <unistd.h> /* getwd() */ ++#endif ++ + #include "bits/fc_left" + #include "bits/fc_leftm" + #include "bits/fc_left1" +@@ -61,12 +67,12 @@ + + /* the following fakes 'XSetWMProtocols(theDisp, win, &atom_DELWIN, 1);' */ + +- if (! atom_PROTOCOLS) ++ if (! atom_PROTOCOLS) + atom_PROTOCOLS = XInternAtom (theDisp, "WM_PROTOCOLS", False); + + if (atom_PROTOCOLS == None) return; + +- XChangeProperty(theDisp, win, atom_PROTOCOLS, XA_ATOM, 32, ++ XChangeProperty(theDisp, win, atom_PROTOCOLS, XA_ATOM, 32, + PropModeReplace, (unsigned char *) &atom_DELWIN, 1); + } + +@@ -91,9 +97,9 @@ + x = y = 1; + i = XParseGeometry(geom,&x,&y, (unsigned int *) &w, (unsigned int *) &h); + +- if ((i&XValue || i&YValue)) hints.flags = USPosition; ++ if ((i&XValue || i&YValue)) hints.flags = USPosition; + else hints.flags = PPosition; +- ++ + if (!usesize || !(i&WidthValue)) w = defw; + if (!usesize || !(i&HeightValue)) h = defh; + +@@ -130,7 +136,7 @@ + xswamask = CWBackPixel | CWBorderPixel | CWColormap; + if (!usesize) xswamask |= CWBitGravity; + +- win = XCreateWindow(theDisp, rootW, x, y, (u_int) w, (u_int) h, ++ win = XCreateWindow(theDisp, rootW, x, y, (u_int) w, (u_int) h, + (u_int) bwidth, (int) dispDEEP, InputOutput, + theVisual, xswamask, &xswa); + if (!win) return(win); /* leave immediately if couldn't create */ +@@ -152,7 +158,7 @@ + + return(win); + } +- ++ + + + /**************************************************/ +@@ -164,7 +170,7 @@ + XDrawString(theDisp, win, theGC, x, y, str, (int) strlen(str)); + } + +- ++ + /**************************************************/ + void CenterString(win,x,y,str) + Window win; +@@ -174,7 +180,7 @@ + DrawString(win, CENTERX(mfinfo, x, str), CENTERY(mfinfo, y), str); + } + +- ++ + /**************************************************/ + void ULineString(win,x,y,str) + Window win; +@@ -182,11 +188,11 @@ + char *str; + { + DrawString(win, x, y, str); +- XDrawLine(theDisp, win, theGC, x, y+DESCENT-1, ++ XDrawLine(theDisp, win, theGC, x, y+DESCENT-1, + x+StringWidth(str), y+DESCENT-1); + } + +- ++ + /**************************************************/ + int StringWidth(str) + char *str; +@@ -194,13 +200,13 @@ + return(XTextWidth(mfinfo, str, (int) strlen(str))); + } + +- ++ + /**************************************************/ + int CursorKey(ks, shift, dotrans) + KeySym ks; + int shift, dotrans; + { +- /* called by the KeyPress/KeyRelease event handler to determine if a ++ /* called by the KeyPress/KeyRelease event handler to determine if a + given keypress is a cursor key. More complex than you'd think, since + certain Sun Keyboards generate a variety of odd keycodes, and not all + keyboards *have* all these keys. Note that 'shifted' arrow keys +@@ -225,16 +231,16 @@ + + int i = CK_NONE; + +- if (ks==XK_Up || ks==XK_KP_Up || ++ if (ks==XK_Up || ks==XK_KP_Up || + ks==XK_KP_8 || ks==XK_F28) i=CK_UP; + +- else if (ks==XK_Down || ks==XK_KP_Down || ++ else if (ks==XK_Down || ks==XK_KP_Down || + ks==XK_KP_2 || ks==XK_F34) i=CK_DOWN; + +- else if (ks==XK_Left || ks==XK_KP_Left || ++ else if (ks==XK_Left || ks==XK_KP_Left || + ks==XK_KP_4 || ks==XK_F30) i=CK_LEFT; + +- else if (ks==XK_Right || ks==XK_KP_Right || ++ else if (ks==XK_Right || ks==XK_KP_Right || + ks==XK_KP_6 || ks==XK_F32) i=CK_RIGHT; + + else if (ks==XK_Prior || ks==XK_KP_Prior || +@@ -257,7 +263,7 @@ + else if (i==CK_UP) i=CK_PAGEUP; + else if (i==CK_DOWN) i=CK_PAGEDOWN; + } +- ++ + return i; + } + +@@ -334,9 +340,9 @@ + ev.window = win; + ev.x = x; ev.y = y; ev.width = w; ev.height = h; + ev.count = 0; +- ++ + XSendEvent(theDisp, win, False, NoEventMask, (XEvent *) &ev); +-} ++} + + + /***********************************/ +@@ -381,7 +387,7 @@ + u_int w, h; + u_long bg; + { +- /* stipple a rectangular region by drawing 'bg' where there's 1's ++ /* stipple a rectangular region by drawing 'bg' where there's 1's + in the stipple pattern */ + + XSetFillStyle (theDisp, theGC, FillStippled); +@@ -400,7 +406,7 @@ + unsigned int w,h; + unsigned long hi, lo, bg; + { +- int i,r,x1,y1; ++ int i, x1, y1; + + x1 = x + (int) w; + y1 = y + (int) h; +@@ -413,7 +419,7 @@ + XDrawLine(theDisp, win, theGC, x+i, y1-i, x+i, y+i); + XDrawLine(theDisp, win, theGC, x+i, y+i, x1-i, y+i); + } +- ++ + /* draw bot-right */ + XSetForeground(theDisp, theGC, (inout==R3D_OUT) ? lo : hi); + +@@ -431,18 +437,18 @@ + } + } + } +- ++ + + + /**************************************************/ + void SetCropString() + { + /* sets the crop string in the info box to be correct. should +- be called whenever 'but[BCROP].active', cXOFF,cYOFF,cWIDE,cHIGH ++ be called whenever 'but[BCROP].active', cXOFF,cYOFF,cWIDE,cHIGH + are changed */ + +- if (cpic != pic) +- SetISTR(ISTR_CROP, "%dx%d rectangle starting at %d,%d", ++ if (cpic != pic) ++ SetISTR(ISTR_CROP, "%dx%d rectangle starting at %d,%d", + cWIDE, cHIGH, cXOFF, cYOFF); + else SetISTR(ISTR_CROP, "<none>"); + } +@@ -469,7 +475,7 @@ + char *st; + + /* give 'em time to read message */ +- if (infoUp || ctrlUp || anyBrowUp) sleep(3); ++ if (infoUp || ctrlUp || anyBrowUp) sleep(3); + else { + st = GetISTR(ISTR_INFO); + OpenAlert(st); +@@ -477,7 +483,7 @@ + CloseAlert(); + } + } +- ++ + + /***********************************/ + void FatalError (identifier) +@@ -491,7 +497,7 @@ + /***********************************/ + void Quit(i) + int i; +-{ ++{ + /* called when the program exits. frees everything explictly created + EXCEPT allocated colors. This is used when 'useroot' is in operation, + as we have to keep the alloc'd colors around, but we don't want anything +@@ -521,9 +527,9 @@ + #endif + + /* if NOT using stdcmap for images, free stdcmap */ +- if (colorMapMode != CM_STDCMAP) { ++ if (colorMapMode != CM_STDCMAP) { + int j; +- for (j=0; j<stdnfcols; j++) ++ for (j=0; j<stdnfcols; j++) + xvFreeColors(theDisp, theCmap, &stdfreecols[j], 1, 0L); + } + +@@ -543,13 +549,13 @@ + if (origlist[j][0] != '/') { /* relative path, prepend 'initdir' */ + sprintf(str,"%s/%s", initdir, origlist[j]); + if (unlink(str)) { +- fprintf(stderr,"%s: can't delete '%s' - %s\n", ++ fprintf(stderr,"%s: can't delete '%s' - %s\n", + cmd, str, ERRSTR(errno)); + } + } + else { + if (unlink(origlist[j])) { +- fprintf(stderr,"%s: can't delete '%s' - %s\n", ++ fprintf(stderr,"%s: can't delete '%s' - %s\n", + cmd, origlist[j], ERRSTR(errno)); + } + } +@@ -567,7 +573,7 @@ + void LoadFishCursors() + { + #define fc_w 16 +-#define fc_h 16 ++#define fc_h 16 + + Pixmap flpix,flmpix,fmpix,fmmpix,frpix,frmpix; + Pixmap fl1pix, fl1mpix, fr1pix, fr1mpix; +@@ -592,7 +598,7 @@ + + fr1pix = XCreatePixmapFromBitmapData(theDisp, ctrlW, (char *) fc_right1_bits, + fc_w, fc_h, 1L, 0L, 1); +- fr1mpix = XCreatePixmapFromBitmapData(theDisp, ctrlW, ++ fr1mpix = XCreatePixmapFromBitmapData(theDisp, ctrlW, + (char *) fc_right1m_bits, + fc_w, fc_h, 1L, 0L, 1); + +@@ -613,7 +619,7 @@ + fr1curs= XCreatePixmapCursor(theDisp, fr1pix,fr1mpix,&fg, &bg, 8,8); + frcurs = XCreatePixmapCursor(theDisp, frpix, frmpix, &fg, &bg, 8,8); + +- if (!flcurs || !fmcurs || !frcurs || !fl1curs || !fr1curs) ++ if (!flcurs || !fmcurs || !frcurs || !fl1curs || !fr1curs) + { flcurs = fmcurs = frcurs = (Cursor) NULL; } + } + +@@ -633,8 +639,8 @@ + time(&lastwaittime); + waiting=1; + xwmh.input = True; +- xwmh.icon_pixmap = riconPix; +- xwmh.icon_mask = riconmask; ++ xwmh.icon_pixmap = riconPix; ++ xwmh.icon_mask = riconmask; + xwmh.flags = (InputHint | IconPixmapHint | IconMaskHint) ; + if (!useroot && mainW) XSetWMHints(theDisp, mainW, &xwmh); + if ( useroot && ctrlW) XSetWMHints(theDisp, ctrlW, &xwmh); +@@ -665,8 +671,8 @@ + if (waiting) { + waiting=0; + xwmh.input = True; +- xwmh.icon_pixmap = iconPix; +- xwmh.icon_mask = iconmask; ++ xwmh.icon_pixmap = iconPix; ++ xwmh.icon_mask = iconmask; + xwmh.flags = (InputHint | IconPixmapHint | IconMaskHint) ; + if (!useroot && mainW) XSetWMHints(theDisp, mainW, &xwmh); + if ( useroot && ctrlW) XSetWMHints(theDisp, ctrlW, &xwmh); +@@ -694,11 +700,11 @@ + + XFlush(theDisp); + } +- ++ + + static void set_cursors(mainc, otherc) + Cursor mainc, otherc; +-{ ++{ + if (!useroot && mainW) XDefineCursor(theDisp, mainW, mainc); + if (infoW) XDefineCursor(theDisp, infoW, otherc); + if (ctrlW) XDefineCursor(theDisp, ctrlW, otherc); +@@ -708,11 +714,11 @@ + + SetBrowseCursor(otherc); + SetTextCursor(otherc); +- ++ + #ifdef HAVE_JPEG + if (jpegW) XDefineCursor(theDisp, jpegW, otherc); + #endif +- ++ + #ifdef HAVE_TIFF + if (tiffW) XDefineCursor(theDisp, tiffW, otherc); + #endif +@@ -725,7 +731,7 @@ + { + char *basname; + +- /* given a complete path name ('/foo/bar/weenie.gif'), returns just the ++ /* given a complete path name ('/foo/bar/weenie.gif'), returns just the + 'simple' name ('weenie.gif'). Note that it does not make a copy of + the name, so don't be modifying it... */ + +@@ -736,7 +742,7 @@ + return basname; + } + +- ++ + /***************************************************/ + void DrawTempGauge(win, x,y,w,h, ratio, fg,bg,hi,lo, str) + Window win; +@@ -773,14 +779,14 @@ + if (numchars) { /* do string */ + if (barwide < maxwide) { + XSetForeground(theDisp, theGC, bg); +- XFillRectangle(theDisp, win, theGC, x+3+barwide, y+3, ++ XFillRectangle(theDisp, win, theGC, x+3+barwide, y+3, + (u_int) (maxwide-barwide), (u_int) (h-5)); + } +- ++ + XSetFunction(theDisp, theGC, GXinvert); + XSetPlaneMask(theDisp, theGC, fg ^ bg); + +- XDrawString(theDisp, win, theGC, CENTERX(mfinfo, (x+w/2), str), ++ XDrawString(theDisp, win, theGC, CENTERX(mfinfo, (x+w/2), str), + CENTERY(mfinfo, (y+h/2)), str, numchars); + + XSetFunction(theDisp, theGC, GXcopy); +@@ -789,18 +795,18 @@ + + else if (barwide < maxwide) { + XDrawLine(theDisp,win,theGC,x+3+barwide, y+h/2 + 0, x+w-3, y+h/2 + 0); +- ++ + XSetForeground(theDisp, theGC, lo); + XDrawLine(theDisp,win,theGC,x+3+barwide, y+h/2 + 1, x+w-3, y+h/2 + 1); +- ++ + XSetForeground(theDisp, theGC, hi); + XDrawLine(theDisp,win,theGC,x+3+barwide, y+h/2 + 2, x+w-3, y+h/2 + 2); +- ++ + XSetForeground(theDisp, theGC, bg); +- XFillRectangle(theDisp, win, theGC, x+3+barwide, y+3, ++ XFillRectangle(theDisp, win, theGC, x+3+barwide, y+3, + (u_int) (maxwide-barwide), (u_int) (h/2 - 3)); +- +- XFillRectangle(theDisp, win, theGC, x+3+barwide, y+h/2 + 3, ++ ++ XFillRectangle(theDisp, win, theGC, x+3+barwide, y+h/2 + 3, + (u_int) (maxwide-barwide),(u_int)((h-3) - (h/2+3)) + 1); + } + } +@@ -815,35 +821,35 @@ + if (numchars) { + if (barwide < maxwide) { + XSetForeground(theDisp, theGC, bg); +- XFillRectangle(theDisp, win, theGC, x+1+barwide, y+1, ++ XFillRectangle(theDisp, win, theGC, x+1+barwide, y+1, + (u_int) (maxwide-barwide), (u_int) (h-1)); + } +- ++ + XSetFunction(theDisp, theGC, GXinvert); + XSetPlaneMask(theDisp, theGC, fg ^ bg); + +- XDrawString(theDisp, win, theGC, CENTERX(mfinfo, (x+w/2), str), ++ XDrawString(theDisp, win, theGC, CENTERX(mfinfo, (x+w/2), str), + CENTERY(mfinfo, (y+h/2)), str, numchars); + + XSetFunction(theDisp, theGC, GXcopy); + XSetPlaneMask(theDisp, theGC, AllPlanes); + } +- ++ + else if (barwide < maxwide) { + XDrawLine(theDisp, win, theGC, x+1+barwide, y+h/2, x+w-1, y+h/2); +- ++ + XSetForeground(theDisp, theGC, bg); +- XFillRectangle(theDisp, win, theGC, x+1+barwide, y+1, ++ XFillRectangle(theDisp, win, theGC, x+1+barwide, y+1, + (u_int) (maxwide-barwide), (u_int) (h/2 - 1)); +- +- XFillRectangle(theDisp, win, theGC, x+1+barwide, y+h/2 + 1, ++ ++ XFillRectangle(theDisp, win, theGC, x+1+barwide, y+h/2 + 1, + (u_int)(maxwide-barwide),(u_int)(((h-1) - (h/2+1))+1)); + } + } + + XFlush(theDisp); + } +- ++ + + + /***************************************************/ +@@ -852,7 +858,7 @@ + char *str; + { + /* called during 'long' operations (algorithms, smoothing, etc.) to +- give some indication that the program will ever finish. Draws a ++ give some indication that the program will ever finish. Draws a + temperature gauge in either mainW (if not useRoot), or ctrlW. + Tries to be clever: only draws gauge if it looks like the operation is + going to take more than a few seconds. Calling with val == max removes +@@ -887,7 +893,7 @@ + if (!waiting) { /* not waiting (or not waiting any longer) */ + if (nowTime == lastTime && val<max) return; /* max one draw per second */ + lastTime = nowTime; +- DrawTempGauge(win, xpos, ypos, 100,19, doneness, ++ DrawTempGauge(win, xpos, ypos, 100,19, doneness, + infofg,infobg,hicol,locol,str); + + if (val >= max) { /* remove temp gauge */ +@@ -945,7 +951,7 @@ + */ + + if (src==dst || len<=0) return; /* nothin' to do */ +- ++ + if (src<dst && src+len>dst) { /* do a backward copy */ + src = src + len - 1; + dst = dst + len - 1; +@@ -957,7 +963,7 @@ + for ( ; len>0; len--, src++, dst++) *dst = *src; + } + } +- ++ + + /***************************************************/ + int xvbcmp (s1, s2, len) +@@ -987,7 +993,7 @@ + { + /* gets the current working directory. No trailing '/' */ + +- char *rv; ++ char *rv; + + #ifdef USE_GETCWD + rv = (char *) getcwd(buf, buflen); +@@ -996,7 +1002,7 @@ + #endif + + if (!rv || strlen(rv)==0) { +- if (((rv=(char *) getenv("PWD"))==NULL) && ++ if (((rv=(char *) getenv("PWD"))==NULL) && + ((rv=(char *) getenv("cwd"))==NULL)) rv = "./"; + strcpy(buf, rv); + } +@@ -1006,7 +1012,7 @@ + + /***************************************************/ + +-/* ++/* + * Source code for the "strstr" library routine. + * + * Copyright 1988 Regents of the University of California +@@ -1066,6 +1072,22 @@ + } + + ++/***************************************************/ ++/* GRR 20050320: added actual mk[s]temp() call... */ ++void xv_mktemp(buf, fname) ++ char *buf, *fname; ++{ ++#ifndef VMS ++ sprintf(buf, "%s/%s", tmpdir, fname); ++#else ++ sprintf(buf, "Sys$Disk:[]%s", fname); ++#endif ++#ifdef USE_MKSTEMP ++ close(mkstemp(buf)); ++#else ++ mktemp(buf); ++#endif ++} + + + /*******/ +@@ -1124,7 +1146,7 @@ + { + /* default Timer() method now uses 'select()', which probably works + on all systems *anyhow* (except for VMS...) */ +- ++ + struct timeval time; + + time.tv_sec = usec / 1000000L; +diff -ruN xv-3.10a/xvpbm.c xv-3.10a-bugfixes/xvpbm.c +--- xv-3.10a/xvpbm.c 1995-01-03 13:23:44.000000000 -0800 ++++ xv-3.10a-bugfixes/xvpbm.c 2005-04-03 14:25:28.000000000 -0700 +@@ -115,7 +115,7 @@ + } + + return rv; +-} ++} + + + +@@ -127,15 +127,21 @@ + { + byte *pic8; + byte *pix; +- int i,j,bit,w,h; ++ int i,j,bit,w,h,npixels; ++ ++ w = pinfo->w; ++ h = pinfo->h; + +- w = pinfo->w; h = pinfo->h; +- pic8 = (byte *) calloc((size_t) w * h, (size_t) 1); +- if (!pic8) return pbmError(bname, "couldn't malloc 'pic8'"); ++ npixels = w * h; ++ if (w <= 0 || h <= 0 || npixels/w != h) ++ return pbmError(bname, "image dimensions too large"); ++ ++ pic8 = (byte *) calloc((size_t) npixels, (size_t) 1); ++ if (!pic8) FatalError("couldn't malloc 'pic8' for PBM"); + + pinfo->pic = pic8; + pinfo->type = PIC8; +- sprintf(pinfo->fullInfo, "PBM, %s format. (%ld bytes)", ++ sprintf(pinfo->fullInfo, "PBM, %s format. (%ld bytes)", + (raw) ? "raw" : "ascii", filesize); + sprintf(pinfo->shrtInfo, "%dx%d PBM.", w, h); + pinfo->colType = F_BWDITHER; +@@ -153,7 +159,7 @@ + for (j=0; j<w; j++, pix++) *pix = getbit(fp, pinfo); + } + +- if (numgot != w*h) pbmError(bname, TRUNCSTR); ++ if (numgot != npixels) pbmError(bname, TRUNCSTR); + if (garbage) { + return(pbmError(bname, "Garbage characters in image data.")); + } +@@ -192,17 +198,23 @@ + int raw, maxv; + { + byte *pix, *pic8; +- int i,j,bitshift,w,h, holdmaxv; ++ int i,j,bitshift,w,h,npixels, holdmaxv; ++ + ++ w = pinfo->w; ++ h = pinfo->h; + +- w = pinfo->w; h = pinfo->h; +- pic8 = (byte *) calloc((size_t) w*h, (size_t) 1); +- if (!pic8) return(pbmError(bname, "couldn't malloc 'pic8'")); ++ npixels = w * h; ++ if (w <= 0 || h <= 0 || npixels/w != h) ++ return pbmError(bname, "image dimensions too large"); ++ ++ pic8 = (byte *) calloc((size_t) npixels, (size_t) 1); ++ if (!pic8) FatalError("couldn't malloc 'pic8' for PGM"); + + + pinfo->pic = pic8; + pinfo->type = PIC8; +- sprintf(pinfo->fullInfo, "PGM, %s format. (%ld bytes)", ++ sprintf(pinfo->fullInfo, "PGM, %s format. (%ld bytes)", + (raw) ? "raw" : "ascii", filesize); + sprintf(pinfo->shrtInfo, "%dx%d PGM.", pinfo->w, pinfo->h); + pinfo->colType = F_GREYSCALE; +@@ -236,11 +248,11 @@ + } + } + else { +- numgot = fread(pic8, (size_t) 1, (size_t) w*h, fp); /* read raw data */ ++ numgot = fread(pic8, (size_t)1, (size_t)npixels, fp); /* read raw data */ + } + } + +- if (numgot != w*h) pbmError(bname, TRUNCSTR); /* warning only */ ++ if (numgot != npixels) pbmError(bname, TRUNCSTR); /* warning only */ + + if (garbage) { + return (pbmError(bname, "Garbage characters in image data.")); +@@ -256,18 +268,24 @@ + PICINFO *pinfo; + int raw, maxv; + { +- byte *pix, *pic24, scale[256], *pic8; +- int i,j,bitshift, w, h, holdmaxv; ++ byte *pix, *pic24, scale[256]; ++ int i,j,bitshift, w, h, npixels, bufsize, holdmaxv; ++ ++ w = pinfo->w; ++ h = pinfo->h; + +- w = pinfo->w; h = pinfo->h; ++ npixels = w * h; ++ bufsize = 3*npixels; ++ if (w <= 0 || h <= 0 || npixels/w != h || bufsize/3 != npixels) ++ return pbmError(bname, "image dimensions too large"); + + /* allocate 24-bit image */ +- pic24 = (byte *) calloc((size_t) w*h*3, (size_t) 1); +- if (!pic24) FatalError("couldn't malloc 'pic24'"); ++ pic24 = (byte *) calloc((size_t) bufsize, (size_t) 1); ++ if (!pic24) FatalError("couldn't malloc 'pic24' for PPM"); + + pinfo->pic = pic24; + pinfo->type = PIC24; +- sprintf(pinfo->fullInfo, "PPM, %s format. (%ld bytes)", ++ sprintf(pinfo->fullInfo, "PPM, %s format. (%ld bytes)", + (raw) ? "raw" : "ascii", filesize); + sprintf(pinfo->shrtInfo, "%dx%d PPM.", w, h); + pinfo->colType = F_FULLCOLOR; +@@ -297,20 +315,20 @@ + } + } + else { +- numgot = fread(pic24, (size_t) 1, (size_t) w*h*3, fp); /* read data */ ++ numgot = fread(pic24, (size_t) 1, (size_t) bufsize, fp); /* read data */ + } + } +- +- if (numgot != w*h*3) pbmError(bname, TRUNCSTR); ++ ++ if (numgot != bufsize) pbmError(bname, TRUNCSTR); + + if (garbage) + return(pbmError(bname, "Garbage characters in image data.")); + + +- /* have to scale all RGB values up (Conv24to8 expects RGB values to +- range from 0-255 */ ++ /* have to scale up all RGB values (Conv24to8 expects RGB values to ++ range from 0-255) */ + +- if (maxv<255) { ++ if (maxv<255) { + for (i=0; i<=maxv; i++) scale[i] = (i * 255) / maxv; + + for (i=0, pix=pic24; i<h; i++) { +@@ -360,8 +378,8 @@ + pinfo->comment[0] = '\0'; + } + else { +- tmpptr = (char *) realloc(pinfo->comment, +- strlen(pinfo->comment) + strlen(cmt) + 1); ++ tmpptr = (char *) realloc(pinfo->comment, ++ strlen(pinfo->comment) + strlen(cmt) + 1); + if (!tmpptr) FatalError("realloc failure in xvpbm.c getint"); + pinfo->comment = tmpptr; + } +@@ -445,8 +463,8 @@ + pinfo->comment[0] = '\0'; + } + else { +- tmpptr = (char *) realloc(pinfo->comment, +- strlen(pinfo->comment) + strlen(cmt) + 1); ++ tmpptr = (char *) realloc(pinfo->comment, ++ strlen(pinfo->comment) + strlen(cmt) + 1); + if (!tmpptr) FatalError("realloc failure in xvpbm.c getint"); + pinfo->comment = tmpptr; + } +@@ -490,7 +508,7 @@ + char *comment; + { + /* writes a PBM/PGM/PPM file to the already open stream +- if (raw), writes as RAW bytes, otherwise writes as ASCII ++ if (raw), writes as RAW bytes, otherwise writes as ASCII + 'colorstyle' single-handedly determines the type of file written + if colorstyle==0, (Full Color) a PPM file is written + if colorstyle==1, (Greyscale) a PGM file is written +@@ -546,7 +564,7 @@ + } + } + else { +- if (ptype==PIC8) ++ if (ptype==PIC8) + fprintf(fp,"%3d %3d %3d ",rmap[*pix], gmap[*pix], bmap[*pix]); + else + fprintf(fp,"%3d %3d %3d ",pix[0], pix[1], pix[2]); +@@ -554,7 +572,7 @@ + len+=12; + if (len>58) { fprintf(fp,"\n"); len=0; } + } +- ++ + pix += (ptype==PIC24) ? 3 : 1; + } + } +@@ -626,10 +644,3 @@ + + return 0; + } +- +- +- +- +- +- +- +diff -ruN xv-3.10a/xvpcx.c xv-3.10a-bugfixes/xvpcx.c +--- xv-3.10a/xvpcx.c 1995-01-10 15:06:37.000000000 -0800 ++++ xv-3.10a-bugfixes/xvpcx.c 2005-03-25 08:10:03.000000000 -0800 +@@ -29,7 +29,7 @@ + #define PCX_YMAXH 11 + /* hres (12,13) and vres (14,15) not used */ + #define PCX_CMAP 16 /* start of 16*3 colormap data */ +-#define PCX_PLANES 65 ++#define PCX_PLANES 65 + #define PCX_BPRL 66 + #define PCX_BPRH 67 + +@@ -51,8 +51,8 @@ + { + FILE *fp; + long filesize; +- char *bname, *errstr; +- byte hdr[128], *image; ++ char *bname; ++ byte hdr[128]; + int i, colors, gray, fullcolor; + + pinfo->type = PIC8; +@@ -64,7 +64,7 @@ + /* open the stream */ + fp = xv_fopen(fname,"r"); + if (!fp) return (pcxError(bname, "unable to open file")); +- ++ + + /* figure out the file size */ + fseek(fp, 0L, 2); +@@ -84,10 +84,10 @@ + return pcxError(bname,"unrecognized magic number"); + } + +- pinfo->w = (hdr[PCX_XMAXL] + ((int) hdr[PCX_XMAXH]<<8)) ++ pinfo->w = (hdr[PCX_XMAXL] + ((int) hdr[PCX_XMAXH]<<8)) + - (hdr[PCX_XMINL] + ((int) hdr[PCX_XMINH]<<8)); + +- pinfo->h = (hdr[PCX_YMAXL] + ((int) hdr[PCX_YMAXH]<<8)) ++ pinfo->h = (hdr[PCX_YMAXL] + ((int) hdr[PCX_YMAXH]<<8)) + - (hdr[PCX_YMINL] + ((int) hdr[PCX_YMINH]<<8)); + + pinfo->w++; pinfo->h++; +@@ -96,10 +96,10 @@ + fullcolor = (hdr[PCX_BPP] == 8 && hdr[PCX_PLANES] == 3); + + if (DEBUG) { +- fprintf(stderr,"PCX: %dx%d image, version=%d, encoding=%d\n", ++ fprintf(stderr,"PCX: %dx%d image, version=%d, encoding=%d\n", + pinfo->w, pinfo->h, hdr[PCX_VER], hdr[PCX_ENC]); + fprintf(stderr," BitsPerPixel=%d, planes=%d, BytePerRow=%d, colors=%d\n", +- hdr[PCX_BPP], hdr[PCX_PLANES], ++ hdr[PCX_BPP], hdr[PCX_PLANES], + hdr[PCX_BPRL] + ((int) hdr[PCX_BPRH]<<8), + colors); + } +@@ -190,9 +190,9 @@ + + if (colors > 2 || (colors==2 && !gray)) { /* grayscale or PseudoColor */ + pinfo->colType = (gray) ? F_GREYSCALE : F_FULLCOLOR; +- sprintf(pinfo->fullInfo, +- "%s PCX, %d plane%s, %d bit%s per pixel. (%ld bytes)", +- (gray) ? "Greyscale" : "Color", ++ sprintf(pinfo->fullInfo, ++ "%s PCX, %d plane%s, %d bit%s per pixel. (%ld bytes)", ++ (gray) ? "Greyscale" : "Color", + hdr[PCX_PLANES], (hdr[PCX_PLANES]==1) ? "" : "s", + hdr[PCX_BPP], (hdr[PCX_BPP]==1) ? "" : "s", + filesize); +@@ -218,15 +218,21 @@ + byte *hdr; + { + /* load an image with at most 8 bits per pixel */ +- ++ + byte *image; +- ++ int count; ++ + /* note: overallocation to make life easier... */ +- image = (byte *) malloc((size_t) (pinfo->h + 1) * pinfo->w + 16); ++ count = (pinfo->h + 1) * pinfo->w + 16; /* up to 65537*65536+16 (~ 65552) */ ++ if (pinfo->w <= 0 || pinfo->h <= 0 || count/pinfo->w < pinfo->h) { ++ pcxError(fname, "Bogus 8-bit PCX file!!"); ++ return (0); ++ } ++ image = (byte *) malloc((size_t) count); + if (!image) FatalError("Can't alloc 'image' in pcxLoadImage8()"); +- +- xvbzero((char *) image, (size_t) ((pinfo->h+1) * pinfo->w + 16)); +- ++ ++ xvbzero((char *) image, (size_t) count); ++ + switch (hdr[PCX_BPP]) { + case 1: pcxLoadRaster(fp, image, 1, hdr, pinfo->w, pinfo->h); break; + case 8: pcxLoadRaster(fp, image, 8, hdr, pinfo->w, pinfo->h); break; +@@ -249,25 +255,33 @@ + byte *hdr; + { + byte *pix, *pic24, scale[256]; +- int c, i, j, w, h, maxv, cnt, planes, bperlin, nbytes; +- ++ int c, i, j, w, h, maxv, cnt, planes, bperlin, nbytes, count; ++ + w = pinfo->w; h = pinfo->h; +- +- planes = (int) hdr[PCX_PLANES]; +- bperlin = hdr[PCX_BPRL] + ((int) hdr[PCX_BPRH]<<8); +- ++ ++ planes = (int) hdr[PCX_PLANES]; /* 255 max, but can't get here unless = 3 */ ++ bperlin = hdr[PCX_BPRL] + ((int) hdr[PCX_BPRH]<<8); /* 65535 max */ ++ ++ j = h*planes; /* w and h are limited to 65536, planes to 3 */ ++ count = w*j; /* ...so this could wrap up to 3 times */ ++ nbytes = bperlin*j; /* ...and this almost 3 times */ ++ if (w <= 0 || h <= 0 || planes <= 0 || bperlin <= 0 || ++ j/h < planes || count/w < j || nbytes/bperlin < j) { ++ pcxError(fname, "Bogus 24-bit PCX file!!"); ++ return (0); ++ } ++ + /* allocate 24-bit image */ +- pic24 = (byte *) malloc((size_t) w*h*planes); +- if (!pic24) FatalError("couldn't malloc 'pic24'"); +- +- xvbzero((char *) pic24, (size_t) w*h*planes); +- ++ pic24 = (byte *) malloc((size_t) count); ++ if (!pic24) FatalError("Can't malloc 'pic24' in pcxLoadImage24()"); ++ ++ xvbzero((char *) pic24, (size_t) count); ++ + maxv = 0; + pix = pinfo->pic = pic24; + i = 0; /* planes, in this while loop */ + j = 0; /* bytes per line, in this while loop */ +- nbytes = bperlin*h*planes; +- ++ + while (nbytes > 0 && (c = getc(fp)) != EOF) { + if ((c & 0xC0) == 0xC0) { /* have a rep. count */ + cnt = c & 0x3F; +@@ -275,9 +289,9 @@ + if (c == EOF) { getc(fp); break; } + } + else cnt = 1; +- ++ + if (c > maxv) maxv = c; +- ++ + while (cnt-- > 0) { + if (j < w) { + *pix = c; +@@ -297,19 +311,19 @@ + } + } + } +- +- ++ ++ + /* scale all RGB to range 0-255, if they aren't */ + +- if (maxv<255) { ++ if (maxv<255) { + for (i=0; i<=maxv; i++) scale[i] = (i * 255) / maxv; +- ++ + for (i=0, pix=pic24; i<h; i++) { + if ((i&0x3f)==0) WaitCursor(); + for (j=0; j<w*planes; j++, pix++) *pix = scale[*pix]; + } + } +- ++ + return 1; + } + +@@ -321,13 +335,13 @@ + byte *image, *hdr; + int depth,w,h; + { +- /* supported: 8 bits per pixel, 1 plane, or 1 bit per pixel, 1-8 planes */ ++ /* supported: 8 bits per pixel, 1 plane; or 1 bit per pixel, 1-8 planes */ + + int row, bcnt, bperlin, pad; + int i, j, b, cnt, mask, plane, pmask; + byte *oldimage; + +- bperlin = hdr[PCX_BPRL] + ((int) hdr[PCX_BPRH]<<8); ++ bperlin = hdr[PCX_BPRL] + ((int) hdr[PCX_BPRH]<<8); /* 65535 max */ + if (depth == 1) pad = (bperlin * 8) - w; + else pad = bperlin - w; + +@@ -342,7 +356,7 @@ + if (b == EOF) { getc(fp); return; } + } + else cnt = 1; +- ++ + for (i=0; i<cnt; i++) { + if (depth == 1) { + for (j=0, mask=0x80; j<8; j++) { +@@ -351,12 +365,12 @@ + } + } + else *image++ = (byte) b; +- ++ + bcnt++; +- ++ + if (bcnt == bperlin) { /* end of a line reached */ + bcnt = 0; +- plane++; ++ plane++; + + if (plane >= (int) hdr[PCX_PLANES]) { /* moved to next row */ + plane = 0; +@@ -367,13 +381,13 @@ + } + else { /* next plane, same row */ + image = oldimage; +- } ++ } + + pmask = 1 << plane; + } + } + } +-} ++} + + + +diff -ruN xv-3.10a/xvpds.c xv-3.10a-bugfixes/xvpds.c +--- xv-3.10a/xvpds.c 1995-01-03 13:25:52.000000000 -0800 ++++ xv-3.10a-bugfixes/xvpds.c 2005-04-03 11:31:30.000000000 -0700 +@@ -22,23 +22,23 @@ + Choice of algorithm for 16->8 bit conversion--linear or histogram stretch. + (adds CONV24_HIST item in "24/8 bit" pull-down menu.) + Uses any "palette.tab" file in cwd to color PDS/VICAR image. +- ++ + * 9-2-91 began integration. Much of this code is lifted from vicar.c, + which I wrote for xloadimage. This is a little simpler, though. +- ++ + * 10-17-91 pdsuncomp is called with system(), which typically feeds the + commandline to sh. Make sure that your .profile adds wherever + you have pdsuncomp to the PATH, like +- ++ + PATH=$PATH:/usr/local/bin +- ++ + * 11-15-91 substituted vdcomp from Viking CD's for pdsuncomp. I added + recognition of - and shut off various messages +- ++ + * 1-5-92 merged into xv rel 2 +- ++ + * 3-11-92 cleaned up some comments +- ++ + * 3-24-92 Got some new CD's from NASA of mosics and other processed Viking + stuff. There are actually records terminated with CRNLCR in + these images, as well as ones that identify the spacecraft name +@@ -46,14 +46,14 @@ + yet further to deal with these. There's a Sun 4 XView binary for + an image display program on these discs, but it's nowhere near as + neat as the good Mr. Bradley's XV. +- +- ++ ++ + * Sources of these CD's: + * + * National Space Science Data Center + * Goddard Space Flight Center + * Code 933.4 +- * Greenbelt, Maryland ++ * Greenbelt, Maryland + * (301) 286-6695 + * or call + * (301) 286-9000 (300,1200,2400 bps) +@@ -91,10 +91,10 @@ + * Copyright 1989, 1990 by Anthony A. Datri + * + * Permission to use, copy, and distribute for non-commercial purposes, +- * is hereby granted without fee, providing that the above copyright ++ * is hereby granted without fee, providing that the above copyright + * notice appear in all copies, that both the copyright notice and this + * permission notice appear in supporting documentation. +- * ++ * + * In exception to the above, permission to John Bradley is hereby granted to + * distribute this code as he sees fit within the context of his "xv" image + * viewer. +@@ -132,8 +132,8 @@ + + + static int lastwasinote = FALSE; +-static char scanbuff [MAX_SIZE], +- rtbuff [RTBUFFSIZE], ++static char scanbuff [MAX_SIZE], ++ rtbuff [RTBUFFSIZE], + inote [20*COMMENTSIZE], + infobuff [COMMENTSIZE], + spacecraft [COMMENTSIZE], +@@ -203,10 +203,10 @@ + } + return(count); + +- case EOF: *bp='\0'; return(count); +- ++ case EOF: *bp='\0'; return(count); ++ + case '\0': return(count); +- ++ + default: count++; *bp++ = c; + } + } +@@ -242,7 +242,7 @@ + * disc seem to leave off the first two bytes. Sigh. This may sometimes be + * a distinction between the fixed and variable-record files. + */ +- ++ + /*******************************************/ + int LoadPDS(fname, pinfo) + char *fname; +@@ -250,11 +250,11 @@ + { + /* returns '1' on success, '0' on failure */ + +- int tempnum; ++ int tempnum, bytewidth, bufsize; + FILE *zf; + static int isfixed,teco,i,j,itype,vaxbyte, + recsize,hrecsize,irecsize,isimage,labelrecs,labelsofar, +- x,y,lpsize,lssize,samplesize,returnp,labelsize,yy; ++ w,h,lpsize,lssize,samplesize,returnp,labelsize,yy; + char *tmp; + char *ftypstr; + unsigned long filesize; +@@ -265,7 +265,7 @@ + returnp = isimage = FALSE; + itype = PDSTRASH; + +- teco = i = j = recsize = hrecsize = irecsize = labelrecs = x = y = 0; ++ teco = i = j = recsize = hrecsize = irecsize = labelrecs = w = h = 0; + lpsize = lssize = samplesize = labelsize = labelsofar = 0; + + (*pdsuncompfname) = (*iname) = (*target) = (*filtname) = (*garbage) = '\0'; +@@ -363,7 +363,7 @@ + * length indicator. If the length indicator is odd, then a pad byte + * is appended to the end of the record so that all records contain + * an even number of bytes." */ +- ++ + i=getc(zf); + j=getc(zf); + if (j == EOF) { +@@ -371,7 +371,7 @@ + fclose(zf); + return 0; + } +- ++ + teco = i + (j << 8); + if (teco % 2) teco++; + +@@ -380,7 +380,7 @@ + fclose(zf); + return 0; + } +- ++ + scanbuff[teco]='\0'; + } + +@@ -429,11 +429,11 @@ + (sscanf(scanbuff," LABEL_RECORDS = %d", &labelrecs) == 1)) { + lastwasinote=FALSE; + continue; +- } else if (sscanf(scanbuff," IMAGE_LINES = %d",&y) == 1) { ++ } else if (sscanf(scanbuff," IMAGE_LINES = %d",&h) == 1) { + isimage=TRUE; lastwasinote=FALSE; continue; +- } else if (sscanf(scanbuff," LINE_SAMPLES = %d",&x) == 1) { ++ } else if (sscanf(scanbuff," LINE_SAMPLES = %d",&w) == 1) { + lastwasinote=FALSE; continue; +- } else if (sscanf(scanbuff," LINES = %d",&y) == 1) { ++ } else if (sscanf(scanbuff," LINES = %d",&h) == 1) { + isimage=TRUE; lastwasinote=FALSE; continue; + } else if (sscanf(scanbuff," HEADER_RECORD_BYTES = %d",&hrecsize)==1) { + lastwasinote=FALSE; continue; +@@ -472,7 +472,7 @@ + + } else if (sscanf(scanbuff," INSTRUMENT_GAIN_STATE = %s",gainmode)==1) { + lastwasinote=FALSE; continue; +- ++ + } else if (sscanf(scanbuff," EDIT_MODE_ID = %s", editmode) == 1) { + lastwasinote=FALSE; continue; + +@@ -531,11 +531,11 @@ + * get my hands on the clown who designed this format... + * What we basically assume here + * is that a NOTE record that doesn't end with a " is +- * followed by some number of continuations, one of which ++ * followed by some number of continuations, one of which + * will have a " in it. If this turns out to not be true, + * well, we'll segmentation fault real soon. We use + * lastwasinote as a semaphore to indicate that the previous +- * record was an unfinished NOTE record. We clear the ++ * record was an unfinished NOTE record. We clear the + * flag in each of the above record types for potential + * error recovery, although it really breaks up the beauty + * of the cascading sscanfs. Dykstra'd love me for this one */ +@@ -568,10 +568,10 @@ + fclose(zf); + return 0; + } +- ++ + vaxbyte = strncmp(sampletype, "VAX_", (size_t) 4) == 0 || + strncmp(sampletype, "LSB_", (size_t) 4) == 0; +- ++ + } else if (itype == VICAR) { + /* we've got a VICAR file. Let's find out how big the puppy is */ + ungetc(' ', zf); +@@ -582,8 +582,8 @@ + SetISTR(ISTR_WARNING,"LoadPDS: bad NL in VICAR\n"); + returnp=TRUE; + } +- +- if (sscanf(tmp," NL = %d",&y) != 1) { ++ ++ if (sscanf(tmp," NL = %d",&h) != 1) { + SetISTR(ISTR_WARNING,"LoadPDS: bad scan NL in VICAR\n"); + returnp=TRUE; + } +@@ -593,7 +593,7 @@ + returnp=TRUE; + } + +- if (sscanf(tmp, " NS = %d",&x) != 1) { ++ if (sscanf(tmp, " NS = %d",&w) != 1) { + SetISTR(ISTR_WARNING,"LoadPDS: bad scan NS in VICAR\n"); + returnp=TRUE; + } +@@ -625,6 +625,13 @@ + returnp=TRUE; + } + ++ /* samplesize can be arbitrarily large (up to int limit) in non-VICAR files */ ++ if (samplesize != 8 && samplesize != 16) { ++ SetISTR(ISTR_WARNING,"LoadPDS: %d bits per pixel not supported", ++ samplesize); ++ returnp=TRUE; ++ } ++ + if (returnp) { + fclose(zf); + return 0; +@@ -689,11 +696,19 @@ + + #ifndef VMS + sprintf(pdsuncompfname,"%s/xvhuffXXXXXX", tmpdir); +- mktemp(pdsuncompfname); +- sprintf(scanbuff,"%s %s - 4 >%s",PDSUNCOMP,fname,pdsuncompfname); + #else + strcpy(pdsuncompfname,"sys$disk:[]xvhuffXXXXXX"); ++#endif ++ ++#ifdef USE_MKSTEMP ++ close(mkstemp(pdsuncompfname)); ++#else + mktemp(pdsuncompfname); ++#endif ++ ++#ifndef VMS ++ sprintf(scanbuff,"%s %s - 4 >%s",PDSUNCOMP,fname,pdsuncompfname); ++#else + sprintf(scanbuff,"%s %s %s 4",PDSUNCOMP,fname,pdsuncompfname); + #endif + +@@ -727,63 +742,72 @@ + fread(scanbuff, (size_t) labelsize, (size_t) 1, zf); + } + +- x *= samplesize/8; ++ /* samplesize is bits per pixel; guaranteed at this point to be 8 or 16 */ ++ bytewidth = w * (samplesize/8); ++ bufsize = bytewidth * h; ++ if (w <= 0 || h <= 0 || bytewidth/w != (samplesize/8) || ++ bufsize/bytewidth != h) ++ { ++ SetISTR(ISTR_WARNING,"LoadPDS: image dimensions out of range (%dx%dx%d)", ++ w, h, samplesize/8); ++ fclose(zf); ++ return 0; ++ } + +- image = (byte *) malloc((size_t) x*y); ++ image = (byte *) malloc((size_t) bufsize); + if (image == NULL) { +- SetISTR(ISTR_WARNING,"LoadPDS: couldn't malloc %d",x*y); + fclose(zf); + if (isfixed == FALSE) + unlink(pdsuncompfname); +- exit(1); ++ FatalError("LoadPDS: can't malloc image buffer"); + } + + if ((lssize || lpsize) && + ((itype == PDSFIXED) || (itype == VIKINGFIXED) || (itype == VICAR)) ) { + /* ARrrrgh. Some of these images have crud intermixed with the image, */ + /* preventing us from freading in one fell swoop */ +- /* (whatever a fell swoop is */ ++ /* (whatever a fell swoop is) */ + +- for (yy=0; yy<y; yy++) { +- if (lpsize && +- ((teco=(fread(scanbuff,(size_t) lpsize,(size_t) 1,zf))) != 1)) { ++ for (yy=0; yy<h; yy++) { ++ if (lpsize && ++ (teco=fread(scanbuff,(size_t) lpsize,(size_t) 1,zf)) != 1) { + SetISTR(ISTR_WARNING, "LoadPDS: unexpected EOF reading prefix"); + fclose(zf); + return 0; + } +- +- if ((teco=(fread(image+(yy*x), (size_t) x, (size_t) 1,zf))) != 1) { ++ ++ teco = fread(image+(yy*bytewidth), (size_t) bytewidth, (size_t) 1,zf); ++ if (teco != 1) { + SetISTR(ISTR_WARNING, "LoadPDS: unexpected EOF reading line %d",yy); + fclose(zf); + return 0; + } + +- if (lssize && +- ((teco=(fread(scanbuff,(size_t) lssize,(size_t) 1,zf))) != 1)) { ++ if (lssize && ++ (teco=fread(scanbuff,(size_t) lssize,(size_t) 1,zf)) != 1) { + SetISTR(ISTR_WARNING, "LoadPDS: unexpected EOF reading suffix"); + fclose(zf); + return 0; + } + } + +- } else if ((yy=fread(image, (size_t) x*y, (size_t) 1, zf)) != 1) { ++ } else if ((yy=fread(image, (size_t) bytewidth*h, (size_t) 1, zf)) != 1) { + SetISTR(ISTR_WARNING,"LoadPDS: error reading image data"); + fclose(zf); + if (itype==PDSVARIABLE || itype==VIKINGVARIABLE) + unlink(pdsuncompfname); +- + return 0; + } + +- fclose(zf); ++ fclose(zf); + + + if (isfixed == FALSE) + unlink(pdsuncompfname); + + pinfo->pic = image; +- pinfo->w = x; +- pinfo->h = y; ++ pinfo->w = w; /* true pixel-width now (no longer bytewidth!) */ ++ pinfo->h = h; + + if (samplesize == 16) + if (Convert16BitImage(fname, pinfo, +@@ -798,25 +822,25 @@ + if (pinfo->comment) { + char tmp[256]; + *(pinfo->comment) = '\0'; +- ++ + sprintf(tmp, "Spacecraft: %-28sTarget: %-32s\n", spacecraft, target); + strcat(pinfo->comment, tmp); +- ++ + sprintf(tmp, "Filter: %-32sMission phase: %-24s\n", filtname, mphase); + strcat(pinfo->comment, tmp); +- ++ + sprintf(tmp, "Image time: %-28sGain mode: %-29s\n", itime, gainmode); + strcat(pinfo->comment, tmp); +- ++ + sprintf(tmp, "Edit mode: %-29sScan mode: %-29s\n", editmode, scanmode); + strcat(pinfo->comment, tmp); +- ++ + sprintf(tmp, "Exposure: %-30sShutter mode: %-25s\n", exposure,shuttermode); + strcat(pinfo->comment, tmp); +- ++ + sprintf(tmp, "Instrument: %-28sImage time: %-28s\n", iname, itime); + strcat(pinfo->comment, tmp); +- ++ + sprintf(tmp, "Image Note: %-28s", inote); + strcat(pinfo->comment, tmp); + } +@@ -868,23 +892,20 @@ + m = 65536 * sizeof(byte); + lut = (byte *) malloc(m); + if (lut == NULL) { +- SetISTR(ISTR_WARNING,"LoadPDS: couldn't malloc %d", m); +- return 0; ++ FatalError("LoadPDS: can't malloc LUT buffer"); + } +- pinfo->w /= 2; + + /* allocate histogram table */ + m = 65536 * sizeof(long); + hist = (long *) malloc(m); + if (hist == NULL) { +- SetISTR(ISTR_WARNING,"LoadPDS: couldn't malloc %d", m); + free(lut); +- return 0; ++ FatalError("LoadPDS: can't malloc histogram buffer"); + } + + /* check whether histogram file exists */ + #ifdef VMS +- c = (char *) rindex(strcpy(name, ++ c = (char *) rindex(strcpy(name, + (c = (char *) rindex(fname, ':')) ? c+1 : fname), + ']'); + #else +@@ -947,14 +968,20 @@ + } + } + +- /* allocate new 8-bit image */ + free(hist); ++ ++ /* allocate new 8-bit image */ + n = pinfo->w * pinfo->h; ++ if (pinfo->w <= 0 || pinfo->h <= 0 || n/pinfo->w != pinfo->h) { ++ SetISTR(ISTR_WARNING,"LoadPDS: image dimensions out of range (%dx%d)", ++ pinfo->w, pinfo->h); ++ free(lut); ++ return 0; ++ } + pPix8 = (byte *)malloc(n*sizeof(byte)); + if (pPix8 == NULL) { +- SetISTR(ISTR_WARNING,"LoadPDS: couldn't malloc %d", n*sizeof(byte)); + free(lut); +- return 0; ++ FatalError("LoadPDS: can't malloc 16-to-8-bit conversion buffer"); + } + + /* convert the 16-bit image to 8-bit */ +@@ -979,16 +1006,16 @@ + FILE *fp; + char name[1024], buf[256], *c; + int i, n, r, g, b; +- ++ + #ifdef VMS +- c = (char *) rindex(strcpy(name, ++ c = (char *) rindex(strcpy(name, + (c = (char *) rindex(fname, ':')) ? c+1 : fname), + ']'); + #else + c = (char *) rindex(strcpy(name, fname), '/'); + #endif /* VMS */ + (void)strcpy(c ? c+1 : name, "palette.tab"); +- ++ + if ((fp = xv_fopen(name, "r")) == NULL) + return 0; + for (i = 0; i < 256; i++) { +@@ -1014,7 +1041,3 @@ + + + #endif /* HAVE_PDS */ +- +- +- +- +diff -ruN xv-3.10a/xvpictoppm.c xv-3.10a-bugfixes/xvpictoppm.c +--- xv-3.10a/xvpictoppm.c 1995-01-13 11:57:14.000000000 -0800 ++++ xv-3.10a-bugfixes/xvpictoppm.c 2005-04-10 09:36:04.000000000 -0700 +@@ -77,7 +77,7 @@ + FILE *fp; + byte *icon8, *pic24, *ip, *pp; + char buf[256]; +- int i, builtin, w, h, mv; ++ int i, builtin, w, h, maxval, npixels, p24sz; + + fp = stdin; + builtin = 0; +@@ -88,42 +88,45 @@ + /* read comments until we see '#END_OF_COMMENTS', or hit EOF */ + while (1) { + if (!fgets(buf, 256, fp)) errexit(); +- ++ + if (!strncmp(buf, "#END_OF_COMMENTS", (size_t) 16)) break; + + else if (!strncmp(buf, "#BUILTIN:", (size_t) 9)) { + builtin = 1; +- fprintf(stderr,"Built-In icon: no image to convert!\n"); ++ fprintf(stderr, "Built-in icon: no image to convert\n"); + exit(1); + } + } + + + /* read width, height, maxval */ +- if (!fgets(buf, 256, fp) || sscanf(buf, "%d %d %d", &w, &h, &mv) != 3) ++ if (!fgets(buf, 256, fp) || sscanf(buf, "%d %d %d", &w, &h, &maxval) != 3) + errexit(); + ++ npixels = w * h; ++ p24sz = 3 * npixels; + +- if (w<1 || h<1 || mv != 255) { +- fprintf(stderr,"Bogus thumbnail file!\n"); ++ if (w <= 0 || h <= 0 || maxval != 255 || npixels/w != h || p24sz/3 != npixels) ++ { ++ fprintf(stderr, "Thumbnail dimensions out of range\n"); + exit(1); + } + + + /* read binary data */ +- icon8 = (byte *) malloc((size_t) w * h); ++ icon8 = (byte *) malloc((size_t) npixels); + if (!icon8) errexit(); + +- i = fread(icon8, (size_t) 1, (size_t) w*h, fp); +- if (i != w*h) errexit(); ++ i = fread(icon8, (size_t) 1, (size_t) npixels, fp); ++ if (i != npixels) errexit(); ++ + +- + /* make 24-bit version of icon */ +- pic24 = (byte *) malloc((size_t) w * h * 3); ++ pic24 = (byte *) malloc((size_t) p24sz); + if (!pic24) errexit(); + + /* convert icon from 332 to 24-bit image */ +- for (i=0, ip=icon8, pp=pic24; i<w*h; i++, ip++, pp+=3) { ++ for (i=0, ip=icon8, pp=pic24; i<npixels; i++, ip++, pp+=3) { + pp[0] = ( ((int) ((*ip >> 5) & 0x07)) * 255) / 7; + pp[1] = ( ((int) ((*ip >> 2) & 0x07)) * 255) / 7; + pp[2] = ( ((int) ((*ip >> 0) & 0x03)) * 255) / 3; +@@ -160,10 +163,3 @@ + + if (ferror(fp)) errexit(); + } +- +- +- +- +- +- +- +diff -ruN xv-3.10a/xvpm.c xv-3.10a-bugfixes/xvpm.c +--- xv-3.10a/xvpm.c 1994-12-22 14:34:40.000000000 -0800 ++++ xv-3.10a-bugfixes/xvpm.c 2005-03-29 08:30:12.000000000 -0800 +@@ -60,7 +60,7 @@ + + FILE *fp; + byte *pic8; +- int isize,i,flipit,w,h; ++ int isize,i,flipit,w,h,npixels,nRGBbytes; + char *bname; + + bname = BaseName(fname); +@@ -103,10 +103,11 @@ + thePic.pm_cmtsize = flip4(thePic.pm_cmtsize); + } + +- w = thePic.pm_ncol; h = thePic.pm_nrow; ++ w = thePic.pm_ncol; ++ h = thePic.pm_nrow; + + /* make sure that the input picture can be dealt with */ +- if ( thePic.pm_nband!=1 || ++ if ( thePic.pm_nband!=1 || + (thePic.pm_form!=PM_I && thePic.pm_form!=PM_C) || + (thePic.pm_form==PM_I && thePic.pm_np>1) || + (thePic.pm_form==PM_C && (thePic.pm_np==2 || thePic.pm_np>4)) ) { +@@ -114,20 +115,27 @@ + fprintf(stderr,"(ie, 1-plane PM_I, or 1-, 3-, or 4-plane PM_C)\n"); + + return pmError(bname, "PM file in unsupported format"); +- } ++ } + + + isize = pm_isize(&thePic); ++ npixels = w*h; ++ nRGBbytes = 3*npixels; ++ ++ /* make sure image is more-or-less valid (and no overflows) */ ++ if (isize <= 0 || w <= 0 || h <= 0 || npixels/w < h || ++ nRGBbytes/3 < npixels || thePic.pm_cmtsize < 0) ++ return pmError(bname, "Bogus PM file!!"); + +- if (DEBUG) ++ if (DEBUG) + fprintf(stderr,"%s: LoadPM() - loading a %dx%d %s pic, %d planes\n", +- cmd, w, h, (thePic.pm_form==PM_I) ? "PM_I" : "PM_C", ++ cmd, w, h, (thePic.pm_form==PM_I) ? "PM_I" : "PM_C", + thePic.pm_np); + +- ++ + /* allocate memory for picture and read it in */ + thePic.pm_image = (char *) malloc((size_t) isize); +- if (thePic.pm_image == NULL) ++ if (thePic.pm_image == NULL) + return( pmError(bname, "unable to malloc PM picture") ); + + if (fread(thePic.pm_image, (size_t) isize, (size_t) 1, fp) != 1) { +@@ -147,7 +155,7 @@ + } + } + } +- ++ + fclose(fp); + + +@@ -155,11 +163,11 @@ + int *intptr; + byte *pic24, *picptr; + +- if ((pic24 = (byte *) malloc((size_t) w*h*3))==NULL) { ++ if ((pic24 = (byte *) malloc((size_t) nRGBbytes))==NULL) { + if (thePic.pm_cmt) free(thePic.pm_cmt); + return( pmError(bname, "unable to malloc 24-bit picture") ); + } +- ++ + intptr = (int *) thePic.pm_image; + picptr = pic24; + +@@ -190,7 +198,7 @@ + else if (thePic.pm_form == PM_C && thePic.pm_np>1) { + byte *pic24, *picptr, *rptr, *gptr, *bptr; + +- if ((pic24 = (byte *) malloc((size_t) w*h*3))==NULL) { ++ if ((pic24 = (byte *) malloc((size_t) nRGBbytes))==NULL) { + if (thePic.pm_cmt) free(thePic.pm_cmt); + return( pmError(bname, "unable to malloc 24-bit picture") ); + } +@@ -210,12 +218,12 @@ + pinfo->pic = pic24; + pinfo->type = PIC24; + } +- ++ + + else if (thePic.pm_form == PM_C && thePic.pm_np==1) { + /* don't have to convert, just point pic at thePic.pm_image */ + pic8 = (byte *) thePic.pm_image; +- for (i=0; i<256; i++) ++ for (i=0; i<256; i++) + pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i; /* build mono cmap */ + + pinfo->pic = pic8; +@@ -228,10 +236,10 @@ + pinfo->normw = pinfo->w; pinfo->normh = pinfo->h; + + pinfo->frmType = F_PM; +- pinfo->colType = (thePic.pm_form==PM_I || thePic.pm_np>1) ++ pinfo->colType = (thePic.pm_form==PM_I || thePic.pm_np>1) + ? F_FULLCOLOR : F_GREYSCALE; +- sprintf(pinfo->fullInfo,"PM, %s. (%d plane %s) (%ld bytes)", +- (thePic.pm_form==PM_I || thePic.pm_np>1) ++ sprintf(pinfo->fullInfo,"PM, %s. (%d plane %s) (%d bytes)", ++ (thePic.pm_form==PM_I || thePic.pm_np>1) + ? "24-bit color" : "8-bit greyscale", + thePic.pm_np, (thePic.pm_form==PM_I) ? "PM_I" : "PM_C", + isize + PM_IOHDR_SIZE + thePic.pm_cmtsize); +@@ -313,7 +321,7 @@ + + else if (colorstyle == 1) { /* GreyScale: 8 bits per pixel */ + byte rgb[256]; +- ++ + if (ptype == PIC8) { + for (i=0; i<numcols; i++) rgb[i] = MONO(rmap[i],gmap[i],bmap[i]); + for (i=0, p=pic; i<w*h; i++, p++) { +diff -ruN xv-3.10a/xvpopup.c xv-3.10a-bugfixes/xvpopup.c +--- xv-3.10a/xvpopup.c 1995-01-19 10:09:31.000000000 -0800 ++++ xv-3.10a-bugfixes/xvpopup.c 2004-05-16 18:04:13.000000000 -0700 +@@ -1,5 +1,5 @@ +-/* +- * xvpopup.c - popup "Are you sure? Yes/No/Maybe" sort of dialog box ++/* ++ * xvpopup.c - pop up "Are you sure? Yes/No/Maybe" sort of dialog box + * + * callable functions: + * +@@ -20,7 +20,8 @@ + + #include "xv.h" + +-#include "bits/icon" ++#define OMIT_ICON_BITS ++#include "bits/icon" /* icon_bits[] not used, but icon_width/height are */ + + #define PUWIDE 400 + #define PUHIGH 170 +@@ -86,8 +87,8 @@ + static char *padMthdNames[] = { "Solid Fill", "Run 'bggen'", "Load Image" }; + + static int padColDefLen = 9; +-static char *padColDefNames[] = { "black", "red", "yellow", "green", +- "cyan", "blue", "magenta", "white", ++static char *padColDefNames[] = { "black", "red", "yellow", "green", ++ "cyan", "blue", "magenta", "white", + "50% gray" }; + + static char *padColDefVals[] = { "black", "red", "yellow", "green", +@@ -105,8 +106,8 @@ + "Red Balls", + "Red+Yellow Diamonds" }; + +-static char *padBgDefVals[] = { +- "black white", ++static char *padBgDefVals[] = { ++ "black white", + "100 100 255 50 50 150", + "red green blue", + "black red yellow green blue purple black", +@@ -150,11 +151,11 @@ + if (wy + h > dispHIGH) wy = dispHIGH - h; + } + +- ++ + if (winCtrPosKludge) { + wx -= (p_offx + ch_offx); + wy -= (p_offy + ch_offy); +- } ++ } + else { + wx -= (ch_offx); + wy -= (ch_offy); +@@ -197,7 +198,7 @@ + /* attach controls to popW, now that it exists */ + if (poptyp==ISGRAB) ahideCB.win = popW; + else if (poptyp == ISPAD) { +- ++ + if (!padHaveDooDads) { + DCreate(&padWDial, popW, 16, puhigh-16-100-1,75,100, + 1, 2048, pWIDE, 10, +@@ -230,8 +231,8 @@ + XMapWindow(theDisp, padWDial.win); + XMapWindow(theDisp, padHDial.win); + XMapWindow(theDisp, padODial.win); +- } +- ++ } ++ + + XResizeWindow(theDisp, popW, (u_int) puwide, (u_int) puhigh); + XStoreName (theDisp, popW, wname); +@@ -257,9 +258,9 @@ + } + else if (poptyp == ISPAD) { + BTSetActive(&bts[0], (int) strlen(gsBuf)); +- i = pWIDE * 3; RANGE(i,2048,9999); ++ i = pWIDE * 3; RANGE(i,2048,9999); + DSetRange(&padWDial, 1, i, padWDial.val, 10); +- i = pHIGH * 3; RANGE(i,2048,9999); ++ i = pHIGH * 3; RANGE(i,2048,9999); + DSetRange(&padHDial, 1, i, padHDial.val, 10); + + DSetActive(&padWDial, (padMode!=PAD_LOAD)); /* DSetRange activates dial */ +@@ -283,14 +284,14 @@ + } + } + +- /* center first button in window around mouse position, with constraint that ++ /* center first button in window around mouse position, with constraint that + window be fully on the screen */ + + CenterMapWindow(popW, 40 + bts[0].x, BUTTH/2 + bts[0].y, puwide, puhigh); + popUp = poptyp; + + /* MUST wait for VisibilityNotify event to come in, else we run the risk +- of UnMapping the window *before* the Map request completed. This ++ of UnMapping the window *before* the Map request completed. This + appears to be bad, (It leaves an empty window frame up.) though it + generally only happens on slow servers. Better safe than screwed... */ + +@@ -338,10 +339,10 @@ + button labels have 1-character accellerators at the front, same + as in PopUp(). Note that it would be suboptimal to make any + of the 1-character accellerators be the same character as one of +- the edit-text command keys ++ the edit-text command keys + + Also note that the filter string should only contain normal printable +- characters (' ' through '\177'), as ctrl chars are pre-filtered ++ characters (' ' through '\177'), as ctrl chars are pre-filtered + (ie, interpreted as emacs-like commands) */ + + gsBuf = buf; gsBufLen = buflen; +@@ -358,7 +359,7 @@ + gsy = PUHIGH - 10 - BUTTH - 10 - gsh - 20; + + gsw = PUWIDE - gsx - 10; +- ++ + changedGSBuf(); /* careful! popW doesn't exist yet! */ + + return doPopUp(txt, labels, n, ISGETSTR, "xv prompt"); +@@ -390,7 +391,7 @@ + changedGSBuf(); /* careful! popW doesn't exist yet! */ + + /* window value gets filled in in doPopUp() */ +- CBCreate(&ahideCB, (Window) NULL, ++ CBCreate(&ahideCB, (Window) NULL, + PUWIDE-10-18-StringWidth(HIDESTR), + gsy+2, HIDESTR, infofg, infobg, hicol, locol); + ahideCB.val = *pHide; +@@ -464,8 +465,8 @@ + + changedGSBuf(); /* careful! popW doesn't exist yet! */ + +- if (padHaveDooDads) { +- oldW = padWDial.val; ++ if (padHaveDooDads) { ++ oldW = padWDial.val; + oldH = padHDial.val; + oldO = padODial.val; + } +@@ -496,8 +497,8 @@ + XUnmapWindow(theDisp, padODial.win); + + /* load up return values */ +- *pMode = padMode; +- *pStr = padBuf; ++ *pMode = padMode; ++ *pStr = padBuf; + *pWide = padWDial.val; + *pHigh = padHDial.val; + *pOpaque = padODial.val; +@@ -513,8 +514,6 @@ + /* generates padCol* and padBg* lists used in 'Defaults' MBUTT. Grabs + all the X resources values it can, and adds appropriate defaults */ + +- int i; +- + rd_str_cl("foo", "", 1); /* rebuild database */ + + build1PadList("color", padColVals, padColNames, &padColLen, +@@ -526,15 +525,15 @@ + build1PadList("load", padLoadVals, padLoadNames, &padLoadLen, + (char **) NULL, (char **) NULL, 0); + } +- +- ++ ++ + /***************************************************/ + static void build1PadList(typstr, vals, nams, lenp, dvals, dnams, dlen) + char *typstr, **vals, **nams, **dvals, **dnams; + int *lenp, dlen; + { + int i; +- char resname[128], name[256], value[256]; ++ char resname[128]; + + for (i=0; i<*lenp; i++) { /* kill old lists */ + free(nams[i]); +@@ -548,7 +547,7 @@ + vals[*lenp] = (char *) malloc(strlen(def_str)+1); + if (!vals[*lenp]) continue; + strcpy(vals[*lenp], def_str); +- ++ + sprintf(resname, "pad.%s.name%d", typstr, i); + if (rd_str_cl(resname, "Dialog.Menu.Slot",0)) { /* and it has a name! */ + nams[*lenp] = (char *) malloc(strlen(def_str)+1); +@@ -560,13 +559,14 @@ + nams[*lenp] = (char *) malloc((size_t) 32); + if (!nams[*lenp]) { free(vals[*lenp]); continue; } + strncpy(nams[*lenp], vals[*lenp], (size_t) 31); ++ nams[*lenp][31] = '\0'; + } +- ++ + if (strlen(nams[*lenp]) > (size_t) 20) { /* fix long names */ + char *sp = nams[*lenp] + 18; + *sp++ = '.'; *sp++ = '.'; *sp++ = '.'; *sp++ = '\0'; + } +- ++ + *lenp = (*lenp) + 1; + } + } +@@ -583,7 +583,7 @@ + strcpy(nams[*lenp], dnams[i]); + *lenp = (*lenp) + 1; + } +-} ++} + + + +@@ -605,7 +605,7 @@ + void OpenAlert(txt) + char *txt; + { +- /* pops up a window with txt displayed in it (*no buttons*). ++ /* pops up a window with txt displayed in it (*no buttons*). + returns immediately. window is closed by 'CloseAlert()'. + No 'PopUp()' calls are allowed while an Alert is displayed. */ + +@@ -624,14 +624,14 @@ + puwide = PUWIDE; puhigh = PUHIGH; + XResizeWindow(theDisp, popW, (u_int) puwide, (u_int) puhigh); + +- /* center last button in window around mouse position, with constraint that ++ /* center last button in window around mouse position, with constraint that + window be fully on the screen */ + + CenterMapWindow(popW, puwide/2, puhigh/2, puwide, puhigh); + popUp = ISALERT; + + /* MUST wait for VisibilityNotify event to come in, else we run the risk +- of UnMapping the window *before* the Map request completed. This ++ of UnMapping the window *before* the Map request completed. This + appears to be bad, (It leaves an empty window frame up.) though it + generally only happens on slow servers. Better safe than screwed... */ + +@@ -695,7 +695,7 @@ + XKeyEvent *e = (XKeyEvent *) xev; + char buf[128]; KeySym ks; + int stlen, i, shift, ck; +- ++ + stlen = XLookupString(e,buf,128,&ks,(XComposeStatus *) NULL); + shift = e->state & ShiftMask; + ck = CursorKey(ks, shift, 0); +@@ -725,7 +725,7 @@ + rv = 1; + } + +- if (!rv && (popUp==ISGETSTR || popUp==ISGRAB || popUp==ISPAD)) { ++ if (!rv && (popUp==ISGETSTR || popUp==ISGRAB || popUp==ISPAD)) { + if (e->window == popW) { doGetStrKey(buf[0]); rv = 1; } + } + } +@@ -775,10 +775,10 @@ + int i, inbreak, lineno, top, hardcr, maxln, len[TR_MAXLN]; + + XSetForeground(theDisp, theGC, fg); +- ++ + sp = txt; lineno = hardcr = 0; + +- maxln = h / LINEHIGH; ++ maxln = h / LINEHIGH; + RANGE(maxln,0,TR_MAXLN); + while (*sp && lineno<maxln) { + +@@ -797,7 +797,7 @@ + while (XTextWidth(mfinfo, sp, (int)(ep-sp))<= w && *ep && *ep!='\n') ep++; + if (*ep=='\n') { ep++; hardcr=1; } /* eat newline */ + +- /* if we got too wide, back off until we find a break position ++ /* if we got too wide, back off until we find a break position + (last char before a space or a '/') */ + + if (XTextWidth(mfinfo, sp, (int)(ep-sp)) > w) { +@@ -812,7 +812,7 @@ + } + + start[lineno] = sp; len[lineno] = ep-sp; +- ++ + /* make sure we don't print a trailing '\n' character! */ + if (len[lineno] > 0) { + while (sp[len[lineno]-1] == '\n') len[lineno] = len[lineno] - 1; +@@ -835,7 +835,7 @@ + /***************************************************/ + static void createPUD() + { +- popW = CreateWindow("xv confirm", "XVconfirm", "+0+0", ++ popW = CreateWindow("xv confirm", "XVconfirm", "+0+0", + PUWIDE, PUHIGH, infofg, infobg, 0); + if (!popW) FatalError("can't create popup window!"); + +@@ -847,7 +847,7 @@ + bts = (BUTT *) NULL; + nbts = selected = firsttime = 0; + } +- ++ + + /***************************************************/ + static void attachPUD() +@@ -913,24 +913,24 @@ + XDrawLine(theDisp, popW, theGC, 16+1+75+75+5, puhigh-140 + 6+8, + 16+1+75+75+5, puhigh-10-4); + } +- ++ + + XSetForeground(theDisp, theGC, infofg); +- XDrawRectangle(theDisp, popW, theGC, 268, puhigh-140, ++ XDrawRectangle(theDisp, popW, theGC, 268, puhigh-140, + (u_int) puwide - 10 - 268, 130-BUTTH-10); +- Draw3dRect(popW, 268+1, puhigh-140+1, (u_int) puwide -10-268-2, ++ Draw3dRect(popW, 268+1, puhigh-140+1, (u_int) puwide -10-268-2, + 130-2 - BUTTH-10, R3D_IN,2,hicol,locol,infobg); +- +- TextRect(popW,padInst,268+5, puhigh-140+3, puwide-10-268-10, ++ ++ TextRect(popW,padInst,268+5, puhigh-140+3, puwide-10-268-10, + 130-6 - BUTTH-10, infofg); + } + + else { + XCopyPlane(theDisp, iconPix, popW, theGC, 0,0, icon_width, icon_height, + 10,10+(puhigh-30-BUTTH-icon_height)/2, 1L); +- ++ + xt = 10+icon_width+20; yt = 10; +- ++ + if (popUp == ISGETSTR) { + TextRect(popW, text, xt, yt, puwide-10-xt, gsy-20, infofg); + drawGSBuf(); +@@ -947,22 +947,22 @@ + /***************************************************/ + static void drawPadOMStr() + { +- CenterString(popW, padODial.x + (padODial.w - 13)/2, ++ CenterString(popW, padODial.x + (padODial.w - 13)/2, + puhigh-16-100-12, padOMStr[padOMode]); + } +- ++ + /***************************************************/ + static void clickPUD(x,y) + int x,y; + { + int i; + BUTT *bp; +- ++ + for (i=0; i<nbts; i++) { + bp = &bts[i]; + if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break; + } +- ++ + if (i<nbts && BTTrack(bp)) { + popUp = 0; selected = i; return; + } +@@ -1017,11 +1017,11 @@ + gsCurPos = strlen(gsBuf); + gsStPos = gsEnPos = 0; + changedGSBuf(); +- if (ctrlColor) +- XClearArea(theDisp, popW, gsx+3,gsy+3, ++ if (ctrlColor) ++ XClearArea(theDisp, popW, gsx+3,gsy+3, + (u_int)gsw-5, (u_int)gsh-5, False); + else +- XClearArea(theDisp, popW, gsx+1,gsy+1, ++ XClearArea(theDisp, popW, gsx+1,gsy+1, + (u_int)gsw-1, (u_int)gsh-1, False); + drawGSBuf(); + +@@ -1032,7 +1032,7 @@ + DSetActive (&padWDial, (i!=PAD_LOAD)); + DSetActive (&padHDial, (i!=PAD_LOAD)); + +- XClearArea(theDisp, popW, 184+5, puhigh-140+3, ++ XClearArea(theDisp, popW, 184+5, puhigh-140+3, + (u_int) puwide-10-184-10, 130-6 - BUTTH-10, True); + + padMode = i; +@@ -1049,11 +1049,11 @@ + gsCurPos = strlen(gsBuf); + gsStPos = gsEnPos = 0; + changedGSBuf(); +- if (ctrlColor) +- XClearArea(theDisp, popW, gsx+3,gsy+3, ++ if (ctrlColor) ++ XClearArea(theDisp, popW, gsx+3,gsy+3, + (u_int)gsw-5, (u_int)gsh-5, False); + else +- XClearArea(theDisp, popW, gsx+1,gsy+1, ++ XClearArea(theDisp, popW, gsx+1,gsy+1, + (u_int)gsw-1, (u_int)gsh-1, False); + drawGSBuf(); + +@@ -1079,8 +1079,8 @@ + /* handle characters typed at GetStrPopUp window. Button accel. keys + have already been checked for elsewhere. Practical upshot is that + we don't have to do anything with ESC or Return (as these will normally +- be Cancel and Ok buttons) +- ++ be Cancel and Ok buttons) ++ + Normally returns '0'. Returns '1' if character wasn't accepted, for + whatever reason. */ + +@@ -1089,7 +1089,7 @@ + len = strlen(gsBuf); + if (gsFilter) flen = strlen(gsFilter); + else flen = 0; +- ++ + + if (c>=' ' && c<'\177') { /* 'NORMAL' CHARACTERS */ + if (flen) { /* check filter string */ +@@ -1097,7 +1097,7 @@ + if (!gsAllow && i< flen) return 1; /* found in 'disallow' filter */ + if ( gsAllow && i==flen) return 1; /* not found in 'allow' filter */ + } +- ++ + if (len >= gsBufLen-1) return 1; /* at max length */ + + xvbcopy(&gsBuf[gsCurPos], &gsBuf[gsCurPos+1], (size_t) len-gsCurPos+1); +@@ -1147,7 +1147,7 @@ + + changedGSBuf(); /* compute gsEnPos, gsStPos */ + +- if (ctrlColor) ++ if (ctrlColor) + XClearArea(theDisp, popW, gsx+3,gsy+3, (u_int)gsw-5, (u_int)gsh-5, False); + else + XClearArea(theDisp, popW, gsx+1,gsy+1, (u_int)gsw-1, (u_int)gsh-1, False); +@@ -1175,7 +1175,7 @@ + /***************************************************/ + static void changedGSBuf() + { +- /* cursor position (or whatever) may have changed. adjust displayed ++ /* cursor position (or whatever) may have changed. adjust displayed + portion of gsBuf */ + + int len; +@@ -1212,7 +1212,7 @@ + + XSetForeground(theDisp, theGC, infofg); + XDrawRectangle(theDisp, popW, theGC, gsx, gsy, (u_int) gsw, (u_int) gsh); +- Draw3dRect(popW, gsx+1, gsy+1, (u_int) gsw-2, (u_int) gsh-2, ++ Draw3dRect(popW, gsx+1, gsy+1, (u_int) gsw-2, (u_int) gsh-2, + R3D_IN, 2, hicol,locol,infobg); + + XSetForeground(theDisp, theGC, infofg); +diff -ruN xv-3.10a/xvps.c xv-3.10a-bugfixes/xvps.c +--- xv-3.10a/xvps.c 1994-12-22 14:34:42.000000000 -0800 ++++ xv-3.10a-bugfixes/xvps.c 2005-03-30 08:18:17.000000000 -0800 +@@ -1,4 +1,4 @@ +-/* ++/* + * xvps.c - Postscript dialog box, file output functions + * + * callable functions: +@@ -71,10 +71,13 @@ + static void psColorImage PARM((FILE *)); + static void psColorMap PARM((FILE *fp, int, int, byte *, byte *, byte *)); + static void psRleCmapImage PARM((FILE *, int)); +-static void epsPreview PARM((FILE *, byte *, int, int, int, int, ++static void epsPreview PARM((FILE *, byte *, int, int, int, int, + byte *, byte *, byte *, int)); + static int writeBWStip PARM((FILE *, byte *, char *, int, int, int)); + ++#ifdef GS_PATH ++static void buildCmdStr PARM((char *, char *, char *, int, int)); ++#endif + + + /* local variables */ +@@ -123,7 +126,7 @@ + void CreatePSD(geom) + char *geom; + { +- psW = CreateWindow("xv postscript", "XVps", geom, ++ psW = CreateWindow("xv postscript", "XVps", geom, + PSWIDE, PSHIGH, infofg, infobg, 0); + if (!psW) FatalError("can't create postscript window!"); + +@@ -139,9 +142,9 @@ + CBCreate(&encapsCB, psW, 240, 7, "preview", infofg, infobg, hicol, locol); + CBCreate(&pscompCB, psW, 331, 7, "compress", infofg, infobg, hicol, locol); + +- DCreate(&xsDial, psW, 240, 30, 80, 100, 10, 800, 100, 5, ++ DCreate(&xsDial, psW, 240, 30, 80, 100, 10, 800, 100, 5, + infofg, infobg, hicol, locol, "Width", "%"); +- DCreate(&ysDial, psW, 331, 30, 80, 100, 10, 800, 100, 5, ++ DCreate(&ysDial, psW, 331, 30, 80, 100, 10, 800, 100, 5, + infofg, infobg, hicol, locol, "Height", "%"); + xsDial.drawobj = changedScale; + ysDial.drawobj = changedScale; +@@ -154,38 +157,38 @@ + RBCreate(orientRB, psW, 36+80, 240+18, "Landscape", infofg, infobg, + hicol, locol); + +- paperRB = RBCreate(NULL, psW,36, 240+18+36, "8.5\"x11\"", ++ paperRB = RBCreate(NULL, psW,36, 240+18+36, "8.5\"x11\"", + infofg, infobg, hicol, locol); + RBCreate(paperRB, psW, 36+80, 240+18+36, "A4", + infofg, infobg, hicol, locol); +- RBCreate(paperRB, psW, 36+122, 240+18+36, "B5", ++ RBCreate(paperRB, psW, 36+122, 240+18+36, "B5", + infofg, infobg, hicol, locol); +- RBCreate(paperRB, psW, 36+164, 240+18+36, "A3", ++ RBCreate(paperRB, psW, 36+164, 240+18+36, "A3", + infofg, infobg, hicol, locol); + RBCreate(paperRB, psW, 36, 240+36+36, "8.5\"x14\"", + infofg, infobg, hicol, locol); +- RBCreate(paperRB, psW, 36+80, 240+36+36, "11\"x17\"", ++ RBCreate(paperRB, psW, 36+80, 240+36+36, "11\"x17\"", + infofg, infobg, hicol, locol); +- RBCreate(paperRB, psW, 36, 240+54+36, "4\"x5\"", ++ RBCreate(paperRB, psW, 36, 240+54+36, "4\"x5\"", + infofg, infobg, hicol, locol); +- RBCreate(paperRB, psW, 36+80, 240+54+36, "35mm slide", ++ RBCreate(paperRB, psW, 36+80, 240+54+36, "35mm slide", + infofg, infobg, hicol, locol); + +- BTCreate(&psbut[PS_BOK], psW, PSWIDE-180, PSHIGH-10-BUTTH, 80, BUTTH, ++ BTCreate(&psbut[PS_BOK], psW, PSWIDE-180, PSHIGH-10-BUTTH, 80, BUTTH, + "Ok", infofg, infobg, hicol, locol); +- BTCreate(&psbut[PS_BCANC], psW, PSWIDE-90, PSHIGH-10-BUTTH, 80, BUTTH, ++ BTCreate(&psbut[PS_BCANC], psW, PSWIDE-90, PSHIGH-10-BUTTH, 80, BUTTH, + "Cancel", infofg, infobg, hicol, locol); + +- BTCreate(&psbut[PS_BCENT], psW, 240, 154, 55, BUTTH-2, ++ BTCreate(&psbut[PS_BCENT], psW, 240, 154, 55, BUTTH-2, + "Center", infofg, infobg, hicol, locol); +- BTCreate(&psbut[PS_BORG], psW, 298, 154, 55, BUTTH-2, ++ BTCreate(&psbut[PS_BORG], psW, 298, 154, 55, BUTTH-2, + "Origin", infofg, infobg, hicol, locol); +- BTCreate(&psbut[PS_BMAX], psW, 356, 154, 55, BUTTH-2, ++ BTCreate(&psbut[PS_BMAX], psW, 356, 154, 55, BUTTH-2, + "Max", infofg, infobg, hicol, locol); + +- BTCreate(&psbut[PS_BPOSX], psW, 256-14, 190+13-8, 8,8, "", ++ BTCreate(&psbut[PS_BPOSX], psW, 256-14, 190+13-8, 8,8, "", + infofg, infobg, hicol, locol); +- BTCreate(&psbut[PS_BPOSY], psW, 256-14, 190+26-8, 8,8, "", ++ BTCreate(&psbut[PS_BPOSY], psW, 256-14, 190+26-8, 8,8, "", + infofg, infobg, hicol, locol); + + posxType = posyType = 0; +@@ -246,7 +249,7 @@ + + XMapSubwindows(theDisp, psW); + } +- ++ + + /***************************************************/ + void PSDialog(vis) +@@ -289,7 +292,7 @@ + x = e->x; y = e->y; w = e->width; h = e->height; + + /* throw away excess expose events for 'dumb' windows */ +- if (e->count > 0 && ++ if (e->count > 0 && + (e->window == xsDial.win || e->window == ysDial.win || + e->window == pageF)) {} + +@@ -332,7 +335,7 @@ + XKeyEvent *e = (XKeyEvent *) xev; + char buf[128]; KeySym ks; + int stlen, shift, ck; +- ++ + stlen = XLookupString(e,buf,128,&ks,(XComposeStatus *) NULL); + shift = e->state & ShiftMask; + ck = CursorKey(ks, shift, 0); +@@ -497,7 +500,7 @@ + XSetFont(theDisp, theGC, mfont); + } + +- ++ + /***************************************************/ + static void drawSizeStr() + { +@@ -522,7 +525,7 @@ + XSetFont(theDisp, theGC, mfont); + } + +- ++ + /***************************************************/ + static void drawResStr() + { +@@ -540,9 +543,9 @@ + XSetFont(theDisp, theGC, mfont); + } + +- +- +- ++ ++ ++ + /***************************************************/ + static void drawPage() + { +@@ -554,7 +557,7 @@ + XSetForeground(theDisp, theGC, infofg); + XDrawRectangle(theDisp, pageF, theGC, pageRect.x, pageRect.y, + (u_int) pageRect.width, (u_int) pageRect.height); +- ++ + drawIRect(1); + } + +@@ -611,7 +614,7 @@ + unsigned int mask; + double offx, offy, newx, newy; + +- /* compute offset (in inches) between 'drag point' and ++ /* compute offset (in inches) between 'drag point' and + the top-left corner of the image */ + + offx = ((mx - pageRect.x) / in2pix) - pos_inx; +@@ -642,7 +645,7 @@ + char *fullname; + + switch (cmd) { +- case PS_BOK: writePS(); ++ case PS_BOK: writePS(); + PSDialog(0); + fullname = GetDirFullName(); + if (!ISPIPE(fullname[0])) { +@@ -721,15 +724,15 @@ + + GetSaveSize(&w, &h); + +- sz_inx = (double) w / PIX2INCH * (xsDial.val / 100.0); +- sz_iny = (double) h / PIX2INCH * (ysDial.val / 100.0); ++ sz_inx = (double) w / PIX2INCH * (xsDial.val / 100.0); ++ sz_iny = (double) h / PIX2INCH * (ysDial.val / 100.0); + + /* round to integer .001ths of an inch */ + sz_inx = floor(sz_inx * 1000.0 + 0.5) / 1000.0; + sz_iny = floor(sz_iny * 1000.0 + 0.5) / 1000.0; + +- dpix = (int) (PIX2INCH / (xsDial.val / 100.0)); +- dpiy = (int) (PIX2INCH / (ysDial.val / 100.0)); ++ dpix = (int) (PIX2INCH / (xsDial.val / 100.0)); ++ dpiy = (int) (PIX2INCH / (ysDial.val / 100.0)); + + /* make sure 'center' of image is still on page */ + hsx = sz_inx/2; hsy = sz_iny/2; +@@ -783,20 +786,20 @@ + { + int x,y,w,h; + XRectangle xr; +- ++ + x = pageRect.x + (int) (pos_inx * in2pix); + y = pageRect.y + (int) (pos_iny * in2pix); + w = sz_inx * in2pix; + h = sz_iny * in2pix; +- ++ + xr.x = pageRect.x + 1; + xr.y = pageRect.y + 1; + xr.width = pageRect.width - 1; + xr.height = pageRect.height - 1; +- ++ + if (draw) XSetForeground(theDisp, theGC, infofg); + else XSetForeground(theDisp, theGC, infobg); +- ++ + XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted); + XDrawRectangle(theDisp, pageF, theGC, x, y, (u_int) w, (u_int) h); + XDrawLine(theDisp, pageF, theGC, x, y, x+w, y+h); +@@ -839,15 +842,15 @@ + DSetVal(&xsDial, (int) ((100 * (sz_inx * PIX2INCH) / w) + .5)); + DSetVal(&ysDial, xsDial.val); + +- sz_inx = (double) w / PIX2INCH * (xsDial.val / 100.0); +- sz_iny = (double) h / PIX2INCH * (ysDial.val / 100.0); ++ sz_inx = (double) w / PIX2INCH * (xsDial.val / 100.0); ++ sz_iny = (double) h / PIX2INCH * (ysDial.val / 100.0); + + /* round to integer .001ths of an inch */ + sz_inx = floor(sz_inx * 1000.0 + 0.5) / 1000.0; + sz_iny = floor(sz_iny * 1000.0 + 0.5) / 1000.0; + +- dpix = (int) (PIX2INCH / (xsDial.val / 100.0)); +- dpiy = (int) (PIX2INCH / (ysDial.val / 100.0)); ++ dpix = (int) (PIX2INCH / (xsDial.val / 100.0)); ++ dpiy = (int) (PIX2INCH / (ysDial.val / 100.0)); + + pos_inx = psizex/2 - sz_inx/2; + pos_iny = psizey/2 - sz_iny/2; +@@ -888,7 +891,7 @@ + static void writePS() + { + FILE *fp; +- int i, j, q, err, rpix, gpix, bpix, nc, ptype; ++ int i, j, err, rpix, gpix, bpix, nc, ptype; + int iw, ih, ox, oy, slen, lwidth, bits, colorps, w, h, pfree; + double iwf, ihf; + byte *inpix, *rmap, *gmap, *bmap; +@@ -900,13 +903,19 @@ + if (!fp) return; + + WaitCursor(); +- ++ + inpix = GenSavePic(&ptype, &w, &h, &pfree, &nc, &rmap, &gmap, &bmap); + +- ++ if (w <= 0 || h <= 0 || w*2 < w) { ++ SetISTR(ISTR_WARNING,"%s: Image dimensions out of range", filename); ++ CloseOutFile(fp, filename, 1); ++ return; ++ } ++ ++ + /* printed image will have size iw,ih (in picas) */ + iw = (int) (sz_inx * 72.0 + 0.5); +- ih = (int) (sz_iny * 72.0 + 0.5); ++ ih = (int) (sz_iny * 72.0 + 0.5); + iwf = sz_inx * 72.0; + ihf = sz_iny * 72.0; + +@@ -923,12 +932,12 @@ + fprintf(fp,"%%%%Creator: XV %s - by John Bradley\n",REVDATE); + + if (RBWhich(orientRB)==ORNT_LAND) /* Landscape mode */ +- fprintf(fp,"%%%%BoundingBox: %d %d %d %d\n", ++ fprintf(fp,"%%%%BoundingBox: %d %d %d %d\n", + (int) (pos_iny * 72.0 + 0.5), + (int) (pos_inx * 72.0 + 0.5), + (int) (pos_iny * 72.0 + 0.5) + ih, + (int) (pos_inx * 72.0 + 0.5) + iw); +- else ++ else + fprintf(fp,"%%%%BoundingBox: %d %d %d %d\n", ox, oy, ox+iw, oy+ih); + + fprintf(fp,"%%%%Pages: 1\n"); +@@ -943,9 +952,9 @@ + case F_BWDITHER: slen = (w+7)/8; bits = 1; colorps = 0; break; + default: FatalError("unknown colorType in writePS()"); break; + } +- ++ + if (encapsCB.val) epsPreview(fp, inpix, ptype, colorType, w, h, +- rmap,gmap,bmap, ++ rmap,gmap,bmap, + (RBWhich(orientRB)==ORNT_LAND) ); + + fprintf(fp,"%%%%EndProlog\n\n"); +@@ -978,7 +987,7 @@ + fprintf(fp,"%% print in landscape mode\n"); + fprintf(fp,"90 rotate 0 %d translate\n\n",(int) (-psizey*72.0)); + } +- ++ + if (RBWhich(paperRB) == PSZ_4BY5 || + RBWhich(paperRB) == PSZ_35MM) { + fprintf(fp,"%% we're going to a 4x5 or a 35mm film recorder.\n"); +@@ -1083,12 +1092,12 @@ + gpix = inpix[1]; + bpix = inpix[2]; + } +- +- if (colorps) { ++ ++ if (colorps) { + err = fprintf(fp,"%02x%02x%02x",rpix,gpix,bpix); + lwidth+=6; + } +- ++ + else { /* greyscale */ + err = fprintf(fp,"%02x", MONO(rpix,gpix,bpix)); + lwidth+=2; +@@ -1106,7 +1115,7 @@ + fprintf(fp,"\n\n"); + fprintf(fp,"%%\n"); + fprintf(fp,"%% Compression made this file %.2f%% %s\n", +- 100.0 * ((double) outbytes) / ++ 100.0 * ((double) outbytes) / + ((double) eWIDE * eHIGH * ((colorps) ? 3 : 1)), + "of the uncompressed size."); + fprintf(fp,"%%\n"); +@@ -1147,10 +1156,10 @@ + * + * returns length of the rleline vector + */ +- ++ + int i, j, blocklen, isrun, rlen; + byte block[256], pix; +- ++ + blocklen = isrun = rlen = 0; + + for (i=0; i<wide; i++) { +@@ -1186,7 +1195,7 @@ + } + } + } +- ++ + else { /* not a run */ + if (pix == block[blocklen-1]) { /* case 3: non-run, prev==cur */ + if (blocklen>1) { /* have a non-run block to flush */ +@@ -1215,7 +1224,7 @@ + + else { + rleline[rlen++] = (blocklen-1) | 0x80; +- for (j=0; j<blocklen; j++) ++ for (j=0; j<blocklen; j++) + rleline[rlen++] = block[j]; + } + +@@ -1231,15 +1240,15 @@ + + else { + rleline[rlen++] = (blocklen-1) | 0x80; +- for (j=0; j<blocklen; j++) ++ for (j=0; j<blocklen; j++) + rleline[rlen++] = block[j]; + } + } + + return rlen; + } +- +- ++ ++ + /**********************************************/ + static void psColorImage(fp) + FILE *fp; +@@ -1276,7 +1285,7 @@ + fprintf(fp," %% Utility procedure for colorimage operator.\n"); + fprintf(fp," %% This procedure takes two procedures off the\n"); + fprintf(fp," %% stack and merges them into a single procedure.\n\n"); +- ++ + fprintf(fp," /mergeprocs { %% def\n"); + fprintf(fp," dup length\n"); + fprintf(fp," 3 -1 roll\n"); +@@ -1326,12 +1335,12 @@ + for (i=0; i<nc; i++) { + if (color) fprintf(fp,"%02x%02x%02x ", rmap[i],gmap[i],bmap[i]); + else fprintf(fp,"%02x ", MONO(rmap[i],gmap[i],bmap[i])); +- ++ + if ((i%10) == 9) fprintf(fp,"\n"); + } + if (i%10) fprintf(fp,"\n"); + fprintf(fp,"pop pop %% lose return values from readhexstring\n\n\n"); +- ++ + } + + +@@ -1407,7 +1416,7 @@ + + + /**********************************************/ +-static void epsPreview(fp, pic, ptype, colorType, w, h, rmap,gmap,bmap, ++static void epsPreview(fp, pic, ptype, colorType, w, h, rmap,gmap,bmap, + landscape) + FILE *fp; + byte *pic; +@@ -1420,21 +1429,37 @@ + + + if (landscape) { /* generate a rotated version of the pic */ +- int bperpix; ++ int npixels, bufsize; + byte *lpic; + +- bperpix = (ptype == PIC8) ? 1 : 3; +- lpic = (byte *) malloc((size_t) w * h * bperpix); ++ npixels = w * h; ++ if (w <= 0 || h <= 0 || npixels/w != h) { ++ SetISTR(ISTR_WARNING,"%s: Image dimensions out of range", filename); ++/* CloseOutFile(fp, filename, 1); can't do since caller still writing */ ++ return; ++ } ++ if (ptype == PIC8) ++ bufsize = npixels; ++ else { ++ bufsize = 3*npixels; ++ if (bufsize/3 != npixels) { ++ SetISTR(ISTR_WARNING,"%s: Image dimensions out of range", filename); ++/* CloseOutFile(fp, filename, 1); can't do since caller still writing */ ++ return; ++ } ++ } ++ ++ lpic = (byte *) malloc((size_t) bufsize); + if (!lpic) FatalError("can't alloc mem to rotate image in epsPreview"); + +- xvbcopy((char *) pic, (char *) lpic, (size_t) w * h * bperpix); ++ xvbcopy((char *) pic, (char *) lpic, (size_t) bufsize); + RotatePic(lpic, ptype, &w, &h, 0); + pic = lpic; + } +- ++ + + /* put in an EPSI preview */ +- ++ + if (colorType != F_BWDITHER) { /* have to generate a preview */ + prev = FSDither(pic, ptype, w, h, rmap,gmap,bmap, 0, 1); + +@@ -1451,8 +1476,8 @@ + flipbw = (MONO(rmap[0],gmap[0],bmap[0]) > MONO(rmap[1],gmap[1],bmap[1])); + } + +- +- fprintf(fp,"%%%%BeginPreview: %d %d %d %d\n", w, h, 1, ++ ++ fprintf(fp,"%%%%BeginPreview: %d %d %d %d\n", w, h, 1, + (w/(72*4) + 1) * h); + + writeBWStip(fp, prev, "% ", w, h, !flipbw); +@@ -1471,7 +1496,7 @@ + char *prompt; + int w, h, flipbw; + { +- /* write the given 'pic' (B/W stippled, 1 byte per pixel, 0=blk,1=wht) ++ /* write the given 'pic' (B/W stippled, 1 byte per pixel, 0=blk,1=wht) + out as hexadecimal, max of 72 hex chars per line. + + if 'flipbw', then 0=white, 1=black +@@ -1535,25 +1560,32 @@ + document is multiple pages, a series of PNM files are created, and + the first one is loaded (but not deleted) */ + +- +- char tmp[512], tmp1[512], tmpname[64]; +- int gsresult, nump, i, filetype; ++#ifdef GS_PATH ++ char tmp[512], gscmd[512], cmdstr[512], tmpname[64]; ++ int gsresult, nump, i, filetype, doalert, epsf; + char *rld; ++#endif + + pinfo->pic = (byte *) NULL; + pinfo->comment = (char *) NULL; + +- + #ifdef GS_PATH + ++ doalert = (!quick && !ctrlUp && !infoUp); /* open alert if no info wins */ ++ epsf = 0; ++ + #ifndef VMS + sprintf(tmpname, "%s/xvpgXXXXXX", tmpdir); + #else + sprintf(tmpname, "Sys$Scratch:xvpgXXXXXX"); + #endif + ++#ifdef USE_MKSTEMP ++ close(mkstemp(tmpname)); ++#else + mktemp(tmpname); +- if (tmpname[0] == '\0') { /* mktemp() blew up */ ++#endif ++ if (tmpname[0] == '\0') { /* mktemp() or mkstemp() blew up */ + sprintf(str,"LoadPS: Unable to create temporary filename???"); + ErrPopUp(str, "\nHow unlikely!"); + return 0; +@@ -1561,13 +1593,13 @@ + strcat(tmpname,"."); + + +- /* build command string */ ++ /* build 'gscmd' string */ + + #ifndef VMS /* VMS needs quotes around mixed case command lines */ +- sprintf(tmp, "%s -sDEVICE=%s -r%d -q -dNOPAUSE -sOutputFile=%s%%d ", ++ sprintf(gscmd, "%s -sDEVICE=%s -r%d -q -dNOPAUSE -sOutputFile=%s%%d ", + GS_PATH, gsDev, gsRes, tmpname); + #else +- sprintf(tmp, ++ sprintf(gscmd, + "%s \"-sDEVICE=%s\" -r%d -q \"-dNOPAUSE\" \"-sOutputFile=%s%%d\" ", + GS_PATH, gsDev, gsRes, tmpname); + #endif +@@ -1575,74 +1607,60 @@ + + #ifdef GS_LIB + # ifndef VMS +- sprintf(tmp1, "-I%s ", GS_LIB); ++ sprintf(tmp, "-I%s ", GS_LIB); + # else +- sprintf(tmp1, "\"-I%s\"", GS_LIB); ++ sprintf(tmp, "\"-I%s\" ", GS_LIB); + # endif +- strcat(tmp, tmp1); ++ strcat(gscmd, tmp); + #endif + +- if (gsGeomStr) { +- sprintf(tmp1, "-g%s ", gsGeomStr); +- strcat(tmp, tmp1); +- } +- +- /* if 'quick' is set, stop processing after first page by tacking +- some PostScript commands that break the 'showpage' operator onto +- the front of the stream passed to the ghostscript interpreter */ + ++ /* prevent some potential naughtiness... */ + #ifndef VMS +- if (quick) { +- sprintf(tmp1, "echo '%s' | cat - %s | %s -", +- "/showpage { showpage quit } bind def", /* mk showpage exit */ +- fname, tmp); +- strcpy(tmp, tmp1); +- } +- else { +- strcat(tmp, " -- "); +- strcat(tmp, fname); +- } +-#else /* VMS */ +- /* VMS doesn't have pipes or an 'echo' command and GS doesn't like +- Unix-style file names as input files in the VMS version */ +- strcat(tmp, " -- "); +- rld = strrchr(fname, '/'); /* Pointer to last '/' */ +- if (rld) rld++; /* Pointer to filename */ +- else rld = fname; /* No path - use original string */ +- strcat(tmp, rld); ++ strcat(gscmd, "-dSAFER "); ++#else ++ strcat(gscmd, "\"-dSAFER\" "); + #endif + + ++ if (gsGeomStr) { ++ sprintf(tmp, "-g%s ", gsGeomStr); ++ strcat(gscmd, tmp); ++ } + + +- WaitCursor(); +- +- if (DEBUG) fprintf(stderr,"LoadPS: executing command '%s'\n", tmp); +- SetISTR(ISTR_INFO, "Running '%s'...", GS_PATH); ++ do { ++ buildCmdStr(cmdstr, gscmd, fname, quick, epsf); + +- sprintf(tmp1, "Running %s", tmp); +- if (!quick && !ctrlUp && !infoUp) OpenAlert(tmp1); ++ if (DEBUG) fprintf(stderr,"LoadPS: executing command '%s'\n", cmdstr); ++ SetISTR(ISTR_INFO, "Running '%s'...", GS_PATH); ++ sprintf(tmp, "Running %s", cmdstr); ++ if (doalert && epsf==0) OpenAlert(tmp); /* open alert first time only */ + +-#ifndef VMS +- gsresult = system(tmp); +-#else +- gsresult = !system(tmp); ++ WaitCursor(); ++ gsresult = system(cmdstr); ++ WaitCursor(); ++#ifdef VMS ++ gsresult = !gsresult; /* VMS returns non-zero if OK */ + #endif + +- WaitCursor(); ++ /* count # of files produced... */ ++ for (i=1; i<1000; i++) { ++ struct stat st; ++ sprintf(tmp, "%s%d", tmpname, i); ++ if (stat(tmp, &st)!=0) break; ++ } ++ nump = i-1; ++ WaitCursor(); + +- if (!quick && !ctrlUp && !infoUp) CloseAlert(); ++ /* EPSF hack: if gsresult==0 (OK) and 0 pages produced, ++ try tacking a 'showpage' onto the end of the file, do it again... */ ++ ++ if (!gsresult && !nump && !epsf) epsf++; ++ } while (!gsresult && !nump && epsf<2); ++ ++ if (doalert) CloseAlert(); + +- /* figure out how many page files were created, by stating files. +- breaks out on first failure, assuming there won't be any more after +- that, and it would complicate matters too much anyhow... */ +- +- for (i=1; i<1000; i++) { +- struct stat st; +- sprintf(tmp, "%s%d", tmpname, i); +- if (stat(tmp, &st)!=0) break; +- } +- nump = i-1; + + WaitCursor(); + +@@ -1664,7 +1682,7 @@ + return 0; + } + +- SetISTR(ISTR_INFO, "Running '%s'... Done. (%d page%s)", ++ SetISTR(ISTR_INFO, "Running '%s'... Done. (%d page%s)", + GS_PATH, nump, (nump==1) ? "" : "s"); + } + +@@ -1677,8 +1695,8 @@ + + sprintf(tmp, "%s%d", tmpname, 1); + filetype = ReadFileType(tmp); +- +- if (filetype == RFT_ERROR || filetype == RFT_UNKNOWN || ++ ++ if (filetype == RFT_ERROR || filetype == RFT_UNKNOWN || + filetype == RFT_COMPRESS) { /* shouldn't happen */ + SetISTR(ISTR_WARNING, "Couldn't load first page '%s'", tmp); + KillPageFiles(tmpname, nump); +@@ -1695,7 +1713,7 @@ + KillPageFiles(tmpname, nump); + SetCursors(-1); + return 0; +- } ++ } + + + /* SUCCESS! */ +@@ -1712,3 +1730,38 @@ + we don't have 'gs' package */ + } + ++ ++ ++/******************************************************************/ ++#ifdef GS_PATH ++void buildCmdStr(str, gscmd, fname, quick, epsf) ++ char *str, *gscmd, *fname; ++ int quick, epsf; ++{ ++ /* note 'epsf' set only on files that don't have a showpage cmd */ ++ ++#ifndef VMS ++ ++ if (epsf) sprintf(str, "echo '\n showpage ' | cat '%s' - | %s -", ++ fname, gscmd); ++ ++ else if (quick) sprintf(str, "echo '%s' | cat - '%s' | %s -", ++ "/showpage { showpage quit } bind def", ++ fname, gscmd); ++ ++ else sprintf(str, "%s -- %s", gscmd, fname); ++ ++#else /* VMS */ ++ /* VMS doesn't have pipes or an 'echo' command and GS doesn't like ++ Unix-style file names as input files in the VMS version */ ++ strcat(tmp, " -- "); ++ rld = strrchr(fname, '/'); /* Pointer to last '/' */ ++ if (rld) rld++; /* Pointer to filename */ ++ else rld = fname; /* No path - use original string */ ++ strcat(tmp, rld); ++#endif /* VMS */ ++} ++#endif /* GS_PATH */ ++ ++ ++ +diff -ruN xv-3.10a/xvrle.c xv-3.10a-bugfixes/xvrle.c +--- xv-3.10a/xvrle.c 1995-01-19 09:27:47.000000000 -0800 ++++ xv-3.10a-bugfixes/xvrle.c 2005-03-29 23:29:14.000000000 -0800 +@@ -43,8 +43,8 @@ + byte bgcol[256]; + byte maps[3][256]; + int xpos, ypos, w, h, flags, ncolors, pixelbits, ncmap, cmaplen; +- int cmtlen; +- byte *img, *pic8; ++ int cmtlen, npixels, bufsize=0; ++ byte *img; + long filesize; + char *bname, *errstr; + +@@ -57,7 +57,7 @@ + /* open the stream */ + fp = xv_fopen(fname,"r"); + if (!fp) return (rleError(bname, "unable to open file")); +- ++ + + /* figure out the file size */ + fseek(fp, 0L, 2); +@@ -85,7 +85,7 @@ + if (DEBUG) { + fprintf(stderr,"RLE: %dx%d image at %d,%d\n", w, h, xpos, ypos); + fprintf(stderr,"flags: 0x%02x (%s%s%s%s)\n", +- flags, ++ flags, + (flags & H_CLEARFIRST) ? "CLEARFIRST " : "", + (flags & H_NO_BACKGROUND) ? "NO_BG " : "", + (flags & H_ALPHA) ? "ALPHA " : "", +@@ -93,7 +93,7 @@ + + fprintf(stderr, "%d bands, %d pixelbits, %d cmap bands, %d cmap entries\n", + ncolors, pixelbits, ncmap, cmaplen); +- } ++ } + + if (!(flags & H_NO_BACKGROUND)) { + if (DEBUG) fprintf(stderr, "background value: "); +@@ -176,32 +176,44 @@ + + errstr = NULL; + if (ncolors == 0 || ncolors == 2) +- errstr = "Unsupt. # of channels in RLE file.\n"; ++ errstr = "Unsupported number of channels in RLE file"; + + if (pixelbits != 8) +- errstr = "Only 8-bit pixels supported in RLE files.\n"; ++ errstr = "Only 8-bit pixels supported in RLE files"; + + if (ncmap==0 || ncmap==1 || ncmap == 3 || ncmap == ncolors) { /* ok */ } +- else errstr = "Invalid # of colormap channels in RLE file.\n"; ++ else errstr = "Invalid number of colormap channels in RLE file"; + +- if (w<1 || h<1) +- errstr = "Bogus size in RLE header.\n"; ++ npixels = w * h; ++ if (w <= 0 || h <= 0 || npixels/w != h) ++ errstr = "RLE image dimensions out of range"; + + + if (errstr) { + fclose(fp); +- if (pinfo->comment) free(pinfo->comment); pinfo->comment = (char *) NULL; ++ if (pinfo->comment) ++ free(pinfo->comment); ++ pinfo->comment = (char *) NULL; + return rleError(bname, errstr); + } + + + /* allocate image memory */ +- if (ncolors == 1) img = (byte *) calloc((size_t) w * h, (size_t) 1); +- else img = (byte *) calloc((size_t) w * h * 3, (size_t) 1); ++ if (ncolors == 1) ++ img = (byte *) calloc((size_t) npixels, (size_t) 1); ++ else { ++ bufsize = 3*npixels; ++ if (bufsize/3 != npixels) ++ return rleError(bname, "RLE image dimensions out of range"); ++ img = (byte *) calloc((size_t) bufsize, (size_t) 1); ++ } ++ + if (!img) { + fclose(fp); +- if (pinfo->comment) free(pinfo->comment); pinfo->comment = (char *) NULL; +- return rleError(bname, "unable to allocate image data.\n"); ++ if (pinfo->comment) ++ free(pinfo->comment); ++ pinfo->comment = (char *) NULL; ++ return rleError(bname, "Unable to allocate RLE image data"); + } + + +@@ -209,10 +221,10 @@ + if ((flags & H_CLEARFIRST) && !(flags & H_NO_BACKGROUND)) { + byte *ip; + if (ncolors == 1) { +- for (i=0, ip=img; i<w*h; i++, ip++) *ip = bgcol[0]; ++ for (i=0, ip=img; i<npixels; i++, ip++) *ip = bgcol[0]; + } + else { +- for (i=0, ip=img; i<w*h; i++) ++ for (i=0, ip=img; i<npixels; i++) + for (j=0; j<3; j++, ip++) *ip = bgcol[j]; + } + } +@@ -230,7 +242,7 @@ + if (ncmap) { + byte *ip; + int imagelen, cmask; +- imagelen = (ncolors==1) ? w*h : w*h*3; ++ imagelen = (ncolors==1) ? npixels : bufsize; + cmask = (cmaplen-1); + + if (ncmap == 1) { /* single gamma curve */ +@@ -238,7 +250,7 @@ + } + + else if (ncmap >= 3 && ncolors >=3) { /* one curve per band */ +- for (i=0, ip=img; i<w*h; i++) { ++ for (i=0, ip=img; i<npixels; i++) { + *ip = maps[0][*ip & cmask]; ip++; + *ip = maps[1][*ip & cmask]; ip++; + *ip = maps[2][*ip & cmask]; ip++; +@@ -250,7 +262,7 @@ + /* finally, convert into XV internal format */ + + pinfo->pic = img; +- pinfo->w = w; ++ pinfo->w = w; + pinfo->h = h; + pinfo->normw = pinfo->w; pinfo->normh = pinfo->h; + pinfo->frmType = -1; /* no default format to save in */ +@@ -260,7 +272,7 @@ + if (ncmap == 0 || ncmap == 1) { /* grey, or grey with gamma curve */ + pinfo->colType = F_GREYSCALE; + sprintf(pinfo->fullInfo, "Greyscale RLE. (%ld bytes)", filesize); +- for (i=0; i<256; i++) ++ for (i=0; i<256; i++) + pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i; + } + else { +@@ -272,7 +284,7 @@ + pinfo->b[i] = maps[2][i]; + } + } +- ++ + sprintf(pinfo->shrtInfo, "%dx%d RLE.",w, h); + } + +@@ -294,7 +306,7 @@ + int w, h, ncolors, ncmap; + { + int posx, posy, plane, bperpix, i, pixval, skipcalls; +- int opcode, operand, done, c, c1; ++ int opcode, operand, done, c, c1; + byte *ip; + + posx = posy = plane = done = skipcalls = 0; +@@ -324,7 +336,7 @@ + case RSkipPixelsOp: + if (opcode & LONG_OP) { getc(fp); operand = GETINT(fp); } + else operand = getc(fp); +- ++ + posx += operand; + break; + +@@ -340,7 +352,7 @@ + c = getc(fp); + if (plane<ncolors && posy<h && (posx+i < w)) *ip = c; + } +- ++ + if (operand & 1) getc(fp); /* word boundary */ + posx += operand; + break; +@@ -358,7 +370,7 @@ + for (i=0; i<operand; i++, ip+=bperpix) { + if (plane<ncolors && posy<h && (posx+i < w)) *ip = pixval; + } +- ++ + /* if (operand & 1) getc(fp); */ /* word boundary */ + posx += operand; + break; +diff -ruN xv-3.10a/xvroot.c xv-3.10a-bugfixes/xvroot.c +--- xv-3.10a/xvroot.c 1994-12-22 14:34:42.000000000 -0800 ++++ xv-3.10a-bugfixes/xvroot.c 2004-05-16 18:04:21.000000000 -0700 +@@ -22,7 +22,7 @@ + /***********************************/ + void MakeRootPic() + { +- /* called after 'epic' has been generated (if we're using root). ++ /* called after 'epic' has been generated (if we're using root). + creates the XImage and the pixmap, sets the root to the new + pixmap, and refreshes the display */ + +@@ -67,32 +67,32 @@ + + + if (rmode == RM_NORMAL || rmode == RM_TILE) { +- XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, 0,0, ++ XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, 0,0, + (u_int) eWIDE, (u_int) eHIGH); + } + + else if (rmode == RM_MIRROR || rmode == RM_IMIRROR) { + /* quadrant 2 */ +- XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, 0,0, ++ XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, 0,0, + (u_int) eWIDE, (u_int) eHIGH); + if (epic == NULL) FatalError("epic == NULL in RM_MIRROR code...\n"); + + /* quadrant 1 */ + FlipPic(epic, eWIDE, eHIGH, 0); /* flip horizontally */ + CreateXImage(); +- XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, eWIDE,0, ++ XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, eWIDE,0, + (u_int) eWIDE, (u_int) eHIGH); + + /* quadrant 4 */ + FlipPic(epic, eWIDE, eHIGH, 1); /* flip vertically */ + CreateXImage(); +- XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, eWIDE,eHIGH, ++ XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, eWIDE,eHIGH, + (u_int) eWIDE, (u_int) eHIGH); + + /* quadrant 3 */ + FlipPic(epic, eWIDE, eHIGH, 0); /* flip horizontally */ + CreateXImage(); +- XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, 0,eHIGH, ++ XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, 0,eHIGH, + (u_int) eWIDE, (u_int) eHIGH); + + FlipPic(epic, eWIDE, eHIGH, 1); /* flip vertically (back to orig) */ +@@ -122,15 +122,15 @@ + for (i=ay; i < (int) eHIGH; i+=h) { + for (j=ax; j < (int) eWIDE; j+=w) { + /* if image goes off tmpPix, only draw subimage */ +- ++ + x = j; y = i; w1 = w; h1 = h; offx = offy = 0; + if (x<0) { offx = -x; w1 -= offx; x = 0; } + if (x+w1>eWIDE) { w1 = (eWIDE-x); } + + if (y<0) { offy = -y; h1 -= offy; y = 0; } + if (y+h1>eHIGH) { h1 = (eHIGH-y); } +- +- XPutImage(theDisp, tmpPix, theGC, theImage, offx, offy, ++ ++ XPutImage(theDisp, tmpPix, theGC, theImage, offx, offy, + x, y, (u_int) w1, (u_int) h1); + } + } +@@ -140,7 +140,7 @@ + + else if (rmode == RM_CWARP) { /* warp effect */ + XSetForeground(theDisp, theGC, rootfg); +- for (i=0; i<=dispWIDE; i+=8) ++ for (i=0; i<=dispWIDE; i+=8) + XDrawLine(theDisp,tmpPix,theGC, i,0, (int) dispWIDE-i,(int) dispHIGH); + for (i=0; i<=dispHIGH; i+=8) + XDrawLine(theDisp,tmpPix,theGC, 0,i, (int) dispWIDE, (int) dispHIGH-i); +@@ -150,16 +150,16 @@ + XSetForeground(theDisp, theGC, rootfg); + for (i=k=0; i<dispHIGH; i+=20,k++) { + XDrawLine(theDisp, tmpPix, theGC, 0, i, (int) dispWIDE, i); +- for (j=(k&1) * 20 + 10; j<dispWIDE; j+=40) ++ for (j=(k&1) * 20 + 10; j<dispWIDE; j+=40) + XDrawLine(theDisp, tmpPix, theGC, j,i,j,i+20); + } + } + + + /* draw the image centered on top of the background */ +- if (rmode != RM_CENTILE) +- XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, +- ((int) dispWIDE-eWIDE)/2, ((int) dispHIGH-eHIGH)/2, ++ if (rmode != RM_CENTILE) ++ XPutImage(theDisp, tmpPix, theGC, theImage, 0,0, ++ ((int) dispWIDE-eWIDE)/2, ((int) dispHIGH-eHIGH)/2, + (u_int) eWIDE, (u_int) eHIGH); + } + +@@ -172,7 +172,7 @@ + if (dispWIDE == eWIDE) { + /* horizontal center line */ + int y, ay; +- ++ + y = eHIGH - ((dispHIGH/2)%eHIGH); /* Starting point in picture to copy */ + ay = 0; /* Vertical anchor point */ + while (ay < dispHIGH) { +@@ -189,7 +189,7 @@ + else if (dispHIGH == eHIGH) { + /* vertical centerline */ + int x, ax; +- ++ + x = eWIDE - ((dispWIDE/2)%eWIDE); /* Starting point in picture to copy */ + ax = 0; /* Horizontal anchor point */ + while (ax < dispWIDE) { +@@ -206,10 +206,10 @@ + else { + /* vertical and horizontal centerlines */ + int x,y, ax,ay; +- ++ + y = eHIGH - ((dispHIGH/2)%eHIGH); /* Starting point in picture to copy */ + ay = 0; /* Vertical anchor point */ +- ++ + while (ay < dispHIGH) { + x = eWIDE - ((dispWIDE/2)%eWIDE);/* Starting point in picture to cpy */ + ax = 0; /* Horizontal anchor point */ +@@ -276,8 +276,8 @@ + gc_init.foreground = BlackPixel(theDisp, theScreen); + gc_init.background = WhitePixel(theDisp, theScreen); + gc = XCreateGC(theDisp, vrootW, GCForeground|GCBackground, &gc_init); +- pix = XCreatePixmap(theDisp, vrootW, root_weave_width, +- root_weave_height, ++ pix = XCreatePixmap(theDisp, vrootW, root_weave_width, ++ root_weave_height, + (unsigned int) DefaultDepth(theDisp, theScreen)); + + XCopyPlane(theDisp, bitmap, pix, gc, 0,0, root_weave_width, +@@ -333,8 +333,8 @@ + prop = XInternAtom(theDisp, "_XSETROOT_ID", True); + if (prop == None) return; /* no old pixmap to kill */ + +- if (XGetWindowProperty(theDisp, vrootW, prop, 0L, 1L, True, +- AnyPropertyType, &type, &format, &length, ++ if (XGetWindowProperty(theDisp, vrootW, prop, 0L, 1L, True, ++ AnyPropertyType, &type, &format, &length, + &after, &data) == Success) { + + if (type==XA_PIXMAP && format==32 && length==1 && after==0 && data) { +@@ -348,4 +348,4 @@ + + + +- ++ +diff -ruN xv-3.10a/xvscrl.c xv-3.10a-bugfixes/xvscrl.c +--- xv-3.10a/xvscrl.c 1994-12-22 14:34:41.000000000 -0800 ++++ xv-3.10a-bugfixes/xvscrl.c 2004-05-16 18:04:25.000000000 -0700 +@@ -1,4 +1,4 @@ +-/* ++/* + * xvscrl.c - Scroll Bar handling functions + * + * callable functions: +@@ -6,7 +6,7 @@ + * SCCreate() - creates the Scroll Bar window. + * SCChange() - resize/repositions the Scroll Bar window. + * SCSetRange() - sets min/max/current values of control +- * SCSetVal() - sets value of control ++ * SCSetVal() - sets value of control + * SCRedraw() - redraws scroll bar + * SCTrack() - called when clicked. Operates control 'til mouseup + */ +@@ -50,7 +50,7 @@ + + + /***************************************************/ +-void SCCreate(sp, parent, x, y, vert, len, minv, maxv, curv, page, ++void SCCreate(sp, parent, x, y, vert, len, minv, maxv, curv, page, + fg, bg, hi, lo, func) + SCRL *sp; + Window parent; +@@ -71,7 +71,7 @@ + downhPix = MakePix1(parent, downh_bits, downh_width, downh_height); + uph1Pix = MakePix1(parent, uph1_bits, uph1_width, uph1_height); + downh1Pix= MakePix1(parent, downh1_bits, downh1_width, downh1_height); +- ++ + sgray = XCreatePixmapFromBitmapData(theDisp, parent, + (char *) scrlgray_bits, scrlgray_width, scrlgray_height, + fg,bg,dispDEEP); +@@ -124,7 +124,7 @@ + sp->len = len; + sp->uplit = sp->dnlit = 0; + +- if (vert) XMoveResizeWindow(theDisp, sp->win, x,y, ++ if (vert) XMoveResizeWindow(theDisp, sp->win, x,y, + (u_int) sp->tsize,(u_int) len); + else XMoveResizeWindow(theDisp, sp->win, x,y, + (u_int) len, (u_int) sp->tsize); +@@ -144,7 +144,7 @@ + if (maxv<minv) maxv=minv; + sp->min = minv; sp->max = maxv; sp->page = page; + sp->active = (minv < maxv); +- ++ + /* adjust scroll bar background */ + if (sp->active) { + if (ctrlColor) XSetWindowBackground(theDisp, sp->win, sp->lo); +@@ -174,7 +174,7 @@ + + sp->val = curv; + +- if (sp->active) ++ if (sp->active) + sp->tpos = sp->tmin + ((sp->tmax - sp->tmin)*(curv - sp->min)) + / (sp->max - sp->min); + +@@ -194,20 +194,20 @@ + XSetBackground(theDisp, theGC, sp->bg); + + XClearWindow(theDisp, sp->win); +- ++ + drawArrow(sp,UPLINE); /* draw up/down arrows */ + drawArrow(sp,DNLINE); + + XSetForeground(theDisp, theGC, sp->fg); + +- if (sp->vert) { ++ if (sp->vert) { + XDrawLine(theDisp, sp->win, theGC, 0, sp->tsize, sp->tsize, sp->tsize); +- XDrawLine(theDisp, sp->win, theGC, 0, sp->len-sp->tsize-1, ++ XDrawLine(theDisp, sp->win, theGC, 0, sp->len-sp->tsize-1, + sp->tsize, sp->len-sp->tsize-1); + } + else { /* horizontal version */ + XDrawLine(theDisp, sp->win, theGC, sp->tsize, 0, sp->tsize, sp->tsize); +- XDrawLine(theDisp, sp->win, theGC, sp->len - sp->tsize-1, 0, ++ XDrawLine(theDisp, sp->win, theGC, sp->len - sp->tsize-1, 0, + sp->len - sp->tsize-1, sp->tsize); + } + +@@ -225,7 +225,7 @@ + + if (arr == UPLINE) { + XSetForeground(theDisp, theGC, sp->bg); +- XFillRectangle(theDisp, sp->win, theGC, 0, 0, ++ XFillRectangle(theDisp, sp->win, theGC, 0, 0, + (u_int) sp->tsize, (u_int) sp->tsize); + + if (sp->vert) butpix = (sp->uplit) ? up1Pix : upPix; +@@ -235,14 +235,14 @@ + XSetBackground(theDisp, theGC, sp->bg); + XCopyPlane(theDisp, butpix, sp->win, theGC, 0, 0, up_width,up_height, + 3,3, 1L); +- Draw3dRect(sp->win, 0,0, (u_int) sp->tsize-1, (u_int) sp->tsize-1, ++ Draw3dRect(sp->win, 0,0, (u_int) sp->tsize-1, (u_int) sp->tsize-1, + (sp->uplit) ? R3D_IN : R3D_OUT, 2, sp->hi, sp->lo, sp->bg); + } + + else if (arr == DNLINE) { + if (sp->vert) { + XSetForeground(theDisp, theGC, sp->bg); +- XFillRectangle(theDisp, sp->win, theGC, 0, sp->len - sp->tsize, ++ XFillRectangle(theDisp, sp->win, theGC, 0, sp->len - sp->tsize, + (u_int) sp->tsize, (u_int) sp->tsize); + butpix = (sp->dnlit) ? down1Pix : downPix; + +@@ -251,8 +251,8 @@ + XCopyPlane(theDisp, butpix, sp->win, theGC, 0, 0, up_width,up_height, + 3, sp->len - 3 - up_height, 1L); + +- Draw3dRect(sp->win, 0, sp->len - sp->tsize, +- (u_int) sp->tsize-1, (u_int) sp->tsize-1, ++ Draw3dRect(sp->win, 0, sp->len - sp->tsize, ++ (u_int) sp->tsize-1, (u_int) sp->tsize-1, + (sp->dnlit) ? R3D_IN : R3D_OUT, 2, sp->hi, sp->lo, sp->bg); + } + +@@ -267,8 +267,8 @@ + XCopyPlane(theDisp, butpix, sp->win, theGC, 0, 0, up_width,up_height, + sp->len - 3 - up_width, 3, 1L); + +- Draw3dRect(sp->win, sp->len - sp->tsize, 0, +- (u_int) sp->tsize-1, (u_int) sp->tsize-1, ++ Draw3dRect(sp->win, sp->len - sp->tsize, 0, ++ (u_int) sp->tsize-1, (u_int) sp->tsize-1, + (sp->dnlit) ? R3D_IN : R3D_OUT, 2, sp->hi, sp->lo, sp->bg); + } + } +@@ -283,17 +283,17 @@ + { + if (sp->vert) { + /* clear out thumb area with background color */ +- XClearArea(theDisp, sp->win, 0, sp->tsize+1, (u_int) sp->tsize, ++ XClearArea(theDisp, sp->win, 0, sp->tsize+1, (u_int) sp->tsize, + (u_int) ((sp->len-sp->tsize-1)-(sp->tsize+1)), False); + + if (sp->active) { /* a thumb is necessary */ + + XSetForeground(theDisp, theGC, sp->bg); +- XFillRectangle(theDisp, sp->win, theGC, 1, sp->tpos+1, ++ XFillRectangle(theDisp, sp->win, theGC, 1, sp->tpos+1, + (u_int) (sp->tsize-2), (u_int) (sp->tsize-2)); + + XSetForeground(theDisp, theGC, sp->fg); +- XDrawRectangle(theDisp, sp->win, theGC, 0, sp->tpos, ++ XDrawRectangle(theDisp, sp->win, theGC, 0, sp->tpos, + (u_int) (sp->tsize-1), (u_int) (sp->tsize-1)); + + XDrawLine(theDisp, sp->win, theGC, 9-3, sp->tpos+6, 9+3, sp->tpos+6); +@@ -301,7 +301,7 @@ + XDrawLine(theDisp, sp->win, theGC, 9-3, sp->tpos+10,9+3, sp->tpos+10); + XDrawLine(theDisp, sp->win, theGC, 9-3, sp->tpos+12,9+3, sp->tpos+12); + +- Draw3dRect(sp->win, 1, sp->tpos+1, ++ Draw3dRect(sp->win, 1, sp->tpos+1, + (u_int) sp->tsize-3, (u_int) sp->tsize-3, R3D_OUT,2, + sp->hi, sp->lo, sp->bg); + } +@@ -309,17 +309,17 @@ + + else { /* horizontal */ + /* clear out thumb area with background color */ +- XClearArea(theDisp, sp->win, sp->tsize+1, 0, +- (u_int) ((sp->len-sp->tsize-1)-(sp->tsize+1)), ++ XClearArea(theDisp, sp->win, sp->tsize+1, 0, ++ (u_int) ((sp->len-sp->tsize-1)-(sp->tsize+1)), + (u_int) sp->tsize, False); + + if (sp->active) { /* a thumb is necessary */ + XSetForeground(theDisp, theGC, sp->bg); +- XFillRectangle(theDisp, sp->win, theGC, sp->tpos+1, 1, ++ XFillRectangle(theDisp, sp->win, theGC, sp->tpos+1, 1, + (u_int) (sp->tsize-2), (u_int) (sp->tsize-2)); + + XSetForeground(theDisp, theGC, sp->fg); +- XDrawRectangle(theDisp, sp->win, theGC, sp->tpos, 0, ++ XDrawRectangle(theDisp, sp->win, theGC, sp->tpos, 0, + (u_int) (sp->tsize-1), (u_int) (sp->tsize-1)); + + XDrawLine(theDisp, sp->win, theGC, sp->tpos+6, 9-3, sp->tpos+6, 9+3); +@@ -327,7 +327,7 @@ + XDrawLine(theDisp, sp->win, theGC, sp->tpos+10,9-3, sp->tpos+10,9+3); + XDrawLine(theDisp, sp->win, theGC, sp->tpos+12,9-3, sp->tpos+12,9+3); + +- Draw3dRect(sp->win, sp->tpos+1, 1, ++ Draw3dRect(sp->win, sp->tpos+1, 1, + (u_int) sp->tsize-3, (u_int) sp->tsize-3, R3D_OUT,2, + sp->hi, sp->lo, sp->bg); + } +@@ -450,8 +450,8 @@ + case DNLINE: /* arrows */ + pos = whereInScrl(sp,x,y); + if (pos == ipos) { +- if (!lit) { +- lit = 1; ++ if (!lit) { ++ lit = 1; + if (ipos == UPLINE) { sp->uplit = 1; drawArrow(sp,UPLINE); } + else { sp->dnlit = 1; drawArrow(sp,DNLINE); } + } +@@ -467,16 +467,16 @@ + } + } + } +- ++ + else { +- if (lit) { +- lit = 0; ++ if (lit) { ++ lit = 0; + if (ipos == UPLINE) { sp->uplit = 0; drawArrow(sp,UPLINE); } + else { sp->dnlit = 0; drawArrow(sp,DNLINE); } + } + } + break; +- ++ + } + } + +diff -ruN xv-3.10a/xvsmooth.c xv-3.10a-bugfixes/xvsmooth.c +--- xv-3.10a/xvsmooth.c 1994-12-22 14:34:42.000000000 -0800 ++++ xv-3.10a-bugfixes/xvsmooth.c 2004-05-16 18:04:28.000000000 -0700 +@@ -4,11 +4,11 @@ + * Contains: + * byte *SmoothResize(src8, swide, shigh, dwide, dhigh, + * rmap, gmap, bmap, rdmap, gdmap, bdmap, maplen) +- * byte *Smooth24(pic824, is24, swide, shigh, dwide, dhigh, ++ * byte *Smooth24(pic824, is24, swide, shigh, dwide, dhigh, + * rmap, gmap, bmap) +- * byte *DoColorDither(pic24, pic8, w, h, rmap,gmap,bmap, ++ * byte *DoColorDither(pic24, pic8, w, h, rmap,gmap,bmap, + * rdisp, gdisp, bdisp, maplen) +- * byte *Do332ColorDither(pic24, pic8, w, h, rmap,gmap,bmap, ++ * byte *Do332ColorDither(pic24, pic8, w, h, rmap,gmap,bmap, + * rdisp, gdisp, bdisp, maplen) + */ + +@@ -18,21 +18,21 @@ + + static int smoothX PARM((byte *, byte *, int, int, int, int, int, + byte *, byte *, byte *)); +-static int smoothY PARM((byte *, byte *, int, int, int, int, int, ++static int smoothY PARM((byte *, byte *, int, int, int, int, int, + byte *, byte *, byte *)); + static int smoothXY PARM((byte *, byte *, int, int, int, int, int, + byte *, byte *, byte *)); + + + /***************************************************/ +-byte *SmoothResize(srcpic8, swide, shigh, dwide, dhigh, ++byte *SmoothResize(srcpic8, swide, shigh, dwide, dhigh, + rmap, gmap, bmap, rdmap, gdmap, bdmap, maplen) + byte *srcpic8, *rmap, *gmap, *bmap, *rdmap, *gdmap, *bdmap; + int swide, shigh, dwide, dhigh, maplen; + { +- /* generic interface to Smooth and ColorDither code. +- given an 8-bit-per, swide * shigh image with colormap rmap,gmap,bmap, +- will generate a new 8-bit-per, dwide * dhigh image, which is dithered ++ /* generic interface to Smooth and ColorDither code. ++ given an 8-bit-per, swide * shigh image with colormap rmap,gmap,bmap, ++ will generate a new 8-bit-per, dwide * dhigh image, which is dithered + using colors found in rdmap, gdmap, bdmap arrays */ + + /* returns ptr to a dwide*dhigh array of bytes, or NULL on failure */ +@@ -50,7 +50,7 @@ + + return (byte *) NULL; + } +- ++ + + + /***************************************************/ +@@ -83,23 +83,23 @@ + bperpix = (is24) ? 3 : 1; + + /* decide which smoothing routine to use based on type of expansion */ +- if (dwide < swide && dhigh < shigh) ++ if (dwide < swide && dhigh < shigh) + retval = smoothXY(pic24, pic824, is24, swide, shigh, dwide, dhigh, + rmap, gmap, bmap); + +- else if (dwide < swide && dhigh >= shigh) ++ else if (dwide < swide && dhigh >= shigh) + retval = smoothX (pic24, pic824, is24, swide, shigh, dwide, dhigh, + rmap, gmap, bmap); + +- else if (dwide >= swide && dhigh < shigh) ++ else if (dwide >= swide && dhigh < shigh) + retval = smoothY (pic24, pic824, is24, swide, shigh, dwide, dhigh, + rmap, gmap, bmap); + + else { + /* dwide >= swide && dhigh >= shigh */ + +- /* cx,cy = original pixel in pic824. px,py = relative position +- of pixel ex,ey inside of cx,cy as percentages +-50%, +-50%. ++ /* cx,cy = original pixel in pic824. px,py = relative position ++ of pixel ex,ey inside of cx,cy as percentages +-50%, +-50%. + 0,0 = middle of pixel */ + + /* we can save a lot of time by precomputing cxtab[] and pxtab[], both +@@ -115,10 +115,10 @@ + + for (ex=0; ex<dwide; ex++) { + cxtab[ex] = (ex * swide) / dwide; +- pxtab[ex] = (((ex * swide)* 100) / dwide) ++ pxtab[ex] = (((ex * swide)* 100) / dwide) + - (cxtab[ex] * 100) - 50; + } +- ++ + for (ey=0; ey<dhigh; ey++) { + byte *pptr, rA, gA, bA, rB, gB, bB, rC, gC, bC, rD, gD, bD; + +@@ -162,7 +162,7 @@ + cC = pic824[cyOff + x1]; /* left/right center pixel */ + cD = pic824[cyOff + cx]; /* center pixel */ + } +- ++ + /* quick check */ + if (!is24 && cA == cB && cB == cC && cC == cD) { + /* set this pixel to the same color as in pic8 */ +@@ -178,30 +178,30 @@ + pD = 100 - (pA + pB + pC); + + if (is24) { +- *pp++ = ((int) (pA * rA))/100 + ((int) (pB * rB))/100 + ++ *pp++ = ((int) (pA * rA))/100 + ((int) (pB * rB))/100 + + ((int) (pC * rC))/100 + ((int) (pD * rD))/100; + +- *pp++ = ((int) (pA * gA))/100 + ((int) (pB * gB))/100 + ++ *pp++ = ((int) (pA * gA))/100 + ((int) (pB * gB))/100 + + ((int) (pC * gC))/100 + ((int) (pD * gD))/100; + +- *pp++ = ((int) (pA * bA))/100 + ((int) (pB * bB))/100 + ++ *pp++ = ((int) (pA * bA))/100 + ((int) (pB * bB))/100 + + ((int) (pC * bC))/100 + ((int) (pD * bD))/100; + } + else { /* 8-bit pic */ +- *pp++ = ((int) (pA * rmap[cA]))/100 + ((int)(pB * rmap[cB]))/100 + ++ *pp++ = ((int) (pA * rmap[cA]))/100 + ((int)(pB * rmap[cB]))/100 + + ((int) (pC * rmap[cC]))/100 + ((int)(pD * rmap[cD]))/100; + +- *pp++ = ((int) (pA * gmap[cA]))/100 + ((int)(pB * gmap[cB]))/100 + ++ *pp++ = ((int) (pA * gmap[cA]))/100 + ((int)(pB * gmap[cB]))/100 + + ((int) (pC * gmap[cC]))/100 + ((int)(pD * gmap[cD]))/100; + +- *pp++ = ((int)(pA * bmap[cA]))/100 + ((int)(pB * bmap[cB]))/100 + ++ *pp++ = ((int)(pA * bmap[cA]))/100 + ((int)(pB * bmap[cB]))/100 + + ((int)(pC * bmap[cC]))/100 + ((int)(pD * bmap[cD]))/100; + } + } + } + } + +- free(cxtab); ++ free(cxtab); + free(pxtab); + retval = 0; /* okay */ + } +@@ -218,7 +218,7 @@ + + + /***************************************************/ +-static int smoothX(pic24, pic824, is24, swide, shigh, dwide, dhigh, ++static int smoothX(pic24, pic824, is24, swide, shigh, dwide, dhigh, + rmap, gmap, bmap) + byte *pic24, *pic824, *rmap, *gmap, *bmap; + int is24, swide, shigh, dwide, dhigh; +@@ -253,7 +253,7 @@ + + bperpix = (is24) ? 3 : 1; + +- for (j=0; j<=swide; j++) ++ for (j=0; j<=swide; j++) + pixarr[j] = (j*dwide + (15*swide)/16) / swide; + + cptr = pic824; cptr1 = cptr + swide * bperpix; +@@ -280,7 +280,7 @@ + lbufG[j] = ((int) ((*cptr++ * pcnt0) + (*cptr1++ * pcnt1))) >> 6; + lbufB[j] = ((int) ((*cptr++ * pcnt0) + (*cptr1++ * pcnt1))) >> 6; + } +- } ++ } + else { /* 8-bit input pic */ + for (j=0; j<swide; j++, cptr++, cptr1++) { + lbufR[j] = ((int)((rmap[*cptr]* pcnt0) + (rmap[*cptr1]* pcnt1))) >> 6; +@@ -314,8 +314,8 @@ + return 0; + } + +- +- ++ ++ + + + +@@ -405,7 +405,7 @@ + lbufB[j] += ((int)((bmap[*cptr]*pct0[j])+(bmap[*cptr1]*pct1[j]))) >> 6; + } + } +- ++ + linecnt++; + } + +@@ -421,13 +421,13 @@ + return retval; + } + +- +- ++ ++ + + + + /***************************************************/ +-static int smoothXY(pic24, pic824, is24, swide, shigh, dwide, dhigh, ++static int smoothXY(pic24, pic824, is24, swide, shigh, dwide, dhigh, + rmap, gmap, bmap) + byte *pic24, *pic824, *rmap, *gmap, *bmap; + int is24, swide, shigh, dwide, dhigh; +@@ -462,7 +462,7 @@ + + bperpix = (is24) ? 3 : 1; + +- for (j=0; j<=swide; j++) ++ for (j=0; j<=swide; j++) + pixarr[j] = (j*dwide + (15*swide)/16) / swide; + + lastline = linecnt = pixR = pixG = pixB = 0; +@@ -526,20 +526,20 @@ + return 0; + } + +- +- ++ ++ + + /********************************************/ +-byte *DoColorDither(pic24, pic8, w, h, rmap, gmap, bmap, ++byte *DoColorDither(pic24, pic8, w, h, rmap, gmap, bmap, + rdisp, gdisp, bdisp, maplen) + byte *pic24, *pic8, *rmap, *gmap, *bmap, *rdisp, *gdisp, *bdisp; + int w, h, maplen; + { + /* takes a 24 bit picture, of size w*h, dithers with the colors in + rdisp, gdisp, bdisp (which have already been allocated), +- and generates an 8-bit w*h image, which it returns. ++ and generates an 8-bit w*h image, which it returns. + ignores input value 'pic8' +- returns NULL on error ++ returns NULL on error + + note: the rdisp,gdisp,bdisp arrays should be the 'displayed' colors, + not the 'desired' colors +@@ -547,7 +547,7 @@ + if pic24 is NULL, uses the passed-in pic8 (an 8-bit image) as + the source, and the rmap,gmap,bmap arrays as the desired colors */ + +- byte *np, *ep, *newpic; ++ byte *np, *ep, *newpic; + short *cache; + int r2, g2, b2; + int *thisline, *nextline, *thisptr, *nextptr, *tmpptr; +@@ -558,11 +558,11 @@ + int fserrmap[512]; /* -255 .. 0 .. +255 */ + + /* compute somewhat non-linear floyd-steinberg error mapping table */ +- for (i=j=0; i<=0x40; i++,j++) ++ for (i=j=0; i<=0x40; i++,j++) + { fserrmap[256+i] = j; fserrmap[256-i] = -j; } +- for ( ; i<0x80; i++, j += !(i&1) ? 1 : 0) ++ for ( ; i<0x80; i++, j += !(i&1) ? 1 : 0) + { fserrmap[256+i] = j; fserrmap[256-i] = -j; } +- for ( ; i<=0xff; i++) ++ for ( ; i<=0xff; i++) + { fserrmap[256+i] = j; fserrmap[256-i] = -j; } + + +@@ -575,7 +575,7 @@ + cache = (short *) calloc((size_t) (2<<14), sizeof(short)); + thisline = (int *) malloc(pwide3 * sizeof(int)); + nextline = (int *) malloc(pwide3 * sizeof(int)); +- if (!cache || !newpic || !thisline || !nextline) { ++ if (!cache || !newpic || !thisline || !nextline) { + if (newpic) free(newpic); + if (cache) free(cache); + if (thisline) free(thisline); +@@ -624,30 +624,30 @@ + + r2 = *thisptr++; g2 = *thisptr++; b2 = *thisptr++; + +- /* map r2,g2,b2 components (could be outside 0..255 range) ++ /* map r2,g2,b2 components (could be outside 0..255 range) + into 0..255 range */ +- ++ + if (r2<0 || g2<0 || b2<0) { /* are there any negatives in RGB? */ + if (r2<g2) { if (r2<b2) k = 0; else k = 2; } + else { if (g2<b2) k = 1; else k = 2; } + + switch (k) { + case 0: g2 -= r2; b2 -= r2; d = (abs(r2) * 3) / 2; /* RED */ +- r2 = 0; ++ r2 = 0; + g2 = (g2>d) ? g2 - d : 0; + b2 = (b2>d) ? b2 - d : 0; + break; + + case 1: r2 -= g2; b2 -= g2; d = (abs(g2) * 3) / 2; /* GREEN */ + r2 = (r2>d) ? r2 - d : 0; +- g2 = 0; ++ g2 = 0; + b2 = (b2>d) ? b2 - d : 0; + break; + + case 2: r2 -= b2; g2 -= b2; d = (abs(b2) * 3) / 2; /* BLUE */ + r2 = (r2>d) ? r2 - d : 0; + g2 = (g2>d) ? g2 - d : 0; +- b2 = 0; ++ b2 = 0; + break; + } + } +@@ -674,7 +674,7 @@ + mind = 10000; + for (k=closest=0; k<maplen && mind>7; k++) { + d = abs(r2 - rdisp[k]) +- + abs(g2 - gdisp[k]) ++ + abs(g2 - gdisp[k]) + + abs(b2 - bdisp[k]); + if (d<mind) { mind = d; closest = k; } + } +@@ -703,7 +703,7 @@ + thisptr[1] += (gerr*7)/16; + thisptr[2] += (berr*7)/16; + } +- ++ + if (i!=imax) { /* do BOTTOM pixel */ + nextptr[0] += (rerr*5)/16; + nextptr[1] += (gerr*5)/16; +@@ -735,7 +735,7 @@ + + + /********************************************/ +-byte *Do332ColorDither(pic24, pic8, w, h, rmap, gmap, bmap, ++byte *Do332ColorDither(pic24, pic8, w, h, rmap, gmap, bmap, + rdisp, gdisp, bdisp, maplen) + byte *pic24, *pic8, *rmap, *gmap, *bmap, *rdisp, *gdisp, *bdisp; + int w, h, maplen; +@@ -744,9 +744,9 @@ + + /* takes a 24 bit picture, of size w*h, dithers with the colors in + rdisp, gdisp, bdisp (which have already been allocated), +- and generates an 8-bit w*h image, which it returns. ++ and generates an 8-bit w*h image, which it returns. + ignores input value 'pic8' +- returns NULL on error ++ returns NULL on error + + note: the rdisp,gdisp,bdisp arrays should be the 'displayed' colors, + not the 'desired' colors +@@ -754,7 +754,7 @@ + if pic24 is NULL, uses the passed-in pic8 (an 8-bit image) as + the source, and the rmap,gmap,bmap arrays as the desired colors */ + +- byte *np, *ep, *newpic; ++ byte *np, *ep, *newpic; + int r2, g2, b2; + int *thisline, *nextline, *thisptr, *nextptr, *tmpptr; + int i, j, rerr, gerr, berr, pwide3; +@@ -763,11 +763,11 @@ + int fserrmap[512]; /* -255 .. 0 .. +255 */ + + /* compute somewhat non-linear floyd-steinberg error mapping table */ +- for (i=j=0; i<=0x40; i++,j++) ++ for (i=j=0; i<=0x40; i++,j++) + { fserrmap[256+i] = j; fserrmap[256-i] = -j; } +- for ( ; i<0x80; i++, j += !(i&1) ? 1 : 0) ++ for ( ; i<0x80; i++, j += !(i&1) ? 1 : 0) + { fserrmap[256+i] = j; fserrmap[256-i] = -j; } +- for ( ; i<=0xff; i++) ++ for ( ; i<=0xff; i++) + { fserrmap[256+i] = j; fserrmap[256-i] = -j; } + + +@@ -778,7 +778,7 @@ + newpic = (byte *) malloc((size_t) (w * h)); + thisline = (int *) malloc(pwide3 * sizeof(int)); + nextline = (int *) malloc(pwide3 * sizeof(int)); +- if (!newpic || !thisline || !nextline) { ++ if (!newpic || !thisline || !nextline) { + if (newpic) free(newpic); + if (thisline) free(thisline); + if (nextline) free(nextline); +@@ -830,7 +830,7 @@ + + + for (j=0; j<w; j++) { +- int k, d, mind, closest, rb,gb,bb; ++ int rb,gb,bb; + + r2 = *thisptr++; g2 = *thisptr++; b2 = *thisptr++; + if (i&1) thisptr -= 6; /* move left */ +@@ -846,7 +846,7 @@ + bb = (b2 + 0x20); /* round 2 bits */ + RANGE(bb,0,255); + bb = bb & 0xc0; +- ++ + + *np = rb | (gb>>3) | (bb>>6); + +diff -ruN xv-3.10a/xvsunras.c xv-3.10a-bugfixes/xvsunras.c +--- xv-3.10a/xvsunras.c 1994-12-22 14:34:42.000000000 -0800 ++++ xv-3.10a-bugfixes/xvsunras.c 2005-04-02 18:04:20.000000000 -0800 +@@ -54,8 +54,8 @@ + PICINFO *pinfo; + { + FILE *fp; +- int linesize,lsize,csize,isize,i,w,h,d; +- byte *image, *line, *pic8; ++ int linesize,lsize,csize,isize,i,w,h,d,npixels,nbytes; ++ byte *image, *line; + struct rasterfile sunheader; + char *bname; + +@@ -85,7 +85,7 @@ + sunheader.ras_depth != 8 && + sunheader.ras_depth != 24 && + sunheader.ras_depth != 32) { +- fprintf (stderr, "Sun rasterfile image has depth %d\n", ++ fprintf (stderr, "Sun rasterfile image has depth %d\n", + sunheader.ras_depth); + fprintf (stderr, "Depths supported are 1, 8, 24, and 32\n"); + fclose(fp); +@@ -115,26 +115,59 @@ + + w = sunheader.ras_width; + h = sunheader.ras_height; +- d = sunheader.ras_depth; +- isize = sunheader.ras_length ? +- sunheader.ras_length : +- (w * h * d) / 8; ++ d = sunheader.ras_depth; /* 1, 8, 24, or 32 (above) */ ++ npixels = w * h; ++ if (w <= 0 || h <= 0 || npixels/w != h) { ++ fprintf (stderr, "Sun rasterfile image has invalid dimensions (%dx%d)\n", ++ w, h); ++ fclose(fp); ++ return 0; ++ } ++ if (d == 1) ++ nbytes = npixels/8; /* should round up here, but used only for printf */ ++ else { ++ nbytes = npixels * (d/8); ++/* ++ [nbytes (isize) used only in printfs; don't really care about overflows] ++ if (nbytes/npixels != (d/8)) { ++ fprintf (stderr, "Sun rasterfile has invalid dimensions (%dx%dx%d)\n", ++ w, h, d); ++ fclose(fp); ++ return 0; ++ } ++ */ ++ } ++ isize = sunheader.ras_length ? sunheader.ras_length : nbytes; + csize = (sunheader.ras_maptype == RMT_NONE) ? 0 : sunheader.ras_maplength; + + +- /* compute length of the output (xv-format) image */ +- lsize = w * h; +- if (d == 24 || d == 32) lsize = lsize * 3; ++ /* length of the output (xv-format) image */ ++ lsize = npixels; ++ if (d == 24 || d == 32) { ++ lsize *= 3; ++ if (lsize/3 != npixels) { ++ fprintf (stderr, "Sun rasterfile has invalid dimensions (%dx%dx%d)\n", ++ w, h, d); ++ fclose(fp); ++ return 0; ++ } ++ } + + + linesize = w * d; ++ if (linesize/w != d || linesize + 15 < linesize) { ++ fprintf (stderr, "Sun rasterfile has invalid dimensions (%dx%dx%d)\n", ++ w, h, d); ++ fclose(fp); ++ return 0; ++ } + if (linesize % 16) linesize += (16 - (linesize % 16)); + linesize /= 8; + + if (DEBUG) { + fprintf(stderr,"%s: LoadSunRas() - loading a %dx%d pic, %d planes\n", + cmd, w, h, d); +- fprintf (stderr, ++ fprintf (stderr, + "type %d, maptype %d, isize %d, csize %d, lsize %d, linesize %d\n", + sunheader.ras_type, sunheader.ras_maptype, + isize, csize, lsize, linesize); +@@ -188,13 +221,13 @@ + } + + switch (d) { +- case 1: sunRas1to8 (image + w * i, line, w); ++ case 1: sunRas1to8 (image + w * i, line, w); + break; + case 8: xvbcopy((char *) line, (char *) image + w * i, (size_t) w); + break; + case 24: xvbcopy((char *) line, (char *) image + w * i * 3, (size_t) w*3); + break; +- ++ + case 32: + { + int k; +@@ -202,7 +235,7 @@ + ip = line; + op = (byte *) (image + w * i * 3); + for (k = 0; k<w; k++) { +- *ip++; /* skip 'alpha' */ ++ ip++; /* skip 'alpha' */ + *op++ = *ip++; /* red */ + *op++ = *ip++; /* green */ + *op++ = *ip++; /* blue */ +@@ -210,9 +243,9 @@ + } + } + } +- ++ + free(line); +- ++ + if (DEBUG) fprintf(stderr,"Sun ras: image loaded!\n"); + + +@@ -224,7 +257,7 @@ + else pinfo->type = PIC8; + + pinfo->pic = image; +- pinfo->w = w; ++ pinfo->w = w; + pinfo->h = h; + pinfo->normw = pinfo->w; pinfo->normh = pinfo->h; + pinfo->frmType = F_SUNRAS; +@@ -364,10 +397,15 @@ + + /* special case: if PIC24 and writing GREYSCALE, write 8-bit file */ + if (ptype == PIC24 && colorstyle == F_GREYSCALE) { +- graypic = (byte *) malloc((size_t) w*h); ++ int npixels = w * h; ++ if (w <= 0 || h <= 0 || npixels/w != h) { ++ SetISTR(ISTR_WARNING, "Image is too large (%dx%d)", w, h); ++ return (2); ++ } ++ graypic = (byte *) malloc((size_t) npixels); + if (!graypic) FatalError("unable to malloc in WriteSunRas()"); +- +- for (i=0,sp=pic,dp=graypic; i<w*h; i++,sp+=3,dp++) { ++ ++ for (i=0,sp=pic,dp=graypic; i<npixels; i++,sp+=3,dp++) { + *dp = MONO(sp[0],sp[1],sp[2]); + } + +@@ -379,9 +417,18 @@ + } + + +- if (ptype==PIC24) { d = 24; linesize = w * 3; } +- else if (colorstyle != F_BWDITHER) { d = 8; linesize = w; } +- else { ++ if (ptype==PIC24) { ++ d = 24; ++ linesize = w * 3; ++ if (linesize/w != 3) { ++ SetISTR(ISTR_WARNING, "Image is too wide (%d)", w); ++ if (graypic) free(graypic); ++ return (2); ++ } ++ } else if (colorstyle != F_BWDITHER) { ++ d = 8; ++ linesize = w; ++ } else { + d = 1; + linesize = w; + if (linesize % 8) linesize += (8 - linesize % 8); +@@ -391,6 +438,11 @@ + + + if (linesize % 2) linesize++; ++ if (linesize == 0) { ++ SetISTR(ISTR_WARNING, "Image is too wide (%d)", w); ++ if (graypic) free(graypic); ++ return (2); ++ } + line = (byte *) malloc((size_t) linesize); + if (!line) { + SetISTR(ISTR_WARNING, "Can't allocate memory for save!\n"); +@@ -428,7 +480,7 @@ + write_sun_long (sunheader.ras_maplength, fp); + + /* write the colormap */ +- if (d == 8) ++ if (d == 8) { + if (colorstyle == 1) /* grayscale */ + for (color=0; color<3; color++) + for (i=0; i<numcols; i++) +@@ -438,6 +490,7 @@ + fwrite (gmap, sizeof(byte), (size_t) numcols, fp); + fwrite (bmap, sizeof(byte), (size_t) numcols, fp); + } ++ } + + + /* write the image */ +diff -ruN xv-3.10a/xvtarga.c xv-3.10a-bugfixes/xvtarga.c +--- xv-3.10a/xvtarga.c 1994-12-22 14:34:55.000000000 -0800 ++++ xv-3.10a-bugfixes/xvtarga.c 2005-03-31 07:33:07.000000000 -0800 +@@ -17,8 +17,8 @@ + * 0: + * 1: colormap type + * 2: image type (1=colmap RGB, 2=uncomp RGB, 3=uncomp gray) +- * 3: +- * 4: ++ * 3: ++ * 4: + * 5: colormap_length, low byte + * 6: colormap_length, high byte + * 7: bits per cmap entry (8, 24, 32) +@@ -28,7 +28,7 @@ + * 14: height, low byte + * 15: height, high byte + * 16: bits per pixel (8, 24) +- * 17: flags ++ * 17: flags + */ + + +@@ -48,7 +48,7 @@ + /* returns '1' on success */ + + FILE *fp; +- int i, row, c, c1, w, h, r, g, b, flags, intlace, topleft, trunc; ++ int i, row, c, c1, w, h, npixels, bufsize, flags, intlace, topleft, trunc; + byte *pic24, *pp; + + bname = BaseName(fname); +@@ -88,7 +88,9 @@ + c=getc(fp); c1=getc(fp); + h = c1*256 + c; + +- if (w<1 || h<1) { ++ npixels = w * h; ++ bufsize = 3 * npixels; ++ if (w <= 0 || h <= 0 || npixels/w != h || bufsize/3 != npixels) { + fclose(fp); + SetISTR(ISTR_WARNING,"%s: error in Targa header (bad image size)", bname); + return 0; +@@ -115,7 +117,7 @@ + #endif + + +- pic24 = (byte *) calloc((size_t) w*h*3, (size_t) 1); ++ pic24 = (byte *) calloc((size_t) bufsize, (size_t) 1); + if (!pic24) FatalError("couldn't malloc 'pic24'"); + + +@@ -134,7 +136,7 @@ + if (i < h / 2) row = 2 * i; + else row = 2 * (i - h/2) + 1; + } +- ++ + else row = i; /* no interlace */ + + +@@ -150,7 +152,7 @@ + + + /* swap R,B values (file is in BGR, pic24 should be in RGB) */ +- for (i=0, pp=pic24; i<w*h; i++, pp+=3) { ++ for (i=0, pp=pic24; i<npixels; i++, pp+=3) { + c = pp[0]; pp[0] = pp[2]; pp[2] = c; + } + +@@ -185,7 +187,7 @@ + + /* write the header */ + for (i=0; i<12; i++) putc( (i==2) ? 2 : 0, fp); +- ++ + putc(w&0xff, fp); + putc((w>>8)&0xff,fp); + putc(h&0xff, fp); +diff -ruN xv-3.10a/xvtext.c xv-3.10a-bugfixes/xvtext.c +--- xv-3.10a/xvtext.c 1995-01-13 15:46:28.000000000 -0800 ++++ xv-3.10a-bugfixes/xvtext.c 2004-05-16 18:04:38.000000000 -0700 +@@ -1,6 +1,6 @@ + /* + * xvtext.c - text file display window routines +- * ++ * + * includes: + * void CreateTextWins(geom, cmtgeom); + * void OpenTextView(text, textlen, title, freeonclose); +@@ -98,8 +98,7 @@ + XSizeHints hints; + XSetWindowAttributes xswa; + TVINFO *tv; +- int gx,gy,gw,gh,gset,gx1,gy1; +- ++ + + mfwide = monofinfo->max_bounds.width; + mfhigh = monofinfo->ascent + monofinfo->descent; +@@ -120,10 +119,10 @@ + tv = &tinfo[i]; + + tv->win = CreateWindow((i<CMTWIN) ? "xv text viewer" : "xv image comments", +- "XVtextview", +- (i<CMTWIN) ? geom : cmtgeom, +- defwide, +- (i<CMTWIN) ? defhigh : cmthigh, ++ "XVtextview", ++ (i<CMTWIN) ? geom : cmtgeom, ++ defwide, ++ (i<CMTWIN) ? defhigh : cmthigh, + infofg, infobg, 1); + if (!tv->win) FatalError("can't create textview window!"); + +@@ -135,17 +134,17 @@ + + /* note: everything is sized and positioned in resizeText() */ + +- tv->textW = XCreateSimpleWindow(theDisp, tv->win, 1,1, 100,100, ++ tv->textW = XCreateSimpleWindow(theDisp, tv->win, 1,1, 100,100, + 1,infofg,infobg); + if (!tv->textW) FatalError("can't create textview text window!"); + +- SCCreate(&(tv->vscrl), tv->win, 0,0, 1,100, 0,0,0,0, ++ SCCreate(&(tv->vscrl), tv->win, 0,0, 1,100, 0,0,0,0, + infofg, infobg, hicol, locol, drawTextW); + +- SCCreate(&(tv->hscrl), tv->win, 0,0, 0,100, 0,0,0,0, ++ SCCreate(&(tv->hscrl), tv->win, 0,0, 0,100, 0,0,0,0, + infofg, infobg, hicol, locol, drawTextW); + +- if (XGetNormalHints(theDisp, tv->win, &hints)) ++ if (XGetNormalHints(theDisp, tv->win, &hints)) + hints.flags |= PMinSize; + else + hints.flags = PMinSize; +@@ -162,7 +161,7 @@ + + XSelectInput(theDisp, tv->textW, ExposureMask | ButtonPressMask); + +- ++ + BTCreate(&(tv->but[TV_ASCII]), tv->win, 0,0,BUTTW,BUTTH, + "Ascii",infofg,infobg,hicol,locol); + BTCreate(&(tv->but[TV_HEX]), tv->win, 0,0,BUTTW,BUTTH, +@@ -185,7 +184,7 @@ + for (i=0; i<MAXTVWIN; i++) { + resizeText(&tinfo[i], defwide, (i<CMTWIN) ? defhigh : cmthigh); + +- XSelectInput(theDisp, tinfo[i].win, ExposureMask | ButtonPressMask | ++ XSelectInput(theDisp, tinfo[i].win, ExposureMask | ButtonPressMask | + KeyPressMask | StructureNotifyMask); + } + +@@ -200,7 +199,6 @@ + { + /* given a filename, attempts to read in the file and open a textview win */ + +- int i; + long textlen; + char *text, buf[512], title[128], rfname[MAXPATHLEN+1]; + char *basefname[128]; /* just current fname, no path */ +@@ -222,7 +220,7 @@ + if (!UncompressFile(basefname, rfname)) return;/* failed to uncompress */ + #endif + } +- ++ + + + fp = fopen(rfname, "r"); +@@ -246,7 +244,7 @@ + + text = (char *) malloc((size_t) textlen); + if (!text) { +- sprintf(buf, "Couldn't malloc %ld bytes to read file '%s'", ++ sprintf(buf, "Couldn't malloc %ld bytes to read file '%s'", + textlen, rfname); + ErrPopUp(buf, "\nSo what!"); + fclose(fp); +@@ -267,8 +265,8 @@ + /* note: text gets freed when window gets closed */ + } + +- +- ++ ++ + /***************************************************************/ + void OpenTextView(text, len, title, freeonclose) + char *text, *title; +@@ -276,7 +274,6 @@ + { + /* opens up a textview window */ + +- int i, oldone; + TVINFO *tv; + + tv = &tinfo[0]; +@@ -293,6 +290,7 @@ + tv->textlen = len; + tv->freeonclose = freeonclose; + strncpy(tv->title, title, (size_t) TITLELEN-1); ++ tv->title[TITLELEN-1] = '\0'; + + computeText(tv); /* compute # lines and linestarts array */ + +@@ -316,7 +314,6 @@ + { + /* opens up the reserved 'comment' textview window */ + +- int i; + TVINFO *tv; + + tv = &tinfo[CMTWIN]; +@@ -351,9 +348,9 @@ + tv->textlen = (tv->text) ? strlen(tv->text) : 0; + tv->freeonclose = 0; + +- if (strlen(fullfname)) ++ if (strlen(fullfname)) + sprintf(tv->title, "File: '%s'", BaseName(fullfname)); +- else ++ else + sprintf(tv->title, "<no file loaded>"); + + computeText(tv); /* compute # lines and linestarts array */ +@@ -504,7 +501,7 @@ + if (tv->freeonclose && tv->text) free(tv->text); + if (tv->lines) free(tv->lines); + +- tv->text = (char *) NULL; ++ tv->text = (char *) NULL; + tv->lines = (char **) NULL; + tv->numlines = tv->textlen = tv->hexmode = 0; + } +@@ -518,7 +515,7 @@ + /* checks event to see if it's a text-window related thing. If it + is, it eats the event and returns '1', otherwise '0'. */ + +- int i, rv; ++ int rv; + + rv = 1; + +@@ -560,7 +557,7 @@ + count++; + } while (XCheckWindowEvent(theDisp, evt.xexpose.window, + ExposureMask, &evt)); +- ++ + XClipBox(reg, &rect); /* bounding box of region */ + XSetRegion(theDisp, theGC, reg); + +@@ -570,7 +567,7 @@ + fprintf(stderr,"grouped %d expose events into %d,%d %dx%d rect\n", + count, rect.x, rect.y, rect.width, rect.height); + } +- ++ + if (e->window == tv->win) drawTextView(tv); + else if (e->window == tv->textW) drawTextW(0, &(tv->vscrl)); + +@@ -584,7 +581,7 @@ + + else if (xev->type == ButtonPress) { + XButtonEvent *e = (XButtonEvent *) xev; +- int i,x,y; ++ int x,y; + x = e->x; y = e->y; + + if (e->button == Button1) { +@@ -615,7 +612,7 @@ + + if (tv->wide != e->width || tv->high != e->height) { + if (DEBUG) fprintf(stderr,"Forcing a redraw! (from configure)\n"); +- XClearArea(theDisp, tv->win, 0, 0, ++ XClearArea(theDisp, tv->win, 0, 0, + (u_int) e->width, (u_int) e->height, True); + resizeText(tv, e->width, e->height); + } +@@ -633,7 +630,7 @@ + TVINFO *tv; + int w,h; + { +- int i, maxw, maxh, hmax, hpage, vmax, vpage; ++ int i, maxw, maxh; + XSizeHints hints; + + if (tv->wide == w && tv->high == h) return; /* no change in size */ +@@ -657,7 +654,7 @@ + tv->twWide = tv->chwide * mfwide + 6; + tv->twHigh = tv->chhigh * mfhigh + 6; + +- XMoveResizeWindow(theDisp, tv->textW, LRMARGINS, TOPMARGIN, ++ XMoveResizeWindow(theDisp, tv->textW, LRMARGINS, TOPMARGIN, + (u_int) tv->twWide, (u_int) tv->twHigh); + + for (i=0; i<TV_NBUTTS; i++) { +@@ -692,8 +689,8 @@ + hpag = tv->chwide / 4; + vpag = tv->chhigh - 1; + +- +- SCChange(&tv->vscrl, LRMARGINS + tv->twWide+1, TOPMARGIN, ++ ++ SCChange(&tv->vscrl, LRMARGINS + tv->twWide+1, TOPMARGIN, + 1, tv->twHigh, 0, vmax, tv->vscrl.val, vpag); + + SCChange(&tv->hscrl, LRMARGINS, TOPMARGIN + tv->twHigh + 1, +@@ -731,11 +728,11 @@ + y = 5; + + XSetForeground(theDisp, theGC, infobg); +- XFillRectangle(theDisp, tv->win, theGC, 5+1, y+1, ++ XFillRectangle(theDisp, tv->win, theGC, 5+1, y+1, + (u_int) StringWidth(tv->title)+6, (u_int) CHIGH+4); + + XSetForeground(theDisp, theGC, infofg); +- XDrawRectangle(theDisp, tv->win, theGC, 5, y, ++ XDrawRectangle(theDisp, tv->win, theGC, 5, y, + (u_int) StringWidth(tv->title)+7, (u_int) CHIGH+5); + + Draw3dRect(tv->win, 5+1, y+1, (u_int) StringWidth(tv->title)+5, +@@ -763,15 +760,15 @@ + + if (tv->hexmode) nl = tv->hexlines; + else { +- if (tv->numlines>0 && +- tv->lines[tv->numlines-1] - tv->lines[tv->numlines-2] == 1) ++ if (tv->numlines>0 && ++ tv->lines[tv->numlines-1] - tv->lines[tv->numlines-2] == 1) + nl = tv->numlines - 2; /* line after last \n has zero length */ + else nl = tv->numlines - 1; + } + if (nl<0) nl = 0; + +- sprintf(tmpstr, "%d byte%s, %d line%s", +- tv->textlen, (tv->textlen!=1) ? "s" : "", ++ sprintf(tmpstr, "%d byte%s, %d line%s", ++ tv->textlen, (tv->textlen!=1) ? "s" : "", + nl, (nl!=1) ? "s" : ""); + + w = StringWidth(tmpstr) + 7; /* width of frame */ +@@ -779,13 +776,13 @@ + y = 6; + + XSetForeground(theDisp, theGC, infobg); +- XFillRectangle(theDisp, tv->win, theGC, (x-w)+1, y+1, ++ XFillRectangle(theDisp, tv->win, theGC, (x-w)+1, y+1, + (u_int) (w-1), (u_int) CHIGH+4); + + XSetForeground(theDisp, theGC, infofg); + XDrawRectangle(theDisp, tv->win, theGC, x-w, y, (u_int) w, (u_int) CHIGH+5); + +- Draw3dRect(tv->win, (x-w)+1, y+1, (u_int) (w-2), (u_int) CHIGH+3, ++ Draw3dRect(tv->win, (x-w)+1, y+1, (u_int) (w-2), (u_int) CHIGH+3, + R3D_IN,2,hicol,locol,infobg); + + XSetForeground(theDisp, theGC, infofg); +@@ -800,10 +797,10 @@ + int x, y, w, nl; + char tmpstr[64]; + +- nl = (tv->hexmode) ? tv->hexlines : tv->numlines-1; ++ nl = (tv->hexmode) ? tv->hexlines : tv->numlines-1; + +- sprintf(tmpstr, "%d byte%s, %d line%s", +- tv->textlen, (tv->textlen>1) ? "s" : "", ++ sprintf(tmpstr, "%d byte%s, %d line%s", ++ tv->textlen, (tv->textlen>1) ? "s" : "", + nl, (nl>1) ? "s" : ""); + + w = StringWidth(tmpstr) + 7; /* width of frame */ +@@ -825,14 +822,14 @@ + u_char *sp, *ep, *lp; + + /* figure out TVINFO pointer from SCRL pointer */ +- for (i=0; i<MAXTVWIN && sptr != &tinfo[i].vscrl ++ for (i=0; i<MAXTVWIN && sptr != &tinfo[i].vscrl + && sptr != &tinfo[i].hscrl; i++); + if (i==MAXTVWIN) return; /* didn't find one */ + + tv = &tinfo[i]; + + /* make sure we've been sized. Necessary, as creating/modifying the +- scrollbar calls this routine directly, rather than through ++ scrollbar calls this routine directly, rather than through + TextCheckEvent() */ + + if (!hasBeenSized) return; +@@ -849,7 +846,7 @@ + for (i=0; i<tv->chhigh; i++) { /* draw each line */ + lnum = i + tv->vscrl.val; + if (lnum < tv->numlines-1) { +- ++ + /* find start of displayed portion of line. This is *wildly* + complicated by the ctrl-character and tab expansion... */ + +@@ -902,7 +899,7 @@ + if (extrach == 2) *lp = '^'; + else if (extrach == 1) *lp = *sp + 64; + } +- ++ + else if (*sp > 127) { + if (!extrach) extrach = 4; + if (extrach == 4) *lp = '\\'; +@@ -926,7 +923,7 @@ + } + + /* draw the line */ +- XDrawImageString(theDisp, tv->textW, theGC, ++ XDrawImageString(theDisp, tv->textW, theGC, + 3, i*mfhigh + 3 + mfascent, linestr, lwide); + } /* for i ... */ + } /* if hexmode */ +@@ -936,7 +933,7 @@ + for (i=0; i<tv->chhigh; i++) { /* draw each line */ + lnum = i + tv->vscrl.val; + if (lnum < tv->hexlines) { +- ++ + char hexstr[80], tmpstr[16]; + + /* generate hex for this line */ +@@ -972,7 +969,7 @@ + now build 'linestr', which is going to have hexstr shifted + and/or padded with blanks (ie, the displayed portion or hexstr) */ + +- /* skip obscured beginning of line, if any */ ++ /* skip obscured beginning of line, if any */ + for (cpos=0, sp=(byte *) hexstr; cpos<hpos && *sp; cpos++, sp++); + + for (cpos=0, lp=(byte *)linestr; cpos<lwide; cpos++, lp++) { +@@ -985,16 +982,16 @@ + } + + /* draw the line */ +- XDrawImageString(theDisp, tv->textW, theGC, ++ XDrawImageString(theDisp, tv->textW, theGC, + 3, i*mfhigh + 3 + mfascent, linestr, lwide); + } /* for i ... */ + } /* else hexmode */ +- ++ + + + XSetFont(theDisp, theGC, mfont); + +- Draw3dRect(tv->textW, 0, 0, (u_int) (tv->twWide-1), (u_int) (tv->twHigh-1), ++ Draw3dRect(tv->textW, 0, 0, (u_int) (tv->twWide-1), (u_int) (tv->twHigh-1), + R3D_IN, 2, hicol, locol, infobg); + } + +@@ -1033,7 +1030,7 @@ + stlen = XLookupString(kevt, buf, 128, &ks, (XComposeStatus *) NULL); + shift = kevt->state & ShiftMask; + ck = CursorKey(ks, shift, 1); +- dealt = 1; ++ dealt = 1; + + RemapKeyCheck(ks, buf, &stlen); + +@@ -1060,8 +1057,6 @@ + TVINFO *tv; + int key; + { +- int i,j; +- + if (!tv->textlen) return; + + /* an arrow key (or something like that) was pressed in icon window. +@@ -1108,7 +1103,7 @@ + else { /* switch to ascii mode */ + pos = oldvscrl * 16; + for (i=0; i<tv->numlines-1; i++) { +- if (tv->lines[i+1] - tv->text > pos && ++ if (tv->lines[i+1] - tv->text > pos && + tv->lines[i] - tv->text <= pos) break; + } + if (i<tv->numlines-1) SCSetVal(&tv->vscrl, i); +@@ -1127,9 +1122,9 @@ + int i,j,wide,maxwide,space; + byte *sp; + +- if (!tv->text) { +- tv->numlines = tv->hexlines = 0; +- tv->lines = (char **) NULL; ++ if (!tv->text) { ++ tv->numlines = tv->hexlines = 0; ++ tv->lines = (char **) NULL; + return; + } + +@@ -1153,8 +1148,8 @@ + + tv->lines[tv->numlines - 1] = tv->text + tv->textlen + 1; + +- /* each line has a trailing '\n' character, except for the last line, +- which has a trailing '\0' character. In any case, all lines can ++ /* each line has a trailing '\n' character, except for the last line, ++ which has a trailing '\0' character. In any case, all lines can + be printed by printing ((lines[n+1] - lines[n]) - 1) characters, + starting with lines[n]. + +@@ -1164,13 +1159,13 @@ + + /* compute length of longest line, when shown in 'ascii' mode. Takes + into account the fact that non-printing chars (<32 or >127) will be +- shown in an 'expanded' form. (<32 chars will be shown as '^A' ++ shown in an 'expanded' form. (<32 chars will be shown as '^A' + (or whatever), and >127 chars will be shown as octal '\275') */ + + maxwide = 0; + for (i=0; i<tv->numlines-1; i++) { + /* compute displayed width of line #i */ +- for (sp=(byte *) tv->lines[i], wide=0; sp<(byte *) tv->lines[i+1]-1; ++ for (sp=(byte *) tv->lines[i], wide=0; sp<(byte *) tv->lines[i+1]-1; + sp++) { + if (*sp == '\011') { /* tab to next multiple of 8 */ + space = ((wide+8) & (~7)) - wide; +diff -ruN xv-3.10a/xvtiff.c xv-3.10a-bugfixes/xvtiff.c +--- xv-3.10a/xvtiff.c 1995-01-13 11:53:34.000000000 -0800 ++++ xv-3.10a-bugfixes/xvtiff.c 2005-03-27 17:25:31.000000000 -0800 +@@ -1,7 +1,7 @@ + /* + * xvtiff.c - load routine for 'TIFF' format pictures + * +- * LoadTIFF(fname, numcols) - load a TIFF file ++ * LoadTIFF(fname, numcols, quick) - load a TIFF file + */ + + #ifndef va_start +@@ -15,6 +15,35 @@ + #include "tiffio.h" /* has to be after xv.h, as it needs varargs/stdarg */ + + ++/* Portions fall under the following copyright: ++ * ++ * Copyright (c) 1992, 1993, 1994 Sam Leffler ++ * Copyright (c) 1992, 1993, 1994 Silicon Graphics, Inc. ++ * ++ * Permission to use, copy, modify, distribute, and sell this software and ++ * its documentation for any purpose is hereby granted without fee, provided ++ * that (i) the above copyright notices and this permission notice appear in ++ * all copies of the software and related documentation, and (ii) the names of ++ * Sam Leffler and Silicon Graphics may not be used in any advertising or ++ * publicity relating to the software without the specific, prior written ++ * permission of Sam Leffler and Silicon Graphics. ++ * ++ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY ++ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. ++ * ++ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR ++ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, ++ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ++ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF ++ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE ++ * OF THIS SOFTWARE. ++ */ ++ ++ ++static int copyTiff PARM((TIFF *, char *)); ++static int cpStrips PARM((TIFF *, TIFF *)); ++static int cpTiles PARM((TIFF *, TIFF *)); + static byte *loadPalette PARM((TIFF *, uint32, uint32, int, int, PICINFO *)); + static byte *loadColor PARM((TIFF *, uint32, uint32, int, int, PICINFO *)); + static int loadImage PARM((TIFF *, uint32, uint32, byte *, int)); +@@ -28,19 +57,23 @@ + static int error_occurred; + + /*******************************************/ +-int LoadTIFF(fname, pinfo) +- char *fname; ++int LoadTIFF(fname, pinfo, quick) ++ char *fname; + PICINFO *pinfo; ++ int quick; + /*******************************************/ + { + /* returns '1' on success, '0' on failure */ + + TIFF *tif; + uint32 w, h; ++ float xres, yres; + short bps, spp, photo, orient; + FILE *fp; + byte *pic8; + char *desc, oldpath[MAXPATHLEN+1], tmppath[MAXPATHLEN+1], *sp; ++ char tmp[256], tmpname[256]; ++ int i, nump; + + error_occurred = 0; + +@@ -60,6 +93,8 @@ + filesize = ftell(fp); + fclose(fp); + ++ ++ + rmap = pinfo->r; gmap = pinfo->g; bmap = pinfo->b; + + /* a kludge: temporarily cd to the directory that the file is in (if +@@ -80,10 +115,61 @@ + else filename = BaseName(fname); + } + } +- +- + +- tif=TIFFOpen(filename,"r"); ++ ++ nump = 1; ++ ++ if (!quick) { ++ /* see if there's more than 1 image in tiff file, to determine if we ++ should do multi-page thing... */ ++ ++ tif = TIFFOpen(filename,"r"); ++ if (!tif) return 0; ++ while (TIFFReadDirectory(tif)) nump++; ++ TIFFClose(tif); ++ if (DEBUG) ++ fprintf(stderr,"LoadTIFF: %d page%s found\n", nump, nump==1 ? "" : "s"); ++ ++ ++ /* if there are multiple images, copy them out to multiple tmp files, ++ and load the first one... */ ++ ++ /* GRR 20050320: converted this fake mktemp() to use mktemp()/mkstemp() ++ internally (formerly it simply prepended tmpdir to the string and ++ returned immediately) */ ++ xv_mktemp(tmpname, "xvpgXXXXXX"); ++ ++ if (tmpname[0] == '\0') { /* mktemp() or mkstemp() blew up */ ++ sprintf(str,"LoadTIFF: Unable to create temporary filename???"); ++ ErrPopUp(str, "\nHow unlikely!"); ++ return 0; ++ } ++ ++ if (nump>1) { ++ TIFF *in; ++ ++ in = TIFFOpen(filename, "r"); ++ if (!in) return 0; ++ for (i=1; i<=nump; i++) { ++ sprintf(tmp, "%s%d", tmpname, i); ++ if (!copyTiff(in, tmp)) { ++ SetISTR(ISTR_WARNING, "LoadTIFF: Error writing page files!"); ++ break; ++ } ++ ++ if (!TIFFReadDirectory(in)) break; ++ } ++ if (DEBUG) ++ fprintf(stderr,"LoadTIFF: %d page%s written\n", ++ i-1, (i-1)==1 ? "" : "s"); ++ ++ sprintf(tmp, "%s%d", tmpname, 1); /* open page #1 */ ++ filename = tmp; ++ } ++ } /* if (!quick) ... */ ++ ++ ++ tif = TIFFOpen(filename,"r"); + if (!tif) return 0; + + /* flip orientation so that image comes in X order */ +@@ -107,6 +193,11 @@ + TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &bps); + TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photo); + TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &spp); ++ if ((TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres) == 1) && ++ (TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres) == 1)) { ++ normaspect = yres / xres; ++ if (DEBUG) fprintf(stderr,"TIFF aspect = %f\n", normaspect); ++ } + + if (spp == 1) { + pic8 = loadPalette(tif, w, h, photo, bps, pinfo); +@@ -116,19 +207,19 @@ + + /* try to get comments, if any */ + pinfo->comment = (char *) NULL; +- ++ + desc = (char *) NULL; + + TIFFGetField(tif, TIFFTAG_IMAGEDESCRIPTION, &desc); + if (desc && strlen(desc) > (size_t) 0) { + /* kludge: tiff library seems to return bizarre comments */ +- if (strlen(desc)==4 && strcmp(desc, "\367\377\353\370")==0) {} ++ if (strlen(desc)==4 && strcmp(desc, "\367\377\353\370")==0) {} + else { + pinfo->comment = (char *) malloc(strlen(desc) + 1); + if (pinfo->comment) strcpy(pinfo->comment, desc); + } + } +- ++ + TIFFClose(tif); + + /* un-kludge */ +@@ -139,6 +230,8 @@ + if (pic8) free(pic8); + if (pinfo->comment) free(pinfo->comment); + pinfo->comment = (char *) NULL; ++ if (!quick && nump>1) KillPageFiles(tmpname, nump); ++ SetCursors(-1); + return 0; + } + +@@ -148,15 +241,168 @@ + pinfo->normw = pinfo->w; pinfo->normh = pinfo->h; + pinfo->frmType = F_TIFF; + ++ if (nump>1) strcpy(pinfo->pagebname, tmpname); ++ pinfo->numpages = nump; + + if (pinfo->pic) return 1; + ++ + /* failed. if we malloc'd a comment, free it */ + if (pinfo->comment) free(pinfo->comment); + pinfo->comment = (char *) NULL; + ++ if (!quick && nump>1) KillPageFiles(tmpname, nump); ++ SetCursors(-1); ++ + return 0; +-} ++} ++ ++ ++ ++ ++/*******************************************/ ++ ++#define CopyField(tag, v) \ ++ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) ++#define CopyField2(tag, v1, v2) \ ++ if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2) ++#define CopyField3(tag, v1, v2, v3) \ ++ if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3) ++ ++ ++/*******************************************/ ++static int copyTiff(in, fname) ++ TIFF *in; ++ char *fname; ++{ ++ /* copies tiff (sub)image to given filename. (Used only for multipage ++ images.) Returns 0 on error */ ++ ++ TIFF *out; ++ short bitspersample, samplesperpixel, shortv, *shortav; ++ uint32 w, l; ++ float floatv; ++ char *stringv; ++ uint32 longv; ++ uint16 *red, *green, *blue, shortv2; ++ int rv; ++ ++ out = TIFFOpen(fname, "w"); ++ if (!out) return 0; ++ ++ CopyField (TIFFTAG_SUBFILETYPE, longv); ++ CopyField (TIFFTAG_TILEWIDTH, w); ++ CopyField (TIFFTAG_TILELENGTH, l); ++ CopyField (TIFFTAG_IMAGEWIDTH, w); ++ CopyField (TIFFTAG_IMAGELENGTH, l); ++ CopyField (TIFFTAG_BITSPERSAMPLE, bitspersample); ++ CopyField (TIFFTAG_COMPRESSION, shortv); ++ CopyField (TIFFTAG_PREDICTOR, shortv); ++ CopyField (TIFFTAG_PHOTOMETRIC, shortv); ++ CopyField (TIFFTAG_THRESHHOLDING, shortv); ++ CopyField (TIFFTAG_FILLORDER, shortv); ++ CopyField (TIFFTAG_ORIENTATION, shortv); ++ CopyField (TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); ++ CopyField (TIFFTAG_MINSAMPLEVALUE, shortv); ++ CopyField (TIFFTAG_MAXSAMPLEVALUE, shortv); ++ CopyField (TIFFTAG_XRESOLUTION, floatv); ++ CopyField (TIFFTAG_YRESOLUTION, floatv); ++ CopyField (TIFFTAG_GROUP3OPTIONS, longv); ++ CopyField (TIFFTAG_GROUP4OPTIONS, longv); ++ CopyField (TIFFTAG_RESOLUTIONUNIT, shortv); ++ CopyField (TIFFTAG_PLANARCONFIG, shortv); ++ CopyField (TIFFTAG_ROWSPERSTRIP, longv); ++ CopyField (TIFFTAG_XPOSITION, floatv); ++ CopyField (TIFFTAG_YPOSITION, floatv); ++ CopyField (TIFFTAG_IMAGEDEPTH, longv); ++ CopyField (TIFFTAG_TILEDEPTH, longv); ++ CopyField2(TIFFTAG_EXTRASAMPLES, shortv, shortav); ++ CopyField3(TIFFTAG_COLORMAP, red, green, blue); ++ CopyField2(TIFFTAG_PAGENUMBER, shortv, shortv2); ++ CopyField (TIFFTAG_ARTIST, stringv); ++ CopyField (TIFFTAG_IMAGEDESCRIPTION,stringv); ++ CopyField (TIFFTAG_MAKE, stringv); ++ CopyField (TIFFTAG_MODEL, stringv); ++ CopyField (TIFFTAG_SOFTWARE, stringv); ++ CopyField (TIFFTAG_DATETIME, stringv); ++ CopyField (TIFFTAG_HOSTCOMPUTER, stringv); ++ CopyField (TIFFTAG_PAGENAME, stringv); ++ CopyField (TIFFTAG_DOCUMENTNAME, stringv); ++ ++ if (TIFFIsTiled(in)) rv = cpTiles (in, out); ++ else rv = cpStrips(in, out); ++ ++ TIFFClose(out); ++ return rv; ++} ++ ++ ++/*******************************************/ ++static int cpStrips(in, out) ++ TIFF *in, *out; ++{ ++ tsize_t bufsize; ++ byte *buf; ++ ++ bufsize = TIFFStripSize(in); ++ if (bufsize <= 0) return 0; /* tsize_t is signed */ ++ buf = (byte *) malloc((size_t) bufsize); ++ if (buf) { ++ tstrip_t s, ns = TIFFNumberOfStrips(in); ++ uint32 *bytecounts; ++ ++ TIFFGetField(in, TIFFTAG_STRIPBYTECOUNTS, &bytecounts); ++ for (s = 0; s < ns; s++) { ++ if (bytecounts[s] > bufsize) { ++ buf = (unsigned char *) realloc(buf, (size_t) bytecounts[s]); ++ if (!buf) return (0); ++ bufsize = bytecounts[s]; ++ } ++ if (TIFFReadRawStrip (in, s, buf, (tsize_t) bytecounts[s]) < 0 || ++ TIFFWriteRawStrip(out, s, buf, (tsize_t) bytecounts[s]) < 0) { ++ free(buf); ++ return 0; ++ } ++ } ++ free(buf); ++ return 1; ++ } ++ return 0; ++} ++ ++ ++/*******************************/ ++static int cpTiles(in, out) ++ TIFF *in, *out; ++{ ++ tsize_t bufsize; ++ byte *buf; ++ ++ bufsize = TIFFTileSize(in); ++ if (bufsize <= 0) return 0; /* tsize_t is signed */ ++ buf = (unsigned char *) malloc((size_t) bufsize); ++ if (buf) { ++ ttile_t t, nt = TIFFNumberOfTiles(in); ++ uint32 *bytecounts; ++ ++ TIFFGetField(in, TIFFTAG_TILEBYTECOUNTS, &bytecounts); ++ for (t = 0; t < nt; t++) { ++ if (bytecounts[t] > bufsize) { ++ buf = (unsigned char *)realloc(buf, (size_t) bytecounts[t]); ++ if (!buf) return (0); ++ bufsize = bytecounts[t]; ++ } ++ if (TIFFReadRawTile (in, t, buf, (tsize_t) bytecounts[t]) < 0 || ++ TIFFWriteRawTile(out, t, buf, (tsize_t) bytecounts[t]) < 0) { ++ free(buf); ++ return 0; ++ } ++ } ++ free(buf); ++ return 1; ++ } ++ return 0; ++} + + + /*******************************************/ +@@ -167,6 +413,7 @@ + PICINFO *pinfo; + { + byte *pic8; ++ uint32 npixels; + + switch (photo) { + case PHOTOMETRIC_PALETTE: +@@ -178,7 +425,7 @@ + case PHOTOMETRIC_MINISWHITE: + case PHOTOMETRIC_MINISBLACK: + pinfo->colType = (bps==1) ? F_BWDITHER : F_GREYSCALE; +- sprintf(pinfo->fullInfo,"TIFF, %u-bit, %s format. (%ld bytes)", ++ sprintf(pinfo->fullInfo,"TIFF, %u-bit, %s format. (%ld bytes)", + bps, + photo == PHOTOMETRIC_MINISWHITE ? "min-is-white" : + "min-is-black", +@@ -186,9 +433,16 @@ + break; + } + +- sprintf(pinfo->shrtInfo, "%ux%u TIFF.",w,h); ++ sprintf(pinfo->shrtInfo, "%ux%u TIFF.",(u_int) w, (u_int) h); ++ ++ npixels = w*h; ++ if (npixels/w != h) { ++ /* SetISTR(ISTR_WARNING, "loadPalette() - image dimensions too large"); */ ++ TIFFError(filename, "Image dimensions too large"); ++ return (byte *) NULL; ++ } + +- pic8 = (byte *) malloc((size_t) w*h); ++ pic8 = (byte *) malloc((size_t) npixels); + if (!pic8) FatalError("loadPalette() - couldn't malloc 'pic8'"); + + if (loadImage(tif, w, h, pic8, 0)) return pic8; +@@ -205,19 +459,28 @@ + PICINFO *pinfo; + { + byte *pic24, *pic8; ++ uint32 npixels, count; + + pinfo->colType = F_FULLCOLOR; +- sprintf(pinfo->fullInfo, "TIFF, %u-bit, %s format. (%ld bytes)", ++ sprintf(pinfo->fullInfo, "TIFF, %u-bit, %s format. (%ld bytes)", + bps, + (photo == PHOTOMETRIC_RGB ? "RGB" : + photo == PHOTOMETRIC_YCBCR ? "YCbCr" : + "???"), + filesize); + +- sprintf(pinfo->shrtInfo, "%ux%u TIFF.",w,h); ++ sprintf(pinfo->shrtInfo, "%ux%u TIFF.",(u_int) w, (u_int) h); ++ ++ npixels = w*h; ++ count = 3*npixels; ++ if (npixels/w != h || count/3 != npixels) { ++ /* SetISTR(ISTR_WARNING, "loadPalette() - image dimensions too large"); */ ++ TIFFError(filename, "Image dimensions too large"); ++ return (byte *) NULL; ++ } + + /* allocate 24-bit image */ +- pic24 = (byte *) malloc((size_t) w*h*3); ++ pic24 = (byte *) malloc((size_t) count); + if (!pic24) FatalError("loadColor() - couldn't malloc 'pic24'"); + + pic8 = (byte *) NULL; +@@ -301,10 +564,10 @@ + static byte **BWmap; + static byte **PALmap; + +-typedef void (*tileContigRoutine) PARM((byte*, u_char*, RGBvalue*, ++typedef void (*tileContigRoutine) PARM((byte*, u_char*, RGBvalue*, + uint32, uint32, int, int)); + +-typedef void (*tileSeparateRoutine) PARM((byte*, u_char*, u_char*, u_char*, ++typedef void (*tileSeparateRoutine) PARM((byte*, u_char*, u_char*, u_char*, + RGBvalue*, uint32, uint32, int, int)); + + +@@ -312,13 +575,13 @@ + + static int gt PARM((TIFF *, uint32, uint32, byte *)); + static uint32 setorientation PARM((TIFF *, uint32)); +-static int gtTileContig PARM((TIFF *, byte *, RGBvalue *, ++static int gtTileContig PARM((TIFF *, byte *, RGBvalue *, + uint32, uint32, int)); +-static int gtTileSeparate PARM((TIFF *, byte *, RGBvalue *, ++static int gtTileSeparate PARM((TIFF *, byte *, RGBvalue *, + uint32, uint32, int)); +-static int gtStripContig PARM((TIFF *, byte *, RGBvalue *, ++static int gtStripContig PARM((TIFF *, byte *, RGBvalue *, + uint32, uint32, int)); +-static int gtStripSeparate PARM((TIFF *, byte *, RGBvalue *, ++static int gtStripSeparate PARM((TIFF *, byte *, RGBvalue *, + uint32, uint32, int)); + + static int makebwmap PARM((void)); +@@ -349,18 +612,18 @@ + static void putRGBcontig16bittile PARM((byte *, u_short *, RGBvalue *, + uint32, uint32, int, int)); + +-static void putRGBseparate8bittile PARM((byte *, u_char *, u_char *, +- u_char *, RGBvalue *, ++static void putRGBseparate8bittile PARM((byte *, u_char *, u_char *, ++ u_char *, RGBvalue *, + uint32, uint32, int, int)); + +-static void putRGBseparate16bittile PARM((byte *, u_short *, u_short *, +- u_short *, RGBvalue *, ++static void putRGBseparate16bittile PARM((byte *, u_short *, u_short *, ++ u_short *, RGBvalue *, + uint32, uint32, int, int)); + + + static void initYCbCrConversion PARM((void)); + +-static void putRGBContigYCbCrClump PARM((byte *, u_char *, int, int, ++static void putRGBContigYCbCrClump PARM((byte *, u_char *, int, int, + uint32, int, int, int)); + + static void putcontig8bitYCbCrtile PARM((byte *, u_char *, RGBvalue *, +@@ -382,10 +645,10 @@ + + TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &bitspersample); + switch (bitspersample) { +- case 1: +- case 2: ++ case 1: ++ case 2: + case 4: +- case 8: ++ case 8: + case 16: break; + + default: +@@ -397,8 +660,8 @@ + + TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); + switch (samplesperpixel) { +- case 1: +- case 3: ++ case 1: ++ case 3: + case 4: break; + + default: +@@ -470,7 +733,7 @@ + TIFFGetFieldDefaulted(tif, TIFFTAG_MINSAMPLEVALUE, &minsamplevalue); + TIFFGetFieldDefaulted(tif, TIFFTAG_MAXSAMPLEVALUE, &maxsamplevalue); + Map = NULL; +- ++ + switch (photometric) { + case PHOTOMETRIC_YCBCR: + TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRCOEFFICIENTS, +@@ -481,12 +744,12 @@ + &refBlackWhite); + initYCbCrConversion(); + /* fall thru... */ +- ++ + case PHOTOMETRIC_RGB: + bpp *= 3; + if (minsamplevalue == 0 && maxsamplevalue == 255) + break; +- ++ + /* fall thru... */ + case PHOTOMETRIC_MINISBLACK: + case PHOTOMETRIC_MINISWHITE: +@@ -509,7 +772,7 @@ + if (range<256) { + for (x=0; x<=range; x++) rmap[x] = gmap[x] = bmap[x] = Map[x]; + } else { +- for (x=0; x<256; x++) ++ for (x=0; x<256; x++) + rmap[x] = gmap[x] = bmap[x] = Map[(range*x)/255]; + } + +@@ -590,6 +853,8 @@ + TIFF *tif; + uint32 h; + { ++ /* note that orientation was flipped in LoadTIFF() (near line 175) */ ++ + uint32 y; + + TIFFGetFieldDefaulted(tif, TIFFTAG_ORIENTATION, &orientation); +@@ -613,6 +878,11 @@ + orientation = ORIENTATION_TOPLEFT; + /* fall thru... */ + case ORIENTATION_TOPLEFT: ++ /* GRR 20050319: This may be wrong for tiled images (also stripped?); ++ * looks like we want to return th-1 instead of h-1 in at least some ++ * cases. For now, just added quick hack (USE_TILED_TIFF_BOTLEFT_FIX) ++ * to gtTileContig(). (Note that, as of libtiff 3.7.1, tiffcp still ++ * has exactly the same bug.) */ + y = h-1; + break; + } +@@ -623,11 +893,11 @@ + + + /* +- * Get an tile-organized image that has ++ * Get a tile-organized image that has + * PlanarConfiguration contiguous if SamplesPerPixel > 1 + * or + * SamplesPerPixel == 1 +- */ ++ */ + /*******************************************/ + static int gtTileContig(tif, raster, Map, h, w, bpp) + TIFF *tif; +@@ -642,11 +912,14 @@ + int fromskew, toskew; + u_int nrow; + tileContigRoutine put; ++ tsize_t bufsize; + + put = pickTileContigCase(Map); + if (put == 0) return (0); + +- buf = (u_char *) malloc((size_t) TIFFTileSize(tif)); ++ bufsize = TIFFTileSize(tif); ++ if (bufsize <= 0) return 0; /* tsize_t is signed */ ++ buf = (u_char *) malloc((size_t) bufsize); + if (buf == 0) { + TIFFError(filename, "No space for tile buffer"); + return (0); +@@ -655,12 +928,27 @@ + TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); + TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); + y = setorientation(tif, h); ++#ifdef USE_TILED_TIFF_BOTLEFT_FIX /* image _originally_ ORIENTATION_BOTLEFT */ ++ /* this fix causes tiles as a whole to be placed starting at the top, ++ * regardless of orientation; the only difference is what happens within ++ * a given tile (see toskew, below) */ ++ /* GRR FIXME: apply globally in setorientation()? */ ++ if (orientation == ORIENTATION_TOPLEFT) ++ y = th-1; ++#endif ++ /* toskew causes individual tiles to copy from bottom to top for ++ * ORIENTATION_TOPLEFT and from top to bottom otherwise */ + toskew = (orientation == ORIENTATION_TOPLEFT ? -tw + -w : -tw + w); + + for (row = 0; row < h; row += th) { + nrow = (row + th > h ? h - row : th); + for (col = 0; col < w; col += tw) { +- if (TIFFReadTile(tif,buf,(uint32)col, (uint32)row, 0, 0) < 0 ++ /* ++ * This reads the tile at (col,row) into buf. "The data placed in buf ++ * are returned decompressed and, typically, in the native byte- and ++ * bit-ordering, but are otherwise packed." ++ */ ++ if (TIFFReadTile(tif, buf, (uint32)col, (uint32)row, 0, 0) < 0 + && stoponerr) break; + + if (col + tw > w) { +@@ -670,14 +958,18 @@ + */ + uint32 npix = w - col; + fromskew = tw - npix; +- (*put)(raster + (y*w + col)*bpp, buf, Map, npix, (uint32) nrow, +- fromskew, (int) ((toskew + fromskew)*bpp)); ++ (*put)(raster + (y*w + col)*bpp, buf, Map, npix, (uint32) nrow, ++ fromskew, (int) ((toskew + fromskew)*bpp) ); + } else +- (*put)(raster + (y*w + col)*bpp, buf, Map, tw, (uint32) nrow, ++ (*put)(raster + (y*w + col)*bpp, buf, Map, tw, (uint32) nrow, + 0, (int) (toskew*bpp)); + } + ++#ifdef USE_TILED_TIFF_BOTLEFT_FIX /* image _originally_ ORIENTATION_BOTLEFT */ ++ y += nrow; ++#else + y += (orientation == ORIENTATION_TOPLEFT ? -nrow : nrow); ++#endif + } + free(buf); + return (1); +@@ -687,11 +979,11 @@ + + + /* +- * Get an tile-organized image that has ++ * Get a tile-organized image that has + * SamplesPerPixel > 1 + * PlanarConfiguration separated + * We assume that all such images are RGB. +- */ ++ */ + + /*******************************************/ + static int gtTileSeparate(tif, raster, Map, h, w, bpp) +@@ -701,20 +993,26 @@ + uint32 h, w; + int bpp; + { +- uint32 col, row, y; + uint32 tw, th; ++ uint32 col, row, y; + u_char *buf; + u_char *r, *g, *b; +- int tilesize; ++ tsize_t tilesize; ++ uint32 bufsize; + int fromskew, toskew; + u_int nrow; + tileSeparateRoutine put; +- ++ + put = pickTileSeparateCase(Map); + if (put == 0) return (0); + + tilesize = TIFFTileSize(tif); +- buf = (u_char *)malloc((size_t) (3*tilesize)); ++ bufsize = 3*tilesize; ++ if (tilesize <= 0 || bufsize/3 != tilesize) { /* tsize_t is signed */ ++ TIFFError(filename, "Image dimensions too large"); ++ return 0; ++ } ++ buf = (u_char *) malloc((size_t) bufsize); + if (buf == 0) { + TIFFError(filename, "No space for tile buffer"); + return (0); +@@ -751,10 +1049,10 @@ + */ + uint32 npix = w - col; + fromskew = tw - npix; +- (*put)(raster + (y*w + col)*bpp, r, g, b, Map, npix, (uint32) nrow, ++ (*put)(raster + (y*w + col)*bpp, r, g, b, Map, npix, (uint32) nrow, + fromskew, (int) ((toskew + fromskew)*bpp)); + } else +- (*put)(raster + (y*w + col)*bpp, r, g, b, Map, tw, (uint32) nrow, ++ (*put)(raster + (y*w + col)*bpp, r, g, b, Map, tw, (uint32) nrow, + 0, (int) (toskew*bpp)); + } + y += (orientation == ORIENTATION_TOPLEFT ? -nrow : nrow); +@@ -768,7 +1066,7 @@ + * PlanarConfiguration contiguous if SamplesPerPixel > 1 + * or + * SamplesPerPixel == 1 +- */ ++ */ + /*******************************************/ + static int gtStripContig(tif, raster, Map, h, w, bpp) + TIFF *tif; +@@ -784,11 +1082,15 @@ + uint32 imagewidth; + int scanline; + int fromskew, toskew; +- ++ tsize_t bufsize; ++ + put = pickTileContigCase(Map); + if (put == 0) + return (0); +- buf = (u_char *) malloc((size_t) TIFFStripSize(tif)); ++ ++ bufsize = TIFFStripSize(tif); ++ if (bufsize <= 0) return 0; /* tsize_t is signed */ ++ buf = (u_char *) malloc((size_t) bufsize); + if (buf == 0) { + TIFFError(filename, "No space for strip buffer"); + return (0); +@@ -828,20 +1130,29 @@ + uint32 h, w; + int bpp; + { ++ uint32 nrow, row, y; + u_char *buf; + u_char *r, *g, *b; +- uint32 row, y, nrow; ++ tsize_t stripsize; ++ uint32 bufsize; ++ int fromskew, toskew; + int scanline; + tileSeparateRoutine put; + uint32 rowsperstrip; + uint32 imagewidth; +- u_int stripsize; +- int fromskew, toskew; +- ++ + stripsize = TIFFStripSize(tif); +- r = buf = (u_char *) malloc((size_t) 3*stripsize); +- if (buf == 0) ++ bufsize = 3*stripsize; ++ if (stripsize <= 0 || bufsize/3 != stripsize) { /* tsize_t is signed */ ++ TIFFError(filename, "Image dimensions too large"); ++ return 0; ++ } ++ buf = (u_char *) malloc((size_t) bufsize); ++ if (buf == 0) { ++ TIFFError(filename, "No space for strip buffer"); + return (0); ++ } ++ r = buf; + g = r + stripsize; + b = g + stripsize; + put = pickTileSeparateCase(Map); +@@ -861,7 +1172,7 @@ + nrow = (row + rowsperstrip > h ? h - row : rowsperstrip); + band = 0; + if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, (uint32) row, band), +- (tdata_t) r, (tsize_t)(nrow*scanline)) < 0 ++ (tdata_t) r, (tsize_t)(nrow*scanline)) < 0 + && stoponerr) break; + + band = 1; +@@ -871,7 +1182,7 @@ + + band = 2; + if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, (uint32) row, band), +- (tdata_t) b, (tsize_t)(nrow*scanline)) < 0 ++ (tdata_t) b, (tsize_t)(nrow*scanline)) < 0 + && stoponerr) break; + + (*put)(raster + y*w*bpp, r, g, b, Map, w, nrow, fromskew, toskew*bpp); +@@ -895,7 +1206,7 @@ + register int i; + int nsamples = 8 / bitspersample; + register byte *p; +- ++ + BWmap = (byte **)malloc( + 256*sizeof (byte *)+(256*nsamples*sizeof(byte))); + if (BWmap == NULL) { +@@ -949,7 +1260,7 @@ + register int i; + int nsamples = 8 / bitspersample; + register byte *p; +- ++ + PALmap = (byte **)malloc( + 256*sizeof (byte *)+(256*nsamples*sizeof(byte))); + if (PALmap == NULL) { +@@ -1014,7 +1325,7 @@ + #define CASE4(x,op) switch (x) { case 3: op; case 2: op; case 1: op; } + + #define UNROLL8(w, op1, op2) { \ +- uint32 x; \ ++ uint32 x; \ + for (x = w; x >= 8; x -= 8) { \ + op1; \ + REPEAT8(op2); \ +@@ -1026,7 +1337,7 @@ + } + + #define UNROLL4(w, op1, op2) { \ +- register uint32 x; \ ++ uint32 x; \ + for (x = w; x >= 4; x -= 4) { \ + op1; \ + REPEAT4(op2); \ +@@ -1038,7 +1349,7 @@ + } + + #define UNROLL2(w, op1, op2) { \ +- register uint32 x; \ ++ uint32 x; \ + for (x = w; x >= 2; x -= 2) { \ + op1; \ + REPEAT2(op2); \ +@@ -1048,7 +1359,7 @@ + op2; \ + } \ + } +- ++ + + #define SKEW(r,g,b,skew) { r += skew; g += skew; b += skew; } + +@@ -1065,7 +1376,7 @@ + int fromskew, toskew; + { + while (h-- > 0) { +- UNROLL8(w,0, *cp++ = PALmap[*pp++][0]); ++ UNROLL8(w, , *cp++ = PALmap[*pp++][0]) + cp += toskew; + pp += fromskew; + } +@@ -1082,7 +1393,7 @@ + int fromskew, toskew; + { + register byte *bw; +- ++ + fromskew /= 2; + while (h-- > 0) { + UNROLL2(w, bw = PALmap[*pp++], *cp++ = *bw++); +@@ -1103,7 +1414,7 @@ + int fromskew, toskew; + { + register byte *bw; +- ++ + fromskew /= 4; + while (h-- > 0) { + UNROLL4(w, bw = PALmap[*pp++], *cp++ = *bw++); +@@ -1123,10 +1434,10 @@ + int fromskew, toskew; + { + register byte *bw; +- ++ + fromskew /= 8; + while (h-- > 0) { +- UNROLL8(w, bw = PALmap[*pp++], *cp++ = *bw++); ++ UNROLL8(w, bw = PALmap[*pp++], *cp++ = *bw++) + cp += toskew; + pp += fromskew; + } +@@ -1164,10 +1475,10 @@ + int fromskew, toskew; + { + register byte *bw; +- ++ + fromskew /= 8; + while (h-- > 0) { +- UNROLL8(w, bw = BWmap[*pp++], *cp++ = *bw++); ++ UNROLL8(w, bw = BWmap[*pp++], *cp++ = *bw++) + cp += toskew; + pp += fromskew; + } +@@ -1184,7 +1495,7 @@ + int fromskew, toskew; + { + register byte *bw; +- ++ + fromskew /= 4; + while (h-- > 0) { + UNROLL4(w, bw = BWmap[*pp++], *cp++ = *bw++); +@@ -1204,7 +1515,7 @@ + int fromskew, toskew; + { + register byte *bw; +- ++ + fromskew /= 2; + while (h-- > 0) { + UNROLL2(w, bw = BWmap[*pp++], *cp++ = *bw++); +@@ -1224,7 +1535,7 @@ + int fromskew, toskew; + { + register uint32 x; +- ++ + while (h-- > 0) { + for (x=w; x>0; x--) { + *cp++ = Map[(pp[0] << 8) + pp[1]]; +@@ -1262,11 +1573,11 @@ + } + } else { + while (h-- > 0) { +- UNROLL8(w,0, ++ UNROLL8(w, , + *cp++ = pp[0]; + *cp++ = pp[1]; + *cp++ = pp[2]; +- pp += samplesperpixel); ++ pp += samplesperpixel) + cp += toskew; + pp += fromskew; + } +@@ -1284,7 +1595,7 @@ + int fromskew, toskew; + { + register u_int x; +- ++ + fromskew *= samplesperpixel; + if (Map) { + while (h-- > 0) { +@@ -1320,7 +1631,7 @@ + RGBvalue *Map; + uint32 w, h; + int fromskew, toskew; +- ++ + { + if (Map) { + while (h-- > 0) { +@@ -1335,11 +1646,11 @@ + } + } else { + while (h-- > 0) { +- UNROLL8(w,0, ++ UNROLL8(w, , + *cp++ = *r++; + *cp++ = *g++; + *cp++ = *b++; +- ); ++ ) + SKEW(r, g, b, fromskew); + cp += toskew; + } +@@ -1357,7 +1668,7 @@ + int fromskew, toskew; + { + uint32 x; +- ++ + if (Map) { + while (h-- > 0) { + for (x = w; x > 0; x--) { +@@ -1381,7 +1692,7 @@ + } + } + +-#define Code2V(c, RB, RW, CR) ((((c)-(int)RB)*(float)CR)/(float)(RW-RB)) ++#define Code2V(c, RB, RW, CR) (((((int)c)-(int)RB)*(float)CR)/(float)(RW-RB)) + + #define CLAMP(f,min,max) \ + (int)((f)+.5 < (min) ? (min) : (f)+.5 > (max) ? (max) : (f)+.5) +@@ -1391,16 +1702,32 @@ + #define LumaBlue YCbCrCoeffs[2] + + static float D1, D2; +-static float D3, D4, D5; ++static float D3, D4 /*, D5 */; + + + static void initYCbCrConversion() + { ++ /* ++ * Old, broken version (goes back at least to 19920426; made worse 19941222): ++ * YCbCrCoeffs[] = {0.299, 0.587, 0.114} ++ * D1 = 1.402 ++ * D2 = 0.714136 ++ * D3 = 1.772 ++ * D4 = 0.138691 <-- bogus ++ * D5 = 1.70358 <-- unnecessary ++ * ++ * New, fixed version (GRR 20050319): ++ * YCbCrCoeffs[] = {0.299, 0.587, 0.114} ++ * D1 = 1.402 ++ * D2 = 0.714136 ++ * D3 = 1.772 ++ * D4 = 0.344136 ++ */ + D1 = 2 - 2*LumaRed; + D2 = D1*LumaRed / LumaGreen; + D3 = 2 - 2*LumaBlue; +- D4 = D2*LumaBlue / LumaGreen; +- D5 = 1.0 / LumaGreen; ++ D4 = D3*LumaBlue / LumaGreen; /* ARGH, used to be D2*LumaBlue/LumaGreen ! */ ++/* D5 = 1.0 / LumaGreen; */ /* unnecessary */ + } + + static void putRGBContigYCbCrClump(cp, pp, cw, ch, w, n, fromskew, toskew) +@@ -1412,7 +1739,7 @@ + { + float Cb, Cr; + int j, k; +- ++ + Cb = Code2V(pp[n], refBlackWhite[2], refBlackWhite[3], 127); + Cr = Code2V(pp[n+1], refBlackWhite[4], refBlackWhite[5], 127); + for (j = 0; j < ch; j++) { +@@ -1421,8 +1748,24 @@ + Y = Code2V(*pp++, + refBlackWhite[0], refBlackWhite[1], 255); + R = Y + Cr*D1; ++/* G = Y*D5 - Cb*D4 - Cr*D2; highly bogus! */ ++ G = Y - Cb*D4 - Cr*D2; + B = Y + Cb*D3; +- G = Y*D5 - Cb*D4 - Cr*D2; ++ /* ++ * These are what the JPEG/JFIF equations--which aren't _necessarily_ ++ * what JPEG/TIFF uses but which seem close enough--are supposed to be, ++ * according to Avery Lee (e.g., see http://www.fourcc.org/fccyvrgb.php): ++ * ++ * R = Y + 1.402 (Cr-128) ++ * G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128) ++ * B = Y + 1.772 (Cb-128) ++ * ++ * Translated into xvtiff.c notation: ++ * ++ * R = Y + Cr*D1 ++ * G = Y - Cb*D4' - Cr*D2 (i.e., omit D5 and fix D4) ++ * B = Y + Cb*D3 ++ */ + cp[3*k+0] = CLAMP(R,0,255); + cp[3*k+1] = CLAMP(G,0,255); + cp[3*k+2] = CLAMP(B,0,255); +@@ -1452,7 +1795,7 @@ + u_int Coff = YCbCrVertSampling * YCbCrHorizSampling; + byte *tp; + uint32 x; +- ++ + /* XXX adjust fromskew */ + while (h >= YCbCrVertSampling) { + tp = cp; +@@ -1481,7 +1824,7 @@ + pp += Coff+2; + } + if (x > 0) +- putRGBContigYCbCrClump(tp, pp, (int) x, (int) h, w, ++ putRGBContigYCbCrClump(tp, pp, (int) x, (int) h, w, + (int)Coff, (int)(YCbCrHorizSampling-x),toskew); + } + } +@@ -1493,7 +1836,7 @@ + RGBvalue* Map; + { + tileContigRoutine put = 0; +- ++ + switch (photometric) { + case PHOTOMETRIC_RGB: + switch (bitspersample) { +@@ -1501,7 +1844,7 @@ + case 16: put = (tileContigRoutine) putRGBcontig16bittile; break; + } + break; +- ++ + case PHOTOMETRIC_PALETTE: + switch (bitspersample) { + case 8: put = put8bitcmaptile; break; +@@ -1544,7 +1887,7 @@ + RGBvalue* Map; + { + tileSeparateRoutine put = 0; +- ++ + switch (photometric) { + case PHOTOMETRIC_RGB: + switch (bitspersample) { +diff -ruN xv-3.10a/xvtiffwr.c xv-3.10a-bugfixes/xvtiffwr.c +--- xv-3.10a/xvtiffwr.c 1995-01-03 13:28:13.000000000 -0800 ++++ xv-3.10a-bugfixes/xvtiffwr.c 2005-03-28 08:39:52.000000000 -0800 +@@ -9,15 +9,15 @@ + + #ifdef HAVE_TIFF + +-#include "tiffio.h" /* has to be after xv.h, as it needs varargs/stdarg */ ++#include <tiffio.h> /* has to be after xv.h, as it needs varargs/stdarg */ + + + #define ALLOW_JPEG 0 /* set to '1' to allow 'JPEG' choice in dialog box */ + + + static void setupColormap PARM((TIFF *, byte *, byte *, byte *)); +-static int WriteTIFF PARM((FILE *, byte *, int, int, int, +- byte *, byte *, byte *, int, int, ++static int WriteTIFF PARM((FILE *, byte *, int, int, int, ++ byte *, byte *, byte *, int, int, + char *, int, char *)); + + +@@ -29,7 +29,7 @@ + { + short red[256], green[256], blue[256]; + int i; +- ++ + /* convert 8-bit colormap to 16-bit */ + for (i=0; i<256; i++) { + #define SCALE(x) ((((int)x)*((1L<<16)-1))/255) +@@ -43,6 +43,7 @@ + + + /*******************************************/ ++/* Returns '0' if successful. */ + static int WriteTIFF(fp,pic,ptype,w,h,rmap,gmap,bmap,numcols,colorstyle, + fname,comp,comment) + FILE *fp; +@@ -55,6 +56,13 @@ + TIFF *tif; + byte *pix; + int i,j; ++ int npixels = w*h; ++ ++ if (w <= 0 || h <= 0 || npixels/w != h) { ++ SetISTR(ISTR_WARNING, "%s: image dimensions too large", fname); ++ /* TIFFError(fname, "Image dimensions too large"); */ ++ return -1; ++ } + + #ifndef VMS + tif = TIFFOpen(fname, "w"); +@@ -62,7 +70,7 @@ + tif = TIFFFdOpen(dup(fileno(fp)), fname, "w"); + #endif + +- if (!tif) return 0; ++ if (!tif) return -1; /* GRR: was 0 */ + + WaitCursor(); + +@@ -84,19 +92,27 @@ + TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, h); + + TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, (int)2); +- TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float)1200.0); +- TIFFSetField(tif, TIFFTAG_YRESOLUTION, (float)1200.0); ++ TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float) 72.0); ++ TIFFSetField(tif, TIFFTAG_YRESOLUTION, (float) 72.0); + + + /* write the image data */ + + if (ptype == PIC24) { /* only have to deal with FULLCOLOR or GREYSCALE */ + if (colorstyle == F_FULLCOLOR) { ++ int count = 3*npixels; ++ ++ if (count/3 != npixels) { /* already know w, h, npixels > 0 */ ++ /* SetISTR(ISTR_WARNING, "%s: image dimensions too large", fname); */ ++ TIFFError(fname, "Image dimensions too large"); ++ return -1; ++ } ++ + TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3); + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); +- +- TIFFWriteEncodedStrip(tif, 0, pic, w*h*3); ++ ++ TIFFWriteEncodedStrip(tif, 0, pic, count); + } + + else { /* colorstyle == F_GREYSCALE */ +@@ -106,13 +122,13 @@ + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); + +- tpic = (byte *) malloc((size_t) w*h); ++ tpic = (byte *) malloc((size_t) npixels); + if (!tpic) FatalError("unable to malloc in WriteTIFF()"); + +- for (i=0, tp=tpic, sp=pic; i<w*h; i++, sp+=3) ++ for (i=0, tp=tpic, sp=pic; i<npixels; i++, sp+=3) + *tp++ = MONO(sp[0],sp[1],sp[2]); +- +- TIFFWriteEncodedStrip(tif, 0, tpic, w*h); ++ ++ TIFFWriteEncodedStrip(tif, 0, tpic, npixels); + + free(tpic); + } +@@ -123,32 +139,42 @@ + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE); + setupColormap(tif, rmap, gmap, bmap); +- TIFFWriteEncodedStrip(tif, 0, pic, w*h); ++ TIFFWriteEncodedStrip(tif, 0, pic, npixels); + } + + else if (colorstyle == F_GREYSCALE) { /* 8-bit greyscale */ + byte rgb[256]; +- byte *tpic = (byte *) malloc((size_t) w*h); ++ byte *tpic = (byte *) malloc((size_t) npixels); + byte *tp = tpic; + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); + for (i=0; i<numcols; i++) rgb[i] = MONO(rmap[i],gmap[i],bmap[i]); +- for (i=0, pix=pic; i<w*h; i++,pix++) { ++ for (i=0, pix=pic; i<npixels; i++,pix++) { + if ((i&0x7fff)==0) WaitCursor(); + *tp++ = rgb[*pix]; + } +- TIFFWriteEncodedStrip(tif, 0, tpic, w*h); ++ TIFFWriteEncodedStrip(tif, 0, tpic, npixels); + free(tpic); + } + + else if (colorstyle == F_BWDITHER) { /* 1-bit B/W stipple */ + int bit,k,flipbw; + byte *tpic, *tp; ++ tsize_t stripsize; /* signed */ + + flipbw = (MONO(rmap[0],gmap[0],bmap[0]) > MONO(rmap[1],gmap[1],bmap[1])); + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 1); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); +- tpic = (byte *) malloc((size_t) TIFFStripSize(tif)); ++ stripsize = TIFFStripSize(tif); ++ if (stripsize <= 0) { ++ TIFFError(fname, "Image dimensions too large"); ++ return -1; ++ } ++ tpic = (byte *) malloc((size_t) stripsize); ++ if (tpic == 0) { ++ TIFFError(fname, "No space for strip buffer"); ++ return -1; ++ } + tp = tpic; + for (i=0, pix=pic; i<h; i++) { + if ((i&15)==0) WaitCursor(); +@@ -167,7 +193,7 @@ + *tp++ = (byte) (k & 0xff); + } + } +- TIFFWriteEncodedStrip(tif, 0, tpic, TIFFStripSize(tif)); ++ TIFFWriteEncodedStrip(tif, 0, tpic, stripsize); + free(tpic); + } + } +@@ -209,16 +235,16 @@ + { + int y; + +- tiffW = CreateWindow("xv tiff", "XVtiff", NULL, ++ tiffW = CreateWindow("xv tiff", "XVtiff", NULL, + TWIDE, THIGH, infofg, infobg, 0); + if (!tiffW) FatalError("can't create tiff window!"); + + XSelectInput(theDisp, tiffW, ExposureMask | ButtonPressMask | KeyPressMask); + +- BTCreate(&tbut[T_BOK], tiffW, TWIDE-140-1, THIGH-10-BUTTH-1, 60, BUTTH, ++ BTCreate(&tbut[T_BOK], tiffW, TWIDE-140-1, THIGH-10-BUTTH-1, 60, BUTTH, + "Ok", infofg, infobg, hicol, locol); + +- BTCreate(&tbut[T_BCANC], tiffW, TWIDE-70-1, THIGH-10-BUTTH-1, 60, BUTTH, ++ BTCreate(&tbut[T_BCANC], tiffW, TWIDE-70-1, THIGH-10-BUTTH-1, 60, BUTTH, + "Cancel", infofg, infobg, hicol, locol); + + y = 55; +@@ -237,7 +263,7 @@ + + XMapSubwindows(theDisp, tiffW); + } +- ++ + + /***************************************************/ + void TIFFDialog(vis) +@@ -288,9 +314,9 @@ + + else if (xev->type == KeyPress) { + XKeyEvent *e = (XKeyEvent *) xev; +- char buf[128]; KeySym ks; XComposeStatus status; ++ char buf[128]; KeySym ks; XComposeStatus status; + int stlen; +- ++ + stlen = XLookupString(e,buf,128,&ks,&status); + buf[stlen] = '\0'; + +@@ -381,7 +407,7 @@ + /* check BUTTs */ + + /* check the RBUTTS first, since they don't DO anything */ +- if ( (i=RBClick(compRB, x,y)) >= 0) { ++ if ( (i=RBClick(compRB, x,y)) >= 0) { + (void) RBTrack(compRB, i); + return; + } +@@ -417,7 +443,7 @@ + } + } + break; +- ++ + case T_BCANC: TIFFDialog(0); break; + + default: break; +diff -ruN xv-3.10a/xvxbm.c xv-3.10a-bugfixes/xvxbm.c +--- xv-3.10a/xvxbm.c 1994-12-22 14:34:41.000000000 -0800 ++++ xv-3.10a-bugfixes/xvxbm.c 2005-03-28 22:06:50.000000000 -0800 +@@ -25,7 +25,7 @@ + * move forward to next occurence of '0x' + * repeat + */ +- ++ + + static int xbmError PARM((char *, char *)); + +@@ -59,7 +59,7 @@ + + /* read width: skip lines until we hit a #define */ + while (1) { +- if (!fgets(line,256,fp)) ++ if (!fgets(line,256,fp)) + return(xbmError(bname, "EOF reached in header info.")); + + if (strncmp(line,"#define", (size_t) 7)==0 && +@@ -70,9 +70,9 @@ + + /* read height: skip lines until we hit another #define */ + while (1) { +- if (!fgets(line,256,fp)) ++ if (!fgets(line,256,fp)) + return(xbmError(bname, "EOF reached in header info.")); +- ++ + if (strncmp(line,"#define", (size_t) 7)==0 && + sscanf(line,"#define %s %d", name, &h)==2 && + xv_strstr(name, "_height") != NULL) break; +@@ -84,18 +84,18 @@ + c = getc(fp); c1 = getc(fp); + while (c1!=EOF && !(c=='0' && c1=='x') ) { c = c1; c1 = getc(fp); } + +- if (c1==EOF) ++ if (c1==EOF) + return(xbmError(bname, "No bitmap data found")); + +- if (w<1 || h<1 || w>10000 || h>10000) ++ if (w<1 || h<1 || w>10000 || h>10000) + return(xbmError(bname, "not an XBM file")); +- +- pic8 = (byte *) calloc((size_t) w*h, (size_t) 1); ++ ++ pic8 = (byte *) calloc((size_t) w*h, (size_t) 1); /* safe (10^8 max) */ + if (!pic8) return(xbmError(bname, "couldn't malloc 'pic8'")); + + /* load up the pinfo structure */ + pinfo->pic = pic8; +- pinfo->w = w; ++ pinfo->w = w; + pinfo->h = h; + pinfo->normw = pinfo->w; pinfo->normh = pinfo->h; + pinfo->type = PIC8; +@@ -125,13 +125,13 @@ + if (!bit) { + /* get next byte from file. we're already positioned at it */ + c = getc(fp); c1 = getc(fp); +- if (c<0 || c1<0) { +- /* EOF: break out of loop */ ++ if (c<0 || c1<0) { ++ /* EOF: break out of loop */ + c=c1='0'; i=h; j=w; + xbmError(bname, "The file would appear to be truncated."); + } + +- if (hex[c1] == 255) { ++ if (hex[c1] == 255) { + if (hex[c] == 255) k = 0; /* no digits after the '0x' ... */ + else k = hex[c]; + } +@@ -149,7 +149,7 @@ + fclose(fp); + + return 1; +-} ++} + + + +@@ -172,7 +172,7 @@ + { + /* pic is expected to be an array of w*h bytes, each of which is either + '0' or '1'. +- The 'darker' of {rmap,gmap,bmap}[0] and {rmap,gmap,bmap}[1] is ++ The 'darker' of {rmap,gmap,bmap}[0] and {rmap,gmap,bmap}[1] is + considered black, and the other one, white. + Some sort of stippling algorithm should've + been called already to produce pic, otherwise the output won't be at all +@@ -188,7 +188,7 @@ + foo = (char *) index(name,'.'); + if (foo) *foo='\0'; /* truncated name at first '.' */ + +- fprintf(fp,"#define %s_width %d\n",name,w); ++ fprintf(fp,"#define %s_width %d\n",name,w); + fprintf(fp,"#define %s_height %d\n",name,h); + fprintf(fp,"static char %s_bits[] = {\n",name); + +diff -ruN xv-3.10a/xvxpm.c xv-3.10a-bugfixes/xvxpm.c +--- xv-3.10a/xvxpm.c 1994-12-22 14:34:42.000000000 -0800 ++++ xv-3.10a-bugfixes/xvxpm.c 2005-03-28 22:22:50.000000000 -0800 +@@ -10,7 +10,7 @@ + * format images. + * + * Thanks go to Sam Yates (syates@spam.maths.adelaide.edu.au) for +- * provideing inspiration. ++ * providing inspiration. + */ + + #define VALUES_LEN 80 /* Max length of values line */ +@@ -63,7 +63,7 @@ + PICINFO *pinfo; + { + /* returns '1' on success */ +- ++ + FILE *fp; + hentry item; + int c; +@@ -73,100 +73,110 @@ + byte *i_sptr; /* image search pointer */ + long filesize; + int w, h, nc, cpp, line_pos; ++ int npixels; + short i, j, k; /* for() loop indexes */ + hentry *clmp; /* colormap hash-table */ + hentry *c_sptr; /* cmap hash-table search pointer*/ + XColor col; +- ++ + bname = BaseName(fname); + fp = fopen(fname, "r"); + if (!fp) + return (XpmLoadError(bname, "couldn't open file")); +- ++ + if (DEBUG) + printf("LoadXPM(): Loading xpm from %s\n", fname); +- ++ + fseek(fp, 0L, 2); + filesize = ftell(fp); + fseek(fp, 0L, 0); +- ++ + bufchar = -2; + in_quote = FALSE; +- ++ + /* Read in the values line. It is the first string in the + * xpm, and contains four numbers. w, h, num_colors, and + * chars_per_pixel. */ +- ++ + /* First, get to the first string */ + while (((c = XpmGetc(fp))!=EOF) && (c != '"')) ; + line_pos = 0; +- ++ + /* Now, read in the string */ + while (((c = XpmGetc(fp))!=EOF) && (line_pos < VALUES_LEN) && (c != '"')) { + values[line_pos++] = c; + } + if (c != '"') + return (XpmLoadError(bname, "error parsing values line")); +- ++ + values[line_pos] = '\0'; + sscanf(values, "%d%d%d%d", &w, &h, &nc, &cpp); + if (nc <= 0 || cpp <= 0) + return (XpmLoadError(bname, "No colours in Xpm?")); +- ++ ++ npixels = w * h; ++ if (w <= 0 || h <= 0 || npixels/w != h) ++ return (XpmLoadError(bname, "Image dimensions out of range")); ++ + if (nc > 256) + pinfo->type = PIC24; + else + pinfo->type = PIC8; +- ++ + if (DEBUG) + printf("LoadXPM(): reading a %dx%d image (%d colors)\n", w, h, nc); +- ++ + /* We got this far... */ + WaitCursor(); +- ++ + if (!hash_init(nc)) + return (XpmLoadError(bname, "Not enough memory to hash colormap")); +- ++ + clmp = (hentry *) malloc(nc * sizeof(hentry)); /* Holds the colormap */ +- if (pinfo->type == PIC8) pic = (byte *) malloc((size_t) (w*h)); +- else pic = (byte *) malloc((size_t) (w*h*3)); +- ++ if (pinfo->type == PIC8) ++ pic = (byte *) malloc((size_t) npixels); ++ else { ++ int bufsize = 3*npixels; ++ if (bufsize/3 != npixels) ++ return (XpmLoadError(bname, "Image dimensions out of range")); ++ pic = (byte *) malloc((size_t) bufsize); ++ } ++ + if (!clmp || !pic) + return (XpmLoadError(bname, "Not enough memory to load pixmap")); +- ++ + c_sptr = clmp; + i_sptr = pic; +- ++ + /* initialize the 'hex' array for zippy ASCII-hex -> int conversion */ +- ++ + for (i = 0 ; i < 256 ; i++) hex[i] = 0; + for (i = '0'; i <= '9' ; i++) hex[i] = i - '0'; + for (i = 'a'; i <= 'f' ; i++) hex[i] = i - 'a' + 10; + for (i = 'A'; i <= 'F' ; i++) hex[i] = i - 'A' + 10; +- ++ + /* Again, we've made progress. */ + WaitCursor(); +- ++ + /* Now, we need to read the colormap. */ + pinfo->colType = F_BWDITHER; + for (i = 0 ; i < nc ; i++) { + while (((c = XpmGetc(fp))!=EOF) && (c != '"')) ; + if (c != '"') + return (XpmLoadError(bname, "Error reading colormap")); +- ++ + for (j = 0 ; j < cpp ; j++) + c_sptr->token[j] = XpmGetc(fp); + c_sptr->token[j] = '\0'; +- ++ + while (((c = XpmGetc(fp))!=EOF) && ((c == ' ') || (c == '\t'))) ; + if (c == EOF) /* The failure condition of getc() */ + return (XpmLoadError(bname, "Error parsing colormap line")); +- ++ + do { + char key[3]; + char color[40]; /* Need to figure a good size for this... */ +- short hd; /* Hex digits per R, G, or B */ +- ++ + for (j=0; j<2 && (c != ' ') && (c != '\t') && (c != EOF); j++) { + key[j] = c; + c = XpmGetc(fp); +@@ -185,14 +195,14 @@ + + while ((c == ' ') || (c == '\t')) + c = XpmGetc(fp); +- ++ + if (DEBUG > 1) + printf("LoadXPM(): Got color key '%s', color '%s'\n", + key, color); +- ++ + if (key[0] == 's') /* Don't find a color for a symbolic name */ + continue; +- ++ + if (XParseColor(theDisp,theCmap,color,&col)) { + if (pinfo->type == PIC8) { + pinfo->r[i] = col.red >> 8; +@@ -201,8 +211,8 @@ + c_sptr->cv_index = i; + + /* Is there a better way to do this? */ +- if (pinfo->colType != F_FULLCOLOR) +- if (pinfo->colType == F_GREYSCALE) ++ if (pinfo->colType != F_FULLCOLOR) { ++ if (pinfo->colType == F_GREYSCALE) { + if (pinfo->r[i] == pinfo->g[i] && + pinfo->g[i] == pinfo->b[i]) + /* Still greyscale... */ +@@ -210,9 +220,9 @@ + else + /* It's color */ + pinfo->colType = F_FULLCOLOR; +- else ++ } else { + if (pinfo->r[i] == pinfo->g[i] && +- pinfo->g[i] == pinfo->b[i]) ++ pinfo->g[i] == pinfo->b[i]) { + if ((pinfo->r[i] == 0 || pinfo->r[i] == 0xff) && + (pinfo->g[i] == 0 || pinfo->g[i] == 0xff) && + (pinfo->b[i] == 0 || pinfo->b[i] == 0xff)) +@@ -221,10 +231,12 @@ + else + /* It's greyscale */ + pinfo->colType = F_GREYSCALE; +- else ++ } else + /* It's color */ + pinfo->colType = F_FULLCOLOR; +- ++ } ++ } ++ + } + else { /* PIC24 */ + c_sptr->cv_rgb[0] = col.red >> 8; +@@ -242,7 +254,7 @@ + Timer(1000); + rgb = 0x808080; + } +- ++ + if (pinfo->type == PIC8) { + pinfo->r[i] = (rgb>>16) & 0xff; + pinfo->g[i] = (rgb>> 8) & 0xff; +@@ -256,39 +268,39 @@ + } + } + +- ++ + xvbcopy((char *) c_sptr, (char *) &item, sizeof(item)); + hash_insert(&item); +- +- if (DEBUG > 1) ++ ++ if (DEBUG > 1) + printf("LoadXPM(): Cmap entry %d, 0x%02x 0x%02x 0x%02x, token '%s'\n", + i, pinfo->r[i], pinfo->g[i], pinfo->b[i], c_sptr->token); +- ++ + if (*key == 'c') { /* This is the color entry, keep it. */ + while (c!='"' && c!=EOF) c = XpmGetc(fp); + break; + } +- ++ + } while (c != '"'); + c_sptr++; + + if (!(i%13)) WaitCursor(); + } /* for */ +- ++ + + if (DEBUG) + printf("LoadXPM(): Read and stored colormap.\n"); +- ++ + /* Now, read the pixmap. */ + for (i = 0 ; i < h ; i++) { + while (((c = XpmGetc(fp))!=EOF) && (c != '"')) ; + if (c != '"') + return (XpmLoadError(bname, "Error reading colormap")); +- ++ + for (j = 0 ; j < w ; j++) { + char pixel[TOKEN_LEN]; + hentry *mapentry; +- ++ + for (k = 0 ; k < cpp ; k++) + pixel[k] = XpmGetc(fp); + pixel[k] = '\0'; +@@ -300,7 +312,7 @@ + pixel); + return (XpmLoadError(bname, "Can't map resolve into colormap")); + } +- ++ + if (pinfo->type == PIC8) + *i_sptr++ = mapentry->cv_index; + else { +@@ -310,27 +322,27 @@ + } + } /* for ( j < w ) */ + (void)XpmGetc(fp); /* Throw away the close " */ +- ++ + if (!(i%7)) WaitCursor(); + } /* for ( i < h ) */ +- ++ + pinfo->pic = pic; + pinfo->normw = pinfo->w = w; + pinfo->normh = pinfo->h = h; + pinfo->frmType = F_XPM; + + if (DEBUG) printf("LoadXPM(): pinfo->colType is %d\n", pinfo->colType); +- ++ + sprintf(pinfo->fullInfo, "Xpm v3 Pixmap (%ld bytes)", filesize); + sprintf(pinfo->shrtInfo, "%dx%d Xpm.", w, h); + pinfo->comment = (char *)NULL; +- ++ + hash_destroy(); + free(clmp); +- ++ + if (fp != stdin) + fclose(fp); +- ++ + return(1); + } + +@@ -349,17 +361,17 @@ + FILE *f; + { + int c, d, lastc; +- ++ + if (bufchar != -2) { + /* The last invocation of this routine read the character... */ + c = bufchar; + bufchar = -2; + return(c); + } +- ++ + if ((c = getc(f)) == EOF) + return(EOF); +- ++ + if (c == '"') + in_quote = !in_quote; + else if (!in_quote && c == '/') { /* might be a C-style comment */ +@@ -389,14 +401,14 @@ + + + /***************************************/ +-static int hash(token) ++static int hash(token) + char *token; + { + int i, sum; + + for (i=sum=0; token[i] != '\0'; i++) + sum += token[i]; +- ++ + sum = sum % hash_len; + return (sum); + } +@@ -414,7 +426,7 @@ + */ + + int i; +- ++ + hash_len = 257; + + hashtab = (hentry **) malloc(sizeof(hentry *) * hash_len); +@@ -425,7 +437,7 @@ + + for (i = 0 ; i < hash_len ; i++) + hashtab[i] = NULL; +- ++ + return 1; + } + +@@ -436,22 +448,22 @@ + { + int key; + hentry *tmp; +- ++ + key = hash(entry->token); +- ++ + tmp = (hentry *) malloc(sizeof(hentry)); + if (!tmp) { + SetISTR(ISTR_WARNING, "Couldn't malloc hash entry in LoadXPM()!\n"); + return 0; + } +- ++ + xvbcopy((char *)entry, (char *)tmp, sizeof(hentry)); +- ++ + if (hashtab[key]) tmp->next = hashtab[key]; + else tmp->next = NULL; +- ++ + hashtab[key] = tmp; +- ++ + return 1; + } + +@@ -462,9 +474,9 @@ + { + int key; + hentry *tmp; +- ++ + key = hash(token); +- ++ + tmp = hashtab[key]; + while (tmp && strcmp(token, tmp->token)) { + tmp = tmp->next; +@@ -479,7 +491,7 @@ + { + int i; + hentry *tmp; +- ++ + for (i=0; i<hash_len; i++) { + while (hashtab[i]) { + tmp = hashtab[i]->next; +@@ -487,7 +499,7 @@ + hashtab[i] = tmp; + } + } +- ++ + free(hashtab); + return; + } +@@ -508,10 +520,10 @@ + /* Note here, that tokenchars is assumed to contain 64 valid token */ + /* characters. It's hardcoded to assume this for benefit of generating */ + /* tokens, when there are more than 64^2 colors. */ +- ++ + short i, imax, j; /* for() loop indices */ + short cpp = 0; +- char *tokenchars = ++ char *tokenchars = + ".#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + char *tokens; + char image_name[256], *foo; +@@ -523,20 +535,21 @@ + long li; /* for() loop index */ + int numcol; + #endif +- +- if (DEBUG) ++ ++ if (DEBUG) { + if (ptype == PIC8) + printf("WriteXPM(): Write a %d color, colortype %d, PIC8 image.\n", + nc, col); + else + printf("WriteXPM(): Write a colortype %d, PIC24 image.\n", col); +- ++ } ++ + foo = BaseName(name); + strcpy(image_name, foo); + foo = (char *)strchr(image_name, '.'); + if (foo) + *foo = '\0'; /* Truncate name at first '.' */ +- ++ + #ifdef USE_UNFINISHED_24BIT_WRITING_CODE + if (ptype == PIC24) + return -1; +@@ -547,15 +560,15 @@ + /* 'packed'. Code in here to do that should be removed if */ + /* Conv24to8 is "fixed" to do this... */ + /* Chris P. Ross (cross@eng.umd.edu) 28-Sept-94 */ +- ++ + numcol = 0; +- ++ + if (ptype == PIC24) { + /* Reduce to an 8-bit image. Would be nice to actually write */ + /* the 24-bit image. I'll have to code that someday... */ + pic8 = Conv24to8(pic, w, h, 256, rtemp, gtemp, btemp); + if (!pic8) { +- SetISTR(ISTR_WARNING, ++ SetISTR(ISTR_WARNING, + "%s: Unable to convert to 8-bit image in WriteXPM()", + image_name); + return 1; +@@ -594,7 +607,7 @@ + } + #endif + +- ++ + #ifdef USE_UNFINISHED_24BIT_WRITING_CODE + if (ptype == PIC24) cpp = 4; + else if (numcol > 64) cpp = 2; +@@ -609,7 +622,7 @@ + fprintf(fp, "/* width height num_colors chars_per_pixel */\n"); + fprintf(fp, "\" %3d %3d %6d %1d\",\n", w, h, numcol, cpp); + fprintf(fp, "/* colors */\n"); +- ++ + switch (cpp) { + + case 1: /* <= 64 colors; index into tokenchars */ +@@ -681,12 +694,12 @@ + + case 4: + /* Generate a colormap */ +- ++ + break; + default: + break; + } +- ++ + if (fprintf(fp, "\"\n};\n") == EOF) { + return 1; + } else +diff -ruN xv-3.10a/xvxwd.c xv-3.10a-bugfixes/xvxwd.c +--- xv-3.10a/xvxwd.c 1994-12-22 14:34:40.000000000 -0800 ++++ xv-3.10a-bugfixes/xvxwd.c 2005-03-28 22:37:07.000000000 -0800 +@@ -1,10 +1,10 @@ +-/* ++/* + ** Based on xwdtopnm.c - read and write an X11 or X10 window dump file + ** + ** Modified heavily by Markus Baur (mbaur@ira.uka.de) for use as a part + ** of xv-2.21, 12/30/92 + ** +- ** Hacked up again to support xv-3.00 and XWDs from 64bit machines ++ ** Hacked up again to support xv-3.00 and XWDs from 64bit machines + ** (e.g. DEC Alphas), 04/10/94 + ** + ** Copyright (C) 1989, 1991 by Jef Poskanzer. +@@ -19,47 +19,53 @@ + */ + + #include "xv.h" ++#include <limits.h> /* for CHAR_BIT */ ++ ++/* SJT: just in case ... */ ++#ifndef CHAR_BIT ++# define CHAR_BIT 8 ++#endif + + + /***************************** x11wd.h *****************************/ + #define X11WD_FILE_VERSION 7 + typedef struct { +- CARD32 header_size; /* Size of the entire file header (bytes). */ +- CARD32 file_version; /* X11WD_FILE_VERSION */ +- CARD32 pixmap_format; /* Pixmap format */ +- CARD32 pixmap_depth; /* Pixmap depth */ +- CARD32 pixmap_width; /* Pixmap width */ +- CARD32 pixmap_height; /* Pixmap height */ +- CARD32 xoffset; /* Bitmap x offset */ +- CARD32 byte_order; /* MSBFirst, LSBFirst */ +- CARD32 bitmap_unit; /* Bitmap unit */ +- CARD32 bitmap_bit_order; /* MSBFirst, LSBFirst */ +- CARD32 bitmap_pad; /* Bitmap scanline pad */ +- CARD32 bits_per_pixel; /* Bits per pixel */ +- CARD32 bytes_per_line; /* Bytes per scanline */ +- CARD32 visual_class; /* Class of colormap */ +- CARD32 red_mask; /* Z red mask */ +- CARD32 green_mask; /* Z green mask */ +- CARD32 blue_mask; /* Z blue mask */ +- CARD32 bits_per_rgb; /* Log base 2 of distinct color values */ +- CARD32 colormap_entries; /* Number of entries in colormap */ +- CARD32 ncolors; /* Number of Color structures */ +- CARD32 window_width; /* Window width */ +- CARD32 window_height; /* Window height */ +- CARD32 window_x; /* Window upper left X coordinate */ +- CARD32 window_y; /* Window upper left Y coordinate */ +- CARD32 window_bdrwidth; /* Window border width */ ++ CARD32 header_size; /* Size of the entire file header (bytes). */ ++ CARD32 file_version; /* X11WD_FILE_VERSION */ ++ CARD32 pixmap_format; /* Pixmap format */ ++ CARD32 pixmap_depth; /* Pixmap depth */ ++ CARD32 pixmap_width; /* Pixmap width */ ++ CARD32 pixmap_height; /* Pixmap height */ ++ CARD32 xoffset; /* Bitmap x offset */ ++ CARD32 byte_order; /* MSBFirst, LSBFirst */ ++ CARD32 bitmap_unit; /* Bitmap unit */ ++ CARD32 bitmap_bit_order; /* MSBFirst, LSBFirst */ ++ CARD32 bitmap_pad; /* Bitmap scanline pad */ ++ CARD32 bits_per_pixel; /* Bits per pixel */ ++ CARD32 bytes_per_line; /* Bytes per scanline */ ++ CARD32 visual_class; /* Class of colormap */ ++ CARD32 red_mask; /* Z red mask */ ++ CARD32 grn_mask; /* Z green mask */ ++ CARD32 blu_mask; /* Z blue mask */ ++ CARD32 bits_per_rgb; /* Log base 2 of distinct color values */ ++ CARD32 colormap_entries; /* Number of entries in colormap */ ++ CARD32 ncolors; /* Number of Color structures */ ++ CARD32 window_width; /* Window width */ ++ CARD32 window_height; /* Window height */ ++ CARD32 window_x; /* Window upper left X coordinate */ ++ CARD32 window_y; /* Window upper left Y coordinate */ ++ CARD32 window_bdrwidth; /* Window border width */ + #ifdef WORD64 +- CARD32 header_pad; ++ CARD32 header_pad; + #endif +- } X11WDFileHeader; ++} X11WDFileHeader; + + typedef struct { + CARD32 num; + CARD16 red, green, blue; +- CARD8 flags; /* do_red, do_green, do_blue */ ++ CARD8 flags; /* do_red, do_green, do_blue */ + CARD8 pad; +- } X11XColor; ++} X11XColor; + + + /*-------------------------------------------------------------------------*/ +@@ -67,7 +73,7 @@ + typedef byte pixel; + + /* local functions */ +-static int getinit PARM((FILE *, int*, int*, int*, CARD32 *, ++static int getinit PARM((FILE *, int*, int*, int*, CARD32 *, + CARD32, PICINFO *)); + static CARD32 getpixnum PARM((FILE *)); + static int xwdError PARM((char *)); +@@ -78,19 +84,27 @@ + static int readbiglong PARM((FILE *, CARD32 *)); + static int readlittleshort PARM((FILE *, CARD16 *)); + static int readlittlelong PARM((FILE *, CARD32 *)); ++#if 0 /* NOTUSED */ + static int writebigshort PARM((FILE *, int)); + static int writebiglong PARM((FILE *, CARD32)); ++#endif ++ ++static void getcolorshift PARM((CARD32, int *, int *)); /* SJT */ + ++/* SJT: for 16bpp and 24bpp shifts */ ++static int red_shift_right, red_justify_left, ++ grn_shift_right, grn_justify_left, ++ blu_shift_right, blu_justify_left; + static byte *pic8, *pic24; +-static CARD32 red_mask, green_mask, blue_mask; +-static int bits_per_item, bits_used, bit_shift, bits_per_pixel; ++static CARD32 red_mask, grn_mask, blu_mask; ++static int bits_per_item, bits_used, bit_shift, ++ bits_per_pixel, bits_per_rgb; + static char buf[4]; + static char *byteP; + static CARD16 *shortP; + static CARD32 *longP; + static CARD32 pixel_mask; + static int byte_swap, byte_order, bit_order, filesize; +-static byte bw[2] = {0, 0xff}; + + static char *bname; + +@@ -105,7 +119,7 @@ + + pixel *xP; + int col; +- int rows, cols, padright, row; ++ int rows, cols, padright, row, npixels, bufsize; + CARD32 maxval, visualclass; + FILE *ifp; + +@@ -116,22 +130,28 @@ + + ifp = xv_fopen(fname, "r"); + if (!ifp) return (xwdError("can't open file")); +- ++ + /* figure out the file size (used to check colormap size) */ + fseek(ifp, 0L, 2); + filesize = ftell(ifp); + fseek(ifp, 0L, 0); +- ++ + + if (getinit(ifp, &cols, &rows, &padright, &visualclass, maxval, pinfo)) + return 0; + ++ npixels = cols * rows; ++ if (cols <= 0 || rows <= 0 || npixels/cols != rows) { ++ xwdError("Image dimensions out of range"); ++ return 0; ++ } ++ + + switch (visualclass) { + case StaticGray: + case GrayScale: + pinfo->colType = F_GREYSCALE; +- pic8 = (byte *) calloc((size_t) cols*rows, (size_t) 1); ++ pic8 = (byte *) calloc((size_t) npixels, (size_t) 1); + if (!pic8) { + xwdError("couldn't malloc 'pic'"); + return 0; +@@ -140,18 +160,18 @@ + for (row=0; row<rows; row++) { + for (col=0, xP=pic8+(row*cols); col<cols; col++, xP++) + *xP = getpixnum(ifp); +- ++ + for (col=0; col<padright; col++) getpixnum(ifp); + } + + pinfo->type = PIC8; + pinfo->pic = pic8; +- break; ++ break; + + case StaticColor: + case PseudoColor: + pinfo->colType = F_FULLCOLOR; +- pic8 = (byte *) calloc((size_t) cols*rows, (size_t) 1); ++ pic8 = (byte *) calloc((size_t) npixels, (size_t) 1); + if (!pic8) { + xwdError("couldn't malloc 'pic'"); + return 0; +@@ -162,15 +182,20 @@ + *xP = getpixnum(ifp); + for (col=0; col<padright; col++) getpixnum(ifp); + } +- ++ + pinfo->type = PIC8; + pinfo->pic = pic8; +- break; ++ break; + + case TrueColor: + case DirectColor: + pinfo->colType = F_FULLCOLOR; +- pic24 = (byte *) calloc((size_t) cols*rows*3, (size_t) 1); ++ bufsize = 3*npixels; ++ if (bufsize/3 != npixels) { ++ xwdError("Image dimensions out of range"); ++ return 0; ++ } ++ pic24 = (byte *) calloc((size_t) bufsize, (size_t) 1); + if (!pic24) { + xwdError("couldn't malloc 'pic24'"); + return 0; +@@ -179,42 +204,44 @@ + for (row=0; row<rows; row++) { + for (col=0, xP=pic24+(row*cols*3); col<cols; col++) { + CARD32 ul; +- ++ + ul = getpixnum(ifp); + switch (bits_per_pixel) { +- case 16: +- *xP++ = ((ul & red_mask) >> 0); +- *xP++ = ((ul & green_mask) >> 5); +- *xP++ = ((ul & blue_mask) >> 10); +- break; +- +- case 24: +- case 32: +- *xP++ = (ul ) & 0xff; +- *xP++ = (ul>> 8) & 0xff; +- *xP++ = (ul>>16) & 0xff; +- break; +- ++ case 16: ++ case 24: ++ case 32: ++ /* SJT: shift all the way to the right and then shift left. The ++ pairs of shifts could be combined. There will be two right and ++ one left shift, but it's unknown which will be which. It seems ++ easier to do the shifts (which might be 0) separately than to ++ have a complex set of tests. I believe this is independent of ++ byte order but I have no way to test. ++ */ ++ *xP++ = ((ul & red_mask) >> red_shift_right) << red_justify_left; ++ *xP++ = ((ul & grn_mask) >> grn_shift_right) << grn_justify_left; ++ *xP++ = ((ul & blu_mask) >> blu_shift_right) << blu_justify_left; ++ break; ++ + default: +- xwdError("True/Direct only supports 16, 24, and 32 bits"); ++ xwdError("True/Direct supports only 16, 24, and 32 bits"); + return 0; + } + } + + for (col=0; col<padright; col++) getpixnum(ifp); + } +- ++ + pinfo->type = PIC24; + pinfo->pic = pic24; + break; +- ++ + default: + xwdError("unknown visual class"); + return 0; + } + + sprintf(pinfo->fullInfo, "XWD, %d-bit %s. (%d bytes)", +- bits_per_pixel, ++ bits_per_pixel, + ((visualclass == StaticGray ) ? "StaticGray" : + (visualclass == GrayScale ) ? "GrayScale" : + (visualclass == StaticColor) ? "StaticColor" : +@@ -258,10 +285,10 @@ + maxv = 255L; + + h11P = (X11WDFileHeader*) header; +- ++ + if (fread(&header[0], sizeof(*h11P), (size_t) 1, file) != 1) + return(xwdError("couldn't read X11 XWD file header")); +- ++ + if (h11P->file_version != X11WD_FILE_VERSION) { + byte_swap = 1; + h11P->header_size = bs_long(h11P->header_size); +@@ -279,8 +306,8 @@ + h11P->bytes_per_line = bs_long(h11P->bytes_per_line); + h11P->visual_class = bs_long(h11P->visual_class); + h11P->red_mask = bs_long(h11P->red_mask); +- h11P->green_mask = bs_long(h11P->green_mask); +- h11P->blue_mask = bs_long(h11P->blue_mask); ++ h11P->grn_mask = bs_long(h11P->grn_mask); ++ h11P->blu_mask = bs_long(h11P->blu_mask); + h11P->bits_per_rgb = bs_long(h11P->bits_per_rgb); + h11P->colormap_entries = bs_long(h11P->colormap_entries); + h11P->ncolors = bs_long(h11P->ncolors); +@@ -294,7 +321,7 @@ + for (i=0; i<h11P->header_size - sizeof(*h11P); i++) + if (getc(file) == EOF) + return(xwdError("couldn't read rest of X11 XWD file header")); +- ++ + /* Check whether we can handle this dump. */ + if (h11P->pixmap_depth > 24) + return(xwdError("can't handle X11 pixmap_depth > 24")); +@@ -303,27 +330,31 @@ + return(xwdError("can't handle X11 bits_per_rgb > 24")); + + if (h11P->pixmap_format != ZPixmap && h11P->pixmap_depth != 1) { +- sprintf(errstr, "can't handle X11 pixmap_format %d with depth != 1", ++ sprintf(errstr, "can't handle X11 pixmap_format %ld with depth != 1", + h11P->pixmap_format); + return(xwdError(errstr)); + } + + if (h11P->bitmap_unit != 8 && h11P->bitmap_unit != 16 && + h11P->bitmap_unit != 32) { +- sprintf(errstr, "X11 bitmap_unit (%d) is non-standard - can't handle", ++ sprintf(errstr, "X11 bitmap_unit (%ld) is non-standard - can't handle", + h11P->bitmap_unit); + return(xwdError(errstr)); + } +- ++ + grayscale = 1; + if (h11P->ncolors > 0) { /* Read X11 colormap. */ +- x11colors = (X11XColor*) malloc(h11P->ncolors * sizeof(X11XColor)); ++ int bufsize = h11P->ncolors * sizeof(X11XColor); ++ ++ if (bufsize/sizeof(X11XColor) != h11P->ncolors) ++ return(xwdError("too many colors")); ++ x11colors = (X11XColor*) malloc(bufsize); + if (!x11colors) return(xwdError("out of memory")); +- +- if (h11P->header_size + h11P->ncolors * sizeof(X11XColor) ++ ++ if (h11P->header_size + bufsize + + h11P->pixmap_height * h11P->bytes_per_line + h11P->ncolors * 4 + == filesize ) word64 = 1; +- ++ + if (word64) { + for (i = 0; i < h11P->ncolors; ++i) { + if (fread(&pad, sizeof(pad), (size_t) 1, file ) != 1) +@@ -334,11 +365,11 @@ + } + } + else { +- if (fread(x11colors, sizeof(X11XColor), (size_t) h11P->ncolors, file) ++ if (fread(x11colors, sizeof(X11XColor), (size_t) h11P->ncolors, file) + != h11P->ncolors) + return(xwdError("couldn't read X11 XWD colormap")); + } +- ++ + for (i = 0; i < h11P->ncolors; ++i) { + if (byte_swap) { + x11colors[i].red = (CARD16) bs_short(x11colors[i].red); +@@ -356,8 +387,11 @@ + grayscale = 0; + } + } +- ++ + *visualclassP = h11P->visual_class; ++ /* SJT: FIXME. If bits_per_pixel == 16 maxv could be either 31 or 63. ++ It doesn't matter, though, because maxv is never used beyond here. ++ */ + if (*visualclassP == TrueColor || *visualclassP == DirectColor) { + if (h11P->bits_per_pixel == 16) maxv = 31; + else maxv = 255; +@@ -389,24 +423,48 @@ + } + } + } +- ++ + *colsP = h11P->pixmap_width; + *rowsP = h11P->pixmap_height; + *padrightP = h11P->bytes_per_line * 8 / h11P->bits_per_pixel - + h11P->pixmap_width; +- ++ + bits_per_item = h11P->bitmap_unit; +- bits_used = bits_per_item; + bits_per_pixel = h11P->bits_per_pixel; + byte_order = h11P->byte_order; + bit_order = h11P->bitmap_bit_order; +- ++ bits_per_rgb = h11P->bits_per_rgb; ++ ++ ++ /* add sanity-code for freako 'exceed' server, where bitmapunit = 8 ++ and bitsperpix = 32 (and depth=24)... */ ++ ++ if (bits_per_item < bits_per_pixel) { ++ bits_per_item = bits_per_pixel; ++ ++ /* round bits_per_item up to next legal value, if necc */ ++ if (bits_per_item < 8) bits_per_item = 8; ++ else if (bits_per_item < 16) bits_per_item = 16; ++ else bits_per_item = 32; ++ } ++ ++ ++ /* which raises the question: how (can?) you ever have a 24 bits per pix, ++ (ie, 3 bytes, no alpha/padding) */ ++ ++ ++ bits_used = bits_per_item; ++ + if (bits_per_pixel == sizeof(pixel_mask) * 8) pixel_mask = (CARD32) -1; + else pixel_mask = (1 << bits_per_pixel) - 1; +- +- red_mask = h11P->red_mask; +- green_mask = h11P->green_mask; +- blue_mask = h11P->blue_mask; ++ ++ red_mask = h11P->red_mask; ++ grn_mask = h11P->grn_mask; ++ blu_mask = h11P->blu_mask; ++ ++ getcolorshift(red_mask, &red_shift_right, &red_justify_left); ++ getcolorshift(grn_mask, &grn_shift_right, &grn_justify_left); ++ getcolorshift(blu_mask, &blu_shift_right, &blu_justify_left); + + byteP = (char *) buf; + shortP = (CARD16 *) buf; +@@ -416,18 +474,57 @@ + } + + ++/* SJT: figure out the proper shifts */ ++static void getcolorshift (CARD32 mask, int *rightshift, int *leftshift) ++{ ++ int lshift, rshift; ++ unsigned int uu; ++ ++ if (mask == 0) ++ { ++ *rightshift = *leftshift = 0; ++ return; ++ } ++ ++ uu = mask; ++ lshift = rshift = 0; ++ while ((uu & 0xf) == 0) ++ { ++ rshift += 4; ++ uu >>= 4; ++ } ++ while ((uu & 1) == 0) ++ { ++ rshift++; ++ uu >>= 1; ++ } ++ ++ while (uu != 0) ++ { ++ if (uu & 1) ++ { ++ lshift++; ++ uu >>= 1; ++ } ++ } ++ *rightshift = rshift; ++ *leftshift = CHAR_BIT * sizeof(pixel) - lshift; ++ return; ++} ++ ++ + /******************************/ + static CARD32 getpixnum(file) + FILE* file; + { + int n; +- ++ + if (bits_used == bits_per_item) { + switch (bits_per_item) { + case 8: + *byteP = getc(file); + break; +- ++ + case 16: + if (byte_order == MSBFirst) { + if (readbigshort(file, shortP) == -1) +@@ -438,7 +535,7 @@ + xwdWarning("unexpected EOF"); + } + break; +- ++ + case 32: + if (byte_order == MSBFirst) { + if (readbiglong(file, longP) == -1) +@@ -449,41 +546,41 @@ + xwdWarning("unexpected EOF"); + } + break; +- ++ + default: + xwdWarning("can't happen"); + } + bits_used = 0; +- ++ + if (bit_order == MSBFirst) + bit_shift = bits_per_item - bits_per_pixel; + else + bit_shift = 0; + } +- ++ + switch (bits_per_item) { + case 8: + n = (*byteP >> bit_shift) & pixel_mask; + break; +- ++ + case 16: + n = (*shortP >> bit_shift) & pixel_mask; + break; +- ++ + case 32: + n = (*longP >> bit_shift) & pixel_mask; + break; +- ++ + default: + n = 0; + xwdWarning("can't happen"); + } +- ++ + if (bit_order == MSBFirst) bit_shift -= bits_per_pixel; + else bit_shift += bits_per_pixel; + + bits_used += bits_per_pixel; +- ++ + return n; + } + +@@ -511,7 +608,7 @@ + + + +-/* ++/* + * Byte-swapping junk. + */ + +@@ -537,7 +634,7 @@ + { + union cheat u; + unsigned char t; +- ++ + u.l = l; + t = u.c[0]; u.c[0] = u.c[3]; u.c[3] = t; + t = u.c[1]; u.c[1] = u.c[2]; u.c[2] = t; +@@ -549,7 +646,7 @@ + + + +-/* ++/* + * Endian I/O. + */ + +@@ -584,7 +681,7 @@ + { + *sP = getc(in) & 0xff; + *sP |= (getc(in) & 0xff) << 8; +- ++ + if (ferror(in)) return -1; + return 0; + } +@@ -604,6 +701,7 @@ + } + + ++#if 0 /* NOTUSED */ + static int writebiglong(out, l) + FILE* out; + CARD32 l; +@@ -624,3 +722,4 @@ + putc(s&0xff, out); + return 0; + } ++#endif /* 0 (NOTUSED) */ diff --git a/source/xap/xv/xv-3.10a.patch b/source/xap/xv/xv-3.10a.patch new file mode 100644 index 00000000..0bf8210f --- /dev/null +++ b/source/xap/xv/xv-3.10a.patch @@ -0,0 +1,2745 @@ +Installation Instructions: + +This patch will update XV 3.10 to 3.10a. + +Copy this file into the top-level XV source directory, and apply it using: + patch -p0 <xv-3.10a.patch + +Then do a 'make clean', followed by a 'make' (or 'make install'). + +Note: if you don't have a copy of the 'patch' utility, you can get one + via anonymous ftp on ftp.cis.upenn.edu, in pub/xv. Of course, + once you're there, it may be easier to just pick up the latest copy + of the XV distribution, rather than try to patch your existing copy, + but hey, that's up to you... + + + +diff -c -r ../xv-3.10/CHANGELOG ./CHANGELOG +*** ../xv-3.10/CHANGELOG Thu Dec 22 14:18:39 1994 +--- ./CHANGELOG Mon Jan 23 18:21:55 1995 +*************** +*** 1,12 **** + Revision History + ---------------- + +! Make_xv.com in vms directory wouldn't build xvxpm.c or xvfits.c (and thus, XV!) +! (Rick Dyson (dyson@sunfish.Physics.UIowa.Edu)) + + +! XV 3.10 Public Release 12/21/94 +! ------------------------- + Bug Fix: Greyscale downsampling bug in JPEG code fixed. + (Tom Lane (tgl@sss.pgh.pa.us)) + +--- 1,84 ---- + Revision History + ---------------- + +! XV 3.10a bug-fix release 12/29/94 +! ---------------------------------- +! Bug Fix: Problems loading JPEG files in 8-bit mode on some systems. +! (Rick Richardson (rick@digibd.com)) +! (Chad R. Larson (chad@anasazi.com)) + ++ Bug Fix: Added '-pkludge' command line option and 'popupKludge' boolean ++ resource. If true, selects the 'old-style' pop-up window positioning ++ code. The various popup windows should appear with the Ok button ++ (or whatever) centered around the cursor. If the windows routinely ++ pop up slightly off-center from the cursor, try turning this on. + +! Bug Fix: '3' and 'Q' characters in the Text Annotation character set were +! boogered up... (Sidik Isani (si@acpub.duke.edu)) +! +! Bug Fix: '-iconic' option wasn't working. +! (David Pesetsky (iedsp@agt.gmeds.com)) +! +! Bug Fix: Didn't properly read greyscale RLE files. +! (Robert Cunningham (rkc@xn.ll.mit.edu)) +! +! Bug Fix: 'AutoCrop' on 24-bit images could produce 0x0 images. A problem! +! (Leon Shaner (leon@mtu.edu)) +! +! Bug Fix: GIF reader would blow up if there were multiple comments. +! (Markus Gyger (mgyger@itr.ch)) +! +! Bug Fix: Behavior under virtual window managers may be improved. +! (steveg@pa.dec.com) +! +! Enhancement: Text in 'temperature gauge' (during slow operations) is now +! XOR'd on, so it isn't obscured by the filled area of the gauge. +! (Jerry Whelan (jerryw@bnl.gov)) +! +! Enhancement: man page for vdcomp written +! (James Ralston Crawford (qralston+@pitt.edu)) +! +! Enhancement: PCX code can now read 24-bit PCX files. +! (Dave Cohrs (cohrs@legato.com)) +! +! Portability: Patch for Linux (David Hankins (dhankins@oz.net)) +! +! Portability: Patches for ISC 4.0 Interactive/SunSoft Unix +! (Jack Bailey (jjb@jagware.bcc.com)) +! +! Portability: Compiler noise (from Sun's Professional C compiler) cleaned up. +! (John Fritz (jfritz@bpo-ess.ceco.com)) +! +! Portability: Many nits picked by Pyramid compiler +! (Chad R. Larson (chad@anasazi.com)) +! +! Portability: Some malloc's in xvfits.c needed casting. +! (Bill Silvert (sysop@biome.bio.ns.ca)) +! +! Portability: Further VMS problems solved. +! (Rick Dyson (dyson@sunfish.physics.uiowa.edu)) +! +! Portability: select() on HP-UX 9.x expects (int *) instead of (fd_set *) +! (Richard Allen (ra@os.is)) +! +! Portability: Removed 'const' from second parameter in decl. for decode_run() +! in tif_fax3.c. (Glenn Spargo (gspargo@ctron.com)) +! +! Portability: Added 'fcntl.h' to xv.h, as some systems may not have O_RDONLY +! declared elsewhere. (Mitchell Blank (blankm@cae.wisc.edu)) +! +! Portability: Font selection strings in xv.c didn't have enough '*'s in them. +! Would fail on some X servers. +! (Rick Richardson (rick@digibd.com)) +! +! Second XV 3.10 Public Release 12/22/94 +! ---------------------------------------- +! Bug Fix: Make_xv.com in vms directory wouldn't build xvxpm.c or xvfits.c +! (and thus, XV!) (Rick Dyson (dyson@sunfish.Physics.UIowa.Edu)) +! +! +! Initial XV 3.10 Public Release 12/21/94 +! ---------------------------------------- + Bug Fix: Greyscale downsampling bug in JPEG code fixed. + (Tom Lane (tgl@sss.pgh.pa.us)) + +diff -c -r ../xv-3.10/Imakefile ./Imakefile +*** ../xv-3.10/Imakefile Thu Dec 22 14:12:21 1994 +--- ./Imakefile Fri Jan 13 15:24:01 1995 +*************** +*** 264,269 **** +--- 264,270 ---- + InstallManPageLong(docs/bggen,$(MANDIR),bggen) + InstallManPageLong(docs/xcmap,$(MANDIR),xcmap) + InstallManPageLong(docs/xvp2p,$(MANDIR),xvpictoppm) ++ InstallManPageLong(docs/vdcomp,$(MANDIR),vdcomp) + + tar: + tar cf xv.tar Makefile* Imakefile *.c *.h bits docs \ + +diff -c -r ../xv-3.10/Makefile ./Makefile +*** ../xv-3.10/Makefile Thu Jan 19 13:40:09 1995 +--- ./Makefile Mon Jan 23 15:20:54 1995 +*************** +*** 92,99 **** +--- 92,110 ---- + #MCHN= -Dhpux -D_HPUX_SOURCE + # To use old HP compilers (HPUX 7.0 or so), you may need + #MCHN= -Dhpux -D_HPUX_SOURCE +Ns4000 ++ # ++ # also, if you're using HP's compiler, add '-Aa' to whichever of those ++ # two lines you're using, to turn on ANSI C mode. Or so I'm told. ++ # ++ # note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever) ++ # to whichever of those lines you used, as HP tends to store their X11 ++ # include files in a non-standard place... + + ++ ### for LINUX, uncomment the following line ++ #MCHN = -DLINUX ++ ++ + # For SCO 1.1 (UNIX 3.2v2) machines, uncomment the following: + #MCHN = -Dsco -DPOSIX + # +*************** +*** 111,120 **** + # + #MCHN = -q extensions=pcc_c -D__UMAXV__ -L/usr2/usr/lib/X11 -DSVR4 + +! # For Interactive Unix System machines +! # you'll want to modify add the following options to the end of the +! # LIBS definition (below) (or so I'm told) +! # -lnsl_s -linet -lgen + + + #----------'Roll Your Own' Options---------- +--- 122,129 ---- + # + #MCHN = -q extensions=pcc_c -D__UMAXV__ -L/usr2/usr/lib/X11 -DSVR4 + +! # For Interactive/SunSoft Unix ISC 4.0 (whatever *that* is!) +! #MCHN = -DSVR4 -DBSDTYPES + + + #----------'Roll Your Own' Options---------- +*************** +*** 233,238 **** +--- 242,248 ---- + cp docs/bggen.man $(MANDIR)/bggen.$(MANSUF) + cp docs/xcmap.man $(MANDIR)/xcmap.$(MANSUF) + cp docs/xvp2p.man $(MANDIR)/xvpictoppm.$(MANSUF) ++ cp docs/vdcomp.man $(MANDIR)/vdcomp.$(MANSUF) + cp docs/xvdocs.ps* $(LIBDIR) + + tar: + +diff -c -r ../xv-3.10/Makefile.std ./Makefile.std +*** ../xv-3.10/Makefile.std Thu Dec 22 14:12:21 1994 +--- ./Makefile.std Mon Jan 23 20:06:26 1995 +*************** +*** 92,99 **** +--- 92,110 ---- + #MCHN= -Dhpux -D_HPUX_SOURCE + # To use old HP compilers (HPUX 7.0 or so), you may need + #MCHN= -Dhpux -D_HPUX_SOURCE +Ns4000 ++ # ++ # also, if you're using HP's compiler, add '-Aa' to whichever of those ++ # two lines you're using, to turn on ANSI C mode. Or so I'm told. ++ # ++ # note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever) ++ # to whichever of those lines you used, as HP tends to store their X11 ++ # include files in a non-standard place... + + ++ ### for LINUX, uncomment the following line ++ #MCHN = -DLINUX ++ ++ + # For SCO 1.1 (UNIX 3.2v2) machines, uncomment the following: + #MCHN = -Dsco -DPOSIX + # +*************** +*** 111,120 **** + # + #MCHN = -q extensions=pcc_c -D__UMAXV__ -L/usr2/usr/lib/X11 -DSVR4 + +! # For Interactive Unix System machines +! # you'll want to modify add the following options to the end of the +! # LIBS definition (below) (or so I'm told) +! # -lnsl_s -linet -lgen + + + #----------'Roll Your Own' Options---------- +--- 122,129 ---- + # + #MCHN = -q extensions=pcc_c -D__UMAXV__ -L/usr2/usr/lib/X11 -DSVR4 + +! # For Interactive/SunSoft Unix ISC 4.0 (whatever *that* is!) +! #MCHN = -DSVR4 -DBSDTYPES + + + #----------'Roll Your Own' Options---------- +*************** +*** 233,238 **** +--- 242,248 ---- + cp docs/bggen.man $(MANDIR)/bggen.$(MANSUF) + cp docs/xcmap.man $(MANDIR)/xcmap.$(MANSUF) + cp docs/xvp2p.man $(MANDIR)/xvpictoppm.$(MANSUF) ++ cp docs/vdcomp.man $(MANDIR)/vdcomp.$(MANSUF) + cp docs/xvdocs.ps* $(LIBDIR) + + tar: + +diff -c -r ../xv-3.10/xcmap.c ./xcmap.c +*** ../xv-3.10/xcmap.c Thu Dec 22 14:12:20 1994 +--- ./xcmap.c Tue Jan 03 16:14:52 1995 +*************** +*** 102,108 **** + continue; + } + +! strind = index(argv[i], ':'); /* old-style display */ + if(strind != NULL) { + display = argv[i]; + continue; +--- 102,108 ---- + continue; + } + +! strind = (char *) index(argv[i], ':'); /* old-style display */ + if(strind != NULL) { + display = argv[i]; + continue; + +diff -c -r ../xv-3.10/xv.c ./xv.c +*** ../xv-3.10/xv.c Thu Dec 22 14:12:15 1994 +--- ./xv.c Thu Jan 19 13:08:43 1995 +*************** +*** 25,33 **** + + + /* program needs one of the following fonts. Trys them in ascending order */ +! #define FONT1 "-*-lucida-medium-r-*-*-12-*" +! #define FONT2 "-*-helvetica-medium-r-*-*-12-*" +! #define FONT3 "-*-helvetica-medium-r-*-*-11-*" + #define FONT4 "6x13" + #define FONT5 "fixed" + +--- 25,33 ---- + + + /* program needs one of the following fonts. Trys them in ascending order */ +! #define FONT1 "-*-lucida-medium-r-*-*-12-*-*-*-*-*-*-*" +! #define FONT2 "-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*" +! #define FONT3 "-*-helvetica-medium-r-*-*-11-*-*-*-*-*-*-*" + #define FONT4 "6x13" + #define FONT5 "fixed" + +*************** +*** 218,224 **** + fgstr = "#000000"; bgstr = "#B2C0DC"; + histr = "#C6D5E2"; lostr = "#8B99B5"; + +! cmd = rindex(argv[0],'/'); + if (!cmd) cmd = argv[0]; else cmd++; + + tmpstr = (char *) getenv("TMPDIR"); +--- 218,224 ---- + fgstr = "#000000"; bgstr = "#B2C0DC"; + histr = "#C6D5E2"; lostr = "#8B99B5"; + +! cmd = (char *) rindex(argv[0],'/'); + if (!cmd) cmd = argv[0]; else cmd++; + + tmpstr = (char *) getenv("TMPDIR"); +*************** +*** 261,267 **** + xorMasks[6] = 0xc4c4c4c5; + xorMasks[7] = 0xffffffff; + +! kludge_offx = kludge_offy = 0; + + conv24 = CONV24_SLOW; /* use 'slow' algorithm by default */ + +--- 261,267 ---- + xorMasks[6] = 0xc4c4c4c5; + xorMasks[7] = 0xffffffff; + +! kludge_offx = kludge_offy = winCtrPosKludge = 0; + + conv24 = CONV24_SLOW; /* use 'slow' algorithm by default */ + +*************** +*** 1107,1112 **** +--- 1107,1113 ---- + if (rd_flag("nostat")) nostat = def_int; + if (rd_flag("ownCmap")) owncmap = def_int; + if (rd_flag("perfect")) perfect = def_int; ++ if (rd_flag("popupKludge")) winCtrPosKludge = def_int; + if (rd_str ("print")) strncpy(printCmd, def_str, + (size_t) PRINTCMDLEN); + if (rd_flag("pscompress")) pscomp = def_int; +*************** +*** 1361,1366 **** +--- 1362,1368 ---- + else if (!argcmp(argv[i],"-nostat", 4,1,&nostat)); /* nostat */ + else if (!argcmp(argv[i],"-owncmap", 2,1,&owncmap)); /* own cmap */ + else if (!argcmp(argv[i],"-perfect", 3,1,&perfect)); /* -perfect */ ++ else if (!argcmp(argv[i],"-pkludge", 3,1,&winCtrPosKludge)); + else if (!argcmp(argv[i],"-poll", 3,1,&polling)); /* chk mod? */ + + else if (!argcmp(argv[i],"-preset",3,0,&pm)) /* preset */ +*************** +*** 1615,1620 **** +--- 1617,1623 ---- + printoption("[-/+nostat]"); + printoption("[-/+owncmap]"); + printoption("[-/+perfect]"); ++ printoption("[-/+pkludge]"); + printoption("[-/+poll]"); + printoption("[-preset #]"); + printoption("[-quick24]"); +*************** +*** 1683,1689 **** + + int i; + +! if (strlen(a1) < minlen || strlen(a2) < minlen) return 1; + if (strlen(a1) > strlen(a2)) return 1; + + if (strncmp(a1+1, a2+1, strlen(a1)-1)) return 1; +--- 1686,1693 ---- + + int i; + +! if ((strlen(a1) < (size_t) minlen) || (strlen(a2) < (size_t) minlen)) +! return 1; + if (strlen(a1) > strlen(a2)) return 1; + + if (strncmp(a1+1, a2+1, strlen(a1)-1)) return 1; +*************** +*** 1860,1866 **** + + + /* chop off trailing ".Z", ".z", or ".gz" from displayed basefname, if any */ +! if (strlen(basefname)>2 && strcmp(basefname+strlen(basefname)-2,".Z")==0) + basefname[strlen(basefname)-2]='\0'; + else { + #ifdef GUNZIP +--- 1864,1871 ---- + + + /* chop off trailing ".Z", ".z", or ".gz" from displayed basefname, if any */ +! if (strlen(basefname) > (size_t) 2 && +! strcmp(basefname+strlen(basefname)-2,".Z")==0) + basefname[strlen(basefname)-2]='\0'; + else { + #ifdef GUNZIP +*************** +*** 2698,2705 **** + to what it was. necessary because uncompress doesn't handle files + that don't end with '.Z' */ + +! if (strlen(name)>=2 && strcmp(name + strlen(name)-2,".Z")!=0 && +! strcmp(name + strlen(name)-2,".z")!=0) { + strcpy(namez, name); + strcat(namez,".Z"); + +--- 2703,2711 ---- + to what it was. necessary because uncompress doesn't handle files + that don't end with '.Z' */ + +! if (strlen(name) >= (size_t) 2 && +! strcmp(name + strlen(name)-2,".Z")!=0 && +! strcmp(name + strlen(name)-2,".z")!=0) { + strcpy(namez, name); + strcat(namez,".Z"); + +*************** +*** 2890,2896 **** + char fullcmd[512], tmpname[64], str[512]; + int i; + +! if (!cmd || strlen(cmd)<2) return 1; + + sprintf(tmpname,"%s/xvXXXXXX", tmpdir); + mktemp(tmpname); +--- 2896,2902 ---- + char fullcmd[512], tmpname[64], str[512]; + int i; + +! if (!cmd || (strlen(cmd) < (size_t) 2)) return 1; + + sprintf(tmpname,"%s/xvXXXXXX", tmpdir); + mktemp(tmpname); +*************** +*** 3270,3276 **** + + xwmh.icon_pixmap = iconPix; + xwmh.icon_mask = iconmask; +! xwmh.flags |= ( IconPixmapHint | IconMaskHint) ; + + + if (startIconic && firstTime) { +--- 3276,3282 ---- + + xwmh.icon_pixmap = iconPix; + xwmh.icon_mask = iconmask; +! xwmh.flags |= (IconPixmapHint | IconMaskHint); + + + if (startIconic && firstTime) { +*************** +*** 3787,3793 **** +--- 3793,3802 ---- + | EnterWindowMask | LeaveWindowMask ); + + StoreDeleteWindowProp(mainW); ++ XFlush(theDisp); + XMapWindow(theDisp,mainW); ++ XFlush(theDisp); ++ if (startIconic) sleep(2); /* give it time to get the window up...*/ + } + } + +diff -c -r ../xv-3.10/xv.h ./xv.h +*** ../xv-3.10/xv.h Thu Dec 22 14:12:15 1994 +--- ./xv.h Mon Jan 23 15:22:23 1995 +*************** +*** 8,15 **** + #include "config.h" + + +! #define REVDATE "Version 3.10 Rev: 12/16/94" +! #define VERSTR "3.10" + + /* + * uncomment the following, and modify for your site, but only if you've +--- 8,15 ---- + #include "config.h" + + +! #define REVDATE "Version 3.10a Rev: 12/29/94" +! #define VERSTR "3.10a" + + /* + * uncomment the following, and modify for your site, but only if you've +*************** +*** 62,67 **** +--- 62,74 ---- + #endif + + ++ #ifdef LINUX ++ # ifndef _LINUX_LIMITS_H ++ # include <linux/limits.h> ++ # endif ++ #endif ++ ++ + #include <X11/Xos.h> /* need type declarations immediately */ + + /*********************************************************/ +*************** +*** 198,203 **** +--- 205,217 ---- + # include <limits.h> + # endif + ++ /*** for select() call ***/ ++ # ifdef __hpux ++ # define XV_FDTYPE (int *) ++ # else ++ # define XV_FDTYPE (fd_set *) ++ # endif ++ + #endif /* NEEDSTIME */ + + +*************** +*** 214,219 **** +--- 228,237 ---- + # include <dirent.h> + # endif + ++ # if defined(SVR4) || defined(SYSV) ++ # include <fcntl.h> ++ # endif ++ + # include <sys/param.h> + # include <sys/stat.h> + +*************** +*** 961,966 **** +--- 979,985 ---- + WHERE int ch_offx,ch_offy; /* ChngAttr ofst for reparented windows */ + WHERE int kludge_offx, /* WM kludges for SetWindowPos routine */ + kludge_offy; ++ WHERE int winCtrPosKludge; /* kludge for popup positioning... */ + + WHERE int ignoreConfigs; /* an evil kludge... */ + +diff -c -r ../xv-3.10/xv24to8.c ./xv24to8.c +*** ../xv-3.10/xv24to8.c Thu Dec 22 14:12:15 1994 +--- ./xv24to8.c Fri Jan 13 14:49:21 1995 +*************** +*** 374,382 **** + + #define PPM_DEPTH(newp,p,oldmaxval,newmaxval) \ + PPM_ASSIGN( (newp), \ +! (int) PPM_GETR(p) * (newmaxval) / ((int)oldmaxval), \ +! (int) PPM_GETG(p) * (newmaxval) / ((int)oldmaxval), \ +! (int) PPM_GETB(p) * (newmaxval) / ((int)oldmaxval) ) + + + /* Luminance macro. */ +--- 374,382 ---- + + #define PPM_DEPTH(newp,p,oldmaxval,newmaxval) \ + PPM_ASSIGN( (newp), \ +! ((int) PPM_GETR(p)) * ((int)newmaxval) / ((int)oldmaxval), \ +! ((int) PPM_GETG(p)) * ((int)newmaxval) / ((int)oldmaxval), \ +! ((int) PPM_GETB(p)) * ((int)newmaxval) / ((int)oldmaxval) ) + + + /* Luminance macro. */ + +diff -c -r ../xv-3.10/xvbrowse.c ./xvbrowse.c +*** ../xv-3.10/xvbrowse.c Thu Dec 22 14:12:20 1994 +--- ./xvbrowse.c Thu Jan 19 12:49:17 1995 +*************** +*** 20,26 **** + #define NEEDSDIR + #include "xv.h" + +! #ifdef VMS + typedef unsigned int mode_t; /* file mode bits */ + #endif + +--- 20,26 ---- + #define NEEDSDIR + #include "xv.h" + +! #if defined(VMS) || defined(isc) + typedef unsigned int mode_t; /* file mode bits */ + #endif + +*************** +*** 2579,2585 **** + int rv; + + /* temporarily excise trailing '/' char from br->path */ +! if (strlen(br->path)>2 && br->path[strlen(br->path)-1] == '/') + br->path[strlen(br->path)-1] = '\0'; + + rv = chdir(br->path); +--- 2579,2585 ---- + int rv; + + /* temporarily excise trailing '/' char from br->path */ +! if ((strlen(br->path) > (size_t) 2) && br->path[strlen(br->path)-1] == '/') + br->path[strlen(br->path)-1] = '\0'; + + rv = chdir(br->path); +*************** +*** 3544,3550 **** + case RFT_PBM: if (xv_strstr(pinfo.fullInfo, "raw")) strcat(str,"Raw "); + else strcat(str,"Ascii "); + +! for (i=0; i<3 && strlen(pinfo.fullInfo)>3; i++) { + str1[0] = pinfo.fullInfo[i]; str1[1] = '\0'; + strcat(str, str1); + } +--- 3544,3550 ---- + case RFT_PBM: if (xv_strstr(pinfo.fullInfo, "raw")) strcat(str,"Raw "); + else strcat(str,"Ascii "); + +! for (i=0; i<3 && (strlen(pinfo.fullInfo)>(size_t)3); i++){ + str1[0] = pinfo.fullInfo[i]; str1[1] = '\0'; + strcat(str, str1); + } +*************** +*** 4521,4527 **** + + /* try to delete a thumbnail file, as well. ignore errors */ + strcpy(buf1, name); /* tmp1 = leading path of name */ +! tmp = rindex(buf1, '/'); + if (!tmp) strcpy(buf1,"."); + else *tmp = '\0'; + +--- 4521,4527 ---- + + /* try to delete a thumbnail file, as well. ignore errors */ + strcpy(buf1, name); /* tmp1 = leading path of name */ +! tmp = (char *) rindex(buf1, '/'); + if (!tmp) strcpy(buf1,"."); + else *tmp = '\0'; + +diff -c -r ../xv-3.10/xvbutt.c ./xvbutt.c +*** ../xv-3.10/xvbutt.c Thu Dec 22 14:12:16 1994 +--- ./xvbutt.c Tue Jan 03 16:19:51 1995 +*************** +*** 961,967 **** + + /* truncate at TAB, if any */ + strcpy(stbuf, str); +! if ((str = index(stbuf, '\t')) != NULL) *str = '\0'; + str = stbuf; + + x1 = CENTERX(mfinfo, x + w/2, str); +--- 961,967 ---- + + /* truncate at TAB, if any */ + strcpy(stbuf, str); +! if ((str = (char *) index(stbuf, '\t')) != NULL) *str = '\0'; + str = stbuf; + + x1 = CENTERX(mfinfo, x + w/2, str); +*************** +*** 1073,1079 **** + char *sp, str[256]; + + strcpy(str, mb->list[i]); +! sp = index(str, '\t'); + j = StringWidth(sp+1); + if (j>mtabwide) mtabwide = j; + +--- 1073,1079 ---- + char *sp, str[256]; + + strcpy(str, mb->list[i]); +! sp = (char *) index(str, '\t'); + j = StringWidth(sp+1); + if (j>mtabwide) mtabwide = j; + +*************** +*** 1139,1145 **** + for (i=0; i<mb->nlist; i++) { + char txtstr[256], *tabstr; + strcpy(txtstr, mb->list[i]); +! if ((tabstr = index(txtstr, '\t'))) { + *tabstr = '\0'; tabstr++; + } + +--- 1139,1145 ---- + for (i=0; i<mb->nlist; i++) { + char txtstr[256], *tabstr; + strcpy(txtstr, mb->list[i]); +! if ((tabstr = (char *) index(txtstr, '\t'))) { + *tabstr = '\0'; tabstr++; + } + +diff -c -r ../xv-3.10/xvcolor.c ./xvcolor.c +*** ../xv-3.10/xvcolor.c Thu Dec 22 14:12:17 1994 +--- ./xvcolor.c Fri Jan 06 14:29:23 1995 +*************** +*** 616,622 **** + *foo = "No r/w cells available. Using r/o color."; + + tmp = GetISTR(ISTR_WARNING); +! if (strlen(tmp)>0) sprintf(tstr, "%s %s", tmp, foo); + else sprintf(tstr, "%s", foo); + SetISTR(ISTR_WARNING,tstr); + +--- 616,622 ---- + *foo = "No r/w cells available. Using r/o color."; + + tmp = GetISTR(ISTR_WARNING); +! if (strlen(tmp) > (size_t) 0) sprintf(tstr, "%s %s", tmp, foo); + else sprintf(tstr, "%s", foo); + SetISTR(ISTR_WARNING,tstr); + +*************** +*** 790,799 **** + } + + +! void xvFreeColors(dp, cm,pixels, npixels, planes) + Display *dp; + Colormap cm; +! unsigned long pixels[]; + int npixels; + unsigned long planes; + { +--- 790,799 ---- + } + + +! void xvFreeColors(dp, cm, pixels, npixels, planes) + Display *dp; + Colormap cm; +! unsigned long *pixels; + int npixels; + unsigned long planes; + { + +diff -c -r ../xv-3.10/xvcut.c ./xvcut.c +*** ../xv-3.10/xvcut.c Thu Dec 22 14:12:21 1994 +--- ./xvcut.c Fri Jan 13 14:55:48 1995 +*************** +*** 760,766 **** + len |= ((int) data[2])<<16; + len |= ((int) data[3])<<24; + +! XFree(data); + + /* read the rest of the data (len bytes) */ + i = XGetWindowProperty(theDisp, rootW, clipAtom, 1L, +--- 760,766 ---- + len |= ((int) data[2])<<16; + len |= ((int) data[3])<<24; + +! XFree((void *) data); + + /* read the rest of the data (len bytes) */ + i = XGetWindowProperty(theDisp, rootW, clipAtom, 1L, +*************** +*** 774,780 **** + + data1 = (byte *) malloc((size_t) len); + if (!data1) { +! XFree(data); + ErrPopUp("Insufficient memory to retrieve clipboard!", "\nShucks!"); + return (byte *) NULL; + } +--- 774,780 ---- + + data1 = (byte *) malloc((size_t) len); + if (!data1) { +! XFree((void *) data); + ErrPopUp("Insufficient memory to retrieve clipboard!", "\nShucks!"); + return (byte *) NULL; + } +*************** +*** 785,791 **** + data1[3] = (len>>24) & 0xff; + xvbcopy((char *) data, (char *) data1+4, (size_t) len-4); + +! XFree(data); + return data1; + } + } +--- 785,791 ---- + data1[3] = (len>>24) & 0xff; + xvbcopy((char *) data, (char *) data1+4, (size_t) len-4); + +! XFree((void *) data); + return data1; + } + } + +diff -c -r ../xv-3.10/xvdial.c ./xvdial.c +*** ../xv-3.10/xvdial.c Thu Dec 22 14:12:17 1994 +--- ./xvdial.c Tue Jan 03 16:20:31 1995 +*************** +*** 358,364 **** + + if (dp->units) strcat(foo,dp->units); + foo1[0] = '\0'; +! if (strlen(foo)<i) { + for (i = i - strlen(foo); i>0; i--) strcat(foo1," "); + } + strcat(foo1, foo); +--- 358,364 ---- + + if (dp->units) strcat(foo,dp->units); + foo1[0] = '\0'; +! if (strlen(foo) < (size_t) i) { + for (i = i - strlen(foo); i>0; i--) strcat(foo1," "); + } + strcat(foo1, foo); + +diff -c -r ../xv-3.10/xvdir.c ./xvdir.c +*** ../xv-3.10/xvdir.c Thu Dec 22 14:12:16 1994 +--- ./xvdir.c Tue Jan 03 16:21:39 1995 +*************** +*** 650,656 **** + changedDir = strcmp(path, oldpath); + strcpy(oldpath, path); + +! if (strlen(path)>1 && path[strlen(path)-1] != '/') + strcat(path,"/"); /* tack on a trailing '/' to make path consistent */ + + /* path will be something like: "/u3/bradley/src/weiner/whatever/" */ +--- 650,656 ---- + changedDir = strcmp(path, oldpath); + strcpy(oldpath, path); + +! if ((strlen(path) > (size_t) 1) && path[strlen(path)-1] != '/') + strcat(path,"/"); /* tack on a trailing '/' to make path consistent */ + + /* path will be something like: "/u3/bradley/src/weiner/whatever/" */ +*************** +*** 851,857 **** + xvbcopy(&filename[curPos], &filename[curPos-1], (size_t) (len-curPos+1)); + curPos--; + +! if (strlen(filename)>0) scrollToFileName(); + } + + else if (c=='\025') { /* ^U: clear entire line */ +--- 851,857 ---- + xvbcopy(&filename[curPos], &filename[curPos-1], (size_t) (len-curPos+1)); + curPos--; + +! if (strlen(filename) > (size_t) 0) scrollToFileName(); + } + + else if (c=='\025') { /* ^U: clear entire line */ +*************** +*** 1023,1029 **** + XDrawLine(theDisp, dnamW, theGC, 2,0,2,LINEHIGH+5); + } + +! if (enPos<strlen(filename)) { /* draw a "there's more over here" doowah */ + XDrawLine(theDisp, dnamW, theGC, DNAMWIDE+5,0,DNAMWIDE+5,LINEHIGH+5); + XDrawLine(theDisp, dnamW, theGC, DNAMWIDE+4,0,DNAMWIDE+4,LINEHIGH+5); + XDrawLine(theDisp, dnamW, theGC, DNAMWIDE+3,0,DNAMWIDE+3,LINEHIGH+5); +--- 1023,1030 ---- + XDrawLine(theDisp, dnamW, theGC, 2,0,2,LINEHIGH+5); + } + +! if ((size_t) enPos < strlen(filename)) { +! /* draw a "there's more over here" doowah */ + XDrawLine(theDisp, dnamW, theGC, DNAMWIDE+5,0,DNAMWIDE+5,LINEHIGH+5); + XDrawLine(theDisp, dnamW, theGC, DNAMWIDE+4,0,DNAMWIDE+4,LINEHIGH+5); + XDrawLine(theDisp, dnamW, theGC, DNAMWIDE+3,0,DNAMWIDE+3,LINEHIGH+5); +*************** +*** 1538,1544 **** + if (*fname != '~') return 0; /* doesn't start with a tilde, don't expand */ + + /* look for the first '/' after the tilde */ +! sp = index(fname,'/'); + if (sp == 0) { /* no '/' after the tilde */ + sp = fname+strlen(fname); /* sp = end of string */ + } +--- 1539,1545 ---- + if (*fname != '~') return 0; /* doesn't start with a tilde, don't expand */ + + /* look for the first '/' after the tilde */ +! sp = (char *) index(fname,'/'); + if (sp == 0) { /* no '/' after the tilde */ + sp = fname+strlen(fname); /* sp = end of string */ + } + +diff -c -r ../xv-3.10/xvevent.c ./xvevent.c +*** ../xv-3.10/xvevent.c Thu Dec 22 14:12:17 1994 +--- ./xvevent.c Mon Jan 23 18:20:24 1995 +*************** +*** 1407,1413 **** + okay = 0; + do { + i = GetStrPopUp(txt, labels, 2, buf, 64, "0123456789", 1); +! if (!i && strlen(buf)>0) { /* hit 'Ok', had a string entered */ + /* check for page in range */ + j = atoi(buf); + if (j>=1 && j<=numPages) { +--- 1407,1414 ---- + okay = 0; + do { + i = GetStrPopUp(txt, labels, 2, buf, 64, "0123456789", 1); +! if (!i && strlen(buf) > (size_t) 0) { +! /* hit 'Ok', had a string entered */ + /* check for page in range */ + j = atoi(buf); + if (j>=1 && j<=numPages) { +*************** +*** 2030,2035 **** +--- 2031,2037 ---- + xwc.height = xwa->height; + + ++ #ifdef BAD_IDEA + /* if there is a virtual window manager running, then we should translate + the coordinates that are in terms of 'real' screen into coordinates + that are in terms of the 'virtual' root window +*************** +*** 2043,2049 **** + xwc.x,xwc.y,x1,y1); + xwc.x = x1; xwc.y = y1; + } +! + + + if (DEBUG) { +--- 2045,2051 ---- + xwc.x,xwc.y,x1,y1); + xwc.x = x1; xwc.y = y1; + } +! #endif + + + if (DEBUG) { + +diff -c -r ../xv-3.10/xvfits.c ./xvfits.c +*** ../xv-3.10/xvfits.c Thu Dec 22 14:12:21 1994 +--- ./xvfits.c Wed Dec 28 02:43:29 1994 +*************** +*** 69,75 **** + char basename[64]; + + if (fits_block == NULL) { +! fits_block = malloc((size_t) BLOCKSIZE); + if (!fits_block) FatalError("Insufficient memory for FITS block buffer"); + } + +--- 69,75 ---- + char basename[64]; + + if (fits_block == NULL) { +! fits_block = (char *) malloc((size_t) BLOCKSIZE); + if (!fits_block) FatalError("Insufficient memory for FITS block buffer"); + } + +*************** +*** 170,176 **** + byte rgb[256]; + + if (!fits_block) { +! fits_block = malloc((size_t) BLOCKSIZE); + if (!fits_block) FatalError("Insufficient memory for FITS block buffer"); + } + +--- 170,176 ---- + byte rgb[256]; + + if (!fits_block) { +! fits_block = (char *) malloc((size_t) BLOCKSIZE); + if (!fits_block) FatalError("Insufficient memory for FITS block buffer"); + } + +*************** +*** 498,504 **** + j++; /* make j length of comment */ + if (j > 0) { /* skip blank comment cards */ + if (fs->comment == NULL) { +! fs->comment = malloc((size_t) commsize); + if (fs->comment == NULL) + FatalError("Insufficient memory for comment buffer"); + } +--- 498,504 ---- + j++; /* make j length of comment */ + if (j > 0) { /* skip blank comment cards */ + if (fs->comment == NULL) { +! fs->comment = (char *) malloc((size_t) commsize); + if (fs->comment == NULL) + FatalError("Insufficient memory for comment buffer"); + } + +diff -c -r ../xv-3.10/xvgam.c ./xvgam.c +*** ../xv-3.10/xvgam.c Thu Dec 22 14:12:15 1994 +--- ./xvgam.c Fri Jan 13 14:51:14 1995 +*************** +*** 1838,1844 **** + gMap[i] = gcmap[i]; + bMap[i] = bcmap[i]; + if (!ncols) +! cols[i] = (rMap[i] + gMap[i] + bMap[i] >= 128*3) ? white : black; + } + } + } +--- 1838,1845 ---- + gMap[i] = gcmap[i]; + bMap[i] = bcmap[i]; + if (!ncols) +! cols[i] = (((int)rMap[i]) + ((int)gMap[i]) + ((int)bMap[i]) >= 128*3) +! ? white : black; + } + } + } +*************** +*** 1903,1909 **** + bMap[col] = bGraf.func[bv]; + + if (!ncols) +! cols[col] = (rMap[col] + gMap[col] + bMap[col] >= 128*3) ? white : black; + + if (DEBUG>1) fprintf(stderr," -> %d,%d,%d\n",rMap[col],gMap[col],bMap[col]); + } +--- 1904,1912 ---- + bMap[col] = bGraf.func[bv]; + + if (!ncols) +! cols[col] = +! (((int)rMap[col]) + ((int)gMap[col]) + ((int)bMap[col]) >= 128*3) +! ? white : black; + + if (DEBUG>1) fprintf(stderr," -> %d,%d,%d\n",rMap[col],gMap[col],bMap[col]); + } + +diff -c -r ../xv-3.10/xvgif.c ./xvgif.c +*** ../xv-3.10/xvgif.c Thu Dec 22 14:12:15 1994 +--- ./xvgif.c Tue Jan 10 14:54:41 1995 +*************** +*** 254,260 **** + + + if (cmtlen>0) { /* build into one un-blocked comment */ +! cmt = (byte *) malloc((size_t) cmtlen); + if (!cmt) gifWarning("couldn't malloc space for comments\n"); + else { + sp = cmt; +--- 254,260 ---- + + + if (cmtlen>0) { /* build into one un-blocked comment */ +! cmt = (byte *) malloc((size_t) (cmtlen + 1)); + if (!cmt) gifWarning("couldn't malloc space for comments\n"); + else { + sp = cmt; +*************** +*** 262,270 **** + sbsize = (*ptr1++); + for (j=0; j<sbsize; j++, sp++, ptr1++) *sp = *ptr1; + } while (sbsize); + + if (pinfo->comment) { /* have to strcat onto old comments */ +! cmt1 = (byte *) malloc(strlen(pinfo->comment) + cmtlen); + if (!cmt1) { + gifWarning("couldn't malloc space for comments\n"); + free(cmt); +--- 262,271 ---- + sbsize = (*ptr1++); + for (j=0; j<sbsize; j++, sp++, ptr1++) *sp = *ptr1; + } while (sbsize); ++ *sp = '\0'; + + if (pinfo->comment) { /* have to strcat onto old comments */ +! cmt1 = (byte *) malloc(strlen(pinfo->comment) + cmtlen + 2); + if (!cmt1) { + gifWarning("couldn't malloc space for comments\n"); + free(cmt); +*************** +*** 271,276 **** +--- 272,278 ---- + } + else { + strcpy((char *) cmt1, (char *) pinfo->comment); ++ strcat((char *) cmt1, (char *) "\n"); + strcat((char *) cmt1, (char *) cmt); + free(pinfo->comment); + free(cmt); + +diff -c -r ../xv-3.10/xvgifwr.c ./xvgifwr.c +*** ../xv-3.10/xvgifwr.c Thu Dec 22 14:12:16 1994 +--- ./xvgifwr.c Tue Jan 03 16:22:21 1995 +*************** +*** 141,147 **** + fprintf(stderr,"WrGIF: pic=%lx, w,h=%dx%d, numcols=%d, Bits%d,Cmap=%d\n", + (u_long) pic8, w,h,numcols,BitsPerPixel,ColorMapSize); + +! if (comment && strlen(comment)>0) + fwrite("GIF89a", (size_t) 1, (size_t) 6, fp); /* the GIF magic number */ + else + fwrite("GIF87a", (size_t) 1, (size_t) 6, fp); /* the GIF magic number */ +--- 141,147 ---- + fprintf(stderr,"WrGIF: pic=%lx, w,h=%dx%d, numcols=%d, Bits%d,Cmap=%d\n", + (u_long) pic8, w,h,numcols,BitsPerPixel,ColorMapSize); + +! if (comment && strlen(comment) > (size_t) 0) + fwrite("GIF89a", (size_t) 1, (size_t) 6, fp); /* the GIF magic number */ + else + fwrite("GIF87a", (size_t) 1, (size_t) 6, fp); /* the GIF magic number */ +*************** +*** 175,181 **** + } + } + +! if (comment && strlen(comment)>0) { /* write comment blocks */ + char *sp; + int i, blen; + +--- 175,181 ---- + } + } + +! if (comment && strlen(comment) > (size_t) 0) { /* write comment blocks */ + char *sp; + int i, blen; + +diff -c -r ../xv-3.10/xviff.c ./xviff.c +*** ../xv-3.10/xviff.c Thu Dec 22 14:12:20 1994 +--- ./xviff.c Fri Jan 13 14:54:54 1995 +*************** +*** 463,469 **** + + if (codeByte < 0x80) { + codeByte++; +! if ((slen > codeByte) && (dlen >= codeByte)) { + slen -= codeByte + 1; + dlen -= codeByte; + while (codeByte > 0) { +--- 463,469 ---- + + if (codeByte < 0x80) { + codeByte++; +! if ((slen > (long) codeByte) && (dlen >= (long) codeByte)) { + slen -= codeByte + 1; + dlen -= codeByte; + while (codeByte > 0) { +*************** +*** 476,482 **** + + else if (codeByte > 0x80) { + codeByte = 0x81 - (codeByte & 0x7f); +! if ((slen > 0) && (dlen >= codeByte)) { + dataByte = *sptr++; + slen -= 2; + dlen -= codeByte; +--- 476,482 ---- + + else if (codeByte > 0x80) { + codeByte = 0x81 - (codeByte & 0x7f); +! if ((slen > (long) 0) && (dlen >= (long) codeByte)) { + dataByte = *sptr++; + slen -= 2; + dlen -= codeByte; + +diff -c -r ../xv-3.10/xvimage.c ./xvimage.c +*** ../xv-3.10/xvimage.c Thu Dec 22 14:12:17 1994 +--- ./xvimage.c Fri Jan 13 19:11:36 1995 +*************** +*** 675,680 **** +--- 675,682 ---- + # define inabsrange(a,n) ( (a) < n && (a) > -n ) + + ++ if (cHIGH<3 || cWIDE<3) return 0; ++ + ctop = cbot = cleft = cright = 0; + + if (picType != PIC24) FatalError("doAutoCrop24 called when pic!=PIC24"); +*************** +*** 780,787 **** + + /* do the actual cropping */ + if (cleft || ctop || cbot || cright) { + DoCrop(cXOFF+cleft, cYOFF+ctop, +! cWIDE-(cleft+cright), cHIGH-(ctop+cbot)); + return 1; + } + +--- 782,792 ---- + + /* do the actual cropping */ + if (cleft || ctop || cbot || cright) { ++ if (cWIDE - (cleft + cright) < 1 || ++ cHIGH - (ctop + cbot ) < 1) return 0; /* sanity check */ ++ + DoCrop(cXOFF+cleft, cYOFF+ctop, +! cWIDE-(cleft+cright), cHIGH-(ctop+cbot)); + return 1; + } + +*************** +*** 859,865 **** + eWIDE = (int) (cWIDE * expw); + eHIGH = (int) (cHIGH * exph); + +! if (eWIDE > maxWIDE || h > maxHIGH) { /* make 'normal' size */ + if (cWIDE>maxWIDE || cHIGH>maxHIGH) { + double r,wr,hr; + wr = ((double) cWIDE) / maxWIDE; +--- 864,870 ---- + eWIDE = (int) (cWIDE * expw); + eHIGH = (int) (cHIGH * exph); + +! if (eWIDE>maxWIDE || eHIGH>maxHIGH) { /* make 'normal' size */ + if (cWIDE>maxWIDE || cHIGH>maxHIGH) { + double r,wr,hr; + wr = ((double) cWIDE) / maxWIDE; +*************** +*** 873,878 **** +--- 878,886 ---- + } + + ++ if (eWIDE<1) eWIDE = 1; ++ if (eHIGH<1) eHIGH = 1; ++ + SetCursors(-1); + } + +*************** +*** 2823,2831 **** + } + + if (omode == PAD_ORGB) { +! rval = (r * fg) / 100 + (p24[0] * bg) / 100; +! gval = (g * fg) / 100 + (p24[1] * bg) / 100; +! bval = (b * fg) / 100 + (p24[2] * bg) / 100; + } + else { /* one of the HSV modes */ + double fh,fs,fv,fw, bh,bs,bv,bw, h,s,v; +--- 2831,2839 ---- + } + + if (omode == PAD_ORGB) { +! rval = (r * fg) / 100 + ((int) p24[0] * bg) / 100; +! gval = (g * fg) / 100 + ((int) p24[1] * bg) / 100; +! bval = (b * fg) / 100 + ((int) p24[2] * bg) / 100; + } + else { /* one of the HSV modes */ + double fh,fs,fv,fw, bh,bs,bv,bw, h,s,v; + +diff -c -r ../xv-3.10/xvjpeg.c ./xvjpeg.c +*** ../xv-3.10/xvjpeg.c Thu Dec 22 14:12:16 1994 +--- ./xvjpeg.c Thu Jan 05 03:17:13 1995 +*************** +*** 612,620 **** + } + + +- jpeg_finish_decompress(&cinfo); + +- + /* return 'PICINFO' structure to XV */ + + pinfo->pic = pic; +--- 612,618 ---- +*************** +*** 646,655 **** + + pinfo->comment = comment; + + jpeg_destroy_decompress(&cinfo); + fclose(fp); + +! comment = NULL; + return 1; + } + +--- 644,654 ---- + + pinfo->comment = comment; + ++ jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + fclose(fp); + +! comment = (char *) NULL; + return 1; + } + +*************** +*** 806,812 **** + If none, add 2. If one, add 1. If two or more, add none. */ + + sp = comment + strlen(comment); +! for (i=0; i<3 && i<strlen(comment); i++) { + sp--; + if (*sp != '\n') break; + } +--- 805,811 ---- + If none, add 2. If one, add 1. If two or more, add none. */ + + sp = comment + strlen(comment); +! for (i=0; i<3 && ((size_t) i < strlen(comment)); i++) { + sp--; + if (*sp != '\n') break; + } + +diff -c -r ../xv-3.10/xvmisc.c ./xvmisc.c +*** ../xv-3.10/xvmisc.c Thu Dec 22 14:12:15 1994 +--- ./xvmisc.c Fri Jan 13 18:41:34 1995 +*************** +*** 729,735 **** + 'simple' name ('weenie.gif'). Note that it does not make a copy of + the name, so don't be modifying it... */ + +! basname = rindex(fname, '/'); + if (!basname) basname = fname; + else basname++; + +--- 729,735 ---- + 'simple' name ('weenie.gif'). Note that it does not make a copy of + the name, so don't be modifying it... */ + +! basname = (char *) rindex(fname, '/'); + if (!basname) basname = fname; + else basname++; + +*************** +*** 770,802 **** + XSetForeground(theDisp, theGC, fg); + XFillRectangle(theDisp,win,theGC, x+3, y+3, (u_int) barwide, (u_int) h-5); + +! if (barwide < maxwide) { +! if (numchars) { + XSetForeground(theDisp, theGC, bg); + XFillRectangle(theDisp, win, theGC, x+3+barwide, y+3, + (u_int) (maxwide-barwide), (u_int) (h-5)); +- +- XSetForeground(theDisp, theGC, fg); +- XDrawString(theDisp, win, theGC, CENTERX(mfinfo, (x+w/2), str), +- CENTERY(mfinfo, (y+h/2)), str, numchars); + } +- else { +- XDrawLine(theDisp,win,theGC,x+3+barwide, y+h/2 + 0, x+w-3, y+h/2 + 0); +- +- XSetForeground(theDisp, theGC, lo); +- XDrawLine(theDisp,win,theGC,x+3+barwide, y+h/2 + 1, x+w-3, y+h/2 + 1); + +! XSetForeground(theDisp, theGC, hi); +! XDrawLine(theDisp,win,theGC,x+3+barwide, y+h/2 + 2, x+w-3, y+h/2 + 2); +! +! XSetForeground(theDisp, theGC, bg); +! XFillRectangle(theDisp, win, theGC, x+3+barwide, y+3, +! (u_int) (maxwide-barwide), (u_int) (h/2 - 3)); +! +! XFillRectangle(theDisp, win, theGC, x+3+barwide, y+h/2 + 3, +! (u_int) (maxwide-barwide),(u_int)((h-3) - (h/2+3)) + 1); +! } + } + } + + else { +--- 770,808 ---- + XSetForeground(theDisp, theGC, fg); + XFillRectangle(theDisp,win,theGC, x+3, y+3, (u_int) barwide, (u_int) h-5); + +! if (numchars) { /* do string */ +! if (barwide < maxwide) { + XSetForeground(theDisp, theGC, bg); + XFillRectangle(theDisp, win, theGC, x+3+barwide, y+3, + (u_int) (maxwide-barwide), (u_int) (h-5)); + } + +! XSetFunction(theDisp, theGC, GXinvert); +! XSetPlaneMask(theDisp, theGC, fg ^ bg); +! +! XDrawString(theDisp, win, theGC, CENTERX(mfinfo, (x+w/2), str), +! CENTERY(mfinfo, (y+h/2)), str, numchars); +! +! XSetFunction(theDisp, theGC, GXcopy); +! XSetPlaneMask(theDisp, theGC, AllPlanes); + } ++ ++ else if (barwide < maxwide) { ++ XDrawLine(theDisp,win,theGC,x+3+barwide, y+h/2 + 0, x+w-3, y+h/2 + 0); ++ ++ XSetForeground(theDisp, theGC, lo); ++ XDrawLine(theDisp,win,theGC,x+3+barwide, y+h/2 + 1, x+w-3, y+h/2 + 1); ++ ++ XSetForeground(theDisp, theGC, hi); ++ XDrawLine(theDisp,win,theGC,x+3+barwide, y+h/2 + 2, x+w-3, y+h/2 + 2); ++ ++ XSetForeground(theDisp, theGC, bg); ++ XFillRectangle(theDisp, win, theGC, x+3+barwide, y+3, ++ (u_int) (maxwide-barwide), (u_int) (h/2 - 3)); ++ ++ XFillRectangle(theDisp, win, theGC, x+3+barwide, y+h/2 + 3, ++ (u_int) (maxwide-barwide),(u_int)((h-3) - (h/2+3)) + 1); ++ } + } + + else { +*************** +*** 806,832 **** + XSetForeground(theDisp, theGC, fg); + XFillRectangle(theDisp,win,theGC, x+1, y+1, (u_int) barwide, (u_int) h-1); + +! if (barwide < maxwide) { +! if (numchars) { + XSetForeground(theDisp, theGC, bg); + XFillRectangle(theDisp, win, theGC, x+1+barwide, y+1, + (u_int) (maxwide-barwide), (u_int) (h-1)); +- +- XSetForeground(theDisp, theGC, fg); +- XDrawString(theDisp, win, theGC, CENTERX(mfinfo, (x+w/2), str), +- CENTERY(mfinfo, (y+h/2)), str, numchars); + } +! else { +! XDrawLine(theDisp, win, theGC, x+1+barwide, y+h/2, x+w-1, y+h/2); +! +! XSetForeground(theDisp, theGC, bg); +! XFillRectangle(theDisp, win, theGC, x+1+barwide, y+1, +! (u_int) (maxwide-barwide), (u_int) (h/2 - 1)); +! +! XFillRectangle(theDisp, win, theGC, x+1+barwide, y+h/2 + 1, +! (u_int)(maxwide-barwide),(u_int)(((h-1) - (h/2+1))+1)); +! } + } + } + + XFlush(theDisp); +--- 812,844 ---- + XSetForeground(theDisp, theGC, fg); + XFillRectangle(theDisp,win,theGC, x+1, y+1, (u_int) barwide, (u_int) h-1); + +! if (numchars) { +! if (barwide < maxwide) { + XSetForeground(theDisp, theGC, bg); + XFillRectangle(theDisp, win, theGC, x+1+barwide, y+1, + (u_int) (maxwide-barwide), (u_int) (h-1)); + } +! +! XSetFunction(theDisp, theGC, GXinvert); +! XSetPlaneMask(theDisp, theGC, fg ^ bg); +! +! XDrawString(theDisp, win, theGC, CENTERX(mfinfo, (x+w/2), str), +! CENTERY(mfinfo, (y+h/2)), str, numchars); +! +! XSetFunction(theDisp, theGC, GXcopy); +! XSetPlaneMask(theDisp, theGC, AllPlanes); + } ++ ++ else if (barwide < maxwide) { ++ XDrawLine(theDisp, win, theGC, x+1+barwide, y+h/2, x+w-1, y+h/2); ++ ++ XSetForeground(theDisp, theGC, bg); ++ XFillRectangle(theDisp, win, theGC, x+1+barwide, y+1, ++ (u_int) (maxwide-barwide), (u_int) (h/2 - 1)); ++ ++ XFillRectangle(theDisp, win, theGC, x+1+barwide, y+h/2 + 1, ++ (u_int)(maxwide-barwide),(u_int)(((h-1) - (h/2+1))+1)); ++ } + } + + XFlush(theDisp); +*************** +*** 1117,1124 **** + + time.tv_sec = usec / 1000000L; + time.tv_usec = usec % 1000000L; +! select(0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, &time); + } + #endif /* VMS */ + } + +--- 1129,1137 ---- + + time.tv_sec = usec / 1000000L; + time.tv_usec = usec % 1000000L; +! select(0, XV_FDTYPE NULL, XV_FDTYPE NULL, XV_FDTYPE NULL, &time); + } + #endif /* VMS */ + } ++ + +diff -c -r ../xv-3.10/xvpbm.c ./xvpbm.c +*** ../xv-3.10/xvpbm.c Thu Dec 22 14:12:16 1994 +--- ./xvpbm.c Tue Jan 03 16:23:44 1995 +*************** +*** 353,359 **** + *sp++ = '\n'; + *sp = '\0'; + +! if (strlen(cmt) > 0) { /* add to pinfo->comment */ + if (!pinfo->comment) { + pinfo->comment = (char *) malloc(strlen(cmt)+1); + if (!pinfo->comment) FatalError("malloc failure in xvpbm.c getint"); +--- 353,359 ---- + *sp++ = '\n'; + *sp = '\0'; + +! if (strlen(cmt) > (size_t) 0) { /* add to pinfo->comment */ + if (!pinfo->comment) { + pinfo->comment = (char *) malloc(strlen(cmt)+1); + if (!pinfo->comment) FatalError("malloc failure in xvpbm.c getint"); +*************** +*** 438,444 **** + *sp++ = '\n'; + *sp = '\0'; + +! if (strlen(cmt) > 0) { /* add to pinfo->comment */ + if (!pinfo->comment) { + pinfo->comment = (char *) malloc(strlen(cmt)+1); + if (!pinfo->comment) FatalError("malloc failure in xvpbm.c getint"); +--- 438,444 ---- + *sp++ = '\n'; + *sp = '\0'; + +! if (strlen(cmt) > (size_t) 0) { /* add to pinfo->comment */ + if (!pinfo->comment) { + pinfo->comment = (char *) malloc(strlen(cmt)+1); + if (!pinfo->comment) FatalError("malloc failure in xvpbm.c getint"); + +diff -c -r ../xv-3.10/xvpcx.c ./xvpcx.c +*** ../xv-3.10/xvpcx.c Thu Dec 22 14:12:20 1994 +--- ./xvpcx.c Tue Jan 10 18:06:37 1995 +*************** +*** 36,44 **** + #define PCX_MAPSTART 0x0c /* Start of appended colormap */ + + +! static int pcxLoadImage PARM((char *, FILE *, byte *, byte *, int, int)); +! static void pcxLoadRaster PARM((FILE *, byte *, int, byte *, int, int)); +! static int pcxError PARM((char *, char *)); + + + +--- 36,45 ---- + #define PCX_MAPSTART 0x0c /* Start of appended colormap */ + + +! static int pcxLoadImage8 PARM((char *, FILE *, PICINFO *, byte *)); +! static int pcxLoadImage24 PARM((char *, FILE *, PICINFO *, byte *)); +! static void pcxLoadRaster PARM((FILE *, byte *, int, byte *, int, int)); +! static int pcxError PARM((char *, char *)); + + + +*************** +*** 52,58 **** + long filesize; + char *bname, *errstr; + byte hdr[128], *image; +! int i, colors, gray; + + pinfo->type = PIC8; + pinfo->pic = (byte *) NULL; +--- 53,59 ---- + long filesize; + char *bname, *errstr; + byte hdr[128], *image; +! int i, colors, gray, fullcolor; + + pinfo->type = PIC8; + pinfo->pic = (byte *) NULL; +*************** +*** 92,97 **** +--- 93,99 ---- + pinfo->w++; pinfo->h++; + + colors = 1 << (hdr[PCX_BPP] * hdr[PCX_PLANES]); ++ fullcolor = (hdr[PCX_BPP] == 8 && hdr[PCX_PLANES] == 3); + + if (DEBUG) { + fprintf(stderr,"PCX: %dx%d image, version=%d, encoding=%d\n", +*************** +*** 102,108 **** + colors); + } + +! if (colors>256) { + fclose(fp); + return pcxError(bname,"No more than 256 colors allowed in PCX file."); + } +--- 104,110 ---- + colors); + } + +! if (colors>256 && !fullcolor) { + fclose(fp); + return pcxError(bname,"No more than 256 colors allowed in PCX file."); + } +*************** +*** 112,134 **** + return pcxError(bname,"Unsupported PCX encoding format."); + } + +! /* note: overallocation to make life easier... */ +! image = (byte *) malloc((size_t) (pinfo->h + 1) * pinfo->w + 16); +! if (!image) FatalError("Can't alloc 'image' in LoadPCX()"); +! +! xvbzero((char *) image, (size_t) ((pinfo->h+1) * pinfo->w + 16)); +! +! if (!pcxLoadImage(bname, fp, image, hdr, pinfo->w, pinfo->h)) { +! free(image); +! fclose(fp); +! return 0; + } + + + if (ferror(fp) | feof(fp)) /* just a warning */ + pcxError(bname, "PCX file appears to be truncated."); + +! if (colors>16) { /* handle trailing colormap */ + while (1) { + i=getc(fp); + if (i==PCX_MAPSTART || i==EOF) break; +--- 114,138 ---- + return pcxError(bname,"Unsupported PCX encoding format."); + } + +! /* load the image, the image function fills in pinfo->pic */ +! if (!fullcolor) { +! if (!pcxLoadImage8(bname, fp, pinfo, hdr)) { +! fclose(fp); +! return 0; +! } + } ++ else { ++ if (!pcxLoadImage24(bname, fp, pinfo, hdr)) { ++ fclose(fp); ++ return 0; ++ } ++ } + + + if (ferror(fp) | feof(fp)) /* just a warning */ + pcxError(bname, "PCX file appears to be truncated."); + +! if (colors>16 && !fullcolor) { /* handle trailing colormap */ + while (1) { + i=getc(fp); + if (i==PCX_MAPSTART || i==EOF) break; +*************** +*** 171,185 **** + /* finally, convert into XV internal format */ + + +! pinfo->pic = image; +! pinfo->type = PIC8; + pinfo->frmType = -1; /* no default format to save in */ + + /* check for grayscaleitude */ +! for (i=0; i<colors; i++) { +! if ((pinfo->r[i] != pinfo->g[i]) || (pinfo->r[i] != pinfo->b[i])) break; + } +- gray = (i==colors) ? 1 : 0; + + + if (colors > 2 || (colors==2 && !gray)) { /* grayscale or PseudoColor */ +--- 175,191 ---- + /* finally, convert into XV internal format */ + + +! pinfo->type = fullcolor ? PIC24 : PIC8; + pinfo->frmType = -1; /* no default format to save in */ + + /* check for grayscaleitude */ +! gray = 0; +! if (!fullcolor) { +! for (i=0; i<colors; i++) { +! if ((pinfo->r[i] != pinfo->g[i]) || (pinfo->r[i] != pinfo->b[i])) break; +! } +! gray = (i==colors) ? 1 : 0; + } + + + if (colors > 2 || (colors==2 && !gray)) { /* grayscale or PseudoColor */ +*************** +*** 205,227 **** + + + /*****************************/ +! static int pcxLoadImage(fname, fp, image, hdr, w, h) +! char *fname; +! FILE *fp; +! byte *image, *hdr; +! int w, h; + { + switch (hdr[PCX_BPP]) { +! case 1: pcxLoadRaster(fp, image, 1, hdr, w, h); break; +! case 8: pcxLoadRaster(fp, image, 8, hdr, w, h); break; + default: + pcxError(fname, "Unsupported # of bits per plane."); + return (0); + } + + return 1; + } + + + + +--- 211,317 ---- + + + /*****************************/ +! static int pcxLoadImage8(fname, fp, pinfo, hdr) +! char *fname; +! FILE *fp; +! PICINFO *pinfo; +! byte *hdr; + { ++ /* load an image with at most 8 bits per pixel */ ++ ++ byte *image; ++ ++ /* note: overallocation to make life easier... */ ++ image = (byte *) malloc((size_t) (pinfo->h + 1) * pinfo->w + 16); ++ if (!image) FatalError("Can't alloc 'image' in pcxLoadImage8()"); ++ ++ xvbzero((char *) image, (size_t) ((pinfo->h+1) * pinfo->w + 16)); ++ + switch (hdr[PCX_BPP]) { +! case 1: pcxLoadRaster(fp, image, 1, hdr, pinfo->w, pinfo->h); break; +! case 8: pcxLoadRaster(fp, image, 8, hdr, pinfo->w, pinfo->h); break; + default: + pcxError(fname, "Unsupported # of bits per plane."); ++ free(image); + return (0); + } + ++ pinfo->pic = image; + return 1; + } + ++ ++ /*****************************/ ++ static int pcxLoadImage24(fname, fp, pinfo, hdr) ++ char *fname; ++ FILE *fp; ++ PICINFO *pinfo; ++ byte *hdr; ++ { ++ byte *pix, *pic24, scale[256]; ++ int c, i, j, w, h, maxv, cnt, planes, bperlin, nbytes; ++ ++ w = pinfo->w; h = pinfo->h; ++ ++ planes = (int) hdr[PCX_PLANES]; ++ bperlin = hdr[PCX_BPRL] + ((int) hdr[PCX_BPRH]<<8); ++ ++ /* allocate 24-bit image */ ++ pic24 = (byte *) malloc((size_t) w*h*planes); ++ if (!pic24) FatalError("couldn't malloc 'pic24'"); ++ ++ xvbzero((char *) pic24, (size_t) w*h*planes); ++ ++ maxv = 0; ++ pix = pinfo->pic = pic24; ++ i = 0; /* planes, in this while loop */ ++ j = 0; /* bytes per line, in this while loop */ ++ nbytes = bperlin*h*planes; ++ ++ while (nbytes > 0 && (c = getc(fp)) != EOF) { ++ if ((c & 0xC0) == 0xC0) { /* have a rep. count */ ++ cnt = c & 0x3F; ++ c = getc(fp); ++ if (c == EOF) { getc(fp); break; } ++ } ++ else cnt = 1; ++ ++ if (c > maxv) maxv = c; ++ ++ while (cnt-- > 0) { ++ if (j < w) { ++ *pix = c; ++ pix += planes; ++ } ++ j++; ++ nbytes--; ++ if (j == bperlin) { ++ j = 0; ++ if (++i < planes) { ++ pix -= (w*planes)-1; /* next plane on this line */ ++ } ++ else { ++ pix -= (planes-1); /* start of next line, first plane */ ++ i = 0; ++ } ++ } ++ } ++ } ++ ++ ++ /* scale all RGB to range 0-255, if they aren't */ ++ ++ if (maxv<255) { ++ for (i=0; i<=maxv; i++) scale[i] = (i * 255) / maxv; ++ ++ for (i=0, pix=pic24; i<h; i++) { ++ if ((i&0x3f)==0) WaitCursor(); ++ for (j=0; j<w*planes; j++, pix++) *pix = scale[*pix]; ++ } ++ } ++ ++ return 1; ++ } + + + +diff -c -r ../xv-3.10/xvpds.c ./xvpds.c +*** ../xv-3.10/xvpds.c Thu Dec 22 14:12:17 1994 +--- ./xvpds.c Tue Jan 03 16:25:52 1995 +*************** +*** 513,519 **** + } else if ((sscanf(scanbuff," EXPOSURE_DURATION = %s", exposure) == 1) + || (sscanf(scanbuff," INSTRUMENT_EXPOSURE_DURATION = %s", + exposure) == 1)) { +! tmptmp = index(scanbuff,'='); + tmptmp++; + while((*tmptmp) == ' ') + tmptmp++; +--- 513,519 ---- + } else if ((sscanf(scanbuff," EXPOSURE_DURATION = %s", exposure) == 1) + || (sscanf(scanbuff," INSTRUMENT_EXPOSURE_DURATION = %s", + exposure) == 1)) { +! tmptmp = (char *) index(scanbuff,'='); + tmptmp++; + while((*tmptmp) == ' ') + tmptmp++; +*************** +*** 521,527 **** + lastwasinote=FALSE; continue; + + } else if (sscanf(scanbuff, "NOTE = %s", inote) == 1) { +! tmptmp = index(scanbuff,'='); tmptmp++; + while (((*tmptmp) == ' ') || ((*tmptmp) == '"')) tmptmp++; + strcpy(inote,tmptmp); + strcat(inote," "); +--- 521,527 ---- + lastwasinote=FALSE; continue; + + } else if (sscanf(scanbuff, "NOTE = %s", inote) == 1) { +! tmptmp = (char *) index(scanbuff,'='); tmptmp++; + while (((*tmptmp) == ' ') || ((*tmptmp) == '"')) tmptmp++; + strcpy(inote,tmptmp); + strcat(inote," "); +*************** +*** 884,892 **** + + /* check whether histogram file exists */ + #ifdef VMS +! c = rindex(strcpy(name, (c = rindex(fname, ':')) ? c+1 : fname), ']'); + #else +! c = rindex(strcpy(name, fname), '/'); + #endif /* VMS */ + (void)strcpy(c ? c+1 : name, "hist.tab"); + +--- 884,894 ---- + + /* check whether histogram file exists */ + #ifdef VMS +! c = (char *) rindex(strcpy(name, +! (c = (char *) rindex(fname, ':')) ? c+1 : fname), +! ']'); + #else +! c = (char *) rindex(strcpy(name, fname), '/'); + #endif /* VMS */ + (void)strcpy(c ? c+1 : name, "hist.tab"); + +*************** +*** 979,987 **** + int i, n, r, g, b; + + #ifdef VMS +! c = rindex(strcpy(name, (c = rindex(fname, ':')) ? c+1 : fname), ']'); + #else +! c = rindex(strcpy(name, fname), '/'); + #endif /* VMS */ + (void)strcpy(c ? c+1 : name, "palette.tab"); + +--- 981,991 ---- + int i, n, r, g, b; + + #ifdef VMS +! c = (char *) rindex(strcpy(name, +! (c = (char *) rindex(fname, ':')) ? c+1 : fname), +! ']'); + #else +! c = (char *) rindex(strcpy(name, fname), '/'); + #endif /* VMS */ + (void)strcpy(c ? c+1 : name, "palette.tab"); + +diff -c -r ../xv-3.10/xvpictoppm.c ./xvpictoppm.c +*** ../xv-3.10/xvpictoppm.c Thu Dec 22 14:12:24 1994 +--- ./xvpictoppm.c Fri Jan 13 14:57:14 1995 +*************** +*** 124,132 **** + + /* convert icon from 332 to 24-bit image */ + for (i=0, ip=icon8, pp=pic24; i<w*h; i++, ip++, pp+=3) { +! pp[0] = (((*ip >> 5) & 0x07) * 255) / 7; +! pp[1] = (((*ip >> 2) & 0x07) * 255) / 7; +! pp[2] = (((*ip >> 0) & 0x03) * 255) / 3; + } + + free(icon8); +--- 124,132 ---- + + /* convert icon from 332 to 24-bit image */ + for (i=0, ip=icon8, pp=pic24; i<w*h; i++, ip++, pp+=3) { +! pp[0] = ( ((int) ((*ip >> 5) & 0x07)) * 255) / 7; +! pp[1] = ( ((int) ((*ip >> 2) & 0x07)) * 255) / 7; +! pp[2] = ( ((int) ((*ip >> 0) & 0x03)) * 255) / 3; + } + + free(icon8); + +diff -c -r ../xv-3.10/xvpopup.c ./xvpopup.c +*** ../xv-3.10/xvpopup.c Thu Dec 22 14:12:16 1994 +--- ./xvpopup.c Thu Jan 19 13:09:31 1995 +*************** +*** 150,161 **** + if (wy + h > dispHIGH) wy = dispHIGH - h; + } + +! /* wx -= (p_offx + ch_offx); +! wy -= (p_offy + ch_offy); */ + +- wx -= (ch_offx); +- wy -= (ch_offy); +- + if (!XGetNormalHints(theDisp, win, &hints)) hints.flags = 0; + hints.width = hints.min_width = hints.max_width = w; + hints.height = hints.min_height = hints.max_height = h; +--- 150,165 ---- + if (wy + h > dispHIGH) wy = dispHIGH - h; + } + +! +! if (winCtrPosKludge) { +! wx -= (p_offx + ch_offx); +! wy -= (p_offy + ch_offy); +! } +! else { +! wx -= (ch_offx); +! wy -= (ch_offy); +! } + + if (!XGetNormalHints(theDisp, win, &hints)) hints.flags = 0; + hints.width = hints.min_width = hints.max_width = w; + hints.height = hints.min_height = hints.max_height = h; +*************** +*** 249,255 **** + + if (poptyp == ISGRAB) { + BTSetActive(&bts[0], (int) strlen(gsBuf)); +! BTSetActive(&bts[1], (strlen(gsBuf)>0 && atoi(gsBuf)>0)); + } + else if (poptyp == ISPAD) { + BTSetActive(&bts[0], (int) strlen(gsBuf)); +--- 253,259 ---- + + if (poptyp == ISGRAB) { + BTSetActive(&bts[0], (int) strlen(gsBuf)); +! BTSetActive(&bts[1], (strlen(gsBuf)>(size_t)0 && atoi(gsBuf)>(size_t)0)); + } + else if (poptyp == ISPAD) { + BTSetActive(&bts[0], (int) strlen(gsBuf)); +*************** +*** 350,356 **** + gsx = 10 + icon_width + 20; + gsy = 10+(PUHIGH-30-BUTTH-gsh)/2; + +! if (strlen(txt) > 60) + gsy = PUHIGH - 10 - BUTTH - 10 - gsh - 20; + + gsw = PUWIDE - gsx - 10; +--- 354,360 ---- + gsx = 10 + icon_width + 20; + gsy = 10+(PUHIGH-30-BUTTH-gsh)/2; + +! if (strlen(txt) > (size_t) 60) + gsy = PUHIGH - 10 - BUTTH - 10 - gsh - 20; + + gsw = PUWIDE - gsx - 10; +*************** +*** 558,564 **** + strncpy(nams[*lenp], vals[*lenp], (size_t) 31); + } + +! if (strlen(nams[*lenp]) > 20) { /* fix long names */ + char *sp = nams[*lenp] + 18; + *sp++ = '.'; *sp++ = '.'; *sp++ = '.'; *sp++ = '\0'; + } +--- 562,568 ---- + strncpy(nams[*lenp], vals[*lenp], (size_t) 31); + } + +! if (strlen(nams[*lenp]) > (size_t) 20) { /* fix long names */ + char *sp = nams[*lenp] + 18; + *sp++ = '.'; *sp++ = '.'; *sp++ = '.'; *sp++ = '\0'; + } +*************** +*** 1154,1166 **** + /* if we have a string of any sort, turn on the default '\n' button + (if there is one) */ + for (i=0; i<nbts && accel[i]!='\n'; i++); +! if (i<nbts) BTSetActive(&bts[i], strlen(gsBuf)>0); + } + else if (popUp == ISGRAB) { + /* need a string of length 1 to enable Grab (bts[0]), and a string + with an atoi() of at least '1' to enable AutoGrab (bts[1]) */ +! BTSetActive(&bts[0], strlen(gsBuf)>0); +! BTSetActive(&bts[1], (strlen(gsBuf)>0 && atoi(gsBuf)>0)); + } + + return(0); +--- 1158,1170 ---- + /* if we have a string of any sort, turn on the default '\n' button + (if there is one) */ + for (i=0; i<nbts && accel[i]!='\n'; i++); +! if (i<nbts) BTSetActive(&bts[i], (strlen(gsBuf) > (size_t) 0)); + } + else if (popUp == ISGRAB) { + /* need a string of length 1 to enable Grab (bts[0]), and a string + with an atoi() of at least '1' to enable AutoGrab (bts[1]) */ +! BTSetActive(&bts[0], (strlen(gsBuf) > (size_t) 0)); +! BTSetActive(&bts[1], (strlen(gsBuf)>(size_t)0 && atoi(gsBuf)>(size_t)0)); + } + + return(0); +*************** +*** 1219,1225 **** + XDrawLine(theDisp, popW, theGC, gsx+3, gsy+1, gsx+3, gsy + gsh-1); + } + +! if (gsEnPos<strlen(gsBuf)) { /* draw a "there's more over here" doowah */ + XDrawLine(theDisp, popW, theGC, gsx+gsw-3, gsy+1, gsx+gsw-3, gsy+gsh-1); + XDrawLine(theDisp, popW, theGC, gsx+gsw-2, gsy+1, gsx+gsw-2, gsy+gsh-1); + XDrawLine(theDisp, popW, theGC, gsx+gsw-1, gsy+1, gsx+gsw-1, gsy+gsh-1); +--- 1223,1230 ---- + XDrawLine(theDisp, popW, theGC, gsx+3, gsy+1, gsx+3, gsy + gsh-1); + } + +! if ((size_t) gsEnPos < strlen(gsBuf)) { +! /* draw a "there's more over here" doowah */ + XDrawLine(theDisp, popW, theGC, gsx+gsw-3, gsy+1, gsx+gsw-3, gsy+gsh-1); + XDrawLine(theDisp, popW, theGC, gsx+gsw-2, gsy+1, gsx+gsw-2, gsy+gsh-1); + XDrawLine(theDisp, popW, theGC, gsx+gsw-1, gsy+1, gsx+gsw-1, gsy+gsh-1); + +diff -c -r ../xv-3.10/xvrle.c ./xvrle.c +*** ../xv-3.10/xvrle.c Thu Dec 22 14:12:22 1994 +--- ./xvrle.c Thu Jan 19 12:27:47 1995 +*************** +*** 257,263 **** + + if (ncolors == 1) { /* grayscale or PseudoColor */ + pinfo->type = PIC8; +! if (ncmap == 1) { + pinfo->colType = F_GREYSCALE; + sprintf(pinfo->fullInfo, "Greyscale RLE. (%ld bytes)", filesize); + for (i=0; i<256; i++) +--- 257,263 ---- + + if (ncolors == 1) { /* grayscale or PseudoColor */ + pinfo->type = PIC8; +! if (ncmap == 0 || ncmap == 1) { /* grey, or grey with gamma curve */ + pinfo->colType = F_GREYSCALE; + sprintf(pinfo->fullInfo, "Greyscale RLE. (%ld bytes)", filesize); + for (i=0; i<256; i++) + +diff -c -r ../xv-3.10/xvtext.c ./xvtext.c +*** ../xv-3.10/xvtext.c Thu Dec 22 14:12:20 1994 +--- ./xvtext.c Fri Jan 13 18:46:28 1995 +*************** +*** 1220,1226 **** + LC("the xv distribution. Do *not* send mail unless absolutely necessary"); + LC("(ie, you don't have ftp capability)."); + LC(""); +! LC("Note: The documentation ('xvdocs.ps') may be installed in '/usr/local'."); + LC(""); + LC("If you're viewing this information via the 'About XV' command, and"); + LC("you'd like to print it out, a copy of this info can be found in the "); +--- 1220,1226 ---- + LC("the xv distribution. Do *not* send mail unless absolutely necessary"); + LC("(ie, you don't have ftp capability)."); + LC(""); +! LC("Note: The docs (xvdocs.ps) may be installed in '/usr/local/lib'."); + LC(""); + LC("If you're viewing this information via the 'About XV' command, and"); + LC("you'd like to print it out, a copy of this info can be found in the "); + +diff -c -r ../xv-3.10/xvtiff.c ./xvtiff.c +*** ../xv-3.10/xvtiff.c Thu Dec 22 14:12:20 1994 +--- ./xvtiff.c Fri Jan 13 14:53:34 1995 +*************** +*** 120,126 **** + desc = (char *) NULL; + + TIFFGetField(tif, TIFFTAG_IMAGEDESCRIPTION, &desc); +! if (desc && strlen(desc)>0) { + /* kludge: tiff library seems to return bizarre comments */ + if (strlen(desc)==4 && strcmp(desc, "\367\377\353\370")==0) {} + else { +--- 120,126 ---- + desc = (char *) NULL; + + TIFFGetField(tif, TIFFTAG_IMAGEDESCRIPTION, &desc); +! if (desc && strlen(desc) > (size_t) 0) { + /* kludge: tiff library seems to return bizarre comments */ + if (strlen(desc)==4 && strcmp(desc, "\367\377\353\370")==0) {} + else { +*************** +*** 1381,1388 **** + } + } + +! /* #define Code2V(c, RB, RW, CR) ((((c)-(int)RB)*(float)CR)/(float)(RW-RB)) */ +! #define Code2V(c, RB, RW, CR) ((((c)-RB)*(float)CR)/(float)(RW-RB)) + + #define CLAMP(f,min,max) \ + (int)((f)+.5 < (min) ? (min) : (f)+.5 > (max) ? (max) : (f)+.5) +--- 1381,1387 ---- + } + } + +! #define Code2V(c, RB, RW, CR) ((((c)-(int)RB)*(float)CR)/(float)(RW-RB)) + + #define CLAMP(f,min,max) \ + (int)((f)+.5 < (min) ? (min) : (f)+.5 > (max) ? (max) : (f)+.5) + +diff -c -r ../xv-3.10/xvtiffwr.c ./xvtiffwr.c +*** ../xv-3.10/xvtiffwr.c Thu Dec 22 14:12:20 1994 +--- ./xvtiffwr.c Tue Jan 03 16:28:13 1995 +*************** +*** 70,76 **** + TIFFSetField(tif, TIFFTAG_IMAGELENGTH, h); + TIFFSetField(tif, TIFFTAG_COMPRESSION, comp); + +! if (comment && strlen(comment)>0) { + TIFFSetField(tif, TIFFTAG_IMAGEDESCRIPTION, comment); + } + +--- 70,76 ---- + TIFFSetField(tif, TIFFTAG_IMAGELENGTH, h); + TIFFSetField(tif, TIFFTAG_COMPRESSION, comp); + +! if (comment && strlen(comment) > (size_t) 0) { + TIFFSetField(tif, TIFFTAG_IMAGEDESCRIPTION, comment); + } + +diff -c -r ../xv-3.10/bits/font5x9.h ./bits/font5x9.h +*** ../xv-3.10/bits/font5x9.h Thu Dec 22 14:12:58 1994 +--- ./bits/font5x9.h Tue Jan 03 15:18:06 1995 +*************** +*** 21,27 **** + {0x0e, 0x11, 0x19, 0x15, 0x13, 0x11, 0x0e, 0x00, 0x00}, /* 0 */ + {0x04, 0x06, 0x05, 0x04, 0x04, 0x04, 0x1f, 0x00, 0x00}, /* 1 */ + {0x0e, 0x11, 0x10, 0x0c, 0x02, 0x01, 0x1f, 0x00, 0x00}, /* 2 */ +! {0x0e, 0x11, 0x10, 0x0c, 0x02, 0x01, 0x1f, 0x00, 0x00}, /* 3 */ + {0x09, 0x09, 0x09, 0x1f, 0x08, 0x08, 0x08, 0x00, 0x00}, /* 4 */ + {0x1f, 0x01, 0x01, 0x0f, 0x10, 0x10, 0x0f, 0x00, 0x00}, /* 5 */ + {0x0e, 0x01, 0x01, 0x0f, 0x11, 0x11, 0x0e, 0x00, 0x00}, /* 6 */ +--- 21,27 ---- + {0x0e, 0x11, 0x19, 0x15, 0x13, 0x11, 0x0e, 0x00, 0x00}, /* 0 */ + {0x04, 0x06, 0x05, 0x04, 0x04, 0x04, 0x1f, 0x00, 0x00}, /* 1 */ + {0x0e, 0x11, 0x10, 0x0c, 0x02, 0x01, 0x1f, 0x00, 0x00}, /* 2 */ +! {0x0f, 0x10, 0x10, 0x0e, 0x10, 0x10, 0x0f, 0x00, 0x00}, /* 3 */ + {0x09, 0x09, 0x09, 0x1f, 0x08, 0x08, 0x08, 0x00, 0x00}, /* 4 */ + {0x1f, 0x01, 0x01, 0x0f, 0x10, 0x10, 0x0f, 0x00, 0x00}, /* 5 */ + {0x0e, 0x01, 0x01, 0x0f, 0x11, 0x11, 0x0e, 0x00, 0x00}, /* 6 */ +*************** +*** 51,57 **** + {0x11, 0x13, 0x13, 0x15, 0x19, 0x19, 0x11, 0x00, 0x00}, /* N */ + {0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00, 0x00}, /* O */ + {0x0f, 0x11, 0x11, 0x0f, 0x01, 0x01, 0x01, 0x00, 0x00}, /* P */ +! {0x0f, 0x11, 0x11, 0x0f, 0x01, 0x01, 0x01, 0x00, 0x00}, /* Q */ + {0x0f, 0x11, 0x11, 0x0f, 0x05, 0x09, 0x11, 0x00, 0x00}, /* R */ + {0x0e, 0x11, 0x01, 0x0e, 0x10, 0x11, 0x0e, 0x00, 0x00}, /* S */ + {0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00}, /* T */ +--- 51,57 ---- + {0x11, 0x13, 0x13, 0x15, 0x19, 0x19, 0x11, 0x00, 0x00}, /* N */ + {0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00, 0x00}, /* O */ + {0x0f, 0x11, 0x11, 0x0f, 0x01, 0x01, 0x01, 0x00, 0x00}, /* P */ +! {0x0e, 0x11, 0x11, 0x11, 0x11, 0x15, 0x0e, 0x18, 0x00}, /* Q */ + {0x0f, 0x11, 0x11, 0x0f, 0x05, 0x09, 0x11, 0x00, 0x00}, /* R */ + {0x0e, 0x11, 0x01, 0x0e, 0x10, 0x11, 0x0e, 0x00, 0x00}, /* S */ + {0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00}, /* T */ + +diff -c -r ../xv-3.10/bits/xv_rev ./bits/xv_rev +*** ../xv-3.10/bits/xv_rev Thu Dec 22 14:12:54 1994 +--- ./bits/xv_rev Fri Jan 13 17:37:10 1995 +*************** +*** 11,29 **** + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +! 0x00, 0x00, 0xa0, 0x03, 0x00, 0x04, 0x10, 0x00, 0x00, 0x20, 0x3c, 0x10, +! 0xe1, 0x41, 0x3c, 0x10, 0x01, 0x00, 0x20, 0x60, 0x04, 0x00, 0x04, 0x10, +! 0x00, 0x00, 0x30, 0x42, 0x90, 0x11, 0x42, 0x42, 0x18, 0x01, 0x00, 0xa0, +! 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x41, 0x48, 0x09, 0x20, + 0x41, 0x14, 0x01, 0xc7, 0x7b, 0xe0, 0x80, 0x09, 0xc5, 0x13, 0x27, 0x13, +! 0x20, 0x20, 0x08, 0x89, 0x23, 0x71, 0x14, 0x81, 0x28, 0x23, 0x60, 0x60, +! 0x8a, 0x24, 0x93, 0xe8, 0x12, 0x20, 0x10, 0x04, 0x65, 0x14, 0x4e, 0x12, +! 0x01, 0xae, 0x24, 0xa0, 0xe0, 0x51, 0xa4, 0x54, 0x28, 0x02, 0x20, 0x0c, +! 0x04, 0x15, 0x14, 0x40, 0x79, 0x81, 0x49, 0x24, 0x21, 0x11, 0x50, 0x44, +! 0x54, 0x28, 0x02, 0x20, 0x02, 0x04, 0x09, 0x92, 0xa0, 0x16, 0x5d, 0x0c, +! 0xa2, 0x20, 0x16, 0x23, 0x04, 0x52, 0x24, 0x12, 0x20, 0x41, 0x02, 0x09, +! 0x89, 0x11, 0x10, 0x83, 0xeb, 0x61, 0x20, 0xe8, 0x20, 0xe4, 0x91, 0x23, +! 0x12, 0x20, 0x7f, 0x02, 0xf1, 0x08, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +--- 11,29 ---- + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +! 0x00, 0x00, 0xa0, 0x03, 0x00, 0x04, 0x10, 0x00, 0x00, 0x84, 0x07, 0xf1, +! 0xe0, 0x41, 0x3c, 0x10, 0x01, 0x00, 0x20, 0x60, 0x04, 0x00, 0x04, 0x10, +! 0x00, 0x00, 0x46, 0x08, 0x09, 0x11, 0x42, 0x42, 0x18, 0x01, 0x00, 0xa0, +! 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x88, 0x04, 0x09, 0x22, + 0x41, 0x14, 0x01, 0xc7, 0x7b, 0xe0, 0x80, 0x09, 0xc5, 0x13, 0x27, 0x13, +! 0x04, 0x84, 0x80, 0x88, 0x23, 0x71, 0x14, 0x81, 0x28, 0x23, 0x60, 0x60, +! 0x8a, 0x24, 0x93, 0xe8, 0x12, 0x04, 0x42, 0x40, 0x70, 0x12, 0x4e, 0x12, +! 0x01, 0xae, 0x24, 0xa0, 0xe0, 0x51, 0xa4, 0x54, 0x28, 0x02, 0x84, 0x41, +! 0x30, 0x00, 0x12, 0x40, 0x79, 0x81, 0x49, 0x24, 0x21, 0x11, 0x50, 0x44, +! 0x54, 0x28, 0x02, 0x44, 0x40, 0x08, 0x04, 0x91, 0xa0, 0x16, 0x5d, 0x0c, +! 0xa2, 0x20, 0x16, 0x23, 0x04, 0x52, 0x24, 0x12, 0x24, 0x28, 0x04, 0x8d, +! 0x88, 0x11, 0x10, 0x83, 0xeb, 0x61, 0x20, 0xe8, 0x20, 0xe4, 0x91, 0x23, +! 0x12, 0xe4, 0x2f, 0xfc, 0x71, 0x08, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + +diff -c -r ../xv-3.10/bits/xv_ver ./bits/xv_ver +*** ../xv-3.10/bits/xv_ver Thu Dec 22 14:12:58 1994 +--- ./bits/xv_ver Fri Jan 13 17:34:48 1995 +*************** +*** 6,20 **** + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, +! 0x00, 0x08, 0x00, 0x80, 0x1f, 0x04, 0x07, 0x00, 0x82, 0x00, 0x00, 0x08, +! 0x00, 0x80, 0x08, 0x86, 0x08, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, +! 0x04, 0x45, 0x10, 0x00, 0x24, 0x98, 0xe4, 0x89, 0x23, 0x03, 0x1c, 0x24, +! 0x10, 0x00, 0x24, 0xa6, 0x97, 0x49, 0xe4, 0x02, 0x23, 0x24, 0x10, 0x00, +! 0x14, 0x9e, 0x50, 0x2a, 0x24, 0x02, 0x20, 0x24, 0x10, 0x00, 0x18, 0x81, +! 0x20, 0x2a, 0x24, 0x42, 0x20, 0x24, 0x08, 0x00, 0x08, 0xb1, 0x00, 0x29, +! 0x22, 0x42, 0x98, 0x24, 0x06, 0x00, 0x08, 0x8e, 0xf0, 0xc8, 0x21, 0x82, +! 0x87, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +--- 6,20 ---- + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, +! 0x00, 0x02, 0x00, 0xe0, 0x07, 0xc1, 0x01, 0x00, 0x41, 0x00, 0x00, 0x02, +! 0x00, 0x20, 0x82, 0x21, 0x02, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, +! 0x41, 0x11, 0x04, 0x00, 0x12, 0x26, 0x79, 0xe2, 0xc8, 0x00, 0x07, 0x09, +! 0xc4, 0x01, 0x92, 0xe9, 0x65, 0x12, 0xb9, 0xc0, 0x08, 0x09, 0x24, 0x02, +! 0x8a, 0x27, 0x94, 0x0a, 0x89, 0x00, 0x08, 0x09, 0x84, 0x03, 0x4c, 0x20, +! 0x88, 0x0a, 0x89, 0x10, 0x08, 0x09, 0x62, 0x02, 0x44, 0x2c, 0x40, 0x8a, +! 0x88, 0x10, 0x26, 0x89, 0x11, 0x03, 0x84, 0x23, 0x3c, 0x72, 0x88, 0xe0, +! 0x21, 0x71, 0xe0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + +diff -c -r ../xv-3.10/tiff/tif_fax3.c ./tiff/tif_fax3.c +*** ../xv-3.10/tiff/tif_fax3.c Thu Dec 22 14:12:41 1994 +--- ./tiff/tif_fax3.c Fri Dec 23 17:39:28 1994 +*************** +*** 370,376 **** + * Decode a code and return the associated run length. + */ + static int32 +! decode_run(TIFF* tif, const u_short fsm[][256]) + { + Fax3DecodeState *sp = (Fax3DecodeState *)tif->tif_data; + int state = sp->b.bit; +--- 370,376 ---- + * Decode a code and return the associated run length. + */ + static int32 +! decode_run(TIFF* tif, /*const*/ u_short fsm[][256]) + { + Fax3DecodeState *sp = (Fax3DecodeState *)tif->tif_data; + int state = sp->b.bit; + +diff -c -r ../xv-3.10/tiff/tiffcomp.h ./tiff/tiffcomp.h +*** ../xv-3.10/tiff/tiffcomp.h Thu Dec 22 14:12:42 1994 +--- ./tiff/tiffcomp.h Thu Jan 19 12:47:56 1995 +*************** +*** 67,72 **** +--- 67,76 ---- + #endif + #endif + ++ #ifdef isc ++ #define BSDTYPES ++ #endif ++ + /* + * Workarounds for BSD lseek definitions. + */ + +diff -c -r ../xv-3.10/vms/Makefile.mms ./vms/Makefile.mms +*** ../xv-3.10/vms/Makefile.mms Thu Dec 22 14:12:37 1994 +--- ./vms/Makefile.mms Sun Dec 25 03:21:22 1994 +*************** +*** 11,30 **** + # 15-APR-1993 for v3.00 (DEC C changes) + # 25-MAY-1993 merged ALPHA.MMS and MAKEFILE.MMS + # 27-APR-1994 for v3.01 +! # 6-DEC-1994 for v3.10 + # + # Modeled after the original Unix Makefile for xv + # Most of the Unix comments have been left intact to help debug any + # problems. + +- #******** +- # +- # REQUIRED USER EDIT POINT!!!!!!!!!!! +- # You must put in the correct place where the root of this XV +- # directory is located +- # +- #******** +- XVDIR = [XV-3_10] + + # BE SURE TO SET THIS TO YOUR SITE'S DESTINATION DIRECTORY...!!! + BINDIR = Sys$Disk:[] +--- 11,22 ---- + # 15-APR-1993 for v3.00 (DEC C changes) + # 25-MAY-1993 merged ALPHA.MMS and MAKEFILE.MMS + # 27-APR-1994 for v3.01 +! # 23-DEC-1994 for v3.10 + # + # Modeled after the original Unix Makefile for xv + # Most of the Unix comments have been left intact to help debug any + # problems. + + + # BE SURE TO SET THIS TO YOUR SITE'S DESTINATION DIRECTORY...!!! + BINDIR = Sys$Disk:[] +*************** +*** 57,64 **** + # VMS MMS USERS!!! + # + # if you don't use the JPEG package as supplied with XV, you +! # will need fill in the complete directory specifications for +! # BOTH JPEGDIR and XVDIR!! + # + JPEG = ,HAVE_JPEG + JPEGDIR = [.JPEG] +--- 49,55 ---- + # VMS MMS USERS!!! + # + # if you don't use the JPEG package as supplied with XV, you +! # will need fill in the complete directory specifications for JPEGDIR. + # + JPEG = ,HAVE_JPEG + JPEGDIR = [.JPEG] +*************** +*** 72,79 **** + # Also, comment out the LIBTIFF dependancy at the end of this Makefile + # + # if you don't use the TIFF package as supplied with XV, you +! # will need to fill in the complete directory specifications for +! # BOTH TIFFDIR and XVDIR!! + # + TIFF = ,HAVE_TIFF + TIFFDIR = [.TIFF] +--- 63,69 ---- + # Also, comment out the LIBTIFF dependancy at the end of this Makefile + # + # if you don't use the TIFF package as supplied with XV, you +! # will need to fill in the complete directory specifications for TIFFDIR. + # + TIFF = ,HAVE_TIFF + TIFFDIR = [.TIFF] +*************** +*** 135,145 **** + @- Define /NoLog Sys DECC$Library_Include + .else + .ifdef DECC +! × @- Define /NoLog Sys DECC$Library_Include + .else + @- Define /NoLog Sys Sys$Library + .endif + @- Define /NoLog X11 DECW$Include + .endif + + all : $(BITS) $(OPTS) lib xv bggen decompress xcmap xvpictoppm help +--- 125,136 ---- + @- Define /NoLog Sys DECC$Library_Include + .else + .ifdef DECC +! @- Define /NoLog Sys DECC$Library_Include + .else + @- Define /NoLog Sys Sys$Library + .endif + @- Define /NoLog X11 DECW$Include ++ @- XVDIR = F$Environment ("Default") + .endif + + all : $(BITS) $(OPTS) lib xv bggen decompress xcmap xvpictoppm help +*************** +*** 181,204 **** + $(JPEGLIB) : + Set Default $(JPEGDIR) + .ifdef ALPHA +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.$(MMS) /Macro = "ALPHA = 1" LIBJPEG.OLB + .else +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.$(MMS) LIBJPEG.OLB + .endif +! Set Default $(XVDIR) + + $(TIFFLIB) : + Set Default $(TIFFDIR) + .ifdef ALPHA +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.$(MMS) /Macro = "ALPHA = 1" LIBTIFF.OLB + .else + .ifdef DECC +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.$(MMS) /Macro = "ALPHA = 1" LIBTIFF.OLB + .else +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.$(MMS) LIBTIFF.OLB + .endif + .endif +! Set Default $(XVDIR) + + $(XVLIB) : $(OBJS) + If "''F$Search ("$(XVLIB)")'" .eqs. "" Then Library /Create $(XVLIB) +--- 172,195 ---- + $(JPEGLIB) : + Set Default $(JPEGDIR) + .ifdef ALPHA +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS /Macro = "ALPHA = 1" LIBJPEG.OLB + .else +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS LIBJPEG.OLB + .endif +! Set Default 'XVDIR' + + $(TIFFLIB) : + Set Default $(TIFFDIR) + .ifdef ALPHA +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS /Macro = "ALPHA = 1" LIBTIFF.OLB + .else + .ifdef DECC +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS /Macro = "ALPHA = 1" LIBTIFF.OLB + .else +! $(MMS) $(MMSDEFAULTS) /Description = MAKEFILE.MMS LIBTIFF.OLB + .endif + .endif +! Set Default 'XVDIR' + + $(XVLIB) : $(OBJS) + If "''F$Search ("$(XVLIB)")'" .eqs. "" Then Library /Create $(XVLIB) +*************** +*** 273,280 **** + - Delete /NoConfirm /NoLog *.obj;*,*.exe;*,*.log;*,*.olb;*,*.hlb;* + - Purge /NoConfirm /NoLog + Set Default [.JPEG] +! $(MMS) /Description = MAKEFILE.$(MMS) clean + - Delete /NoConfirm /NoLog *.olb;* + Set Default [-.TIFF] +! $(MMS) /Description = MAKEFILE.$(MMS) clean + Set Default [-] +--- 264,271 ---- + - Delete /NoConfirm /NoLog *.obj;*,*.exe;*,*.log;*,*.olb;*,*.hlb;* + - Purge /NoConfirm /NoLog + Set Default [.JPEG] +! $(MMS) /Description = MAKEFILE.MMS clean + - Delete /NoConfirm /NoLog *.olb;* + Set Default [-.TIFF] +! $(MMS) /Description = MAKEFILE.MMS clean + Set Default [-] + +diff -c -r ../xv-3.10/vms/README.vms ./vms/README.vms +*** ../xv-3.10/vms/README.vms Thu Dec 22 14:12:37 1994 +--- ./vms/README.vms Sun Dec 25 03:21:22 1994 +*************** +*** 1,9 **** +! 6-Dec-1994 + +! First, read the release notes for the Unix version of XV as well +! as these. You can ignore the Unix specific comments, but there are +! references to the config.h file for local configurations and general +! use of the program that are relevant to VMS users as well. + + Release notes for building XV (v3.10) on a VMS platform. This + includes the newer ALPHA/VMS machines. As in the previous release, +--- 1,10 ---- +! 23-DEC-1994 + +! First, read the various INSTALL and README files for the Unix +! version of XV as well as these. You can ignore the Unix specific +! comments, but there are references to the config.h file for local +! configurations and general use of the program that are relevant to +! VMS users as well. + + Release notes for building XV (v3.10) on a VMS platform. This + includes the newer ALPHA/VMS machines. As in the previous release, +*************** +*** 24,42 **** + + SETUP.COM + A simple command procedure to setup the final compiled XV +! package of programs. It can be executed by itself or used with +! many of the commonly available SETUP packages (i.e., the +! FERMILAB version). If it is kept in the same directory as the +! binaries, it will be able to get the necessary symbols setup +! anywhere the directory structure is located WITHOUT the need to +! edit the command procedure. Move them all around together and +! you will be OK. + + MAKEFILE.MMS (in the top level directory) +! This is a MMS description file for the VMS MMS utility. YOU +! SHOULD EDIT THE FILE FIRST TO MAKE SURE THE CUSTOMIZING FEATURES +! ARE APPROPRIATE FOR YOUR SYSTEM. For users without MMS you will +! need to use MAKE_XV.COM instead. + + Installation Instructions: + +--- 25,48 ---- + + SETUP.COM + A simple command procedure to setup the final compiled XV +! package of programs. It helps the aux programs of XV be found +! by DCL foreign symbols. If you don't want to use the names I +! have chosen for them, you should be able to alter the CONFIG.H +! file to point to the names you want to use instead. This has +! not been tested by me, so let me know if you try this. It +! should work! :) It can be executed by itself or used with many +! of the commonly available SETUP packages (i.e., the FERMILAB +! version). If it is kept in the same directory as the binaries, +! it will be able to get the necessary symbols setup anywhere the +! directory structure is located WITHOUT the need to edit the +! command procedure. Move them all around together and you will +! be OK. + + MAKEFILE.MMS (in the top level directory) +! This is a description file for the VMS MMS (or the PD MMK) +! utility. YOU SHOULD BROWSE THE FILE FIRST TO MAKE SURE THE +! CUSTOMIZING FEATURES ARE APPROPRIATE FOR YOUR SYSTEM. For users +! without MMS (MMK) you will need to use MAKE_XV.COM instead. + + Installation Instructions: + +*************** +*** 100,114 **** + to resolve first!!! Note specifically the references to JPEG + and TIFF. This is also true for the MAKEFILE.MMS in the JPEG + sub-directory and the MAKEFILE.MMS file in the TIFF +! sub-directory. Also check the top-level directory name at the +! top of the MMS file. You have to put in your local choice of +! name. (I was lazy in not trying to autodetect it, sorry.) +! + +! EXCEPT for the destination of the binaries, root of the +! directory tree, and X11 Window interface, I *think* it should +! work for everyone without any modifications. (famous last +! words...) + + When you are satisfied that everything is correct for your + site, just type +--- 106,116 ---- + to resolve first!!! Note specifically the references to JPEG + and TIFF. This is also true for the MAKEFILE.MMS in the JPEG + sub-directory and the MAKEFILE.MMS file in the TIFF +! sub-directory. + +! EXCEPT for the destination of the binaries, and X11 Window +! interface, I *think* it should work for everyone without any +! modifications. (famous last words...) + + When you are satisfied that everything is correct for your + site, just type + +diff -c -r ../xv-3.10/vms/tiff.patches ./vms/tiff.patches +*** ../xv-3.10/vms/tiff.patches Thu Dec 22 14:12:38 1994 +--- ./vms/tiff.patches Thu Jan 19 12:47:14 1995 +*************** +*** 5,10 **** +--- 5,11 ---- + In tiff/Makefile.hpux, you need to add -D_HPUX_SOURCE to CFLAGS. + Otherwise libtiff won't build under gcc or strict-ANSI cc. + ++ In tiff/tiffcomp.h, add '#ifdef isc ... #define BSDTYPES ... #endif' + + Index: tiff/Makefile.mms + *** /dev/null Wed Dec 14 08:22:27 1994 + + +*** /dev/null Mon Jan 23 20:08:17 1995 +--- BUGS Thu Jan 19 13:10:07 1995 +*************** +*** 0 **** +--- 1,21 ---- ++ DOCS: ++ File docs/xvdoc.ps has an error in the banner for page 2. The page title is ++ "Section 2: The Image Window" when it should be "Section 1: Overview". ++ ++ Add mention of '-pkludge' and 'popupKludge' ++ ++ Hall of Fame: Lester Ingber should be 'ingber@alumni.caltech.edu' ++ ++ ++ From: James Ralston Crawford (qralston+@pitt.edu) ++ When deleting files in 'xv controls' window, it should also delete ++ thumbnail file, if any ++ ++ ++ From: Mitchell Blank Jr <blankm@cae.wisc.edu> ++ (try an use schnauzer in /usr/feh/foo, where feh is rwx--x--x. Need to ++ set a var each time chdir is successfully called (make xv_chdir). ++ Then in xv_getwd, if getcwd() fails, try stat()'ing the var. ++ If it exists, assume we're there, and return the var. Otherwise, fall back ++ to other directories... ++ + +*** /dev/null Mon Jan 23 20:08:17 1995 +--- docs/vdcomp.man Fri Jan 13 15:18:47 1995 +*************** +*** 0 **** +--- 1,82 ---- ++ .\" ++ .\" $Id: vdcomp.man,v 1.2 1995/01/12 23:35:28 qralston Exp $ ++ .\" ++ .\" $Log: vdcomp.man,v $ ++ .\" Revision 1.2 1995/01/12 23:35:28 qralston ++ .\" Created from the information in the comments in vdcomp.c. ++ .\" James Ralston Crawford <qralston+@pitt.edu> ++ .\" ++ .TH vdcomp 1 ++ .SH Name ++ \fIvdcomp\fP - decompress a compressed PDS image ++ .SH Synopsis ++ \fIvdcomp\fP [ infile ] [ outfile ] [ format-code ] ++ .SH Description ++ The \fIvdcomp\fP program reads a variable length compressed PDS image ++ and outputs a fixed length uncompressed image file in PDS format with ++ labels, image histogram, engineering table, line header table and an ++ image with PDS, FITS, VICAR or no labels. ++ .PP ++ If used on a non-byte-swapped machine the image histogram is ++ un-swapped. ++ .SH Options ++ \fIVdcomp\fP will prompt for any options that are not supplied on the ++ command-line. ++ .PP ++ \fIinfile\fP ++ .br ++ .RS ++ The name of compressed image file. ++ .RE ++ .PP ++ \fIoutfile\fP ++ .br ++ .RS ++ The name of uncompressed image file. ++ .RE ++ .PP ++ \fIformat-code\fP ++ .br ++ .RS ++ Select from the following list: ++ .br ++ .RS ++ \fI1\fP - SFDU/PDS format [default] ++ .br ++ \fI2\fP - FITS format ++ .br ++ \fI3\fP - VICAR format ++ .br ++ \fI4\fP - unlabelled binary array ++ .RE ++ .RE ++ .SH Limitations ++ This program has been tested on a VAX 780 (VMS 4.6), SUN Workstation ++ (UNIX 4.2, release 3.4), an IBM PC (MICROSOFT 5.1 compiler) and ++ Macintosh IIx using Lightspeed C version 3.0. When converting to ++ other systems, check for portability conflicts. ++ .SH Credits ++ This program uses Kris Becker's subroutine DECOMP.C (which is included ++ in this program in a shortened version). ++ .SH History ++ bradley@cis.upenn.edu 06-23-94 ansi-fied program ++ .PP ++ datri@convex.com, 11-15-91 added recognition of - as stdout for output ++ filename; disabled various messages; directed messages to stderr; ++ added exit status ++ .PP ++ DEC89 Modified program to handle both Voyager and Viking images. ++ .PP ++ OCT89 Converted Voyager decompression program to handle Viking ++ compressed images. Changed obuf to 'unsigned' to simplify computation ++ of checksum. ++ .PP ++ AUG89 Added code to get command line arguments for filenames and ++ output format; routines to free memory used by the Huffman tree); ++ fixed the SFDU label output length; and modified the I/O routines so ++ that the open for Host type 2 uses binary I/O. ++ .PP ++ JUN89 Fixed READVAR, to get length on 16-bit unswapped hosts. ++ .PP ++ JUL88 C driver to decompress standard Voyager Compressed images by ++ Mike Martin 1989/12/02. + +*** /dev/null Mon Jan 23 20:23:48 1995 +--- docs/xv.ann Tue Jan 03 13:58:15 1995 +*************** +*** 0 **** +--- 1,38 ---- ++ They said it couldn't be done. They said it never *would* be done. ++ They smiled knowingly to themselves as each predicted release date ++ inevitably passed by, unmarked by the emergence of a new version... ++ ++ Well, who asked them! And who do they think they are, anyhow!?! ++ ++ Announcing the Exciting New Release of XV, Version 3.10! ++ ++ Finally, all the stuff you've been waiting for: image cut & paste, pixel ++ editing, text annotation (of a sort), nifty new algorithms, new image formats ++ (Targa, XPM, FITS, XWD, IFF), improved schnauzing capabilities, a spiffy ++ new 'pad' command, and whatnot. Plenty of whatnot. ++ ++ Of course, we're particularly proud of our Exclusive 3-D Fish Technology. ++ ++ At the moment, you can get this decidedly 'fine' piece of software via ++ anonymous ftp on the following sites: ++ ++ Hostname Directory ++ -------- --------- ++ ftp.cis.upenn.edu: pub/xv ++ ftp.upenn.edu: data/bradley ++ ftp.duke.edu: pub/archive/xv ++ gatekeeper.dec.com: pub/graphics/xv ++ ++ The file is called 'xv-3.10.tar.gz' (or 'xv-3.10.tar.Z' if you don't have ++ the 'gunzip' program). ++ ++ BTW, if any of you fine folks can get these files put up on one of the major ++ ftp sites (wustl, gatekeeper, etc.) please do so, and let me know! ++ ++ Enjoy! ++ ++ John Bradley ++ ++ ------------------------- ++ Note: These tar files (xv-3.10.tar.Z and xv-3.10.tar.gz) have been replaced ++ as of 12/22/94, as the initial ones wouldn't build correctly on VMS. diff --git a/source/xap/xv/xv.SlackBuild b/source/xap/xv/xv.SlackBuild new file mode 100755 index 00000000..3ef40a7b --- /dev/null +++ b/source/xap/xv/xv.SlackBuild @@ -0,0 +1,74 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +VERSION=3.10a +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-5} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-xv + +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf xv-3.10 +tar xvf $CWD/xv-3.10.tar.gz || exit 1 +cd xv-3.10 || exit 1 +chown -R root:root . +zcat $CWD/xv-3.10a.patch.gz | patch -p0 --verbose --backup --suffix=.orig || exit +bzcat $CWD/xv-3.10a-jumbo-fix-patch-20050410.txt.bz2 | patch -p1 --verbose --backup --suffix=.orig || exit +bzcat $CWD/xv-3.10a-jumbo-enh-patch-20050501.txt.bz2 | patch -p1 --verbose --backup --suffix=.orig || exit +zcat $CWD/xv.prefix.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit +if [ "$ARCH" = "x86_64" ]; then + zcat $CWD/xv.prefix_x86_64.diff.gz | patch -p1 --verbose --backup --suffix=.orig || exit +fi +make -f Makefile.std +strip --strip-unneeded bggen vdcomp xcmap xv xvpictoppm +mkdir -p $PKG/usr/bin +cat bggen > $PKG/usr/bin/bggen +cat vdcomp > $PKG/usr/bin/vdcomp +cat xcmap > $PKG/usr/bin/xcmap +cat xv > $PKG/usr/bin/xv +cat xvpictoppm > $PKG/usr/bin/xvpictoppm +chmod 755 $PKG/usr/bin/* +mkdir -p $PKG/usr/man/man1 +for page in docs/xv.man docs/bggen.man docs/xcmap.man docs/xvp2p.man ; do + cat $page | gzip -9c > $PKG/usr/man/man1/`basename $page .man`.1.gz +done +mkdir -p $PKG/usr/doc/xv-$VERSION +cp -a \ + BUGS IDEAS INSTALL README README.jumbo README.pcd \ + $PKG/usr/doc/xv-$VERSION +( cd docs + cp -a \ + penn.policy xv.blurb xv.ann xvdocs.ps \ + $PKG/usr/doc/xv-$VERSION + bzip2 -9 $PKG/usr/doc/xv-$VERSION/xvdocs.ps ) +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +# Build the package: +cd $PKG +/sbin/makepkg -l y -c n $TMP/xv-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xv/xv.prefix.diff b/source/xap/xv/xv.prefix.diff new file mode 100644 index 00000000..0e610833 --- /dev/null +++ b/source/xap/xv/xv.prefix.diff @@ -0,0 +1,11 @@ +--- ./Makefile.std.orig 2005-07-12 15:15:19.000000000 -0700 ++++ ./Makefile.std 2005-07-12 15:16:08.000000000 -0700 +@@ -41,7 +41,7 @@ + + + ### Installation locations +-PREFIX = /usr/local ++PREFIX = /usr/X11R6 + BINDIR = $(PREFIX)/bin + MANDIR = $(PREFIX)/man/man1 + MANSUF = 1 diff --git a/source/xap/xv/xv.prefix_x86_64.diff b/source/xap/xv/xv.prefix_x86_64.diff new file mode 100644 index 00000000..fd6803d5 --- /dev/null +++ b/source/xap/xv/xv.prefix_x86_64.diff @@ -0,0 +1,20 @@ +--- xv-3.10/Makefile.std.orig 2008-11-06 22:16:03.000000000 +0000 ++++ xv-3.10/Makefile.std 2008-11-06 22:24:11.000000000 +0000 +@@ -46,7 +46,7 @@ + MANDIR = $(PREFIX)/man/man1 + MANSUF = 1 + DOCDIR = $(PREFIX)/doc/xv-3.10a +-LIBDIR = $(PREFIX)/lib/xv ++LIBDIR = $(PREFIX)/lib64/xv + SYSCONFDIR = $(PREFIX)/etc + DESTDIR = + +@@ -200,7 +200,7 @@ + + + ### for LINUX, uncomment the following line +-#MCHN = -DLINUX -L/usr/X11R6/lib ++MCHN = -DLINUX -L/usr/X11R6/lib64 + + + # For SCO 1.1 (UNIX 3.2v2) machines, uncomment the following: diff --git a/source/xap/xxgdb/slack-desc b/source/xap/xxgdb/slack-desc new file mode 100644 index 00000000..4905df86 --- /dev/null +++ b/source/xap/xxgdb/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +xxgdb: xxgdb (graphical program debugger interface) +xxgdb: +xxgdb: Xxgdb is a graphical user interface to the gdb debugger under the X +xxgdb: Window System. It provides visual feedback and mouse input for the +xxgdb: user to control program execution through breakpoints, to examine and +xxgdb: traverse the function call stack, and to display values of variables +xxgdb: and data structures. +xxgdb: +xxgdb: +xxgdb: +xxgdb: diff --git a/source/xap/xxgdb/xxgdb.SlackBuild b/source/xap/xxgdb/xxgdb.SlackBuild new file mode 100755 index 00000000..97c130f6 --- /dev/null +++ b/source/xap/xxgdb/xxgdb.SlackBuild @@ -0,0 +1,101 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 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. + +PKGNAM=xxgdb +VERSION=${VERSION:-1.12} +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-2} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} +rm -rf $PKG +mkdir -p $TMP $PKG + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-march=i486 -mtune=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" +fi + +cd $TMP +rm -rf ${PKGNAM}-${VERSION} +tar xvf $CWD/${PKGNAM}-$VERSION.tar.gz || exit 1 +cd ${PKGNAM}-$VERSION || exit 1 + +zcat $CWD/xxgdb.fix_glibc_and_gcc.diff.gz | patch -p1 --verbose --backup --suffix=.orig + +# Make sure ownerships and permissions are sane: +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + +xmkmf || exit 1 +make CCOPTIONS="$SLKCFLAGS" || exit 1 +make install DESTDIR="$PKG" +make install.man DESTDIR="$PKG" + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" \ + | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress and link manpages, if any: +if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.* + ) + done + ) +fi + +# Compress info files, if any: +if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) +fi + +# Add a documentation directory: +mkdir -p ${PKG}/usr/doc/${PKGNAM}-$VERSION +cp -a \ + README README.NEW_INTERFACE XDBX_README XDbx.NEW_INTERFACE XXGDB_README \ + $PKG/usr/doc/${PKGNAM}-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +# Build the package: +cd $PKG +/sbin/makepkg -l y -c n $TMP/${PKGNAM}-$VERSION-$ARCH-$BUILD.txz + diff --git a/source/xap/xxgdb/xxgdb.fix_glibc_and_gcc.diff b/source/xap/xxgdb/xxgdb.fix_glibc_and_gcc.diff new file mode 100644 index 00000000..b61d57ce --- /dev/null +++ b/source/xap/xxgdb/xxgdb.fix_glibc_and_gcc.diff @@ -0,0 +1,45 @@ +diff -Naur xxgdb-1.12/Imakefile xxgdb-1.12.fixed/Imakefile +--- xxgdb-1.12/Imakefile 1995-06-19 19:20:55.000000000 -0300 ++++ xxgdb-1.12.fixed/Imakefile 2007-02-21 10:40:57.000000000 -0200 +@@ -59,7 +59,7 @@ + #endif + + #ifdef LinuxArchitecture +-DEFINES = -DSYSV $(DEFGDB) ++DEFINES = $(DEFGDB) + #endif + + #if defined(NeXTArchitecture) || defined(NextArchitecture) +diff -Naur xxgdb-1.12/filemenu.c xxgdb-1.12.fixed/filemenu.c +--- xxgdb-1.12/filemenu.c 1994-08-29 16:38:28.000000000 -0300 ++++ xxgdb-1.12.fixed/filemenu.c 2007-02-21 10:47:47.000000000 -0200 +@@ -207,12 +207,12 @@ + return False; + if (statbuf.st_mode & S_IFDIR) { /* is directory */ + strcat(entry->d_name, "/"); +- ++(entry->d_namlen); ++ ++(entry->d_reclen); + return True; + } + if (statbuf.st_mode & S_IEXEC) { /* is executable */ + strcat(entry->d_name, "*"); +- ++(entry->d_namlen); ++ ++(entry->d_reclen); + return True; + } + return True; +diff -Naur xxgdb-1.12/gdb_handler.c xxgdb-1.12.fixed/gdb_handler.c +--- xxgdb-1.12/gdb_handler.c 1995-04-19 13:46:22.000000000 -0300 ++++ xxgdb-1.12.fixed/gdb_handler.c 2007-02-21 10:51:30.000000000 -0200 +@@ -85,10 +85,7 @@ + * query_gdb(): Send command to gdb. + */ + +-#ifdef SYSV +-# include <signal.h> +-#endif +- ++#include <signal.h> + + /* + * Display an outlined arrow to locate the calling routine in a stack |