From: Mazet Laurent Date: Thu, 27 Nov 2025 16:16:51 +0000 (+0100) Subject: initial commit X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=93f4af24fe853ff2854ceccb4135afa5e4ee9f0a;p=libviterbi.git initial commit --- 93f4af24fe853ff2854ceccb4135afa5e4ee9f0a diff --git a/BUGS b/BUGS new file mode 100644 index 0000000..4cb5dab --- /dev/null +++ b/BUGS @@ -0,0 +1,21 @@ +This file documents known bugs in LibViterbi and describes where and how to +report any bugs that you may find. + +Copyright (C) 2003 Laurent S. Mazet + +Known Causes of Trouble with LibViterbi +*************************************** + + This section describes known problems that affect users of LibViterbi. + +Actual Bugs We Haven't Fixed Yet +================================ + + * On cygwin, you can not compile dynamic library. + +Where to Report Bugs +==================== + + If you have found a bug send it to the actual maintener (aka me) to + + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..b42a17a --- /dev/null +++ b/INSTALL @@ -0,0 +1,182 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/INSTALL.LIBVITERBI b/INSTALL.LIBVITERBI new file mode 100644 index 0000000..932a9a9 --- /dev/null +++ b/INSTALL.LIBVITERBI @@ -0,0 +1,102 @@ +This file documents the installation of LibViterbi. + + +Installing LibViterbi +********************* + + Here is the procedure for installing LibViterbi from scratch on a Unix +system. + + * Run the shell script `configure'. This will determine the features + your system has (or doesn't have) and create a file named + `Makefile' from each of the files named `Makefile.in'. + + Here is a summary of the configure options that are most + frequently used when building LibViterbi: + + `--prefix=PREFIX' + Install LibViterbi in subdirectories below PREFIX. The default + value of PREFIX is `/usr/local'. + + `--enable-builddir[=DIR]' + By default, objets and library are build into the build + directory. This options change the building directory to + DIR. The default value of DIR is /tmp/`whoami`/viterbi. + + `--enable-static' + Create static library. If you are planning to use + `--with-debug', or use compiled binaries on other Unix system, + you will probably want to use this option. By default, the + static library is build. To cancel its, you will use the + `--disable-static' option. + + `--enable-shared' + Create shared library. It will save many disk space when you + will build binaries. By default, the shared library is build. + To cancel its, you will use the `--disable-static' option. Be + careful that this option is not available on every system. + + `--enable-rpath' + Enable the usage of rpath command when linking dynamic binary + tests. It will facilitate the usage of those binaries. By + default, this options is on. + + `--with-debug' + Add debug information for begugging the library. + + `--with-profile' + Add profiling information for gprof. + + `--help' + Print a summary of the options recognized by the configure + script. + + See the file `INSTALL' for more information about the command line + options used by configure. That file also contains instructions + for compiling in a directory other than where the source is + located. + + * Run make. + + You will need a recent version of GNU Make. Modifying LibViterbi's + makefiles to work with other make programs is probably not worth + your time. We recommend you get and compile GNU Make instead. + + To compile LibViterbi, you will need a recent version of GNU Make. + C compiler might to be a problem, anyversion of gcc is ok. + + * If you encounter errors while compiling LibViterbi, first check the + list of known problems below to see if there is a workaround or + solution for your problem. If not, see the file BUGS for + information about how to report bugs. + + * Once you have successfully compiled LibViterbi, run `make install'. + + This will install a copy LibViterbi libraries, its header files and its + documentation in the destination directory. As distributed, + LibViterbi is installed in the following directories. In the table + below, PREFIX defaults to `/usr/local', and VERSION stands for the + current version number of the library. + + `PREFIX/lib' + Libraries like libviterbi.a and libviterbi.so.VERSION + + `PREFIX/include/viterbi' + Include files distributed with LibViterbi. + + `PREFIX/doc/viterbi-VERSION' + Documentation files distributed with LibViterbi. + +Installation Problems +===================== + + This section contains a list of problems (and some apparent problems +that don't really mean anything is wrong) that may show up during +installation of LibViterbi. + + * On HP-UX if you get the message "- shared library must be position + independent. Use +z or +Z to recompile." when compiling shared + library, you will to recompile gcc with the option `--enable-shared' + to managed to build LibViterbi shared library. + + diff --git a/Makeconf.in b/Makeconf.in new file mode 100644 index 0000000..128c31d --- /dev/null +++ b/Makeconf.in @@ -0,0 +1,114 @@ +## Package name + +PACK = @PACKAGE@-@VERSION@ + +## Directory for building + +BUILD_DIR = @BUILD_DIR@ + +BIN_BUILD_DIR = $(BUILD_DIR)/bin +LIB_BUILD_DIR = $(BUILD_DIR)/lib +OBJ_BUILD_DIR = $(BUILD_DIR)/obj + +BUILD_LIST_DIRS = $(BIN_BUILD_DIR) $(LIB_BUILD_DIR) $(OBJ_BUILD_DIR) + +## Directory for install + +install_list_dirs = $(includedir) $(libdir) + +## install program variables + +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ + +MKDIR = $(top_srcdir)/mkinstalldirs + +BASENAME = @BASENAME@ + +TAR = @TAR@ +COMPRESS = @COMPRESS@ + +## Compiler variables + +CC := @CC@ +CCINCS := -I$(top_srcdir)/src +CCFLAGS := @CCFLAGS@ +CCPICFLAG := @CCPICFLAG@ + +SH_LD = @SH_LD@ +SH_LDFLAGS = @LDFLAGS@ @SH_LDFLAGS@ @SONAME_FLAGS@ + +LD = @LD@ +LIBS = @LIBS@ -L$(top_srcdir)/src -l@LIBRARY@ +LDFLAGS = @LDFLAGS@ +RLDFLAG = @RLD_FLAG@ + +STRIP = @STRIP@ + +AR = @AR@ +RANLIB = @RANLIB@ + +LN_S = @LN_S@ + +STATIC_LIBS = @STATIC_LIBS@ +SHARED_LIBS = @SHARED_LIBS@ + +EXECEXT = @EXECEXT@ + +## Library version + +VERSION = @VERSION@ + +## Compile command + +ifeq ($(SHARED_LIBS),true) +COMPILE = $(CC) -c $(CCFLAGS) $(CCPICFLAG) $(CCINCS) +LINK = $(LD) $(LIBS) $(LDFLAGS) $(RLDFLAG) +else +COMPILE = $(CC) -c $(CCFLAGS) $(CCINCS) +LINK = $(LD) $(LIBS) $(LDFLAGS) +endif + +SH_LINK = $(SH_LD) $(SH_LDFLAGS) +ST_LINK = $(AR) ru + +DEBUG = @DEBUG@ + +## Sources + +SOURCES = $(wildcard *.c) +OBJECTS = $(patsubst %.c,%.o,$(SOURCES)) +DEPENDS = $(SOURCES:.c=.d) +HEADERS = $(wildcard *.h) +CONFIGS = $(filter-out configure,$(patsubst %.in,%,$(wildcard *.in))) \ + config.cache config.log config.status + +## User functions + +removefile = files="$(2)"; \ + for f in $$files; do \ + if test -f $$f; then \ + echo "Deleting $(1): $$f"; \ + rm -f $$f; \ + fi; \ + done + +removelink = files="$(2)"; \ + for f in $$files; do \ + if test -h $$f; then \ + echo "Deleting $(1): $$f"; \ + rm -f $$f; \ + fi; \ + done + +removedir = dirs="$(2)"; \ + for d in $$dirs; do \ + if test -d $$d; then \ + echo "Removing $(1): $$d"; \ + rm -rf $$d; \ + fi; \ + done + +### Local Variables: *** +### mode: Makefile *** +### End: *** diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..d69d139 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,62 @@ +## Directory variables + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ + +## Directory for install + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +libdir = @libdir@ +includedir = @includedir@/@PACKAGE@ + +## Program variables + +INSTALL = @INSTALL@ + +## Compiler variables + +include $(top_srcdir)/Makeconf + +## Specific variables + +## Archive tools + +TAR = @TAR@ +COMPRESS = @COMPRESS@ + +@SET_MAKE@ + +## Targets + +SUBDIRS = src test + +DIR = $(shell basename `cd $(top_srcdir); pwd`) + +TARGETS = + +## Generic Rules + +include $(top_srcdir)/Makerule + +## Specific rules + +purge: + @$(call removedir,"build directory",$(BUILD_LIST_DIRS) $(BUILD_DIR)) + +archive: purge + test -n "`which autoconf`" && autoconf + ./configure + test -n "`which cvs2cl.pl`" && cvs2cl.pl + -test -n "`which devtodo`" && devtodo -T + make package + +package: purge + ( cd ..; \ + test "$(DIR)" != "$(PACK)" && mv $(DIR) $(PACK); \ + find $(PACK) \( ! -regex '.*CVS.*' \) -a -type f | \ + xargs $(TAR) cf $(PACK).tar; \ + $(COMPRESS) -f $(PACK).tar; \ + test "$(DIR)" != "$(PACK)" && mv $(PACK) $(DIR); ) + +.PHONY: archive package diff --git a/Makerule.in b/Makerule.in new file mode 100644 index 0000000..94a3321 --- /dev/null +++ b/Makerule.in @@ -0,0 +1,128 @@ +## General rules + +all: all-local all-recursive + +all-local: $(BUILD_LIST_DIRS) $(DEPENDS) $(OBJECTS) $(TARGETS) + +$(BUILD_LIST_DIRS) $(install_list_dirs):%: + @echo "Creating directory $@"; \ + $(MKDIR) $@ + +install: $(install_list_dirs) install-local install-recursive + +install-local: all $(XTRA_INST) + @if test -n "$(HEADERS)"; then \ + for header in `echo $(HEADERS)`; do \ + rm -f $(includedir)/$$header; \ + echo "Installing $$header in $(includedir)"; \ + $(INSTALL_DATA) $$header $(includedir); \ + done; \ + fi + @if test -n "$(SHLIBVER)"; then \ + rm -f $(libdir)/$(SHLIBVER); \ + echo "Installing $(SHLIBVER) in $(libdir)"; \ + $(INSTALL_PROGRAM) $(LIB_BUILD_DIR)/$(SHLIBVER) $(libdir); \ + fi + @if test -f "$(SHLIB)"; then \ + rm -f $(libdir)/$(SHLIB); \ + echo "Installing $(SHLIB) in $(libdir)"; \ + $(LN_S) $(SHLIBVER) $(libdir)/$(SHLIB); \ + fi + @if test -f "$(STLIB)"; then \ + rm -f $(libdir)/$(STLIB); \ + echo "Installing $(STLIB) in $(libdir)"; \ + $(INSTALL_DATA) $(LIB_BUILD_DIR)/$(STLIB) $(libdir); \ + fi + +depend: $(DEPENDS) + +clean: clean-recursive clean-local + +clean-local: + @$(call removefile,"backup file",*~) + @$(call removefile,"depend file",$(DEPENDS)) + @$(call removelink,"object link",$(OBJECTS)) + @$(call removefile,"object file",$(addprefix $(OBJ_BUILD_DIR)/,$(OBJECTS))) + @$(call removefile,"tmp file",$(TMPFILES)) + +purge: purge-recursive purge-local + +purge-local: clean-local + @$(call removefile,"config file",$(CONFIGS)) + @$(call removelink,"library link",$(SHLIBVER) $(SHLIB) $(STLIB)) + @$(call removefile,"library file",$(addprefix $(LIB_BUILD_DIR)/,$(SHLIBVER) $(SHLIB) $(STLIB))) + @$(call removelink,"binary link",$(PROGTESTS)) + @$(call removefile,"binary file",$(addprefix $(BIN_BUILD_DIR)/,$(PROGTESTS))) + +## Recursive generic rule + +%-recursive: + @for subdir in $(SUBDIRS); do \ + if [ -f "$$subdir/Makefile" ]; then \ + echo "Making $* in $$subdir"; \ + $(MAKE) -s -C $$subdir $* \ + || case "$(MFLAGS)" in *k*) fail=yes;; *) exit 1;; esac; \ + echo "Leaving $$subdir"; \ + fi; \ + done && test -z "$$fail" + +## Prerequisites rules + +ifneq (,$(wildcard *.d)) +include $(wildcard *.d) +endif + +## Rules for usual directory + +%.d: %.c + @set -e; \ + echo "Creating makefile for $<"; \ + $(CC) $(CCINCS) -MM $< \ + | sed 's,\($(*F)\)\.o[ :]*,\1.o $@ : ,g' > $@; \ + test -s $@ || rm -f $@ + +%.o: %.c + @echo "Compiling $<" + @rm -f $@ + @$(COMPILE) $< -o $(OBJ_BUILD_DIR)/$@ + @$(LN_S) -f $(OBJ_BUILD_DIR)/$@ $@ + +%.a: $(OBJECTS) + @echo "Creating static lib $@" + @rm -f $@ + @$(ST_LINK) $(LIB_BUILD_DIR)/$@ $^ + @$(RANLIB) $(LIB_BUILD_DIR)/$@ + @$(LN_S) -f $(LIB_BUILD_DIR)/$@ $@ + +%.so.$(VERSION): $(OBJECTS) + @echo "Creating dynamic library $@" + @rm -f $@ + $(SH_LINK) $^ -o $(LIB_BUILD_DIR)/$@ +ifneq (${DEBUG},true) + @echo "Sripping dynamic library $@" + @$(STRIP) $(LIB_BUILD_DIR)/$@ +endif + @$(LN_S) -f $(LIB_BUILD_DIR)/$@ $@ + +%.so: %.so.$(VERSION) + @echo "Creating dynamic library version $@" + @rm -f $@ + @$(LN_S) $< $@ + +prog_%$(EXECEXT): %.o + @echo "Creating program $@" + @rm -f $@ + @$(LINK) $< -o $(BIN_BUILD_DIR)/$@ +ifneq (${DEBUG},true) + @echo "Stripping program $@" + @$(STRIP) $(BIN_BUILD_DIR)/$@ +endif + @$(LN_S) -f $(BIN_BUILD_DIR)/$@ $@ + +## Phony rule + +.PHONY: all install + +### Local Variables: *** +### mode: Makefile *** +### End: *** diff --git a/README b/README new file mode 100644 index 0000000..ac09b2a --- /dev/null +++ b/README @@ -0,0 +1,63 @@ +LibViterbi -- a generic Viterbi algorythm + +Copyright (C) 2003 Laurent S. Mazet + +Last updated: Tue Jul 22 15:09:20 MEST 2003 + + +Overview +-------- + +LibViberti provides a generic Viterbi algorithm and a short toolbox +for convolutional encoder. + +Installation and Bugs +--------------------- + +To compile LibViterbi, you will need a recent version of GNU Make, and +a decent version of gcc and sed. + +See the notes in the files INSTALL and INSTALL.LIBVITERBI for more specific +installation instructions, including directions for installing LibViterbi +from a binary distribution. + +The file BUGS contains a recommended procedure for reporting bugs, as +well as a list of known problems and possible fixes. + +Documentation +------------- + +LibViterbi documentation will be available on the doc directory. +Some test programs are also available on the test directory. + +Performance +----------- + +On a PIII-600MHz, I got these bitrates for (o171, o133) coder: +- standard, no optimization: 105kbps +- one branch optimization: 148kbps +- two predecessors optimization: 190kps +- full optimizations: 246kbps + +Implementation +-------------- + +LibViterbi is being developed with the Free Software Foundation's make, +sed and gcc on an Intel Pentium III system running Linux/GNU. It should +be possible to install it on any machine that runs GCC. It may also be +possible to install it using other implementations of these tools, but +it will most certainly require much more work. Do yourself a favor and +get the GNU development tools, either via anonymous ftp from ftp.gnu.org +or by writing the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + +Additional Information +---------------------- + +None. + +-- +Laurent S. Mazet +laurent.mazet@motorola.com +Centre de Recherche de Motorola +France diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..4f771fa --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,75 @@ +dnl aclocal.m4 -- extra macros for configuring LibViterbi +dnl +dnl Copyright (C) 2003 Laurent Mazet +dnl +dnl This file is part of LibViterbi. +dnl +dnl -------------------------------------------------------------------- +dnl +dnl Check to see if C compiler handles FLAG command line option. Add +dnl FLAG to CCFLAGS if the compiler accepts the flag. +dnl +AC_DEFUN(LIBVITERBI_CC_FLAG, [ + ac_safe=`echo "$1" | sed 'y%./+-%__p_%'` + AC_MSG_CHECKING(whether ${CC-gcc} accepts $1) + AC_CACHE_VAL(libviterbi_cv_cc_flag_$ac_safe, [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + XCCFLAGS="$CCFLAGS" + CCFLAGS="$CCFLAGS $1" + AC_TRY_LINK([], [], + eval "libviterbi_cv_cc_flag_$ac_safe=yes", + eval "libviterbi_cv_cc_flag_$ac_safe=no") + CCFLAGS="$XCCFLAGS" + AC_LANG_RESTORE + ]) + if eval "test \"`echo '$libviterbi_cv_cc_flag_'$ac_safe`\" = yes"; then + AC_MSG_RESULT(yes) + CCFLAGS="$CCFLAGS $1" + else + AC_MSG_RESULT(no) + fi +]) +dnl +dnl Check to see if C linker handles LDFLAG command line option. Add +dnl LDFLAG to LDFLAGS if the linker accepts the flag. +dnl +AC_DEFUN(LIBVITERBI_CC_LDFLAG, [ + ac_safe=`echo "$1" | sed 'y%./+-%__p_%'` + AC_MSG_CHECKING(whether ${CC-gcc} accepts $1) + AC_CACHE_VAL(libviterbi_cv_cc_ldflag_$ac_safe, [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + XLDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $1" + AC_TRY_LINK([], [], + eval "libviterbi_cv_cc_ldflag_$ac_safe=yes", + eval "libviterbi_cv_cc_ldflag_$ac_safe=no") + LDFLAGS="$XLDFLAGS" + AC_LANG_RESTORE + ]) + if eval "test \"`echo '$libviterbi_cv_cc_ldflag_'$ac_safe`\" = yes"; then + AC_MSG_RESULT(yes) + LDFLAGS="$LDFLAGS $1" + else + AC_MSG_RESULT(no) + fi +]) +dnl +dnl Check if file changes +dnl +AC_DEFUN(LIBVITERBI_CHECK_CHANGE, [ + orig="$1" + new="$2" + if test -f "$orig"; then + if test -z "`diff \"$orig\" \"$new\"`"; then + AC_MSG_RESULT("$orig is unchanged") + rm "$new" + else + rm "$orig" + mv "$new" "$orig" + fi + else + mv "$new" "$orig" + fi +]) diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..1d27287 --- /dev/null +++ b/config.guess @@ -0,0 +1,997 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# The master version of this file is at the FSF in /home/gd/gnu/lib. +# Please send patches to the Autoconf mailing list . +# +# 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 <$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 + + 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 + #include + + 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 + 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/^ //' <$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 </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 < +#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' /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 + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # 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 < +# include +#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 + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +#if !defined (ultrix) + printf ("vax-dec-bsd\n"); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +#echo '(Unable to guess system type)' 1>&2 + +exit 1 diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..ecf770c --- /dev/null +++ b/config.sub @@ -0,0 +1,979 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc. +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +if [ x$1 = x ] +then + echo Configuration name missing. 1>&2 + echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 + echo "or $0 ALIAS" 1>&2 + echo where ALIAS is a recognized configuration type. 1>&2 + exit 1 +fi + +# First pass through any local machine types. +case $1 in + *local*) + echo $1 + exit 0 + ;; + *) + ;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + linux-gnu*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple) + os= + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ + | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ + | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 | hppa2.0 \ + | hppa2.0w \ + | alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \ + | i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \ + | mips64 | mipsel | mips64el | mips64orion | mips64orionel \ + | mipstx39 | mipstx39el | armv[34][lb] \ + | sparc | sparclet | sparclite | sparc64 | v850) + basic_machine=$basic_machine-unknown + ;; + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[34567]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \ + | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ + | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \ + | xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* \ + | hppa2.0w-* \ + | alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \ + | ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \ + | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparc64-* | mips64-* | mipsel-* | armv[34][lb]-*\ + | mips64el-* | mips64orion-* | mips64orionel-* \ + | mipstx39-* | mipstx39el-* \ + | f301-* | armv*-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-cbm + ;; + amigaos | amigados) + basic_machine=m68k-cbm + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-cbm + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + os=-mpeix + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + os=-mpeix + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + os=-mvs + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[34567]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[34567]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[34567]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[34567]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netwinder) + basic_machine=armv4l-corel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + np1) + basic_machine=np1-gould + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | nexen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | k6 | 6x86) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | nexen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | k6-* | 6x86-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sparc) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -rhapsody* \ + | -openstep* | -mpeix* | -oskit*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -xenix) + os=-xenix + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-corel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f301-fujitsu) + os=-uxpv + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..9690212 --- /dev/null +++ b/configure.in @@ -0,0 +1,266 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(src/trellis.h) + +AC_CANONICAL_HOST + +dnl Generate config.h + +dnl Minimum Autoconf version required. +AC_PREREQ(2.10) + +dnl Version code +V_MAJOR=1 +V_MINOR=2 +V_MICRO=0 + +VERSION=${V_MAJOR}.${V_MINOR}.${V_MICRO} +AC_SUBST(VERSION) + +dnl Package name +PACKAGE=viterbi +AC_SUBST(PACKAGE) + +dnl Library name +LIBRARY=viterbi +AC_SUBST(LIBRARY) + +dnl Check C compiler + +AC_PROG_CC + +dnl Check compileur options + +OLDCCFLAGS="$CCFLAGS" +CCFLAGS="" +LIBVITERBI_CC_FLAG(-O3) +if test "$libviterbi_cv_cc_flag__O3" = "no"; then + LIBVITERBI_CC_FLAG(-O2) + if test "$libviterbi_cv_cc_flag__O2" = "no"; then + CCFLAGS="$OLDCCFLAGS" + fi +fi + +LIBVITERBI_CC_FLAG(-pipe) + +LIBVITERBI_CC_FLAG(-Wall) + +dnl Checks for programs. + +AC_PROG_INSTALL +AC_PROG_MAKE_SET +AC_PROG_LN_S +AC_PROG_RANLIB + +AC_CHECK_PROGS(AR, ar) +if test "$AR" = ""; then + if $STATIC_LIBS; then + AC_MSG_ERROR([Unable to found ar]); + fi +fi +AC_SUBST(AR) + +AC_CHECK_PROGS(STRIP, strip) +if test "$STRIP" = ""; then + AC_MSG_WARN([Unable to found strip]); +fi +AC_SUBST(STRIP) + +AC_CHECK_PROGS(BASENAME, basename) +if test "$BASENAME" = ""; then + AC_MSG_ERROR([Unable to found basename]); +fi +AC_SUBST(BASENAME) + +AC_CHECK_PROGS(TAR, gtar tar) +if test -z "$TAR"; then + AC_MSG_WARN([Unable to found tar]); +fi +AC_SUBST(TAR) + +AC_CHECK_PROGS(COMPRESS, bzip2 gzip compress) +if test -z "$COMPRESS"; then + AC_MSG_WARN([Unable to found compress]); +fi +AC_SUBST(COMPRESS) + +dnl Checks for libraries. + +dnl Checks for header files. + +dnl Checks for typedefs, structures, and compiler characteristics. + +dnl Check options + +### Usage of a temporary directory + +BUILD_DIR="build" +AC_ARG_ENABLE(builddir, + [ --enable-builddir= use for object files], + [case "$enableval" in + no) + ;; + yes) + BUILD_DIR="/tmp/`whoami`/$PACKAGE" + ;; + *) + BUILD_DIR="$enableval" + ;; + esac], []) +changequote(,)dnl +BUILD_DIR=`echo $BUILD_DIR | sed -e 's%^\([^/]\)%$(top_srcdir)/\1%'` +changequote([,])dnl +AC_SUBST(BUILD_DIR) + +### Enable creation of static libraries. + +AC_ARG_ENABLE(static, + [ --enable-static create static libraries], + [if test "$enableval" = no; then STATIC_LIBS=false; + else STATIC_LIBS=true; fi], + STATIC_LIBS=true) +AC_SUBST(STATIC_LIBS) + +### enable debugging information + +AC_ARG_WITH(debug, + [ --with-debug add debug information], + [if test "$withval" = no; then DEBUG=false; + else DEBUG=true; fi], + DEBUG=false) +AC_SUBST(DEBUG) + +### with profiling information + +AC_ARG_WITH(profile, + [ --with-profile add profiling information (for gprof)], + [if test "$withval" = no; then PROFILE=false; + else PROFILE=true; fi], + PROFILE=false) + +if test "$PROFILE" = true; then + DEBUG=true +fi + +## check debugging flags + +if test "$DEBUG" = true; then + LIBVITERBI_CC_FLAG(-ggdb3) + if test "$libviterbi_cv_cc_flag__ggdb3" = "no"; then + LIBVITERBI_CC_FLAG(-g) + if test "$libviterbi_cv_cc_flag__g" = "no"; then + AC_MSG_ERROR([Can't add debugging information with this compiler!]) + fi + fi +fi + +## check profiling flags + +if test "$PROFILE" = true; then + LIBVITERBI_CC_LDFLAG(-pg) + if test "$libviterbi_cv_cc_ldflag__pg" = "no"; then + AC_MSG_ERROR([Can't add profiling information with this compiler!]) + fi +fi + +### Enable creation of shared libraries. Currently only works with +### gcc on some systems. + +AC_ARG_ENABLE(shared, + [ --enable-shared create shared libraries (not all systems)], + [if test "$enableval" = no; then SHARED_LIBS=false; + else SHARED_LIBS=true; fi], + SHARED_LIBS=true) +AC_SUBST(SHARED_LIBS) + +dnl Some check for cygwin + +case "$host" in + *-*-cygwin*) + SHARED_LIBS=false + ;; +esac + +if $STATIC_LIBS || $SHARED_LIBS; then + true +else + AC_MSG_ERROR([You can't disable building static AND shared libraries!]) +fi + +### + +use_rpath=true +AC_ARG_ENABLE(rpath, + [ --enable-rpath add -rpath to link command for shared libraries], + [if test "$enableval" = no; then use_rpath=false; fi], []) + +CCPICFLAG=-fPIC +SHLEXT=so +STLEXT=a +SH_LD="$CC" +SH_LDFLAGS=-shared +SONAME_FLAGS= +RLD_FLAG= +EXECEXT="" +case "$host" in + *-*-386bsd* | *-*-openbsd* | *-*-netbsd* | *-*-freebsd*) + SH_LD=ld + SH_LDFLAGS=-Bshareable + ;; + *-*-cygwin*) + EXECEXT=".exe" + ;; + *-*-linux*) + SONAME_FLAGS='-Xlinker -soname -Xlinker $(shell $(BASENAME) $@)' + RLD_FLAG='-Xlinker -rpath -Xlinker $(shell cd $(LIB_BUILD_DIR); pwd)' + ;; + hppa*-hp-hpux*) + SHLEXT=sl + SH_LDFLAGS="-shared -fPIC" + RLD_FLAG='-Xlinker +b -Xlinker $(shell cd $(LIB_BUILD_DIR); pwd)' + ;; + sparc-sun-solaris2* | i386-pc-solaris2*) + RLD_FLAG='-Xlinker -R -Xlinker $(shell cd $(LIB_BUILD_DIR); pwd)' + ;; + *) + if $SHARED_LIBS; then + AC_MSG_ERROR([I don't know how to handle this machine. Correct me first!]) + fi + ;; +esac + +if $use_rpath; then + true +else + RLD_FLAG= +fi + +AC_SUBST(CCFLAGS) +AC_SUBST(CCPICFLAG) +AC_SUBST(SHLEXT) +AC_SUBST(STLEXT) +AC_SUBST(SH_LD) +AC_SUBST(SH_LDFLAGS) +AC_SUBST(SONAME_FLAGS) +AC_SUBST(RLD_FLAG) +AC_SUBST(EXECEXT) + +dnl Set CC and LD variable + +LD=$CC +AC_SUBST(LD) + +dnl Generate ouputs + +AC_OUTPUT( +[ Makeconf + Makefile + Makerule + src/viterbiversion.t + src/Makefile + test/Makefile +]) + +AC_OUTPUT_COMMANDS( + LIBVITERBI_CHECK_CHANGE("src/viterbiversion.h", "src/viterbiversion.t") +) diff --git a/doc/coders.txt b/doc/coders.txt new file mode 100644 index 0000000..761970b --- /dev/null +++ b/doc/coders.txt @@ -0,0 +1,105 @@ +#inputs #outs #regs g0 g1 dfree +1 2 2 5 7 5 +1 2 3 15 17 6 +1 2 4 23 35 7 +1 2 5 65 57 8 +1 2 6 133 171 10 +1 2 7 345 237 10 +1 2 8 561 753 12 +1 2 9 1161 1545 12 +1 2 10 2335 3661 14 +1 2 11 4335 5723 15 +1 2 12 10533 17661 16 +1 2 13 21675 27123 16 +1 2 14 56721 61713 18 +1 2 15 111653 145665 19 +1 2 16 347241 246277 20 + +#inputs #outs #regs g0 g1 g2 dfree +1 3 2 5 7 7 8 +1 3 3 13 15 17 10 +1 3 4 25 33 37 12 +1 3 5 47 53 75 13 +1 3 6 133 145 175 15 +1 3 7 225 331 367 16 +1 3 8 557 663 711 18 +1 3 9 1117 1365 1633 20 +1 3 10 2353 2671 3175 22 +1 3 11 4767 5723 6265 24 +1 3 12 10533 10675 17661 24 +1 3 13 21645 35661 37133 26 + +#inputs #outs #regs g0 g1 g2 dfree +2 3 3 17 06 15 3 +2 3 5 27 75 72 5 +2 3 7 236 155 337 7 + +#inputs #outs #regs g0 g1 g2 g3 g4 dfree +2 5 3 17 07 11 12 04 6 +2 5 5 27 71 52 65 57 10 +2 5 7 247 366 171 266 373 12 +3 5 5 35 23 75 61 47 5 +4 5 7 237 274 156 255 337 3 + +#inputs #outs #regs g0 g1 g2 g3 g4 g5 g6 dfree +2 7 3 05 06 12 15 15 13 17 9 +2 7 5 33 55 72 47 25 53 75 14 +2 7 7 312 125 247 366 171 266 373 18 +3 7 5 45 21 36 62 57 43 71 8 +4 7 7 130 067 237 274 156 255 337 6 + +#inputs #outs #regs g0 g1 g2 g3 dfree +3 4 5 13 25 61 47 4 + +#inputs #outs #regs g0 g1 g2 g3 g4 g5 g6 g7 dfree +3 8 5 15 42 23 61 51 36 75 47 8 + +#inputs #outs #regs g0 g1 g2 g3 dfree +1 4 2 5 7 7 7 10 +1 4 3 13 15 15 17 13 +1 4 4 25 27 33 37 16 +1 4 5 53 67 71 75 18 +1 4 6 135 135 147 163 20 +1 4 7 235 275 313 357 22 +1 4 8 463 535 733 745 24 +1 4 9 1117 1365 1633 1653 27 +1 4 10 2387 2353 2671 3175 29 +1 4 11 4767 5723 6265 7455 32 +1 4 12 11145 12477 15537 16727 33 +1 4 13 21113 23175 35527 35537 36 + +#inputs #outs #regs g0 g1 g2 g3 g4 dfree +1 5 2 7 7 7 5 5 13 +1 5 3 17 17 13 15 15 16 +1 5 4 37 27 33 25 35 20 +1 5 5 75 71 73 65 57 22 +1 5 6 175 131 135 135 147 25 +1 5 7 257 233 323 271 357 28 + +#inputs #outs #regs g0 g1 g2 g3 g4 g5 dfree +1 6 2 7 7 7 7 5 5 16 +1 6 3 17 17 13 13 15 15 20 +1 6 4 37 35 27 33 25 35 24 +1 6 5 73 75 55 65 47 57 27 +1 6 6 173 151 135 135 163 137 30 +1 6 7 253 375 331 235 313 357 34 + + +#inputs #outs #regs g0 g1 g2 g3 g4 g5 g6 dfree +1 7 2 7 7 7 7 5 5 5 18 +1 7 3 17 17 13 13 13 15 15 23 +1 7 4 35 27 25 27 33 35 37 28 +1 7 5 53 75 65 75 47 67 57 32 +1 7 6 165 145 173 135 135 147 137 36 +1 7 7 275 253 375 331 235 313 357 40 + +#inputs #outs #regs g0 g1 g2 g3 g4 g5 g6 g7 dfree +1 8 2 7 7 5 5 5 7 7 7 21 +1 8 3 17 17 13 13 13 15 15 17 26 +1 8 4 37 33 25 25 35 33 27 37 32 +1 8 5 57 73 51 65 75 47 67 57 36 +1 8 6 153 111 165 173 135 135 147 137 40 +1 8 7 275 275 253 371 331 235 313 357 45 + +## grep -v \^# coders.txt | awk 'NF>0 {printf "l=\"%d", $1; for (i=2;i0 {printf "%d", $1; for (i=2;i +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs 2253 2006-08-29 08:42:29Z alm002 $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..08ceb65 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,36 @@ +## Directory variables + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ + +## Directory for install + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +libdir = @libdir@ +includedir = @includedir@/@PACKAGE@ + +## Program variables + +INSTALL = @INSTALL@ + +## Generic variables + +include $(top_srcdir)/Makeconf + +## Specific variables + +ifeq ($(SHARED_LIBS),true) +SHLIB = lib@LIBRARY@.@SHLEXT@ +SHLIBVER = $(SHLIB).@VERSION@ +endif + +ifeq ($(STATIC_LIBS),true) +STLIB = lib@LIBRARY@.@STLEXT@ +endif + +TARGETS = $(OBJECTS) $(SHLIBVER) $(SHLIB) $(STLIB) + +## Generic rules + +include $(top_srcdir)/Makerule diff --git a/src/create_trellis.c b/src/create_trellis.c new file mode 100644 index 0000000..7731c7d --- /dev/null +++ b/src/create_trellis.c @@ -0,0 +1,202 @@ +/* -*- C -*- */ + +/* + +Copyright (C) 2003 Laurent Mazet + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* Generic trellis constructors */ + +#include + +#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<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; itrellis_symbs[i][k] = (k << enc->nb_inputs) | (i >> (enc->nb_registers - enc->nb_inputs)); + + for (j=0; jnb_inputs) | j; + + /* compute table of state predecessors */ + tr->trellis_states[i][j] = state & (nb_states-1); + + for (k=0; knb_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>=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; ktrellis_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; knb_symb_branch; k++) + printf ("\ty(%d)", k); + + /* predecessors */ + for (j=0; jnb_preds; j++) + printf ("\ts(%d)", j); + + /* codewords */ + if (tr->nb_symb_branch == 1) + for (j=0; jnb_preds; j++) + printf ("\tb(%d)", j); + else + for (j=0; jnb_preds; j++) + for (k=0; knb_symb_branch; k++) + printf ("\tb(%d|%d)", j, k); + printf ("\n"); + + /* for each state */ + for (i=0; inb_states; i++) { + + /* state */ + printf ("%d", i); + + /* symbol(s) */ + for (k=0; knb_symb_branch; k++) + printf ("\t%d",tr-> trellis_symbs[i][k]); + + /* predecessors */ + for (j=0; jnb_preds; j++) + printf ("\t%d", tr->trellis_states[i][j]); + + /* codewords */ + for (j=0; jnb_preds; j++) + for (k=0; knb_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; inb_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; inb_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; inb_states; i++) + printf (" %d", tr->memory_symbols[tr->current_index][i]); + printf("\n"); +} diff --git a/src/create_trellis.h b/src/create_trellis.h new file mode 100644 index 0000000..3b81d66 --- /dev/null +++ b/src/create_trellis.h @@ -0,0 +1,42 @@ +/* -*- C -*- */ + +/* + +Copyright (C) 2003 Laurent Mazet + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* Generic trellis constructors */ + +#if !defined(__CREATE_TRELLIS_H__) +#define __CREATE_TRELLIS_H__ + +#include "encoder.h" +#include "trellis.h" + +trellis *create_trellis_from_conv_encoder (conv_encoder *enc, + int history_size); + +void display_trellis_structure (trellis *tr); + +void display_trellis_memory (trellis *tr, char *format); + +#endif /* __CREATE_TRELLIS_H__ */ diff --git a/src/encoder.c b/src/encoder.c new file mode 100644 index 0000000..70bd6e8 --- /dev/null +++ b/src/encoder.c @@ -0,0 +1,109 @@ +/* -*- C -*- */ + +/* + +Copyright (C) 2003 Laurent Mazet + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* Generic encoder */ + +#include +#include + +#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; inb_unprotected_bits; j++) + y[ypos++] = x[xpos++]; + + /* get the input bits */ + for (j=0; jnb_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; jnb_coders; j++) { + int bit = 0; + + /* do the convolution */ + int bits = enc->registers & enc->coders[j]; + + /* do an addition modulo 2 */ + for (k=0; (k>=1) + bit ^= bits & 1; + + y[ypos++] = bit; + } + + /* move bits into the register field */ + enc->registers >>= enc->nb_inputs; + + } +} diff --git a/src/encoder.h b/src/encoder.h new file mode 100644 index 0000000..8a30de8 --- /dev/null +++ b/src/encoder.h @@ -0,0 +1,56 @@ +/* -*- C -*- */ + +/* + +Copyright (C) 2003 Laurent Mazet + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* Generic encoder */ + +#if !defined(__ENCODER_H__) +#define __ENCODER_H__ + +/* Bit definition */ +typedef char bit; + +/* Convolutional encoder definition */ +typedef struct { + int nb_unprotected_bits; + int nb_inputs; + int nb_registers; + int registers; + int nb_coders; + int *coders; +} conv_encoder; + +/* Convolution encoder functions */ + +conv_encoder *alloc_conv_encoder (int nb_unprotected_bits, int nb_inputs, int nb_registers, + int nb_coders, int *coders); + +void reset_conv_encoder (conv_encoder *enc); + +void free_conv_encoder (conv_encoder *enc); + +void conv_encoding (bit *y, bit *x, int xlen, conv_encoder *enc); + +#endif /* __ENCODER_H__ */ diff --git a/src/trellis.c b/src/trellis.c new file mode 100644 index 0000000..e736710 --- /dev/null +++ b/src/trellis.c @@ -0,0 +1,655 @@ +/* -*- C -*- */ + +/* + +Copyright (C) 1997 Karine Gosse and Marc de Courville +Copyright (C) 1997-2003 Veronique Buzenac +Copyright (C) 2003 Laurent Mazet + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* Generic Viterbi Decoder with soft decisions. */ + +#if !defined (__TRELLIS_C__) +#define __TRELLIS_C__ 1 + +#include +#include +#include + +#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<=inb_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; itrellis_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; itrellis_symbs[i] = tr->trellis_symbs[0] + i*nb_symb_branch; + + tr->trellis_branch = (int***) malloc (nb_states * sizeof(int**)); + for (i=0; itrellis_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; itrellis_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; imemory_symbols[i] = (int*) malloc (nb_states * sizeof(int)); + + tr->memory_states = (int**) malloc (history_size * sizeof(int*)); + for (i=0; imemory_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; inb_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; inb_states; i++) { + free (tr->trellis_branch[i]); + } + free (tr->trellis_branch); + + for (i=0; ihistory_size; i++) + free (tr->memory_symbols[i]); + free (tr->memory_symbols); + + for (i=0; ihistory_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; inb_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; inb_states; i++) + if (tr->metrics_node[i] < min_metric) + min_metric = tr->metrics_node[i]; + } + + /* normalize node metrics */ + for (i=0; inb_states; i++) + tr->metrics_node[i] -= min_metric; + + return min_metric; +} + +/* Back trace the trellis */ +int backtrace_trellis (trellis *tr, int state, int deepness, + int decoding_length, int *decoded_symbols) { + int i; + + /* backtracking: we start at the elected state */ + int current_state = state; + int current_index = tr->current_index; + + /* check if there enough data */ + if (tr->current_time < deepness + decoding_length - 1) + return TRELLIS_ERR_NO_ENOUGH_DATA; + if (tr->history_size < deepness + decoding_length) + return TRELLIS_ERR_HIST_TOO_SMALL; + + /* start backtrace */ + for (i=-deepness+1; i<=decoding_length; i++) { + + /* get decoded symbol */ + if (i > 0) + decoded_symbols[decoding_length-i] = + tr->memory_symbols[current_index][current_state]; + + /* go backward on trellis */ + current_state = tr->memory_states[current_index][current_state]; + + /* check for circular buffer */ + if (current_index == 0) + current_index = tr->history_size; + current_index--; + } + + return decoding_length; +} + +/* Full backtrace the trellis */ +int full_backtrace_trellis (trellis *tr, int state, int deepness, + int *decoded_symbols) { + + /* check if there enough data */ + int decoding_length = + tr->current_time - tr->last_decoded_symbol - deepness - 1; + + if (decoding_length < 0) { + tr->error_code = TRELLIS_WARN_NO_MORE_DATA; + return 0; + } + if (decoding_length > tr->history_size - deepness) + decoding_length = tr->history_size - deepness; + + /* Back trace the trellis */ + tr->error_code = TRELLIS_NO_ERR_WARN; + decoding_length = backtrace_trellis (tr, state, deepness, decoding_length, + decoded_symbols); + + /* move last decoded symbol position */ + tr->last_decoded_symbol += decoding_length; + + return decoding_length; +} + +#endif diff --git a/src/trellis.h b/src/trellis.h new file mode 100644 index 0000000..69d6c09 --- /dev/null +++ b/src/trellis.h @@ -0,0 +1,146 @@ +/* -*- C -*- */ + +/* + +Copyright (C) 1997 Karine Gosse and Marc de Courville +Copyright (C) 1997-2003 Veronique Buzenac +Copyright (C) 2003 Laurent Mazet + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* Generic Viterbi Decoder with soft decisions. */ + +#if !defined(__TRELLIS_H__) +#define __TRELLIS_H__ + +#include "viterbiversion.h" + +#if !defined(__TRELLIS_C__) +extern const char *Viterbi_Version; +#else +const char *Viterbi_Version = VITERBIVERSION; +#endif + +/* metric type definition */ +typedef double metric_t; +#define MAXMETRIC MAXDOUBLE + +/* Trellis definition: + * =================== + * + * - nb_preds: # of predecessors states in the trellis per node + * - nb_states: # of states in the trellis + * - nb_symb_branch: # of possible symbol in the constellation or bits + * associated to a branch (trellis transition) + * - history_size: # of memory of the trellis (record of previous ACSs) + * + * - trellis_states (nb_states x nb_preds): table of state predecessors, + * position (i, j) provides the jth predecessor of the ith trellis state + * - trellis_symbs (nb_states x nb_symb_branch): table of uncoded symbols + * - trellis_branch (nb_states x nb_preds x nb_symb_branch): table of + * possible symbols/bits per trellis branch, position (i, j, k) denotes + * the kth symbol/bit associated to the branch number (i, j) linking + * the jth predecessor and ith trellis state + * + * - memory_states (history_size x nb_states): circular buffer gathering + * the current sequence of states, each position (t, i) records at + * time t the predecessor of the ith state + * - memory_symbols (history_size x nb_states): circular buffer containing + * current sequence of symbols, each position (t, i) records at time t + * the elected symbol/bit of the elected branch for the ith state + * + * - metric_node (nb_states): current node metrics, (i) provides the ith + * trellis node metric + * - metrics_node_elected (nb_states): current node metrics + * + * - last_decoded_symbol: last decoded symbol + * - current_time: current time in global frame + * - current_index: curent index in history buffer + * (current_index = current_time % history_size) + * + * - error_code: error code + */ + +typedef struct _trellis { + + int nb_preds; + int nb_states; + int nb_symb_branch; + int history_size; + + int **trellis_states; + int **trellis_symbs; + int ***trellis_branch; + + int **memory_states; + int **memory_symbols; + + metric_t *metrics_node; + metric_t *metrics_node_elected; + + /* For optimizations */ + metric_t *metric_node_tmp; + int *trellis_state_pred; + int *symbol_emitted; + + int (*acs)(struct _trellis *tr, metric_t *metrics); + + int last_decoded_symbol; + int current_time; + int current_index; + + int error_code; +} trellis; + +/* Trellis functions */ + +trellis *alloc_trellis(int nb_preds, int nb_states, int nb_symb_branch, + int history_size); + +void reset_trellis (trellis *tr); + +void free_trellis (trellis *tr); + +int acs_trellis(trellis *tr, metric_t *metrics); +int acs_trellis_x_2(trellis *tr, metric_t *metrics); +int acs_trellis_1_x(trellis *tr, metric_t *metrics); +int acs_trellis_1_2(trellis *tr, metric_t *metrics); + +int get_error_code(trellis *tr); + +int elect_state_trellis (trellis *tr); + +metric_t normalize_node_metrics_trellis (trellis *tr, metric_t min_metric); + +int backtrace_trellis (trellis *tr, int state, int deepness, + int decoding_length, int *decoded_symbols); + +int full_backtrace_trellis (trellis *tr, int state, int deepness, + int *decoded_symbols); + +/* Error codes */ +#define TRELLIS_NO_ERR_WARN 0 +#define TRELLIS_WARN_LOSING_DATA -1 +#define TRELLIS_WARN_NO_MORE_DATA -2 +#define TRELLIS_ERR_NO_ENOUGH_DATA -3 +#define TRELLIS_ERR_HIST_TOO_SMALL -4 + +#endif /* __TRELLIS_H__ */ diff --git a/src/viterbiversion.t.in b/src/viterbiversion.t.in new file mode 100644 index 0000000..32ba3bc --- /dev/null +++ b/src/viterbiversion.t.in @@ -0,0 +1 @@ +#define VITERBIVERSION "@VERSION@" diff --git a/test/Makefile.in b/test/Makefile.in new file mode 100644 index 0000000..9e8c560 --- /dev/null +++ b/test/Makefile.in @@ -0,0 +1,29 @@ +## Directory variables + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ + +## Directory for install + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +libdir = @libdir@ +includedir = @includedir@/@PACKAGE@ + +## Program variables + +INSTALL = @INSTALL@ + +## Generic variables + +include $(top_srcdir)/Makeconf + +## Specific variables + +PROGTESTS = $(addprefix prog_,$(SOURCES:.c=$(EXECEXT))) + +TARGETS = $(OBJECTS) $(PROGTESTS) + +## Generic rules + +include $(top_srcdir)/Makerule diff --git a/test/benckmark.c b/test/benckmark.c new file mode 100644 index 0000000..ab3020b --- /dev/null +++ b/test/benckmark.c @@ -0,0 +1,224 @@ +/* -*- C -*- */ + +/* + +Copyright (C) 2003 Laurent Mazet + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* Program test for Viterbi decoding */ + +/* + * This program is a mess. It's used to test all coders in coders.txt and + * check memory management + */ + +//#define ONLY_VITERBI + +#include +#include + +#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 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>=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 +#include + +#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 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>=1) + if (bits & 1) + m++; + + metrics[k] = m; + } + +#if DEBUG + /* display metrics */ + printf ("metrics:"); + for (k=0; kcurrent_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 +#include + +#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 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>=1) + if (bits & 1) + m++; + + metrics[k] = m; + } + + //#if DEBUG +#if 1 + /* display metrics */ + printf ("metrics:"); + for (k=0; kcurrent_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