initial commit
authorMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Nov 2025 16:16:51 +0000 (17:16 +0100)
committerMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Nov 2025 16:16:51 +0000 (17:16 +0100)
26 files changed:
BUGS [new file with mode: 0644]
INSTALL [new file with mode: 0644]
INSTALL.LIBVITERBI [new file with mode: 0644]
Makeconf.in [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
Makerule.in [new file with mode: 0644]
README [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
config.guess [new file with mode: 0755]
config.sub [new file with mode: 0755]
configure.in [new file with mode: 0644]
doc/coders.txt [new file with mode: 0644]
install-sh [new file with mode: 0755]
mkinstalldirs [new file with mode: 0755]
src/Makefile.in [new file with mode: 0644]
src/create_trellis.c [new file with mode: 0644]
src/create_trellis.h [new file with mode: 0644]
src/encoder.c [new file with mode: 0644]
src/encoder.h [new file with mode: 0644]
src/trellis.c [new file with mode: 0644]
src/trellis.h [new file with mode: 0644]
src/viterbiversion.t.in [new file with mode: 0644]
test/Makefile.in [new file with mode: 0644]
test/benckmark.c [new file with mode: 0644]
test/convcode.c [new file with mode: 0644]
test/convcode2.c [new file with mode: 0644]

diff --git a/BUGS b/BUGS
new file mode 100644 (file)
index 0000000..4cb5dab
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,21 @@
+This file documents known bugs in LibViterbi and describes where and how to
+report any bugs that you may find.
+
+Copyright (C) 2003 Laurent S. Mazet
+
+Known Causes of Trouble with LibViterbi
+***************************************
+
+   This section describes known problems that affect users of LibViterbi.
+
+Actual Bugs We Haven't Fixed Yet
+================================
+
+   * On cygwin, you can not compile dynamic library.
+
+Where to Report Bugs
+====================
+
+   If you have found a bug send it to the actual maintener (aka me) to
+   <laurent.mazet@motorola.com>
+
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..b42a17a
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,182 @@
+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/INSTALL.LIBVITERBI b/INSTALL.LIBVITERBI
new file mode 100644 (file)
index 0000000..932a9a9
--- /dev/null
@@ -0,0 +1,102 @@
+This file documents the installation of LibViterbi.
+
+
+Installing LibViterbi
+*********************
+
+  Here is the procedure for installing LibViterbi from scratch on a Unix
+system.
+
+   * Run the shell script `configure'.  This will determine the features
+     your system has (or doesn't have) and create a file named
+     `Makefile' from each of the files named `Makefile.in'.
+
+     Here is a summary of the configure options that are most
+     frequently used when building LibViterbi:
+
+    `--prefix=PREFIX'
+          Install LibViterbi in subdirectories below PREFIX.  The default
+          value of PREFIX is `/usr/local'.
+
+    `--enable-builddir[=DIR]'
+          By default, objets and library are build into the build
+          directory. This options change the building directory to
+          DIR. The default value of DIR is /tmp/`whoami`/viterbi.
+
+    `--enable-static'
+          Create static library. If you are planning to use 
+          `--with-debug', or use compiled binaries on other Unix system,
+          you will probably want to use this option. By default, the
+          static library is build. To cancel its, you will use the
+          `--disable-static' option.
+
+    `--enable-shared'
+          Create shared library. It will save many disk space when you
+          will build binaries. By default, the shared library is build.
+          To cancel its, you will use the `--disable-static' option. Be
+          careful that this option is not available on every system.
+
+    `--enable-rpath'
+          Enable the usage of rpath command when linking dynamic binary
+          tests. It will facilitate the usage of those binaries. By
+          default, this options is on.
+
+    `--with-debug'
+          Add debug information for begugging the library.
+
+    `--with-profile'
+          Add profiling information for gprof.
+
+    `--help'
+          Print a summary of the options recognized by the configure
+          script.
+
+     See the file `INSTALL' for more information about the command line
+     options used by configure.  That file also contains instructions
+     for compiling in a directory other than where the source is
+     located.
+
+   * Run make.
+
+     You will need a recent version of GNU Make.  Modifying LibViterbi's
+     makefiles to work with other make programs is probably not worth
+     your time.  We recommend you get and compile GNU Make instead.
+
+     To compile LibViterbi, you will need a recent version of GNU Make.
+     C compiler might to be a problem, anyversion of gcc is ok.
+
+   * If you encounter errors while compiling LibViterbi, first check the
+     list of known problems below to see if there is a workaround or
+     solution for your problem.  If not, see the file BUGS for
+     information about how to report bugs.
+
+   * Once you have successfully compiled LibViterbi, run `make install'.
+
+     This will install a copy LibViterbi libraries, its header files and its
+     documentation in the destination directory. As distributed,
+     LibViterbi is installed in the following directories.  In the table
+     below, PREFIX defaults to `/usr/local', and VERSION stands for the
+     current version number of the library.
+
+    `PREFIX/lib'
+          Libraries like libviterbi.a and libviterbi.so.VERSION
+
+    `PREFIX/include/viterbi'
+          Include files distributed with LibViterbi.
+
+    `PREFIX/doc/viterbi-VERSION'
+          Documentation files distributed with LibViterbi.
+
+Installation Problems
+=====================
+
+   This section contains a list of problems (and some apparent problems
+that don't really mean anything is wrong) that may show up during
+installation of LibViterbi.
+
+   * On HP-UX if you get the message "- shared library must be position    
+     independent.  Use +z or +Z to recompile." when compiling shared
+     library, you will to recompile gcc with the option `--enable-shared'
+     to managed to build LibViterbi shared library.
+
+
diff --git a/Makeconf.in b/Makeconf.in
new file mode 100644 (file)
index 0000000..128c31d
--- /dev/null
@@ -0,0 +1,114 @@
+## Package name
+
+PACK = @PACKAGE@-@VERSION@
+
+## Directory for building
+
+BUILD_DIR = @BUILD_DIR@
+
+BIN_BUILD_DIR = $(BUILD_DIR)/bin
+LIB_BUILD_DIR = $(BUILD_DIR)/lib
+OBJ_BUILD_DIR = $(BUILD_DIR)/obj
+
+BUILD_LIST_DIRS = $(BIN_BUILD_DIR) $(LIB_BUILD_DIR) $(OBJ_BUILD_DIR)
+
+## Directory for install
+
+install_list_dirs = $(includedir) $(libdir)
+
+## install program variables
+
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+
+MKDIR = $(top_srcdir)/mkinstalldirs
+
+BASENAME = @BASENAME@
+
+TAR = @TAR@
+COMPRESS = @COMPRESS@
+
+## Compiler variables
+
+CC         := @CC@
+CCINCS     := -I$(top_srcdir)/src
+CCFLAGS    := @CCFLAGS@
+CCPICFLAG  := @CCPICFLAG@
+
+SH_LD      = @SH_LD@
+SH_LDFLAGS = @LDFLAGS@ @SH_LDFLAGS@ @SONAME_FLAGS@
+
+LD         = @LD@
+LIBS       = @LIBS@ -L$(top_srcdir)/src -l@LIBRARY@
+LDFLAGS    = @LDFLAGS@
+RLDFLAG    = @RLD_FLAG@
+
+STRIP      = @STRIP@
+
+AR         = @AR@
+RANLIB     = @RANLIB@
+
+LN_S = @LN_S@
+
+STATIC_LIBS = @STATIC_LIBS@
+SHARED_LIBS = @SHARED_LIBS@
+
+EXECEXT = @EXECEXT@
+
+## Library version
+
+VERSION = @VERSION@
+
+## Compile command
+
+ifeq ($(SHARED_LIBS),true)
+COMPILE = $(CC) -c $(CCFLAGS) $(CCPICFLAG) $(CCINCS)
+LINK    = $(LD) $(LIBS) $(LDFLAGS) $(RLDFLAG)
+else
+COMPILE = $(CC) -c $(CCFLAGS) $(CCINCS)
+LINK    = $(LD) $(LIBS) $(LDFLAGS)
+endif
+
+SH_LINK = $(SH_LD) $(SH_LDFLAGS)
+ST_LINK = $(AR) ru
+
+DEBUG = @DEBUG@
+
+## Sources
+
+SOURCES = $(wildcard *.c)
+OBJECTS = $(patsubst %.c,%.o,$(SOURCES))
+DEPENDS = $(SOURCES:.c=.d)
+HEADERS = $(wildcard *.h)
+CONFIGS = $(filter-out configure,$(patsubst %.in,%,$(wildcard *.in))) \
+         config.cache config.log config.status
+
+## User functions
+
+removefile = files="$(2)"; \
+         for f in $$files; do \
+          if test -f $$f; then \
+             echo "Deleting $(1): $$f"; \
+             rm -f $$f; \
+           fi; \
+         done
+
+removelink = files="$(2)"; \
+         for f in $$files; do \
+           if test -h $$f; then \
+             echo "Deleting $(1): $$f"; \
+             rm -f $$f; \
+           fi; \
+         done
+
+removedir = dirs="$(2)"; \
+         for d in $$dirs; do \
+           if test -d $$d; then \
+             echo "Removing $(1): $$d"; \
+             rm -rf $$d; \
+           fi; \
+         done
+
+### Local Variables: ***
+### mode: Makefile ***
+### End: ***
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..d69d139
--- /dev/null
@@ -0,0 +1,62 @@
+## Directory variables
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+## Directory for install
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@/@PACKAGE@
+
+## Program variables
+
+INSTALL = @INSTALL@
+
+## Compiler variables
+
+include $(top_srcdir)/Makeconf
+
+## Specific variables
+
+## Archive tools
+
+TAR      = @TAR@
+COMPRESS = @COMPRESS@
+
+@SET_MAKE@
+
+## Targets
+
+SUBDIRS = src test
+
+DIR     = $(shell basename `cd $(top_srcdir); pwd`)
+
+TARGETS = 
+
+## Generic Rules
+
+include $(top_srcdir)/Makerule
+
+## Specific rules
+
+purge:
+       @$(call removedir,"build directory",$(BUILD_LIST_DIRS) $(BUILD_DIR))
+
+archive: purge
+       test -n "`which autoconf`" && autoconf
+       ./configure
+       test -n "`which cvs2cl.pl`" && cvs2cl.pl
+       -test -n "`which devtodo`" && devtodo -T
+       make package
+
+package: purge
+       ( cd ..; \
+         test "$(DIR)" != "$(PACK)" && mv $(DIR) $(PACK); \
+         find $(PACK) \( ! -regex '.*CVS.*' \) -a -type f | \
+           xargs $(TAR) cf $(PACK).tar; \
+         $(COMPRESS) -f $(PACK).tar; \
+         test "$(DIR)" != "$(PACK)" && mv $(PACK) $(DIR); )
+
+.PHONY: archive package
diff --git a/Makerule.in b/Makerule.in
new file mode 100644 (file)
index 0000000..94a3321
--- /dev/null
@@ -0,0 +1,128 @@
+##  General rules
+
+all: all-local all-recursive
+
+all-local: $(BUILD_LIST_DIRS) $(DEPENDS) $(OBJECTS) $(TARGETS)
+
+$(BUILD_LIST_DIRS) $(install_list_dirs):%:
+       @echo "Creating directory $@"; \
+        $(MKDIR) $@
+
+install: $(install_list_dirs) install-local install-recursive
+
+install-local: all $(XTRA_INST)
+       @if test -n "$(HEADERS)"; then \
+          for header in `echo $(HEADERS)`; do \
+            rm -f $(includedir)/$$header; \
+            echo "Installing $$header in $(includedir)"; \
+            $(INSTALL_DATA) $$header $(includedir); \
+          done; \
+        fi
+       @if test -n "$(SHLIBVER)"; then \
+          rm -f $(libdir)/$(SHLIBVER); \
+          echo "Installing $(SHLIBVER) in $(libdir)"; \
+          $(INSTALL_PROGRAM) $(LIB_BUILD_DIR)/$(SHLIBVER) $(libdir); \
+        fi
+       @if test -f "$(SHLIB)"; then \
+          rm -f $(libdir)/$(SHLIB); \
+          echo "Installing $(SHLIB) in $(libdir)"; \
+          $(LN_S) $(SHLIBVER) $(libdir)/$(SHLIB); \
+        fi
+       @if test -f "$(STLIB)"; then \
+          rm -f $(libdir)/$(STLIB); \
+          echo "Installing $(STLIB) in $(libdir)"; \
+          $(INSTALL_DATA) $(LIB_BUILD_DIR)/$(STLIB) $(libdir); \
+        fi
+
+depend: $(DEPENDS)
+
+clean: clean-recursive clean-local
+
+clean-local:
+       @$(call removefile,"backup file",*~)
+       @$(call removefile,"depend file",$(DEPENDS))
+       @$(call removelink,"object link",$(OBJECTS))
+       @$(call removefile,"object file",$(addprefix $(OBJ_BUILD_DIR)/,$(OBJECTS)))
+       @$(call removefile,"tmp file",$(TMPFILES))
+
+purge: purge-recursive purge-local
+
+purge-local: clean-local
+       @$(call removefile,"config file",$(CONFIGS))
+       @$(call removelink,"library link",$(SHLIBVER) $(SHLIB) $(STLIB))
+       @$(call removefile,"library file",$(addprefix $(LIB_BUILD_DIR)/,$(SHLIBVER) $(SHLIB) $(STLIB)))
+       @$(call removelink,"binary link",$(PROGTESTS))
+       @$(call removefile,"binary file",$(addprefix $(BIN_BUILD_DIR)/,$(PROGTESTS)))
+
+## Recursive generic rule
+
+%-recursive:
+       @for subdir in $(SUBDIRS); do             \
+         if [ -f "$$subdir/Makefile" ]; then \
+           echo "Making $* in $$subdir";      \
+           $(MAKE) -s -C $$subdir $* \
+             || case "$(MFLAGS)" in *k*) fail=yes;; *) exit 1;; esac; \
+           echo "Leaving $$subdir";      \
+         fi; \
+        done && test -z "$$fail"
+
+## Prerequisites rules
+
+ifneq (,$(wildcard *.d))
+include $(wildcard *.d)
+endif
+
+## Rules for usual directory
+
+%.d: %.c
+       @set -e; \
+        echo "Creating makefile for $<"; \
+        $(CC) $(CCINCS) -MM $<  \
+          | sed 's,\($(*F)\)\.o[ :]*,\1.o $@ : ,g' > $@; \
+        test -s $@ || rm -f $@
+
+%.o: %.c
+       @echo "Compiling $<"
+       @rm -f $@
+       @$(COMPILE) $< -o $(OBJ_BUILD_DIR)/$@
+       @$(LN_S) -f $(OBJ_BUILD_DIR)/$@ $@
+
+%.a: $(OBJECTS)
+       @echo "Creating static lib $@"
+       @rm -f $@
+       @$(ST_LINK) $(LIB_BUILD_DIR)/$@ $^
+       @$(RANLIB) $(LIB_BUILD_DIR)/$@
+       @$(LN_S) -f $(LIB_BUILD_DIR)/$@ $@
+
+%.so.$(VERSION): $(OBJECTS)
+       @echo "Creating dynamic library $@"
+       @rm -f $@
+       $(SH_LINK) $^ -o $(LIB_BUILD_DIR)/$@
+ifneq (${DEBUG},true)
+       @echo "Sripping dynamic library $@"
+       @$(STRIP) $(LIB_BUILD_DIR)/$@
+endif
+       @$(LN_S) -f $(LIB_BUILD_DIR)/$@ $@
+
+%.so: %.so.$(VERSION)
+       @echo "Creating dynamic library version $@"
+       @rm -f $@
+       @$(LN_S) $< $@
+
+prog_%$(EXECEXT): %.o
+       @echo "Creating program $@"
+       @rm -f $@
+       @$(LINK) $< -o $(BIN_BUILD_DIR)/$@
+ifneq (${DEBUG},true)
+       @echo "Stripping program $@"
+       @$(STRIP) $(BIN_BUILD_DIR)/$@
+endif
+       @$(LN_S) -f $(BIN_BUILD_DIR)/$@ $@
+
+## Phony rule
+
+.PHONY: all install
+
+### Local Variables: ***
+### mode: Makefile ***
+### End: ***
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..ac09b2a
--- /dev/null
+++ b/README
@@ -0,0 +1,63 @@
+LibViterbi -- a generic Viterbi algorythm
+
+Copyright (C) 2003 Laurent S. Mazet
+
+Last updated: Tue Jul 22 15:09:20 MEST 2003
+
+
+Overview
+--------
+
+LibViberti provides a generic Viterbi algorithm and a short toolbox 
+for convolutional encoder.
+
+Installation and Bugs
+---------------------
+
+To compile LibViterbi, you will need a recent version of GNU Make, and 
+a decent version of gcc and sed.
+
+See the notes in the files INSTALL and INSTALL.LIBVITERBI for more specific
+installation instructions, including directions for installing LibViterbi
+from a binary distribution.
+
+The file BUGS contains a recommended procedure for reporting bugs, as
+well as a list of known problems and possible fixes.
+
+Documentation
+-------------
+
+LibViterbi documentation will be available on the doc directory.
+Some test programs are also available on the test directory.
+
+Performance
+-----------
+
+On a PIII-600MHz, I got these bitrates for (o171, o133) coder:
+- standard, no optimization: 105kbps
+- one branch optimization: 148kbps
+- two predecessors optimization: 190kps
+- full optimizations: 246kbps
+
+Implementation
+--------------
+
+LibViterbi is being developed with the Free Software Foundation's make,
+sed and gcc on an Intel Pentium III system running Linux/GNU. It should 
+be possible to install it on any machine that runs GCC. It may also be
+possible to install it using other implementations of these tools, but
+it will most certainly require much more work. Do yourself a favor and
+get the GNU development tools, either via anonymous ftp from ftp.gnu.org
+or by writing the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+
+Additional Information
+----------------------
+
+None.
+
+--
+Laurent S. Mazet
+laurent.mazet@motorola.com
+Centre de Recherche de Motorola
+France
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..4f771fa
--- /dev/null
@@ -0,0 +1,75 @@
+dnl aclocal.m4 -- extra macros for configuring LibViterbi
+dnl
+dnl Copyright (C) 2003 Laurent Mazet
+dnl 
+dnl This file is part of LibViterbi.
+dnl
+dnl --------------------------------------------------------------------
+dnl
+dnl Check to see if C compiler handles FLAG command line option. Add
+dnl FLAG to CCFLAGS if the compiler accepts the flag.
+dnl
+AC_DEFUN(LIBVITERBI_CC_FLAG, [
+  ac_safe=`echo "$1" | sed 'y%./+-%__p_%'`
+  AC_MSG_CHECKING(whether ${CC-gcc} accepts $1)
+  AC_CACHE_VAL(libviterbi_cv_cc_flag_$ac_safe, [
+    AC_LANG_SAVE
+    AC_LANG_CPLUSPLUS
+    XCCFLAGS="$CCFLAGS"
+    CCFLAGS="$CCFLAGS $1"
+    AC_TRY_LINK([], [],
+      eval "libviterbi_cv_cc_flag_$ac_safe=yes",
+      eval "libviterbi_cv_cc_flag_$ac_safe=no")
+    CCFLAGS="$XCCFLAGS"
+    AC_LANG_RESTORE
+  ])
+  if eval "test \"`echo '$libviterbi_cv_cc_flag_'$ac_safe`\" = yes"; then
+    AC_MSG_RESULT(yes)
+    CCFLAGS="$CCFLAGS $1"
+  else
+    AC_MSG_RESULT(no)
+  fi
+])
+dnl
+dnl Check to see if C linker handles LDFLAG command line option. Add
+dnl LDFLAG to LDFLAGS if the linker accepts the flag.
+dnl
+AC_DEFUN(LIBVITERBI_CC_LDFLAG, [
+  ac_safe=`echo "$1" | sed 'y%./+-%__p_%'`
+  AC_MSG_CHECKING(whether ${CC-gcc} accepts $1)
+  AC_CACHE_VAL(libviterbi_cv_cc_ldflag_$ac_safe, [
+    AC_LANG_SAVE
+    AC_LANG_CPLUSPLUS
+    XLDFLAGS="$LDFLAGS"
+    LDFLAGS="$LDFLAGS $1"
+    AC_TRY_LINK([], [],
+      eval "libviterbi_cv_cc_ldflag_$ac_safe=yes",
+      eval "libviterbi_cv_cc_ldflag_$ac_safe=no")
+    LDFLAGS="$XLDFLAGS"
+    AC_LANG_RESTORE
+  ])
+  if eval "test \"`echo '$libviterbi_cv_cc_ldflag_'$ac_safe`\" = yes"; then
+    AC_MSG_RESULT(yes)
+    LDFLAGS="$LDFLAGS $1"
+  else
+    AC_MSG_RESULT(no)
+  fi
+])
+dnl
+dnl Check if file changes
+dnl
+AC_DEFUN(LIBVITERBI_CHECK_CHANGE, [
+  orig="$1"
+  new="$2"
+  if test -f "$orig"; then
+    if test -z "`diff \"$orig\" \"$new\"`"; then
+      AC_MSG_RESULT("$orig is unchanged")
+      rm "$new"
+    else
+      rm "$orig"
+      mv "$new" "$orig"
+    fi
+  else
+    mv "$new" "$orig"
+  fi
+])
diff --git a/config.guess b/config.guess
new file mode 100755 (executable)
index 0000000..1d27287
--- /dev/null
@@ -0,0 +1,997 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
+#
+# This file 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.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+# Please send patches to the Autoconf mailing list <autoconf@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       cat <<EOF >$dummy.s
+       .globl main
+       .ent main
+main:
+       .frame \$30,0,\$26,0
+       .prologue 0
+       .long 0x47e03d80 # implver $0
+       lda \$2,259
+       .long 0x47e20c21 # amask $2,$1
+       srl \$1,8,\$2
+       sll \$2,2,\$2
+       sll \$0,3,\$0
+       addl \$1,\$0,\$0
+       addl \$2,\$0,\$0
+       ret \$31,(\$26),1
+       .end main
+EOF
+       ${CC-cc} $dummy.s -o $dummy 2>/dev/null
+       if test "$?" = 0 ; then
+               ./$dummy
+               case "$?" in
+                       7)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       15)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       14)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       10)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       16)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+               esac
+       fi
+       rm -f $dummy.s $dummy
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-cbm-sysv4
+       exit 0;;
+    amiga:NetBSD:*:*)
+      echo m68k-cbm-netbsd${UNAME_RELEASE}
+      exit 0 ;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit 0 ;;
+    arc64:OpenBSD:*:*)
+       echo mips64el-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hkmips:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    arm32:NetBSD:*:*)
+       echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    SR2?01:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    Pyramid*:OSx*:*:*|MIS*:OSx*:*:*|MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit 0 ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:NetBSD:*:*)
+       echo m68k-atari-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:NetBSD:*:*)
+       echo m68k-sun-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:NetBSD:*:*)
+       echo m68k-apple-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    macppc:NetBSD:*:*)
+        echo powerpc-apple-netbsd${UNAME_RELEASE}
+        exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       ${CC-cc} $dummy.c -o $dummy \
+         && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+        if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+       if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+            -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+       else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+       fi
+        else echo i586-dg-dgux${UNAME_RELEASE}
+        fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i?86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               ${CC-cc} $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+               rm -f $dummy.c $dummy
+               echo rs6000-ibm-aix3.2.5
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit 0 ;;
+    *:AIX:*:4)
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=4.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/6?? | 9000/7?? | 9000/80[024] | 9000/8?[136790] | 9000/892 )
+              sed 's/^              //' << EOF >$dummy.c
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits)
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+       (${CC-cc} $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+       rm -f $dummy.c $dummy
+       esac
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       ${CC-cc} $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    *9??*:MPE*:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    *9??*:MPE*:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i?86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+       echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY*T3E:*:*:*)
+       echo t3e-cray-unicosmk${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY-2:*:*:*)
+       echo cray2-cray-unicos
+        exit 0 ;;
+    F300:UNIX_System_V:*:*)
+        FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    F301:UNIX_System_V:*:*)
+       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+       exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+       echo m68k-hp-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    i?86:BSD/386:*:* | i?86:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       if test -x /usr/bin/objformat; then
+           if test "elf" = "`/usr/bin/objformat`"; then
+               echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
+               exit 0
+           fi
+       fi
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit 0 ;;
+    *:NetBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    *:Linux:*:*)
+#      # uname on the ARM produces all sorts of strangeness, and we need to
+#      # filter it out.
+#      case "$UNAME_MACHINE" in
+#        armv*)                      UNAME_MACHINE=$UNAME_MACHINE ;;
+#        arm* | sa110*)              UNAME_MACHINE="arm" ;;
+#      esac
+
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us.
+       ld_help_string=`ld --help 2>&1`
+       ld_supported_emulations=`echo $ld_help_string \
+                        | sed -ne '/supported emulations:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported emulations: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_emulations" in
+         i?86linux)  echo "${UNAME_MACHINE}-pc-linux-gnuaout"      ; exit 0 ;;
+         i?86coff)   echo "${UNAME_MACHINE}-pc-linux-gnucoff"      ; exit 0 ;;
+         sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         armlinux)   echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         m68klinux)  echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         elf32arm)   echo "${UNAME_MACHINE}-unknown-linux-gnu"     ; exit 0 ;;
+         elf32ppc)   echo "powerpc-unknown-linux-gnu"              ; exit 0 ;;
+       esac
+
+       if test "${UNAME_MACHINE}" = "alpha" ; then
+               sed 's/^        //'  <<EOF >$dummy.s
+               .globl main
+               .ent main
+       main:
+               .frame \$30,0,\$26,0
+               .prologue 0
+               .long 0x47e03d80 # implver $0
+               lda \$2,259
+               .long 0x47e20c21 # amask $2,$1
+               srl \$1,8,\$2
+               sll \$2,2,\$2
+               sll \$0,3,\$0
+               addl \$1,\$0,\$0
+               addl \$2,\$0,\$0
+               ret \$31,(\$26),1
+               .end main
+EOF
+               LIBC=""
+               ${CC-cc} $dummy.s -o $dummy 2>/dev/null
+               if test "$?" = 0 ; then
+                       ./$dummy
+                       case "$?" in
+                       7)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       15)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       14)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       10)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       16)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+                       esac
+
+                       objdump --private-headers $dummy | \
+                         grep ld.so.1 > /dev/null
+                       if test "$?" = 0 ; then
+                               LIBC="libc1"
+                       fi
+               fi
+               rm -f $dummy.s $dummy
+               echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+       elif test "${UNAME_MACHINE}" = "mips" ; then
+         cat >$dummy.c <<EOF
+#ifdef __cplusplus
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __MIPSEB__
+  printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+  printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         ${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+         rm -f $dummy.c $dummy
+       else
+         # Either a pre-BFD a.out linker (linux-gnuoldld)
+         # or one that does not give us useful --help.
+         # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+         # If ld does not provide *any* "supported emulations:"
+         # that means it is gnuoldld.
+         echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+         test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+         case "${UNAME_MACHINE}" in
+         i?86)
+           VENDOR=pc;
+           ;;
+         *)
+           VENDOR=unknown;
+           ;;
+         esac
+         # Determine whether the default compiler is a.out or elf
+         cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         ${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+         rm -f $dummy.c $dummy
+       fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+    i?86:DYNIX/ptx:4*:*)
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    i?86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit 0 ;;
+    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    i?86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    i?86:UnixWare:*:*)
+       if /bin/uname -X 2>/dev/null >/dev/null ; then
+         (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+           && UNAME_MACHINE=i586
+       fi
+       echo ${UNAME_MACHINE}-unixware-${UNAME_RELEASE}-${UNAME_VERSION}
+       exit 0 ;;
+    pc:*:*:*)
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+       echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:*:6*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R4000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit 0 ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit 0 ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+  printf ("vax-dec-bsd\n"); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.sub b/config.sub
new file mode 100755 (executable)
index 0000000..ecf770c
--- /dev/null
@@ -0,0 +1,979 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file 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.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+       echo Configuration name missing. 1>&2
+       echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+       echo "or     $0 ALIAS" 1>&2
+       echo where ALIAS is a recognized configuration type. 1>&2
+       exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+       *local*)
+               echo $1
+               exit 0
+               ;;
+       *)
+       ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  linux-gnu*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple)
+               os=
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+               | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
+               | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 | hppa2.0 \
+               | hppa2.0w \
+               | alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
+               | i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
+               | mips64 | mipsel | mips64el | mips64orion | mips64orionel \
+               | mipstx39 | mipstx39el | armv[34][lb] \
+               | sparc | sparclet | sparclite | sparc64 | v850)
+               basic_machine=$basic_machine-unknown
+               ;;
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i[34567]86)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+             | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+             | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+             | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
+             | xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* \
+             | hppa2.0w-* \
+             | alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
+             | ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
+             | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+             | sparc64-* | mips64-* | mipsel-* | armv[34][lb]-*\
+             | mips64el-* | mips64orion-* | mips64orionel-*  \
+             | mipstx39-* | mipstx39el-* \
+             | f301-* | armv*-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-cbm
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-cbm
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-cbm
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       cray2)
+               basic_machine=cray2-cray
+               os=-unicos
+               ;;
+       [ctj]90-cray)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               os=-mpeix
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               os=-mpeix
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i[34567]86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i[34567]86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i[34567]86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i[34567]86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       mipsel*-linux*)
+               basic_machine=mipsel-unknown
+               os=-linux-gnu
+               ;;
+       mips*-linux*)
+               basic_machine=mips-unknown
+               os=-linux-gnu
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netwinder)
+               basic_machine=armv4l-corel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+        pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5 | k5 | nexen)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | k6 | 6x86)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | nexen-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | k6-* | 6x86-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=rs6000-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       xmp)
+               basic_machine=xmp-cray
+               os=-unicos
+               ;;
+        xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       mips)
+               if [ x$os = x-linux-gnu ]; then
+                       basic_machine=mips-unknown
+               else
+                       basic_machine=mips-mips
+               fi
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sparc)
+               basic_machine=sparc-sun
+               ;;
+        cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -rhapsody* \
+             | -openstep* | -mpeix* | -oskit*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-corel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+        pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+        *-gould)
+               os=-sysv
+               ;;
+        *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+        *-sgi)
+               os=-irix
+               ;;
+        *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f301-fujitsu)
+               os=-uxpv
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..9690212
--- /dev/null
@@ -0,0 +1,266 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(src/trellis.h)
+
+AC_CANONICAL_HOST
+
+dnl Generate config.h
+
+dnl Minimum Autoconf version required.
+AC_PREREQ(2.10)
+
+dnl Version code
+V_MAJOR=1
+V_MINOR=2
+V_MICRO=0
+
+VERSION=${V_MAJOR}.${V_MINOR}.${V_MICRO}
+AC_SUBST(VERSION)
+
+dnl Package name
+PACKAGE=viterbi
+AC_SUBST(PACKAGE)
+
+dnl Library name
+LIBRARY=viterbi
+AC_SUBST(LIBRARY)
+
+dnl Check C compiler
+
+AC_PROG_CC
+
+dnl Check compileur options
+
+OLDCCFLAGS="$CCFLAGS"
+CCFLAGS=""
+LIBVITERBI_CC_FLAG(-O3)
+if test "$libviterbi_cv_cc_flag__O3" = "no"; then
+  LIBVITERBI_CC_FLAG(-O2)
+  if test "$libviterbi_cv_cc_flag__O2" = "no"; then
+    CCFLAGS="$OLDCCFLAGS"
+  fi
+fi  
+
+LIBVITERBI_CC_FLAG(-pipe)
+LIBVITERBI_CC_FLAG(-Wall)
+
+dnl Checks for programs.
+
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+AC_PROG_LN_S
+AC_PROG_RANLIB
+
+AC_CHECK_PROGS(AR, ar)
+if test "$AR" = ""; then
+  if $STATIC_LIBS; then
+    AC_MSG_ERROR([Unable to found ar]);
+  fi
+fi
+AC_SUBST(AR)
+
+AC_CHECK_PROGS(STRIP, strip)
+if test "$STRIP" = ""; then
+  AC_MSG_WARN([Unable to found strip]);
+fi
+AC_SUBST(STRIP)
+
+AC_CHECK_PROGS(BASENAME, basename)
+if test "$BASENAME" = ""; then
+  AC_MSG_ERROR([Unable to found basename]);
+fi
+AC_SUBST(BASENAME)
+
+AC_CHECK_PROGS(TAR, gtar tar)
+if test -z "$TAR"; then
+  AC_MSG_WARN([Unable to found tar]);
+fi
+AC_SUBST(TAR)
+
+AC_CHECK_PROGS(COMPRESS, bzip2 gzip compress)
+if test -z "$COMPRESS"; then
+  AC_MSG_WARN([Unable to found compress]);
+fi
+AC_SUBST(COMPRESS)
+
+dnl Checks for libraries.
+
+dnl Checks for header files.
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+
+dnl Check options
+
+### Usage of a temporary directory
+
+BUILD_DIR="build"
+AC_ARG_ENABLE(builddir,
+  [  --enable-builddir=<dir> use <dir> for object files],
+  [case "$enableval" in
+     no)
+       ;;
+     yes)
+       BUILD_DIR="/tmp/`whoami`/$PACKAGE"
+       ;;
+     *)
+       BUILD_DIR="$enableval"
+       ;;
+  esac], [])
+changequote(,)dnl
+BUILD_DIR=`echo $BUILD_DIR | sed -e 's%^\([^/]\)%$(top_srcdir)/\1%'`
+changequote([,])dnl
+AC_SUBST(BUILD_DIR)
+
+### Enable creation of static libraries.
+
+AC_ARG_ENABLE(static,
+  [  --enable-static         create static libraries],
+  [if test "$enableval" = no; then STATIC_LIBS=false;
+   else STATIC_LIBS=true; fi],
+  STATIC_LIBS=true)
+AC_SUBST(STATIC_LIBS)
+
+### enable debugging information
+
+AC_ARG_WITH(debug,
+  [  --with-debug            add debug information],
+  [if test "$withval" = no; then DEBUG=false;
+   else DEBUG=true; fi],
+  DEBUG=false)
+AC_SUBST(DEBUG)
+
+### with profiling information
+
+AC_ARG_WITH(profile,
+  [  --with-profile          add profiling information (for gprof)],
+  [if test "$withval" = no; then PROFILE=false;
+   else PROFILE=true; fi],
+  PROFILE=false)
+  
+if test "$PROFILE" = true; then
+  DEBUG=true
+fi
+
+## check debugging flags
+
+if test "$DEBUG" = true; then
+  LIBVITERBI_CC_FLAG(-ggdb3)
+  if test "$libviterbi_cv_cc_flag__ggdb3" = "no"; then
+    LIBVITERBI_CC_FLAG(-g)
+    if test "$libviterbi_cv_cc_flag__g" = "no"; then
+      AC_MSG_ERROR([Can't add debugging information with this compiler!])
+    fi
+  fi
+fi
+
+## check profiling flags
+
+if test "$PROFILE" = true; then
+  LIBVITERBI_CC_LDFLAG(-pg)
+  if test "$libviterbi_cv_cc_ldflag__pg" = "no"; then
+    AC_MSG_ERROR([Can't add profiling information with this compiler!])
+  fi
+fi
+
+### Enable creation of shared libraries.  Currently only works with
+### gcc on some systems.
+
+AC_ARG_ENABLE(shared,
+  [  --enable-shared         create shared libraries (not all systems)],
+  [if test "$enableval" = no; then SHARED_LIBS=false;
+   else SHARED_LIBS=true; fi],
+  SHARED_LIBS=true)
+AC_SUBST(SHARED_LIBS)
+
+dnl Some check for cygwin
+
+case "$host" in
+  *-*-cygwin*)
+    SHARED_LIBS=false
+    ;;
+esac
+
+if $STATIC_LIBS || $SHARED_LIBS; then
+  true
+else
+  AC_MSG_ERROR([You can't disable building static AND shared libraries!])
+fi
+
+### 
+
+use_rpath=true
+AC_ARG_ENABLE(rpath,
+  [  --enable-rpath          add -rpath to link command for shared libraries],
+  [if test "$enableval" = no; then use_rpath=false; fi], [])
+
+CCPICFLAG=-fPIC
+SHLEXT=so
+STLEXT=a
+SH_LD="$CC"
+SH_LDFLAGS=-shared
+SONAME_FLAGS=
+RLD_FLAG=
+EXECEXT=""
+case "$host" in
+  *-*-386bsd* | *-*-openbsd* | *-*-netbsd* | *-*-freebsd*)
+    SH_LD=ld
+    SH_LDFLAGS=-Bshareable
+  ;;
+  *-*-cygwin*)
+    EXECEXT=".exe"
+  ;;
+  *-*-linux*)
+    SONAME_FLAGS='-Xlinker -soname -Xlinker $(shell $(BASENAME) $@)'
+    RLD_FLAG='-Xlinker -rpath -Xlinker $(shell cd $(LIB_BUILD_DIR); pwd)'
+  ;;
+  hppa*-hp-hpux*)
+    SHLEXT=sl
+    SH_LDFLAGS="-shared -fPIC"
+    RLD_FLAG='-Xlinker +b -Xlinker $(shell cd $(LIB_BUILD_DIR); pwd)'
+  ;;
+  sparc-sun-solaris2* | i386-pc-solaris2*)
+    RLD_FLAG='-Xlinker -R -Xlinker $(shell cd $(LIB_BUILD_DIR); pwd)'
+  ;;
+  *)
+    if $SHARED_LIBS; then
+      AC_MSG_ERROR([I don't know how to handle this machine. Correct me first!])
+    fi
+  ;;
+esac
+
+if $use_rpath; then
+  true
+else
+  RLD_FLAG=
+fi
+
+AC_SUBST(CCFLAGS)
+AC_SUBST(CCPICFLAG)
+AC_SUBST(SHLEXT)
+AC_SUBST(STLEXT)
+AC_SUBST(SH_LD)
+AC_SUBST(SH_LDFLAGS)
+AC_SUBST(SONAME_FLAGS)
+AC_SUBST(RLD_FLAG)
+AC_SUBST(EXECEXT)
+
+dnl Set CC and LD variable
+
+LD=$CC
+AC_SUBST(LD)
+
+dnl Generate ouputs
+
+AC_OUTPUT(
+[ Makeconf
+  Makefile
+  Makerule
+  src/viterbiversion.t
+  src/Makefile
+  test/Makefile
+])
+
+AC_OUTPUT_COMMANDS(
+  LIBVITERBI_CHECK_CHANGE("src/viterbiversion.h", "src/viterbiversion.t")
+)
diff --git a/doc/coders.txt b/doc/coders.txt
new file mode 100644 (file)
index 0000000..761970b
--- /dev/null
@@ -0,0 +1,105 @@
+#inputs #outs   #regs   g0      g1      dfree
+1       2       2       5       7       5
+1       2       3       15      17      6
+1       2       4       23      35      7
+1       2       5       65      57      8
+1       2       6       133     171     10
+1       2       7       345     237     10
+1       2       8       561     753     12
+1       2       9       1161    1545    12
+1       2       10      2335    3661    14
+1       2       11      4335    5723    15
+1       2       12      10533   17661   16
+1       2       13      21675   27123   16
+1       2       14      56721   61713   18
+1       2       15      111653  145665  19
+1       2       16      347241  246277  20
+
+#inputs #outs   #regs   g0      g1      g2      dfree
+1       3       2       5       7       7       8
+1       3       3       13      15      17      10
+1       3       4       25      33      37      12
+1       3       5       47      53      75      13
+1       3       6       133     145     175     15
+1       3       7       225     331     367     16
+1       3       8       557     663     711     18
+1       3       9       1117    1365    1633    20
+1       3       10      2353    2671    3175    22
+1       3       11      4767    5723    6265    24
+1       3       12      10533   10675   17661   24
+1       3       13      21645   35661   37133   26
+
+#inputs #outs   #regs   g0      g1      g2      dfree
+2       3       3       17      06      15      3
+2       3       5       27      75      72      5
+2       3       7       236     155     337     7
+
+#inputs #outs   #regs   g0      g1      g2      g3      g4      dfree
+2       5       3       17      07      11      12      04      6
+2       5       5       27      71      52      65      57      10
+2       5       7       247     366     171     266     373     12
+3       5       5       35      23      75      61      47      5
+4       5       7       237     274     156     255     337     3
+
+#inputs #outs   #regs   g0      g1      g2      g3      g4      g5      g6      dfree
+2       7       3       05      06      12      15      15      13      17      9
+2       7       5       33      55      72      47      25      53      75      14
+2       7       7       312     125     247     366     171     266     373     18
+3       7       5       45      21      36      62      57      43      71      8
+4       7       7       130     067     237     274     156     255     337     6
+
+#inputs #outs   #regs   g0      g1      g2      g3      dfree
+3       4       5       13      25      61      47      4
+
+#inputs #outs   #regs   g0      g1      g2      g3      g4      g5      g6      g7      dfree
+3       8       5       15      42      23      61      51      36      75      47      8
+
+#inputs #outs   #regs   g0      g1      g2      g3      dfree
+1       4       2       5       7       7       7       10
+1       4       3       13      15      15      17      13
+1       4       4       25      27      33      37      16
+1       4       5       53      67      71      75      18
+1       4       6       135     135     147     163     20
+1       4       7       235     275     313     357     22
+1       4       8       463     535     733     745     24
+1       4       9       1117    1365    1633    1653    27
+1       4       10      2387    2353    2671    3175    29
+1       4       11      4767    5723    6265    7455    32
+1       4       12      11145   12477   15537   16727   33
+1       4       13      21113   23175   35527   35537   36
+
+#inputs #outs   #regs   g0      g1      g2      g3      g4      dfree
+1       5       2       7       7       7       5       5       13
+1       5       3       17      17      13      15      15      16
+1       5       4       37      27      33      25      35      20
+1       5       5       75      71      73      65      57      22
+1       5       6       175     131     135     135     147     25
+1       5       7       257     233     323     271     357     28
+
+#inputs #outs   #regs   g0      g1      g2      g3      g4      g5      dfree
+1       6       2       7       7       7       7       5       5       16
+1       6       3       17      17      13      13      15      15      20
+1       6       4       37      35      27      33      25      35      24
+1       6       5       73      75      55      65      47      57      27
+1       6       6       173     151     135     135     163     137     30
+1       6       7       253     375     331     235     313     357     34
+
+
+#inputs #outs   #regs   g0      g1      g2      g3      g4      g5      g6      dfree
+1       7       2       7       7       7       7       5       5       5       18
+1       7       3       17      17      13      13      13      15      15      23
+1       7       4       35      27      25      27      33      35      37      28
+1       7       5       53      75      65      75      47      67      57      32
+1       7       6       165     145     173     135     135     147     137     36
+1       7       7       275     253     375     331     235     313     357     40
+
+#inputs #outs   #regs   g0      g1      g2      g3      g4      g5      g6      g7      dfree
+1       8       2       7       7       5       5       5       7       7       7       21
+1       8       3       17      17      13      13      13      15      15      17      26
+1       8       4       37      33      25      25      35      33      27      37      32
+1       8       5       57      73      51      65      75      47      67      57      36
+1       8       6       153     111     165     173     135     135     147     137     40
+1       8       7       275     275     253     371     331     235     313     357     45
+
+## grep -v \^# coders.txt | awk 'NF>0 {printf "l=\"%d", $1; for (i=2;i<NF;i++) printf " %d", $(i); printf "\"; [ $(eval $(echo prog_test 1 $l) | grep \"Nb errors =\" | cut -d\" \" -f 4) != 0 ] && echo $l\n"}'
+## grep -v \^# coders.txt | awk 'NF>0 {printf "%d", $1; for (i=2;i<NF;i++) printf " %d", $(i); printf "\n"}'
\ No newline at end of file
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/mkinstalldirs b/mkinstalldirs
new file mode 100755 (executable)
index 0000000..06503d3
--- /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 2253 2006-08-29 08:42:29Z alm002 $
+
+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/src/Makefile.in b/src/Makefile.in
new file mode 100644 (file)
index 0000000..08ceb65
--- /dev/null
@@ -0,0 +1,36 @@
+## Directory variables
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+## Directory for install
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@/@PACKAGE@
+
+## Program variables
+
+INSTALL = @INSTALL@
+
+## Generic variables
+
+include $(top_srcdir)/Makeconf
+
+## Specific variables
+
+ifeq ($(SHARED_LIBS),true)
+SHLIB    = lib@LIBRARY@.@SHLEXT@
+SHLIBVER = $(SHLIB).@VERSION@
+endif
+
+ifeq ($(STATIC_LIBS),true)
+STLIB = lib@LIBRARY@.@STLEXT@
+endif
+
+TARGETS = $(OBJECTS) $(SHLIBVER) $(SHLIB) $(STLIB)
+
+## Generic rules
+
+include $(top_srcdir)/Makerule
diff --git a/src/create_trellis.c b/src/create_trellis.c
new file mode 100644 (file)
index 0000000..7731c7d
--- /dev/null
@@ -0,0 +1,202 @@
+/* -*- C -*- */
+
+/*
+
+Copyright (C) 2003 Laurent Mazet
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/* Generic trellis constructors */
+
+#include <stdio.h>
+
+#include "encoder.h"
+#include "trellis.h"
+
+#include "create_trellis.h"
+
+/* Trellis creation from convolutionnal encoder */
+trellis *create_trellis_from_conv_encoder (conv_encoder *enc,
+                                           int history_size) {
+
+  int i, j, k, l;
+  int buf_size = enc->nb_registers + enc->nb_inputs;
+
+  /* # of possible symbol in the constellation or bits
+   * associated to a branch (trellis transition)
+   * Need to reduce the trellis ! */
+  int nb_symb_branch = 1<<enc->nb_unprotected_bits;
+
+  /* compute # of predecessors states in the trellis per node */
+  int nb_preds = 1 << enc->nb_inputs;
+
+  /* compute # of states in the trellis */
+  int nb_states = 1 << enc->nb_registers;
+  
+  /* allocate a new trellis */
+  trellis *tr = alloc_trellis(nb_preds, nb_states, nb_symb_branch,
+                              history_size);
+
+  /* read coders */
+  for (i=0; i<nb_states; i++) {
+  
+    /* uncoded symbol */
+    for (k=0; k<nb_symb_branch; k++)
+      tr->trellis_symbs[i][k] = (k << enc->nb_inputs) | (i >> (enc->nb_registers - enc->nb_inputs));
+
+    for (j=0; j<nb_preds; j++) {
+      int codeword = 0;
+      
+      /* full state */
+      int state = (i << enc->nb_inputs) | j;
+
+      /* compute table of state predecessors */
+      tr->trellis_states[i][j] = state & (nb_states-1);
+    
+      for (k=0; k<enc->nb_coders; k++) {
+        int bit = 0;
+        
+        /* look for the emitted symbols/bits when the trellis is at state
+         * and the symbol/bits out of the register is j. */
+        int bits = state & enc->coders[k];
+        
+        /* do an addition modulo 2 */
+        for (l=0; (l<buf_size) && (bits); l++, bits >>=1)
+          bit ^= bits & 1;
+        
+        /* Dont forget the bit oder is reverse from the array */
+        codeword = (codeword << 1) | bit;
+      }
+
+      /* table of possible symbols/bits per trellis branch */
+      for (k=0; k<nb_symb_branch; k++)
+        tr->trellis_branch[i][j][k] = (k << enc->nb_coders) | codeword;
+    }
+        
+  }
+  
+  return tr;
+}
+
+/* Display a trellis structure */
+void display_trellis_structure (trellis *tr) {
+  int i, j, k;
+
+  /* number of predecessors */
+  printf ("# preds: %d\t", tr->nb_preds);
+
+  /* number of states */
+  printf ("# states: %d\t", tr->nb_states);
+  
+  /* number of symbol per branch */
+  printf ("# symb/b: %d\t", tr->nb_symb_branch);
+
+  /* history size */
+  printf ("history: %d\n", tr->history_size);
+
+  /* description of the trellis */
+  printf ("states / trellis symbols / trellis precessors / trellis branch:\n");
+
+  /* state */
+  printf ("i");
+
+  /* symbol(s) */
+  if (tr->nb_symb_branch == 1) 
+    printf ("\ty");
+  else
+    for (k=0; k<tr->nb_symb_branch; k++)
+      printf ("\ty(%d)", k);
+
+  /* predecessors */
+  for (j=0; j<tr->nb_preds; j++)
+    printf ("\ts(%d)", j);
+
+  /* codewords */
+  if (tr->nb_symb_branch == 1)  
+    for (j=0; j<tr->nb_preds; j++)
+      printf ("\tb(%d)", j);
+  else
+    for (j=0; j<tr->nb_preds; j++)
+      for (k=0; k<tr->nb_symb_branch; k++)
+        printf ("\tb(%d|%d)", j, k);
+  printf ("\n");
+
+  /* for each state */
+  for (i=0; i<tr->nb_states; i++) {
+
+    /* state */
+    printf ("%d", i);
+
+    /* symbol(s) */
+    for (k=0; k<tr->nb_symb_branch; k++)
+      printf ("\t%d",tr-> trellis_symbs[i][k]);
+
+    /* predecessors */
+    for (j=0; j<tr->nb_preds; j++)
+      printf ("\t%d", tr->trellis_states[i][j]);
+
+    /* codewords */
+    for (j=0; j<tr->nb_preds; j++)
+      for (k=0; k<tr->nb_symb_branch; k++)
+        printf ("\t%d", tr->trellis_branch[i][j][k]);
+
+    printf ("\n");
+  }
+  
+  /* last decoded symbol */
+  printf ("l. dec.: %d\t", tr->last_decoded_symbol);
+
+  /* current time */
+  printf ("c. time: %d\t", tr->current_time);
+
+  /* current index (circular buffer) */
+  printf ("c. index: %d\t", tr->current_index);
+
+  /* error code */
+  printf ("err. code: %d\n", tr->error_code);
+}
+  
+/* Display trellis memory */
+void display_trellis_memory (trellis *tr, char *format) {
+  char default_format[] = " %f";
+  char *_format;
+  int i;
+
+  _format = (format == NULL) ? default_format : format;
+
+  /* display metrics of nodes */
+  printf ("metrics nodes:");
+  for (i=0; i<tr->nb_states; i++)
+    printf (_format, tr->metrics_node[i]);
+  printf("\n");
+
+   /* display states in memory */
+  printf ("memory states [%d/%d]:", tr->current_index, tr->current_time);
+  for (i=0; i<tr->nb_states; i++)
+    printf (" %d", tr->memory_states[tr->current_index][i]);
+  printf("\n");
+  
+  /* display symbols in memory */
+  printf ("memory symbols [%d/%d]:", tr->current_index, tr->current_time);
+  for (i=0; i<tr->nb_states; i++)
+    printf (" %d", tr->memory_symbols[tr->current_index][i]);
+  printf("\n");
+}
diff --git a/src/create_trellis.h b/src/create_trellis.h
new file mode 100644 (file)
index 0000000..3b81d66
--- /dev/null
@@ -0,0 +1,42 @@
+/* -*- C -*- */
+
+/*
+
+Copyright (C) 2003 Laurent Mazet
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/* Generic trellis constructors */
+
+#if !defined(__CREATE_TRELLIS_H__)
+#define __CREATE_TRELLIS_H__
+
+#include "encoder.h"
+#include "trellis.h"
+
+trellis *create_trellis_from_conv_encoder (conv_encoder *enc,
+                                           int history_size);
+
+void display_trellis_structure (trellis *tr);
+
+void display_trellis_memory (trellis *tr, char *format);
+
+#endif /* __CREATE_TRELLIS_H__ */
diff --git a/src/encoder.c b/src/encoder.c
new file mode 100644 (file)
index 0000000..70bd6e8
--- /dev/null
@@ -0,0 +1,109 @@
+/* -*- C -*- */
+
+/*
+
+Copyright (C) 2003 Laurent Mazet
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/* Generic encoder */
+
+#include <malloc.h>
+#include <string.h>
+
+#include "encoder.h"
+
+/* Convolutionnal encoder allocation */
+conv_encoder *alloc_conv_encoder (int nb_unprotected_bits, int nb_inputs,
+                                  int nb_registers, int nb_coders,
+                                  int *coders) {
+  conv_encoder *enc;
+  
+  enc = (conv_encoder*) malloc (sizeof(conv_encoder));
+
+  enc->nb_unprotected_bits = nb_unprotected_bits;
+  enc->nb_inputs = nb_inputs;
+  enc->nb_coders = nb_coders;
+  
+  enc->coders = (int*) malloc(nb_coders*sizeof(int));
+  memcpy(enc->coders, coders, nb_coders*sizeof(int));
+  
+  enc->nb_registers = nb_registers;
+  reset_conv_encoder (enc);
+    
+  return enc;
+}
+
+/* Convolutionnal encoder reset */
+void reset_conv_encoder (conv_encoder *enc) {
+
+  enc->registers = 0;
+}
+
+/* Convolutionnal encoder free */
+void free_conv_encoder (conv_encoder *enc) {
+  
+  free (enc->coders);
+  free (enc);
+}
+
+/* Convolutionnal encoding */
+void conv_encoding (bit *y, bit *x, int xlen, conv_encoder *enc) {
+
+  int i, j, k;
+  int inlen = xlen / (enc->nb_inputs + enc->nb_unprotected_bits);
+  int buf_size = enc->nb_registers + enc->nb_inputs;
+  int xpos, ypos;
+  
+  xpos = ypos = 0;
+  for (i=0; i<inlen; i++) {
+    int input = 0;
+    
+    /* process unprotected bits */
+    for (j=0; j<enc->nb_unprotected_bits; j++)
+      y[ypos++] = x[xpos++];
+    
+    /* get the input bits */
+    for (j=0; j<enc->nb_inputs; j++)
+      input = (input << 1) | x[xpos++];
+    
+    /* put them into the register field */
+    enc->registers |= input << enc->nb_registers;
+    
+    /* for all encoders */
+    for (j=0; j<enc->nb_coders; j++) {
+      int bit = 0;
+
+      /* do the convolution */
+      int bits = enc->registers & enc->coders[j];
+
+      /* do an addition modulo 2 */
+      for (k=0; (k<buf_size) && (bits); k++, bits >>=1)
+        bit ^= bits & 1;
+            
+      y[ypos++] = bit;
+    }
+    
+    /* move bits into the register field */
+    enc->registers >>= enc->nb_inputs;
+    
+  }
+}
diff --git a/src/encoder.h b/src/encoder.h
new file mode 100644 (file)
index 0000000..8a30de8
--- /dev/null
@@ -0,0 +1,56 @@
+/* -*- C -*- */
+
+/*
+
+Copyright (C) 2003 Laurent Mazet
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/* Generic encoder */
+
+#if !defined(__ENCODER_H__)
+#define __ENCODER_H__
+
+/* Bit definition */
+typedef char bit;
+
+/* Convolutional encoder definition */
+typedef struct {
+  int nb_unprotected_bits;
+  int nb_inputs;
+  int nb_registers;
+  int registers;
+  int nb_coders;
+  int *coders;
+} conv_encoder;
+
+/* Convolution encoder functions */
+
+conv_encoder *alloc_conv_encoder (int nb_unprotected_bits, int nb_inputs, int nb_registers,
+                                  int nb_coders, int *coders);
+
+void reset_conv_encoder (conv_encoder *enc);
+
+void free_conv_encoder (conv_encoder *enc);
+
+void conv_encoding (bit *y, bit *x, int xlen, conv_encoder *enc);
+
+#endif /* __ENCODER_H__ */
diff --git a/src/trellis.c b/src/trellis.c
new file mode 100644 (file)
index 0000000..e736710
--- /dev/null
@@ -0,0 +1,655 @@
+/* -*- C -*- */
+
+/*
+
+Copyright (C) 1997 Karine Gosse and Marc de Courville
+Copyright (C) 1997-2003 Veronique Buzenac
+Copyright (C) 2003 Laurent Mazet
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/* Generic Viterbi Decoder with soft decisions. */
+
+#if !defined (__TRELLIS_C__)
+#define __TRELLIS_C__ 1
+
+#include <values.h>
+#include <malloc.h>
+#include <string.h>
+
+#include "trellis.h"
+
+/* Terminology:
+ * ============
+ * node or state: point of a trellis
+ * predecessor: previous state or node in the trellis
+ * branch: transition linking two nodes of the trellis
+ * symbols: possibly several symbols/bits can be associated to a branch
+ * deepness: number of transitions before you feel all the paths have 
+ * converged for a secure decoding
+ * decode_window: number of symbols/bits that are decoded per backtracking
+ * history_size: total size of the circular buffer recording the history of
+ * the ACS process
+ * ACS: add compare select operation
+ * backtracking/traceback: decoding by following the predecessors of the
+ * elected trellis node
+ */
+
+/* Viterbi algorithm principle:
+ * ============================
+ *
+ * ACS at time t
+ *
+ * - for each node_i (0<=i<nb_states) of the trellis
+ *
+ *   - for each predecessor_j(i) of node_i listed in trellis_states(i,j)
+ *     (0<=j<nb_preds)
+ *
+ *     - for each symbol_k(i,j) (0<=k<nb_symb_branch) 
+ *       associates to the branch linking states predecessor_j and node_i
+ *       listed in trellis_branch(i*nb_preds+j,k)
+ *
+ *       - compute the symbol metric accross the received samples
+ *         (metric calculation) metric_symbol(i,j,k)
+ *         metric_symbol(i,j,k)=compute_dist(symbol_k(i,j),received_sample)
+ *
+ *     - elect the symbol_{k_min(i,j)} that contributes to the smallest
+ *       branch metric linking predecessor_j and node_i 
+ *       k_min(i,j)=argmin_k metric_symbol(i,j,k)
+ *       this becomes the branch metric: 
+ *       metric_branch(i,j)=metric_symbol(i,j,k_min(i,j))
+ *
+ *   - elect the predecessor_{j_min(i)}(i) of node_i that leads to
+ *     the smallest node metric 
+ *     j_min(i)=argmin_j metric_node(j)+metric_branch(i,j)
+ *
+ *   - the resulting node metric is:
+ *     metric_node(i)=metric_node(j_min(i))+metric_branch(i,j_min(i))
+ *
+ *   - update history of the trellis:
+ *     memory_states(t,i)=j_min(i)
+ *     memory_symbols(t,i)=symbol_{k_min(i,j_min(i))}(i,j_min(i))
+ *
+ * Before the backtracking we might need to elect the node from which
+ * the backtracking is performed.
+ * If we deal with a closed trellis the choice is simple: this is
+ * the forced final state of the encoder.
+ * Meanwhile if we still need to decode something the best starting state
+ * is the one with the smallest node metric.
+ *
+ * Backtracking(t,i,d,w) at time t from node i for a deepness of d with
+ * a decoding window of w
+ * w symbols/bits are decoded 
+ *
+ * - state=i
+ * - for pos from t to t-d+1 by step -1
+ *   - move backward in the trellis using memory_states table
+ *     state=memory_states(pos,i)
+ * - end pos is t-d
+ * - for pos from t-d to t-d-w+1 by step -1
+ *   - perform the decoding using memory_symbols
+ *     decoded_symbol(pos)=memory_symbols(t,i)
+ *   - move backward in the trellis using memory_states table
+ *     state=memory_states(pos,i)
+ *
+ * Examples of usage of Batracking(t,i,d,w)
+ * - closed trellis for decoding at the end of the burst: d=0,w=history_size
+ * - one backtracking at each received symbol: d=*,w=1
+ * - when you need some confidence on bits decoded in other algorithms: d=*,w=*
+ */
+
+/* Trellis allocation */
+trellis *alloc_trellis(int nb_preds, int nb_states, int nb_symb_branch,
+                       int history_size) {
+
+  trellis *tr;
+  int i, j;
+  tr = (trellis*) malloc (sizeof(trellis));
+  
+  tr->nb_preds = nb_preds;
+  tr->nb_states = nb_states;
+  tr->nb_symb_branch = nb_symb_branch;
+  tr->history_size = history_size;
+  
+  tr->trellis_states = (int**) malloc (nb_states * sizeof(int*));
+  tr->trellis_states[0] = (int*) malloc (nb_preds*nb_states * sizeof(int));
+  for (i=0; i<nb_states; i++)
+    tr->trellis_states[i] = tr->trellis_states[0] + i*nb_preds;
+
+  tr->trellis_symbs = (int**) malloc (nb_states * sizeof(int*));
+  tr->trellis_symbs[0] = (int*) malloc (nb_states*nb_symb_branch * sizeof(int));
+  for (i=0; i<nb_states; i++)
+    tr->trellis_symbs[i] = tr->trellis_symbs[0] + i*nb_symb_branch;
+
+  tr->trellis_branch = (int***) malloc (nb_states * sizeof(int**));
+  for (i=0; i<nb_states; i++)
+    tr->trellis_branch[i] = (int**) malloc (nb_preds * sizeof(int*));
+  tr->trellis_branch[0][0] = (int*) malloc (nb_states*nb_preds*nb_symb_branch * sizeof(int));
+  for (i=0; i<nb_states; i++)
+    for (j=0; j<nb_preds; j++)
+      if ((i!=0) || (j!=0))
+        tr->trellis_branch[i][j] = tr->trellis_branch[0][0] + (i*nb_preds+j)*nb_symb_branch;
+  
+  tr->memory_symbols = (int**) malloc (history_size * sizeof(int*));
+  for (i=0; i<history_size; i++)
+    tr->memory_symbols[i] = (int*) malloc (nb_states * sizeof(int));
+
+  tr->memory_states = (int**) malloc (history_size * sizeof(int*));
+  for (i=0; i<history_size; i++)
+    tr->memory_states[i] = (int*) malloc (nb_states * sizeof(int));
+  
+  tr->metrics_node = (metric_t*) malloc (nb_states * sizeof(metric_t));
+  
+  tr->metrics_node_elected = (metric_t*) malloc (nb_states * sizeof(metric_t));
+  
+  /* For optimizations */
+  tr->metric_node_tmp = (metric_t*) malloc (nb_preds * sizeof(metric_t));
+  tr->symbol_emitted = (int*) malloc (nb_preds * sizeof(int));
+  
+  if (nb_symb_branch > 1)
+    if (nb_preds > 2)
+      tr->acs = &acs_trellis;
+    else
+      tr->acs = &acs_trellis_x_2;
+  else
+    if (nb_preds > 2)
+      tr->acs = &acs_trellis_1_x;
+    else
+      tr->acs = &acs_trellis_1_2;
+
+  reset_trellis (tr);
+    
+  return tr;
+}
+
+/* Trellis reset */
+
+void reset_trellis (trellis *tr) {
+  int i;
+  
+  tr->metrics_node[0] = (metric_t)0;
+  for (i=1; i<tr->nb_states; i++)
+    tr->metrics_node[i] = MAXMETRIC;
+
+  tr->last_decoded_symbol = -1;
+  tr->current_time = -1;
+  tr->current_index = -1;
+  tr->error_code = TRELLIS_NO_ERR_WARN;
+}
+
+/* Trellis deallocation */
+void free_trellis (trellis *tr) {
+  int i;
+  
+  free (tr->trellis_states[0]);
+  free (tr->trellis_states);
+
+  free (tr->trellis_symbs[0]);
+  free (tr->trellis_symbs);
+
+  free (tr->trellis_branch[0][0]);
+  for (i=0; i<tr->nb_states; i++) {
+    free (tr->trellis_branch[i]);
+  }
+  free (tr->trellis_branch);
+  
+  for (i=0; i<tr->history_size; i++)
+    free (tr->memory_symbols[i]);
+  free (tr->memory_symbols);
+  
+  for (i=0; i<tr->history_size; i++)
+    free (tr->memory_states[i]);
+  free (tr->memory_states);
+
+  free (tr->metrics_node);
+  free (tr->metrics_node_elected);
+  
+  free (tr->metric_node_tmp);
+  free (tr->symbol_emitted);
+
+  free (tr);
+}
+
+/* ACS No optimization */
+int acs_trellis(trellis *tr, metric_t *metrics) {
+  int i, j, k, jmax;
+  int _nb_states = tr->nb_states;
+  int _nb_preds = tr->nb_preds;
+  int _nb_symb_branch = tr->nb_symb_branch;
+  
+  /* De-reference all pointers. Makes code faster, but unreadable */
+  int ***_trellis_branch = tr->trellis_branch;
+  int **_trellis_states = tr->trellis_states;
+  int **_trellis_symbs = tr->trellis_symbs;
+  metric_t *_metric_node_tmp = tr->metric_node_tmp;
+  int *_symbol_emitted = tr->symbol_emitted;
+  metric_t *_metrics_node =  tr->metrics_node;
+  metric_t *_metrics_node_elected = tr->metrics_node_elected;
+  int *_memory_states_current_index;
+  int *_memory_symbols_current_index;
+  
+  /* Go forward */
+  tr->current_time++;
+  tr->current_index++;
+  if (tr->current_index == tr->history_size)
+    tr->current_index = 0;
+
+  _memory_states_current_index = tr->memory_states[tr->current_index];
+  _memory_symbols_current_index = tr->memory_symbols[tr->current_index];
+
+  /* Check if the circular buffer is not losing unexploited data */
+  if ((tr->current_index == tr->last_decoded_symbol+1) &&
+      (tr->current_time != 0))
+    tr->error_code = TRELLIS_WARN_LOSING_DATA;
+  
+  /* for each node_i (0 <= i < nb_states) of the trellis */
+  for (i=0; i<_nb_states; i++) { 
+    int *_trellis_states_i = _trellis_states[i];
+    int **_trellis_branch_i = _trellis_branch[i];
+    int *_trellis_symbs_i = _trellis_symbs[i];
+    
+    /* for each predecessor_j(i) of node_i
+     * listed in trellis_states(i, j) (0 <= j < nb_preds)
+     */
+    for (j=0; j<_nb_preds; j++)  {
+      int *_trellis_branch_i_j = _trellis_branch_i[j];
+      metric_t metric_branch = metrics[_trellis_branch_i_j[0]];
+      
+      /* for each symbol_k(i, j) (0 <= k < nb_symb_branch) 
+       * associates to the branch linking states predecessor_j and node_i
+       * listed in trellis_branch(i, j, k)
+       */
+      _symbol_emitted[j] = _trellis_symbs_i[0];
+      
+      
+      for (k=1; k<_nb_symb_branch; k++) {
+        int symbol = _trellis_branch_i_j[k];
+        
+        /* compute the symbol metric accross the received sample and
+         * the symbol_k(i, j)
+         */
+        
+        /** metrics are stored in metrics table **/
+        
+        /* elect the symbol_{k_min(i,j)} that contributes to
+         * the smallest branch metric linking predecessor_j and node_i 
+         * k_min(i, j) = argmin_k metric_symbol(i, j, k)
+         * this becomes the branch metric: 
+         * metric_branch(i, j) = metric_symbol(i, j, k_min(i, j))
+         */
+        if (metrics[symbol] < metric_branch) {
+          metric_branch = metrics[symbol];
+          _symbol_emitted[j] = _trellis_symbs_i[k];
+        }
+      }
+      
+      /* compute te node metric
+       * metric_branch(i, j) +  metric_node(predecessor_j)
+       */
+      _metric_node_tmp[j] = 
+        metric_branch + _metrics_node[_trellis_states_i[j]];
+      
+      /* elect the predecessor_{j_min(i)}(i) of node_i that
+       * leads to the smallest node metric 
+       * j_min(i) = argmin_j metric_node(j) + metric_branch(i, j)
+       * the resulting node metric is:
+       * metric_node(i) = metric_node(j_min(i)) + metric_branch(i, j_min(i))
+       */
+      
+    }
+    
+    /* update history of the trellis:
+     * memory_states(t, i) = j_min(i)
+     * memory_symbols(t, i) = symbol_{k_min(i, j_min(i))}(i, _min(i))
+     */
+    for (j=1, jmax=0; j<_nb_preds; j++)
+      if (_metric_node_tmp[j] < _metric_node_tmp[jmax])
+        jmax = j;
+    
+    _metrics_node_elected[i] = _metric_node_tmp[jmax];
+    _memory_states_current_index[i] = _trellis_states_i[jmax];
+    _memory_symbols_current_index[i] = _symbol_emitted[jmax];
+  }
+  
+  /* keep the node metrics */
+  memcpy(_metrics_node, _metrics_node_elected, sizeof(metric_t)*_nb_states);
+
+  return tr->error_code;
+}
+
+/* ACS: Only two predecessors */
+int acs_trellis_x_2(trellis *tr, metric_t *metrics) {
+  int i, k, i2;
+  int _nb_states = tr->nb_states;
+  int _nb_symb_branch = tr->nb_symb_branch;
+  
+  /* De-reference all pointers. Makes code faster, but unreadable */
+  int *_trellis_branch_0_0 = tr->trellis_branch[0][0];
+  int *_trellis_states = *(tr->trellis_states);
+  int **_trellis_symbs = tr->trellis_symbs;
+  metric_t *_metrics_node =  tr->metrics_node;
+  metric_t *_metrics_node_elected = tr->metrics_node_elected;
+  int *_memory_states_current_index;
+  int *_memory_symbols_current_index;
+
+  /* Go forward */
+  tr->current_time++;
+  tr->current_index++;
+  if (tr->current_index == tr->history_size)
+    tr->current_index = 0;
+
+  _memory_states_current_index = tr->memory_states[tr->current_index];
+  _memory_symbols_current_index = tr->memory_symbols[tr->current_index];
+
+  /* Check if the circular buffer is not losing unexploited data */
+  if ((tr->current_index == tr->last_decoded_symbol+1) &&
+      (tr->current_time != 0))
+    tr->error_code = TRELLIS_WARN_LOSING_DATA;
+
+  /* for each node_i (0 <= i < nb_states) of the trellis */
+  for (i=0, i2=0; i<_nb_states; i++, i2=i<<1) { 
+    int *_trellis_symbs_i = _trellis_symbs[i];
+    
+    /* for each predecessor_j(i) of node_i
+     * listed in trellis_states(i, j) (0 <= j < nb_preds)
+     */
+    
+    /* elect the symbol_{k_min(i,j)} that contributes to
+     * the smallest branch metric linking predecessor_j and node_i 
+     * k_min(i, j) = argmin_k metric_symbol(i, j, k)
+     * this becomes the branch metric: 
+     * metric_branch(i, j) = metric_symbol(i, j, k_min(i, j))
+     */
+    
+    metric_t metric_branch_0 = metrics[*(_trellis_branch_0_0++)];
+    metric_t metric_branch_1 = metrics[*(_trellis_branch_0_0++)];
+    
+    int _symbol_emitted_0 = _trellis_symbs_i[0];
+    int _symbol_emitted_1 = _trellis_symbs_i[0];
+    
+    for (k=1; k<_nb_symb_branch; k++) {
+      int symbol_0 = *(_trellis_branch_0_0++);
+      int symbol_1 = *(_trellis_branch_0_0++);
+      
+      if (metrics[symbol_0] < metric_branch_0) {
+        metric_branch_0 = metrics[symbol_0];
+        _symbol_emitted_0 = _trellis_symbs_i[k];
+      }
+      
+      if (metrics[symbol_1] < metric_branch_1) {
+        metric_branch_1 = metrics[symbol_1];
+        _symbol_emitted_1 = _trellis_symbs_i[k];
+      }
+    }
+    
+    /* compute te node metric
+     * metric_branch(i, j) +  metric_node(predecessor_j)
+     */
+    metric_branch_0 += _metrics_node[_trellis_states[i2]];
+    metric_branch_1 += _metrics_node[_trellis_states[i2+1]];
+    
+    /* update history of the trellis:
+     * memory_states(t, i) = j_min(i)
+     * memory_symbols(t, i) = symbol_{k_min(i, j_min(i))}(i, _min(i))
+     */
+    
+    if (metric_branch_0 < metric_branch_1) {
+      _metrics_node_elected[i] = metric_branch_0;
+      _memory_states_current_index[i] = _trellis_states[i2];
+      _memory_symbols_current_index[i] = _symbol_emitted_0;
+    } else {
+      _metrics_node_elected[i] = metric_branch_1;
+      _memory_states_current_index[i] = _trellis_states[i2+1];
+      _memory_symbols_current_index[i] = _symbol_emitted_1;
+    }
+  }
+  
+  /* keep the node metrics */
+  memcpy(_metrics_node, _metrics_node_elected, sizeof(metric_t)*_nb_states);
+
+  return tr->error_code;
+}
+
+/* ACS: Only one parallel branch */
+int acs_trellis_1_x(trellis *tr, metric_t *metrics) {
+  int i, j, jmax;
+  int _nb_states = tr->nb_states;
+  int _nb_preds = tr->nb_preds;
+  
+  /* De-reference all pointers. Makes code faster, but unreadable */
+  int ***_trellis_branch = tr->trellis_branch;
+  int **_trellis_states = tr->trellis_states;
+  metric_t *_metric_node_tmp = tr->metric_node_tmp;
+  metric_t *_metrics_node =  tr->metrics_node;
+  metric_t *_metrics_node_elected = tr->metrics_node_elected;
+  int *_memory_states_current_index;
+  int *_memory_symbols_current_index;
+  
+  /* Go forward */
+  tr->current_time++;
+  tr->current_index++;
+  if (tr->current_index == tr->history_size)
+    tr->current_index = 0;
+
+  _memory_states_current_index = tr->memory_states[tr->current_index];
+  _memory_symbols_current_index = tr->memory_symbols[tr->current_index];
+
+  /* Check if the circular buffer is not losing unexploited data */
+  if ((tr->current_index == tr->last_decoded_symbol+1) &&
+      (tr->current_time != 0))
+    tr->error_code = TRELLIS_WARN_LOSING_DATA;
+  
+  /* for each node_i (0 <= i < nb_states) of the trellis */
+  for (i=0; i<_nb_states; i++) { 
+    int *_trellis_states_i = _trellis_states[i];
+    int *_trellis_branch_i_0 = _trellis_branch[i][0];
+    
+    for (j=0; j<_nb_preds; j++)
+      
+      /* compute the node metric
+       * metric_branch(i, j) +  metric_node(predecessor_j)
+       */
+      _metric_node_tmp[j] = metrics[*(_trellis_branch_i_0++)] +
+        _metrics_node[_trellis_states_i[j]];
+    
+    /* update history of the trellis:
+     * memory_states(t, i) = j_min(i)
+     * memory_symbols(t, i) = symbol_{k_min(i, j_min(i))}(i, _min(i))
+     */
+    for (j=1, jmax=0; j<_nb_preds; j++)
+      if (_metric_node_tmp[j] < _metric_node_tmp[jmax])
+        jmax = j;
+
+    _metrics_node_elected[i] = _metric_node_tmp[jmax];
+    _memory_states_current_index[i] = _trellis_states_i[jmax];
+  }
+  memcpy(tr->memory_symbols[tr->current_index], tr->trellis_symbs[0], sizeof(int)*_nb_states);
+  
+  /* keep the node metrics */
+  memcpy(_metrics_node, _metrics_node_elected, sizeof(metric_t)*_nb_states);
+
+  return tr->error_code;
+}
+
+/* ACS: Full optimizations */
+
+int acs_trellis_1_2(trellis *tr, metric_t *metrics) {
+  int i, i2;
+  int _nb_states = tr->nb_states;
+  
+  /* De-reference all pointers. Makes code faster, but unreadable */
+  int *_trellis_states = *(tr->trellis_states);
+  int *_trellis_branch_0_0 = tr->trellis_branch[0][0];
+  metric_t *_metrics_node =  tr->metrics_node;
+  metric_t *_metrics_node_elected = tr->metrics_node_elected;
+  int *_memory_states_current_index;
+  
+  /* Go forward */
+  tr->current_time++;
+  tr->current_index++;
+  if (tr->current_index == tr->history_size)
+    tr->current_index = 0;
+
+  _memory_states_current_index = tr->memory_states[tr->current_index];
+
+  /* Check if the cricular buffer is not losing unexploited data */
+  if ((tr->current_index == tr->last_decoded_symbol+1) &&
+      (tr->current_time != 0))
+    tr->error_code = TRELLIS_WARN_LOSING_DATA;
+
+  /* for each node_i (0 <= i < nb_states) of the trellis */
+  for (i=0, i2=0; i<_nb_states; i++, i2=i<<1) {
+    
+    /* compute the node metric
+     * metric_branch(i, j) +  metric_node(predecessor_j)
+     */
+    
+    metric_t _metric_node_tmp_0 = metrics[*(_trellis_branch_0_0++)] +
+      _metrics_node[_trellis_states[i2]];
+    metric_t _metric_node_tmp_1 = metrics[*(_trellis_branch_0_0++)] +
+      _metrics_node[_trellis_states[i2+1]];
+    
+    /* update history of the trellis:
+     * memory_states(t, i) = j_min(i)
+     * memory_symbols(t, i) = symbol_{k_min(i, j_min(i))}(i, _min(i))
+     */
+    
+    if (_metric_node_tmp_0 < _metric_node_tmp_1) {
+      _metrics_node_elected[i] = _metric_node_tmp_0;
+      _memory_states_current_index[i] = _trellis_states[i2];
+    } else {
+      _metrics_node_elected[i] = _metric_node_tmp_1;
+      _memory_states_current_index[i] = _trellis_states[i2+1];
+    }
+  }
+  memcpy(tr->memory_symbols[tr->current_index], tr->trellis_symbs[0], sizeof(int)*_nb_states);
+  
+  /* keep the node metrics */
+  memcpy(_metrics_node, _metrics_node_elected, sizeof(metric_t)*_nb_states);
+
+  return tr->error_code;
+}
+
+/* get error code */
+int get_error_code(trellis *tr) {
+  return tr->error_code;
+}
+
+/* elect the state corresponding to the minimal metric in the trellis */
+int elect_state_trellis (trellis *tr) {
+  int i;
+  int elected_state = -1;
+  metric_t metric_node_min = MAXMETRIC;
+
+  /* for each node_i (0 <= i < nb_states) of the trellis */
+  for (i=0; i<tr->nb_states; i++) { 
+
+    /* find the state with the smallest metric */
+    if (tr->metrics_node[i] < metric_node_min) {
+      metric_node_min = tr->metrics_node[i];
+      elected_state = i;
+    }
+  }
+  
+  return elected_state;
+}
+
+/* normalize node metrics to avoid overflow */
+metric_t normalize_node_metrics_trellis (trellis *tr, metric_t min_metric) {
+  int i;
+
+  /* find the state with the smallest metric */
+  if (min_metric == 0) {
+    min_metric = MAXMETRIC;
+    for (i=0; i<tr->nb_states; i++)
+      if (tr->metrics_node[i] < min_metric)
+        min_metric = tr->metrics_node[i];
+  }
+  
+  /* normalize node metrics */
+  for (i=0; i<tr->nb_states; i++)
+    tr->metrics_node[i] -= min_metric;
+  
+  return min_metric;
+}
+
+/* Back trace the trellis */
+int backtrace_trellis (trellis *tr, int state, int deepness,
+                       int decoding_length, int *decoded_symbols) {
+  int i;
+  
+  /* backtracking: we start at the elected state */
+  int current_state = state;
+  int current_index = tr->current_index;
+
+  /* check if there enough data */
+  if (tr->current_time < deepness + decoding_length - 1)
+    return TRELLIS_ERR_NO_ENOUGH_DATA;
+  if (tr->history_size < deepness + decoding_length)
+    return TRELLIS_ERR_HIST_TOO_SMALL;
+  
+  /* start backtrace */
+  for (i=-deepness+1; i<=decoding_length; i++) {
+    
+    /* get decoded symbol */
+    if (i > 0)
+      decoded_symbols[decoding_length-i] =
+        tr->memory_symbols[current_index][current_state];
+
+    /* go backward on trellis */
+    current_state = tr->memory_states[current_index][current_state];
+    
+    /* check for circular buffer */
+    if (current_index == 0)
+      current_index = tr->history_size;
+    current_index--;
+  }
+
+  return decoding_length;
+}
+
+/* Full backtrace the trellis */
+int full_backtrace_trellis (trellis *tr, int state, int deepness,
+                            int *decoded_symbols) {
+  /* check if there enough data */
+  int decoding_length =
+    tr->current_time - tr->last_decoded_symbol - deepness - 1;
+  
+  if (decoding_length < 0) {
+    tr->error_code = TRELLIS_WARN_NO_MORE_DATA;
+    return 0;
+  }
+  if (decoding_length > tr->history_size - deepness)
+    decoding_length = tr->history_size - deepness;
+  
+  /* Back trace the trellis */
+  tr->error_code = TRELLIS_NO_ERR_WARN;
+  decoding_length = backtrace_trellis (tr, state, deepness, decoding_length,
+                                       decoded_symbols);
+    
+  /* move last decoded symbol position */
+  tr->last_decoded_symbol += decoding_length;
+
+  return decoding_length;
+}
+
+#endif
diff --git a/src/trellis.h b/src/trellis.h
new file mode 100644 (file)
index 0000000..69d6c09
--- /dev/null
@@ -0,0 +1,146 @@
+/* -*- C -*- */
+
+/*
+
+Copyright (C) 1997 Karine Gosse and Marc de Courville
+Copyright (C) 1997-2003 Veronique Buzenac
+Copyright (C) 2003 Laurent Mazet
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/* Generic Viterbi Decoder with soft decisions. */
+
+#if !defined(__TRELLIS_H__)
+#define __TRELLIS_H__
+
+#include "viterbiversion.h"
+
+#if !defined(__TRELLIS_C__)
+extern const char *Viterbi_Version;
+#else
+const char *Viterbi_Version = VITERBIVERSION;
+#endif
+
+/* metric type definition */
+typedef double metric_t;
+#define MAXMETRIC MAXDOUBLE
+
+/* Trellis definition: 
+ * ===================
+ *
+ * - nb_preds: # of predecessors states in the trellis per node
+ * - nb_states: # of states in the trellis
+ * - nb_symb_branch: # of possible symbol in the constellation or bits
+ *   associated to a branch (trellis transition)
+ * - history_size: # of memory of the trellis (record of previous ACSs)
+ *
+ * - trellis_states (nb_states x nb_preds): table of state predecessors,
+ *   position (i, j) provides the jth predecessor of the ith trellis state
+ * - trellis_symbs (nb_states x nb_symb_branch): table of uncoded symbols
+ * - trellis_branch (nb_states x nb_preds x nb_symb_branch): table of
+ *   possible symbols/bits per trellis branch, position (i, j, k) denotes
+ *   the kth symbol/bit associated to the branch number (i, j) linking
+ *   the jth predecessor and ith trellis state
+ *
+ * - memory_states (history_size x nb_states): circular buffer gathering
+ *   the current sequence of states, each position (t, i) records at
+ *   time t the predecessor of the ith state
+ * - memory_symbols (history_size x nb_states): circular buffer containing
+ *   current sequence of symbols, each position (t, i) records at time t
+ *   the elected symbol/bit of the elected branch for the ith state
+ *
+ * - metric_node (nb_states): current node metrics, (i) provides the ith
+ *   trellis node metric
+ * - metrics_node_elected (nb_states): current node metrics
+ *
+ * - last_decoded_symbol: last decoded symbol
+ * - current_time: current time in global frame
+ * - current_index: curent index in history buffer
+ *   (current_index = current_time % history_size)
+ *
+ * - error_code: error code
+ */
+
+typedef struct _trellis {
+
+  int nb_preds;
+  int nb_states;
+  int nb_symb_branch;
+  int history_size;
+    
+  int **trellis_states;
+  int **trellis_symbs;
+  int ***trellis_branch;
+  
+  int **memory_states;
+  int **memory_symbols;
+
+  metric_t *metrics_node;
+  metric_t *metrics_node_elected;
+
+  /* For optimizations */
+  metric_t *metric_node_tmp;
+  int *trellis_state_pred;
+  int *symbol_emitted;
+
+  int (*acs)(struct _trellis *tr, metric_t *metrics);
+  
+  int last_decoded_symbol;
+  int current_time;
+  int current_index;
+  
+  int error_code;
+} trellis;
+
+/* Trellis functions */
+
+trellis *alloc_trellis(int nb_preds, int nb_states, int nb_symb_branch,
+                       int history_size);
+
+void reset_trellis (trellis *tr);
+
+void free_trellis (trellis *tr);
+
+int acs_trellis(trellis *tr, metric_t *metrics);
+int acs_trellis_x_2(trellis *tr, metric_t *metrics);
+int acs_trellis_1_x(trellis *tr, metric_t *metrics);
+int acs_trellis_1_2(trellis *tr, metric_t *metrics);
+
+int get_error_code(trellis *tr);
+
+int elect_state_trellis (trellis *tr);
+
+metric_t normalize_node_metrics_trellis (trellis *tr, metric_t min_metric);
+
+int backtrace_trellis (trellis *tr, int state, int deepness,
+                       int decoding_length, int *decoded_symbols);
+
+int full_backtrace_trellis (trellis *tr, int state, int deepness,
+                            int *decoded_symbols);
+
+/* Error codes */
+#define TRELLIS_NO_ERR_WARN 0
+#define TRELLIS_WARN_LOSING_DATA -1
+#define TRELLIS_WARN_NO_MORE_DATA -2
+#define TRELLIS_ERR_NO_ENOUGH_DATA -3
+#define TRELLIS_ERR_HIST_TOO_SMALL -4
+
+#endif /* __TRELLIS_H__ */
diff --git a/src/viterbiversion.t.in b/src/viterbiversion.t.in
new file mode 100644 (file)
index 0000000..32ba3bc
--- /dev/null
@@ -0,0 +1 @@
+#define VITERBIVERSION "@VERSION@"
diff --git a/test/Makefile.in b/test/Makefile.in
new file mode 100644 (file)
index 0000000..9e8c560
--- /dev/null
@@ -0,0 +1,29 @@
+## Directory variables
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+## Directory for install
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@/@PACKAGE@
+
+## Program variables
+
+INSTALL = @INSTALL@
+
+## Generic variables
+
+include $(top_srcdir)/Makeconf
+
+## Specific variables
+
+PROGTESTS = $(addprefix prog_,$(SOURCES:.c=$(EXECEXT)))
+
+TARGETS = $(OBJECTS) $(PROGTESTS)
+
+## Generic rules
+
+include $(top_srcdir)/Makerule
diff --git a/test/benckmark.c b/test/benckmark.c
new file mode 100644 (file)
index 0000000..ab3020b
--- /dev/null
@@ -0,0 +1,224 @@
+/* -*- C -*- */
+
+/*
+
+Copyright (C) 2003 Laurent Mazet
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/* Program test for Viterbi decoding */
+
+/*
+ * This program is a mess. It's used to test all coders in coders.txt and
+ * check memory management
+ */
+
+//#define ONLY_VITERBI
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "trellis.h"
+#include "encoder.h"
+#include "create_trellis.h"
+
+/* Pseudo-random bit sequence */
+void bit_gene (bit * a, int n) {
+  int i;
+  
+  for (i=0; i < n; i++)
+    *(a++) = rand()&1;
+}
+
+int main(int argc, char* argv[]) {
+  /* Coders definition */
+  int nb_unprotected_bits = 0;
+  int nb_inputs;
+  int nb_coded_inputs = 1;
+  int nb_outputs;
+  int nb_coded_outputs = 2;
+  int nb_registers = 2;
+  int *coders;
+  conv_encoder *enc;
+  
+  /* Viterbi parameters */
+  int deepness;
+  int window_dec_size ;
+  int history_size;
+  trellis *tr;
+  
+  /* Data paramaters */
+  int nb_data_bits = 128*8;
+  int nb_uncoded_bits;
+  int nb_coded_bits;
+  int nb_metrics;
+  int nb_packets = 1024;
+
+  /* Various blocks */
+  bit *x;
+  bit *y;
+  metric_t *metrics;
+  int *tmp;
+  bit *xdecod;
+  
+  /* Indexes */
+  int i, j, k, l;
+  int nb_bit_errors;
+  int nb_packet_errors = 0;
+    
+  /* Argument processing */
+  if ((argc > 1) && (argv[1][0] == '-') && (argv[1][1] == 'h')) {
+    printf ("prog_test [#unprotected #inputs #outputs #registers coder_1 coder_2...]\n");
+    exit (1);
+  }
+  if (argc > 1) nb_unprotected_bits = (int) strtol(argv[1], NULL, 10);
+  if (argc > 2) nb_coded_inputs = (int) strtol(argv[2], NULL, 10);
+  if (argc > 3) nb_coded_outputs = (int) strtol(argv[3], NULL, 10);
+  if (argc > 4) nb_registers = (int) strtol(argv[4], NULL, 10);
+
+  coders = (int *) malloc(nb_coded_outputs*sizeof(int));
+  if (argc == 1) { coders[0] = 5; coders[1] = 7; }
+  else if (argc != 5+nb_coded_outputs) {
+    printf ("Wrong number of arguments\n");
+    exit(1);
+  }
+  for (i=0; i<nb_coded_outputs; i++)
+    if (argc > 5+i) coders[i] = (int) strtol(argv[5+i], NULL, 8);
+
+  /* Encoder descriptions */
+  printf ("#S/#I/#O/#R: (%d,%d,%d,%d) [", nb_unprotected_bits,
+          nb_coded_inputs, nb_coded_outputs, nb_registers);
+  for (i=0; i<nb_coded_outputs; i++)
+    printf (" %o", coders[i]);
+  printf (" ]\n");
+  
+  /* Coders definition */
+  nb_inputs = nb_unprotected_bits + nb_coded_inputs;
+  nb_outputs = nb_unprotected_bits + nb_coded_outputs;
+  enc = alloc_conv_encoder (nb_unprotected_bits, nb_coded_inputs,
+                            nb_registers, nb_coded_outputs, coders);
+  
+  /* Data paramaters */
+  nb_uncoded_bits = nb_data_bits + nb_registers;
+  nb_coded_bits = nb_uncoded_bits * nb_outputs;
+  nb_metrics = 1 << nb_outputs;
+  
+  /* Viterbi parameters for a closed trellis */
+  deepness = nb_registers / nb_inputs;
+  window_dec_size = nb_uncoded_bits / nb_inputs - deepness;
+  history_size = deepness + window_dec_size;
+
+  /* Trellis creation */
+  tr = create_trellis_from_conv_encoder (enc, history_size);
+
+  /* Some malloc */
+  x = (bit*) malloc (nb_uncoded_bits*sizeof(bit));
+  y = (bit*) malloc (nb_coded_bits*sizeof(bit));
+  metrics = (metric_t*) malloc (nb_metrics*sizeof(metric_t));
+  tmp = (int*) malloc (window_dec_size*sizeof(int));
+  xdecod = (bit*) malloc (nb_uncoded_bits*sizeof(bit));
+    
+  /* Bit generation */
+  bit_gene (x, nb_data_bits);
+  for (i=nb_data_bits; i<nb_uncoded_bits; i++)
+    x[i] = 0;
+  
+  /* Bit encoding */
+  conv_encoding (y, x, nb_uncoded_bits, enc);
+
+  /* Info */
+  printf ("Send %d packets of %d bits\n", nb_packets, nb_data_bits);
+  
+  /* Loop for benchmark */
+  for (l=0; l<nb_packets; l++) {
+    int nb_dec_symb, ii;
+  
+    /* Viterbi */
+    for (i=0, ii=0; i<nb_uncoded_bits; i+=nb_inputs) {
+      int symbol = 0;
+
+#if !defined(ONLY_VITERBI)       
+      /* Generate symbol */
+      for (k=0; k<nb_outputs; k++)
+        symbol = (symbol << 1) | y[ii++];
+
+      /* Compute distance of received signal to all constellation symbols */
+      for (k=0; k<nb_metrics; k++) {
+        int m = 0, l;
+        int bits = symbol ^ k;
+        
+        for (l=0; (l<nb_outputs) && (bits); l++, bits>>=1)
+          if (bits & 1)
+            m++;
+        
+        metrics[k] = m;
+      }
+#endif      
+      /* acs */
+      tr->acs (tr, metrics);
+      
+      /* Normalize node metrics */
+      /* normalize_node_metrics_trellis (tr, 0); */
+    }
+
+    /* Decoded bits */
+    nb_dec_symb = backtrace_trellis (tr, 0, deepness, window_dec_size, tmp);
+
+    for (j=0; j<nb_dec_symb; j++)
+      for (k=0; k<nb_inputs; k++)
+        xdecod[j*nb_inputs + k] = 
+          ((tmp[j] & (1 << (nb_inputs-k-1))) != 0) ? 1 : 0;
+
+#if !defined(ONLY_VITERBI)       
+    /* Check error */
+    nb_bit_errors = 0;
+    for (i=0; i<nb_data_bits; i++)
+      if (x[i] != xdecod[i])
+        nb_bit_errors++;
+    
+    if (nb_bit_errors) {
+      printf ("Nb bit errors: %d\n", nb_bit_errors);
+      nb_packet_errors++;
+    }
+
+    reset_trellis(tr);
+#endif
+  }
+
+#if !defined(ONLY_VITERBI)       
+  printf ("Nb packet errors: %d\n", nb_packet_errors);
+#endif
+
+  /* Free memory blocks */
+  free_trellis (tr);
+  free_conv_encoder (enc);
+  free (coders);
+  free (x);
+  free (y);
+  free (metrics);
+  free (tmp);
+  free (xdecod);
+
+  printf ("bye\n");
+
+  return 0;
+}
diff --git a/test/convcode.c b/test/convcode.c
new file mode 100644 (file)
index 0000000..91cc9e7
--- /dev/null
@@ -0,0 +1,238 @@
+/* -*- C -*- */
+
+/*
+
+Copyright (C) 2003 Laurent Mazet
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/* Program test for Viterbi decoding */
+
+/*
+ * This program is a mess. It's used to test all coders in coders.txt and
+ * check memory management
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "trellis.h"
+#include "encoder.h"
+#include "create_trellis.h"
+
+/* Pseudo-random bit sequence */
+void bit_gene (bit * a, int n) {
+  int i;
+  
+  for (i=0; i < n; i++)
+    *(a++) = rand()&1;
+}
+
+int main(int argc, char* argv[]) {
+  /* Coders definition */
+  int nb_unprotected_bits = 0;
+  int nb_inputs = 1;
+  int nb_outputs = 2;
+  int nb_registers = 2;
+  int *coders;
+  conv_encoder *enc;
+  
+  /* Viterbi parameters */
+  int deepness;
+  int history_size;
+  int window_dec_size = 1;
+  trellis *tr;
+  
+  /* Data paramaters */
+  int nb_bits;
+  int nb_coded_bits;
+  int nb_metrics;
+
+  /* Various blocks */
+  bit *x;
+  bit *y;
+  metric_t *metrics;
+  int *tmp;
+  bit *xdecod;
+
+  /* Indexes */
+  int i, j, k, ii;
+  int nb_errors = 0;
+    
+  /* Argument processing */
+  if ((argc > 1) && (argv[1][0] == '-') && (argv[1][1] == 'h')) {
+    printf ("prog_test [#unprotected #inputs #outputs #registers coder_1 coder_2...]\n");
+    exit (1);
+  }
+  if (argc > 1) nb_unprotected_bits = (int) strtol(argv[1], NULL, 10);
+  if (argc > 2) nb_inputs = (int) strtol(argv[2], NULL, 10);
+  if (argc > 3) nb_outputs = (int) strtol(argv[3], NULL, 10);
+  if (argc > 4) nb_registers = (int) strtol(argv[4], NULL, 10);
+
+  coders = (int *) malloc(nb_outputs*sizeof(int));
+  if (argc == 1) { coders[0] = 5; coders[1] = 7; }
+  else if (argc != 5+nb_outputs) {
+    printf ("Wrong number of arguments\n");
+    exit(1);
+  }
+  for (i=0; i<nb_outputs; i++)
+    if (argc > 5+i) coders[i] = (int) strtol(argv[5+i], NULL, 8);
+
+  printf ("#S/#I/#O/#R: (%d,%d,%d,%d) [", nb_unprotected_bits, nb_inputs, nb_outputs, nb_registers);
+  for (i=0; i<nb_outputs; i++)
+    printf (" %o", coders[i]);
+  printf (" ]\n");
+  
+  /* Size computation */
+  deepness = 5*(nb_registers+1);
+  nb_bits = 1000 + deepness * (nb_inputs + nb_unprotected_bits);
+  history_size = deepness + window_dec_size;
+  nb_coded_bits = nb_bits * (nb_outputs + nb_unprotected_bits) / (nb_inputs + nb_unprotected_bits);
+  nb_metrics = 1 << (nb_outputs + nb_unprotected_bits);
+  
+  /* Some malloc */
+  x = (bit*) malloc (nb_bits*sizeof(bit));
+  y = (bit*) malloc (nb_coded_bits*sizeof(bit));
+  metrics = (metric_t*) malloc (nb_metrics*sizeof(metric_t));
+  tmp = (int*) malloc (window_dec_size*sizeof(int));
+  xdecod = (bit*) malloc (nb_bits*sizeof(bit));
+
+  /* Bit generation */
+  bit_gene (x, nb_bits);
+  printf ("Bits: \n");
+  for (i=0; i<nb_bits; i++)
+    printf ("%d", x[i]);
+  printf ("\n");
+
+  /* Bit encoding */
+  enc = alloc_conv_encoder (nb_unprotected_bits, nb_inputs, nb_registers, nb_outputs, coders);
+  conv_encoding (y, x, nb_bits, enc);
+  printf ("Coded bits: \n");
+  for (i=0; i<nb_coded_bits; i++)
+    printf ("%d", y[i]);
+  printf ("\n");
+  
+  /* Trellis creation */
+  tr = create_trellis_from_conv_encoder (enc, history_size);
+  display_trellis_structure (tr);
+  
+  /* Viterbi */
+  for (i=0, ii=0; i<nb_bits; i+=nb_inputs+nb_unprotected_bits) {
+    int nb_dec_symb;
+    int symbol = 0;
+    
+    /* Generate symbol */
+    for (k=0; k<nb_outputs+nb_unprotected_bits; k++)
+      symbol = (symbol << 1) | y[ii++];
+    
+    /* Compute distance of received signal to all constellation symbols */
+    for (k=0; k<nb_metrics; k++) {
+      int m = 0, l;
+      int bits = symbol ^ k;
+
+      for (l=0; (l<nb_outputs+nb_unprotected_bits) && (bits); l++, bits >>=1)
+        if (bits & 1)
+          m++;
+
+      metrics[k] = m;
+    }
+    
+#if DEBUG
+    /* display metrics */
+    printf ("metrics:");
+    for (k=0; k<nb_metrics; k++)
+      printf (" %f", metrics[k]);
+    printf ("\n");
+#endif
+    
+    /* acs */
+    acs_trellis (tr, metrics);
+      
+#if DEBUG
+    /* trellis memory */
+    display_trellis_memory (tr, NULL);
+#endif
+
+    /* Decoded bits */
+    nb_dec_symb = backtrace_trellis (tr, elect_state_trellis(tr),
+                                     deepness, window_dec_size, tmp);
+    printf ("(%d)", tr->current_time);
+    
+    if (nb_dec_symb == window_dec_size) {
+      int index = i-(deepness+window_dec_size-1)*(nb_inputs+nb_unprotected_bits);
+      
+      printf ("\t[");
+      for (j=0; j<window_dec_size; j++)
+        printf (" %d", tmp[j]);
+      printf (" ]\t");
+      for (j=0; j<window_dec_size; j++) {
+        for (k=0; k<nb_inputs+nb_unprotected_bits; k++) {
+          int pos = index+j*(nb_inputs+nb_unprotected_bits) + k;
+          xdecod[pos] = 
+            ((tmp[j]&(1<<(nb_inputs+nb_unprotected_bits-k-1))) != 0) ? (bit)1 : (bit)0;
+          printf (" %d/%d", x[pos], xdecod[pos]);
+          if (x[pos] != xdecod[pos]) {
+            printf ("*");
+            nb_errors++;
+          }
+          else
+            printf (" ");
+        }
+      }
+      printf ("\n");
+    }
+    else
+      printf ("\terr = %d\n", nb_dec_symb);
+
+    /* Normalize node metrics */
+    normalize_node_metrics_trellis (tr, 0);
+    
+  }
+
+  display_trellis_memory (tr, NULL);
+
+  printf ("Initial bits: ");
+  for (i=0; i<nb_bits; i++)
+    printf ("%d", x[i]);
+  printf ("\n");
+  printf ("Decoded bits: ");
+  for (i=0; i<nb_bits-(deepness+window_dec_size)*(nb_inputs+nb_unprotected_bits); i++)
+    printf ("%d", xdecod[i]);
+  printf ("\n");
+  printf ("Nb errors = %d\n", nb_errors);
+
+  /* Free memory blocks */
+  free_trellis (tr);
+  free_conv_encoder (enc);
+  free (coders);
+  free (x);
+  free (y);
+  free (metrics);
+  free (tmp);
+  free (xdecod);
+
+  printf ("bye\n");
+
+  return 0;
+}
+
diff --git a/test/convcode2.c b/test/convcode2.c
new file mode 100644 (file)
index 0000000..e9d1c88
--- /dev/null
@@ -0,0 +1,243 @@
+/* -*- C -*- */
+
+/*
+
+Copyright (C) 2003 Laurent Mazet
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/* Program test for Viterbi decoding */
+
+/*
+ * This program is a mess. It's used to test all coders in coders.txt and
+ * check memory management
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "trellis.h"
+#include "encoder.h"
+#include "create_trellis.h"
+
+/* Pseudo-random bit sequence */
+void bit_gene (bit * a, int n) {
+  int i;
+  
+  for (i=0; i < n; i++)
+    *(a++) = rand()&1;
+}
+
+int main(int argc, char* argv[]) {
+  /* Coders definition */
+  int nb_unprotected_bits = 0;
+  int nb_inputs = 1;
+  int nb_outputs = 2;
+  int nb_registers = 2;
+  int *coders;
+  conv_encoder *enc;
+  
+  /* Viterbi parameters */
+  int deepness;
+  int history_size;
+  int window_dec_size = 1;
+  trellis *tr;
+  
+  /* Data paramaters */
+  int nb_bits;
+  int nb_coded_bits;
+  int nb_metrics;
+
+  /* Various blocks */
+  bit *x;
+  bit *y;
+  metric_t *metrics;
+  int *tmp;
+  bit *xdecod;
+
+  /* Indexes */
+  int i, j, k, ii;
+  int nb_errors = 0;
+    
+  /* Argument processing */
+  if ((argc > 1) && (argv[1][0] == '-') && (argv[1][1] == 'h')) {
+    printf ("prog_test [#unprotected #inputs #outputs #registers coder_1 coder_2...]\n");
+    exit (1);
+  }
+  if (argc > 1) nb_unprotected_bits = (int) strtol(argv[1], NULL, 10);
+  if (argc > 2) nb_inputs = (int) strtol(argv[2], NULL, 10);
+  if (argc > 3) nb_outputs = (int) strtol(argv[3], NULL, 10);
+  if (argc > 4) nb_registers = (int) strtol(argv[4], NULL, 10);
+
+  coders = (int *) malloc(nb_outputs*sizeof(int));
+  if (argc == 1) { coders[0] = 5; coders[1] = 7; }
+  else if (argc != 5+nb_outputs) {
+    printf ("Wrong number of arguments\n");
+    exit(1);
+  }
+  for (i=0; i<nb_outputs; i++)
+    if (argc > 5+i) coders[i] = (int) strtol(argv[5+i], NULL, 8);
+
+  printf ("#S/#I/#O/#R: (%d,%d,%d,%d) [", nb_unprotected_bits, nb_inputs, nb_outputs, nb_registers);
+  for (i=0; i<nb_outputs; i++)
+    printf (" %o", coders[i]);
+  printf (" ]\n");
+  
+  /* Size computation */
+  deepness = 5*(nb_registers+1);
+  nb_bits = 186 + 6;
+  
+  history_size = deepness + window_dec_size;
+  nb_coded_bits = nb_bits * (nb_outputs + nb_unprotected_bits) / (nb_inputs + nb_unprotected_bits);
+  nb_metrics = 1 << (nb_outputs + nb_unprotected_bits);
+  
+  /* Some malloc */
+  x = (bit*) malloc (nb_bits*sizeof(bit));
+  y = (bit*) malloc (nb_coded_bits*sizeof(bit));
+  metrics = (metric_t*) malloc (nb_metrics*sizeof(metric_t));
+  tmp = (int*) malloc (window_dec_size*sizeof(int));
+  xdecod = (bit*) malloc (nb_bits*sizeof(bit));
+
+  /* Bit generation */
+  bit_gene (x, nb_bits-6);
+  for (i=nb_bits-6; i<nb_bits; i++)
+    x[i] = 0;
+  
+  printf ("Bits: \n");
+  for (i=0; i<nb_bits; i++)
+    printf ("%d", x[i]);
+  printf ("\n");
+
+  /* Bit encoding */
+  enc = alloc_conv_encoder (nb_unprotected_bits, nb_inputs, nb_registers, nb_outputs, coders);
+  conv_encoding (y, x, nb_bits, enc);
+  printf ("Coded bits: \n");
+  for (i=0; i<nb_coded_bits; i++)
+    printf ("%d", y[i]);
+  printf ("\n");
+  
+  /* Trellis creation */
+  tr = create_trellis_from_conv_encoder (enc, history_size);
+  display_trellis_structure (tr);
+  
+  /* Viterbi */
+  for (i=0, ii=0; i<nb_bits; i+=nb_inputs+nb_unprotected_bits) {
+    int nb_dec_symb;
+    int symbol = 0;
+    
+    /* Generate symbol */
+    for (k=0; k<nb_outputs+nb_unprotected_bits; k++)
+      symbol = (symbol << 1) | y[ii++];
+    
+    /* Compute distance of received signal to all constellation symbols */
+    for (k=0; k<nb_metrics; k++) {
+      int m = 0, l;
+      int bits = symbol ^ k;
+
+      for (l=0; (l<nb_outputs+nb_unprotected_bits) && (bits); l++, bits >>=1)
+        if (bits & 1)
+          m++;
+
+      metrics[k] = m;
+    }
+    
+    //#if DEBUG
+#if 1
+    /* display metrics */
+    printf ("metrics:");
+    for (k=0; k<nb_metrics; k++)
+      printf (" %f", metrics[k]);
+    printf ("\n");
+#endif
+    
+    /* acs */
+    acs_trellis (tr, metrics);
+      
+#if DEBUG
+    /* trellis memory */
+    display_trellis_memory (tr, NULL);
+#endif
+
+    /* Decoded bits */
+    nb_dec_symb = backtrace_trellis (tr, elect_state_trellis(tr),
+                                     deepness, window_dec_size, tmp);
+    printf ("(%d)", tr->current_time);
+    
+    if (nb_dec_symb == window_dec_size) {
+      int index = i-(deepness+window_dec_size-1)*(nb_inputs+nb_unprotected_bits);
+      
+      printf ("\t[");
+      for (j=0; j<window_dec_size; j++)
+        printf (" %d", tmp[j]);
+      printf (" ]\t");
+      for (j=0; j<window_dec_size; j++) {
+        for (k=0; k<nb_inputs+nb_unprotected_bits; k++) {
+          int pos = index+j*(nb_inputs+nb_unprotected_bits) + k;
+          xdecod[pos] = 
+            ((tmp[j]&(1<<(nb_inputs+nb_unprotected_bits-k-1))) != 0) ? (bit)1 : (bit)0;
+          printf (" %d/%d", x[pos], xdecod[pos]);
+          if (x[pos] != xdecod[pos]) {
+            printf ("*");
+            nb_errors++;
+          }
+          else
+            printf (" ");
+        }
+      }
+      printf ("\n");
+    }
+    else
+      printf ("\terr = %d\n", nb_dec_symb);
+
+    /* Normalize node metrics */
+    normalize_node_metrics_trellis (tr, 0);
+    
+  }
+
+  display_trellis_memory (tr, NULL);
+
+  printf ("Initial bits: ");
+  for (i=0; i<nb_bits; i++)
+    printf ("%d", x[i]);
+  printf ("\n");
+  printf ("Decoded bits: ");
+  for (i=0; i<nb_bits-(deepness+window_dec_size)*(nb_inputs+nb_unprotected_bits); i++)
+    printf ("%d", xdecod[i]);
+  printf ("\n");
+  printf ("Nb errors = %d\n", nb_errors);
+
+  /* Free memory blocks */
+  free_trellis (tr);
+  free_conv_encoder (enc);
+  free (coders);
+  free (x);
+  free (y);
+  free (metrics);
+  free (tmp);
+  free (xdecod);
+
+  printf ("bye\n");
+
+  return 0;
+}
+