summaryrefslogtreecommitdiffstats
path: root/funtools/gnu
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2016-10-26 21:13:00 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2016-10-26 21:13:00 (GMT)
commitda2e3d212171bbe64c1af39114fd067308656990 (patch)
tree9601f7ed15fa1394762124630c12a792bc073ec2 /funtools/gnu
parent76b109ad6d97d19ab835596dc70149ef379f3733 (diff)
downloadblt-da2e3d212171bbe64c1af39114fd067308656990.zip
blt-da2e3d212171bbe64c1af39114fd067308656990.tar.gz
blt-da2e3d212171bbe64c1af39114fd067308656990.tar.bz2
rm funtools for update
Diffstat (limited to 'funtools/gnu')
-rw-r--r--funtools/gnu/COPYING340
-rw-r--r--funtools/gnu/Makefile.in150
-rw-r--r--funtools/gnu/conf.h.in59
-rw-r--r--funtools/gnu/copyright29
-rwxr-xr-xfuntools/gnu/install-sh276
-rw-r--r--funtools/gnu/sort.c2879
-rw-r--r--funtools/gnu/sorttest.c152
-rw-r--r--funtools/gnu/system.h187
8 files changed, 0 insertions, 4072 deletions
diff --git a/funtools/gnu/COPYING b/funtools/gnu/COPYING
deleted file mode 100644
index 60549be..0000000
--- a/funtools/gnu/COPYING
+++ /dev/null
@@ -1,340 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- 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 2 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19yy name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/funtools/gnu/Makefile.in b/funtools/gnu/Makefile.in
deleted file mode 100644
index 26cbf53..0000000
--- a/funtools/gnu/Makefile.in
+++ /dev/null
@@ -1,150 +0,0 @@
-#
-# This is a Makefile for the gnu binary sort. If it has the name "Makefile.in"
-# then it is a template for a Makefile; to generate the actual Makefile,
-# run "./configure", which is a configuration script generated by the
-# "autoconf" program (constructs like "@foo@" will get replaced in the
-# actual Makefile.
-#
-
-#----------------------------------------------------------------
-# Things you can change to personalize the Makefile for your own
-# site (you can make these changes in either Makefile.in or
-# Makefile, but changes to Makefile will get lost if you re-run
-# the configuration script).
-#----------------------------------------------------------------
-
-# Default top-level directories in which to install architecture-
-# specific files (exec_prefix) and machine-independent files such
-# as scripts (prefix). The values specified here may be overridden
-# at configure-time with the --exec-prefix and --prefix options
-# to the "configure" script.
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-# The following definition can be set to non-null for special systems
-# like AFS with replication. It allows the pathnames used for installation
-# to be different than those used for actually reference files at
-# run-time. INSTALL_ROOT is prepended to $prefix and $exec_prefix
-# when installing files.
-INSTALL_ROOT =
-
-# extra includes for compiling
-INCLUDES = -I. -I$(prefix)/include
-
-# extra libs
-EXTRA_LIBS = @EXTRA_LIBS@
-
-# the full set of libraries for linking
-LIBS =
-
-# To change the compiler switches, for example to change from -O
-# to -g, change the following line:
-CFLAGS = @CFLAGS@ -DSAOMOD_BINARY
-
-# To add ld switches, change the following line:
-LDFLAGS = @LDFLAGS@
-
-# Some versions of make, like SGI's, use the following variable to
-# determine which shell to use for executing commands:
-SHELL = /bin/sh
-
-# extra modules added by configure.in to fix OS bugs
-EXTRA_OBJS = @EXTRA_OBJS@
-
-# Directory in which to install the .a, .so, and .o files:
-LIB_INSTALL_DIR = $(INSTALL_ROOT)$(exec_prefix)/lib
-
-# Directory in which to install the programs:
-BIN_INSTALL_DIR = $(INSTALL_ROOT)$(exec_prefix)/bin
-
-# Directory in which to install the include files:
-INCLUDE_INSTALL_DIR = $(INSTALL_ROOT)$(prefix)/include
-
-# There are just too many different versions of "install" around;
-# better to use the install-sh script that comes with the distribution,
-# which is slower but guaranteed to work.
-
-INSTALL = @srcdir@/install-sh -c
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_DATA = ${INSTALL} -m 644
-
-#----------------------------------------------------------------
-# The information below is modified by the configure script when
-# Makefile is generated from Makefile.in. You shouldn't normally
-# modify any of this stuff by hand.
-#----------------------------------------------------------------
-
-AC_FLAGS = @DEFS@
-RANLIB = @RANLIB@
-EXE = @EXEEXT@
-
-#----------------------------------------------------------------
-# The information below should be usable as is. The configure
-# script won't modify it and you shouldn't need to modify it
-# either.
-#----------------------------------------------------------------
-
-CC = @CC@
-
-CC_SWITCHES = ${CFLAGS} ${CPPFLAGS} ${INCLUDES} ${AC_FLAGS}
-
-DEPEND_SWITCHES = ${CFLAGS} ${INCLUDES} ${AC_FLAGS}
-
-SRCS = sort.c
-
-OBJS = sort.o
-
-PROGS = _funsort
-
-TESTPROGS = sorttest
-
-all: $(PROGS)
-
-_funsort: $(OBJS)
- $(CC) $(LDFLAGS) $(OBJS) -o _funsort
-
-sorttest: sorttest.o
- $(CC) $(LDFLAGS) sorttest.o -o sorttest -L.. -lfuntools
-
-Makefile: Makefile.in
- $(SHELL) config.status
-
-RM = rm -f
-
-clean:
- $(RM) *.a *.so *.o *.exe core errs *pure* .nfs* \
- foo* *~ *.log \#* TAGS *.E a.out errors \
- $(PROGS) $(TESTPROGS) \
- gmon.out *.pg *.bak \
- config.info config.log \
- *fun*.out doc/*~
- $(RM) -r autom4te.cache
-
-distclean: clean
- $(RM) Makefile config.status config.cache config.log
-
-pclean:
- $(RM) $(PROGS)
-
-depend:
- makedepend -- $(DEPEND_SWITCHES) -- $(SRCS)
-
-sort.o: sort.c
- $(CC) -c $(CC_SWITCHES) sort.c
-
-install: $(PROGS)
- @for i in $(PROGS) ; \
- do \
- echo "Installing $$i$(EXE)" ; \
- $(INSTALL_PROGRAM) $$i$(EXE) $(BIN_INSTALL_DIR)/$$i$(EXE) ; \
- done;
-
-
-pure: _funsort.pure
-
-_funsort.pure: $(FUNLIB) sort.o
- purify $(CC) $(LDFLAGS) sort.o -o _funsort.pure \
- $(FUNLIB) $(LIBS)
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/funtools/gnu/conf.h.in b/funtools/gnu/conf.h.in
deleted file mode 100644
index 5f3fa16..0000000
--- a/funtools/gnu/conf.h.in
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Define as 1 if this compiler supports long long. */
-#undef HAVE_LONG_LONG
-
-/* Define as 1 if you have string.h */
-#undef HAVE_STRING_H
-
-/* Define as 1 if you have stdlib.h */
-#undef HAVE_STDLIB_H
-
-/* Define as 1 if you have malloc.h */
-#undef HAVE_MALLOC_H
-
-/* Define as 1 if you have unistd.h */
-#undef HAVE_UNISTD_H
-
-/* Define as 1 if you have getopt.h */
-#undef HAVE_GETOPT_H
-
-/* Define as 1 if you have values.h */
-#undef HAVE_VALUES_H
-
-/* Define as 1 if you have dlfcn.h */
-#undef HAVE_DLFCN_H
-
-/* Define as 1 if you have sys/un.h */
-#undef HAVE_SYS_UN_H
-
-/* Define as 1 if you have sys/shm.h */
-#undef HAVE_SYS_SHM_H
-
-/* Define as 1 if you have sys/mman.h */
-#undef HAVE_SYS_MMAN_H
-
-/* Define as 1 if you have sys/ipc.h */
-#undef HAVE_SYS_IPC_H
-
-/* Define as 1 if you have socklen_t */
-#undef HAVE_SOCKLEN_T
-
-/* Define as 1 if you have strchr */
-#undef HAVE_STRCHR
-
-/* Define as 1 if you have memcpy */
-#undef HAVE_MEMCPY
-
-/* Define as 1 if you have snprintf */
-#undef HAVE_SNPRINTF
-
-/* Define as 1 if you have Tcl */
-#undef HAVE_TCL
-
-/* Define as 1 if you have Xt */
-#undef HAVE_XT
-
-/* Define as 1 if you are running Cygwin. */
-#undef HAVE_CYGWIN
-
-/* Define as 1 if you are running MinGW. */
-#undef HAVE_MINGW32
diff --git a/funtools/gnu/copyright b/funtools/gnu/copyright
deleted file mode 100644
index 1778779..0000000
--- a/funtools/gnu/copyright
+++ /dev/null
@@ -1,29 +0,0 @@
-Unless otherwise indicated, all source is:
-
-Copyright (C) 1999-2003
-Smithsonian Astrophysical Observatory, Cambridge, MA, USA
-
-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 2 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Correspondence concerning SAOds9 and SAOtk should be addressed as follows:
-
-William Joye
-Smithsonian Astrophysical Observatory
-Garden St.
-Cambridge, MA 02138 USA
-
-wjoye@cfa.harvard.edu
-
-http://hea-www.harvard.edu/RD/ds9/
diff --git a/funtools/gnu/install-sh b/funtools/gnu/install-sh
deleted file mode 100755
index 36f96f3..0000000
--- a/funtools/gnu/install-sh
+++ /dev/null
@@ -1,276 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
-#
-# Copyright 1991 by the Massachusetts Institute of Technology
-#
-# 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, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission. M.I.T. makes no representations about the
-# suitability of this software for any purpose. It is provided "as is"
-# without express or implied warranty.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch. It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
- case $1 in
- -c) instcmd=$cpprog
- shift
- continue;;
-
- -d) dir_arg=true
- shift
- continue;;
-
- -m) chmodcmd="$chmodprog $2"
- shift
- shift
- continue;;
-
- -o) chowncmd="$chownprog $2"
- shift
- shift
- continue;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift
- shift
- continue;;
-
- -s) stripcmd=$stripprog
- shift
- continue;;
-
- -t=*) transformarg=`echo $1 | sed 's/-t=//'`
- shift
- continue;;
-
- -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
- shift
- continue;;
-
- *) if [ x"$src" = x ]
- then
- src=$1
- else
- # this colon is to work around a 386BSD /bin/sh bug
- :
- dst=$1
- fi
- shift
- continue;;
- esac
-done
-
-if [ x"$src" = x ]
-then
- echo "$0: no input file specified" >&2
- exit 1
-else
- :
-fi
-
-if [ x"$dir_arg" != x ]; then
- dst=$src
- src=""
-
- if [ -d "$dst" ]; then
- instcmd=:
- chmodcmd=""
- else
- instcmd=$mkdirprog
- fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad
-# if $src (and thus $dsttmp) contains '*'.
-
- if [ -f "$src" ] || [ -d "$src" ]
- then
- :
- else
- echo "$0: $src does not exist" >&2
- exit 1
- fi
-
- if [ x"$dst" = x ]
- then
- echo "$0: no destination specified" >&2
- exit 1
- else
- :
- fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
- if [ -d "$dst" ]
- then
- dst=$dst/`basename "$src"`
- else
- :
- fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-# this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='
- '
-IFS="${IFS-$defaultIFS}"
-
-oIFS=$IFS
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS=$oIFS
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
- pathcomp=$pathcomp$1
- shift
-
- if [ ! -d "$pathcomp" ] ;
- then
- $mkdirprog "$pathcomp"
- else
- :
- fi
-
- pathcomp=$pathcomp/
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
- $doit $instcmd "$dst" &&
-
- if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
- if [ x"$transformarg" = x ]
- then
- dstfile=`basename "$dst"`
- else
- dstfile=`basename "$dst" $transformbasename |
- sed $transformarg`$transformbasename
- fi
-
-# don't allow the sed command to completely eliminate the filename
-
- if [ x"$dstfile" = x ]
- then
- dstfile=`basename "$dst"`
- else
- :
- fi
-
-# Make a couple of temp file names in the proper directory.
-
- dsttmp=$dstdir/#inst.$$#
- rmtmp=$dstdir/#rm.$$#
-
-# Trap to clean up temp files at exit.
-
- trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
- trap '(exit $?); exit' 1 2 13 15
-
-# Move or copy the file name to the temp name
-
- $doit $instcmd "$src" "$dsttmp" &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing. If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
- if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
-
-# Now remove or move aside any old file at destination location. We try this
-# two ways since rm can't unlink itself on some systems and the destination
-# file might be busy for other reasons. In this case, the final cleanup
-# might fail but the new file should still install successfully.
-
-{
- if [ -f "$dstdir/$dstfile" ]
- then
- $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
- $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
- {
- echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
- (exit 1); exit
- }
- else
- :
- fi
-} &&
-
-# Now rename the file to the real destination.
-
- $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
-
-fi &&
-
-# The final little trick to "correctly" pass the exit status to the exit trap.
-
-{
- (exit 0); exit
-}
diff --git a/funtools/gnu/sort.c b/funtools/gnu/sort.c
deleted file mode 100644
index 56d8bb2..0000000
--- a/funtools/gnu/sort.c
+++ /dev/null
@@ -1,2879 +0,0 @@
-/* sort - sort lines of text (with all kinds of options).
- Copyright (C) 1988, 1991, 1992, 1993, 1994, 1995 Free Software Foundation
-
- 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 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- Written December 1988 by Mike Haertel.
- The author may be reached (Email) at the address mike@gnu.ai.mit.edu,
- or (US mail) as Mike Haertel c/o Free Software Foundation. */
-
-/* define to sort binary data */
-/* #define SAOMOD_BINARY 1 */
-
-/* define to sorts on hms, mjd */
-/* #define SAOMOD_ASTRO 1 */
-
-/* define to sort RDB tables */
-/* #define SAOMOD_TABLE 1 */
-
-/* always define --this just marks code fixes */
-#define SAOMOD_FIX 1
-
-/* Get isblank from GNU libc. */
-#define _GNU_SOURCE
-
-#include <sys/types.h>
-
-#ifndef RTMX
-#include <signal.h>
-#else
-#include <sys/signal.h>
-#endif
-
-#if HAVE_CONFIG_H
-#include <conf.h>
-#endif
-
-#include <stdio.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-#include "system.h"
-#ifdef LOCAL_INCLUDES
-#include "version.h"
-#include "error.h"
-#endif
-
-#ifdef SAOMOD_TABLE
-#include <table.h>
-#endif
-#ifdef SAOMOD_ASTRO
-double mjd();
-#endif
-
-#ifdef _POSIX_VERSION
-#include <limits.h>
-#else
-#ifndef UCHAR_MAX
-#define UCHAR_MAX 255
-#endif
-#endif
-
-#if HAVE_LONG_LONG
-typedef long long longlong;
-#else
-typedef long longlong;
-#endif
-
-static void usage ();
-
-#ifdef SAOMOD_TABLE
- int table = 0;
-#endif
-
-#ifdef SAOMOD_BINARY
- int BinarySort = 0;
-#endif
-
-#define min(a, b) ((a) < (b) ? (a) : (b))
-#define UCHAR_LIM (UCHAR_MAX + 1)
-#define UCHAR(c) ((unsigned char) (c))
-
-#ifndef DEFAULT_TMPDIR
-#define DEFAULT_TMPDIR "/tmp"
-#endif
-
-/* The kind of blanks for '-b' to skip in various options. */
-enum blanktype { bl_start, bl_end, bl_both };
-
-/* The name this program was run with. */
-char *program_name;
-
-/* Table of digits. */
-static int digits[UCHAR_LIM];
-
-/* Table of white space. */
-static int blanks[UCHAR_LIM];
-
-/* Table of non-printing characters. */
-static int nonprinting[UCHAR_LIM];
-
-/* Table of non-dictionary characters (not letters, digits, or blanks). */
-static int nondictionary[UCHAR_LIM];
-
-/* Translation table folding lower case to upper. */
-static char fold_toupper[UCHAR_LIM];
-
-/* Table mapping 3-letter month names to integers.
- Alphabetic order allows binary search. */
-static struct month
-{
- char *name;
- int val;
-} const monthtab[] =
-{
- {"APR", 4},
- {"AUG", 8},
- {"DEC", 12},
- {"FEB", 2},
- {"JAN", 1},
- {"JUL", 7},
- {"JUN", 6},
- {"MAR", 3},
- {"MAY", 5},
- {"NOV", 11},
- {"OCT", 10},
- {"SEP", 9}
-};
-
-/* During the merge phase, the number of files to merge at once. */
-#define NMERGE 48
-
-/* Initial buffer size for in core sorting. Will not grow unless a
- line longer than this is seen. */
-static int sortalloc = 1024 * 1024;
-
-/* Initial buffer size for in core merge buffers. Bear in mind that
- up to NMERGE * mergealloc bytes may be allocated for merge buffers. */
-static int mergealloc = 32 * 1024;
-
-/* Guess of average line length. */
-static int linelength = 30;
-
-/* Maximum number of elements for the array(s) of struct line's, in bytes. */
-#define LINEALLOC (8 * 256 * 1024)
-
-/* Prefix for temporary file names. */
-static char *temp_file_prefix;
-
-/* Flag to reverse the order of all comparisons. */
-static int reverse;
-
-/* Flag for stable sort. This turns off the last ditch bytewise
- comparison of lines, and instead leaves lines in the same order
- they were read if all keys compare equal. */
-static int stable;
-
-/* Tab character separating fields. If NUL, then fields are separated
- by the empty string between a non-whitespace character and a whitespace
- character. */
-static char tab = '\0';
-
-/* Nonzero if any of the input files are the standard input. */
-static int have_read_stdin;
-
-/* Lines are held in core as counted strings. */
-struct line
-{
- char *text; /* Text of the line. */
- int length; /* Length not including final newline. */
- char *keybeg; /* Start of first key. */
- char *keylim; /* Limit of first key. */
-#ifdef SAOMOD_ASTRO
- int flag;
- double value; /* the chached value of the a numeric key. */
-#endif
-};
-
-/* Arrays of lines. */
-struct lines
-{
- struct line *lines; /* Dynamically allocated array of lines. */
- int used; /* Number of slots used. */
- int alloc; /* Number of slots allocated. */
- int limit; /* Max number of slots to allocate. */
-};
-
-/* Input buffers. */
-struct buffer
-{
- char *buf; /* Dynamically allocated buffer. */
- int used; /* Number of bytes used. */
- int alloc; /* Number of bytes allocated. */
- int left; /* Number of bytes left after line parsing. */
-};
-
-/* Lists of key field comparisons to be tried. */
-static struct keyfield
-{
- int sword; /* Zero-origin 'word' to start at. */
- int schar; /* Additional characters to skip. */
- int skipsblanks; /* Skip leading white space at start. */
- int eword; /* Zero-origin first word after field. */
- int echar; /* Additional characters in field. */
- int skipeblanks; /* Skip trailing white space at finish. */
- int *ignore; /* Boolean array of characters to ignore. */
- char *translate; /* Translation applied to characters. */
- int numeric; /* Flag for numeric comparison. */
- int month; /* Flag for comparison by month name. */
- int reverse; /* Reverse the sense of comparison. */
- int nzone;
- double dzone;
- int btype;
- struct keyfield *next; /* Next keyfield to try. */
-} keyhead;
-
-/* The list of temporary files. */
-static struct tempnode
-{
- char *name;
- struct tempnode *next;
-} temphead;
-
-
-/* Flag to remove consecutive duplicate lines from the output.
- Only the last of a sequence of equal lines will be output. */
-static int unique = 0;
-static int differ = 0;
-static int countr = 0;
-static int setcnt = 1;
-
-
-/* Clean up any remaining temporary files. */
-
-static void
-cleanup ()
-{
- struct tempnode *node;
-
- for (node = temphead.next; node; node = node->next)
- unlink (node->name);
-}
-
-/* Allocate N bytes of memory dynamically, with error checking. */
-
-char *
-xmalloc (n)
- unsigned n;
-{
- char *p;
-
- p = (char *)malloc (n);
- if (p == 0)
- {
- fprintf (stderr, "virtual memory exhausted");
- cleanup ();
- exit (2);
- }
- return p;
-}
-
-/* Change the size of an allocated block of memory P to N bytes,
- with error checking.
- If P is NULL, run xmalloc.
- If N is 0, run free and return NULL. */
-
-char *
-xrealloc (p, n)
- char *p;
- unsigned n;
-{
- if (p == 0)
- return (char *)xmalloc (n);
- if (n == 0)
- {
- free (p);
- return 0;
- }
- p = (char *)realloc (p, n);
- if (p == 0)
- {
- fprintf (stderr, "virtual memory exhausted");
- cleanup ();
- exit (2);
- }
- return p;
-}
-static FILE *
-xfopen (file, how)
- char *file, *how;
-{
-#ifdef SAOMOD_TABLE
- FILE *fp = Open(file, how);
-#else
- FILE *fp;
- if ( !strcmp(file, "-") && !strcmp(how, "r") ) fp = stdin;
- else if ( !strcmp(file, "-") && !strcmp(how, "w") ) fp = stdout;
- else fp = fopen(file, how);
-#endif
-
- if (fp == 0) {
- perror (file);
- cleanup ();
- exit (2);
- }
-
- if (fp == stdin) have_read_stdin = 1;
-
- return fp;
-}
-
-static void
-xfclose (fp)
- FILE *fp;
-{
- if (fp == stdin) {
- /* Allow reading stdin from tty more than once. */
- if (feof (fp))
- clearerr (fp);
- } else if ( fp == stdout ) {
- if (fflush (fp) != 0) {
- perror ("flushing file");
- cleanup ();
- exit (2);
- }
- } else {
-#ifdef SAOMOD_TABLE
- if ( Close(fp) != 0 ) {
-#else
- if ( fclose(fp) != 0 ) {
-#endif
-
- perror ("closing file");
- cleanup ();
- exit (2);
- }
- }
-}
-
-static void
-xfwrite (buf, size, nelem, fp)
- char *buf;
- int size, nelem;
- FILE *fp;
-{
- if (fwrite (buf, size, nelem, fp) != (size_t)nelem)
- {
- perror ("writing file");
- cleanup ();
- exit (2);
- }
-}
-
-/* Return a name for a temporary file. */
-
-static char *
-tempname ()
-{
- static int seq;
- int len = strlen (temp_file_prefix);
- char *name = xmalloc (len + 16);
- struct tempnode *node =
- (struct tempnode *) xmalloc (sizeof (struct tempnode));
-
- sprintf (name,
- "%s%ssort%5.5d%5.5d",
- temp_file_prefix,
- (len && temp_file_prefix[len - 1] != '/') ? "/" : "",
- (unsigned int) getpid () & 0xffff, ++seq);
- node->name = name;
- node->next = temphead.next;
- temphead.next = node;
- return name;
-}
-
-/* Search through the list of temporary files for NAME;
- remove it if it is found on the list. */
-
-static void
-zaptemp (name)
- char *name;
-{
- struct tempnode *node, *temp;
-
- for (node = &temphead; node->next; node = node->next)
- if (!strcmp (name, node->next->name))
- break;
- if (node->next)
- {
- temp = node->next;
- unlink (temp->name);
- free (temp->name);
- node->next = temp->next;
- free ((char *) temp);
- }
-}
-
-/* Initialize the character class tables. */
-
-static void
-inittables ()
-{
- int i;
-
- for (i = 0; i < UCHAR_LIM; ++i)
- {
- if (ISBLANK (i))
- blanks[i] = 1;
- if (ISDIGIT (i))
- digits[i] = 1;
- if (!ISPRINT (i))
- nonprinting[i] = 1;
- if (!ISALNUM (i) && !ISBLANK (i))
- nondictionary[i] = 1;
- if (ISLOWER (i))
- fold_toupper[i] = toupper (i);
- else
- fold_toupper[i] = i;
- }
-}
-
-/* Initialize BUF, allocating ALLOC bytes initially. */
-
-static void
-initbuf (buf, alloc)
- struct buffer *buf;
- int alloc;
-{
- buf->alloc = alloc;
- buf->buf = xmalloc (buf->alloc);
- buf->used = buf->left = 0;
-}
-
-/* Fill BUF reading from FP, moving buf->left bytes from the end
- of buf->buf to the beginning first. If EOF is reached and the
- file wasn't terminated by a newline, supply one. Return a count
- of bytes buffered. */
-
-static int
-fillbuf (buf, fp)
- struct buffer *buf;
- FILE *fp;
-{
- int cc;
-
- memmove (buf->buf, buf->buf + buf->used - buf->left, buf->left);
- buf->used = buf->left;
-
-#ifdef SAOMOD_BINARY
- if ( BinarySort ) {
- cc = fread (buf->buf + buf->used, 1, buf->alloc - buf->used, fp);
-
- buf->used += cc;
-
- return buf->used;
- }
-#endif
-
- while (!feof (fp) && (buf->used == 0 || !memchr (buf->buf, '\n', buf->used)))
- {
- if (buf->used == buf->alloc)
- {
- buf->alloc *= 2;
- buf->buf = xrealloc (buf->buf, buf->alloc);
- }
- cc = fread (buf->buf + buf->used, 1, buf->alloc - buf->used, fp);
- if (ferror (fp))
- {
- perror ("reading file");
- cleanup ();
- exit (2);
- }
- buf->used += cc;
- }
-
- if (feof (fp) && buf->used && buf->buf[buf->used - 1] != '\n')
- {
- if (buf->used == buf->alloc)
- {
- buf->alloc *= 2;
- buf->buf = xrealloc (buf->buf, buf->alloc);
- }
- buf->buf[buf->used++] = '\n';
- }
-
- return buf->used;
-}
-
-/* Initialize LINES, allocating space for ALLOC lines initially.
- LIMIT is the maximum possible number of lines to allocate space
- for, ever. */
-
-static void
-initlines (lines, alloc, limit)
- struct lines *lines;
- int alloc;
- int limit;
-{
- lines->alloc = alloc;
- lines->lines = (struct line *) xmalloc (lines->alloc * sizeof (struct line));
- lines->used = 0;
- lines->limit = limit;
-}
-
-/* Return a pointer to the first character of the field specified
- by KEY in LINE. */
-
-static char *
-begfield (line, key)
- struct line *line;
- struct keyfield *key;
-{
- register char *ptr = line->text, *lim = ptr + line->length;
- register int sword = key->sword, schar = key->schar;
-
- if (tab)
- while (ptr < lim && sword--)
- {
- while (ptr < lim && *ptr != tab)
- ++ptr;
- if (ptr < lim)
- ++ptr;
- }
- else
- while (ptr < lim && sword--)
- {
- while (ptr < lim && blanks[UCHAR (*ptr)])
- ++ptr;
- while (ptr < lim && !blanks[UCHAR (*ptr)])
- ++ptr;
- }
-
- if (key->skipsblanks
-#ifdef SAOMOD_TABLE
-||table
-#endif
- )
- while (ptr < lim && blanks[UCHAR (*ptr)])
- ++ptr;
-
- while (ptr < lim && schar--)
- ++ptr;
-
- return ptr;
-}
-
-/* Return the limit of (a pointer to the first character after) the field
- in LINE specified by KEY. */
-
-static char *
-limfield (line, key)
- struct line *line;
- struct keyfield *key;
-{
- register char *ptr = line->text, *lim = ptr + line->length;
- register int eword = key->eword, echar = key->echar;
-
- if ( eword == -1 ) {
- eword = 1;
- echar = 0;
- }
-
- if (tab)
- while (ptr < lim && eword--)
- {
- while (ptr < lim && *ptr != tab)
- ++ptr;
- if (ptr < lim && (eword > 0 || key->skipeblanks))
- ++ptr;
- }
- else
- while (ptr < lim && eword--)
- {
- while (ptr < lim && blanks[UCHAR (*ptr)])
- ++ptr;
- while (ptr < lim && !blanks[UCHAR (*ptr)])
- ++ptr;
- }
-
-#ifdef SAOMOD_TABLE
- if ( table ) {
- if ( blanks[UCHAR (*ptr)] ) {
- while (ptr > line->text && blanks[UCHAR (*ptr)] ) --ptr;
- ptr++;
- }
- } else
-#endif
- {
- if (key->skipeblanks)
- while (ptr < lim && blanks[UCHAR (*ptr)])
- ++ptr;
-
- while (ptr < lim && echar--)
- ++ptr;
- }
-
- return ptr;
-}
-
-/* Find the lines in BUF, storing pointers and lengths in LINES.
- Also replace newlines with NULs. */
-
-static void
-findlines (buf, lines)
- struct buffer *buf;
- struct lines *lines;
-{
- register char *beg = buf->buf, *lim = buf->buf + buf->used, *ptr;
- struct keyfield *key = keyhead.next;
-
- lines->used = 0;
-
-#ifdef SAOMOD_BINARY
- if ( lim - beg < BinarySort ) {
- fprintf(stderr, "Odd sized records in buffer?\n");
- cleanup();
- abort();
- }
-#else
- if ( lim - beg < 0 ) {
- fprintf(stderr, "Odd sized records in buffer?\n");
- cleanup();
- abort();
- }
-#endif
-
-#ifdef SAOMOD_BINARY
- if ( BinarySort ) {
- while ( beg + BinarySort <= lim )
- {
-
- if (lines->used == lines->alloc)
- {
- lines->alloc *= 2;
- lines->lines = (struct line *)
- xrealloc ((char *) lines->lines,
- lines->alloc * sizeof (struct line));
- }
-
- lines->lines[lines->used].text = beg;
- lines->lines[lines->used].length = BinarySort;
-#ifdef SAOMOD_ASTRO
- lines->lines[lines->used].flag = 0;
-#endif
-
- beg += BinarySort;
- lines->used++;
- }
-
- buf->left = lim - beg;
- return;
- }
-#endif
-
- while (beg < lim && (ptr = memchr (beg, '\n', lim - beg))
- && lines->used < lines->limit)
- {
- /* There are various places in the code that rely on a NUL
- being at the end of in-core lines; NULs inside the lines
- will not cause trouble, though. */
- *ptr = '\0';
-
- if (lines->used == lines->alloc)
- {
- lines->alloc *= 2;
- lines->lines = (struct line *)
- xrealloc ((char *) lines->lines,
- lines->alloc * sizeof (struct line));
- }
-
- lines->lines[lines->used].text = beg;
- lines->lines[lines->used].length = ptr - beg;
-#ifdef SAOMOD_ASTRO
- lines->lines[lines->used].flag = 0;
-#endif
-
- /* Precompute the position of the first key for efficiency. */
- if (key)
- {
- if ( key->eword >= 0
-#ifdef SAOMOD_TABLE
- || table
-#endif
- )
- lines->lines[lines->used].keylim =
- limfield (&lines->lines[lines->used], key);
- else
- lines->lines[lines->used].keylim = ptr;
-
- if (key->sword >= 0)
- lines->lines[lines->used].keybeg =
- begfield (&lines->lines[lines->used], key);
- else
- {
- if (key->skipsblanks
-#ifdef SAOMOD_TABLE
-||table
-#endif
-)
- while (blanks[UCHAR (*beg)])
- ++beg;
- lines->lines[lines->used].keybeg = beg;
- }
- }
- else
- {
- lines->lines[lines->used].keybeg = 0;
- lines->lines[lines->used].keylim = 0;
- }
-
- ++lines->used;
- beg = ptr + 1;
- }
-
- buf->left = lim - beg;
-}
-
-/* Compare strings A and B containing decimal fractions < 1. Each string
- should begin with a decimal point followed immediately by the digits
- of the fraction. Strings not of this form are considered to be zero. */
-
-static int
-fraccompare (a, b)
- register char *a, *b;
-{
- register int tmpa = UCHAR (*a), tmpb = UCHAR (*b);
-
- if (tmpa == '.' && tmpb == '.')
- {
- do
- tmpa = UCHAR (*++a), tmpb = UCHAR (*++b);
- while (tmpa == tmpb && digits[tmpa]);
- if (digits[tmpa] && digits[tmpb])
- return tmpa - tmpb;
- if (digits[tmpa])
- {
- while (tmpa == '0')
- tmpa = UCHAR (*++a);
- if (digits[tmpa])
- return 1;
- return 0;
- }
- if (digits[tmpb])
- {
- while (tmpb == '0')
- tmpb = UCHAR (*++b);
- if (digits[tmpb])
- return -1;
- return 0;
- }
- return 0;
- }
- else if (tmpa == '.')
- {
- do
- tmpa = UCHAR (*++a);
- while (tmpa == '0');
- if (digits[tmpa])
- return 1;
- return 0;
- }
- else if (tmpb == '.')
- {
- do
- tmpb = UCHAR (*++b);
- while (tmpb == '0');
- if (digits[tmpb])
- return -1;
- return 0;
- }
- return 0;
-}
-
-/* Compare strings A and B as numbers without explicitly converting them to
- machine numbers. Comparatively slow for short strings, but asymptotically
- hideously fast. */
-
-static int
-numcompare (a, b)
- register char *a, *b;
-{
- register int tmpa, tmpb, loga, logb, tmp;
-
- tmpa = UCHAR (*a), tmpb = UCHAR (*b);
-
-
- while (blanks[tmpa])
- tmpa = UCHAR (*++a);
- while (blanks[tmpb])
- tmpb = UCHAR (*++b);
-
- if (tmpa == '-')
- {
- tmpa = UCHAR (*++a);
- if (tmpb != '-')
- {
- if (digits[tmpa] && digits[tmpb])
- return -1;
- return 0;
- }
- tmpb = UCHAR (*++b);
-
- while (tmpa == '0')
- tmpa = UCHAR (*++a);
- while (tmpb == '0')
- tmpb = UCHAR (*++b);
-
- while (tmpa == tmpb && digits[tmpa])
- tmpa = UCHAR (*++a), tmpb = UCHAR (*++b);
-
- if ((tmpa == '.' && !digits[tmpb]) || (tmpb == '.' && !digits[tmpa]))
- return -fraccompare (a, b);
-
- if (digits[tmpa])
- for (loga = 1; digits[UCHAR (*++a)]; ++loga)
- ;
- else
- loga = 0;
-
- if (digits[tmpb])
- for (logb = 1; digits[UCHAR (*++b)]; ++logb)
- ;
- else
- logb = 0;
-
- if ((tmp = logb - loga) != 0)
- return tmp;
-
- if (!loga)
- return 0;
-
- return tmpb - tmpa;
- }
- else if (tmpb == '-')
- {
- if (digits[UCHAR (tmpa)] && digits[UCHAR (*++b)])
- return 1;
- return 0;
- }
- else
- {
- while (tmpa == '0')
- tmpa = UCHAR (*++a);
- while (tmpb == '0')
- tmpb = UCHAR (*++b);
-
- while (tmpa == tmpb && digits[tmpa])
- tmpa = UCHAR (*++a), tmpb = UCHAR (*++b);
-
- if ((tmpa == '.' && !digits[tmpb]) || (tmpb == '.' && !digits[tmpa]))
- return fraccompare (a, b);
-
- if (digits[tmpa])
- for (loga = 1; digits[UCHAR (*++a)]; ++loga)
- ;
- else
- loga = 0;
-
- if (digits[tmpb])
- for (logb = 1; digits[UCHAR (*++b)]; ++logb)
- ;
- else
- logb = 0;
-
- if ((tmp = loga - logb) != 0)
- return tmp;
-
- if (!loga)
- return 0;
-
- return tmpa - tmpb;
- }
-}
-
-/* Return an integer <= 12 associated with month name S with length LEN,
- 0 if the name in S is not recognized. */
-
-static int
-getmonth (s, len)
- char *s;
- int len;
-{
- char month[4];
- register int i, lo = 0, hi = 12;
-
- while (len > 0 && blanks[UCHAR(*s)])
- ++s, --len;
-
- if (len < 3)
- return 0;
-
- for (i = 0; i < 3; ++i)
- month[i] = fold_toupper[UCHAR (s[i])];
- month[3] = '\0';
-
- while (hi - lo > 1)
- if (strcmp (month, monthtab[(lo + hi) / 2].name) < 0)
- hi = (lo + hi) / 2;
- else
- lo = (lo + hi) / 2;
- if (!strcmp (month, monthtab[lo].name))
- return monthtab[lo].val;
- return 0;
-}
-
-/* Compare two lines A and B trying every key in sequence until there
- are no more keys or a difference is found. */
-
-static int
-keycompare (a, b)
- struct line *a, *b;
-{
- register char *texta, *textb, *lima, *limb, *translate;
- register int *ignore;
- struct keyfield *key;
- int diff = 0, iter = 0, lena, lenb;
-
- for (key = keyhead.next; key; key = key->next, ++iter)
- {
- ignore = key->ignore;
- translate = key->translate;
-
-#ifdef SAOMOD_BINARY
- if ( BinarySort ) {
- switch ( key->btype ) {
- case 'c' :
- case 'b' : {
- char va, vb;
-
- va = *((char *) a->text+key->sword);
- vb = *((char *) b->text+key->sword);
-
- if ( key->nzone ) {
- va = (int) (va / key->dzone);
- vb = (int) (vb / key->dzone);
- }
-
- diff = va == vb ? 0 : ( va < vb ? -1 : 1 );
- break;
- }
- case 'C' :
- case 'B' : {
- unsigned char va, vb;
-
- va = *((unsigned char *) a->text+key->sword);
- vb = *((unsigned char *) b->text+key->sword);
-
- if ( key->nzone ) {
- va = (int) (va / key->dzone);
- vb = (int) (vb / key->dzone);
- }
-
- diff = va == vb ? 0 : ( va < vb ? -1 : 1 );
- break;
- }
- case 's' : {
- short va, vb;
-
- if ( !iter ) {
- memcpy(&va, (void *) (a->text+key->sword), sizeof(short));
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(short));
- if ( key->nzone ) {
- va = (int) (va / key->dzone);
- vb = (int) (vb / key->dzone);
- }
- } else {
-#ifdef SAOMOD_ASTRO
- if ( a->flag ) va = a->value;
- else {
-#endif
- memcpy(&va, (void *) (a->text+key->sword), sizeof(short));
- if ( key->nzone ) va = (int) (va / key->dzone);
-#ifdef SAOMOD_ASTRO
- a->flag = 1;
- a->value = va;
- }
- if ( b->flag ) vb = b->value;
- else {
-#endif
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(short));
- if ( key->nzone ) va = (int) (vb / key->dzone);
-#ifdef SAOMOD_ASTRO
- b->flag = 1;
- b->value = vb;
- }
-#endif
- }
-
- diff = va == vb ? 0 : ( va < vb ? -1 : 1 );
- break;
- }
- case 'S' : {
- unsigned short va, vb;
-
- if ( !iter ) {
- memcpy(&va, (void *) (a->text+key->sword), sizeof(short));
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(short));
- if ( key->nzone ) {
- va = (int) (va / key->dzone);
- vb = (int) (vb / key->dzone);
- }
- } else {
-#ifdef SAOMOD_ASTRO
- if ( a->flag ) va = a->value;
- else {
-#endif
- memcpy(&va, (void *) (a->text+key->sword), sizeof(short));
- if ( key->nzone ) va = (int) (va / key->dzone);
-#ifdef SAOMOD_ASTRO
- a->flag = 1;
- a->value = va;
- }
- if ( b->flag ) vb = b->value;
- else {
-#endif
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(short));
- if ( key->nzone ) va = (int) (vb / key->dzone);
-#ifdef SAOMOD_ASTRO
- b->flag = 1;
- b->value = vb;
- }
-#endif
- }
-
- diff = va == vb ? 0 : ( va < vb ? -1 : 1 );
- break;
- }
- case 'i' : {
- int va, vb;
-
- if ( !iter ) {
- memcpy(&va, (void *) (a->text+key->sword), sizeof(int));
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(int));
- if ( key->nzone ) {
- va = (int) (va / key->dzone);
- vb = (int) (vb / key->dzone);
- }
- } else {
-#ifdef SAOMOD_ASTRO
- if ( a->flag ) va = a->value;
- else {
-#endif
- memcpy(&va, (void *) (a->text+key->sword), sizeof(int));
- if ( key->nzone ) va = (int) (va / key->dzone);
-#ifdef SAOMOD_ASTRO
- a->flag = 1;
- a->value = va;
- }
- if ( b->flag ) vb = b->value;
- else {
-#endif
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(int));
- if ( key->nzone ) va = (int) (vb / key->dzone);
-#ifdef SAOMOD_ASTRO
- b->flag = 1;
- b->value = vb;
- }
-#endif
- }
-
- diff = va == vb ? 0 : ( va < vb ? -1 : 1 );
- break;
- }
- case 'l' : {
- longlong va, vb;
-#if HAVE_LONG_LONG == 0
- fprintf (stderr, "long long support was not built into this program\n");
- exit(1);
-#endif
- if ( !iter ) {
- memcpy(&va, (void *) (a->text+key->sword), sizeof(longlong));
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(longlong));
- if ( key->nzone ) {
- va = (longlong) (va / key->dzone);
- vb = (longlong) (vb / key->dzone);
- }
- } else {
-#ifdef SAOMOD_ASTRO
- if ( a->flag ) va = a->value;
- else {
-#endif
- memcpy(&va, (void *) (a->text+key->sword), sizeof(longlong));
- if ( key->nzone ) va = (longlong) (va / key->dzone);
-#ifdef SAOMOD_ASTRO
- a->flag = 1;
- a->value = va;
- }
- if ( b->flag ) vb = b->value;
- else {
-#endif
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(longlong));
- if ( key->nzone ) va = (longlong) (vb / key->dzone);
-#ifdef SAOMOD_ASTRO
- b->flag = 1;
- b->value = vb;
- }
-#endif
- }
-
- diff = va == vb ? 0 : ( va < vb ? -1 : 1 );
- break;
- }
- case 'I' : {
- unsigned int va, vb;
-
- if ( !iter ) {
- memcpy(&va, (void *) (a->text+key->sword), sizeof(int));
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(int));
- if ( key->nzone ) {
- va = (int) (va / key->dzone);
- vb = (int) (vb / key->dzone);
- }
- } else {
-#ifdef SAOMOD_ASTRO
- if ( a->flag ) va = a->value;
- else {
-#endif
- memcpy(&va, (void *) (a->text+key->sword), sizeof(int));
- if ( key->nzone ) va = (int) (va / key->dzone);
-#ifdef SAOMOD_ASTRO
- a->flag = 1;
- a->value = va;
- }
- if ( b->flag ) vb = b->value;
- else {
-#endif
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(int));
- if ( key->nzone ) va = (int) (vb / key->dzone);
-#ifdef SAOMOD_ASTRO
- b->flag = 1;
- b->value = vb;
- }
-#endif
- }
-
- diff = va == vb ? 0 : ( va < vb ? -1 : 1 );
- break;
- }
- case 'f' : {
- float va, vb;
-
- if ( !iter ) {
- memcpy(&va, (void *) (a->text+key->sword), sizeof(float));
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(float));
- if ( key->nzone ) {
- va = (int) (va / key->dzone);
- vb = (int) (vb / key->dzone);
- }
- } else {
-#ifdef SAOMOD_ASTRO
- if ( a->flag ) va = a->value;
- else {
-#endif
- memcpy(&va, (void *) (a->text+key->sword), sizeof(float));
- if ( key->nzone ) va = (int) (va / key->dzone);
-#ifdef SAOMOD_ASTRO
- a->flag = 1;
- a->value = va;
- }
- if ( b->flag ) vb = b->value;
- else {
-#endif
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(float));
- if ( key->nzone ) va = (int) (vb / key->dzone);
-#ifdef SAOMOD_ASTRO
- b->flag = 1;
- b->value = vb;
- }
-#endif
- }
-
- diff = va == vb ? 0 : ( va < vb ? -1 : 1 );
- break;
- }
- case 'd' : {
- double va, vb;
-
- if ( !iter ) {
- memcpy(&va, (void *) (a->text+key->sword), sizeof(double));
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(double));
- if ( key->nzone ) {
- va = (int) (va / key->dzone);
- vb = (int) (vb / key->dzone);
- }
- } else {
-#ifdef SAOMOD_ASTRO
- if ( a->flag ) va = a->value;
- else {
-#endif
- memcpy(&va, (void *) (a->text+key->sword), sizeof(double));
- if ( key->nzone ) va = (int) (va / key->dzone);
-#ifdef SAOMOD_ASTRO
- a->flag = 1;
- a->value = va;
- }
- if ( b->flag ) vb = b->value;
- else {
-#endif
- memcpy(&vb, (void *) (b->text+key->sword), sizeof(double));
- if ( key->nzone ) va = (int) (vb / key->dzone);
-#ifdef SAOMOD_ASTRO
- b->flag = 1;
- b->value = vb;
- }
-#endif
- }
-
- diff = va == vb ? 0 : ( va < vb ? -1 : 1 );
- break;
- }
- case 't' : {
- diff = strncmp(a->text+key->sword, b->text+key->sword, key->schar);
- break;
- }
- default:
- fprintf(stderr, "Bad type in binary value compare\n");
- cleanup();
- abort();
- }
-
- if ( diff ) return diff;
- continue;
- }
-#endif
-
- /* Find the beginning and limit of each field. */
- if (iter || a->keybeg == NULL || b->keybeg == NULL)
- {
- if ( key->eword >= 0
-#ifdef SAOMOD_TABLE
-|| table
-#endif
- ) {
- lima = limfield (a, key);
- limb = limfield (b, key);
- } else {
- lima = a->text + a->length;
- limb = b->text + b->length;
- }
-
- if (key->sword >= 0) {
- texta = begfield (a, key); textb = begfield (b, key);
- } else {
- texta = a->text; textb = b->text;
- if (key->skipsblanks
-#ifdef SAOMOD_TABLE
-||table
-#endif
-)
- {
- while (texta < lima && blanks[UCHAR (*texta)])
- ++texta;
- while (textb < limb && blanks[UCHAR (*textb)])
- ++textb;
- }
- }
- }
- else
- {
- /* For the first iteration only, the key positions have
- been precomputed for us. */
- texta = a->keybeg; lima = a->keylim;
- textb = b->keybeg; limb = b->keylim;
- }
-
- /* Find the lengths. */
- lena = lima - texta; lenb = limb - textb;
- if (lena < 0)
- lena = 0;
- if (lenb < 0)
- lenb = 0;
-
- /* Actually compare the fields. */
- if ( key->numeric ) {
-#ifdef SAOMOD_FIX
- if ( *texta != '+' && *texta != '-' && !ISDIGIT((int)*texta) ) {
- if ( *textb != '+' && *textb != '-' && !ISDIGIT((int)*textb) ) {
- diff = memcmp (texta, textb, min(lena, lenb));
- } else {
- diff = 1;
- }
- } else
- if ( *textb != '+' && *textb != '-' && !ISDIGIT((int)*textb) ) {
- diff = -1;
- } else
-#endif
-#ifdef SAOMOD_ASTRO
- if ( key->numeric == 2 || key->numeric == 3 ) {
- double va;
- double vb;
-
- static int x = 0;
-
- if ( iter ) {
- if (*lima || *limb) {
- char savea = *lima;
- char saveb = *limb;
-
- *lima = *limb = '\0';
-
- if ( key->numeric == 2 ) {
- va = SAOstrtod(texta, NULL);
- vb = SAOstrtod(textb, NULL);
- } else {
- va = mjd(texta, 0);
- vb = mjd(textb, 0);
- }
-
- *lima = savea; *limb = saveb;
- } else {
- if ( key->numeric == 2 ) {
- va = SAOstrtod(texta, NULL);
- vb = SAOstrtod(textb, NULL);
- } else {
- va = mjd(texta, 0);
- vb = mjd(textb, 0);
- }
- }
- } else {
- if ( a->flag ) va = a->value;
- else {
- char savea = *lima;
-
- *lima = '\0';
- if ( key->numeric == 2 ) {
- va = a->value = SAOstrtod(texta, NULL);
- } else {
- va = mjd(texta, 0);
- }
- *lima = savea;
- a->flag++;
-
- }
- if ( b->flag ) vb = b->value;
- else {
- char saveb = *limb;
-
- *limb = '\0';
- if ( key->numeric == 2 ) {
- vb = b->value = SAOstrtod(textb, NULL);
- } else {
- vb = mjd(textb, 0);
- }
- *limb = saveb;
- b->flag++;
- }
- }
-
- if ( key->nzone ) {
- va = (int) (va / key->dzone);
- vb = (int) (vb / key->dzone);
- }
-
- diff = (va < vb) ? -1 : ((va == vb) ? 0 : 1);
-
- if ( diff )
- return key->reverse ? -diff : diff;
- continue;
- } else
-#endif
- if ( key->numeric == 1 )
- {
- if (*lima || *limb)
- {
- char savea = *lima; char saveb = *limb;
-
- *lima = *limb = '\0';
-
- diff = numcompare (texta, textb);
- *lima = savea, *limb = saveb;
- }
- else {
- diff = numcompare (texta, textb);
- }
-
-
- if (diff)
- return key->reverse ? -diff : diff;
- continue;
- }
-#ifdef SAOMOD_FIX
- if (diff) /* This catches the text diffs */
- return key->reverse ? -diff : diff;
-#endif
- }
- else if (key->month)
- {
- diff = getmonth (texta, lena) - getmonth (textb, lenb);
- if (diff)
- return key->reverse ? -diff : diff;
- continue;
- }
- else if (ignore && translate)
- while (texta < lima && textb < limb)
- {
- while (texta < lima && ignore[UCHAR (*texta)])
- ++texta;
- while (textb < limb && ignore[UCHAR (*textb)])
- ++textb;
- if (texta < lima && textb < limb &&
- translate[UCHAR (*texta++)] != translate[UCHAR (*textb++)])
- {
- diff = translate[UCHAR (*--texta)] - translate[UCHAR (*--textb)];
- break;
- }
- else if (texta == lima && textb < limb) diff = -1;
- else if (texta < lima && textb == limb) diff = 1;
- }
- else if (ignore)
- while (texta < lima && textb < limb)
- {
- while (texta < lima && ignore[UCHAR (*texta)])
- ++texta;
- while (textb < limb && ignore[UCHAR (*textb)])
- ++textb;
- if (texta < lima && textb < limb && *texta++ != *textb++)
- {
- diff = *--texta - *--textb;
- break;
- }
- else if (texta == lima && textb < limb) diff = -1;
- else if (texta < lima && textb == limb) diff = 1;
- }
- else if (translate)
- while (texta < lima && textb < limb)
- {
- if (translate[UCHAR (*texta++)] != translate[UCHAR (*textb++)])
- {
- diff = translate[UCHAR (*--texta)] - translate[UCHAR (*--textb)];
- break;
- }
- }
- else
- diff = memcmp (texta, textb, min (lena, lenb));
-
- if (diff)
- return key->reverse ? -diff : diff;
- if ((diff = lena - lenb) != 0)
- return key->reverse ? -diff : diff;
- }
-
- return 0;
-}
-
-/* Compare two lines A and B, returning negative, zero, or positive
- depending on whether A compares less than, equal to, or greater than B. */
-
-static int
-compare (a, b)
- register struct line *a, *b;
-{
- int diff, tmpa, tmpb, mini;
-
- /* First try to compare on the specified keys (if any).
- The only two cases with no key at all are unadorned sort,
- and unadorned sort -r. */
- if (keyhead.next)
- {
- diff = keycompare (a, b);
- if (diff != 0)
- return diff;
- if (unique || stable)
- return 0;
- }
-
- /* If the keys all compare equal (or no keys were specified)
- fall through to the default byte-by-byte comparison. */
- tmpa = a->length, tmpb = b->length;
- mini = min (tmpa, tmpb);
- if (mini == 0)
- diff = tmpa - tmpb;
- else
- {
- char *ap = a->text, *bp = b->text;
-
- diff = UCHAR (*ap) - UCHAR (*bp);
- if (diff == 0)
- {
- diff = memcmp (ap, bp, mini);
- if (diff == 0)
- diff = tmpa - tmpb;
- }
- }
-
- return reverse ? -diff : diff;
-}
-
-/* Check that the lines read from the given FP come in order. Return
- 1 if they do and 0 if there is a disorder. */
-
-static int line;
-static int
-checkfp (fp)
- FILE *fp;
-{
- struct buffer buf; /* Input buffer. */
- struct lines lines; /* Lines scanned from the buffer. */
- struct line *prev_line; /* Pointer to previous line. */
- struct line temp; /* Copy of previous line. */
- int cc; /* Character count. */
- int cmp; /* Result of calling compare. */
- int alloc, i, success = 1;
-
- initbuf (&buf, mergealloc);
- initlines (&lines, mergealloc / linelength + 1,
- LINEALLOC / ((NMERGE + NMERGE) * sizeof (struct line)));
- alloc = linelength;
- temp.text = xmalloc (alloc);
-
- cc = fillbuf (&buf, fp);
- findlines (&buf, &lines);
-
- if (cc)
- do
- {
-
- /* Compare each line in the buffer with its successor. */
- for (i = 0; i < lines.used - 1; ++i)
- {
- line++;
- cmp = compare (&lines.lines[i], &lines.lines[i + 1]);
- if ((unique && cmp >= 0) || (cmp > 0))
- {
- success = 0;
- goto finish;
- }
- }
-
- /* Save the last line of the buffer and refill the buffer. */
- prev_line = lines.lines + lines.used - 1;
- if (prev_line->length > alloc)
- {
- while (prev_line->length + 1 > alloc)
- alloc *= 2;
- temp.text = xrealloc (temp.text, alloc);
- }
- memcpy (temp.text, prev_line->text, prev_line->length + 1);
- temp.length = prev_line->length;
- temp.keybeg = temp.text + (prev_line->keybeg - prev_line->text);
- temp.keylim = temp.text + (prev_line->keylim - prev_line->text);
-#ifdef SAOMOD_ASTRO
- temp.flag = prev_line->flag;
- temp.value = prev_line->value;
-#endif
-
- cc = fillbuf (&buf, fp);
- if (cc)
- {
- findlines (&buf, &lines);
- /* Make sure the line saved from the old buffer contents is
- less than or equal to the first line of the new buffer. */
- cmp = compare (&temp, &lines.lines[0]);
- if ((unique && cmp >= 0) || (cmp > 0))
- {
- success = 0;
- break;
- }
- }
- }
- while (cc);
-
-finish:
- xfclose (fp);
- free (buf.buf);
- free ((char *) lines.lines);
- free (temp.text);
- return success;
-}
-
-/* Merge lines from FPS onto OFP. NFPS cannot be greater than NMERGE.
- Close FPS before returning. */
-
-static void
-mergefps (fps, nfps, ofp)
- FILE *fps[], *ofp;
- register int nfps;
-{
- struct buffer buffer[NMERGE]; /* Input buffers for each file. */
- struct lines lines[NMERGE]; /* Line tables for each buffer. */
- struct line saved; /* Saved line for unique check. */
- int savedflag = 0; /* True if there is a saved line. */
- int savealloc = 0; /* Size allocated for the saved line. */
- int cur[NMERGE]; /* Current line in each line table. */
- int ord[NMERGE]; /* Table representing a permutation of fps,
- such that lines[ord[0]].lines[cur[ord[0]]]
- is the smallest line and will be next
- output. */
- register int i, j, t;
-
- /* Allocate space for a saved line if necessary. */
- if (unique)
- {
- savealloc = linelength;
- saved.text = xmalloc (savealloc);
-#ifdef SAOMOD_ASTRO
- saved.flag = 0;
-#endif
- }
-
- /* Read initial lines from each input file. */
- for (i = 0; i < nfps; ++i)
- {
- initbuf (&buffer[i], mergealloc);
- /* If a file is empty, eliminate it from future consideration. */
- while (i < nfps && !fillbuf (&buffer[i], fps[i]))
- {
- xfclose (fps[i]);
- --nfps;
- for (j = i; j < nfps; ++j)
- fps[j] = fps[j + 1];
- }
- if (i == nfps)
- free (buffer[i].buf);
- else
- {
- initlines (&lines[i], mergealloc / linelength + 1,
- LINEALLOC / ((NMERGE + NMERGE) * sizeof (struct line)));
- findlines (&buffer[i], &lines[i]);
- cur[i] = 0;
- }
- }
-
- /* Set up the ord table according to comparisons among input lines.
- Since this only reorders two items if one is strictly greater than
- the other, it is stable. */
- for (i = 0; i < nfps; ++i)
- ord[i] = i;
- for (i = 1; i < nfps; ++i)
- if (compare (&lines[ord[i - 1]].lines[cur[ord[i - 1]]],
- &lines[ord[i]].lines[cur[ord[i]]]) > 0)
- t = ord[i - 1], ord[i - 1] = ord[i], ord[i] = t, i = 0;
-
- /* Repeatedly output the smallest line until no input remains. */
- while ( nfps )
- {
- /* If uniqified output is turned on, output only the last of
- an identical series of lines. */
- if (unique)
- { int cmp;
-
- if ( savedflag ) {
- cmp = compare (&saved, &lines[ord[0]].lines[cur[ord[0]]]);
-
- if ( !cmp ) {
- savedflag++;
- } else {
- if ( savedflag >= 1 ) {
- if ( !differ ) {
- if ( countr )
- fprintf(ofp, "%d\t", savedflag);
- xfwrite (saved.text, 1, saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- } else {
- if ( (differ == 1 && savedflag == 1)
- || (differ == 2 && savedflag >= 2) ) {
- xfwrite (saved.text, 1, saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
- }
-
- if ( differ == 3 ) setcnt++;
-
- savedflag = 0;
- }
- }
- }
-
- if ( !savedflag) {
- if (savealloc < lines[ord[0]].lines[cur[ord[0]]].length + 1)
- {
- while (savealloc < lines[ord[0]].lines[cur[ord[0]]].length + 1)
- savealloc *= 2;
- saved.text = xrealloc (saved.text, savealloc);
- }
- saved.length = lines[ord[0]].lines[cur[ord[0]]].length;
- memcpy (saved.text, lines[ord[0]].lines[cur[ord[0]]].text,
- saved.length + 1);
- if (lines[ord[0]].lines[cur[ord[0]]].keybeg != NULL)
- {
- saved.keybeg = saved.text +
- (lines[ord[0]].lines[cur[ord[0]]].keybeg
- - lines[ord[0]].lines[cur[ord[0]]].text);
- }
- if (lines[ord[0]].lines[cur[ord[0]]].keylim != NULL)
- {
- saved.keylim = saved.text +
- (lines[ord[0]].lines[cur[ord[0]]].keylim
- - lines[ord[0]].lines[cur[ord[0]]].text);
- }
-
-#ifdef SAOMOD_ASTRO
- saved.flag = lines[ord[0]].lines[cur[ord[0]]].flag;
- saved.value = lines[ord[0]].lines[cur[ord[0]]].value;
-#endif
-
- savedflag = 1;
- }
-
- if ( differ == 3 ) {
- fprintf(ofp, "%d\t", setcnt);
- xfwrite (lines[ord[0]].lines[cur[ord[0]]].text, 1,
- lines[ord[0]].lines[cur[ord[0]]].length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
-
- if ( savedflag >= 2 && differ == 4 ) {
- if ( savedflag == 2 ) {
- xfwrite (saved.text, 1,
- saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
- xfwrite (lines[ord[0]].lines[cur[ord[0]]].text, 1,
- lines[ord[0]].lines[cur[ord[0]]].length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
-
- }
-
- else {
- xfwrite (lines[ord[0]].lines[cur[ord[0]]].text, 1,
- lines[ord[0]].lines[cur[ord[0]]].length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
-
- /* Check if we need to read more lines into core. */
- if (++cur[ord[0]] == lines[ord[0]].used){
- if (fillbuf (&buffer[ord[0]], fps[ord[0]]))
- {
- findlines (&buffer[ord[0]], &lines[ord[0]]);
- cur[ord[0]] = 0;
- }
- else
- {
- /* We reached EOF on fps[ord[0]]. */
- for (i = 1; i < nfps; ++i)
- if (ord[i] > ord[0])
- --ord[i];
- --nfps;
- xfclose (fps[ord[0]]);
- free (buffer[ord[0]].buf);
- free ((char *) lines[ord[0]].lines);
- for (i = ord[0]; i < nfps; ++i)
- {
- fps[i] = fps[i + 1];
- buffer[i] = buffer[i + 1];
- lines[i] = lines[i + 1];
- cur[i] = cur[i + 1];
- }
- for (i = 0; i < nfps; ++i)
- ord[i] = ord[i + 1];
- continue;
- }
- }
- /* The new line just read in may be larger than other lines
- already in core; push it back in the queue until we encounter
- a line larger than it. */
- for (i = 1; i < nfps; ++i)
- {
- t = compare (&lines[ord[0]].lines[cur[ord[0]]],
- &lines[ord[i]].lines[cur[ord[i]]]);
- if (!t)
- t = ord[0] - ord[i];
- if (t < 0)
- break;
- }
- t = ord[0];
- for (j = 1; j < i; ++j)
- ord[j - 1] = ord[j];
- ord[i - 1] = t;
- }
-
- if (unique && savedflag)
- {
- if ( !differ && savedflag >= 1 )
- {
- if ( countr )
- fprintf(ofp, "%d\t", savedflag);
-
- xfwrite (saved.text, 1, saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
-
- if ( (differ == 1 && savedflag == 1)
- || (differ == 2 && savedflag >= 2) ) {
- xfwrite (saved.text, 1,
- saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
-
- free (saved.text);
- }
-}
-
-/* Sort the array LINES with NLINES members, using TEMP for temporary space. */
-
-static void
-sortlines (lines, nlines, temp)
- struct line *lines, *temp;
- int nlines;
-{
- register struct line *lo, *hi, *t;
- register int nlo, nhi;
-
- if (nlines == 2)
- {
- if (compare (&lines[0], &lines[1]) > 0)
- *temp = lines[0], lines[0] = lines[1], lines[1] = *temp;
- return;
- }
-
- nlo = nlines / 2;
- lo = lines;
- nhi = nlines - nlo;
- hi = lines + nlo;
-
- if (nlo > 1)
- sortlines (lo, nlo, temp);
-
- if (nhi > 1)
- sortlines (hi, nhi, temp);
-
- t = temp;
-
- while (nlo && nhi)
- if (compare (lo, hi) <= 0)
- *t++ = *lo++, --nlo;
- else
- *t++ = *hi++, --nhi;
- while (nlo--)
- *t++ = *lo++;
-
- for (lo = lines, nlo = nlines - nhi, t = temp; nlo; --nlo)
- *lo++ = *t++;
-}
-
-/* Check that each of the NFILES FILES is ordered.
- Return a count of disordered files. */
-
-
-static int
-check (files, nfiles)
- char *files[];
- int nfiles;
-{
- int i, disorders = 0;
- FILE *fp;
-
- for (i = 0; i < nfiles; ++i)
- {
- fp = xfopen (files[i], "r");
- line = 0;
- if (!checkfp (fp))
- {
- printf ("%s: disorder on %s at line %d\n", program_name, files[i]
- , line);
- ++disorders;
- }
- }
- return disorders;
-}
-
-/* Merge NFILES FILES onto OFP. */
-
-static void
-merge (files, nfiles, ofp)
- char *files[];
- int nfiles;
- FILE *ofp;
-{
- int i, j, t;
- char *temp;
- FILE *fps[NMERGE], *tfp;
-
-#ifdef SAOMOD_TABLE
- static TableHead TH = NULL;
- TableHead th;
-#endif
-
- int saveunique = unique;
-
- unique = 0;
-
- while (nfiles > NMERGE)
- {
- t = 0;
- for (i = 0; i < nfiles / NMERGE; ++i)
- {
- for (j = 0; j < NMERGE; ++j) {
- fps[j] = xfopen (files[i * NMERGE + j], "r");
-#ifdef SAOMOD_TABLE
- if ( table == 2 ) {
- if ( TH == NULL ) TH = table_header(fps[j], TABLE_PARSE);
- else {
- int k;
-
- th = table_header(fps[j], TABLE_PARSE);
- for ( k = 0; k < table_ncol(TH); k++ )
- if ( strcmp(table_colnam(TH, k + 1), table_colnam(th, k + 1)) ) {
- fprintf(stderr, "sorttable: can't merge tables with different column definitions: \"%\"s != \"%s\"\n", table_colnam(TH, k+1), table_colnam(th, k+1));
- exit(1);
- }
- table_hdrfree(th);
- }
- }
-#endif
- }
-
-
- tfp = xfopen (temp = tempname (), "w");
- mergefps (fps, NMERGE, tfp);
- xfclose (tfp);
- for (j = 0; j < NMERGE; ++j)
- zaptemp (files[i * NMERGE + j]);
- files[t++] = temp;
- }
-
- for (j = 0; j < nfiles % NMERGE; ++j) {
- fps[j] = xfopen (files[i * NMERGE + j], "r");
-#ifdef SAOMOD_TABLE
- if ( table == 2 ) {
- if ( TH == NULL ) TH = table_header(fps[j], TABLE_PARSE);
- else {
- int k;
-
- th = table_header(fps[j], TABLE_PARSE);
- for ( k = 0; k < table_ncol(TH); k++ )
- if ( strcmp(table_colnam(TH, k + 1), table_colnam(th, k + 1)) ) {
- fprintf(stderr, "sorttable: can't merge tables with different column definitions: \"%s\" != \"%s\"\n", table_colnam(TH, k+1), table_colnam(th, k+1));
- exit(1);
- }
- table_hdrfree(th);
- }
- }
-#endif
- }
-
-
- tfp = xfopen (temp = tempname (), "w");
- mergefps (fps, nfiles % NMERGE, tfp);
- xfclose (tfp);
- for (j = 0; j < nfiles % NMERGE; ++j)
- zaptemp (files[i * NMERGE + j]);
- files[t++] = temp;
- nfiles = t;
- }
-
- for (i = 0; i < nfiles; ++i) {
- fps[i] = xfopen (files[i], "r");
-#ifdef SAOMOD_TABLE
- if ( table == 2 ) {
- if ( TH == NULL ) TH = table_header(fps[i], TABLE_PARSE);
- else {
- int k;
-
- th = table_header(fps[i], TABLE_PARSE);
- for ( k = 0; k < table_ncol(TH); k++ ) {
- if ( strcmp(table_colnam(TH, k + 1), table_colnam(th, k + 1)) ) {
- fprintf(stderr, "sorttable: can't merge tables with different column definitions: \"%s\" != \"%s\"\n", table_colnam(TH, k+1), table_colnam(th, k+1));
- exit(1);
- }
- }
- table_hdrfree(th);
- }
- }
-#endif
- }
-
- unique = saveunique;
- mergefps (fps, i, ofp);
- for (i = 0; i < nfiles; ++i)
- zaptemp (files[i]);
-}
-
-/* Sort NFILES FILES onto OFP. */
-
-static void
-sort (files, nfiles, ofp)
- char **files;
- int nfiles;
- FILE *ofp;
-{
- struct buffer buf;
- struct lines lines;
- struct line saved; /* Saved line for unique check. */
- int savedflag = 0;
- int savealloc = 0; /* Size allocated for the saved line. */
- struct line *tmp;
- int i, ntmp;
- FILE *fp, *tfp;
- struct tempnode *node;
- int ntemp = 0;
- char **tempfiles;
-
- initbuf (&buf, sortalloc);
- initlines (&lines, sortalloc / linelength + 1,
- LINEALLOC / sizeof (struct line));
- ntmp = lines.alloc;
- tmp = (struct line *) xmalloc (ntmp * sizeof (struct line));
-
- /* Allocate space for a saved line if necessary. */
- if (unique)
- {
- savealloc = linelength;
- saved.text = xmalloc (savealloc);
-#ifdef SAOMOD_ASTRO
- saved.flag = 0;
-#endif
- }
-
- while (nfiles--)
- {
- fp = xfopen (*files++, "r");
- while (fillbuf (&buf, fp))
- {
- findlines (&buf, &lines);
- if (lines.used > ntmp)
- {
- while (lines.used > ntmp)
- ntmp *= 2;
- tmp = (struct line *)
- xrealloc ((char *) tmp, ntmp * sizeof (struct line));
- }
- sortlines (lines.lines, lines.used, tmp);
- if (feof (fp) && !nfiles && !ntemp && !buf.left)
- tfp = ofp;
- else
- {
- ++ntemp;
- tfp = xfopen (tempname (), "w");
- }
- if ( !unique || tfp != ofp )
- for (i = 0; i < lines.used; ++i) {
- xfwrite (lines.lines[i].text, 1, lines.lines[i].length, tfp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', tfp);
-#endif
- }
- else {
- for (i = 0; i < lines.used; ++i) {
- int cmp;
-
- if ( savedflag ) {
- cmp = compare (&saved, &lines.lines[i]);
-
- if ( !cmp ) {
- savedflag++;
- } else {
- if ( savedflag >= 1 ) {
- if ( !differ ) {
- if ( countr )
- fprintf(ofp, "%d\t", savedflag);
- xfwrite (saved.text, 1, saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- } else {
- if ( (differ == 1 && savedflag == 1)
- || (differ == 2 && savedflag >= 2) ) {
- xfwrite (saved.text, 1, saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
- }
-
- if ( differ == 3 ) setcnt++;
- savedflag = 0;
- }
- }
- }
-
- if ( !savedflag) {
- if (savealloc < lines.lines[i].length + 1)
- {
- while (savealloc < lines.lines[i].length + 1)
- savealloc *= 2;
- saved.text = xrealloc (saved.text, savealloc);
- }
- saved.length = lines.lines[i].length;
- memcpy (saved.text, lines.lines[i].text,
- saved.length + 1);
- if (lines.lines[i].keybeg != NULL)
- {
- saved.keybeg = saved.text +
- (lines.lines[i].keybeg - lines.lines[i].text);
- }
- if (lines.lines[i].keylim != NULL)
- {
- saved.keylim = saved.text +
- (lines.lines[i].keylim - lines.lines[i].text);
- }
-
-#ifdef SAOMOD_ASTRO
- saved.flag = lines.lines[i].flag;
- saved.value = lines.lines[i].value;
-#endif
-
- savedflag = 1;
- }
-
- if ( differ == 3 ) {
- fprintf(ofp, "%d\t", setcnt);
- xfwrite (lines.lines[i].text, 1, lines.lines[i].length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
-
- if ( savedflag >= 2 && differ == 4 ) {
- if ( savedflag == 2 ) {
- xfwrite (saved.text, 1,
- saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
- xfwrite (lines.lines[i].text, 1, lines.lines[i].length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
-
- }
- }
- if (tfp != ofp)
- xfclose (tfp);
- }
- xfclose (fp);
- }
-
- if (unique && savedflag)
- {
- if ( !differ && savedflag >= 1 )
- {
- if ( countr )
- fprintf(ofp, "%d\t", savedflag);
-
- xfwrite (saved.text, 1, saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
-
- if ( (differ == 1 && savedflag == 1)
- || (differ == 2 && savedflag >= 2) ) {
- xfwrite (saved.text, 1,
- saved.length, ofp);
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) putc ('\n', ofp);
-#endif
- }
-
- free (saved.text);
- }
-
- free (buf.buf);
- free ((char *) lines.lines);
- free ((char *) tmp);
-
- if (ntemp)
- {
- tempfiles = (char **) xmalloc (ntemp * sizeof (char *));
- i = ntemp;
- for (node = temphead.next; i > 0; node = node->next)
- tempfiles[--i] = node->name;
- merge (tempfiles, ntemp, ofp);
- free ((char *) tempfiles);
- }
-}
-
-/* Insert key KEY at the end of the list (`keyhead'). */
-
-static void
-insertkey (key)
- struct keyfield *key;
-{
- struct keyfield *k = &keyhead;
-
- while (k->next)
- k = k->next;
- k->next = key;
- key->next = NULL;
-}
-
-static void
-badfieldspec (s)
- char *s;
-{
- fprintf (stderr, "invalid field specification `%s'", s);
- exit(2);
-}
-
-/* Handle interrupts and hangups. */
-
-static void
-sighandler (sig)
- int sig;
-{
-#ifdef _POSIX_VERSION
- struct sigaction sigact;
-
- sigact.sa_handler = SIG_DFL;
- sigemptyset (&sigact.sa_mask);
- sigact.sa_flags = 0;
- sigaction (sig, &sigact, NULL);
-#else /* !_POSIX_VERSION */
- signal (sig, SIG_DFL);
-#endif /* _POSIX_VERSION */
- cleanup ();
-#if HAVE_MINGW32==0
- kill (getpid (), sig);
-#else
- exit(1);
-#endif
-}
-
-/* Set the ordering options for KEY specified in S.
- Return the address of the first character in S that
- is not a valid ordering option.
- BLANKTYPE is the kind of blanks that 'b' should skip. */
-
-static char *
-set_ordering (s, key, blanktype)
- char *s;
- struct keyfield *key;
- enum blanktype blanktype;
-{
- while (*s)
- {
- switch (*s)
- {
- case 'b':
- if (blanktype == bl_start || blanktype == bl_both)
- key->skipsblanks = 1;
- if (blanktype == bl_end || blanktype == bl_both)
- key->skipeblanks = 1;
- break;
- case 'd':
- key->ignore = nondictionary;
- break;
- case 'f':
- key->translate = fold_toupper;
- break;
-#if 0
- case 'g':
- /* Reserved for comparing floating-point numbers. */
- break;
-#endif
- case 'i':
- key->ignore = nonprinting;
- break;
- case 'M':
- key->month = 1;
- break;
- case 'n':
- key->nzone = 0;
- key->numeric = 1;
- break;
-#ifdef SAOMOD_ASTRO
- case 'h':
- key->nzone = 0;
- key->numeric = 2;
- break;
-#endif
- case 'q':
- key->nzone = 0;
- key->numeric = 3;
- break;
-#ifdef SAOMOD_ASTRO
- case 'z':
- key->nzone = 1;
- key->numeric = 2;
- s++;
- key->dzone = SAOstrtod(s, &s);
- s--;
- break;
-#endif
- case 'r':
- key->reverse = 1;
- break;
- default:
- return s;
- }
- ++s;
- }
- return s;
-}
-
-int main (argc, argv)
- int argc;
- char *argv[];
-{
- struct keyfield *key = NULL, gkey;
- char *s;
- int i, t, t2;
- int checkonly = 0, mergeonly = 0, nfiles = 0;
- char *minus = "-", *outfile = minus, **files, *tmp;
- FILE *ofp;
-#ifdef _POSIX_VERSION
- struct sigaction oldact, newact;
-#endif /* _POSIX_VERSION */
-#ifdef SAOMOD_FIX
- int pipes[4];
- char *ss=NULL, *tt=NULL, *uu=NULL;
-#endif
-
- program_name = argv[0];
-
-#ifdef SAOMOD_FIX
- /* Launch() sometimes rearranges passed pipes to be stdin/stdout */
- if( (ss=getenv("LAUNCH_PIPES")) ){
- tt = (char *)strdup(ss);
- for(i=0, uu=(char *)strtok(tt, ","); i<4 && uu;
- i++, uu=(char *)strtok(NULL,",")){
- pipes[i] = atoi(uu);
- }
- if( tt ) free(tt);
- if( i < 4 ) return(1);
- close(pipes[0]);
- close(pipes[3]);
- dup2(pipes[2], 0); close(pipes[2]);
- dup2(pipes[1], 1); close(pipes[1]);
- }
-#endif
-
-#ifdef SAOMOD_FIX
- if ( (program_name = (char *)strrchr(program_name, '/')) )
- program_name++;
- else
- program_name = argv[0];
-#endif
-
-#ifdef SAOMOD_TABLE
- if ( strstr(program_name, "table") ) {
- table = 1;
- tab = '\t';
- }
-#endif
-
-#ifdef SAOMOD_FIX
- /* Ask for a stable sort
- */
- stable = 1;
-#endif
-
- have_read_stdin = 0;
- inittables ();
-
- temp_file_prefix = getenv ("TMPDIR");
- if (temp_file_prefix == NULL)
- temp_file_prefix = DEFAULT_TMPDIR;
-
-#ifdef _POSIX_VERSION
- newact.sa_handler = sighandler;
- sigemptyset (&newact.sa_mask);
- newact.sa_flags = 0;
-
- sigaction (SIGINT, NULL, &oldact);
- if (oldact.sa_handler != SIG_IGN)
- sigaction (SIGINT, &newact, NULL);
-#if HAVE_MINGW32==0
- sigaction (SIGHUP, NULL, &oldact);
- if (oldact.sa_handler != SIG_IGN)
- sigaction (SIGHUP, &newact, NULL);
- sigaction (SIGPIPE, NULL, &oldact);
- if (oldact.sa_handler != SIG_IGN)
- sigaction (SIGPIPE, &newact, NULL);
-#endif
- sigaction (SIGTERM, NULL, &oldact);
- if (oldact.sa_handler != SIG_IGN)
- sigaction (SIGTERM, &newact, NULL);
-#else /* !_POSIX_VERSION */
- if (signal (SIGINT, SIG_IGN) != SIG_IGN)
- signal (SIGINT, sighandler);
-#if HAVE_MINGW32==0
- if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
- signal (SIGHUP, sighandler);
- if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
- signal (SIGPIPE, sighandler);
-#endif
- if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
- signal (SIGTERM, sighandler);
-#endif /* !_POSIX_VERSION */
-
- gkey.sword = gkey.eword = -1;
- gkey.ignore = NULL;
- gkey.translate = NULL;
- gkey.nzone = gkey.numeric = gkey.month = gkey.reverse = 0;
- gkey.skipsblanks = gkey.skipeblanks = 0;
-
- files = (char **) xmalloc (sizeof (char *) * argc);
-
- for (i = 1; i < argc; ++i)
- {
- if( !strcasecmp(argv[1], "--help") ){
- usage(0);
- }
- if (argv[i][0] == '+')
- {
- if (key)
- insertkey (key);
- key = (struct keyfield *) xmalloc (sizeof (struct keyfield));
- key->eword = -1;
- key->ignore = NULL;
- key->translate = NULL;
- key->skipsblanks = key->skipeblanks = 0;
- key->nzone = key->numeric = key->month = key->reverse = 0;
- s = argv[i] + 1;
- if (!digits[UCHAR (*s)]) {
- switch ( *s ) {
- case 'c' :
- case 'C' :
- case 'b' :
- case 'B' :
- case 's' :
- case 'S' :
- case 'i' :
- case 'I' :
- case 'l' :
- case 'f' :
- case 'd' :
- case 't' :
-#ifdef SAOMOD_BINARY
- if ( !BinarySort ) BinarySort = -1;
-#endif
- key->btype = *s;
- s++;
-
- break;
-
- default:
- badfieldspec (argv[i]);
- }
- }
- for (t = 0; digits[UCHAR (*s)]; ++s)
- t = 10 * t + *s - '0';
- t2 = 0;
- if (*s == '.')
- for (++s; digits[UCHAR (*s)]; ++s)
- t2 = 10 * t2 + *s - '0';
- if (t2 || t)
- {
- key->sword = t;
- key->schar = t2;
- }
- else {
-#ifdef SAOMOD_BINARY
- if ( BinarySort == 0 ) {
- key->sword = -1;
- key->schar = 0;
- } else {
-#endif
- key->sword = t;
- key->schar = t2;
-#ifdef SAOMOD_BINARY
- }
-#endif
- }
- s = set_ordering (s, key, bl_start);
- if (*s)
- badfieldspec (argv[i]);
- }
- else if (argv[i][0] == '-' && argv[i][1])
- {
- s = argv[i] + 1;
- if (digits[UCHAR (*s)])
- {
- if (!key)
- usage (2);
- for (t = 0; digits[UCHAR (*s)]; ++s)
- t = t * 10 + *s - '0';
- t2 = 0;
- if (*s == '.')
- for (++s; digits[UCHAR (*s)]; ++s)
- t2 = t2 * 10 + *s - '0';
- key->eword = t;
- key->echar = t2;
- s = set_ordering (s, key, bl_end);
- if (*s)
- badfieldspec (argv[i]);
- insertkey (key);
- key = NULL;
- }
- else
- while (*s)
- {
- s = set_ordering (s, &gkey, bl_both);
- switch (*s)
- {
-#ifdef SAOMOD_BINARY
- case 'B' :
- s++;
- BinarySort = strtol(s, &s, 10);
- linelength = BinarySort;
- break;
-#endif
- case '\0':
- break;
- case 'c':
- checkonly = 1;
- break;
- case 'k':
- if (s[1])
- ++s;
- else
- {
- if (i == argc - 1){
- fprintf (stderr, "option `-k' requires an argument");
- exit(2);
- }
- else
- s = argv[++i];
- }
- if (key)
- insertkey (key);
- key = (struct keyfield *)
- xmalloc (sizeof (struct keyfield));
- key->eword = -1;
- key->echar = 0;
- key->ignore = NULL;
- key->translate = NULL;
- key->skipsblanks = key->skipeblanks = 0;
- key->nzone = key->numeric = key->month = key->reverse = 0;
- /* Get POS1. */
- if (!digits[UCHAR (*s)])
- badfieldspec (argv[i]);
- for (t = 0; digits[UCHAR (*s)]; ++s)
- t = 10 * t + *s - '0';
- if (t)
- t--;
- t2 = 0;
- if (*s == '.')
- {
- for (++s; digits[UCHAR (*s)]; ++s)
- t2 = 10 * t2 + *s - '0';
- if (t2)
- t2--;
- }
- if (t2 || t)
- {
- key->sword = t;
- key->schar = t2;
- }
- else
- key->sword = -1;
- s = set_ordering (s, key, bl_start);
- if (*s && *s != ',')
- badfieldspec (argv[i]);
- else if (*s++)
- {
- /* Get POS2. */
- for (t = 0; digits[UCHAR (*s)]; ++s)
- t = t * 10 + *s - '0';
- if (t)
- t--;
- t2 = 0;
- if (*s == '.')
- {
- for (++s; digits[UCHAR (*s)]; ++s)
- t2 = t2 * 10 + *s - '0';
- if (t2)
- t2--;
- }
- key->eword = t;
- key->echar = t2;
- s = set_ordering (s, key, bl_end);
- if (*s)
- badfieldspec (argv[i]);
- }
- insertkey (key);
- key = NULL;
- goto outer;
-#ifdef SAOMOD_TABLE
- case 'm':
- mergeonly = 1;
- if ( table ) table=2;
- break;
-#endif
- case 'o':
- if (s[1])
- outfile = s + 1;
- else
- {
- if (i == argc - 1){
- fprintf (stderr, "option `-o' requires an argument");
- exit(2);
- }
- else
- outfile = argv[++i];
- }
- goto outer;
- case 's':
- stable = 1;
- break;
- case 't':
- if (s[1])
- tab = *++s;
- else if (i < argc - 1)
- {
- tab = *argv[++i];
- goto outer;
- }
- else{
- fprintf (stderr, "option `-t' requires an argument");
- exit(2);
- }
- break;
- case 'T':
- if (s[1])
- temp_file_prefix = ++s;
- else
- {
- if (i < argc - 1)
- temp_file_prefix = argv[++i];
- else{
- fprintf (stderr, "option `-T' requires an argument");
- exit(2);
- }
- }
- goto outer;
-
- case 'u': unique = 1; differ = 0; break; /* One each only */
- case 'U': unique = 1; differ = 1; break; /* Unique lines only */
- case 'D': unique = 1; differ = 2; break; /* Duplic lines only */
- case 'A': unique = 1; differ = 4; break; /* All Duplic lines */
- case 'S': unique = 1; differ = 3; break; /* Set counter */
- case 'C': unique = 1; countr = 1; break; /* Count same lines */
- case 'y':
- /* Accept and ignore e.g. -y0 for compatibility with
- Solaris 2. */
- goto outer;
- default:
- fprintf (stderr, "%s: unrecognized option `-%c'\n",
- argv[0], *s);
- usage (2);
- }
- if (*s)
- ++s;
- }
- }
- else /* Not an option. */
- {
- files[nfiles++] = argv[i];
- }
- outer:;
- }
-
- if (key)
- insertkey (key);
-
-#ifdef SAOMOD_BINARY
- if ( BinarySort == -1 ) {
- fprintf (stderr, "No record length specified with binary file sort flags.\n");
- usage(2);
- }
- if ( BinarySort && key == NULL ) {
- fprintf (stderr, "Keys must be specified with binary file sort.\n");
- usage(2);
- }
-#endif
-
-#ifdef SAOMOD_BINARY
- /* Inheritance of global options to individual keys. */
-if ( !BinarySort ) {
- for (key = keyhead.next; key; key = key->next)
- if (!key->ignore && !key->translate && !key->skipsblanks && !key->reverse
- && !key->skipeblanks && !key->month && !key->numeric && !key->nzone)
- {
- key->ignore = gkey.ignore;
- key->translate = gkey.translate;
- key->skipsblanks = gkey.skipsblanks;
- key->skipeblanks = gkey.skipeblanks;
- key->month = gkey.month;
- key->numeric = gkey.numeric;
- key->reverse = gkey.reverse;
- key->nzone = gkey.nzone;
- key->dzone = gkey.dzone;
-
- }
-
- if (!keyhead.next && (gkey.ignore || gkey.translate || gkey.skipsblanks
- || gkey.skipeblanks || gkey.month || gkey.numeric))
- insertkey (&gkey);
-}
-#endif
-
- reverse = gkey.reverse;
-
- if (nfiles == 0)
- {
- nfiles = 1;
- files = &minus;
- }
-
- if (checkonly)
- exit (check (files, nfiles) != 0);
-
- if (strcmp (outfile, "-"))
- {
- struct stat outstat;
- if (stat (outfile, &outstat) == 0)
- {
- /* The following code prevents a race condition when
- people use the brain dead shell programming idiom:
- cat file | sort -o file
- This feature is provided for historical compatibility,
- but we strongly discourage ever relying on this in
- new shell programs. */
-
- /* Temporarily copy each input file that might be another name
- for the output file. When in doubt (e.g. a pipe), copy. */
- for (i = 0; i < nfiles; ++i)
- {
- char buf[8192];
- FILE *fp;
- int cc;
-
- if (S_ISREG (outstat.st_mode) && strcmp (outfile, files[i]))
- {
- struct stat instat;
- if ((strcmp (files[i], "-")
- ? stat (files[i], &instat)
- : fstat (fileno (stdin), &instat)) != 0)
- {
- perror (files[i]);
- cleanup ();
- exit (2);
- }
- if (S_ISREG (instat.st_mode)
- && (instat.st_ino != outstat.st_ino
- || instat.st_dev != outstat.st_dev))
- {
- /* We know the files are distinct. */
- continue;
- }
- }
-
- fp = xfopen (files[i], "r");
- tmp = tempname ();
- ofp = xfopen (tmp, "w");
- while ((cc = fread (buf, 1, sizeof buf, fp)) > 0)
- xfwrite (buf, 1, cc, ofp);
- if (ferror (fp))
- {
- fprintf (stderr, "%s", files[i]);
- cleanup ();
- exit (2);
- }
- xfclose (ofp);
- xfclose (fp);
- files[i] = tmp;
- }
- }
- ofp = xfopen (outfile, "w");
- }
- else
- ofp = stdout;
-
- if (mergeonly)
- merge (files, nfiles, ofp);
- else
- sort (files, nfiles, ofp);
- cleanup ();
-
- /* If we wait for the implicit flush on exit, and the parent process
- has closed stdout (e.g., exec >&- in a shell), then the output file
- winds up empty. I don't understand why. This is under SunOS,
- Solaris, Ultrix, and Irix. This premature fflush makes the output
- reappear. --karl@cs.umb.edu */
- if (fflush (ofp) < 0)
- perror (outfile);
-
- if (have_read_stdin && fclose (stdin) == EOF)
- perror (outfile);
- if (ferror (stdout) || fclose (stdout) == EOF)
- perror (outfile);
-
- return(0);
-}
-
-static void
-usage (status)
- int status;
-{
- if (status != 0)
- fprintf (stderr, "Try `%s --help' for more information.\n",
- program_name);
- else
- {
- fprintf(stderr,"Usage: %s [OPTION]... [FILE]...\n", program_name);
- fprintf(stderr,"Write sorted concatenation of all FILE(s) to standard output.\n");
- fprintf(stderr,"\n");
- fprintf(stderr,"+POS1 [-POS2] start a key at POS1, end it before POS2\n");
- fprintf(stderr,"-M compare (unknown) < `JAN' < ... < `DEC', imply -b\n");
- fprintf(stderr,"-T DIRECT use DIRECT for temporary files, not $TMPDIR or %s\n", DEFAULT_TMPDIR);
- fprintf(stderr,"-b ignore leading blanks in sort fields or keys\n");
- fprintf(stderr,"-c check if given files already sorted, do not sort\n");
- fprintf(stderr,"-d consider only [a-zA-Z0-9 ] characters in keys\n");
- fprintf(stderr,"-f fold lower case to upper case characters in keys\n");
- fprintf(stderr,"-i consider only [\\040-\\0176] characters in keys\n");
- fprintf(stderr,"-k POS1[,POS2] same as +POS1 [-POS2], but all positions counted from 1\n");
- fprintf(stderr,"-m merge already sorted files, do not sort\n");
- fprintf(stderr,"-n compare according to string numerical value, imply -b\n");
- fprintf(stderr,"-o FILE write result on FILE instead of standard output\n");
- fprintf(stderr,"-r reverse the result of comparisons\n");
- fprintf(stderr,"-s stabilize sort by disabling last resort comparison\n");
- fprintf(stderr,"-t SEP use SEParator instead of non- to whitespace transition\n");
- fprintf(stderr,"-u with -c, check for strict ordering\n");
- fprintf(stderr,"-u with -m, only output the first of an equal sequence\n");
- fprintf(stderr,"-U output only unique records.\n");
- fprintf(stderr,"-D output only duplicate records.\n");
- fprintf(stderr,"--help display this help and exit\n");
- fprintf(stderr,"--version output version information and exit\n");
- fprintf(stderr,"\n");
- fprintf(stderr,"Binary File Options:\n");
- fprintf(stderr,"\n");
- fprintf(stderr,"-Blen record length in bytes\n");
- fprintf(stderr,"\n");
- fprintf(stderr,"+<type1>offset1 +<type2>.offset2 ...\n");
- fprintf(stderr,"or\n");
- fprintf(stderr,"+<type1>offset1.len1 ... (+t text data only)\n");
- fprintf(stderr,"\n");
- fprintf(stderr,"where <type> can be:\n");
- fprintf(stderr,"\n");
- fprintf(stderr,"c character data\n");
- fprintf(stderr,"C unsigned character data\n");
- fprintf(stderr,"b byte data\n");
- fprintf(stderr,"B unsigned byte data\n");
- fprintf(stderr,"s short data\n");
- fprintf(stderr,"S unsigned short data\n");
- fprintf(stderr,"i integer data\n");
- fprintf(stderr,"I unsigned integer data\n");
- fprintf(stderr,"f float data\n");
- fprintf(stderr,"d double data\n");
- fprintf(stderr,"t text data\n");
- fprintf(stderr,"\n");
- fprintf(stderr,"POS is F[.C][OPTS], where F is the field number and C the character\n");
- fprintf(stderr,"position in the field, both counted from zero. OPTS is made up of one\n");
- fprintf(stderr,"or more of Mbdfinr; this effectively disables global -Mbdfinr settings\n");
- fprintf(stderr,"for that key. If no key given, use the entire line as key. With no\n");
- fprintf(stderr,"FILE, or when FILE is -, read standard input.\n");
- fprintf(stderr,"\n");
- }
- exit (status);
-}
-
diff --git a/funtools/gnu/sorttest.c b/funtools/gnu/sorttest.c
deleted file mode 100644
index 5cc0ad2..0000000
--- a/funtools/gnu/sorttest.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- export EVENTS="(dval:D,fval:E,ival:J,uival:V,sval:I,cval:B,cval2:B)"
- sorttest | _funsort -B24 +... | fundisp "stdin[EVENTS()]"
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <salloc.h>
-
-extern char *optarg;
-extern int optind;
-
-#define NREC 10
-#define SZ_LINE 1024
-
-#define MAX(a,b) (((a)>(b))?(a):(b))
-
-typedef struct brec{
- double dval;
- float fval;
- int ival;
- unsigned int uival;
- short sval;
- char cval;
- char cval2;
-} Binary;
-
-void
-fillb(Binary *b, int i, int dodouble)
-{
- int idiv;
- b->dval = (double)rand();
- b->fval = (float)rand();
- if( dodouble ){
- if( (i%2) == 0 )
- b->ival = rand();
- }
- else{
- b->ival = rand();
- }
- b->uival = (unsigned)rand();
- idiv = MAX(1,(RAND_MAX/32768));
- b->sval = rand()/idiv;
- idiv = MAX(1,(RAND_MAX/128));
- b->cval = rand()/idiv;
- b->cval2 = rand()/idiv;
-}
-
-int main(int argc, char **argv)
-{
- int i;
- int c;
- int ival;
- int ichan, ochan, pid, status;
- int rlen;
- int nrec=NREC;
- int dodouble=0;
- int doxeq=0;
- char *prog="_funsort";
- char *slist=NULL;
- char *s;
- char tbuf[SZ_LINE];
- char cmd[SZ_LINE];
- FILE *fp=stdout;
- Binary b;
-
- /* process switch arguments */
- while ((c = getopt(argc, argv, "dn:s:x")) != -1){
- switch(c){
- case 'd':
- dodouble = 1;
- break;
- case 'n':
- nrec = atoi(optarg);
- break;
- case 's':
- doxeq = 1;
- slist=(char *)NewString(optarg);
- break;
- case 'x':
- doxeq = 1;
- break;
- }
- }
-
- /* see rand */
- srand(time(NULL));
-
- /* generate sort parameters and start sort program */
- if( doxeq ){
- snprintf(cmd, SZ_LINE-1, "%s -B%d %s", prog, sizeof(Binary), tbuf);
- rlen = SZ_LINE - strlen(cmd);
- if( !slist ){
- slist = (char *)NewString("d");
- }
- for(s=slist; *s; s++){
- switch(*s){
- case 'd':
- sprintf(tbuf, "+d0");
- break;
- case 'f':
- sprintf(tbuf, "+f8");
- break;
- case 'i':
- sprintf(tbuf, "+i12");
- break;
- case 'I':
- sprintf(tbuf, "+I16");
- break;
- case 's':
- sprintf(tbuf, "+s20");
- break;
- case 'c':
- sprintf(tbuf, "+c22");
- break;
- default:
- fprintf(stderr, "ERROR: unknown sort type: %s\n", s);
- exit(1);
- }
- strncat(cmd, " ", rlen);
- rlen--;
- strncat(cmd, tbuf, rlen);
- rlen -= strlen(tbuf);
- if( rlen <=0 ){
- fprintf(stderr, "ERROR: too many arguments\n");
- exit(1);
- }
- }
- if( !ProcessOpen(cmd, &ichan, &ochan, &pid) ){
- fprintf(stderr, "ERROR: can't start %s\n", prog);
- exit(1);
- }
- /* write unsorted records */
- for(i=0; i<nrec; i++){
- fillb(&b, i, dodouble);
- write(ochan, &b, sizeof(Binary));
- }
- /* signal EOF to sort program */
- close(ochan);
- while( read(ichan, &b, sizeof(Binary)) == sizeof(Binary) )
- write(1, &b, sizeof(Binary));
- if( slist ) free(slist);
- ProcessClose(pid, &status);
- }
- else{
- /* write unsorted records */
- for(i=0; i<nrec; i++){
- fillb(&b, i, dodouble);
- fwrite(&b, sizeof(Binary), 1, fp);
- }
- }
-}
diff --git a/funtools/gnu/system.h b/funtools/gnu/system.h
deleted file mode 100644
index 6ebebda..0000000
--- a/funtools/gnu/system.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/* system-dependent definitions for textutils programs.
- Copyright (C) 1989, 1990, 1991 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 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* Include sys/types.h before this file. */
-
-#include <sys/stat.h>
-
-#ifdef STAT_MACROS_BROKEN
-#undef S_ISBLK
-#undef S_ISCHR
-#undef S_ISDIR
-#undef S_ISFIFO
-#undef S_ISLNK
-#undef S_ISMPB
-#undef S_ISMPC
-#undef S_ISNWK
-#undef S_ISREG
-#undef S_ISSOCK
-#endif /* STAT_MACROS_BROKEN. */
-
-#if !defined(S_ISBLK) && defined(S_IFBLK)
-#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
-#endif
-#if !defined(S_ISCHR) && defined(S_IFCHR)
-#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
-#endif
-#if !defined(S_ISDIR) && defined(S_IFDIR)
-#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
-#endif
-#if !defined(S_ISREG) && defined(S_IFREG)
-#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
-#endif
-#if !defined(S_ISFIFO) && defined(S_IFIFO)
-#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
-#endif
-#if !defined(S_ISLNK) && defined(S_IFLNK)
-#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
-#endif
-#if !defined(S_ISSOCK) && defined(S_IFSOCK)
-#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
-#endif
-#if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
-#define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
-#define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
-#endif
-#if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
-#define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
-#endif
-#if !defined(HAVE_MKFIFO)
-#define mkfifo(path, mode) (mknod ((path), (mode) | S_IFIFO, 0))
-#endif
-
-/*
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-*/
-
-#ifndef _POSIX_VERSION
-off_t lseek ();
-#endif
-
-#ifndef STDIN_FILENO
-#define STDIN_FILENO 0
-#endif
-
-#ifndef STDOUT_FILENO
-#define STDOUT_FILENO 1
-#endif
-
-#ifndef STDERR_FILENO
-#define STDERR_FILENO 2
-#endif
-
-/* Don't use bcopy! Use memmove if source and destination may overlap,
- memcpy otherwise. */
-
-#ifdef HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
-# include <memory.h>
-# endif
-# include <string.h>
-#else
-# include <strings.h>
-char *memchr ();
-#endif
-
-#include <errno.h>
-#ifndef errno
-extern int errno;
-#endif
-
-#ifdef STDC_HEADERS
-#include <stdlib.h>
-#else
-char *getenv ();
-#endif
-
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#else
-#include <sys/file.h>
-#endif
-
-#if !defined(SEEK_SET)
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-#endif
-
-#ifndef _POSIX_SOURCE
-#include <sys/param.h>
-#endif
-
-/* Get or fake the disk device blocksize.
- Usually defined by sys/param.h (if at all). */
-#if !defined(DEV_BSIZE) && defined(BSIZE)
-#define DEV_BSIZE BSIZE
-#endif
-#if !defined(DEV_BSIZE) && defined(BBSIZE) /* SGI */
-#define DEV_BSIZE BBSIZE
-#endif
-#ifndef DEV_BSIZE
-#define DEV_BSIZE 4096
-#endif
-
-/* Extract or fake data from a `struct stat'.
- ST_BLKSIZE: Optimal I/O blocksize for the file, in bytes. */
-#ifndef HAVE_ST_BLKSIZE
-# define ST_BLKSIZE(statbuf) DEV_BSIZE
-#else /* HAVE_ST_BLKSIZE */
-/* Some systems, like Sequents, return st_blksize of 0 on pipes. */
-# define ST_BLKSIZE(statbuf) ((statbuf).st_blksize > 0 \
- ? (statbuf).st_blksize : DEV_BSIZE)
-#endif /* HAVE_ST_BLKSIZE */
-
-#ifndef S_ISLNK
-#define lstat stat
-#endif
-
-#ifndef RETSIGTYPE
-#define RETSIGTYPE void
-#endif
-
-#include <ctype.h>
-
-#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
-#define ISASCII(c) 1
-#else
-#define ISASCII(c) isascii(c)
-#endif
-
-#ifdef isblank
-#define ISBLANK(c) (ISASCII (c) && isblank (c))
-#else
-#define ISBLANK(c) ((c) == ' ' || (c) == '\t')
-#endif
-#ifdef isgraph
-#define ISGRAPH(c) (ISASCII (c) && isgraph (c))
-#else
-#define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
-#endif
-
-#define ISPRINT(c) (ISASCII (c) && isprint (c))
-#define ISDIGIT(c) (ISASCII (c) && isdigit (c))
-#define ISALNUM(c) (ISASCII (c) && isalnum (c))
-#define ISALPHA(c) (ISASCII (c) && isalpha (c))
-#define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
-#define ISLOWER(c) (ISASCII (c) && islower (c))
-#define ISPUNCT(c) (ISASCII (c) && ispunct (c))
-#define ISSPACE(c) (ISASCII (c) && isspace (c))
-#define ISUPPER(c) (ISASCII (c) && isupper (c))
-#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))