r3: Initial revision
authorKevin M. Rosenberg <kevin@rosenberg.net>
Fri, 28 Apr 2000 13:02:42 +0000 (13:02 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Fri, 28 Apr 2000 13:02:42 +0000 (13:02 +0000)
78 files changed:
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
COPYRIGHT [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
TODO [new file with mode: 0644]
acconfig.h [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
acsite.m4 [new file with mode: 0644]
batch-update [new file with mode: 0755]
cgi-bin/Makefile [new file with mode: 0644]
cgi-bin/Makefile.am [new file with mode: 0644]
cgi-bin/Makefile.in [new file with mode: 0644]
cgi-bin/ctsim.cgi [new file with mode: 0644]
cgi-bin/ctsim.cgi.in [new file with mode: 0755]
config.h.in [new file with mode: 0644]
configure.in [new file with mode: 0644]
getopt/Makefile [new file with mode: 0644]
getopt/Makefile.am [new file with mode: 0644]
getopt/Makefile.in [new file with mode: 0644]
getopt/getopt.c [new file with mode: 0644]
getopt/getopt.h [new file with mode: 0644]
getopt/getopt1.c [new file with mode: 0644]
html/Makefile [new file with mode: 0644]
html/Makefile.am [new file with mode: 0644]
html/Makefile.in [new file with mode: 0644]
html/cstim.html [new file with mode: 0644]
html/ctsim.html [new file with mode: 0644]
html/ctsim.html.in [new file with mode: 0644]
include/Makefile [new file with mode: 0644]
include/Makefile.am [new file with mode: 0644]
include/Makefile.in [new file with mode: 0644]
include/ascii.h [new file with mode: 0644]
include/cio.h [new file with mode: 0644]
include/ct.h [new file with mode: 0644]
include/ezplot.h [new file with mode: 0644]
include/getargs.h [new file with mode: 0644]
include/ir.h [new file with mode: 0644]
include/keyboard.h [new file with mode: 0644]
include/kmath.h [new file with mode: 0644]
include/kstddef.h [new file with mode: 0644]
include/pol.h [new file with mode: 0644]
include/sdf.h [new file with mode: 0644]
include/sgp.h [new file with mode: 0644]
include/stamp-h [new file with mode: 0644]
include/stamp-h.in [new file with mode: 0644]
install-sh [new file with mode: 0755]
man/Makefile [new file with mode: 0644]
man/Makefile.am [new file with mode: 0644]
man/Makefile.in [new file with mode: 0644]
man/ctrec.1 [new file with mode: 0644]
man/phm2rs.1 [new file with mode: 0644]
man/phm2sdf.1 [new file with mode: 0644]
man/sdf2img.1 [new file with mode: 0644]
man/sdfinfo.1 [new file with mode: 0644]
man/sgp.1 [new file with mode: 0644]
missing [new file with mode: 0755]
mkinstalldirs [new file with mode: 0755]
r [new file with mode: 0755]
src/Makefile [new file with mode: 0644]
src/Makefile.am [new file with mode: 0644]
src/Makefile.in [new file with mode: 0644]
src/ctrec.c [new file with mode: 0644]
src/mpitest.c [new file with mode: 0644]
src/phm2rs.c [new file with mode: 0644]
src/phm2sdf.c [new file with mode: 0644]
src/rs2sdf.c [new file with mode: 0644]
src/sample-ctrec.sh [new file with mode: 0644]
src/sample-ctrec.sh.in [new file with mode: 0755]
src/sdf-1.c [new file with mode: 0644]
src/sdf-2.c [new file with mode: 0644]
src/sdf2img.c [new file with mode: 0644]
src/sdfinfo.c [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..e3a6c0e
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+Kevin M. Rosenberg, M.D.
+kevin@rosenberg.net
\ No newline at end of file
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..d60c31a
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+                   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.
+\f
+                   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.)
+\f
+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.
+\f
+  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.
+\f
+  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
+\f
+           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) <year>  <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) year  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/COPYRIGHT b/COPYRIGHT
new file mode 100644 (file)
index 0000000..89fd6da
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,23 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: COPYRIGHT,v 1.1 2000/04/28 13:02:43 kevin Exp $
+**  $Log: COPYRIGHT,v $
+**  Revision 1.1  2000/04/28 13:02:43  kevin
+**  Initial revision
+**
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  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
+******************************************************************************/
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..8dbe5e5
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,12 @@
+0.5.1 - 4/28/2000
+    Cleaned out library that wasn't being used by CTSim         
+       
+0.5.0 - 4/27/2000 
+    First open source distribution for GNU/Linux
+       
+6/1999 
+  Converted to GNU/Linux
+  added MPI support via LAM library
+       
+1983-84 
+  Developed under MS-DOS and IBM EGA graphics
\ No newline at end of file
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..ff8c4a6
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,227 @@
+CTSim Installation
+==================
+
+Additional Libraries Recommended
+--------------------------------
+
+zlib (ftp://ftp.uu.net/pub/archiving/zip/zlib)
+  Tested with version 1.13
+  This library is required for libpng (see below)
+
+libpng (ftp://ftp.uu.net/graphics/png/src)
+  Version 1.0.3 or greater is required. Version 0.89 definitely will
+  not work.
+
+lam (http://www.mpi.nd.edu/lam/)
+  There is support is MPI clustering. I use this code at home for my
+  beowulf cluster.
+
+perl/apache
+  There is support for web-driven CT Simulation. To use this, the
+  --with-cgibin-dir=..., --with-cgibin-url=..., --with-webdata-dir=...,
+  --with-webdata-url=..., and --with-html-dir=...  must be set.
+
+CTSim Specific Configuration Help
+---------------------------------
+
+  --enable-verbose-warnings
+                          Enable verbose compiler warnings.
+  --enable-debug          Turn on debugging
+  --with-png[=PATH]       Set path of lib PNG installation 
+  --with-lam[=PATH]       Set path of LAM MPI 
+  --with-cgibin-dir=PATH  Set path of CGI binaries directory 
+  --with-cgibin-url=PATH  Set URL path of CGI binaries 
+  --with-webdata-dir=PATH Set path of webdata
+  --with-webdata-url=PATH Set URL path of webdata
+  --with-html-dir=PATH    Set directory of html files
+  --with-x                use the X Window System
+
+Platforms Supported
+-------------------
+
+Recent development is with GNU/Linux. I have tested compilation on
+FreeBSD v4.0, BSD/OS v3.0, and Solaris v8.
+
+
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..dc4cd87
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,378 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = .
+prefix = /opt/ctsim
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/ctsim
+pkglibdir = $(libdir)/ctsim
+pkgincludedir = $(includedir)/ctsim
+
+top_builddir = .
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+INSTALL_STRIP_FLAG =
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = gawk
+CC = gcc
+MAKEINFO = makeinfo
+PACKAGE = ctsim
+RANLIB = ranlib
+VERSION = 0.5.0
+X_BASIC_LIBS = -lXext -lX11
+X_CFLAGS =  -I/usr/X11R6/include
+X_EXTRA_LIBS = 
+X_LIBS =  -L/usr/X11R6/lib
+X_PRE_LIBS =  -lSM -lICE
+X_TOOLKIT_LIBS = -lXt
+cgibindir = /opt/apache/cgi-bin
+cgibinurl = /cgi-bin
+cgiprograms = ctsim.cgi
+ctlamlibs = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+ctlibs = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+htmldata = ctsim.html
+htmldir = /opt/apache/htdocs/ctsim
+lamdir = /opt/lam
+lamprograms = ctrec-lam phm2sdf-lam phm2rs-lam
+my_includes =  -I../include -I..
+webdatadir = /opt/apache/htdocs/ctsim/webdata
+webdataurl = /ctsim/webdata
+webenabled = true
+EXTRA_DIRS = getopt
+EXTRA_DIRS = 
+
+SUBDIRS = $(EXTRA_DIRS) libcio libk libkmath libgraph libezplot libir src man html cgi-bin include 
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \
+Makefile.am Makefile.in NEWS TODO acconfig.h aclocal.m4 config.h.in \
+configure configure.in install-sh missing mkinstalldirs
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+DIST_SUBDIRS =  getopt libcio libk libkmath libgraph libezplot libir src \
+man html cgi-bin include
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4):  configure.in 
+       cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+       cd $(srcdir) && $(AUTOCONF)
+
+config.h: stamp-h
+       @if test ! -f $@; then \
+               rm -f stamp-h; \
+               $(MAKE) stamp-h; \
+       else :; fi
+stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=config.h \
+            $(SHELL) ./config.status
+       @echo timestamp > stamp-h 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/stamp-h.in; \
+               $(MAKE) $(srcdir)/stamp-h.in; \
+       else :; fi
+$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+       -rm -f config.h
+
+maintainer-clean-hdr:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+         rev="$$subdir $$rev"; \
+         test "$$subdir" = "." && dot_seen=yes; \
+       done; \
+       test "$$dot_seen" = "no" && rev=". $$rev"; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+           test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       -rm -rf $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+       mkdir $(distdir)/=build
+       mkdir $(distdir)/=inst
+       dc_install_base=`cd $(distdir)/=inst && pwd`; \
+       cd $(distdir)/=build \
+         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) dist
+       -rm -rf $(distdir)
+       @banner="$(distdir).tar.gz is ready for distribution"; \
+       dashes=`echo "$$banner" | sed s/./=/g`; \
+       echo "$$dashes"; \
+       echo "$$banner"; \
+       echo "$$dashes"
+dist: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+dist-all: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+distdir: $(DISTFILES)
+       -rm -rf $(distdir)
+       mkdir $(distdir)
+       -chmod 777 $(distdir)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+       for subdir in $(DIST_SUBDIRS); do \
+         if test "$$subdir" = .; then :; else \
+           test -d $(distdir)/$$subdir \
+           || mkdir $(distdir)/$$subdir \
+           || exit 1; \
+           chmod 777 $(distdir)/$$subdir; \
+           (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
+             || exit 1; \
+         fi; \
+       done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+all-recursive-am: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile config.h
+all-redirect: all-recursive-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-hdr mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-hdr clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-hdr distclean-tags distclean-generic clean-am
+
+distclean: distclean-recursive
+       -rm -f config.status
+
+maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-tags \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f config.status
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+install-data-recursive uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..8619c5b
--- /dev/null
@@ -0,0 +1,12 @@
+if INCLUDED_GETOPT_LONG
+EXTRA_DIRS=getopt
+else
+EXTRA_DIRS=
+endif
+
+SUBDIRS=$(EXTRA_DIRS) libcio libk libkmath libgraph libezplot libir src man html cgi-bin include 
+
+
+
+
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..75a9633
--- /dev/null
@@ -0,0 +1,378 @@
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_FLAG =
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = @AWK@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+X_BASIC_LIBS = @X_BASIC_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_TOOLKIT_LIBS = @X_TOOLKIT_LIBS@
+cgibindir = @cgibindir@
+cgibinurl = @cgibinurl@
+cgiprograms = @cgiprograms@
+ctlamlibs = @ctlamlibs@
+ctlibs = @ctlibs@
+htmldata = @htmldata@
+htmldir = @htmldir@
+lamdir = @lamdir@
+lamprograms = @lamprograms@
+my_includes = @my_includes@
+webdatadir = @webdatadir@
+webdataurl = @webdataurl@
+webenabled = @webenabled@
+@INCLUDED_GETOPT_LONG_TRUE@EXTRA_DIRS = getopt
+@INCLUDED_GETOPT_LONG_FALSE@EXTRA_DIRS = 
+
+SUBDIRS = $(EXTRA_DIRS) libcio libk libkmath libgraph libezplot libir src man html cgi-bin include 
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \
+Makefile.am Makefile.in NEWS TODO acconfig.h aclocal.m4 config.h.in \
+configure configure.in install-sh missing mkinstalldirs
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+DIST_SUBDIRS =  getopt libcio libk libkmath libgraph libezplot libir src \
+man html cgi-bin include
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4):  configure.in 
+       cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+       cd $(srcdir) && $(AUTOCONF)
+
+config.h: stamp-h
+       @if test ! -f $@; then \
+               rm -f stamp-h; \
+               $(MAKE) stamp-h; \
+       else :; fi
+stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=config.h \
+            $(SHELL) ./config.status
+       @echo timestamp > stamp-h 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/stamp-h.in; \
+               $(MAKE) $(srcdir)/stamp-h.in; \
+       else :; fi
+$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+       -rm -f config.h
+
+maintainer-clean-hdr:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+         rev="$$subdir $$rev"; \
+         test "$$subdir" = "." && dot_seen=yes; \
+       done; \
+       test "$$dot_seen" = "no" && rev=". $$rev"; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+           test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       -rm -rf $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+       mkdir $(distdir)/=build
+       mkdir $(distdir)/=inst
+       dc_install_base=`cd $(distdir)/=inst && pwd`; \
+       cd $(distdir)/=build \
+         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) dist
+       -rm -rf $(distdir)
+       @banner="$(distdir).tar.gz is ready for distribution"; \
+       dashes=`echo "$$banner" | sed s/./=/g`; \
+       echo "$$dashes"; \
+       echo "$$banner"; \
+       echo "$$dashes"
+dist: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+dist-all: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+distdir: $(DISTFILES)
+       -rm -rf $(distdir)
+       mkdir $(distdir)
+       -chmod 777 $(distdir)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+       for subdir in $(DIST_SUBDIRS); do \
+         if test "$$subdir" = .; then :; else \
+           test -d $(distdir)/$$subdir \
+           || mkdir $(distdir)/$$subdir \
+           || exit 1; \
+           chmod 777 $(distdir)/$$subdir; \
+           (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
+             || exit 1; \
+         fi; \
+       done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+all-recursive-am: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile config.h
+all-redirect: all-recursive-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-hdr mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-hdr clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-hdr distclean-tags distclean-generic clean-am
+
+distclean: distclean-recursive
+       -rm -f config.status
+
+maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-tags \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f config.status
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+install-data-recursive uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..6ecfdb9
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,4 @@
+0.5.0
+April 27, 2000
+
+This is the first open source release
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..30cca64
--- /dev/null
+++ b/README
@@ -0,0 +1,102 @@
+COPYRIGHT
+---------
+This program is written by Kevin M. Rosenberg, M.D.
+
+It is covered by the GNU General Public License (GPL) which
+allows copying and modifying this code with restrictions. See the
+file COPYING for complete details.
+
+HISTORY
+------
+
+CTSim development began in 1983 while I was in medical school.  It was
+written using Lattice C and MS-DOS. I used assembly language to write
+directly to an IBM EGA video adapter.
+
+In 1999, I ported CTsim to GNU/Linux. In April 2000, the source code 
+for CTSim was published on the Internet.
+
+STATUS 
+------
+
+The official home for CTsim is http://www.ctsim.org. From this site,
+you can download the CTsim source code and use CTSim online using a
+beowulf cluster.
+
+I would be very pleased to have other developers join me in the
+development of CTSim. Please see the TODO list for the most obvious
+ideas.
+
+In this release, the main issue that needs addressing is the inclusion
+of old graphic library code. This code is not being used by
+CTSim. Compilation warnings will occur in these files. Please ignore
+these warnings. In the next major release of CTSim, there will be
+support for interactive graphics. I just need to write the low-level
+drivers to support X-window rather than IBM EGA hardware.
+
+OVERVIEW
+--------
+
+CTSim simulates the collection of x-rays by a CT scanner. These x-rays
+of objects are called projections or raysums.
+
+Phantom objects are defined. Several built-in phantoms are included,
+as well as an extension to load files of phantom definitions.
+
+CTsim uses .sdf (standard data files) to represent 2-dimensional image
+data. It uses a 32-bit floating-point pixel format. SDF is loosely
+based on a image file format used by the Jet Propulsion Laboratory
+(JPL). It supports multiple text labels per image.
+
+THE PROGRAMS
+------------
+
+phm2sdf - generates an SDF image of a phantom object
+
+phm2rs - Simulates the collection of CT data, or raysums, of a phantom
+object
+
+ctrec - Performs an CT reconstruction, also known as image
+reconstruction from projections. Reads a raysum file and writes a SDF
+file.
+
+rs2sdf - Converts raysum data to a raw sinugram image
+
+sdf2img - Converts an SDF file to a variety of 8-bit image formats
+
+sdfinfo - Show statistics and history labels of SDF files
+
+TYPICAL USAGE
+-------------
+
+When evaluating CT simulation, in general, these steps are followed:
+
+Create a phantom image and viewable image file
+  phm2sdf ...
+  sdf2img ...
+
+Simulate CT data collection and create a viewable image of raw raysums
+  phm2rs ...
+  rs2sdf ...
+  sdf2img ...
+
+Perform CT reconstruction and create viewable image file
+  ctrec ...
+  sdf2img ...
+
+These functions are convert output image to a PNG file performed by
+the CGI program ctsim.cgi which can be installed as described in
+INSTALL file.
+
+There is a sample shell script installed called 'sample-ctrec'.
+
+
+CLOSING
+-------
+
+Please enjoy CTSim. I'd like to hear any feedback
+
+Kevin M. Rosenberg, M.D.
+kevin@rosenberg.net
+
+
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..d0df363
--- /dev/null
+++ b/TODO
@@ -0,0 +1,7 @@
+Integrate low-level X11 graphics, replace all low-level driver code in
+libgraph. All the high-level graphics routines are in place.
+
+Strip out unused functions from libk and libkmath.
+
+Integrate audio drivers into libcio -- used for the interactive CT display.
+
diff --git a/acconfig.h b/acconfig.h
new file mode 100644 (file)
index 0000000..ce38590
--- /dev/null
@@ -0,0 +1,56 @@
+/* Define to be the version of the distribution.  */
+#undef VERSION
+
+/* Define to signal compiler support for void and void * types */
+#define HAVE_VOID 1
+
+/* Define (if compiling as C++) to signal compiler support for bool type */
+#undef HAVE_BOOL
+
+/* Define under HP/UX to get matherr-related things from math.h. */
+#undef _HPUX_SOURCE
+
+/* Define to signal that fflush(NULL) works: it flushes all outstreams. */
+#undef HAVE_NULL_FLUSH
+
+/* Redundant and unused: Define to signal that fflush(NULL) doesn't work. */
+#undef DONT_HAVE_NULL_FLUSH
+
+/* Define to signal that Motif should be used, if X11 is used */
+#undef USE_MOTIF
+
+/* Define to signal support in libc for the pthread threads library */
+#undef PTHREAD_SUPPORT
+
+/* Define if we have the thread-safe library function ctime_r() */
+#undef HAVE_CTIME_R
+
+/* Define if we have the thread-safe library function localtime_r() */
+#undef HAVE_LOCALTIME_R
+
+/* Define to signal support in libXt/libX11 for multithreading */
+#undef X_THREAD_SUPPORT
+
+/* Define to signal support in -lXext for the DBE X11 protocol extension */
+#undef HAVE_DBE_SUPPORT
+
+/* Define to signal support in -lXext for the MBX X11 protocol extension */
+#undef HAVE_MBX_SUPPORT
+
+/* Define to enable support for the 45 LaserJet fonts in X output */
+#undef USE_LJ_FONTS_IN_X
+
+/* Define to enable support for the 45 LaserJet fonts in PS output */
+#undef USE_LJ_FONTS_IN_PS
+
+/* Define to enable support for the 35 PS fonts in PCL output */
+#undef USE_PS_FONTS_IN_PCL
+
+/* Define if have getopt_long function */
+#undef HAVE_GETOPT_LONG
+
+/* Define if have PNG library */
+#undef HAVE_PNG
+
+/* Define is have interactive graphics */
+#undef HAVE_INTERACTIVE_GRAPHICS
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..8971ab4
--- /dev/null
@@ -0,0 +1,142 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4a
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# Do all the work for Automake.  This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AC_PROG_INSTALL])
+dnl We require 2.13 because we rely on SHELL being computed by configure.
+AC_PREREQ([2.13])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "[$]*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "[$]*" != "X $srcdir/configure conftestfile" \
+      && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "[$]2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+   $1=$2
+   AC_MSG_RESULT(found)
+else
+   $1="$3/missing $2"
+   AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+AC_DEFUN(AM_CONFIG_HEADER,
+[AC_PREREQ([2.12])
+AC_CONFIG_HEADER([$1])
+dnl When config.status generates a header, we must update the stamp-h file.
+dnl This file resides in the same directory as the config header
+dnl that is generated.  We must strip everything past the first ":",
+dnl and everything past the last "/".
+AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
+ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
+<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
+<<am_indx=1
+for am_file in <<$1>>; do
+  case " <<$>>CONFIG_HEADERS " in
+  *" <<$>>am_file "*<<)>>
+    echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+    ;;
+  esac
+  am_indx=`expr "<<$>>am_indx" + 1`
+done<<>>dnl>>)
+changequote([,]))])
+
+# Define a conditional.
+
+AC_DEFUN(AM_CONDITIONAL,
+[AC_SUBST($1_TRUE)
+AC_SUBST($1_FALSE)
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi])
+
diff --git a/acsite.m4 b/acsite.m4
new file mode 100644 (file)
index 0000000..a44ae52
--- /dev/null
+++ b/acsite.m4
@@ -0,0 +1,24 @@
+dnl aclocal.m4 generated automatically by aclocal 1.3
+
+dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+dnl This Makefile.in is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+#
+# acinclude.m4
+#
+
+dnl   Add argument to CFLAGS if using gcc.
+AC_DEFUN(AC_ADD_GCC_CFLAGS,
+[AC_REQUIRE([AC_PROG_CC])
+ if test -n "$GCC"; then
+    CFLAGS="$CFLAGS $1"
+ fi
+ ])
+
diff --git a/batch-update b/batch-update
new file mode 100755 (executable)
index 0000000..3e9d4f8
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/perl
+
+foreach $file (@ARGV) 
+{
+    open(IN,$file) || die "Can not open $file";
+    open(OUT,"> /tmp/upd.$$") || die "Can not open /tmp/upd.$$";
+    while (<IN>) {
+       if (/Copyright \(C\) 1983-2000 Kevin Rosenberg/) {
+           print OUT '**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: batch-update,v 1.1 2000/04/28 13:02:43 kevin Exp $
+**  $Log: batch-update,v $
+**  Revision 1.1  2000/04/28 13:02:43  kevin
+**  Initial revision
+**
+';
+       } else {
+           print OUT $_;
+       }
+    }
+    close(IN);
+    close(OUT);
+    unlink($file);
+    `mv /tmp/upd.$$ $file`;
+}
+
diff --git a/cgi-bin/Makefile b/cgi-bin/Makefile
new file mode 100644 (file)
index 0000000..0fd76fa
--- /dev/null
@@ -0,0 +1,219 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /opt/ctsim
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/ctsim
+pkglibdir = $(libdir)/ctsim
+pkgincludedir = $(includedir)/ctsim
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+INSTALL_STRIP_FLAG =
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = gawk
+CC = gcc
+MAKEINFO = makeinfo
+PACKAGE = ctsim
+RANLIB = ranlib
+VERSION = 0.5.0
+X_BASIC_LIBS = -lXext -lX11
+X_CFLAGS =  -I/usr/X11R6/include
+X_EXTRA_LIBS = 
+X_LIBS =  -L/usr/X11R6/lib
+X_PRE_LIBS =  -lSM -lICE
+X_TOOLKIT_LIBS = -lXt
+cgibindir = /opt/apache/cgi-bin
+cgibinurl = /cgi-bin
+cgiprograms = ctsim.cgi
+ctlamlibs = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+ctlibs = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+htmldata = ctsim.html
+htmldir = /opt/apache/htdocs/ctsim
+lamdir = /opt/lam
+lamprograms = ctrec-lam phm2sdf-lam phm2rs-lam
+my_includes =  -I../include -I..
+webdatadir = /opt/apache/htdocs/ctsim/webdata
+webdataurl = /ctsim/webdata
+webenabled = true
+
+cgibin_SCRIPTS = ctsim.cgi
+EXTRA_SCRIPTS = ctsim.cgi
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =  ctsim.cgi
+SCRIPTS =  $(cgibin_SCRIPTS)
+
+DIST_COMMON =  Makefile.am Makefile.in ctsim.cgi.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu cgi-bin/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+ctsim.cgi: $(top_builddir)/config.status ctsim.cgi.in
+       cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+install-cgibinSCRIPTS: $(cgibin_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(cgibindir)
+       @list='$(cgibin_SCRIPTS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $$p $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`; \
+         else if test -f $(srcdir)/$$p; then \
+           echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`; \
+         else :; fi; fi; \
+       done
+
+uninstall-cgibinSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       list='$(cgibin_SCRIPTS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`; \
+       done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = cgi-bin
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu cgi-bin/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-cgibinSCRIPTS
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-cgibinSCRIPTS
+uninstall: uninstall-am
+all-am: Makefile $(SCRIPTS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(cgibindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: uninstall-cgibinSCRIPTS install-cgibinSCRIPTS tags distdir \
+info-am info dvi-am dvi check check-am installcheck-am installcheck \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/cgi-bin/Makefile.am b/cgi-bin/Makefile.am
new file mode 100644 (file)
index 0000000..d523a20
--- /dev/null
@@ -0,0 +1,2 @@
+cgibin_SCRIPTS=@cgiprograms@
+EXTRA_SCRIPTS=ctsim.cgi
diff --git a/cgi-bin/Makefile.in b/cgi-bin/Makefile.in
new file mode 100644 (file)
index 0000000..4e7f032
--- /dev/null
@@ -0,0 +1,219 @@
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_FLAG =
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = @AWK@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+X_BASIC_LIBS = @X_BASIC_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_TOOLKIT_LIBS = @X_TOOLKIT_LIBS@
+cgibindir = @cgibindir@
+cgibinurl = @cgibinurl@
+cgiprograms = @cgiprograms@
+ctlamlibs = @ctlamlibs@
+ctlibs = @ctlibs@
+htmldata = @htmldata@
+htmldir = @htmldir@
+lamdir = @lamdir@
+lamprograms = @lamprograms@
+my_includes = @my_includes@
+webdatadir = @webdatadir@
+webdataurl = @webdataurl@
+webenabled = @webenabled@
+
+cgibin_SCRIPTS = @cgiprograms@
+EXTRA_SCRIPTS = ctsim.cgi
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =  ctsim.cgi
+SCRIPTS =  $(cgibin_SCRIPTS)
+
+DIST_COMMON =  Makefile.am Makefile.in ctsim.cgi.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu cgi-bin/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+ctsim.cgi: $(top_builddir)/config.status ctsim.cgi.in
+       cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+install-cgibinSCRIPTS: $(cgibin_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(cgibindir)
+       @list='$(cgibin_SCRIPTS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $$p $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`; \
+         else if test -f $(srcdir)/$$p; then \
+           echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`; \
+         else :; fi; fi; \
+       done
+
+uninstall-cgibinSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       list='$(cgibin_SCRIPTS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(cgibindir)/`echo $$p|sed '$(transform)'`; \
+       done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = cgi-bin
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu cgi-bin/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-cgibinSCRIPTS
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-cgibinSCRIPTS
+uninstall: uninstall-am
+all-am: Makefile $(SCRIPTS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(cgibindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: uninstall-cgibinSCRIPTS install-cgibinSCRIPTS tags distdir \
+info-am info dvi-am dvi check check-am installcheck-am installcheck \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/cgi-bin/ctsim.cgi b/cgi-bin/ctsim.cgi
new file mode 100644 (file)
index 0000000..10f7549
--- /dev/null
@@ -0,0 +1,289 @@
+#!/usr/bin/perl
+# Generated automatically from ctsim.cgi.in by configure.
+
+use strict;
+use CGI;
+use File::Basename;
+use Fcntl ':flock';
+
+my $opt_d = 0;
+my $bindir = "/opt/ctsim/bin";
+$ENV{'PATH'} = $bindir;
+
+my $fromhost = $ENV{'REMOTE_HOST'};
+
+my $gmt_start = time();
+my $gmt_end;
+my $execution_time;
+
+my %in;
+CGI::ReadParse(\%in);
+
+# Incoming variables 
+#   Phantom_Name, Phantom_Nx, Phantom_Ny, Phantom_NSample
+#   RS_NDet, RS_NRot, RS_NRay, RS_RotAngle,
+#   IR_Nx, IR_Ny, IR_Filter, IR_Filter_Param
+
+my $error = "";
+
+my $Phantom_Name = FilterMetaChars($in{'Phantom_Name'});
+my $Phantom_Nx = FilterToNumber($in{'Phantom_Nx'});
+my $Phantom_Ny = FilterToNumber($in{'Phantom_Ny'});
+my $Phantom_NSample = FilterToNumber($in{'Phantom_NSample'});
+$error .= "Phantom name must not be blank<br>" if ($Phantom_Name eq "");
+$error .= "Phantom NX and NY must be between 5 and 1024<br>" if ($Phantom_Nx < 5 || $Phantom_Nx > 1024 || $Phantom_Ny < 5 || $Phantom_Ny > 1024);
+$error .= "Phantom NSample must be between 1 and 10<br>" if ($Phantom_NSample < 1 || $Phantom_NSample > 10);
+
+my $RS_NDet = FilterToNumber($in{'RS_NDet'});
+my $RS_NRot = FilterToNumber($in{'RS_NRot'});
+my $RS_NRay = FilterToNumber($in{'RS_NRay'});
+my $RS_RotAngle = FilterToNumber($in{'RS_RotAngle'});
+$error .= "Raysum NDet must be between 5 and 1800<br>" if ($RS_NDet < 5 || $RS_NDet > 1800);
+$error .= "Raysum NRot must be between 5 and 2048<br>" if ($RS_NRot < 5 || $RS_NRot > 2048);
+$error .= "Raysum RotAngle must be between 0.1 and 2<br>" if ($RS_RotAngle < 0.1 || $RS_RotAngle > 2);
+
+#my $IR_Nx = FilterToNumber($in{'IR_Nx'});
+#my $IR_Ny = FilterToNumber($in{'IR_Ny'});
+my $IR_Nx = $Phantom_Nx;
+my $IR_Ny = $Phantom_Ny;
+my $IR_Filter = FilterMetaChars($in{'IR_Filter'});
+my $IR_Filter_Param = FilterToNumber($in{'IR_Filter_Param'});
+my $IR_Interp = FilterMetaChars($in{'IR_Interp'});
+my $IR_Backproj = FilterMetaChars($in{'IR_Backproj'});
+
+my $Disp_Min = "auto";
+my $Disp_Max = "auto";
+$Disp_Min = FilterToNumber($in{'Disp_Min'}) if ($in{'Disp_Min'} ne "auto" && $in{'Disp_Min'} ne "");
+$Disp_Max = FilterToNumber($in{'Disp_Max'}) if ($in{'Disp_Max'} ne "auto" && $in{'Disp_Max'} ne "");
+if ($Disp_Min ne 'auto' && ! ($Disp_Min =~ /^[\d\.]+$/)) {
+    $error .= "Display Minimum must be 'auto' or numeric (received '$Disp_Min') <br>";
+}
+if ($Disp_Max ne 'auto' && ! ($Disp_Max =~ /^[\d\.]+$/)) {
+    $error .= "Display Maximum must be 'auto' or numeric (received '$Disp_Max') <br>";
+}
+
+my $MPI_Str = FilterMetaChars($in{'MPI'});
+my $MPI = 0;
+$MPI = 1 if ($MPI_Str eq "yes");
+
+$error .= "IR Nx and Ny must be between 5 and 1024<br>" if ($IR_Nx < 5 || $IR_Nx > 1024 || $IR_Ny < 5 || $IR_Ny > 1024);
+$error .= "IR Filter Parameter must be between 0 and 1<br>" if ($IR_Filter_Param < 0 || $IR_Filter_Param > 1);
+
+
+my $jobdir = "/opt/apache/htdocs/ctsim/webdata";
+my $tmpid = $$;
+my $auto_window_img = "std0.1";
+my $auto_window_diff = "std1";
+my $auto_window_rs = "full";
+my $datadir = "/opt/apache/htdocs/ctsim/webdata";
+my $url_datadir = "/ctsim/webdata";
+my $logfile = "$jobdir/ctsim.log";
+
+my $result_fname = "$datadir/result-$tmpid.html";
+my $phantom_fname = "$datadir/phantom-$tmpid.sdf";
+my $rs_fname = "$datadir/rs-$tmpid.rs";
+my $ir_fname = "$datadir/ir-$tmpid.sdf";
+my $rs_sdf_fname = "$datadir/rs-$tmpid.sdf";
+my $diff_fname = "$datadir/diff-$tmpid.sdf";
+my $phantom_png = "$datadir/phantom-$tmpid.png";
+my $ir_png = "$datadir/ir-$tmpid.png";
+my $rs_png = "$datadir/rs-$tmpid.png";
+my $diff_png = "$datadir/diff-$tmpid.png";
+
+my $result_url = "$url_datadir/result-$tmpid.html";
+my $phantom_png_url = "$url_datadir/phantom-$tmpid.png";
+my $ir_png_url = "$url_datadir/ir-$tmpid.png";
+my $rs_png_url = "$url_datadir/rs-$tmpid.png";
+my $diff_png_url = "$url_datadir/diff-$tmpid.png";
+
+my $ir_ver = "$bindir/ir";
+my $rs_ver = "$bindir/rs";
+my $gp_ver = "$bindir/gp";
+my $diff_ver = "$bindir/sdf-2";
+$ir_ver = "/opt/lam/bin/mpirun N N $bindir/ir-mpi" if $MPI;
+$rs_ver = "/opt/lam/bin/mpirun N N $bindir/rs-mpi" if $MPI;
+$gp_ver = "/opt/lam/bin/mpirun N N $bindir/gp-mpi" if $MPI;
+
+my $gp_cmd = "$gp_ver $phantom_fname $Phantom_Nx $Phantom_Ny --phantom $Phantom_Name --nsample $Phantom_NSample";
+my $rs_cmd = "$rs_ver $rs_fname $RS_NDet $RS_NRot --phantom $Phantom_Name --nray $RS_NRay --rotangle $RS_RotAngle";
+my $rs_sdf_cmd = "$bindir/rs2sdf $rs_fname $rs_sdf_fname";
+my $ir_cmd = "$ir_ver $rs_fname $ir_fname $IR_Nx $IR_Ny --filter $IR_Filter --filter-param $IR_Filter_Param --interp $IR_Interp --backproj $IR_Backproj";
+my $diff_cmd = "$diff_ver $phantom_fname $ir_fname $diff_fname --comp";
+
+my $window_options = "--auto $auto_window_img";
+if ($Disp_Min ne 'auto') {
+    $window_options .= " --min $Disp_Min";
+}
+if ($Disp_Max ne 'auto') {
+    $window_options .= " --max $Disp_Max";
+}
+
+my $png1_cmd = "$bindir/sdf2img $phantom_fname $phantom_png $window_options --stats --format png";
+my $png2_cmd = "$bindir/sdf2img $ir_fname $ir_png $window_options --stats --format png";
+my $png3_cmd = "$bindir/sdf2img $rs_sdf_fname $rs_png --auto $auto_window_rs --stats --format png";
+my $png4_cmd = "$bindir/sdf2img $diff_fname $diff_png --auto $auto_window_diff --stats --format png";
+
+my $title = "CT Simulation Results";
+
+my $out = head();
+$out .= "<HTML> <HEAD><TITLE> $title </TITLE></HEAD>\n";
+$out .= "<BODY  BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\"  VLINK=\"#800020\" LINK=\"#0000FF\">\n";
+$out .= "<H1>$title</H1><HR>\n";
+
+if ($opt_d) {
+    $out .= "<H2>Commands</H2>\n";
+    $out .= "$gp_cmd<br>\n$rs_cmd<br>\n$rs_sdf_cmd<br>\n$ir_cmd<br>\n$diff_cmd<br>\n$png1_cmd<br>\n$png2_cmd<br>\n" .
+            "$png3_cmd<br>\n$png4_cmd<br>\n";
+}
+
+my $cmdout = "";
+if ($error ne "") {
+    $out .= "<FONT COLOR=\"#FF0000\">The following errors were present in your request.<br>\n";
+    $out .= "Please correct them and try submitting your request again.</FONT><br>\n";
+    $out .= "<i>$error</i>";
+} else {
+    my $gp_out;
+    my $rs_out;
+    my $rs_sdf_out;
+    my $ir_out;
+    my $diff_out;
+    my $png_gp_out;
+    my $png_ir_out;
+    my $png_rs_out;
+    my $png_diff_out;
+    if (1) {
+       $gp_out = `$gp_cmd`;
+       $rs_out .= `$rs_cmd`;
+       $rs_sdf_out .= `$rs_sdf_cmd`;
+       $ir_out .= `$ir_cmd`;
+       $diff_out .= `$diff_cmd`;
+       $png_gp_out .= `$png1_cmd`;
+       $png_ir_out .= `$png2_cmd`;
+       $png_rs_out .= `$png3_cmd`;
+       $png_diff_out .= `$png4_cmd`;
+    } else {
+       $gp_out = `$gp_cmd 2>&1`;
+       $rs_out .= `$rs_cmd 2>&1`;
+       $rs_sdf_out .= `$rs_sdf_cmd 2>&1`;
+       $ir_out .= `$ir_cmd 2>&1`;
+       $diff_out .= `$diff_cmd 2>&1`;
+       $png_gp_out .= `$png1_cmd 2>&1`;
+       $png_ir_out .= `$png2_cmd 2>&1`;
+       $png_rs_out .= `$png3_cmd 2>&1`;
+       $png_diff_out .= `$png4_cmd 2>&1`;
+    }
+    $cmdout = "$gp_cmd\n $gp_out $rs_cmd\n $rs_out $rs_sdf_cmd\n $rs_sdf_out $ir_cmd\n $ir_out $diff_cmd\n $diff_out $png1_cmd\n $png_gp_out $png2_cmd\n $png_ir_out $png3_cmd\n $png_rs_out $png4_cmd\n $png_diff_out";
+    if (open(LOGFILE,">> $logfile")) {
+       flock(LOGFILE,LOCK_EX);
+       seek(LOGFILE, 0, 2);
+       print LOGFILE "Job $tmpid\n";
+       print LOGFILE $cmdout;
+       print LOGFILE "----------------------------------------------------\n";
+       flock(LOGFILE,LOCK_UN);
+       close(LOGFILE);
+    }
+    $gmt_end = time();
+    $execution_time = $gmt_end - $gmt_start;
+    if ($opt_d)
+    {
+       $out .= "<H3>Command Output</H3>$cmdout<HR>\n";
+    }
+    my $png_gp_out_html = $png_gp_out;
+    my $png_ir_out_html = $png_ir_out;
+    my $png_rs_out_html = $png_rs_out;
+    my $png_diff_out_html = $png_diff_out;
+    $png_gp_out_html =~ s/\n/<br>/gms;
+    $png_ir_out_html =~ s/\n/<br>/gms;
+    $png_rs_out_html =~ s/\n/<br>/gms;
+    $png_diff_out_html =~ s/\n/<br>/gms;
+    $out .= "<TABLE><TR><TD>Phantom Image</TD><TD>Reconstructed Image</TD></TR>\n";
+    $out .= "<TR><TD><IMG SRC=\"$phantom_png_url\"><br><FONT SIZE=1>$png_gp_out</FONT></TD>\n";
+    $out .= "<TD><IMG SRC=\"$ir_png_url\"><br><FONT SIZE=1>$png_ir_out</FONT></TD></TR>\n";
+    $out .= "<TR><TD>Raysum Sinusoid</TD><TD>Phantom/Reconst Error</TD></TR>\n";
+    $out .= "<TR><TD><IMG SRC=\"$rs_png_url\"><br><FONT SIZE=1>$png_rs_out</FONT></TD>\n";
+    $out .= "<TD><IMG SRC=\"$diff_png_url\"><br><FONT SIZE=2>$diff_out</FONT><br><FONT SIZE=1>$png_diff_out</FONT></TD></TR>\n";
+    $out .= "</TABLE>";
+    $out .= "Execution time: $execution_time seconds\n";
+}
+
+$out .= "<HR>\n";
+$out .= "Return to <A HREF=\"/ctsim/index.html\">CT Simulation Designer</a>.<br>\n";
+$out .= "Return to <A HREF=\"www.med-info.com\">Med-Info</a>.\n";
+$out .= "</BODY> </HTML>";
+$out .= "\n";
+
+if (open(OUTFILE,"> $result_fname"))
+{
+    flock(OUTFILE,LOCK_EX);
+    print OUTFILE $out;
+    flock(OUTFILE,LOCK_UN);
+    close OUTFILE;
+    print "Location: $result_url\n\n";
+}
+else
+{
+    print "Content-type: text/plain\n\n";
+    print "The simulator was unable to create an result file.\n";
+}
+if (open(JOBFILES,"> $jobdir/$tmpid"))
+{
+    flock(JOBFILES,LOCK_EX);
+    print JOBFILES "gmt_start=$gmt_start\n";
+    print JOBFILES "gmt_end=$gmt_end\n";
+    print JOBFILES "execution_time=$execution_time\n";
+    print JOBFILES "Phantom_Name=$Phantom_Name\n";
+    print JOBFILES "Phantom_Nx=$Phantom_Nx\n";
+    print JOBFILES "Phantom_Ny=$Phantom_Nx\n";
+    print JOBFILES "Phantom_NSample=$Phantom_NSample\n";
+    print JOBFILES "RS_NDet=$RS_NDet\n";
+    print JOBFILES "RS_NRot=$RS_NRot\n";
+    print JOBFILES "RS_NRay=$RS_NRay\n";
+    print JOBFILES "RS_RotAngle=$RS_RotAngle\n";
+    print JOBFILES "IR_Nx=$IR_Nx\n";
+    print JOBFILES "IR_Ny=$IR_Ny\n";
+    print JOBFILES "IR_Interp=$IR_Interp\n";
+    print JOBFILES "IR_Filter=$IR_Filter\n";
+    print JOBFILES "IR_Filter_Param=$IR_Filter_Param\n";
+    print JOBFILES "IR_Backproj=$IR_Backproj\n";
+    print JOBFILES "Disp_Min=$Disp_Min\n";
+    print JOBFILES "Disp_Max=$Disp_Max\n";
+    print JOBFILES "MPI=$MPI\n";
+    print JOBFILES "Files=$result_fname,$phantom_fname,$rs_fname,$ir_fname,$phantom_png,$ir_png,$rs_sdf_fname,$rs_png\n" if ($error eq "");
+    printf JOBFILES "cmdout=$cmdout\n";
+    flock(JOBFILES,LOCK_UN);
+    close JOBFILES;
+}
+
+
+exit;
+
+
+sub internal_error
+{
+  my $out = head();
+  $out .= "<H1>Internal error</H1>
+  Please notify <A HREF=mailto:webmaster\@med-info.com>webmaster\@med-info.com</A>
+  </BODY>";
+  print $out;
+  exit;
+}
+
+sub head
+{
+#  "Content: text/html\n\n";
+}
+
+
+sub FilterMetaChars
+{
+   my $var = pop(@_);
+   $var =~ /^(\w+)$/;  
+   $1;
+}
+
+sub FilterToNumber
+{
+   my $var = pop(@_);
+   $var =~ /^(\d*\.*\d*)$/;  
+   $1;
+}
diff --git a/cgi-bin/ctsim.cgi.in b/cgi-bin/ctsim.cgi.in
new file mode 100755 (executable)
index 0000000..c4d9e53
--- /dev/null
@@ -0,0 +1,289 @@
+#!/usr/bin/perl
+# @configure_input@
+
+use strict;
+use CGI;
+use File::Basename;
+use Fcntl ':flock';
+
+my $opt_d = 0;
+my $bindir = "@prefix@/bin";
+$ENV{'PATH'} = $bindir;
+
+my $fromhost = $ENV{'REMOTE_HOST'};
+
+my $gmt_start = time();
+my $gmt_end;
+my $execution_time;
+
+my %in;
+CGI::ReadParse(\%in);
+
+# Incoming variables 
+#   Phantom_Name, Phantom_Nx, Phantom_Ny, Phantom_NSample
+#   RS_NDet, RS_NRot, RS_NRay, RS_RotAngle,
+#   IR_Nx, IR_Ny, IR_Filter, IR_Filter_Param
+
+my $error = "";
+
+my $Phantom_Name = FilterMetaChars($in{'Phantom_Name'});
+my $Phantom_Nx = FilterToNumber($in{'Phantom_Nx'});
+my $Phantom_Ny = FilterToNumber($in{'Phantom_Ny'});
+my $Phantom_NSample = FilterToNumber($in{'Phantom_NSample'});
+$error .= "Phantom name must not be blank<br>" if ($Phantom_Name eq "");
+$error .= "Phantom NX and NY must be between 5 and 1024<br>" if ($Phantom_Nx < 5 || $Phantom_Nx > 1024 || $Phantom_Ny < 5 || $Phantom_Ny > 1024);
+$error .= "Phantom NSample must be between 1 and 10<br>" if ($Phantom_NSample < 1 || $Phantom_NSample > 10);
+
+my $RS_NDet = FilterToNumber($in{'RS_NDet'});
+my $RS_NRot = FilterToNumber($in{'RS_NRot'});
+my $RS_NRay = FilterToNumber($in{'RS_NRay'});
+my $RS_RotAngle = FilterToNumber($in{'RS_RotAngle'});
+$error .= "Raysum NDet must be between 5 and 1800<br>" if ($RS_NDet < 5 || $RS_NDet > 1800);
+$error .= "Raysum NRot must be between 5 and 2048<br>" if ($RS_NRot < 5 || $RS_NRot > 2048);
+$error .= "Raysum RotAngle must be between 0.1 and 2<br>" if ($RS_RotAngle < 0.1 || $RS_RotAngle > 2);
+
+#my $IR_Nx = FilterToNumber($in{'IR_Nx'});
+#my $IR_Ny = FilterToNumber($in{'IR_Ny'});
+my $IR_Nx = $Phantom_Nx;
+my $IR_Ny = $Phantom_Ny;
+my $IR_Filter = FilterMetaChars($in{'IR_Filter'});
+my $IR_Filter_Param = FilterToNumber($in{'IR_Filter_Param'});
+my $IR_Interp = FilterMetaChars($in{'IR_Interp'});
+my $IR_Backproj = FilterMetaChars($in{'IR_Backproj'});
+
+my $Disp_Min = "auto";
+my $Disp_Max = "auto";
+$Disp_Min = FilterToNumber($in{'Disp_Min'}) if ($in{'Disp_Min'} ne "auto" && $in{'Disp_Min'} ne "");
+$Disp_Max = FilterToNumber($in{'Disp_Max'}) if ($in{'Disp_Max'} ne "auto" && $in{'Disp_Max'} ne "");
+if ($Disp_Min ne 'auto' && ! ($Disp_Min =~ /^[\d\.]+$/)) {
+    $error .= "Display Minimum must be 'auto' or numeric (received '$Disp_Min') <br>";
+}
+if ($Disp_Max ne 'auto' && ! ($Disp_Max =~ /^[\d\.]+$/)) {
+    $error .= "Display Maximum must be 'auto' or numeric (received '$Disp_Max') <br>";
+}
+
+my $MPI_Str = FilterMetaChars($in{'MPI'});
+my $MPI = 0;
+$MPI = 1 if ($MPI_Str eq "yes");
+
+$error .= "IR Nx and Ny must be between 5 and 1024<br>" if ($IR_Nx < 5 || $IR_Nx > 1024 || $IR_Ny < 5 || $IR_Ny > 1024);
+$error .= "IR Filter Parameter must be between 0 and 1<br>" if ($IR_Filter_Param < 0 || $IR_Filter_Param > 1);
+
+
+my $jobdir = "@webdatadir@";
+my $tmpid = $$;
+my $auto_window_img = "std0.1";
+my $auto_window_diff = "std1";
+my $auto_window_rs = "full";
+my $datadir = "@webdatadir@";
+my $url_datadir = "@webdataurl@";
+my $logfile = "$jobdir/ctsim.log";
+
+my $result_fname = "$datadir/result-$tmpid.html";
+my $phantom_fname = "$datadir/phantom-$tmpid.sdf";
+my $rs_fname = "$datadir/rs-$tmpid.rs";
+my $ir_fname = "$datadir/ir-$tmpid.sdf";
+my $rs_sdf_fname = "$datadir/rs-$tmpid.sdf";
+my $diff_fname = "$datadir/diff-$tmpid.sdf";
+my $phantom_png = "$datadir/phantom-$tmpid.png";
+my $ir_png = "$datadir/ir-$tmpid.png";
+my $rs_png = "$datadir/rs-$tmpid.png";
+my $diff_png = "$datadir/diff-$tmpid.png";
+
+my $result_url = "$url_datadir/result-$tmpid.html";
+my $phantom_png_url = "$url_datadir/phantom-$tmpid.png";
+my $ir_png_url = "$url_datadir/ir-$tmpid.png";
+my $rs_png_url = "$url_datadir/rs-$tmpid.png";
+my $diff_png_url = "$url_datadir/diff-$tmpid.png";
+
+my $ir_ver = "$bindir/ir";
+my $rs_ver = "$bindir/rs";
+my $gp_ver = "$bindir/gp";
+my $diff_ver = "$bindir/sdf-2";
+$ir_ver = "/opt/lam/bin/mpirun N N $bindir/ir-mpi" if $MPI;
+$rs_ver = "/opt/lam/bin/mpirun N N $bindir/rs-mpi" if $MPI;
+$gp_ver = "/opt/lam/bin/mpirun N N $bindir/gp-mpi" if $MPI;
+
+my $gp_cmd = "$gp_ver $phantom_fname $Phantom_Nx $Phantom_Ny --phantom $Phantom_Name --nsample $Phantom_NSample";
+my $rs_cmd = "$rs_ver $rs_fname $RS_NDet $RS_NRot --phantom $Phantom_Name --nray $RS_NRay --rotangle $RS_RotAngle";
+my $rs_sdf_cmd = "$bindir/rs2sdf $rs_fname $rs_sdf_fname";
+my $ir_cmd = "$ir_ver $rs_fname $ir_fname $IR_Nx $IR_Ny --filter $IR_Filter --filter-param $IR_Filter_Param --interp $IR_Interp --backproj $IR_Backproj";
+my $diff_cmd = "$diff_ver $phantom_fname $ir_fname $diff_fname --comp";
+
+my $window_options = "--auto $auto_window_img";
+if ($Disp_Min ne 'auto') {
+    $window_options .= " --min $Disp_Min";
+}
+if ($Disp_Max ne 'auto') {
+    $window_options .= " --max $Disp_Max";
+}
+
+my $png1_cmd = "$bindir/sdf2img $phantom_fname $phantom_png $window_options --stats --format png";
+my $png2_cmd = "$bindir/sdf2img $ir_fname $ir_png $window_options --stats --format png";
+my $png3_cmd = "$bindir/sdf2img $rs_sdf_fname $rs_png --auto $auto_window_rs --stats --format png";
+my $png4_cmd = "$bindir/sdf2img $diff_fname $diff_png --auto $auto_window_diff --stats --format png";
+
+my $title = "CT Simulation Results";
+
+my $out = head();
+$out .= "<HTML> <HEAD><TITLE> $title </TITLE></HEAD>\n";
+$out .= "<BODY  BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\"  VLINK=\"#800020\" LINK=\"#0000FF\">\n";
+$out .= "<H1>$title</H1><HR>\n";
+
+if ($opt_d) {
+    $out .= "<H2>Commands</H2>\n";
+    $out .= "$gp_cmd<br>\n$rs_cmd<br>\n$rs_sdf_cmd<br>\n$ir_cmd<br>\n$diff_cmd<br>\n$png1_cmd<br>\n$png2_cmd<br>\n" .
+            "$png3_cmd<br>\n$png4_cmd<br>\n";
+}
+
+my $cmdout = "";
+if ($error ne "") {
+    $out .= "<FONT COLOR=\"#FF0000\">The following errors were present in your request.<br>\n";
+    $out .= "Please correct them and try submitting your request again.</FONT><br>\n";
+    $out .= "<i>$error</i>";
+} else {
+    my $gp_out;
+    my $rs_out;
+    my $rs_sdf_out;
+    my $ir_out;
+    my $diff_out;
+    my $png_gp_out;
+    my $png_ir_out;
+    my $png_rs_out;
+    my $png_diff_out;
+    if (1) {
+       $gp_out = `$gp_cmd`;
+       $rs_out .= `$rs_cmd`;
+       $rs_sdf_out .= `$rs_sdf_cmd`;
+       $ir_out .= `$ir_cmd`;
+       $diff_out .= `$diff_cmd`;
+       $png_gp_out .= `$png1_cmd`;
+       $png_ir_out .= `$png2_cmd`;
+       $png_rs_out .= `$png3_cmd`;
+       $png_diff_out .= `$png4_cmd`;
+    } else {
+       $gp_out = `$gp_cmd 2>&1`;
+       $rs_out .= `$rs_cmd 2>&1`;
+       $rs_sdf_out .= `$rs_sdf_cmd 2>&1`;
+       $ir_out .= `$ir_cmd 2>&1`;
+       $diff_out .= `$diff_cmd 2>&1`;
+       $png_gp_out .= `$png1_cmd 2>&1`;
+       $png_ir_out .= `$png2_cmd 2>&1`;
+       $png_rs_out .= `$png3_cmd 2>&1`;
+       $png_diff_out .= `$png4_cmd 2>&1`;
+    }
+    $cmdout = "$gp_cmd\n $gp_out $rs_cmd\n $rs_out $rs_sdf_cmd\n $rs_sdf_out $ir_cmd\n $ir_out $diff_cmd\n $diff_out $png1_cmd\n $png_gp_out $png2_cmd\n $png_ir_out $png3_cmd\n $png_rs_out $png4_cmd\n $png_diff_out";
+    if (open(LOGFILE,">> $logfile")) {
+       flock(LOGFILE,LOCK_EX);
+       seek(LOGFILE, 0, 2);
+       print LOGFILE "Job $tmpid\n";
+       print LOGFILE $cmdout;
+       print LOGFILE "----------------------------------------------------\n";
+       flock(LOGFILE,LOCK_UN);
+       close(LOGFILE);
+    }
+    $gmt_end = time();
+    $execution_time = $gmt_end - $gmt_start;
+    if ($opt_d)
+    {
+       $out .= "<H3>Command Output</H3>$cmdout<HR>\n";
+    }
+    my $png_gp_out_html = $png_gp_out;
+    my $png_ir_out_html = $png_ir_out;
+    my $png_rs_out_html = $png_rs_out;
+    my $png_diff_out_html = $png_diff_out;
+    $png_gp_out_html =~ s/\n/<br>/gms;
+    $png_ir_out_html =~ s/\n/<br>/gms;
+    $png_rs_out_html =~ s/\n/<br>/gms;
+    $png_diff_out_html =~ s/\n/<br>/gms;
+    $out .= "<TABLE><TR><TD>Phantom Image</TD><TD>Reconstructed Image</TD></TR>\n";
+    $out .= "<TR><TD><IMG SRC=\"$phantom_png_url\"><br><FONT SIZE=1>$png_gp_out</FONT></TD>\n";
+    $out .= "<TD><IMG SRC=\"$ir_png_url\"><br><FONT SIZE=1>$png_ir_out</FONT></TD></TR>\n";
+    $out .= "<TR><TD>Raysum Sinusoid</TD><TD>Phantom/Reconst Error</TD></TR>\n";
+    $out .= "<TR><TD><IMG SRC=\"$rs_png_url\"><br><FONT SIZE=1>$png_rs_out</FONT></TD>\n";
+    $out .= "<TD><IMG SRC=\"$diff_png_url\"><br><FONT SIZE=2>$diff_out</FONT><br><FONT SIZE=1>$png_diff_out</FONT></TD></TR>\n";
+    $out .= "</TABLE>";
+    $out .= "Execution time: $execution_time seconds\n";
+}
+
+$out .= "<HR>\n";
+$out .= "Return to <A HREF=\"/ctsim/index.html\">CT Simulation Designer</a>.<br>\n";
+$out .= "Return to <A HREF=\"www.med-info.com\">Med-Info</a>.\n";
+$out .= "</BODY> </HTML>";
+$out .= "\n";
+
+if (open(OUTFILE,"> $result_fname"))
+{
+    flock(OUTFILE,LOCK_EX);
+    print OUTFILE $out;
+    flock(OUTFILE,LOCK_UN);
+    close OUTFILE;
+    print "Location: $result_url\n\n";
+}
+else
+{
+    print "Content-type: text/plain\n\n";
+    print "The simulator was unable to create an result file.\n";
+}
+if (open(JOBFILES,"> $jobdir/$tmpid"))
+{
+    flock(JOBFILES,LOCK_EX);
+    print JOBFILES "gmt_start=$gmt_start\n";
+    print JOBFILES "gmt_end=$gmt_end\n";
+    print JOBFILES "execution_time=$execution_time\n";
+    print JOBFILES "Phantom_Name=$Phantom_Name\n";
+    print JOBFILES "Phantom_Nx=$Phantom_Nx\n";
+    print JOBFILES "Phantom_Ny=$Phantom_Nx\n";
+    print JOBFILES "Phantom_NSample=$Phantom_NSample\n";
+    print JOBFILES "RS_NDet=$RS_NDet\n";
+    print JOBFILES "RS_NRot=$RS_NRot\n";
+    print JOBFILES "RS_NRay=$RS_NRay\n";
+    print JOBFILES "RS_RotAngle=$RS_RotAngle\n";
+    print JOBFILES "IR_Nx=$IR_Nx\n";
+    print JOBFILES "IR_Ny=$IR_Ny\n";
+    print JOBFILES "IR_Interp=$IR_Interp\n";
+    print JOBFILES "IR_Filter=$IR_Filter\n";
+    print JOBFILES "IR_Filter_Param=$IR_Filter_Param\n";
+    print JOBFILES "IR_Backproj=$IR_Backproj\n";
+    print JOBFILES "Disp_Min=$Disp_Min\n";
+    print JOBFILES "Disp_Max=$Disp_Max\n";
+    print JOBFILES "MPI=$MPI\n";
+    print JOBFILES "Files=$result_fname,$phantom_fname,$rs_fname,$ir_fname,$phantom_png,$ir_png,$rs_sdf_fname,$rs_png\n" if ($error eq "");
+    printf JOBFILES "cmdout=$cmdout\n";
+    flock(JOBFILES,LOCK_UN);
+    close JOBFILES;
+}
+
+
+exit;
+
+
+sub internal_error
+{
+  my $out = head();
+  $out .= "<H1>Internal error</H1>
+  Please notify <A HREF=mailto:webmaster\@med-info.com>webmaster\@med-info.com</A>
+  </BODY>";
+  print $out;
+  exit;
+}
+
+sub head
+{
+#  "Content: text/html\n\n";
+}
+
+
+sub FilterMetaChars
+{
+   my $var = pop(@_);
+   $var =~ /^(\w+)$/;  
+   $1;
+}
+
+sub FilterToNumber
+{
+   my $var = pop(@_);
+   $var =~ /^(\d*\.*\d*)$/;  
+   $1;
+}
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..7cdca48
--- /dev/null
@@ -0,0 +1,101 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define if you don't have vprintf but do have _doprnt.  */
+#undef HAVE_DOPRNT
+
+/* Define if you have the vprintf function.  */
+#undef HAVE_VPRINTF
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* Define if your <sys/time.h> declares struct tm.  */
+#undef TM_IN_SYS_TIME
+
+/* Define if the X Window System is missing or not being used.  */
+#undef X_DISPLAY_MISSING
+
+/* Define to signal support in libXt/libX11 for multithreading */
+#undef X_THREAD_SUPPORT
+
+/* Define to signal support in -lXext for the DBE X11 protocol extension */
+#undef HAVE_DBE_SUPPORT
+
+/* Define to signal support in -lXext for the MBX X11 protocol extension */
+#undef HAVE_MBX_SUPPORT
+
+/* Define if have getopt_long function */
+#undef HAVE_GETOPT_LONG
+
+/* Define if have PNG library */
+#undef HAVE_PNG
+
+/* Define if you have the strtod function.  */
+#undef HAVE_STRTOD
+
+/* Define if you have the strtol function.  */
+#undef HAVE_STRTOL
+
+/* Define if you have the <X11/extensions/Xdbe.h> header file.  */
+#undef HAVE_X11_EXTENSIONS_XDBE_H
+
+/* Define if you have the <X11/extensions/multibuf.h> header file.  */
+#undef HAVE_X11_EXTENSIONS_MULTIBUF_H
+
+/* Define if you have the <ctype.h> header file.  */
+#undef HAVE_CTYPE_H
+
+/* Define if you have the <fcntl.h> header file.  */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <getopt.h> header file.  */
+#undef HAVE_GETOPT_H
+
+/* Define if you have the <math.h> header file.  */
+#undef HAVE_MATH_H
+
+/* Define if you have the <setjmp.h> header file.  */
+#undef HAVE_SETJMP_H
+
+/* Define if you have the <stdarg.h> header file.  */
+#undef HAVE_STDARG_H
+
+/* Define if you have the <stddef.h> header file.  */
+#undef HAVE_STDDEF_H
+
+/* Define if you have the <stdio.h> header file.  */
+#undef HAVE_STDIO_H
+
+/* Define if you have the <string.h> header file.  */
+#undef HAVE_STRING_H
+
+/* Define if you have the <sys/fcntl.h> header file.  */
+#undef HAVE_SYS_FCNTL_H
+
+/* Define if you have the <sys/stat.h> header file.  */
+#undef HAVE_SYS_STAT_H
+
+/* Define if you have the <sys/types.h> header file.  */
+#undef HAVE_SYS_TYPES_H
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the m library (-lm).  */
+#undef HAVE_LIBM
+
+/* Name of package */
+#undef PACKAGE
+
+/* Version number of package */
+#undef VERSION
+
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..36c74b6
--- /dev/null
@@ -0,0 +1,288 @@
+dnl Process this file with autoconf to produce a configure script.
+
+dnl Must reset CDPATH so that bash's cd does not print to stdout
+dnl CDPATH=
+
+AC_INIT(src/ctrec.c)
+AM_INIT_AUTOMAKE(ctsim,0.5.0)
+AM_CONFIG_HEADER(config.h)
+
+dnl Checks for programs.
+AC_PROG_AWK
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+AC_PROG_RANLIB
+AC_PROG_CC
+
+dnl Checks for libraries.
+AC_CHECK_LIB(z, main, 
+[
+  zlib="true"
+],
+[ 
+  zlib="false"
+  AC_MSG_WARN([zlib missing. Will need zlib for PNG support])
+])
+AC_CHECK_LIB(m, main)
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(fcntl.h unistd.h getopt.h sys/fcntl.h setjmp.h stdarg.h stddef.h sys/types.h sys/stat.h string.h ctype.h math.h stdio.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_STRUCT_TM
+
+dnl Checks for library functions.
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS(strtod strtol)
+AC_CHECK_FUNC(basename)
+AC_CHECK_FUNC(setjmp)
+AC_CHECK_FUNC(getopt_long,
+[
+  getopt_long=true
+],
+[
+  getopt_long=false
+  my_includes="$myincludes -I../getopt"
+  AC_DEFINE(HAVE_GETOPT_LONG)
+  ctlibs_base="$ctlibs_base -lgetopt"
+  LDFLAGS="$LDFLAGS -L../getopt"
+  AM_CONDITIONAL(INCLUDED_GETOPT_LONG, test 1==1)
+])
+
+
+AC_ADD_GCC_CFLAGS([-Wall])
+AC_MSG_CHECKING(whether to enable verbose warnings)
+AC_ARG_ENABLE(verbose-warnings,
+[  --enable-verbose-warnings
+                          Enable verbose compiler warnings.],
+[ case "$enableval" in
+  yes)
+    AC_MSG_RESULT(yes)
+    AC_ADD_GCC_CFLAGS([-W])
+    AC_ADD_GCC_CFLAGS([-Wshadow -Wpointer-arith -Wbad-function-cast])
+    AC_ADD_GCC_CFLAGS([-Wcast-align -Wwrite-strings -Waggregate-return])
+    AC_ADD_GCC_CFLAGS([-Wmissing-prototypes -Wstrict-prototypes])
+    AC_ADD_GCC_CFLAGS([-pedantic])
+    AC_ADD_GCC_CFLAGS([-Wredundant-decls])
+
+    ;;
+  *)
+    AC_MSG_RESULT(no)
+    ;;
+  esac ], AC_MSG_RESULT(no)
+)
+
+dnl Check for debug mode
+AC_ARG_ENABLE(debug,
+[  --enable-debug          Turn on debugging],
+[case "${enableval}" in
+  yes) debug=true ;;
+  no)  debug=false ;;
+  *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
+esac],[debug=false])
+AM_CONDITIONAL(DEBUG, test "$debug" = "true")
+
+dnl Set PNG directory     
+AC_MSG_CHECKING([for PNG library installation])
+AC_ARG_WITH(png,
+[  --with-png[=PATH]       Set path of lib PNG installation ],
+[
+     if test "$withval" != "no" ; then
+         trypngdir=$withval
+         if test "$prefix" != "NONE" ; then
+         trypngdir="$trypngdir $prefix"
+       fi
+     fi
+]
+)
+
+if test "$withval" != "no" -a "$zlib" = "true" ; then
+  for testpngdir in "." $trypngdir /usr/local /usr /opt ; do
+    if test -f "$testpngdir/lib/libpng.a" ; then
+      if test ! -f "$testpngdir/include/png.h" ; then
+        AC_MSG_ERROR([PNG library found, but png.h not found. Check PNG installation])
+      else
+          grep PNG_LIBPNG_VER_STRING "$testpngdir/include/png.h" | grep 9 > /dev/null 
+          if test "$?" = "0" ; then
+            AC_MSG_ERROR([Your version of libpng in $testpngdir is too old -- please upgrade])
+          fi
+      fi
+      LDFLAGS="$LDFLAGS -L$testpngdir/lib"
+      CFLAGS="$CFLAGS -I$testpngdir/include"
+      pngdir="$testpngdir"
+      AC_DEFINE(HAVE_PNG)
+      break
+    elif test -f "$testpngdir/libpng.a" ; then
+      if test ! -f "$testpngdir/png.h" ; then
+        AC_MSG_ERROR([PNG library found, but png.h not found. Check PNG installation])
+      else
+          grep PNG_LIBPNG_VER_STRING "$testpngdir/png.h" | grep 9 > /dev/null 
+          if test "$?" = "0" ; then
+            AC_MSG_ERROR([Your version of libpng in $testpngdir is too old -- please upgrade])
+          fi
+      fi
+      LDFLAGS="$LDFLAGS -L$testpngdir"
+      CFLAGS="$CFLAGS -I$testpngdir"
+      pngdir="$testpngdir"
+      AC_DEFINE(HAVE_PNG)
+      break
+    fi
+  done
+  AC_MSG_RESULT($pngdir)
+  AM_CONDITIONAL(HAVE_PNG, test -n "$pngdir")
+else
+  AC_MSG_RESULT([no])
+fi
+
+dnl Set LAM path
+AC_ARG_WITH(lam,
+[  --with-lam[=PATH]       Set path of LAM MPI ],
+[    if test "$withval" != "no" ; then
+         trylamdir=$withval
+     fi ]
+)
+
+if test "$withval" != "no" ; then
+  if test "$prefix" != "NONE" ; then
+     trylamdir="$trylamdir $prefix"
+  fi
+
+  AC_MSG_CHECKING([for LAM MPI installation])
+  for testlamdir in "." $trylamdir /usr/local /usr/local/lam /usr /usr/lam /opt /opt/lam ; do
+    if test -x "$testlamdir/bin/hcc" ; then
+      LDFLAGS="$LDFLAGS -L$testlamdir/lib"
+      CFLAGS="$CFLAGS -I$testlamdir/include"
+      lamdir="$testlamdir"
+      AC_SUBST(lamdir)
+      break
+    fi
+  done
+  AC_MSG_RESULT($lamdir)
+fi
+
+AC_MSG_CHECKING([for web access])
+dnl Set cgi-bin directory
+AC_ARG_WITH(cgibin-dir, [  --with-cgibin-dir=PATH  Set path of CGI binaries directory ], 
+[ cgibindir=$withval ; AC_SUBST(cgibindir) ] )
+
+AC_ARG_WITH(cgibin-url, [  --with-cgibin-url=PATH  Set URL path of CGI binaries ], 
+[ cgibinurl=$withval ; AC_SUBST(cgibinurl) ] )
+
+AC_ARG_WITH(webdata-dir, [  --with-webdata-dir=PATH Set path of webdata], 
+[ webdatadir=$withval ; AC_SUBST(webdatadir)  ] )
+
+AC_ARG_WITH(webdata-url, [  --with-webdata-url=PATH Set URL path of webdata], 
+[ webdataurl=$withval ; AC_SUBST(webdataurl) ] )
+
+AC_ARG_WITH(html-dir, [  --with-html-dir=PATH    Set directory of html files], 
+[ htmldir=$withval ; AC_SUBST(htmldir) ] )
+
+if test -n "$cgibindir" -o -n "$cgibinurl" ; then
+  cgiprograms=ctsim.cgi
+  AC_SUBST(cgiprograms)
+fi
+
+if test -n "$htmldir" ; then
+  htmldata=ctsim.html
+  AC_SUBST(htmldata)
+fi
+AM_CONDITIONAL(USE_HTML, test -n "$htmldir")
+
+if test -n "$cgibindir" -o -n "$cgibinurl" -o -n "$webdatadir" -o -n "$webdataurl" -o -n "$htmldir" ; then
+  webenabled=true
+  AC_SUBST(webenabled)
+  AC_MSG_RESULT([yes])
+  if test -z "$cgibindir" ; then
+    AC_MSG_ERROR([--with-cgibin-dir not set for web access])
+  elif test -z "$cgibinurl" ; then
+    AC_MSG_ERROR([--with-cgibin-url not set for web access])
+  elif test -z "$webdatadir" ; then
+    AC_MSG_ERROR([--with-webdata-dir not set for web access])
+  elif test -z "$webdataurl" ; then
+    AC_MSG_ERROR([--with-webdata-url not set for web access])
+  elif test -z "$htmldir" ; then
+    AC_MSG_ERROR([--with-html-dir not set for web access])
+  fi
+else
+  AC_MSG_RESULT([no])
+fi
+
+dnl Setting projet libraries and includes
+LDFLAGS="$LDFLAGS -L../libezplot -L../libgraph -L../libkmath -L../libk -L../libcio -L../libir" 
+ctlibs_base="$ctlibs_base -lezplot -lgraph -lkmath -lk -lcio"
+if test -n "$pngdir" ; then
+  ctlibs_base="$ctlibs_base -lpng"
+fi
+if test "$zlib" = "true" ; then
+  ctlibs_base="$ctlibs_base -lz"
+fi
+ctlibs="-lir $ctlibs_base"
+
+AC_SUBST(ctlibs)
+
+if test -n "$lamdir" ; then
+  ctlamlibs="-lir_lam $ctlibs_base"
+  lamprograms="ctrec-lam phm2sdf-lam phm2rs-lam"
+  AC_SUBST(lamprograms)
+  AC_SUBST(ctlamlibs)
+fi
+
+AM_CONDITIONAL(USE_LAM, test -n "$lamdir")
+
+dnl Prepare to support X.  If the user gave the command-line option
+dnl --without-x, AC_PATH_XTRA will set no_x to "yes".  Otherwise, it will
+dnl add appropriate preprocessor flags to X_CFLAGS, and appropriate linker
+dnl flags to X_LIBS.  It also checks for system-specific X libraries, and
+dnl adds them to X_PRE_LIBS or X_EXTRA_LIBS, as appropriate.  (The former
+dnl is where "-lSM -lICE" goes, in X11R6.)  We define the X_TOOLKIT_LIBS
+dnl and X_BASIC_LIBS argument vectors ourselves, and if X is to be
+dnl supported, we'll concatenate the whole lot of these into a command line
+dnl for libtool.  See, e.g., the libplot_la_LIBADD line in
+dnl libplot/Makefile.am.
+
+AC_PATH_XTRA
+AC_SUBST(X_CFLAGS)
+dnl Following five are concatenated together into a linker specification.
+AC_SUBST(X_LIBS)
+AC_SUBST(X_TOOLKIT_LIBS)
+AC_SUBST(X_PRE_LIBS)
+AC_SUBST(X_BASIC_LIBS)
+AC_SUBST(X_EXTRA_LIBS)
+
+X_TOOLKIT_LIBS="-lXt"
+X_BASIC_LIBS="-lXext -lX11"
+
+dnl Check whether libXt has thread support.  Some platforms may have
+dnl pthread support in libc, but no thread support in libXt/libX11.
+our_saved_LDFLAGS="$LDFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+AC_CHECK_LIB(Xt, XtToolkitThreadInitialize, AC_DEFINE(X_THREAD_SUPPORT), , $X_PRE_LIBS $X_BASIC_LIBS $X_EXTRA_LIBS)
+LDFLAGS="$our_saved_LDFLAGS"
+
+dnl Check in -lXext for double buffering extensions to X11, and check
+dnl whether appropriate header files are present.  (Some systems have one
+dnl but not the other.)
+our_saved_LDFLAGS="$LDFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+AC_CHECK_LIB(Xext, XdbeQueryExtension, AC_DEFINE(HAVE_DBE_SUPPORT), , -lX11 "$X_EXTRA_LIBS")
+AC_CHECK_LIB(Xext, XmbufQueryExtension, AC_DEFINE(HAVE_MBX_SUPPORT), , -lX11 "$X_EXTRA_LIBS")
+LDFLAGS="$our_saved_LDFLAGS"
+our_saved_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+AC_CHECK_HEADERS(X11/extensions/Xdbe.h X11/extensions/multibuf.h)
+CPPFLAGS="$our_saved_CPPFLAGS"
+
+dnl Our Makefile.am files test the automake variable NO_X to determine
+dnl whether X should be supported.
+AM_CONDITIONAL(NO_X, test "x$no_x" = "xyes")
+
+my_includes="$my_includes -I../include -I.."
+AC_SUBST(my_includes)
+
+AM_CONDITIONAL(HAVE_INTERACTIVE_GRAPHICS, test 1==0)
+
+AC_OUTPUT(Makefile libezplot/Makefile src/Makefile libgraph/Makefile libkmath/Makefile Makefile libk/Makefile libir/Makefile libcio/Makefile man/Makefile cgi-bin/ctsim.cgi cgi-bin/Makefile html/ctsim.html html/Makefile include/Makefile getopt/Makefile src/sample-ctrec.sh)
diff --git a/getopt/Makefile b/getopt/Makefile
new file mode 100644 (file)
index 0000000..86d9f47
--- /dev/null
@@ -0,0 +1,318 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /opt/ctsim
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/ctsim
+pkglibdir = $(libdir)/ctsim
+pkgincludedir = $(includedir)/ctsim
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+INSTALL_STRIP_FLAG =
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = gawk
+CC = gcc
+MAKEINFO = makeinfo
+PACKAGE = ctsim
+RANLIB = ranlib
+VERSION = 0.5.0
+X_BASIC_LIBS = -lXext -lX11
+X_CFLAGS =  -I/usr/X11R6/include
+X_EXTRA_LIBS = 
+X_LIBS =  -L/usr/X11R6/lib
+X_PRE_LIBS =  -lSM -lICE
+X_TOOLKIT_LIBS = -lXt
+cgibindir = /opt/apache/cgi-bin
+cgibinurl = /cgi-bin
+cgiprograms = ctsim.cgi
+ctlamlibs = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+ctlibs = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+htmldata = ctsim.html
+htmldir = /opt/apache/htdocs/ctsim
+lamdir = /opt/lam
+lamprograms = ctrec-lam phm2sdf-lam phm2rs-lam
+my_includes =  -I../include -I..
+webdatadir = /opt/apache/htdocs/ctsim/webdata
+webdataurl = /ctsim/webdata
+webenabled = true
+
+noinst_LIBRARIES = libgetopt.a
+libgetopt_a_SOURCES = getopt.c getopt1.c 
+noinst_HEADERS = getopt.h
+INCLUDES =  -I../include -I..
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I..
+CPPFLAGS = 
+LDFLAGS =  -L/usr/lib -L/opt/lam/lib -L../libezplot -L../libgraph -L../libkmath -L../libk -L../libcio -L../libir
+LIBS = -lm 
+libgetopt_a_LIBADD = 
+libgetopt_a_OBJECTS =  getopt.o getopt1.o
+AR = ar
+CFLAGS = -g -O2 -Wall -I/usr/include -I/opt/lam/include
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+DEP_FILES =  .deps/getopt.P .deps/getopt1.P
+SOURCES = $(libgetopt_a_SOURCES)
+OBJECTS = $(libgetopt_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu getopt/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libgetopt.a: $(libgetopt_a_OBJECTS) $(libgetopt_a_DEPENDENCIES)
+       -rm -f libgetopt.a
+       $(AR) cru libgetopt.a $(libgetopt_a_OBJECTS) $(libgetopt_a_LIBADD)
+       $(RANLIB) libgetopt.a
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = getopt
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu getopt/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+       -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+       @echo '$(COMPILE) -c $<'; \
+       $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.c
+       @echo '$(LTCOMPILE) -c $<'; \
+       $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(HEADERS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
+               mostlyclean-tags mostlyclean-depend mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLIBRARIES clean-compile clean-tags clean-depend \
+               clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+               distclean-tags distclean-depend distclean-generic \
+               clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-depend maintainer-clean-generic \
+               distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir mostlyclean-depend \
+distclean-depend clean-depend maintainer-clean-depend info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/getopt/Makefile.am b/getopt/Makefile.am
new file mode 100644 (file)
index 0000000..1625b94
--- /dev/null
@@ -0,0 +1,4 @@
+noinst_LIBRARIES=libgetopt.a
+libgetopt_a_SOURCES=getopt.c getopt1.c 
+noinst_HEADERS=getopt.h
+INCLUDES=@my_includes@
diff --git a/getopt/Makefile.in b/getopt/Makefile.in
new file mode 100644 (file)
index 0000000..41441a4
--- /dev/null
@@ -0,0 +1,318 @@
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_FLAG =
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = @AWK@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+X_BASIC_LIBS = @X_BASIC_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_TOOLKIT_LIBS = @X_TOOLKIT_LIBS@
+cgibindir = @cgibindir@
+cgibinurl = @cgibinurl@
+cgiprograms = @cgiprograms@
+ctlamlibs = @ctlamlibs@
+ctlibs = @ctlibs@
+htmldata = @htmldata@
+htmldir = @htmldir@
+lamdir = @lamdir@
+lamprograms = @lamprograms@
+my_includes = @my_includes@
+webdatadir = @webdatadir@
+webdataurl = @webdataurl@
+webenabled = @webenabled@
+
+noinst_LIBRARIES = libgetopt.a
+libgetopt_a_SOURCES = getopt.c getopt1.c 
+noinst_HEADERS = getopt.h
+INCLUDES = @my_includes@
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libgetopt_a_LIBADD = 
+libgetopt_a_OBJECTS =  getopt.o getopt1.o
+AR = ar
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+DEP_FILES =  .deps/getopt.P .deps/getopt1.P
+SOURCES = $(libgetopt_a_SOURCES)
+OBJECTS = $(libgetopt_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu getopt/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libgetopt.a: $(libgetopt_a_OBJECTS) $(libgetopt_a_DEPENDENCIES)
+       -rm -f libgetopt.a
+       $(AR) cru libgetopt.a $(libgetopt_a_OBJECTS) $(libgetopt_a_LIBADD)
+       $(RANLIB) libgetopt.a
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = getopt
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu getopt/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+       -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+       @echo '$(COMPILE) -c $<'; \
+       $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.c
+       @echo '$(LTCOMPILE) -c $<'; \
+       $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(HEADERS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
+               mostlyclean-tags mostlyclean-depend mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLIBRARIES clean-compile clean-tags clean-depend \
+               clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+               distclean-tags distclean-depend distclean-generic \
+               clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-depend maintainer-clean-generic \
+               distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir mostlyclean-depend \
+distclean-depend clean-depend maintainer-clean-depend info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/getopt/getopt.c b/getopt/getopt.c
new file mode 100644 (file)
index 0000000..4744e43
--- /dev/null
@@ -0,0 +1,1055 @@
+/* Getopt for GNU.
+   NOTE: getopt is now part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to drepper@gnu.org
+   before changing it!
+
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
+       Free Software Foundation, Inc.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+\f
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+   Ditto for AIX 3.2 and <stdlib.h>.  */
+#ifndef _NO_PROTO
+# define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+# ifndef const
+#  define const
+# endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+# include <gnu-versions.h>
+# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#  define ELIDE_CODE
+# endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+# include <stdlib.h>
+# include <unistd.h>
+#endif /* GNU C library.  */
+
+#ifdef VMS
+# include <unixlib.h>
+# if HAVE_STRING_H - 0
+#  include <string.h>
+# endif
+#endif
+
+#ifndef _
+/* This is for other GNU distributions with internationalized messages.
+   When compiling libc, the _ macro is predefined.  */
+# ifdef HAVE_LIBINTL_H
+#  include <libintl.h>
+#  define _(msgid)     gettext (msgid)
+# else
+#  define _(msgid)     (msgid)
+# endif
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* 1003.2 says this must be 1 before any call.  */
+int optind = 1;
+
+/* Formerly, initialization of getopt depended on optind==0, which
+   causes problems with re-calling getopt as programs generally don't
+   know that. */
+
+int __getopt_initialized;
+
+/* The next char to be scanned in the option-element
+   in which the last option character we returned was found.
+   This allows us to pick up the scan where we left off.
+
+   If this is zero, or a null string, it means resume the scan
+   by advancing to the next ARGV-element.  */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+   If the caller did not specify anything,
+   the default is REQUIRE_ORDER if the environment variable
+   POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+   REQUIRE_ORDER means don't recognize them as options;
+   stop option processing when the first non-option is seen.
+   This is what Unix does.
+   This mode of operation is selected by either setting the environment
+   variable POSIXLY_CORRECT, or using `+' as the first character
+   of the list of option characters.
+
+   PERMUTE is the default.  We permute the contents of ARGV as we scan,
+   so that eventually all the non-options are at the end.  This allows options
+   to be given in any order, even with programs that were not written to
+   expect this.
+
+   RETURN_IN_ORDER is an option available to programs that were written
+   to expect options and other ARGV-elements in any order and that care about
+   the ordering of the two.  We describe each non-option ARGV-element
+   as if it were the argument of an option with character code 1.
+   Using `-' as the first character of the list of option characters
+   selects this mode of operation.
+
+   The special argument `--' forces an end of option-scanning regardless
+   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+   `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
+
+static enum
+{
+  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+/* Value of POSIXLY_CORRECT environment variable.  */
+static char *posixly_correct;
+\f
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+   because there are many ways it can cause trouble.
+   On some systems, it contains special magic macros that don't work
+   in GCC.  */
+# include <string.h>
+# define my_index      strchr
+#else
+
+# if HAVE_STRING_H
+#  include <string.h>
+# else
+#  include <strings.h>
+# endif
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+#ifndef getenv
+extern char *getenv ();
+#endif
+
+static char *
+my_index (str, chr)
+     const char *str;
+     int chr;
+{
+  while (*str)
+    {
+      if (*str == chr)
+       return (char *) str;
+      str++;
+    }
+  return 0;
+}
+
+/* If using GCC, we can safely declare strlen this way.
+   If not using GCC, it is ok not to declare it.  */
+#ifdef __GNUC__
+/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
+   That was relevant to code that was here before.  */
+# if (!defined __STDC__ || !__STDC__) && !defined strlen
+/* gcc with -traditional declares the built-in strlen to return int,
+   and has done so at least since version 2.4.5. -- rms.  */
+extern int strlen (const char *);
+# endif /* not __STDC__ */
+#endif /* __GNUC__ */
+
+#endif /* not __GNU_LIBRARY__ */
+\f
+/* Handle permutation of arguments.  */
+
+/* Describe the part of ARGV that contains non-options that have
+   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+   `last_nonopt' is the index after the last of them.  */
+
+static int first_nonopt;
+static int last_nonopt;
+
+#ifdef _LIBC
+/* Bash 2.0 gives us an environment variable containing flags
+   indicating ARGV elements that should not be considered arguments.  */
+
+/* Defined in getopt_init.c  */
+extern char *__getopt_nonoption_flags;
+
+static int nonoption_flags_max_len;
+static int nonoption_flags_len;
+
+static int original_argc;
+static char *const *original_argv;
+
+/* Make sure the environment variable bash 2.0 puts in the environment
+   is valid for the getopt call we must make sure that the ARGV passed
+   to getopt is that one passed to the process.  */
+static void
+__attribute__ ((unused))
+store_args_and_env (int argc, char *const *argv)
+{
+  /* XXX This is no good solution.  We should rather copy the args so
+     that we can compare them later.  But we must not use malloc(3).  */
+  original_argc = argc;
+  original_argv = argv;
+}
+# ifdef text_set_element
+text_set_element (__libc_subinit, store_args_and_env);
+# endif /* text_set_element */
+
+# define SWAP_FLAGS(ch1, ch2) \
+  if (nonoption_flags_len > 0)                                               \
+    {                                                                        \
+      char __tmp = __getopt_nonoption_flags[ch1];                            \
+      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];         \
+      __getopt_nonoption_flags[ch2] = __tmp;                                 \
+    }
+#else  /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+#if defined __STDC__ && __STDC__
+static void exchange (char **);
+#endif
+
+static void
+exchange (argv)
+     char **argv;
+{
+  int bottom = first_nonopt;
+  int middle = last_nonopt;
+  int top = optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+#ifdef _LIBC
+  /* First make sure the handling of the `__getopt_nonoption_flags'
+     string can work normally.  Our top argument must be in the range
+     of the string.  */
+  if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
+    {
+      /* We must extend the array.  The user plays games with us and
+        presents new arguments.  */
+      char *new_str = malloc (top + 1);
+      if (new_str == NULL)
+       nonoption_flags_len = nonoption_flags_max_len = 0;
+      else
+       {
+         memset (__mempcpy (new_str, __getopt_nonoption_flags,
+                            nonoption_flags_max_len),
+                 '\0', top + 1 - nonoption_flags_max_len);
+         nonoption_flags_max_len = top + 1;
+         __getopt_nonoption_flags = new_str;
+       }
+    }
+#endif
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+       {
+         /* Bottom segment is the short one.  */
+         int len = middle - bottom;
+         register int i;
+
+         /* Swap it with the top part of the top segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[top - (middle - bottom) + i];
+             argv[top - (middle - bottom) + i] = tem;
+             SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+           }
+         /* Exclude the moved bottom segment from further swapping.  */
+         top -= len;
+       }
+      else
+       {
+         /* Top segment is the short one.  */
+         int len = top - middle;
+         register int i;
+
+         /* Swap it with the bottom part of the bottom segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[middle + i];
+             argv[middle + i] = tem;
+             SWAP_FLAGS (bottom + i, middle + i);
+           }
+         /* Exclude the moved top segment from further swapping.  */
+         bottom += len;
+       }
+    }
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  first_nonopt += (optind - last_nonopt);
+  last_nonopt = optind;
+}
+
+/* Initialize the internal data when the first call is made.  */
+
+#if defined __STDC__ && __STDC__
+static const char *_getopt_initialize (int, char *const *, const char *);
+#endif
+static const char *
+_getopt_initialize (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  /* Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  first_nonopt = last_nonopt = optind;
+
+  nextchar = NULL;
+
+  posixly_correct = getenv ("POSIXLY_CORRECT");
+
+  /* Determine how to handle the ordering of options and nonoptions.  */
+
+  if (optstring[0] == '-')
+    {
+      ordering = RETURN_IN_ORDER;
+      ++optstring;
+    }
+  else if (optstring[0] == '+')
+    {
+      ordering = REQUIRE_ORDER;
+      ++optstring;
+    }
+  else if (posixly_correct != NULL)
+    ordering = REQUIRE_ORDER;
+  else
+    ordering = PERMUTE;
+
+#ifdef _LIBC
+  if (posixly_correct == NULL
+      && argc == original_argc && argv == original_argv)
+    {
+      if (nonoption_flags_max_len == 0)
+       {
+         if (__getopt_nonoption_flags == NULL
+             || __getopt_nonoption_flags[0] == '\0')
+           nonoption_flags_max_len = -1;
+         else
+           {
+             const char *orig_str = __getopt_nonoption_flags;
+             int len = nonoption_flags_max_len = strlen (orig_str);
+             if (nonoption_flags_max_len < argc)
+               nonoption_flags_max_len = argc;
+             __getopt_nonoption_flags =
+               (char *) malloc (nonoption_flags_max_len);
+             if (__getopt_nonoption_flags == NULL)
+               nonoption_flags_max_len = -1;
+             else
+               memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+                       '\0', nonoption_flags_max_len - len);
+           }
+       }
+      nonoption_flags_len = nonoption_flags_max_len;
+    }
+  else
+    nonoption_flags_len = 0;
+#endif
+
+  return optstring;
+}
+\f
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns -1.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+     const struct option *longopts;
+     int *longind;
+     int long_only;
+{
+  int print_errors = opterr;
+  if (optstring[0] == ':')
+    print_errors = 0;
+
+  optarg = NULL;
+
+  if (optind == 0 || !__getopt_initialized)
+    {
+      if (optind == 0)
+       optind = 1;     /* Don't scan ARGV[0], the program name.  */
+      optstring = _getopt_initialize (argc, argv, optstring);
+      __getopt_initialized = 1;
+    }
+
+  /* Test whether ARGV[optind] points to a non-option argument.
+     Either it does not have option syntax, or there is an environment flag
+     from the shell indicating it is not an option.  The later information
+     is only used when the used in the GNU libc.  */
+#ifdef _LIBC
+# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'              \
+                     || (optind < nonoption_flags_len                        \
+                         && __getopt_nonoption_flags[optind] == '1'))
+#else
+# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#endif
+
+  if (nextchar == NULL || *nextchar == '\0')
+    {
+      /* Advance to the next ARGV-element.  */
+
+      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+        moved back by the user (who may also have changed the arguments).  */
+      if (last_nonopt > optind)
+       last_nonopt = optind;
+      if (first_nonopt > optind)
+       first_nonopt = optind;
+
+      if (ordering == PERMUTE)
+       {
+         /* If we have just processed some options following some non-options,
+            exchange them so that the options come first.  */
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (last_nonopt != optind)
+           first_nonopt = optind;
+
+         /* Skip any additional non-options
+            and extend the range of non-options previously skipped.  */
+
+         while (optind < argc && NONOPTION_P)
+           optind++;
+         last_nonopt = optind;
+       }
+
+      /* The special ARGV-element `--' means premature end of options.
+        Skip it like a null option,
+        then exchange with previous non-options as if it were an option,
+        then skip everything else like a non-option.  */
+
+      if (optind != argc && !strcmp (argv[optind], "--"))
+       {
+         optind++;
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (first_nonopt == last_nonopt)
+           first_nonopt = optind;
+         last_nonopt = argc;
+
+         optind = argc;
+       }
+
+      /* If we have done all the ARGV-elements, stop the scan
+        and back over any non-options that we skipped and permuted.  */
+
+      if (optind == argc)
+       {
+         /* Set the next-arg-index to point at the non-options
+            that we previously skipped, so the caller will digest them.  */
+         if (first_nonopt != last_nonopt)
+           optind = first_nonopt;
+         return -1;
+       }
+
+      /* If we have come to a non-option and did not permute it,
+        either stop the scan or describe it to the caller and pass it by.  */
+
+      if (NONOPTION_P)
+       {
+         if (ordering == REQUIRE_ORDER)
+           return -1;
+         optarg = argv[optind++];
+         return 1;
+       }
+
+      /* We have found another option-ARGV-element.
+        Skip the initial punctuation.  */
+
+      nextchar = (argv[optind] + 1
+                 + (longopts != NULL && argv[optind][1] == '-'));
+    }
+
+  /* Decode the current option-ARGV-element.  */
+
+  /* Check whether the ARGV-element is a long option.
+
+     If long_only and the ARGV-element has the form "-f", where f is
+     a valid short option, don't consider it an abbreviated form of
+     a long option that starts with f.  Otherwise there would be no
+     way to give the -f short option.
+
+     On the other hand, if there's a long option "fubar" and
+     the ARGV-element is "-fu", do consider that an abbreviation of
+     the long option, just like "--fu", and not "-f" with arg "u".
+
+     This distinction seems to be the most useful approach.  */
+
+  if (longopts != NULL
+      && (argv[optind][1] == '-'
+         || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
+    {
+      char *nameend;
+      const struct option *p;
+      const struct option *pfound = NULL;
+      int exact = 0;
+      int ambig = 0;
+      int indfound = -1;
+      int option_index;
+
+      for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
+       /* Do nothing.  */ ;
+
+      /* Test all long options for either exact match
+        or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name; p++, option_index++)
+       if (!strncmp (p->name, nextchar, nameend - nextchar))
+         {
+           if ((unsigned int) (nameend - nextchar)
+               == (unsigned int) strlen (p->name))
+             {
+               /* Exact match found.  */
+               pfound = p;
+               indfound = option_index;
+               exact = 1;
+               break;
+             }
+           else if (pfound == NULL)
+             {
+               /* First nonexact match found.  */
+               pfound = p;
+               indfound = option_index;
+             }
+           else
+             /* Second or later nonexact match found.  */
+             ambig = 1;
+         }
+
+      if (ambig && !exact)
+       {
+         if (print_errors)
+           fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
+                    argv[0], argv[optind]);
+         nextchar += strlen (nextchar);
+         optind++;
+         optopt = 0;
+         return '?';
+       }
+
+      if (pfound != NULL)
+       {
+         option_index = indfound;
+         optind++;
+         if (*nameend)
+           {
+             /* Don't test has_arg with >, because some C compilers don't
+                allow it to be used on enums.  */
+             if (pfound->has_arg)
+               optarg = nameend + 1;
+             else
+               {
+                 if (print_errors)
+                   {
+                     if (argv[optind - 1][1] == '-')
+                       /* --option */
+                       fprintf (stderr,
+                                _("%s: option `--%s' doesn't allow an argument\n"),
+                                argv[0], pfound->name);
+                     else
+                       /* +option or -option */
+                       fprintf (stderr,
+                                _("%s: option `%c%s' doesn't allow an argument\n"),
+                                argv[0], argv[optind - 1][0], pfound->name);
+                   }
+
+                 nextchar += strlen (nextchar);
+
+                 optopt = pfound->val;
+                 return '?';
+               }
+           }
+         else if (pfound->has_arg == 1)
+           {
+             if (optind < argc)
+               optarg = argv[optind++];
+             else
+               {
+                 if (print_errors)
+                   fprintf (stderr,
+                          _("%s: option `%s' requires an argument\n"),
+                          argv[0], argv[optind - 1]);
+                 nextchar += strlen (nextchar);
+                 optopt = pfound->val;
+                 return optstring[0] == ':' ? ':' : '?';
+               }
+           }
+         nextchar += strlen (nextchar);
+         if (longind != NULL)
+           *longind = option_index;
+         if (pfound->flag)
+           {
+             *(pfound->flag) = pfound->val;
+             return 0;
+           }
+         return pfound->val;
+       }
+
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+        or the option starts with '--' or is not a valid short
+        option, then it's an error.
+        Otherwise interpret it as a short option.  */
+      if (!long_only || argv[optind][1] == '-'
+         || my_index (optstring, *nextchar) == NULL)
+       {
+         if (print_errors)
+           {
+             if (argv[optind][1] == '-')
+               /* --option */
+               fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
+                        argv[0], nextchar);
+             else
+               /* +option or -option */
+               fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
+                        argv[0], argv[optind][0], nextchar);
+           }
+         nextchar = (char *) "";
+         optind++;
+         optopt = 0;
+         return '?';
+       }
+    }
+
+  /* Look at and handle the next short option-character.  */
+
+  {
+    char c = *nextchar++;
+    char *temp = my_index (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*nextchar == '\0')
+      ++optind;
+
+    if (temp == NULL || c == ':')
+      {
+       if (print_errors)
+         {
+           if (posixly_correct)
+             /* 1003.2 specifies the format of this message.  */
+             fprintf (stderr, _("%s: illegal option -- %c\n"),
+                      argv[0], c);
+           else
+             fprintf (stderr, _("%s: invalid option -- %c\n"),
+                      argv[0], c);
+         }
+       optopt = c;
+       return '?';
+      }
+    /* Convenience. Treat POSIX -W foo same as long option --foo */
+    if (temp[0] == 'W' && temp[1] == ';')
+      {
+       char *nameend;
+       const struct option *p;
+       const struct option *pfound = NULL;
+       int exact = 0;
+       int ambig = 0;
+       int indfound = 0;
+       int option_index;
+
+       /* This is an option that requires an argument.  */
+       if (*nextchar != '\0')
+         {
+           optarg = nextchar;
+           /* If we end this ARGV-element by taking the rest as an arg,
+              we must advance to the next element now.  */
+           optind++;
+         }
+       else if (optind == argc)
+         {
+           if (print_errors)
+             {
+               /* 1003.2 specifies the format of this message.  */
+               fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+                        argv[0], c);
+             }
+           optopt = c;
+           if (optstring[0] == ':')
+             c = ':';
+           else
+             c = '?';
+           return c;
+         }
+       else
+         /* We already incremented `optind' once;
+            increment it again when taking next ARGV-elt as argument.  */
+         optarg = argv[optind++];
+
+       /* optarg is now the argument, see if it's in the
+          table of longopts.  */
+
+       for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
+         /* Do nothing.  */ ;
+
+       /* Test all long options for either exact match
+          or abbreviated matches.  */
+       for (p = longopts, option_index = 0; p->name; p++, option_index++)
+         if (!strncmp (p->name, nextchar, nameend - nextchar))
+           {
+             if ((unsigned int) (nameend - nextchar) == strlen (p->name))
+               {
+                 /* Exact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+                 exact = 1;
+                 break;
+               }
+             else if (pfound == NULL)
+               {
+                 /* First nonexact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+               }
+             else
+               /* Second or later nonexact match found.  */
+               ambig = 1;
+           }
+       if (ambig && !exact)
+         {
+           if (print_errors)
+             fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
+                      argv[0], argv[optind]);
+           nextchar += strlen (nextchar);
+           optind++;
+           return '?';
+         }
+       if (pfound != NULL)
+         {
+           option_index = indfound;
+           if (*nameend)
+             {
+               /* Don't test has_arg with >, because some C compilers don't
+                  allow it to be used on enums.  */
+               if (pfound->has_arg)
+                 optarg = nameend + 1;
+               else
+                 {
+                   if (print_errors)
+                     fprintf (stderr, _("\
+%s: option `-W %s' doesn't allow an argument\n"),
+                              argv[0], pfound->name);
+
+                   nextchar += strlen (nextchar);
+                   return '?';
+                 }
+             }
+           else if (pfound->has_arg == 1)
+             {
+               if (optind < argc)
+                 optarg = argv[optind++];
+               else
+                 {
+                   if (print_errors)
+                     fprintf (stderr,
+                              _("%s: option `%s' requires an argument\n"),
+                              argv[0], argv[optind - 1]);
+                   nextchar += strlen (nextchar);
+                   return optstring[0] == ':' ? ':' : '?';
+                 }
+             }
+           nextchar += strlen (nextchar);
+           if (longind != NULL)
+             *longind = option_index;
+           if (pfound->flag)
+             {
+               *(pfound->flag) = pfound->val;
+               return 0;
+             }
+           return pfound->val;
+         }
+         nextchar = NULL;
+         return 'W';   /* Let the application handle it.   */
+      }
+    if (temp[1] == ':')
+      {
+       if (temp[2] == ':')
+         {
+           /* This is an option that accepts an argument optionally.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               optind++;
+             }
+           else
+             optarg = NULL;
+           nextchar = NULL;
+         }
+       else
+         {
+           /* This is an option that requires an argument.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               /* If we end this ARGV-element by taking the rest as an arg,
+                  we must advance to the next element now.  */
+               optind++;
+             }
+           else if (optind == argc)
+             {
+               if (print_errors)
+                 {
+                   /* 1003.2 specifies the format of this message.  */
+                   fprintf (stderr,
+                            _("%s: option requires an argument -- %c\n"),
+                            argv[0], c);
+                 }
+               optopt = c;
+               if (optstring[0] == ':')
+                 c = ':';
+               else
+                 c = '?';
+             }
+           else
+             /* We already incremented `optind' once;
+                increment it again when taking next ARGV-elt as argument.  */
+             optarg = argv[optind++];
+           nextchar = NULL;
+         }
+      }
+    return c;
+  }
+}
+
+int
+getopt (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  return _getopt_internal (argc, argv, optstring,
+                          (const struct option *) 0,
+                          (int *) 0,
+                          0);
+}
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/getopt/getopt.h b/getopt/getopt.h
new file mode 100644 (file)
index 0000000..b0147e9
--- /dev/null
@@ -0,0 +1,169 @@
+/* Declarations for getopt.
+   Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _GETOPT_H
+
+#ifndef __need_getopt
+# define _GETOPT_H 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+# if defined __STDC__ && __STDC__
+  const char *name;
+# else
+  char *name;
+# endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+# define no_argument           0
+# define required_argument     1
+# define optional_argument     2
+#endif /* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+   arguments in ARGV (ARGC of them, minus the program name) for
+   options given in OPTS.
+
+   Return the option character from OPTS just read.  Return -1 when
+   there are no more options.  For unrecognized options, or options
+   missing arguments, `optopt' is set to the option letter, and '?' is
+   returned.
+
+   The OPTS string is a list of characters which are recognized option
+   letters, optionally followed by colons, specifying that that letter
+   takes an argument, to be placed in `optarg'.
+
+   If a letter in OPTS is followed by two colons, its argument is
+   optional.  This behavior is specific to the GNU `getopt'.
+
+   The argument `--' causes premature termination of argument
+   scanning, explicitly telling `getopt' that there are no more
+   options.
+
+   If OPTS begins with `--', then non-option arguments are treated as
+   arguments to the option '\0'.  This behavior is specific to the GNU
+   `getopt'.  */
+
+#if defined __STDC__ && __STDC__
+# ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int __argc, char *const *__argv, const char *__shortopts);
+# else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+# endif /* __GNU_LIBRARY__ */
+
+# ifndef __need_getopt
+extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts,
+                       const struct option *__longopts, int *__longind);
+extern int getopt_long_only (int __argc, char *const *__argv,
+                            const char *__shortopts,
+                            const struct option *__longopts, int *__longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int __argc, char *const *__argv,
+                            const char *__shortopts,
+                            const struct option *__longopts, int *__longind,
+                            int __long_only);
+# endif
+#else /* not __STDC__ */
+extern int getopt ();
+# ifndef __need_getopt
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+# endif
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations.  */
+#undef __need_getopt
+
+#endif /* getopt.h */
diff --git a/getopt/getopt1.c b/getopt/getopt1.c
new file mode 100644 (file)
index 0000000..3d264f2
--- /dev/null
@@ -0,0 +1,188 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+   Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
+     Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+\f
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "getopt.h"
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+#include <gnu-versions.h>
+#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#define ELIDE_CODE
+#endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef        NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+      int option_index = 0;
+      static struct option long_options[] =
+      {
+       {"add", 1, 0, 0},
+       {"append", 0, 0, 0},
+       {"delete", 1, 0, 0},
+       {"verbose", 0, 0, 0},
+       {"create", 0, 0, 0},
+       {"file", 1, 0, 0},
+       {0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "abc:d:0123456789",
+                      long_options, &option_index);
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case 0:
+         printf ("option %s", long_options[option_index].name);
+         if (optarg)
+           printf (" with arg %s", optarg);
+         printf ("\n");
+         break;
+
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case 'd':
+         printf ("option d with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/html/Makefile b/html/Makefile
new file mode 100644 (file)
index 0000000..c6bb600
--- /dev/null
@@ -0,0 +1,218 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /opt/ctsim
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/ctsim
+pkglibdir = $(libdir)/ctsim
+pkgincludedir = $(includedir)/ctsim
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+INSTALL_STRIP_FLAG =
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = gawk
+CC = gcc
+MAKEINFO = makeinfo
+PACKAGE = ctsim
+RANLIB = ranlib
+VERSION = 0.5.0
+X_BASIC_LIBS = -lXext -lX11
+X_CFLAGS =  -I/usr/X11R6/include
+X_EXTRA_LIBS = 
+X_LIBS =  -L/usr/X11R6/lib
+X_PRE_LIBS =  -lSM -lICE
+X_TOOLKIT_LIBS = -lXt
+cgibindir = /opt/apache/cgi-bin
+cgibinurl = /cgi-bin
+cgiprograms = ctsim.cgi
+ctlamlibs = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+ctlibs = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+htmldata = ctsim.html
+htmldir = /opt/apache/htdocs/ctsim
+lamdir = /opt/lam
+lamprograms = ctrec-lam phm2sdf-lam phm2rs-lam
+my_includes =  -I../include -I..
+webdatadir = /opt/apache/htdocs/ctsim/webdata
+webdataurl = /ctsim/webdata
+webenabled = true
+
+html_DATA = ctsim.html
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =  ctsim.html
+DATA =  $(html_DATA)
+
+DIST_COMMON =  Makefile.am Makefile.in ctsim.html.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu html/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+ctsim.html: $(top_builddir)/config.status ctsim.html.in
+       cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+install-htmlDATA: $(html_DATA)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(htmldir)
+       @list='$(html_DATA)'; for p in $$list; do \
+         if test -f $(srcdir)/$$p; then \
+           echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(htmldir)/$$p"; \
+           $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(htmldir)/$$p; \
+         else if test -f $$p; then \
+           echo " $(INSTALL_DATA) $$p $(DESTDIR)$(htmldir)/$$p"; \
+           $(INSTALL_DATA) $$p $(DESTDIR)$(htmldir)/$$p; \
+         fi; fi; \
+       done
+
+uninstall-htmlDATA:
+       @$(NORMAL_UNINSTALL)
+       list='$(html_DATA)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(htmldir)/$$p; \
+       done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = html
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu html/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-htmlDATA
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-htmlDATA
+uninstall: uninstall-am
+all-am: Makefile $(DATA)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(htmldir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: uninstall-htmlDATA install-htmlDATA tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/html/Makefile.am b/html/Makefile.am
new file mode 100644 (file)
index 0000000..ec027a5
--- /dev/null
@@ -0,0 +1,3 @@
+if USE_HTML
+html_DATA=@htmldata@
+endif
diff --git a/html/Makefile.in b/html/Makefile.in
new file mode 100644 (file)
index 0000000..c09d80d
--- /dev/null
@@ -0,0 +1,218 @@
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_FLAG =
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = @AWK@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+X_BASIC_LIBS = @X_BASIC_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_TOOLKIT_LIBS = @X_TOOLKIT_LIBS@
+cgibindir = @cgibindir@
+cgibinurl = @cgibinurl@
+cgiprograms = @cgiprograms@
+ctlamlibs = @ctlamlibs@
+ctlibs = @ctlibs@
+htmldata = @htmldata@
+htmldir = @htmldir@
+lamdir = @lamdir@
+lamprograms = @lamprograms@
+my_includes = @my_includes@
+webdatadir = @webdatadir@
+webdataurl = @webdataurl@
+webenabled = @webenabled@
+
+@USE_HTML_TRUE@html_DATA = @htmldata@
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =  ctsim.html
+DATA =  $(html_DATA)
+
+DIST_COMMON =  Makefile.am Makefile.in ctsim.html.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu html/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+ctsim.html: $(top_builddir)/config.status ctsim.html.in
+       cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+install-htmlDATA: $(html_DATA)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(htmldir)
+       @list='$(html_DATA)'; for p in $$list; do \
+         if test -f $(srcdir)/$$p; then \
+           echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(htmldir)/$$p"; \
+           $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(htmldir)/$$p; \
+         else if test -f $$p; then \
+           echo " $(INSTALL_DATA) $$p $(DESTDIR)$(htmldir)/$$p"; \
+           $(INSTALL_DATA) $$p $(DESTDIR)$(htmldir)/$$p; \
+         fi; fi; \
+       done
+
+uninstall-htmlDATA:
+       @$(NORMAL_UNINSTALL)
+       list='$(html_DATA)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(htmldir)/$$p; \
+       done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = html
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu html/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-htmlDATA
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-htmlDATA
+uninstall: uninstall-am
+all-am: Makefile $(DATA)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(htmldir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: uninstall-htmlDATA install-htmlDATA tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/html/cstim.html b/html/cstim.html
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/html/ctsim.html b/html/ctsim.html
new file mode 100644 (file)
index 0000000..e013614
--- /dev/null
@@ -0,0 +1,77 @@
+<HTML>
+<HEAD>
+<TITLE>Perform CT Simulation</TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<H1>Perform CT Simulation</H1>
+<FORM action="/cgi-bin/ctsim.cgi" method="POST">
+<table border=1 cellpadding="5" bgcolor="#FFFFFF">
+<tr><td valign="top">
+<h3>Select Image and Size</h3>
+Phantom Name:<br>
+<INPUT type="radio" name="Phantom_Name" value="herman" checked>G.T. Herman<br>
+<INPUT type="radio" name="Phantom_Name" value="rowland">Rowland<br>
+<INPUT type="radio" name="Phantom_Name" value="browland">Bordered Rowland<br>
+<INPUT type="radio" name="Phantom_Name" value="unitpulse">Unit Pulse<br>
+<p>
+Nx: <input type="text" name="Phantom_Nx" size="4" value="256"><br>
+Ny: <input type="text" name="Phantom_Ny" size="4" value="256"><br>
+<p>
+Number of Samples<br>per pixel: <input type="text" name="Phantom_NSample" size="2" value="1"><br>
+<p>
+Display Window:<br>
+Minium: <input type="text" name="Disp_Min" size=5 value="auto"><br>
+Maximum: <input type="text" name="Disp_Max" size=5 value="auto"><br>
+<p> 
+MPI Supercomputing:<br>
+<INPUT type="radio" name="MPI" value="yes">Yes (Multiple CPUs)<br>
+<INPUT type="radio" name="MPI" value="no" checked>No (Single CPU)<br>
+</td><td valign="top">
+<h3>Simulate X-Ray acquistion</h3>
+Number of detectors: <input type="text" name="RS_NDet" size="4" value="367"><p>
+Number of Rotations: <input type="text" name="RS_NRot" size="4" value="320"><p>
+Number of Rays<br>(samples) per detector: <input type="text" name="RS_NRay" size="2" value="1"><p>
+Rotation Angle<br>as a multiple of PI: <input type="text" name="RS_RotAngle" size="3" value="1.0"><br>
+</td><td valign="top">
+<H3>Image Reconstruction</H3>
+Interpolation:<br>
+<input type="radio" name="IR_Interp" value="linear" checked>Linear<br>
+<input type="radio" name="IR_Interp" value="nearest">Nearest Neighbor<br>
+<input type="radio" name="IR_Interp" value="bspline">B-Spline<br>
+<p>
+Filter for Backprojection:<br>
+<input type="radio" name="IR_Filter" value="abs_bandlimit" checked>Abs*Bandlimit<br>
+<input type="radio" name="IR_Filter" value="abs_cos">Abs*Cosine<br>
+<input type="radio" name="IR_Filter" value="abs_hamming">Abs*Hamming<br>
+<input type="radio" name="IR_Filter" value="shepp">Shepp-Logan<br>
+<input type="radio" name="IR_Filter" value="bandlimit">Bandlimit<br>
+<input type="radio" name="IR_Filter" value="hamming">Hamming<br>
+<input type="radio" name="IR_Filter" value="cos">Cosine<br>
+<input type="radio" name="IR_Filter" value="sinc">Sinc<br>
+<input type="radio" name="IR_Filter" value="triangle">Triangle<p>
+Hamming alpha factor (0.0-1.0): <input type="text" name="IR_Filter_Param" size="3" value="1.0"><p>
+Backprojection Method:<br>
+<input type="radio" name="IR_Backproj" value="trig">Trig<br>
+<input type="radio" name="IR_Backproj" value="table">Trig Table<br>
+<input type="radio" name="IR_Backproj" value="diff">Difference<br>
+<input type="radio" name="IR_Backproj" value="diff2" checked>Difference Optimized<br>
+<input type="radio" name="IR_Backproj" value="idiff2">Difference Optimized (integer math)<br>
+</td></tr></table>
+<p>
+<input type="submit" value="Simulate"><input type="reset" value="clear fields">
+</form>
+</BODY>
+</HTML>
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/html/ctsim.html.in b/html/ctsim.html.in
new file mode 100644 (file)
index 0000000..17c3828
--- /dev/null
@@ -0,0 +1,77 @@
+<HTML>
+<HEAD>
+<TITLE>Perform CT Simulation</TITLE>
+</HEAD>
+<BODY BGCOLOR="#FFFFFF">
+<H1>Perform CT Simulation</H1>
+<FORM action="@cgibinurl@/ctsim.cgi" method="POST">
+<table border=1 cellpadding="5" bgcolor="#FFFFFF">
+<tr><td valign="top">
+<h3>Select Image and Size</h3>
+Phantom Name:<br>
+<INPUT type="radio" name="Phantom_Name" value="herman" checked>G.T. Herman<br>
+<INPUT type="radio" name="Phantom_Name" value="rowland">Rowland<br>
+<INPUT type="radio" name="Phantom_Name" value="browland">Bordered Rowland<br>
+<INPUT type="radio" name="Phantom_Name" value="unitpulse">Unit Pulse<br>
+<p>
+Nx: <input type="text" name="Phantom_Nx" size="4" value="256"><br>
+Ny: <input type="text" name="Phantom_Ny" size="4" value="256"><br>
+<p>
+Number of Samples<br>per pixel: <input type="text" name="Phantom_NSample" size="2" value="1"><br>
+<p>
+Display Window:<br>
+Minium: <input type="text" name="Disp_Min" size=5 value="auto"><br>
+Maximum: <input type="text" name="Disp_Max" size=5 value="auto"><br>
+<p> 
+MPI Supercomputing:<br>
+<INPUT type="radio" name="MPI" value="yes">Yes (Multiple CPUs)<br>
+<INPUT type="radio" name="MPI" value="no" checked>No (Single CPU)<br>
+</td><td valign="top">
+<h3>Simulate X-Ray acquistion</h3>
+Number of detectors: <input type="text" name="RS_NDet" size="4" value="367"><p>
+Number of Rotations: <input type="text" name="RS_NRot" size="4" value="320"><p>
+Number of Rays<br>(samples) per detector: <input type="text" name="RS_NRay" size="2" value="1"><p>
+Rotation Angle<br>as a multiple of PI: <input type="text" name="RS_RotAngle" size="3" value="1.0"><br>
+</td><td valign="top">
+<H3>Image Reconstruction</H3>
+Interpolation:<br>
+<input type="radio" name="IR_Interp" value="linear" checked>Linear<br>
+<input type="radio" name="IR_Interp" value="nearest">Nearest Neighbor<br>
+<input type="radio" name="IR_Interp" value="bspline">B-Spline<br>
+<p>
+Filter for Backprojection:<br>
+<input type="radio" name="IR_Filter" value="abs_bandlimit" checked>Abs*Bandlimit<br>
+<input type="radio" name="IR_Filter" value="abs_cos">Abs*Cosine<br>
+<input type="radio" name="IR_Filter" value="abs_hamming">Abs*Hamming<br>
+<input type="radio" name="IR_Filter" value="shepp">Shepp-Logan<br>
+<input type="radio" name="IR_Filter" value="bandlimit">Bandlimit<br>
+<input type="radio" name="IR_Filter" value="hamming">Hamming<br>
+<input type="radio" name="IR_Filter" value="cos">Cosine<br>
+<input type="radio" name="IR_Filter" value="sinc">Sinc<br>
+<input type="radio" name="IR_Filter" value="triangle">Triangle<p>
+Hamming alpha factor (0.0-1.0): <input type="text" name="IR_Filter_Param" size="3" value="1.0"><p>
+Backprojection Method:<br>
+<input type="radio" name="IR_Backproj" value="trig">Trig<br>
+<input type="radio" name="IR_Backproj" value="table">Trig Table<br>
+<input type="radio" name="IR_Backproj" value="diff">Difference<br>
+<input type="radio" name="IR_Backproj" value="diff2" checked>Difference Optimized<br>
+<input type="radio" name="IR_Backproj" value="idiff2">Difference Optimized (integer math)<br>
+</td></tr></table>
+<p>
+<input type="submit" value="Simulate"><input type="reset" value="clear fields">
+</form>
+</BODY>
+</HTML>
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/include/Makefile b/include/Makefile
new file mode 100644 (file)
index 0000000..cc27ee4
--- /dev/null
@@ -0,0 +1,224 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /opt/ctsim
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/ctsim
+pkglibdir = $(libdir)/ctsim
+pkgincludedir = $(includedir)/ctsim
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+INSTALL_STRIP_FLAG =
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = gawk
+CC = gcc
+MAKEINFO = makeinfo
+PACKAGE = ctsim
+RANLIB = ranlib
+VERSION = 0.5.0
+X_BASIC_LIBS = -lXext -lX11
+X_CFLAGS =  -I/usr/X11R6/include
+X_EXTRA_LIBS = 
+X_LIBS =  -L/usr/X11R6/lib
+X_PRE_LIBS =  -lSM -lICE
+X_TOOLKIT_LIBS = -lXt
+cgibindir = /opt/apache/cgi-bin
+cgibinurl = /cgi-bin
+cgiprograms = ctsim.cgi
+ctlamlibs = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+ctlibs = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+htmldata = ctsim.html
+htmldir = /opt/apache/htdocs/ctsim
+lamdir = /opt/lam
+lamprograms = ctrec-lam phm2sdf-lam phm2rs-lam
+my_includes =  -I../include -I..
+webdatadir = /opt/apache/htdocs/ctsim/webdata
+webdataurl = /ctsim/webdata
+webenabled = true
+
+noinst_HEADERS = ascii.h cio.h ct.h ezplot.h getargs.h ir.h keyboard.h kmath.h kstddef.h pol.h sdf.h sgp.h
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = include
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu include/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(HEADERS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-tags maintainer-clean-generic \
+               distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags mostlyclean-tags distclean-tags clean-tags \
+maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/include/Makefile.am b/include/Makefile.am
new file mode 100644 (file)
index 0000000..60b9d32
--- /dev/null
@@ -0,0 +1 @@
+noinst_HEADERS=ascii.h cio.h ct.h ezplot.h getargs.h ir.h keyboard.h kmath.h kstddef.h pol.h sdf.h sgp.h
diff --git a/include/Makefile.in b/include/Makefile.in
new file mode 100644 (file)
index 0000000..b96f840
--- /dev/null
@@ -0,0 +1,224 @@
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_FLAG =
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = @AWK@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+X_BASIC_LIBS = @X_BASIC_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_TOOLKIT_LIBS = @X_TOOLKIT_LIBS@
+cgibindir = @cgibindir@
+cgibinurl = @cgibinurl@
+cgiprograms = @cgiprograms@
+ctlamlibs = @ctlamlibs@
+ctlibs = @ctlibs@
+htmldata = @htmldata@
+htmldir = @htmldir@
+lamdir = @lamdir@
+lamprograms = @lamprograms@
+my_includes = @my_includes@
+webdatadir = @webdatadir@
+webdataurl = @webdataurl@
+webenabled = @webenabled@
+
+noinst_HEADERS = ascii.h cio.h ct.h ezplot.h getargs.h ir.h keyboard.h kmath.h kstddef.h pol.h sdf.h sgp.h
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = include
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu include/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(HEADERS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-tags maintainer-clean-generic \
+               distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags mostlyclean-tags distclean-tags clean-tags \
+maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/include/ascii.h b/include/ascii.h
new file mode 100644 (file)
index 0000000..44c6b55
--- /dev/null
@@ -0,0 +1,58 @@
+/******************************************************************************\r
+ *\r
+ * FILE IDENTIFICATION\r
+ *\r
+ *     File Name:      ASCII.H\r
+ *     Author:         Kevin Rosenberg\r
+ *     Purpose:        Header file with definitions for ASCII characrers\r
+ *      Date Started:  Jan 84\r
+ *\r
+ * DESCRIPTION\r
+ *     Header file contains values for ASCII characters\r
+ *\r
+ * MODIFICATION LOG\r
+ *\r
+ *****************************************************************************/\r
+\r
+#ifndef ASCII_H\r
+#define ASCII_H\r
+\r
+#define BACKSPACE  8\r
+#define LF     0x0A\r
+#define CR     0x0D\r
+#define BELL   0x07\r
+\r
+#define SQUOTE    '\''\r
+#define DQUOTE    '\"'\r
+#define BSLASH    '\\'\r
+#define BACKSLASH '\\'\r
+#define SHARP     '#'\r
+#define SLASH     '/'\r
+#define ASTERICK  '*'\r
+#define COLON    ':'\r
+#define LBRACE    '{'\r
+#define RBRACE    '}'\r
+#define LPAREN   '('\r
+#define RPAREN    ')'\r
+#define LBRACK   '['\r
+#define RBRACK   ']'\r
+#define LANBRACK  '<'\r
+#define RANBRACK  '>'\r
+#define SEMICOL   ';'\r
+#define UNDERLIN  '_'\r
+#define COMMA    ','\r
+#define CARET    '^'\r
+#define TILDE    '~'\r
+#define ATSIGN   '@'\r
+#define AMPERSAND  '&'\r
+#define EXCLAM   '!'\r
+#define DOLLAR   '$'\r
+#define PERCENT   '%'\r
+#define PLUS     '+'\r
+#define HYPHEN   '-'\r
+#define EQUALS   '='\r
+#define QUESTION  '?'\r
+#define PERIOD   '.'\r
+#define VERTBAR   '|'\r
+\r
+#endif /* #ifndef ASCII_H */\r
diff --git a/include/cio.h b/include/cio.h
new file mode 100644 (file)
index 0000000..0bfd15d
--- /dev/null
@@ -0,0 +1,194 @@
+#ifndef __CIO_H
+#define __CIO_H
+
+struct crtv_st {
+    int init;          /* True if initialized */
+    int bios_mode;     /* Current BIOS crt mode */
+    int text_attr;     /* Current text attribute */
+    int act_page;      /* Active page */
+    int tcols, trows;  /* Maximum text coords */
+    int xmax, ymax;    /* Maximum x, y for both text & graphic modes */
+    int cx, cy;                /* Current x, y position */
+}; 
+
+#ifndef DEFINE_CRTV
+   extern struct crtv_st crtv;
+#endif
+
+/*----------------------------------------------------------------------*/
+
+#define CRT_ROWS  25
+#define CRT_COLS  80
+
+/* crt modes */
+
+#define GM_TEXT40    1     /* color */
+#define GM_TEXT80    3     /* color */
+#define GM_320x200   4     /* color */
+#define GM_640x200   6
+#define GM_MONOTEXT  7
+#define GM_E320x200 13
+#define GM_E640x200 14
+#define GM_MONOGRF  15
+#define GM_ENHANCED 16
+
+#define GM_640x480x16  0x12
+#define GM_640x480x256 0x2E
+#define GM_1024x768x16 0x37
+#define GM_1024x768x256        0x38
+
+
+
+#define GM_TEXT             -1
+#define GM_HIGHRES   -2
+#define GM_MEDRES    -3
+
+#define CRT_NONE    -1
+#define CRT_MONO     0
+#define CRT_COLOR    1
+#define CRT_ENHANCED 2
+
+/*----------------------------------------------------------------------*/
+
+#define  ATTR_NORMAL     7
+#define  ATTR_REVERSE   14
+#define  ATTR_HIGHLIGHT 15
+
+#define C_BLACK             0                  /* color codes */
+#define C_BLUE       1
+#define C_GREEN             2
+#define C_CYAN       3
+#define C_RED       4
+#define C_MAGENTA    5
+#define C_BROWN      6
+#define C_WHITE      7
+#define C_GREY       8
+#define C_LTBLUE     9
+#define C_LTGREEN   10
+#define C_LTCYAN    11
+#define C_LTRED     12
+#define C_LTMAGENTA 13
+#define C_YELLOW    14
+#define C_LTWHITE   15
+
+/*----------------------------------------------------------------------*/
+
+/* screen character codes */
+
+#define SC_BKSP                  8
+#define SC_TAB           9
+#define SC_BLANK       ' '
+
+#define SC_TOP_LEFT    218
+#define SC_TOP_RIGHT   191
+#define SC_BOTT_LEFT   192
+#define SC_BOTT_RIGHT  217
+#define SC_HORIZ       196
+#define SC_VERTICAL    179
+
+
+#define WAITKEY()      {cio_kb_clr(); while (cio_kb_read() == 0);}
+
+/* biosf.c */
+void b_setcpos(int col, int row, int page);
+void crt_wrt_cca(int c, int attr, int count, int page);
+void crt_wrt_ca(int c, int attr, int page);
+void crt_wrt_stra(const char *str, int count, int attr, int row, int col, int page);
+/* c_restor.c */
+void crt_restore(const char *fname);
+/* c_save.c */
+int crt_save(const char *fname);
+/* center.c */
+int crt_center_line(const char *str);
+/* clreol.c */
+void crt_clreol(void);
+/* clrline.c */
+void crt_clrline(unsigned int line);
+/* clrscrn.c */
+void crt_clrscrn(void);
+/* cpos.c */
+void crt_tab(unsigned int n);
+void crt_save_cpos(void);
+void crt_restore_cpos(void);
+/* cprintf.c */
+void cio_printf(const char *cs, ...);
+void cio_aprintf(const int attr, const char *cs, ...);
+/* cputs.c */
+void cputs(const char *s);
+/* crt_data.c */
+/* ctype.c */
+void crt_set_ctype(int start, int end);
+void crt_cursor_off(void);
+void crt_cursor_on(void);
+/* dispcard.c */
+int crt_disp_card(void);
+/* fill_eol.c */
+void crt_fill_eol(int c, int attr);
+/* frame.c */
+int crt_frame(int ulcol, int ulrow, int lrcol, int lrrow, int attr, int nlines);
+/* get_ca.c */
+void crt_get_ca(int *c, int *attr);
+/* getmon.c */
+int crt_get_mon(void);
+void crt_set_mon(int mon);
+/* getstate.c */
+void crt_get_state(void);
+/* mode.c */
+void crt_set_mode(int mode, int cls);
+int crt_get_mode(void);
+int crt_bios_code(int mode);
+/* put_ca.c */
+void crt_set_text_clr(int fclr, int bclr);
+int crt_get_texta(void);
+void crt_set_texta(int a);
+int crt_blank_attr(void);
+void crt_put_ca(int c, int attr);
+void crt_put_c(int c);
+void crt_put_cc(int c, int count);
+void crt_put_cca(int c, int attr, int count);
+void crt_put_str(const char *str);
+void crt_put_stra(const char *str, int attr);
+void crt_inc_col(int count);
+void crt_dec_col(int count);
+void crt_dec_row(int count);
+/* scrollup.c */
+void crt_scrollup(int xmin, int ymin, int xmax, int ymax, int nline, int attr);
+/* setcpos.c */
+void crt_set_cpos(int col, int row);
+void crt_get_cpos(int *col, int *row);
+/* setpage.c */
+void crt_set_page(int page);
+/* setpal.c */
+void crt_set_palette(int id, int color);
+void crt_set_color_table(char *color_table);
+void crt_set_border(int bcolor);
+int crt_calc_color(double nr, double ng, double nb);
+int crt_icalc_color(int r, int g, int b);
+
+/* beep.c */
+void cio_beep(void);
+/* kb_chk.c */
+int cio_kb_chk(void);
+/* kb_clr.c */
+void cio_kb_clr(void);
+/* kb_getc.c */
+unsigned int cio_kb_getc(void);
+void cio_kb_ungetc(unsigned int c);
+/* kb_gets.c */
+char *cio_kb_gets(char *str, int maxlen);
+/* kb_read.c */
+unsigned int cio_kb_read(void);
+void cio_kb_unread(unsigned int c);
+/* kb_waitc.c */
+unsigned int cio_kb_waitc(const char *astr, const char *estr, int beep_on_error);
+/* speaker.c */
+void cio_spkr_freq(double freq);
+void cio_spkr_divisor(unsigned int div);
+void cio_spkr_on(void);
+void cio_spkr_off(void);
+/* tone.c */
+void cio_tone(double freq, double length);
+/* check_kb */
+int cio_check_kb_escape(void);
+
+#endif
diff --git a/include/ct.h b/include/ct.h
new file mode 100644 (file)
index 0000000..0ad813e
--- /dev/null
@@ -0,0 +1,75 @@
+/*---------------------------------------------------------------------*/\r
+/*                 HEADER FILE FOR TOMOGRAPY SYSTEM                   */\r
+/*---------------------------------------------------------------------*/\r
+\r
+#ifndef CT_H\r
+#define CT_H\r
+\r
+#ifdef HAVE_CONFIG_H\r
+#include <config.h>\r
+#endif\r
+#ifdef HAVE_PNG\r
+#include "png.h"\r
+#endif\r
+#ifdef HAVE_STDIO_H\r
+#include <stdio.h>\r
+#endif\r
+#ifdef HAVE_STRING_H\r
+#include <string.h>\r
+#endif\r
+#ifdef HAVE_STDDEF_H\r
+#include <stddef.h>\r
+#endif\r
+#include <stdlib.h>\r
+#ifdef HAVE_STDARG_H\r
+#include <stdarg.h>\r
+#endif\r
+#ifdef  HAVE_SYS_TYPES_H\r
+#include <sys/types.h>\r
+#endif\r
+#ifdef HAVE_SYS_STAT_H\r
+#include <sys/stat.h>\r
+#endif\r
+#ifdef HAVE_CTYPE_H\r
+#include <ctype.h>\r
+#endif\r
+#ifdef HAVE_MATH_H\r
+#include <math.h>\r
+#endif\r
+#ifdef HAVE_SYS_FCNTL_H\r
+#include <sys/fcntl.h>\r
+#endif\r
+#ifdef HAVE_FCNTL_H\r
+#include <fcntl.h>\r
+#endif\r
+#if defined(HAVE_GETOPT_H) || defined(HAVE_GETOPT_LONG)\r
+#include <getopt.h>\r
+#endif\r
+#ifdef HAVE_UNISTD_H\r
+#include <unistd.h>\r
+#endif\r
+#ifdef HAVE_SETJMP_H\r
+#include <setjmp.h>\r
+#endif\r
+\r
+#ifdef MPI_CT\r
+#include "mpi.h"\r
+#endif\r
+\r
+#include "kstddef.h"\r
+#include "kmath.h"\r
+#include "sgp.h"\r
+#include "sdf.h"\r
+#include "ir.h"\r
+#include "getargs.h"\r
+#include "keyboard.h"\r
+#include "cio.h"\r
+#include "ezplot.h"\r
+\r
+#ifndef basename\r
+extern char *basename (__const char *__filename);\r
+#endif\r
+\r
+\r
+#endif\r
+\r
diff --git a/include/ezplot.h b/include/ezplot.h
new file mode 100644 (file)
index 0000000..c5838c0
--- /dev/null
@@ -0,0 +1,311 @@
+/*----------------------------------------------------------------------*/
+/*                             EZPLOT                                  */
+/*                                                                     */
+/*----------------------------------------------------------------------*/
+
+#ifndef __H_EZPLOT
+#define __H_EZPLOT
+
+#include <stdio.h>
+#include <stddef.h>
+#include "kstddef.h"
+#include <ctype.h>
+#include "sgp.h"
+#include <math.h>
+#include "kmath.h"
+#include "cio.h"
+
+#define MAXLABEL  40           /* maximum length of axis label */
+#define MAXTITLE  40           /* maximum length of a title */
+#define MAXLEGEND 20           /* maximum length of a legend */
+#define MAXCURVES 10           /* maximum number of curves that can be plotted */
+#define MAXPTS    200          /* max number of points that can be read with
+                                  DATA command in INTERACTIVE mode */
+
+struct ezp_curve_st {
+       int numpts;
+       double *x, *y;
+       int linestyle;
+       int symbol;
+       int symfreq;
+       int color;
+       char legend[MAXLEGEND+1];
+};
+
+#define XBUF_DEF     600
+#define YBUF_DEF     XBUF_DEF * (72. / 120.) * 0.75
+#define PRTMODE_DEF  1
+
+/*----------------------------------------------------------------------*/
+/*                     Codes from LEX                                  */
+/*----------------------------------------------------------------------*/
+
+#define S_DATA         2
+#define S_HELP         3
+#define S_EXIT         4
+
+#define S_SOLID                -10
+#define S_DASH         -11
+#define S_NOLINE       -12
+#define S_BLACK                -13
+#define S_RED          -14
+#define S_BLUE         -15
+#define S_GREEN                -16
+#define S_PEN          -17
+#define S_SYMBOL       -18     
+#define S_EVERY                -19
+#define S_NONE         -20
+#define S_CURVES       -21
+#define S_UNKNOWN      -22
+#define S_END          -23
+#define S_LEGEND       -24
+#define S_XLEGEND      -25
+#define S_YLEGEND      -26
+#define S_XLIN         -27
+#define S_YLIN         -28
+#define S_XLOG         -29
+#define S_YLOG         -30
+#define S_XLABEL       -31
+#define S_YLABEL       -32
+#define S_XLENGTH      -33
+#define S_YLENGTH      -34
+#define S_XTICKS       -35
+#define S_YTICKS       -36
+#define S_ABOVE                -37
+#define S_LABEL                -38
+#define S_BELOW                -39
+#define S_NOLABEL      -40
+#define S_RIGHT                -41
+#define S_LEFT         -42
+#define S_XAUTOSCALE   -43
+#define S_YAUTOSCALE   -44
+#define S_XMIN         -45
+#define S_YMIN         -46
+#define S_XMAX         -47
+#define S_YMAX         -48
+#define S_LXFRAC       -49
+#define S_LYFRAC       -50
+#define S_XCROSS       -51
+#define S_YCROSS       -52
+#define S_NOXAXIS      -53
+#define S_NOYAXIS      -54
+#define S_XPORIGIN     -55
+#define S_YPORIGIN     -56
+#define S_TITLE                -57
+#define S_XTITLE       -58
+#define S_YTITLE       -59
+#define S_REPLOT       -60
+#define S_CLEAR                -61
+#define S_STORE                -62
+#define S_RESTORE      -63
+#define S_USTART       -64
+#define S_UFINISH      -65
+#define S_AMARK                -66
+#define S_NO           -67
+#define S_INTERACTIVE  -68
+#define S_UNITS                -69
+#define S_INCHES       -70     
+#define S_USER         -71
+
+#define S_BOX          -100
+#define S_NOBOX                -101
+#define S_GRID         -102
+#define S_NOGRID       -103
+#define S_MAJOR                -104
+#define S_MINOR                -105
+#define S_COLOR                -106
+#define S_LEGENDBOX    -107
+#define S_TAG          -108
+
+#define S_EPSON                -110
+#define S_CRT          -111
+
+#define S_TEXTSIZE     -120
+#define S_XBUF         -121
+#define S_YBUF         -122
+#define S_PRTMODE      -123
+
+/*----------------------------------------------------------------------*/
+/*                            GLOBAL VARIABLES                         */
+/*----------------------------------------------------------------------*/
+
+/* axis definitions */
+#define LINEAR 1               /* linear axis */
+#define LOG    2               /* logrithmic axis */
+#define NOAXIS 3               /* don't plot axis */
+
+/* tick definitions */
+#define ABOVE   1
+#define BELOW   2
+#define RIGHT   4
+#define LEFT    8
+
+/* line types */
+#define NOLINE 0
+#define SOLID  1
+#define DASH   2
+#define DASH1  10
+#define DASH2  11
+#define DASH3  12
+#define DASH4  13
+
+/* symbol definitions */
+#define SB_CROSS    1
+#define SB_PLUS            2
+#define SB_BOX     3
+#define SB_CIRCLE   4
+#define SB_ERRORBAR 5
+#define MAXSYMBOL   5
+
+#define INSIDE   1             /* values of o_legendbox */
+#define OUTSIDE  2
+#define NOLEGEND 3
+
+/*-----------------------------------------------------------------------------
+ *                             GLOBAL VARIABLES
+ *
+ * Naming Convention:
+ *     i_   Internal variable
+ *             Not user changable
+ *     o_   Option variable
+ *             Normal variable that is user modifiable
+ *             These variables must always have a valid value
+ *     d_   Device variable
+ *             Variables controlling devices
+ *      clr_ Color variable
+ *             Holds a color value
+ *     c_   Character string variable
+ *             Contains a character string
+ *     v_   Value variable
+ *             User modifiable variable associated with the set variable (s_)
+ *             These variables do not always have a valid value
+ *             These variables change assumption EZPLOT makes about the plot
+ *     s_   Set variable.
+ *             TRUE if associated value variable (v_) has been set by the user
+ *---------------------------------------------------------------------------*/
+
+
+struct ezplot_var {
+
+/*-------------*/
+/* USER CURVES */
+/*-------------*/
+
+struct ezp_curve_st curve[MAXCURVES];
+
+/*--------------------*/
+/* INTERNAL VARIABLES */
+/*--------------------*/
+
+bool i_plotimmediate;          /* indicates that a call to EZPLOT is a signal
+                                  to print all received arrays.  EZSET uses
+                                  this variable to force EZPLOT to replot 
+                                  its stored curves */
+int i_numcurves;               /* number of curves received by EZPLOT */
+
+/*------------------*/
+/* DEVICE VARIABLES */
+/*------------------*/
+
+bool d_usecrt;                 /* TRUE if want to use CRT as output device */ 
+bool d_useprt;                 /* TRUE if wamt to use printer as output device */
+
+int d_crtmode;                 /* Controls which crt mode to use for plot */
+int d_prtmode;                 /* Controls mode of printer output */
+
+int d_xprtbuf, d_yprtbuf;      /* Size of printer buffer in pixels */
+
+/*-----------------*/
+/* COLOR VARIABLES */
+/*-----------------*/
+
+int clr_axis;                  /* color of all axis lines */
+int clr_title;                 /* color of main title */
+int clr_label;                 /* color of axis labels */
+int clr_legend;                        /* color of legend box */
+int clr_grid;                  /* color of grid lines */
+int clr_number;                        /* color of axis number labels */
+
+/*------------------*/
+/* OPTION VARIABLES */
+/*------------------*/
+
+int o_reqcurves;               /* # of curves specified in CURVES command */
+                               /* default value is 1, so that a call to EZPLOT
+                                  will force a plot */
+bool o_unknowncurves;          /* TRUE when the user specifies that the 
+                                  number of curves is unknown */
+
+bool o_ustart, o_ufinish;      /* TRUE if user initiates or terminate sgp */
+
+double o_xporigin, o_yporigin; /* origin of plot frame in NDC */
+double o_xlength, o_ylength;   /* length of plot frame in NDC */
+
+char c_xlabel[MAXLABEL+1];     /* label for x axis */
+char c_ylabel[MAXLABEL+1];     /* label for y axis */
+char c_title[MAXTITLE+1];              /* title to print above graph */
+char c_legend[MAXLEGEND+1];    /* current legend specified */
+
+int o_linestyle, o_color;      /* style to use for curves all subsequent */
+                               /* curves to EZPLOT */
+bool o_xaxis, o_yaxis;         /* Specifies where axis & labels are drawn */
+bool o_grid;                   /* Flag to draw a grid at major ticks */
+bool o_box;                    /* Flag to draw a box around the graph */
+
+int o_xticks, o_yticks;                /* direction to draw tick marks */
+bool o_xtlabel, o_ytlabel;     /* TRUE if label tick marks */
+
+int o_xmajortick, o_ymajortick;        /* number of major ticks to draw */
+int o_xminortick, o_yminortick;        /* number of minor ticks between major ticks */
+
+int o_symbol;                  /* Symbol type, (0 = no symbol) */
+int o_symfreq;                 /* frequency to draw symbols at curve points */
+
+int o_legendbox;               /* controls whether legend is inside */
+                               /* or outside of the axis extents */
+int o_tag;                     /* controls whether to draw tag at end of axes */
+
+/*-----------------------*/
+/* VALUE & SET variables */
+/*-----------------------*/
+
+double v_xmin, v_xmax, v_ymin, v_ymax; /* user supplied axis endpoints */
+bool   s_xmin, s_xmax, s_ymin, s_ymax; /* TRUE is endpoint has been set */
+
+double v_xtitle, v_ytitle;     /* NDC position to plot title */
+bool   s_xtitle, s_ytitle;     /* TRUE if set position for title */
+double v_xcross, v_ycross;     /* position that axes cross */
+bool   s_xcross, s_ycross;     /* TRUE if set axes cross position */
+
+double v_xlegend, v_ylegend;   /* upper-left position of legend box in NDC */
+bool   s_xlegend, s_ylegend;   /* TRUE if set position of legend box */
+
+int  v_lxfrac, v_lyfrac;       /* number of digits to right of decimal place */
+bool s_lxfrac, s_lyfrac;       /* TRUE if set number of fractional digits */
+
+double v_textsize;             /* size of text in NDC */
+bool   s_textsize;             /* TRUE if user set size of text */
+
+};     /* end of EZPLOT VARIABLES */
+
+
+
+extern struct ezplot_var ez;
+extern bool ezplot_firstcall;   /* set to false on first call to EZSET or EZPLOT */
+
+
+/* axis.c */
+int axis_scale(double min, double max, int nint, double *minp, double *maxp, int *nintp);
+/* ezplot.c */
+int ezplot(double x[], double y[], int num);
+void ezinit(void);
+void ezfree(void);
+void ezclear(void);
+/* ezplot1d.c */
+void ezplot_1d(double *y, int n);
+/* ezset.c */
+int ezset(char *command);
+/* makefmt.c */
+void make_numfmt(char *fmtstr, int *fldwid, int *nfrac, double min, double max, int nint);
+
+#endif
diff --git a/include/getargs.h b/include/getargs.h
new file mode 100644 (file)
index 0000000..dd5d8a9
--- /dev/null
@@ -0,0 +1,25 @@
+/*      getargs.h       Typedefs and defines for getargs\r
+ */\r
+\r
+\r
+#ifndef GETARGS_H\r
+#define GETARGS_H\r
+\r
+#define INTEGER         0\r
+#define BOOLEAN         1\r
+#define CHARACTER       2\r
+#define STRING          3\r
+#define PROC            4\r
+\r
+\r
+typedef struct\r
+{\r
+        unsigned        arg  :  7 ;     /* Command line switch          */\r
+        unsigned        type :  4 ;     /* variable type                */\r
+        int             *variable ;     /* pointer to variable          */\r
+        char            *errmsg   ;     /* pointer to error message     */\r
+}\r
+    ARG;\r
+\r
+#endif /* GETARGS_H */\r
+\r
diff --git a/include/ir.h b/include/ir.h
new file mode 100644 (file)
index 0000000..407b02b
--- /dev/null
@@ -0,0 +1,465 @@
+/* FILE IDENTIFICATION
+ *
+ *     Name:         ir.h          Header File for Image Reconstruction System
+ *     Programmer:   Kevin Rosenberg
+ *     Date Started: 7-1-84
+ *     Last Change:  1-20-85
+ */
+
+#ifndef IR_H
+#define IR_H
+
+#ifdef MPI_CT
+#define MPI_MAX_PROCESS 128
+struct mpi_ct_st
+{
+  int my_rank;
+  int nproc;
+  int base_local_work_units;
+  int remainder_work_units;
+  int local_work_units[MPI_MAX_PROCESS];
+  int start_work_unit[MPI_MAX_PROCESS];
+  MPI_Comm comm;
+};
+
+extern struct mpi_ct_st mpi_ct;
+void mpi_ct_calc_work_units(const unsigned int global_work_units);
+#endif
+
+
+struct histo_st {
+    int *b;                    /* Histogram array (# of elements in each bin) */
+    int nbin;                  /* Number of histogram bins */
+    double xmin, xmax, xinc;   /* Limits of histogram boundaries */
+};
+
+typedef struct histo_st HISTOGRAM;
+
+/*---------------------------------------------------------------------------*/
+
+#define POINTS_PER_CIRCLE  36
+
+#define MAXREMARK      99
+#define LENREMARK       (MAXREMARK+1)
+#define IMAGE_VAL      FMTX_2D         /* use 2d floating point matrix */
+#define IMAGE_ELEM_TYPE DT_FLOAT       /* use floats for images */
+typedef float IMAGE_ELEM_VAL;          /* use floats for image storing */
+
+struct image_st {
+    IMAGE_VAL v;                       /* values of voxels in matrix form */
+    SDF_2D *dfp_2d;                    /* Pointer to disk image file */
+    int nx, ny;                                /* size of voxel matrix */
+    double xmin, xmax, ymin, ymax;     /* extent of voxel matrix in pic coord */
+    char remark[LENREMARK];            /* description of voxel data */
+    float calctime;                    /* time to calculate voxels in seconds */
+};
+
+struct object_st {
+    int type;                     /* object type (box, ellipse, etc) */
+    double atten;                 /* X-ray attenuation coefficient */
+    double cx,cy;                 /* center of object */
+    double u,v;                           /* size of object */
+    double rot;                           /* object rotation angle (in radians) */
+    double *x, *y;                /* ptr to array of points in obj world coord */
+    int pts;                      /* number of points in outline arrays */
+    double xmin, xmax, ymin, ymax; /* object limits */
+    double radius;                /*   "   */
+    struct {                      /* transform matrices        */
+       GRFMTX_2D p_to_o;          /* map from pic to standard obj coords */
+       GRFMTX_2D o_to_p;          /* map from std object coords to pic coords */
+    } xform;
+    struct object_st *next;      /* pointer to next object in picture */
+};
+
+typedef struct object_st OBJECT;
+
+struct pic_st {                           /* Picture structure */
+    OBJECT *objlist;              /* object list */
+    int type;
+    int numobj;                           /* number of objects in picture */
+    double xmin, xmax, ymin, ymax; /* extent of objects in object coordinates */
+    double radius;                /*     " "    */
+};
+
+typedef struct image_st  IMAGE;
+typedef struct pic_st    PICTURE;
+
+#define P_OBJECTS      0       /* Picture made of objects */
+#define P_UNIT_PULSE   1       /* Special picture, not made of objects */
+#define P_FILTER       9       /* defined only by a type */
+
+/*----------------------------------------------------------------------*/
+/*                             RAYSUM SYMBOLS                          */
+/*----------------------------------------------------------------------*/
+
+/* Ray sums are collected along an array of ndet detectors.  The data
+ * for these detectors is stored in the structure DETECTARRAY
+ */
+
+#define DETECT_TYPE float
+
+struct detarray_st {
+  DETECT_TYPE *detval; /* Pointer to array of values recorded by detector */
+  int ndet;                    /* Number of detectors in array */
+  double view_angle;    /* View angle in radians */
+};
+
+struct detect_st {
+  int ndet;                    /* Number of detectors in array */
+  int nview;                   /* Number of rotated views */
+  int nsample;                 /* Number of rays per detector */
+  double detlen;               /* Total length of detector array */
+  double rotlen;               /* Rotation angle length in radians (norm 2PI) */
+  double det_inc;              /* Increment between centers of detectors */
+  double rot_inc;              /* Increment in rotation angle between views */
+  double radius;               /* Radius of rotation.  Distance from */
+                               /*   center of pic to center of det */
+  double piclen;                /* Maximum Length of picture or area of interest */
+  struct {
+    double xd1,yd1,xd2,yd2;    /* Coordinates of detector endpoints */
+    double xs1,ys1,xs2,ys2;    /* Coordinates of source endpoints */
+    double angle;              /* Starting angle */
+  } init;
+};
+
+struct raysum_st {
+  int fd;
+  int file_mode;
+  int header_size;
+  struct detarray_st **view;   /* Pointer to array of detarray_st pointers */
+
+  char remark[LENREMARK];      /* description of raysum data */
+  double calctime;             /* time required to calculate raysums */
+
+  int ndet;                    /* number of detectors in array */
+  int nview;                   /* number of rotated views */
+  double rot_start;            /* starting view rotation */
+  double rot_inc;              /* angle between rotations */
+  double det_start;            /* distance of beginning detector to center */
+                               /*    of picture */
+  double det_inc;              /* increment between detectors */
+  double piclen;               /* Length of picture edge (pic is square) */
+};
+
+typedef struct detarray_st DETARRAY;
+typedef struct detect_st   DETECTOR;
+typedef struct raysum_st   RAYSUM;
+
+/*----------------------------------------------------------------------*/
+/*                             USER SYMBOLS                            */
+/*----------------------------------------------------------------------*/
+
+/* codes for object types, passed to add_obj() */
+
+#define O_RECTANGLE  1
+#define O_TRIANGLE   2
+#define O_ELLIPSE    3
+#define O_SECTOR     4
+#define O_SEGMENT    5
+
+/* Codes for Coordinate Types      */
+/* Defines coords for inside_obj() */
+
+#define OBJ_COORD -1           /* Normalized Object Coordinates */
+#define PIC_COORD -2           /* User's Picture Coordinates */
+
+/* Codes for Filter types */
+
+#define W_BANDLIMIT    1       /* filter types for genfilter() */
+#define W_SINC         2
+#define W_G_HAMMING    3
+#define W_COSINE       4
+#define W_TRIANGLE     5
+
+#define W_A_BANDLIMIT  11      /* filters times abs() of function */
+#define W_A_SINC       12
+#define W_AG_HAMMING   13
+#define W_A_COSINE     14
+
+#define W_SHEPP         21
+
+/* function domains */
+
+#define O_FREQ_STR      "freq"
+#define O_SPATIAL_STR   "spatial"
+#define D_FREQ         1       /* Domain names */
+#define D_SPATIAL      2
+
+/* function symmetry */
+
+#define FUNC_EVEN      1       /* function types, f[-n] = f[n] */
+#define FUNC_ODD       2       /* f[-n] = -f[n] */
+#define FUNC_BOTH      3       /* function has both odd & even components */
+
+/* interpolation methods */
+
+#define I_NEAREST      1       /* Interpolation methods */
+#define I_LINEAR       2       /* Linear interpolation */
+#define I_BSPLINE       3
+#define I_1BSPLINE      3      /* 1st order B-Spline */
+#define I_2BSPLINE      4
+#define I_3BSPLINE      5
+
+/* Constants for sizing picture */
+
+#define PERCENT_PIC_SIZE_INCR   0.0    /* Fractional increase in picture */
+                                       /* limits compared to object size */
+#define N_EXTRA_DETECTORS         4    /* Number of extra detectors */
+                                       /* widths when calculating detlen */
+
+#define DET_PARALLEL 1
+#define DET_FAN      2
+
+#define O_TRACE_NONE_STR     "none"
+#define O_TRACE_TEXT_STR     "text"
+#define O_TRACE_PIC_STR      "pic"
+#define O_TRACE_RAYS_STR     "rays"
+#define O_TRACE_PLOT_STR     "plot"
+#define O_TRACE_CLIPPING_STR "clipping"
+
+
+#define TRACE_NONE     0               /* No tracing */
+#define TRACE_TEXT     1               /* Minimal status */
+#define TRACE_PIC      2               /* Show picture */
+#define TRACE_RAYS     3               /* Show all rays */
+#define TRACE_PLOT     4               /* Plot raysums */
+#define TRACE_CLIPPING 5               /* Plot clipping */
+
+#define O_PIC_HERMAN    1               /* Herman head phantom */
+#define O_PIC_ROWLAND   2               /* Rowland head phantom */
+#define O_PIC_BROWLAND  3               /* Bordered Rowland head phantom */
+#define O_PIC_UNITPULSE 4               /* Unit pulse phantom */
+
+#define O_PIC_HERMAN_STR    "herman"
+#define O_PIC_ROWLAND_STR   "rowland"
+#define O_PIC_BROWLAND_STR  "browland"
+#define O_PIC_UNITPULSE_STR "unitpulse"
+
+#define O_INTERP_NEAREST_STR  "nearest"
+#define O_INTERP_LINEAR_STR   "linear"
+#define O_INTERP_BSPLINE_STR  "bspline"
+
+#define O_FILTER_ABS_BANDLIMIT_STR "abs_bandlimit"
+#define O_FILTER_ABS_SINC_STR      "abs_sinc"
+#define O_FILTER_ABS_COS_STR       "abs_cos"
+#define O_FILTER_ABS_HAMMING_STR   "abs_hamming"
+#define O_FILTER_SHEPP_STR         "shepp"
+#define O_FILTER_BANDLIMIT_STR     "bandlimit"
+#define O_FILTER_SINC_STR          "sinc"
+#define O_FILTER_COS_STR           "cos"
+#define O_FILTER_HAMMING_STR       "hamming"
+#define O_FILTER_TRIANGLE_STR      "triangle"
+
+#define O_BPROJ_TRIG   1 
+#define O_BPROJ_TABLE  2
+#define O_BPROJ_DIFF   3
+#define O_BPROJ_DIFF2  4
+#define O_BPROJ_IDIFF2 5
+
+#define O_BPROJ_TRIG_STR     "trig"
+#define O_BPROJ_TABLE_STR    "table"
+#define O_BPROJ_DIFF_STR     "diff"
+#define O_BPROJ_DIFF2_STR    "diff2"
+#define O_BPROJ_IDIFF2_STR   "idiff2"
+
+#define RS_TRACE_ROW_TITLE     1
+#define RS_TRACE_ROW_TITLE2    2
+#define RS_TRACE_ROW_PHANT_ID  4
+#define RS_TRACE_ROW_CHROMATIC 7
+#define RS_TRACE_ROW_SCATTER   8
+#define RS_TRACE_ROW_PHOT_STAT 9
+#define RS_TRACE_ROW_NDET      12
+#define RS_TRACE_ROW_NVIEW     13
+#define RS_TRACE_ROW_SAMPLES   14
+#define RS_TRACE_ROW_CURR_VIEW 17
+#define RS_TRACE_ROW_ATTEN     18
+
+
+/*----------------------------------------------------------------------*/
+/*                     GRAY SCALE STRUCTURES                           */
+/*----------------------------------------------------------------------*/
+
+#define GS_MAX_CELL_SIZE   4
+
+typedef int GS_BITMASK[4][4];
+
+struct greyscale_st {
+    int dev;                           /* Device to output to */
+    int (*dotfunc)(int x, int y, int color);                   /* Pointer to dot function for device */
+    int cur_x, cur_y;                  /* Current cell location */
+    int nxcell, nycell;                        /* size of cell in pixels */
+    int xmin, ymin;                    /* starting position of grey scale */
+    int num_color;                     /* Number of primary colors available */
+    int num_intens;                    /* Number of intensities available */
+    int max_level;                     /* gs levels range from 0 to max_level */
+    char *fg_color_tbl;                        /* Hold foreground color for each level */
+    char *bg_color_tbl;                        /* Holds background color */
+    char *level_sub_tbl;               /* Holds value to subtract for level */
+                                       /* before accessing bit mask */
+    GS_BITMASK *bm;                    /* Holds grey-scale bit mask */
+    struct greyscale_st *next_dev;     /* Pointer to next open device */
+                                       /* == NULL when no more devices */
+};
+
+typedef struct greyscale_st GREYSCALE;
+
+
+/* From reconstr.c */
+IMAGE *image_reconst (IMAGE *im, RAYSUM *rs, int filt_type, double filt_param, int interp_type, int interp_param, const int backproj_type, int ir_trace);
+
+/* From bproj.c */
+void backproj_init (const RAYSUM *rs, IMAGE *im, const int bproj_method);
+int  backproj_calc (const RAYSUM *rs, IMAGE *im, const double *t, const double view_angle, 
+                   const int interp_type, const int bproj_method);
+void backproj_term (const RAYSUM *rs, IMAGE *im, const int bproj_method);
+
+void backproj_init_trig (const RAYSUM *rs, IMAGE *im);
+int  backproj_calc_trig (const RAYSUM *rs, IMAGE *im, const double *t, 
+                        const double view_angle, const int interp_type);
+void backproj_term_trig (const RAYSUM *rs, IMAGE *im);
+void backproj_init_table (const RAYSUM *rs, IMAGE *im);
+int  backproj_calc_table (const RAYSUM *rs, IMAGE *im, const double *t, 
+                         const double view_angle, const int interp_type);
+void backproj_term_table (const RAYSUM *rs, IMAGE *im);
+void backproj_init_d (const RAYSUM *rs, IMAGE *im);
+int  backproj_calc_d (const RAYSUM *rs, IMAGE *im, const double *t, 
+                     const double view_angle, const int interp_type);
+void backproj_term_d (const RAYSUM *rs, IMAGE *im);
+void backproj_init_d2 (const RAYSUM *rs, IMAGE *im);
+int  backproj_calc_d2 (const RAYSUM *rs, IMAGE *im, const double *t, 
+                      const double view_angle, const int interp_type);
+void backproj_term_d2 (const RAYSUM *rs, IMAGE *im);
+void backproj_init_id (const RAYSUM *rs, IMAGE *im);
+int  backproj_calc_id (const RAYSUM *rs, IMAGE *im, const double *t, 
+                      const double view_angle, const int interp_type);
+void backproj_term_id (const RAYSUM *rs, IMAGE *im);
+void backproj_init_id2 (const RAYSUM *rs, IMAGE *im);
+int  backproj_calc_id2 (const RAYSUM *rs, IMAGE *im, const double *t, 
+                       const double view_angle, const int interp_type);
+void backproj_term_id2 (const RAYSUM *rs, IMAGE *im);
+
+void usage (const char *program);
+int main(const int argc, char * const argv[]);
+
+
+
+/* bspline.c */
+int bspline(int samples, int zoom_factor, int spline_order, double input[], double output[]);
+/* clip.c */
+int inside_obj(const OBJECT *obj, double x, double y, const int coord_type);
+int clipsegment(double *x1, double *y1, double *x2, double *y2, const double u, const double v);
+int clipsector(double *x1, double *y1, double *x2, double *y2, const double u, const double v);
+int clipcircle(double *x1, double *y1, double *x2, double *y2, const double cx, const double cy, const double radius, double t1, double t2);
+int cliptriangle(double *x1, double *y1, double *x2, double *y2, const double u, const double v, const int clip_xaxis);
+/* convolve.c */
+double convolve(const double f1[], const double f2[], const double dx, const int n, const int np, const int func_type);
+double convolve_both(const double f1[], const double f2[], const double dx, const int n, const int np);
+/* ctsub.c */
+OBJECT *alloc_obj(int n);
+void dminmax(const double array[], const int pts, double *xmin, double *xmax);
+void rotate2d(double x[], double y[], int pts, double angle);
+void xlat2d(double x[], double y[], int pts, double xoffset, double yoffset);
+void scale2d(double x[], double y[], int pts, double xfact, double yfact);
+int circle_pts(double theta);
+/* filt.c */
+const char *interp_name_of(int interp_type);
+const char *filter_name_of(int filt_type);
+int interp_select(void);
+int filter_select(double *filt_param);
+double d_filtfunc(int filt_type, double x, double bw, double param, int n);
+double filter_freq(int filt_type, double u, double bw, double param);
+double a_filtfunc(int filt_type, double x, double bw, double param);
+double sinc(double x, double mult);
+double abscos_int(double u, double w);
+double *filter_generate(int filt_type, double bw, double xmin, double xmax, int n, double param, int domain, int numint);
+void image_filter_init(IMAGE *im, int domain, double bw, int filt_type, double filt_param, int opt_trace);
+/* im_draw.c */
+void image_show(IMAGE *im, int nxcell, int nycell, double densmin, double densmax, bool disp_scale);
+int image_paint(int dev, IMAGE *im, int xmin, int ymin, int nxcell, int nycell, double densmin, double densmax, bool disp_scale);
+int gs_image(GREYSCALE *gs, IMAGE *im, double densmin, double densmax, bool disp_scale);
+void paint_cscale(GREYSCALE *gs, int nx, int ny);
+GREYSCALE *gs_init(int dev, int xmin, int ymin, int nxcell, int nycell);
+void gs_pixel(GREYSCALE *gs, int x, int y, int gs_level);
+void gs_set_pos(GREYSCALE *gs, int x, int y);
+void gs_set_at_addr(GREYSCALE *gs, int gs_level);
+void gs_set_color_scale(void);
+/* image.c */
+IMAGE *image_create(const char *fname, const int nx, const int ny);
+int image_clear(IMAGE *im);
+int image_save(IMAGE *im);
+IMAGE *image_load(const char *fname);
+/* ir_vars.c */
+/* options.c */
+int opt_set_trace(const char *optarg, const char *program);
+const char *name_of_picture(const int picnum);
+int opt_set_picture(const char *optarg, const char *program);
+int opt_set_interpolation(const char *optarg, const char *program);
+int opt_set_filter(const char *optarg, const char *program);
+const char *name_of_filter(const int filter);
+int opt_set_filter_domain(const char *optarg, const char *program);
+const char *name_of_filter_domain(const int domain);
+int opt_set_backproj(const char *optarg, const char *program);
+const char *name_of_backproj(const int backproj);
+/* pic.c */
+PICTURE *select_pic(void);
+PICTURE *create_pic_from_file(const char *fname);
+PICTURE *create_pic(const int picnum);
+PICTURE *init_pic(void);
+int add_objs_kb(PICTURE *pic);
+int add_objs_file(PICTURE *pic, const char *fname);
+void addobject(PICTURE *pic, const int type, const double cx, const double cy, 
+              const double u, const double v, const double rot, const double atten);
+int makeobjpts(OBJECT *obj);
+void makeobjxform(OBJECT *obj);
+void calc_arc(double x[], double y[], const int pts, const double xcent, const double ycent, 
+             const double r, const double start, const double stop);
+void calc_ellipse(double x[], double y[], const int pts, const double u, const double v);
+void prt_pic(PICTURE *pic);
+void show_pic(const PICTURE *pic);
+void draw_pic(const PICTURE *pic);
+/* pic2image.c */
+void pic_to_image(const PICTURE *pic, IMAGE *im, const int col_start, const int col_count,
+                 const int nsample, const int trace);
+/* ray.c */
+void rs_trace_showprm (const char *label, const char *fmt, int row, int color, ...);
+DETECTOR *detect_create(const PICTURE *pic, int ndet, int nview, int nsample, const double rot_anglen);
+void detect_free(DETECTOR *det);
+int raysum_collect(RAYSUM *rs, const DETECTOR *det, const PICTURE *pic, const int start_view, 
+                  const int trace, const int unit_pulse);
+void rayview(const PICTURE *pic, DETARRAY *darray, const DETECTOR *det, 
+            const double xd1, const double yd1, const double xd2, const double yd2, 
+            const double xs1, const double ys1, const double xs2, const double ys2, const int unit_pulse);
+double calc_rsum(const PICTURE *pic, const double x1, const double y1, const double x2, const double y2);
+double calc_objsum(const OBJECT *obj, const double x1, const double y1, const double x2, const double y2);
+int clipobj(const OBJECT *obj, double *x1, double *y1, double *x2, double *y2);
+/* rayio.c */
+RAYSUM *raysum_create(const char *fname, const int nview, const int ndet, const int in_memory);
+RAYSUM *raysum_create_from_det(const char *fname, const DETECTOR *det, const int in_memory);
+RAYSUM *raysum_open(const char *filename);
+void raysum_alloc_views(RAYSUM *rs);
+void raysum_free(RAYSUM *rs);
+int raysum_is_open(RAYSUM *rs);
+int raysum_close(RAYSUM *rs);
+int raysum_read_header(RAYSUM *rs);
+int raysum_write_header(RAYSUM *rs);
+int raysum_read(RAYSUM *rs);
+int raysum_write(RAYSUM *rs);
+DETARRAY *detarray_alloc(const int n);
+void detarray_free(DETARRAY *darray);
+int detarray_read(RAYSUM *rs, DETARRAY *darray, const int view_num);
+int detarray_write(RAYSUM *rs, const DETARRAY *darray, const int view_num);
+int raysum_print(const RAYSUM *rs);
+/* phantom.c */
+void herm_head(PICTURE *pic);
+void row_head(PICTURE *pic);
+void row_bord_head(PICTURE *pic);
+/* xform.c */
+void indent_mtx2(GRFMTX_2D m);
+void xlat_mtx2(GRFMTX_2D m, const double x, const double y);
+void scale_mtx2(GRFMTX_2D m, const double sx, const double sy);
+void rot_mtx2(GRFMTX_2D m, const double theta);
+void mult_mtx2(GRFMTX_2D m1, GRFMTX_2D m2, GRFMTX_2D result);
+void xform_mtx2(GRFMTX_2D m, double *x, double *y);
+
+#endif
diff --git a/include/keyboard.h b/include/keyboard.h
new file mode 100644 (file)
index 0000000..8f867a9
--- /dev/null
@@ -0,0 +1,79 @@
+/******************************************************************************\r
+ *\r
+ * FILE IDENTIFICATION\r
+ *\r
+ *     File Name:      KEYBOARD.H\r
+ *     Author:         Kevin Rosenberg\r
+ *     Purpose:        Header file for IBM-PC keyboard definitions\r
+ *     Date Started:   Jan 85\r
+ *\r
+ * DESCRIPTION\r
+ *\r
+ * MODIFICATION LOG\r
+ *\r
+ *****************************************************************************/\r
+\r
+#ifndef KEYBOARD_H\r
+#define KEYBOARD_H\r
+\r
+#define KEY_BKSP        8\r
+#define KEY_TAB                 9\r
+#define KEY_RETURN     13\r
+#define KEY_ESCAPE     27\r
+\r
+#define KEY_HOME       0x4700\r
+#define KEY_UP         0x4800\r
+#define KEY_PGUP       0x4900\r
+#define KEY_LEFT       0x4B00\r
+#define KEY_CENTER     0x4C00          /* center of numeric keypad = 5 */\r
+#define KEY_RIGHT      0x4D00\r
+#define KEY_END                0x4F00\r
+#define KEY_DOWN       0x5000\r
+#define KEY_PGDOWN     0x5100\r
+\r
+#define KEY_F1         0x3B00\r
+#define KEY_F2         0x3C00\r
+#define KEY_F3         0x3D00\r
+#define KEY_F4         0x3E00\r
+#define KEY_F5         0x3F00\r
+#define KEY_F6         0x4000\r
+#define KEY_F7         0x4100\r
+#define KEY_F8         0x4200\r
+#define KEY_F9         0x4300\r
+#define KEY_F10                0x4400\r
+\r
+#define KEY_SHIFTF1    0x5400\r
+#define KEY_SHIFTF2    0x5500\r
+#define KEY_SHIFTF3    0x5600\r
+#define KEY_SHIFTF4    0x5700\r
+#define KEY_SHIFTF5    0x5800\r
+#define KEY_SHIFTF6    0x5900\r
+#define KEY_SHIFTF7    0x5A00\r
+#define KEY_SHIFTF8    0x5B00\r
+#define KEY_SHIFTF9    0x5C00\r
+#define KEY_SHIFTF10   0x5D00\r
+\r
+#define KEY_CTRLF1     0x5E00\r
+#define KEY_CTRLF2     0x5F00\r
+#define KEY_CTRLF3     0x6000\r
+#define KEY_CTRLF4     0x6100\r
+#define KEY_CTRLF5     0x6200\r
+#define KEY_CTRLF6     0x6300\r
+#define KEY_CTRLF7     0x6400\r
+#define KEY_CTRLF8     0x6500\r
+#define KEY_CTRLF9     0x6600\r
+#define KEY_CTRLF10    0x6700\r
+\r
+#define KEY_ALTF1      0x6800\r
+#define KEY_ALTF2      0x6900\r
+#define KEY_ALTF3      0x6A00\r
+#define KEY_ALTF4      0x6B00\r
+#define KEY_ALTF5      0x6C00\r
+#define KEY_ALTF6      0x6D00\r
+#define KEY_ALTF7      0x6E00\r
+#define KEY_ALTF8      0x6F00\r
+#define KEY_ALTF9      0x7000\r
+#define KEY_ALTF10     0x7100\r
+\r
+\r
+#endif /* #ifndef KEYBOARD_H */\r
diff --git a/include/kmath.h b/include/kmath.h
new file mode 100644 (file)
index 0000000..636339a
--- /dev/null
@@ -0,0 +1,188 @@
+/******************************************************************************
+ *
+ * FILE IDENTIFICATION
+ *
+ *     File Name:      NUMR.H
+ *     Author:         Kevin Rosenberg
+ *     Purpose:        Header file containing definitions for numerical app's
+ *     Date Started:   Nov 84
+ *
+ * DESCRIPTION
+ *
+ * MODIFICATION LOG
+ *
+ *****************************************************************************/
+
+#ifndef _H_kmath
+#define _H_kmath
+
+#include <stdio.h>
+#include <math.h>
+
+#define PI      3.14159265358979323846
+#define HALFPI  1.57079632679489661923 /* PI divided by 2 */
+#define QUARTPI 0.78539816339744830962 /* PI divided by 4 */
+#define I_PI   0.31830988618379067154  /* Inverse of PI */
+#define I_PID2 0.63661977236758134308  /* Inverse of PID2 */
+#define TWOPI  6.28318530717958647692
+#define SQRT2   1.414213562373095049
+
+#define F_EPSILON      1.0E-6
+#define D_EPSILON      1.0E-10
+
+#define DEG_TO_RAD(x)  (x*(PI/180.))
+#define RAD_TO_DEG(x)  (x*(180./PI))
+
+
+#define ASSUMEDZERO  1E-10
+
+/* codes for C data types */
+
+#define DT_CHAR                1
+#define DT_INT         2
+#define DT_LONG                3
+#define DT_FLOAT       4
+#define DT_DOUBLE      5
+#define DT_STRING  6
+
+typedef char    *CMTX_1D;
+typedef CMTX_1D  *CMTX_2D;
+typedef CMTX_2D  *CMTX_3D;
+
+typedef int     *IMTX_1D;
+typedef IMTX_1D  *IMTX_2D;
+typedef IMTX_2D  *IMTX_3D;
+
+typedef float   *FMTX_1D;
+typedef FMTX_1D  *FMTX_2D;
+typedef FMTX_2D  *FMTX_3D;
+
+typedef double   *DMTX_1D;
+typedef DMTX_1D  *DMTX_2D;
+typedef DMTX_2D  *DMTX_3D;
+
+union elem_val_un {    /* holds an element value */
+       char      c;
+       int       i;
+       long int  l;
+       float     f;
+       double    d;
+};
+
+typedef union elem_val_un  MTX_ELEM_VAL;
+
+
+union elem_ptr_un {    /* holds a pointer to a 1D vector of any type */
+       char      *c;
+       int       *i;
+       long int  *l;
+       float     *f;
+       double    *d;
+};
+
+typedef union elem_ptr_un  MTX_1D;
+typedef MTX_1D           *MTX_2D;
+typedef MTX_2D           *MTX_3D;
+
+union mtx_val_ptr_un {                 /* pointer to matrix values */
+    MTX_1D  m1;
+    MTX_2D  m2;
+    MTX_3D  m3;
+};
+
+typedef union mtx_val_ptr_un  MTX_PTR;
+
+struct matrix_st {
+    unsigned int order;                        /* order, or dimension, of matrix */
+    unsigned int elemtype;             /* element type */
+    unsigned int elemsize;             /* size of element in bytes */
+    unsigned int nx, ny, nz;           /* size of matrix in each dimension */
+    MTX_PTR val;                       /* pointer to matrix values */
+};
+
+typedef struct matrix_st MTX;
+typedef struct matrix_st *MTXP;
+
+/* DEFINITION IDENTIFICATION
+ *
+ *     Definitions to access a matrix element from an matrix
+ *
+
+#define me1(mtx,x)\
+  (mtx->elemtype == DT_FLOAT ? mtx->val.m1.f[x] :\
+    (mtx->elemtype == DT_DOUBLE ? mtx->val.m1.d[x] :\
+      (mtx->elemtype == DT_INT ? mtx->val.m1.i[x] :\
+       (mtx->elemtype == DT_LONG ? mtx->val.m1.l[x] :\
+         (mtx->elemtype == DT_CHAR ? mtx->val.m1.c[x] :\
+            0\
+             )))))
+
+#define me2(mtx,x,y)\
+  (mtx->elemtype == DT_FLOAT ? mtx->val.m2[x].f[y] :\
+    (mtx->elemtype == DT_DOUBLE ? mtx->val.m2[x].d[y] :\
+      (mtx->elemtype == DT_INT ? mtx->val.m2[x].i[y] :\
+       (mtx->elemtype == DT_LONG ? mtx->val.m2[x].l[y] :\
+         (mtx->elemtype == DT_CHAR ? mtx->val.m2[x].c[y] :\
+           0\
+             )))))
+
+
+#define me3(mtx,x,y,z)\
+  (mtx->elemtype == DT_FLOAT ? mtx->val.m3[x][y].f[z] :\
+    (mtx->elemtype == DT_DOUBLE ? mtx->val.m3[x][y].d[z] :\
+      (mtx->elemtype == DT_INT ? mtx->val.m3[x][y].i[z] :\
+       (mtx->elemtype == DT_LONG ? mtx->val.m3[x][y].l[z] :\
+         (mtx->elemtype == DT_CHAR ? mtx->val.m3[x][y].c[z] :\
+           0\
+              )))))
+*/
+
+
+/* calc_x.c */
+int calc_x(double *x, const double xmin, const double xmax, const int n);
+/* calcpoly.c */
+void calcpoly(const double *a, const int degree, const double *x, double *y, const int n);
+/* gauss.c */
+int gauss(double **a, double *b, double *x, const int num);
+/* lnearest.c */
+long int lnearest(double x);
+/* lsfit.c */
+int lsfit(double *x, double *y, int n, int degree, double *coeff, FILE *fp);
+/* matprt.c */
+void matprt(const double **m, const int row, const int col, FILE *fp);
+/* mtx_disp.c */
+void mtx_show(const MTX *mtx);
+void mtx_prt(const MTX *mtx, FILE *fp);
+int mtx_prt_elem(const MTX *mtx, FILE *fp, unsigned int x, unsigned int y, unsigned int z);
+/* mtx_elem.c */
+int mtx_get_elem(const MTX *mtx, MTX_ELEM_VAL *me, const int x, const int y, const int z);
+int mtx_put_elem(MTX *mtx, const MTX_ELEM_VAL *me, unsigned int x, unsigned int y, unsigned int z);
+/* mtx_inp.c */
+int mtx_inp_elem(const char *prompt, MTX_ELEM_VAL *mev, const int dtype);
+/* mtx_main.c */
+MTX *mtx_init(const unsigned int order, const unsigned int elem_type, const unsigned int nx, const unsigned int ny, const unsigned int nz);
+MTX *mtx_clr(MTX *mtx);
+int mtx_free(MTX *mtx);
+int mtx_elem_size(const int dt);
+int mtx_check(const MTX *mtx, const char *func_name);
+/* norm_ang.c */
+double norm_ang(double theta);
+/* pntprt.c */
+void pntprt(const double *x, const double *y, const int n, FILE *fp);
+/* pntread.c */
+int pntread(double *x, double *y, int *num, const int maxn, FILE *fp);
+/* poly.c */
+double poly(const double *a, const int degree, const double x);
+/* simpson.c */
+double simpson(const double xmin, const double xmax, const double *y, const int np);
+/* stddev.c */
+double stddev(const double *y1, const double *y2, const int n, const int df_lost);
+/* vectprt.c */
+void vectprt(const double *v, const int n, FILE *fp);
+/* vectread.c */
+int vectread(double *v, int *n, const int maxn, FILE *fp);
+/* vectsort.c */
+int vectsort(int num_vec, const int dtype, const int num_pts, char *vec1, char *vec2, char *vec3);
+
+#endif
diff --git a/include/kstddef.h b/include/kstddef.h
new file mode 100644 (file)
index 0000000..0d052f0
--- /dev/null
@@ -0,0 +1,253 @@
+/******************************************************************************
+ *
+ * FILE IDENTIFICATION
+ *
+ *     File Name:      STDDEF.H
+ *     Author:         Kevin Rosenberg
+ *     Purpose:        Header file containing KRL standard C definitions
+ *     Date Started:   Dec. 83
+ *
+ * DESCRIPTION
+ *     Header file contains KRL standard C definitions
+ *
+ * MODIFICATION LOG
+ *
+ *****************************************************************************/
+
+#ifndef STDDEF_H
+#define STDDEF_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include "getargs.h"
+
+#undef SHELL
+
+#define STR_MAX_LEN 255
+#define STR_SIZE    STR_MAX_LEN+1
+
+#ifndef bool
+typedef signed int bool;               /* Boolean variable type */
+#endif
+
+typedef unsigned char string[STR_SIZE];
+
+#define UNSIGNLONG unsigned long int
+#define UNSIGNCHAR unsigned char
+
+#define TRUE   1
+#define FALSE  0
+#define OK     TRUE
+#define ERROR  FALSE
+#define YES    TRUE
+#define NO     FALSE
+#define ON     TRUE
+#define OFF    FALSE
+
+/*----------------------------------------------------------------------*/
+
+#define SHOW(var, fmt)  fprintf (stderr, "var = fmt\n", var)
+
+/*----------------------------------------------------------------------*/
+
+#define INTERNAL_FUNC  static
+#define INTERNAL_VAR   static
+
+/*----------------------------------------------------------------------*/
+
+#define        NEWLINE '\n'
+#define        TAB     '\t'
+#define EOS    '\0'
+#define BLANK  ' '
+#define ETX    26      /* end of text signal for PC-DOS */
+
+/*----------------------------------------------------------------------*/
+
+#define MAXPATHNAME  65                /* max length of pathname + 1 */
+#define MAXFILENAME  13                /* rootname(8) + '.'(1) + extension(3) + EOS */
+#define MAXROOTNAME   8
+#define MAXEXTNAME    3
+#define MAXFULLNAME  MAXPATHNAME + MAXFILENAME
+
+/*----------------------------------------------------------------------*/
+
+#define ABS(x)    ((x) < 0 ? -(x) : (x))
+#define SQR(x)    ((x) * (x))
+
+#define MAX(a,b)  ((a) > (b) ? (a) : (b))
+#define MIN(a,b)  ((a) <= (b) ? (a) : (b))
+#define ISWAP(a,b) {int i; i = a; a = b; b = i;}
+
+#define CLIP(n,lb,ub)  if (n < lb) n = lb; else if (n > ub) n = ub
+#define FOREVER         for (;;)
+#define STR_EQUAL(s1,s2) (strcmp (s1, s2) == 0)
+
+/*----------------------------------------------------------------------*/
+
+struct time_st {
+       int hour, minute, second, hs;
+};
+
+struct date_st {
+       int year, month, date, dow;
+};
+
+struct timedate_st {
+    struct time_st t;
+    struct date_st d;
+};
+
+typedef struct time_st TIME;
+typedef struct date_st DATE;
+typedef struct timedate_st TIMEDATE;
+
+/*----------------------------------------------------------------------*/
+
+#define ERR_WARNING    0
+#define ERR_SEVERE     1
+#define ERR_FATAL      2
+
+/*----------------------------------------------------------------------*/
+
+/* codes for open command */
+
+#ifdef LATTICE
+#define OPEN_RDONLY  0x8000            /* Lattice codes for binary i/o */
+#define OPEN_WRONLY  0x8001
+#define OPEN_RDWR    0x8002
+#elif MICROSOFT
+#define OPEN_RDONLY  O_RDONLY                  /* other system use standard codes */
+#define OPEN_WRONLY  O_WRONLY                  /* for binary */
+#define OPEN_RDWR    O_RDWR
+#else
+#define OPEN_RDONLY  0                 /* other system use standard codes */
+#define OPEN_WRONLY  1                 /* for binary */
+#define OPEN_RDWR    2
+#endif
+
+/*----------------------------------------------------------------------*/
+
+/* codes for input (inp_*) routines */
+
+#define INP_ERROR   -1
+#define INP_NO      FALSE
+#define INP_YES     TRUE
+#define INP_NEITHER 'b'
+#define INP_RETURN  'r'
+#define INP_BREAK   0x8000
+
+#ifndef O_BINARY
+#define O_BINARY (0)
+#endif
+
+#ifndef S_IWRITE
+#define S_IWRITE S_IWUSR
+#endif
+
+/* alloc.c */
+void *alloc(unsigned int nbytes);
+/* allocnum.c */
+float *alloc_float(int n);
+double *alloc_double(int n);
+int *alloc_int(int n);
+/* cant.c */
+void cant(const char *fname);
+/* cdate.c */
+char *td_str_cdate(DATE *d);
+char *td_month_name(int n);
+char *td_day_name(int n);
+/* ctoi.c */
+char *ctoi(const char *s, int *ival);
+/* fexist.c */
+int file_exists(const char *fname);
+/* fmax.c */
+double fmax(double a, double b);
+/* get_yn.c */
+int get_yn(const char *prompt);
+/* getbits.c */
+unsigned int getbits(unsigned int x, int p, int n);
+/* getch.c */
+int getch(void);
+void ungetch(int c);
+/* getdate.c */
+DATE *td_get_date(DATE *d);
+/* gettime.c */
+TIME *td_get_time(TIME *t);
+/* iclip.c */
+int iclip(int n, int lb, int ub);
+/* infofn.c */
+int infofn(unsigned int *attrib, long int *filesize, TIMEDATE *td);
+/* irand.c */
+unsigned int irand(unsigned int n);
+/* itostr.c */
+int itostr(int n, char str[], int size);
+/* ltostr.c */
+int ltostr(long val, char *cp, int base);
+/* makefnam.c */
+int makefnam(const char *rawfn, const char *template_str, char *result);
+int getfnam(const char fullname[], char pathname[], char filename[]);
+int getexten(const char *fullname, char *exten);
+int validfn(const char filename[]);
+/* putdec.c */
+void putdec(const int n, int w, FILE *fd_out);
+/* s_clip.c */
+char *str_clip_tail(char *str, unsigned int nclip);
+/* s_esc.c */
+char *str_conv_esc(const char *from, char *to);
+/* s_esc_c.c */
+char *s_esc_char(const char *str, char *c);
+/* s_get.c */
+unsigned int str_get_last_char(const char *str);
+/* s_head.c */
+char *str_skip_head(const char *str, const char *charlist);
+/* s_lower.c */
+char *str_lower(char *s);
+/* s_make.c */
+char *str_make(char *str, int c, const int n);
+/* s_revers.c */
+char *str_reverse(char *s);
+/* s_rmhead.c */
+char *str_wrm_head(char *str);
+char *str_rm_head(char *str, const char *skip_str);
+/* s_rmtail.c */
+char *str_rm_tail(char *str, const char *charlist);
+/* s_save.c */
+char *str_save(const char *s);
+/* s_upper.c */
+char *str_upper(char *str);
+/* s_wtail.c */
+char *str_wrm_tail(char *str);
+/* searchfn.c */
+int searchfn(const char pat[], const unsigned int attrib);
+int getfn(const char name[]);
+/* stime.c */
+double td_current_sec(void);
+double td_time_to_sec(TIME *t);
+TIME *td_time_sub(const TIME *t1, const TIME *t2, TIME *tdiff);
+TIME *td_time_add(const TIME *t1, const TIME *t2, TIME *tsum);
+TIME *td_time_copy(TIME *to, const TIME *from);
+TIME *td_time_norm(TIME *t);
+/* strncmpc.c */
+int strncmpc(const char *s, const char *t, int n);
+/* sysalloc.c */
+void *sys_alloc(const int nbytes, const char *name);
+/* syserror.c */
+void sys_error(int severity, const char *msg, ...);
+void sys_verror(int severity, const char *msg, va_list arg);
+void sys_error_level(int severity);
+/* sysfopen.c */
+FILE *sys_fopen(const char *filename, const char *mode, const char *progname);
+/* sysfree.c */
+void sys_free(void *ptr, const char *name);
+/* timedate.c */
+void td_get_tmdt(TIMEDATE *td);
+const char *td_str_tmdt(const TIMEDATE *td);
+const char *td_str_time(const TIME *t);
+const char *td_str_stime(const TIME *t);
+const char *td_str_date(const DATE *d);
+/* kbasename.c */
+char *kbasename(const char *filename);
+
+#endif
diff --git a/include/pol.h b/include/pol.h
new file mode 100644 (file)
index 0000000..42afdad
--- /dev/null
@@ -0,0 +1,92 @@
+#ifndef __H_POL
+#define __H_POL
+
+/* codes for pol_usefile */
+
+#define P_USE_STR  1           /* use string as input source */
+#define P_USE_FILE 2           /* use file as input source */
+
+/* codes for pol_int and pol_float */
+/* if in reject catagory, get new number from terminal */
+
+#define P_FLTINT   1   /* get a real or integer number */
+#define P_BFLTINT  2   /* get a real or integer number, clip against bounds */
+#define P_CBFLTINT 3   /* get real or int, reject if outside bounds */
+
+#define P_FLT     4    /* get a real number */
+#define P_BFLT     5   /* get a real, clip against bounds */
+#define P_CBFLT    6   /* get a floating, reject if outside bounds */
+
+#define P_INT     7    /* get a integer number */
+#define P_BINT     8   /* get a integer, clip against bounds */
+#define P_CBINT    9   /* get a integer, reject if outside bounds */
+
+#define LETTER   'a'
+#define DIGIT    '0'
+
+#define MAXTOK  200            /* maximum length of a token */
+#define MAXLINE  255
+#define MAXIDENT  20
+#define MAXSKIPWORD 20
+#define MAXSKIPCHAR 20
+
+#define MIN_INT        -32768
+#define MAX_INT  32767
+
+/* token types */
+
+#define TT_STRING       1              /* string token */
+#define TT_INT          2              /* integer token */
+#define TT_REAL                 3              /* floating point token */
+#define TT_ALPHA        4              /* alphabetic token */
+#define TT_ALPNUM       5              /* alphanumeric token */
+#define TT_NUMALPHA     6
+#define TT_SPECLCHAR    7
+
+#define TT_EOF          8              /* end of file reached */
+#define TT_ERROR        9              /* error in token, caused by call to wrong */
+                                       /*  type of token reader */
+#define TT_BLANK       10              /* white space token.  pol_tok() skips these */
+#define TT_USERTOK     11              /* user defined token */
+
+struct symlist {
+       char *name;
+       int code;
+       struct symlist *next;
+};
+
+typedef struct symlist SYMBOL;
+
+struct token_st {
+    int ready;                         /* TRUE if token is ready */
+    char tokstr[MAXTOK+1];             /* token string */
+    int type;                          /* type of token 'TT_' */
+    int code;                          /* holds code for user defined tokens */
+    double fnum;                       /* real value of token */
+    int inum;                          /* integer value of token */
+};
+
+typedef struct token_st TOKEN;
+
+/* pol.c */
+void pol_init(void);
+void pol_skpword(char *w);
+void pol_skpchar(char *s);
+int pol_install(char *str, int code);
+int pol_word(char *search, int nlet);
+int pol_usertok(char *str, int *code);
+int pol_string(char *str);
+int pol_integer(int *n, int typecode, int boundcode, int bb1, int bb2);
+int pol_float(double *n, double typecode, double boundcode, double bb1, double bb2);
+int pol_skip(void);
+void pol_reader(void);
+void gettext(char *str, int lim);
+void pol_usefile(int source, char *fn);
+void pol_closefile(void);
+int pol_lookchar(void);
+int pol_inchar(void);
+void pol_ungetch(int c);
+int get_inputline(FILE *fp);
+void set_inputline(char *line);
+
+#endif
diff --git a/include/sdf.h b/include/sdf.h
new file mode 100644 (file)
index 0000000..e22efe3
--- /dev/null
@@ -0,0 +1,318 @@
+/* FILE IDENTIFICATION\r
+ *\r
+ *     Name:         sdf.h         Header file for Standard Data FIle system\r
+ *     Programmer:   Kevin Rosenberg\r
+ *     Date Started:  9-18-84\r
+ *     Last Change:  12-24-84\r
+ */\r
+\r
+#ifndef __H_SDF\r
+#define __H_SDF\r
+\r
+#include "kmath.h"\r
+\r
+\r
+/*----------------*/\r
+/* SYSTEM ALIASES */\r
+/*----------------*/\r
+\r
+#define SDF_VERSION  2\r
+#define SDF_ID_STR   "SDF"\r
+\r
+/*------------------*/\r
+/* DEFINITION BLOCK */\r
+/*------------------*/\r
+\r
+/* fixed system constants */\r
+\r
+#define BLK_SIZE   256         /* Size of a header block */\r
+#define NUM_DIRBLK   1         /* number of directory blocks */\r
+\r
+/* block types */\r
+\r
+#define BT_EMPTY       0       /* Not being used */\r
+#define BT_DIRECTORY   1       /* First blocks in file */\r
+#define BT_LABEL       2       /* Label block */\r
+\r
+/* label types */\r
+\r
+#define LT_EMPTY         0     /* label record is available for use */\r
+#define LT_TITLE         1     /* descriptive label given by user */\r
+#define LT_HISTORY       2     /* history label generated by application */\r
+                               /* program */\r
+#define LT_NOTE                  3     /* A note created with a label editor */\r
+\r
+/* codes for open_sdf and create_sdf */\r
+\r
+#define SDF_RDONLY  0\r
+#define SDF_WRONLY  1\r
+#define SDF_RDWR    2\r
+\r
+/* function return codes */\r
+\r
+#define SDF_ERROR  ERROR\r
+#define SDF_2D_ERROR SDF_ERROR\r
+#define SDF_OK    OK\r
+\r
+/* types of sdf file, this area is EXPANDABLE */\r
+\r
+#define SDF_FTYPE_2D   10      /* Two-dimensional data file */\r
+\r
+\r
+/* BLOCK IDENTIFICATION\r
+ *\r
+ *   Name: Directory Header Block\r
+ *   Size: Multiple of BLK_SIZE\r
+ *\r
+ * DESCRIPTION\r
+ *    This is the first block of a sdf file.  It contains information on the \r
+ *    size of the users' data plus the number and type of header blocks.\r
+ */\r
+\r
+struct dir_blk_st {\r
+    int block_type;            /* required at the beginning of every block */\r
+                               /* to identify type of block */\r
+\r
+    char id_str[4];            /* identification string == SDF_ID_STR */\r
+    int sdf_version;           /* which version of sdf system == SDF_VERSION */\r
+\r
+    int blk_size;              /* size of a header block in bytes */\r
+\r
+    int df_type;               /* type of data file, used as identification */\r
+                               /* by application programs */\r
+\r
+    unsigned int num_dirblk;   /* number of directory header blocks */\r
+                               /* currently, only 1 block long */\r
+     \r
+/* label directory */\r
+\r
+     unsigned int start_label; /* starting position of label header blocks */\r
+     unsigned int num_label;   /* number of label header blocks */\r
+\r
+/* data header info */\r
+\r
+    unsigned int start_dhead;  /* block number of the start of the users' */\r
+                               /* data header blocks */\r
+    unsigned int num_dhead;    /* number of data header blocks */\r
+    unsigned int dhead_len;    /* length of data header in bytes */\r
+\r
+/* data record info */\r
+\r
+    unsigned int start_drec;   /* block number of start of data records */\r
+    unsigned int num_drec;     /* number of of user data records */\r
+    unsigned int drec_size;    /* size of users' record */\r
+    int num_dval;              /* number of values in each data record */\r
+    int dval_size;             /* size of data value in bytes */\r
+                               /* NOTE:  drec_size = dval_size * num_dval */\r
+};\r
+\r
+\r
+/* BLOCK IDENTIFICATION\r
+ *\r
+ *    Name:  Label block\r
+ *    Size:  BLK_SIZE\r
+ *\r
+ * DESCRIPTION                              \r
+ *        This block contains both user and history labels.  Labels are alpha-\r
+ *     numeric.  History labels include time & date stamp plus calculation time.  \r
+ */\r
+\r
+#define LABEL_LEN        159    /* size of alphanumeric label */\r
+#define LABELS_PER_BLOCK  1\r
+                               /* number of labels in each block */\r
+\r
+struct label_blk_st {\r
+    int block_type;            /* required at the beginning of every block */\r
+    int label_type;            /* type of label */\r
+    char label_str[LABEL_LEN+1];/* alpha numeric label */\r
+\r
+/* history label time stamping */\r
+\r
+    TIMEDATE timedate;         /* time and date of operation */\r
+    float calc_time;           /* calculation time in seconds */\r
+};\r
+\r
+\r
+/* BLOCK IDENTIFICATION\r
+ *\r
+ *     Name:  Data Header Block\r
+ *     Size:  Variable, but always integer multiple of BLK_SIZE\r
+ *\r
+ * DESCRIPTION\r
+ *       This block hold information entirely specific to the data in the sdf \r
+ *     file, such as the user coordinates of the extent of an image, or the\r
+ *     the rotation increment of raysum data.  When an application program\r
+ *     reads or writes the data header, it passes the size in bytes of the\r
+ *     data header to be read or written.  If the length of a data header\r
+ *     being read doesn't match the length of the data header in the file,\r
+ *     the header is still read, but a WARNING message is given.\r
+ */\r
+\r
+\r
+\r
+/* STRUCTURE IDENTIFICATION\r
+ *\r
+ *     Name:  Data File Structure       Contains all information on open files\r
+ *\r
+ * DESCRIPTION\r
+ *        This structure is generated by open_file() and create_file(), it is\r
+ *     passed to all subroutines of the sdf system.\r
+ */\r
+\r
+struct sdfile_st {\r
+    bool open;                 /* if file is open or not */\r
+    int  mode;                 /* read-write mode */\r
+    int  fd;                   /* file descriptor gotten from C library */\r
+    bool error;                        /* TRUE if error occurred, all further */\r
+                               /* procesing is stopped */\r
+    bool error_report;         /* Error reporting flag */\r
+\r
+    unsigned int blk_size;     /* size of a header block */\r
+    unsigned int num_dirblk;   /* number of directory header blocks */\r
+    char fname[MAXFULLNAME+1]; /* operating system filename */\r
+\r
+    int df_type;               /* identification type of data file */\r
+\r
+/* variables that are used when writing to a file, they define what parts\r
+ * of the file have been written\r
+ */\r
+\r
+    struct wrt {\r
+       unsigned dir : 1;       /* 1 if directory header has been written */\r
+       unsigned label : 1;     /* 1 if labels have been written */\r
+       unsigned dhead : 1;     /* 1 if data header has been written */\r
+       unsigned drec : 1;      /* 1 when data records have been written */\r
+    } written;\r
+\r
+/* Directory information to have about the file */\r
+\r
+    unsigned int start_label;  /* starting position of labels */\r
+    unsigned int num_label;    /* number of labels in file */\r
+\r
+    unsigned int dhead_len;    /* length of data header in bytes */\r
+\r
+    unsigned int num_drec;     /* number of data records */\r
+    unsigned int drec_size;    /* size of data records in bytes */\r
+    int num_dval;              /* number of values in each data record */\r
+    int dval_size;             /* size of data value in bytes */\r
+                               /* NOTE:  drec_size = dval_size * num_dval */\r
+\r
+/* ffset pointers into sdf file */\r
+\r
+    long int pos_dhead;                /* starting position of data header */\r
+    long int pos_drec;         /* starting position of users' data */\r
+};\r
+\r
+\r
+union sdf_blk_un {\r
+    char buf[BLK_SIZE];\r
+    struct dir_blk_st   dir;\r
+    struct label_blk_st lab;\r
+};\r
+\r
+typedef struct dir_blk_st      DIR_BLK;\r
+typedef struct label_blk_st    LABEL_BLK;\r
+typedef struct sdfile_st       SDFILE;\r
+typedef union  sdf_blk_un      SDF_BLK;\r
+\r
+\r
+/*----------------------------------------------------------------------*/\r
+/*             2-Dimensional Standard Data File Header                 */\r
+/*----------------------------------------------------------------------*/\r
+\r
+\r
+/* STRUCTURE IDENTIFICATION\r
+ *\r
+ *     Name:  sdf_2d_dhead_st          Data header for 2d data files\r
+ *\r
+ * DESCRIPTION\r
+ *\r
+ *         This structure holds the data that is stored in an image sdf file's\r
+ *     data header.  It contains all data needed to use 2d data records\r
+ */\r
+\r
+struct sdf_2d_dhead_st {\r
+       int file_type;          /* type of data making up this file */\r
+                               /* currenty, DFT_2D_IMAGE or DFT_2D_RAYSUM */\r
+       int nx;                 /* number of rows */\r
+       int ny;                 /* number of columns in row */\r
+       int val_type;           /* type of pixel value, eg, DT_FLOAT */\r
+       int val_size;           /* size of pixel value in bytes */\r
+\r
+       bool axis_ext_kwn;      /* TRUE if picture extent is known */\r
+                               /* stored in xmin,xmax,ymin,ymax */\r
+       double xmin, ymin;      /* position of lower left corner of picture */\r
+       double xmax, ymax;      /* position of upper right corner of picture */\r
+\r
+       bool axis_incr_kwn;     /* TRUE if increments are known */\r
+       double xinc, yinc;\r
+\r
+       bool val_ext_kwn;       /* TRUE if pixel extent is known */\r
+       double dvalmin, dvalmax;/* min & max data value for FLOAT & DOUBLE */\r
+       long lvalmin, lvalmax;  /* data extent for INT & LONG */\r
+};\r
+\r
+\r
+/* STRUCTURE IDENTIFICATION\r
+ *\r
+ *     Name:  sdf_2d_st                        Information about an sdf image\r
+ *\r
+ * DESCRIPTION\r
+ *\r
+ *         This structure holds all the information need to access an sdf\r
+ *     image.\r
+ */\r
+\r
+struct sdf_2d_st {\r
+  struct sdf_2d_dhead_st dhead;        /* image information that is stored in data header */\r
+  SDFILE *dfp;                 /* pointer to image's standard data file */\r
+  MTX *mtx;                    /* data values */\r
+  int memory_only; /* TRUE if sdf_2d file is stored in memory only */\r
+};\r
+\r
+typedef struct sdf_2d_dhead_st  SDF_2D_DHEAD;\r
+typedef struct sdf_2d_st        SDF_2D;\r
+\r
+/* types of 2d data files */\r
+\r
+#define SDF_2D_IMAGE   100             /* data file type is an image */\r
+#define SDF_2D_RAYSUM  101             /* raysum data file type */\r
+\r
+\r
+/* sdf.c */\r
+SDFILE *sdf_open(const char *filename, const int mode);\r
+SDFILE *sdf_create(const char *filename, const int mode, const unsigned int num_drec, const unsigned int num_dval, const int dval_size, const int df_type);\r
+int sdf_read_label(LABEL_BLK *lrec, const int nlab, SDFILE *dfp);\r
+int sdf_write_label(LABEL_BLK *lrec, const int nlab, SDFILE *dfp);\r
+int sdf_add_label(const int ltype, const char *lstr, const double calc_time, SDFILE *dfp);\r
+int sdf_add_empty_label(SDFILE *dfp);\r
+int sdf_copy_labels(SDFILE *dfp_to, SDFILE *dfp_from);\r
+int sdf_read_dhead(void *dh_buf, const unsigned int dhead_len, SDFILE *dfp);\r
+int sdf_write_dhead(const void *dh_buf, const unsigned int dhead_len, SDFILE *dfp);\r
+int sdf_read_drec(void *drec, const int start_rec, const int num_rec, SDFILE *dfp);\r
+int sdf_write_drec(const void *drec, const int start_rec, const int num_rec, SDFILE *dfp);\r
+int sdf_read_dval(void *dval, const int rec, const int start_val, const int num_val, SDFILE *dfp);\r
+int sdf_write_dval(const void *dval, const int rec, const int start_val, const int num_val, SDFILE *dfp);\r
+int sdf_close(SDFILE *dfp);\r
+void sdf_error_report(SDFILE *dfp, const int flag);\r
+void sdf_error(const SDFILE *dfp, const char *str, ...);\r
+bool sdf_check_dfp(const SDFILE *dfp, const int mode, const char *name);\r
+void *sdf_alloc_blk(const int n, SDFILE *dfp, const char *name);\r
+int sdf_free_blk(void *hb, SDFILE *dfp, const char *name);\r
+/* sdf_2d.c */\r
+SDF_2D *sdf_2d_open(const char *fname, const int mode);\r
+SDF_2D *sdf_2d_create(const char *fname, const int mode, const int nx, const int ny, const int val_type, const int df_type);\r
+int sdf_2d_save(SDF_2D *imp);\r
+int sdf_2d_restore(SDF_2D *imp);\r
+int sdf_2d_alloc_mtx(SDF_2D *imp);\r
+int sdf_2d_free_mtx(SDF_2D *sdf_2d);\r
+int sdf_2d_read_row(char *row_buf, const unsigned int row, SDF_2D *imp);\r
+int sdf_2d_write_row(const char *row_buf, const unsigned int row, SDF_2D *imp);\r
+int sdf_2d_read_col(char *col_buf, const unsigned int col, SDF_2D *imp);\r
+int sdf_2d_write_col(const char *col_buf, const unsigned int col, SDF_2D *imp);\r
+int sdf_2d_close(SDF_2D *imp);\r
+char *sdf_2d_alloc_row(const int nrow, SDF_2D *imp);\r
+char *sdf_2d_alloc_col(const int ncol, SDF_2D *imp);\r
+void sdf_2d_error(const SDF_2D *imp, const char *str, ...);\r
+\r
+#endif\r
diff --git a/include/sgp.h b/include/sgp.h
new file mode 100644 (file)
index 0000000..32ac084
--- /dev/null
@@ -0,0 +1,322 @@
+/*----------------------------------------------------------------------*/
+/*                Standard Graphics Package Header File                */
+/*----------------------------------------------------------------------*/
+
+#ifndef __H_SGP
+#define __H_SGP
+
+#include "kstddef.h"
+
+/* Write modes for CPIX_?????() routines */
+
+#define CPIX_WRT       0
+#define CPIX_XOR       1
+#define CPIX_AND       2
+#define CPIX_OR                3
+
+/* device names */
+
+#define CRTDEV  1
+#define PRTDEV  2
+#define MEMDEV  4
+#define FILEDEV 8
+
+/* linestyles */
+
+#define LS_NOLINE 0
+#define LS_SOLID  0xffff
+#define LS_DASH1  0xff00
+#define LS_DASH2  0xf0f0
+#define LS_DASH3  0xcccc
+#define LS_DASH4  0xff3e
+#define LS_DOTTED 0xaaaa
+
+#define MAXDASH           4
+#define MAXCOLOR   63
+
+/* data structures */
+
+struct device_st {
+       int open;                       /* TRUE if device is open for output */
+       int xsize, ysize;               /* Size of device in pixels */
+       int xmin, ymin;                 /* smallest coordinates */
+       int xmax, ymax;                 /* Maximum coordinates */
+       int colormax;                   /* Maximum color number of device */
+       int style;                      /* Current linestyle of device */
+       int width;                      /* Current width of device */
+       int color;                      /* Current color of device */
+       int icurx, icury;               /* Current position */
+       int icwidth, icheight;          /* Size of characters in pixels */
+       int cfore, cback;               /* Character foregnd & backgnd colors */
+       float asp;                      /* Aspect ratio.  Multipy x coord */
+       int (*dotfunc)(int x1, int y1, int color);              /* Dot function for device */
+       int (*linefunc)(int x1, int y1, int x2, int y2, int color);             /* Line function for device */
+       unsigned int nbytes;            /* Size of buffer in bytes */
+       char *buf;                      /* Pointer to buffer */
+       unsigned int bufseg, bufoff;    /* Buffer memory location */
+       int mode;                       /* Device mode */
+};
+
+struct charsp_st {
+       float width, height;            /* size of characters in NDC */
+       float textangle;                /* text angle in radians */
+       float charupangle;              /* character up angle */
+       int font;                       /* font for characters */
+       int updir, textdir;             /* text direct & character orientation */
+       int fore, back;                 /* foreground & background color */
+                                       /* if back = -1, then transparent back */
+};
+
+struct state_st {
+       int foregnd, backgnd;           /* current foregound & background colors */
+       int linestyle;                  /* current 16 bit linestyle */
+       int linewidth;                  /* current width of line (in pixels) */
+       int marktype;                   /* current marker type */
+       int markcolor;                  /* current marker color */
+       float xndc, yndc;               /* current position in NDC */
+};
+
+typedef struct device_st DEVICE;
+typedef struct charsp_st CHARSPEC;
+typedef struct state_st GRFSTATE;
+
+struct point   {double x, y, z;};
+
+
+/******************************************************************
+ *                                                               *
+ *   GRAPH.H                                                     *
+ *                                                               *
+ *   Max R. Dursteler    Dec 1983                                *
+ *   12405 Village Square Terrace                                *
+ *   Rockville Md. 20852                                         *
+ ******************************************************************
+ */
+
+/* Constants */
+
+/* Flagcodes for motion directions */
+#define XPLUS  001     /* right */
+#define XMINUS 002     /* left */
+#define YPLUS  004     /* up */
+#define YMINUS 010     /* down */
+
+/* Codes for marker symbols */
+#define POINT   0      /* small dot */
+#define SQUARE  1      /* empty square */
+#define FSQUARE  2     /* filled square */
+#define DIAMOND  3     /* empty diamond */
+#define FDIAMOND 4     /* filled diamond */
+#define CROSS   5      /* cross */
+#define XCROSS  6      /* x */
+#define CERCLE  7      /* open circle */
+#define FCERCLE  8     /* filled circle */
+#define BSQUARE  9     /* big open square */
+#define BDIAMOND 10    /* big open diamond */
+
+#define NMARKERS 11    /* Number of available symbol types */
+
+/*-------------------------------------------------------------------------*/
+
+#define PSET   0               /* codes for raster merging */
+#define PRESET 1
+#define OR     2
+#define AND    3
+#define XOR    4
+
+/*-------------------------------------------------------------------------*/
+
+#define X_STKMIN  10           /* joystick specific values */
+#define X_STKMAX 313
+#define Y_STKMIN  10
+#define Y_STKMAX 313
+
+#define X_LOCMAX  (X_STKMAX - X_STKMIN);       /* range from readloc() */
+#define Y_LOCMAX  (Y_STKMAX - Y_STKMIN);       /*   = 0 to LOCMAX */
+
+#define JOYSTK1   0            /* device names */
+#define JOYSTK2   1
+
+#define BUTT_DONE  2           /* Right joystick button to end a command */
+#define BUTT_START 1           /* Left joystick button to start a command */
+#define BUTT_BOTH  3           /* Both buttons pressed */
+
+#define RL_ERROR  -1           /* readloc() return codes */
+#define RL_OFF     0
+#define RL_ON     1
+
+/*-------------------------------------------------------------------------*/
+
+struct raster_st {
+    int type;
+    int xmin, ymin;
+    int xmax, ymax;
+};
+
+typedef struct raster_st RASTER;
+
+/*-------------------------------------------------------------------------*/
+
+typedef double GRFMTX_2D[3][3];
+typedef double GRFMTX_3D[4][4];
+
+
+/* circle.c */
+void circle(const double r);
+void drawarc(double start, double stop, const double r);
+/* cliprect.c */
+int cliprect(double *x1, double *y1, double *x2, double *y2, const double rect[4]);
+/* crt_line.c */
+void crt_line(int x1, int y1, int x2, int y2, int color);
+int prtline(int func, int x1, int y1, int x2, int y2, int arg1, int arg2);
+void crt_line_style(int style);
+/* crt_wdot.c */
+void crt_wdot(int x, int y, int c);
+void ega_wdot(int x, int y, int c);
+void prtdot(int x, int y, int c);
+void prtndc(void);
+void cpix_set(int x, int y, int c);
+void cpix_init(void);
+void cpix_set_wrt_mode(int mode);
+void cpix_calc_addr(void);
+void cpix_set_addr(int addr);
+void cpix_inc_col(void);
+int cpix_get_addr(void);
+void cpix_term(void);
+void cpix_setcolor(int c);
+void cpix_set_at_addr(int addr, int c);
+void cpix_inc_row(void);
+void cpix_set_color(int c);
+/* ctm.c */
+int ctm_xlat_pre_2(double x, double y);
+int ctm_xlat_post_2(double x, double y);
+int ctm_scale_pre_2(double sx, double sy);
+int ctm_scale_post_2(double sx, double sy);
+int ctm_rotate_pre_2(double theta);
+int ctm_rotate_post_2(double theta);
+int ctm_shear_pre_2(double shrx, double shry);
+int ctm_shear_post_2(double shrx, double shry);
+int xlat_gmtx_2(GRFMTX_2D m, double x, double y);
+int scale_gmtx_2(GRFMTX_2D m, double sx, double sy);
+int shear_gmtx_2(GRFMTX_2D m, double shrx, double shry);
+int rotate_gmtx_2(GRFMTX_2D m, double theta);
+int ident_gmtx_2(GRFMTX_2D m);
+int mult_gmtx_2(GRFMTX_2D a, GRFMTX_2D b, GRFMTX_2D c);
+int invert_gmtx_2(GRFMTX_2D a, GRFMTX_2D b);
+double determ_gmtx_2(GRFMTX_2D a);
+/* drawbox.c */
+int drawbox(double xmin, double ymin, double xmax, double ymax);
+/* gp.c */
+int gptrace(int state);
+int viewprt3(double xmin, double ymin, double zmin, double xmax, double ymax, double zmax);
+int window3(double xmin, double ymin, double xmax, double ymax);
+int setproj(int pr, double x, double y, double z);
+int setvrp(double x, double y, double z);
+int setvpn(double x, double y, double z);
+int setvup(double x, double y, double z);
+int viewdepth(double front, double back);
+int gpfrontclip(int on_off);
+int gpbackclip(int on_off);
+int calcnper(void);
+int calcnpar(void);
+int calcrot(double rot[5][5]);
+int calcpertrans(void);
+int calcpartrans(void);
+int matident(double mtx[5][5]);
+int matmult(double premtx[5][5], double postmtx[5][5], double result[5][5]);
+int crossprod(struct point *v, struct point *w, struct point *result);
+int transform(double mtx[5][5], double *x, double *y, double *z);
+int homotrans(double mtx[5][5], double *x, double *y, double *z, double *w);
+int moveabs3(double x, double y, double z);
+int moverel3(double xr, double yr, double zr);
+int lineabs3(double x, double y, double z);
+int linerel3(double xr, double yr, double zr);
+int drawline(double xinput, double yinput, double zinput);
+int mastertondc(double *x, double *y, double *z);
+int checkchange(void);
+int initgrf3(void);
+int termgrf3(void);
+int matwrite(double mtx[5][5]);
+int pyr_edge(double x, double y, double z, int *pos);
+int clippyramid(double *x1, double *y1, double *z1, double *x2, double *y2, double *z2, int *accept);
+int cube_edge(double x, double y, double z, int *pos);
+int clipcube(double *x1, double *y1, double *z1, double *x2, double *y2, double *z2, int *accept);
+/* pickbox.c */
+int pickbox(int dev, int *xmin, int *ymin, int *xmax, int *ymax, int xtab[], int ytab[]);
+/* pickloc.c */
+int pickloc(int dev, int *xloc, int *yloc, int xtab[], int ytab[]);
+/* pixblock.c */
+int readblock(char array[], int x1, int y1, int x2, int y2);
+int writeblock(char array[], int x1, int y1, int mode);
+char *allocblock(int x1, int y1, int x2, int y2);
+/* readloc.c */
+int readloc(int dev, int *x, int *y);
+int loc_to_ndc(int xloc, int yloc, float *xndc, float *yndc);
+int readbutt(int dev);
+/* sgp.c */
+int gp_init_2(void);
+int window2(double xmin, double ymin, double xmax, double ymax);
+int window_2(double xmin, double ymin, double xmax, double ymax);
+int viewprt2(double xmin, double ymin, double xmax, double ymax);
+int viewport_2(double xmin, double ymin, double xmax, double ymax);
+int framevpt(void);
+int calc_wc_to_ndc(void);
+int calc_ndc_to_mc(void);
+int wc_to_ndc(double xw, double yw, double *xn, double *yn);
+int ndc_to_wc(double xn, double yn, double *xw, double *yw);
+int color(int icol);
+int linestyle(int style);
+int line_abs_2(double x, double y);
+int lineabs2(double x, double y);
+int move_abs_2(double x, double y);
+int moveabs2(double x, double y);
+int line_rel_2(double x, double y);
+int linerel2(double x, double y);
+int move_rel_2(double x, double y);
+int moverel2(double x, double y);
+int draw_text(char *message);
+int drawtext(char *message);
+int polylnabs2(double x[], double y[], int n);
+int markabs2(double x, double y);
+int markrel2(double x, double y);
+int pntabs2(double x, double y);
+int pntrel2(double x, double y);
+int ctm_clr_2(void);
+int ctm_get_2(GRFMTX_2D m);
+int ctm_set_2(GRFMTX_2D m);
+int ctm_pre_mult_2(GRFMTX_2D m);
+int ctm_post_mult_2(GRFMTX_2D m);
+/* sgpdrive.c */
+int initgrf2(void);
+int initdevice(int dev, int mode, int xsize, int ysize);
+int opendevice(int dev);
+int closedevice(int dev);
+int termdevice(int dev);
+void stylus(double x, double y, int beam);
+int pntndc(double x, double y);
+int markndc(double x, double y);
+GRFSTATE *inqstate(void);
+int gp_set_aspect(int dev, double asp);
+void setlinestyle(int style);
+int setlinewidth(int wid);
+DEVICE *inqdev(int dev);
+int settext(double width, double height, double textangle, int font);
+int settextclr(int fore, int back);
+int setcolor(int fore);
+int setbackg(int back);
+int initmarker(int marker, int color);
+int settextdir(int direction);
+int charsize(double wid, double height);
+int textangle(double angle);
+int drivtext(char *message);
+int termgrf2(void);
+int flushdevice(int dev);
+/* sgptext.c */
+int wrtsymbol(int sym, int x, int y, DEVICE *dev);
+int wrtchar(int ch, int x, int y, CHARSPEC *cspec, DEVICE *dev);
+int wrttext(char txtstr[], int x, int y, CHARSPEC *cspec, DEVICE *dev);
+void crtcolor(int mode, int *f, int *b);
+/* trackloc.c */
+int trackloc(int dev, int *xloc, int *yloc, int (*loc_on)(int x, int y), int (*loc_off)(int x, int y));
+
+#endif
diff --git a/include/stamp-h b/include/stamp-h
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/include/stamp-h.in b/include/stamp-h.in
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..e9de238
--- /dev/null
@@ -0,0 +1,251 @@
+#!/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 "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+               chmodcmd=""
+       else
+               instcmd=mkdir
+       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 -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       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
+               true
+       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
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; 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
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# 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 true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/man/Makefile b/man/Makefile
new file mode 100644 (file)
index 0000000..163dc6c
--- /dev/null
@@ -0,0 +1,239 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /opt/ctsim
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/ctsim
+pkglibdir = $(libdir)/ctsim
+pkgincludedir = $(includedir)/ctsim
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+INSTALL_STRIP_FLAG =
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = gawk
+CC = gcc
+MAKEINFO = makeinfo
+PACKAGE = ctsim
+RANLIB = ranlib
+VERSION = 0.5.0
+X_BASIC_LIBS = -lXext -lX11
+X_CFLAGS =  -I/usr/X11R6/include
+X_EXTRA_LIBS = 
+X_LIBS =  -L/usr/X11R6/lib
+X_PRE_LIBS =  -lSM -lICE
+X_TOOLKIT_LIBS = -lXt
+cgibindir = /opt/apache/cgi-bin
+cgibinurl = /cgi-bin
+cgiprograms = ctsim.cgi
+ctlamlibs = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+ctlibs = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+htmldata = ctsim.html
+htmldir = /opt/apache/htdocs/ctsim
+lamdir = /opt/lam
+lamprograms = ctrec-lam phm2sdf-lam phm2rs-lam
+my_includes =  -I../include -I..
+webdatadir = /opt/apache/htdocs/ctsim/webdata
+webdataurl = /ctsim/webdata
+webenabled = true
+
+man_MANS = ctrec.1 phm2rs.1 phm2sdf.1 sdf2img.1 sdfinfo.1
+EXTRA_DIST = $(man_MANS)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+man1dir = $(mandir)/man1
+MANS = $(man_MANS)
+
+NROFF = nroff
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-man1:
+       $(mkinstalldirs) $(DESTDIR)$(man1dir)
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
+         $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
+       done
+
+uninstall-man1:
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
+         rm -f $(DESTDIR)$(man1dir)/$$inst; \
+       done
+install-man: $(MANS)
+       @$(NORMAL_INSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) install-man1
+uninstall-man:
+       @$(NORMAL_UNINSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) uninstall-man1
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = man
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu man/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-man
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-man
+uninstall: uninstall-am
+all-am: Makefile $(MANS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(mandir)/man1
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: install-man1 uninstall-man1 install-man uninstall-man tags \
+distdir info-am info dvi-am dvi check check-am installcheck-am \
+installcheck install-exec-am install-exec install-data-am install-data \
+install-am install uninstall-am uninstall all-redirect all-am all \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/man/Makefile.am b/man/Makefile.am
new file mode 100644 (file)
index 0000000..11c7702
--- /dev/null
@@ -0,0 +1,2 @@
+man_MANS=ctrec.1 phm2rs.1 phm2sdf.1 sdf2img.1 sdfinfo.1
+EXTRA_DIST = $(man_MANS)
diff --git a/man/Makefile.in b/man/Makefile.in
new file mode 100644 (file)
index 0000000..7975ec5
--- /dev/null
@@ -0,0 +1,239 @@
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_FLAG =
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = @AWK@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+X_BASIC_LIBS = @X_BASIC_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_TOOLKIT_LIBS = @X_TOOLKIT_LIBS@
+cgibindir = @cgibindir@
+cgibinurl = @cgibinurl@
+cgiprograms = @cgiprograms@
+ctlamlibs = @ctlamlibs@
+ctlibs = @ctlibs@
+htmldata = @htmldata@
+htmldir = @htmldir@
+lamdir = @lamdir@
+lamprograms = @lamprograms@
+my_includes = @my_includes@
+webdatadir = @webdatadir@
+webdataurl = @webdataurl@
+webenabled = @webenabled@
+
+man_MANS = ctrec.1 phm2rs.1 phm2sdf.1 sdf2img.1 sdfinfo.1
+EXTRA_DIST = $(man_MANS)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES = 
+man1dir = $(mandir)/man1
+MANS = $(man_MANS)
+
+NROFF = nroff
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-man1:
+       $(mkinstalldirs) $(DESTDIR)$(man1dir)
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
+         $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
+       done
+
+uninstall-man1:
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
+         rm -f $(DESTDIR)$(man1dir)/$$inst; \
+       done
+install-man: $(MANS)
+       @$(NORMAL_INSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) install-man1
+uninstall-man:
+       @$(NORMAL_UNINSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) uninstall-man1
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = man
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu man/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-man
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-man
+uninstall: uninstall-am
+all-am: Makefile $(MANS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(mandir)/man1
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: install-man1 uninstall-man1 install-man uninstall-man tags \
+distdir info-am info dvi-am dvi check check-am installcheck-am \
+installcheck install-exec-am install-exec install-data-am install-data \
+install-am install uninstall-am uninstall all-redirect all-am all \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/man/ctrec.1 b/man/ctrec.1
new file mode 100644 (file)
index 0000000..4e13b12
--- /dev/null
@@ -0,0 +1,63 @@
+.\"  -*- nroff -*-
+.\"
+.\" ctrec.1
+.\"
+.\" Author: Kevin Rosenberg <kevin@rosenberg.net>
+.\"
+.\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+.\"                    All rights reserved
+.\"
+.\" Created: Thu Apr 20 07:54:42 MDT 2000
+.\"
+.\" $Id: ctrec.1,v 1.1 2000/04/28 13:02:44 kevin Exp $
+.\"
+.Dd April 19, 2000
+.Dt CTREC 1
+.Os
+.Sh NAME
+.Nm ctrec
+.Nd Image Reconstruction (reconstruct computed tomography data)
+.Sh SYNOPSIS
+.Nm ctrec raysum-file image-file nx-image ny-image [OPTIONS]
+.Sh DESCRIPTION 
+.Nm
+reconstucts image data from raysum projections collected by CT scanner. It uses
+.Xr rs 1
+for projection data generation. 
+.Pp
+.Nm
+is configured to use a variety of reconstruction filters.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl Fl interp Ar interp-method
+Select interpolation mode (default is linear)
+.It Fl Fl filter Ar filter-name
+Select filter for reconstruction
+.It Fl Fl filter-param Ar x
+Set alpha level for Hamming filter
+.It Fl Fl backproj Ar bj-method
+Select backprojection method (default is diff2)
+.It Fl Fl desc Ar description
+Save description in image file
+.It Fl Fl trace Ar level
+Set trace level (default is none)
+.It Fl Fl verbose
+Turn on verbose mode
+.It Fl Fl debug
+Turn on debug mode
+.It Fl Fl version
+Print version
+.It Fl Fl help
+Print terse help summary
+.Sh AUTHORS
+Kevin Rosenberg, M.D. <kevin@rosenberg.net>
+.Sh HISTORY
+.Nm
+was first written in 1983 using MS-DOS and an EGA display adapter. In 1999 it was ported to GNU/Linux.
+.Sh SEE ALSO
+.Xr phm2sdf 1 ,
+.Xr phm2rs 1 ,
+.Xr rs2sdf 1 ,
+.Xr sdf2img 1 ,
+.Xr sdfinfo 1
\ No newline at end of file
diff --git a/man/phm2rs.1 b/man/phm2rs.1
new file mode 100644 (file)
index 0000000..295a276
--- /dev/null
@@ -0,0 +1,60 @@
+.\"  -*- nroff -*-
+.\"
+.\" phm2rs.1
+.\"
+.\" Author: Kevin Rosenberg <kevin@rosenberg.net>
+.\"
+.\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+.\"                    All rights reserved
+.\"
+.\" Created: Thu Apr 20 07:54:42 MDT 2000
+.\"
+.\" $Id: phm2rs.1,v 1.1 2000/04/28 13:02:44 kevin Exp $
+.\"
+.Dd April 19, 2000
+.Dt PHM2RS 1
+.Os
+.Sh NAME
+.Nm phm2rs
+.Nd Raysum generation (Simulation of CT data collection)
+.Sh SYNOPSIS
+.Nm phm2rs outfile ndet nview [--phantom phantom-name] [--picfile filename] [OPTIONS]
+.Sh DESCRIPTION 
+.Nm
+generates raysum from phantom objects. 
+.Nm 
+simulates the collection of CT data.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl Fl phantom Ar predefined-phantom-name
+Selects a predefined phantom name
+.It Fl Fl picfile Ar picfile
+Reads a picture file that defines a phantom
+.It Fl Fl rotangle Ar angle
+Angle to rotate projections, multiple of PI (default is 1)
+.It Fl Fl inmemory
+Use RAM for temporary storage
+.It Fl Fl desc Ar description
+Save description in image file
+.It Fl Fl trace Ar level
+Set trace level (default is none)
+.It Fl Fl verbose
+Turn on verbose mode
+.It Fl Fl debug
+Turn on debug mode
+.It Fl Fl vephm2rsion
+Print vephm2rsion
+.It Fl Fl help
+Print tephm2rse help summary
+.Sh AUTHOPHM2RS
+Kevin Rosenberg, M.D. <kevin@rosenberg.net>
+.Sh HISTORY
+.Nm
+was fiphm2rst written in 1983 using MS-DOS and an EGA display adapter. In 1999 it was ported to GNU/Linux.
+.Sh SEE ALSO
+.Xr ctrec 1 ,
+.Xr phm2sdf 1 ,
+.Xr rs2img 1 ,
+.Xr sdf2img 1 ,
+.Xr sdfinfo 1
\ No newline at end of file
diff --git a/man/phm2sdf.1 b/man/phm2sdf.1
new file mode 100644 (file)
index 0000000..45a4473
--- /dev/null
@@ -0,0 +1,63 @@
+.\"  -*- nroff -*-
+.\"
+.\" phm2sdf.1
+.\"
+.\" Author: Kevin Rosenberg <kevin@rosenberg.net>
+.\"
+.\" Created: Thu Apr 20 07:54:42 MDT 2000
+.\"
+.\" $Id: phm2sdf.1,v 1.1 2000/04/28 13:02:44 kevin Exp $
+.\"
+.Dd April 19, 2000
+.Dt PHM2SDF 1
+.Os
+.Sh NAME
+.Nm phm2sdf
+.Nd Generate Phantom (generate phantom for computed tomography simulator)
+.Sh SYNOPSIS
+.Nm phm2sdf outfile nx ny [--phantom phantom-name] [--picfile filename] [OPTIONS]
+.Sh DESCRIPTION 
+.Nm
+generates phantom images for comparisons to reconstructions for CTsim.
+.Pp
+.Nm
+is configured to use a variety of options for phantom generation.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl Fl phantom Ar predefined-phantom-name
+Selects a predefined phantom name
+.It Fl Fl picfile Ar picfile
+Reads a picture file that defines a phantom
+.It Fl Fl filter Ar filter-name
+Generate a phantom image from a filter
+.It Fl Fl filter-param Ar x
+Set alpha level for Hamming filter
+.It Fl Fl filter-bw Ar bw
+Filter bandwidth (default is 1)
+.It Fl Fl filter-domain Ar domain
+Set domain to "spatial" or "freq"
+.It Fl Fl nsample Ar n
+Use n samples per X & Y direction for each pixel
+.It Fl Fl trace Ar level
+Set trace level (default is none)
+.It Fl Fl desc Ar description
+Save description in image file
+.It Fl Fl verbose
+Turn on verbose mode
+.It Fl Fl debug
+Turn on debug mode
+.It Fl Fl version
+Print version
+.It Fl Fl help
+Print terse help summary
+.Sh AUTHORS
+Kevin Rosenberg, M.D. <kevin@rosenberg.net>
+.Sh HISTORY
+.Nm
+was first written in 1983 using MS-DOS and an EGA display adapter. In 1999 it was ported to GNU/Linux.
+.Sh SEE ALSO
+.Xr rs2sdf 1 ,
+.Xr ctrec 1 ,
+.Xr sdf2img 1 ,
+.Xr sdfstats 1
\ No newline at end of file
diff --git a/man/sdf2img.1 b/man/sdf2img.1
new file mode 100644 (file)
index 0000000..bdb6928
--- /dev/null
@@ -0,0 +1,63 @@
+.\"  -*- nroff -*-
+.\"
+.\" sdf2img.1
+.\"
+.\" Author: Kevin Rosenberg <kevin@rosenberg.net>
+.\"
+.\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+.\"                    All rights reserved
+.\"
+.\" Created: Thu Apr 20 07:54:42 MDT 2000
+.\"
+.\" $Id: sdf2img.1,v 1.1 2000/04/28 13:02:44 kevin Exp $
+.\"
+.Dd April 19, 2000
+.Dt SDF2IMG 1
+.Os
+.Sh NAME
+.Nm sdf2img
+.Nd SDF (Standard Data File) to Image
+.Sh SYNOPSIS
+.Nm sdf2img sdffile outfile [OPTIONS]
+.Sh DESCRIPTION 
+.Pp
+.Nm 
+converts an 2D SDF file to a viewable image file. 
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl Fl format Ar format-name
+Choose output image format
+.It Fl Fl center Ar center-mode
+Choose center of window (default is mode)
+.It Fl Fl auto Ar auto-mode
+Set automatic window mode (default is full)
+.It Fl Fl scaling Ar multiple
+Set scaling factor for output image (default is 1)
+.It Fl Fl min Ar minimum
+Set minimum intensity of window (overrides --auto)
+.It Fl Fl max Ar maximum
+Set maximum intensity of window (overrides --auto)
+.It Fl Fl stats
+Print image statistics
+.It Fl Fl labels
+Print SDF labels
+.It Fl Fl debug
+Set debug mode
+.It Fl Fl verbose
+Set verbose mode
+.It Fl Fl version
+Print version
+.It Fl Fl help
+Print terse help summary
+.Sh AUTHORS
+Kevin Rosenberg, M.D. <kevin@rosenberg.net>
+.Sh HISTORY
+.Nm
+was first written in 1983 using MS-DOS and an EGA display adapter. In 1999 it was ported to GNU/Linux.
+.Sh SEE ALSO
+.Xr ctrec 1 ,
+.Xr phm2rs 1 ,
+.Xr phm2sdf 1 ,
+.Xr rs2sdf 1 ,
+.Xr sdfinfo 1
\ No newline at end of file
diff --git a/man/sdfinfo.1 b/man/sdfinfo.1
new file mode 100644 (file)
index 0000000..2278463
--- /dev/null
@@ -0,0 +1,55 @@
+.\"  -*- nroff -*-
+.\"
+.\" sdf2info.1
+.\"
+.\" Author: Kevin Rosenberg <kevin@rosenberg.net>
+.\"
+.\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+.\"                    All rights reserved
+.\"
+.\" Created: Thu Apr 20 07:54:42 MDT 2000
+.\"
+.\" $Id: sdfinfo.1,v 1.1 2000/04/28 13:02:44 kevin Exp $
+.\"
+.Dd April 19, 2000
+.Dt SDF2INFO 1
+.Os
+.Sh NAME
+.Nm sdfinfo
+.Nd Print SDF (Standard Data File) Information
+.Sh SYNOPSIS
+.Nm sdfinfo sdffile [OPTIONS]
+.Sh DESCRIPTION 
+.Pp
+.Nm 
+prints information about an SDF file
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl Fl labels
+Print history labels (default)
+.It Fl Fl stats
+Print image statistics (default) 
+.It Fl Fl no-labels
+Do not print history labels
+.It Fl Fl no-stats
+Do not print image statistics
+.It Fl Fl debug
+Set debug mode
+.It Fl Fl verbose
+Set verbose mode
+.It Fl Fl version
+Print version
+.It Fl Fl help
+Print terse help summary
+.Sh AUTHORS
+Kevin Rosenberg, M.D. <kevin@rosenberg.net>
+.Sh HISTORY
+.Nm
+was first written in 1983 using MS-DOS and an EGA display adapter. In 1999 it was ported to GNU/Linux.
+.Sh SEE ALSO
+.Xr ctrec 1 ,
+.Xr phm2rs 1 ,
+.Xr phm2sdf 1 ,
+.Xr rs2sdf 1 ,
+.Xr sdf2img 1
\ No newline at end of file
diff --git a/man/sgp.1 b/man/sgp.1
new file mode 100644 (file)
index 0000000..f6f56d6
--- /dev/null
+++ b/man/sgp.1
@@ -0,0 +1,183 @@
+             Simple Graphics Package (SGP) Documentation
+             -------------------------------------------
+
+
+         Documentation and Software Written by Kevin Rosenberg
+                  Copyright (c) 1984, Kevin Rosenberg
+
+
+
+
+
+                            OVERVIEW
+                            --------
+
+                       +------------------------+
+                       | World Coordinate level |
+                       +-----------+------------+
+                                   |
+                                   |
+                      +------------+-------------+
+                      | Convert to Normalized    |
+                      | device coordinates (NDC) |
+                      +------------+-------------+
+                                   |
+                                   |
+                            +------+-------+           +--------------+
+                            | Segmentation +-----------+ Disk Storage |
+                            +------+-------+           +--------------+
+                                   |
+                      +------------+-------------+
+                      | Convert to Physical      |
+                      | device coordinates (PDC) |
+                      +--------------------------+
+
+
+World Coordinate Level
+----------------------
+     initgrf2 ()                         Initialize 2 dimensional graphics
+     termgrf2 ()                         Terminate 2 dimensional graphics
+     window2  (xmin, ymin, xmax, ymax)   Set window for world coord
+     viewprt2 (xmin, ymin, xmax, ymax)   Viewport for window in NDC
+     moveabs2 (x, y)                     Move graphics cursor
+     moverel2 (dx, dy)
+     pntabs2 (x, y)                      Plot point at current position
+     pntrel2 (dx, dy)
+     lineabs2 (x, y)                    Draw line from current point to point
+     linerel2 (dx, dy)
+     markabs2 (x, y)                     Draw marker at current position
+     markrel2 (dx, dy)
+     polylnabs (x[], y[], n)             Draw a set of lines
+     polylnrel (dx[]. dy[]. n)
+     wc_to_ndc (xwc, ywc, xndc, yndc)    Convert from world coord to NDC
+     ndc_to_wc (xndc, yndc, xwc, ywc)    Convert from NDC to world coord
+     drawtext (str)                      Draw text string at current positon
+
+     INTERNAL:
+          calc_map ()                        Calculate wc to ndc factors
+          clip(rectangle[4], x1, y1, x2, y2) Clip a line againt rectangle
+
+
+Normalized Coordinate level
+--------------------------
+     stylus (x, y, beam)                 Draw a line from current position
+     opendevice (device)                 Open a device for output
+     closedevice (device)                Close a device for output
+     flushdevice (device)                Put all pending data on device
+     inqdev (device, xmax, ymax)         Return data on device
+     setcolor (color)                   Set current drawing color
+     setlinestyle (style)                Set current line style
+     setlinewidth (width)                Set current line width
+     settext (h, w, orientation, dir, font)  Set text attributes
+     settextclr (foreground, background) If back=-1, then transparent backg
+     inqtext(h, w, o, dir, font, fore, back) Get current text attributes
+     charndc (c, xndc, yndc)             Draw char at NDC position
+     textndc (str, xndc, yndc)           Draw text string at NDC position
+
+     setmarker (marker_type, color)      Set marker attibutes
+     markndc (xndc, yndc)                Draw marker at NDC position
+
+     ndc_to_pdc (device, xndc, yndc, xpdc, ypdc)
+     savescrn (filename, xmin, ymin, xmax, ymax)
+     readscrn (filename)
+
+Physical Device Level
+---------------------
+     crtdot (x, y, c)
+     crtline (x1, y1, x2, y2, color, style)
+     wrtchar (char, x, y, dotfunc())
+     wrttext (str, x, y, dotfunc())
+
+     readblock (array, xmin, ymin, xmax, ymax)
+     writeblock (array, xmin, ymin, mode)
+
+     prtdot (x, y, c)
+     prtline (func, x1, y1, x2, y2, color, style)
+
+
+Input Functions
+---------------
+Physical device level
+     joystk (sticknum, x, y)
+
+Normalized Coordinate level
+     readloc (xndc, yndc)
+     inithcur (height, width, color)        Initialize haircross cursor
+     movhcurabs (xndc, yndc)                 Move haircross cursor to point
+     movhcurrel (dxndc, dyndc)               Move relatively
+     termhcur ()                            Turn off haircross cursor
+     readpnt (xndc, yndc)                   Have cursor track joystick
+                                            User press button at desired point
+
+                                DATA STRUCTURES
+                                ---------------
+struct DEVICE {
+     int xsize, ysize;                  Size of device in pixels
+     int xmax, ymax;                   Maximum coordinates
+     int colormax;                      Maximum color number of device
+     int style;                         Current linestyle of device
+     int width;                         Current width of device
+     int color;                         Current color of device
+     int curx, cury;                    Current position
+     int charwidth, charheight;         Size of characters in pixels
+     float aspt                         Aspect ratio  Multiple coord 
+     int (*dot)();                      Dot function for device
+     int (*line)();                    Line function for device
+     int mode;                          Device mode
+};
+
+struct CHARSPEC {
+     float width, height;               size of characters in NDC
+     int dirflag, orientflag            text direction, character orientation
+     int fore, back;                    foreground & background color
+};
+
+struct CURRENT {
+    int color;
+    int linestyle;
+    int linewidth;
+    float xndc, yndc;
+}
+
+            Map directly from world coords to physical device coords
+            --------------------------------------------------------
+
+Window:   xwmin, xwmax, ywmin, ywmax
+Viewport: xvmin, xvmax, yvmin, yvmax
+Physical: xpmax, ypmax
+
+To convert from wc to ndc:
+     xndc = xvmin + (xwc - xwmin) / (xwmax - xwmin)
+     yndc = yvmin + (ywc - ywmin) / (ywmax - ywmin)
+
+To convert from ndc to pdc:
+     xpdc = xndc * xpmax
+     ypdc = yndc * ypmax
+
+So, for each device set up the following composite transformation:
+     xpdc = xpmax * (xvmin + (xwc - xwmin) / (xwmax - xwmin))
+     ypdc = ypmax * (yvmin + (ywc - ywmin) / (ywmax - ywmin))
+
+     xpdc = xpmax * xvmin + (xwc - xwmin) * (xpmax / (xwmax - xwmin))
+          = xadd + (xwc - xsub) * xfact
+
+Characters
+----------
+     Fonts:
+          NORMAL              Regular character set
+          BOLD                Overstike chars with x offset by 1 pixel
+          ITALICS             Shear characters along character height
+
+                       NORMAL   BOLD    ITALICS
+                         X       XX         X
+                        XXX     XXXX      XXX
+                       X   X   XX  XX    X   X
+                       X   X   XX  XX    X   X
+                       XXXXX   XXXXXX   XXXXX
+                       X   X   XX  XX   X   X
+                       X   X   XX  XX   X   X
+
+
+
+
+
diff --git a/missing b/missing
new file mode 100755 (executable)
index 0000000..7789652
--- /dev/null
+++ b/missing
@@ -0,0 +1,190 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# 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.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing - GNU libit 0.0"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`configure.in'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`configure.in'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`configure.in'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f y.tab.h ]; then
+       echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755 (executable)
index 0000000..7a59aab
--- /dev/null
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1 2000/04/28 13:02:44 kevin Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+         errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/r b/r
new file mode 100755 (executable)
index 0000000..836daf5
--- /dev/null
+++ b/r
@@ -0,0 +1,6 @@
+aclocal
+autoconf
+automake
+./configure --prefix=/opt/ctsim --with-cgibin-dir=/opt/apache/cgi-bin --with-cgibin-url=/cgi-bin --with-webdata-dir=/opt/apache/htdocs/ctsim/webdata --with-webdata-url=/ctsim/webdata --with-html-dir=/opt/apache/htdocs/ctsim --with-lam-dir=/opt/lam
+
+
diff --git a/src/Makefile b/src/Makefile
new file mode 100644 (file)
index 0000000..3322437
--- /dev/null
@@ -0,0 +1,449 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /opt/ctsim
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/ctsim
+pkglibdir = $(libdir)/ctsim
+pkgincludedir = $(includedir)/ctsim
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+INSTALL_STRIP_FLAG =
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = gawk
+CC = gcc
+MAKEINFO = makeinfo
+PACKAGE = ctsim
+RANLIB = ranlib
+VERSION = 0.5.0
+X_BASIC_LIBS = -lXext -lX11
+X_CFLAGS =  -I/usr/X11R6/include
+X_EXTRA_LIBS = 
+X_LIBS =  -L/usr/X11R6/lib
+X_PRE_LIBS =  -lSM -lICE
+X_TOOLKIT_LIBS = -lXt
+cgibindir = /opt/apache/cgi-bin
+cgibinurl = /cgi-bin
+cgiprograms = ctsim.cgi
+ctlamlibs = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+ctlibs = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+htmldata = ctsim.html
+htmldir = /opt/apache/htdocs/ctsim
+lamdir = /opt/lam
+lamprograms = ctrec-lam phm2sdf-lam phm2rs-lam
+my_includes =  -I../include -I..
+webdatadir = /opt/apache/htdocs/ctsim/webdata
+webdataurl = /ctsim/webdata
+webenabled = true
+
+bin_PROGRAMS = sdf2img ctrec phm2rs phm2sdf rs2sdf sdf-1 sdf-2 sdfinfo ctrec-lam phm2sdf-lam phm2rs-lam
+bin_SCRIPTS = sample-ctrec.sh
+EXTRA_PROGRAMS = ctrec-lam phm2sdf-lam phm2rs-lam
+INCLUDES =  -I../include -I..
+
+ctrec_SOURCES = ctrec.c 
+ctrec_LDADD = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+phm2rs_SOURCES = phm2rs.c
+phm2rs_LDADD = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+phm2sdf_SOURCES = phm2sdf.c
+phm2sdf_LDADD = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+sdf2img_SOURCES = sdf2img.c
+sdf2img_LDADD = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+rs2sdf_SOURCES = rs2sdf.c
+rs2sdf_LDADD = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+sdf_1_SOURCES = sdf-1.c
+sdf_1_LDADD = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+sdf_2_SOURCES = sdf-2.c
+sdf_2_LDADD = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+sdfinfo_SOURCES = sdfinfo.c 
+sdfinfo_LDADD = -lir  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+
+ctrec_lam_SOURCES = ctrec.c
+ctrec_lam_LDADD = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+phm2sdf_lam_SOURCES = phm2sdf.c
+phm2sdf_lam_LDADD = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+phm2rs_lam_SOURCES = phm2rs.c
+phm2rs_lam_LDADD = -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+
+CC_LAM = $(lamdir)/bin/hcc
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =  sample-ctrec.sh
+PROGRAMS =  $(bin_PROGRAMS)
+
+
+DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I..
+CPPFLAGS = 
+LDFLAGS =  -L/usr/lib -L/opt/lam/lib -L../libezplot -L../libgraph -L../libkmath -L../libk -L../libcio -L../libir
+LIBS = -lm 
+ctrec_lam_OBJECTS =  ctrec.o
+ctrec_lam_DEPENDENCIES = 
+ctrec_lam_LDFLAGS = 
+phm2sdf_lam_OBJECTS =  phm2sdf.o
+phm2sdf_lam_DEPENDENCIES = 
+phm2sdf_lam_LDFLAGS = 
+phm2rs_lam_OBJECTS =  phm2rs.o
+phm2rs_lam_DEPENDENCIES = 
+phm2rs_lam_LDFLAGS = 
+sdf2img_OBJECTS =  sdf2img.o
+sdf2img_DEPENDENCIES = 
+sdf2img_LDFLAGS = 
+ctrec_OBJECTS =  ctrec.o
+ctrec_DEPENDENCIES = 
+ctrec_LDFLAGS = 
+phm2rs_OBJECTS =  phm2rs.o
+phm2rs_DEPENDENCIES = 
+phm2rs_LDFLAGS = 
+phm2sdf_OBJECTS =  phm2sdf.o
+phm2sdf_DEPENDENCIES = 
+phm2sdf_LDFLAGS = 
+rs2sdf_OBJECTS =  rs2sdf.o
+rs2sdf_DEPENDENCIES = 
+rs2sdf_LDFLAGS = 
+sdf_1_OBJECTS =  sdf-1.o
+sdf_1_DEPENDENCIES = 
+sdf_1_LDFLAGS = 
+sdf_2_OBJECTS =  sdf-2.o
+sdf_2_DEPENDENCIES = 
+sdf_2_LDFLAGS = 
+sdfinfo_OBJECTS =  sdfinfo.o
+sdfinfo_DEPENDENCIES = 
+sdfinfo_LDFLAGS = 
+SCRIPTS =  $(bin_SCRIPTS)
+
+CFLAGS = -g -O2 -Wall -I/usr/include -I/opt/lam/include
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in sample-ctrec.sh.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+DEP_FILES =  .deps/ctrec.P .deps/phm2rs.P .deps/phm2sdf.P .deps/rs2sdf.P \
+.deps/sdf-1.P .deps/sdf-2.P .deps/sdf2img.P .deps/sdfinfo.P
+SOURCES = $(ctrec_lam_SOURCES) $(phm2sdf_lam_SOURCES) $(phm2rs_lam_SOURCES) $(sdf2img_SOURCES) $(ctrec_SOURCES) $(phm2rs_SOURCES) $(phm2sdf_SOURCES) $(rs2sdf_SOURCES) $(sdf_1_SOURCES) $(sdf_2_SOURCES) $(sdfinfo_SOURCES)
+OBJECTS = $(ctrec_lam_OBJECTS) $(phm2sdf_lam_OBJECTS) $(phm2rs_lam_OBJECTS) $(sdf2img_OBJECTS) $(ctrec_OBJECTS) $(phm2rs_OBJECTS) $(phm2sdf_OBJECTS) $(rs2sdf_OBJECTS) $(sdf_1_OBJECTS) $(sdf_2_OBJECTS) $(sdfinfo_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+sample-ctrec.sh: $(top_builddir)/config.status sample-ctrec.sh.in
+       cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo "  $(INSTALL_PROGRAM) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+            $(INSTALL_PROGRAM) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       list='$(bin_PROGRAMS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+       done
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+sdf2img: $(sdf2img_OBJECTS) $(sdf2img_DEPENDENCIES)
+       @rm -f sdf2img
+       $(LINK) $(sdf2img_LDFLAGS) $(sdf2img_OBJECTS) $(sdf2img_LDADD) $(LIBS)
+
+ctrec: $(ctrec_OBJECTS) $(ctrec_DEPENDENCIES)
+       @rm -f ctrec
+       $(LINK) $(ctrec_LDFLAGS) $(ctrec_OBJECTS) $(ctrec_LDADD) $(LIBS)
+
+phm2rs: $(phm2rs_OBJECTS) $(phm2rs_DEPENDENCIES)
+       @rm -f phm2rs
+       $(LINK) $(phm2rs_LDFLAGS) $(phm2rs_OBJECTS) $(phm2rs_LDADD) $(LIBS)
+
+phm2sdf: $(phm2sdf_OBJECTS) $(phm2sdf_DEPENDENCIES)
+       @rm -f phm2sdf
+       $(LINK) $(phm2sdf_LDFLAGS) $(phm2sdf_OBJECTS) $(phm2sdf_LDADD) $(LIBS)
+
+rs2sdf: $(rs2sdf_OBJECTS) $(rs2sdf_DEPENDENCIES)
+       @rm -f rs2sdf
+       $(LINK) $(rs2sdf_LDFLAGS) $(rs2sdf_OBJECTS) $(rs2sdf_LDADD) $(LIBS)
+
+sdf-1: $(sdf_1_OBJECTS) $(sdf_1_DEPENDENCIES)
+       @rm -f sdf-1
+       $(LINK) $(sdf_1_LDFLAGS) $(sdf_1_OBJECTS) $(sdf_1_LDADD) $(LIBS)
+
+sdf-2: $(sdf_2_OBJECTS) $(sdf_2_DEPENDENCIES)
+       @rm -f sdf-2
+       $(LINK) $(sdf_2_LDFLAGS) $(sdf_2_OBJECTS) $(sdf_2_LDADD) $(LIBS)
+
+sdfinfo: $(sdfinfo_OBJECTS) $(sdfinfo_DEPENDENCIES)
+       @rm -f sdfinfo
+       $(LINK) $(sdfinfo_LDFLAGS) $(sdfinfo_OBJECTS) $(sdfinfo_LDADD) $(LIBS)
+
+install-binSCRIPTS: $(bin_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_SCRIPTS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+         else if test -f $(srcdir)/$$p; then \
+           echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+         else :; fi; fi; \
+       done
+
+uninstall-binSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       list='$(bin_SCRIPTS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = src
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu src/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+       -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+       @echo '$(COMPILE) -c $<'; \
+       $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.c
+       @echo '$(LTCOMPILE) -c $<'; \
+       $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS install-binSCRIPTS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(bindir) $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-binPROGRAMS mostlyclean-compile \
+               mostlyclean-tags mostlyclean-depend mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-binPROGRAMS clean-compile clean-tags clean-depend \
+               clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-binPROGRAMS distclean-compile distclean-tags \
+               distclean-depend distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-binPROGRAMS \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-depend maintainer-clean-generic \
+               distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile uninstall-binSCRIPTS install-binSCRIPTS tags \
+mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
+distdir mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+ctrec-lam: ctrec.c
+       $(CC_LAM) -DHAVE_CONFIG_H $(CFLAGS) $(INCLUDES) -DMPI_CT ctrec.c -o ctrec-lam $(LDFLAGS) -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+
+phm2sdf-lam: phm2sdf.c
+       $(CC_LAM) -DHAVE_CONFIG_H $(CFLAGS) $(INCLUDES) -DMPI_CT phm2sdf.c -o phm2sdf-lam $(LDFLAGS) -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+
+phm2rs-lam: phm2rs.c
+       $(CC_LAM) -DHAVE_CONFIG_H $(CFLAGS) $(INCLUDES) -DMPI_CT phm2rs.c -o phm2rs-lam $(LDFLAGS) -lir_lam  -lezplot -lgraph -lkmath -lk -lcio -lpng -lz
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644 (file)
index 0000000..32ca90c
--- /dev/null
@@ -0,0 +1,46 @@
+bin_PROGRAMS = sdf2img ctrec phm2rs phm2sdf rs2sdf sdf-1 sdf-2 sdfinfo @lamprograms@
+bin_SCRIPTS = sample-ctrec.sh
+EXTRA_PROGRAMS = ctrec-lam phm2sdf-lam phm2rs-lam
+INCLUDES=@my_includes@
+
+ctrec_SOURCES = ctrec.c 
+ctrec_LDADD=@ctlibs@
+phm2rs_SOURCES=phm2rs.c
+phm2rs_LDADD=@ctlibs@
+phm2sdf_SOURCES = phm2sdf.c
+phm2sdf_LDADD=@ctlibs@
+sdf2img_SOURCES = sdf2img.c
+sdf2img_LDADD=@ctlibs@
+rs2sdf_SOURCES = rs2sdf.c
+rs2sdf_LDADD=@ctlibs@
+sdf_1_SOURCES=sdf-1.c
+sdf_1_LDADD=@ctlibs@
+sdf_2_SOURCES=sdf-2.c
+sdf_2_LDADD=@ctlibs@
+sdfinfo_SOURCES = sdfinfo.c 
+sdfinfo_LDADD=@ctlibs@
+
+ctrec_lam_SOURCES=ctrec.c
+ctrec_lam_LDADD=@ctlamlibs@
+phm2sdf_lam_SOURCES=phm2sdf.c
+phm2sdf_lam_LDADD=@ctlamlibs@
+phm2rs_lam_SOURCES=phm2rs.c
+phm2rs_lam_LDADD=@ctlamlibs@
+
+if USE_LAM
+CC_LAM = $(lamdir)/bin/hcc
+
+ctrec-lam: ctrec.c
+       $(CC_LAM) @DEFS@ $(CFLAGS) $(INCLUDES) -DMPI_CT ctrec.c -o ctrec-lam $(LDFLAGS) @ctlamlibs@
+
+phm2sdf-lam: phm2sdf.c
+       $(CC_LAM) @DEFS@ $(CFLAGS) $(INCLUDES) -DMPI_CT phm2sdf.c -o phm2sdf-lam $(LDFLAGS) @ctlamlibs@
+
+phm2rs-lam: phm2rs.c
+       $(CC_LAM) @DEFS@ $(CFLAGS) $(INCLUDES) -DMPI_CT phm2rs.c -o phm2rs-lam $(LDFLAGS) @ctlamlibs@
+
+endif
+
+
+
+
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644 (file)
index 0000000..1228bf8
--- /dev/null
@@ -0,0 +1,449 @@
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_FLAG =
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = @AWK@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+X_BASIC_LIBS = @X_BASIC_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+X_TOOLKIT_LIBS = @X_TOOLKIT_LIBS@
+cgibindir = @cgibindir@
+cgibinurl = @cgibinurl@
+cgiprograms = @cgiprograms@
+ctlamlibs = @ctlamlibs@
+ctlibs = @ctlibs@
+htmldata = @htmldata@
+htmldir = @htmldir@
+lamdir = @lamdir@
+lamprograms = @lamprograms@
+my_includes = @my_includes@
+webdatadir = @webdatadir@
+webdataurl = @webdataurl@
+webenabled = @webenabled@
+
+bin_PROGRAMS = sdf2img ctrec phm2rs phm2sdf rs2sdf sdf-1 sdf-2 sdfinfo @lamprograms@
+bin_SCRIPTS = sample-ctrec.sh
+EXTRA_PROGRAMS = ctrec-lam phm2sdf-lam phm2rs-lam
+INCLUDES = @my_includes@
+
+ctrec_SOURCES = ctrec.c 
+ctrec_LDADD = @ctlibs@
+phm2rs_SOURCES = phm2rs.c
+phm2rs_LDADD = @ctlibs@
+phm2sdf_SOURCES = phm2sdf.c
+phm2sdf_LDADD = @ctlibs@
+sdf2img_SOURCES = sdf2img.c
+sdf2img_LDADD = @ctlibs@
+rs2sdf_SOURCES = rs2sdf.c
+rs2sdf_LDADD = @ctlibs@
+sdf_1_SOURCES = sdf-1.c
+sdf_1_LDADD = @ctlibs@
+sdf_2_SOURCES = sdf-2.c
+sdf_2_LDADD = @ctlibs@
+sdfinfo_SOURCES = sdfinfo.c 
+sdfinfo_LDADD = @ctlibs@
+
+ctrec_lam_SOURCES = ctrec.c
+ctrec_lam_LDADD = @ctlamlibs@
+phm2sdf_lam_SOURCES = phm2sdf.c
+phm2sdf_lam_LDADD = @ctlamlibs@
+phm2rs_lam_SOURCES = phm2rs.c
+phm2rs_lam_LDADD = @ctlamlibs@
+
+@USE_LAM_TRUE@CC_LAM = $(lamdir)/bin/hcc
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =  sample-ctrec.sh
+PROGRAMS =  $(bin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+ctrec_lam_OBJECTS =  ctrec.o
+ctrec_lam_DEPENDENCIES = 
+ctrec_lam_LDFLAGS = 
+phm2sdf_lam_OBJECTS =  phm2sdf.o
+phm2sdf_lam_DEPENDENCIES = 
+phm2sdf_lam_LDFLAGS = 
+phm2rs_lam_OBJECTS =  phm2rs.o
+phm2rs_lam_DEPENDENCIES = 
+phm2rs_lam_LDFLAGS = 
+sdf2img_OBJECTS =  sdf2img.o
+sdf2img_DEPENDENCIES = 
+sdf2img_LDFLAGS = 
+ctrec_OBJECTS =  ctrec.o
+ctrec_DEPENDENCIES = 
+ctrec_LDFLAGS = 
+phm2rs_OBJECTS =  phm2rs.o
+phm2rs_DEPENDENCIES = 
+phm2rs_LDFLAGS = 
+phm2sdf_OBJECTS =  phm2sdf.o
+phm2sdf_DEPENDENCIES = 
+phm2sdf_LDFLAGS = 
+rs2sdf_OBJECTS =  rs2sdf.o
+rs2sdf_DEPENDENCIES = 
+rs2sdf_LDFLAGS = 
+sdf_1_OBJECTS =  sdf-1.o
+sdf_1_DEPENDENCIES = 
+sdf_1_LDFLAGS = 
+sdf_2_OBJECTS =  sdf-2.o
+sdf_2_DEPENDENCIES = 
+sdf_2_LDFLAGS = 
+sdfinfo_OBJECTS =  sdfinfo.o
+sdfinfo_DEPENDENCIES = 
+sdfinfo_LDFLAGS = 
+SCRIPTS =  $(bin_SCRIPTS)
+
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in sample-ctrec.sh.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+DEP_FILES =  .deps/ctrec.P .deps/phm2rs.P .deps/phm2sdf.P .deps/rs2sdf.P \
+.deps/sdf-1.P .deps/sdf-2.P .deps/sdf2img.P .deps/sdfinfo.P
+SOURCES = $(ctrec_lam_SOURCES) $(phm2sdf_lam_SOURCES) $(phm2rs_lam_SOURCES) $(sdf2img_SOURCES) $(ctrec_SOURCES) $(phm2rs_SOURCES) $(phm2sdf_SOURCES) $(rs2sdf_SOURCES) $(sdf_1_SOURCES) $(sdf_2_SOURCES) $(sdfinfo_SOURCES)
+OBJECTS = $(ctrec_lam_OBJECTS) $(phm2sdf_lam_OBJECTS) $(phm2rs_lam_OBJECTS) $(sdf2img_OBJECTS) $(ctrec_OBJECTS) $(phm2rs_OBJECTS) $(phm2sdf_OBJECTS) $(rs2sdf_OBJECTS) $(sdf_1_OBJECTS) $(sdf_2_OBJECTS) $(sdfinfo_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+sample-ctrec.sh: $(top_builddir)/config.status sample-ctrec.sh.in
+       cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo "  $(INSTALL_PROGRAM) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+            $(INSTALL_PROGRAM) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       list='$(bin_PROGRAMS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+       done
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+sdf2img: $(sdf2img_OBJECTS) $(sdf2img_DEPENDENCIES)
+       @rm -f sdf2img
+       $(LINK) $(sdf2img_LDFLAGS) $(sdf2img_OBJECTS) $(sdf2img_LDADD) $(LIBS)
+
+ctrec: $(ctrec_OBJECTS) $(ctrec_DEPENDENCIES)
+       @rm -f ctrec
+       $(LINK) $(ctrec_LDFLAGS) $(ctrec_OBJECTS) $(ctrec_LDADD) $(LIBS)
+
+phm2rs: $(phm2rs_OBJECTS) $(phm2rs_DEPENDENCIES)
+       @rm -f phm2rs
+       $(LINK) $(phm2rs_LDFLAGS) $(phm2rs_OBJECTS) $(phm2rs_LDADD) $(LIBS)
+
+phm2sdf: $(phm2sdf_OBJECTS) $(phm2sdf_DEPENDENCIES)
+       @rm -f phm2sdf
+       $(LINK) $(phm2sdf_LDFLAGS) $(phm2sdf_OBJECTS) $(phm2sdf_LDADD) $(LIBS)
+
+rs2sdf: $(rs2sdf_OBJECTS) $(rs2sdf_DEPENDENCIES)
+       @rm -f rs2sdf
+       $(LINK) $(rs2sdf_LDFLAGS) $(rs2sdf_OBJECTS) $(rs2sdf_LDADD) $(LIBS)
+
+sdf-1: $(sdf_1_OBJECTS) $(sdf_1_DEPENDENCIES)
+       @rm -f sdf-1
+       $(LINK) $(sdf_1_LDFLAGS) $(sdf_1_OBJECTS) $(sdf_1_LDADD) $(LIBS)
+
+sdf-2: $(sdf_2_OBJECTS) $(sdf_2_DEPENDENCIES)
+       @rm -f sdf-2
+       $(LINK) $(sdf_2_LDFLAGS) $(sdf_2_OBJECTS) $(sdf_2_LDADD) $(LIBS)
+
+sdfinfo: $(sdfinfo_OBJECTS) $(sdfinfo_DEPENDENCIES)
+       @rm -f sdfinfo
+       $(LINK) $(sdfinfo_LDFLAGS) $(sdfinfo_OBJECTS) $(sdfinfo_LDADD) $(LIBS)
+
+install-binSCRIPTS: $(bin_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_SCRIPTS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+         else if test -f $(srcdir)/$$p; then \
+           echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+         else :; fi; fi; \
+       done
+
+uninstall-binSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       list='$(bin_SCRIPTS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = src
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu src/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+       -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+       @echo '$(COMPILE) -c $<'; \
+       $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.c
+       @echo '$(LTCOMPILE) -c $<'; \
+       $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS install-binSCRIPTS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(bindir) $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-binPROGRAMS mostlyclean-compile \
+               mostlyclean-tags mostlyclean-depend mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-binPROGRAMS clean-compile clean-tags clean-depend \
+               clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-binPROGRAMS distclean-compile distclean-tags \
+               distclean-depend distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-binPROGRAMS \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-depend maintainer-clean-generic \
+               distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile uninstall-binSCRIPTS install-binSCRIPTS tags \
+mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
+distdir mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+@USE_LAM_TRUE@ctrec-lam: ctrec.c
+@USE_LAM_TRUE@ $(CC_LAM) @DEFS@ $(CFLAGS) $(INCLUDES) -DMPI_CT ctrec.c -o ctrec-lam $(LDFLAGS) @ctlamlibs@
+
+@USE_LAM_TRUE@phm2sdf-lam: phm2sdf.c
+@USE_LAM_TRUE@ $(CC_LAM) @DEFS@ $(CFLAGS) $(INCLUDES) -DMPI_CT phm2sdf.c -o phm2sdf-lam $(LDFLAGS) @ctlamlibs@
+
+@USE_LAM_TRUE@phm2rs-lam: phm2rs.c
+@USE_LAM_TRUE@ $(CC_LAM) @DEFS@ $(CFLAGS) $(INCLUDES) -DMPI_CT phm2rs.c -o phm2rs-lam $(LDFLAGS) @ctlamlibs@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/ctrec.c b/src/ctrec.c
new file mode 100644 (file)
index 0000000..56297d2
--- /dev/null
@@ -0,0 +1,436 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: ctrec.c,v 1.1 2000/04/28 13:02:44 kevin Exp $
+**  $Log: ctrec.c,v $
+**  Revision 1.1  2000/04/28 13:02:44  kevin
+**  Initial revision
+**
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  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
+******************************************************************************/
+/* FILE
+ *   ctrec.c           Reconstruct an image from raysums
+ *
+ * DATE
+ *   Aug 84
+ *   Jul 99  -- Converted to ANSI C
+ *              Added MPI parallel processing
+ */
+
+#include "ct.h"
+
+#define O_INTERP       1
+#define O_FILTER       2
+#define O_FILTER_PARAM 3
+#define O_BACKPROJ     4
+#define O_VERBOSE      5
+#define O_TRACE        6
+#define O_HELP         7
+#define O_DEBUG        8
+#define O_VERSION      9
+
+static struct option my_options[] =
+{
+  {"interp", 1, 0, O_INTERP},
+  {"filter", 1, 0, O_FILTER},
+  {"filter-param", 1, 0, O_FILTER_PARAM},
+  {"backproj", 1, 0, O_BACKPROJ},
+  {"trace", 1, 0, O_TRACE},
+  {"debug", 0, 0, O_DEBUG},
+  {"verbose", 0, 0, O_VERBOSE},
+  {"help", 0, 0, O_HELP},
+  {"version", 0, 0, O_VERSION},
+  {0, 0, 0, 0}
+};
+
+void 
+usage (const char *program)
+{
+  fprintf(stdout,"usage: %s raysum-file image-file nx-image ny-image [OPTIONS]\n", kbasename(program));
+  fprintf(stdout,"Image reconstruction from raysum projections\n");
+  fprintf(stdout,"\n");
+  fprintf(stdout,"   raysum-file     Input raysum file\n");
+  fprintf(stdout,"   image-file      Output image file in SDF2D format\n");
+  fprintf(stdout,"   nx-image        Number of columns in output image\n");
+  fprintf(stdout,"   ny-image        Number of rows in output image\n");
+  fprintf(stdout,"   --interp        Interpolation method during backprojection\n");
+  fprintf(stdout,"       nearest     Nearest neighbor interpolation\n");
+  fprintf(stdout,"       linear      Linear interpolation\n");
+  fprintf(stdout,"       bspline     B-spline interpolation\n");
+  fprintf(stdout,"    --filter       Filter name\n");
+  fprintf(stdout,"       abs_bandlimit Abs * Bandlimiting (default)\n");
+  fprintf(stdout,"       abs_sinc      Abs * Sinc\n");
+  fprintf(stdout,"       abs_cos       Abs * Cosine\n");
+  fprintf(stdout,"       abs_hamming   Abs * Hamming\n");
+  fprintf(stdout,"       shepp         Shepp-Logan\n");
+  fprintf(stdout,"       bandlimit     Bandlimiting\n");
+  fprintf(stdout,"       sinc          Sinc\n");
+  fprintf(stdout,"       cos           Cosine\n");
+  fprintf(stdout,"       triangle      Triangle\n");
+  fprintf(stdout,"       hamming       Hamming\n");
+  fprintf(stdout,"    --backproj     Backprojection Method\n");
+  fprintf(stdout,"       trig        Trigometric functions at every point\n");
+  fprintf(stdout,"       table       Trigometric functions with precalculated table\n");
+  fprintf(stdout,"       diff        Difference method\n");
+  fprintf(stdout,"       diff2       Optimized difference method (default)\n");
+  fprintf(stdout,"       idiff2      Optimized difference method with integer math\n");
+  fprintf(stdout,"    --filter-param Alpha level for Hamming filter\n");
+  fprintf(stdout,"    --trace        Set tracing to level\n");
+  fprintf(stdout,"         none      No tracing (default)\n");
+  fprintf(stdout,"         status    Status tracing\n");
+  fprintf(stdout,"         pic       Trace picture\n");
+  fprintf(stdout,"         rays      Trace allrays\n");
+  fprintf(stdout,"         plot      Trace plotting\n");
+  fprintf(stdout,"         clipping  Trace clipping\n");
+  fprintf(stdout,"    --verbose      Turn on verbose mode\n");
+  fprintf(stdout,"    --debug        Turn on debug mode\n");
+  fprintf(stdout,"    --version      Print version\n");
+  fprintf(stdout,"    --help         Print this help message\n");
+  exit(1);  
+}
+
+
+#ifdef MPI_CT
+void mpi_scatter_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int debug);
+#endif
+void print_raysum_info(const RAYSUM *rs);
+
+int 
+main (const int argc, char *const argv[])
+{
+  IMAGE *im_global;
+  RAYSUM *rs_global;
+  char *rs_name, *im_filename;
+  char remark[MAXREMARK];
+  char filt_name[80];
+  int nx, ny;
+  double time_start, time_end;
+  char *endptr;
+  int opt_verbose = 0;
+  int opt_debug = 0;
+  int opt_trace = TRACE_NONE;
+  double opt_filter_param;
+  int opt_filter = W_A_BANDLIMIT;
+  int opt_interp = I_LINEAR;
+  int opt_interp_param = 1;
+  int opt_backproj = O_BPROJ_DIFF2;
+#ifdef MPI_CT
+  IMAGE *im_local;
+  RAYSUM *rs_local;
+  int mpi_argc = argc;
+  char **mpi_argv = (char **) argv;
+  int mpi_nview, mpi_ndet;
+  double mpi_detinc, mpi_rotinc, mpi_piclen;
+  double mpi_t1, mpi_t2, mpi_t, mpi_t_g;
+  int ix;
+
+  MPI_Init(&mpi_argc, &mpi_argv);
+  MPI_Comm_dup (MPI_COMM_WORLD, &mpi_ct.comm);
+  MPI_Comm_size(mpi_ct.comm, &mpi_ct.nproc);
+  MPI_Comm_rank(mpi_ct.comm, &mpi_ct.my_rank);
+
+  if (mpi_ct.nproc > MPI_MAX_PROCESS) {
+    sys_error(ERR_FATAL, "Number of mpi processes (%d) exceeds max processes (%d)",
+             mpi_ct.nproc, MPI_MAX_PROCESS);
+    exit(1);
+  }
+#endif
+
+#ifdef MPI_CT
+  time_start = MPI_Wtime();
+#else
+  time_start = td_current_sec();
+#endif
+
+#ifdef MPI_CT
+  if (mpi_ct.my_rank == 0) {
+#endif
+    while (1) {
+      int c = getopt_long(argc, argv, "", my_options, NULL);
+      char *endptr = NULL;
+      
+      if (c == -1)
+       break;
+      
+      switch (c)
+       {
+       case O_INTERP:
+         opt_interp = opt_set_interpolation(optarg, argv[0]);
+         break;
+       case O_FILTER:
+         opt_filter = opt_set_filter(optarg, argv[0]);
+         break;
+       case O_BACKPROJ:
+         opt_backproj = opt_set_backproj(optarg, argv[0]);
+         break;
+       case O_FILTER_PARAM:
+         opt_filter_param = strtod(optarg, &endptr);
+         if (endptr != optarg + strlen(optarg)) {
+           usage(argv[0]);
+           exit(1);
+         }
+         break;
+       case O_VERBOSE:
+         opt_verbose = 1;
+         break;
+       case O_DEBUG:
+         opt_debug = 1;
+         break;
+       case O_TRACE:
+         opt_trace = opt_set_trace(optarg, argv[0]);
+         break;
+        case O_VERSION:
+#ifdef VERSION
+         fprintf(stdout, "Version %s\n", VERSION);
+#else
+         fprintf(stderr, "Unknown version number");
+#endif
+         exit(0);
+       case O_HELP:
+       case '?':
+         usage(argv[0]);
+         exit(0);
+       default:
+         usage(argv[0]);
+         exit(1);
+       }
+    }
+  
+    if (optind + 4 != argc) {
+      usage(argv[0]);
+      exit(1);
+    }
+
+    rs_name = argv[optind];
+  
+    im_filename = argv[optind + 1];
+  
+    nx = strtol(argv[optind + 2], &endptr, 10);
+    ny = strtol(argv[optind + 3], &endptr, 10);
+  
+    if (opt_filter == W_G_HAMMING || opt_filter == W_AG_HAMMING)
+      sprintf (filt_name, "%s: alpha = %.2f",
+              filter_name_of (opt_filter), opt_filter_param); 
+    else
+      sprintf (filt_name, "%s", filter_name_of (opt_filter));
+  
+    sprintf (remark,
+            "Reconstruct: %dx%d, %s, %s, %s",
+            nx, ny, filt_name, interp_name_of (opt_interp), name_of_backproj(opt_backproj));
+  
+    if (opt_verbose)
+      fprintf (stdout, "%s\n", remark);
+#ifdef MPI_CT
+  }
+#endif
+
+#ifdef MPI_CT
+  if (mpi_ct.my_rank == 0) {
+    if (file_exists(rs_name) == FALSE) {
+      fprintf (stderr, "File %s does not exist\n", rs_name);
+      exit(1);
+    } 
+    rs_global = raysum_open (rs_name);
+    raysum_read (rs_global);
+    print_raysum_info(rs_global);
+    if (opt_verbose) {
+      printf ("Number of detectors: %d\n", rs_global->ndet);
+      printf ("    Number of views: %d\n", rs_global->nview);
+      printf ("             Remark: %s\n", rs_global->remark);
+    }
+  
+    mpi_ndet = rs_global->ndet;
+    mpi_nview = rs_global->nview;
+    mpi_detinc = rs_global->det_inc;
+    mpi_piclen = rs_global->piclen;
+    mpi_rotinc = rs_global->rot_inc;
+  }
+
+
+  mpi_t1 = MPI_Wtime();
+  MPI_Bcast(&opt_verbose, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_debug, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_trace, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_filter, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_interp, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_filter_param, 1, MPI_DOUBLE, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_interp_param, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_backproj, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&mpi_ndet, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&mpi_nview, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&mpi_detinc, 1, MPI_DOUBLE, 0, mpi_ct.comm);
+  MPI_Bcast(&mpi_piclen, 1, MPI_DOUBLE, 0, mpi_ct.comm);
+  MPI_Bcast(&mpi_rotinc, 1, MPI_DOUBLE, 0, mpi_ct.comm);
+  MPI_Bcast(&nx, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&ny, 1, MPI_INT, 0, mpi_ct.comm);
+  if (opt_verbose) {
+    mpi_t2 = MPI_Wtime();
+    mpi_t = mpi_t2 - mpi_t1;
+    MPI_Reduce(&mpi_t, &mpi_t_g, 1, MPI_DOUBLE, MPI_MAX, 0, mpi_ct.comm);
+    if (mpi_ct.my_rank == 0)
+      printf("Time to Bcast vars = %f secs, Max time = %f\n", mpi_t, mpi_t_g);
+  }
+
+  mpi_ct_calc_work_units(mpi_nview);
+
+  rs_local = raysum_create (NULL, mpi_ct.local_work_units[mpi_ct.my_rank], mpi_ndet, TRUE);
+  //  rs_local->ndet = mpi_ndet;
+  //  rs_local->nview = mpi_nview;
+  rs_local->det_inc = mpi_detinc;
+  rs_local->piclen = mpi_piclen;
+  rs_local->rot_inc = mpi_rotinc;
+
+  if (opt_debug)
+    fprintf(stderr, "Bcast'd rs vars, my nview=%d, local_work_units=%d, start_work_units=%d (process %d)\n",
+           mpi_nview, mpi_ct.local_work_units[mpi_ct.my_rank], mpi_ct.start_work_unit[mpi_ct.my_rank], mpi_ct.my_rank);
+
+  if (opt_verbose)
+    mpi_t1 = MPI_Wtime();
+  mpi_scatter_rs(rs_global, rs_local, opt_debug);
+  if (opt_verbose) {
+    mpi_t2 = MPI_Wtime();
+    mpi_t = mpi_t2 - mpi_t1;
+    MPI_Reduce(&mpi_t, &mpi_t_g, 1, MPI_DOUBLE, MPI_MAX, 0, mpi_ct.comm);
+    if (mpi_ct.my_rank == 0)
+      printf("Time to scatter rs = %f secs, Max time = %f sec\n", mpi_t, mpi_t_g);
+  }
+
+  if (mpi_ct.my_rank == 0) {
+    im_global = image_create (im_filename, nx, ny);
+    sdf_add_label (LT_HISTORY, rs_global->remark, rs_global->calctime, im_global->dfp_2d->dfp);
+    sdf_add_empty_label (im_global->dfp_2d->dfp);
+  }
+  im_local = image_create (NULL, nx, ny);
+
+#else
+  rs_global = raysum_open (rs_name);
+  raysum_read (rs_global);
+  if (opt_debug)
+    print_raysum_info(rs_global);
+
+  im_global = image_create (im_filename, nx, ny);
+  sdf_add_label (LT_HISTORY, rs_global->remark, rs_global->calctime, im_global->dfp_2d->dfp);
+  sdf_add_empty_label (im_global->dfp_2d->dfp);
+#endif
+
+#ifdef MPI_CT
+  mpi_t1 = MPI_Wtime();
+  image_reconst (im_local, rs_local, opt_filter, opt_filter_param, 
+                opt_interp, opt_interp_param, opt_backproj, opt_trace);
+  mpi_t2 = MPI_Wtime();
+  mpi_t = mpi_t2 - mpi_t1;
+  MPI_Reduce(&mpi_t, &mpi_t_g, 1, MPI_DOUBLE, MPI_MAX, 0, mpi_ct.comm);
+  if (mpi_ct.my_rank == 0) {
+    printf("Time to reconstruct = %f, Max time = %f\n", mpi_t, mpi_t_g);
+  }
+#else
+  image_reconst (im_global, rs_global, opt_filter, opt_filter_param, 
+                opt_interp, opt_interp_param, opt_backproj, opt_trace);
+#endif
+
+#ifdef MPI_CT
+  if (mpi_ct.my_rank == 0) {
+    raysum_close (rs_global);
+  }
+
+  if (opt_verbose)
+    mpi_t1 = MPI_Wtime();
+  for (ix = 0; ix < im_local->nx; ix++) {
+    MPI_Reduce(im_local->v[ix], im_global->v[ix], 
+              im_local->ny, MPI_FLOAT, MPI_SUM, 0, mpi_ct.comm);
+  }
+  if (opt_verbose) {
+    mpi_t2 = MPI_Wtime();
+    mpi_t = mpi_t2 - mpi_t1;
+    MPI_Reduce(&mpi_t, &mpi_t_g, 1, MPI_DOUBLE, MPI_MAX, 0, mpi_ct.comm);
+    if (mpi_ct.my_rank == 0)
+      printf("Time to reduce image = %f secs, max time = %f\n", mpi_t, mpi_t_g);
+  }
+  if (mpi_ct.my_rank == 0) {
+    strncpy (im_global->remark, remark, MAXREMARK);
+    image_save (im_global);
+    time_end = MPI_Wtime();
+    im_global->calctime = time_end - time_start;
+    if (opt_verbose)
+      fprintf (stdout, "Time active = %.2f\n", im_global->calctime);
+    }
+#else  
+  raysum_close (rs_global);
+  strncpy (im_global->remark, remark, MAXREMARK);
+  image_save (im_global);
+
+  time_end = td_current_sec();
+  im_global->calctime = time_end - time_start;
+  if (opt_verbose)
+    fprintf (stdout, "Time active = %.2f secs\n", im_global->calctime);
+#endif
+
+#ifdef MPI_CT
+       MPI_Finalize();
+#endif
+
+       return (0);
+}
+
+
+#ifdef MPI_CT
+void mpi_scatter_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int opt_debug)
+{
+  int iproc;
+  int end_work_unit;
+  int iw;
+
+  if (mpi_ct.my_rank == 0) {
+    for (iproc = 0; iproc < mpi_ct.nproc; iproc++) {
+      end_work_unit = mpi_ct.start_work_unit[iproc] 
+       + mpi_ct.local_work_units[iproc] 
+       - 1;
+
+      if (opt_debug)
+       fprintf(stdout, "Sending rs data to process %d\n", iproc);
+
+      for (iw = mpi_ct.start_work_unit[iproc]; iw <= end_work_unit; iw++) {
+       MPI_Send(&rs_global->view[iw]->view_angle, 1, MPI_DOUBLE, iproc, 0, mpi_ct.comm);
+       MPI_Send(&rs_global->view[iw]->ndet, 1, MPI_INT, iproc, 0, mpi_ct.comm);
+       MPI_Send(rs_global->view[iw]->detval, rs_global->ndet, MPI_FLOAT, iproc, 0, mpi_ct.comm);
+      }
+    }
+  }
+
+  end_work_unit = mpi_ct.local_work_units[mpi_ct.my_rank] - 1;
+  for (iw = 0; iw <= end_work_unit; iw++) {
+    MPI_Status status;
+
+    MPI_Recv(&rs_local->view[iw]->view_angle, 1, MPI_DOUBLE, 0, 0, mpi_ct.comm, &status);
+    MPI_Recv(&rs_local->view[iw]->ndet, 1, MPI_INT, 0, 0, mpi_ct.comm, &status);
+    MPI_Recv(rs_local->view[iw]->detval, rs_global->ndet, MPI_FLOAT, 0, 0, mpi_ct.comm, &status);
+  }
+  rs_local->nview = mpi_ct.local_work_units[mpi_ct.my_rank];
+}
+
+#endif
+
+void print_raysum_info(const RAYSUM *rs)
+{
+  printf ("Number of detectors: %d\n", rs->ndet);
+  printf ("    Number of views: %d\n", rs->nview);
+  printf ("             Remark: %s\n", rs->remark);
+  printf ("Piclen: %f\n", rs->piclen);
+  printf ("det_start: %f\n", rs->det_start);
+  printf ("det_inc: %f\n", rs->det_inc);
+  printf ("rot_start: %f\n", rs->rot_start);
+  printf ("rot_inc: %f\n", rs->rot_inc);
+}
diff --git a/src/mpitest.c b/src/mpitest.c
new file mode 100644 (file)
index 0000000..ce118de
--- /dev/null
@@ -0,0 +1,21 @@
+#include "ct.h"
+
+int main(const int argc, char * const argv[])
+{
+  int i;
+
+#ifdef MPI_CT
+  MPI_Init(&argc, (char ***) &argv);
+#endif
+
+  for (i = 0; i < argc; i++)
+    {
+      printf("%d: %s\n", i, argv[i]);
+    }
+
+#ifdef MPI_CT
+  MPI_Finalize();
+#endif
+  return(0);
+
+}
diff --git a/src/phm2rs.c b/src/phm2rs.c
new file mode 100644 (file)
index 0000000..13a4e85
--- /dev/null
@@ -0,0 +1,402 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: phm2rs.c,v 1.1 2000/04/28 13:02:44 kevin Exp $
+**  $Log: phm2rs.c,v $
+**  Revision 1.1  2000/04/28 13:02:44  kevin
+**  Initial revision
+**
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  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
+******************************************************************************/
+/* FILE
+ *   phm2rs.c          Generate raysum projections from phantom object
+ *
+ * HISTORY
+ *   1984 -- Final DOS version  
+ *   1999 -- First UNIX version
+ */
+
+#include "ct.h"
+
+#define O_PHANTOM    1
+#define O_DESC       2
+#define O_NRAY       3
+#define O_ROTANGLE   4
+#define O_TRACE      5
+#define O_VERBOSE    6
+#define O_HELP       7
+#define O_PICFILE    8
+#define O_INMEMORY   9
+#define O_DEBUG     10
+#define O_VERSION   11
+
+static struct option my_options[] = 
+{
+  {"phantom", 1, 0, O_PHANTOM},
+  {"picfile", 1, 0, O_PICFILE},
+  {"desc", 1, 0, O_DESC},
+  {"nray", 1, 0, O_NRAY},
+  {"rotangle", 1, 0, O_ROTANGLE},
+  {"trace", 1, 0, O_TRACE},
+  {"verbose", 0, 0, O_VERBOSE},
+  {"help", 0, 0, O_HELP},
+  {"debug", 0, 0, O_DEBUG},
+  {"inmemory", 0, 0, O_INMEMORY},
+  {"version", 0, 0, O_VERSION},
+  {0, 0, 0, 0}
+};
+
+void 
+usage (const char *program)
+{
+#ifdef MPI_CT
+if (mpi_ct.my_rank == 0)
+  {
+#endif  
+  fprintf(stdout,"usage: %s outfile ndet nview [--phantom phantom-name] [--picfile filename] [OPTIONS]\n", kbasename(program));
+  fprintf(stdout,"Calculate raysums (projections) through phantom object, either\n");
+  fprintf(stdout,"a predefined --phantom or a --picfile\n");
+  fprintf(stdout,"\n");
+  fprintf(stdout,"     outfile      Name of output file for raysums\n");
+  fprintf(stdout,"     ndet         Number of detectors\n");
+  fprintf(stdout,"     nview        Number of rotated views\n");
+  fprintf(stdout,"     --phantom    Phantom to use for projection\n");
+  fprintf(stdout,"        herman    Herman head phantom\n");
+  fprintf(stdout,"        rowland   Rowland head phantom\n");
+  fprintf(stdout,"        browland  Bordered Rowland head phantom\n");
+  fprintf(stdout,"        unitpulse Unit pulse phantom\n");
+  fprintf(stdout,"     --picfile    Get Phantom from picture file\n");
+  fprintf(stdout,"     --desc       Description of raysum\n");
+  fprintf(stdout,"     --nray       Number of rays per detector (default = 1)\n");
+  fprintf(stdout,"     --rotangle   Degrees to rotate view through, multiple of PI (default = 1)\n");
+  fprintf(stdout,"     --trace      Trace level to use\n");
+  fprintf(stdout,"        none      No tracing (default)\n");
+  fprintf(stdout,"        text      Trace text level\n");
+  fprintf(stdout,"        pic       Trace picture\n");
+  fprintf(stdout,"        rays      Trace rays\n");
+  fprintf(stdout,"        plot      Trace plot\n");
+  fprintf(stdout,"        clipping  Trace clipping\n");
+  fprintf(stdout,"     --inmemory   Use memory storage\n");
+  fprintf(stdout,"     --verbose    Verbose mode\n");
+  fprintf(stdout,"     --debug      Debug mode\n");
+  fprintf(stdout,"     --version    Print version\n");
+  fprintf(stdout,"     --help       Print this help message\n");
+#ifdef MPI_CT
+  }
+  MPI_Abort(mpi_ct.comm, 1);
+#endif
+  exit(1);
+}
+
+
+void mpi_gather_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int opt_debug);
+
+int 
+main (const int argc, char *const argv[])
+{
+  DETECTOR *det;
+  PICTURE *pic = NULL;
+  RAYSUM *rs_global;
+  char str[256], *opt_outfile, opt_desc[MAXREMARK+1];
+  char opt_picfilename[256];
+  char *endptr, *endstr;
+  int opt_ndet, opt_nview;
+  int opt_nray = 1;
+  int opt_trace = 0, opt_picnum = -1;
+  int opt_verbose = 0;
+  int opt_debug = 0;
+  int opt_in_memory = FALSE;
+  double opt_rotangle = 1;
+  double time_start, time_end;
+#ifdef MPI_CT
+  RAYSUM *rs_local;
+  int mpi_argc = argc;
+  char **mpi_argv = (char **) argv;
+  double mpi_t1, mpi_t2, mpi_t, mpi_t_g;
+
+  MPI_Init(&mpi_argc, &mpi_argv);
+  MPI_Comm_dup (MPI_COMM_WORLD, &mpi_ct.comm);
+  MPI_Comm_size(mpi_ct.comm, &mpi_ct.nproc);
+  MPI_Comm_rank(mpi_ct.comm, &mpi_ct.my_rank);
+
+  if (mpi_ct.nproc > MPI_MAX_PROCESS) {
+    sys_error(ERR_FATAL, "Number of mpi processes (%d) exceeds max processes (%d)",
+             mpi_ct.nproc, MPI_MAX_PROCESS);
+    exit(1);
+  }
+#endif
+
+#ifdef MPI_CT
+  time_start = MPI_Wtime();
+#else
+  time_start = td_current_sec();
+#endif
+  
+#ifdef MPI_CT
+  if (mpi_ct.my_rank == 0) {
+#endif
+    strcpy(opt_desc, "");
+    strcpy(opt_picfilename, "");
+    while (1) {
+      int c = getopt_long(argc, argv, "", my_options, NULL);
+      char *endptr = NULL;
+      char *endstr;
+      
+      if (c == -1)
+       break;
+      
+      switch (c) {
+      case O_PHANTOM:
+       opt_picnum = opt_set_picture(optarg, argv[0]);
+       pic = create_pic(opt_picnum);
+       break;
+      case O_PICFILE:
+#ifdef MPI_CT
+       if (mpi_ct.my_rank == 0)
+         fprintf(stderr, "Can not read picture from file in MPI mode\n");
+       exit(1);
+#endif
+       strncpy(opt_picfilename, optarg, sizeof(opt_picfilename));
+       pic = create_pic_from_file(opt_picfilename);
+       break;
+      case O_VERBOSE:
+       opt_verbose = 1;
+       break;
+      case O_DEBUG:
+       opt_debug = 1;
+       break;
+      case O_INMEMORY:
+       opt_in_memory = 1;
+       break;
+      case O_TRACE:
+       opt_trace = opt_set_trace(optarg, argv[0]);
+       break;
+      case O_DESC:
+       strncpy(opt_desc, optarg, sizeof(opt_desc));
+       break;
+      case O_ROTANGLE:
+       opt_rotangle = strtod(optarg, &endptr);
+       endstr = optarg + strlen(optarg);
+       if (endptr != endstr) {
+         fprintf(stderr,"Error setting --rotangle to %s\n", optarg);
+         usage(argv[0]);
+         exit(1);
+       }
+       break;
+      case O_NRAY:
+       opt_nray = strtol(optarg, &endptr, 10);
+       endstr = optarg + strlen(optarg);
+       if (endptr != endstr) {
+         fprintf(stderr,"Error setting --nray to %s\n", optarg);
+         usage(argv[0]);
+         exit(1);
+       }
+       break;
+        case O_VERSION:
+#ifdef VERSION
+         fprintf(stdout, "Version %s\n", VERSION);
+#else
+         fprintf(stderr, "Unknown version number");
+#endif
+         exit(0);
+      case O_HELP:
+      case '?':
+       usage(argv[0]);
+       exit(0);
+      default:
+       usage(argv[0]);
+       exit(1);
+      }
+    }
+  
+    if (pic == NULL) {
+      fprintf(stderr, "No phantom defined\n");
+      usage(argv[0]);
+      exit(1);
+    }
+    if (optind + 3 != argc) {
+      usage(argv[0]);
+      exit(1);
+    }
+    opt_outfile = argv[optind];
+    opt_ndet = strtol(argv[optind+1], &endptr, 10);
+    endstr = argv[optind+1] + strlen(argv[optind+1]);
+    if (endptr != endstr) {
+      fprintf(stderr,"Error setting --ndet to %s\n", argv[optind+1]);
+      usage(argv[0]);
+      exit(1);
+    }
+    opt_nview = strtol(argv[optind+2], &endptr, 10);
+    endstr = argv[optind+2] + strlen(argv[optind+2]);
+    if (endptr != endstr) {
+      fprintf(stderr,"Error setting --nview to %s\n", argv[optind+2]);
+      usage(argv[0]);
+      exit(1);
+    }
+
+    snprintf(str, sizeof(str), 
+            "Raysum_Collect: NDet=%d, Nview=%d, NRay=%d, RotAngle=%.2f, ", 
+            opt_ndet, opt_nview, opt_nray, opt_rotangle);
+    if (opt_picfilename[0]) {
+      strncat(str, "Phantom=", sizeof(str));
+      strncat(str, opt_picfilename, sizeof(str));
+    } else if (opt_picnum != -1) {
+      strncat(str, "Phantom=", sizeof(str));
+      strncat(str, name_of_picture(opt_picnum), sizeof(str));
+    }
+    if (opt_desc[0]) {
+      strncat(str, ": ", sizeof(str));
+      strncat(str, opt_desc, sizeof(str));
+    }
+    strncpy(opt_desc, str, sizeof(opt_desc));
+#ifdef MPI_CT
+  }
+#endif
+
+#ifdef MPI_CT
+  MPI_Barrier(mpi_ct.comm);
+  MPI_Bcast(&opt_rotangle, 1, MPI_DOUBLE, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_nview, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_ndet, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_nray, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_picnum, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_verbose, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_debug, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_trace, 1, MPI_INT, 0, mpi_ct.comm);
+
+  if (mpi_ct.my_rank > 0 && opt_picnum > 0)
+    pic = create_pic(opt_picnum);
+#endif
+
+  opt_rotangle *= PI;
+  det = detect_create (pic, opt_ndet, opt_nview, opt_nray, opt_rotangle);
+
+#ifdef MPI_CT
+  mpi_ct_calc_work_units(opt_nview);
+  if (mpi_ct.my_rank == 0) {
+    rs_global = raysum_create_from_det (opt_outfile, det, TRUE);
+  }
+  
+  rs_local = raysum_create_from_det (NULL, det, TRUE);
+  rs_local->nview = mpi_ct.local_work_units[mpi_ct.my_rank];
+  if (opt_debug)
+    printf("rs_local->nview = %d (process %d)\n", rs_local->nview, mpi_ct.my_rank);
+
+  if (opt_verbose)
+    mpi_t1 = MPI_Wtime();
+  raysum_collect (rs_local, det, pic, mpi_ct.start_work_unit[mpi_ct.my_rank], opt_trace, FALSE);
+  if (opt_verbose) {
+    mpi_t2 = MPI_Wtime();
+    mpi_t = mpi_t2 - mpi_t1;
+    MPI_Reduce(&mpi_t, &mpi_t_g, 1, MPI_DOUBLE, MPI_MAX, 0, mpi_ct.comm);
+    if (mpi_ct.my_rank == 0)
+      printf("Time to collect rs = %f secs, Max = %f secs\n", mpi_t, mpi_t_g);
+  }
+
+  if (opt_verbose)
+    mpi_t1 = MPI_Wtime();
+  mpi_gather_rs(rs_global, rs_local, opt_debug);
+  if (opt_verbose) {
+    mpi_t2 = MPI_Wtime();
+    mpi_t = mpi_t2 - mpi_t1;
+    MPI_Reduce(&mpi_t, &mpi_t_g, 1, MPI_DOUBLE, MPI_MAX, 0, mpi_ct.comm);
+    if (mpi_ct.my_rank == 0)
+      printf("Time to gather rs = %f secs, Max = %f secs\n", mpi_t, mpi_t_g);
+  }
+#else
+  rs_global = raysum_create_from_det (opt_outfile, det, opt_in_memory);
+  raysum_collect (rs_global, det, pic, 0, opt_trace, FALSE);
+#endif
+  
+#ifdef MPI_CT
+  time_end = MPI_Wtime();
+  if (mpi_ct.my_rank == 0) {
+    rs_global->calctime = time_end - time_start;
+    strncpy (rs_global->remark, opt_desc, sizeof(rs_global->remark));
+    if (opt_verbose) {
+      fprintf(stdout, "Remark: %s\n", rs_global->remark);
+      fprintf(stdout, "Time active = %.2f secs\n", rs_global->calctime);
+    }
+  }
+#else
+  time_end = td_current_sec();
+  rs_global->calctime = time_end - time_start;
+  strncpy (rs_global->remark, opt_desc, sizeof(rs_global->remark));
+  if (opt_verbose) {
+    fprintf(stdout, "Remark: %s\n", rs_global->remark);
+    fprintf(stdout, "Time active = %.2f secs\n", rs_global->calctime);
+  }
+#endif
+
+#ifdef MPI_CT
+  if (mpi_ct.my_rank == 0) {
+    raysum_write (rs_global);
+    raysum_close (rs_global);
+  }
+#else  
+  if (opt_in_memory)
+    raysum_write (rs_global);
+  raysum_close (rs_global);
+#endif
+
+  detect_free (det);
+
+  if (opt_trace >= TRACE_PIC)
+    {
+      crt_set_mode (GM_TEXT, TRUE);
+      crt_set_cpos (1, 1);
+      printf("Finished\n");
+    }
+
+  return (0);
+}
+
+
+#ifdef MPI_CT
+void mpi_gather_rs (RAYSUM *rs_global, RAYSUM *rs_local, const int opt_debug)
+{
+  int iproc;
+  int end_work_unit;
+  int iw;
+
+  end_work_unit = mpi_ct.local_work_units[mpi_ct.my_rank] - 1;
+  for (iw = 0; iw <= end_work_unit; iw++) {
+    MPI_Send(&rs_local->view[iw]->view_angle, 1, MPI_DOUBLE, 0, 0, mpi_ct.comm);
+    MPI_Send(&rs_local->view[iw]->ndet, 1, MPI_INT, 0, 0, mpi_ct.comm);
+    MPI_Send(rs_local->view[iw]->detval, rs_local->ndet, MPI_FLOAT, 0, 0, mpi_ct.comm);
+  }
+
+  if (mpi_ct.my_rank == 0) {
+    for (iproc = 0; iproc < mpi_ct.nproc; iproc++) {
+      end_work_unit = mpi_ct.start_work_unit[iproc] 
+       + mpi_ct.local_work_units[iproc] 
+       - 1;
+
+      if (opt_debug)
+       fprintf(stdout, "Recv rs data from process %d\n", iproc);
+
+      for (iw = mpi_ct.start_work_unit[iproc]; iw <= end_work_unit; iw++) {
+       MPI_Status status;
+
+       MPI_Recv(&rs_global->view[iw]->view_angle, 1, MPI_DOUBLE, iproc, 0, mpi_ct.comm, &status);
+       MPI_Recv(&rs_global->view[iw]->ndet, 1, MPI_INT, iproc, 0, mpi_ct.comm, &status);
+       MPI_Recv(rs_global->view[iw]->detval, rs_global->ndet, MPI_FLOAT, iproc, 0, mpi_ct.comm, &status);
+      }
+    }
+  }
+
+}
+#endif
diff --git a/src/phm2sdf.c b/src/phm2sdf.c
new file mode 100644 (file)
index 0000000..0174eef
--- /dev/null
@@ -0,0 +1,470 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: phm2sdf.c,v 1.1 2000/04/28 13:02:44 kevin Exp $
+**  $Log: phm2sdf.c,v $
+**  Revision 1.1  2000/04/28 13:02:44  kevin
+**  Initial revision
+**
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  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
+******************************************************************************/
+/* FILE
+ *   phm2sdf.c                 Generate a SDF image from a phantom
+ *
+ * HISTORY
+ *   1984 - Final DOS verion
+ *   1999 - First UNIX version
+ */
+
+#include "ct.h"
+
+#define O_PHANTOM       1
+#define O_DESC          2
+#define O_NSAMPLE       3
+#define O_FILTER        4
+#define O_TRACE         5
+#define O_VERBOSE       6
+#define O_HELP          7
+#define O_PICFILE       8
+#define O_FILTER_DOMAIN 9
+#define O_FILTER_BW     10
+#define O_FILTER_PARAM  11
+#define O_DEBUG         12
+#define O_VERSION       13
+
+static struct option my_options[] = 
+{
+  {"phantom", 1, 0, O_PHANTOM},
+  {"picfile", 1, 0, O_PICFILE},
+  {"desc", 1, 0, O_DESC},
+  {"nsample", 1, 0, O_NSAMPLE},
+  {"filter", 1, 0, O_FILTER},
+  {"filter-domain", 1, 0, O_FILTER_DOMAIN},
+  {"filter-bw", 1, 0, O_FILTER_BW},
+  {"filter-param", 1, 0, O_FILTER_PARAM},
+  {"trace", 1, 0, O_TRACE},
+  {"verbose", 0, 0, O_VERBOSE},
+  {"debug", 0, 0, O_DEBUG},
+  {"help", 0, 0, O_HELP},
+  {"version", 0, 0, O_VERSION},
+  {0, 0, 0, 0}
+};
+
+void 
+usage (const char *program)
+{
+  fprintf(stdout,"usage: %s outfile nx ny [--phantom phantom-name] [--picfile filename] [--filter filter-name] [OPTIONS]\n",kbasename(program)); 
+  fprintf(stdout,"Generate phantom image from a predefined --phantom or a --picfile\n");
+  fprintf(stdout,"\n");
+  fprintf(stdout,"     outfile         Name of output file for image\n");
+  fprintf(stdout,"     nx              Number of pixels X-axis\n");
+  fprintf(stdout,"     ny              Number of pixels Y-axis\n");
+  fprintf(stdout,"     --phantom       Phantom to use for projection\n");
+  fprintf(stdout,"        herman       Herman head phantom\n");
+  fprintf(stdout,"        rowland      Rowland head phantom\n");
+  fprintf(stdout,"        browland     Bordered Rowland head phantom\n");
+  fprintf(stdout,"        unitpulse    Unit pulse phantom\n");
+  fprintf(stdout,"     --picfile       Generate Phantom from picture file\n");
+  fprintf(stdout,"     --filter        Generate Phantom from a filter function\n");
+  fprintf(stdout,"       abs_bandlimit Abs * Bandlimiting\n");
+  fprintf(stdout,"       abs_sinc      Abs * Sinc\n");
+  fprintf(stdout,"       abs_cos       Abs * Cosine\n");
+  fprintf(stdout,"       abs_hamming   Abs * Hamming\n");
+  fprintf(stdout,"       shepp         Shepp-Logan\n");
+  fprintf(stdout,"       bandlimit     Bandlimiting\n");
+  fprintf(stdout,"       sinc          Sinc\n");
+  fprintf(stdout,"       cos           Cosine\n");
+  fprintf(stdout,"       triangle      Triangle\n");
+  fprintf(stdout,"       hamming       Hamming\n");
+  fprintf(stdout,"     --filter-param  Alpha level for Hamming filter\n");
+  fprintf(stdout,"     --filter-domain Set domain of filter\n");
+  fprintf(stdout,"         spatial     Spatial domain (default)\n");
+  fprintf(stdout,"         freq        Frequency domain\n");
+  fprintf(stdout,"     --filter-bw     Filter bandwidth (default = 1)\n");
+  fprintf(stdout,"     --desc          Description of raysum\n");
+  fprintf(stdout,"     --nsample       Number of samples per axis per pixel (default = 1)\n");
+  fprintf(stdout,"     --trace         Trace level to use\n");
+  fprintf(stdout,"        none         No tracing (default)\n");
+  fprintf(stdout,"        text         Trace text level\n");
+  fprintf(stdout,"        pic          Trace picture\n");
+  fprintf(stdout,"        rays         Trace rays\n");
+  fprintf(stdout,"        plot         Trace plot\n");
+  fprintf(stdout,"        clipping     Trace clipping\n");
+  fprintf(stdout,"     --debug         Debug mode\n");
+  fprintf(stdout,"     --verbose       Verbose mode\n");
+  fprintf(stdout,"     --version       Print version\n");
+  fprintf(stdout,"     --help          Print this help message\n");
+  exit(1);
+}
+
+#ifdef MPI_CT
+void mpi_gather_image (IMAGE *im_global, IMAGE *im_local, const int opt_debug);
+#endif
+
+int 
+main (const int argc, char *const argv[])
+{
+  IMAGE *im_global = NULL;
+  PICTURE *pic = NULL;
+  int opt_nx = 0, opt_ny = 0;
+  int opt_nsample = 1;
+  int opt_picnum = -1;
+  int opt_filter = -1;
+  int opt_filter_domain = D_SPATIAL;
+  char *opt_outfile;
+  int opt_debug = 0;
+  char str[256];
+  char opt_desc[256], opt_picfilename[256];
+  char *endstr, *endptr;
+  double opt_filter_param;
+  double opt_filter_bw = 1.;
+  int opt_trace = TRACE_NONE;
+  int opt_verbose = 0;
+  double time_start, time_end;
+#ifdef MPI_CT
+  IMAGE *im_local = NULL;
+  int mpi_argc = argc;
+  char **mpi_argv = (char **) argv;
+  double mpi_t1, mpi_t2, mpi_t, mpi_t_g;
+
+  MPI_Init(&mpi_argc, &mpi_argv);
+  MPI_Comm_dup (MPI_COMM_WORLD, &mpi_ct.comm);
+  MPI_Comm_size(mpi_ct.comm, &mpi_ct.nproc);
+  MPI_Comm_rank(mpi_ct.comm, &mpi_ct.my_rank);
+
+  if (mpi_ct.nproc > MPI_MAX_PROCESS) {
+    sys_error(ERR_FATAL, "Number of mpi processes (%d) exceeds max processes (%d)",
+             mpi_ct.nproc, MPI_MAX_PROCESS);
+    exit(1);
+  }
+#endif
+
+#ifdef MPI_CT
+  time_start = MPI_Wtime();
+#else
+  time_start = td_current_sec();
+#endif
+  
+#ifdef MPI_CT
+  if (mpi_ct.my_rank == 0) {
+#endif
+
+    strcpy(opt_desc, "");
+    strcpy(opt_picfilename, "");
+    while (1) {
+      int c = getopt_long(argc, argv, "", my_options, NULL);
+      char *endptr = NULL;
+      char *endstr;
+      
+      if (c == -1)
+       break;
+      
+      switch (c) {
+      case O_PHANTOM:
+       opt_picnum = opt_set_picture(optarg, argv[0]);
+       break;
+      case O_PICFILE:
+       strncpy(opt_picfilename, optarg, sizeof(opt_picfilename));
+       pic = create_pic_from_file(opt_picfilename);
+#ifdef MPI_CT
+       if (mpi_ct.my_rank == 0) 
+         fprintf(stderr, "Can't use picture from file in MPI mode\n");
+       exit(1);
+#endif
+       break;
+      case O_VERBOSE:
+       opt_verbose = 1;
+       break;
+      case O_DEBUG:
+       opt_debug = 1;
+       break;
+      case O_TRACE:
+       opt_trace = opt_set_trace(optarg, argv[0]);
+       break;
+      case O_FILTER:
+       opt_filter = opt_set_filter(optarg, argv[0]);
+       break;
+      case O_FILTER_DOMAIN:
+       opt_filter_domain = opt_set_filter_domain(optarg, argv[0]);
+       break;
+      case O_DESC:
+       strncpy(opt_desc, optarg, sizeof(opt_desc));
+       break;
+      case O_FILTER_BW:
+       opt_filter_bw = strtod(optarg, &endptr);
+       endstr = optarg + strlen(optarg);
+       if (endptr != endstr) {
+         fprintf(stderr,"Error setting --filter-bw to %s\n", optarg);
+         usage(argv[0]);
+         exit(1);
+       }
+       break;
+      case O_FILTER_PARAM:
+       opt_filter_param = strtod(optarg, &endptr);
+       endstr = optarg + strlen(optarg);
+       if (endptr != endstr) {
+         fprintf(stderr,"Error setting --filter-param to %s\n", optarg);
+         usage(argv[0]);
+         exit(1);
+       }
+       break;
+      case O_NSAMPLE:
+       opt_nsample = strtol(optarg, &endptr, 10);
+       endstr = optarg + strlen(optarg);
+       if (endptr != endstr) {
+         fprintf(stderr,"Error setting --nsample to %s\n", optarg);
+         usage(argv[0]);
+         exit(1);
+       }
+       break;
+        case O_VERSION:
+#ifdef VERSION
+         fprintf(stdout, "Version %s\n", VERSION);
+#else
+         fprintf(stderr, "Unknown version number");
+#endif
+      case O_HELP:
+      case '?':
+       usage(argv[0]);
+       exit(0);
+      default:
+       usage(argv[0]);
+       exit(1);
+      }
+    }
+    
+    if (pic == NULL && opt_picnum == -1 && opt_filter == -1) {
+      fprintf(stderr, "No phantom defined\n");
+      usage(argv[0]);
+      exit(1);
+    }
+
+    if (opt_trace >= TRACE_PIC)
+      show_pic(pic);
+
+    if (optind + 3 != argc) {
+      usage(argv[0]);
+      exit(1);
+    }
+    opt_outfile = argv[optind];
+    opt_nx = strtol(argv[optind+1], &endptr, 10);
+    endstr = argv[optind+1] + strlen(argv[optind+1]);
+    if (endptr != endstr) {
+      fprintf(stderr,"Error setting nx to %s\n", argv[optind+1]);
+      usage(argv[0]);
+      exit(1);
+    }
+    opt_ny = strtol(argv[optind+2], &endptr, 10);
+    endstr = argv[optind+2] + strlen(argv[optind+2]);
+    if (endptr != endstr) {
+      fprintf(stderr,"Error setting ny to %s\n", argv[optind+2]);
+      usage(argv[0]);
+      exit(1);
+    }
+    
+    snprintf(str, sizeof(str), "nx=%d, ny=%d, nsample=%d, ", opt_nx, opt_ny, opt_nsample);
+    if (opt_picfilename[0]) {
+      strncat(str, "phantom=", sizeof(str));
+      strncat(str, opt_picfilename, sizeof(str));
+    }
+    else if (opt_picnum != -1) {
+      strncat(str, "phantom=", sizeof(str));
+      strncat(str, name_of_picture(opt_picnum), sizeof(str));
+    }
+    else if (opt_filter != -1) {
+      strncat(str, "filter=", sizeof(str));
+      strncat(str, name_of_filter(opt_filter), sizeof(str));
+      strncat(str, " - ", sizeof(str));
+      strncat(str, name_of_filter_domain(opt_filter_domain), sizeof(str));
+    }
+    if (opt_desc[0]) {
+      strncat(str, ": ", sizeof(str));
+      strncat(str, opt_desc, sizeof(str));
+    }
+    strncpy(opt_desc, str, sizeof(opt_desc));
+    
+    if (opt_verbose)
+      printf("Compile Phantom to Image\n\n");
+#ifdef MPI_CT
+  }
+#endif
+
+#ifdef MPI_CT
+  mpi_t1 = MPI_Wtime();
+  MPI_Bcast(&opt_verbose, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_debug, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_trace, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_nx, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_ny, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_nsample, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_picnum, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_filter, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_filter_domain, 1, MPI_INT, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_filter_param, 1, MPI_DOUBLE, 0, mpi_ct.comm);
+  MPI_Bcast(&opt_filter_bw, 1, MPI_DOUBLE, 0, mpi_ct.comm);
+
+  if (opt_verbose) {
+    mpi_t2 = MPI_Wtime();
+    mpi_t = mpi_t2 - mpi_t1;
+    MPI_Reduce(&mpi_t, &mpi_t_g, 1, MPI_DOUBLE, MPI_MAX, 0, mpi_ct.comm);
+    if (mpi_ct.my_rank == 0)
+      printf("Time to Bcast vars = %f secs, Max time = %f\n", mpi_t, mpi_t_g);
+  }
+
+  mpi_ct_calc_work_units(opt_nx);
+
+  if (mpi_ct.my_rank == 0)
+    im_global = image_create (opt_outfile, opt_nx, opt_ny);
+
+  im_local = image_create(NULL, opt_nx, opt_ny);
+#else
+  im_global = image_create (opt_outfile, opt_nx, opt_ny);
+#endif
+  
+  if (opt_picnum > 0)
+    pic = create_pic(opt_picnum);
+#ifdef MPI_CT
+  else {
+    if (mpi_ct.my_rank == 0)
+      fprintf(stderr, "picnum < 0\n");
+    exit(1);
+  }
+#endif
+
+#ifdef MPI_CT
+  if (pic->type == P_UNIT_PULSE) {
+    if (mpi_ct.my_rank == 0) {
+      im_global->v[opt_nx/2][opt_ny/2] = 1.;
+      im_global->calctime = 0;
+    }
+  } else if (opt_filter != -1) {
+    if (mpi_ct.my_rank == 0) {
+      image_filter_init (im_global, opt_filter_domain, opt_filter_bw, opt_filter, opt_filter_param, opt_trace);
+      im_global->calctime = 0;
+    }
+  } else {
+    if (opt_verbose)
+      mpi_t1 = MPI_Wtime();
+    pic_to_image (pic, im_local, mpi_ct.start_work_unit[mpi_ct.my_rank],
+                 mpi_ct.local_work_units[mpi_ct.my_rank], opt_nsample, opt_trace);
+    if (opt_verbose) {
+      mpi_t2 = MPI_Wtime();
+      mpi_t = mpi_t2 - mpi_t1;
+      MPI_Reduce(&mpi_t, &mpi_t_g, 1, MPI_DOUBLE, MPI_MAX, 0, mpi_ct.comm);
+      if (mpi_ct.my_rank == 0)
+       printf("Time to compile pic = %f secs, Max time = %f\n", mpi_t, mpi_t_g);
+    }
+    mpi_gather_image(im_global, im_local, opt_debug);
+  }
+#else
+  if (pic->type == P_UNIT_PULSE) {
+    im_global->v[opt_nx/2][opt_ny/2] = 1.;
+    im_global->calctime = 0;
+  } else if (opt_filter != -1) {
+    image_filter_init (im_global, opt_filter_domain, opt_filter_bw, opt_filter, opt_filter_param, opt_trace);
+    im_global->calctime = 0;
+  } else {
+    pic_to_image (pic, im_global, 0, opt_nx, opt_nsample, opt_trace);
+  }
+#endif
+
+#ifdef MPI_CT
+  time_end = MPI_Wtime();
+  if (mpi_ct.my_rank == 0) {
+    im_global->calctime = time_end - time_start;
+    strncpy (im_global->remark, opt_desc, sizeof(im_global->remark));
+  }
+
+  if (mpi_ct.my_rank == 0) {
+    image_save (im_global);
+    if (opt_verbose)
+      fprintf (stdout, "Time to compile image = %.2f sec\n\n", im_global->calctime);
+  }
+#else
+  time_end = td_current_sec();
+  im_global->calctime = time_end - time_start;
+  strncpy (im_global->remark, opt_desc, sizeof(im_global->remark));
+  image_save (im_global);
+
+  if (opt_trace >= TRACE_PIC)
+    {
+      crt_set_mode (GM_TEXT, TRUE);
+      crt_set_cpos (1, 1);
+    }
+  
+  if (opt_verbose)
+    fprintf (stdout, "Time to compile image = %.2f sec\n\n", im_global->calctime);
+#endif
+
+  if (opt_trace >= TRACE_PIC)
+    {
+      double dmin, dmax;
+      int nx, ny;
+
+      printf ("Enter size of cell (nx, ny): ");
+      scanf ("%d %d", &nx, &ny);
+      printf ("Enter minimum and maximum densities (min, max): ");
+      scanf ("%lf %lf", &dmin, &dmax);
+      crt_set_mode (GM_HIGHRES, TRUE);
+      image_paint (CRTDEV, im_global, 0, 0, nx, ny, dmin, dmax, 0);
+      WAITKEY();
+
+      crt_set_mode (GM_TEXT, TRUE);
+      crt_set_palette (0, crt_calc_color (0., 0., 2.));
+      crt_put_stra ("Finished", 8 + C_WHITE);
+      crt_set_cpos (1, 2);
+    }
+
+  return (0);
+}
+
+
+
+#ifdef MPI_CT
+void mpi_gather_image (IMAGE *im_global, IMAGE *im_local, const int opt_debug)
+{
+  int iproc;
+  int end_work_unit;
+  int iw;
+
+  end_work_unit = mpi_ct.local_work_units[mpi_ct.my_rank] - 1;
+  for (iw = 0; iw <= end_work_unit; iw++) {
+    MPI_Send(im_local->v[iw], im_local->ny, MPI_FLOAT, 0, 0, mpi_ct.comm);
+  }
+
+  if (mpi_ct.my_rank == 0) {
+    for (iproc = 0; iproc < mpi_ct.nproc; iproc++) {
+      end_work_unit = mpi_ct.start_work_unit[iproc] 
+       + mpi_ct.local_work_units[iproc] 
+       - 1;
+
+      if (opt_debug) {
+       fprintf(stdout, "Recv rs data from process %d (%d-%d)\n", iproc,
+               mpi_ct.start_work_unit[iproc], end_work_unit);
+       fflush(stdout);
+      }
+
+
+      for (iw = mpi_ct.start_work_unit[iproc]; iw <= end_work_unit; iw++) {
+       MPI_Status status;
+
+       MPI_Recv(im_global->v[iw], im_global->ny, MPI_FLOAT, iproc, 0, mpi_ct.comm, &status);
+      }
+    }
+  }
+
+}
+#endif
diff --git a/src/rs2sdf.c b/src/rs2sdf.c
new file mode 100644 (file)
index 0000000..9ea63c6
--- /dev/null
@@ -0,0 +1,138 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: rs2sdf.c,v 1.1 2000/04/28 13:02:44 kevin Exp $
+**  $Log: rs2sdf.c,v $
+**  Revision 1.1  2000/04/28 13:02:44  kevin
+**  Initial revision
+**
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  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
+******************************************************************************/
+/* FILE
+ *   rs2sdf.c                  Convert Raysum to image
+ *
+ * DATE
+ *   Apr 1999
+ */
+
+#include "ct.h"
+
+#define O_VERBOSE  7
+#define O_HELP     8
+#define O_VERSION  9
+
+static struct option my_options[] =
+{
+  {"verbose", 0, 0, O_VERBOSE},
+  {"help", 0, 0, O_HELP},
+  {"version", 0, 0, O_VERSION},
+  {0, 0, 0, 0}
+};
+
+
+void 
+usage (const char *program)
+{
+  fprintf(stdout, "usage: %s in-rs-file out-sdf-file [OPTIONS]\n", kbasename(program));
+  fprintf(stdout, "This program converts a raysum file to a SDF2D file\n");
+  fprintf(stdout, "\n");
+  fprintf(stdout, "   --verbose   Verbose mode\n");
+  fprintf(stdout, "   --version   Print version\n");
+  fprintf(stdout, "   --help      Print this help message\n");
+  exit(1);
+}
+
+         
+int 
+main (const int argc, char *const argv[])
+{
+  IMAGE *im;
+  RAYSUM *rs;
+  DETARRAY *detarray;
+  char *rs_name, *im_name;
+  int ix, iy;
+  int opt_v = 0;
+  extern int optind;
+  
+  while (1)
+    {
+      int c = getopt_long (argc, argv, "", my_options, NULL);
+      if (c == -1)
+       break;
+      
+      switch (c)
+       {
+       case O_VERBOSE:
+         opt_v = 1;
+         break;
+        case O_VERSION:
+#ifdef VERSION
+         fprintf(stdout, "Version %s\n", VERSION);
+#else
+         fprintf(stderr, "Unknown version number");
+#endif
+         exit(0);
+       case O_HELP:
+       case '?':
+         usage(argv[0]);
+         exit(0);
+       default:
+         usage(argv[0]);
+         exit(1);
+       }
+    }
+  
+  if (argc - optind != 2)
+    usage(argv[0]);
+
+  rs_name = argv[optind];
+  im_name = argv[optind + 1];
+
+  if (file_exists(rs_name) == FALSE) {
+    fprintf (stderr, "Raysum file %s does not exist\n", rs_name);
+    exit(1);
+  }
+  
+  rs = raysum_open (rs_name);
+
+  if (opt_v)
+    {
+      printf ("Number of detectors: %d\n", rs->ndet);
+      printf ("    Number of views: %d\n", rs->nview);
+      printf ("             Remark: %s\n", rs->remark);
+    }
+  
+  im = image_create (im_name, rs->ndet, rs->nview);
+  
+  sdf_add_label (LT_HISTORY, rs->remark, rs->calctime, im->dfp_2d->dfp);
+  sdf_add_empty_label (im->dfp_2d->dfp);
+
+  detarray = detarray_alloc (rs->ndet);
+  for (iy = 0; iy < rs->nview; iy++)
+    {
+      detarray_read (rs, detarray, iy);
+      for (ix = 0; ix < rs->ndet; ix++)
+       {
+         im->v[ix][iy] = detarray->detval[ix];
+       }
+    }
+  detarray_free (detarray);
+  
+  raysum_close (rs);
+  image_save (im);
+  
+  return(0);
+}
diff --git a/src/sample-ctrec.sh b/src/sample-ctrec.sh
new file mode 100644 (file)
index 0000000..5daa07e
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+bin="/opt/ctsim/bin/"
+
+# Generate phantom image
+
+${bin}phm2sdf sample-phm.sdf 256 256 --nsample 2
+${bin}sdf2img sample-phm.sdf sample-phm.png --format png
+
+# Simulate CT data collection and generate raysum sinugram for display
+${bin}phm2rs  sample-rs.rs 367 320 --nray 2 
+${bin}rs2sdf  sample-rs.rs sample-rs.sdf
+${bin}sdf2img sample-rs.sdf sample-rs.png --format png
+
+# Reconstruct raysums and generate image for display
+${bin}ctrec   sample-rs.rs sample-rec.sdf 256 256 
+${bin}sdf2img sample-rec.sdf sample-rec.png --format png
+
+# Files sample-phm.png, sample-rs.png, and sample-rec.png are ready for display
diff --git a/src/sample-ctrec.sh.in b/src/sample-ctrec.sh.in
new file mode 100755 (executable)
index 0000000..bf7410d
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+bin="@prefix@/bin/"
+
+# Generate phantom image
+
+${bin}phm2sdf sample-phm.sdf 256 256 --nsample 2
+${bin}sdf2img sample-phm.sdf sample-phm.png --format png
+
+# Simulate CT data collection and generate raysum sinugram for display
+${bin}phm2rs  sample-rs.rs 367 320 --nray 2 
+${bin}rs2sdf  sample-rs.rs sample-rs.sdf
+${bin}sdf2img sample-rs.sdf sample-rs.png --format png
+
+# Reconstruct raysums and generate image for display
+${bin}ctrec   sample-rs.rs sample-rec.sdf 256 256 
+${bin}sdf2img sample-rec.sdf sample-rec.png --format png
+
+# Files sample-phm.png, sample-rs.png, and sample-rec.png are ready for display
diff --git a/src/sdf-1.c b/src/sdf-1.c
new file mode 100644 (file)
index 0000000..79e01d3
--- /dev/null
@@ -0,0 +1,123 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: sdf-1.c,v 1.1 2000/04/28 13:02:44 kevin Exp $
+**  $Log: sdf-1.c,v $
+**  Revision 1.1  2000/04/28 13:02:44  kevin
+**  Initial revision
+**
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  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
+******************************************************************************/
+/* FILE
+ *   sdf-1.c             Filter a single SDF file
+ */
+
+#include "ct.h"
+
+#define O_INVERT   6
+#define O_VERBOSE  7
+#define O_HELP     8
+#define O_VERSION  9
+
+static struct option my_options[] =
+{
+  {"invert", 0, 0, O_INVERT},
+  {"verbose", 0, 0, O_VERBOSE},
+  {"help", 0, 0, O_HELP},
+  {"version", 0, 0, O_VERSION},
+  {0, 0, 0, 0}
+};
+
+void 
+usage (const char *program)
+{
+  fprintf(stdout, "usage: %s infile outfile [OPTIONS]\n", kbasename(program));
+  fprintf(stdout, "Generate a SDF2D file from a SDF2D file\n");
+  fprintf(stdout, "\n");
+  fprintf(stdout, "     --invert   Invert image\n");
+  fprintf(stdout, "     --verbose  Verbose modem\n");
+  fprintf(stdout, "     --version  Print version\n");
+  fprintf(stdout, "     --help     Print this help message\n");
+  exit(1);
+}
+
+int 
+main (int argc, char *const argv[])
+{
+  IMAGE *im_in;
+  IMAGE *im_out;
+  char *in_file;
+  char *out_file;
+  int opt_verbose = 0;
+  int opt_invert = 0;
+
+  while (1)
+    {
+      int c = getopt_long (argc, argv, "", my_options, NULL);
+      
+      if (c == -1)
+       break;
+      
+      switch (c)
+       {
+       case O_INVERT:
+         opt_invert = 1;
+         break;
+       case O_VERBOSE:
+         opt_verbose = 1;
+         break;
+        case O_VERSION:
+#ifdef VERSION
+         fprintf(stdout, "Version %s\n", VERSION);
+#else
+         fprintf(stderr, "Unknown version number");
+#endif
+         exit(0);
+       case O_HELP:
+       case '?':
+         usage(argv[0]);
+         exit(0);
+       default:
+         usage(argv[0]);
+         exit(1);
+       }
+    }
+
+  if (optind + 2 != argc)
+    {
+      usage(argv[0]);
+      exit(1);
+    }
+  
+  in_file = argv[optind];
+  out_file = argv[optind + 1];
+
+
+  if (opt_invert) {
+    int ix, iy;
+
+    im_in = image_load (in_file);
+    im_out = image_create (out_file, im_in->nx, im_in->ny);
+
+    for (ix = 0; ix < im_in->nx; ix++)
+      for (iy = 0; iy < im_in->ny; iy++)
+       im_out->v[ix][iy] = - im_in->v[ix][iy];
+       
+    image_save(im_out);
+  }
+
+  return (0);
+}
diff --git a/src/sdf-2.c b/src/sdf-2.c
new file mode 100644 (file)
index 0000000..3a18438
--- /dev/null
@@ -0,0 +1,196 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: sdf-2.c,v 1.1 2000/04/28 13:02:44 kevin Exp $
+**  $Log: sdf-2.c,v $
+**  Revision 1.1  2000/04/28 13:02:44  kevin
+**  Initial revision
+**
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  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
+******************************************************************************/
+/* FILE
+ *   sdf-2.c         Generate a SDF file from two input SDF files
+ */
+
+#include "ct.h"
+
+#define O_ADD      1
+#define O_SUB      2
+#define O_MUL      3
+#define O_COMP     4
+#define O_VERBOSE  7
+#define O_HELP     8
+#define O_VERSION  9
+
+static struct option my_options[] =
+{
+  {"add", 0, 0, O_ADD},
+  {"sub", 0, 0, O_SUB},
+  {"mul", 0, 0, O_MUL},
+  {"comp", 0, 0, O_COMP},
+  {"verbose", 0, 0, O_VERBOSE},
+  {"help", 0, 0, O_HELP},
+  {"version", 0, 0, O_VERSION},
+  {0, 0, 0, 0}
+};
+
+void 
+usage (const char *program)
+{
+  fprintf(stdout, "usage: %s infile1 infile2 outfile [OPTIONS]\n", kbasename(program));
+  fprintf(stdout, "Generate an SDF2D file from two input SDF2D files\n");
+  fprintf(stdout, "\n");
+  fprintf(stdout, "     infile1    Name of first input SDF file\n");
+  fprintf(stdout, "     infile2    Name of second input SDF file\n");
+  fprintf(stdout, "     outfile    Name of output SDF file\n");
+  fprintf(stdout, "     --add      Add images\n");
+  fprintf(stdout, "     --sub      Subtract image 2 from image 1\n");
+  fprintf(stdout, "     --mul      Multiply images\n");
+  fprintf(stdout, "     --comp     Compare images\n");
+  fprintf(stdout, "     --verbose  Verbose modem\n");
+  fprintf(stdout,"      --version  Print version\n");
+  fprintf(stdout, "     --help     Print this help message\n");
+  exit(1);
+}
+
+int 
+main (int argc, char *const argv[])
+{
+  IMAGE *im_in1;
+  IMAGE *im_in2;
+  IMAGE *im_out;
+  char *in_file1;
+  char *in_file2;
+  char *out_file;
+  int opt_verbose = 0;
+  int opt_add = 0;
+  int opt_sub = 0;
+  int opt_mul = 0;
+  int opt_comp = 0;
+
+  while (1)
+    {
+      int c = getopt_long (argc, argv, "", my_options, NULL);
+      
+      if (c == -1)
+       break;
+      
+      switch (c)
+       {
+       case O_ADD:
+         opt_add = 1;
+         break;
+       case O_SUB :
+         opt_sub = 1;
+         break;
+       case O_MUL:
+         opt_mul = 1;
+         break;
+       case O_COMP:
+         opt_comp = 1;
+         break;
+       case O_VERBOSE:
+         opt_verbose = 1;
+         break;
+        case O_VERSION:
+#ifdef VERSION
+         fprintf(stdout, "Version %s\n", VERSION);
+#else
+         fprintf(stderr, "Unknown version number");
+#endif
+         exit(0);
+       case O_HELP:
+       case '?':
+         usage(argv[0]);
+         exit(0);
+       default:
+         usage(argv[0]);
+         exit(1);
+       }
+    }
+
+  if (optind + 3 != argc)
+    {
+      usage(argv[0]);
+      exit(1);
+    }
+  
+  in_file1 = argv[optind];
+  in_file2 = argv[optind + 1];
+  out_file = argv[optind + 2];
+
+  im_in1 = image_load (in_file1);
+  im_in2 = image_load (in_file2);
+  if (im_in1->nx != im_in2->nx || im_in1->ny != im_in2->ny) {
+    fprintf(stderr, "Size of image 1 (%d,%d) and image 2 (%d,%d) do not match\n",
+           im_in1->nx, im_in1->ny, im_in2->nx, im_in2->ny);
+    exit(1);
+  }
+  im_out = image_create (out_file, im_in1->nx, im_in1->ny);
+
+  if (opt_add) {
+    int ix, iy;
+    for (ix = 0; ix < im_in1->nx; ix++)
+      {
+       IMAGE_ELEM_VAL *in1 = &im_in1->v[ix][0];
+       IMAGE_ELEM_VAL *in2 = &im_in2->v[ix][0];
+       IMAGE_ELEM_VAL *out = &im_out->v[ix][0];
+       for (iy = 0; iy < im_in1->ny; iy++)
+         *out++ = *in1++ + *in2++;
+      }
+  } else if (opt_sub) {
+    int ix, iy;
+    for (ix = 0; ix < im_in1->nx; ix++)
+      {
+       IMAGE_ELEM_VAL *in1 = &im_in1->v[ix][0];
+       IMAGE_ELEM_VAL *in2 = &im_in2->v[ix][0];
+       IMAGE_ELEM_VAL *out = &im_out->v[ix][0];
+       for (iy = 0; iy < im_in1->ny; iy++)
+         *out++ = *in1++ - *in2++;
+      }
+  } else if (opt_mul) {
+    int ix, iy;
+    for (ix = 0; ix < im_in1->nx; ix++)
+      {
+       IMAGE_ELEM_VAL *in1 = &im_in1->v[ix][0];
+       IMAGE_ELEM_VAL *in2 = &im_in2->v[ix][0];
+       IMAGE_ELEM_VAL *out = &im_out->v[ix][0];
+       for (iy = 0; iy < im_in1->ny; iy++)
+         *out++ = *in1++ * *in2++;
+      }
+  } else if (opt_comp) {
+    int ix, iy;
+    double abs_error = 0.;
+    for (ix = 0; ix < im_in1->nx; ix++)
+      {
+       IMAGE_ELEM_VAL *in1 = &im_in1->v[ix][0];
+       IMAGE_ELEM_VAL *in2 = &im_in2->v[ix][0];
+       IMAGE_ELEM_VAL *out = &im_out->v[ix][0];
+       for (iy = 0; iy < im_in1->ny; iy++)
+         {
+           double diff = *in1++ - *in2++;
+           *out++ = diff;
+           abs_error += fabs(diff);
+         }
+      }
+    abs_error /= (im_in1->nx * im_in1->ny);
+    fprintf(stdout, "Average Error = %f\n", abs_error);
+  }
+
+  image_save(im_out);
+
+  return (0);
+}
diff --git a/src/sdf2img.c b/src/sdf2img.c
new file mode 100644 (file)
index 0000000..4972ac6
--- /dev/null
@@ -0,0 +1,700 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: sdf2img.c,v 1.1 2000/04/28 13:02:44 kevin Exp $
+**  $Log: sdf2img.c,v $
+**  Revision 1.1  2000/04/28 13:02:44  kevin
+**  Initial revision
+**
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  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
+******************************************************************************/
+/* FILE
+ *   sdf2img.c                         Convert an SDF file to a viewable format image
+ */
+
+#include "ct.h"
+
+#if HAVE_PNG
+void sdf2d_to_png (IMAGE *im, char *outfile, int nxcell, int nycell, double densmin, double densmax);
+#endif
+#if HAVE_GIF
+void sdf2d_to_gif (IMAGE *im, char *outfile, int nxcell, int nycell, double densmin, double densmax);
+#endif
+void sdf2d_to_pgm (IMAGE *im, char *outfile, int nxcell, int nycell, double densmin, double densmax);
+void sdf2d_to_pgmasc (IMAGE *im, char *outfile, int nxcell, int nycell, double densmin, double densmax);
+
+#define O_SCALE    1
+#define O_MIN      2
+#define O_MAX      3
+#define O_AUTO     4
+#define O_CENTER   5
+#define O_STATS    6
+#define O_VERBOSE  7
+#define O_HELP     8
+#define O_FORMAT   9
+#define O_LABELS   10
+#define O_VERSION  11
+#define O_DEBUG    12
+
+static struct option my_options[] =
+{
+  {"scale", 1, 0, O_SCALE},
+  {"min", 1, 0, O_MIN},
+  {"max", 1, 0, O_MAX},
+  {"auto", 1, 0, O_AUTO},
+  {"center", 1, 0, O_CENTER},
+  {"format", 1, 0, O_FORMAT},
+  {"labels", 0, 0, O_LABELS},
+  {"stats", 0, 0, O_STATS},
+  {"verbose", 0, 0, O_VERBOSE},
+  {"debug", 0, 0, O_DEBUG},
+  {"help", 0, 0, O_HELP},
+  {"version", 0, 0, O_VERSION},
+  {0, 0, 0, 0}
+};
+
+#define O_AUTO_FULL   1
+#define O_AUTO_STD0_1 2
+#define O_AUTO_STD0_5 3
+#define O_AUTO_STD1   4
+#define O_AUTO_STD2   5
+#define O_AUTO_STD3   6
+
+#define O_AUTO_FULL_STR  "full"
+#define O_AUTO_STD0_1_STR  "std0.1"
+#define O_AUTO_STD0_5_STR  "std0.5"
+#define O_AUTO_STD1_STR  "std1"
+#define O_AUTO_STD2_STR  "std2"
+#define O_AUTO_STD3_STR  "std3"
+
+#define O_CENTER_MEAN      1
+#define O_CENTER_MODE      2
+#define O_CENTER_MEAN_STR  "mean"
+#define O_CENTER_MODE_STR  "mode"
+
+#define O_FORMAT_GIF       1
+#define O_FORMAT_PNG       2
+#define O_FORMAT_PGM       3
+#define O_FORMAT_PGMASC    4
+#define O_FORMAT_GIF_STR   "gif"
+#define O_FORMAT_PNG_STR   "png" 
+#define O_FORMAT_PGM_STR   "pgm"
+#define O_FORMAT_PGMASC_STR "pgmasc"
+
+void 
+usage (const char *program)
+{
+  fprintf(stdout, "usage: %s sdfname outfile [OPTIONS]\n", kbasename(program));
+  fprintf(stdout, "Convert SDF2D file to an image file\n");
+  fprintf(stdout, "\n");
+  fprintf(stdout, "     sdfname    Name of input SDF file\n");
+  fprintf(stdout, "     outfile    Name of output file\n");
+  fprintf(stdout, "     --format   Output format\n");
+  fprintf(stdout, "         pgm    PGM (portable graymap) format (default)\n");
+  fprintf(stdout, "         pgmasc PGM (portable graymap) ASCII format\n");
+#ifdef HAVE_PNG
+  fprintf(stdout, "         png    PNG format\n");
+#endif
+#ifdef HAVE_GIF
+  fprintf(stdout, "         gif    GIF format\n");
+#endif
+  fprintf(stdout, "     --center   Center of window\n");
+  fprintf(stdout, "         mode   Mode is center of window (default)\n");
+  fprintf(stdout, "         mean   Mean is center of window\n");
+  fprintf(stdout, "     --auto     Set auto window\n");
+  fprintf(stdout, "         full   Use full window (default)\n");
+  fprintf(stdout, "         std0.1 Use 0.1 standard deviation about center\n");
+  fprintf(stdout, "         std0.5 Use 0.5 standard deviation about center\n");
+  fprintf(stdout, "         std1   Use one standard deviation about center\n");
+  fprintf(stdout, "         std2   Use two standard deviations about center\n");
+  fprintf(stdout, "         std3   Use three standard deviations about center\n");
+  fprintf(stdout, "     --scale    Scaling factor for output size\n");
+  fprintf(stdout, "     --min      Set minimum intensity\n");
+  fprintf(stdout, "     --max      Set maximum intensity\n");
+  fprintf(stdout, "     --stats    Print image statistics\n");
+  fprintf(stdout, "     --labels   Print image labels\n");
+  fprintf(stdout, "     --debug    Set debug mode\n");
+  fprintf(stdout, "     --verbose  Set verbose mode\n");
+  fprintf(stdout, "     --version  Print version\n");
+  fprintf(stdout, "     --help     Print this help message\n");
+  exit(1);
+}
+
+int 
+main (int argc, char *const argv[])
+{
+  IMAGE *im;
+  double densmin = HUGE_VAL, densmax = -HUGE_VAL;
+  char *in_file, *out_file;
+  int opt_verbose = 0;
+  int opt_scale = 1;
+  int opt_auto = O_AUTO_FULL;
+  int opt_set_max = 0;
+  int opt_set_min = 0;
+  int opt_stats = 0;
+  int opt_debug = 0;
+  int opt_center = O_CENTER_MODE;
+  int opt_format = O_FORMAT_PGM;
+  int opt_labels = 0;
+
+  while (1)
+    {
+      int c = getopt_long (argc, argv, "", my_options, NULL);
+      char *endptr = NULL;
+      char *endstr;
+      
+      if (c == -1)
+       break;
+      
+      switch (c)
+       {
+       case O_MIN:
+         opt_set_min = 1;
+         densmin = strtod(optarg, &endptr);
+         endstr = optarg + strlen(optarg);
+         if (endptr != endstr)
+           {
+             fprintf(stderr, "Error setting --min to %s\n", optarg);
+             usage(argv[0]);
+             exit(1);
+           }
+         break;
+       case O_MAX:
+         opt_set_max = 1;
+         densmax = strtod(optarg, &endptr);
+         endstr = optarg + strlen(optarg);
+         if (endptr != endstr)
+           {
+             fprintf(stderr, "Error setting --max to %s\n", optarg);
+             usage(argv[0]);
+             exit(1);
+           }
+         break;
+       case O_SCALE:
+         opt_scale = strtol(optarg, &endptr, 10);
+         endstr = optarg + strlen(optarg);
+         if (endptr != endstr)
+           {
+             fprintf(stderr,"Error setting --scale to %s\n", optarg);
+             usage(argv[0]);
+             exit(1);
+           }
+         break;
+       case O_AUTO:
+         if (strcmp(optarg, O_AUTO_FULL_STR) == 0)
+           opt_auto = O_AUTO_FULL;
+         else if (strcmp(optarg, O_AUTO_STD1_STR) == 0)
+           opt_auto = O_AUTO_STD1;
+         else if (strcmp(optarg, O_AUTO_STD0_5_STR) == 0)
+           opt_auto = O_AUTO_STD0_5;
+         else if (strcmp(optarg, O_AUTO_STD0_1_STR) == 0)
+           opt_auto = O_AUTO_STD0_1;
+         else if (strcmp(optarg, O_AUTO_STD2_STR) == 0)
+           opt_auto = O_AUTO_STD2;
+         else if (strcmp(optarg, O_AUTO_STD3_STR) == 0)
+           opt_auto = O_AUTO_STD3;
+         else
+           {
+             fprintf(stderr, "Invalid auto mode %s\n", optarg);
+             usage(argv[0]);
+             exit(1);
+           }
+               break;
+       case O_CENTER:
+         if (strcmp(optarg, O_CENTER_MEAN_STR) == 0)
+           opt_center = O_CENTER_MEAN;
+         else if (strcmp(optarg, O_CENTER_MODE_STR) == 0)
+           opt_center = O_CENTER_MODE;
+         else
+           {
+             fprintf(stderr, "Invalid center mode %s\n", optarg);
+             usage(argv[0]);
+             exit(1);
+           }
+               break;
+       case O_FORMAT:
+         if (strcmp(optarg, O_FORMAT_PGM_STR) == 0)
+           opt_format = O_FORMAT_PGM;
+         else if (strcmp(optarg, O_FORMAT_PGMASC_STR) == 0)
+           opt_format = O_FORMAT_PGMASC;
+#if HAVE_PNG
+         else if (strcmp(optarg, O_FORMAT_PNG_STR) == 0)
+           opt_format = O_FORMAT_PNG;
+#endif
+#if HAVE_GIF
+         else if (strcmp(optarg, O_FORMAT_GIF_STR) == 0)
+           opt_format = O_FORMAT_GIF;
+#endif
+         else {
+             fprintf(stderr, "Invalid format mode %s\n", optarg);
+             usage(argv[0]);
+             exit(1);
+           }
+               break;
+       case O_LABELS:
+         opt_labels = 1;
+         break;
+       case O_VERBOSE:
+         opt_verbose = 1;
+         break;
+       case O_DEBUG:
+         opt_debug = 1;
+         break;
+       case O_STATS:
+         opt_stats = 1;
+         break;
+        case O_VERSION:
+#ifdef VERSION
+         fprintf(stdout, "Version %s\n", VERSION);
+#else
+         fprintf(stderr, "Unknown version number");
+#endif
+         exit(0);
+       case O_HELP:
+       case '?':
+         usage(argv[0]);
+         exit(0);
+       default:
+         usage(argv[0]);
+         exit(1);
+       }
+    }
+
+  if (optind + 2 != argc)
+    {
+      usage(argv[0]);
+      exit(1);
+    }
+  
+  in_file = argv[optind];
+  out_file = argv[optind+1];
+
+  if ((im = image_load (in_file)) == NULL)
+    {
+      fprintf(stderr, "File %s does not exist\n", in_file);
+      exit(1);
+    }
+
+  if (opt_labels) 
+    {
+      int nlabels = im->dfp_2d->dfp->num_label;
+      int i;
+
+      for (i = 0; i < nlabels; i++)
+       {
+         SDF_BLK blk;
+         if (sdf_read_label(&blk.lab, i, im->dfp_2d->dfp) != SDF_OK)
+           break;
+         if (blk.lab.label_type == LT_HISTORY) {
+           fprintf(stdout, "History: %s\n", blk.lab.label_str);
+           fprintf(stdout, "  calc time = %.2f secs\n", blk.lab.calc_time);
+           fprintf(stdout, "  Timestamp = %s\n", td_str_tmdt(&blk.lab.timedate));
+         } else if (blk.lab.label_type == LT_TITLE) {
+           fprintf(stdout, "Title: %s\n", blk.lab.label_str);
+           fprintf(stdout, "  Timestamp = %s\n", td_str_tmdt(&blk.lab.timedate));
+         } else if (blk.lab.label_type == LT_NOTE) {
+           fprintf(stdout, "Note: %s\n", blk.lab.label_str);
+           fprintf(stdout, "  Timestamp = %s\n", td_str_tmdt(&blk.lab.timedate));
+         }
+       }
+    }
+
+  if (opt_stats || (! (opt_set_max && opt_set_min)))
+    {
+      double minfound = HUGE_VAL, maxfound = -HUGE_VAL;
+      double mode = 0, mean = 0, stddev = 0, window = 0;
+      double spread;
+      int hist[256];
+      int ibin, nbin = 256;
+      int max_bin, max_binindex; 
+      double maxbin;
+      int ix, iy;
+
+      maxbin = nbin - 1;
+      for (ix = 0; ix < im->nx; ix++)
+       {
+         for (iy = 0; iy < im->ny; iy++)
+           {
+             if (im->v[ix][iy] > maxfound)
+               maxfound = im->v[ix][iy];
+             if (im->v[ix][iy] < minfound)
+               minfound = im->v[ix][iy];
+             mean += im->v[ix][iy];
+           }
+       }
+      spread = maxfound - minfound;
+      if (spread == 0)
+       mode = minfound;
+      else
+       {
+         for (ibin = 0; ibin < nbin; ibin++)
+           hist[ibin] = 0;
+         for (ix = 0; ix < im->nx; ix++)
+           {
+             for (iy = 0; iy < im->ny; iy++)
+               {
+                 int b = (int) ((((im->v[ix][iy] - minfound) / spread) * (double) maxbin) + 0.5);
+                 hist[b]++;
+               }
+           }
+         max_binindex = 0;
+         max_bin = -1;
+         for (ibin = 0; ibin < nbin; ibin++)
+           {
+             if (hist[ibin] > max_bin)
+               {
+                 max_bin = hist[ibin];
+                 max_binindex = ibin;
+               }
+           }
+         mode = (((double) max_binindex) * spread / ((double) maxbin)) + minfound;
+       }
+
+      if (opt_auto == O_AUTO_FULL)
+       {
+         if (! opt_set_max)
+           densmax = maxfound;
+         if (! opt_set_min)
+           densmin = minfound;
+       }
+      if (opt_stats || opt_auto != O_AUTO_FULL)
+       {
+         mean /= im->nx * im->ny;
+         for (ix = 0; ix < im->nx; ix++)
+           {
+             for (iy = 0; iy < im->ny; iy++)
+               {
+                 double diff = (im->v[ix][iy] - mean);
+                 stddev += diff * diff;
+               }
+           }
+         stddev = sqrt(stddev / (im->nx * im->ny));
+         if (opt_auto == O_AUTO_FULL)
+           ;
+         else if (opt_auto == O_AUTO_STD1)
+           window = stddev;
+         else if (opt_auto == O_AUTO_STD0_1)
+           window = stddev * 0.1;
+         else if (opt_auto == O_AUTO_STD0_5)
+           window = stddev * 0.5;
+         else if (opt_auto == O_AUTO_STD2)
+           window = stddev * 2;
+         else if (opt_auto == O_AUTO_STD3)
+           window = stddev * 3;
+         else
+           {
+             fprintf(stderr, "Internal Error: Invalid auto mode %d\n", opt_auto);
+             exit(1);
+           }
+       }
+      if (opt_stats)
+       {
+         fprintf(stdout,"nx=%d\n", im->nx);
+         fprintf(stdout,"ny=%d\n", im->ny);
+         fprintf(stdout,"min=%f\n", minfound);
+         fprintf(stdout,"max=%f\n", maxfound);
+         fprintf(stdout,"mean=%f\n", mean);
+         fprintf(stdout,"mode=%f\n", mode);
+         fprintf(stdout,"stddev=%f\n", stddev);
+       }
+      if (opt_auto != O_AUTO_FULL)
+       {
+         double center;
+
+         if (opt_center == O_CENTER_MODE)
+           center = mode;
+         else if (opt_center == O_CENTER_MEAN)
+           center = mean;
+         else
+           {
+             fprintf(stderr, "Internal Error: Invalid center mode %d\n", opt_center);
+             exit(1);
+           }
+         if (! opt_set_max)
+           densmax = center + window;
+         if (! opt_set_min)
+           densmin = center - window;
+       }
+    }
+
+  if (opt_stats)
+    {
+      fprintf(stdout,"min_disp=%f\n", densmin);
+      fprintf(stdout,"max_disp=%f\n", densmax);
+    }
+  
+  if (opt_format == O_FORMAT_PGM)
+    sdf2d_to_pgm (im, out_file, opt_scale, opt_scale, densmin, densmax);
+  else if (opt_format == O_FORMAT_PGMASC)
+    sdf2d_to_pgmasc (im, out_file, opt_scale, opt_scale, densmin, densmax);
+#if HAVE_PNG
+  else if (opt_format == O_FORMAT_PNG)
+    sdf2d_to_png (im, out_file, opt_scale, opt_scale, densmin, densmax);
+#endif
+#if HAVE_GIF
+  else if (opt_format == O_FORMAT_GIF) 
+    sdf2d_to_gif (im, out_file, opt_scale, opt_scale, densmin, densmax);
+#endif
+  else
+    {
+      fprintf(stderr, "Internal Error: Invalid format mode %d\n", opt_format);
+      exit(1);
+    }
+  return (0);
+}
+
+
+void 
+sdf2d_to_pgm (IMAGE *im, char *outfile, int nxcell, int nycell, double densmin, double densmax)
+{
+  FILE *fp;
+  int irow;
+  unsigned char *rowp;
+
+  rowp = (unsigned char *) sys_alloc(im->nx * nxcell,"sdf2d_to_img");
+  if (rowp == NULL)
+    return;
+
+  if ((fp = fopen (outfile, "wb")) == NULL)
+     return;
+
+  fprintf(fp, "P5\n");
+  fprintf(fp, "%d %d\n", im->nx, im->ny);
+  fprintf(fp, "255\n");
+
+  for (irow = im->ny - 1; irow >= 0; irow--)
+    {
+      int icol, ir;
+
+      for (icol = 0; icol < im->nx; icol++)
+       {
+         double dens;
+         int p;
+         int pos = icol * nxcell;
+         dens = (im->v[icol][irow] - densmin) / (densmax - densmin);
+         if (dens < 0)
+           dens = 0;
+         else if (dens > 1)
+           dens = 1;
+         for (p = pos; p < pos + nxcell; p++)
+           {
+             rowp[p] = (unsigned int) (dens * 255.);
+           }
+       }
+      for (ir = 0; ir < nycell; ir++)
+       {
+         int ic;
+         for (ic = 0; ic < im->nx * nxcell; ic++) 
+           fprintf(fp, "%c ", rowp[ic]);
+       }
+    }
+  sys_free(rowp, "sdf2img");
+
+  fclose(fp);
+}
+
+void 
+sdf2d_to_pgmasc (IMAGE *im, char *outfile, int nxcell, int nycell, double densmin, double densmax)
+{
+  FILE *fp;
+  int irow;
+  unsigned char *rowp;
+
+  rowp = (unsigned char *) sys_alloc(im->nx * nxcell,"sdf2d_to_img");
+  if (rowp == NULL)
+    return;
+
+  if ((fp = fopen (outfile, "wb")) == NULL)
+     return;
+
+  fprintf(fp, "P2\n");
+  fprintf(fp, "%d %d\n", im->nx, im->ny);
+  fprintf(fp, "255\n");
+
+  for (irow = im->ny - 1; irow >= 0; irow--)
+    {
+      int icol, ir;
+
+      for (icol = 0; icol < im->nx; icol++)
+       {
+         double dens;
+         int p;
+         int pos = icol * nxcell;
+         dens = (im->v[icol][irow] - densmin) / (densmax - densmin);
+         if (dens < 0)
+           dens = 0;
+         else if (dens > 1)
+           dens = 1;
+         for (p = pos; p < pos + nxcell; p++)
+           {
+             rowp[p] = (unsigned int) (dens * 255.);
+           }
+       }
+      for (ir = 0; ir < nycell; ir++)
+       {
+         int ic;
+         for (ic = 0; ic < im->nx * nxcell; ic++) 
+           fprintf(fp, "%d ", rowp[ic]);
+         fprintf(fp, "\n");
+       }
+    }
+  sys_free(rowp, "sdf2img");
+
+  fclose(fp);
+}
+
+
+#ifdef HAVE_PNG
+void 
+sdf2d_to_png (IMAGE *im, char *outfile, int nxcell, int nycell, double densmin, double densmax)
+{
+  FILE *fp;
+  png_structp png_ptr;
+  png_infop info_ptr;
+  int irow;
+  unsigned char *rowp;
+
+  rowp = (unsigned char *) sys_alloc(im->nx * nxcell,"sdf2d_to_img");
+  if (rowp == NULL)
+    return;
+
+  if ((fp = fopen (outfile, "wb")) == NULL)
+     return;
+
+  png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+  if (! png_ptr)
+    return;
+
+  info_ptr = png_create_info_struct(png_ptr);
+  if (! info_ptr)
+    {
+      png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
+      fclose(fp);
+      return;
+    }
+
+  if (setjmp(png_ptr->jmpbuf))
+    {
+      png_destroy_write_struct(&png_ptr, &info_ptr);
+      fclose(fp);
+      return;
+    }
+
+  png_init_io(png_ptr, fp);
+
+  png_set_IHDR(png_ptr, info_ptr, im->nx * nxcell, im->ny * nycell, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_DEFAULT);
+
+  png_write_info(png_ptr, info_ptr);
+  for (irow = im->ny - 1; irow >= 0; irow--)
+    {
+      png_bytep row_pointer;
+      int icol, ir;
+
+      for (icol = 0; icol < im->nx; icol++)
+       {
+         double dens;
+         int p;
+         int pos = icol * nxcell;
+         dens = (im->v[icol][irow] - densmin) / (densmax - densmin);
+         if (dens < 0)
+           dens = 0;
+         else if (dens > 1)
+           dens = 1;
+         for (p = pos; p < pos + nxcell; p++)
+           {
+             rowp[p] = (unsigned int) (dens * 255.);
+           }
+       }
+      row_pointer = rowp;
+      for (ir = 0; ir < nycell; ir++)
+       {
+         png_write_rows (png_ptr, &row_pointer, 1);
+       }
+    }
+  sys_free(rowp, "sdf2img");
+
+  png_write_end(png_ptr, info_ptr);
+  png_destroy_write_struct(&png_ptr, &info_ptr);
+
+  fclose(fp);
+}
+#endif
+
+#ifdef HAVE_GD
+#include "gd.h"
+#define N_GRAYSCALE 256
+#endif
+
+void
+sdf2d_to_gif (IMAGE *im, char *outfile, int nxcell, int nycell, double densmin, double densmax)
+{
+#ifdef HAVE_GD
+  gdImagePtr gif;
+  FILE *out;
+  int gs_indices[N_GRAYSCALE];
+  int i;
+  int irow;
+  int lastrow;
+  unsigned char *rowp;
+
+  rowp = (unsigned char *) sys_alloc(im->nx * nxcell,"sdf2d_to_img");
+  if (rowp == NULL)
+    return;
+
+  gif = gdImageCreate(im->nx * nxcell, im->ny * nycell);
+  for (i = 0; i < N_GRAYSCALE; i++)
+    gs_indices[i] = gdImageColorAllocate(gif, i, i, i);
+
+  lastrow = im->ny * nycell - 1;
+  for (irow = 0; irow < im->ny; irow++)
+    {
+      int icol, ir;
+      int rpos = irow * nycell;
+      for (ir = rpos; ir < rpos + nycell; ir++)
+       {
+         for (icol = 0; icol < im->nx; icol++)
+           {
+             double dens;
+             int ic;
+             int cpos = icol * nxcell;
+             dens = (im->v[icol][irow] - densmin) / (densmax - densmin);
+             if (dens < 0)
+               dens = 0;
+             else if (dens > 1)
+               dens = 1;
+             for (ic = cpos; ic < cpos + nxcell; ic++)
+               {
+                 rowp[ic] = (unsigned int) (dens * (double) (N_GRAYSCALE - 1));
+                 gdImageSetPixel(gif, ic, lastrow - ir, gs_indices[rowp[ic]]);
+               }
+           }
+       }
+    }
+  sys_free(rowp, "sdf2img");
+
+  if ((out = fopen(outfile,"w")) == NULL)
+    {
+      fprintf(stderr,"Error opening output file %s for writing\n", outfile);
+      exit(1);
+    }
+  gdImageGif(gif,out);
+  fclose(out);
+  gdImageDestroy(gif);
+#else
+  fprintf(stderr, "This version does not support GIF");
+#endif
+}
+
diff --git a/src/sdfinfo.c b/src/sdfinfo.c
new file mode 100644 (file)
index 0000000..9f406de
--- /dev/null
@@ -0,0 +1,230 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: sdfinfo.c,v 1.1 2000/04/28 13:02:44 kevin Exp $
+**  $Log: sdfinfo.c,v $
+**  Revision 1.1  2000/04/28 13:02:44  kevin
+**  Initial revision
+**
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  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
+******************************************************************************/
+/* FILE
+ *   sdfinfo.c             Display info on sdf files
+ */
+
+#include "ct.h"
+
+#define O_LABELS   5
+#define O_STATS    6
+#define O_VERBOSE  7
+#define O_HELP     8
+#define O_VERSION  9
+#define O_DEBUG    10
+#define O_NO_STATS 11
+#define O_NO_LABELS 12
+
+static struct option my_options[] =
+{
+  {"labels", 0, 0, O_LABELS},
+  {"no-labels", 0, 0, O_NO_LABELS},
+  {"stats", 0, 0, O_STATS},
+  {"no-stats", 0, 0, O_NO_STATS},
+  {"debug", 0, 0, O_DEBUG},
+  {"verbose", 0, 0, O_VERBOSE},
+  {"help", 0, 0, O_HELP},
+  {"version", 0, 0, O_VERSION},
+  {0, 0, 0, 0}
+};
+
+void 
+usage (const char *program)
+{
+  fprintf(stdout, "usage: %s infile [OPTIONS]\n", kbasename(program));
+  fprintf(stdout, "Analyze an SDF2D file\n");
+  fprintf(stdout, "\n");
+  fprintf(stdout, "     infile       Name of input SDF file\n");
+  fprintf(stdout, "     --display    Display image\n");
+  fprintf(stdout, "     --labels     Print image labels (default)\n");
+  fprintf(stdout, "     --no-labels  Do not print image labels\n");
+  fprintf(stdout, "     --stats      Print image statistics (default)\n");
+  fprintf(stdout, "     --no-stats   Do not print image statistics\n");
+  fprintf(stdout, "     --debug      Debug mode\n");
+  fprintf(stdout, "     --verbose    Verbose mode\n");
+  fprintf(stdout, "     --version    Print version\n");
+  fprintf(stdout, "     --help       Print this help message\n");
+  exit(1);
+}
+
+int 
+main (int argc, char *const argv[])
+{
+  IMAGE *im;
+  char *in_file;
+  int opt_verbose = 0;
+  int opt_stats = 1;
+  int opt_labels = 1;
+  int opt_debug = 0;
+
+  while (1)
+    {
+      int c = getopt_long (argc, argv, "", my_options, NULL);
+      
+      if (c == -1)
+       break;
+      
+      switch (c)
+       {
+       case O_LABELS:
+         opt_labels = 1;
+         break;
+       case O_STATS:
+         opt_stats = 1;
+         break;
+       case O_NO_LABELS:
+         opt_labels = 0;
+         break;
+       case O_NO_STATS:
+         opt_stats = 0;
+         break;
+       case O_VERBOSE:
+         opt_verbose = 1;
+         break;
+       case O_DEBUG:
+         opt_debug = 0;
+         break;
+        case O_VERSION:
+#ifdef VERSION
+         fprintf(stdout, "Version %s\n", VERSION);
+#else
+         fprintf(stderr, "Unknown version number");
+#endif
+         exit(0);
+       case O_HELP:
+       case '?':
+         usage(argv[0]);
+         exit(0);
+       default:
+         usage(argv[0]);
+         exit(1);
+       }
+    }
+
+  if (optind + 1 != argc)
+    {
+      usage(argv[0]);
+      exit(1);
+    }
+  
+  in_file = argv[optind];
+
+  im = image_load (in_file);
+
+  if (opt_labels) 
+    {
+      int nlabels = im->dfp_2d->dfp->num_label;
+      int i;
+
+      for (i = 0; i < nlabels; i++)
+       {
+         SDF_BLK blk;
+         if (sdf_read_label(&blk.lab, i, im->dfp_2d->dfp) != SDF_OK)
+           break;
+         if (blk.lab.label_type == LT_HISTORY) {
+           fprintf(stdout, "History: %s\n", blk.lab.label_str);
+           fprintf(stdout, "  calc time = %.2f secs\n", blk.lab.calc_time);
+           fprintf(stdout, "  Timestamp = %s\n", td_str_tmdt(&blk.lab.timedate));
+         } else if (blk.lab.label_type == LT_TITLE) {
+           fprintf(stdout, "Title: %s\n", blk.lab.label_str);
+           fprintf(stdout, "  Timestamp = %s\n", td_str_tmdt(&blk.lab.timedate));
+         } else if (blk.lab.label_type == LT_NOTE) {
+           fprintf(stdout, "Note: %s\n", blk.lab.label_str);
+           fprintf(stdout, "  Timestamp = %s\n", td_str_tmdt(&blk.lab.timedate));
+         }
+       }
+    }
+
+  if (opt_stats)
+    {
+      double minfound = HUGE_VAL, maxfound = -HUGE_VAL;
+      double mode = 0, mean = 0, stddev = 0;
+      double spread;
+      int hist[256];
+      int ibin, nbin = 256;
+      int max_bin, max_binindex; 
+      double maxbin;
+      int ix, iy;
+
+      maxbin = nbin - 1;
+      for (ix = 0; ix < im->nx; ix++)
+       {
+         for (iy = 0; iy < im->ny; iy++)
+           {
+             if (im->v[ix][iy] > maxfound)
+               maxfound = im->v[ix][iy];
+             if (im->v[ix][iy] < minfound)
+               minfound = im->v[ix][iy];
+             mean += im->v[ix][iy];
+           }
+       }
+      spread = maxfound - minfound;
+      if (spread == 0)
+       mode = minfound;
+      else
+       {
+         for (ibin = 0; ibin < nbin; ibin++)
+           hist[ibin] = 0;
+         for (ix = 0; ix < im->nx; ix++)
+           {
+             for (iy = 0; iy < im->ny; iy++)
+               {
+                 int b = (int) ((((im->v[ix][iy] - minfound) / spread) * (double) maxbin) + 0.5);
+                 hist[b]++;
+               }
+           }
+         max_binindex = 0;
+         max_bin = -1;
+         for (ibin = 0; ibin < nbin; ibin++)
+           {
+             if (hist[ibin] > max_bin)
+               {
+                 max_bin = hist[ibin];
+                 max_binindex = ibin;
+               }
+           }
+         mode = (((double) max_binindex) * spread / ((double) maxbin)) + minfound;
+       }
+
+      mean /= im->nx * im->ny;
+      for (ix = 0; ix < im->nx; ix++)
+       {
+         for (iy = 0; iy < im->ny; iy++)
+           {
+             double diff = (im->v[ix][iy] - mean);
+             stddev += diff * diff;
+           }
+       }
+      stddev = sqrt(stddev / (im->nx * im->ny));
+      fprintf(stdout,"nx=%d\n", im->nx);
+      fprintf(stdout,"ny=%d\n", im->ny);
+      fprintf(stdout,"min=%f\n", minfound);
+      fprintf(stdout,"max=%f\n", maxfound);
+      fprintf(stdout,"mean=%f\n", mean);
+      fprintf(stdout,"mode=%f\n", mode);
+      fprintf(stdout,"stddev=%f\n", stddev);
+    }
+  
+  return (0);
+}