aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2017-06-30 19:35:21 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-06-30 19:35:21 +0000
commit95bc71811a7900d19723efa2dfc65eb7fc49c6d3 (patch)
tree8ba9d3ca08627db2b8186eaa7bbb4a1139510928
parent8dc0fc7e4194ae0cf1b92c8e81973589da893722 (diff)
parent4a3459a3528b7f11cf09acfa2d2a1fb5142c1c2b (diff)
downloadlibgsm-95bc71811a7900d19723efa2dfc65eb7fc49c6d3.tar.gz
Merge changes I65063e1f,I9090720fandroid-o-mr1-preview-2android-o-mr1-preview-1
am: 4a3459a352 Change-Id: I00fb227337c972bdb1ecc8aa8037e8e077efece0
-rw-r--r--Android.bp3
-rw-r--r--COPYRIGHT35
-rw-r--r--ChangeLog15
-rw-r--r--INSTALL99
-rw-r--r--MACHINES11
-rw-r--r--MANIFEST59
-rw-r--r--Makefile494
l---------[-rw-r--r--]NOTICE36
-rw-r--r--README4
-rw-r--r--README.version4
-rw-r--r--add-test/add_test.c353
-rw-r--r--add-test/add_test.dta683
-rw-r--r--inc/config.h7
-rw-r--r--inc/gsm.h2
-rw-r--r--inc/toast.h109
-rw-r--r--man/bitter.170
-rw-r--r--man/gsm.32
-rw-r--r--man/gsm_explode.32
-rw-r--r--man/gsm_option.32
-rw-r--r--man/gsm_print.32
-rw-r--r--man/toast.1156
-rw-r--r--src/debug.c6
-rw-r--r--src/short_term.c16
-rw-r--r--src/toast.c797
-rw-r--r--src/toast_alaw.c334
-rw-r--r--src/toast_audio.c113
-rw-r--r--src/toast_lin.c24
-rw-r--r--src/toast_ulaw.c621
-rw-r--r--tls/bitter.c66
-rw-r--r--tls/bitter.dta90
-rw-r--r--tls/ginger.c54
-rw-r--r--tls/sour.c91
-rw-r--r--tls/sour1.dta88
-rw-r--r--tls/sour2.dta90
-rw-r--r--tls/sweet.c66
-rw-r--r--tls/taste.c139
-rw-r--r--tls/taste.h20
-rw-r--r--tst/cod2lin.c104
-rw-r--r--tst/cod2txt.c94
-rw-r--r--tst/gsm2cod.c93
-rw-r--r--tst/lin2cod.c105
-rw-r--r--tst/lin2txt.c94
-rwxr-xr-xtst/run34
43 files changed, 5230 insertions, 57 deletions
diff --git a/Android.bp b/Android.bp
index ff6e739..26148b3 100644
--- a/Android.bp
+++ b/Android.bp
@@ -37,9 +37,8 @@ cc_library_static {
cflags: [
"-DSASR",
"-DWAV49",
- "-Wno-unused-parameter",
- "-Wno-shift-negative-value",
"-Werror",
+ "-Wno-unused-parameter",
],
export_include_dirs: ["inc"],
diff --git a/COPYRIGHT b/COPYRIGHT
new file mode 100644
index 0000000..28fbb3c
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,35 @@
+Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin
+
+Any use of this software is permitted provided that this notice is not
+removed and that neither the authors nor the Technische Universitaet Berlin
+are deemed to have made any representations as to the suitability of this
+software for any purpose nor are held responsible for any defects of
+this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+As a matter of courtesy, the authors request to be informed about uses
+this software has found, about bugs in this software, and about any
+improvements that may be of general interest.
+
+Berlin, 28.11.1994
+Jutta Degener
+Carsten Bormann
+
+ oOo
+
+Since the original terms of 15 years ago maybe do not make our
+intentions completely clear given today's refined usage of the legal
+terms, we append this additional permission:
+
+ Permission to use, copy, modify, and distribute this software
+ for any purpose with or without fee is hereby granted,
+ provided that this notice is not removed and that neither
+ the authors nor the Technische Universitaet Berlin are
+ deemed to have made any representations as to the suitability
+ of this software for any purpose nor are held responsible
+ for any defects of this software. THERE IS ABSOLUTELY NO
+ WARRANTY FOR THIS SOFTWARE.
+
+Berkeley/Bremen, 05.04.2009
+Jutta Degener
+Carsten Bormann
diff --git a/ChangeLog b/ChangeLog
index a3e7cb6..f15352b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Tue Jun 27 17:59:30 2017
+
+ * Release 1.0 Patchlevel 17
+ New email addresses in the README.
+ Avoid left-shifting signed integers.
+ Don't print longwords using %d or %ld, cast them to (long) first.
+ Don't compare longwords as longs in addtest, we only care for the
+ lower 32 bits. (The math works, but the test failed.)
+
+Sat Sep 17 14:50:55 2016
+
+ * Release 1.0 Patchlevel 16
+ New email addresses in the manual pages (patch 16)
+ Removed a stray .orig file (in patch 15)
+
Sun Apr 5 04:53:07 2009 Jutta Degener (jutta@pobox.com)
* Release 1.0 Patchlevel 13
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..5850304
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,99 @@
+How to get started:
+
+ Edit the Makefile.
+
+ You should configure a few machine-dependencies and what
+ compiler you want to use.
+
+ The code works both with ANSI and K&R-C. Use
+ -DNeedFunctionPrototypes to compile with, or
+ -UNeedFunctionPrototypes to compile without, function
+ prototypes in the header files.
+
+ Make addtst
+
+ The "add" program that will be compiled and run checks whether
+ the basic math functions of the gsm library work with your
+ compiler. If it prints anything to stderr, complain (to us).
+
+ Edit inc/config.h.
+
+ Make
+
+ Local versions of the gsm library and the "compress"-like filters
+ toast, untoast and tcat will be generated.
+
+ If the compilation aborts because of a missing function,
+ declaration, or header file, see if there's something in
+ inc/config.h to work around it. If not, complain.
+
+ Try it
+
+ Grab an audio file from somewhere (raw u-law or Sun .au is fine,
+ linear 16-bit in host byte order will do), copy it, toast it,
+ untoast it, and listen to the result.
+
+ The GSM-encoded and -decoded audio should have the quality
+ of a good phone line. If the resulting audio is noisier than
+ your original, or if you hear compression artifacts, complain;
+ that's a bug in our software, not a bug in the GSM encoding
+ standard itself.
+
+Installation
+
+ You can install the gsm library interface, or the toast binaries,
+ or both.
+
+ Edit the Makefile
+
+ Fill in the directories where you want to install the
+ library, header files, manual pages, and binaries.
+
+ Turn off the installation of one half of the distribution
+ (i.e., gsm library or toast binaries) by not setting the
+ corresponding directory root Makefile macro.
+
+ make install
+
+ will install the programs "toast" with two links named
+ "tcat" and "untoast", and the gsm library "libgsm.a" with
+ a "gsm.h" header file, and their respective manual pages.
+
+
+Optimizing
+
+ This code was developed on a machine without an integer
+ multiplication instruction, where we obtained the fastest result by
+ replacing some of the integer multiplications with floating point
+ multiplications.
+
+ If your machine does multiply integers fast enough,
+ leave USE_FLOAT_MUL undefined. The results should be the
+ same in both cases.
+
+ On machines with fast floating point arithmetic, defining
+ both USE_FLOAT_MUL and FAST makes a run-time library
+ option available that will (in a few crucial places) use
+ ``native'' floating point operations rather than the bit-by-bit
+ defined ones of the GSM standard. If you use this fast
+ option, the outcome will not be bitwise identical to the
+ results prescribed by the standard, but it is compatible with
+ the standard encoding, and a user is unlikely to notice a
+ difference.
+
+
+Bug Reports
+
+ Please direct bug reports, questions, and comments to
+ jutta@cs.tu-berlin.de and cabo@informatik.uni-bremen.de.
+
+
+Good luck,
+
+ Jutta Degener,
+ Carsten Bormann
+
+--
+Copyright 1992, 1993, 1994, by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin. See the accompanying file "COPYRIGHT"
+for details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
diff --git a/MACHINES b/MACHINES
new file mode 100644
index 0000000..9f9e69b
--- /dev/null
+++ b/MACHINES
@@ -0,0 +1,11 @@
+The gsm library has been tested successfully on the following platforms:
+
+- Various Sun4s running SunOS 4.1.2
+- SPARC1 (SunOS 4.1.1)
+- Integrated Solutions 68k Optimum running 4.3BSD UNIX with a Green Hills cc
+- NeXTstation running NeXT-OS/Mach 3.0
+- No-name AT/386 with Xenix 2.3.2 (using -DSTUPID_COMPILER)
+- RS/6000-350 running AIX 3.2.0
+- RS/6000-320 running AIX 3.1.5
+- Alliant FX80 (Concentrix 5.7)
+- SGI Indigo XS4000 (IRIX 4.0.5F)
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..6db3b2a
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,59 @@
+gsm-1.0/COPYRIGHT
+gsm-1.0/ChangeLog
+gsm-1.0/INSTALL
+gsm-1.0/MACHINES
+gsm-1.0/MANIFEST
+gsm-1.0/Makefile
+gsm-1.0/README
+gsm-1.0/add-test/add_test.c
+gsm-1.0/add-test/add_test.dta
+gsm-1.0/inc/gsm.h
+gsm-1.0/inc/proto.h
+gsm-1.0/inc/unproto.h
+gsm-1.0/inc/config.h
+gsm-1.0/inc/private.h
+gsm-1.0/inc/toast.h
+gsm-1.0/man/bitter.1
+gsm-1.0/man/gsm.3
+gsm-1.0/man/gsm_explode.3
+gsm-1.0/man/gsm_print.3
+gsm-1.0/man/gsm_option.3
+gsm-1.0/man/toast.1
+gsm-1.0/src/add.c
+gsm-1.0/src/code.c
+gsm-1.0/src/debug.c
+gsm-1.0/src/decode.c
+gsm-1.0/src/gsm_destroy.c
+gsm-1.0/src/gsm_decode.c
+gsm-1.0/src/gsm_encode.c
+gsm-1.0/src/gsm_explode.c
+gsm-1.0/src/gsm_implode.c
+gsm-1.0/src/gsm_create.c
+gsm-1.0/src/gsm_print.c
+gsm-1.0/src/gsm_option.c
+gsm-1.0/src/long_term.c
+gsm-1.0/src/lpc.c
+gsm-1.0/src/preprocess.c
+gsm-1.0/src/rpe.c
+gsm-1.0/src/short_term.c
+gsm-1.0/src/table.c
+gsm-1.0/src/toast.c
+gsm-1.0/src/toast_alaw.c
+gsm-1.0/src/toast_audio.c
+gsm-1.0/src/toast_lin.c
+gsm-1.0/src/toast_ulaw.c
+gsm-1.0/tls/bitter.c
+gsm-1.0/tls/bitter.dta
+gsm-1.0/tls/taste.c
+gsm-1.0/tls/taste.h
+gsm-1.0/tls/sweet.c
+gsm-1.0/tls/sour.c
+gsm-1.0/tls/sour1.dta
+gsm-1.0/tls/sour2.dta
+gsm-1.0/tls/ginger.c
+gsm-1.0/tst/cod2lin.c
+gsm-1.0/tst/cod2txt.c
+gsm-1.0/tst/gsm2cod.c
+gsm-1.0/tst/lin2cod.c
+gsm-1.0/tst/lin2txt.c
+gsm-1.0/tst/run
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d5c0c90
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,494 @@
+# Copyright 1992-1996 by Jutta Degener and Carsten Bormann, Technische
+# Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+# details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+# Machine- or installation dependent flags you should configure to port
+
+SASR = -DSASR
+######### Define SASR if >> is a signed arithmetic shift (-1 >> 1 == -1)
+
+# MULHACK = -DUSE_FLOAT_MUL
+######### Define this if your host multiplies floats faster than integers,
+######### e.g. on a SPARCstation.
+
+# FAST = -DFAST
+######### Define together with USE_FLOAT_MUL to enable the GSM library's
+######### approximation option for incorrect, but good-enough results.
+
+# LTP_CUT = -DLTP_CUT
+LTP_CUT =
+######### Define to enable the GSM library's long-term correlation
+######### approximation option---faster, but worse; works for
+######### both integer and floating point multiplications.
+######### This flag is still in the experimental stage.
+
+WAV49 = -DWAV49
+# WAV49 =
+######### Define to enable the GSM library's option to pack GSM frames
+######### in the style used by the WAV #49 format. If you want to write
+######### a tool that produces .WAV files which contain GSM-encoded data,
+######### define this, and read about the GSM_OPT_WAV49 option in the
+######### manual page on gsm_option(3).
+
+# Choose a compiler. The code works both with ANSI and K&R-C.
+# Use -DNeedFunctionPrototypes to compile with, -UNeedFunctionPrototypes to
+# compile without, function prototypes in the header files.
+#
+# You can use the -DSTUPID_COMPILER to circumvent some compilers'
+# static limits regarding the number of subexpressions in a statement.
+
+# CC = cc
+# CCFLAGS = -c -DSTUPID_COMPILER
+
+# CC = /usr/lang/acc
+# CCFLAGS = -c -O
+
+CC = gcc -ansi -pedantic
+CCFLAGS = -c -O2 -DNeedFunctionPrototypes=1 -Wall -Wno-comment
+
+LD = $(CC)
+
+# LD = gcc
+# LDFLAGS =
+
+
+# If your compiler needs additional flags/libraries, regardless of
+# the source compiled, configure them here.
+
+# CCINC = -I/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1/include
+######### Includes needed by $(CC)
+
+# LDINC = -L/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1
+######### Library paths needed by $(LD)
+
+# LDLIB = -lgcc
+######### Additional libraries needed by $(LD)
+
+
+# Where do you want to install libraries, binaries, a header file
+# and the manual pages?
+#
+# Leave INSTALL_ROOT empty (or just don't execute "make install") to
+# not install gsm and toast outside of this directory.
+
+INSTALL_ROOT =
+
+# Where do you want to install the gsm library, header file, and manpages?
+#
+# Leave GSM_INSTALL_ROOT empty to not install the GSM library outside of
+# this directory.
+
+GSM_INSTALL_ROOT = $(INSTALL_ROOT)
+GSM_INSTALL_LIB = $(GSM_INSTALL_ROOT)/lib
+GSM_INSTALL_INC = $(GSM_INSTALL_ROOT)/inc
+GSM_INSTALL_MAN = $(GSM_INSTALL_ROOT)/man/man3
+
+
+# Where do you want to install the toast binaries and their manpage?
+#
+# Leave TOAST_INSTALL_ROOT empty to not install the toast binaries outside
+# of this directory.
+
+TOAST_INSTALL_ROOT = $(INSTALL_ROOT)
+TOAST_INSTALL_BIN = $(TOAST_INSTALL_ROOT)/bin
+TOAST_INSTALL_MAN = $(TOAST_INSTALL_ROOT)/man/man1
+
+# Other tools
+
+SHELL = /bin/sh
+LN = ln
+BASENAME = basename
+AR = ar
+ARFLAGS = cr
+RMFLAGS =
+FIND = find
+COMPRESS = compress
+COMPRESSFLAGS =
+# RANLIB = true
+RANLIB = ranlib
+
+#
+# You shouldn't have to configure below this line if you're porting.
+#
+
+
+# Local Directories
+
+ROOT = .
+ADDTST = $(ROOT)/add-test
+TST = $(ROOT)/tst
+MAN = $(ROOT)/man
+BIN = $(ROOT)/bin
+SRC = $(ROOT)/src
+LIB = $(ROOT)/lib
+TLS = $(ROOT)/tls
+INC = $(ROOT)/inc
+
+# Flags
+
+# DEBUG = -DNDEBUG
+######### Remove -DNDEBUG to enable assertions.
+
+CFLAGS = $(CCFLAGS) $(SASR) $(DEBUG) $(MULHACK) $(FAST) $(LTP_CUT) \
+ $(WAV49) $(CCINC) -I$(INC)
+######### It's $(CC) $(CFLAGS)
+
+LFLAGS = $(LDFLAGS) $(LDINC)
+######### It's $(LD) $(LFLAGS)
+
+
+# Targets
+
+LIBGSM = $(LIB)/libgsm.a
+
+TOAST = $(BIN)/toast
+UNTOAST = $(BIN)/untoast
+TCAT = $(BIN)/tcat
+
+# Headers
+
+GSM_HEADERS = $(INC)/gsm.h
+
+HEADERS = $(INC)/proto.h \
+ $(INC)/unproto.h \
+ $(INC)/config.h \
+ $(INC)/private.h \
+ $(INC)/gsm.h \
+ $(INC)/toast.h \
+ $(TLS)/taste.h
+
+# Sources
+
+GSM_SOURCES = $(SRC)/add.c \
+ $(SRC)/code.c \
+ $(SRC)/debug.c \
+ $(SRC)/decode.c \
+ $(SRC)/long_term.c \
+ $(SRC)/lpc.c \
+ $(SRC)/preprocess.c \
+ $(SRC)/rpe.c \
+ $(SRC)/gsm_destroy.c \
+ $(SRC)/gsm_decode.c \
+ $(SRC)/gsm_encode.c \
+ $(SRC)/gsm_explode.c \
+ $(SRC)/gsm_implode.c \
+ $(SRC)/gsm_create.c \
+ $(SRC)/gsm_print.c \
+ $(SRC)/gsm_option.c \
+ $(SRC)/short_term.c \
+ $(SRC)/table.c
+
+TOAST_SOURCES = $(SRC)/toast.c \
+ $(SRC)/toast_lin.c \
+ $(SRC)/toast_ulaw.c \
+ $(SRC)/toast_alaw.c \
+ $(SRC)/toast_audio.c
+
+SOURCES = $(GSM_SOURCES) \
+ $(TOAST_SOURCES) \
+ $(ADDTST)/add_test.c \
+ $(TLS)/sour.c \
+ $(TLS)/ginger.c \
+ $(TLS)/sour1.dta \
+ $(TLS)/sour2.dta \
+ $(TLS)/bitter.c \
+ $(TLS)/bitter.dta \
+ $(TLS)/taste.c \
+ $(TLS)/sweet.c \
+ $(TST)/cod2lin.c \
+ $(TST)/cod2txt.c \
+ $(TST)/gsm2cod.c \
+ $(TST)/lin2cod.c \
+ $(TST)/lin2txt.c
+
+# Object files
+
+GSM_OBJECTS = $(SRC)/add.o \
+ $(SRC)/code.o \
+ $(SRC)/debug.o \
+ $(SRC)/decode.o \
+ $(SRC)/long_term.o \
+ $(SRC)/lpc.o \
+ $(SRC)/preprocess.o \
+ $(SRC)/rpe.o \
+ $(SRC)/gsm_destroy.o \
+ $(SRC)/gsm_decode.o \
+ $(SRC)/gsm_encode.o \
+ $(SRC)/gsm_explode.o \
+ $(SRC)/gsm_implode.o \
+ $(SRC)/gsm_create.o \
+ $(SRC)/gsm_print.o \
+ $(SRC)/gsm_option.o \
+ $(SRC)/short_term.o \
+ $(SRC)/table.o
+
+TOAST_OBJECTS = $(SRC)/toast.o \
+ $(SRC)/toast_lin.o \
+ $(SRC)/toast_ulaw.o \
+ $(SRC)/toast_alaw.o \
+ $(SRC)/toast_audio.o
+
+OBJECTS = $(GSM_OBJECTS) $(TOAST_OBJECTS)
+
+# Manuals
+
+GSM_MANUALS = $(MAN)/gsm.3 \
+ $(MAN)/gsm_explode.3 \
+ $(MAN)/gsm_option.3 \
+ $(MAN)/gsm_print.3
+
+TOAST_MANUALS = $(MAN)/toast.1
+
+MANUALS = $(GSM_MANUALS) $(TOAST_MANUALS) $(MAN)/bitter.1
+
+# Other stuff in the distribution
+
+STUFF = ChangeLog \
+ INSTALL \
+ MACHINES \
+ MANIFEST \
+ Makefile \
+ README \
+ $(ADDTST)/add_test.dta \
+ $(TLS)/bitter.dta \
+ $(TST)/run
+
+
+# Install targets
+
+GSM_INSTALL_TARGETS = \
+ $(GSM_INSTALL_LIB)/libgsm.a \
+ $(GSM_INSTALL_INC)/gsm.h \
+ $(GSM_INSTALL_MAN)/gsm.3 \
+ $(GSM_INSTALL_MAN)/gsm_explode.3 \
+ $(GSM_INSTALL_MAN)/gsm_option.3 \
+ $(GSM_INSTALL_MAN)/gsm_print.3
+
+TOAST_INSTALL_TARGETS = \
+ $(TOAST_INSTALL_BIN)/toast \
+ $(TOAST_INSTALL_BIN)/tcat \
+ $(TOAST_INSTALL_BIN)/untoast \
+ $(TOAST_INSTALL_MAN)/toast.1
+
+
+# Default rules
+
+.c.o:
+ $(CC) $(CFLAGS) $?
+ @-mv `$(BASENAME) $@` $@ > /dev/null 2>&1
+
+# Target rules
+
+all: $(LIBGSM) $(TOAST) $(TCAT) $(UNTOAST)
+ @-echo $(ROOT): Done.
+
+tst: $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/test-result
+ @-echo tst: Done.
+
+addtst: $(ADDTST)/add $(ADDTST)/add_test.dta
+ $(ADDTST)/add < $(ADDTST)/add_test.dta > /dev/null
+ @-echo addtst: Done.
+
+misc: $(TLS)/sweet $(TLS)/bitter $(TLS)/sour $(TLS)/ginger \
+ $(TST)/lin2txt $(TST)/cod2txt $(TST)/gsm2cod
+ @-echo misc: Done.
+
+install: toastinstall gsminstall
+ @-echo install: Done.
+
+
+# The basic API: libgsm
+
+$(LIBGSM): $(LIB) $(GSM_OBJECTS)
+ -rm $(RMFLAGS) $(LIBGSM)
+ $(AR) $(ARFLAGS) $(LIBGSM) $(GSM_OBJECTS)
+ $(RANLIB) $(LIBGSM)
+
+
+# Toast, Untoast and Tcat -- the compress-like frontends to gsm.
+
+$(TOAST): $(BIN) $(TOAST_OBJECTS) $(LIBGSM)
+ $(LD) $(LFLAGS) -o $(TOAST) $(TOAST_OBJECTS) $(LIBGSM) $(LDLIB)
+
+$(UNTOAST): $(BIN) $(TOAST)
+ -rm $(RMFLAGS) $(UNTOAST)
+ $(LN) $(TOAST) $(UNTOAST)
+
+$(TCAT): $(BIN) $(TOAST)
+ -rm $(RMFLAGS) $(TCAT)
+ $(LN) $(TOAST) $(TCAT)
+
+
+# The local bin and lib directories
+
+$(BIN):
+ if [ ! -d $(BIN) ] ; then mkdir $(BIN) ; fi
+
+$(LIB):
+ if [ ! -d $(LIB) ] ; then mkdir $(LIB) ; fi
+
+
+# Installation
+
+gsminstall:
+ -if [ x"$(GSM_INSTALL_ROOT)" != x ] ; then \
+ make $(GSM_INSTALL_TARGETS) ; \
+ fi
+
+toastinstall:
+ -if [ x"$(TOAST_INSTALL_ROOT)" != x ]; then \
+ make $(TOAST_INSTALL_TARGETS); \
+ fi
+
+gsmuninstall:
+ -if [ x"$(GSM_INSTALL_ROOT)" != x ] ; then \
+ rm $(RMFLAGS) $(GSM_INSTALL_TARGETS) ; \
+ fi
+
+toastuninstall:
+ -if [ x"$(TOAST_INSTALL_ROOT)" != x ] ; then \
+ rm $(RMFLAGS) $(TOAST_INSTALL_TARGETS); \
+ fi
+
+$(TOAST_INSTALL_BIN)/toast: $(TOAST)
+ -rm $@
+ cp $(TOAST) $@
+ chmod 755 $@
+
+$(TOAST_INSTALL_BIN)/untoast: $(TOAST_INSTALL_BIN)/toast
+ -rm $@
+ ln $? $@
+
+$(TOAST_INSTALL_BIN)/tcat: $(TOAST_INSTALL_BIN)/toast
+ -rm $@
+ ln $? $@
+
+$(TOAST_INSTALL_MAN)/toast.1: $(MAN)/toast.1
+ -rm $@
+ cp $? $@
+ chmod 444 $@
+
+$(GSM_INSTALL_MAN)/gsm.3: $(MAN)/gsm.3
+ -rm $@
+ cp $? $@
+ chmod 444 $@
+
+$(GSM_INSTALL_MAN)/gsm_option.3: $(MAN)/gsm_option.3
+ -rm $@
+ cp $? $@
+ chmod 444 $@
+
+$(GSM_INSTALL_MAN)/gsm_explode.3: $(MAN)/gsm_explode.3
+ -rm $@
+ cp $? $@
+ chmod 444 $@
+
+$(GSM_INSTALL_MAN)/gsm_print.3: $(MAN)/gsm_print.3
+ -rm $@
+ cp $? $@
+ chmod 444 $@
+
+$(GSM_INSTALL_INC)/gsm.h: $(INC)/gsm.h
+ -rm $@
+ cp $? $@
+ chmod 444 $@
+
+$(GSM_INSTALL_LIB)/libgsm.a: $(LIBGSM)
+ -rm $@
+ cp $? $@
+ chmod 444 $@
+
+
+# Distribution
+
+dist: gsm-1.0.tar.Z
+ @echo dist: Done.
+
+gsm-1.0.tar.Z: $(STUFF) $(SOURCES) $(HEADERS) $(MANUALS)
+ ( cd $(ROOT)/..; \
+ tar cvf - `cat $(ROOT)/gsm-1.0/MANIFEST \
+ | sed '/^#/d'` \
+ ) | $(COMPRESS) $(COMPRESSFLAGS) > $(ROOT)/gsm-1.0.tar.Z
+
+# Clean
+
+uninstall: toastuninstall gsmuninstall
+ @-echo uninstall: Done.
+
+semi-clean:
+ -rm $(RMFLAGS) */*.o \
+ $(TST)/lin2cod $(TST)/lin2txt \
+ $(TST)/cod2lin $(TST)/cod2txt \
+ $(TST)/gsm2cod \
+ $(TST)/*.*.*
+ -$(FIND) . \( -name core -o -name foo \) \
+ -print | xargs rm $(RMFLAGS)
+
+clean: semi-clean
+ -rm $(RMFLAGS) $(LIBGSM) $(ADDTST)/add \
+ $(TOAST) $(TCAT) $(UNTOAST) \
+ $(ROOT)/gsm-1.0.tar.Z
+
+
+# Two tools that helped me generate gsm_encode.c and gsm_decode.c,
+# but aren't generally needed to port this.
+
+$(TLS)/sweet: $(TLS)/sweet.o $(TLS)/taste.o
+ $(LD) $(LFLAGS) -o $(TLS)/sweet \
+ $(TLS)/sweet.o $(TLS)/taste.o $(LDLIB)
+
+$(TLS)/bitter: $(TLS)/bitter.o $(TLS)/taste.o
+ $(LD) $(LFLAGS) -o $(TLS)/bitter \
+ $(TLS)/bitter.o $(TLS)/taste.o $(LDLIB)
+
+# A version of the same family that Jeff Chilton used to implement
+# the WAV #49 GSM format.
+
+$(TLS)/ginger: $(TLS)/ginger.o $(TLS)/taste.o
+ $(LD) $(LFLAGS) -o $(TLS)/ginger \
+ $(TLS)/ginger.o $(TLS)/taste.o $(LDLIB)
+
+$(TLS)/sour: $(TLS)/sour.o $(TLS)/taste.o
+ $(LD) $(LFLAGS) -o $(TLS)/sour \
+ $(TLS)/sour.o $(TLS)/taste.o $(LDLIB)
+
+# Run $(ADDTST)/add < $(ADDTST)/add_test.dta to make sure the
+# basic arithmetic functions work as intended.
+
+$(ADDTST)/add: $(ADDTST)/add_test.o
+ $(LD) $(LFLAGS) -o $(ADDTST)/add $(ADDTST)/add_test.o $(LDLIB)
+
+
+# Various conversion programs between linear, text, .gsm and the code
+# format used by the tests we ran (.cod). We paid for the test data,
+# so I guess we can't just provide them with this package. Still,
+# if you happen to have them lying around, here's the code.
+#
+# You can use gsm2cod | cod2txt independently to look at what's
+# coded inside the compressed frames, although this shouldn't be
+# hard to roll on your own using the gsm_print() function from
+# the API.
+
+
+$(TST)/test-result: $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/run
+ ( cd $(TST); ./run )
+
+$(TST)/lin2txt: $(TST)/lin2txt.o $(LIBGSM)
+ $(LD) $(LFLAGS) -o $(TST)/lin2txt \
+ $(TST)/lin2txt.o $(LIBGSM) $(LDLIB)
+
+$(TST)/lin2cod: $(TST)/lin2cod.o $(LIBGSM)
+ $(LD) $(LFLAGS) -o $(TST)/lin2cod \
+ $(TST)/lin2cod.o $(LIBGSM) $(LDLIB)
+
+$(TST)/gsm2cod: $(TST)/gsm2cod.o $(LIBGSM)
+ $(LD) $(LFLAGS) -o $(TST)/gsm2cod \
+ $(TST)/gsm2cod.o $(LIBGSM) $(LDLIB)
+
+$(TST)/cod2txt: $(TST)/cod2txt.o $(LIBGSM)
+ $(LD) $(LFLAGS) -o $(TST)/cod2txt \
+ $(TST)/cod2txt.o $(LIBGSM) $(LDLIB)
+
+$(TST)/cod2lin: $(TST)/cod2lin.o $(LIBGSM)
+ $(LD) $(LFLAGS) -o $(TST)/cod2lin \
+ $(TST)/cod2lin.o $(LIBGSM) $(LDLIB)
diff --git a/NOTICE b/NOTICE
index 28fbb3c..cf3af40 100644..120000
--- a/NOTICE
+++ b/NOTICE
@@ -1,35 +1 @@
-Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
-Technische Universitaet Berlin
-
-Any use of this software is permitted provided that this notice is not
-removed and that neither the authors nor the Technische Universitaet Berlin
-are deemed to have made any representations as to the suitability of this
-software for any purpose nor are held responsible for any defects of
-this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
-
-As a matter of courtesy, the authors request to be informed about uses
-this software has found, about bugs in this software, and about any
-improvements that may be of general interest.
-
-Berlin, 28.11.1994
-Jutta Degener
-Carsten Bormann
-
- oOo
-
-Since the original terms of 15 years ago maybe do not make our
-intentions completely clear given today's refined usage of the legal
-terms, we append this additional permission:
-
- Permission to use, copy, modify, and distribute this software
- for any purpose with or without fee is hereby granted,
- provided that this notice is not removed and that neither
- the authors nor the Technische Universitaet Berlin are
- deemed to have made any representations as to the suitability
- of this software for any purpose nor are held responsible
- for any defects of this software. THERE IS ABSOLUTELY NO
- WARRANTY FOR THIS SOFTWARE.
-
-Berkeley/Bremen, 05.04.2009
-Jutta Degener
-Carsten Bormann
+COPYRIGHT \ No newline at end of file
diff --git a/README b/README
index cb6af85..82ec0bd 100644
--- a/README
+++ b/README
@@ -25,8 +25,8 @@ a library API. Compression and decompression run faster than realtime
on most SPARCstations. The implementation has been verified against the
ETSI standard test patterns.
-Jutta Degener (jutta@cs.tu-berlin.de)
-Carsten Bormann (cabo@cs.tu-berlin.de)
+Jutta Degener (then jutta@cs.tu-berlin.de, nowadays jutta@pobox.com)
+Carsten Bormann (then cabo@cs.tu-berlin.de, nowadays cabo@tzi.org)
Communications and Operating Systems Research Group, TU Berlin
Fax: +49.30.31425156, Phone: +49.30.31424315
diff --git a/README.version b/README.version
index 31a869c..5dc90fc 100644
--- a/README.version
+++ b/README.version
@@ -1,2 +1,2 @@
-URL: http://www.quut.com/gsm/gsm-1.0.13.tar.gz
-Version: 1.0.13
+URL: http://www.quut.com/gsm/gsm-1.0.17.tar.gz
+Version: 1.0.17
diff --git a/add-test/add_test.c b/add-test/add_test.c
new file mode 100644
index 0000000..5d128f6
--- /dev/null
+++ b/add-test/add_test.c
@@ -0,0 +1,353 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/add_test.c,v 1.2 1994/05/10 20:18:17 jutta Exp $ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "gsm.h"
+
+#include "../src/add.c"
+
+int interactive = 1;
+
+char * opname;
+longword L_op1, L_op2, L_expect;
+word op1, op2, expect;
+int do_expect;
+
+word M_gsm_add P((word op1, word op2));
+word M_gsm_sub P((word op1, word op2));
+word M_gsm_mult P((word op1, word op2));
+word M_gsm_mult_r P((word op1, word op2));
+word M_gsm_abs P((word op1));
+longword M_gsm_L_mult P((word op1, word op2));
+longword M_gsm_L_add P((longword op1, longword op2));
+
+void help()
+{
+puts( " add a b sub a b mult a b div a b" );
+puts( "L_add A B L_sub A B L_mult A B mult_r a b" );
+puts( "" );
+puts( "abs a norm a >> a b << a b" );
+puts( " L_>> A B L_<< A B" );
+}
+
+char * strtek P2((str, sep), char * str, char * sep) {
+
+ static char * S = (char *)0;
+ char * c, * base;
+
+ if (str) S = str;
+
+ if (!S || !*S) return (char *)0;
+
+ /* Skip delimiters.
+ */
+ while (*S) {
+ for (c = sep; *c && *c != *S; c++) ;
+ if (*c) *S++ = 0;
+ else break;
+ }
+
+ base = S;
+
+ /* Skip non-delimiters.
+ */
+ for (base = S; *S; S++) {
+
+ for (c = sep; *c; c++)
+ if (*c == *S) {
+ *S++ = 0;
+ return base;
+ }
+ }
+
+ return base == S ? (char *)0 : base;
+}
+
+long value P1((s), char * s)
+{
+ switch (*s) {
+ case '-': switch (s[1]) {
+ case '\0': return MIN_WORD;
+ case '-': return MIN_LONGWORD;
+ default: break;
+ }
+ break;
+
+ case '+': switch (s[1]) {
+ case '\0': return MAX_WORD;
+ case '+': return MAX_LONGWORD;
+ default: break;
+ }
+ default: break;
+ }
+
+ return strtol(s, (char **)0, 0);
+}
+
+char * parse P1((buf), char * buf)
+{
+ char * s, * a;
+
+ if ((a = strchr(buf, '=')) != 0) *a++ = 0;
+
+ opname = s = strtek(buf, " \t(");
+ if (!s) return (char *)0;
+
+ op1 = op2 = L_op1 = L_op2 = 0;
+
+ if ((s = strtek( (char *)0, "( \t,")) != 0) {
+ op1 = L_op1 = value(s);
+ if ((s = strtek( (char *)0, ", \t)")) != 0)
+ op2 = L_op2 = value(s);
+ }
+
+ if (a) {
+ do_expect = 1;
+ while (*a == ' ' || *a == '\t') a++;
+ expect = L_expect = value(a);
+ }
+
+ return opname;
+}
+
+void fprint_word P2((f, w), FILE * f, word w)
+{
+ if (!w) putc('0', f);
+ else fprintf(f, "0x%4.4x (%d%s)",
+ (unsigned int)w,
+ (int)w,
+ w == MIN_WORD? "/-" : (w == MAX_WORD ? "/+" : ""));
+}
+
+void print_word P1((w), word w)
+{
+ fprint_word( stdout, w );
+}
+
+void fprint_longword P2((f, w), FILE * f, longword w)
+{
+ if (!w) putc('0', f);
+ else fprintf(f, "0x%8.8lx (%ld%s)",
+ (unsigned long)w, (long)w, w == MIN_WORD ? "/-"
+ : (w == MAX_WORD ? "/+"
+ : (w == MIN_LONGWORD ? "/--"
+ : (w == MAX_LONGWORD ? "/++" : ""))));
+}
+
+void print_longword P1((w),longword w)
+{
+ fprint_longword(stdout, w);
+}
+
+void do_longword P1((w), longword w)
+{
+ if (interactive) print_longword(w);
+ if (do_expect) {
+ if ((w & 0xfffffffful) != (L_expect & 0xfffffffful)) {
+ if (!interactive) fprint_longword(stderr, w);
+ fprintf(stderr, " != %s (%ld, %ld) -- expected ",
+ opname, (long)L_op1, (long)L_op2 );
+ fprint_longword(stderr, L_expect);
+ putc( '\n', stderr );
+ }
+ } else if (interactive) putchar('\n');
+}
+
+void do_word P1((w), word w )
+{
+ if (interactive) print_word(w);
+ if (do_expect) {
+ if (w != expect) {
+ if (!interactive) fprint_word(stderr, w);
+ fprintf(stderr, " != %s (%ld, %ld) -- expected ",
+ opname, (long)L_op1, (long)L_op2 );
+ fprint_word(stderr, expect);
+ putc('\n', stderr);
+ }
+ } else if (interactive) putchar('\n');
+}
+
+int main(ac, av) char ** av;
+{
+ char buf[299];
+ char * c;
+ FILE * in;
+
+ if (ac > 2) {
+ fprintf(stderr, "Usage: %s [filename]\n", av[0]);
+fail:
+#ifdef EXIT_FAILURE
+ exit(EXIT_FAILURE);
+#else
+ exit(1);
+#endif
+ }
+ if (ac < 2) in = stdin;
+ else if (!(in = fopen(av[1], "r"))) {
+ perror(av[1]);
+ fprintf(stderr, "%s: cannot open file \"%s\" for reading\n",
+ av[0], av[1]);
+ goto fail;
+ }
+
+ interactive = isatty(fileno(in));
+
+ for (;;) {
+ if (interactive) fprintf(stderr, "? ");
+
+ if (!fgets(buf, sizeof(buf), in)) exit(0);
+ if ((c = strchr(buf, '\n')) != 0) *c = 0;
+
+ if (*buf == ';' || *buf == '#') continue;
+ if (*buf == '\'') {
+ puts(buf + 1);
+ continue;
+ }
+ if (*buf == '\"') {
+ fprintf(stderr, "%s\n", buf + 1);
+ continue;
+ }
+
+ c = parse(buf);
+
+ if (!c) continue;
+ if (!strcmp(c, "add")) {
+ do_word( gsm_add( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "M_add")) {
+ do_word( M_gsm_add( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "sub")) {
+ do_word( gsm_sub( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "M_sub")) {
+ do_word( M_gsm_sub( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "mult")) {
+ do_word( gsm_mult( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "M_mult")) {
+ do_word( M_gsm_mult( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "mult_r")) {
+ do_word( gsm_mult_r(op1, op2));
+ continue;
+ }
+ if (!strcmp(c, "M_mult_r")) {
+ do_word( M_gsm_mult_r(op1, op2));
+ continue;
+ }
+ if (!strcmp(c, "abs" )) {
+ do_word( gsm_abs(op1) );
+ continue;
+ }
+ if (!strcmp(c, "M_abs" )) {
+ do_word( M_gsm_abs(op1) );
+ continue;
+ }
+ if (!strcmp(c, "div" )) {
+ do_word( gsm_div( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "norm" )) {
+ do_word( gsm_norm(L_op1));
+ continue;
+ }
+ if (!strcmp(c, "<<" )) {
+ do_word( gsm_asl( op1, op2));
+ continue;
+ }
+ if (!strcmp(c, ">>" )) {
+ do_word( gsm_asr( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "L_mult")) {
+ do_longword( gsm_L_mult( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "M_L_mult")) {
+ do_longword( M_gsm_L_mult( op1, op2 ));
+ continue;
+ }
+ if (!strcmp(c, "L_add" )) {
+ do_longword( gsm_L_add( L_op1, L_op2 ));
+ continue;
+ }
+ if (!strcmp(c, "M_L_add" )) {
+ do_longword( M_gsm_L_add( L_op1, L_op2 ));
+ continue;
+ }
+ if (!strcmp(c, "L_sub" )) {
+ do_longword( gsm_L_sub( L_op1, L_op2 ));
+ continue;
+ }
+ if (!strcmp(c, "L_<<" )) {
+ do_longword( gsm_L_asl( L_op1, L_op2 ));
+ continue;
+ }
+ if (!strcmp(c, "L_>>")) {
+ do_longword( gsm_L_asr( L_op1, L_op2 ));
+ continue;
+ }
+ help();
+ }
+}
+
+#include "private.h"
+
+/*
+ * Function stubs for macro implementations of commonly used
+ * math functions
+ */
+word M_gsm_add P2((op1, op2),word op1, word op2)
+{
+ longword ltmp;
+ return GSM_ADD(op1, op2);
+}
+
+word M_gsm_sub P2((op1, op2), word op1, word op2)
+{
+ longword ltmp;
+ return GSM_SUB(op1, op2);
+}
+
+word M_gsm_mult P2((op1, op2), word op1, word op2)
+{
+ return GSM_MULT(op1, op2);
+}
+
+word M_gsm_mult_r P2((op1, op2), word op1, word op2)
+{
+ return GSM_MULT_R(op1, op2);
+}
+
+word M_gsm_abs P1((op1), word op1)
+{
+ return GSM_ABS(op1);
+}
+
+longword M_gsm_L_mult P2((op1, op2), word op1, word op2)
+{
+ return GSM_L_MULT(op1, op2);
+}
+
+longword M_gsm_L_add P2((op1, op2), longword op1, longword op2)
+{
+ ulongword utmp;
+ return GSM_L_ADD(op1, op2);
+}
diff --git a/add-test/add_test.dta b/add-test/add_test.dta
new file mode 100644
index 0000000..fe7402d
--- /dev/null
+++ b/add-test/add_test.dta
@@ -0,0 +1,683 @@
+;
+; Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+; Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+; details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+;
+;
+; Lines starting with ' (in the first col) are echoed.
+; Lines starting with " (in the first col) are echoed to stderr.
+; Lines starting with ; or empty lines are ignored.
+;
+; The part after (including) a trailing '=' is what you expect;
+; there will be output if the result is different.
+;
+; - and + by itself mean MIN_WORD and MAX_WORD, respectively;
+; -- and ++ mean MIN_LONGWORD and MAX_LONGWORD.
+;
+
+'test the basic arithmetic operations used for the rpe-ltd filtering.
+'
+'add ================
+' basic
+
+ add 0 0 = 0
+ add 7 4 = 11
+ add 4 6 = 10
+ add 1 1 = 2
+
+' negative operands
+
+ add -7 4 = -3
+ add 4 -6 = -2
+ add -1 -3 = -4
+ add 7 -4 = 3
+ add -4 6 = 2
+
+' positive overflow
+; (max-word = 32767)
+ add + 1 = +
+ add + + = +
+ add -1 + = 32766
+ add 32766 2 = +
+ add 1 32766 = +
+
+' underflow
+; (min-word = 32768)
+
+ add - -1 = -
+ add - - = -
+ add 1 - = -32767
+ add -32767 -2 = -
+ add -1 -32766 = -32767
+ add -32767 -1 = -
+ add - + = -1
+ add + - = -1
+ add 0 - = -
+ add 0 + = +
+'
+
+'L_add ================
+' basic
+
+ L_add 0 0 = 0
+ L_add 7 4 = 11
+ L_add 4 6 = 10
+ L_add 1 1 = 2
+
+' negative operands
+
+ L_add -7 4 = -3
+ L_add 4 -6 = -2
+ L_add -1 -3 = -4
+ L_add 7 -4 = 3
+ L_add -4 6 = 2
+ L_add 0 -1 = -1
+
+' positive overflow
+; (max-longword = 2147483647)
+ L_add ++ 1 = ++
+ L_add ++ ++ = ++
+ L_add -1 ++ = 2147483646
+ L_add 2147483646 2 = ++
+ L_add 1 2147483645 = 2147483646
+
+' underflow
+; (min-longword = -2147483648)
+
+ L_add -- -1 = --
+ L_add -- -- = --
+ L_add 1 -- = -2147483647
+ L_add -2147483647 -2 = --
+ L_add -1 -2147483646 = -2147483647
+ L_add -2147483647 -1 = --
+ L_add -- ++ = -1
+ L_add ++ -- = -1
+ L_add 0 -- = --
+ L_add 0 ++ = ++
+'
+
+'sub ================
+' basic
+
+ sub 0 0 = 0
+ sub 7 4 = 3
+ sub 4 6 = -2
+ sub 1 0 = 1
+
+' negative operands
+
+ sub -7 4 = -11
+ sub 4 -6 = 10
+ sub -1 -3 = 2
+ sub 7 -4 = 11
+ sub -4 6 = -10
+
+' positive overflow
+; (max-word = 32767)
+ sub 1 - = +
+ sub + + = 0
+ sub + 0 = +
+ sub + -1 = +
+ sub + 1 = 32766
+ sub 1 + = -32766
+ sub 0 + = -32767
+
+' underflow
+; (min-word = 32768)
+
+ sub - -1 = -32767
+ sub - 1 = -
+ sub - - = 0
+ sub - + = -
+ sub + - = +
+ sub 1 - = +
+ sub -1 - = +
+ sub -32767 2 = -
+ sub 0 - = +
+'
+
+'L_sub ================
+' basic
+
+ L_sub 0 0 = 0
+ L_sub 7 4 = 3
+ L_sub 4 6 = -2
+ L_sub 1 0 = 1
+
+' negative operands
+
+ L_sub -7 4 = -11
+ L_sub 4 -6 = 10
+ L_sub -1 -3 = 2
+ L_sub 7 -4 = 11
+ L_sub -4 6 = -10
+
+' positive overflow
+ L_sub 1 -- = ++
+ L_sub ++ ++ = 0
+ L_sub ++ 0 = ++
+ L_sub ++ -1 = ++
+ L_sub ++ 1 = 2147483646
+ L_sub 1 ++ = -2147483646
+ L_sub 0 ++ = -2147483647
+
+' underflow
+
+ L_sub -- -1 = -2147483647
+ L_sub -- 1 = --
+ L_sub -- -- = 0
+ L_sub -- ++ = --
+ L_sub + -- = ++
+ L_sub 1 -- = ++
+ L_sub -1 -- = ++
+ L_sub -2147483647 2 = --
+ L_sub 0 -- = ++
+
+'
+'abs ================
+' basic
+
+ abs 0 = 0
+ abs 2 = 2
+ abs -459 = 459
+
+' overflow
+
+ abs + = +
+ abs - = +
+ abs -32767 = +
+ abs 32766 = 32766
+ abs -32766 = 32766
+
+'
+'mult ================
+; actually, a * b >> 15
+
+' basic
+ mult 0 0 = 0
+ mult 0x100 0x100 = 2
+ mult 4711 0x4000 = 2355
+
+' negative operands
+ mult -1 0 = 0
+
+ mult -0x100 0x100 = -2
+ mult 0x100 -0x100 = -2
+ mult -0x100 -0x100 = 2
+
+ mult -4711 0x4000 = -2356
+ mult 4711 -0x4000 = -2356
+ mult -4711 -0x4000 = 2355
+
+' overflow
+ mult + + = 32766
+ mult + 0x4000 = 0x3fff
+ mult 0x4000 + = 0x3fff
+ mult + 1 = 0
+ mult + 2 = 1
+ mult + 3 = 2
+
+' underflow
+ mult - - = +
+ mult - + = -32767
+ mult + - = -32767
+ mult - 1 = -1
+ mult - 2 = -2
+ mult - 3 = -3
+
+'
+'mult_r ================
+; actually, (a * b + 16384) >> 15
+
+' basic
+ mult_r 0 0 = 0
+ mult_r 0x100 0x100 = 2
+ mult_r 4711 0x4000 = 2356
+
+' negative operands
+ mult_r -1 0 = 0
+
+ mult_r -0x100 0x100 = -2
+ mult_r 0x100 -0x100 = -2
+ mult_r -0x100 -0x100 = 2
+
+ mult_r -4711 0x4000 = -2355
+ mult_r 4711 -0x4000 = -2355
+ mult_r -4711 -0x4000 = 2356
+
+' overflow
+ mult_r + + = 32766
+ mult_r + 32766 = 32765
+ mult_r 32766 + = 32765
+ mult_r + 0x4000 = 0x4000
+ mult_r 0x4000 + = 0x4000
+ mult_r + 0x4001 = 0x4000
+ mult_r 0x4001 + = 0x4000
+ mult_r + 2 = 2
+ mult_r + 1 = 1
+ mult_r 1 + = 1
+ mult_r + 0 = 0
+ mult_r 0 + = 0
+
+' underflow
+ mult_r - - = +
+ mult_r - + = -32767
+ mult_r + - = -32767
+ mult_r - 1 = -1
+ mult_r - 2 = -2
+ mult_r - 3 = -3
+
+'
+'L_mult ================
+; actually, (a * b) << 1
+; assert (a != MIN_WORD && b != MIN_WORD)
+
+' basic
+ L_mult 0 0 = 0
+ L_mult 2 3 = 12
+ L_mult 4711 5 = 47110
+
+' negative operands
+
+ L_mult -2 3 = -12
+ L_mult 2 -3 = -12
+ L_mult -2 -3 = 12
+ L_mult -4711 5 = -47110
+ L_mult 4711 -5 = -47110
+ L_mult -4711 -5 = 47110
+
+' overflow
+ L_mult + + = 2147352578
+ L_mult + -32767 = -2147352578
+ L_mult -32767 + = -2147352578
+ L_mult + 2 = 131068
+ L_mult + 1 = 65534
+ L_mult 1 + = 65534
+ L_mult + 0 = 0
+ L_mult 0 + = 0
+
+'
+'div ================
+; actually, (32767 * a) / b
+; assert (a > 0 && b >= a)
+
+' basic
+ div 1 1 = +
+ div 4711 4711 = +
+ div 5 10 = 0x4000
+ div 5 20 = 0x2000
+ div 5 40 = 0x1000
+
+' overflow
+ div + + = +
+ div 0x4000 + = 0x4000
+ div 1 + = 1
+ div 1 2 = 0x4000
+'
+'norm ================
+
+' positive
+ norm 1 = 30
+ norm 2 = 29
+ norm 3 = 29
+ norm 4 = 28
+ norm 5 = 28
+; etc, etc...
+ norm 0x08000000 = 3
+ norm 0x10000000 = 2
+ norm 0x20000000 = 1
+ norm 0x20000001 = 1
+ norm 0x3fffffff = 1
+ norm 0x40000000 = 0
+ norm 0x40000001 = 0
+ norm 0x4ffffffe = 0
+ norm ++ = 0
+
+' negative
+ norm -1 = 31
+ norm -2 = 30
+ norm -3 = 29
+ norm -4 = 29
+ norm -5 = 28
+; etc, etc...
+ norm 0x4fffffff = 0
+ norm -- = 0
+'
+'>> ================
+
+' basic
+ >> 1 1 = 0
+ >> 4 2 = 1
+ >> 0x1100 5 = 0x88
+
+' negative operand
+
+ >> 1 -1 = 2
+ >> 1 -2 = 4
+ >> 0x88 -5 = 0x1100
+
+' overflow
+ >> -1 4711 = -1
+ >> 1 4711 = 0
+ >> -4711 4711 = -1
+ >> 4711 4711 = 0
+ >> + 1 = 16383
+ >> - 1 = -16384
+'
+'L_>> ================
+
+' basic
+ L_>> 1 1 = 0
+ L_>> 4 2 = 1
+ L_>> 0x1100 5 = 0x88
+
+' negative operand
+
+ L_>> 1 -1 = 2
+ L_>> 1 -2 = 4
+ L_>> 0x88 -5 = 0x1100
+
+' overflow
+ L_>> -1 4711 = -1
+ L_>> 1 4711 = 0
+ L_>> -4711 4711 = -1
+ L_>> 4711 4711 = 0
+ L_>> ++ 1 = 1073741823
+ L_>> -- 1 = -1073741824
+
+'
+'<< ================
+
+' basic
+ << 1 1 = 2
+ << 4 2 = 16
+ << 0x0088 5 = 0x1100
+
+' negative operand
+
+ << 1 -1 = 0
+ << 4 -2 = 1
+ << 0x1100 -5 = 0x0088
+
+' overflow
+ << -1 4711 = 0
+ << 1 4711 = 0
+ << -4711 4711 = 0
+ << 4711 4711 = 0
+ << 4711 -4711 = 0
+ << -4711 -4711 = -1
+ << + 1 = 0xfffe
+ << -1 1 = 0xfffe
+ << - 1 = 0
+'
+'L_<< ================
+
+' basic
+ L_<< 1 1 = 2
+ L_<< 4 2 = 16
+ L_<< 0x0088 5 = 0x1100
+
+' negative operand
+
+ L_<< 1 -1 = 0
+ L_<< 4 -2 = 1
+ L_<< 0x1100 -5 = 0x0088
+
+' overflow
+ L_<< -1 4711 = 0
+ L_<< 1 4711 = 0
+ L_<< -4711 4711 = 0
+ L_<< 4711 4711 = 0
+ L_<< 4711 -4711 = 0
+ L_<< -4711 -4711 = -1
+ L_<< ++ 1 = -2
+ L_<< -1 1 = -2
+ L_<< -- 1 = 0
+
+'macros
+'
+'add ================
+' basic
+
+ M_add 0 0 = 0
+ M_add 7 4 = 11
+ M_add 4 6 = 10
+ M_add 1 1 = 2
+
+' negative operands
+
+ M_add -7 4 = -3
+ M_add 4 -6 = -2
+ M_add -1 -3 = -4
+ M_add 7 -4 = 3
+ M_add -4 6 = 2
+
+' positive overflow
+; (max-word = 32767)
+ M_add + 1 = +
+ M_add + + = +
+ M_add -1 + = 32766
+ M_add 32766 2 = +
+ M_add 1 32766 = +
+
+' underflow
+; (min-word = 32768)
+
+ M_add - -1 = -
+ M_add - - = -
+ M_add 1 - = -32767
+ M_add -32767 -2 = -
+ M_add -1 -32766 = -32767
+ M_add -32767 -1 = -
+ M_add - + = -1
+ M_add + - = -1
+ M_add 0 - = -
+ M_add 0 + = +
+'
+
+'L_add ================
+' basic
+
+ M_L_add 0 0 = 0
+ M_L_add 7 4 = 11
+ M_L_add 4 6 = 10
+ M_L_add 1 1 = 2
+
+' negative operands
+
+ M_L_add -7 4 = -3
+ M_L_add 4 -6 = -2
+ M_L_add -1 -3 = -4
+ M_L_add 7 -4 = 3
+ M_L_add -4 6 = 2
+ M_L_add 0 -1 = -1
+
+' positive overflow
+; (max-longword = 2147483647)
+ M_L_add ++ 1 = ++
+ M_L_add ++ ++ = ++
+ M_L_add -1 ++ = 2147483646
+ M_L_add 2147483646 2 = ++
+ M_L_add 1 2147483645 = 2147483646
+
+' underflow
+; (min-longword = -2147483648)
+
+ M_L_add -- -1 = --
+ M_L_add -- -- = --
+ M_L_add 1 -- = -2147483647
+ M_L_add -2147483647 -2 = --
+ M_L_add -1 -2147483646 = -2147483647
+ M_L_add -2147483647 -1 = --
+ M_L_add -- ++ = -1
+ M_L_add ++ -- = -1
+ M_L_add 0 -- = --
+ M_L_add 0 ++ = ++
+'
+
+'sub ================
+' basic
+
+ M_sub 0 0 = 0
+ M_sub 7 4 = 3
+ M_sub 4 6 = -2
+ M_sub 1 0 = 1
+
+' negative operands
+
+ M_sub -7 4 = -11
+ M_sub 4 -6 = 10
+ M_sub -1 -3 = 2
+ M_sub 7 -4 = 11
+ M_sub -4 6 = -10
+
+' positive overflow
+; (max-word = 32767)
+ M_sub 1 - = +
+ M_sub + + = 0
+ M_sub + 0 = +
+ M_sub + -1 = +
+ M_sub + 1 = 32766
+ M_sub 1 + = -32766
+ M_sub 0 + = -32767
+
+' underflow
+; (min-word = 32768)
+
+ M_sub - -1 = -32767
+ M_sub - 1 = -
+ M_sub - - = 0
+ M_sub - + = -
+ M_sub + - = +
+ M_sub 1 - = +
+ M_sub -1 - = +
+ M_sub -32767 2 = -
+ M_sub 0 - = +
+'
+'
+'abs ================
+' basic
+
+ M_abs 0 = 0
+ M_abs 2 = 2
+ M_abs -459 = 459
+
+' overflow
+
+ M_abs + = +
+ M_abs - = +
+ M_abs -32767 = +
+ M_abs 32766 = 32766
+ M_abs -32766 = 32766
+
+'
+'mult ================
+; actually, a * b >> 15
+
+' basic
+ M_mult 0 0 = 0
+ M_mult 0x100 0x100 = 2
+ M_mult 4711 0x4000 = 2355
+
+' negative operands
+ M_mult -1 0 = 0
+
+ M_mult -0x100 0x100 = -2
+ M_mult 0x100 -0x100 = -2
+ M_mult -0x100 -0x100 = 2
+
+ M_mult -4711 0x4000 = -2356
+ M_mult 4711 -0x4000 = -2356
+ M_mult -4711 -0x4000 = 2355
+
+' overflow
+ M_mult + + = 32766
+ M_mult + 0x4000 = 0x3fff
+ M_mult 0x4000 + = 0x3fff
+ M_mult + 1 = 0
+ M_mult + 2 = 1
+ M_mult + 3 = 2
+
+' underflow
+; M_mult - - = + assert !(a == b && b == MIN_WORD)
+ M_mult - -32767 = +
+ M_mult -32767 - = +
+ M_mult - + = -32767
+ M_mult + - = -32767
+ M_mult - 1 = -1
+ M_mult - 2 = -2
+ M_mult - 3 = -3
+
+'
+'mult_r ================
+; actually, (a * b + 16384) >> 15
+
+' basic
+ M_mult_r 0 0 = 0
+ M_mult_r 0x100 0x100 = 2
+ M_mult_r 4711 0x4000 = 2356
+
+' negative operands
+ M_mult_r -1 0 = 0
+
+ M_mult_r -0x100 0x100 = -2
+ M_mult_r 0x100 -0x100 = -2
+ M_mult_r -0x100 -0x100 = 2
+
+ M_mult_r -4711 0x4000 = -2355
+ M_mult_r 4711 -0x4000 = -2355
+ M_mult_r -4711 -0x4000 = 2356
+
+' overflow
+ M_mult_r + + = 32766
+ M_mult_r + 32766 = 32765
+ M_mult_r 32766 + = 32765
+ M_mult_r + 0x4000 = 0x4000
+ M_mult_r 0x4000 + = 0x4000
+ M_mult_r + 0x4001 = 0x4000
+ M_mult_r 0x4001 + = 0x4000
+ M_mult_r + 2 = 2
+ M_mult_r + 1 = 1
+ M_mult_r 1 + = 1
+ M_mult_r + 0 = 0
+ M_mult_r 0 + = 0
+
+' underflow
+; M_mult_r - - = + assert !(a == b && b == MIN_WORD)
+ M_mult_r - -32767 = +
+ M_mult_r -32767 - = +
+ M_mult_r - + = -32767
+ M_mult_r + - = -32767
+ M_mult_r - 1 = -1
+ M_mult_r - 2 = -2
+ M_mult_r - 3 = -3
+
+'
+'L_mult ================
+; actually, (a * b) << 1
+; assert (a != MIN_WORD && b != MIN_WORD)
+
+' basic
+ M_L_mult 0 0 = 0
+ M_L_mult 2 3 = 12
+ M_L_mult 4711 5 = 47110
+
+' negative operands
+
+ M_L_mult -2 3 = -12
+ M_L_mult 2 -3 = -12
+ M_L_mult -2 -3 = 12
+ M_L_mult -4711 5 = -47110
+ M_L_mult 4711 -5 = -47110
+ M_L_mult -4711 -5 = 47110
+
+' overflow
+ M_L_mult + + = 2147352578
+ M_L_mult + -32767 = -2147352578
+ M_L_mult -32767 + = -2147352578
+ M_L_mult + 2 = 131068
+ M_L_mult + 1 = 65534
+ M_L_mult 1 + = 65534
+ M_L_mult + 0 = 0
+ M_L_mult 0 + = 0
+
diff --git a/inc/config.h b/inc/config.h
index db2fce9..6f7f667 100644
--- a/inc/config.h
+++ b/inc/config.h
@@ -9,6 +9,9 @@
#ifndef CONFIG_H
#define CONFIG_H
+//efine SIGHANDLER_T int /* signal handlers are void */
+//efine HAS_SYSV_SIGNAL 1 /* sigs not blocked/reset? */
+
#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */
#define HAS_LIMITS_H 1 /* /usr/include/limits.h */
#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */
@@ -19,12 +22,16 @@
#define HAS_CHMOD 1 /* chmod syscall */
#define HAS_FCHOWN 1 /* fchown syscall */
#define HAS_CHOWN 1 /* chown syscall */
+//efine HAS__FSETMODE 1 /* _fsetmode -- set file mode */
#define HAS_STRING_H 1 /* /usr/include/string.h */
+#define HAS_STRINGS_H 1 /* /usr/include/strings.h */
#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */
#define HAS_UTIME 1 /* POSIX utime(path, times) */
+//efine HAS_UTIMES 1 /* use utimes() syscall instead */
#define HAS_UTIME_H 1 /* UTIME header file */
#define HAS_UTIMBUF 1 /* struct utimbuf */
+//efine HAS_UTIMEUSEC 1 /* microseconds in utimbuf? */
#endif /* CONFIG_H */
diff --git a/inc/gsm.h b/inc/gsm.h
index 4714ab6..dca1660 100644
--- a/inc/gsm.h
+++ b/inc/gsm.h
@@ -43,7 +43,7 @@ typedef gsm_byte gsm_frame[33]; /* 33 * 8 bits */
#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */
-#define GSM_PATCHLEVEL 10
+#define GSM_PATCHLEVEL 16
#define GSM_MINOR 0
#define GSM_MAJOR 1
diff --git a/inc/toast.h b/inc/toast.h
new file mode 100644
index 0000000..b42d9ae
--- /dev/null
+++ b/inc/toast.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/toast.h,v 1.4 1995/03/07 21:26:16 jutta Exp $ */
+
+#ifndef TOAST_H
+#define TOAST_H /* Guard against multiple includes */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdio.h>
+#include <ctype.h>
+#include <signal.h>
+
+#include <errno.h>
+#ifndef HAS_ERRNO_DECL
+ extern int errno;
+#endif
+
+#ifdef HAS_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifdef HAS_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef HAS_UTIME
+# ifdef HAS_UTIME_H
+# include <utime.h>
+# endif
+#endif
+
+#include "gsm.h"
+
+#ifndef S_ISREG
+#define S_ISREG(x) ((x) & S_IFREG)
+#endif /* S_ISREG */
+
+
+# define READ "rb"
+# define WRITE "wb"
+#ifdef O_BINARY
+# define O_WRITE_EXCL O_WRONLY|O_CREAT|O_EXCL|O_BINARY
+#else
+# define O_WRITE_EXCL O_WRONLY|O_CREAT|O_EXCL
+#endif
+
+#ifndef SIGHANDLER_T
+#define SIGHANDLER_T void /* what does a signal handler return? */
+#endif
+
+
+#ifdef HAS_STRING_H
+#include <string.h>
+#else
+# ifdef HAS_STRINGS_H
+# include <strings.h>
+# else
+# include "proto.h"
+
+ extern int strlen P((char *));
+ extern char * strcpy P((char *, char *));
+ extern char * strcat P((char *, char *));
+ extern char * strrchr P((char *, int));
+
+# include "unproto.h"
+# endif
+#endif
+
+
+#ifdef HAS_STDLIB_H
+#include <stdlib.h>
+#else
+# include "proto.h"
+# ifdef HAS_MALLOC_H
+# include <malloc.h>
+# else
+ extern char * malloc P((unsigned));
+# endif
+ extern int exit P((int));
+# include "unproto.h"
+#endif
+
+
+#ifdef HAS_UNISTD_H
+# include <unistd.h>
+#endif
+
+/*
+ * This suffix is tacked onto/removed from filenames
+ * similar to the way freeze and compress do it.
+ */
+#define SUFFIX_TOASTED ".gsm"
+
+#include "proto.h"
+
+extern int audio_init_input P((void)), audio_init_output P((void));
+extern int ulaw_input P((gsm_signal*)), ulaw_output P((gsm_signal *));
+extern int alaw_input P((gsm_signal*)), alaw_output P((gsm_signal *));
+extern int linear_input P((gsm_signal*)), linear_output P((gsm_signal *));
+
+#endif /* TOAST_H */
diff --git a/man/bitter.1 b/man/bitter.1
new file mode 100644
index 0000000..72baba1
--- /dev/null
+++ b/man/bitter.1
@@ -0,0 +1,70 @@
+.\"
+.\" Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+.\" Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+.\" details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+.\"
+.PU
+.TH BITTER 1
+.SH NAME
+bitter, sweet \(em code-generators for packing bits
+.SH SYNOPSIS
+bitter < input > output
+.br
+sweet < input > output
+.SH "DESCRIPTION"
+Bitter and sweet are two filters which turn a description of the
+form
+.nf
+ name number-of-bits
+ name number-of-bits
+ ...
+.nf
+into code.
+.PP
+Bitter generates code that packs the specified bits from their
+variables into an array of unsigned char referenced by an
+advancing pointer c.
+.PP
+Sweet generates code that unpacks the specified bits from an array
+of unsigned char referenced by a mutable pointer c into the
+named variables.
+.\" .SH OPTIONS
+.\" .SH "RETURN VALUE"
+.\" .SH ERRORS
+.SH EXAMPLES
+.nf
+% cat in
+amaretto 1
+banana 2
+cherry 3
+strawberry 4
+vanilla 15
+walnut 15
+
+% bitter < in
+ *c++ = ((amaretto & 0x1) << 7)
+ | ((banana & 0x3) << 5)
+ | ((cherry & 0x7) << 2)
+ | ((strawberry >> 2) & 0x3);
+ *c++ = ((strawberry & 0x3) << 6)
+ | ((vanilla >> 9) & 0x3F);
+ *c++ = ((vanilla >> 1) & 0xFF);
+ *c++ = ((vanilla & 0x1) << 7)
+ | ((walnut >> 8) & 0x7F);
+ *c++ = walnut & 0xFF;
+
+% sweet < in
+ amaretto = (*c >> 7) & 0x1;
+ banana = (*c >> 5) & 0x3;
+ cherry = (*c >> 2) & 0x7;
+ strawberry = (*c++ & 0x3) << 2;
+ strawberry |= (*c >> 6) & 0x3;
+ vanilla = (*c++ & 0x3F) << 9;
+ vanilla |= (*c++ & 0xFF) << 1;
+ vanilla |= (*c >> 7) & 0x1;
+ walnut = (*c++ & 0x7F) << 8;
+ walnut |= *c++;
+.SH NOTES
+This is a quick hack for the gsm_encode() and gsm_decode() routines.
+.SH BUGS
+Please direct bug reports to jutta@pobox.com and cabo@tzi.org.
diff --git a/man/gsm.3 b/man/gsm.3
index e465762..6f24861 100644
--- a/man/gsm.3
+++ b/man/gsm.3
@@ -100,6 +100,6 @@ record() { /* read from soundfd, write compressed to standard output */
}
.nf
.SH BUGS
-Please direct bug reports to jutta@cs.tu-berlin.de and cabo@cs.tu-berlin.de.
+Please direct bug reports to jutta@pobox.com and cabo@tzi.org.
.SH "SEE ALSO"
toast(1), gsm_print(3), gsm_explode(3), gsm_option(3)
diff --git a/man/gsm_explode.3 b/man/gsm_explode.3
index ef89984..d6c1e45 100644
--- a/man/gsm_explode.3
+++ b/man/gsm_explode.3
@@ -42,6 +42,6 @@ used by the test data.
.SH "RETURN VALUE"
gsm_explode() returns -1 if the passed frame is invalid, else 0.
.SH BUGS
-Please direct bug reports to jutta@cs.tu-berlin.de and cabo@cs.tu-berlin.de.
+Please direct bug reports to jutta@pobox.com and cabo@tzi.org.
.SH "SEE ALSO"
gsm(3)
diff --git a/man/gsm_option.3 b/man/gsm_option.3
index 8df7da0..d50f81f 100644
--- a/man/gsm_option.3
+++ b/man/gsm_option.3
@@ -178,6 +178,6 @@ internal GSM state).
gsm_option() returns -1 if an option is not supported, the
previous value of the option otherwise.
.SH BUGS
-Please direct bug reports to jutta@cs.tu-berlin.de and cabo@cs.tu-berlin.de.
+Please direct bug reports to jutta@pobox.com and cabo@tzi.org.
.SH "SEE ALSO"
toast(1), gsm(3), gsm_explode(3), gsm_print(3)
diff --git a/man/gsm_print.3 b/man/gsm_print.3
index 48d6883..4769641 100644
--- a/man/gsm_print.3
+++ b/man/gsm_print.3
@@ -47,6 +47,6 @@ LARc: 29 32 20 11 08 05 06 07
07 03 06 00 03 03 06 05 00 03 02 07 04
.nf
.SH BUGS
-Please direct bug reports to jutta@cs.tu-berlin.de and cabo@cs.tu-berlin.de.
+Please direct bug reports to jutta@pobox.com and cabo@tzi.org.
.SH "SEE ALSO"
gsm(3), gsm_explode(3)
diff --git a/man/toast.1 b/man/toast.1
new file mode 100644
index 0000000..4a2a0f2
--- /dev/null
+++ b/man/toast.1
@@ -0,0 +1,156 @@
+.\"
+.\" Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+.\" Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+.\" details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+.\"
+.if n .ds mU u
+.if t .ds mU \(*m
+.\"
+.TH TOAST 1 local
+.SH NAME
+toast \(em GSM\ 06.10 lossy sound compression
+.SH SYNOPSIS
+.ll +8
+.B toast
+[
+.B \-cdfpvhualsFC
+] [
+.I "filename...\&"
+]
+.LP
+.B untoast
+[
+.B \-cfpvhuaslF
+] [
+.I "filename...\&"
+]
+.LP
+.B tcat
+[
+.B \-vhuaslF
+] [
+.I "filename...\&"
+]
+.ll -8
+.SH DESCRIPTION
+Toast compresses the sound files given on its command line.
+Each file is replaced by a file with the extension
+.I \&.gsm .
+If no files are specified, the compression is applied to the
+standard input, and its result is written to standard output.
+.PP
+Toasted files can be restored to something not quite unlike
+their original form by running toast
+.I "\-d"
+, or
+.I untoast
+, on the \&.gsm-files or standard input.
+.PP
+The program
+.I tcat
+(the same as running
+.I "untoast \-c"
+) uncompresses its input on standard output,
+but leaves the compressed .gsm\-files alone.
+.PP
+When files are compressed or uncompressed into other files,
+the ownership (if run by root), modes, accessed and modified times
+are maintained between both versions.
+.SH OPTIONS
+.TP
+.B \-c
+(cat)
+Write to the standard output; no files are changed.
+.TP
+.B \-d
+(decode)
+Decode, rather than encode, the files.
+.TP
+.B \-f
+(force)
+Force replacement of output files if they exist.
+If \-f is omitted and toast (or untoast) is run interactively from
+a terminal, the user is prompted as to whether the file should be replaced.
+.TP
+.B \-p
+(precious)
+Do not delete the source files.
+Source files are implicitly left alone whenever \-c is
+specified or tcat is run.
+.TP
+.B \-C
+(LTP cut-off)
+Ignore most sample values when calculating the GSM long-term
+correlation lag during encoding.
+(The multiplications that do this are a bottleneck
+of the algorithm.)
+The resulting encoding process will not produce
+exactly the same results as GSM 06.10 would,
+but remains close enough to be compatible.
+.br
+The
+.B \-C
+option applies only to the encoder and is silently
+ignored by the decoder.
+.TP
+.B \-F
+(fast)
+On systems with a floating point processor, but without
+a multiplication instruction, \-F sacrifices standard conformance to
+performance and nearly doubles the speed of the algorithm.
+.br
+The resulting encoding and decoding process will not produce
+exactly the same results as GSM 06.10 would, but remains close
+enough to be compatible.
+.br
+The default is standard-conforming operation.
+.TP
+.B \-v
+(version)\
+outputs the version of toast (or untoast or tcat) to stdout and exits.
+.TP
+.B \-h
+(help)\
+prints a short overview of the options.
+.PP
+Toast, untoast and tcat try to guess the appropriate audio data
+format from the file suffix.
+Command line options can also specify a format to be used for
+all files.
+.br
+The following formats are supported:
+.TP
+.B "\-u"
+(\(*mU-law)
+8 kHz, 8 bit \(*mU-law encoding (file suffix .u)
+.TP
+.B "\-a"
+(A-law)
+8 kHz, 8 bit A-law encoding (file suffix .A)
+.TP
+.B "\-s"
+(Sun audio)
+8 kHz, 8 bit \(*mU-law encoding with audio header (file suffix .au)
+.TP
+.B "-l"
+(linear)
+8 kHz, 16 bit signed linear encoding in host byte order
+with 13 significant bits (file suffix .l)
+.PP
+In absence of options or suffixes to specify a format,
+\(*mU-law encoding as forced by \-u is assumed.
+.PP
+.SH PECULIARITIES
+A four bit magic number is prefixed to each 32 1/2-byte GSM frame,
+mainly because 32 1/2-bytes are rather clumsy to handle.
+.SH WARNING
+The compression algorithm used is a lossy compression algorithm
+devised especially for speech; on no account should it be used
+for text, pictures or any other non-speech-data you consider
+valuable.
+.SH BUGS
+Please direct bug reports to jutta@pobox.com and cabo@tzi.org.
+.SH "SEE ALSO"
+gsm(3)
+.\"
+.\" Toast is dedicated to Bill Sienkiewicz, author of "Stray Toasters".
diff --git a/src/debug.c b/src/debug.c
index 04c3907..6e42842 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -49,7 +49,7 @@ void gsm_debug_longwords P4( (name, from, to, ptr),
fprintf( stderr, "%s [%d .. %d]: ", name, from, to );
while (from <= to) {
- fprintf(stderr, "%d ", ptr[ from ] );
+ fprintf(stderr, "%ld ", (long)ptr[ from ] );
from++;
if (nprinted++ >= 7) {
nprinted = 0;
@@ -63,14 +63,14 @@ void gsm_debug_longword P2( (name, value),
char * name,
longword value )
{
- fprintf(stderr, "%s: %d\n", name, (long)value );
+ fprintf(stderr, "%s: %ld\n", name, (long)value );
}
void gsm_debug_word P2( (name, value),
char * name,
word value )
{
- fprintf(stderr, "%s: %d\n", name, (long)value);
+ fprintf(stderr, "%s: %ld\n", name, (long)value);
}
#endif
diff --git a/src/short_term.c b/src/short_term.c
index f7829ba..b93ed00 100644
--- a/src/short_term.c
+++ b/src/short_term.c
@@ -51,21 +51,21 @@ static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),
*/
#undef STEP
-#define STEP( B, MIC, INVA ) \
+#define STEP( B_TIMES_TWO, MIC, INVA ) \
temp1 = GSM_ADD( *LARc++, MIC ) << 10; \
- temp1 = GSM_SUB( temp1, B << 1 ); \
+ temp1 = GSM_SUB( temp1, B_TIMES_TWO ); \
temp1 = GSM_MULT_R( INVA, temp1 ); \
*LARpp++ = GSM_ADD( temp1, temp1 );
STEP( 0, -32, 13107 );
STEP( 0, -32, 13107 );
- STEP( 2048, -16, 13107 );
- STEP( -2560, -16, 13107 );
+ STEP( 4096, -16, 13107 );
+ STEP( -5120, -16, 13107 );
- STEP( 94, -8, 19223 );
- STEP( -1792, -8, 17476 );
- STEP( -341, -4, 31454 );
- STEP( -1144, -4, 29708 );
+ STEP( 188, -8, 19223 );
+ STEP( -3584, -8, 17476 );
+ STEP( -682, -4, 31454 );
+ STEP( -2288, -4, 29708 );
/* NOTE: the addition of *MIC is used to restore
* the sign of *LARc.
diff --git a/src/toast.c b/src/toast.c
new file mode 100644
index 0000000..c29baa7
--- /dev/null
+++ b/src/toast.c
@@ -0,0 +1,797 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/toast.c,v 1.8 1996/07/02 10:41:04 jutta Exp $ */
+
+#include "toast.h"
+
+/* toast -- lossy sound compression using the gsm library.
+ */
+
+char * progname;
+
+int f_decode = 0; /* decode rather than encode (-d) */
+int f_cat = 0; /* write to stdout; implies -p (-c) */
+int f_force = 0; /* don't ask about replacements (-f) */
+int f_precious = 0; /* avoid deletion of original (-p) */
+int f_fast = 0; /* use faster fpt algorithm (-F) */
+int f_verbose = 0; /* debugging (-V) */
+int f_ltp_cut = 0; /* LTP cut-off margin (-C) */
+
+struct stat instat; /* stat (inname) */
+
+FILE *in, *out;
+char *inname, *outname;
+
+/*
+ * The function (*output)() writes a frame of 160 samples given as
+ * 160 signed 16 bit values (gsm_signals) to <out>.
+ * The function (*input)() reads one such frame from <in>.
+ * The function (*init_output)() begins output (e.g. writes a header).,
+ * The function (*init_input)() begins input (e.g. skips a header).
+ *
+ * There are different versions of input, output, init_input and init_output
+ * for different formats understood by toast; which ones are used
+ * depends on the command line arguments and, in their absence, the
+ * filename; the fallback is #defined in toast.h
+ *
+ * The specific implementations of input, output, init_input and init_output
+ * for a format `foo' live in toast_foo.c.
+ */
+
+int (*output ) P((gsm_signal *)),
+ (*input ) P((gsm_signal *));
+int (*init_input) P((void)),
+ (*init_output) P((void));
+
+static int generic_init P0() { return 0; } /* NOP */
+
+struct fmtdesc {
+
+ char * name, * longname, * suffix;
+
+ int (* init_input ) P((void)),
+ (* init_output) P((void));
+
+ int (* input ) P((gsm_signal * )),
+ (* output) P((gsm_signal * ));
+
+} f_audio = {
+ "audio",
+ "8 kHz, 8 bit u-law encoding with Sun audio header", ".au",
+ audio_init_input,
+ audio_init_output,
+ ulaw_input,
+ ulaw_output
+}, f_ulaw = {
+ "u-law", "plain 8 kHz, 8 bit u-law encoding", ".u",
+ generic_init,
+ generic_init,
+ ulaw_input,
+ ulaw_output
+
+}, f_alaw = {
+ "A-law", "8 kHz, 8 bit A-law encoding", ".A",
+ generic_init,
+ generic_init,
+ alaw_input,
+ alaw_output
+
+}, f_linear = {
+ "linear",
+ "16 bit (13 significant) signed 8 kHz signal", ".l",
+ generic_init,
+ generic_init,
+ linear_input,
+ linear_output
+};
+
+struct fmtdesc * alldescs[] = {
+ &f_audio,
+ &f_alaw,
+ &f_ulaw,
+ &f_linear,
+ (struct fmtdesc *)NULL
+};
+
+#define DEFAULT_FORMAT f_ulaw /* default audio format, others */
+ /* are: f_alaw,f_audio,f_linear */
+struct fmtdesc * f_format = 0;
+
+/*
+ * basename + suffix of a pathname
+ */
+static char * endname P1((name), char * name)
+{
+ if (name) {
+ char * s = strrchr(name, '/');
+ if (s && s[1]) name = s + 1;
+ }
+ return name;
+
+}
+
+/*
+ * Try to figure out what we're supposed to do from the argv[0], if
+ * any, and set the parameters accordingly.
+ */
+static void parse_argv0 P1((av0), char * av0 )
+{
+ int l;
+
+ progname = av0 = endname(av0 ? av0 : "toast");
+
+ /* If the name starts with `un', we want to decode, not code.
+ * If the name ends in `cat', we want to write to stdout,
+ * and decode as well.
+ */
+
+ if (!strncmp(av0, "un", 2)) f_decode = 1;
+ if ( (l = strlen(av0)) >= 3 /* strlen("cat") */
+ && !strcmp( av0 + l - 3, "cat" )) f_cat = f_decode = 1;
+}
+
+
+/*
+ * Check whether the name (possibly generated by appending
+ * .gsm to something else) is short enough for this system.
+ */
+static int length_okay P1((name), char * name)
+{
+ long max_filename_length = 0;
+ char * end;
+
+ /* If our _pathname_ is too long, we'll usually not be
+ * able to open the file at all -- don't worry about that.
+ *
+ * But if the _filename_ is too long, there is danger of
+ * silent truncation on some systems, which results
+ * in the target replacing the source!
+ */
+
+ if (!name) return 0;
+ end = endname(name);
+
+#ifdef NAME_MAX
+ max_filename_length = NAME_MAX;
+#else
+#ifdef _PC_NAME_MAX
+#ifdef USE_PATHCONF
+ { char * s, tmp;
+
+ /* s = dirname(name)
+ */
+ if ((s = end) > name) {
+ if (s > name + 1) s--;
+ tmp = s;
+ *s = 0;
+ }
+
+ errno = 0;
+ max_filename_length = pathconf(s > name ? name : ".",
+ _PC_NAME_MAX);
+ if (max_filename_length == -1 && errno) {
+ perror( s > name ? name : "." );
+ fprintf(stderr,
+ "%s: cannot get dynamic filename length limit for %s.\n",
+ progname, s > name ? name : ".");
+ return 0;
+ }
+ if (s > name) *s = tmp;
+ }
+#endif /* USE_PATHCONF */
+#endif /* _PC_NAME_MAX */
+#endif /* !NAME_MAX */
+
+ if (max_filename_length > 0 && strlen(end) > max_filename_length) {
+ fprintf(stderr,
+ "%s: filename \"%s\" is too long (maximum is %ld)\n",
+ progname, endname(name), max_filename_length );
+ return 0;
+ }
+
+ return 1;
+}
+
+/*
+ * Return a pointer the suffix of a string, if any.
+ * A suffix alone has no suffix, an empty suffix can not be had.
+ */
+static char * suffix P2((name, suf), char *name, char * suf)
+{
+ size_t nlen = strlen(name);
+ size_t slen = strlen(suf);
+
+ if (!slen || nlen <= slen) return (char *)0;
+ name += nlen - slen;
+ return memcmp(name, suf, slen) ? (char *)0 : name;
+}
+
+
+static void catch_signals P1((fun), SIGHANDLER_T (*fun) ())
+{
+#ifdef SIGHUP
+ signal( SIGHUP, fun );
+#endif
+#ifdef SIGINT
+ signal( SIGINT, fun );
+#endif
+#ifdef SIGPIPE
+ signal( SIGPIPE, fun );
+#endif
+#ifdef SIGTERM
+ signal( SIGTERM, fun );
+#endif
+#ifdef SIGXFSZ
+ signal( SIGXFSZ, fun );
+#endif
+}
+
+static SIGHANDLER_T onintr P0()
+{
+ char * tmp = outname;
+
+#ifdef HAS_SYSV_SIGNALS
+ catch_signals( SIG_IGN );
+#endif
+
+ outname = (char *)0;
+ if (tmp) (void)unlink(tmp);
+
+ exit(1);
+}
+
+/*
+ * Allocate some memory and complain if it fails.
+ */
+static char * emalloc P1((len), size_t len)
+{
+ char * s;
+ if (!(s = malloc(len))) {
+ fprintf(stderr, "%s: failed to malloc %d bytes -- abort\n",
+ progname, (int)len);
+ onintr();
+ exit(1);
+ }
+ return s;
+}
+
+static char* normalname P3((name, want, cut), char *name, char *want,char *cut)
+{
+ size_t maxlen;
+ char * s, * p;
+
+ p = (char *)0;
+ if (!name) return p;
+
+ maxlen = strlen(name) + 1 + strlen(want) + strlen(cut);
+ p = strcpy(emalloc(maxlen), name);
+
+ if ((s = suffix(p, cut)) != 0) strcpy(s, want);
+ else if (*want && !suffix(p, want)) strcat(p, want);
+
+ return p;
+}
+
+/*
+ * Generate a `plain' (non-encoded) name from a given name.
+ */
+static char * plainname P1((name), char *name)
+{
+ return normalname(name, "", SUFFIX_TOASTED );
+}
+
+/*
+ * Generate a `code' name from a given name.
+ */
+static char * codename P1((name), char *name)
+{
+ return normalname( name, SUFFIX_TOASTED, "" );
+}
+
+/*
+ * If we're supposed to ask (fileno (stderr) is a tty, and f_force not
+ * set), ask the user whether to overwrite a file or not.
+ */
+static int ok_to_replace P1(( name ), char * name)
+{
+ int reply, c;
+
+ if (f_force) return 1; /* YES, do replace */
+ if (!isatty(fileno(stderr))) return 0; /* NO, don't replace */
+
+ fprintf(stderr,
+ "%s already exists; do you wish to overwrite %s (y or n)? ",
+ name, name);
+ fflush(stderr);
+
+ for (c = reply = getchar(); c != '\n' && c != EOF; c = getchar()) ;
+ if (reply == 'y') return 1;
+
+ fprintf(stderr, "\tnot overwritten\n");
+ return 0;
+}
+
+static void update_mode P0()
+{
+ if (!instat.st_nlink) return; /* couldn't stat in */
+
+#ifdef HAS_FCHMOD
+ if (fchmod(fileno(out), instat.st_mode & 07777)) {
+ perror(outname);
+ fprintf(stderr, "%s: could not change file mode of \"%s\"\n",
+ progname, outname);
+ }
+#else
+#ifdef HAS_CHMOD
+ if (outname && chmod(outname, instat.st_mode & 07777)) {
+ perror(outname);
+ fprintf(stderr, "%s: could not change file mode of \"%s\"\n",
+ progname, outname);
+ }
+#endif /* HAS_CHMOD */
+#endif /* HAS_FCHMOD */
+}
+
+static void update_own P0()
+{
+ if (!instat.st_nlink) return; /* couldn't stat in */
+#ifdef HAS_FCHOWN
+ (void)fchown(fileno(out), instat.st_uid, instat.st_gid);
+#else
+#ifdef HAS_CHOWN
+ (void)chown(outname, instat.st_uid, instat.st_gid);
+#endif /* HAS_CHOWN */
+#endif /* HAS_FCHOWN */
+}
+
+static void update_times P0()
+{
+ if (!instat.st_nlink) return; /* couldn't stat in */
+
+#ifdef HAS_UTIMES
+ if (outname) {
+ struct timeval tv[2];
+
+ tv[0].tv_sec = instat.st_atime;
+ tv[1].tv_sec = instat.st_mtime;
+ tv[0].tv_usec = tv[1].tv_usec = 0;
+ (void) utimes(outname, tv);
+ }
+#else
+#ifdef HAS_UTIME
+
+ if (outname) {
+
+#ifdef HAS_UTIMBUF
+ struct utimbuf ut;
+
+ ut.actime = instat.st_atime;
+ ut.modtime = instat.st_mtime;
+
+# ifdef HAS_UTIMEUSEC
+ ut.acusec = instat.st_ausec;
+ ut.modusec = instat.st_musec;
+# endif /* HAS_UTIMEUSEC */
+
+ (void) utime(outname, &ut);
+
+#else /* UTIMBUF */
+
+ time_t ut[2];
+
+ ut[0] = instat.st_atime;
+ ut[1] = instat.st_mtime;
+
+ (void) utime(outname, ut);
+
+#endif /* UTIMBUF */
+ }
+#endif /* HAS_UTIME */
+#endif /* HAS_UTIMES */
+}
+
+
+static int okay_as_input P3((name,f,st), char* name, FILE* f, struct stat * st)
+{
+# ifdef HAS_FSTAT
+ if (fstat(fileno(f), st) < 0)
+# else
+ if (stat(name, st) < 0)
+# endif
+ {
+ perror(name);
+ fprintf(stderr, "%s: cannot stat \"%s\"\n", progname, name);
+ return 0;
+ }
+
+ if (!S_ISREG(st->st_mode)) {
+ fprintf(stderr,
+ "%s: \"%s\" is not a regular file -- unchanged.\n",
+ progname, name);
+ return 0;
+ }
+ if (st->st_nlink > 1 && !f_cat && !f_precious) {
+ fprintf(stderr,
+ "%s: \"%s\" has %d other link%s -- unchanged.\n",
+ progname, name, (int)(st->st_nlink - 1),
+ "s" + (st->st_nlink <= 2));
+ return 0;
+ }
+ return 1;
+}
+
+static void prepare_io P1(( desc), struct fmtdesc * desc)
+{
+ output = desc->output;
+ input = desc->input;
+
+ init_input = desc->init_input;
+ init_output = desc->init_output;
+}
+
+static struct fmtdesc * grok_format P1((name), char * name)
+{
+ char * c;
+ struct fmtdesc ** f;
+
+ if (name) {
+ c = plainname(name);
+
+ for (f = alldescs; *f; f++) {
+ if ( (*f)->suffix
+ && *(*f)->suffix
+ && suffix(c, (*f)->suffix)) {
+
+ free(c);
+ return *f;
+ }
+ }
+
+ free(c);
+ }
+ return (struct fmtdesc *)0;
+}
+
+static int open_input P2((name, st), char * name, struct stat * st)
+{
+ struct fmtdesc * f = f_format;
+
+ st->st_nlink = 0; /* indicates `undefined' value */
+ if (!name) {
+ inname = (char *)NULL;
+ in = stdin;
+#ifdef HAS__FSETMODE
+ _fsetmode(in, "b");
+#endif
+ }
+ else {
+ if (f_decode) inname = codename(name);
+ else {
+ if (!f_cat && suffix(name, SUFFIX_TOASTED)) {
+ fprintf(stderr,
+ "%s: %s already has \"%s\" suffix -- unchanged.\n",
+ progname, name, SUFFIX_TOASTED );
+ return 0;
+ }
+ inname = strcpy(emalloc(strlen(name)+1), name);
+ }
+ if (!(in = fopen(inname, READ))) {
+ perror(inname); /* not guaranteed to be valid here */
+ fprintf(stderr, "%s: cannot open \"%s\" for reading\n",
+ progname, inname);
+ return 0;
+ }
+ if (!okay_as_input(inname, in, st)) return 0;
+ if (!f) f = grok_format(inname);
+ }
+ prepare_io( f ? f : & DEFAULT_FORMAT );
+ return 1;
+}
+
+static int open_output P1((name), char *name)
+{
+ if (!name || f_cat) {
+ out = stdout;
+ outname = (char *)NULL;
+#ifdef HAS__FSETMODE
+ _fsetmode(out, "b");
+#endif
+ }
+ else {
+ int outfd = -1;
+ char * o;
+
+ o = (*(f_decode ? plainname : codename))(name);
+ if (!length_okay(o)) return 0;
+ if ((outfd = open(o, O_WRITE_EXCL, 0666)) >= 0)
+ out = fdopen(outfd, WRITE);
+ else if (errno != EEXIST) out = (FILE *)NULL;
+ else if (ok_to_replace(o)) out = fopen(o, WRITE);
+ else return 0;
+
+ if (!out) {
+ perror(o);
+ fprintf(stderr,
+ "%s: can't open \"%s\" for writing\n",
+ progname, o);
+ if (outfd >= 0) (void)close(outfd);
+ return 0;
+ }
+
+ outname = o;
+ }
+ return 1;
+}
+
+static int process_encode P0()
+{
+ gsm r;
+ gsm_signal s[ 160 ];
+ gsm_frame d;
+
+ int cc;
+
+ if (!(r = gsm_create())) {
+ perror(progname);
+ return -1;
+ }
+ (void)gsm_option(r, GSM_OPT_FAST, &f_fast);
+ (void)gsm_option(r, GSM_OPT_VERBOSE, &f_verbose);
+ (void)gsm_option(r, GSM_OPT_LTP_CUT, &f_ltp_cut);
+
+ while ((cc = (*input)(s)) > 0) {
+ if (cc < sizeof(s) / sizeof(*s))
+ memset((char *)(s+cc), 0, sizeof(s)-(cc * sizeof(*s)));
+ gsm_encode(r, s, d);
+ if (fwrite((char *)d, sizeof(d), 1, out) != 1) {
+ perror(outname ? outname : "stdout");
+ fprintf(stderr, "%s: error writing to %s\n",
+ progname, outname ? outname : "stdout");
+ gsm_destroy(r);
+ return -1;
+ }
+ }
+ if (cc < 0) {
+ perror(inname ? inname : "stdin");
+ fprintf(stderr, "%s: error reading from %s\n",
+ progname, inname ? inname : "stdin");
+ gsm_destroy(r);
+ return -1;
+ }
+ gsm_destroy(r);
+
+ return 0;
+}
+
+static int process_decode P0()
+{
+ gsm r;
+ gsm_frame s;
+ gsm_signal d[ 160 ];
+
+ int cc;
+
+ if (!(r = gsm_create())) { /* malloc failed */
+ perror(progname);
+ return -1;
+ }
+ (void)gsm_option(r, GSM_OPT_FAST, &f_fast);
+ (void)gsm_option(r, GSM_OPT_VERBOSE, &f_verbose);
+
+ while ((cc = fread(s, 1, sizeof(s), in)) > 0) {
+
+ if (cc != sizeof(s)) {
+ if (cc >= 0) fprintf(stderr,
+ "%s: incomplete frame (%d byte%s missing) from %s\n",
+ progname, (int)(sizeof(s) - cc),
+ "s" + (sizeof(s) - cc == 1),
+ inname ? inname : "stdin" );
+ gsm_destroy(r);
+ errno = 0;
+ return -1;
+ }
+ if (gsm_decode(r, s, d)) {
+ fprintf(stderr, "%s: bad frame in %s\n",
+ progname, inname ? inname : "stdin");
+ gsm_destroy(r);
+ errno = 0;
+ return -1;
+ }
+
+ if ((*output)(d) < 0) {
+ perror(outname);
+ fprintf(stderr, "%s: error writing to %s\n",
+ progname, outname);
+ gsm_destroy(r);
+ return -1;
+ }
+ }
+
+ if (cc < 0) {
+ perror(inname ? inname : "stdin" );
+ fprintf(stderr, "%s: error reading from %s\n", progname,
+ inname ? inname : "stdin");
+ gsm_destroy(r);
+ return -1;
+ }
+
+ gsm_destroy(r);
+ return 0;
+}
+
+static int process P1((name), char * name)
+{
+ out = (FILE *)0;
+ in = (FILE *)0;
+
+ outname = (char *)0;
+ inname = (char *)0;
+
+ if (!open_input(name, &instat) || !open_output(name))
+ goto err;
+
+ if ((*(f_decode ? init_output : init_input))()) {
+ fprintf(stderr, "%s: error %s %s\n",
+ progname,
+ f_decode ? "writing header to" : "reading header from",
+ f_decode ? (outname ? outname : "stdout")
+ : (inname ? inname : "stdin"));
+ goto err;
+ }
+
+ if ((*(f_decode ? process_decode : process_encode))())
+ goto err;
+
+ if (fflush(out) < 0 || ferror(out)) {
+ perror(outname ? outname : "stdout");
+ fprintf(stderr, "%s: error writing \"%s\"\n", progname,
+ outname ? outname:"stdout");
+ goto err;
+ }
+
+ if (out != stdout) {
+
+ update_times();
+ update_mode ();
+ update_own ();
+
+ if (fclose(out) < 0) {
+ perror(outname);
+ fprintf(stderr, "%s: error writing \"%s\"\n",
+ progname, outname);
+ goto err;
+ }
+ if (outname != name) free(outname);
+ outname = (char *)0;
+ }
+ out = (FILE *)0;
+ if (in != stdin) {
+ (void)fclose(in), in = (FILE *)0;
+ if (!f_cat && !f_precious) {
+ if (unlink(inname) < 0) {
+ perror(inname);
+ fprintf(stderr,
+ "%s: source \"%s\" not deleted.\n",
+ progname, inname);
+ }
+ goto err;
+ }
+ if (inname != name) free(inname);
+ inname = (char *)0;
+ }
+ return 0;
+
+ /*
+ * Error handling and cleanup.
+ */
+err:
+ if (out && out != stdout) {
+ (void)fclose(out), out = (FILE *)0;
+ if (unlink(outname) < 0 && errno != ENOENT && errno != EINTR) {
+ perror(outname);
+ fprintf(stderr, "%s: could not unlink \"%s\"\n",
+ progname, outname);
+ }
+ }
+ if (in && in != stdin) (void)fclose(in), in = (FILE *)0;
+
+ if (inname && inname != name) free(inname);
+ if (outname && outname != name) free(outname);
+
+ return -1;
+}
+
+static void version P0()
+{
+ printf( "%s 1.0, version %s\n",
+ progname,
+ "$Id: toast.c,v 1.8 1996/07/02 10:41:04 jutta Exp $" );
+}
+
+static void help P0()
+{
+ printf("Usage: %s [-fcpdhvaulsFC] [files...]\n", progname);
+ printf("\n");
+
+ printf(" -f force Replace existing files without asking\n");
+ printf(" -c cat Write to stdout, do not remove source files\n");
+ printf(" -d decode Decode data (default is encode)\n");
+ printf(" -p precious Do not delete the source\n");
+ printf("\n");
+
+ printf(" -u u-law Force 8 kHz/8 bit u-law in/output format\n");
+ printf(" -s sun .au Force Sun .au u-law in/output format\n");
+ printf(" -a A-law Force 8 kHz/8 bit A-law in/output format\n");
+ printf(" -l linear Force 16 bit linear in/output format\n");
+ printf("\n");
+
+ printf(" -F fast Sacrifice conformance to performance\n");
+ printf(" -C cutoff Ignore most samples during LTP\n");
+ printf(" -v version Show version information\n");
+ printf(" -h help Print this text\n");
+ printf("\n");
+}
+
+
+static void set_format P1((f), struct fmtdesc * f)
+{
+ if (f_format && f_format != f) {
+ fprintf( stderr,
+ "%s: only one of -[uals] is possible (%s -h for help)\n",
+ progname, progname);
+ exit(1);
+ }
+
+ f_format = f;
+}
+
+int main P2((ac, av), int ac, char **av)
+{
+ int opt;
+ extern int optind;
+
+ parse_argv0(*av);
+
+ while ((opt = getopt(ac, av, "fcdpvhuaslVFC:")) != EOF) switch (opt) {
+
+ case 'd': f_decode = 1; break;
+ case 'f': f_force = 1; break;
+ case 'c': f_cat = 1; break;
+ case 'p': f_precious = 1; break;
+ case 'F': f_fast = 1; break;
+ case 'C': f_ltp_cut = 100; break;
+#ifndef NDEBUG
+ case 'V': f_verbose = 1; break; /* undocumented */
+#endif
+
+ case 'u': set_format( &f_ulaw ); break;
+ case 'l': set_format( &f_linear ); break;
+ case 'a': set_format( &f_alaw ); break;
+ case 's': set_format( &f_audio ); break;
+
+ case 'v': version(); exit(0);
+ case 'h': help(); exit(0);
+
+ default:
+ fprintf(stderr,
+ "Usage: %s [-fcpdhvuaslFC] [files...] (-h for help)\n",
+ progname);
+ exit(1);
+ }
+
+ f_precious |= f_cat;
+
+ av += optind;
+ ac -= optind;
+
+ catch_signals(onintr);
+
+ if (ac <= 0) process( (char *)0 );
+ else while (ac--) process( *av++ );
+
+ exit(0);
+}
diff --git a/src/toast_alaw.c b/src/toast_alaw.c
new file mode 100644
index 0000000..7799342
--- /dev/null
+++ b/src/toast_alaw.c
@@ -0,0 +1,334 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/kbs/jutta/src/gsm/gsm-1.0/src/RCS/toast_alaw.c,v 1.2 1996/07/05 17:23:46 jutta Exp $ */
+
+#include "toast.h"
+
+/* toast_alaw.c -- manipulate A-law encoded sound.
+ */
+
+extern FILE * in, * out;
+
+#define A2S(x) (a2s[ (unsigned char )(x) ])
+#define S2A(x) (s2a[ ((unsigned short)(x)) >> 4 ])
+
+static unsigned short a2s[] = {
+
+ 60032, 60288, 59520, 59776, 61056, 61312, 60544, 60800,
+ 57984, 58240, 57472, 57728, 59008, 59264, 58496, 58752,
+ 62784, 62912, 62528, 62656, 63296, 63424, 63040, 63168,
+ 61760, 61888, 61504, 61632, 62272, 62400, 62016, 62144,
+ 43520, 44544, 41472, 42496, 47616, 48640, 45568, 46592,
+ 35328, 36352, 33280, 34304, 39424, 40448, 37376, 38400,
+ 54528, 55040, 53504, 54016, 56576, 57088, 55552, 56064,
+ 50432, 50944, 49408, 49920, 52480, 52992, 51456, 51968,
+ 65192, 65208, 65160, 65176, 65256, 65272, 65224, 65240,
+ 65064, 65080, 65032, 65048, 65128, 65144, 65096, 65112,
+ 65448, 65464, 65416, 65432, 65512, 65528, 65480, 65496,
+ 65320, 65336, 65288, 65304, 65384, 65400, 65352, 65368,
+ 64160, 64224, 64032, 64096, 64416, 64480, 64288, 64352,
+ 63648, 63712, 63520, 63584, 63904, 63968, 63776, 63840,
+ 64848, 64880, 64784, 64816, 64976, 65008, 64912, 64944,
+ 64592, 64624, 64528, 64560, 64720, 64752, 64656, 64688,
+ 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
+ 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784,
+ 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368,
+ 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392,
+ 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
+ 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
+ 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472,
+ 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
+ 344, 328, 376, 360, 280, 264, 312, 296,
+ 472, 456, 504, 488, 408, 392, 440, 424,
+ 88, 72, 120, 104, 24, 8, 56, 40,
+ 216, 200, 248, 232, 152, 136, 184, 168,
+ 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184,
+ 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
+ 688, 656, 752, 720, 560, 528, 624, 592,
+ 944, 912, 1008, 976, 816, 784, 880, 848
+
+};
+
+
+static unsigned char s2a[] = {
+
+ 213,212,215,214,209,208,211,210,221,220,223,222,217,216,219,218,
+ 197,196,199,198,193,192,195,194,205,204,207,206,201,200,203,202,
+ 245,245,244,244,247,247,246,246,241,241,240,240,243,243,242,242,
+ 253,253,252,252,255,255,254,254,249,249,248,248,251,251,250,250,
+ 229,229,229,229,228,228,228,228,231,231,231,231,230,230,230,230,
+ 225,225,225,225,224,224,224,224,227,227,227,227,226,226,226,226,
+ 237,237,237,237,236,236,236,236,239,239,239,239,238,238,238,238,
+ 233,233,233,233,232,232,232,232,235,235,235,235,234,234,234,234,
+ 149,149,149,149,149,149,149,149,148,148,148,148,148,148,148,148,
+ 151,151,151,151,151,151,151,151,150,150,150,150,150,150,150,150,
+ 145,145,145,145,145,145,145,145,144,144,144,144,144,144,144,144,
+ 147,147,147,147,147,147,147,147,146,146,146,146,146,146,146,146,
+ 157,157,157,157,157,157,157,157,156,156,156,156,156,156,156,156,
+ 159,159,159,159,159,159,159,159,158,158,158,158,158,158,158,158,
+ 153,153,153,153,153,153,153,153,152,152,152,152,152,152,152,152,
+ 155,155,155,155,155,155,155,155,154,154,154,154,154,154,154,154,
+ 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+ 132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+ 135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+ 134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+ 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+ 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+ 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+ 130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+ 141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+ 140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+ 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+ 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+ 137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+ 136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+ 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+ 138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+ 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+ 183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+ 183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+ 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+ 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+ 177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+ 177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+ 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+ 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+ 179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+ 179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+ 178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+ 178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+ 189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+ 189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+ 188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+ 188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+ 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+ 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+ 190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+ 190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+ 185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+ 185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+ 184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+ 184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+ 187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+ 187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+ 186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+ 186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+ 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+ 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+ 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+ 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+ 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+ 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+ 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+ 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+ 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+ 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+ 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+ 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+ 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+ 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+ 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+ 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+ 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+ 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+ 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+ 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+ 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+ 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+ 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+ 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+ 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+ 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+ 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+ 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+ 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+ 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+ 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+ 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+ 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+ 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+ 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+ 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+ 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+ 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+ 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+ 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+ 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+ 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+ 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+ 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+ 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+ 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+ 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+ 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+ 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+ 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+ 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+ 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+ 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+ 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+ 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+ 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+ 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+ 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+ 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
+ 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25,
+ 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31,
+ 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29,
+ 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19,
+ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17,
+ 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
+ 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21,
+ 106,106,106,106,107,107,107,107,104,104,104,104,105,105,105,105,
+ 110,110,110,110,111,111,111,111,108,108,108,108,109,109,109,109,
+ 98, 98, 98, 98, 99, 99, 99, 99, 96, 96, 96, 96, 97, 97, 97, 97,
+ 102,102,102,102,103,103,103,103,100,100,100,100,101,101,101,101,
+ 122,122,123,123,120,120,121,121,126,126,127,127,124,124,125,125,
+ 114,114,115,115,112,112,113,113,118,118,119,119,116,116,117,117,
+ 74, 75, 72, 73, 78, 79, 76, 77, 66, 67, 64, 65, 70, 71, 68, 69,
+ 90, 91, 88, 89, 94, 95, 92, 93, 82, 83, 80, 81, 86, 87, 84, 85
+};
+
+int alaw_input P1((buf), gsm_signal * buf)
+{
+ int i, c;
+
+ for (i = 0; i < 160 && (c = fgetc(in)) != EOF; i++) buf[i] = A2S( c );
+ if (c == EOF && ferror(in)) return -1;
+ return i;
+}
+
+int alaw_output P1((buf), gsm_signal * buf)
+{
+ int i;
+
+ for (i = 0; i < 160; i++, buf++)
+ if (fputc( S2A( *buf ), out) == EOF) return -1;
+ return 0;
+}
+
diff --git a/src/toast_audio.c b/src/toast_audio.c
new file mode 100644
index 0000000..f090f23
--- /dev/null
+++ b/src/toast_audio.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/toast_audio.c,v 1.6 1995/03/07 21:21:24 jutta Exp $ */
+
+#include "toast.h"
+
+/* toast_audio -- functions to manipulate SunOS audio files.
+ *
+ * This is reverse engineered from our present soundfiles
+ * and in no way portable, durable or aesthetically pleasing.
+ */
+
+extern FILE * in, * out;
+extern char * inname;
+extern char * progname;
+
+extern int (*output) P((gsm_signal *)),
+ (*input ) P((gsm_signal *));
+
+extern int alaw_input P((gsm_signal *)),
+ ulaw_input P((gsm_signal *)),
+ linear_input P((gsm_signal *));
+
+extern int ulaw_output P((gsm_signal *));
+
+static int put_u32 P2((f, u), FILE * f, unsigned long u)
+{
+ /* Write a 32-bit unsigned value msb first.
+ */
+ if ( putc( (char)((u>>24) & 0x0FF), f) == EOF
+ || putc( (char)((u>>16) & 0x0FF), f) == EOF
+ || putc( (char)((u>> 8) & 0x0FF), f) == EOF
+ || putc( (char)( u & 0x0FF), f) == EOF) return -1;
+
+ return 0;
+}
+
+static int get_u32 P2((f, up), FILE * f, unsigned long * up)
+{
+ /* Read a 32-bit unsigned value msb first.
+ */
+ int i;
+ unsigned long u;
+
+ if ( (i = getc(f)) == EOF
+ || ((u = (unsigned char)i), (i = getc(f)) == EOF)
+ || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)
+ || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)) return -1;
+ *up = (u<<8)|(unsigned char)i;
+ return 0;
+}
+
+int audio_init_input P0()
+{
+ unsigned long len, enc; /* unsigned 32 bits */
+
+ if ( fgetc(in) != '.'
+ || fgetc(in) != 's'
+ || fgetc(in) != 'n'
+ || fgetc(in) != 'd'
+ || get_u32( in, &len )
+ || get_u32( in, &enc ) /* skip this */
+ || get_u32( in, &enc )) {
+ fprintf(stderr,
+ "%s: bad (missing?) header in Sun audio file \"%s\";\n\
+ Try one of -u, -a, -l instead (%s -h for help).\n",
+ progname, inname ? inname : "stdin", progname);
+ return -1;
+ }
+
+ switch (enc) {
+ case 1: input = ulaw_input; break;
+ case 2: input = alaw_input; break;
+ case 3: input = linear_input; break;
+ default:
+ fprintf(stderr,
+"%s: warning: file format #%lu for %s not implemented, defaulting to u-law.\n",
+ progname, enc, inname);
+ input = ulaw_input;
+ break;
+ }
+
+ while (len > 4*4)
+ if (getc(in) == EOF) {
+ fprintf(stderr,
+ "%s: EOF in header of Sun audio file \"%s\";\n\
+ Try one of -u, -a, -l instead (%s -h for help).\n",
+ progname, inname ? inname : "stdin", progname);
+ return -1;
+ }
+ else len--;
+
+ return 0;
+}
+
+int audio_init_output P0()
+{
+ if ( fputs(".snd", out) == EOF
+ || put_u32(out, 32)
+ || put_u32(out, ~(unsigned long)0)
+ || put_u32(out, 1)
+ || put_u32(out, 8000)
+ || put_u32(out, 1)
+ || put_u32(out, 0)
+ || put_u32(out, 0)) return -1;
+
+ return 0;
+}
+
diff --git a/src/toast_lin.c b/src/toast_lin.c
new file mode 100644
index 0000000..7b5f845
--- /dev/null
+++ b/src/toast_lin.c
@@ -0,0 +1,24 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/toast_lin.c,v 1.1 1992/10/28 00:15:50 jutta Exp $ */
+
+#include "toast.h"
+
+/* toast_linear.c -- read and write 16 bit linear sound in host byte order.
+ */
+
+extern FILE *in, *out;
+
+int linear_input (buf) gsm_signal * buf;
+{
+ return fread( (char *)buf, sizeof(*buf), 160, in );
+}
+
+int linear_output P1((buf), gsm_signal * buf)
+{
+ return -( fwrite( (char *)buf, sizeof(*buf), 160, out ) != 160 );
+}
diff --git a/src/toast_ulaw.c b/src/toast_ulaw.c
new file mode 100644
index 0000000..14ef2d0
--- /dev/null
+++ b/src/toast_ulaw.c
@@ -0,0 +1,621 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/toast_ulaw.c,v 1.1 1992/10/28 00:15:50 jutta Exp $ */
+
+#include "toast.h"
+
+/* toast_ulaw -- functions to manipulate u-law encoded sound.
+ */
+
+extern FILE *in, *out;
+
+#define U2S(x) (u2s[ (unsigned char)(x) ])
+#define S2U(x) (s2u[ ((unsigned short)(x)) >> 3 ])
+
+static unsigned short u2s[] = {
+ 33280, 34308, 35336, 36364, 37393, 38421, 39449, 40477,
+ 41505, 42534, 43562, 44590, 45618, 46647, 47675, 48703,
+ 49474, 49988, 50503, 51017, 51531, 52045, 52559, 53073,
+ 53587, 54101, 54616, 55130, 55644, 56158, 56672, 57186,
+ 57572, 57829, 58086, 58343, 58600, 58857, 59114, 59371,
+ 59628, 59885, 60142, 60399, 60656, 60913, 61171, 61428,
+ 61620, 61749, 61877, 62006, 62134, 62263, 62392, 62520,
+ 62649, 62777, 62906, 63034, 63163, 63291, 63420, 63548,
+ 63645, 63709, 63773, 63838, 63902, 63966, 64030, 64095,
+ 64159, 64223, 64287, 64352, 64416, 64480, 64544, 64609,
+ 64657, 64689, 64721, 64753, 64785, 64818, 64850, 64882,
+ 64914, 64946, 64978, 65010, 65042, 65075, 65107, 65139,
+ 65163, 65179, 65195, 65211, 65227, 65243, 65259, 65275,
+ 65291, 65308, 65324, 65340, 65356, 65372, 65388, 65404,
+ 65416, 65424, 65432, 65440, 65448, 65456, 65464, 65472,
+ 65480, 65488, 65496, 65504, 65512, 65520, 65528, 0,
+ 32256, 31228, 30200, 29172, 28143, 27115, 26087, 25059,
+ 24031, 23002, 21974, 20946, 19918, 18889, 17861, 16833,
+ 16062, 15548, 15033, 14519, 14005, 13491, 12977, 12463,
+ 11949, 11435, 10920, 10406, 9892, 9378, 8864, 8350,
+ 7964, 7707, 7450, 7193, 6936, 6679, 6422, 6165,
+ 5908, 5651, 5394, 5137, 4880, 4623, 4365, 4108,
+ 3916, 3787, 3659, 3530, 3402, 3273, 3144, 3016,
+ 2887, 2759, 2630, 2502, 2373, 2245, 2116, 1988,
+ 1891, 1827, 1763, 1698, 1634, 1570, 1506, 1441,
+ 1377, 1313, 1249, 1184, 1120, 1056, 992, 927,
+ 879, 847, 815, 783, 751, 718, 686, 654,
+ 622, 590, 558, 526, 494, 461, 429, 397,
+ 373, 357, 341, 325, 309, 293, 277, 261,
+ 245, 228, 212, 196, 180, 164, 148, 132,
+ 120, 112, 104, 96, 88, 80, 72, 64,
+ 56, 48, 40, 32, 24, 16, 8, 0
+};
+
+static unsigned char s2u[] = {
+0377,0376,0375,0374,0373,0372,0371,0370,0367,0366,0365,0364,0363,0362,0361,
+0360,0357,0357,0356,0356,0355,0355,0354,0354,0353,0353,0352,0352,0351,0351,
+0350,0350,0347,0347,0346,0346,0345,0345,0344,0344,0343,0343,0342,0342,0341,
+0341,0340,0340,0337,0337,0337,0337,0336,0336,0336,0336,0335,0335,0335,0335,
+0334,0334,0334,0334,0333,0333,0333,0333,0332,0332,0332,0332,0331,0331,0331,
+0331,0330,0330,0330,0330,0327,0327,0327,0327,0326,0326,0326,0326,0325,0325,
+0325,0325,0324,0324,0324,0324,0323,0323,0323,0323,0322,0322,0322,0322,0321,
+0321,0321,0321,0320,0320,0320,0320,0317,0317,0317,0317,0317,0317,0317,0317,
+0316,0316,0316,0316,0316,0316,0316,0316,0315,0315,0315,0315,0315,0315,0315,
+0315,0314,0314,0314,0314,0314,0314,0314,0314,0313,0313,0313,0313,0313,0313,
+0313,0313,0312,0312,0312,0312,0312,0312,0312,0312,0311,0311,0311,0311,0311,
+0311,0311,0311,0310,0310,0310,0310,0310,0310,0310,0310,0307,0307,0307,0307,
+0307,0307,0307,0307,0306,0306,0306,0306,0306,0306,0306,0306,0305,0305,0305,
+0305,0305,0305,0305,0305,0304,0304,0304,0304,0304,0304,0304,0304,0303,0303,
+0303,0303,0303,0303,0303,0303,0303,0302,0302,0302,0302,0302,0302,0302,0302,
+0301,0301,0301,0301,0301,0301,0301,0301,0300,0300,0300,0300,0300,0300,0300,
+0300,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,
+0277,0277,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,
+0276,0276,0276,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,
+0275,0275,0275,0275,0274,0274,0274,0274,0274,0274,0274,0274,0274,0274,0274,
+0274,0274,0274,0274,0274,0273,0273,0273,0273,0273,0273,0273,0273,0273,0273,
+0273,0273,0273,0273,0273,0273,0272,0272,0272,0272,0272,0272,0272,0272,0272,
+0272,0272,0272,0272,0272,0272,0272,0271,0271,0271,0271,0271,0271,0271,0271,
+0271,0271,0271,0271,0271,0271,0271,0271,0270,0270,0270,0270,0270,0270,0270,
+0270,0270,0270,0270,0270,0270,0270,0270,0270,0267,0267,0267,0267,0267,0267,
+0267,0267,0267,0267,0267,0267,0267,0267,0267,0267,0266,0266,0266,0266,0266,
+0266,0266,0266,0266,0266,0266,0266,0266,0266,0266,0266,0265,0265,0265,0265,
+0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0264,0264,0264,
+0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0263,0263,
+0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0262,
+0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,
+0262,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,
+0261,0261,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,
+0260,0260,0260,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,
+0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,
+0257,0257,0257,0257,0257,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,
+0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,
+0256,0256,0256,0256,0256,0256,0256,0255,0255,0255,0255,0255,0255,0255,0255,
+0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,
+0255,0255,0255,0255,0255,0255,0255,0255,0255,0254,0254,0254,0254,0254,0254,
+0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,
+0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0253,0253,0253,0253,
+0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,
+0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0252,0252,
+0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,
+0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,
+0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,
+0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,
+0251,0251,0251,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,
+0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,
+0250,0250,0250,0250,0250,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,
+0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,
+0247,0247,0247,0247,0247,0247,0247,0246,0246,0246,0246,0246,0246,0246,0246,
+0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,
+0246,0246,0246,0246,0246,0246,0246,0246,0246,0245,0245,0245,0245,0245,0245,
+0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,
+0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0244,0244,0244,0244,
+0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,
+0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0243,0243,
+0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,
+0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,
+0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,
+0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,
+0242,0242,0242,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,
+0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,
+0241,0241,0241,0241,0241,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,
+0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,
+0240,0240,0240,0240,0240,0240,0240,0237,0237,0237,0237,0237,0237,0237,0237,
+0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,
+0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,
+0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,
+0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0236,0236,0236,0236,
+0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,
+0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,
+0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,
+0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,
+0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,
+0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,
+0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,
+0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,
+0235,0235,0235,0235,0235,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,
+0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,
+0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,
+0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,
+0234,0234,0234,0234,0234,0234,0234,0234,0234,0233,0233,0233,0233,0233,0233,
+0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,
+0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,
+0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,
+0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0232,0232,
+0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,
+0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,
+0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,
+0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,
+0232,0232,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,
+0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,
+0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,
+0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,
+0231,0231,0231,0231,0231,0231,0231,0230,0230,0230,0230,0230,0230,0230,0230,
+0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,
+0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,
+0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,
+0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0227,0227,0227,0227,
+0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,
+0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,
+0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,
+0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,
+0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,
+0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,
+0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,
+0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,
+0226,0226,0226,0226,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,
+0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,
+0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,
+0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,
+0225,0225,0225,0225,0225,0225,0225,0225,0225,0224,0224,0224,0224,0224,0224,
+0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,
+0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,
+0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,
+0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0223,0223,
+0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,
+0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,
+0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,
+0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,
+0223,0223,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,
+0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,
+0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,
+0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,
+0222,0222,0222,0222,0222,0222,0221,0221,0221,0221,0221,0221,0221,0221,0221,
+0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,
+0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,
+0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,
+0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0220,0220,0220,0220,
+0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,
+0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,
+0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,
+0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,
+0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,
+0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,
+0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,
+0020,0020,0020,0020,0020,0020,0021,0021,0021,0021,0021,0021,0021,0021,0021,
+0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,
+0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,
+0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,
+0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0022,0022,0022,0022,
+0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,
+0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,
+0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,
+0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,
+0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,
+0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,
+0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,
+0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,
+0023,0023,0023,0023,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,
+0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,
+0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,
+0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,
+0024,0024,0024,0024,0024,0024,0024,0024,0024,0025,0025,0025,0025,0025,0025,
+0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,
+0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,
+0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,
+0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0026,0026,
+0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,
+0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,
+0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,
+0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,
+0026,0026,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,
+0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,
+0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,
+0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,
+0027,0027,0027,0027,0027,0027,0030,0030,0030,0030,0030,0030,0030,0030,0030,
+0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,
+0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,
+0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,
+0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0031,0031,0031,0031,
+0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,
+0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,
+0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,
+0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,
+0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,
+0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,
+0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,
+0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,
+0032,0032,0032,0032,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,
+0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,
+0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,
+0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,
+0033,0033,0033,0033,0033,0033,0033,0033,0034,0034,0034,0034,0034,0034,0034,
+0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,
+0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,
+0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,
+0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0035,0035,
+0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,
+0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,
+0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,
+0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,
+0035,0035,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,
+0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,
+0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,
+0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,
+0036,0036,0036,0036,0036,0036,0037,0037,0037,0037,0037,0037,0037,0037,0037,
+0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,
+0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,
+0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,
+0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0040,0040,0040,0040,0040,
+0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,
+0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0041,0041,
+0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,
+0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,
+0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,
+0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,
+0042,0042,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,
+0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,
+0043,0043,0043,0043,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,
+0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,
+0044,0044,0044,0044,0044,0044,0045,0045,0045,0045,0045,0045,0045,0045,0045,
+0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,
+0045,0045,0045,0045,0045,0045,0045,0045,0046,0046,0046,0046,0046,0046,0046,
+0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,
+0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0047,0047,0047,0047,0047,
+0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,
+0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0050,0050,
+0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,
+0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,
+0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,
+0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,
+0051,0051,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,
+0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,
+0052,0052,0052,0052,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,
+0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,
+0053,0053,0053,0053,0053,0053,0054,0054,0054,0054,0054,0054,0054,0054,0054,
+0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,
+0054,0054,0054,0054,0054,0054,0054,0054,0055,0055,0055,0055,0055,0055,0055,
+0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,
+0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0056,0056,0056,0056,0056,
+0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,
+0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0057,0057,0057,
+0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,
+0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,
+0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,
+0060,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,
+0061,0061,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,
+0062,0062,0062,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,
+0063,0063,0063,0063,0064,0064,0064,0064,0064,0064,0064,0064,0064,0064,0064,
+0064,0064,0064,0064,0064,0065,0065,0065,0065,0065,0065,0065,0065,0065,0065,
+0065,0065,0065,0065,0065,0065,0066,0066,0066,0066,0066,0066,0066,0066,0066,
+0066,0066,0066,0066,0066,0066,0066,0067,0067,0067,0067,0067,0067,0067,0067,
+0067,0067,0067,0067,0067,0067,0067,0067,0070,0070,0070,0070,0070,0070,0070,
+0070,0070,0070,0070,0070,0070,0070,0070,0070,0071,0071,0071,0071,0071,0071,
+0071,0071,0071,0071,0071,0071,0071,0071,0071,0071,0072,0072,0072,0072,0072,
+0072,0072,0072,0072,0072,0072,0072,0072,0072,0072,0072,0073,0073,0073,0073,
+0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0074,0074,0074,
+0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0075,0075,
+0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,
+0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,
+0076,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,
+0077,0077,0100,0100,0100,0100,0100,0100,0100,0100,0101,0101,0101,0101,0101,
+0101,0101,0101,0102,0102,0102,0102,0102,0102,0102,0102,0103,0103,0103,0103,
+0103,0103,0103,0103,0104,0104,0104,0104,0104,0104,0104,0104,0105,0105,0105,
+0105,0105,0105,0105,0105,0106,0106,0106,0106,0106,0106,0106,0106,0107,0107,
+0107,0107,0107,0107,0107,0107,0110,0110,0110,0110,0110,0110,0110,0110,0111,
+0111,0111,0111,0111,0111,0111,0111,0112,0112,0112,0112,0112,0112,0112,0112,
+0113,0113,0113,0113,0113,0113,0113,0113,0114,0114,0114,0114,0114,0114,0114,
+0114,0115,0115,0115,0115,0115,0115,0115,0115,0116,0116,0116,0116,0116,0116,
+0116,0116,0117,0117,0117,0117,0117,0117,0117,0117,0120,0120,0120,0120,0121,
+0121,0121,0121,0122,0122,0122,0122,0123,0123,0123,0123,0124,0124,0124,0124,
+0125,0125,0125,0125,0126,0126,0126,0126,0127,0127,0127,0127,0130,0130,0130,
+0130,0131,0131,0131,0131,0132,0132,0132,0132,0133,0133,0133,0133,0134,0134,
+0134,0134,0135,0135,0135,0135,0136,0136,0136,0136,0137,0137,0137,0137,0140,
+0140,0141,0141,0142,0142,0143,0143,0144,0144,0145,0145,0146,0146,0147,0147,
+0150,0150,0150,0151,0151,0152,0152,0153,0153,0154,0154,0155,0155,0156,0156,
+0157,0157,0160,0161,0162,0163,0164,0165,0166,0167,0170,0171,0172,0173,0174,
+0175,0176
+};
+
+int ulaw_input P1((buf), gsm_signal * buf)
+{
+ int i, c;
+
+ for (i = 0; i < 160 && (c = fgetc(in)) != EOF; i++) buf[i] = U2S(c);
+ if (c == EOF && ferror(in)) return -1;
+ return i;
+}
+
+int ulaw_output P1((buf), gsm_signal * buf)
+{
+ int i;
+
+ for(i = 0; i < 160; i++, buf++)
+ if (fputc( (char)S2U( (unsigned short)*buf ), out) == EOF)
+ return -1;
+ return 0;
+}
diff --git a/tls/bitter.c b/tls/bitter.c
new file mode 100644
index 0000000..602d8d6
--- /dev/null
+++ b/tls/bitter.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/bitter.c,v 1.1 1992/10/28 00:28:39 jutta Exp $*/
+
+/* Generate code to pack a bit array from a name:#bits description */
+
+#include <stdio.h>
+#include "taste.h"
+#include "proto.h"
+
+void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex)
+{
+ struct spex * sp = s_spex;
+ int bits = 8;
+ int vars;
+
+ if (!n_spex) return;
+
+ vars = sp->varsize;
+
+ while (n_spex) {
+
+ if (bits == 8) printf("\t*c++ = ");
+ else printf("\t | ");
+
+ if (vars == bits) {
+
+ printf( (bits==8? "%s & 0x%lX;\n" : "(%s & 0x%lX);\n"),
+ sp->var,
+ ~(0xfffffffe << (bits - 1)));
+ if (!-- n_spex) break;
+ sp++;
+
+ vars = sp->varsize;
+ bits = 8;
+
+ } else if (vars < bits) {
+
+ printf( "((%s & 0x%lX) << %d)",
+ sp->var,
+ ~(0xfffffffe << (vars - 1)),
+ bits - vars);
+ bits -= vars;
+ if (!--n_spex) {
+ puts(";");
+ break;
+ }
+ else putchar('\n');
+ sp++;
+ vars = sp->varsize;
+
+ } else {
+ printf("((%s >> %d) & 0x%X);\n",
+ sp->var,
+ vars - bits,
+ ~(0xfffffffe << (bits - 1)));
+
+ vars -= bits;
+ bits = 8;
+ }
+ }
+}
diff --git a/tls/bitter.dta b/tls/bitter.dta
new file mode 100644
index 0000000..d1c42e4
--- /dev/null
+++ b/tls/bitter.dta
@@ -0,0 +1,90 @@
+;
+; Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+; Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+; details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+;
+;
+; Variable Size
+
+GSM_MAGIC 4
+
+LARc[0] 6
+LARc[1] 6
+LARc[2] 5
+LARc[3] 5
+LARc[4] 4
+LARc[5] 4
+LARc[6] 3
+LARc[7] 3
+
+Nc[0] 7
+bc[0] 2
+Mc[0] 2
+xmaxc[0] 6
+xmc[0] 3
+xmc[1] 3
+xmc[2] 3
+xmc[3] 3
+xmc[4] 3
+xmc[5] 3
+xmc[6] 3
+xmc[7] 3
+xmc[8] 3
+xmc[9] 3
+xmc[10] 3
+xmc[11] 3
+xmc[12] 3
+
+Nc[1] 7
+bc[1] 2
+Mc[1] 2
+xmaxc[1] 6
+xmc[13] 3
+xmc[14] 3
+xmc[15] 3
+xmc[16] 3
+xmc[17] 3
+xmc[18] 3
+xmc[19] 3
+xmc[20] 3
+xmc[21] 3
+xmc[22] 3
+xmc[23] 3
+xmc[24] 3
+xmc[25] 3
+
+Nc[2] 7
+bc[2] 2
+Mc[2] 2
+xmaxc[2] 6
+xmc[26] 3
+xmc[27] 3
+xmc[28] 3
+xmc[29] 3
+xmc[30] 3
+xmc[31] 3
+xmc[32] 3
+xmc[33] 3
+xmc[34] 3
+xmc[35] 3
+xmc[36] 3
+xmc[37] 3
+xmc[38] 3
+
+Nc[3] 7
+bc[3] 2
+Mc[3] 2
+xmaxc[3] 6
+xmc[39] 3
+xmc[40] 3
+xmc[41] 3
+xmc[42] 3
+xmc[43] 3
+xmc[44] 3
+xmc[45] 3
+xmc[46] 3
+xmc[47] 3
+xmc[48] 3
+xmc[49] 3
+xmc[50] 3
+xmc[51] 3
diff --git a/tls/ginger.c b/tls/ginger.c
new file mode 100644
index 0000000..d830e20
--- /dev/null
+++ b/tls/ginger.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright 1996 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header*/
+
+/* Generate code to pack a bit array from a name:#bits description */
+
+#include <stdio.h>
+#include "taste.h"
+#include "proto.h"
+#include <limits.h>
+
+/* This module is the opposite of sour. Sweet was already taken,
+ * that's why it's called ginger. (Add one point if that reminds
+ * you of Gary Larson.)
+ */
+
+#define WORD_BITS 16 /* sizeof(uword) * CHAR_BIT on the
+ * target architecture---if this isn't 16,
+ * you're in trouble with this library anyway.
+ */
+
+#define BYTE_BITS 8 /* CHAR_BIT on the target architecture---
+ * if this isn't 8, you're in *deep* trouble.
+ */
+
+void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex)
+{
+ struct spex * sp = s_spex;
+ int n_in = 0;
+
+ printf("uword sr = 0;\n");
+
+ for (; n_spex > 0; n_spex--, sp++) {
+
+ while (n_in < sp->varsize) {
+ if (n_in) printf("sr |= (uword)*c++ << %d;\n", n_in);
+ else printf("sr = *c++;\n");
+ n_in += BYTE_BITS;
+ }
+
+ printf("%s = sr & %#x; sr >>= %d;\n",
+ sp->var, ~(~0U << sp->varsize), sp->varsize);
+
+ n_in -= sp->varsize;
+ }
+
+ if (n_in > 0) {
+ fprintf(stderr, "%d bits left over\n", n_in);
+ }
+}
diff --git a/tls/sour.c b/tls/sour.c
new file mode 100644
index 0000000..b6932e6
--- /dev/null
+++ b/tls/sour.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright 1996 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header*/
+
+/* Generate code to pack a bit array from a name:#bits description,
+ * WAV #49 style.
+ */
+
+#include <stdio.h>
+#include "taste.h"
+#include "proto.h"
+#include <limits.h>
+
+/* This module goes back to one Jeff Chilton used for his implementation
+ * of the #49 WAV GSM format. (In his original patch 8, it replaced
+ * bitter.c.)
+ *
+ * In Microsoft's WAV #49 version of the GSM format, two 32 1/2
+ * byte GSM frames are packed together to make one WAV frame, and
+ * the GSM parameters are packed into bytes right-to-left rather
+ * than left-to-right.
+ *
+ * That is, where toast's GSM format writes
+ *
+ * aaaaaabb bbbbcccc cdddddee ...
+ * ___1____ ___2____ ___3____
+ *
+ * for parameters a (6 bits), b (6 bits), c (5 bits), d (5 bits), e ..
+ * the WAV format has
+ *
+ * bbaaaaaa ccccbbbb eedddddc ...
+ * ___1____ ___2____ ___3____
+ *
+ * (This format looks a lot prettier if one pictures octets coming
+ * in through a fifo queue from the left, rather than waiting in the
+ * right-hand remainder of a C array.)
+ */
+
+#define WORD_BITS 16 /* sizeof(uword) * CHAR_BIT on the
+ * target architecture---if this isn't 16,
+ * you're in trouble with this library anyway.
+ */
+
+#define BYTE_BITS 8 /* CHAR_BIT on the target architecture---
+ * if this isn't 8, you're in *deep* trouble.
+ */
+
+void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex)
+{
+ struct spex * sp = s_spex;
+ int n_in = 0;
+
+ printf("uword sr = 0;\n");
+
+ for (; n_spex > 0; n_spex--, sp++) {
+
+ /* insert old
+ * new var value unused
+ * here
+ *
+ * [____________xxxxxx**********]
+ *
+ * <----- n_in ------>
+ */
+ printf("sr = sr >> %d | %s << %d;\n",
+ sp->varsize,
+ sp->var,
+ WORD_BITS - sp->varsize);
+
+ n_in += sp->varsize;
+
+ while (n_in >= BYTE_BITS) {
+ printf("*c++ = sr >> %d;\n",
+ WORD_BITS - n_in);
+ n_in -= BYTE_BITS;
+ }
+ }
+
+ while (n_in >= BYTE_BITS) {
+ printf("*c++ = sr >> %d;\n", WORD_BITS - n_in);
+ n_in -= BYTE_BITS;
+ }
+
+ if (n_in > 0) {
+ fprintf(stderr, "warning: %d bits left over\n", n_in);
+ }
+}
diff --git a/tls/sour1.dta b/tls/sour1.dta
new file mode 100644
index 0000000..770b24c
--- /dev/null
+++ b/tls/sour1.dta
@@ -0,0 +1,88 @@
+;
+; Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+; Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+; details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+;
+;
+; Variable Size
+
+LARc[0] 6
+LARc[1] 6
+LARc[2] 5
+LARc[3] 5
+LARc[4] 4
+LARc[5] 4
+LARc[6] 3
+LARc[7] 3
+
+Nc[0] 7
+bc[0] 2
+Mc[0] 2
+xmaxc[0] 6
+xmc[0] 3
+xmc[1] 3
+xmc[2] 3
+xmc[3] 3
+xmc[4] 3
+xmc[5] 3
+xmc[6] 3
+xmc[7] 3
+xmc[8] 3
+xmc[9] 3
+xmc[10] 3
+xmc[11] 3
+xmc[12] 3
+
+Nc[1] 7
+bc[1] 2
+Mc[1] 2
+xmaxc[1] 6
+xmc[13] 3
+xmc[14] 3
+xmc[15] 3
+xmc[16] 3
+xmc[17] 3
+xmc[18] 3
+xmc[19] 3
+xmc[20] 3
+xmc[21] 3
+xmc[22] 3
+xmc[23] 3
+xmc[24] 3
+xmc[25] 3
+
+Nc[2] 7
+bc[2] 2
+Mc[2] 2
+xmaxc[2] 6
+xmc[26] 3
+xmc[27] 3
+xmc[28] 3
+xmc[29] 3
+xmc[30] 3
+xmc[31] 3
+xmc[32] 3
+xmc[33] 3
+xmc[34] 3
+xmc[35] 3
+xmc[36] 3
+xmc[37] 3
+xmc[38] 3
+
+Nc[3] 7
+bc[3] 2
+Mc[3] 2
+xmaxc[3] 6
+xmc[39] 3
+xmc[40] 3
+xmc[41] 3
+xmc[42] 3
+xmc[43] 3
+xmc[44] 3
+xmc[45] 3
+xmc[46] 3
+xmc[47] 3
+xmc[48] 3
+xmc[49] 3
+xmc[50] 3
+xmc[51] 3
diff --git a/tls/sour2.dta b/tls/sour2.dta
new file mode 100644
index 0000000..f56545c
--- /dev/null
+++ b/tls/sour2.dta
@@ -0,0 +1,90 @@
+;
+; Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+; Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+; details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+;
+;
+; Variable Size
+
+g->chain 4
+
+LARc[0] 6
+LARc[1] 6
+LARc[2] 5
+LARc[3] 5
+LARc[4] 4
+LARc[5] 4
+LARc[6] 3
+LARc[7] 3
+
+Nc[0] 7
+bc[0] 2
+Mc[0] 2
+xmaxc[0] 6
+xmc[0] 3
+xmc[1] 3
+xmc[2] 3
+xmc[3] 3
+xmc[4] 3
+xmc[5] 3
+xmc[6] 3
+xmc[7] 3
+xmc[8] 3
+xmc[9] 3
+xmc[10] 3
+xmc[11] 3
+xmc[12] 3
+
+Nc[1] 7
+bc[1] 2
+Mc[1] 2
+xmaxc[1] 6
+xmc[13] 3
+xmc[14] 3
+xmc[15] 3
+xmc[16] 3
+xmc[17] 3
+xmc[18] 3
+xmc[19] 3
+xmc[20] 3
+xmc[21] 3
+xmc[22] 3
+xmc[23] 3
+xmc[24] 3
+xmc[25] 3
+
+Nc[2] 7
+bc[2] 2
+Mc[2] 2
+xmaxc[2] 6
+xmc[26] 3
+xmc[27] 3
+xmc[28] 3
+xmc[29] 3
+xmc[30] 3
+xmc[31] 3
+xmc[32] 3
+xmc[33] 3
+xmc[34] 3
+xmc[35] 3
+xmc[36] 3
+xmc[37] 3
+xmc[38] 3
+
+Nc[3] 7
+bc[3] 2
+Mc[3] 2
+xmaxc[3] 6
+xmc[39] 3
+xmc[40] 3
+xmc[41] 3
+xmc[42] 3
+xmc[43] 3
+xmc[44] 3
+xmc[45] 3
+xmc[46] 3
+xmc[47] 3
+xmc[48] 3
+xmc[49] 3
+xmc[50] 3
+xmc[51] 3
diff --git a/tls/sweet.c b/tls/sweet.c
new file mode 100644
index 0000000..6a6fb29
--- /dev/null
+++ b/tls/sweet.c
@@ -0,0 +1,66 @@
+ /*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/sweet.c,v 1.2 1996/07/02 10:15:53 jutta Exp $*/
+
+/* Generate code to unpack a bit array from name:#bits description */
+
+#include <stdio.h>
+#include "taste.h"
+#include "proto.h"
+
+void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex)
+{
+ struct spex * sp = s_spex;
+ int bits = 8;
+ int vars;
+
+ if (!n_spex) return;
+
+ vars = sp->varsize;
+
+ while (n_spex) {
+
+ if (vars == sp->varsize) {
+ printf("\t%s = ", sp->var);
+ } else printf("\t%s |= ", sp->var);
+
+ if (vars == bits) {
+
+ if (bits == 8) printf( "*c++;\n" );
+ else printf( "*c++ & 0x%lX;\n",
+ ~(0xfffffffe << (bits - 1)) );
+
+ if (!-- n_spex) break;
+ sp++;
+ vars = sp->varsize;
+ bits = 8;
+
+ } else if (vars < bits) {
+
+ printf( "(*c >> %d) & 0x%lX;\n",
+ bits - vars,
+ ~(0xfffffffe << (vars - 1)));
+
+ bits -= vars;
+ if (!--n_spex) break;
+ sp++;
+ vars = sp->varsize;
+
+ } else {
+ /* vars > bits. We're eating lower-all of c,
+ * but we must shift it.
+ */
+ printf( "(*c++ & 0x%X) << %d;\n",
+ ~(0xfffffffe << (bits - 1)),
+ vars - bits );
+
+ vars -= bits;
+ bits = 8;
+ }
+ }
+}
+
diff --git a/tls/taste.c b/tls/taste.c
new file mode 100644
index 0000000..4bc84ad
--- /dev/null
+++ b/tls/taste.c
@@ -0,0 +1,139 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/taste.c,v 1.1 1992/10/28 00:28:39 jutta Exp $*/
+
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+
+#include "config.h"
+
+#ifdef HAS_STDLIB_H
+# include <stdlib.h>
+#else
+#include "proto.h"
+# ifdef HAS_MALLOC_H
+# include <malloc.h>
+# else
+ extern char * malloc P((char *)), * realloc P((char *,int));
+# endif
+ extern int exit P((int));
+#endif
+
+#include "proto.h"
+
+/*
+ * common code to sweet.c and bitter.c: read the name:#bits description.
+ */
+
+#include "taste.h"
+
+static struct spex * s_spex;
+static int n_spex, m_spex;
+
+extern void write_code P((struct spex *, int));
+
+char * strsave P1((str), char * str) /* strdup() + errors */
+{
+ int n = strlen(str) + 1;
+ char * s = malloc(n);
+ if (!s) {
+ fprintf(stderr, "Failed to malloc %d bytes, abort\n",
+ strlen(str) + 1);
+ exit(1);
+ }
+ return memcpy(s, str, n);
+}
+
+struct spex * new_spex P0()
+{
+ if (n_spex >= m_spex) {
+ m_spex += 500;
+ if (!(s_spex = (struct spex *)(n_spex
+ ? realloc((char *)s_spex, m_spex * sizeof(*s_spex))
+ : malloc( m_spex * sizeof(*s_spex))))) {
+ fprintf(stderr, "Failed to malloc %d bytes, abort\n",
+ m_spex * sizeof(*s_spex));
+ exit(1);
+ }
+ }
+ return s_spex + n_spex;
+}
+
+char * strtek P2((str, sep), char * str, char * sep) {
+
+ static char * S = (char *)0;
+ char * c, * base;
+
+ if (str) S = str;
+
+ if (!S || !*S) return (char *)0;
+
+ /* Skip delimiters.
+ */
+ while (*S) {
+ for (c = sep; *c && *c != *S; c++) ;
+ if (*c) *S++ = 0;
+ else break;
+ }
+
+ base = S;
+
+ /* Skip non-delimiters.
+ */
+ for (base = S; *S; S++) {
+
+ for (c = sep; *c; c++)
+ if (*c == *S) {
+ *S++ = 0;
+ return base;
+ }
+ }
+
+ return base == S ? (char *)0 : base;
+}
+
+int read_spex P0()
+{
+ char buf[200];
+ char * s, *t;
+ struct spex * sp = s_spex;
+
+ while (fgets(buf, sizeof buf, stdin)) {
+
+ char * nl;
+
+ if (nl = strchr(buf, '\n'))
+ *nl = '\0';
+
+ if (!*buf || *buf == ';') continue;
+ s = strtek(buf, " \t");
+ if (!s) {
+ fprintf(stderr, "? %s\n", buf);
+ continue;
+ }
+ sp = new_spex();
+ sp->var = strsave(s);
+ s = strtek((char*)0, " \t");
+ if (!s) {
+ fprintf(stderr, "varsize?\n");
+ continue;
+ }
+ sp->varsize = strtol(s, (char **)0, 0);
+ n_spex++;
+ }
+
+ return sp - s_spex;
+}
+
+int main P0()
+{
+ read_spex();
+ write_code(s_spex, n_spex);
+
+ exit(0);
+}
diff --git a/tls/taste.h b/tls/taste.h
new file mode 100644
index 0000000..2fc85ef
--- /dev/null
+++ b/tls/taste.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*
+ * common code to sweet.c and bitter.c
+ */
+
+#ifndef TASTE_H
+#define TASTE_H
+
+struct spex {
+
+ char * var;
+ int varsize;
+} ;
+
+#endif /* TASTE_H */
diff --git a/tst/cod2lin.c b/tst/cod2lin.c
new file mode 100644
index 0000000..07a9510
--- /dev/null
+++ b/tst/cod2lin.c
@@ -0,0 +1,104 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/cod2lin.c,v 1.2 1996/07/02 14:33:10 jutta Exp jutta $*/
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm.h"
+#include "proto.h"
+
+char * pname;
+
+int debug = 0;
+int verbosity = 0;
+int fast = 0;
+int wav = 0;
+int error = 0;
+
+usage P0()
+{
+ fprintf(stderr, "Usage: %s [-vwF] [files...]\n", pname);
+ exit(1);
+}
+
+void process P2((f, filename), FILE * f, char * filename)
+{
+ gsm_frame buf;
+ gsm_signal source[160];
+
+ int cc;
+ gsm r;
+
+ (void)memset(source, 0x00, sizeof(source));
+
+ if (!(r = gsm_create())) {
+ perror("gsm_create");
+ error = 1;
+ return ;
+ }
+ gsm_option(r, GSM_OPT_VERBOSE, &verbosity);
+ gsm_option(r, GSM_OPT_FAST, &fast);
+ gsm_option(r, GSM_OPT_WAV49, &wav);
+ for (;;) {
+ cc = fread((char *)source, sizeof(*source), 76, f);
+ if (cc == 0) {
+ gsm_destroy(r);
+ return;
+ }
+ if (cc != 76) {
+ error = 1;
+ fprintf(stderr,
+ "%s: %s -- %d trailing bytes ignored\n",
+ pname, filename, cc);
+ gsm_destroy(r);
+ return;
+ }
+
+ gsm_implode(r, source, buf);
+ gsm_decode(r, buf, source);
+
+ if (write(1, source, sizeof(source)) != sizeof(source)) {
+ perror("write");
+ error = 1;
+ gsm_destroy(r);
+ return;
+ }
+ }
+}
+
+main P2((ac, av), int ac, char ** av)
+{
+ int opt;
+ extern char * optarg;
+ extern int optind;
+
+ FILE * f;
+
+ if (!(pname = av[0])) pname = "cod2out";
+
+ while ((opt = getopt(ac, av, "vwF")) != EOF) switch (opt) {
+ case 'v': verbosity++; break;
+ case 'w': wav++; break;
+ case 'F': fast++; break;
+ default: usage();
+ }
+
+ ac -= optind;
+ av += optind;
+
+ if (!ac) process(stdin, "*stdin*");
+ else for (; *av; av++) {
+ if (!(f = fopen(*av, "r"))) perror(*av);
+ else {
+ process(f, *av);
+ fclose(f);
+ }
+ }
+
+ exit(error);
+}
diff --git a/tst/cod2txt.c b/tst/cod2txt.c
new file mode 100644
index 0000000..71c362e
--- /dev/null
+++ b/tst/cod2txt.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/cod2txt.c,v 1.1 1994/10/21 20:52:11 jutta Exp $*/
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm.h"
+#include "proto.h"
+
+char * pname;
+
+int debug = 0;
+int verbosity = 0;
+int error = 0;
+
+usage P0()
+{
+ fprintf(stderr, "Usage: %s [files...]\n", pname);
+ exit(1);
+}
+
+void process P2((f, filename), FILE * f, char * filename)
+{
+ gsm_frame buf;
+ gsm_signal source[160];
+
+ int cc;
+ gsm r;
+ int nr=0;
+
+ (void)memset(source, 0, sizeof(source));
+
+ if (!(r = gsm_create())) {
+ perror("gsm_create");
+ error = 1;
+ return ;
+ }
+ gsm_option(r, GSM_OPT_VERBOSE, &verbosity);
+ for (;;) {
+ cc = fread((char *)source, sizeof(*source), 76, f);
+ if (cc == 0) {
+ gsm_destroy(r);
+ return;
+ }
+ if (cc != 76) {
+ error = 1;
+ fprintf(stderr,
+ "%s: %s -- %d trailing bytes ignored\n",
+ pname, filename, cc);
+ gsm_destroy(r);
+ return;
+ }
+
+ gsm_implode(r, source, buf);
+ printf("[%d] ", ++nr);
+ if (gsm_print(stdout, r, buf)) {
+ fprintf(stderr,
+ "%s: %s: bad magic\n", pname, filename);
+ gsm_destroy(r);
+ return;
+
+ }
+ }
+}
+
+main P2((ac, av), int ac, char ** av)
+{
+ int opt;
+ extern char * optarg;
+ extern int optind;
+
+ FILE * f;
+
+ if (!(pname = av[0])) pname = "cod2txt";
+
+ ac--;
+ av++;
+
+ if (!ac) process(stdin, "*stdin*");
+ else for (; *av; av++) {
+ if (!(f = fopen(*av, "r"))) perror(*av);
+ else {
+ process(f, *av);
+ fclose(f);
+ }
+ }
+
+ exit(error);
+}
diff --git a/tst/gsm2cod.c b/tst/gsm2cod.c
new file mode 100644
index 0000000..f2e7c2c
--- /dev/null
+++ b/tst/gsm2cod.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/gsm2cod.c,v 1.1 1994/10/21 20:52:11 jutta Exp $*/
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm.h"
+#include "proto.h"
+
+char * pname;
+
+int debug = 0;
+int verbosity = 0;
+int error = 0;
+
+usage P0()
+{
+ fprintf(stderr, "Usage: %s [files...]\n", pname);
+ exit(1);
+}
+
+void process P2((f, filename), FILE * f, char * filename)
+{
+ gsm_frame buf;
+ gsm_signal source[76];
+
+ int cc;
+ gsm r;
+ int nr=0;
+
+ (void)memset(source, 0, sizeof(source));
+
+ if (!(r = gsm_create())) {
+ perror("gsm_create");
+ error = 1;
+ return ;
+ }
+ gsm_option(r, GSM_OPT_VERBOSE, &verbosity);
+ for (;;) {
+ cc = fread((char *)buf, sizeof(buf), 1, f);
+ if (cc == 0) {
+ gsm_destroy(r);
+ return;
+ }
+ if (cc != 1) {
+ error = 1;
+ fprintf(stderr,
+ "%s: %s -- trailing bytes ignored\n",
+ pname, filename);
+ gsm_destroy(r);
+ return;
+ }
+
+ gsm_explode(r, buf, source);
+ if (write(1, (char *)source, sizeof(source))!= sizeof(source)) {
+
+ perror("write");
+ error = 1;
+ gsm_destroy(r);
+ return;
+ }
+ }
+}
+
+main P2((ac, av), int ac, char ** av)
+{
+ int opt;
+ extern char * optarg;
+ extern int optind;
+
+ FILE * f;
+
+ if (!(pname = av[0])) pname = "gsm2cod";
+
+ ac--;
+ av++;
+
+ if (!ac) process(stdin, "*stdin*");
+ else for (; *av; av++) {
+ if (!(f = fopen(*av, "r"))) perror(*av);
+ else {
+ process(f, *av);
+ fclose(f);
+ }
+ }
+
+ exit(error);
+}
diff --git a/tst/lin2cod.c b/tst/lin2cod.c
new file mode 100644
index 0000000..2c42b10
--- /dev/null
+++ b/tst/lin2cod.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/lin2cod.c,v 1.2 1996/07/02 14:33:13 jutta Exp jutta $*/
+
+#include <stdio.h>
+
+#include "gsm.h"
+#include "proto.h"
+
+char * pname;
+
+int debug = 0;
+int verbosity = 0;
+int fast = 0;
+int wav = 0;
+int error = 0;
+
+usage P0()
+{
+ fprintf(stderr, "Usage: %s [-vwF] [files...]\n", pname);
+ exit(1);
+}
+
+void process P2((f, filename), FILE * f, char * filename)
+{
+ gsm_frame buf;
+ short source[160];
+ int cc;
+ gsm r;
+
+ if (!(r = gsm_create())) {
+ perror("gsm_create");
+ error = 1;
+ return ;
+ }
+ gsm_option(r, GSM_OPT_VERBOSE, &verbosity);
+ gsm_option(r, GSM_OPT_FAST, &fast);
+ gsm_option(r, GSM_OPT_WAV49, &wav);
+ for (;;) {
+
+ if ((cc = fread((char *)source, 1, sizeof(source), f)) == 0) {
+ gsm_destroy(r);
+#ifdef COUNT_OVERFLOW
+ dump_overflow(stderr);
+#endif
+ return;
+ }
+
+ if (cc != sizeof(source)) {
+ error = 1;
+ perror(filename);
+ fprintf(stderr, "%s: cannot read input from %s\n",
+ pname, filename);
+ gsm_destroy(r);
+ return;
+ }
+
+ gsm_encode(r, source, buf);
+ gsm_explode(r, buf, source); /* 76 shorts */
+ if (write(1, source, sizeof(*source) * 76)
+ != sizeof(*source) * 76) {
+
+ perror("write");
+ error = 1;
+ gsm_destroy(r);
+ return;
+ }
+ }
+}
+
+main P2((ac, av), int ac, char ** av)
+{
+ int opt;
+ extern char * optarg;
+ extern int optind;
+
+ FILE * f;
+
+ if (!(pname = av[0])) pname = "inp2cod";
+
+ while ((opt = getopt(ac, av, "vwF")) != EOF) switch (opt) {
+ case 'v': verbosity++; break;
+ case 'w': wav++; break;
+ case 'F': fast++; break;
+ default: usage();
+ }
+
+ ac -= optind;
+ av += optind;
+
+ if (!ac) process(stdin, "*stdin*");
+ else for (; *av; av++) {
+ if (!(f = fopen(*av, "r"))) perror(*av);
+ else {
+ process(f, *av);
+ fclose(f);
+ }
+ }
+
+ exit(error);
+}
diff --git a/tst/lin2txt.c b/tst/lin2txt.c
new file mode 100644
index 0000000..fb39504
--- /dev/null
+++ b/tst/lin2txt.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+ * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/lin2txt.c,v 1.1 1994/10/21 20:52:11 jutta Exp $*/
+
+#include <stdio.h>
+
+#include "gsm.h"
+#include "proto.h"
+
+char * pname;
+
+int debug = 0;
+int verbosity = 0;
+int error = 0;
+
+usage P0()
+{
+ fprintf(stderr, "Usage: %s [-v] [files...]\n", pname);
+ exit(1);
+}
+
+void process P2((f, filename), FILE * f, char * filename)
+{
+ short source[160];
+ int cc, j, k;
+ gsm r;
+
+ if (!(r = gsm_create())) {
+ perror("gsm_create");
+ error = 1;
+ return ;
+ }
+ gsm_option(r, GSM_OPT_VERBOSE, &verbosity);
+ for (;;) {
+
+ if ((cc = fread((char *)source, 1, sizeof(source), f)) == 0) {
+ gsm_destroy(r);
+#ifdef COUNT_OVERFLOW
+ dump_overflow(stderr);
+#endif
+ return;
+ }
+
+ printf("{\t");
+ for (j = 0; j < 4; j++) {
+ printf("{\t");
+ for (k = 0; k < 40; k++) {
+ printf("%d", (int)source[ j * 40 + k ]);
+ if (k < 39) {
+ printf(", ");
+ if (k % 4 == 3) printf("\n\t\t");
+ } else {
+ printf("\t}");
+ if (j == 3) printf("\t},\n");
+ else printf(",\n\t");
+ }
+ }
+ }
+ }
+}
+
+main P2((ac, av), int ac, char ** av)
+{
+ int opt;
+ extern char * optarg;
+ extern int optind;
+
+ FILE * f;
+
+ if (!(pname = av[0])) pname = "inp2txt";
+
+ while ((opt = getopt(ac, av, "v")) != EOF) switch (opt) {
+ case 'v': verbosity++; break;
+ default: usage();
+ }
+
+ ac -= optind;
+ av += optind;
+
+ if (!ac) process(stdin, "*stdin*");
+ else for (; *av; av++) {
+ if (!(f = fopen(*av, "r"))) perror(*av);
+ else {
+ process(f, *av);
+ fclose(f);
+ }
+ }
+
+ exit(error);
+}
diff --git a/tst/run b/tst/run
new file mode 100755
index 0000000..5eec3b2
--- /dev/null
+++ b/tst/run
@@ -0,0 +1,34 @@
+:
+#
+# Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+# Universitaet Berlin. See the accompanying file "COPYRIGHT" for
+# details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+#
+if [ ! -f 1.inp ] ; then
+ echo Sorry, but we cannot provide the test data with this release.
+ exit
+fi
+
+echo -n 'Linear to code: '
+for i in 1 2 3 4
+do
+ echo -n $i..
+ ./lin2cod < $i.inp | cmp - $i.cod
+done
+echo ""
+
+echo -n 'Code to linear: '
+for i in 1 2 3 4
+do
+ echo -n $i..
+ ./cod2lin < $i.cod | cmp - $i.out
+done
+echo ""
+
+echo -n 'Toast: '
+for i in 1 2 3 4
+do
+ echo -n $i..
+ ../bin/toast -l < $i.inp | ../bin/toast -dl | cmp - $i.out
+done
+echo ""