--- /dev/null
+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>
+
--- /dev/null
+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.
--- /dev/null
+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.
+
+
--- /dev/null
+## 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: ***
--- /dev/null
+## 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
--- /dev/null
+## 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: ***
--- /dev/null
+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
--- /dev/null
+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
+])
--- /dev/null
+#! /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
--- /dev/null
+#! /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
--- /dev/null
+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")
+)
--- /dev/null
+#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
--- /dev/null
+#!/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
--- /dev/null
+#! /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
--- /dev/null
+## 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
--- /dev/null
+/* -*- 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");
+}
--- /dev/null
+/* -*- 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__ */
--- /dev/null
+/* -*- 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;
+
+ }
+}
--- /dev/null
+/* -*- 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__ */
--- /dev/null
+/* -*- 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
--- /dev/null
+/* -*- 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__ */
--- /dev/null
+#define VITERBIVERSION "@VERSION@"
--- /dev/null
+## 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
--- /dev/null
+/* -*- 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;
+}
--- /dev/null
+/* -*- 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;
+}
+
--- /dev/null
+/* -*- 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;
+}
+