summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/Makefile.am21
-rw-r--r--contrib/Makefile.in359
-rw-r--r--contrib/bas-README25
-rw-r--r--contrib/pas-R.Marks25
-rw-r--r--contrib/pas-README45
-rw-r--r--contrib/shar.sh176
-rw-r--r--contrib/shar2.sh74
-rw-r--r--contrib/uudecode.bas78
-rw-r--r--contrib/uudecode.pas224
-rw-r--r--contrib/uudecode.pl24
-rw-r--r--contrib/uuencode.pas202
-rw-r--r--contrib/uuencode.pl10
12 files changed, 1263 insertions, 0 deletions
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
new file mode 100644
index 0000000..04ad5b9
--- /dev/null
+++ b/contrib/Makefile.am
@@ -0,0 +1,21 @@
+## Makefile for the contrib subdirectory of the GNU Shar utilities.
+## Copyright (C) 1995, 1996, 2007 Free Software Foundation, Inc.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3, or (at your option)
+## any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+## Process this file with automake to produce Makefile.in.
+
+EXTRA_DIST = shar.sh shar2.sh bas-README uudecode.bas pas-README \
+pas-R.Marks uudecode.pas uuencode.pas uudecode.pl uuencode.pl
diff --git a/contrib/Makefile.in b/contrib/Makefile.in
new file mode 100644
index 0000000..cdef580
--- /dev/null
+++ b/contrib/Makefile.in
@@ -0,0 +1,359 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = contrib
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \
+ $(top_srcdir)/m4/error.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \
+ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \
+ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/realloc.m4 \
+ $(top_srcdir)/m4/sharutils.m4 $(top_srcdir)/m4/signed.m4 \
+ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \
+ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/m4/xstrtoimax.m4 \
+ $(top_srcdir)/version.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ADD_SCRIPT = @ADD_SCRIPT@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+COMPRESS = @COMPRESS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIFF = @DIFF@
+DIRENT_HEADER = @DIRENT_HEADER@
+DIST_ALPHA = @DIST_ALPHA@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC2 = @GLIBC2@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+INSTALL = @INSTALL@
+INSTALL_COMPRESS_LINK = @INSTALL_COMPRESS_LINK@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAILER = @MAILER@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SH = @SH@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = shar.sh shar2.sh bas-README uudecode.bas pas-README \
+pas-R.Marks uudecode.pas uuencode.pas uudecode.pl uuencode.pl
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits contrib/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnits contrib/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/contrib/bas-README b/contrib/bas-README
new file mode 100644
index 0000000..e1c787d
--- /dev/null
+++ b/contrib/bas-README
@@ -0,0 +1,25 @@
+Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site hoptoad.uucp
+From: rde@ukc.ac.uk (R.D.Eager)
+Newsgroups: net.sources
+Subject: Revised UUDECODE in MS-BASIC
+Date: 14 Mar 86 11:53:53 GMT
+Date-Received: 15 Mar 86 13:45:45 GMT
+Reply-To: rde@ukc.ac.uk (R.D.Eager)
+
+A while ago I posted a UUDECODE program, written in Microsoft Basic,
+to net.sources. Judging from the number of replies I had, people
+are finding this useful if they don't have access to the public
+domain UUDECODE, or to a C compiler.
+
+I found one or two problems recently; the main one was that it would
+not create an output file of more than 64K due to an undocumented
+feature of MS-BASIC. Here is a corrected version; as always, I
+suggest you compile it if you want the run time to be finite.
+
+ Bob Eager
+
+ rde@ukc.UUCP
+ rde@ukc
+ ...!mcvax!ukc!rde
+
+ Phone: +44 227 66822 ext 7589
diff --git a/contrib/pas-R.Marks b/contrib/pas-R.Marks
new file mode 100644
index 0000000..915ad89
--- /dev/null
+++ b/contrib/pas-R.Marks
@@ -0,0 +1,25 @@
+From: rmarks@KSP.Unisys.COM (Richard Marks)
+Newsgroups: comp.binaries.ibm.pc.archives
+Subject: UUENCODE/DECODE 4.20
+Date: 14 Aug 91 14:26:44 GMT
+
+I have just send in my latest UUENCODE/DECODE package to c.b.i.p
+for posting. This is level 4.20.
+
+This package has been out for four years. It is fast and it automatically
+handles multi-section decoding - with automatic CRC testing. Just
+save submissions as foo1.uue, foo2.uue, etc.; download to the PC; and
+enter UUDECODE FOO.
+
+Also this package handles lots of variations in checksums and character
+permutations. This includes XXencode/decode.
+
+The 4.20 version replaces the 4.13 version. It is a minor update with
+some improved error messages, beeping to alert for errors, and detection
+of some additional character permutations. Also the prior default for the
+encode was to put a checksum on each line; now with the use of full file
+CRC's, the default has been changed to turn this off.
+
+Regards,
+Richard Marks
+rmarks@MDC.unisys.COM
diff --git a/contrib/pas-README b/contrib/pas-README
new file mode 100644
index 0000000..0a31d26
--- /dev/null
+++ b/contrib/pas-README
@@ -0,0 +1,45 @@
+Here are versions of uuencode and uudecode that will work on an IBM
+PC. There is a version for Turbo Pascal and one for Microsoft C.
+Porting them into other machines, languages or dialects should not
+pose a large problem.
+
+Sorry about the lack of documentation, but the programs are easy to
+use, so you should not have a problem. I don't know why a UNIX
+site would not have these in the first place, but at least your
+manual should tell you how to use them. If you are not using UNIX
+at all, you have my sympathy.
+
+The Pascal programs' author is unknown. The C programs were
+provided by Don Kneller.
+
+Tom Reingold
+Rockefeller University
+New York City
+UUCP: {seismo | harvard | ihnp4}!cmcl2!rna!rocky2!reintom
+BITNET: REINTOM@ROCKVAX
+ARPANET: reintom@rockefeller.arpa
+
+======================================================================
+
+Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site hoptoad.uucp
+From: darmon@polaris.UUCP (Pierre Darmon)
+Newsgroups: net.sources
+Subject: Modified Turbo Pascal uudecode/encode. More user-friendly.
+Date: 30 Oct 86 01:12:40 GMT
+Date-Received:
+Reply-To: darmon@polaris.UUCP (Pierre Darmon)
+Organization: IBM Research, Yorktown Heights, N.Y.
+
+The following are the Turbo Pascal source files for uudecode and uuencode,
+modified from the net posting to display the remaining bytes to be processed,
+instead of filling up the screen with periods. It also displays the percentage
+left. See my previous posting to net.micro,net.micro.pc and net.sources for
+details.
+
+Enjoy!
+
+--
+
+Pierre Darmon, IBM Thomas J. Watson Research Center.
+.....seismo!philabs!polaris!darmon.
+darmon.yktvmz.ibm@csnet-relay
diff --git a/contrib/shar.sh b/contrib/shar.sh
new file mode 100644
index 0000000..3a9783a
--- /dev/null
+++ b/contrib/shar.sh
@@ -0,0 +1,176 @@
+#!/bin/sh
+# UNISRC_ID: @(#)shar.sh 27.1 84/12/17
+: Make a shell archive package
+
+# Usage: $0 [-b] [-c] [-t] [-v] files... > package
+# See the manual entry for details.
+
+
+# Initialize:
+
+diagnostic='eval echo >&2' # diagnostics to stderr by default.
+trap '$diagnostic "$0: quitting early"; exit 1' 1 2 3 15
+base_option=FALSE # use pathnames, not basenames.
+check_option=FALSE # don't generate integrity check.
+USAGE='Usage: $0 \[-b] \[-c] \[-t] \[-v] files... \> package'
+
+
+# Extract and digest options, if any:
+#
+# Un-comment the "-)" line below to treat single dashes as a no-op.
+# Commented means single dashes elicit a usage diagnostic.
+
+while [ -n "$1" ] # while there are more arguments,
+do # digest them; stop when you find a non-option.
+ case "$1" in
+ -b) base_option=TRUE; shift;;
+ -c) check_option=TRUE; shift;;
+ -v) verbose=TRUE; shift;;
+ -t) verbose=TRUE; diagnostic='eval echo >/dev/tty'; shift;;
+### -) shift;; # if uncommented, eat single dashes.
+ -*) $diagnostic $USAGE; exit 1;; # die at illegal options.
+ *) break;; # non-option found.
+ esac
+done
+
+
+# Check remaining arguments, which should be just a list of files:
+
+if [ $# = 0 ]
+then # no arguments left!
+ $diagnostic $USAGE
+ exit 1
+fi
+
+
+# Check the cupboard to see if the ingredients are all there:
+
+contents='' # no files so far.
+contdirs='' # no directories so far.
+
+for arg # for all files specified,
+do # establish the archive name.
+ if [ -f "$arg" ]
+ then # file exists and is not a directory.
+ case $base_option in
+ TRUE) unpack_name=`basename "$arg"` ;;
+ FALSE) unpack_name="$arg" ;;
+ esac
+
+ contents="$contents $unpack_name"
+
+ elif [ -d "$arg" ]
+ then # file exists and is a directory.
+ case $base_option in
+ TRUE) $diagnostic '$0: cannot archive directory "$arg" with -b option.'
+ exit 1 ;;
+ FALSE) contdirs="$contdirs $arg/ " ;;
+ esac
+
+ else # not a plain file and not a directory.
+ $diagnostic '$0: cannot archive "$arg"'
+ exit 1
+ fi
+done
+
+
+# Emit the prologue:
+# (The leading newline is for those who type csh instead of sh.)
+
+cat <<!!!
+
+# This is a shell archive. Remove anything before this line,
+# then unpack it by saving it in a file and typing "sh file".
+#
+# Wrapped by `who am i | sed 's/[ ].*//'` on `date`
+!!!
+
+
+# Emit the list of ingredients:
+
+# Simple version (breaks if you shar lots of files at once):
+# echo "# Contents: $contdirs$contents"
+#
+# Complex and cosmetic version to pack contents list onto lines that fit on
+# one terminal line ("expr string : .*" prints the length of the string):
+
+MAX=80
+line='# Contents: '
+for item in $contdirs $contents
+do
+ if [ `expr "$line" : '.*' + 1 + "$item" : '.*'` -lt $MAX ]
+ then # length of old line + new item is short enough,
+ line="$line $item" # so just append it.
+
+ else # new element makes line too long,
+ echo "$line" # so put it on a new line.
+ line="# $item" # start a new line.
+ MAX=74 # compensate for tab width.
+ fi
+done
+
+echo "$line"
+echo " "
+
+
+# Emit the files and their separators:
+
+for arg
+do
+ # Decide which name to archive under.
+ case $base_option in
+ TRUE) unpack_name=`basename "$arg"`
+ test $verbose && $diagnostic "a - $unpack_name [from $arg]" ;;
+ FALSE) unpack_name="$arg"
+ test $verbose && $diagnostic "a - $arg" ;;
+ esac
+
+ # Emit either a mkdir or a cat/sed to extract the file.
+ if [ -d "$arg" ]
+ then
+ echo "echo mkdir - $arg"
+ echo "mkdir $arg"
+ else
+ echo "echo x - $unpack_name"
+ separator="@//E*O*F $unpack_name//"
+ echo "sed 's/^@//' > \"$unpack_name\" <<'$separator'"
+ sed -e 's/^[.~@]/@&/' -e 's/^From/@&/' "$arg"
+ echo $separator
+ fi
+
+ # Emit chmod to set permissions on the extracted file;
+ # this keels over if the filename contains "?".
+ ls -ld $arg | sed \
+ -e 's/^.\(...\)\(...\)\(...\).*/u=\1,g=\2,o=\3/' \
+ -e 's/-//g' \
+ -e 's?.*?chmod & '"$unpack_name?"
+ echo " "
+done
+
+
+# If the -c option was given, emit the checking epilogue:
+# (The sed script converts files to basenames so it works regardless of -b.)
+
+if [ $check_option = TRUE ]
+then
+ echo 'echo Inspecting for damage in transit...'
+ echo 'temp=/tmp/shar$$; dtemp=/tmp/.shar$$'
+ echo 'trap "rm -f $temp $dtemp; exit" 0 1 2 3 15'
+ echo 'cat > $temp <<\!!!'
+ case $base_option in
+ TRUE) wc $@ | sed 's=[^ ]*/==' ;;
+ FALSE) wc $contents | sed 's=[^ ]*/==' ;;
+ esac
+ echo '!!!'
+ echo "wc $contents | sed 's=[^ ]*/==' | "'diff -b $temp - >$dtemp'
+ echo 'if [ -s $dtemp ]'
+ echo 'then echo "Ouch [diff of wc output]:" ; cat $dtemp'
+ echo 'else echo "No problems found."'
+ echo 'fi'
+fi
+
+
+# Finish up:
+
+echo 'exit 0' # sharchives unpack even if junk follows.
+exit 0
diff --git a/contrib/shar2.sh b/contrib/shar2.sh
new file mode 100644
index 0000000..e7a6b6a
--- /dev/null
+++ b/contrib/shar2.sh
@@ -0,0 +1,74 @@
+#!/bin/sh -
+#
+# Copyright (c) 1990 The Regents of the University of California.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by the University of
+# California, Berkeley and its contributors.
+# 4. Neither the name of the University nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# @(#)shar.sh 5.2 (Berkeley) 5/23/90
+#
+
+if [ $# -eq 0 ]; then
+ echo 'usage: shar file ...'
+ exit 1
+fi
+
+cat << EOF
+# This is a shell archive. Save it in a file, remove anything before
+# this line, and then unpack it by entering "sh file". Note, it may
+# create directories; files and directories will be owned by you and
+# have default permissions.
+#
+# This archive contains:
+#
+EOF
+
+for i
+do
+ echo "# $i"
+done
+
+echo "#"
+
+for i
+do
+ if [ -d $i ]; then
+ echo "echo c - $i"
+ echo "mkdir $i > /dev/null 2>&1"
+ else
+ echo "echo x - $i"
+ echo "sed 's/^X//' >$i << 'END-of-$i'"
+ sed 's/^/X/' $i
+ echo "END-of-$i"
+ fi
+done
+echo exit
+echo ""
+
+exit 0
diff --git a/contrib/uudecode.bas b/contrib/uudecode.bas
new file mode 100644
index 0000000..ff7fc30
--- /dev/null
+++ b/contrib/uudecode.bas
@@ -0,0 +1,78 @@
+1000 KEY OFF
+1001 DEFINT A-Z
+1010 REM Trap error opening input file
+1020 ON ERROR GOTO 1600
+1030 CLS
+1040 LOCATE 5,11
+1050 PRINT STRING$(40," ")
+1060 LOCATE 5,11
+1070 INPUT "Enter name of input file: ", INFILE$
+1080 OPEN INFILE$ FOR INPUT AS #1
+1090 LOCATE 8,10
+1100 PRINT STRING$(40," ")
+1110 REM Trap error opening output file
+1120 ON ERROR GOTO 1640
+1130 LOCATE 8,10
+1140 INPUT "Enter name of output file: ", OUTFILE$
+1150 OPEN "R", #2,OUTFILE$, 1
+1160 FIELD #2, 1 AS N$
+1170 REM Trap error at end of file
+1180 ON ERROR GOTO 1680
+1190 REM Search for header line
+1200 LINE INPUT #1,A$
+1210 IF LEFT$(A$,5) <>"begin" THEN 1200
+1220 LOCATE 11,10
+1230 PRINT "Header = ";A$
+1240 SP = ASC(" ")
+1250 DIM BUF(100)
+1260 RECNO# = 1
+1270 REM Main loop
+1280 LINE INPUT #1, A$
+1290 P = 0
+1300 COUNT = ASC(LEFT$(A$,1)) - SP
+1310 IF COUNT = 64 THEN COUNT = 0
+1320 IF COUNT = 0 THEN 1560
+1330 ADJ = COUNT MOD 4
+1340 FOR I = 2 TO LEN(A$) STEP 4
+1350 X1 = ASC(MID$(A$,I,I)) - SP
+1360 IF X1 = 64 THEN X1 = 0
+1370 X2 = ASC(MID$(A$,I+1,I+1)) - SP
+1380 IF X2 = 64 THEN X2 = 0
+1390 X3 = ASC(MID$(A$,I+2,I+2)) - SP
+1400 IF X3 = 64 THEN X3 = 0
+1410 X4 = ASC(MID$(A$,I+3,I+3)) - SP
+1420 IF X4 = 64 THEN X4 = 0
+1430 P = P + 1
+1440 BUF(P) = (X2\16) + (X1*4)
+1450 P = P + 1
+1460 BUF(P) = (X3\4) + ((X2 MOD 16) * 16)
+1470 P = P + 1
+1480 BUF(P) = X4 + ((X3 MOD 4) * 64)
+1490 NEXT I
+1500 FOR I = 1 TO P
+1510 LSET N$ = CHR$(BUF(I))
+1520 PUT #2, RECNO#
+1530 RECNO# = RECNO# + 1
+1540 NEXT I
+1550 GOTO 1280
+1560 END
+1570 REM
+1580 REM Error trapping routines
+1590 REM
+1600 LOCATE 22,20
+1610 PRINT "Can't open input file"
+1620 GOSUB 1740
+1630 RESUME 1020
+1640 LOCATE 22,20
+1650 PRINT "Can't open output file"
+1660 GOSUB 1740
+1670 RESUME 1090
+1680 LOCATE 22,20
+1690 PRINT "Header line not found"
+1700 GOSUB 1740
+1710 LOCATE 24,1
+1720 END
+1740 FOR I = 1 TO 5000: NEXT I
+1750 LOCATE 22,20
+1760 PRINT STRING$(30," ")
+1770 RETURN
diff --git a/contrib/uudecode.pas b/contrib/uudecode.pas
new file mode 100644
index 0000000..2c80fef
--- /dev/null
+++ b/contrib/uudecode.pas
@@ -0,0 +1,224 @@
+program uudecode;
+
+ CONST defaultSuffix = '.uue';
+ offset = 32;
+
+ TYPE string80 = string[80];
+
+ VAR infile: text;
+ fi : file of byte;
+ outfile: file of byte;
+ lineNum: integer;
+ line: string80;
+ size,remaining :real;
+
+ procedure Abort(message: string80);
+
+ begin {abort}
+ writeln;
+ if lineNum > 0 then write('Line ', lineNum, ': ');
+ writeln(message);
+ halt
+ end; {Abort}
+
+ procedure NextLine(var s: string80);
+
+ begin {NextLine}
+ LineNum := succ(LineNum);
+ {write('.');}
+ readln(infile, s);
+ remaining:=remaining-length(s)-2; {-2 is for CR/LF}
+ write('bytes remaining: ',remaining:7:0,' (',
+ remaining/size*100.0:3:0,'%)',chr(13));
+ end; {NextLine}
+
+ procedure Init;
+
+ procedure GetInFile;
+
+ VAR infilename: string80;
+
+ begin {GetInFile}
+ if ParamCount = 0 then abort ('Usage: uudecode <filename>');
+ infilename := ParamStr(1);
+ if pos('.', infilename) = 0
+ then infilename := concat(infilename, defaultSuffix);
+ assign(infile, infilename);
+ {$i-}
+ reset(infile);
+ {$i+}
+ if IOresult > 0 then abort (concat('Can''t open ', infilename));
+ writeln ('Decoding ', infilename);
+ assign(fi,infilename); reset(fi);
+ size:=FileSize(fi); close(fi);
+ if size < 0 then size:=size+65536.0;
+ remaining:=size;
+ end; {GetInFile}
+
+ procedure GetOutFile;
+
+ var header, mode, outfilename: string80;
+ ch: char;
+
+ procedure ParseHeader;
+
+ VAR index: integer;
+
+ Procedure NextWord(var word:string80; var index: integer);
+
+ begin {nextword}
+ word := '';
+ while header[index] = ' ' do
+ begin
+ index := succ(index);
+ if index > length(header) then abort ('Incomplete header')
+ end;
+ while header[index] <> ' ' do
+ begin
+ word := concat(word, header[index]);
+ index := succ(index)
+ end
+ end; {NextWord}
+
+ begin {ParseHeader}
+ header := concat(header, ' ');
+ index := 7;
+ NextWord(mode, index);
+ NextWord(outfilename, index)
+ end; {ParseHeader}
+
+ begin {GetOutFile}
+ if eof(infile) then abort('Nothing to decode.');
+ NextLine (header);
+ while not ((copy(header, 1, 6) = 'begin ') or eof(infile)) do
+ NextLine(header);
+ writeln;
+ if eof(infile) then abort('Nothing to decode.');
+ ParseHeader;
+ assign(outfile, outfilename);
+ writeln ('Destination is ', outfilename);
+ {$i-}
+ reset(outfile);
+ {$i+}
+ if IOresult = 0 then
+ begin
+ write ('Overwrite current ', outfilename, '? [Y/N] ');
+ repeat
+ read (kbd, ch);
+ ch := UpCase(ch)
+ until ch in ['Y', 'N'];
+ writeln(ch);
+ if ch = 'N' then abort ('Overwrite cancelled.')
+ end;
+ rewrite (outfile);
+ end; {GetOutFile}
+
+ begin {init}
+ lineNum := 0;
+ GetInFile;
+ GetOutFile;
+ end; { init}
+
+ Function CheckLine: boolean;
+
+ begin {CheckLine}
+ if line = '' then abort ('Blank line in file');
+ CheckLine := not (line[1] in [' ', '`'])
+ end; {CheckLine}
+
+
+ procedure DecodeLine;
+
+ VAR lineIndex, byteNum, count, i: integer;
+ chars: array [0..3] of byte;
+ hunk: array [0..2] of byte;
+
+{ procedure debug;
+
+ var i: integer;
+
+ procedure writebin(x: byte);
+
+ var i: integer;
+
+ begin
+ for i := 1 to 8 do
+ begin
+ write ((x and $80) shr 7);
+ x := x shl 1
+ end;
+ write (' ')
+ end;
+
+ begin
+ writeln;
+ for i := 0 to 3 do writebin(chars[i]);
+ writeln;
+ for i := 0 to 2 do writebin(hunk[i]);
+ writeln
+ end; }
+
+ function nextch: char;
+
+ begin {nextch}
+ lineIndex := succ(lineIndex);
+ if lineIndex > length(line) then abort('Line too short.');
+ if not (line[lineindex] in [' '..'`'])
+ then abort('Illegal character in line.');
+{ write(line[lineindex]:2);}
+ if line[lineindex] = '`' then nextch := ' '
+ else nextch := line[lineIndex]
+ end; {nextch}
+
+ procedure DecodeByte;
+
+ procedure GetNextHunk;
+
+ VAR i: integer;
+
+ begin {GetNextHunk}
+ for i := 0 to 3 do chars[i] := ord(nextch) - offset;
+ hunk[0] := (chars[0] shl 2) + (chars[1] shr 4);
+ hunk[1] := (chars[1] shl 4) + (chars[2] shr 2);
+ hunk[2] := (chars[2] shl 6) + chars[3];
+ byteNum := 0 {;
+ debug }
+ end; {GetNextHunk}
+
+ begin {DecodeByte}
+ if byteNum = 3 then GetNextHunk;
+ write (outfile, hunk[byteNum]);
+ {writeln(bytenum, ' ', hunk[byteNum]);}
+ byteNum := succ(byteNum)
+ end; {DecodeByte}
+
+ begin {DecodeLine}
+ lineIndex := 0;
+ byteNum := 3;
+ count := (ord(nextch) - offset);
+ for i := 1 to count do DecodeByte
+ end; {DecodeLine}
+
+ procedure terminate;
+
+ var trailer: string80;
+
+ begin {terminate}
+ if eof(infile) then abort ('Abnormal end.');
+ NextLine (trailer);
+ if length (trailer) < 3 then abort ('Abnormal end.');
+ if copy (trailer, 1, 3) <> 'end' then abort ('Abnormal end.');
+ close (infile);
+ close (outfile)
+ end;
+
+ begin {uudecode}
+ init;
+ NextLine(line);
+ while CheckLine do
+ begin
+ DecodeLine;
+ NextLine(line)
+ end;
+ terminate
+ end.
diff --git a/contrib/uudecode.pl b/contrib/uudecode.pl
new file mode 100644
index 0000000..42f090f
--- /dev/null
+++ b/contrib/uudecode.pl
@@ -0,0 +1,24 @@
+# uuencode in Perl.
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# François Pinard <pinard@iro.umontreal.ca>, 1995.
+
+# `perl uudecode.pl FILES' will decode all uuencoded files found in
+# all input FILES, stripping headers and other non uuencoded data.
+
+while (<>)
+{
+ if (/^begin [0-7][0-7][0-7] ([^\n ]+)$/)
+ {
+ open (OUTPUT, ">$1") || die "Cannot create $1\n";
+ binmode OUTPUT;
+ while (<>)
+ {
+ last if /^end$/;
+ $block = unpack ("u", $_);
+ print OUTPUT $block;
+ }
+ close OUTPUT;
+ }
+}
+
+exit 0;
diff --git a/contrib/uuencode.pas b/contrib/uuencode.pas
new file mode 100644
index 0000000..c30a289
--- /dev/null
+++ b/contrib/uuencode.pas
@@ -0,0 +1,202 @@
+Program uuencode;
+
+ CONST header = 'begin';
+ trailer = 'end';
+ defaultMode = '644';
+ defaultExtension = '.uue';
+ offset = 32;
+ charsPerLine = 60;
+ bytesPerHunk = 3;
+ sixBitMask = $3F;
+
+ TYPE string80 = string[80];
+
+ VAR infile: file of byte;
+ outfile: text;
+ infilename, outfilename, mode: string80;
+ lineLength, numbytes, bytesInLine: integer;
+ line: array [0..59] of char;
+ hunk: array [0..2] of byte;
+ chars: array [0..3] of byte;
+ size,remaining :real;
+
+{ procedure debug;
+
+ var i: integer;
+
+ procedure writebin(x: byte);
+
+ var i: integer;
+
+ begin
+ for i := 1 to 8 do
+ begin
+ write ((x and $80) shr 7);
+ x := x shl 1
+ end;
+ write (' ')
+ end;
+
+ begin
+ for i := 0 to 2 do writebin(hunk[i]);
+ writeln;
+ for i := 0 to 3 do writebin(chars[i]);
+ writeln;
+ for i := 0 to 3 do writebin(chars[i] and sixBitMask);
+ writeln
+ end; }
+
+ procedure Abort (message: string80);
+
+ begin {abort}
+ writeln(message);
+ close(infile);
+ close(outfile);
+ halt
+ end; {abort}
+
+ procedure Init;
+
+ procedure GetFiles;
+
+ VAR i: integer;
+ temp: string80;
+ ch: char;
+
+ begin {GetFiles}
+ if ParamCount < 1 then abort ('No input file specified.');
+ infilename := ParamStr(1);
+ {$I-}
+ assign (infile, infilename);
+ reset (infile);
+ {$i+}
+ if IOResult > 0 then abort (concat ('Can''t open file ', infilename));
+ size:=FileSize(infile);
+ if size < 0 then size:=size+65536.0;
+ remaining:=size;
+ write('Uuencoding file ', infilename);
+
+ i := pos('.', infilename);
+ if i = 0
+ then outfilename := infilename
+ else outfilename := copy (infilename, 1, pred(i));
+ mode := defaultMode;
+ if ParamCount > 1 then
+ for i := 2 to ParamCount do
+ begin
+ temp := Paramstr(i);
+ if temp[1] in ['0'..'9']
+ then mode := temp
+ else outfilename := temp
+ end;
+ if pos ('.', outfilename) = 0
+ then outfilename := concat(outfilename, defaultExtension);
+ assign (outfile, outfilename);
+ writeln (' to file ', outfilename, '.');
+
+ {$i-}
+ reset(outfile);
+ {$i+}
+ if IOresult = 0 then
+ begin
+ Write ('Overwrite current ', outfilename, '? [Y/N] ');
+ repeat
+ read (kbd, ch);
+ ch := Upcase(ch)
+ until ch in ['Y', 'N'];
+ writeln (ch);
+ if ch = 'N' then abort(concat (outfilename, ' not overwritten.'))
+ end;
+ close(outfile);
+
+ {$i-}
+ rewrite(outfile);
+ {$i+}
+ if ioresult > 0 then abort(concat('Can''t open ', outfilename));
+ end; {getfiles}
+
+ begin {Init}
+ GetFiles;
+ bytesInLine := 0;
+ lineLength := 0;
+ numbytes := 0;
+ writeln (outfile, header, ' ', mode, ' ', infilename);
+ end; {init}
+
+ procedure FlushLine;
+
+ VAR i: integer;
+
+ procedure writeout(ch: char);
+
+ begin {writeout}
+ if ch = ' ' then write(outfile, '`')
+ else write(outfile, ch)
+ end; {writeout}
+
+ begin {FlushLine}
+ {write ('.');}
+ write('bytes remaining: ',remaining:7:0,' (',
+ remaining/size*100.0:3:0,'%)',chr(13));
+ writeout(chr(bytesInLine + offset));
+ for i := 0 to pred(lineLength) do
+ writeout(line[i]);
+ writeln (outfile);
+ lineLength := 0;
+ bytesInLine := 0
+ end; {FlushLine}
+
+ procedure FlushHunk;
+
+ VAR i: integer;
+
+ begin {FlushHunk}
+ if lineLength = charsPerLine then FlushLine;
+ chars[0] := hunk[0] shr 2;
+ chars[1] := (hunk[0] shl 4) + (hunk[1] shr 4);
+ chars[2] := (hunk[1] shl 2) + (hunk[2] shr 6);
+ chars[3] := hunk[2] and sixBitMask;
+ {debug;}
+ for i := 0 to 3 do
+ begin
+ line[lineLength] := chr((chars[i] and sixBitMask) + offset);
+ {write(line[linelength]:2);}
+ lineLength := succ(lineLength)
+ end;
+ {writeln;}
+ bytesInLine := bytesInLine + numbytes;
+ numbytes := 0
+ end; {FlushHunk}
+
+ procedure encode1;
+
+ begin {encode1};
+ if numbytes = bytesperhunk then flushhunk;
+ read (infile, hunk[numbytes]);
+ remaining:=remaining-1;
+ numbytes := succ(numbytes)
+ end; {encode1}
+
+ procedure terminate;
+
+ begin {terminate}
+ if numbytes > 0 then flushhunk;
+ if lineLength > 0
+ then
+ begin
+ flushLine;
+ flushLine;
+ end
+ else flushline;
+ writeln (outfile, trailer);
+ close (outfile);
+ close (infile);
+ end; {terminate}
+
+
+ begin {uuencode}
+ init;
+ while not eof (infile) do encode1;
+ terminate;
+ writeln;
+ end. {uuencode}
diff --git a/contrib/uuencode.pl b/contrib/uuencode.pl
new file mode 100644
index 0000000..e15f71d
--- /dev/null
+++ b/contrib/uuencode.pl
@@ -0,0 +1,10 @@
+# uuencode in Perl - non tested.
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# François Pinard <pinard@iro.umontreal.ca>, 1995.
+
+print "begin 644 $ARGV[0]\n";
+print pack ("u", $bloc) while read (STDIN, $bloc, 45);
+print "`\n";
+print "end\n";
+
+exit 0;