]> granicus.if.org Git - recode/commitdiff
Use Gnulib as much as possible
authorReuben Thomas <rrt@sc3d.org>
Sat, 13 Jan 2018 16:32:46 +0000 (16:32 +0000)
committerReuben Thomas <rrt@sc3d.org>
Sun, 14 Jan 2018 20:45:30 +0000 (20:45 +0000)
Require C99, and use Gnulib to provide everything else.

34 files changed:
.gitignore
bootstrap.conf
cleaner.h.in
configure.ac
lib/.gitignore
src/Makefile.am
src/ansi2knr.1 [deleted file]
src/ansi2knr.c [deleted file]
src/argmatch.c [deleted file]
src/argmatch.h [deleted file]
src/common.h
src/decsteps.h
src/exit.h [deleted file]
src/exitfail.c [deleted file]
src/exitfail.h [deleted file]
src/hash.c [deleted file]
src/hash.h [deleted file]
src/localcharset.c [deleted file]
src/main.c
src/outer.c
src/quotearg.c [deleted file]
src/quotearg.h [deleted file]
src/recode.c
src/recode.h
src/recodext.h
src/recodext.h.in
src/task.c
src/txtelat1.l
src/xalloc-die.c [deleted file]
src/xalloc.h [deleted file]
src/xmalloc.c [deleted file]
tests/Makefile.am
tests/Recode.c
tests/setup.py.in

index 112130a4153ddc9314df6fe3eab209113dce6af8..837074aa7e41e190a0db273c5c2b8bff9a1e9b6c 100644 (file)
@@ -40,4 +40,5 @@ html/
 /src/recode.1
 /stamp-h1
 /tests/setup.py
+/tests/Recode.body.c
 /tests/Recode.so
index 0eaf6a7bd90da9813e43e0e945acd54be1bb4d34..a67fc32842b4d3494168e19908169a49e438bb2f 100644 (file)
@@ -43,11 +43,22 @@ gnulib_tool_options='
 
 # gnulib modules used by this package.
 gnulib_modules='
+        argmatch
         bootstrap
         error
         getopt-posix
         gettext-h
+        hash
+        localcharset
         pathmax
+        pipe-posix
+        quotearg
+        strndup
+        sys_wait
+        unistd
+        utime
+        vprintf-posix
+        xalloc
 '
 
 # Copyright holder
index 7b52d727822c51db4063ab60f7d4f892c5534a09..009d12594d5f363d3c7bbd3287b02ba70b9c61c4 100644 (file)
 # define get_quoting_style librecode_get_quoting_style
 # define get_ucs2 librecode_get_ucs2
 # define get_ucs4 librecode_get_ucs4
-# define hash_clear librecode_hash_clear
-# define hash_delete librecode_hash_delete
-# define hash_do_for_each librecode_hash_do_for_each
-# define hash_free librecode_hash_free
-# define hash_get_entries librecode_hash_get_entries
-# define hash_get_first librecode_hash_get_first
-# define hash_get_max_bucket_length librecode_hash_get_max_bucket_length
-# define hash_get_n_buckets librecode_hash_get_n_buckets
-# define hash_get_n_buckets_used librecode_hash_get_n_buckets_used
-# define hash_get_n_entries librecode_hash_get_n_entries
-# define hash_get_next librecode_hash_get_next
-# define hash_initialize librecode_hash_initialize
-# define hash_insert librecode_hash_insert
-# define hash_lookup librecode_hash_lookup
-# define hash_print_statistics librecode_hash_print_statistics
-# define hash_rehash librecode_hash_rehash
-# define hash_reset_tuning librecode_hash_reset_tuning
-# define hash_string librecode_hash_string
-# define hash_table_ok librecode_hash_table_ok
 # define init_combine librecode_init_combine
 # define init_explode librecode_init_explode
 # define init_ucs2_to_byte librecode_init_ucs2_to_byte
 # define list_all_symbols librecode_list_all_symbols
 # define list_concise_charset librecode_list_concise_charset
 # define list_full_charset librecode_list_full_charset
-# define locale_charset librecode_locale_charset
 # define make_argmatch_arrays librecode_make_argmatch_arrays
 # define module_african librecode_module_african
 # define module_afrtran librecode_module_afrtran
 # define ucs2_to_charname librecode_ucs2_to_charname
 # define ucs2_to_french_charname librecode_ucs2_to_french_charname
 # define ucs2_to_rfc1345 librecode_ucs2_to_rfc1345
-# define x2nrealloc librecode_x2nrealloc
-# define x2realloc librecode_x2realloc
-# define xalloc_die librecode_xalloc_die
-# define xcalloc librecode_xcalloc
-# define xmalloc librecode_xmalloc
-# define xmemdup librecode_xmemdup
-# define xnmalloc librecode_xnmalloc
-# define xnrealloc librecode_xnrealloc
-# define xrealloc librecode_xrealloc
-# define xstrdup librecode_xstrdup
-# define xzalloc librecode_xzalloc
 
 #endif /* ! CLEANER_H_ */
index 0fc0d02234d3a5b3a7528d7bca8f773b7de09c1e..b639d2895ab9594095abc5758d5b6d86e149361a 100644 (file)
@@ -8,38 +8,18 @@ AC_CONFIG_SRCDIR(src/recode.c)
 AC_CONFIG_AUX_DIR([build-aux])
 AM_INIT_AUTOMAKE
 AC_CONFIG_MACRO_DIR(m4)
+AC_CANONICAL_HOST
 
-AC_PROG_CC
+AC_PROG_CC_C99
 gl_EARLY
 LT_INIT
-AC_FUNC_ALLOCA
-AC_ISC_POSIX
-AC_C_CONST
-AC_C_INLINE
 AC_PROG_LEX
 gl_INIT
 
 AC_CONFIG_HEADERS([config.h])
 AC_HEADER_STDC
-AC_CHECK_HEADERS(limits.h locale.h memory.h stdbool.h stddef.h stdlib.h string.h unistd.h utime.h)
-AC_TYPE_SIGNAL
-jm_STRUCT_UTIMBUF
-
 AM_ICONV
 LIBS="$LIBICONV $LIBS"
-
-AC_CHECK_FUNCS(dup2 mbrtowc rename setlocale strerror strndup wcrtomb)
-AC_REPLACE_FUNCS(strtol strtoul)
-AC_FUNC_ALLOCA
-AC_FUNC_VPRINTF
-
-jm_FUNC_MALLOC
-jm_FUNC_REALLOC
-
-AC_CANONICAL_HOST
-jm_LANGINFO_CODESET
-jm_GLIBC21
-
 AM_WITH_DMALLOC
 
 AM_GNU_GETTEXT_VERSION(0.18)
index fe43616a0f6460a5a2c89f26023e37ef48e55fd5..eab421c1844777a0409c0c6046c03eb5aea6994e 100644 (file)
@@ -1,15 +1,41 @@
-/Makefile.gnulib
-/dummy.c
+/Makefile.am
 /_Noreturn.h
+/alloca.h
+/alloca.in.h
 /arg-nonnull.h
+/argmatch.c
+/argmatch.h
+/asnprintf.c
 /basename-lgpl.c
+/bitrotate.c
+/bitrotate.h
 /c++defs.h
+/c-ctype.c
+/c-ctype.h
+/c-strcase.h
+/c-strcasecmp.c
+/c-strcaseeq.h
+/c-strncasecmp.c
+/charset.alias
+/config.charset
+/configmake.h
 /dirname-lgpl.c
 /dirname.h
 /dosname.h
 /errno.in.h
 /error.c
 /error.h
+/exitfail.c
+/exitfail.h
+/filename.h
+/float+.h
+/float.c
+/float.in.h
+/fpucw.h
+/frexp.c
+/frexpl.c
+/fseterr.c
+/fseterr.h
 /getopt-cdefs.in.h
 /getopt-core.h
 /getopt-ext.h
 /getprogname.c
 /getprogname.h
 /gettext.h
+/hard-locale.c
+/hard-locale.h
+/hash.c
+/hash.h
 /intprops.h
+/isnan.c
+/isnand-nolibm.h
+/isnand.c
+/isnanf-nolibm.h
+/isnanf.c
+/isnanl-nolibm.h
+/isnanl.c
+/itold.c
+/limits.h
+/limits.in.h
+/localcharset.c
+/localcharset.h
 /malloc.c
+/malloca.c
+/malloca.h
+/malloca.valgrind
+/math.c
+/math.h
+/math.in.h
+/mbrtowc.c
+/mbsinit.c
+/memchr.c
+/memchr.valgrind
+/minmax.h
 /msvc-inval.c
 /msvc-inval.h
 /msvc-nothrow.c
 /msvc-nothrow.h
 /pathmax.h
+/pipe.c
+/printf-args.c
+/printf-args.h
+/printf-frexp.c
+/printf-frexp.h
+/printf-frexpl.c
+/printf-frexpl.h
+/printf-parse.c
+/printf-parse.h
+/quote.h
+/quotearg.c
+/quotearg.h
+/ref-add.sed
+/ref-add.sin
+/ref-del.sed
+/ref-del.sin
+/signbitd.c
+/signbitf.c
+/signbitl.c
+/size_max.h
 /stdbool.in.h
 /stddef.in.h
+/stdint.h
+/stdint.in.h
+/stdio-impl.h
 /stdio.h
 /stdio.in.h
 /stdlib.h
 /stdlib.in.h
+/streq.h
 /strerror-override.c
 /strerror-override.h
 /strerror.c
 /string.h
 /string.in.h
 /stripslash.c
+/strndup.c
+/strnlen.c
 /sys/types.h
 /sys_types.in.h
+/sys/wait.h
+/sys_wait.in.h
+/time.h
+/time.in.h
 /unistd.c
 /unistd.h
 /unistd.in.h
+/utime.c
+/utime.in.h
+/vasnprintf.c
+/vasnprintf.h
 /verify.h
+/vfprintf.c
+/vprintf.c
 /warn-on-use.h
-/Makefile.am
+/wchar.h
+/wchar.in.h
+/wctype-h.c
+/wctype.h
+/wctype.in.h
+/xalloc-die.c
+/xalloc-oversized.h
+/xalloc.h
+/xmalloc.c
+/xsize.c
+/xsize.h
index f47d553d6559eb82f95877c84a6ca8c031ad4697..0532e1054b1b41facd472601caa84b735cd86f9d 100644 (file)
@@ -23,9 +23,9 @@ lib_LTLIBRARIES = librecode.la
 man_MANS = recode.1
 include_HEADERS = recode.h recodext.h
 
-noinst_HEADERS = argmatch.h charname.h common.h decsteps.h exit.h exitfail.h \
-fr-charname.h hash.h inisteps.h iconvdecl.h quotearg.h rfc1345.h tersteps.h \
-xalloc.h $(H_FALLBACKS) $(H_SURFACES)
+noinst_HEADERS = charname.h common.h decsteps.h \
+fr-charname.h inisteps.h iconvdecl.h rfc1345.h tersteps.h \
+$(H_FALLBACKS) $(H_SURFACES)
 
 EXTRA_DIST = recodext.h.in stamp-steps stamp-strip \
 $(L_STEPS) mergelex.py $(MANS)
@@ -37,8 +37,6 @@ ebcdic.c ibmpc.c iconqnx.c lat1asci.c java.c mule.c strip-data.c \
 testdump.c ucs.c utf16.c utf7.c utf8.c varia.c vn.c \
 $(C_FALLBACKS) $(C_SURFACES) merged.c
 
-OLD_C_STEPS = next.c
-
 L_STEPS = ascilat1.l $(L_FALLBACKS) $(L_SURFACES)
 
 H_FALLBACKS =
@@ -52,9 +50,8 @@ L_SURFACES =
 recode_SOURCES = main.c freeze.c mixed.c
 recode_LDADD = librecode.la ../lib/libgnu.la
 
-librecode_la_SOURCES = argmatch.c charname.c combine.c exitfail.c \
-fr-charname.c hash.c iconv.c localcharset.c names.c outer.c quotearg.c \
-recode.c request.c strip-pool.c task.c xalloc-die.c xmalloc.c $(C_STEPS)
+librecode_la_SOURCES = charname.c combine.c fr-charname.c iconv.c \
+names.c outer.c recode.c request.c strip-pool.c task.c $(C_STEPS)
 librecode_la_LDFLAGS = -version-info 0:0:0
 
 # Relative to $(srcdir).
@@ -72,7 +69,6 @@ ETAGS_ARGS = $(L_STEPS)
 TAGS_DEPENDENCIES = $(L_STEPS)
 
 # These CFLAGS values are not auto-configured:
-# -DDIFF_HASH          For using GNU diff's hash algorithm instead.
 # -DHASH_STATS         For printing a one-liner hash statistics.
 
 LEX = @LEX@
@@ -122,9 +118,9 @@ stamp-steps: $(C_STEPS)
        @echo "Updating {dec,ini,ter}steps.h"
        @(cd $(srcdir) && grep -h '^module_' $(C_STEPS)) \
            | sed 's/ .*//' > liste.tmp
-       @sed 's/\(.*\)/bool \1 PARAMS ((struct recode_outer *));/' \
+       @sed 's/\(.*\)/bool \1 (struct recode_outer *);/' \
            liste.tmp > decsteps.tmp
-       @sed 's/\(.*\)/void del\1 PARAMS ((struct recode_outer *));/' \
+       @sed 's/\(.*\)/void del\1 (struct recode_outer *);/' \
            liste.tmp >> decsteps.tmp
        @sed 's/\(.*\)/  if (!\1 (outer)) return false;/' \
            liste.tmp > inisteps.tmp
diff --git a/src/ansi2knr.1 b/src/ansi2knr.1
deleted file mode 100644 (file)
index f9ee5a6..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-.TH ANSI2KNR 1 "19 Jan 1996"
-.SH NAME
-ansi2knr \- convert ANSI C to Kernighan & Ritchie C
-.SH SYNOPSIS
-.I ansi2knr
-[--varargs] input_file [output_file]
-.SH DESCRIPTION
-If no output_file is supplied, output goes to stdout.
-.br
-There are no error messages.
-.sp
-.I ansi2knr
-recognizes function definitions by seeing a non-keyword identifier at the left
-margin, followed by a left parenthesis, with a right parenthesis as the last
-character on the line, and with a left brace as the first token on the
-following line (ignoring possible intervening comments).  It will recognize a
-multi-line header provided that no intervening line ends with a left or right
-brace or a semicolon.  These algorithms ignore whitespace and comments, except
-that the function name must be the first thing on the line.
-.sp
-The following constructs will confuse it:
-.br
-     - Any other construct that starts at the left margin and follows the
-above syntax (such as a macro or function call).
-.br
-     - Some macros that tinker with the syntax of the function header.
-.sp
-The --varargs switch is obsolete, and is recognized only for
-backwards compatibility.  The present version of
-.I ansi2knr
-will always attempt to convert a ... argument to va_alist and va_dcl.
-.SH AUTHOR
-L. Peter Deutsch <ghost@aladdin.com> wrote the original ansi2knr and
-continues to maintain the current version; most of the code in the current
-version is his work.  ansi2knr also includes contributions by Francois
-Pinard <pinard@iro.umontreal.ca> and Jim Avera <jima@netcom.com>.
diff --git a/src/ansi2knr.c b/src/ansi2knr.c
deleted file mode 100644 (file)
index a042674..0000000
+++ /dev/null
@@ -1,739 +0,0 @@
-/* Copyright (C) 1989, 2000 Aladdin Enterprises.  All rights reserved. */
-
-/*$Id: ansi2knr.c,v 1.3 2000/04/13 03:41:48 lpd Exp $*/
-/* Convert ANSI C function definitions to K&R ("traditional C") syntax */
-
-/*
-ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY.  No author or distributor accepts responsibility to anyone for the
-consequences of using it or for whether it serves any particular purpose or
-works at all, unless he says so in writing.  Refer to the GNU General Public
-License (the "GPL") for full details.
-
-Everyone is granted permission to copy, modify and redistribute ansi2knr,
-but only under the conditions described in the GPL.  A copy of this license
-is supposed to have been given to you along with ansi2knr so you can know
-your rights and responsibilities.  It should be in a file named COPYLEFT,
-or, if there is no file named COPYLEFT, a file named COPYING.  Among other
-things, the copyright notice and this notice must be preserved on all
-copies.
-
-We explicitly state here what we believe is already implied by the GPL: if
-the ansi2knr program is distributed as a separate set of sources and a
-separate executable file which are aggregated on a storage medium together
-with another program, this in itself does not bring the other program under
-the GPL, nor does the mere fact that such a program or the procedures for
-constructing it invoke the ansi2knr executable bring any other part of the
-program under the GPL.
-*/
-
-/*
- * Usage:
-       ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]
- * --filename provides the file name for the #line directive in the output,
- * overriding input_file (if present).
- * If no input_file is supplied, input is read from stdin.
- * If no output_file is supplied, output goes to stdout.
- * There are no error messages.
- *
- * ansi2knr recognizes function definitions by seeing a non-keyword
- * identifier at the left margin, followed by a left parenthesis, with a
- * right parenthesis as the last character on the line, and with a left
- * brace as the first token on the following line (ignoring possible
- * intervening comments and/or preprocessor directives), except that a line
- * consisting of only
- *     identifier1(identifier2)
- * will not be considered a function definition unless identifier2 is
- * the word "void", and a line consisting of
- *     identifier1(identifier2, <<arbitrary>>)
- * will not be considered a function definition.
- * ansi2knr will recognize a multi-line header provided that no intervening
- * line ends with a left or right brace or a semicolon.  These algorithms
- * ignore whitespace, comments, and preprocessor directives, except that
- * the function name must be the first thing on the line.  The following
- * constructs will confuse it:
- *     - Any other construct that starts at the left margin and
- *         follows the above syntax (such as a macro or function call).
- *     - Some macros that tinker with the syntax of function headers.
- */
-
-/*
- * The original and principal author of ansi2knr is L. Peter Deutsch
- * <ghost@aladdin.com>.  Other authors are noted in the change history
- * that follows (in reverse chronological order):
-
-       lpd 2000-04-12 backs out Eggert's changes because of bugs:
-       - concatlits didn't declare the type of its bufend argument;
-       - concatlits didn't recognize when it was inside a comment;
-       - scanstring could scan backward past the beginning of the string; when
-       - the check for \ + newline in scanstring was unnecessary.
-
-       2000-03-05  Paul Eggert  <eggert@twinsun.com>
-
-       Add support for concatenated string literals.
-       * ansi2knr.c (concatlits): New decl.
-       (main): Invoke concatlits to concatenate string literals.
-       (scanstring): Handle backslash-newline correctly.  Work with
-       character constants.  Fix bug when scanning backwards through
-       backslash-quote.  Check for unterminated strings.
-       (convert1): Parse character constants, too.
-       (appendline, concatlits): New functions.
-       * ansi2knr.1: Document this.
-
-       lpd 1999-08-17 added code to allow preprocessor directives
-               wherever comments are allowed
-       lpd 1999-04-12 added minor fixes from Pavel Roskin
-               <pavel_roskin@geocities.com> for clean compilation with
-               gcc -W -Wall
-       lpd 1999-03-22 added hack to recognize lines consisting of
-               identifier1(identifier2, xxx) as *not* being procedures
-       lpd 1999-02-03 made indentation of preprocessor commands consistent
-       lpd 1999-01-28 fixed two bugs: a '/' in an argument list caused an
-               endless loop; quoted strings within an argument list
-               confused the parser
-       lpd 1999-01-24 added a check for write errors on the output,
-               suggested by Jim Meyering <meyering@ascend.com>
-       lpd 1998-11-09 added further hack to recognize identifier(void)
-               as being a procedure
-       lpd 1998-10-23 added hack to recognize lines consisting of
-               identifier1(identifier2) as *not* being procedures
-       lpd 1997-12-08 made input_file optional; only closes input and/or
-               output file if not stdin or stdout respectively; prints
-               usage message on stderr rather than stdout; adds
-               --filename switch (changes suggested by
-               <ceder@lysator.liu.se>)
-       lpd 1996-01-21 added code to cope with not HAVE_CONFIG_H and with
-               compilers that don't understand void, as suggested by
-               Tom Lane
-       lpd 1996-01-15 changed to require that the first non-comment token
-               on the line following a function header be a left brace,
-               to reduce sensitivity to macros, as suggested by Tom Lane
-               <tgl@sss.pgh.pa.us>
-       lpd 1995-06-22 removed #ifndefs whose sole purpose was to define
-               undefined preprocessor symbols as 0; changed all #ifdefs
-               for configuration symbols to #ifs
-       lpd 1995-04-05 changed copyright notice to make it clear that
-               including ansi2knr in a program does not bring the entire
-               program under the GPL
-       lpd 1994-12-18 added conditionals for systems where ctype macros
-               don't handle 8-bit characters properly, suggested by
-               Francois Pinard <pinard@iro.umontreal.ca>;
-               removed --varargs switch (this is now the default)
-       lpd 1994-10-10 removed CONFIG_BROKETS conditional
-       lpd 1994-07-16 added some conditionals to help GNU `configure',
-               suggested by Francois Pinard <pinard@iro.umontreal.ca>;
-               properly erase prototype args in function parameters,
-               contributed by Jim Avera <jima@netcom.com>;
-               correct error in writeblanks (it shouldn't erase EOLs)
-       lpd 1989-xx-xx original version
- */
-
-/* Most of the conditionals here are to make ansi2knr work with */
-/* or without the GNU configure machinery. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-
-#if HAVE_CONFIG_H
-
-/*
-   For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h).
-   This will define HAVE_CONFIG_H and so, activate the following lines.
- */
-
-# if STDC_HEADERS || HAVE_STRING_H
-#  include <string.h>
-# else
-#  include <strings.h>
-# endif
-
-#else /* not HAVE_CONFIG_H */
-
-/* Otherwise do it the hard way */
-
-# ifdef BSD
-#  include <strings.h>
-# else
-#  ifdef VMS
-    extern int strlen(), strncmp();
-#  else
-#   include <string.h>
-#  endif
-# endif
-
-#endif /* not HAVE_CONFIG_H */
-
-#if STDC_HEADERS
-# include <stdlib.h>
-#else
-/*
-   malloc and free should be declared in stdlib.h,
-   but if you've got a K&R compiler, they probably aren't.
- */
-# ifdef MSDOS
-#  include <malloc.h>
-# else
-#  ifdef VMS
-     extern char *malloc();
-     extern void free();
-#  else
-     extern char *malloc();
-     extern int free();
-#  endif
-# endif
-
-#endif
-
-/* Define NULL (for *very* old compilers). */
-#ifndef NULL
-# define NULL (0)
-#endif
-
-/*
- * The ctype macros don't always handle 8-bit characters correctly.
- * Compensate for this here.
- */
-#ifdef isascii
-# undef HAVE_ISASCII           /* just in case */
-# define HAVE_ISASCII 1
-#else
-#endif
-#if STDC_HEADERS || !HAVE_ISASCII
-# define is_ascii(c) 1
-#else
-# define is_ascii(c) isascii(c)
-#endif
-
-#define is_space(c) (is_ascii(c) && isspace(c))
-#define is_alpha(c) (is_ascii(c) && isalpha(c))
-#define is_alnum(c) (is_ascii(c) && isalnum(c))
-
-/* Scanning macros */
-#define isidchar(ch) (is_alnum(ch) || (ch) == '_')
-#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_')
-
-/* Forward references */
-char *ppdirforward();
-char *ppdirbackward();
-char *skipspace();
-char *scanstring();
-int writeblanks();
-int test1();
-int convert1();
-
-/* The main program */
-int
-main(argc, argv)
-    int argc;
-    char *argv[];
-{      FILE *in = stdin;
-       FILE *out = stdout;
-       char *filename = 0;
-       char *program_name = argv[0];
-       char *output_name = 0;
-#define bufsize 5000                   /* arbitrary size */
-       char *buf;
-       char *line;
-       char *more;
-       char *usage =
-         "Usage: ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]\n";
-       /*
-        * In previous versions, ansi2knr recognized a --varargs switch.
-        * If this switch was supplied, ansi2knr would attempt to convert
-        * a ... argument to va_alist and va_dcl; if this switch was not
-        * supplied, ansi2knr would simply drop any such arguments.
-        * Now, ansi2knr always does this conversion, and we only
-        * check for this switch for backward compatibility.
-        */
-       int convert_varargs = 1;
-       int output_error;
-
-       while ( argc > 1 && argv[1][0] == '-' ) {
-         if ( !strcmp(argv[1], "--varargs") ) {
-           convert_varargs = 1;
-           argc--;
-           argv++;
-           continue;
-         }
-         if ( !strcmp(argv[1], "--filename") && argc > 2 ) {
-           filename = argv[2];
-           argc -= 2;
-           argv += 2;
-           continue;
-         }
-         fprintf(stderr, "%s: Unrecognized switch: %s\n", program_name,
-                 argv[1]);
-         fprintf(stderr, usage);
-         exit(1);
-       }
-       switch ( argc )
-          {
-       default:
-               fprintf(stderr, usage);
-               exit(0);
-       case 3:
-               output_name = argv[2];
-               out = fopen(output_name, "w");
-               if ( out == NULL ) {
-                 fprintf(stderr, "%s: Cannot open output file %s\n",
-                         program_name, output_name);
-                 exit(1);
-               }
-               /* falls through */
-       case 2:
-               in = fopen(argv[1], "r");
-               if ( in == NULL ) {
-                 fprintf(stderr, "%s: Cannot open input file %s\n",
-                         program_name, argv[1]);
-                 exit(1);
-               }
-               if ( filename == 0 )
-                 filename = argv[1];
-               /* falls through */
-       case 1:
-               break;
-          }
-       if ( filename )
-         fprintf(out, "#line 1 \"%s\"\n", filename);
-       buf = malloc(bufsize);
-       if ( buf == NULL )
-          {
-               fprintf(stderr, "Unable to allocate read buffer!\n");
-               exit(1);
-          }
-       line = buf;
-       while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL )
-          {
-test:          line += strlen(line);
-               switch ( test1(buf) )
-                  {
-               case 2:                 /* a function header */
-                       convert1(buf, out, 1, convert_varargs);
-                       break;
-               case 1:                 /* a function */
-                       /* Check for a { at the start of the next line. */
-                       more = ++line;
-f:                     if ( line >= buf + (bufsize - 1) ) /* overflow check */
-                         goto wl;
-                       if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL )
-                         goto wl;
-                       switch ( *skipspace(ppdirforward(more), 1) )
-                         {
-                         case '{':
-                           /* Definitely a function header. */
-                           convert1(buf, out, 0, convert_varargs);
-                           fputs(more, out);
-                           break;
-                         case 0:
-                           /* The next line was blank or a comment: */
-                           /* keep scanning for a non-comment. */
-                           line += strlen(line);
-                           goto f;
-                         default:
-                           /* buf isn't a function header, but */
-                           /* more might be. */
-                           fputs(buf, out);
-                           strcpy(buf, more);
-                           line = buf;
-                           goto test;
-                         }
-                       break;
-               case -1:                /* maybe the start of a function */
-                       if ( line != buf + (bufsize - 1) ) /* overflow check */
-                         continue;
-                       /* falls through */
-               default:                /* not a function */
-wl:                    fputs(buf, out);
-                       break;
-                  }
-               line = buf;
-          }
-       if ( line != buf )
-         fputs(buf, out);
-       free(buf);
-       if ( output_name ) {
-         output_error = ferror(out);
-         output_error |= fclose(out);
-       } else {                /* out == stdout */
-         fflush(out);
-         output_error = ferror(out);
-       }
-       if ( output_error ) {
-         fprintf(stderr, "%s: error writing to %s\n", program_name,
-                 (output_name ? output_name : "stdout"));
-         exit(1);
-       }
-       if ( in != stdin )
-         fclose(in);
-       return 0;
-}
-
-/*
- * Skip forward or backward over one or more preprocessor directives.
- */
-char *
-ppdirforward(p)
-    char *p;
-{
-    for (; *p == '#'; ++p) {
-       for (; *p != '\r' && *p != '\n'; ++p)
-           if (*p == 0)
-               return p;
-       if (*p == '\r' && p[1] == '\n')
-           ++p;
-    }
-    return p;
-}
-char *
-ppdirbackward(p, limit)
-    char *p;
-    char *limit;
-{
-    char *np = p;
-
-    for (;; p = --np) {
-       if (*np == '\n' && np[-1] == '\r')
-           --np;
-       for (; np > limit && np[-1] != '\r' && np[-1] != '\n'; --np)
-           if (np[-1] == 0)
-               return np;
-       if (*np != '#')
-           return p;
-    }
-}
-
-/*
- * Skip over whitespace, comments, and preprocessor directives,
- * in either direction.
- */
-char *
-skipspace(p, dir)
-    char *p;
-    int dir;                   /* 1 for forward, -1 for backward */
-{
-    for ( ; ; ) {
-       while ( is_space(*p) )
-           p += dir;
-       if ( !(*p == '/' && p[dir] == '*') )
-           break;
-       p += dir;  p += dir;
-       while ( !(*p == '*' && p[dir] == '/') ) {
-           if ( *p == 0 )
-               return p;       /* multi-line comment?? */
-           p += dir;
-       }
-       p += dir;  p += dir;
-    }
-    return p;
-}
-
-/* Scan over a quoted string, in either direction. */
-char *
-scanstring(p, dir)
-    char *p;
-    int dir;
-{
-    for (p += dir; ; p += dir)
-       if (*p == '"' && p[-dir] != '\\')
-           return p + dir;
-}
-
-/*
- * Write blanks over part of a string.
- * Don't overwrite end-of-line characters.
- */
-int
-writeblanks(start, end)
-    char *start;
-    char *end;
-{      char *p;
-       for ( p = start; p < end; p++ )
-         if ( *p != '\r' && *p != '\n' )
-           *p = ' ';
-       return 0;
-}
-
-/*
- * Test whether the string in buf is a function definition.
- * The string may contain and/or end with a newline.
- * Return as follows:
- *     0 - definitely not a function definition;
- *     1 - definitely a function definition;
- *     2 - definitely a function prototype (NOT USED);
- *     -1 - may be the beginning of a function definition,
- *             append another line and look again.
- * The reason we don't attempt to convert function prototypes is that
- * Ghostscript's declaration-generating macros look too much like
- * prototypes, and confuse the algorithms.
- */
-int
-test1(buf)
-    char *buf;
-{      char *p = buf;
-       char *bend;
-       char *endfn;
-       int contin;
-
-       if ( !isidfirstchar(*p) )
-         return 0;             /* no name at left margin */
-       bend = skipspace(ppdirbackward(buf + strlen(buf) - 1, buf), -1);
-       switch ( *bend )
-          {
-          case ';': contin = 0 /*2*/; break;
-          case ')': contin = 1; break;
-          case '{': return 0;          /* not a function */
-          case '}': return 0;          /* not a function */
-          default: contin = -1;
-          }
-       while ( isidchar(*p) )
-         p++;
-       endfn = p;
-       p = skipspace(p, 1);
-       if ( *p++ != '(' )
-         return 0;             /* not a function */
-       p = skipspace(p, 1);
-       if ( *p == ')' )
-         return 0;             /* no parameters */
-       /* Check that the apparent function name isn't a keyword. */
-       /* We only need to check for keywords that could be followed */
-       /* by a left parenthesis (which, unfortunately, is most of them). */
-          {    static char *words[] =
-                  {    "asm", "auto", "case", "char", "const", "double",
-                       "extern", "float", "for", "if", "int", "long",
-                       "register", "return", "short", "signed", "sizeof",
-                       "static", "switch", "typedef", "unsigned",
-                       "void", "volatile", "while", 0
-                  };
-               char **key = words;
-               char *kp;
-               unsigned len = endfn - buf;
-
-               while ( (kp = *key) != 0 )
-                  {    if ( strlen(kp) == len && !strncmp(kp, buf, len) )
-                         return 0;     /* name is a keyword */
-                       key++;
-                  }
-          }
-          {
-              char *id = p;
-              int len;
-              /*
-               * Check for identifier1(identifier2) and not
-               * identifier1(void), or identifier1(identifier2, xxxx).
-               */
-
-              while ( isidchar(*p) )
-                  p++;
-              len = p - id;
-              p = skipspace(p, 1);
-              if (*p == ',' ||
-                  (*p == ')' && (len != 4 || strncmp(id, "void", 4)))
-                  )
-                  return 0;    /* not a function */
-          }
-       /*
-        * If the last significant character was a ), we need to count
-        * parentheses, because it might be part of a formal parameter
-        * that is a procedure.
-        */
-       if (contin > 0) {
-           int level = 0;
-
-           for (p = skipspace(buf, 1); *p; p = skipspace(p + 1, 1))
-               level += (*p == '(' ? 1 : *p == ')' ? -1 : 0);
-           if (level > 0)
-               contin = -1;
-       }
-       return contin;
-}
-
-/* Convert a recognized function definition or header to K&R syntax. */
-int
-convert1(buf, out, header, convert_varargs)
-    char *buf;
-    FILE *out;
-    int header;                        /* Boolean */
-    int convert_varargs;       /* Boolean */
-{      char *endfn;
-       char *p;
-       /*
-        * The breaks table contains pointers to the beginning and end
-        * of each argument.
-        */
-       char **breaks;
-       unsigned num_breaks = 2;        /* for testing */
-       char **btop;
-       char **bp;
-       char **ap;
-       char *vararg = 0;
-
-       /* Pre-ANSI implementations don't agree on whether strchr */
-       /* is called strchr or index, so we open-code it here. */
-       for ( endfn = buf; *(endfn++) != '('; )
-         ;
-top:   p = endfn;
-       breaks = (char **)malloc(sizeof(char *) * num_breaks * 2);
-       if ( breaks == NULL )
-          {    /* Couldn't allocate break table, give up */
-               fprintf(stderr, "Unable to allocate break table!\n");
-               fputs(buf, out);
-               return -1;
-          }
-       btop = breaks + num_breaks * 2 - 2;
-       bp = breaks;
-       /* Parse the argument list */
-       do
-          {    int level = 0;
-               char *lp = NULL;
-               char *rp = NULL;
-               char *end = NULL;
-
-               if ( bp >= btop )
-                  {    /* Filled up break table. */
-                       /* Allocate a bigger one and start over. */
-                       free((char *)breaks);
-                       num_breaks <<= 1;
-                       goto top;
-                  }
-               *bp++ = p;
-               /* Find the end of the argument */
-               for ( ; end == NULL; p++ )
-                  {    switch(*p)
-                          {
-                          case ',':
-                               if ( !level ) end = p;
-                               break;
-                          case '(':
-                               if ( !level ) lp = p;
-                               level++;
-                               break;
-                          case ')':
-                               if ( --level < 0 ) end = p;
-                               else rp = p;
-                               break;
-                          case '/':
-                               if (p[1] == '*')
-                                   p = skipspace(p, 1) - 1;
-                               break;
-                          case '"':
-                              p = scanstring(p, 1) - 1;
-                              break;
-                          default:
-                               ;
-                          }
-                  }
-               /* Erase any embedded prototype parameters. */
-               if ( lp && rp )
-                 writeblanks(lp + 1, rp);
-               p--;                    /* back up over terminator */
-               /* Find the name being declared. */
-               /* This is complicated because of procedure and */
-               /* array modifiers. */
-               for ( ; ; )
-                  {    p = skipspace(p - 1, -1);
-                       switch ( *p )
-                          {
-                          case ']':    /* skip array dimension(s) */
-                          case ')':    /* skip procedure args OR name */
-                          {    int level = 1;
-                               while ( level )
-                                switch ( *--p )
-                                  {
-                                  case ']': case ')':
-                                      level++;
-                                      break;
-                                  case '[': case '(':
-                                      level--;
-                                      break;
-                                  case '/':
-                                      if (p > buf && p[-1] == '*')
-                                          p = skipspace(p, -1) + 1;
-                                      break;
-                                  case '"':
-                                      p = scanstring(p, -1) + 1;
-                                      break;
-                                  default: ;
-                                  }
-                          }
-                               if ( *p == '(' && *skipspace(p + 1, 1) == '*' )
-                                  {    /* We found the name being declared */
-                                       while ( !isidfirstchar(*p) )
-                                         p = skipspace(p, 1) + 1;
-                                       goto found;
-                                  }
-                               break;
-                          default:
-                               goto found;
-                          }
-                  }
-found:         if ( *p == '.' && p[-1] == '.' && p[-2] == '.' )
-                 {     if ( convert_varargs )
-                         {     *bp++ = "va_alist";
-                               vararg = p-2;
-                         }
-                       else
-                         {     p++;
-                               if ( bp == breaks + 1 ) /* sole argument */
-                                 writeblanks(breaks[0], p);
-                               else
-                                 writeblanks(bp[-1] - 1, p);
-                               bp--;
-                         }
-                  }
-               else
-                  {    while ( isidchar(*p) ) p--;
-                       *bp++ = p+1;
-                  }
-               p = end;
-          }
-       while ( *p++ == ',' );
-       *bp = p;
-       /* Make a special check for 'void' arglist */
-       if ( bp == breaks+2 )
-          {    p = skipspace(breaks[0], 1);
-               if ( !strncmp(p, "void", 4) )
-                  {    p = skipspace(p+4, 1);
-                       if ( p == breaks[2] - 1 )
-                          {    bp = breaks;    /* yup, pretend arglist is empty */
-                               writeblanks(breaks[0], p + 1);
-                          }
-                  }
-          }
-       /* Put out the function name and left parenthesis. */
-       p = buf;
-       while ( p != endfn ) putc(*p, out), p++;
-       /* Put out the declaration. */
-       if ( header )
-         {     fputs(");", out);
-               for ( p = breaks[0]; *p; p++ )
-                 if ( *p == '\r' || *p == '\n' )
-                   putc(*p, out);
-         }
-       else
-         {     for ( ap = breaks+1; ap < bp; ap += 2 )
-                 {     p = *ap;
-                       while ( isidchar(*p) )
-                         putc(*p, out), p++;
-                       if ( ap < bp - 1 )
-                         fputs(", ", out);
-                 }
-               fputs(")  ", out);
-               /* Put out the argument declarations */
-               for ( ap = breaks+2; ap <= bp; ap += 2 )
-                 (*ap)[-1] = ';';
-               if ( vararg != 0 )
-                 {     *vararg = 0;
-                       fputs(breaks[0], out);          /* any prior args */
-                       fputs("va_dcl", out);           /* the final arg */
-                       fputs(bp[0], out);
-                 }
-               else
-                 fputs(breaks[0], out);
-         }
-       free((char *)breaks);
-       return 0;
-}
diff --git a/src/argmatch.c b/src/argmatch.c
deleted file mode 100644 (file)
index 9642706..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-/* argmatch.c -- find a match for a string in an array
-   Copyright (C) 1990, 1998, 1999 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-/* Written by David MacKenzie <djm@ai.mit.edu>
-   Modified by Akim Demaille <demaille@inf.enst.fr> */
-
-#include "argmatch.h"
-
-#include <stdio.h>
-#ifdef STDC_HEADERS
-# include <string.h>
-#endif
-
-#if HAVE_LOCALE_H
-# include <locale.h>
-#endif
-
-#if ENABLE_NLS
-# include <libintl.h>
-# define _(Text) gettext (Text)
-#else
-# define _(Text) Text
-#endif
-
-#include "error.h"
-#include "quotearg.h"
-
-/* When reporting an invalid argument, show nonprinting characters
-   by using the quoting style ARGMATCH_QUOTING_STYLE.  Do not use
-   literal_quoting_style.  */
-#ifndef ARGMATCH_QUOTING_STYLE
-# define ARGMATCH_QUOTING_STYLE locale_quoting_style
-#endif
-
-/* The following test is to work around the gross typo in
-   systems like Sony NEWS-OS Release 4.0C, whereby EXIT_FAILURE
-   is defined to 0, not 1.  */
-#if !EXIT_FAILURE
-# undef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
-
-/* Non failing version of argmatch call this function after failing. */
-#ifndef ARGMATCH_DIE
-# define ARGMATCH_DIE exit (EXIT_FAILURE)
-#endif
-
-#ifdef ARGMATCH_DIE_DECL
-ARGMATCH_DIE_DECL;
-#endif
-
-static void
-__argmatch_die (void)
-{
-  ARGMATCH_DIE;
-}
-
-/* Used by XARGMATCH and XARGCASEMATCH.  See description in argmatch.h.
-   Default to __argmatch_die, but allow caller to change this at run-time. */
-argmatch_exit_fn argmatch_die = __argmatch_die;
-
-\f
-/* If ARG is an unambiguous match for an element of the
-   null-terminated array ARGLIST, return the index in ARGLIST
-   of the matched element, else -1 if it does not match any element
-   or -2 if it is ambiguous (is a prefix of more than one element).
-   If SENSITIVE, comparison is case sensitive.
-
-   If VALLIST is none null, use it to resolve ambiguities limited to
-   synonyms, i.e., for
-     "yes", "yop" -> 0
-     "no", "nope" -> 1
-   "y" is a valid argument, for `0', and "n" for `1'.  */
-
-static int
-__argmatch_internal (const char *arg, const char *const *arglist,
-                    const char *vallist, size_t valsize,
-                    int case_sensitive)
-{
-  int i;                       /* Temporary index in ARGLIST.  */
-  size_t arglen;               /* Length of ARG.  */
-  int matchind = -1;           /* Index of first nonexact match.  */
-  int ambiguous = 0;           /* If nonzero, multiple nonexact match(es).  */
-
-  arglen = strlen (arg);
-
-  /* Test all elements for either exact match or abbreviated matches.  */
-  for (i = 0; arglist[i]; i++)
-    {
-      if (case_sensitive
-         ? !strncmp (arglist[i], arg, arglen)
-         : !strncasecmp (arglist[i], arg, arglen))
-       {
-         if (strlen (arglist[i]) == arglen)
-           /* Exact match found.  */
-           return i;
-         else if (matchind == -1)
-           /* First nonexact match found.  */
-           matchind = i;
-         else
-           {
-             /* Second nonexact match found.  */
-             if (vallist == NULL
-                 || memcmp (vallist + valsize * matchind,
-                            vallist + valsize * i, valsize))
-               {
-                 /* There is a real ambiguity, or we could not
-                    disambiguate. */
-                 ambiguous = 1;
-               }
-           }
-       }
-    }
-  if (ambiguous)
-    return -2;
-  else
-    return matchind;
-}
-
-/* argmatch - case sensitive version */
-int
-argmatch (const char *arg, const char *const *arglist,
-         const char *vallist, size_t valsize)
-{
-  return __argmatch_internal (arg, arglist, vallist, valsize, 1);
-}
-
-/* argcasematch - case insensitive version */
-int
-argcasematch (const char *arg, const char *const *arglist,
-             const char *vallist, size_t valsize)
-{
-  return __argmatch_internal (arg, arglist, vallist, valsize, 0);
-}
-
-/* Error reporting for argmatch.
-   CONTEXT is a description of the type of entity that was being matched.
-   VALUE is the invalid value that was given.
-   PROBLEM is the return value from argmatch.  */
-
-void
-argmatch_invalid (const char *context, const char *value, int problem)
-{
-  char const *format = (problem == -1
-                       ? _("invalid argument %s for `%s'")
-                       : _("ambiguous argument %s for `%s'"));
-
-  error (0, 0, format, quotearg_style (ARGMATCH_QUOTING_STYLE, value), context);
-}
-
-/* List the valid arguments for argmatch.
-   ARGLIST is the same as in argmatch.
-   VALLIST is a pointer to an array of values.
-   VALSIZE is the size of the elements of VALLIST */
-void
-argmatch_valid (const char *const *arglist,
-               const char *vallist, size_t valsize)
-{
-  int i;
-  const char *last_val = NULL;
-
-  /* We try to put synonyms on the same line.  The assumption is that
-     synonyms follow each other */
-  fprintf (stderr, _("Valid arguments are:"));
-  for (i = 0; arglist[i]; i++)
-    if ((i == 0)
-       || memcmp (last_val, vallist + valsize * i, valsize))
-      {
-       fprintf (stderr, "\n  - `%s'", arglist[i]);
-       last_val = vallist + valsize * i;
-      }
-    else
-      {
-       fprintf (stderr, ", `%s'", arglist[i]);
-      }
-  putc ('\n', stderr);
-}
-
-/* Never failing versions of the previous functions.
-
-   CONTEXT is the context for which argmatch is called (e.g.,
-   "--version-control", or "$VERSION_CONTROL" etc.).  Upon failure,
-   calls the (supposed never to return) function EXIT_FN. */
-
-int
-__xargmatch_internal (const char *context,
-                     const char *arg, const char *const *arglist,
-                     const char *vallist, size_t valsize,
-                     int case_sensitive,
-                     argmatch_exit_fn exit_fn)
-{
-  int res = __argmatch_internal (arg, arglist,
-                                vallist, valsize,
-                                case_sensitive);
-  if (res >= 0)
-    /* Success. */
-    return res;
-
-  /* We failed.  Explain why. */
-  argmatch_invalid (context, arg, res);
-  argmatch_valid (arglist, vallist, valsize);
-  (*exit_fn) ();
-
-  return -1; /* To please the compilers. */
-}
-
-/* Look for VALUE in VALLIST, an array of objects of size VALSIZE and
-   return the first corresponding argument in ARGLIST */
-const char *
-argmatch_to_argument (const char *value,
-                     const char *const *arglist,
-                     const char *vallist, size_t valsize)
-{
-  int i;
-
-  for (i = 0; arglist[i]; i++)
-    if (!memcmp (value, vallist + valsize * i, valsize))
-      return arglist[i];
-  return NULL;
-}
-
-#ifdef TEST
-/*
- * Based on "getversion.c" by David MacKenzie <djm@gnu.ai.mit.edu>
- */
-char *program_name;
-extern const char *getenv ();
-
-/* When to make backup files.  */
-enum backup_type
-{
-  /* Never make backups.  */
-  none,
-
-  /* Make simple backups of every file.  */
-  simple,
-
-  /* Make numbered backups of files that already have numbered backups,
-     and simple backups of the others.  */
-  numbered_existing,
-
-  /* Make numbered backups of every file.  */
-  numbered
-};
-
-/* Two tables describing arguments (keys) and their corresponding
-   values */
-static const char *const backup_args[] =
-{
-  "no", "none", "off",
-  "simple", "never",
-  "existing", "nil",
-  "numbered", "t",
-  0
-};
-
-static const enum backup_type backup_vals[] =
-{
-  none, none, none,
-  simple, simple,
-  numbered_existing, numbered_existing,
-  numbered, numbered
-};
-
-int
-main (int argc, const char *const *argv)
-{
-  const char *cp;
-  enum backup_type backup_type = none;
-
-  program_name = (char *) argv[0];
-
-  if (argc > 2)
-    {
-      fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", program_name);
-      exit (1);
-    }
-
-  if ((cp = getenv ("VERSION_CONTROL")))
-    backup_type = XARGCASEMATCH ("$VERSION_CONTROL", cp,
-                                backup_args, backup_vals);
-
-  if (argc == 2)
-    backup_type = XARGCASEMATCH (program_name, argv[1],
-                                backup_args, backup_vals);
-
-  printf ("The version control is `%s'\n",
-         ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));
-
-  return 0;
-}
-#endif
diff --git a/src/argmatch.h b/src/argmatch.h
deleted file mode 100644 (file)
index d3f25cc..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-/* argmatch.h -- definitions and prototypes for argmatch.c
-   Copyright (C) 1990, 1998, 1999 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-/* Written by David MacKenzie <djm@ai.mit.edu>
-   Modified by Akim Demaille <demaille@inf.enst.fr> */
-
-#ifndef ARGMATCH_H_
-# define ARGMATCH_H_ 1
-
-# if HAVE_CONFIG_H
-#  include <config.h>
-# endif
-
-# include <sys/types.h>
-
-# ifndef PARAMS
-#  if PROTOTYPES || (defined (__STDC__) && __STDC__)
-#   define PARAMS(args) args
-#  else
-#   define PARAMS(args) ()
-#  endif  /* GCC.  */
-# endif  /* Not PARAMS.  */
-
-/* Assert there are as many real arguments as there are values
-   (argument list ends with a NULL guard).  There is no execution
-   cost, since it will be statically evalauted to `assert (0)' or
-   `assert (1)'.  Unfortunately there is no -Wassert-0. */
-
-# undef ARRAY_CARDINALITY
-# define ARRAY_CARDINALITY(Array) (sizeof ((Array)) / sizeof (*(Array)))
-
-# define ARGMATCH_ASSERT(Arglist, Vallist)      \
-  assert (ARRAY_CARDINALITY ((Arglist)) == ARRAY_CARDINALITY ((Vallist)) + 1)
-
-/* Return the index of the element of ARGLIST (NULL terminated) that
-   matches with ARG.  If VALLIST is not NULL, then use it to resolve
-   false ambiguities (i.e., different matches of ARG but corresponding
-   to the same values in VALLIST).  */
-
-int argmatch
-  PARAMS ((const char *arg, const char *const *arglist,
-          const char *vallist, size_t valsize));
-int argcasematch
-  PARAMS ((const char *arg, const char *const *arglist,
-          const char *vallist, size_t valsize));
-
-# define ARGMATCH(Arg, Arglist, Vallist) \
-  argmatch ((Arg), (Arglist), (const char *) (Vallist), sizeof (*(Vallist)))
-
-# define ARGCASEMATCH(Arg, Arglist, Vallist) \
-  argcasematch ((Arg), (Arglist), (const char *) (Vallist), sizeof (*(Vallist)))
-
-/* xargmatch calls this function when it fails.  This function should not
-   return.  By default, this is a function that calls ARGMATCH_DIE which
-   in turn defaults to `exit (EXIT_FAILURE)'.  */
-typedef void (*argmatch_exit_fn) PARAMS ((void));
-extern argmatch_exit_fn argmatch_die;
-
-/* Report on stderr why argmatch failed.  Report correct values. */
-
-void argmatch_invalid
-  PARAMS ((const char *context, const char *value, int problem));
-
-/* Left for compatibility with the old name invalid_arg */
-
-# define invalid_arg(Context, Value, Problem) \
-  argmatch_invalid ((Context), (Value), (Problem))
-
-
-
-/* Report on stderr the list of possible arguments.  */
-
-void argmatch_valid
-  PARAMS ((const char *const *arglist,
-          const char *vallist, size_t valsize));
-
-# define ARGMATCH_VALID(Arglist, Vallist) \
-  argmatch_valid (Arglist, (const char *) Vallist, sizeof (*(Vallist)))
-
-
-
-/* Same as argmatch, but upon failure, reports a explanation on the
-   failure, and exits using the function EXIT_FN. */
-
-int __xargmatch_internal
-  PARAMS ((const char *context,
-          const char *arg, const char *const *arglist,
-          const char *vallist, size_t valsize,
-          int case_sensitive, argmatch_exit_fn exit_fn));
-
-/* Programmer friendly interface to __xargmatch_internal. */
-
-# define XARGMATCH(Context, Arg, Arglist, Vallist)                     \
-  (Vallist [__xargmatch_internal ((Context), (Arg), (Arglist), \
-                                  (const char *) (Vallist),    \
-                                 sizeof (*(Vallist)),          \
-                                 1, argmatch_die)])
-
-# define XARGCASEMATCH(Context, Arg, Arglist, Vallist)         \
-  (Vallist [__xargmatch_internal ((Context), (Arg), (Arglist), \
-                                  (const char *) (Vallist),    \
-                                 sizeof (*(Vallist)),          \
-                                 0, argmatch_die)])
-
-/* Convert a value into a corresponding argument. */
-
-const char *argmatch_to_argument
-  PARAMS ((char const *value, const char *const *arglist,
-          const char *vallist, size_t valsize));
-
-# define ARGMATCH_TO_ARGUMENT(Value, Arglist, Vallist)                 \
-  argmatch_to_argument ((char const *) &(Value), (Arglist),            \
-                       (const char *) (Vallist), sizeof (*(Vallist)))
-
-#endif /* ARGMATCH_H_ */
index 6104512c5de72539e0f9c568a3af2fd3b6ff8a19..21e2efb3cf42152072f53cc1590ddf0d84c620e2 100644 (file)
    If not, write to the Free Software Foundation, Inc., 59 Temple Place -
    Suite 330, Boston, MA 02111-1307, USA.  */
 
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include "config.h"
 
-#if MSDOS || WIN32 || _WIN32
-# define DOSWIN 1
-# define DOSWIN_OR_OS2 1
-#endif
-
-#if OS2
+#if MSDOS || WIN32 || _WIN32 || OS2
 # define DOSWIN_OR_OS2 1
 #endif
 
 #include <assert.h>
 #include <stdio.h>
-
-#if STDC_HEADERS
-# include <stdlib.h>
-#endif
-
-#if HAVE_STDBOOL_H
-# include <stdbool.h>
-#else
-typedef enum {false = 0, true = 1} bool;
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-# define strchr index
-# define strrchr rindex
-#endif
-
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
 #include <signal.h>
-#ifndef RETSIGTYPE
-# define RETSIGTYPE void
-#endif
-
-#if DIFF_HASH
-# ifdef HAVE_LIMITS_H
-#  include <limits.h>
-# endif
-# ifndef CHAR_BIT
-#  define CHAR_BIT 8
-# endif
-#endif
-
-/* Some systems do not define EXIT_*, even with STDC_HEADERS.  */
-#ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-#endif
-#ifndef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
-/* The following test is to work around the gross typo in systems like Sony
-   NEWS-OS Release 4.0C, whereby EXIT_FAILURE is defined to 0, not 1.  */
-#if !EXIT_FAILURE
-# undef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
+#include <errno.h>
 
 #include "xalloc.h"
-
-#if HAVE_LOCALE_H
-# include <locale.h>
-#endif
-#if !HAVE_SETLOCALE
-# define setlocale(Category, Locale)
-#endif
+#include "argmatch.h"
+#include "localcharset.h"
+#include "error.h"
+#include "gettext.h"
 
 #if ENABLE_NLS
-# include <libintl.h>
 # define _(Text) gettext (Text)
 #else
-# define bindtextdomain(Domain, Directory)
-# define textdomain(Domain)
 # define _(Text) Text
 #endif
 #define N_(Text) Text
 
-#ifndef PARAMS
-# if __STDC__
-#  define PARAMS(Args) Args
-# else
-#  define PARAMS(Args) ()
-# endif
-#endif
-
-#include <argmatch.h>
-
-#include <errno.h>
-#ifndef errno
-extern int errno;
-#endif
-#include "error.h"
-
 /* Generate a mask of LENGTH one-bits, right justified in a word.  */
 #define MASK(Length) ((unsigned) ~(~0 << (Length)))
 
@@ -121,17 +51,7 @@ extern int errno;
 #define IS_ASCII(Character) \
   (!((Character) & ~MASK (7)))
 
-/* This is a bit ridiculous.  DJGPP offers a non-working `pipe' function,
-   for the only sake of being POSIX compliant (I'm told so).  So, `pipe'
-   cannot be autoconfigured without AC_TRY_RUN, which is better avoided.  */
-#if !DOSWIN
-# if !_AMIGA
-#  define HAVE_PIPE 1
-# endif
-#endif
-
 /* Debugging the memory allocator.  */
-
 #if WITH_DMALLOC
 # define DMALLOC_FUNC_CHECK
 # include <dmalloc.h>
index 222c034f8d87950d77f90e72531da991a6b41301..f702b691ed1d840a2e12cc6b12e3f2388adc7b2f 100644 (file)
@@ -1,68 +1,68 @@
-bool module_african PARAMS ((struct recode_outer *));
-bool module_afrtran PARAMS ((struct recode_outer *));
-bool module_applemac PARAMS ((struct recode_outer *));
-bool module_atarist PARAMS ((struct recode_outer *));
-bool module_bangbang PARAMS ((struct recode_outer *));
-bool module_cdcnos PARAMS ((struct recode_outer *));
-bool module_ebcdic PARAMS ((struct recode_outer *));
-bool module_ibmpc PARAMS ((struct recode_outer *));
-bool module_iconqnx PARAMS ((struct recode_outer *));
-bool module_latin1_ascii PARAMS ((struct recode_outer *));
-bool module_java PARAMS ((struct recode_outer *));
-bool module_mule PARAMS ((struct recode_outer *));
-bool module_strips PARAMS ((struct recode_outer *));
-bool module_testdump PARAMS ((struct recode_outer *));
-bool module_ucs PARAMS ((struct recode_outer *));
-bool module_utf16 PARAMS ((struct recode_outer *));
-bool module_utf7 PARAMS ((struct recode_outer *));
-bool module_utf8 PARAMS ((struct recode_outer *));
-bool module_varia PARAMS ((struct recode_outer *));
-bool module_vietnamese PARAMS ((struct recode_outer *));
-bool module_flat PARAMS ((struct recode_outer *));
-bool module_html PARAMS ((struct recode_outer *));
-bool module_latin1_latex PARAMS ((struct recode_outer *));
-bool module_latin1_texte PARAMS ((struct recode_outer *));
-bool module_rfc1345 PARAMS ((struct recode_outer *));
-bool module_texinfo PARAMS ((struct recode_outer *));
-bool module_base64 PARAMS ((struct recode_outer *));
-bool module_dump PARAMS ((struct recode_outer *));
-bool module_endline PARAMS ((struct recode_outer *));
-bool module_permutations PARAMS ((struct recode_outer *));
-bool module_quoted_printable PARAMS ((struct recode_outer *));
-bool module_ascii_latin1 PARAMS ((struct recode_outer *));
-bool module_latex_latin1 PARAMS ((struct recode_outer *));
-bool module_texte_latin1 PARAMS ((struct recode_outer *));
-void delmodule_african PARAMS ((struct recode_outer *));
-void delmodule_afrtran PARAMS ((struct recode_outer *));
-void delmodule_applemac PARAMS ((struct recode_outer *));
-void delmodule_atarist PARAMS ((struct recode_outer *));
-void delmodule_bangbang PARAMS ((struct recode_outer *));
-void delmodule_cdcnos PARAMS ((struct recode_outer *));
-void delmodule_ebcdic PARAMS ((struct recode_outer *));
-void delmodule_ibmpc PARAMS ((struct recode_outer *));
-void delmodule_iconqnx PARAMS ((struct recode_outer *));
-void delmodule_latin1_ascii PARAMS ((struct recode_outer *));
-void delmodule_java PARAMS ((struct recode_outer *));
-void delmodule_mule PARAMS ((struct recode_outer *));
-void delmodule_strips PARAMS ((struct recode_outer *));
-void delmodule_testdump PARAMS ((struct recode_outer *));
-void delmodule_ucs PARAMS ((struct recode_outer *));
-void delmodule_utf16 PARAMS ((struct recode_outer *));
-void delmodule_utf7 PARAMS ((struct recode_outer *));
-void delmodule_utf8 PARAMS ((struct recode_outer *));
-void delmodule_varia PARAMS ((struct recode_outer *));
-void delmodule_vietnamese PARAMS ((struct recode_outer *));
-void delmodule_flat PARAMS ((struct recode_outer *));
-void delmodule_html PARAMS ((struct recode_outer *));
-void delmodule_latin1_latex PARAMS ((struct recode_outer *));
-void delmodule_latin1_texte PARAMS ((struct recode_outer *));
-void delmodule_rfc1345 PARAMS ((struct recode_outer *));
-void delmodule_texinfo PARAMS ((struct recode_outer *));
-void delmodule_base64 PARAMS ((struct recode_outer *));
-void delmodule_dump PARAMS ((struct recode_outer *));
-void delmodule_endline PARAMS ((struct recode_outer *));
-void delmodule_permutations PARAMS ((struct recode_outer *));
-void delmodule_quoted_printable PARAMS ((struct recode_outer *));
-void delmodule_ascii_latin1 PARAMS ((struct recode_outer *));
-void delmodule_latex_latin1 PARAMS ((struct recode_outer *));
-void delmodule_texte_latin1 PARAMS ((struct recode_outer *));
+bool module_african (struct recode_outer *);
+bool module_afrtran (struct recode_outer *);
+bool module_applemac (struct recode_outer *);
+bool module_atarist (struct recode_outer *);
+bool module_bangbang (struct recode_outer *);
+bool module_cdcnos (struct recode_outer *);
+bool module_ebcdic (struct recode_outer *);
+bool module_ibmpc (struct recode_outer *);
+bool module_iconqnx (struct recode_outer *);
+bool module_latin1_ascii (struct recode_outer *);
+bool module_java (struct recode_outer *);
+bool module_mule (struct recode_outer *);
+bool module_strips (struct recode_outer *);
+bool module_testdump (struct recode_outer *);
+bool module_ucs (struct recode_outer *);
+bool module_utf16 (struct recode_outer *);
+bool module_utf7 (struct recode_outer *);
+bool module_utf8 (struct recode_outer *);
+bool module_varia (struct recode_outer *);
+bool module_vietnamese (struct recode_outer *);
+bool module_flat (struct recode_outer *);
+bool module_html (struct recode_outer *);
+bool module_latin1_latex (struct recode_outer *);
+bool module_latin1_texte (struct recode_outer *);
+bool module_rfc1345 (struct recode_outer *);
+bool module_texinfo (struct recode_outer *);
+bool module_base64 (struct recode_outer *);
+bool module_dump (struct recode_outer *);
+bool module_endline (struct recode_outer *);
+bool module_permutations (struct recode_outer *);
+bool module_quoted_printable (struct recode_outer *);
+bool module_ascii_latin1 (struct recode_outer *);
+bool module_latex_latin1 (struct recode_outer *);
+bool module_texte_latin1 (struct recode_outer *);
+void delmodule_african (struct recode_outer *);
+void delmodule_afrtran (struct recode_outer *);
+void delmodule_applemac (struct recode_outer *);
+void delmodule_atarist (struct recode_outer *);
+void delmodule_bangbang (struct recode_outer *);
+void delmodule_cdcnos (struct recode_outer *);
+void delmodule_ebcdic (struct recode_outer *);
+void delmodule_ibmpc (struct recode_outer *);
+void delmodule_iconqnx (struct recode_outer *);
+void delmodule_latin1_ascii (struct recode_outer *);
+void delmodule_java (struct recode_outer *);
+void delmodule_mule (struct recode_outer *);
+void delmodule_strips (struct recode_outer *);
+void delmodule_testdump (struct recode_outer *);
+void delmodule_ucs (struct recode_outer *);
+void delmodule_utf16 (struct recode_outer *);
+void delmodule_utf7 (struct recode_outer *);
+void delmodule_utf8 (struct recode_outer *);
+void delmodule_varia (struct recode_outer *);
+void delmodule_vietnamese (struct recode_outer *);
+void delmodule_flat (struct recode_outer *);
+void delmodule_html (struct recode_outer *);
+void delmodule_latin1_latex (struct recode_outer *);
+void delmodule_latin1_texte (struct recode_outer *);
+void delmodule_rfc1345 (struct recode_outer *);
+void delmodule_texinfo (struct recode_outer *);
+void delmodule_base64 (struct recode_outer *);
+void delmodule_dump (struct recode_outer *);
+void delmodule_endline (struct recode_outer *);
+void delmodule_permutations (struct recode_outer *);
+void delmodule_quoted_printable (struct recode_outer *);
+void delmodule_ascii_latin1 (struct recode_outer *);
+void delmodule_latex_latin1 (struct recode_outer *);
+void delmodule_texte_latin1 (struct recode_outer *);
diff --git a/src/exit.h b/src/exit.h
deleted file mode 100644 (file)
index 9dbfb7c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* exit() function.
-   Copyright (C) 1995, 2001 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _EXIT_H
-#define _EXIT_H
-
-/* Get exit() declaration.  */
-#include <stdlib.h>
-
-/* Some systems do not define EXIT_*, even with STDC_HEADERS.  */
-#ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-#endif
-#ifndef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
-
-#endif /* _EXIT_H */
diff --git a/src/exitfail.c b/src/exitfail.c
deleted file mode 100644 (file)
index 27d38c3..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Failure exit status
-
-   Copyright (C) 2002, 2003 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; see the file COPYING.
-   If not, write to the Free Software Foundation,
-   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "exitfail.h"
-#include "exit.h"
-
-int volatile exit_failure = EXIT_FAILURE;
diff --git a/src/exitfail.h b/src/exitfail.h
deleted file mode 100644 (file)
index e46cf9c..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Failure exit status
-
-   Copyright (C) 2002 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; see the file COPYING.
-   If not, write to the Free Software Foundation,
-   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-extern int volatile exit_failure;
diff --git a/src/hash.c b/src/hash.c
deleted file mode 100644 (file)
index 8f9e1e3..0000000
+++ /dev/null
@@ -1,1055 +0,0 @@
-/* hash - hashing table processing.
-
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
-   Software Foundation, Inc.
-
-   Written by Jim Meyering, 1992.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-/* A generic hash table package.  */
-
-/* Define USE_OBSTACK to 1 if you want the allocator to use obstacks instead
-   of malloc.  If you change USE_OBSTACK, you have to recompile!  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "hash.h"
-#include "xalloc.h"
-
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#if USE_OBSTACK
-# include "obstack.h"
-# ifndef obstack_chunk_alloc
-#  define obstack_chunk_alloc malloc
-# endif
-# ifndef obstack_chunk_free
-#  define obstack_chunk_free free
-# endif
-#endif
-
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
-
-struct hash_table
-  {
-    /* The array of buckets starts at BUCKET and extends to BUCKET_LIMIT-1,
-       for a possibility of N_BUCKETS.  Among those, N_BUCKETS_USED buckets
-       are not empty, there are N_ENTRIES active entries in the table.  */
-    struct hash_entry *bucket;
-    struct hash_entry const *bucket_limit;
-    size_t n_buckets;
-    size_t n_buckets_used;
-    size_t n_entries;
-
-    /* Tuning arguments, kept in a physicaly separate structure.  */
-    const Hash_tuning *tuning;
-
-    /* Three functions are given to `hash_initialize', see the documentation
-       block for this function.  In a word, HASHER randomizes a user entry
-       into a number up from 0 up to some maximum minus 1; COMPARATOR returns
-       true if two user entries compare equally; and DATA_FREER is the cleanup
-       function for a user entry.  */
-    Hash_hasher hasher;
-    Hash_comparator comparator;
-    Hash_data_freer data_freer;
-
-    /* A linked list of freed struct hash_entry structs.  */
-    struct hash_entry *free_entry_list;
-
-#if USE_OBSTACK
-    /* Whenever obstacks are used, it is possible to allocate all overflowed
-       entries into a single stack, so they all can be freed in a single
-       operation.  It is not clear if the speedup is worth the trouble.  */
-    struct obstack entry_stack;
-#endif
-  };
-
-/* A hash table contains many internal entries, each holding a pointer to
-   some user provided data (also called a user entry).  An entry indistinctly
-   refers to both the internal entry and its associated user entry.  A user
-   entry contents may be hashed by a randomization function (the hashing
-   function, or just `hasher' for short) into a number (or `slot') between 0
-   and the current table size.  At each slot position in the hash table,
-   starts a linked chain of entries for which the user data all hash to this
-   slot.  A bucket is the collection of all entries hashing to the same slot.
-
-   A good `hasher' function will distribute entries rather evenly in buckets.
-   In the ideal case, the length of each bucket is roughly the number of
-   entries divided by the table size.  Finding the slot for a data is usually
-   done in constant time by the `hasher', and the later finding of a precise
-   entry is linear in time with the size of the bucket.  Consequently, a
-   larger hash table size (that is, a larger number of buckets) is prone to
-   yielding shorter chains, *given* the `hasher' function behaves properly.
-
-   Long buckets slow down the lookup algorithm.  One might use big hash table
-   sizes in hope to reduce the average length of buckets, but this might
-   become inordinate, as unused slots in the hash table take some space.  The
-   best bet is to make sure you are using a good `hasher' function (beware
-   that those are not that easy to write! :-), and to use a table size
-   larger than the actual number of entries.  */
-
-/* If an insertion makes the ratio of nonempty buckets to table size larger
-   than the growth threshold (a number between 0.0 and 1.0), then increase
-   the table size by multiplying by the growth factor (a number greater than
-   1.0).  The growth threshold defaults to 0.8, and the growth factor
-   defaults to 1.414, meaning that the table will have doubled its size
-   every second time 80% of the buckets get used.  */
-#define DEFAULT_GROWTH_THRESHOLD 0.8
-#define DEFAULT_GROWTH_FACTOR 1.414
-
-/* If a deletion empties a bucket and causes the ratio of used buckets to
-   table size to become smaller than the shrink threshold (a number between
-   0.0 and 1.0), then shrink the table by multiplying by the shrink factor (a
-   number greater than the shrink threshold but smaller than 1.0).  The shrink
-   threshold and factor default to 0.0 and 1.0, meaning that the table never
-   shrinks.  */
-#define DEFAULT_SHRINK_THRESHOLD 0.0
-#define DEFAULT_SHRINK_FACTOR 1.0
-
-/* Use this to initialize or reset a TUNING structure to
-   some sensible values. */
-static const Hash_tuning default_tuning =
-  {
-    DEFAULT_SHRINK_THRESHOLD,
-    DEFAULT_SHRINK_FACTOR,
-    DEFAULT_GROWTH_THRESHOLD,
-    DEFAULT_GROWTH_FACTOR,
-    false
-  };
-
-/* Information and lookup.  */
-
-/* The following few functions provide information about the overall hash
-   table organization: the number of entries, number of buckets and maximum
-   length of buckets.  */
-
-/* Return the number of buckets in the hash table.  The table size, the total
-   number of buckets (used plus unused), or the maximum number of slots, are
-   the same quantity.  */
-
-size_t
-hash_get_n_buckets (const Hash_table *table)
-{
-  return table->n_buckets;
-}
-
-/* Return the number of slots in use (non-empty buckets).  */
-
-size_t
-hash_get_n_buckets_used (const Hash_table *table)
-{
-  return table->n_buckets_used;
-}
-
-/* Return the number of active entries.  */
-
-size_t
-hash_get_n_entries (const Hash_table *table)
-{
-  return table->n_entries;
-}
-
-/* Return the length of the longest chain (bucket).  */
-
-size_t
-hash_get_max_bucket_length (const Hash_table *table)
-{
-  struct hash_entry const *bucket;
-  size_t max_bucket_length = 0;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-       {
-         struct hash_entry const *cursor = bucket;
-         size_t bucket_length = 1;
-
-         while (cursor = cursor->next, cursor)
-           bucket_length++;
-
-         if (bucket_length > max_bucket_length)
-           max_bucket_length = bucket_length;
-       }
-    }
-
-  return max_bucket_length;
-}
-
-/* Do a mild validation of a hash table, by traversing it and checking two
-   statistics.  */
-
-bool
-hash_table_ok (const Hash_table *table)
-{
-  struct hash_entry const *bucket;
-  size_t n_buckets_used = 0;
-  size_t n_entries = 0;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-       {
-         struct hash_entry const *cursor = bucket;
-
-         /* Count bucket head.  */
-         n_buckets_used++;
-         n_entries++;
-
-         /* Count bucket overflow.  */
-         while (cursor = cursor->next, cursor)
-           n_entries++;
-       }
-    }
-
-  if (n_buckets_used == table->n_buckets_used && n_entries == table->n_entries)
-    return true;
-
-  return false;
-}
-
-void
-hash_print_statistics (const Hash_table *table, FILE *stream)
-{
-  size_t n_entries = hash_get_n_entries (table);
-  size_t n_buckets = hash_get_n_buckets (table);
-  size_t n_buckets_used = hash_get_n_buckets_used (table);
-  size_t max_bucket_length = hash_get_max_bucket_length (table);
-
-  fprintf (stream, "# entries:         %lu\n", (unsigned long int) n_entries);
-  fprintf (stream, "# buckets:         %lu\n", (unsigned long int) n_buckets);
-  fprintf (stream, "# buckets used:    %lu (%.2f%%)\n",
-          (unsigned long int) n_buckets_used,
-          (100.0 * n_buckets_used) / n_buckets);
-  fprintf (stream, "max bucket length: %lu\n",
-          (unsigned long int) max_bucket_length);
-}
-
-/* If ENTRY matches an entry already in the hash table, return the
-   entry from the table.  Otherwise, return NULL.  */
-
-void *
-hash_lookup (const Hash_table *table, const void *entry)
-{
-  struct hash_entry const *bucket
-    = table->bucket + table->hasher (entry, table->n_buckets);
-  struct hash_entry const *cursor;
-
-  if (! (bucket < table->bucket_limit))
-    abort ();
-
-  if (bucket->data == NULL)
-    return NULL;
-
-  for (cursor = bucket; cursor; cursor = cursor->next)
-    if (table->comparator (entry, cursor->data))
-      return cursor->data;
-
-  return NULL;
-}
-
-/* Walking.  */
-
-/* The functions in this page traverse the hash table and process the
-   contained entries.  For the traversal to work properly, the hash table
-   should not be resized nor modified while any particular entry is being
-   processed.  In particular, entries should not be added or removed.  */
-
-/* Return the first data in the table, or NULL if the table is empty.  */
-
-void *
-hash_get_first (const Hash_table *table)
-{
-  struct hash_entry const *bucket;
-
-  if (table->n_entries == 0)
-    return NULL;
-
-  for (bucket = table->bucket; ; bucket++)
-    if (! (bucket < table->bucket_limit))
-      abort ();
-    else if (bucket->data)
-      return bucket->data;
-}
-
-/* Return the user data for the entry following ENTRY, where ENTRY has been
-   returned by a previous call to either `hash_get_first' or `hash_get_next'.
-   Return NULL if there are no more entries.  */
-
-void *
-hash_get_next (const Hash_table *table, const void *entry)
-{
-  struct hash_entry const *bucket
-    = table->bucket + table->hasher (entry, table->n_buckets);
-  struct hash_entry const *cursor;
-
-  if (! (bucket < table->bucket_limit))
-    abort ();
-
-  /* Find next entry in the same bucket.  */
-  for (cursor = bucket; cursor; cursor = cursor->next)
-    if (cursor->data == entry && cursor->next)
-      return cursor->next->data;
-
-  /* Find first entry in any subsequent bucket.  */
-  while (++bucket < table->bucket_limit)
-    if (bucket->data)
-      return bucket->data;
-
-  /* None found.  */
-  return NULL;
-}
-
-/* Fill BUFFER with pointers to active user entries in the hash table, then
-   return the number of pointers copied.  Do not copy more than BUFFER_SIZE
-   pointers.  */
-
-size_t
-hash_get_entries (const Hash_table *table, void **buffer,
-                 size_t buffer_size)
-{
-  size_t counter = 0;
-  struct hash_entry const *bucket;
-  struct hash_entry const *cursor;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-       {
-         for (cursor = bucket; cursor; cursor = cursor->next)
-           {
-             if (counter >= buffer_size)
-               return counter;
-             buffer[counter++] = cursor->data;
-           }
-       }
-    }
-
-  return counter;
-}
-
-/* Call a PROCESSOR function for each entry of a hash table, and return the
-   number of entries for which the processor function returned success.  A
-   pointer to some PROCESSOR_DATA which will be made available to each call to
-   the processor function.  The PROCESSOR accepts two arguments: the first is
-   the user entry being walked into, the second is the value of PROCESSOR_DATA
-   as received.  The walking continue for as long as the PROCESSOR function
-   returns nonzero.  When it returns zero, the walking is interrupted.  */
-
-size_t
-hash_do_for_each (const Hash_table *table, Hash_processor processor,
-                 void *processor_data)
-{
-  size_t counter = 0;
-  struct hash_entry const *bucket;
-  struct hash_entry const *cursor;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-       {
-         for (cursor = bucket; cursor; cursor = cursor->next)
-           {
-             if (!(*processor) (cursor->data, processor_data))
-               return counter;
-             counter++;
-           }
-       }
-    }
-
-  return counter;
-}
-
-/* Allocation and clean-up.  */
-
-/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
-   This is a convenience routine for constructing other hashing functions.  */
-
-#if USE_DIFF_HASH
-
-/* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
-   B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
-   Software--practice & experience 20, 2 (Feb 1990), 209-224.  Good hash
-   algorithms tend to be domain-specific, so what's good for [diffutils'] io.c
-   may not be good for your application."  */
-
-size_t
-hash_string (const char *string, size_t n_buckets)
-{
-# define ROTATE_LEFT(Value, Shift) \
-  ((Value) << (Shift) | (Value) >> ((sizeof (size_t) * CHAR_BIT) - (Shift)))
-# define HASH_ONE_CHAR(Value, Byte) \
-  ((Byte) + ROTATE_LEFT (Value, 7))
-
-  size_t value = 0;
-  unsigned char ch;
-
-  for (; (ch = *string); string++)
-    value = HASH_ONE_CHAR (value, ch);
-  return value % n_buckets;
-
-# undef ROTATE_LEFT
-# undef HASH_ONE_CHAR
-}
-
-#else /* not USE_DIFF_HASH */
-
-/* This one comes from Recode, and performs a bit better than the above as
-   per a few experiments.  It is inspired from a hashing routine found in the
-   very old Cyber `snoop', itself written in typical Greg Mansfield style.
-   (By the way, what happened to this excellent man?  Is he still alive?)  */
-
-size_t
-hash_string (const char *string, size_t n_buckets)
-{
-  size_t value = 0;
-  unsigned char ch;
-
-  for (; (ch = *string); string++)
-    value = (value * 31 + ch) % n_buckets;
-  return value;
-}
-
-#endif /* not USE_DIFF_HASH */
-
-/* Return true if CANDIDATE is a prime number.  CANDIDATE should be an odd
-   number at least equal to 11.  */
-
-static bool
-is_prime (size_t candidate)
-{
-  size_t divisor = 3;
-  size_t square = divisor * divisor;
-
-  while (square < candidate && (candidate % divisor))
-    {
-      divisor++;
-      square += 4 * divisor;
-      divisor++;
-    }
-
-  return (candidate % divisor ? true : false);
-}
-
-/* Round a given CANDIDATE number up to the nearest prime, and return that
-   prime.  Primes lower than 10 are merely skipped.  */
-
-static size_t
-next_prime (size_t candidate)
-{
-  /* Skip small primes.  */
-  if (candidate < 10)
-    candidate = 10;
-
-  /* Make it definitely odd.  */
-  candidate |= 1;
-
-  while (!is_prime (candidate))
-    candidate += 2;
-
-  return candidate;
-}
-
-void
-hash_reset_tuning (Hash_tuning *tuning)
-{
-  *tuning = default_tuning;
-}
-
-/* For the given hash TABLE, check the user supplied tuning structure for
-   reasonable values, and return true if there is no gross error with it.
-   Otherwise, definitively reset the TUNING field to some acceptable default
-   in the hash table (that is, the user loses the right of further modifying
-   tuning arguments), and return false.  */
-
-static bool
-check_tuning (Hash_table *table)
-{
-  const Hash_tuning *tuning = table->tuning;
-
-  /* Be a bit stricter than mathematics would require, so that
-     rounding errors in size calculations do not cause allocations to
-     fail to grow or shrink as they should.  The smallest allocation
-     is 11 (due to next_prime's algorithm), so an epsilon of 0.1
-     should be good enough.  */
-  float epsilon = 0.1f;
-
-  if (epsilon < tuning->growth_threshold
-      && tuning->growth_threshold < 1 - epsilon
-      && 1 + epsilon < tuning->growth_factor
-      && 0 <= tuning->shrink_threshold
-      && tuning->shrink_threshold + epsilon < tuning->shrink_factor
-      && tuning->shrink_factor <= 1
-      && tuning->shrink_threshold + epsilon < tuning->growth_threshold)
-    return true;
-
-  table->tuning = &default_tuning;
-  return false;
-}
-
-/* Allocate and return a new hash table, or NULL upon failure.  The initial
-   number of buckets is automatically selected so as to _guarantee_ that you
-   may insert at least CANDIDATE different user entries before any growth of
-   the hash table size occurs.  So, if have a reasonably tight a-priori upper
-   bound on the number of entries you intend to insert in the hash table, you
-   may save some table memory and insertion time, by specifying it here.  If
-   the IS_N_BUCKETS field of the TUNING structure is true, the CANDIDATE
-   argument has its meaning changed to the wanted number of buckets.
-
-   TUNING points to a structure of user-supplied values, in case some fine
-   tuning is wanted over the default behavior of the hasher.  If TUNING is
-   NULL, the default tuning parameters are used instead.
-
-   The user-supplied HASHER function should be provided.  It accepts two
-   arguments ENTRY and TABLE_SIZE.  It computes, by hashing ENTRY contents, a
-   slot number for that entry which should be in the range 0..TABLE_SIZE-1.
-   This slot number is then returned.
-
-   The user-supplied COMPARATOR function should be provided.  It accepts two
-   arguments pointing to user data, it then returns true for a pair of entries
-   that compare equal, or false otherwise.  This function is internally called
-   on entries which are already known to hash to the same bucket index.
-
-   The user-supplied DATA_FREER function, when not NULL, may be later called
-   with the user data as an argument, just before the entry containing the
-   data gets freed.  This happens from within `hash_free' or `hash_clear'.
-   You should specify this function only if you want these functions to free
-   all of your `data' data.  This is typically the case when your data is
-   simply an auxiliary struct that you have malloc'd to aggregate several
-   values.  */
-
-Hash_table *
-hash_initialize (size_t candidate, const Hash_tuning *tuning,
-                Hash_hasher hasher, Hash_comparator comparator,
-                Hash_data_freer data_freer)
-{
-  Hash_table *table;
-
-  if (hasher == NULL || comparator == NULL)
-    return NULL;
-
-  table = (Hash_table *) malloc (sizeof *table);
-  if (table == NULL)
-    return NULL;
-
-  if (!tuning)
-    tuning = &default_tuning;
-  table->tuning = tuning;
-  if (!check_tuning (table))
-    {
-      /* Fail if the tuning options are invalid.  This is the only occasion
-        when the user gets some feedback about it.  Once the table is created,
-        if the user provides invalid tuning options, we silently revert to
-        using the defaults, and ignore further request to change the tuning
-        options.  */
-      goto fail;
-    }
-
-  if (!tuning->is_n_buckets)
-    {
-      float new_candidate = candidate / tuning->growth_threshold;
-      if (SIZE_MAX <= new_candidate)
-       goto fail;
-      candidate = new_candidate;
-    }
-
-  if (xalloc_oversized (candidate, sizeof *table->bucket))
-    goto fail;
-  table->n_buckets = next_prime (candidate);
-  if (xalloc_oversized (table->n_buckets, sizeof *table->bucket))
-    goto fail;
-
-  table->bucket
-    = (struct hash_entry *) calloc (table->n_buckets, sizeof *table->bucket);
-  table->bucket_limit = table->bucket + table->n_buckets;
-  table->n_buckets_used = 0;
-  table->n_entries = 0;
-
-  table->hasher = hasher;
-  table->comparator = comparator;
-  table->data_freer = data_freer;
-
-  table->free_entry_list = NULL;
-#if USE_OBSTACK
-  obstack_init (&table->entry_stack);
-#endif
-  return table;
-
- fail:
-  free (table);
-  return NULL;
-}
-
-/* Make all buckets empty, placing any chained entries on the free list.
-   Apply the user-specified function data_freer (if any) to the datas of any
-   affected entries.  */
-
-void
-hash_clear (Hash_table *table)
-{
-  struct hash_entry *bucket;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      if (bucket->data)
-       {
-         struct hash_entry *cursor;
-         struct hash_entry *next;
-
-         /* Free the bucket overflow.  */
-         for (cursor = bucket->next; cursor; cursor = next)
-           {
-             if (table->data_freer)
-               (*table->data_freer) (cursor->data);
-             cursor->data = NULL;
-
-             next = cursor->next;
-             /* Relinking is done one entry at a time, as it is to be expected
-                that overflows are either rare or short.  */
-             cursor->next = table->free_entry_list;
-             table->free_entry_list = cursor;
-           }
-
-         /* Free the bucket head.  */
-         if (table->data_freer)
-           (*table->data_freer) (bucket->data);
-         bucket->data = NULL;
-         bucket->next = NULL;
-       }
-    }
-
-  table->n_buckets_used = 0;
-  table->n_entries = 0;
-}
-
-/* Reclaim all storage associated with a hash table.  If a data_freer
-   function has been supplied by the user when the hash table was created,
-   this function applies it to the data of each entry before freeing that
-   entry.  */
-
-void
-hash_free (Hash_table *table)
-{
-  struct hash_entry *bucket;
-  struct hash_entry *cursor;
-  struct hash_entry *next;
-
-  /* Call the user data_freer function.  */
-  if (table->data_freer && table->n_entries)
-    {
-      for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-       {
-         if (bucket->data)
-           {
-             for (cursor = bucket; cursor; cursor = cursor->next)
-               {
-                 (*table->data_freer) (cursor->data);
-               }
-           }
-       }
-    }
-
-#if USE_OBSTACK
-
-  obstack_free (&table->entry_stack, NULL);
-
-#else
-
-  /* Free all bucket overflowed entries.  */
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      for (cursor = bucket->next; cursor; cursor = next)
-       {
-         next = cursor->next;
-         free (cursor);
-       }
-    }
-
-  /* Also reclaim the internal list of previously freed entries.  */
-  for (cursor = table->free_entry_list; cursor; cursor = next)
-    {
-      next = cursor->next;
-      free (cursor);
-    }
-
-#endif
-
-  /* Free the remainder of the hash table structure.  */
-  free (table->bucket);
-  free (table);
-}
-
-/* Insertion and deletion.  */
-
-/* Get a new hash entry for a bucket overflow, possibly by reclying a
-   previously freed one.  If this is not possible, allocate a new one.  */
-
-static struct hash_entry *
-allocate_entry (Hash_table *table)
-{
-  struct hash_entry *new_;
-
-  if (table->free_entry_list)
-    {
-      new_ = table->free_entry_list;
-      table->free_entry_list = new_->next;
-    }
-  else
-    {
-#if USE_OBSTACK
-      new_ = (struct hash_entry *) obstack_alloc (&table->entry_stack,
-                                                 sizeof *new_);
-#else
-      new_ = (struct hash_entry *) malloc (sizeof *new_);
-#endif
-    }
-
-  return new_;
-}
-
-/* Free a hash entry which was part of some bucket overflow,
-   saving it for later recycling.  */
-
-static void
-free_entry (Hash_table *table, struct hash_entry *entry)
-{
-  entry->data = NULL;
-  entry->next = table->free_entry_list;
-  table->free_entry_list = entry;
-}
-
-/* This private function is used to help with insertion and deletion.  When
-   ENTRY matches an entry in the table, return a pointer to the corresponding
-   user data and set *BUCKET_HEAD to the head of the selected bucket.
-   Otherwise, return NULL.  When DELETE is true and ENTRY matches an entry in
-   the table, unlink the matching entry.  */
-
-static void *
-hash_find_entry (Hash_table *table, const void *entry,
-                struct hash_entry **bucket_head, bool delete_)
-{
-  struct hash_entry *bucket
-    = table->bucket + table->hasher (entry, table->n_buckets);
-  struct hash_entry *cursor;
-
-  if (! (bucket < table->bucket_limit))
-    abort ();
-
-  *bucket_head = bucket;
-
-  /* Test for empty bucket.  */
-  if (bucket->data == NULL)
-    return NULL;
-
-  /* See if the entry is the first in the bucket.  */
-  if ((*table->comparator) (entry, bucket->data))
-    {
-      void *data = bucket->data;
-
-      if (delete_)
-       {
-         if (bucket->next)
-           {
-             struct hash_entry *next = bucket->next;
-
-             /* Bump the first overflow entry into the bucket head, then save
-                the previous first overflow entry for later recycling.  */
-             *bucket = *next;
-             free_entry (table, next);
-           }
-         else
-           {
-             bucket->data = NULL;
-           }
-       }
-
-      return data;
-    }
-
-  /* Scan the bucket overflow.  */
-  for (cursor = bucket; cursor->next; cursor = cursor->next)
-    {
-      if ((*table->comparator) (entry, cursor->next->data))
-       {
-         void *data = cursor->next->data;
-
-         if (delete_)
-           {
-             struct hash_entry *next = cursor->next;
-
-             /* Unlink the entry to delete, then save the freed entry for later
-                recycling.  */
-             cursor->next = next->next;
-             free_entry (table, next);
-           }
-
-         return data;
-       }
-    }
-
-  /* No entry found.  */
-  return NULL;
-}
-
-/* For an already existing hash table, change the number of buckets through
-   specifying CANDIDATE.  The contents of the hash table are preserved.  The
-   new number of buckets is automatically selected so as to _guarantee_ that
-   the table may receive at least CANDIDATE different user entries, including
-   those already in the table, before any other growth of the hash table size
-   occurs.  If TUNING->IS_N_BUCKETS is true, then CANDIDATE specifies the
-   exact number of buckets desired.  */
-
-bool
-hash_rehash (Hash_table *table, size_t candidate)
-{
-  Hash_table *new_table;
-  struct hash_entry *bucket;
-  struct hash_entry *cursor;
-  struct hash_entry *next;
-
-  new_table = hash_initialize (candidate, table->tuning, table->hasher,
-                              table->comparator, table->data_freer);
-  if (new_table == NULL)
-    return false;
-
-  /* Merely reuse the extra old space into the new table.  */
-#if USE_OBSTACK
-  obstack_free (&new_table->entry_stack, NULL);
-  new_table->entry_stack = table->entry_stack;
-#endif
-  new_table->free_entry_list = table->free_entry_list;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    if (bucket->data)
-      for (cursor = bucket; cursor; cursor = next)
-       {
-         void *data = cursor->data;
-         struct hash_entry *new_bucket
-           = (new_table->bucket
-              + new_table->hasher (data, new_table->n_buckets));
-
-         if (! (new_bucket < new_table->bucket_limit))
-           abort ();
-
-         next = cursor->next;
-
-         if (new_bucket->data)
-           {
-             if (cursor == bucket)
-               {
-                 /* Allocate or recycle an entry, when moving from a bucket
-                    header into a bucket overflow.  */
-                 struct hash_entry *new_entry = allocate_entry (new_table);
-
-                 if (new_entry == NULL)
-                   {
-                     hash_free (new_table);
-                     return false;
-                   }
-
-                 new_entry->data = data;
-                 new_entry->next = new_bucket->next;
-                 new_bucket->next = new_entry;
-               }
-             else
-               {
-                 /* Merely relink an existing entry, when moving from a
-                    bucket overflow into a bucket overflow.  */
-                 cursor->next = new_bucket->next;
-                 new_bucket->next = cursor;
-               }
-           }
-         else
-           {
-             /* Free an existing entry, when moving from a bucket
-                overflow into a bucket header.  Also take care of the
-                simple case of moving from a bucket header into a bucket
-                header.  */
-             new_bucket->data = data;
-             new_table->n_buckets_used++;
-             if (cursor != bucket)
-               free_entry (new_table, cursor);
-           }
-       }
-
-  free (table->bucket);
-  table->bucket = new_table->bucket;
-  table->bucket_limit = new_table->bucket_limit;
-  table->n_buckets = new_table->n_buckets;
-  table->n_buckets_used = new_table->n_buckets_used;
-  table->free_entry_list = new_table->free_entry_list;
-  /* table->n_entries already holds its value.  */
-#if USE_OBSTACK
-  table->entry_stack = new_table->entry_stack;
-#endif
-  free (new_table);
-
-  return true;
-}
-
-/* If ENTRY matches an entry already in the hash table, return the pointer
-   to the entry from the table.  Otherwise, insert ENTRY and return ENTRY.
-   Return NULL if the storage required for insertion cannot be allocated.  */
-
-void *
-hash_insert (Hash_table *table, const void *entry)
-{
-  void *data;
-  struct hash_entry *bucket;
-
-  /* The caller cannot insert a NULL entry.  */
-  if (! entry)
-    abort ();
-
-  /* If there's a matching entry already in the table, return that.  */
-  if ((data = hash_find_entry (table, entry, &bucket, false)) != NULL)
-    return data;
-
-  /* ENTRY is not matched, it should be inserted.  */
-
-  if (bucket->data)
-    {
-      struct hash_entry *new_entry = allocate_entry (table);
-
-      if (new_entry == NULL)
-       return NULL;
-
-      /* Add ENTRY in the overflow of the bucket.  */
-
-      new_entry->data = (void *) entry;
-      new_entry->next = bucket->next;
-      bucket->next = new_entry;
-      table->n_entries++;
-      return (void *) entry;
-    }
-
-  /* Add ENTRY right in the bucket head.  */
-
-  bucket->data = (void *) entry;
-  table->n_entries++;
-  table->n_buckets_used++;
-
-  /* If the growth threshold of the buckets in use has been reached, increase
-     the table size and rehash.  There's no point in checking the number of
-     entries:  if the hashing function is ill-conditioned, rehashing is not
-     likely to improve it.  */
-
-  if (table->n_buckets_used
-      > table->tuning->growth_threshold * table->n_buckets)
-    {
-      /* Check more fully, before starting real work.  If tuning arguments
-        became invalid, the second check will rely on proper defaults.  */
-      check_tuning (table);
-      if (table->n_buckets_used
-         > table->tuning->growth_threshold * table->n_buckets)
-       {
-         const Hash_tuning *tuning = table->tuning;
-         float candidate =
-           (tuning->is_n_buckets
-            ? (table->n_buckets * tuning->growth_factor)
-            : (table->n_buckets * tuning->growth_factor
-               * tuning->growth_threshold));
-
-         if (SIZE_MAX <= candidate)
-           return NULL;
-
-         /* If the rehash fails, arrange to return NULL.  */
-         if (!hash_rehash (table, candidate))
-           entry = NULL;
-       }
-    }
-
-  return (void *) entry;
-}
-
-/* If ENTRY is already in the table, remove it and return the just-deleted
-   data (the user may want to deallocate its storage).  If ENTRY is not in the
-   table, don't modify the table and return NULL.  */
-
-void *
-hash_delete (Hash_table *table, const void *entry)
-{
-  void *data;
-  struct hash_entry *bucket;
-
-  data = hash_find_entry (table, entry, &bucket, true);
-  if (!data)
-    return NULL;
-
-  table->n_entries--;
-  if (!bucket->data)
-    {
-      table->n_buckets_used--;
-
-      /* If the shrink threshold of the buckets in use has been reached,
-        rehash into a smaller table.  */
-
-      if (table->n_buckets_used
-         < table->tuning->shrink_threshold * table->n_buckets)
-       {
-         /* Check more fully, before starting real work.  If tuning arguments
-            became invalid, the second check will rely on proper defaults.  */
-         check_tuning (table);
-         if (table->n_buckets_used
-             < table->tuning->shrink_threshold * table->n_buckets)
-           {
-             const Hash_tuning *tuning = table->tuning;
-             size_t candidate =
-               (tuning->is_n_buckets
-                ? table->n_buckets * tuning->shrink_factor
-                : (table->n_buckets * tuning->shrink_factor
-                   * tuning->growth_threshold));
-
-             hash_rehash (table, candidate);
-           }
-       }
-    }
-
-  return data;
-}
-
-/* Testing.  */
-
-#if TESTING
-
-void
-hash_print (const Hash_table *table)
-{
-  struct hash_entry const *bucket;
-
-  for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
-    {
-      struct hash_entry *cursor;
-
-      if (bucket)
-       printf ("%lu:\n", (unsigned long int) (bucket - table->bucket));
-
-      for (cursor = bucket; cursor; cursor = cursor->next)
-       {
-         char const *s = cursor->data;
-         /* FIXME */
-         if (s)
-           printf ("  %s\n", s);
-       }
-    }
-}
-
-#endif /* TESTING */
diff --git a/src/hash.h b/src/hash.h
deleted file mode 100644 (file)
index ab63a86..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/* hash - hashing table processing.
-   Copyright (C) 1998, 1999, 2001, 2003 Free Software Foundation, Inc.
-   Written by Jim Meyering <meyering@ascend.com>, 1998.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-/* A generic hash table package.  */
-
-/* Make sure USE_OBSTACK is defined to 1 if you want the allocator to use
-   obstacks instead of malloc, and recompile `hash.c' with same setting.  */
-
-#ifndef HASH_H_
-# define HASH_H_
-
-# include <stdio.h>
-# include <stdbool.h>
-
-typedef size_t (*Hash_hasher) (const void *, size_t);
-typedef bool (*Hash_comparator) (const void *, const void *);
-typedef void (*Hash_data_freer) (void *);
-typedef bool (*Hash_processor) (void *, void *);
-
-struct hash_entry
-  {
-    void *data;
-    struct hash_entry *next;
-  };
-
-struct hash_tuning
-  {
-    /* This structure is mainly used for `hash_initialize', see the block
-       documentation of `hash_reset_tuning' for more complete comments.  */
-
-    float shrink_threshold;    /* ratio of used buckets to trigger a shrink */
-    float shrink_factor;       /* ratio of new smaller size to original size */
-    float growth_threshold;    /* ratio of used buckets to trigger a growth */
-    float growth_factor;       /* ratio of new bigger size to original size */
-    bool is_n_buckets;         /* if CANDIDATE really means table size */
-  };
-
-typedef struct hash_tuning Hash_tuning;
-
-struct hash_table;
-
-typedef struct hash_table Hash_table;
-
-/* Information and lookup.  */
-size_t hash_get_n_buckets (const Hash_table *);
-size_t hash_get_n_buckets_used (const Hash_table *);
-size_t hash_get_n_entries (const Hash_table *);
-size_t hash_get_max_bucket_length (const Hash_table *);
-bool hash_table_ok (const Hash_table *);
-void hash_print_statistics (const Hash_table *, FILE *);
-void *hash_lookup (const Hash_table *, const void *);
-
-/* Walking.  */
-void *hash_get_first (const Hash_table *);
-void *hash_get_next (const Hash_table *, const void *);
-size_t hash_get_entries (const Hash_table *, void **, size_t);
-size_t hash_do_for_each (const Hash_table *, Hash_processor, void *);
-
-/* Allocation and clean-up.  */
-size_t hash_string (const char *, size_t);
-void hash_reset_tuning (Hash_tuning *);
-Hash_table *hash_initialize (size_t, const Hash_tuning *,
-                            Hash_hasher, Hash_comparator,
-                            Hash_data_freer);
-void hash_clear (Hash_table *);
-void hash_free (Hash_table *);
-
-/* Insertion and deletion.  */
-bool hash_rehash (Hash_table *, size_t);
-void *hash_insert (Hash_table *, const void *);
-void *hash_delete (Hash_table *, const void *);
-
-#endif
diff --git a/src/localcharset.c b/src/localcharset.c
deleted file mode 100644 (file)
index 564b2d7..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-/* Determine a canonical name for the current locale's character encoding.
-
-   Copyright (C) 2000 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU Library General Public License as published
-   by the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-   USA.  */
-
-/* Written by Bruno Haible <haible@clisp.cons.org>.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if HAVE_STDDEF_H
-# include <stddef.h>
-#endif
-
-#include <stdio.h>
-#if HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-#endif
-#if HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-
-#if defined _WIN32 || defined __WIN32__
-# undef WIN32   /* avoid warning on mingw32 */
-# define WIN32
-#endif
-
-#ifndef WIN32
-# if HAVE_LANGINFO_CODESET
-#  include <langinfo.h>
-# else
-#  if HAVE_SETLOCALE
-#   include <locale.h>
-#  endif
-# endif
-#else /* WIN32 */
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-#endif
-
-#ifndef DIRECTORY_SEPARATOR
-# define DIRECTORY_SEPARATOR '/'
-#endif
-
-#ifndef ISSLASH
-# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
-#endif
-
-/* The following static variable is declared 'volatile' to avoid a
-   possible multithread problem in the function get_charset_aliases. If we
-   are running in a threaded environment, and if two threads initialize
-   'charset_aliases' simultaneously, both will produce the same value,
-   and everything will be ok if the two assignments to 'charset_aliases'
-   are atomic. But I don't know what will happen if the two assignments mix.  */
-/* Pointer to the contents of the charset.alias file, if it has already been
-   read, else NULL.  Its format is:
-   ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0'  */
-static char * volatile charset_aliases;
-
-/* Return a pointer to the contents of the charset.alias file.  */
-static const char *
-get_charset_aliases (void)
-{
-  static char empty[1] = "";
-  char *cp;
-
-  cp = charset_aliases;
-  if (cp == NULL)
-    {
-#ifndef WIN32
-      FILE *fp;
-      const char *dir = LIBDIR;
-      const char *base = "charset.alias";
-      char *file_name;
-
-      /* Concatenate dir and base into freshly allocated file_name.  */
-      {
-       size_t dir_len = strlen (dir);
-       size_t base_len = strlen (base);
-       int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
-       file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
-       if (file_name != NULL)
-         {
-           memcpy (file_name, dir, dir_len);
-           if (add_slash)
-             file_name[dir_len] = DIRECTORY_SEPARATOR;
-           memcpy (file_name + dir_len + add_slash, base, base_len + 1);
-         }
-      }
-
-      if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
-       /* Out of memory or file not found, treat it as empty.  */
-       cp = empty;
-      else
-       {
-         /* Parse the file's contents.  */
-         int c;
-         char buf1[50+1];
-         char buf2[50+1];
-         char *res_ptr = NULL;
-         size_t res_size = 0;
-         size_t l1, l2;
-
-         for (;;)
-           {
-             c = getc (fp);
-             if (c == EOF)
-               break;
-             if (c == '\n' || c == ' ' || c == '\t')
-               continue;
-             if (c == '#')
-               {
-                 /* Skip comment, to end of line.  */
-                 do
-                   c = getc (fp);
-                 while (!(c == EOF || c == '\n'));
-                 if (c == EOF)
-                   break;
-                 continue;
-               }
-             ungetc (c, fp);
-             if (fscanf(fp, "%50s %50s", buf1, buf2) < 2)
-               break;
-             l1 = strlen (buf1);
-             l2 = strlen (buf2);
-             if (res_size == 0)
-               {
-                 res_size = l1 + 1 + l2 + 1;
-                 res_ptr = (char *) malloc (res_size + 1);
-               }
-             else
-               {
-                 res_size += l1 + 1 + l2 + 1;
-                 res_ptr = (char *) realloc (res_ptr, res_size + 1);
-               }
-             if (res_ptr == NULL)
-               {
-                 /* Out of memory. */
-                 res_size = 0;
-                 break;
-               }
-             strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
-             strcpy (res_ptr + res_size - (l2 + 1), buf2);
-           }
-         fclose (fp);
-         if (res_size == 0)
-           cp = empty;
-         else
-           {
-             *(res_ptr + res_size) = '\0';
-             cp = res_ptr;
-           }
-       }
-
-      if (file_name != NULL)
-       free (file_name);
-
-#else /* WIN32 */
-
-      /* To avoid the troubles of installing a separate file in the same
-        directory as the DLL and of retrieving the DLL's directory at
-        runtime, simply inline the aliases here.  */
-
-      cp = "CP936" "\0" "GBK" "\0"
-          "CP1361" "\0" "JOHAB" "\0";
-#endif
-
-      charset_aliases = cp;
-    }
-
-  return cp;
-}
-
-/* Determine the current locale's character encoding, and canonicalize it
-   into one of the canonical names listed in config.charset.
-   The result must not be freed; it is statically allocated.
-   If the canonical name cannot be determined, the result is a non-canonical
-   name or NULL.  */
-
-#ifdef STATIC
-STATIC
-#endif
-const char *
-locale_charset (void)
-{
-  const char *codeset;
-  const char *aliases;
-
-#ifndef WIN32
-
-# if HAVE_LANGINFO_CODESET
-
-  /* Most systems support nl_langinfo (CODESET) nowadays.  */
-  codeset = nl_langinfo (CODESET);
-
-# else
-
-  /* On old systems which lack it, use setlocale and getenv.  */
-  const char *locale = NULL;
-
-#  if HAVE_SETLOCALE
-  locale = setlocale (LC_CTYPE, NULL);
-#  endif
-  if (locale == NULL || locale[0] == '\0')
-    {
-      locale = getenv ("LC_ALL");
-      if (locale == NULL || locale[0] == '\0')
-       {
-         locale = getenv ("LC_CTYPE");
-         if (locale == NULL || locale[0] == '\0')
-           locale = getenv ("LANG");
-       }
-    }
-
-  /* On some old systems, one used to set locale = "iso8859_1". On others,
-     you set it to "language_COUNTRY.charset". In any case, we resolve it
-     through the charset.alias file.  */
-  codeset = locale;
-
-# endif
-
-#else /* WIN32 */
-
-  static char buf[2 + 10 + 1];
-
-  /* Win32 has a function returning the locale's codepage as a number.  */
-  sprintf (buf, "CP%u", GetACP ());
-  codeset = buf;
-
-#endif
-
-  if (codeset != NULL && codeset[0] != '\0')
-    {
-      /* Resolve alias. */
-      for (aliases = get_charset_aliases ();
-          *aliases != '\0';
-          aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
-       if (!strcmp (codeset, aliases))
-         {
-           codeset = aliases + strlen (aliases) + 1;
-           break;
-         }
-    }
-
-  return codeset;
-}
index 8f99ac40a54438b9e2a9ab94c717178e3350c58e..5874cb117dfb3ddddd27342b1c86b59d92e0493f 100644 (file)
 #include "common.h"
 
 #include <ctype.h>
-
 #include <sys/types.h>
 #include <sys/stat.h>
-
-#include "getopt.h"
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_STRUCT_UTIMBUF
-# if HAVE_UTIME_H
-#  include <utime.h>
-# endif
-#else
-
-struct utimbuf
-{
-  time_t actime;
-  time_t modtime;
-};
-
-#endif
-
+#include <unistd.h>
+#include <utime.h>
 #include <setjmp.h>
 
-#if OS2
-# include <io.h>
-# include <fcntl.h>
-#endif
+#include "getopt.h"
 \f
 /* Variables.  */
 
@@ -173,7 +150,7 @@ static jmp_buf signal_label;        /* where to jump when signal received */
 #endif
 static bool interrupted = 0;   /* set when some signal has been received */
 
-static RETSIGTYPE
+static void
 signal_handler (int number)
 {
   interrupted = 1;
@@ -184,6 +161,8 @@ signal_handler (int number)
 | Prepare to handle signals, intercept willingful requests for stopping.  |
 `------------------------------------------------------------------------*/
 
+/* FIXME: Use sigaction */
+
 static void
 setup_signals (void)
 {
@@ -379,7 +358,7 @@ main (int argc, char *const *argv)
   int option_char;             /* option character */
   bool success = true;         /* reversibility of all recodings */
 
-  static bool (*processor) PARAMS ((RECODE_TASK));
+  static bool (*processor) (RECODE_TASK);
   struct recode_outer outer_option;
   struct recode_request request_option;
   struct recode_task task_option;
index 77bc183583f4d69563a4e4052ed1c3d513dd0eb8..360c7470d49a0912448a94755e4e3f7052e38a37 100644 (file)
@@ -228,7 +228,7 @@ declare_iconv (RECODE_OUTER outer, const char *name, const char *iconv_name)
 `------------------------------------------------*/
 
 bool register_explode_data
-  PARAMS ((RECODE_OUTER, const char *, const unsigned short *));
+  (RECODE_OUTER, const char *, const unsigned short *);
 
 bool
 register_explode_data (RECODE_OUTER outer,
@@ -435,8 +435,8 @@ estimate_single_cost (RECODE_OUTER outer, RECODE_SINGLE single)
 `----------------------------------------*/
 
 #include "decsteps.h"
-bool module_iconv PARAMS ((struct recode_outer *));
-void delmodule_iconv PARAMS ((struct recode_outer *));
+bool module_iconv (struct recode_outer *);
+void delmodule_iconv (struct recode_outer *);
 
 static bool
 register_all_modules (RECODE_OUTER outer)
diff --git a/src/quotearg.c b/src/quotearg.c
deleted file mode 100644 (file)
index 0bef8cb..0000000
+++ /dev/null
@@ -1,403 +0,0 @@
-/* quotearg.c - quote arguments for output
-   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-/* Written by Paul Eggert <eggert@twinsun.com> */
-
-/* FIXME: Multibyte characters are not supported yet.  */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <quotearg.h>
-#include <xalloc.h>
-
-#include <ctype.h>
-#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
-# define ISASCII(c) 1
-#else
-# define ISASCII(c) isascii (c)
-#endif
-#ifdef isgraph
-# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
-#else
-# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
-#endif
-
-#if ENABLE_NLS
-# include <libintl.h>
-# define _(text) gettext (text)
-#else
-# define _(text) text
-#endif
-
-#if HAVE_LIMITS_H
-# include <limits.h>
-#endif
-#ifndef CHAR_BIT
-# define CHAR_BIT 8
-#endif
-#ifndef UCHAR_MAX
-# define UCHAR_MAX ((unsigned char) -1)
-#endif
-
-#if HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#define INT_BITS (sizeof (int) * CHAR_BIT)
-
-struct quoting_options
-{
-  /* Basic quoting style.  */
-  enum quoting_style style;
-
-  /* Quote the chararacters indicated by this bit vector even if the
-     quoting style would not normally require them to be quoted.  */
-  int quote_these_too[((UCHAR_MAX + 1) / INT_BITS
-                      + ((UCHAR_MAX + 1) % INT_BITS != 0))];
-};
-
-/* Names of quoting styles.  */
-char const *const quoting_style_args[] =
-{
-  "literal",
-  "shell",
-  "shell-always",
-  "c",
-  "escape",
-  "locale",
-  0
-};
-
-/* Correspondances to quoting style names.  */
-enum quoting_style const quoting_style_vals[] =
-{
-  literal_quoting_style,
-  shell_quoting_style,
-  shell_always_quoting_style,
-  c_quoting_style,
-  escape_quoting_style,
-  locale_quoting_style
-};
-
-/* The default quoting options.  */
-static struct quoting_options default_quoting_options;
-
-/* Allocate a new set of quoting options, with contents initially identical
-   to O if O is not null, or to the default if O is null.
-   It is the caller's responsibility to free the result.  */
-struct quoting_options *
-clone_quoting_options (struct quoting_options *o)
-{
-  struct quoting_options *p
-    = (struct quoting_options *) xmalloc (sizeof (struct quoting_options));
-  *p = *(o ? o : &default_quoting_options);
-  return p;
-}
-
-/* Get the value of O's quoting style.  If O is null, use the default.  */
-enum quoting_style
-get_quoting_style (struct quoting_options *o)
-{
-  return (o ? o : &default_quoting_options)->style;
-}
-
-/* In O (or in the default if O is null),
-   set the value of the quoting style to S.  */
-void
-set_quoting_style (struct quoting_options *o, enum quoting_style s)
-{
-  (o ? o : &default_quoting_options)->style = s;
-}
-
-/* In O (or in the default if O is null),
-   set the value of the quoting options for character C to I.
-   Return the old value.  Currently, the only values defined for I are
-   0 (the default) and 1 (which means to quote the character even if
-   it would not otherwise be quoted).  */
-int
-set_char_quoting (struct quoting_options *o, char c, int i)
-{
-  unsigned char uc = c;
-  int *p = (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
-  int shift = uc % INT_BITS;
-  int r = (*p >> shift) & 1;
-  *p ^= ((i & 1) ^ r) << shift;
-  return r;
-}
-
-/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
-   argument ARG (of size ARGSIZE), using O to control quoting.
-   If O is null, use the default.
-   Terminate the output with a null character, and return the written
-   size of the output, not counting the terminating null.
-   If BUFFERSIZE is too small to store the output string, return the
-   value that would have been returned had BUFFERSIZE been large enough.
-   If ARGSIZE is -1, use the string length of the argument for ARGSIZE.  */
-size_t
-quotearg_buffer (char *buffer, size_t buffersize,
-                char const *arg, size_t argsize,
-                struct quoting_options const *o)
-{
-  unsigned char c;
-  size_t i;
-  size_t len = 0;
-  char const *quote_string;
-  size_t quote_string_len;
-  struct quoting_options const *p = o ? o : &default_quoting_options;
-  enum quoting_style quoting_style = p->style;
-#define STORE(c) \
-    do \
-      { \
-       if (len < buffersize) \
-         buffer[len] = (c); \
-         len++; \
-      } \
-    while (0)
-
-  switch (quoting_style)
-    {
-    case shell_quoting_style:
-      if (! (argsize == (size_t) -1 ? arg[0] == '\0' : argsize == 0))
-       {
-         switch (arg[0])
-           {
-           case '#': case '~':
-             break;
-
-           default:
-             for (i = 0; ; i++)
-               {
-                 if (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize)
-                   goto done;
-
-                 c = arg[i];
-
-                 switch (c)
-                   {
-                   case '\t': case '\n': case ' ':
-                   case '!': /* special in csh */
-                   case '"': case '$': case '&': case '\'':
-                   case '(': case ')': case '*': case ';':
-                   case '<': case '>': case '?': case '[': case '\\':
-                   case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
-                   case '`': case '|':
-                     goto needs_quoting;
-                   }
-
-                 if (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
-                   goto needs_quoting;
-
-                 STORE (c);
-               }
-           needs_quoting:;
-
-             len = 0;
-             break;
-           }
-       }
-      /* Fall through.  */
-
-    case shell_always_quoting_style:
-      STORE ('\'');
-      quote_string = "'";
-      quote_string_len = 1;
-      break;
-
-    case c_quoting_style:
-      STORE ('"');
-      quote_string = "\"";
-      quote_string_len = 1;
-      break;
-
-    case locale_quoting_style:
-      for (quote_string = _("`"); *quote_string; quote_string++)
-       STORE (*quote_string);
-      quote_string = _("'");
-      quote_string_len = strlen (quote_string);
-      break;
-
-    default:
-      quote_string = 0;
-      quote_string_len = 0;
-      break;
-    }
-
-  for (i = 0;  ! (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize);  i++)
-    {
-      c = arg[i];
-
-      switch (quoting_style)
-       {
-       case literal_quoting_style:
-         break;
-
-       case shell_quoting_style:
-       case shell_always_quoting_style:
-         if (c == '\'')
-           {
-             STORE ('\'');
-             STORE ('\\');
-             STORE ('\'');
-           }
-         break;
-
-       case c_quoting_style:
-       case escape_quoting_style:
-       case locale_quoting_style:
-         switch (c)
-           {
-           case '?': /* Do not generate trigraphs.  */
-           case '\\': goto store_escape;
-             /* Not all C compilers know what \a means.  */
-           case   7 : c = 'a'; goto store_escape;
-           case '\b': c = 'b'; goto store_escape;
-           case '\f': c = 'f'; goto store_escape;
-           case '\n': c = 'n'; goto store_escape;
-           case '\r': c = 'r'; goto store_escape;
-           case '\t': c = 't'; goto store_escape;
-           case '\v': c = 'v'; goto store_escape;
-
-           case ' ': break;
-
-           default:
-             if (quote_string_len
-                 && strncmp (arg + i, quote_string, quote_string_len) == 0)
-               goto store_escape;
-             if (!ISGRAPH (c))
-               {
-                 STORE ('\\');
-                 STORE ('0' + (c >> 6));
-                 STORE ('0' + ((c >> 3) & 7));
-                 c = '0' + (c & 7);
-                 goto store_c;
-               }
-             break;
-           }
-
-         if (! (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
-           goto store_c;
-
-       store_escape:
-         STORE ('\\');
-       }
-
-    store_c:
-      STORE (c);
-    }
-
-  if (quote_string)
-    for (; *quote_string; quote_string++)
-      STORE (*quote_string);
-
- done:
-  if (len < buffersize)
-    buffer[len] = '\0';
-  return len;
-}
-
-/* Use storage slot N to return a quoted version of the string ARG.
-   OPTIONS specifies the quoting options.
-   The returned value points to static storage that can be
-   reused by the next call to this function with the same value of N.
-   N must be nonnegative.  N is deliberately declared with type `int'
-   to allow for future extensions (using negative values).  */
-static char *
-quotearg_n_options (int n, char const *arg,
-                   struct quoting_options const *options)
-{
-  static unsigned int nslots;
-  static struct slotvec
-    {
-      size_t size;
-      char *val;
-    } *slotvec;
-
-  if (nslots <= n)
-    {
-      int n1 = n + 1;
-      size_t s = n1 * sizeof (struct slotvec);
-      if (! (0 < n1 && n1 == s / sizeof (struct slotvec)))
-       abort ();
-      slotvec = (struct slotvec *) xrealloc (slotvec, s);
-      memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec));
-      nslots = n;
-    }
-
-  {
-    size_t size = slotvec[n].size;
-    char *val = slotvec[n].val;
-    size_t qsize = quotearg_buffer (val, size, arg, (size_t) -1, options);
-
-    if (size <= qsize)
-      {
-       slotvec[n].size = size = qsize + 1;
-       slotvec[n].val = val = (char *) xrealloc (val, size);
-       quotearg_buffer (val, size, arg, (size_t) -1, options);
-      }
-
-    return val;
-  }
-}
-
-char *
-quotearg_n (unsigned int n, char const *arg)
-{
-  return quotearg_n_options (n, arg, &default_quoting_options);
-}
-
-char *
-quotearg (char const *arg)
-{
-  return quotearg_n (0, arg);
-}
-
-char *
-quotearg_n_style (unsigned int n, enum quoting_style s, char const *arg)
-{
-  struct quoting_options o;
-  o.style = s;
-  memset (o.quote_these_too, 0, sizeof o.quote_these_too);
-  return quotearg_n_options (n, arg, &o);
-}
-
-char *
-quotearg_style (enum quoting_style s, char const *arg)
-{
-  return quotearg_n_style (0, s, arg);
-}
-
-char *
-quotearg_char (char const *arg, char ch)
-{
-  struct quoting_options options;
-  options = default_quoting_options;
-  set_char_quoting (&options, ch, 1);
-  return quotearg_n_options (0, arg, &options);
-}
-
-char *
-quotearg_colon (char const *arg)
-{
-  return quotearg_char (arg, ':');
-}
diff --git a/src/quotearg.h b/src/quotearg.h
deleted file mode 100644 (file)
index 2a600e7..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/* quotearg.h - quote arguments for output
-   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-/* Written by Paul Eggert <eggert@twinsun.com> */
-
-/* Basic quoting styles.  */
-enum quoting_style
-  {
-    literal_quoting_style,     /* --quoting-style=literal */
-    shell_quoting_style,       /* --quoting-style=shell */
-    shell_always_quoting_style,        /* --quoting-style=shell-always */
-    c_quoting_style,           /* --quoting-style=c */
-    escape_quoting_style,      /* --quoting-style=escape */
-    locale_quoting_style       /* --quoting-style=locale */
-  };
-
-/* For now, --quoting-style=literal is the default, but this may change.  */
-#ifndef DEFAULT_QUOTING_STYLE
-# define DEFAULT_QUOTING_STYLE literal_quoting_style
-#endif
-
-/* Names of quoting styles and their corresponding values.  */
-extern char const *const quoting_style_args[];
-extern enum quoting_style const quoting_style_vals[];
-
-struct quoting_options;
-
-#ifndef PARAMS
-# if defined PROTOTYPES || defined __STDC__
-#  define PARAMS(Args) Args
-# else
-#  define PARAMS(Args) ()
-# endif
-#endif
-
-/* The functions listed below set and use a hidden variable
-   that contains the default quoting style options.  */
-
-/* Allocate a new set of quoting options, with contents initially identical
-   to O if O is not null, or to the default if O is null.
-   It is the caller's responsibility to free the result.  */
-struct quoting_options *clone_quoting_options
-   PARAMS ((struct quoting_options *o));
-
-/* Get the value of O's quoting style.  If O is null, use the default.  */
-enum quoting_style get_quoting_style PARAMS ((struct quoting_options *o));
-
-/* In O (or in the default if O is null),
-   set the value of the quoting style to S.  */
-void set_quoting_style PARAMS ((struct quoting_options *o,
-                               enum quoting_style s));
-
-/* In O (or in the default if O is null),
-   set the value of the quoting options for character C to I.
-   Return the old value.  Currently, the only values defined for I are
-   0 (the default) and 1 (which means to quote the character even if
-   it would not otherwise be quoted).  */
-int set_char_quoting PARAMS ((struct quoting_options *o, char c, int i));
-
-/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
-   argument ARG (of size ARGSIZE), using O to control quoting.
-   If O is null, use the default.
-   Terminate the output with a null character, and return the written
-   size of the output, not counting the terminating null.
-   If BUFFERSIZE is too small to store the output string, return the
-   value that would have been returned had BUFFERSIZE been large enough.
-   If ARGSIZE is -1, use the string length of the argument for ARGSIZE.  */
-size_t quotearg_buffer PARAMS ((char *buffer, size_t buffersize,
-                               char const *arg, size_t argsize,
-                               struct quoting_options const *o));
-
-/* Use storage slot N to return a quoted version of the string ARG.
-   Use the default quoting options.
-   The returned value points to static storage that can be
-   reused by the next call to this function with the same value of N.
-   N must be nonnegative.  */
-char *quotearg_n PARAMS ((unsigned int n, char const *arg));
-
-/* Equivalent to quotearg_n (0, ARG).  */
-char *quotearg PARAMS ((char const *arg));
-
-/* Use style S and storage slot N to return a quoted version of the string ARG.
-   This is like quotearg_n (N, ARG), except that it uses S with no other
-   options to specify the quoting method.  */
-char *quotearg_n_style PARAMS ((unsigned int n, enum quoting_style s,
-                               char const *arg));
-
-/* Equivalent to quotearg_n_style (0, S, ARG).  */
-char *quotearg_style PARAMS ((enum quoting_style s, char const *arg));
-
-/* Like quotearg (ARG), except also quote any instances of CH.  */
-char *quotearg_char PARAMS ((char const *arg, char ch));
-
-/* Equivalent to quotearg_char (ARG, ':').  */
-char *quotearg_colon PARAMS ((char const *arg));
index 776451b8fcfa3451975247cf1d21ef92759e7817..ccd1103696059dca177ccce5a4843d26004d61cd 100644 (file)
 /* Global declarations and definitions.  */
 
 #include <ctype.h>
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if WITH_DMALLOC
-# include <dmalloc.h>
-#endif
+#include <unistd.h>
 
 #include "hash.h"
 
@@ -37,70 +30,29 @@ extern const char *program_name;
 \f
 /* Error handling.  */
 
-#if HAVE_VPRINTF || HAVE_DOPRNT
-# if __STDC__
-#  include <stdarg.h>
-#  define VA_START(args, lastarg) va_start(args, lastarg)
-# else
-#  include <varargs.h>
-#  define VA_START(args, lastarg) va_start(args)
-# endif
-#else
-# define va_alist a1, a2, a3, a4, a5, a6, a7, a8
-# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
-#endif
+#include <stdarg.h>
 
 void
-#if defined(VA_START) && __STDC__
 recode_error (RECODE_OUTER outer, const char *format, ...)
-#else
-recode_error (outer, format, va_alist)
-     RECODE_OUTER outer;
-     const char *format;
-     va_dcl
-#endif
 {
-#ifdef VA_START
   va_list args;
 
-  VA_START (args, format);
-# if HAVE_VPRINTF
+  va_start (args, format);
   vfprintf (stderr, format, args);
-# else
-  _doprnt (format, args, stderr);
-# endif
   va_end (args);
-#else
-  fprintf (stderr, format, a1, a2, a3, a4, a5, a6, a7, a8);
-#endif
   putc ('\n', stderr);
   fflush (stderr);
 }
 
 void
-#if defined(VA_START) && __STDC__
 recode_perror (RECODE_OUTER outer, const char *format, ...)
-#else
-recode_perror (outer, format, va_alist)
-     RECODE_OUTER outer;
-     const char *format;
-     va_dcl
-#endif
 {
   int saved_errno = errno;
-#ifdef VA_START
   va_list args;
 
-  VA_START (args, format);
-# if HAVE_VPRINTF
+  va_start (args, format);
   vfprintf (stderr, format, args);
-# else
-  _doprnt (format, args, stderr);
-# endif
   va_end (args);
-#else
-  fprintf (stderr, format, a1, a2, a3, a4, a5, a6, a7, a8);
-#endif
   fprintf (stderr, ": %s\n", strerror (saved_errno));
   fflush (stderr);
 }
index 352ccf034537608a2aedcaaf9275a5760cf89e68..d774a294ea0834d59a3eb128991b34b13346c293 100644 (file)
    If not, write to the Free Software Foundation, Inc., 59 Temple Place -
    Suite 330, Boston, MA 02111-1307, USA.  */
 
-#ifndef PARAMS
-# if __STDC__
-#  define PARAMS(Args) Args
-# else
-#  define PARAMS(Args) ()
-# endif
-#endif
-
 /* Published (opaque) typedefs.  */
 typedef struct recode_outer *                  RECODE_OUTER;
 typedef struct recode_request *                        RECODE_REQUEST;
@@ -65,56 +57,56 @@ extern "C" {
 #define RECODE_AUTO_ABORT_FLAG 1
 #define RECODE_NO_ICONV_FLAG 2
 
-RECODE_OUTER recode_new_outer PARAMS ((unsigned));
-bool recode_delete_outer PARAMS ((RECODE_OUTER));
+RECODE_OUTER recode_new_outer (unsigned);
+bool recode_delete_outer (RECODE_OUTER);
 
-bool list_all_symbols PARAMS ((RECODE_OUTER, RECODE_CONST_SYMBOL));
-bool list_concise_charset PARAMS ((RECODE_OUTER, RECODE_CONST_SYMBOL,
-                                 const enum recode_list_format));
-bool list_full_charset PARAMS ((RECODE_OUTER, RECODE_CONST_SYMBOL));
+bool list_all_symbols (RECODE_OUTER, RECODE_CONST_SYMBOL);
+bool list_concise_charset (RECODE_OUTER, RECODE_CONST_SYMBOL,
+                           const enum recode_list_format);
+bool list_full_charset (RECODE_OUTER, RECODE_CONST_SYMBOL);
 
 /*----------------------------------.
 | Recode library at REQUEST level.  |
 `----------------------------------*/
 
-RECODE_REQUEST recode_new_request PARAMS ((RECODE_OUTER));
-bool recode_delete_request PARAMS ((RECODE_REQUEST));
-bool recode_scan_request PARAMS ((RECODE_REQUEST, const char *));
-
-bool recode_format_table PARAMS ((RECODE_REQUEST,
-                                 enum recode_programming_language,
-                                 const char *));
-
-char *recode_string PARAMS ((RECODE_CONST_REQUEST, const char *));
-
-bool recode_string_to_buffer PARAMS ((RECODE_CONST_REQUEST,
-                                     const char *,
-                                     char **, size_t *, size_t *));
-bool recode_string_to_file PARAMS ((RECODE_CONST_REQUEST,
-                                   const char *,
-                                   FILE *));
-bool recode_buffer_to_buffer PARAMS ((RECODE_CONST_REQUEST,
-                                     const char *, size_t,
-                                     char **, size_t *, size_t *));
-bool recode_buffer_to_file PARAMS ((RECODE_CONST_REQUEST,
-                                   const char *, size_t,
-                                   FILE *));
-bool recode_file_to_buffer PARAMS ((RECODE_CONST_REQUEST,
-                                   FILE *,
-                                   char **, size_t *, size_t *));
-bool recode_file_to_file PARAMS ((RECODE_CONST_REQUEST,
-                                 FILE *,
-                                 FILE *));
+RECODE_REQUEST recode_new_request (RECODE_OUTER);
+bool recode_delete_request (RECODE_REQUEST);
+bool recode_scan_request (RECODE_REQUEST, const char *);
+
+bool recode_format_table (RECODE_REQUEST,
+                          enum recode_programming_language,
+                          const char *);
+
+char *recode_string (RECODE_CONST_REQUEST, const char *);
+
+bool recode_string_to_buffer (RECODE_CONST_REQUEST,
+                              const char *,
+                              char **, size_t *, size_t *);
+bool recode_string_to_file (RECODE_CONST_REQUEST,
+                            const char *,
+                            FILE *);
+bool recode_buffer_to_buffer (RECODE_CONST_REQUEST,
+                              const char *, size_t,
+                              char **, size_t *, size_t *);
+bool recode_buffer_to_file (RECODE_CONST_REQUEST,
+                            const char *, size_t,
+                            FILE *);
+bool recode_file_to_buffer (RECODE_CONST_REQUEST,
+                            FILE *,
+                            char **, size_t *, size_t *);
+bool recode_file_to_file (RECODE_CONST_REQUEST,
+                          FILE *,
+                          FILE *);
 
 /*-------------------------------.
 | Recode library at TASK level.  |
 `-------------------------------*/
 
-RECODE_TASK recode_new_task PARAMS ((RECODE_CONST_REQUEST));
-bool recode_delete_task PARAMS ((RECODE_TASK));
-bool recode_perform_task PARAMS ((RECODE_TASK));
-/* FILE *recode_filter_open PARAMS ((RECODE_TASK, FILE *)); */
-/* bool recode_filter_close PARAMS ((RECODE_TASK)); */
+RECODE_TASK recode_new_task (RECODE_CONST_REQUEST);
+bool recode_delete_task (RECODE_TASK);
+bool recode_perform_task (RECODE_TASK);
+/* FILE *recode_filter_open (RECODE_TASK, FILE *); */
+/* bool recode_filter_close (RECODE_TASK); */
 
 #ifdef __cplusplus
 }
index 8533799a36eaf7c52768bdb8869d858fb9ea5578..d4a8db47ee1db50272aa8517a2cc41fc691b77a2 100644 (file)
 # define get_quoting_style librecode_get_quoting_style
 # define get_ucs2 librecode_get_ucs2
 # define get_ucs4 librecode_get_ucs4
-# define hash_clear librecode_hash_clear
-# define hash_delete librecode_hash_delete
-# define hash_do_for_each librecode_hash_do_for_each
-# define hash_free librecode_hash_free
-# define hash_get_entries librecode_hash_get_entries
-# define hash_get_first librecode_hash_get_first
-# define hash_get_max_bucket_length librecode_hash_get_max_bucket_length
-# define hash_get_n_buckets librecode_hash_get_n_buckets
-# define hash_get_n_buckets_used librecode_hash_get_n_buckets_used
-# define hash_get_n_entries librecode_hash_get_n_entries
-# define hash_get_next librecode_hash_get_next
-# define hash_initialize librecode_hash_initialize
-# define hash_insert librecode_hash_insert
-# define hash_lookup librecode_hash_lookup
-# define hash_print_statistics librecode_hash_print_statistics
-# define hash_rehash librecode_hash_rehash
-# define hash_reset_tuning librecode_hash_reset_tuning
-# define hash_string librecode_hash_string
-# define hash_table_ok librecode_hash_table_ok
 # define init_combine librecode_init_combine
 # define init_explode librecode_init_explode
 # define init_ucs2_to_byte librecode_init_ucs2_to_byte
 # define list_all_symbols librecode_list_all_symbols
 # define list_concise_charset librecode_list_concise_charset
 # define list_full_charset librecode_list_full_charset
-# define locale_charset librecode_locale_charset
 # define make_argmatch_arrays librecode_make_argmatch_arrays
 # define module_african librecode_module_african
 # define module_afrtran librecode_module_afrtran
 # define ucs2_to_charname librecode_ucs2_to_charname
 # define ucs2_to_french_charname librecode_ucs2_to_french_charname
 # define ucs2_to_rfc1345 librecode_ucs2_to_rfc1345
-# define x2nrealloc librecode_x2nrealloc
-# define x2realloc librecode_x2realloc
-# define xalloc_die librecode_xalloc_die
-# define xcalloc librecode_xcalloc
-# define xmalloc librecode_xmalloc
-# define xmemdup librecode_xmemdup
-# define xnmalloc librecode_xnmalloc
-# define xnrealloc librecode_xnrealloc
-# define xrealloc librecode_xrealloc
-# define xstrdup librecode_xstrdup
-# define xzalloc librecode_xzalloc
 
 #endif /* ! CLEANER_H_ */
 /* Conversion of files between different charsets and surfaces.
@@ -423,12 +392,12 @@ struct recode_surface_list
 | Description of a single step of recoding.  |
 `-------------------------------------------*/
 
-typedef bool (*Recode_init) PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST,
-                                    RECODE_CONST_OPTION_LIST,
-                                    RECODE_CONST_OPTION_LIST));
-typedef bool (*Recode_term) PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST));
-typedef bool (*Recode_transform) PARAMS ((RECODE_SUBTASK));
-typedef bool (*Recode_fallback) PARAMS ((RECODE_SUBTASK, unsigned));
+typedef bool (*Recode_init) (RECODE_STEP, RECODE_CONST_REQUEST,
+                             RECODE_CONST_OPTION_LIST,
+                             RECODE_CONST_OPTION_LIST);
+typedef bool (*Recode_term) (RECODE_STEP, RECODE_CONST_REQUEST);
+typedef bool (*Recode_transform) (RECODE_SUBTASK);
+typedef bool (*Recode_fallback) (RECODE_SUBTASK, unsigned);
 
 /* The `single' structure holds data needed to decide of sequences, and is
    invariant over actual requests.  The `step' structure holds data needed for
@@ -756,25 +725,25 @@ extern "C" {
                                       (Count) * sizeof(Type)), \
    Variable)
 
-void recode_error PARAMS ((RECODE_OUTER, const char *, ...));
-void recode_perror PARAMS ((RECODE_OUTER, const char *, ...));
-void *recode_malloc PARAMS ((RECODE_OUTER, size_t));
-void *recode_realloc PARAMS ((RECODE_OUTER, void *, size_t));
-
-unsigned char *invert_table PARAMS ((RECODE_OUTER, const unsigned char *));
-bool complete_pairs PARAMS ((RECODE_OUTER, RECODE_STEP,
-                            const struct recode_known_pair *, unsigned,
-                            bool, bool));
-bool transform_byte_to_ucs2 PARAMS ((RECODE_SUBTASK));
-bool init_ucs2_to_byte PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST,
-                               RECODE_CONST_OPTION_LIST,
-                               RECODE_CONST_OPTION_LIST));
-bool transform_ucs2_to_byte PARAMS ((RECODE_SUBTASK));
+void recode_error (RECODE_OUTER, const char *, ...);
+void recode_perror (RECODE_OUTER, const char *, ...);
+void *recode_malloc (RECODE_OUTER, size_t);
+void *recode_realloc (RECODE_OUTER, void *, size_t);
+
+unsigned char *invert_table (RECODE_OUTER, const unsigned char *);
+bool complete_pairs (RECODE_OUTER, RECODE_STEP,
+                     const struct recode_known_pair *, unsigned,
+                     bool, bool);
+bool transform_byte_to_ucs2 (RECODE_SUBTASK);
+bool init_ucs2_to_byte (RECODE_STEP, RECODE_CONST_REQUEST,
+                        RECODE_CONST_OPTION_LIST,
+                        RECODE_CONST_OPTION_LIST);
+bool transform_ucs2_to_byte (RECODE_SUBTASK);
 
 /* charname.c and fr-charname.c.  */
 
-const char *ucs2_to_charname PARAMS ((int));
-const char *ucs2_to_french_charname PARAMS ((int));
+const char *ucs2_to_charname (int);
+const char *ucs2_to_french_charname (int);
 
 /* charset.c.  */
 
@@ -789,73 +758,69 @@ enum alias_find_type
 };
 
 int code_to_ucs2 (RECODE_CONST_SYMBOL, unsigned);
-bool prepare_for_aliases PARAMS ((RECODE_OUTER));
-RECODE_ALIAS declare_alias PARAMS ((RECODE_OUTER,
-                                    const char *, const char *));
-bool declare_implied_surface PARAMS ((RECODE_OUTER, RECODE_ALIAS,
-                                   RECODE_CONST_SYMBOL));
-bool make_argmatch_arrays PARAMS ((RECODE_OUTER));
-RECODE_ALIAS find_alias PARAMS ((RECODE_OUTER, const char *,
-                                  enum alias_find_type));
-bool find_and_report_subsets PARAMS ((RECODE_OUTER));
-bool decode_known_pairs PARAMS ((RECODE_OUTER, const char *));
+bool prepare_for_aliases (RECODE_OUTER);
+RECODE_ALIAS declare_alias (RECODE_OUTER,
+                            const char *, const char *);
+bool declare_implied_surface (RECODE_OUTER, RECODE_ALIAS,
+                              RECODE_CONST_SYMBOL);
+bool make_argmatch_arrays (RECODE_OUTER);
+RECODE_ALIAS find_alias (RECODE_OUTER, const char *,
+                         enum alias_find_type);
+bool find_and_report_subsets (RECODE_OUTER);
+bool decode_known_pairs (RECODE_OUTER, const char *);
 
 /* combine.c.  */
 
 #define DONE NOT_A_CHARACTER
 #define ELSE BYTE_ORDER_MARK_SWAPPED
 
-bool init_explode PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST,
-                          RECODE_CONST_OPTION_LIST,
-                          RECODE_CONST_OPTION_LIST));
-bool explode_byte_byte PARAMS ((RECODE_SUBTASK));
-bool explode_ucs2_byte PARAMS ((RECODE_SUBTASK));
-bool explode_byte_ucs2 PARAMS ((RECODE_SUBTASK));
-bool explode_ucs2_ucs2 PARAMS ((RECODE_SUBTASK));
-
-bool init_combine PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST,
-                          RECODE_CONST_OPTION_LIST,
-                          RECODE_CONST_OPTION_LIST));
-bool combine_byte_byte PARAMS ((RECODE_SUBTASK));
-bool combine_ucs2_byte PARAMS ((RECODE_SUBTASK));
-bool combine_byte_ucs2 PARAMS ((RECODE_SUBTASK));
-bool combine_ucs2_ucs2 PARAMS ((RECODE_SUBTASK));
+bool init_explode (RECODE_STEP, RECODE_CONST_REQUEST,
+                   RECODE_CONST_OPTION_LIST,
+                   RECODE_CONST_OPTION_LIST);
+bool explode_byte_byte (RECODE_SUBTASK);
+bool explode_ucs2_byte (RECODE_SUBTASK);
+bool explode_byte_ucs2 (RECODE_SUBTASK);
+bool explode_ucs2_ucs2 (RECODE_SUBTASK);
+
+bool init_combine (RECODE_STEP, RECODE_CONST_REQUEST,
+                   RECODE_CONST_OPTION_LIST,
+                   RECODE_CONST_OPTION_LIST);
+bool combine_byte_byte (RECODE_SUBTASK);
+bool combine_ucs2_byte (RECODE_SUBTASK);
+bool combine_byte_ucs2 (RECODE_SUBTASK);
+bool combine_ucs2_ucs2 (RECODE_SUBTASK);
 
 /* freeze.c.  */
 
-void recode_freeze_tables PARAMS ((RECODE_OUTER));
+void recode_freeze_tables (RECODE_OUTER);
 
 /* iconv.c.  */
 
-bool transform_with_iconv PARAMS ((RECODE_SUBTASK));
-
-/* localcharset.c.  */
-
-const char *locale_charset PARAMS ((void));
+bool transform_with_iconv (RECODE_SUBTASK);
 
 /* names.c.  */
 
-bool should_prefer_french PARAMS ((void));
+bool should_prefer_french (void);
 
 /* mixed.c.  */
 
-bool transform_c_source PARAMS ((RECODE_TASK));
-bool transform_po_source PARAMS ((RECODE_TASK));
+bool transform_c_source (RECODE_TASK);
+bool transform_po_source (RECODE_TASK);
 
 /* outer.c.  */
 
-bool reversibility PARAMS ((RECODE_SUBTASK, unsigned));
+bool reversibility (RECODE_SUBTASK, unsigned);
 RECODE_SINGLE declare_single
-  PARAMS ((RECODE_OUTER, const char *, const char *,
-          struct recode_quality,
-          bool (*) (RECODE_STEP, RECODE_CONST_REQUEST,
-                    RECODE_CONST_OPTION_LIST, RECODE_CONST_OPTION_LIST),
-          bool (*) (RECODE_SUBTASK)));
-bool declare_iconv PARAMS ((RECODE_OUTER, const char *, const char *));
-bool declare_explode_data PARAMS ((RECODE_OUTER, const unsigned short *,
-                                  const char *, const char *));
-bool declare_strip_data PARAMS ((RECODE_OUTER, struct strip_data *,
-                                const char *));
+  (RECODE_OUTER, const char *, const char *,
+   struct recode_quality,
+   bool (*) (RECODE_STEP, RECODE_CONST_REQUEST,
+             RECODE_CONST_OPTION_LIST, RECODE_CONST_OPTION_LIST),
+   bool (*) (RECODE_SUBTASK));
+bool declare_iconv (RECODE_OUTER, const char *, const char *);
+bool declare_explode_data (RECODE_OUTER, const unsigned short *,
+                           const char *, const char *);
+bool declare_strip_data (RECODE_OUTER, struct strip_data *,
+                         const char *);
 
 /* pool.c.  */
 
@@ -863,21 +828,21 @@ extern const recode_ucs2 ucs2_data_pool[];
 
 /* request.c.  */
 
-char *edit_sequence PARAMS ((RECODE_REQUEST, bool));
+char *edit_sequence (RECODE_REQUEST, bool);
 
 /* rfc1345.c.  */
 
-const char *ucs2_to_rfc1345 PARAMS ((recode_ucs2));
+const char *ucs2_to_rfc1345 (recode_ucs2);
 
 /* task.c.  */
 
 #if USE_HELPERS || !INLINE_HARDER
-int get_byte_helper PARAMS ((RECODE_SUBTASK));
+int get_byte_helper (RECODE_SUBTASK);
 #endif
-void put_byte_helper PARAMS ((int, RECODE_SUBTASK));
-bool recode_if_nogo PARAMS ((enum recode_error, RECODE_SUBTASK));
-bool transform_byte_to_byte PARAMS ((RECODE_SUBTASK));
-bool transform_byte_to_variable PARAMS ((RECODE_SUBTASK));
+void put_byte_helper (int, RECODE_SUBTASK);
+bool recode_if_nogo (enum recode_error, RECODE_SUBTASK);
+bool transform_byte_to_byte (RECODE_SUBTASK);
+bool transform_byte_to_variable (RECODE_SUBTASK);
 
 /* ucs.c.  */
 
@@ -893,10 +858,10 @@ bool transform_byte_to_variable PARAMS ((RECODE_SUBTASK));
 /* Never an UCS-2 character.  */
 #define NOT_A_CHARACTER 0xFFFF
 
-bool get_ucs2 PARAMS ((unsigned *, RECODE_SUBTASK));
-bool get_ucs4 PARAMS ((unsigned *, RECODE_SUBTASK));
-bool put_ucs2 PARAMS ((unsigned, RECODE_SUBTASK));
-bool put_ucs4 PARAMS ((unsigned, RECODE_SUBTASK));
+bool get_ucs2 (unsigned *, RECODE_SUBTASK);
+bool get_ucs4 (unsigned *, RECODE_SUBTASK);
+bool put_ucs2 (unsigned, RECODE_SUBTASK);
+bool put_ucs4 (unsigned, RECODE_SUBTASK);
 
 #ifdef __cplusplus
 }
index 84308fc26415af82f683006f7bab9a4d9ba8e8ba..8893e976412829643cd8e6ee86c16e6308dc66c8 100644 (file)
@@ -234,12 +234,12 @@ struct recode_surface_list
 | Description of a single step of recoding.  |
 `-------------------------------------------*/
 
-typedef bool (*Recode_init) PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST,
-                                    RECODE_CONST_OPTION_LIST,
-                                    RECODE_CONST_OPTION_LIST));
-typedef bool (*Recode_term) PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST));
-typedef bool (*Recode_transform) PARAMS ((RECODE_SUBTASK));
-typedef bool (*Recode_fallback) PARAMS ((RECODE_SUBTASK, unsigned));
+typedef bool (*Recode_init) (RECODE_STEP, RECODE_CONST_REQUEST,
+                             RECODE_CONST_OPTION_LIST,
+                             RECODE_CONST_OPTION_LIST);
+typedef bool (*Recode_term) (RECODE_STEP, RECODE_CONST_REQUEST);
+typedef bool (*Recode_transform) (RECODE_SUBTASK);
+typedef bool (*Recode_fallback) (RECODE_SUBTASK, unsigned);
 
 /* The `single' structure holds data needed to decide of sequences, and is
    invariant over actual requests.  The `step' structure holds data needed for
@@ -567,25 +567,25 @@ extern "C" {
                                       (Count) * sizeof(Type)), \
    Variable)
 
-void recode_error PARAMS ((RECODE_OUTER, const char *, ...));
-void recode_perror PARAMS ((RECODE_OUTER, const char *, ...));
-void *recode_malloc PARAMS ((RECODE_OUTER, size_t));
-void *recode_realloc PARAMS ((RECODE_OUTER, void *, size_t));
-
-unsigned char *invert_table PARAMS ((RECODE_OUTER, const unsigned char *));
-bool complete_pairs PARAMS ((RECODE_OUTER, RECODE_STEP,
-                            const struct recode_known_pair *, unsigned,
-                            bool, bool));
-bool transform_byte_to_ucs2 PARAMS ((RECODE_SUBTASK));
-bool init_ucs2_to_byte PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST,
-                               RECODE_CONST_OPTION_LIST,
-                               RECODE_CONST_OPTION_LIST));
-bool transform_ucs2_to_byte PARAMS ((RECODE_SUBTASK));
+void recode_error (RECODE_OUTER, const char *, ...);
+void recode_perror (RECODE_OUTER, const char *, ...);
+void *recode_malloc (RECODE_OUTER, size_t);
+void *recode_realloc (RECODE_OUTER, void *, size_t);
+
+unsigned char *invert_table (RECODE_OUTER, const unsigned char *);
+bool complete_pairs (RECODE_OUTER, RECODE_STEP,
+                     const struct recode_known_pair *, unsigned,
+                     bool, bool);
+bool transform_byte_to_ucs2 (RECODE_SUBTASK);
+bool init_ucs2_to_byte (RECODE_STEP, RECODE_CONST_REQUEST,
+                        RECODE_CONST_OPTION_LIST,
+                        RECODE_CONST_OPTION_LIST);
+bool transform_ucs2_to_byte (RECODE_SUBTASK);
 
 /* charname.c and fr-charname.c.  */
 
-const char *ucs2_to_charname PARAMS ((int));
-const char *ucs2_to_french_charname PARAMS ((int));
+const char *ucs2_to_charname (int);
+const char *ucs2_to_french_charname (int);
 
 /* charset.c.  */
 
@@ -600,73 +600,69 @@ enum alias_find_type
 };
 
 int code_to_ucs2 (RECODE_CONST_SYMBOL, unsigned);
-bool prepare_for_aliases PARAMS ((RECODE_OUTER));
-RECODE_ALIAS declare_alias PARAMS ((RECODE_OUTER,
-                                    const char *, const char *));
-bool declare_implied_surface PARAMS ((RECODE_OUTER, RECODE_ALIAS,
-                                   RECODE_CONST_SYMBOL));
-bool make_argmatch_arrays PARAMS ((RECODE_OUTER));
-RECODE_ALIAS find_alias PARAMS ((RECODE_OUTER, const char *,
-                                  enum alias_find_type));
-bool find_and_report_subsets PARAMS ((RECODE_OUTER));
-bool decode_known_pairs PARAMS ((RECODE_OUTER, const char *));
+bool prepare_for_aliases (RECODE_OUTER);
+RECODE_ALIAS declare_alias (RECODE_OUTER,
+                            const char *, const char *);
+bool declare_implied_surface (RECODE_OUTER, RECODE_ALIAS,
+                              RECODE_CONST_SYMBOL);
+bool make_argmatch_arrays (RECODE_OUTER);
+RECODE_ALIAS find_alias (RECODE_OUTER, const char *,
+                         enum alias_find_type);
+bool find_and_report_subsets (RECODE_OUTER);
+bool decode_known_pairs (RECODE_OUTER, const char *);
 
 /* combine.c.  */
 
 #define DONE NOT_A_CHARACTER
 #define ELSE BYTE_ORDER_MARK_SWAPPED
 
-bool init_explode PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST,
-                          RECODE_CONST_OPTION_LIST,
-                          RECODE_CONST_OPTION_LIST));
-bool explode_byte_byte PARAMS ((RECODE_SUBTASK));
-bool explode_ucs2_byte PARAMS ((RECODE_SUBTASK));
-bool explode_byte_ucs2 PARAMS ((RECODE_SUBTASK));
-bool explode_ucs2_ucs2 PARAMS ((RECODE_SUBTASK));
-
-bool init_combine PARAMS ((RECODE_STEP, RECODE_CONST_REQUEST,
-                          RECODE_CONST_OPTION_LIST,
-                          RECODE_CONST_OPTION_LIST));
-bool combine_byte_byte PARAMS ((RECODE_SUBTASK));
-bool combine_ucs2_byte PARAMS ((RECODE_SUBTASK));
-bool combine_byte_ucs2 PARAMS ((RECODE_SUBTASK));
-bool combine_ucs2_ucs2 PARAMS ((RECODE_SUBTASK));
+bool init_explode (RECODE_STEP, RECODE_CONST_REQUEST,
+                   RECODE_CONST_OPTION_LIST,
+                   RECODE_CONST_OPTION_LIST);
+bool explode_byte_byte (RECODE_SUBTASK);
+bool explode_ucs2_byte (RECODE_SUBTASK);
+bool explode_byte_ucs2 (RECODE_SUBTASK);
+bool explode_ucs2_ucs2 (RECODE_SUBTASK);
+
+bool init_combine (RECODE_STEP, RECODE_CONST_REQUEST,
+                   RECODE_CONST_OPTION_LIST,
+                   RECODE_CONST_OPTION_LIST);
+bool combine_byte_byte (RECODE_SUBTASK);
+bool combine_ucs2_byte (RECODE_SUBTASK);
+bool combine_byte_ucs2 (RECODE_SUBTASK);
+bool combine_ucs2_ucs2 (RECODE_SUBTASK);
 
 /* freeze.c.  */
 
-void recode_freeze_tables PARAMS ((RECODE_OUTER));
+void recode_freeze_tables (RECODE_OUTER);
 
 /* iconv.c.  */
 
-bool transform_with_iconv PARAMS ((RECODE_SUBTASK));
-
-/* localcharset.c.  */
-
-const char *locale_charset PARAMS ((void));
+bool transform_with_iconv (RECODE_SUBTASK);
 
 /* names.c.  */
 
-bool should_prefer_french PARAMS ((void));
+bool should_prefer_french (void);
 
 /* mixed.c.  */
 
-bool transform_c_source PARAMS ((RECODE_TASK));
-bool transform_po_source PARAMS ((RECODE_TASK));
+bool transform_c_source (RECODE_TASK);
+bool transform_po_source (RECODE_TASK);
 
 /* outer.c.  */
 
-bool reversibility PARAMS ((RECODE_SUBTASK, unsigned));
+bool reversibility (RECODE_SUBTASK, unsigned);
 RECODE_SINGLE declare_single
-  PARAMS ((RECODE_OUTER, const char *, const char *,
-          struct recode_quality,
-          bool (*) (RECODE_STEP, RECODE_CONST_REQUEST,
-                    RECODE_CONST_OPTION_LIST, RECODE_CONST_OPTION_LIST),
-          bool (*) (RECODE_SUBTASK)));
-bool declare_iconv PARAMS ((RECODE_OUTER, const char *, const char *));
-bool declare_explode_data PARAMS ((RECODE_OUTER, const unsigned short *,
-                                  const char *, const char *));
-bool declare_strip_data PARAMS ((RECODE_OUTER, struct strip_data *,
-                                const char *));
+  (RECODE_OUTER, const char *, const char *,
+   struct recode_quality,
+   bool (*) (RECODE_STEP, RECODE_CONST_REQUEST,
+             RECODE_CONST_OPTION_LIST, RECODE_CONST_OPTION_LIST),
+   bool (*) (RECODE_SUBTASK));
+bool declare_iconv (RECODE_OUTER, const char *, const char *);
+bool declare_explode_data (RECODE_OUTER, const unsigned short *,
+                           const char *, const char *);
+bool declare_strip_data (RECODE_OUTER, struct strip_data *,
+                         const char *);
 
 /* pool.c.  */
 
@@ -674,21 +670,21 @@ extern const recode_ucs2 ucs2_data_pool[];
 
 /* request.c.  */
 
-char *edit_sequence PARAMS ((RECODE_REQUEST, bool));
+char *edit_sequence (RECODE_REQUEST, bool);
 
 /* rfc1345.c.  */
 
-const char *ucs2_to_rfc1345 PARAMS ((recode_ucs2));
+const char *ucs2_to_rfc1345 (recode_ucs2);
 
 /* task.c.  */
 
 #if USE_HELPERS || !INLINE_HARDER
-int get_byte_helper PARAMS ((RECODE_SUBTASK));
+int get_byte_helper (RECODE_SUBTASK);
 #endif
-void put_byte_helper PARAMS ((int, RECODE_SUBTASK));
-bool recode_if_nogo PARAMS ((enum recode_error, RECODE_SUBTASK));
-bool transform_byte_to_byte PARAMS ((RECODE_SUBTASK));
-bool transform_byte_to_variable PARAMS ((RECODE_SUBTASK));
+void put_byte_helper (int, RECODE_SUBTASK);
+bool recode_if_nogo (enum recode_error, RECODE_SUBTASK);
+bool transform_byte_to_byte (RECODE_SUBTASK);
+bool transform_byte_to_variable (RECODE_SUBTASK);
 
 /* ucs.c.  */
 
@@ -704,10 +700,10 @@ bool transform_byte_to_variable PARAMS ((RECODE_SUBTASK));
 /* Never an UCS-2 character.  */
 #define NOT_A_CHARACTER 0xFFFF
 
-bool get_ucs2 PARAMS ((unsigned *, RECODE_SUBTASK));
-bool get_ucs4 PARAMS ((unsigned *, RECODE_SUBTASK));
-bool put_ucs2 PARAMS ((unsigned, RECODE_SUBTASK));
-bool put_ucs4 PARAMS ((unsigned, RECODE_SUBTASK));
+bool get_ucs2 (unsigned *, RECODE_SUBTASK);
+bool get_ucs4 (unsigned *, RECODE_SUBTASK);
+bool put_ucs2 (unsigned, RECODE_SUBTASK);
+bool put_ucs4 (unsigned, RECODE_SUBTASK);
 
 #ifdef __cplusplus
 }
index ad1d5a6168a5e8253948978cc7966f447c6d1c1b..28e2102eadb72798366c7c18c14f9726a91b8410 100644 (file)
 
 #include "common.h"
 
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
+#include <stdio.h>
+#include <unistd.h>
 #include <sys/types.h>
-
 #include <sys/wait.h>
-/* Bruno suggests the following, from GNU make 3.79.0.2 in `job.c'.  He also
-   remarks that on Linux, WEXITSTATUS are bits 15..8 and WTERMSIG are bits
-   7..0, while BeOS uses the contrary.  */
-#if HAVE_UNION_WAIT
-# define WAIT_T union wait
-# ifndef WTERMSIG
-#  define WTERMSIG(x) ((x).w_termsig)
-# endif
-# ifndef WCOREDUMP
-#  define WCOREDUMP(x) ((x).w_coredump)
-# endif
-# ifndef WEXITSTATUS
-#  define WEXITSTATUS(x) ((x).w_retcode)
-# endif
-# ifndef WIFSIGNALED
-#  define WIFSIGNALED(x) (WTERMSIG(x) != 0)
-# endif
-# ifndef WIFEXITED
-#  define WIFEXITED(x) (WTERMSIG(x) == 0)
-# endif
-#else
-# define WAIT_T int
-# ifndef WTERMSIG
-#  define WTERMSIG(x) ((x) & 0x7f)
-# endif
-# ifndef WCOREDUMP
-#  define WCOREDUMP(x) ((x) & 0x80)
-# endif
-# ifndef WEXITSTATUS
-#  define WEXITSTATUS(x) (((x) >> 8) & 0xff)
-# endif
-# ifndef WIFSIGNALED
-#  define WIFSIGNALED(x) (WTERMSIG (x) != 0)
-# endif
-# ifndef WIFEXITED
-#  define WIFEXITED(x) (WTERMSIG (x) == 0)
-# endif
-#endif
 
 /* Buffer size used in transform_mere_copy.  */
 #define BUFFER_SIZE (16 * 1024)
@@ -394,59 +353,6 @@ perform_memory_sequence (RECODE_TASK task)
 | least one needed recoding step.                                          |
 `-------------------------------------------------------------------------*/
 
-/* tmpnam/tmpname/mktemp/tmpfile and the associate logic has been the
-   main portability headache of Recode :-(.
-
-   People reported that tmpname does not exist everywhere.  Further, on
-   OS/2, recode aborts if the prefix has more than five characters.
-
-   tmpnam seems to exist everywhere so far.  But NeXT's tmpnam() is such
-   that, if called many times in succession, it will always return the
-   same value, one has to really open a file with the returned name first
-   for the next call to tmpnam() to return a different value; even worse,
-   it cycles after 25 unique file names.  I can manage it for a single
-   invocation of recode, but using two recode invocations connected with
-   a shell pipe, on the NeXT, creates a race by which both copies may
-   call tmpnam() in parallel, then getting the same value, and will
-   consequently open the same temporary file.
-
-   Noah Friedman <friedman@gnu.org> suggests opening the file with
-   O_EXCL, and when the open presumably fails, call tmpnam again, or try
-   the mktemp routine in the GNU C library: maybe that will work better.
-
-   Michael I Bushnell <mib@gnu.org> suggests always using tmpfile,
-   which opens the file too, using the O_EXCL option to open.
-
-   I'm trying this last suggestion, but rewinding instead of closing.
-   Someone reported, a long while ago, that rewind did not work on his
-   system, so I reverted to opening and closing the temporary files all
-   the time.  I lost the precise references for this problem.  In any
-   case, I'm reusing rewind with tmpfile, now.  Hopefully, someone will
-   tell me if this still creates a problem somewhere!  */
-
-/* The previous round used tmpnam(3).  This one tries tmpfile(3).  */
-#undef USE_TMPNAM
-#define USE_TMPFILE 1
-
-/* Guarantee some value for L_tmpnam.  */
-#if USE_TMPNAM
-# if DOSWIN
-#  ifndef L_tmpnam
-#   define L_tmpnam 13
-#  endif
-# else
-char *tmpnam ();
-#  ifndef L_tmpnam
-#   include "pathmax.h"
-#   define L_tmpnam PATH_MAX
-#  endif
-# endif
-#endif
-
-#if USE_TMPFILE
-FILE *tmpfile PARAMS ((void));
-#endif
-
 static bool
 perform_pass_sequence (RECODE_TASK task)
 {
@@ -457,29 +363,12 @@ perform_pass_sequence (RECODE_TASK task)
   struct recode_read_write_text output;
   unsigned sequence_index;
   RECODE_CONST_STEP step;
-#if USE_TMPNAM
-  char temporary_name_1[L_tmpnam];
-  char temporary_name_2[L_tmpnam];
-#endif
 
   memset (subtask, 0, sizeof (struct recode_subtask));
   memset (&input, 0, sizeof (struct recode_read_write_text));
   memset (&output, 0, sizeof (struct recode_read_write_text));
   subtask->task = task;
 
-#if USE_TMPNAM
-# if DOSWIN_OR_OS2
-  strcpy (temporary_name_1, "recodex1.tmp");
-  strcpy (temporary_name_2, "recodex2.tmp");
-# else
-  /* Delay name attribution, so NeXT's work.  */
-  temporary_name_1[0] = NUL;
-  temporary_name_2[0] = NUL;
-# endif
-  subtask->input.name = temporary_name_1;
-  subtask->output.name = temporary_name_2;
-#endif
-
   /* Execute one pass for each step of the sequence.  */
 
   for (sequence_index = 0;
@@ -511,20 +400,8 @@ perform_pass_sequence (RECODE_TASK task)
        }
       else
        {
-#if USE_TMPNAM
-         if (subtask->input.file = fopen (input.name, "r"),
-             subtask->input.file == NULL)
-           {
-             recode_perror (outer, "fopen (%s)", input.name);
-             recode_if_nogo (RECODE_SYSTEM_ERROR, subtask);
-             return false;
-           }
-#endif
-
-#if USE_TMPFILE
          subtask->input.file = input.file;
          rewind (subtask->input.file);
-#endif
        }
 
       /* Select the output text for this step.  */
@@ -533,28 +410,12 @@ perform_pass_sequence (RECODE_TASK task)
        {
          subtask->output = output;
 
-#if USE_TMPNAM
-# if DOSWIN_OR_OS2
-         if (*subtask->output.name == NUL)
-           tmpnam (subtask->output.name);
-# endif
-         if (subtask->output.file = fopen (subtask->output.name, "w"),
-             subtask->output.file == NULL)
-           {
-             recode_perror (outer, "fopen (%s)", subtask->output.name);
-             recode_if_nogo (RECODE_SYSTEM_ERROR, subtask);
-             return false;
-           }
-#endif
-
-#if USE_TMPFILE
          if (subtask->output.file = tmpfile (), subtask->output.file == NULL)
            {
              recode_perror (NULL, "tmpfile ()");
              recode_if_nogo (RECODE_SYSTEM_ERROR, subtask);
              return false;
            }
-#endif
        }
       else
        {
@@ -596,15 +457,8 @@ perform_pass_sequence (RECODE_TASK task)
       else
        {
          fclose (subtask->input.file);
-#if USE_TMPNAM
-         unlink (subtask->input.name);
-#endif
        }
 
-#if USE_TMPNAM
-      fclose (subtask->output.file);
-#endif
-
       /* Prepare for next step.  */
 
       task->swap_input = RECODE_SWAP_UNDECIDED;
@@ -628,61 +482,6 @@ perform_pass_sequence (RECODE_TASK task)
 
 #if HAVE_PIPE
 
-#if !HAVE_DUP2
-
-/*------------------------------------------------------------------------.
-| Duplicate the OLD_FD file descriptor into NEW_FD, closing NEW_FD first  |
-| if it is used.  This implementation presumes both OLD_FD and NEW_FD are |
-| valid file descriptors.                                                |
-`------------------------------------------------------------------------*/
-
-/* Overall idea taken from GNU Emacs 18.55 dup2 (), in src/sysdep.c.  */
-
-#include <sys/fcntl.h>
-
-#ifndef F_DUPFD
-
-static bool
-dup2_recursive (int old_fd, int new_fd)
-{
-  int fd;
-
-  /* Attempt to dup OLD_FD to NEW_FD.  If not successful, call dup2
-     recursively, filling the file descriptor table until NEW_FD is
-     reached.  Then close all the spurious file descriptors we created.  */
-
-  if (fd = dup (old_fd) && fd != new_fd)
-    if (fd < 0 || dup2_recursive (old_fd, new_fd) < 0 || close (fd) < 0)
-      return false;
-
-  return true;
-}
-
-#endif /* not F_DUPFD */
-
-static int
-dup2 (int old_fd, int new_fd)
-{
-  /* If OLD_FD or NEW_FD were not valid file descriptors, dup2 should
-     ideally return -1 with errno set to EBADF.  This is not checked.  */
-
-  if (old_fd != new_fd)
-    {
-      close (new_fd);
-
-#ifdef F_DUPFD
-      if (fcntl (old_fd, F_DUPFD, new_fd) != new_fd)
-       return -1;
-#else
-      if (!dup2_recursive (old_fd, new_fd))
-       return -1;
-#endif
-    }
-  return new_fd;
-}
-
-#endif /* not HAVE_DUP2 */
-
 /*-------------------------------------------------------------------------.
 | Execute the conversion sequence, forking the program many times for all  |
 | elementary steps, interconnecting them with pipes.  This routine assumes |
@@ -708,7 +507,7 @@ perform_pipe_sequence (RECODE_TASK task)
 
   int pipe_pair[2];            /* pair of file descriptors for a pipe */
   int child_process;           /* child process number, zero if child */
-  WAIT_T wait_status;          /* status returned by wait() */
+  pid_t wait_status;           /* status returned by wait() */
 
   memset (subtask, 0, sizeof (struct recode_subtask));
   subtask->task = task;
@@ -876,7 +675,7 @@ perform_pipe_sequence (RECODE_TASK task)
 
   int pipe_pair[2];            /* pair of file descriptors for a pipe */
   int child_process;           /* child process number, zero if child */
-  WAIT_T wait_status;          /* status returned by wait() */
+  pid_t wait_status;           /* status returned by wait() */
 
   memset (subtask, 0, sizeof (struct recode_subtask));
   subtask->task = task;
@@ -1077,10 +876,8 @@ recode_delete_task (RECODE_TASK task)
   return true;
 }
 
-#if DOSWIN
-# if HAVE_UNISTD_H
-#  include <unistd.h>          /* for isatty */
-# endif
+#if DOSWIN_OR_OS2
+# include <unistd.h>           /* for isatty */
 # include <fcntl.h>            /* for O_BINARY and _fmode */
 # include <io.h>               /* for setmode */
 #endif
index 0eaf235d6ee2f48c7e541327c05e1a5138032856..9431b7adde489cda66a992ef7267e7d8cbf98ab3 100644 (file)
@@ -21,7 +21,7 @@
 
 %{
 
-void texte_latin1_diaeresis PARAMS ((void));
+void texte_latin1_diaeresis (void);
 
 %}
 
diff --git a/src/xalloc-die.c b/src/xalloc-die.c
deleted file mode 100644 (file)
index ff5ac9e..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Report a memory allocation failure and exit.
-
-   Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004 Free
-   Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "xalloc.h"
-
-#include <stdlib.h>
-
-#include "error.h"
-#include "exitfail.h"
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-#define N_(msgid) msgid
-
-void
-xalloc_die (void)
-{
-  error (exit_failure, 0, "%s", _("memory exhausted"));
-
-  /* The `noreturn' cannot be given to error, since it may return if
-     its first argument is 0.  To help compilers understand the
-     xalloc_die does not return, call abort.  Also, the abort is a
-     safety feature if exit_failure is 0 (which shouldn't happen).  */
-  abort ();
-}
diff --git a/src/xalloc.h b/src/xalloc.h
deleted file mode 100644 (file)
index f80977e..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* xalloc.h -- malloc with out-of-memory checking
-
-   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2003, 2004 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef XALLOC_H_
-# define XALLOC_H_
-
-# include <stddef.h>
-
-
-# ifdef __cplusplus
-extern "C" {
-# endif
-
-
-# ifndef __attribute__
-#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
-#   define __attribute__(x)
-#  endif
-# endif
-
-# ifndef ATTRIBUTE_NORETURN
-#  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
-# endif
-
-/* This function is always triggered when memory is exhausted.
-   It must be defined by the application, either explicitly
-   or by using gnulib's xalloc-die module.  This is the
-   function to call when one wants the program to die because of a
-   memory allocation failure.  */
-extern void xalloc_die (void) ATTRIBUTE_NORETURN;
-
-void *xmalloc (size_t s);
-void *xnmalloc (size_t n, size_t s);
-void *xzalloc (size_t s);
-void *xcalloc (size_t n, size_t s);
-void *xrealloc (void *p, size_t s);
-void *xnrealloc (void *p, size_t n, size_t s);
-void *x2realloc (void *p, size_t *pn);
-void *x2nrealloc (void *p, size_t *pn, size_t s);
-void *xmemdup (void const *p, size_t s);
-char *xstrdup (char const *str);
-
-/* Return 1 if an array of N objects, each of size S, cannot exist due
-   to size arithmetic overflow.  S must be positive and N must be
-   nonnegative.  This is a macro, not an inline function, so that it
-   works correctly even when SIZE_MAX < N.
-
-   By gnulib convention, SIZE_MAX represents overflow in size
-   calculations, so the conservative dividend to use here is
-   SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
-   However, malloc (SIZE_MAX) fails on all known hosts where
-   sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
-   exactly-SIZE_MAX allocations on such hosts; this avoids a test and
-   branch when S is known to be 1.  */
-# define xalloc_oversized(n, s) \
-    ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
-
-# ifdef __cplusplus
-}
-# endif
-
-
-#endif /* !XALLOC_H_ */
diff --git a/src/xmalloc.c b/src/xmalloc.c
deleted file mode 100644 (file)
index d66054f..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-/* xmalloc.c -- malloc with out of memory checking
-
-   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "xalloc.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
-
-/* 1 if calloc is known to be compatible with GNU calloc.  This
-   matters if we are not also using the calloc module, which defines
-   HAVE_CALLOC and supports the GNU API even on non-GNU platforms.  */
-#if defined HAVE_CALLOC || defined __GLIBC__
-enum { HAVE_GNU_CALLOC = 1 };
-#else
-enum { HAVE_GNU_CALLOC = 0 };
-#endif
-
-/* Allocate an array of N objects, each with S bytes of memory,
-   dynamically, with error checking.  S must be nonzero.  */
-
-static inline void *
-xnmalloc_inline (size_t n, size_t s)
-{
-  void *p;
-  if (xalloc_oversized (n, s) || (! (p = malloc (n * s)) && n != 0))
-    xalloc_die ();
-  return p;
-}
-
-void *
-xnmalloc (size_t n, size_t s)
-{
-  return xnmalloc_inline (n, s);
-}
-
-/* Allocate N bytes of memory dynamically, with error checking.  */
-
-void *
-xmalloc (size_t n)
-{
-  return xnmalloc_inline (n, 1);
-}
-
-/* Change the size of an allocated block of memory P to an array of N
-   objects each of S bytes, with error checking.  S must be nonzero.  */
-
-static inline void *
-xnrealloc_inline (void *p, size_t n, size_t s)
-{
-  if (xalloc_oversized (n, s) || (! (p = realloc (p, n * s)) && n != 0))
-    xalloc_die ();
-  return p;
-}
-
-void *
-xnrealloc (void *p, size_t n, size_t s)
-{
-  return xnrealloc_inline (p, n, s);
-}
-
-/* Change the size of an allocated block of memory P to N bytes,
-   with error checking.  */
-
-void *
-xrealloc (void *p, size_t n)
-{
-  return xnrealloc_inline (p, n, 1);
-}
-
-
-/* If P is null, allocate a block of at least *PN such objects;
-   otherwise, reallocate P so that it contains more than *PN objects
-   each of S bytes.  *PN must be nonzero unless P is null, and S must
-   be nonzero.  Set *PN to the new number of objects, and return the
-   pointer to the new block.  *PN is never set to zero, and the
-   returned pointer is never null.
-
-   Repeated reallocations are guaranteed to make progress, either by
-   allocating an initial block with a nonzero size, or by allocating a
-   larger block.
-
-   In the following implementation, nonzero sizes are doubled so that
-   repeated reallocations have O(N log N) overall cost rather than
-   O(N**2) cost, but the specification for this function does not
-   guarantee that sizes are doubled.
-
-   Here is an example of use:
-
-     int *p = NULL;
-     size_t used = 0;
-     size_t allocated = 0;
-
-     void
-     append_int (int value)
-       {
-        if (used == allocated)
-          p = x2nrealloc (p, &allocated, sizeof *p);
-        p[used++] = value;
-       }
-
-   This causes x2nrealloc to allocate a block of some nonzero size the
-   first time it is called.
-
-   To have finer-grained control over the initial size, set *PN to a
-   nonzero value before calling this function with P == NULL.  For
-   example:
-
-     int *p = NULL;
-     size_t used = 0;
-     size_t allocated = 0;
-     size_t allocated1 = 1000;
-
-     void
-     append_int (int value)
-       {
-        if (used == allocated)
-          {
-            p = x2nrealloc (p, &allocated1, sizeof *p);
-            allocated = allocated1;
-          }
-        p[used++] = value;
-       }
-
-   */
-
-static inline void *
-x2nrealloc_inline (void *p, size_t *pn, size_t s)
-{
-  size_t n = *pn;
-
-  if (! p)
-    {
-      if (! n)
-       {
-         /* The approximate size to use for initial small allocation
-            requests, when the invoking code specifies an old size of
-            zero.  64 bytes is the largest "small" request for the
-            GNU C library malloc.  */
-         enum { DEFAULT_MXFAST = 64 };
-
-         n = DEFAULT_MXFAST / s;
-         n += !n;
-       }
-    }
-  else
-    {
-      if (SIZE_MAX / 2 / s < n)
-       xalloc_die ();
-      n *= 2;
-    }
-
-  *pn = n;
-  return xrealloc (p, n * s);
-}
-
-void *
-x2nrealloc (void *p, size_t *pn, size_t s)
-{
-  return x2nrealloc_inline (p, pn, s);
-}
-
-/* If P is null, allocate a block of at least *PN bytes; otherwise,
-   reallocate P so that it contains more than *PN bytes.  *PN must be
-   nonzero unless P is null.  Set *PN to the new block's size, and
-   return the pointer to the new block.  *PN is never set to zero, and
-   the returned pointer is never null.  */
-
-void *
-x2realloc (void *p, size_t *pn)
-{
-  return x2nrealloc_inline (p, pn, 1);
-}
-
-/* Allocate S bytes of zeroed memory dynamically, with error checking.
-   There's no need for xnzalloc (N, S), since it would be equivalent
-   to xcalloc (N, S).  */
-
-void *
-xzalloc (size_t s)
-{
-  return memset (xmalloc (s), 0, s);
-}
-
-/* Allocate zeroed memory for N elements of S bytes, with error
-   checking.  S must be nonzero.  */
-
-void *
-xcalloc (size_t n, size_t s)
-{
-  void *p;
-  /* Test for overflow, since some calloc implementations don't have
-     proper overflow checks.  But omit overflow and size-zero tests if
-     HAVE_GNU_CALLOC, since GNU calloc catches overflow and never
-     returns NULL if successful.  */
-  if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s))
-      || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0)))
-    xalloc_die ();
-  return p;
-}
-
-/* Clone an object P of size S, with error checking.  There's no need
-   for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any
-   need for an arithmetic overflow check.  */
-
-void *
-xmemdup (void const *p, size_t s)
-{
-  return memcpy (xmalloc (s), p, s);
-}
-
-/* Clone STRING.  */
-
-char *
-xstrdup (char const *string)
-{
-  return (char *) xmemdup (string, strlen (string) + 1);
-}
index 3aa5b3d7b563001ad40ee4335a260bbef7830c44..040379a9df409570f41b3a0e9be06bf1906142ed 100644 (file)
@@ -33,7 +33,8 @@ CLEANFILES = Recode.so
 PYTHON = python
 
 check-local: Recode.so
-       RECODE=../src/recode PYTHONPATH=.:$(srcdir) \
+       export LD_LIBRARY_PATH=$(top_srcdir)/src/.libs && \
+       RECODE=$(top_builddir)/src/recode PYTHONPATH=.:$(srcdir) \
          $(PYTHON) $(srcdir)/pytest $(LIMIT) $(srcdir)/t*.py
 
 Recode.so: Recode.c setup.py
@@ -41,5 +42,8 @@ Recode.so: Recode.c setup.py
        $(PYTHON) setup.py build_ext --inplace
        rm -fr build
 
-Recode.c: Recode.pyx
-       cd $(srcdir) && cython Recode.pyx
+Recode.c: Recode.pyx Makefile
+       rm -f Recode.c && \
+       cython -o Recode.body.c Recode.pyx && \
+       echo '#include "config.h"' > Recode.c && \
+       cat Recode.body.c >> Recode.c
index d13a2b99133a57a9dbf70901cd185078190e24db..7e67e4051819cac8e7019c2c44325740a4e5eebb 100644 (file)
@@ -1,25 +1,15 @@
-/* Generated by Cython 0.19 on Mon Dec  2 00:35:48 2013 */
+#include "config.h"
+/* Generated by Cython 0.23.4 */
 
 #define PY_SSIZE_T_CLEAN
-#ifndef CYTHON_USE_PYLONG_INTERNALS
-#ifdef PYLONG_BITS_IN_DIGIT
-#define CYTHON_USE_PYLONG_INTERNALS 0
-#else
-#include "pyconfig.h"
-#ifdef PYLONG_BITS_IN_DIGIT
-#define CYTHON_USE_PYLONG_INTERNALS 1
-#else
-#define CYTHON_USE_PYLONG_INTERNALS 0
-#endif
-#endif
-#endif
 #include "Python.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
-#elif PY_VERSION_HEX < 0x02040000
-    #error Cython requires Python 2.4+.
+#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000)
+    #error Cython requires Python 2.6+ or Python 3.2+.
 #else
-#include <stddef.h> /* For offsetof */
+#define CYTHON_ABI "0_23_4"
+#include <stddef.h>
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
 #endif
 #define CYTHON_COMPILING_IN_PYPY 0
 #define CYTHON_COMPILING_IN_CPYTHON 1
 #endif
-#if PY_VERSION_HEX < 0x02050000
-  typedef int Py_ssize_t;
-  #define PY_SSIZE_T_MAX INT_MAX
-  #define PY_SSIZE_T_MIN INT_MIN
-  #define PY_FORMAT_SIZE_T ""
-  #define CYTHON_FORMAT_SSIZE_T ""
-  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
-  #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)
-  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \
-                                (PyErr_Format(PyExc_TypeError, \
-                                              "expected index value, got %.200s", Py_TYPE(o)->tp_name), \
-                                 (PyObject*)0))
-  #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \
-                                  !PyComplex_Check(o))
-  #define PyIndex_Check __Pyx_PyIndex_Check
-  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
-  #define __PYX_BUILD_PY_SSIZE_T "i"
-#else
-  #define __PYX_BUILD_PY_SSIZE_T "n"
-  #define CYTHON_FORMAT_SSIZE_T "z"
-  #define __Pyx_PyIndex_Check PyIndex_Check
+#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000
+#define CYTHON_USE_PYLONG_INTERNALS 1
 #endif
-#if PY_VERSION_HEX < 0x02060000
-  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
-  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
-  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)
-  #define PyVarObject_HEAD_INIT(type, size) \
-          PyObject_HEAD_INIT(type) size,
-  #define PyType_Modified(t)
-  typedef struct {
-     void *buf;
-     PyObject *obj;
-     Py_ssize_t len;
-     Py_ssize_t itemsize;
-     int readonly;
-     int ndim;
-     char *format;
-     Py_ssize_t *shape;
-     Py_ssize_t *strides;
-     Py_ssize_t *suboffsets;
-     void *internal;
-  } Py_buffer;
-  #define PyBUF_SIMPLE 0
-  #define PyBUF_WRITABLE 0x0001
-  #define PyBUF_FORMAT 0x0004
-  #define PyBUF_ND 0x0008
-  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
-  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
-  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
-  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
-  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
-  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)
-  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)
-  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
-  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
+#define Py_OptimizeFlag 0
 #endif
+#define __PYX_BUILD_PY_SSIZE_T "n"
+#define CYTHON_FORMAT_SSIZE_T "z"
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
+          PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #define __Pyx_DefaultClassType PyClass_Type
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
           PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #define __Pyx_DefaultClassType PyType_Type
 #endif
-#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6
-  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict")
-#endif
-#if PY_MAJOR_VERSION >= 3
+#ifndef Py_TPFLAGS_CHECKTYPES
   #define Py_TPFLAGS_CHECKTYPES 0
+#endif
+#ifndef Py_TPFLAGS_HAVE_INDEX
   #define Py_TPFLAGS_HAVE_INDEX 0
 #endif
-#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
+#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
-#if PY_VERSION_HEX < 0x02060000
-  #define Py_TPFLAGS_HAVE_VERSION_TAG 0
+#ifndef Py_TPFLAGS_HAVE_FINALIZE
+  #define Py_TPFLAGS_HAVE_FINALIZE 0
 #endif
 #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
   #define CYTHON_PEP393_ENABLED 1
-  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
+  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ?\
                                               0 : _PyUnicode_Ready((PyObject *)(op)))
   #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
   #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
+  #define __Pyx_PyUnicode_KIND(u)         PyUnicode_KIND(u)
+  #define __Pyx_PyUnicode_DATA(u)         PyUnicode_DATA(u)
   #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
 #else
   #define CYTHON_PEP393_ENABLED 0
   #define __Pyx_PyUnicode_READY(op)       (0)
   #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
   #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
-  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
+  #define __Pyx_PyUnicode_KIND(u)         (sizeof(Py_UNICODE))
+  #define __Pyx_PyUnicode_DATA(u)         ((void*)PyUnicode_AS_UNICODE(u))
+  #define __Pyx_PyUnicode_READ(k, d, i)   ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
+#endif
+#if CYTHON_COMPILING_IN_PYPY
+  #define __Pyx_PyUnicode_Concat(a, b)      PyNumber_Add(a, b)
+  #define __Pyx_PyUnicode_ConcatSafe(a, b)  PyNumber_Add(a, b)
+#else
+  #define __Pyx_PyUnicode_Concat(a, b)      PyUnicode_Concat(a, b)
+  #define __Pyx_PyUnicode_ConcatSafe(a, b)  ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\
+      PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
+#endif
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains)
+  #define PyUnicode_Contains(u, s)  PySequence_Contains(u, s)
+#endif
+#define __Pyx_PyString_FormatSafe(a, b)   ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
+#define __Pyx_PyUnicode_FormatSafe(a, b)  ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
+#if PY_MAJOR_VERSION >= 3
+  #define __Pyx_PyString_Format(a, b)  PyUnicode_Format(a, b)
+#else
+  #define __Pyx_PyString_Format(a, b)  PyString_Format(a, b)
 #endif
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
   #define PyString_Check               PyUnicode_Check
   #define PyString_CheckExact          PyUnicode_CheckExact
 #endif
-#if PY_VERSION_HEX < 0x02060000
-  #define PyBytesObject                PyStringObject
-  #define PyBytes_Type                 PyString_Type
-  #define PyBytes_Check                PyString_Check
-  #define PyBytes_CheckExact           PyString_CheckExact
-  #define PyBytes_FromString           PyString_FromString
-  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize
-  #define PyBytes_FromFormat           PyString_FromFormat
-  #define PyBytes_DecodeEscape         PyString_DecodeEscape
-  #define PyBytes_AsString             PyString_AsString
-  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize
-  #define PyBytes_Size                 PyString_Size
-  #define PyBytes_AS_STRING            PyString_AS_STRING
-  #define PyBytes_GET_SIZE             PyString_GET_SIZE
-  #define PyBytes_Repr                 PyString_Repr
-  #define PyBytes_Concat               PyString_Concat
-  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
-#endif
 #if PY_MAJOR_VERSION >= 3
   #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj)
   #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj)
 #else
-  #define __Pyx_PyBaseString_Check(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj) || \
-                                         PyString_Check(obj) || PyUnicode_Check(obj))
-  #define __Pyx_PyBaseString_CheckExact(obj) (Py_TYPE(obj) == &PyBaseString_Type)
-#endif
-#if PY_VERSION_HEX < 0x02060000
-  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
-  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
+  #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj))
+  #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj))
 #endif
 #ifndef PySet_CheckExact
   #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
   #define PyInt_AsSsize_t              PyLong_AsSsize_t
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
+  #define PyNumber_Int                 PyNumber_Long
 #endif
 #if PY_MAJOR_VERSION >= 3
   #define PyBoolObject                 PyLongObject
 #endif
-#if PY_VERSION_HEX < 0x03020000
+#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
+  #ifndef PyUnicode_InternFromString
+    #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
+  #endif
+#endif
+#if PY_VERSION_HEX < 0x030200A4
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
   #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
   #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
 #endif
-#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)
-  #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
-  #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
-  #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b)
-#else
-  #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \
-        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \
-        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \
-            (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0)))
-  #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \
-        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \
-        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \
-            (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1)))
-  #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \
-        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \
-        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \
-            (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1)))
-#endif
 #if PY_MAJOR_VERSION >= 3
-  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
-#endif
-#if PY_VERSION_HEX < 0x02050000
-  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
-  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
-  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))
+  #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
 #else
-  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))
-  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
-  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
+  #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
 #endif
-#if PY_VERSION_HEX < 0x02050000
-  #define __Pyx_NAMESTR(n) ((char *)(n))
-  #define __Pyx_DOCSTR(n)  ((char *)(n))
+#if PY_VERSION_HEX >= 0x030500B1
+#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
+#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
+#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
+typedef struct {
+    unaryfunc am_await;
+    unaryfunc am_aiter;
+    unaryfunc am_anext;
+} __Pyx_PyAsyncMethodsStruct;
+#define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved))
 #else
-  #define __Pyx_NAMESTR(n) (n)
-  #define __Pyx_DOCSTR(n)  (n)
+#define __Pyx_PyType_AsAsync(obj) NULL
+#endif
+#ifndef CYTHON_RESTRICT
+  #if defined(__GNUC__)
+    #define CYTHON_RESTRICT __restrict__
+  #elif defined(_MSC_VER) && _MSC_VER >= 1400
+    #define CYTHON_RESTRICT __restrict
+  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+    #define CYTHON_RESTRICT restrict
+  #else
+    #define CYTHON_RESTRICT
+  #endif
 #endif
+#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None)
+
 #ifndef CYTHON_INLINE
   #if defined(__GNUC__)
     #define CYTHON_INLINE __inline__
     #define CYTHON_INLINE
   #endif
 #endif
-#ifndef CYTHON_RESTRICT
-  #if defined(__GNUC__)
-    #define CYTHON_RESTRICT __restrict__
-  #elif defined(_MSC_VER)
-    #define CYTHON_RESTRICT __restrict
-  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-    #define CYTHON_RESTRICT restrict
-  #else
-    #define CYTHON_RESTRICT
-  #endif
+
+#if defined(WIN32) || defined(MS_WINDOWS)
+  #define _USE_MATH_DEFINES
 #endif
+#include <math.h>
 #ifdef NAN
 #define __PYX_NAN() ((float) NAN)
 #else
 static CYTHON_INLINE float __PYX_NAN() {
-  /* Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and
-   a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is
-   a quiet NaN. */
   float value;
   memset(&value, 0xFF, sizeof(value));
   return value;
@@ -302,10 +235,6 @@ static CYTHON_INLINE float __PYX_NAN() {
   #endif
 #endif
 
-#if defined(WIN32) || defined(MS_WINDOWS)
-#define _USE_MATH_DEFINES
-#endif
-#include <math.h>
 #define __PYX_HAVE__Recode
 #define __PYX_HAVE_API__Recode
 #include "stdio.h"
@@ -332,19 +261,56 @@ static CYTHON_INLINE float __PYX_NAN() {
 #   define CYTHON_UNUSED
 # endif
 #endif
+#ifndef CYTHON_NCP_UNUSED
+# if CYTHON_COMPILING_IN_CPYTHON
+#  define CYTHON_NCP_UNUSED
+# else
+#  define CYTHON_NCP_UNUSED CYTHON_UNUSED
+# endif
+#endif
 typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding;
-                const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/
+                const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry;
 
 #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0
 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0
 #define __PYX_DEFAULT_STRING_ENCODING ""
 #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
 #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
+#define __Pyx_uchar_cast(c) ((unsigned char)c)
+#define __Pyx_long_cast(x) ((long)x)
+#define __Pyx_fits_Py_ssize_t(v, type, is_signed)  (\
+    (sizeof(type) < sizeof(Py_ssize_t))  ||\
+    (sizeof(type) > sizeof(Py_ssize_t) &&\
+          likely(v < (type)PY_SSIZE_T_MAX ||\
+                 v == (type)PY_SSIZE_T_MAX)  &&\
+          (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\
+                                v == (type)PY_SSIZE_T_MIN)))  ||\
+    (sizeof(type) == sizeof(Py_ssize_t) &&\
+          (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\
+                               v == (type)PY_SSIZE_T_MAX)))  )
+#if defined (__cplusplus) && __cplusplus >= 201103L
+    #include <cstdlib>
+    #define __Pyx_sst_abs(value) std::abs(value)
+#elif SIZEOF_INT >= SIZEOF_SIZE_T
+    #define __Pyx_sst_abs(value) abs(value)
+#elif SIZEOF_LONG >= SIZEOF_SIZE_T
+    #define __Pyx_sst_abs(value) labs(value)
+#elif defined (_MSC_VER) && defined (_M_X64)
+    #define __Pyx_sst_abs(value) _abs64(value)
+#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+    #define __Pyx_sst_abs(value) llabs(value)
+#elif defined (__GNUC__)
+    #define __Pyx_sst_abs(value) __builtin_llabs(value)
+#else
+    #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
+#endif
 static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*);
 static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
+#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
+#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
 #define __Pyx_PyBytes_FromString        PyBytes_FromString
 #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
-static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char*);
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
 #if PY_MAJOR_VERSION < 3
     #define __Pyx_PyStr_FromString        __Pyx_PyBytes_FromString
     #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
@@ -352,17 +318,19 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char*);
     #define __Pyx_PyStr_FromString        __Pyx_PyUnicode_FromString
     #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
 #endif
+#define __Pyx_PyObject_AsSString(s)    ((signed char*) __Pyx_PyObject_AsString(s))
 #define __Pyx_PyObject_AsUString(s)    ((unsigned char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_FromUString(s)  __Pyx_PyObject_FromString((char*)s)
-#define __Pyx_PyBytes_FromUString(s)   __Pyx_PyBytes_FromString((char*)s)
-#define __Pyx_PyStr_FromUString(s)     __Pyx_PyStr_FromString((char*)s)
-#define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((char*)s)
+#define __Pyx_PyObject_FromCString(s)  __Pyx_PyObject_FromString((const char*)s)
+#define __Pyx_PyBytes_FromCString(s)   __Pyx_PyBytes_FromString((const char*)s)
+#define __Pyx_PyByteArray_FromCString(s)   __Pyx_PyByteArray_FromString((const char*)s)
+#define __Pyx_PyStr_FromCString(s)     __Pyx_PyStr_FromString((const char*)s)
+#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
 #if PY_MAJOR_VERSION < 3
 static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
 {
     const Py_UNICODE *u_end = u;
     while (*u_end++) ;
-    return u_end - u - 1;
+    return (size_t)(u_end - u - 1);
 }
 #else
 #define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen
@@ -370,13 +338,13 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
 #define __Pyx_PyUnicode_FromUnicode(u)       PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u))
 #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
 #define __Pyx_PyUnicode_AsUnicode            PyUnicode_AsUnicode
-#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None)
-#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
+#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
+#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
+#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False))
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
 static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
 static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
-static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 #if CYTHON_COMPILING_IN_CPYTHON
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
 #else
@@ -385,19 +353,22 @@ static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
 #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
 static int __Pyx_sys_getdefaultencoding_not_ascii;
-static int __Pyx_init_sys_getdefaultencoding_params() {
-    PyObject* sys = NULL;
+static int __Pyx_init_sys_getdefaultencoding_params(void) {
+    PyObject* sys;
     PyObject* default_encoding = NULL;
     PyObject* ascii_chars_u = NULL;
     PyObject* ascii_chars_b = NULL;
+    const char* default_encoding_c;
     sys = PyImport_ImportModule("sys");
-    if (sys == NULL) goto bad;
-    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
-    if (default_encoding == NULL) goto bad;
-    if (strcmp(PyBytes_AsString(default_encoding), "ascii") == 0) {
+    if (!sys) goto bad;
+    default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
+    Py_DECREF(sys);
+    if (!default_encoding) goto bad;
+    default_encoding_c = PyBytes_AsString(default_encoding);
+    if (!default_encoding_c) goto bad;
+    if (strcmp(default_encoding_c, "ascii") == 0) {
         __Pyx_sys_getdefaultencoding_not_ascii = 0;
     } else {
-        const char* default_encoding_c = PyBytes_AS_STRING(default_encoding);
         char ascii_chars[128];
         int c;
         for (c = 0; c < 128; c++) {
@@ -405,23 +376,21 @@ static int __Pyx_init_sys_getdefaultencoding_params() {
         }
         __Pyx_sys_getdefaultencoding_not_ascii = 1;
         ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL);
-        if (ascii_chars_u == NULL) goto bad;
+        if (!ascii_chars_u) goto bad;
         ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL);
-        if (ascii_chars_b == NULL || strncmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
+        if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
             PyErr_Format(
                 PyExc_ValueError,
-                "This module compiled with c_string_encoding=ascii, but default encoding '%s' is not a superset of ascii.",
+                "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.",
                 default_encoding_c);
             goto bad;
         }
+        Py_DECREF(ascii_chars_u);
+        Py_DECREF(ascii_chars_b);
     }
-    Py_XDECREF(sys);
-    Py_XDECREF(default_encoding);
-    Py_XDECREF(ascii_chars_u);
-    Py_XDECREF(ascii_chars_b);
+    Py_DECREF(default_encoding);
     return 0;
 bad:
-    Py_XDECREF(sys);
     Py_XDECREF(default_encoding);
     Py_XDECREF(ascii_chars_u);
     Py_XDECREF(ascii_chars_b);
@@ -434,22 +403,23 @@ bad:
 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL)
 #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
 static char* __PYX_DEFAULT_STRING_ENCODING;
-static int __Pyx_init_sys_getdefaultencoding_params() {
-    PyObject* sys = NULL;
+static int __Pyx_init_sys_getdefaultencoding_params(void) {
+    PyObject* sys;
     PyObject* default_encoding = NULL;
     char* default_encoding_c;
     sys = PyImport_ImportModule("sys");
-    if (sys == NULL) goto bad;
+    if (!sys) goto bad;
     default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
-    if (default_encoding == NULL) goto bad;
-    default_encoding_c = PyBytes_AS_STRING(default_encoding);
+    Py_DECREF(sys);
+    if (!default_encoding) goto bad;
+    default_encoding_c = PyBytes_AsString(default_encoding);
+    if (!default_encoding_c) goto bad;
     __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c));
+    if (!__PYX_DEFAULT_STRING_ENCODING) goto bad;
     strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
-    Py_DECREF(sys);
     Py_DECREF(default_encoding);
     return 0;
 bad:
-    Py_XDECREF(sys);
     Py_XDECREF(default_encoding);
     return -1;
 }
@@ -457,16 +427,11 @@ bad:
 #endif
 
 
-#ifdef __GNUC__
-  /* Test for GCC > 2.95 */
-  #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))
-    #define likely(x)   __builtin_expect(!!(x), 1)
-    #define unlikely(x) __builtin_expect(!!(x), 0)
-  #else /* __GNUC__ > 2 ... */
-    #define likely(x)   (x)
-    #define unlikely(x) (x)
-  #endif /* __GNUC__ > 2 ... */
-#else /* __GNUC__ */
+/* Test for GCC > 2.95 */
+#if defined(__GNUC__)     && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
+  #define likely(x)   __builtin_expect(!!(x), 1)
+  #define unlikely(x) __builtin_expect(!!(x), 0)
+#else /* !__GNUC__ or GCC < 2.95 */
   #define likely(x)   (x)
   #define unlikely(x) (x)
 #endif /* __GNUC__ */
@@ -487,10 +452,10 @@ static const char *__pyx_f[] = {
 };
 
 /*--- Type declarations ---*/
-struct __pyx_obj_6Recode_Request;
 struct __pyx_obj_6Recode_Outer;
+struct __pyx_obj_6Recode_Request;
 
-/* "Recode.pyx":20
+/* "Recode.pyx":21
  * # 02111-1307, USA.
  * 
  * cdef enum bool:             # <<<<<<<<<<<<<<
@@ -502,31 +467,33 @@ enum __pyx_t_6Recode_bool {
   __pyx_e_6Recode_true = 1
 };
 
-/* "Recode.pyx":615
- * # Recode library at REQUEST level.
+/* "Recode.pyx":551
+ * ## Recode library at OUTER level.
  * 
- * cdef class Request:             # <<<<<<<<<<<<<<
- *     cdef RECODE_REQUEST request
+ * cdef class Outer:             # <<<<<<<<<<<<<<
+ *     cdef RECODE_OUTER outer
  * 
  */
-struct __pyx_obj_6Recode_Request {
+struct __pyx_obj_6Recode_Outer {
   PyObject_HEAD
-  RECODE_REQUEST request;
+  RECODE_OUTER outer;
 };
 
 
-/* "Recode.pyx":550
- * ## Recode library at OUTER level.
+/* "Recode.pyx":616
+ * # Recode library at REQUEST level.
  * 
- * cdef class Outer:             # <<<<<<<<<<<<<<
- *     cdef RECODE_OUTER outer
+ * cdef class Request:             # <<<<<<<<<<<<<<
+ *     cdef RECODE_REQUEST request
  * 
  */
-struct __pyx_obj_6Recode_Outer {
+struct __pyx_obj_6Recode_Request {
   PyObject_HEAD
-  RECODE_OUTER outer;
+  RECODE_REQUEST request;
 };
 
+
+/* --- Runtime support code (head) --- */
 #ifndef CYTHON_REFNANNY
   #define CYTHON_REFNANNY 0
 #endif
@@ -540,22 +507,22 @@ struct __pyx_obj_6Recode_Outer {
     void (*FinishContext)(void**);
   } __Pyx_RefNannyAPIStruct;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
-  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/
+  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname);
   #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
 #ifdef WITH_THREAD
-  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
-          if (acquire_gil) { \
-              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
-              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
-              PyGILState_Release(__pyx_gilstate_save); \
-          } else { \
-              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
+  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
+          if (acquire_gil) {\
+              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
+              PyGILState_Release(__pyx_gilstate_save);\
+          } else {\
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
           }
 #else
-  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
+  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
           __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
 #endif
-  #define __Pyx_RefNannyFinishContext() \
+  #define __Pyx_RefNannyFinishContext()\
           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
   #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
@@ -577,7 +544,15 @@ struct __pyx_obj_6Recode_Outer {
   #define __Pyx_XDECREF(r) Py_XDECREF(r)
   #define __Pyx_XGOTREF(r)
   #define __Pyx_XGIVEREF(r)
-#endif /* CYTHON_REFNANNY */
+#endif
+#define __Pyx_XDECREF_SET(r, v) do {\
+        PyObject *tmp = (PyObject *) r;\
+        r = v; __Pyx_XDECREF(tmp);\
+    } while (0)
+#define __Pyx_DECREF_SET(r, v) do {\
+        PyObject *tmp = (PyObject *) r;\
+        r = v; __Pyx_DECREF(tmp);\
+    } while (0)
 #define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
 #define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
 
@@ -596,16 +571,16 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject
 #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
 #endif
 
-static PyObject *__Pyx_GetBuiltinName(PyObject *name); /*proto*/
+static PyObject *__Pyx_GetBuiltinName(PyObject *name);
 
-static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/
+static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);
 
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
-    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
-    const char* function_name); /*proto*/
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\
+    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\
+    const char* function_name);
 
 static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
-    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
+    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);
 
 #if CYTHON_COMPILING_IN_CPYTHON
 static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
@@ -623,54 +598,34 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
 #define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
 #endif
 
-static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); /*proto*/
-
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
-
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/
-
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
-    const char *name, int exact); /*proto*/
-
-static PyObject *__Pyx_FindPy2Metaclass(PyObject *bases); /*proto*/
+static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name);
 
-static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name,
-                                   PyObject *qualname, PyObject *modname); /*proto*/
+static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb);
+static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb);
 
-static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
 
-static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
-
-static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);
-
-static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);
-
-static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);
-
-static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);
-
-static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);
-
-static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
-
-static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
-
-static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *);
-
-static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
-
-static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
+#else
+#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
+#endif
 
-static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
+#endif
 
-static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
 
-static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);
+static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact);
 
-static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);
+static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases);
 
-static int __Pyx_check_binary_version(void);
+static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name, PyObject *qualname,
+                                           PyObject *mkw, PyObject *modname, PyObject *doc);
+static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases, PyObject *dict,
+                                      PyObject *mkw, int calculate_metaclass, int allow_py2_metaclass);
 
 typedef struct {
     int code_line;
@@ -687,9 +642,43 @@ static PyCodeObject *__pyx_find_code_object(int code_line);
 static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
 
 static void __Pyx_AddTraceback(const char *funcname, int c_line,
-                               int py_line, const char *filename); /*proto*/
+                               int py_line, const char *filename);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_symbol_type(enum recode_symbol_type value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_data_type(enum recode_data_type value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_size(enum recode_size value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_step_type(enum recode_step_type value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_sequence_strategy(enum recode_sequence_strategy value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_swap_input(enum recode_swap_input value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_error(enum recode_error value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_list_format(enum recode_list_format value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_programming_language(enum recode_programming_language value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__alias_find_type(enum alias_find_type value);
+
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
+
+static CYTHON_INLINE enum recode_list_format __Pyx_PyInt_As_enum__recode_list_format(PyObject *);
+
+static CYTHON_INLINE enum __pyx_t_6Recode_bool __Pyx_PyInt_As_enum____pyx_t_6Recode_bool(PyObject *);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);
+
+static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
 
-static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
+static int __Pyx_check_binary_version(void);
+
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);
 
 
 /* Module declarations from 'Recode' */
@@ -700,6 +689,168 @@ int __pyx_module_is_main_Recode = 0;
 
 /* Implementation of 'Recode' */
 static PyObject *__pyx_builtin_Exception;
+static char __pyx_k_NUL[] = "NUL";
+static char __pyx_k_doc[] = "__doc__";
+static char __pyx_k_main[] = "__main__";
+static char __pyx_k_scan[] = "scan";
+static char __pyx_k_test[] = "__test__";
+static char __pyx_k_error[] = "error";
+static char __pyx_k_iconv[] = "iconv";
+static char __pyx_k_input[] = "input";
+static char __pyx_k_outer[] = "outer";
+static char __pyx_k_xDONE[] = "xDONE";
+static char __pyx_k_xELSE[] = "xELSE";
+static char __pyx_k_Recode[] = "Recode";
+static char __pyx_k_SIZE_1[] = "SIZE_1";
+static char __pyx_k_SIZE_2[] = "SIZE_2";
+static char __pyx_k_SIZE_4[] = "SIZE_4";
+static char __pyx_k_SIZE_N[] = "SIZE_N";
+static char __pyx_k_format[] = "format";
+static char __pyx_k_module[] = "__module__";
+static char __pyx_k_strict[] = "strict";
+static char __pyx_k_string[] = "string";
+static char __pyx_k_CHARSET[] = "CHARSET";
+static char __pyx_k_SWAP_NO[] = "SWAP_NO";
+static char __pyx_k_charset[] = "charset";
+static char __pyx_k_command[] = "command";
+static char __pyx_k_prepare[] = "__prepare__";
+static char __pyx_k_NO_ERROR[] = "NO_ERROR";
+static char __pyx_k_SWAP_YES[] = "SWAP_YES";
+static char __pyx_k_language[] = "language";
+static char __pyx_k_qualname[] = "__qualname__";
+static char __pyx_k_Exception[] = "Exception";
+static char __pyx_k_NO_FORMAT[] = "NO_FORMAT";
+static char __pyx_k_metaclass[] = "__metaclass__";
+static char __pyx_k_LANGUAGE_C[] = "LANGUAGE_C";
+static char __pyx_k_STRIP_DATA[] = "STRIP_DATA";
+static char __pyx_k_STRIP_SIZE[] = "STRIP_SIZE";
+static char __pyx_k_USER_ERROR[] = "USER_ERROR";
+static char __pyx_k_auto_abort[] = "auto_abort";
+static char __pyx_k_FULL_FORMAT[] = "FULL_FORMAT";
+static char __pyx_k_NO_LANGUAGE[] = "NO_LANGUAGE";
+static char __pyx_k_BYTE_TO_BYTE[] = "BYTE_TO_BYTE";
+static char __pyx_k_COMBINE_STEP[] = "COMBINE_STEP";
+static char __pyx_k_DATA_SURFACE[] = "DATA_SURFACE";
+static char __pyx_k_EXPLODE_DATA[] = "EXPLODE_DATA";
+static char __pyx_k_EXPLODE_STEP[] = "EXPLODE_STEP";
+static char __pyx_k_OCTAL_FORMAT[] = "OCTAL_FORMAT";
+static char __pyx_k_SYSTEM_ERROR[] = "SYSTEM_ERROR";
+static char __pyx_k_TREE_SURFACE[] = "TREE_SURFACE";
+static char __pyx_k_UCS2_TO_BYTE[] = "UCS2_TO_BYTE";
+static char __pyx_k_INVALID_INPUT[] = "INVALID_INPUT";
+static char __pyx_k_LANGUAGE_PERL[] = "LANGUAGE_PERL";
+static char __pyx_k_MAXIMUM_ERROR[] = "MAXIMUM_ERROR";
+static char __pyx_k_NOT_CANONICAL[] = "NOT_CANONICAL";
+static char __pyx_k_NO_ICONV_FLAG[] = "NO_ICONV_FLAG";
+static char __pyx_k_NO_STEP_TABLE[] = "NO_STEP_TABLE";
+static char __pyx_k_BYTE_TO_STRING[] = "BYTE_TO_STRING";
+static char __pyx_k_DECIMAL_FORMAT[] = "DECIMAL_FORMAT";
+static char __pyx_k_INTERNAL_ERROR[] = "INTERNAL_ERROR";
+static char __pyx_k_NO_SYMBOL_TYPE[] = "NO_SYMBOL_TYPE";
+static char __pyx_k_STRING_TO_UCS2[] = "STRING_TO_UCS2";
+static char __pyx_k_SWAP_UNDECIDED[] = "SWAP_UNDECIDED";
+static char __pyx_k_UCS2_TO_STRING[] = "UCS2_TO_STRING";
+static char __pyx_k_UNTRANSLATABLE[] = "UNTRANSLATABLE";
+static char __pyx_k_AUTO_ABORT_FLAG[] = "AUTO_ABORT_FLAG";
+static char __pyx_k_BYTE_ORDER_MARK[] = "BYTE_ORDER_MARK";
+static char __pyx_k_COMBINE_EXPLODE[] = "COMBINE_EXPLODE";
+static char __pyx_k_NOT_A_CHARACTER[] = "NOT_A_CHARACTER";
+static char __pyx_k_NO_CHARSET_DATA[] = "NO_CHARSET_DATA";
+static char __pyx_k_AMBIGUOUS_OUTPUT[] = "AMBIGUOUS_OUTPUT";
+static char __pyx_k_HEXADECIMAL_FORMAT[] = "HEXADECIMAL_FORMAT";
+static char __pyx_k_SEQUENCE_IN_MEMORY[] = "SEQUENCE_IN_MEMORY";
+static char __pyx_k_SEQUENCE_WITH_PIPE[] = "SEQUENCE_WITH_PIPE";
+static char __pyx_k_STRATEGY_UNDECIDED[] = "STRATEGY_UNDECIDED";
+static char __pyx_k_SEQUENCE_WITH_FILES[] = "SEQUENCE_WITH_FILES";
+static char __pyx_k_ALIAS_FIND_AS_EITHER[] = "ALIAS_FIND_AS_EITHER";
+static char __pyx_k_ALIAS_FIND_AS_CHARSET[] = "ALIAS_FIND_AS_CHARSET";
+static char __pyx_k_ALIAS_FIND_AS_SURFACE[] = "ALIAS_FIND_AS_SURFACE";
+static char __pyx_k_REPLACEMENT_CHARACTER[] = "REPLACEMENT_CHARACTER";
+static char __pyx_k_SYMBOL_CREATE_CHARSET[] = "SYMBOL_CREATE_CHARSET";
+static char __pyx_k_BYTE_ORDER_MARK_SWAPPED[] = "BYTE_ORDER_MARK_SWAPPED";
+static char __pyx_k_SYMBOL_CREATE_DATA_SURFACE[] = "SYMBOL_CREATE_DATA_SURFACE";
+static char __pyx_k_SYMBOL_CREATE_TREE_SURFACE[] = "SYMBOL_CREATE_TREE_SURFACE";
+static PyObject *__pyx_n_s_ALIAS_FIND_AS_CHARSET;
+static PyObject *__pyx_n_s_ALIAS_FIND_AS_EITHER;
+static PyObject *__pyx_n_s_ALIAS_FIND_AS_SURFACE;
+static PyObject *__pyx_n_s_AMBIGUOUS_OUTPUT;
+static PyObject *__pyx_n_s_AUTO_ABORT_FLAG;
+static PyObject *__pyx_n_s_BYTE_ORDER_MARK;
+static PyObject *__pyx_n_s_BYTE_ORDER_MARK_SWAPPED;
+static PyObject *__pyx_n_s_BYTE_TO_BYTE;
+static PyObject *__pyx_n_s_BYTE_TO_STRING;
+static PyObject *__pyx_n_s_CHARSET;
+static PyObject *__pyx_n_s_COMBINE_EXPLODE;
+static PyObject *__pyx_n_s_COMBINE_STEP;
+static PyObject *__pyx_n_s_DATA_SURFACE;
+static PyObject *__pyx_n_s_DECIMAL_FORMAT;
+static PyObject *__pyx_n_s_EXPLODE_DATA;
+static PyObject *__pyx_n_s_EXPLODE_STEP;
+static PyObject *__pyx_n_s_Exception;
+static PyObject *__pyx_n_s_FULL_FORMAT;
+static PyObject *__pyx_n_s_HEXADECIMAL_FORMAT;
+static PyObject *__pyx_n_s_INTERNAL_ERROR;
+static PyObject *__pyx_n_s_INVALID_INPUT;
+static PyObject *__pyx_n_s_LANGUAGE_C;
+static PyObject *__pyx_n_s_LANGUAGE_PERL;
+static PyObject *__pyx_n_s_MAXIMUM_ERROR;
+static PyObject *__pyx_n_s_NOT_A_CHARACTER;
+static PyObject *__pyx_n_s_NOT_CANONICAL;
+static PyObject *__pyx_n_s_NO_CHARSET_DATA;
+static PyObject *__pyx_n_s_NO_ERROR;
+static PyObject *__pyx_n_s_NO_FORMAT;
+static PyObject *__pyx_n_s_NO_ICONV_FLAG;
+static PyObject *__pyx_n_s_NO_LANGUAGE;
+static PyObject *__pyx_n_s_NO_STEP_TABLE;
+static PyObject *__pyx_n_s_NO_SYMBOL_TYPE;
+static PyObject *__pyx_n_s_NUL;
+static PyObject *__pyx_n_s_OCTAL_FORMAT;
+static PyObject *__pyx_n_s_REPLACEMENT_CHARACTER;
+static PyObject *__pyx_n_s_Recode;
+static PyObject *__pyx_n_s_SEQUENCE_IN_MEMORY;
+static PyObject *__pyx_n_s_SEQUENCE_WITH_FILES;
+static PyObject *__pyx_n_s_SEQUENCE_WITH_PIPE;
+static PyObject *__pyx_n_s_SIZE_1;
+static PyObject *__pyx_n_s_SIZE_2;
+static PyObject *__pyx_n_s_SIZE_4;
+static PyObject *__pyx_n_s_SIZE_N;
+static PyObject *__pyx_n_s_STRATEGY_UNDECIDED;
+static PyObject *__pyx_n_s_STRING_TO_UCS2;
+static PyObject *__pyx_n_s_STRIP_DATA;
+static PyObject *__pyx_n_s_STRIP_SIZE;
+static PyObject *__pyx_n_s_SWAP_NO;
+static PyObject *__pyx_n_s_SWAP_UNDECIDED;
+static PyObject *__pyx_n_s_SWAP_YES;
+static PyObject *__pyx_n_s_SYMBOL_CREATE_CHARSET;
+static PyObject *__pyx_n_s_SYMBOL_CREATE_DATA_SURFACE;
+static PyObject *__pyx_n_s_SYMBOL_CREATE_TREE_SURFACE;
+static PyObject *__pyx_n_s_SYSTEM_ERROR;
+static PyObject *__pyx_n_s_TREE_SURFACE;
+static PyObject *__pyx_n_s_UCS2_TO_BYTE;
+static PyObject *__pyx_n_s_UCS2_TO_STRING;
+static PyObject *__pyx_n_s_UNTRANSLATABLE;
+static PyObject *__pyx_n_s_USER_ERROR;
+static PyObject *__pyx_n_s_auto_abort;
+static PyObject *__pyx_n_s_charset;
+static PyObject *__pyx_n_s_command;
+static PyObject *__pyx_n_s_doc;
+static PyObject *__pyx_n_s_error;
+static PyObject *__pyx_n_s_format;
+static PyObject *__pyx_n_s_iconv;
+static PyObject *__pyx_n_s_input;
+static PyObject *__pyx_n_s_language;
+static PyObject *__pyx_n_s_main;
+static PyObject *__pyx_n_s_metaclass;
+static PyObject *__pyx_n_s_module;
+static PyObject *__pyx_n_s_outer;
+static PyObject *__pyx_n_s_prepare;
+static PyObject *__pyx_n_s_qualname;
+static PyObject *__pyx_n_s_scan;
+static PyObject *__pyx_n_s_strict;
+static PyObject *__pyx_n_s_string;
+static PyObject *__pyx_n_s_test;
+static PyObject *__pyx_n_s_xDONE;
+static PyObject *__pyx_n_s_xELSE;
 static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__pyx_v_self, PyObject *__pyx_v_auto_abort, PyObject *__pyx_v_iconv, PyObject *__pyx_v_strict); /* proto */
 static void __pyx_pf_6Recode_5Outer_2__dealloc__(struct __pyx_obj_6Recode_Outer *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_6Recode_5Outer_4default_charset(CYTHON_UNUSED struct __pyx_obj_6Recode_Outer *__pyx_v_self); /* proto */
@@ -717,170 +868,15 @@ static PyObject *__pyx_pf_6Recode_7Request_10format_table(struct __pyx_obj_6Reco
 static PyObject *__pyx_pf_6Recode_7Request_12string(struct __pyx_obj_6Recode_Request *__pyx_v_self, char *__pyx_v_text); /* proto */
 static PyObject *__pyx_tp_new_6Recode_Outer(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
 static PyObject *__pyx_tp_new_6Recode_Request(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
-static char __pyx_k_5[] = "SYMBOL_CREATE_CHARSET";
-static char __pyx_k_6[] = "SYMBOL_CREATE_DATA_SURFACE";
-static char __pyx_k_7[] = "SYMBOL_CREATE_TREE_SURFACE";
-static char __pyx_k_8[] = "ALIAS_FIND_AS_CHARSET";
-static char __pyx_k_9[] = "ALIAS_FIND_AS_SURFACE";
-static char __pyx_k_10[] = "ALIAS_FIND_AS_EITHER";
-static char __pyx_k_11[] = "REPLACEMENT_CHARACTER";
-static char __pyx_k_12[] = "BYTE_ORDER_MARK_SWAPPED";
-static char __pyx_k__NUL[] = "NUL";
-static char __pyx_k__scan[] = "scan";
-static char __pyx_k__error[] = "error";
-static char __pyx_k__iconv[] = "iconv";
-static char __pyx_k__input[] = "input";
-static char __pyx_k__outer[] = "outer";
-static char __pyx_k__xDONE[] = "xDONE";
-static char __pyx_k__xELSE[] = "xELSE";
-static char __pyx_k__Recode[] = "Recode";
-static char __pyx_k__SIZE_1[] = "SIZE_1";
-static char __pyx_k__SIZE_2[] = "SIZE_2";
-static char __pyx_k__SIZE_4[] = "SIZE_4";
-static char __pyx_k__SIZE_N[] = "SIZE_N";
-static char __pyx_k__format[] = "format";
-static char __pyx_k__strict[] = "strict";
-static char __pyx_k__string[] = "string";
-static char __pyx_k__CHARSET[] = "CHARSET";
-static char __pyx_k__SWAP_NO[] = "SWAP_NO";
-static char __pyx_k__charset[] = "charset";
-static char __pyx_k__command[] = "command";
-static char __pyx_k__NO_ERROR[] = "NO_ERROR";
-static char __pyx_k__SWAP_YES[] = "SWAP_YES";
-static char __pyx_k____main__[] = "__main__";
-static char __pyx_k____test__[] = "__test__";
-static char __pyx_k__language[] = "language";
-static char __pyx_k__Exception[] = "Exception";
-static char __pyx_k__NO_FORMAT[] = "NO_FORMAT";
-static char __pyx_k____class__[] = "__class__";
-static char __pyx_k__LANGUAGE_C[] = "LANGUAGE_C";
-static char __pyx_k__STRIP_DATA[] = "STRIP_DATA";
-static char __pyx_k__STRIP_SIZE[] = "STRIP_SIZE";
-static char __pyx_k__USER_ERROR[] = "USER_ERROR";
-static char __pyx_k____module__[] = "__module__";
-static char __pyx_k__auto_abort[] = "auto_abort";
-static char __pyx_k__FULL_FORMAT[] = "FULL_FORMAT";
-static char __pyx_k__NO_LANGUAGE[] = "NO_LANGUAGE";
-static char __pyx_k__BYTE_TO_BYTE[] = "BYTE_TO_BYTE";
-static char __pyx_k__COMBINE_STEP[] = "COMBINE_STEP";
-static char __pyx_k__DATA_SURFACE[] = "DATA_SURFACE";
-static char __pyx_k__EXPLODE_DATA[] = "EXPLODE_DATA";
-static char __pyx_k__EXPLODE_STEP[] = "EXPLODE_STEP";
-static char __pyx_k__OCTAL_FORMAT[] = "OCTAL_FORMAT";
-static char __pyx_k__SYSTEM_ERROR[] = "SYSTEM_ERROR";
-static char __pyx_k__TREE_SURFACE[] = "TREE_SURFACE";
-static char __pyx_k__UCS2_TO_BYTE[] = "UCS2_TO_BYTE";
-static char __pyx_k____qualname__[] = "__qualname__";
-static char __pyx_k__INVALID_INPUT[] = "INVALID_INPUT";
-static char __pyx_k__LANGUAGE_PERL[] = "LANGUAGE_PERL";
-static char __pyx_k__MAXIMUM_ERROR[] = "MAXIMUM_ERROR";
-static char __pyx_k__NOT_CANONICAL[] = "NOT_CANONICAL";
-static char __pyx_k__NO_ICONV_FLAG[] = "NO_ICONV_FLAG";
-static char __pyx_k__NO_STEP_TABLE[] = "NO_STEP_TABLE";
-static char __pyx_k____metaclass__[] = "__metaclass__";
-static char __pyx_k__BYTE_TO_STRING[] = "BYTE_TO_STRING";
-static char __pyx_k__DECIMAL_FORMAT[] = "DECIMAL_FORMAT";
-static char __pyx_k__INTERNAL_ERROR[] = "INTERNAL_ERROR";
-static char __pyx_k__NO_SYMBOL_TYPE[] = "NO_SYMBOL_TYPE";
-static char __pyx_k__STRING_TO_UCS2[] = "STRING_TO_UCS2";
-static char __pyx_k__SWAP_UNDECIDED[] = "SWAP_UNDECIDED";
-static char __pyx_k__UCS2_TO_STRING[] = "UCS2_TO_STRING";
-static char __pyx_k__UNTRANSLATABLE[] = "UNTRANSLATABLE";
-static char __pyx_k__AUTO_ABORT_FLAG[] = "AUTO_ABORT_FLAG";
-static char __pyx_k__BYTE_ORDER_MARK[] = "BYTE_ORDER_MARK";
-static char __pyx_k__COMBINE_EXPLODE[] = "COMBINE_EXPLODE";
-static char __pyx_k__NOT_A_CHARACTER[] = "NOT_A_CHARACTER";
-static char __pyx_k__NO_CHARSET_DATA[] = "NO_CHARSET_DATA";
-static char __pyx_k__AMBIGUOUS_OUTPUT[] = "AMBIGUOUS_OUTPUT";
-static char __pyx_k__HEXADECIMAL_FORMAT[] = "HEXADECIMAL_FORMAT";
-static char __pyx_k__SEQUENCE_IN_MEMORY[] = "SEQUENCE_IN_MEMORY";
-static char __pyx_k__SEQUENCE_WITH_PIPE[] = "SEQUENCE_WITH_PIPE";
-static char __pyx_k__STRATEGY_UNDECIDED[] = "STRATEGY_UNDECIDED";
-static char __pyx_k__SEQUENCE_WITH_FILES[] = "SEQUENCE_WITH_FILES";
-static PyObject *__pyx_n_s_10;
-static PyObject *__pyx_n_s_11;
-static PyObject *__pyx_n_s_12;
-static PyObject *__pyx_n_s_5;
-static PyObject *__pyx_n_s_6;
-static PyObject *__pyx_n_s_7;
-static PyObject *__pyx_n_s_8;
-static PyObject *__pyx_n_s_9;
-static PyObject *__pyx_n_s__AMBIGUOUS_OUTPUT;
-static PyObject *__pyx_n_s__AUTO_ABORT_FLAG;
-static PyObject *__pyx_n_s__BYTE_ORDER_MARK;
-static PyObject *__pyx_n_s__BYTE_TO_BYTE;
-static PyObject *__pyx_n_s__BYTE_TO_STRING;
-static PyObject *__pyx_n_s__CHARSET;
-static PyObject *__pyx_n_s__COMBINE_EXPLODE;
-static PyObject *__pyx_n_s__COMBINE_STEP;
-static PyObject *__pyx_n_s__DATA_SURFACE;
-static PyObject *__pyx_n_s__DECIMAL_FORMAT;
-static PyObject *__pyx_n_s__EXPLODE_DATA;
-static PyObject *__pyx_n_s__EXPLODE_STEP;
-static PyObject *__pyx_n_s__Exception;
-static PyObject *__pyx_n_s__FULL_FORMAT;
-static PyObject *__pyx_n_s__HEXADECIMAL_FORMAT;
-static PyObject *__pyx_n_s__INTERNAL_ERROR;
-static PyObject *__pyx_n_s__INVALID_INPUT;
-static PyObject *__pyx_n_s__LANGUAGE_C;
-static PyObject *__pyx_n_s__LANGUAGE_PERL;
-static PyObject *__pyx_n_s__MAXIMUM_ERROR;
-static PyObject *__pyx_n_s__NOT_A_CHARACTER;
-static PyObject *__pyx_n_s__NOT_CANONICAL;
-static PyObject *__pyx_n_s__NO_CHARSET_DATA;
-static PyObject *__pyx_n_s__NO_ERROR;
-static PyObject *__pyx_n_s__NO_FORMAT;
-static PyObject *__pyx_n_s__NO_ICONV_FLAG;
-static PyObject *__pyx_n_s__NO_LANGUAGE;
-static PyObject *__pyx_n_s__NO_STEP_TABLE;
-static PyObject *__pyx_n_s__NO_SYMBOL_TYPE;
-static PyObject *__pyx_n_s__NUL;
-static PyObject *__pyx_n_s__OCTAL_FORMAT;
-static PyObject *__pyx_n_s__Recode;
-static PyObject *__pyx_n_s__SEQUENCE_IN_MEMORY;
-static PyObject *__pyx_n_s__SEQUENCE_WITH_FILES;
-static PyObject *__pyx_n_s__SEQUENCE_WITH_PIPE;
-static PyObject *__pyx_n_s__SIZE_1;
-static PyObject *__pyx_n_s__SIZE_2;
-static PyObject *__pyx_n_s__SIZE_4;
-static PyObject *__pyx_n_s__SIZE_N;
-static PyObject *__pyx_n_s__STRATEGY_UNDECIDED;
-static PyObject *__pyx_n_s__STRING_TO_UCS2;
-static PyObject *__pyx_n_s__STRIP_DATA;
-static PyObject *__pyx_n_s__STRIP_SIZE;
-static PyObject *__pyx_n_s__SWAP_NO;
-static PyObject *__pyx_n_s__SWAP_UNDECIDED;
-static PyObject *__pyx_n_s__SWAP_YES;
-static PyObject *__pyx_n_s__SYSTEM_ERROR;
-static PyObject *__pyx_n_s__TREE_SURFACE;
-static PyObject *__pyx_n_s__UCS2_TO_BYTE;
-static PyObject *__pyx_n_s__UCS2_TO_STRING;
-static PyObject *__pyx_n_s__UNTRANSLATABLE;
-static PyObject *__pyx_n_s__USER_ERROR;
-static PyObject *__pyx_n_s____class__;
-static PyObject *__pyx_n_s____main__;
-static PyObject *__pyx_n_s____metaclass__;
-static PyObject *__pyx_n_s____module__;
-static PyObject *__pyx_n_s____qualname__;
-static PyObject *__pyx_n_s____test__;
-static PyObject *__pyx_n_s__auto_abort;
-static PyObject *__pyx_n_s__charset;
-static PyObject *__pyx_n_s__command;
-static PyObject *__pyx_n_s__error;
-static PyObject *__pyx_n_s__format;
-static PyObject *__pyx_n_s__iconv;
-static PyObject *__pyx_n_s__input;
-static PyObject *__pyx_n_s__language;
-static PyObject *__pyx_n_s__outer;
-static PyObject *__pyx_n_s__scan;
-static PyObject *__pyx_n_s__strict;
-static PyObject *__pyx_n_s__string;
-static PyObject *__pyx_n_s__xDONE;
-static PyObject *__pyx_n_s__xELSE;
-static PyObject *__pyx_k_1;
-static PyObject *__pyx_k_2;
-static PyObject *__pyx_k_3;
-static PyObject *__pyx_k_4;
+static PyObject *__pyx_k_;
+
+/* "Recode.pyx":554
+ *     cdef RECODE_OUTER outer
+ * 
+ *     def __init__(self, auto_abort=False, iconv=False, strict=False):             # <<<<<<<<<<<<<<
+ *         cdef int flags
+ *         cdef RECODE_SINGLE single
+ */
 
 /* Python wrapper */
 static int __pyx_pw_6Recode_5Outer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -895,11 +891,11 @@ static int __pyx_pw_6Recode_5Outer_1__init__(PyObject *__pyx_v_self, PyObject *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__auto_abort,&__pyx_n_s__iconv,&__pyx_n_s__strict,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_auto_abort,&__pyx_n_s_iconv,&__pyx_n_s_strict,0};
     PyObject* values[3] = {0,0,0};
-    values[0] = __pyx_k_1;
-    values[1] = __pyx_k_2;
-    values[2] = __pyx_k_3;
+    values[0] = ((PyObject *)Py_False);
+    values[1] = ((PyObject *)Py_False);
+    values[2] = ((PyObject *)Py_False);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -914,22 +910,22 @@ static int __pyx_pw_6Recode_5Outer_1__init__(PyObject *__pyx_v_self, PyObject *_
       switch (pos_args) {
         case  0:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__auto_abort);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_auto_abort);
           if (value) { values[0] = value; kw_args--; }
         }
         case  1:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__iconv);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iconv);
           if (value) { values[1] = value; kw_args--; }
         }
         case  2:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__strict);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_strict);
           if (value) { values[2] = value; kw_args--; }
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -946,25 +942,19 @@ static int __pyx_pw_6Recode_5Outer_1__init__(PyObject *__pyx_v_self, PyObject *_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("Recode.Outer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_6Recode_5Outer___init__(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self), __pyx_v_auto_abort, __pyx_v_iconv, __pyx_v_strict);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":553
- *     cdef RECODE_OUTER outer
- * 
- *     def __init__(self, auto_abort=False, iconv=False, strict=False):             # <<<<<<<<<<<<<<
- *         cdef int flags
- *         cdef RECODE_SINGLE single
- */
-
 static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__pyx_v_self, PyObject *__pyx_v_auto_abort, PyObject *__pyx_v_iconv, PyObject *__pyx_v_strict) {
   int __pyx_v_flags;
   RECODE_SINGLE __pyx_v_single;
@@ -978,7 +968,7 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "Recode.pyx":556
+  /* "Recode.pyx":557
  *         cdef int flags
  *         cdef RECODE_SINGLE single
  *         flags = 0             # <<<<<<<<<<<<<<
@@ -987,17 +977,17 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
  */
   __pyx_v_flags = 0;
 
-  /* "Recode.pyx":557
+  /* "Recode.pyx":558
  *         cdef RECODE_SINGLE single
  *         flags = 0
  *         if auto_abort:             # <<<<<<<<<<<<<<
  *             flags = flags | RECODE_AUTO_ABORT_FLAG
  *         if not iconv:
  */
-  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_auto_abort); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_auto_abort); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "Recode.pyx":558
+    /* "Recode.pyx":559
  *         flags = 0
  *         if auto_abort:
  *             flags = flags | RECODE_AUTO_ABORT_FLAG             # <<<<<<<<<<<<<<
@@ -1005,22 +995,28 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
  *             flags = flags | RECODE_NO_ICONV_FLAG
  */
     __pyx_v_flags = (__pyx_v_flags | RECODE_AUTO_ABORT_FLAG);
-    goto __pyx_L3;
+
+    /* "Recode.pyx":558
+ *         cdef RECODE_SINGLE single
+ *         flags = 0
+ *         if auto_abort:             # <<<<<<<<<<<<<<
+ *             flags = flags | RECODE_AUTO_ABORT_FLAG
+ *         if not iconv:
+ */
   }
-  __pyx_L3:;
 
-  /* "Recode.pyx":559
+  /* "Recode.pyx":560
  *         if auto_abort:
  *             flags = flags | RECODE_AUTO_ABORT_FLAG
  *         if not iconv:             # <<<<<<<<<<<<<<
  *             flags = flags | RECODE_NO_ICONV_FLAG
  *         self.outer = recode_new_outer(flags)
  */
-  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_iconv); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_iconv); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = ((!__pyx_t_1) != 0);
   if (__pyx_t_2) {
 
-    /* "Recode.pyx":560
+    /* "Recode.pyx":561
  *             flags = flags | RECODE_AUTO_ABORT_FLAG
  *         if not iconv:
  *             flags = flags | RECODE_NO_ICONV_FLAG             # <<<<<<<<<<<<<<
@@ -1028,11 +1024,17 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
  *         if strict:
  */
     __pyx_v_flags = (__pyx_v_flags | RECODE_NO_ICONV_FLAG);
-    goto __pyx_L4;
+
+    /* "Recode.pyx":560
+ *         if auto_abort:
+ *             flags = flags | RECODE_AUTO_ABORT_FLAG
+ *         if not iconv:             # <<<<<<<<<<<<<<
+ *             flags = flags | RECODE_NO_ICONV_FLAG
+ *         self.outer = recode_new_outer(flags)
+ */
   }
-  __pyx_L4:;
 
-  /* "Recode.pyx":561
+  /* "Recode.pyx":562
  *         if not iconv:
  *             flags = flags | RECODE_NO_ICONV_FLAG
  *         self.outer = recode_new_outer(flags)             # <<<<<<<<<<<<<<
@@ -1041,17 +1043,17 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
  */
   __pyx_v_self->outer = recode_new_outer(__pyx_v_flags);
 
-  /* "Recode.pyx":562
+  /* "Recode.pyx":563
  *             flags = flags | RECODE_NO_ICONV_FLAG
  *         self.outer = recode_new_outer(flags)
  *         if strict:             # <<<<<<<<<<<<<<
  *             single = self.outer.single_list
  *             while single is not NULL:
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_strict); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_strict); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "Recode.pyx":563
+    /* "Recode.pyx":564
  *         self.outer = recode_new_outer(flags)
  *         if strict:
  *             single = self.outer.single_list             # <<<<<<<<<<<<<<
@@ -1061,7 +1063,7 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
     __pyx_t_3 = __pyx_v_self->outer->single_list;
     __pyx_v_single = __pyx_t_3;
 
-    /* "Recode.pyx":564
+    /* "Recode.pyx":565
  *         if strict:
  *             single = self.outer.single_list
  *             while single is not NULL:             # <<<<<<<<<<<<<<
@@ -1072,7 +1074,7 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
       __pyx_t_2 = ((__pyx_v_single != NULL) != 0);
       if (!__pyx_t_2) break;
 
-      /* "Recode.pyx":565
+      /* "Recode.pyx":566
  *             single = self.outer.single_list
  *             while single is not NULL:
  *                 single.fallback_routine = NULL             # <<<<<<<<<<<<<<
@@ -1081,7 +1083,7 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
  */
       __pyx_v_single->fallback_routine = NULL;
 
-      /* "Recode.pyx":566
+      /* "Recode.pyx":567
  *             while single is not NULL:
  *                 single.fallback_routine = NULL
  *                 single = single.next             # <<<<<<<<<<<<<<
@@ -1091,10 +1093,25 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
       __pyx_t_3 = __pyx_v_single->next;
       __pyx_v_single = __pyx_t_3;
     }
-    goto __pyx_L5;
+
+    /* "Recode.pyx":563
+ *             flags = flags | RECODE_NO_ICONV_FLAG
+ *         self.outer = recode_new_outer(flags)
+ *         if strict:             # <<<<<<<<<<<<<<
+ *             single = self.outer.single_list
+ *             while single is not NULL:
+ */
   }
-  __pyx_L5:;
 
+  /* "Recode.pyx":554
+ *     cdef RECODE_OUTER outer
+ * 
+ *     def __init__(self, auto_abort=False, iconv=False, strict=False):             # <<<<<<<<<<<<<<
+ *         cdef int flags
+ *         cdef RECODE_SINGLE single
+ */
+
+  /* function exit code */
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -1105,28 +1122,30 @@ static int __pyx_pf_6Recode_5Outer___init__(struct __pyx_obj_6Recode_Outer *__py
   return __pyx_r;
 }
 
+/* "Recode.pyx":569
+ *                 single = single.next
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         recode_delete_outer(self.outer)
+ * 
+ */
+
 /* Python wrapper */
 static void __pyx_pw_6Recode_5Outer_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
 static void __pyx_pw_6Recode_5Outer_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
   __pyx_pf_6Recode_5Outer_2__dealloc__(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
 }
 
-/* "Recode.pyx":568
- *                 single = single.next
- * 
- *     def __dealloc__(self):             # <<<<<<<<<<<<<<
- *         recode_delete_outer(self.outer)
- * 
- */
-
 static void __pyx_pf_6Recode_5Outer_2__dealloc__(struct __pyx_obj_6Recode_Outer *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "Recode.pyx":569
+  /* "Recode.pyx":570
  * 
  *     def __dealloc__(self):
  *         recode_delete_outer(self.outer)             # <<<<<<<<<<<<<<
@@ -1135,9 +1154,26 @@ static void __pyx_pf_6Recode_5Outer_2__dealloc__(struct __pyx_obj_6Recode_Outer
  */
   recode_delete_outer(__pyx_v_self->outer);
 
+  /* "Recode.pyx":569
+ *                 single = single.next
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         recode_delete_outer(self.outer)
+ * 
+ */
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
 }
 
+/* "Recode.pyx":572
+ *         recode_delete_outer(self.outer)
+ * 
+ *     def default_charset(self):             # <<<<<<<<<<<<<<
+ *         return locale_charset()
+ * 
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_5Outer_5default_charset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static PyObject *__pyx_pw_6Recode_5Outer_5default_charset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
@@ -1145,18 +1181,12 @@ static PyObject *__pyx_pw_6Recode_5Outer_5default_charset(PyObject *__pyx_v_self
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("default_charset (wrapper)", 0);
   __pyx_r = __pyx_pf_6Recode_5Outer_4default_charset(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":571
- *         recode_delete_outer(self.outer)
- * 
- *     def default_charset(self):             # <<<<<<<<<<<<<<
- *         return locale_charset()
- * 
- */
-
 static PyObject *__pyx_pf_6Recode_5Outer_4default_charset(CYTHON_UNUSED struct __pyx_obj_6Recode_Outer *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -1166,7 +1196,7 @@ static PyObject *__pyx_pf_6Recode_5Outer_4default_charset(CYTHON_UNUSED struct _
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("default_charset", 0);
 
-  /* "Recode.pyx":572
+  /* "Recode.pyx":573
  * 
  *     def default_charset(self):
  *         return locale_charset()             # <<<<<<<<<<<<<<
@@ -1174,14 +1204,21 @@ static PyObject *__pyx_pf_6Recode_5Outer_4default_charset(CYTHON_UNUSED struct _
  *     def all_charsets(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyBytes_FromString(locale_charset()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_r = ((PyObject *)__pyx_t_1);
+  __pyx_t_1 = __Pyx_PyBytes_FromString(locale_charset()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "Recode.pyx":572
+ *         recode_delete_outer(self.outer)
+ * 
+ *     def default_charset(self):             # <<<<<<<<<<<<<<
+ *         return locale_charset()
+ * 
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_AddTraceback("Recode.Outer.default_charset", __pyx_clineno, __pyx_lineno, __pyx_filename);
@@ -1192,6 +1229,14 @@ static PyObject *__pyx_pf_6Recode_5Outer_4default_charset(CYTHON_UNUSED struct _
   return __pyx_r;
 }
 
+/* "Recode.pyx":575
+ *         return locale_charset()
+ * 
+ *     def all_charsets(self):             # <<<<<<<<<<<<<<
+ *         list = []
+ *         cdef RECODE_SYMBOL symbol
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_5Outer_7all_charsets(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static PyObject *__pyx_pw_6Recode_5Outer_7all_charsets(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
@@ -1199,18 +1244,12 @@ static PyObject *__pyx_pw_6Recode_5Outer_7all_charsets(PyObject *__pyx_v_self, C
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("all_charsets (wrapper)", 0);
   __pyx_r = __pyx_pf_6Recode_5Outer_6all_charsets(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":574
- *         return locale_charset()
- * 
- *     def all_charsets(self):             # <<<<<<<<<<<<<<
- *         list = []
- *         cdef RECODE_SYMBOL symbol
- */
-
 static PyObject *__pyx_pf_6Recode_5Outer_6all_charsets(struct __pyx_obj_6Recode_Outer *__pyx_v_self) {
   PyObject *__pyx_v_list = NULL;
   RECODE_SYMBOL __pyx_v_symbol;
@@ -1221,28 +1260,25 @@ static PyObject *__pyx_pf_6Recode_5Outer_6all_charsets(struct __pyx_obj_6Recode_
   int __pyx_t_3;
   int __pyx_t_4;
   int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  struct recode_symbol *__pyx_t_9;
+  struct recode_symbol *__pyx_t_6;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("all_charsets", 0);
 
-  /* "Recode.pyx":575
+  /* "Recode.pyx":576
  * 
  *     def all_charsets(self):
  *         list = []             # <<<<<<<<<<<<<<
  *         cdef RECODE_SYMBOL symbol
  *         symbol = self.outer.symbol_list
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_list = ((PyObject*)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "Recode.pyx":577
+  /* "Recode.pyx":578
  *         list = []
  *         cdef RECODE_SYMBOL symbol
  *         symbol = self.outer.symbol_list             # <<<<<<<<<<<<<<
@@ -1252,7 +1288,7 @@ static PyObject *__pyx_pf_6Recode_5Outer_6all_charsets(struct __pyx_obj_6Recode_
   __pyx_t_2 = __pyx_v_self->outer->symbol_list;
   __pyx_v_symbol = __pyx_t_2;
 
-  /* "Recode.pyx":578
+  /* "Recode.pyx":579
  *         cdef RECODE_SYMBOL symbol
  *         symbol = self.outer.symbol_list
  *         while symbol is not NULL:             # <<<<<<<<<<<<<<
@@ -1264,76 +1300,100 @@ static PyObject *__pyx_pf_6Recode_5Outer_6all_charsets(struct __pyx_obj_6Recode_
     if (!__pyx_t_3) break;
 
     /* "Recode.pyx":580
+ *         symbol = self.outer.symbol_list
+ *         while symbol is not NULL:
+ *             if (symbol.type == RECODE_CHARSET             # <<<<<<<<<<<<<<
+ *                     and symbol is not self.outer.iconv_pivot
+ *                     and symbol is not self.outer.data_symbol
+ */
+    __pyx_t_4 = ((__pyx_v_symbol->type == RECODE_CHARSET) != 0);
+    if (__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L6_bool_binop_done;
+    }
+
+    /* "Recode.pyx":581
  *         while symbol is not NULL:
  *             if (symbol.type == RECODE_CHARSET
  *                     and symbol is not self.outer.iconv_pivot             # <<<<<<<<<<<<<<
  *                     and symbol is not self.outer.data_symbol
  *                     and symbol is not self.outer.tree_symbol):
  */
-    __pyx_t_3 = ((__pyx_v_symbol->type == RECODE_CHARSET) != 0);
-    if (__pyx_t_3) {
+    __pyx_t_4 = ((__pyx_v_symbol != __pyx_v_self->outer->iconv_pivot) != 0);
+    if (__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L6_bool_binop_done;
+    }
 
-      /* "Recode.pyx":581
+    /* "Recode.pyx":582
  *             if (symbol.type == RECODE_CHARSET
  *                     and symbol is not self.outer.iconv_pivot
  *                     and symbol is not self.outer.data_symbol             # <<<<<<<<<<<<<<
  *                     and symbol is not self.outer.tree_symbol):
  *                 list.append(symbol.name)
  */
-      __pyx_t_4 = ((__pyx_v_symbol != __pyx_v_self->outer->iconv_pivot) != 0);
-      if (__pyx_t_4) {
+    __pyx_t_4 = ((__pyx_v_symbol != __pyx_v_self->outer->data_symbol) != 0);
+    if (__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L6_bool_binop_done;
+    }
 
-        /* "Recode.pyx":582
+    /* "Recode.pyx":583
  *                     and symbol is not self.outer.iconv_pivot
  *                     and symbol is not self.outer.data_symbol
  *                     and symbol is not self.outer.tree_symbol):             # <<<<<<<<<<<<<<
  *                 list.append(symbol.name)
  *             symbol = symbol.next
  */
-        __pyx_t_5 = ((__pyx_v_symbol != __pyx_v_self->outer->data_symbol) != 0);
-        if (__pyx_t_5) {
-          __pyx_t_6 = ((__pyx_v_symbol != __pyx_v_self->outer->tree_symbol) != 0);
-          __pyx_t_7 = __pyx_t_6;
-        } else {
-          __pyx_t_7 = __pyx_t_5;
-        }
-        __pyx_t_5 = __pyx_t_7;
-      } else {
-        __pyx_t_5 = __pyx_t_4;
-      }
-      __pyx_t_4 = __pyx_t_5;
-    } else {
-      __pyx_t_4 = __pyx_t_3;
-    }
-    if (__pyx_t_4) {
+    __pyx_t_4 = ((__pyx_v_symbol != __pyx_v_self->outer->tree_symbol) != 0);
+    __pyx_t_3 = __pyx_t_4;
+    __pyx_L6_bool_binop_done:;
+
+    /* "Recode.pyx":580
+ *         symbol = self.outer.symbol_list
+ *         while symbol is not NULL:
+ *             if (symbol.type == RECODE_CHARSET             # <<<<<<<<<<<<<<
+ *                     and symbol is not self.outer.iconv_pivot
+ *                     and symbol is not self.outer.data_symbol
+ */
+    if (__pyx_t_3) {
 
-      /* "Recode.pyx":583
+      /* "Recode.pyx":584
  *                     and symbol is not self.outer.data_symbol
  *                     and symbol is not self.outer.tree_symbol):
  *                 list.append(symbol.name)             # <<<<<<<<<<<<<<
  *             symbol = symbol.next
  *         return list
  */
-      __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_symbol->name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-      __pyx_t_8 = __Pyx_PyList_Append(__pyx_v_list, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-      goto __pyx_L5;
+      __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_symbol->name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_5 = __Pyx_PyList_Append(__pyx_v_list, __pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+      /* "Recode.pyx":580
+ *         symbol = self.outer.symbol_list
+ *         while symbol is not NULL:
+ *             if (symbol.type == RECODE_CHARSET             # <<<<<<<<<<<<<<
+ *                     and symbol is not self.outer.iconv_pivot
+ *                     and symbol is not self.outer.data_symbol
+ */
     }
-    __pyx_L5:;
 
-    /* "Recode.pyx":584
+    /* "Recode.pyx":585
  *                     and symbol is not self.outer.tree_symbol):
  *                 list.append(symbol.name)
  *             symbol = symbol.next             # <<<<<<<<<<<<<<
  *         return list
  * 
  */
-    __pyx_t_9 = __pyx_v_symbol->next;
-    __pyx_v_symbol = __pyx_t_9;
+    __pyx_t_6 = __pyx_v_symbol->next;
+    __pyx_v_symbol = __pyx_t_6;
   }
 
-  /* "Recode.pyx":585
+  /* "Recode.pyx":586
  *                 list.append(symbol.name)
  *             symbol = symbol.next
  *         return list             # <<<<<<<<<<<<<<
@@ -1341,12 +1401,19 @@ static PyObject *__pyx_pf_6Recode_5Outer_6all_charsets(struct __pyx_obj_6Recode_
  *     def all_surfaces(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_list));
-  __pyx_r = ((PyObject *)__pyx_v_list);
+  __Pyx_INCREF(__pyx_v_list);
+  __pyx_r = __pyx_v_list;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "Recode.pyx":575
+ *         return locale_charset()
+ * 
+ *     def all_charsets(self):             # <<<<<<<<<<<<<<
+ *         list = []
+ *         cdef RECODE_SYMBOL symbol
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_AddTraceback("Recode.Outer.all_charsets", __pyx_clineno, __pyx_lineno, __pyx_filename);
@@ -1358,6 +1425,14 @@ static PyObject *__pyx_pf_6Recode_5Outer_6all_charsets(struct __pyx_obj_6Recode_
   return __pyx_r;
 }
 
+/* "Recode.pyx":588
+ *         return list
+ * 
+ *     def all_surfaces(self):             # <<<<<<<<<<<<<<
+ *         list = []
+ *         cdef RECODE_SYMBOL symbol
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_5Outer_9all_surfaces(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static PyObject *__pyx_pw_6Recode_5Outer_9all_surfaces(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
@@ -1365,18 +1440,12 @@ static PyObject *__pyx_pw_6Recode_5Outer_9all_surfaces(PyObject *__pyx_v_self, C
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("all_surfaces (wrapper)", 0);
   __pyx_r = __pyx_pf_6Recode_5Outer_8all_surfaces(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":587
- *         return list
- * 
- *     def all_surfaces(self):             # <<<<<<<<<<<<<<
- *         list = []
- *         cdef RECODE_SYMBOL symbol
- */
-
 static PyObject *__pyx_pf_6Recode_5Outer_8all_surfaces(struct __pyx_obj_6Recode_Outer *__pyx_v_self) {
   PyObject *__pyx_v_list = NULL;
   RECODE_SYMBOL __pyx_v_symbol;
@@ -1392,19 +1461,19 @@ static PyObject *__pyx_pf_6Recode_5Outer_8all_surfaces(struct __pyx_obj_6Recode_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("all_surfaces", 0);
 
-  /* "Recode.pyx":588
+  /* "Recode.pyx":589
  * 
  *     def all_surfaces(self):
  *         list = []             # <<<<<<<<<<<<<<
  *         cdef RECODE_SYMBOL symbol
  *         symbol = self.outer.symbol_list
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 588; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 589; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_list = ((PyObject*)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "Recode.pyx":590
+  /* "Recode.pyx":591
  *         list = []
  *         cdef RECODE_SYMBOL symbol
  *         symbol = self.outer.symbol_list             # <<<<<<<<<<<<<<
@@ -1414,7 +1483,7 @@ static PyObject *__pyx_pf_6Recode_5Outer_8all_surfaces(struct __pyx_obj_6Recode_
   __pyx_t_2 = __pyx_v_self->outer->symbol_list;
   __pyx_v_symbol = __pyx_t_2;
 
-  /* "Recode.pyx":591
+  /* "Recode.pyx":592
  *         cdef RECODE_SYMBOL symbol
  *         symbol = self.outer.symbol_list
  *         while symbol is not NULL:             # <<<<<<<<<<<<<<
@@ -1425,7 +1494,7 @@ static PyObject *__pyx_pf_6Recode_5Outer_8all_surfaces(struct __pyx_obj_6Recode_
     __pyx_t_3 = ((__pyx_v_symbol != NULL) != 0);
     if (!__pyx_t_3) break;
 
-    /* "Recode.pyx":592
+    /* "Recode.pyx":593
  *         symbol = self.outer.symbol_list
  *         while symbol is not NULL:
  *             if symbol.type != RECODE_CHARSET:             # <<<<<<<<<<<<<<
@@ -1435,22 +1504,28 @@ static PyObject *__pyx_pf_6Recode_5Outer_8all_surfaces(struct __pyx_obj_6Recode_
     __pyx_t_3 = ((__pyx_v_symbol->type != RECODE_CHARSET) != 0);
     if (__pyx_t_3) {
 
-      /* "Recode.pyx":593
+      /* "Recode.pyx":594
  *         while symbol is not NULL:
  *             if symbol.type != RECODE_CHARSET:
  *                 list.append(symbol.name)             # <<<<<<<<<<<<<<
  *             symbol = symbol.next
  *         return list
  */
-      __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_symbol->name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-      __pyx_t_4 = __Pyx_PyList_Append(__pyx_v_list, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-      goto __pyx_L5;
+      __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_symbol->name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_4 = __Pyx_PyList_Append(__pyx_v_list, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+      /* "Recode.pyx":593
+ *         symbol = self.outer.symbol_list
+ *         while symbol is not NULL:
+ *             if symbol.type != RECODE_CHARSET:             # <<<<<<<<<<<<<<
+ *                 list.append(symbol.name)
+ *             symbol = symbol.next
+ */
     }
-    __pyx_L5:;
 
-    /* "Recode.pyx":594
+    /* "Recode.pyx":595
  *             if symbol.type != RECODE_CHARSET:
  *                 list.append(symbol.name)
  *             symbol = symbol.next             # <<<<<<<<<<<<<<
@@ -1461,7 +1536,7 @@ static PyObject *__pyx_pf_6Recode_5Outer_8all_surfaces(struct __pyx_obj_6Recode_
     __pyx_v_symbol = __pyx_t_5;
   }
 
-  /* "Recode.pyx":595
+  /* "Recode.pyx":596
  *                 list.append(symbol.name)
  *             symbol = symbol.next
  *         return list             # <<<<<<<<<<<<<<
@@ -1469,12 +1544,19 @@ static PyObject *__pyx_pf_6Recode_5Outer_8all_surfaces(struct __pyx_obj_6Recode_
  *     def concise_charset(self, format=NO_FORMAT):
  */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_list));
-  __pyx_r = ((PyObject *)__pyx_v_list);
+  __Pyx_INCREF(__pyx_v_list);
+  __pyx_r = __pyx_v_list;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "Recode.pyx":588
+ *         return list
+ * 
+ *     def all_surfaces(self):             # <<<<<<<<<<<<<<
+ *         list = []
+ *         cdef RECODE_SYMBOL symbol
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_AddTraceback("Recode.Outer.all_surfaces", __pyx_clineno, __pyx_lineno, __pyx_filename);
@@ -1486,6 +1568,14 @@ static PyObject *__pyx_pf_6Recode_5Outer_8all_surfaces(struct __pyx_obj_6Recode_
   return __pyx_r;
 }
 
+/* "Recode.pyx":598
+ *         return list
+ * 
+ *     def concise_charset(self, format=NO_FORMAT):             # <<<<<<<<<<<<<<
+ *         ok = list_concise_charset(self.outer, NULL, format)
+ *         if not ok:
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_5Outer_11concise_charset(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static PyObject *__pyx_pw_6Recode_5Outer_11concise_charset(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
@@ -1497,9 +1587,9 @@ static PyObject *__pyx_pw_6Recode_5Outer_11concise_charset(PyObject *__pyx_v_sel
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("concise_charset (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__format,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_format,0};
     PyObject* values[1] = {0};
-    values[0] = __pyx_k_4;
+    values[0] = __pyx_k_;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -1512,12 +1602,12 @@ static PyObject *__pyx_pw_6Recode_5Outer_11concise_charset(PyObject *__pyx_v_sel
       switch (pos_args) {
         case  0:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__format);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_format);
           if (value) { values[0] = value; kw_args--; }
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "concise_charset") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "concise_charset") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -1530,91 +1620,102 @@ static PyObject *__pyx_pw_6Recode_5Outer_11concise_charset(PyObject *__pyx_v_sel
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("concise_charset", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("concise_charset", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("Recode.Outer.concise_charset", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_6Recode_5Outer_10concise_charset(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self), __pyx_v_format);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":597
- *         return list
- * 
- *     def concise_charset(self, format=NO_FORMAT):             # <<<<<<<<<<<<<<
- *         ok = list_concise_charset(self.outer, NULL, format)
- *         if not ok:
- */
-
 static PyObject *__pyx_pf_6Recode_5Outer_10concise_charset(struct __pyx_obj_6Recode_Outer *__pyx_v_self, PyObject *__pyx_v_format) {
-  PyObject *__pyx_v_ok = NULL;
+  enum __pyx_t_6Recode_bool __pyx_v_ok;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   enum recode_list_format __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  int __pyx_t_4;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("concise_charset", 0);
 
-  /* "Recode.pyx":598
+  /* "Recode.pyx":599
  * 
  *     def concise_charset(self, format=NO_FORMAT):
  *         ok = list_concise_charset(self.outer, NULL, format)             # <<<<<<<<<<<<<<
  *         if not ok:
  *             raise error
  */
-  __pyx_t_1 = ((enum recode_list_format)PyInt_AsLong(__pyx_v_format)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(list_concise_charset(__pyx_v_self->outer, NULL, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_v_ok = __pyx_t_2;
-  __pyx_t_2 = 0;
+  __pyx_t_1 = ((enum recode_list_format)__Pyx_PyInt_As_enum__recode_list_format(__pyx_v_format)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_ok = list_concise_charset(__pyx_v_self->outer, NULL, __pyx_t_1);
 
-  /* "Recode.pyx":599
+  /* "Recode.pyx":600
  *     def concise_charset(self, format=NO_FORMAT):
  *         ok = list_concise_charset(self.outer, NULL, format)
  *         if not ok:             # <<<<<<<<<<<<<<
  *             raise error
  * 
  */
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_ok); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = ((!__pyx_t_3) != 0);
-  if (__pyx_t_4) {
+  __pyx_t_2 = ((!__pyx_v_ok) != 0);
+  if (__pyx_t_2) {
 
-    /* "Recode.pyx":600
+    /* "Recode.pyx":601
  *         ok = list_concise_charset(self.outer, NULL, format)
  *         if not ok:
  *             raise error             # <<<<<<<<<<<<<<
  * 
  *     def full_charset(self):
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s__error); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_error); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "Recode.pyx":600
+ *     def concise_charset(self, format=NO_FORMAT):
+ *         ok = list_concise_charset(self.outer, NULL, format)
+ *         if not ok:             # <<<<<<<<<<<<<<
+ *             raise error
+ * 
+ */
   }
-  __pyx_L3:;
 
+  /* "Recode.pyx":598
+ *         return list
+ * 
+ *     def concise_charset(self, format=NO_FORMAT):             # <<<<<<<<<<<<<<
+ *         ok = list_concise_charset(self.outer, NULL, format)
+ *         if not ok:
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_AddTraceback("Recode.Outer.concise_charset", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_ok);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "Recode.pyx":603
+ *             raise error
+ * 
+ *     def full_charset(self):             # <<<<<<<<<<<<<<
+ *         ok = list_full_charset(self.outer, NULL)
+ *         if not ok:
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_5Outer_13full_charset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static PyObject *__pyx_pw_6Recode_5Outer_13full_charset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
@@ -1622,82 +1723,93 @@ static PyObject *__pyx_pw_6Recode_5Outer_13full_charset(PyObject *__pyx_v_self,
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("full_charset (wrapper)", 0);
   __pyx_r = __pyx_pf_6Recode_5Outer_12full_charset(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":602
- *             raise error
- * 
- *     def full_charset(self):             # <<<<<<<<<<<<<<
- *         ok = list_full_charset(self.outer, NULL)
- *         if not ok:
- */
-
 static PyObject *__pyx_pf_6Recode_5Outer_12full_charset(struct __pyx_obj_6Recode_Outer *__pyx_v_self) {
-  PyObject *__pyx_v_ok = NULL;
+  enum __pyx_t_6Recode_bool __pyx_v_ok;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  int __pyx_t_3;
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("full_charset", 0);
 
-  /* "Recode.pyx":603
+  /* "Recode.pyx":604
  * 
  *     def full_charset(self):
  *         ok = list_full_charset(self.outer, NULL)             # <<<<<<<<<<<<<<
  *         if not ok:
  *             raise error
  */
-  __pyx_t_1 = PyInt_FromLong(list_full_charset(__pyx_v_self->outer, NULL)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_v_ok = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __pyx_v_ok = list_full_charset(__pyx_v_self->outer, NULL);
 
-  /* "Recode.pyx":604
+  /* "Recode.pyx":605
  *     def full_charset(self):
  *         ok = list_full_charset(self.outer, NULL)
  *         if not ok:             # <<<<<<<<<<<<<<
  *             raise error
  * 
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_ok); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = ((!__pyx_t_2) != 0);
-  if (__pyx_t_3) {
+  __pyx_t_1 = ((!__pyx_v_ok) != 0);
+  if (__pyx_t_1) {
 
-    /* "Recode.pyx":605
+    /* "Recode.pyx":606
  *         ok = list_full_charset(self.outer, NULL)
  *         if not ok:
  *             raise error             # <<<<<<<<<<<<<<
  * 
  *     # Lazy, all in one call.
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s__error); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_error); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "Recode.pyx":605
+ *     def full_charset(self):
+ *         ok = list_full_charset(self.outer, NULL)
+ *         if not ok:             # <<<<<<<<<<<<<<
+ *             raise error
+ * 
+ */
   }
-  __pyx_L3:;
 
+  /* "Recode.pyx":603
+ *             raise error
+ * 
+ *     def full_charset(self):             # <<<<<<<<<<<<<<
+ *         ok = list_full_charset(self.outer, NULL)
+ *         if not ok:
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
   __Pyx_AddTraceback("Recode.Outer.full_charset", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_ok);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "Recode.pyx":609
+ * 
+ *     # Lazy, all in one call.
+ *     def recode(self, char *command, char *input):             # <<<<<<<<<<<<<<
+ *         request = Request(self)
+ *         request.scan(command)
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_5Outer_15recode(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static PyObject *__pyx_pw_6Recode_5Outer_15recode(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
@@ -1710,7 +1822,7 @@ static PyObject *__pyx_pw_6Recode_5Outer_15recode(PyObject *__pyx_v_self, PyObje
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("recode (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__command,&__pyx_n_s__input,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_command,&__pyx_n_s_input,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -1724,16 +1836,16 @@ static PyObject *__pyx_pw_6Recode_5Outer_15recode(PyObject *__pyx_v_self, PyObje
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__command)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_command)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__input)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_input)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("recode", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("recode", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "recode") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "recode") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -1741,30 +1853,24 @@ static PyObject *__pyx_pw_6Recode_5Outer_15recode(PyObject *__pyx_v_self, PyObje
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_command = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_command) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_input = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_input) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_command = __Pyx_PyObject_AsString(values[0]); if (unlikely((!__pyx_v_command) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_input = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_input) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("recode", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("recode", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("Recode.Outer.recode", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_6Recode_5Outer_14recode(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self), __pyx_v_command, __pyx_v_input);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":608
- * 
- *     # Lazy, all in one call.
- *     def recode(self, char *command, char *input):             # <<<<<<<<<<<<<<
- *         request = Request(self)
- *         request.scan(command)
- */
-
 static PyObject *__pyx_pf_6Recode_5Outer_14recode(struct __pyx_obj_6Recode_Outer *__pyx_v_self, char *__pyx_v_command, char *__pyx_v_input) {
   struct __pyx_obj_6Recode_Request *__pyx_v_request = NULL;
   PyObject *__pyx_r = NULL;
@@ -1772,52 +1878,71 @@ static PyObject *__pyx_pf_6Recode_5Outer_14recode(struct __pyx_obj_6Recode_Outer
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("recode", 0);
 
-  /* "Recode.pyx":609
+  /* "Recode.pyx":610
  *     # Lazy, all in one call.
  *     def recode(self, char *command, char *input):
  *         request = Request(self)             # <<<<<<<<<<<<<<
  *         request.scan(command)
  *         return request.string(input)
  */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_self));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_6Recode_Request)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_6Recode_Request), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_request = ((struct __pyx_obj_6Recode_Request *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "Recode.pyx":610
+  /* "Recode.pyx":611
  *     def recode(self, char *command, char *input):
  *         request = Request(self)
  *         request.scan(command)             # <<<<<<<<<<<<<<
  *         return request.string(input)
  * 
  */
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_request), __pyx_n_s__scan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_command); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_1));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_request), __pyx_n_s_scan); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_command); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+    }
+  }
+  if (!__pyx_t_4) {
+    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_GOTREF(__pyx_t_2);
+  } else {
+    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
+    __Pyx_GIVEREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_3);
+    __pyx_t_3 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "Recode.pyx":611
+  /* "Recode.pyx":612
  *         request = Request(self)
  *         request.scan(command)
  *         return request.string(input)             # <<<<<<<<<<<<<<
@@ -1825,29 +1950,55 @@ static PyObject *__pyx_pf_6Recode_5Outer_14recode(struct __pyx_obj_6Recode_Outer
  * # Recode library at REQUEST level.
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_request), __pyx_n_s__string); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_request), __pyx_n_s_string); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_input); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
-  __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_input); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_3 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_3)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+    }
+  }
+  if (!__pyx_t_3) {
+    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_GOTREF(__pyx_t_2);
+  } else {
+    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL;
+    __Pyx_GIVEREF(__pyx_t_5);
+    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_t_5);
+    __pyx_t_5 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_3;
-  __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "Recode.pyx":609
+ * 
+ *     # Lazy, all in one call.
+ *     def recode(self, char *command, char *input):             # <<<<<<<<<<<<<<
+ *         request = Request(self)
+ *         request.scan(command)
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
   __Pyx_AddTraceback("Recode.Outer.recode", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -1857,6 +2008,14 @@ static PyObject *__pyx_pf_6Recode_5Outer_14recode(struct __pyx_obj_6Recode_Outer
   return __pyx_r;
 }
 
+/* "Recode.pyx":619
+ *     cdef RECODE_REQUEST request
+ * 
+ *     def __init__(self, Outer outer):             # <<<<<<<<<<<<<<
+ *         self.request = recode_new_request(outer.outer)
+ * 
+ */
+
 /* Python wrapper */
 static int __pyx_pw_6Recode_7Request_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_pw_6Recode_7Request_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
@@ -1868,7 +2027,7 @@ static int __pyx_pw_6Recode_7Request_1__init__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__outer,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_outer,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -1881,11 +2040,11 @@ static int __pyx_pw_6Recode_7Request_1__init__(PyObject *__pyx_v_self, PyObject
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__outer)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_outer)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -1896,14 +2055,16 @@ static int __pyx_pw_6Recode_7Request_1__init__(PyObject *__pyx_v_self, PyObject
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("Recode.Request.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_outer), __pyx_ptype_6Recode_Outer, 1, "outer", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_outer), __pyx_ptype_6Recode_Outer, 1, "outer", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_6Recode_7Request___init__(((struct __pyx_obj_6Recode_Request *)__pyx_v_self), __pyx_v_outer);
+
+  /* function exit code */
   goto __pyx_L0;
   __pyx_L1_error:;
   __pyx_r = -1;
@@ -1912,20 +2073,12 @@ static int __pyx_pw_6Recode_7Request_1__init__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "Recode.pyx":618
- *     cdef RECODE_REQUEST request
- * 
- *     def __init__(self, Outer outer):             # <<<<<<<<<<<<<<
- *         self.request = recode_new_request(outer.outer)
- * 
- */
-
 static int __pyx_pf_6Recode_7Request___init__(struct __pyx_obj_6Recode_Request *__pyx_v_self, struct __pyx_obj_6Recode_Outer *__pyx_v_outer) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "Recode.pyx":619
+  /* "Recode.pyx":620
  * 
  *     def __init__(self, Outer outer):
  *         self.request = recode_new_request(outer.outer)             # <<<<<<<<<<<<<<
@@ -1934,33 +2087,44 @@ static int __pyx_pf_6Recode_7Request___init__(struct __pyx_obj_6Recode_Request *
  */
   __pyx_v_self->request = recode_new_request(__pyx_v_outer->outer);
 
+  /* "Recode.pyx":619
+ *     cdef RECODE_REQUEST request
+ * 
+ *     def __init__(self, Outer outer):             # <<<<<<<<<<<<<<
+ *         self.request = recode_new_request(outer.outer)
+ * 
+ */
+
+  /* function exit code */
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "Recode.pyx":622
+ *         self.request = recode_new_request(outer.outer)
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         recode_delete_request(self.request)
+ * 
+ */
+
 /* Python wrapper */
 static void __pyx_pw_6Recode_7Request_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
 static void __pyx_pw_6Recode_7Request_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
   __pyx_pf_6Recode_7Request_2__dealloc__(((struct __pyx_obj_6Recode_Request *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
 }
 
-/* "Recode.pyx":621
- *         self.request = recode_new_request(outer.outer)
- * 
- *     def __dealloc__(self):             # <<<<<<<<<<<<<<
- *         recode_delete_request(self.request)
- * 
- */
-
 static void __pyx_pf_6Recode_7Request_2__dealloc__(struct __pyx_obj_6Recode_Request *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "Recode.pyx":622
+  /* "Recode.pyx":623
  * 
  *     def __dealloc__(self):
  *         recode_delete_request(self.request)             # <<<<<<<<<<<<<<
@@ -1969,9 +2133,26 @@ static void __pyx_pf_6Recode_7Request_2__dealloc__(struct __pyx_obj_6Recode_Requ
  */
   recode_delete_request(__pyx_v_self->request);
 
+  /* "Recode.pyx":622
+ *         self.request = recode_new_request(outer.outer)
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         recode_delete_request(self.request)
+ * 
+ */
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
 }
 
+/* "Recode.pyx":625
+ *         recode_delete_request(self.request)
+ * 
+ *     def set_verbose(self, flag):             # <<<<<<<<<<<<<<
+ *         previous = self.request.verbose_flag != 0
+ *         self.request.verbose_flag = int(flag)
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_7Request_5set_verbose(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
 static PyObject *__pyx_pw_6Recode_7Request_5set_verbose(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
@@ -1979,62 +2160,49 @@ static PyObject *__pyx_pw_6Recode_7Request_5set_verbose(PyObject *__pyx_v_self,
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("set_verbose (wrapper)", 0);
   __pyx_r = __pyx_pf_6Recode_7Request_4set_verbose(((struct __pyx_obj_6Recode_Request *)__pyx_v_self), ((PyObject *)__pyx_v_flag));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":624
- *         recode_delete_request(self.request)
- * 
- *     def set_verbose(self, flag):             # <<<<<<<<<<<<<<
- *         previous = self.request.verbose_flag != 0
- *         self.request.verbose_flag = int(flag)
- */
-
 static PyObject *__pyx_pf_6Recode_7Request_4set_verbose(struct __pyx_obj_6Recode_Request *__pyx_v_self, PyObject *__pyx_v_flag) {
   PyObject *__pyx_v_previous = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  enum __pyx_t_6Recode_bool __pyx_t_3;
+  enum __pyx_t_6Recode_bool __pyx_t_2;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set_verbose", 0);
 
-  /* "Recode.pyx":625
+  /* "Recode.pyx":626
  * 
  *     def set_verbose(self, flag):
  *         previous = self.request.verbose_flag != 0             # <<<<<<<<<<<<<<
  *         self.request.verbose_flag = int(flag)
  *         return previous
  */
-  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_self->request->verbose_flag != 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_self->request->verbose_flag != 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_previous = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "Recode.pyx":626
+  /* "Recode.pyx":627
  *     def set_verbose(self, flag):
  *         previous = self.request.verbose_flag != 0
  *         self.request.verbose_flag = int(flag)             # <<<<<<<<<<<<<<
  *         return previous
  * 
  */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_Int(__pyx_v_flag); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(__pyx_v_flag);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_flag);
-  __Pyx_GIVEREF(__pyx_v_flag);
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_3 = ((enum __pyx_t_6Recode_bool)PyInt_AsLong(__pyx_t_2)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_v_self->request->verbose_flag = __pyx_t_3;
+  __pyx_t_2 = ((enum __pyx_t_6Recode_bool)__Pyx_PyInt_As_enum____pyx_t_6Recode_bool(__pyx_t_1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_self->request->verbose_flag = __pyx_t_2;
 
-  /* "Recode.pyx":627
+  /* "Recode.pyx":628
  *         previous = self.request.verbose_flag != 0
  *         self.request.verbose_flag = int(flag)
  *         return previous             # <<<<<<<<<<<<<<
@@ -2046,11 +2214,17 @@ static PyObject *__pyx_pf_6Recode_7Request_4set_verbose(struct __pyx_obj_6Recode
   __pyx_r = __pyx_v_previous;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "Recode.pyx":625
+ *         recode_delete_request(self.request)
+ * 
+ *     def set_verbose(self, flag):             # <<<<<<<<<<<<<<
+ *         previous = self.request.verbose_flag != 0
+ *         self.request.verbose_flag = int(flag)
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
   __Pyx_AddTraceback("Recode.Request.set_verbose", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -2060,6 +2234,14 @@ static PyObject *__pyx_pf_6Recode_7Request_4set_verbose(struct __pyx_obj_6Recode
   return __pyx_r;
 }
 
+/* "Recode.pyx":630
+ *         return previous
+ * 
+ *     def scan(self, char *text):             # <<<<<<<<<<<<<<
+ *         ok = recode_scan_request(self.request, text)
+ *         if not ok:
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_7Request_7scan(PyObject *__pyx_v_self, PyObject *__pyx_arg_text); /*proto*/
 static PyObject *__pyx_pw_6Recode_7Request_7scan(PyObject *__pyx_v_self, PyObject *__pyx_arg_text) {
@@ -2071,7 +2253,7 @@ static PyObject *__pyx_pw_6Recode_7Request_7scan(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("scan (wrapper)", 0);
   assert(__pyx_arg_text); {
-    __pyx_v_text = __Pyx_PyObject_AsString(__pyx_arg_text); if (unlikely((!__pyx_v_text) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_text = __Pyx_PyObject_AsString(__pyx_arg_text); if (unlikely((!__pyx_v_text) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -2080,82 +2262,93 @@ static PyObject *__pyx_pw_6Recode_7Request_7scan(PyObject *__pyx_v_self, PyObjec
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_6Recode_7Request_6scan(((struct __pyx_obj_6Recode_Request *)__pyx_v_self), ((char *)__pyx_v_text));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":629
- *         return previous
- * 
- *     def scan(self, char *text):             # <<<<<<<<<<<<<<
- *         ok = recode_scan_request(self.request, text)
- *         if not ok:
- */
-
 static PyObject *__pyx_pf_6Recode_7Request_6scan(struct __pyx_obj_6Recode_Request *__pyx_v_self, char *__pyx_v_text) {
-  PyObject *__pyx_v_ok = NULL;
+  enum __pyx_t_6Recode_bool __pyx_v_ok;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  int __pyx_t_3;
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("scan", 0);
 
-  /* "Recode.pyx":630
+  /* "Recode.pyx":631
  * 
  *     def scan(self, char *text):
  *         ok = recode_scan_request(self.request, text)             # <<<<<<<<<<<<<<
  *         if not ok:
  *             raise error
  */
-  __pyx_t_1 = PyInt_FromLong(recode_scan_request(__pyx_v_self->request, __pyx_v_text)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_v_ok = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __pyx_v_ok = recode_scan_request(__pyx_v_self->request, __pyx_v_text);
 
-  /* "Recode.pyx":631
+  /* "Recode.pyx":632
  *     def scan(self, char *text):
  *         ok = recode_scan_request(self.request, text)
  *         if not ok:             # <<<<<<<<<<<<<<
  *             raise error
  * 
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_ok); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 631; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = ((!__pyx_t_2) != 0);
-  if (__pyx_t_3) {
+  __pyx_t_1 = ((!__pyx_v_ok) != 0);
+  if (__pyx_t_1) {
 
-    /* "Recode.pyx":632
+    /* "Recode.pyx":633
  *         ok = recode_scan_request(self.request, text)
  *         if not ok:
  *             raise error             # <<<<<<<<<<<<<<
  * 
  *     def pair_sequence(self):
  */
-    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s__error); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_error); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "Recode.pyx":632
+ *     def scan(self, char *text):
+ *         ok = recode_scan_request(self.request, text)
+ *         if not ok:             # <<<<<<<<<<<<<<
+ *             raise error
+ * 
+ */
   }
-  __pyx_L3:;
 
+  /* "Recode.pyx":630
+ *         return previous
+ * 
+ *     def scan(self, char *text):             # <<<<<<<<<<<<<<
+ *         ok = recode_scan_request(self.request, text)
+ *         if not ok:
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
   __Pyx_AddTraceback("Recode.Request.scan", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_ok);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "Recode.pyx":635
+ *             raise error
+ * 
+ *     def pair_sequence(self):             # <<<<<<<<<<<<<<
+ *         list = []
+ *         cdef recode_step step
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_7Request_9pair_sequence(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static PyObject *__pyx_pw_6Recode_7Request_9pair_sequence(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
@@ -2163,18 +2356,12 @@ static PyObject *__pyx_pw_6Recode_7Request_9pair_sequence(PyObject *__pyx_v_self
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("pair_sequence (wrapper)", 0);
   __pyx_r = __pyx_pf_6Recode_7Request_8pair_sequence(((struct __pyx_obj_6Recode_Request *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":634
- *             raise error
- * 
- *     def pair_sequence(self):             # <<<<<<<<<<<<<<
- *         list = []
- *         cdef recode_step step
- */
-
 static PyObject *__pyx_pf_6Recode_7Request_8pair_sequence(struct __pyx_obj_6Recode_Request *__pyx_v_self) {
   PyObject *__pyx_v_list = NULL;
   struct recode_step __pyx_v_step;
@@ -2191,19 +2378,19 @@ static PyObject *__pyx_pf_6Recode_7Request_8pair_sequence(struct __pyx_obj_6Reco
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("pair_sequence", 0);
 
-  /* "Recode.pyx":635
+  /* "Recode.pyx":636
  * 
  *     def pair_sequence(self):
  *         list = []             # <<<<<<<<<<<<<<
  *         cdef recode_step step
  *         cdef unsigned counter
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_list = ((PyObject*)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "Recode.pyx":638
+  /* "Recode.pyx":639
  *         cdef recode_step step
  *         cdef unsigned counter
  *         for counter from 0 <= counter < self.request.sequence_length:             # <<<<<<<<<<<<<<
@@ -2213,7 +2400,7 @@ static PyObject *__pyx_pf_6Recode_7Request_8pair_sequence(struct __pyx_obj_6Reco
   __pyx_t_2 = __pyx_v_self->request->sequence_length;
   for (__pyx_v_counter = 0; __pyx_v_counter < __pyx_t_2; __pyx_v_counter++) {
 
-    /* "Recode.pyx":639
+    /* "Recode.pyx":640
  *         cdef unsigned counter
  *         for counter from 0 <= counter < self.request.sequence_length:
  *             step = self.request.sequence_array[counter]             # <<<<<<<<<<<<<<
@@ -2222,30 +2409,30 @@ static PyObject *__pyx_pf_6Recode_7Request_8pair_sequence(struct __pyx_obj_6Reco
  */
     __pyx_v_step = (__pyx_v_self->request->sequence_array[__pyx_v_counter]);
 
-    /* "Recode.pyx":640
+    /* "Recode.pyx":641
  *         for counter from 0 <= counter < self.request.sequence_length:
  *             step = self.request.sequence_array[counter]
  *             list.append((step.before.name, step.after.name))             # <<<<<<<<<<<<<<
  *         return list
  * 
  */
-    __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_step.before->name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_step.after->name); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_step.before->name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_step.after->name); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
-    __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-    PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_t_3));
-    __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
+    __Pyx_GIVEREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
     __pyx_t_1 = 0;
     __pyx_t_3 = 0;
-    __pyx_t_5 = __Pyx_PyList_Append(__pyx_v_list, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+    __pyx_t_5 = __Pyx_PyList_Append(__pyx_v_list, __pyx_t_4); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
 
-  /* "Recode.pyx":641
+  /* "Recode.pyx":642
  *             step = self.request.sequence_array[counter]
  *             list.append((step.before.name, step.after.name))
  *         return list             # <<<<<<<<<<<<<<
@@ -2253,12 +2440,19 @@ static PyObject *__pyx_pf_6Recode_7Request_8pair_sequence(struct __pyx_obj_6Reco
  *     def format_table(self, int language, char *charset):
  */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_list));
-  __pyx_r = ((PyObject *)__pyx_v_list);
+  __Pyx_INCREF(__pyx_v_list);
+  __pyx_r = __pyx_v_list;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "Recode.pyx":635
+ *             raise error
+ * 
+ *     def pair_sequence(self):             # <<<<<<<<<<<<<<
+ *         list = []
+ *         cdef recode_step step
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_3);
@@ -2272,6 +2466,14 @@ static PyObject *__pyx_pf_6Recode_7Request_8pair_sequence(struct __pyx_obj_6Reco
   return __pyx_r;
 }
 
+/* "Recode.pyx":644
+ *         return list
+ * 
+ *     def format_table(self, int language, char *charset):             # <<<<<<<<<<<<<<
+ *         cdef RECODE_OUTER outer
+ *         cdef bool saved
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_7Request_11format_table(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static PyObject *__pyx_pw_6Recode_7Request_11format_table(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
@@ -2284,7 +2486,7 @@ static PyObject *__pyx_pw_6Recode_7Request_11format_table(PyObject *__pyx_v_self
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("format_table (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__language,&__pyx_n_s__charset,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_language,&__pyx_n_s_charset,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -2298,16 +2500,16 @@ static PyObject *__pyx_pw_6Recode_7Request_11format_table(PyObject *__pyx_v_self
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__language)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_language)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__charset)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_charset)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("format_table", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("format_table", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "format_table") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "format_table") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -2315,47 +2517,40 @@ static PyObject *__pyx_pw_6Recode_7Request_11format_table(PyObject *__pyx_v_self
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_language = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_language == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_charset = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_charset) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_language = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_language == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_charset = __Pyx_PyObject_AsString(values[1]); if (unlikely((!__pyx_v_charset) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("format_table", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("format_table", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("Recode.Request.format_table", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_6Recode_7Request_10format_table(((struct __pyx_obj_6Recode_Request *)__pyx_v_self), __pyx_v_language, __pyx_v_charset);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":643
- *         return list
- * 
- *     def format_table(self, int language, char *charset):             # <<<<<<<<<<<<<<
- *         cdef RECODE_OUTER outer
- *         cdef bool saved
- */
-
 static PyObject *__pyx_pf_6Recode_7Request_10format_table(struct __pyx_obj_6Recode_Request *__pyx_v_self, int __pyx_v_language, char *__pyx_v_charset) {
   RECODE_OUTER __pyx_v_outer;
   enum __pyx_t_6Recode_bool __pyx_v_saved;
-  PyObject *__pyx_v_ok = NULL;
+  enum __pyx_t_6Recode_bool __pyx_v_ok;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   RECODE_OUTER __pyx_t_1;
   enum __pyx_t_6Recode_bool __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_t_5;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("format_table", 0);
 
-  /* "Recode.pyx":646
+  /* "Recode.pyx":647
  *         cdef RECODE_OUTER outer
  *         cdef bool saved
  *         outer = self.request.outer             # <<<<<<<<<<<<<<
@@ -2365,7 +2560,7 @@ static PyObject *__pyx_pf_6Recode_7Request_10format_table(struct __pyx_obj_6Reco
   __pyx_t_1 = __pyx_v_self->request->outer;
   __pyx_v_outer = __pyx_t_1;
 
-  /* "Recode.pyx":647
+  /* "Recode.pyx":648
  *         cdef bool saved
  *         outer = self.request.outer
  *         saved = outer.iconv_pivot.ignore             # <<<<<<<<<<<<<<
@@ -2375,7 +2570,7 @@ static PyObject *__pyx_pf_6Recode_7Request_10format_table(struct __pyx_obj_6Reco
   __pyx_t_2 = __pyx_v_outer->iconv_pivot->ignore;
   __pyx_v_saved = __pyx_t_2;
 
-  /* "Recode.pyx":648
+  /* "Recode.pyx":649
  *         outer = self.request.outer
  *         saved = outer.iconv_pivot.ignore
  *         outer.iconv_pivot.ignore = true             # <<<<<<<<<<<<<<
@@ -2385,18 +2580,15 @@ static PyObject *__pyx_pf_6Recode_7Request_10format_table(struct __pyx_obj_6Reco
   __pyx_v_outer->iconv_pivot->ignore = __pyx_e_6Recode_true;
 
   /* "Recode.pyx":650
+ *         saved = outer.iconv_pivot.ignore
  *         outer.iconv_pivot.ignore = true
- *         ok = recode_format_table(
- *                 self.request, <recode_programming_language> language, charset)             # <<<<<<<<<<<<<<
+ *         ok = recode_format_table(             # <<<<<<<<<<<<<<
+ *                 self.request, <recode_programming_language> language, charset)
  *         outer.iconv_pivot.ignore = saved
- *         if not ok:
  */
-  __pyx_t_3 = PyInt_FromLong(recode_format_table(__pyx_v_self->request, ((enum recode_programming_language)__pyx_v_language), __pyx_v_charset)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 649; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_v_ok = __pyx_t_3;
-  __pyx_t_3 = 0;
+  __pyx_v_ok = recode_format_table(__pyx_v_self->request, ((enum recode_programming_language)__pyx_v_language), __pyx_v_charset);
 
-  /* "Recode.pyx":651
+  /* "Recode.pyx":652
  *         ok = recode_format_table(
  *                 self.request, <recode_programming_language> language, charset)
  *         outer.iconv_pivot.ignore = saved             # <<<<<<<<<<<<<<
@@ -2405,46 +2597,67 @@ static PyObject *__pyx_pf_6Recode_7Request_10format_table(struct __pyx_obj_6Reco
  */
   __pyx_v_outer->iconv_pivot->ignore = __pyx_v_saved;
 
-  /* "Recode.pyx":652
+  /* "Recode.pyx":653
  *                 self.request, <recode_programming_language> language, charset)
  *         outer.iconv_pivot.ignore = saved
  *         if not ok:             # <<<<<<<<<<<<<<
  *             raise error
  * 
  */
-  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_ok); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_5 = ((!__pyx_t_4) != 0);
-  if (__pyx_t_5) {
+  __pyx_t_3 = ((!__pyx_v_ok) != 0);
+  if (__pyx_t_3) {
 
-    /* "Recode.pyx":653
+    /* "Recode.pyx":654
  *         outer.iconv_pivot.ignore = saved
  *         if not ok:
  *             raise error             # <<<<<<<<<<<<<<
  * 
  *     def string(self, char *text):
  */
-    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s__error); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_error); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "Recode.pyx":653
+ *                 self.request, <recode_programming_language> language, charset)
+ *         outer.iconv_pivot.ignore = saved
+ *         if not ok:             # <<<<<<<<<<<<<<
+ *             raise error
+ * 
+ */
   }
-  __pyx_L3:;
 
+  /* "Recode.pyx":644
+ *         return list
+ * 
+ *     def format_table(self, int language, char *charset):             # <<<<<<<<<<<<<<
+ *         cdef RECODE_OUTER outer
+ *         cdef bool saved
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_AddTraceback("Recode.Request.format_table", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_ok);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "Recode.pyx":656
+ *             raise error
+ * 
+ *     def string(self, char *text):             # <<<<<<<<<<<<<<
+ *         cdef char *result
+ *         result = recode_string(self.request, text)
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_6Recode_7Request_13string(PyObject *__pyx_v_self, PyObject *__pyx_arg_text); /*proto*/
 static PyObject *__pyx_pw_6Recode_7Request_13string(PyObject *__pyx_v_self, PyObject *__pyx_arg_text) {
@@ -2456,7 +2669,7 @@ static PyObject *__pyx_pw_6Recode_7Request_13string(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("string (wrapper)", 0);
   assert(__pyx_arg_text); {
-    __pyx_v_text = __Pyx_PyObject_AsString(__pyx_arg_text); if (unlikely((!__pyx_v_text) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 655; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_text = __Pyx_PyObject_AsString(__pyx_arg_text); if (unlikely((!__pyx_v_text) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -2465,18 +2678,12 @@ static PyObject *__pyx_pw_6Recode_7Request_13string(PyObject *__pyx_v_self, PyOb
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_6Recode_7Request_12string(((struct __pyx_obj_6Recode_Request *)__pyx_v_self), ((char *)__pyx_v_text));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "Recode.pyx":655
- *             raise error
- * 
- *     def string(self, char *text):             # <<<<<<<<<<<<<<
- *         cdef char *result
- *         result = recode_string(self.request, text)
- */
-
 static PyObject *__pyx_pf_6Recode_7Request_12string(struct __pyx_obj_6Recode_Request *__pyx_v_self, char *__pyx_v_text) {
   char *__pyx_v_result;
   PyObject *__pyx_r = NULL;
@@ -2488,7 +2695,7 @@ static PyObject *__pyx_pf_6Recode_7Request_12string(struct __pyx_obj_6Recode_Req
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("string", 0);
 
-  /* "Recode.pyx":657
+  /* "Recode.pyx":658
  *     def string(self, char *text):
  *         cdef char *result
  *         result = recode_string(self.request, text)             # <<<<<<<<<<<<<<
@@ -2497,7 +2704,7 @@ static PyObject *__pyx_pf_6Recode_7Request_12string(struct __pyx_obj_6Recode_Req
  */
   __pyx_v_result = recode_string(__pyx_v_self->request, __pyx_v_text);
 
-  /* "Recode.pyx":658
+  /* "Recode.pyx":659
  *         cdef char *result
  *         result = recode_string(self.request, text)
  *         if result is NULL:             # <<<<<<<<<<<<<<
@@ -2507,23 +2714,29 @@ static PyObject *__pyx_pf_6Recode_7Request_12string(struct __pyx_obj_6Recode_Req
   __pyx_t_1 = ((__pyx_v_result == NULL) != 0);
   if (__pyx_t_1) {
 
-    /* "Recode.pyx":659
+    /* "Recode.pyx":660
  *         result = recode_string(self.request, text)
  *         if result is NULL:
  *             raise error             # <<<<<<<<<<<<<<
  *         return result
  * 
  */
-    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s__error); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_error); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "Recode.pyx":659
+ *         cdef char *result
+ *         result = recode_string(self.request, text)
+ *         if result is NULL:             # <<<<<<<<<<<<<<
+ *             raise error
+ *         return result
+ */
   }
-  __pyx_L3:;
 
-  /* "Recode.pyx":660
+  /* "Recode.pyx":661
  *         if result is NULL:
  *             raise error
  *         return result             # <<<<<<<<<<<<<<
@@ -2531,14 +2744,21 @@ static PyObject *__pyx_pf_6Recode_7Request_12string(struct __pyx_obj_6Recode_Req
  *     #bool recode_string_to_buffer(
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_result); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_r = ((PyObject *)__pyx_t_2);
+  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_result); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "Recode.pyx":656
+ *             raise error
+ * 
+ *     def string(self, char *text):             # <<<<<<<<<<<<<<
+ *         cdef char *result
+ *         result = recode_string(self.request, text)
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_AddTraceback("Recode.Request.string", __pyx_clineno, __pyx_lineno, __pyx_filename);
@@ -2551,18 +2771,26 @@ static PyObject *__pyx_pf_6Recode_7Request_12string(struct __pyx_obj_6Recode_Req
 
 static PyObject *__pyx_tp_new_6Recode_Outer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o;
-  o = (*t->tp_alloc)(t, 0);
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
   if (unlikely(!o)) return 0;
   return o;
 }
 
 static void __pyx_tp_dealloc_6Recode_Outer(PyObject *o) {
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
   {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
     __pyx_pw_6Recode_5Outer_3__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
   }
@@ -2570,18 +2798,18 @@ static void __pyx_tp_dealloc_6Recode_Outer(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_6Recode_Outer[] = {
-  {__Pyx_NAMESTR("default_charset"), (PyCFunction)__pyx_pw_6Recode_5Outer_5default_charset, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("all_charsets"), (PyCFunction)__pyx_pw_6Recode_5Outer_7all_charsets, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("all_surfaces"), (PyCFunction)__pyx_pw_6Recode_5Outer_9all_surfaces, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("concise_charset"), (PyCFunction)__pyx_pw_6Recode_5Outer_11concise_charset, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("full_charset"), (PyCFunction)__pyx_pw_6Recode_5Outer_13full_charset, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("recode"), (PyCFunction)__pyx_pw_6Recode_5Outer_15recode, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {"default_charset", (PyCFunction)__pyx_pw_6Recode_5Outer_5default_charset, METH_NOARGS, 0},
+  {"all_charsets", (PyCFunction)__pyx_pw_6Recode_5Outer_7all_charsets, METH_NOARGS, 0},
+  {"all_surfaces", (PyCFunction)__pyx_pw_6Recode_5Outer_9all_surfaces, METH_NOARGS, 0},
+  {"concise_charset", (PyCFunction)__pyx_pw_6Recode_5Outer_11concise_charset, METH_VARARGS|METH_KEYWORDS, 0},
+  {"full_charset", (PyCFunction)__pyx_pw_6Recode_5Outer_13full_charset, METH_NOARGS, 0},
+  {"recode", (PyCFunction)__pyx_pw_6Recode_5Outer_15recode, METH_VARARGS|METH_KEYWORDS, 0},
   {0, 0, 0, 0}
 };
 
 static PyTypeObject __pyx_type_6Recode_Outer = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("Recode.Outer"), /*tp_name*/
+  "Recode.Outer", /*tp_name*/
   sizeof(struct __pyx_obj_6Recode_Outer), /*tp_basicsize*/
   0, /*tp_itemsize*/
   __pyx_tp_dealloc_6Recode_Outer, /*tp_dealloc*/
@@ -2590,8 +2818,9 @@ static PyTypeObject __pyx_type_6Recode_Outer = {
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
-  #else
-  0, /*reserved*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
   #endif
   0, /*tp_repr*/
   0, /*tp_as_number*/
@@ -2630,25 +2859,34 @@ static PyTypeObject __pyx_type_6Recode_Outer = {
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
   0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
   0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
   #endif
 };
 
 static PyObject *__pyx_tp_new_6Recode_Request(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o;
-  o = (*t->tp_alloc)(t, 0);
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
   if (unlikely(!o)) return 0;
   return o;
 }
 
 static void __pyx_tp_dealloc_6Recode_Request(PyObject *o) {
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
   {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
     __pyx_pw_6Recode_7Request_3__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
   }
@@ -2656,17 +2894,17 @@ static void __pyx_tp_dealloc_6Recode_Request(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_6Recode_Request[] = {
-  {__Pyx_NAMESTR("set_verbose"), (PyCFunction)__pyx_pw_6Recode_7Request_5set_verbose, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("scan"), (PyCFunction)__pyx_pw_6Recode_7Request_7scan, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("pair_sequence"), (PyCFunction)__pyx_pw_6Recode_7Request_9pair_sequence, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("format_table"), (PyCFunction)__pyx_pw_6Recode_7Request_11format_table, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("string"), (PyCFunction)__pyx_pw_6Recode_7Request_13string, METH_O, __Pyx_DOCSTR(0)},
+  {"set_verbose", (PyCFunction)__pyx_pw_6Recode_7Request_5set_verbose, METH_O, 0},
+  {"scan", (PyCFunction)__pyx_pw_6Recode_7Request_7scan, METH_O, 0},
+  {"pair_sequence", (PyCFunction)__pyx_pw_6Recode_7Request_9pair_sequence, METH_NOARGS, 0},
+  {"format_table", (PyCFunction)__pyx_pw_6Recode_7Request_11format_table, METH_VARARGS|METH_KEYWORDS, 0},
+  {"string", (PyCFunction)__pyx_pw_6Recode_7Request_13string, METH_O, 0},
   {0, 0, 0, 0}
 };
 
 static PyTypeObject __pyx_type_6Recode_Request = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("Recode.Request"), /*tp_name*/
+  "Recode.Request", /*tp_name*/
   sizeof(struct __pyx_obj_6Recode_Request), /*tp_basicsize*/
   0, /*tp_itemsize*/
   __pyx_tp_dealloc_6Recode_Request, /*tp_dealloc*/
@@ -2675,8 +2913,9 @@ static PyTypeObject __pyx_type_6Recode_Request = {
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
-  #else
-  0, /*reserved*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
   #endif
   0, /*tp_repr*/
   0, /*tp_as_number*/
@@ -2715,8 +2954,9 @@ static PyTypeObject __pyx_type_6Recode_Request = {
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
   0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
   0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
   #endif
 };
 
@@ -2731,7 +2971,7 @@ static struct PyModuleDef __pyx_moduledef = {
   #else
     PyModuleDef_HEAD_INIT,
   #endif
-    __Pyx_NAMESTR("Recode"),
+    "Recode",
     0, /* m_doc */
     -1, /* m_size */
     __pyx_methods /* m_methods */,
@@ -2743,90 +2983,91 @@ static struct PyModuleDef __pyx_moduledef = {
 #endif
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
-  {&__pyx_n_s_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 0, 1, 1},
-  {&__pyx_n_s_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 0, 1, 1},
-  {&__pyx_n_s_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 0, 1, 1},
-  {&__pyx_n_s_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 0, 1, 1},
-  {&__pyx_n_s_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 0, 1, 1},
-  {&__pyx_n_s_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 0, 1, 1},
-  {&__pyx_n_s_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 0, 1, 1},
-  {&__pyx_n_s_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 0, 1, 1},
-  {&__pyx_n_s__AMBIGUOUS_OUTPUT, __pyx_k__AMBIGUOUS_OUTPUT, sizeof(__pyx_k__AMBIGUOUS_OUTPUT), 0, 0, 1, 1},
-  {&__pyx_n_s__AUTO_ABORT_FLAG, __pyx_k__AUTO_ABORT_FLAG, sizeof(__pyx_k__AUTO_ABORT_FLAG), 0, 0, 1, 1},
-  {&__pyx_n_s__BYTE_ORDER_MARK, __pyx_k__BYTE_ORDER_MARK, sizeof(__pyx_k__BYTE_ORDER_MARK), 0, 0, 1, 1},
-  {&__pyx_n_s__BYTE_TO_BYTE, __pyx_k__BYTE_TO_BYTE, sizeof(__pyx_k__BYTE_TO_BYTE), 0, 0, 1, 1},
-  {&__pyx_n_s__BYTE_TO_STRING, __pyx_k__BYTE_TO_STRING, sizeof(__pyx_k__BYTE_TO_STRING), 0, 0, 1, 1},
-  {&__pyx_n_s__CHARSET, __pyx_k__CHARSET, sizeof(__pyx_k__CHARSET), 0, 0, 1, 1},
-  {&__pyx_n_s__COMBINE_EXPLODE, __pyx_k__COMBINE_EXPLODE, sizeof(__pyx_k__COMBINE_EXPLODE), 0, 0, 1, 1},
-  {&__pyx_n_s__COMBINE_STEP, __pyx_k__COMBINE_STEP, sizeof(__pyx_k__COMBINE_STEP), 0, 0, 1, 1},
-  {&__pyx_n_s__DATA_SURFACE, __pyx_k__DATA_SURFACE, sizeof(__pyx_k__DATA_SURFACE), 0, 0, 1, 1},
-  {&__pyx_n_s__DECIMAL_FORMAT, __pyx_k__DECIMAL_FORMAT, sizeof(__pyx_k__DECIMAL_FORMAT), 0, 0, 1, 1},
-  {&__pyx_n_s__EXPLODE_DATA, __pyx_k__EXPLODE_DATA, sizeof(__pyx_k__EXPLODE_DATA), 0, 0, 1, 1},
-  {&__pyx_n_s__EXPLODE_STEP, __pyx_k__EXPLODE_STEP, sizeof(__pyx_k__EXPLODE_STEP), 0, 0, 1, 1},
-  {&__pyx_n_s__Exception, __pyx_k__Exception, sizeof(__pyx_k__Exception), 0, 0, 1, 1},
-  {&__pyx_n_s__FULL_FORMAT, __pyx_k__FULL_FORMAT, sizeof(__pyx_k__FULL_FORMAT), 0, 0, 1, 1},
-  {&__pyx_n_s__HEXADECIMAL_FORMAT, __pyx_k__HEXADECIMAL_FORMAT, sizeof(__pyx_k__HEXADECIMAL_FORMAT), 0, 0, 1, 1},
-  {&__pyx_n_s__INTERNAL_ERROR, __pyx_k__INTERNAL_ERROR, sizeof(__pyx_k__INTERNAL_ERROR), 0, 0, 1, 1},
-  {&__pyx_n_s__INVALID_INPUT, __pyx_k__INVALID_INPUT, sizeof(__pyx_k__INVALID_INPUT), 0, 0, 1, 1},
-  {&__pyx_n_s__LANGUAGE_C, __pyx_k__LANGUAGE_C, sizeof(__pyx_k__LANGUAGE_C), 0, 0, 1, 1},
-  {&__pyx_n_s__LANGUAGE_PERL, __pyx_k__LANGUAGE_PERL, sizeof(__pyx_k__LANGUAGE_PERL), 0, 0, 1, 1},
-  {&__pyx_n_s__MAXIMUM_ERROR, __pyx_k__MAXIMUM_ERROR, sizeof(__pyx_k__MAXIMUM_ERROR), 0, 0, 1, 1},
-  {&__pyx_n_s__NOT_A_CHARACTER, __pyx_k__NOT_A_CHARACTER, sizeof(__pyx_k__NOT_A_CHARACTER), 0, 0, 1, 1},
-  {&__pyx_n_s__NOT_CANONICAL, __pyx_k__NOT_CANONICAL, sizeof(__pyx_k__NOT_CANONICAL), 0, 0, 1, 1},
-  {&__pyx_n_s__NO_CHARSET_DATA, __pyx_k__NO_CHARSET_DATA, sizeof(__pyx_k__NO_CHARSET_DATA), 0, 0, 1, 1},
-  {&__pyx_n_s__NO_ERROR, __pyx_k__NO_ERROR, sizeof(__pyx_k__NO_ERROR), 0, 0, 1, 1},
-  {&__pyx_n_s__NO_FORMAT, __pyx_k__NO_FORMAT, sizeof(__pyx_k__NO_FORMAT), 0, 0, 1, 1},
-  {&__pyx_n_s__NO_ICONV_FLAG, __pyx_k__NO_ICONV_FLAG, sizeof(__pyx_k__NO_ICONV_FLAG), 0, 0, 1, 1},
-  {&__pyx_n_s__NO_LANGUAGE, __pyx_k__NO_LANGUAGE, sizeof(__pyx_k__NO_LANGUAGE), 0, 0, 1, 1},
-  {&__pyx_n_s__NO_STEP_TABLE, __pyx_k__NO_STEP_TABLE, sizeof(__pyx_k__NO_STEP_TABLE), 0, 0, 1, 1},
-  {&__pyx_n_s__NO_SYMBOL_TYPE, __pyx_k__NO_SYMBOL_TYPE, sizeof(__pyx_k__NO_SYMBOL_TYPE), 0, 0, 1, 1},
-  {&__pyx_n_s__NUL, __pyx_k__NUL, sizeof(__pyx_k__NUL), 0, 0, 1, 1},
-  {&__pyx_n_s__OCTAL_FORMAT, __pyx_k__OCTAL_FORMAT, sizeof(__pyx_k__OCTAL_FORMAT), 0, 0, 1, 1},
-  {&__pyx_n_s__Recode, __pyx_k__Recode, sizeof(__pyx_k__Recode), 0, 0, 1, 1},
-  {&__pyx_n_s__SEQUENCE_IN_MEMORY, __pyx_k__SEQUENCE_IN_MEMORY, sizeof(__pyx_k__SEQUENCE_IN_MEMORY), 0, 0, 1, 1},
-  {&__pyx_n_s__SEQUENCE_WITH_FILES, __pyx_k__SEQUENCE_WITH_FILES, sizeof(__pyx_k__SEQUENCE_WITH_FILES), 0, 0, 1, 1},
-  {&__pyx_n_s__SEQUENCE_WITH_PIPE, __pyx_k__SEQUENCE_WITH_PIPE, sizeof(__pyx_k__SEQUENCE_WITH_PIPE), 0, 0, 1, 1},
-  {&__pyx_n_s__SIZE_1, __pyx_k__SIZE_1, sizeof(__pyx_k__SIZE_1), 0, 0, 1, 1},
-  {&__pyx_n_s__SIZE_2, __pyx_k__SIZE_2, sizeof(__pyx_k__SIZE_2), 0, 0, 1, 1},
-  {&__pyx_n_s__SIZE_4, __pyx_k__SIZE_4, sizeof(__pyx_k__SIZE_4), 0, 0, 1, 1},
-  {&__pyx_n_s__SIZE_N, __pyx_k__SIZE_N, sizeof(__pyx_k__SIZE_N), 0, 0, 1, 1},
-  {&__pyx_n_s__STRATEGY_UNDECIDED, __pyx_k__STRATEGY_UNDECIDED, sizeof(__pyx_k__STRATEGY_UNDECIDED), 0, 0, 1, 1},
-  {&__pyx_n_s__STRING_TO_UCS2, __pyx_k__STRING_TO_UCS2, sizeof(__pyx_k__STRING_TO_UCS2), 0, 0, 1, 1},
-  {&__pyx_n_s__STRIP_DATA, __pyx_k__STRIP_DATA, sizeof(__pyx_k__STRIP_DATA), 0, 0, 1, 1},
-  {&__pyx_n_s__STRIP_SIZE, __pyx_k__STRIP_SIZE, sizeof(__pyx_k__STRIP_SIZE), 0, 0, 1, 1},
-  {&__pyx_n_s__SWAP_NO, __pyx_k__SWAP_NO, sizeof(__pyx_k__SWAP_NO), 0, 0, 1, 1},
-  {&__pyx_n_s__SWAP_UNDECIDED, __pyx_k__SWAP_UNDECIDED, sizeof(__pyx_k__SWAP_UNDECIDED), 0, 0, 1, 1},
-  {&__pyx_n_s__SWAP_YES, __pyx_k__SWAP_YES, sizeof(__pyx_k__SWAP_YES), 0, 0, 1, 1},
-  {&__pyx_n_s__SYSTEM_ERROR, __pyx_k__SYSTEM_ERROR, sizeof(__pyx_k__SYSTEM_ERROR), 0, 0, 1, 1},
-  {&__pyx_n_s__TREE_SURFACE, __pyx_k__TREE_SURFACE, sizeof(__pyx_k__TREE_SURFACE), 0, 0, 1, 1},
-  {&__pyx_n_s__UCS2_TO_BYTE, __pyx_k__UCS2_TO_BYTE, sizeof(__pyx_k__UCS2_TO_BYTE), 0, 0, 1, 1},
-  {&__pyx_n_s__UCS2_TO_STRING, __pyx_k__UCS2_TO_STRING, sizeof(__pyx_k__UCS2_TO_STRING), 0, 0, 1, 1},
-  {&__pyx_n_s__UNTRANSLATABLE, __pyx_k__UNTRANSLATABLE, sizeof(__pyx_k__UNTRANSLATABLE), 0, 0, 1, 1},
-  {&__pyx_n_s__USER_ERROR, __pyx_k__USER_ERROR, sizeof(__pyx_k__USER_ERROR), 0, 0, 1, 1},
-  {&__pyx_n_s____class__, __pyx_k____class__, sizeof(__pyx_k____class__), 0, 0, 1, 1},
-  {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},
-  {&__pyx_n_s____metaclass__, __pyx_k____metaclass__, sizeof(__pyx_k____metaclass__), 0, 0, 1, 1},
-  {&__pyx_n_s____module__, __pyx_k____module__, sizeof(__pyx_k____module__), 0, 0, 1, 1},
-  {&__pyx_n_s____qualname__, __pyx_k____qualname__, sizeof(__pyx_k____qualname__), 0, 0, 1, 1},
-  {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},
-  {&__pyx_n_s__auto_abort, __pyx_k__auto_abort, sizeof(__pyx_k__auto_abort), 0, 0, 1, 1},
-  {&__pyx_n_s__charset, __pyx_k__charset, sizeof(__pyx_k__charset), 0, 0, 1, 1},
-  {&__pyx_n_s__command, __pyx_k__command, sizeof(__pyx_k__command), 0, 0, 1, 1},
-  {&__pyx_n_s__error, __pyx_k__error, sizeof(__pyx_k__error), 0, 0, 1, 1},
-  {&__pyx_n_s__format, __pyx_k__format, sizeof(__pyx_k__format), 0, 0, 1, 1},
-  {&__pyx_n_s__iconv, __pyx_k__iconv, sizeof(__pyx_k__iconv), 0, 0, 1, 1},
-  {&__pyx_n_s__input, __pyx_k__input, sizeof(__pyx_k__input), 0, 0, 1, 1},
-  {&__pyx_n_s__language, __pyx_k__language, sizeof(__pyx_k__language), 0, 0, 1, 1},
-  {&__pyx_n_s__outer, __pyx_k__outer, sizeof(__pyx_k__outer), 0, 0, 1, 1},
-  {&__pyx_n_s__scan, __pyx_k__scan, sizeof(__pyx_k__scan), 0, 0, 1, 1},
-  {&__pyx_n_s__strict, __pyx_k__strict, sizeof(__pyx_k__strict), 0, 0, 1, 1},
-  {&__pyx_n_s__string, __pyx_k__string, sizeof(__pyx_k__string), 0, 0, 1, 1},
-  {&__pyx_n_s__xDONE, __pyx_k__xDONE, sizeof(__pyx_k__xDONE), 0, 0, 1, 1},
-  {&__pyx_n_s__xELSE, __pyx_k__xELSE, sizeof(__pyx_k__xELSE), 0, 0, 1, 1},
+  {&__pyx_n_s_ALIAS_FIND_AS_CHARSET, __pyx_k_ALIAS_FIND_AS_CHARSET, sizeof(__pyx_k_ALIAS_FIND_AS_CHARSET), 0, 0, 1, 1},
+  {&__pyx_n_s_ALIAS_FIND_AS_EITHER, __pyx_k_ALIAS_FIND_AS_EITHER, sizeof(__pyx_k_ALIAS_FIND_AS_EITHER), 0, 0, 1, 1},
+  {&__pyx_n_s_ALIAS_FIND_AS_SURFACE, __pyx_k_ALIAS_FIND_AS_SURFACE, sizeof(__pyx_k_ALIAS_FIND_AS_SURFACE), 0, 0, 1, 1},
+  {&__pyx_n_s_AMBIGUOUS_OUTPUT, __pyx_k_AMBIGUOUS_OUTPUT, sizeof(__pyx_k_AMBIGUOUS_OUTPUT), 0, 0, 1, 1},
+  {&__pyx_n_s_AUTO_ABORT_FLAG, __pyx_k_AUTO_ABORT_FLAG, sizeof(__pyx_k_AUTO_ABORT_FLAG), 0, 0, 1, 1},
+  {&__pyx_n_s_BYTE_ORDER_MARK, __pyx_k_BYTE_ORDER_MARK, sizeof(__pyx_k_BYTE_ORDER_MARK), 0, 0, 1, 1},
+  {&__pyx_n_s_BYTE_ORDER_MARK_SWAPPED, __pyx_k_BYTE_ORDER_MARK_SWAPPED, sizeof(__pyx_k_BYTE_ORDER_MARK_SWAPPED), 0, 0, 1, 1},
+  {&__pyx_n_s_BYTE_TO_BYTE, __pyx_k_BYTE_TO_BYTE, sizeof(__pyx_k_BYTE_TO_BYTE), 0, 0, 1, 1},
+  {&__pyx_n_s_BYTE_TO_STRING, __pyx_k_BYTE_TO_STRING, sizeof(__pyx_k_BYTE_TO_STRING), 0, 0, 1, 1},
+  {&__pyx_n_s_CHARSET, __pyx_k_CHARSET, sizeof(__pyx_k_CHARSET), 0, 0, 1, 1},
+  {&__pyx_n_s_COMBINE_EXPLODE, __pyx_k_COMBINE_EXPLODE, sizeof(__pyx_k_COMBINE_EXPLODE), 0, 0, 1, 1},
+  {&__pyx_n_s_COMBINE_STEP, __pyx_k_COMBINE_STEP, sizeof(__pyx_k_COMBINE_STEP), 0, 0, 1, 1},
+  {&__pyx_n_s_DATA_SURFACE, __pyx_k_DATA_SURFACE, sizeof(__pyx_k_DATA_SURFACE), 0, 0, 1, 1},
+  {&__pyx_n_s_DECIMAL_FORMAT, __pyx_k_DECIMAL_FORMAT, sizeof(__pyx_k_DECIMAL_FORMAT), 0, 0, 1, 1},
+  {&__pyx_n_s_EXPLODE_DATA, __pyx_k_EXPLODE_DATA, sizeof(__pyx_k_EXPLODE_DATA), 0, 0, 1, 1},
+  {&__pyx_n_s_EXPLODE_STEP, __pyx_k_EXPLODE_STEP, sizeof(__pyx_k_EXPLODE_STEP), 0, 0, 1, 1},
+  {&__pyx_n_s_Exception, __pyx_k_Exception, sizeof(__pyx_k_Exception), 0, 0, 1, 1},
+  {&__pyx_n_s_FULL_FORMAT, __pyx_k_FULL_FORMAT, sizeof(__pyx_k_FULL_FORMAT), 0, 0, 1, 1},
+  {&__pyx_n_s_HEXADECIMAL_FORMAT, __pyx_k_HEXADECIMAL_FORMAT, sizeof(__pyx_k_HEXADECIMAL_FORMAT), 0, 0, 1, 1},
+  {&__pyx_n_s_INTERNAL_ERROR, __pyx_k_INTERNAL_ERROR, sizeof(__pyx_k_INTERNAL_ERROR), 0, 0, 1, 1},
+  {&__pyx_n_s_INVALID_INPUT, __pyx_k_INVALID_INPUT, sizeof(__pyx_k_INVALID_INPUT), 0, 0, 1, 1},
+  {&__pyx_n_s_LANGUAGE_C, __pyx_k_LANGUAGE_C, sizeof(__pyx_k_LANGUAGE_C), 0, 0, 1, 1},
+  {&__pyx_n_s_LANGUAGE_PERL, __pyx_k_LANGUAGE_PERL, sizeof(__pyx_k_LANGUAGE_PERL), 0, 0, 1, 1},
+  {&__pyx_n_s_MAXIMUM_ERROR, __pyx_k_MAXIMUM_ERROR, sizeof(__pyx_k_MAXIMUM_ERROR), 0, 0, 1, 1},
+  {&__pyx_n_s_NOT_A_CHARACTER, __pyx_k_NOT_A_CHARACTER, sizeof(__pyx_k_NOT_A_CHARACTER), 0, 0, 1, 1},
+  {&__pyx_n_s_NOT_CANONICAL, __pyx_k_NOT_CANONICAL, sizeof(__pyx_k_NOT_CANONICAL), 0, 0, 1, 1},
+  {&__pyx_n_s_NO_CHARSET_DATA, __pyx_k_NO_CHARSET_DATA, sizeof(__pyx_k_NO_CHARSET_DATA), 0, 0, 1, 1},
+  {&__pyx_n_s_NO_ERROR, __pyx_k_NO_ERROR, sizeof(__pyx_k_NO_ERROR), 0, 0, 1, 1},
+  {&__pyx_n_s_NO_FORMAT, __pyx_k_NO_FORMAT, sizeof(__pyx_k_NO_FORMAT), 0, 0, 1, 1},
+  {&__pyx_n_s_NO_ICONV_FLAG, __pyx_k_NO_ICONV_FLAG, sizeof(__pyx_k_NO_ICONV_FLAG), 0, 0, 1, 1},
+  {&__pyx_n_s_NO_LANGUAGE, __pyx_k_NO_LANGUAGE, sizeof(__pyx_k_NO_LANGUAGE), 0, 0, 1, 1},
+  {&__pyx_n_s_NO_STEP_TABLE, __pyx_k_NO_STEP_TABLE, sizeof(__pyx_k_NO_STEP_TABLE), 0, 0, 1, 1},
+  {&__pyx_n_s_NO_SYMBOL_TYPE, __pyx_k_NO_SYMBOL_TYPE, sizeof(__pyx_k_NO_SYMBOL_TYPE), 0, 0, 1, 1},
+  {&__pyx_n_s_NUL, __pyx_k_NUL, sizeof(__pyx_k_NUL), 0, 0, 1, 1},
+  {&__pyx_n_s_OCTAL_FORMAT, __pyx_k_OCTAL_FORMAT, sizeof(__pyx_k_OCTAL_FORMAT), 0, 0, 1, 1},
+  {&__pyx_n_s_REPLACEMENT_CHARACTER, __pyx_k_REPLACEMENT_CHARACTER, sizeof(__pyx_k_REPLACEMENT_CHARACTER), 0, 0, 1, 1},
+  {&__pyx_n_s_Recode, __pyx_k_Recode, sizeof(__pyx_k_Recode), 0, 0, 1, 1},
+  {&__pyx_n_s_SEQUENCE_IN_MEMORY, __pyx_k_SEQUENCE_IN_MEMORY, sizeof(__pyx_k_SEQUENCE_IN_MEMORY), 0, 0, 1, 1},
+  {&__pyx_n_s_SEQUENCE_WITH_FILES, __pyx_k_SEQUENCE_WITH_FILES, sizeof(__pyx_k_SEQUENCE_WITH_FILES), 0, 0, 1, 1},
+  {&__pyx_n_s_SEQUENCE_WITH_PIPE, __pyx_k_SEQUENCE_WITH_PIPE, sizeof(__pyx_k_SEQUENCE_WITH_PIPE), 0, 0, 1, 1},
+  {&__pyx_n_s_SIZE_1, __pyx_k_SIZE_1, sizeof(__pyx_k_SIZE_1), 0, 0, 1, 1},
+  {&__pyx_n_s_SIZE_2, __pyx_k_SIZE_2, sizeof(__pyx_k_SIZE_2), 0, 0, 1, 1},
+  {&__pyx_n_s_SIZE_4, __pyx_k_SIZE_4, sizeof(__pyx_k_SIZE_4), 0, 0, 1, 1},
+  {&__pyx_n_s_SIZE_N, __pyx_k_SIZE_N, sizeof(__pyx_k_SIZE_N), 0, 0, 1, 1},
+  {&__pyx_n_s_STRATEGY_UNDECIDED, __pyx_k_STRATEGY_UNDECIDED, sizeof(__pyx_k_STRATEGY_UNDECIDED), 0, 0, 1, 1},
+  {&__pyx_n_s_STRING_TO_UCS2, __pyx_k_STRING_TO_UCS2, sizeof(__pyx_k_STRING_TO_UCS2), 0, 0, 1, 1},
+  {&__pyx_n_s_STRIP_DATA, __pyx_k_STRIP_DATA, sizeof(__pyx_k_STRIP_DATA), 0, 0, 1, 1},
+  {&__pyx_n_s_STRIP_SIZE, __pyx_k_STRIP_SIZE, sizeof(__pyx_k_STRIP_SIZE), 0, 0, 1, 1},
+  {&__pyx_n_s_SWAP_NO, __pyx_k_SWAP_NO, sizeof(__pyx_k_SWAP_NO), 0, 0, 1, 1},
+  {&__pyx_n_s_SWAP_UNDECIDED, __pyx_k_SWAP_UNDECIDED, sizeof(__pyx_k_SWAP_UNDECIDED), 0, 0, 1, 1},
+  {&__pyx_n_s_SWAP_YES, __pyx_k_SWAP_YES, sizeof(__pyx_k_SWAP_YES), 0, 0, 1, 1},
+  {&__pyx_n_s_SYMBOL_CREATE_CHARSET, __pyx_k_SYMBOL_CREATE_CHARSET, sizeof(__pyx_k_SYMBOL_CREATE_CHARSET), 0, 0, 1, 1},
+  {&__pyx_n_s_SYMBOL_CREATE_DATA_SURFACE, __pyx_k_SYMBOL_CREATE_DATA_SURFACE, sizeof(__pyx_k_SYMBOL_CREATE_DATA_SURFACE), 0, 0, 1, 1},
+  {&__pyx_n_s_SYMBOL_CREATE_TREE_SURFACE, __pyx_k_SYMBOL_CREATE_TREE_SURFACE, sizeof(__pyx_k_SYMBOL_CREATE_TREE_SURFACE), 0, 0, 1, 1},
+  {&__pyx_n_s_SYSTEM_ERROR, __pyx_k_SYSTEM_ERROR, sizeof(__pyx_k_SYSTEM_ERROR), 0, 0, 1, 1},
+  {&__pyx_n_s_TREE_SURFACE, __pyx_k_TREE_SURFACE, sizeof(__pyx_k_TREE_SURFACE), 0, 0, 1, 1},
+  {&__pyx_n_s_UCS2_TO_BYTE, __pyx_k_UCS2_TO_BYTE, sizeof(__pyx_k_UCS2_TO_BYTE), 0, 0, 1, 1},
+  {&__pyx_n_s_UCS2_TO_STRING, __pyx_k_UCS2_TO_STRING, sizeof(__pyx_k_UCS2_TO_STRING), 0, 0, 1, 1},
+  {&__pyx_n_s_UNTRANSLATABLE, __pyx_k_UNTRANSLATABLE, sizeof(__pyx_k_UNTRANSLATABLE), 0, 0, 1, 1},
+  {&__pyx_n_s_USER_ERROR, __pyx_k_USER_ERROR, sizeof(__pyx_k_USER_ERROR), 0, 0, 1, 1},
+  {&__pyx_n_s_auto_abort, __pyx_k_auto_abort, sizeof(__pyx_k_auto_abort), 0, 0, 1, 1},
+  {&__pyx_n_s_charset, __pyx_k_charset, sizeof(__pyx_k_charset), 0, 0, 1, 1},
+  {&__pyx_n_s_command, __pyx_k_command, sizeof(__pyx_k_command), 0, 0, 1, 1},
+  {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1},
+  {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1},
+  {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1},
+  {&__pyx_n_s_iconv, __pyx_k_iconv, sizeof(__pyx_k_iconv), 0, 0, 1, 1},
+  {&__pyx_n_s_input, __pyx_k_input, sizeof(__pyx_k_input), 0, 0, 1, 1},
+  {&__pyx_n_s_language, __pyx_k_language, sizeof(__pyx_k_language), 0, 0, 1, 1},
+  {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
+  {&__pyx_n_s_metaclass, __pyx_k_metaclass, sizeof(__pyx_k_metaclass), 0, 0, 1, 1},
+  {&__pyx_n_s_module, __pyx_k_module, sizeof(__pyx_k_module), 0, 0, 1, 1},
+  {&__pyx_n_s_outer, __pyx_k_outer, sizeof(__pyx_k_outer), 0, 0, 1, 1},
+  {&__pyx_n_s_prepare, __pyx_k_prepare, sizeof(__pyx_k_prepare), 0, 0, 1, 1},
+  {&__pyx_n_s_qualname, __pyx_k_qualname, sizeof(__pyx_k_qualname), 0, 0, 1, 1},
+  {&__pyx_n_s_scan, __pyx_k_scan, sizeof(__pyx_k_scan), 0, 0, 1, 1},
+  {&__pyx_n_s_strict, __pyx_k_strict, sizeof(__pyx_k_strict), 0, 0, 1, 1},
+  {&__pyx_n_s_string, __pyx_k_string, sizeof(__pyx_k_string), 0, 0, 1, 1},
+  {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
+  {&__pyx_n_s_xDONE, __pyx_k_xDONE, sizeof(__pyx_k_xDONE), 0, 0, 1, 1},
+  {&__pyx_n_s_xELSE, __pyx_k_xELSE, sizeof(__pyx_k_xELSE), 0, 0, 1, 1},
   {0, 0, 0, 0, 0, 0, 0}
 };
 static int __Pyx_InitCachedBuiltins(void) {
-  __pyx_builtin_Exception = __Pyx_GetBuiltinName(__pyx_n_s__Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_Exception = __Pyx_GetBuiltinName(__pyx_n_s_Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -2857,6 +3098,7 @@ PyMODINIT_FUNC PyInit_Recode(void)
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -2871,18 +3113,24 @@ PyMODINIT_FUNC PyInit_Recode(void)
   }
   #endif
   __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_Recode(void)", 0);
-  if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #ifdef __Pyx_CyFunction_USED
-  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   #ifdef __Pyx_FusedFunction_USED
   if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
+  #ifdef __Pyx_Coroutine_USED
+  if (__pyx_Coroutine_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
   #ifdef __Pyx_Generator_USED
   if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
+  #ifdef __Pyx_StopAsyncIteration_USED
+  if (__pyx_StopAsyncIteration_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
   /*--- Library function declarations ---*/
   /*--- Threads initialization code ---*/
   #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
@@ -2892,846 +3140,837 @@ PyMODINIT_FUNC PyInit_Recode(void)
   #endif
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("Recode"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
+  __pyx_m = Py_InitModule4("Recode", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
   #else
   __pyx_m = PyModule_Create(&__pyx_moduledef);
   #endif
   if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   Py_INCREF(__pyx_d);
-  #if PY_MAJOR_VERSION >= 3
-  {
-    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    if (!PyDict_GetItemString(modules, "Recode")) {
-      if (unlikely(PyDict_SetItemString(modules, "Recode", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-  }
-  #endif
-  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #if CYTHON_COMPILING_IN_PYPY
   Py_INCREF(__pyx_b);
   #endif
-  if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   /*--- Initialize various global constants etc. ---*/
-  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_InitGlobals() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
   if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   if (__pyx_module_is_main_Recode) {
-    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  #if PY_MAJOR_VERSION >= 3
+  {
+    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!PyDict_GetItemString(modules, "Recode")) {
+      if (unlikely(PyDict_SetItemString(modules, "Recode", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
   }
+  #endif
   /*--- Builtin init code ---*/
-  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_InitCachedBuiltins() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Constants init code ---*/
-  if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_InitCachedConstants() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Global init code ---*/
   /*--- Variable export code ---*/
   /*--- Function export code ---*/
   /*--- Type init code ---*/
-  if (PyType_Ready(&__pyx_type_6Recode_Outer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Outer", (PyObject *)&__pyx_type_6Recode_Outer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_6Recode_Outer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_6Recode_Outer.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "Outer", (PyObject *)&__pyx_type_6Recode_Outer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_6Recode_Outer = &__pyx_type_6Recode_Outer;
-  if (PyType_Ready(&__pyx_type_6Recode_Request) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Request", (PyObject *)&__pyx_type_6Recode_Request) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_6Recode_Request) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_6Recode_Request.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "Request", (PyObject *)&__pyx_type_6Recode_Request) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_6Recode_Request = &__pyx_type_6Recode_Request;
   /*--- Type import code ---*/
   /*--- Variable import code ---*/
   /*--- Function import code ---*/
   /*--- Execution code ---*/
+  #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+  if (__Pyx_patch_abc() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
 
-  /* "Recode.pyx":469
+  /* "Recode.pyx":470
  *     bool recode_perform_task(RECODE_TASK)
  * 
  * class error(Exception):             # <<<<<<<<<<<<<<
  *     pass
  * 
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_builtin_Exception);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_builtin_Exception);
   __Pyx_GIVEREF(__pyx_builtin_Exception);
-  __pyx_t_3 = __Pyx_CreateClass(((PyObject *)__pyx_t_2), ((PyObject *)__pyx_t_1), __pyx_n_s__error, __pyx_n_s__error, __pyx_n_s__Recode); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_builtin_Exception);
+  __pyx_t_2 = __Pyx_CalculateMetaclass(NULL, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_Py3MetaclassPrepare(__pyx_t_2, __pyx_t_1, __pyx_n_s_error, __pyx_n_s_error, (PyObject *) NULL, __pyx_n_s_Recode, (PyObject *) NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__error, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_Py3ClassCreate(__pyx_t_2, __pyx_n_s_error, __pyx_t_1, __pyx_t_3, NULL, 0, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_error, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":474
+  /* "Recode.pyx":475
  * ## Enums repeated for Python.
  * 
  * NO_SYMBOL_TYPE = RECODE_NO_SYMBOL_TYPE             # <<<<<<<<<<<<<<
  * CHARSET = RECODE_CHARSET
  * DATA_SURFACE = RECODE_DATA_SURFACE
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_NO_SYMBOL_TYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_symbol_type(RECODE_NO_SYMBOL_TYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NO_SYMBOL_TYPE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NO_SYMBOL_TYPE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":475
+  /* "Recode.pyx":476
  * 
  * NO_SYMBOL_TYPE = RECODE_NO_SYMBOL_TYPE
  * CHARSET = RECODE_CHARSET             # <<<<<<<<<<<<<<
  * DATA_SURFACE = RECODE_DATA_SURFACE
  * TREE_SURFACE = RECODE_TREE_SURFACE
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_CHARSET); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_symbol_type(RECODE_CHARSET); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__CHARSET, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CHARSET, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":476
+  /* "Recode.pyx":477
  * NO_SYMBOL_TYPE = RECODE_NO_SYMBOL_TYPE
  * CHARSET = RECODE_CHARSET
  * DATA_SURFACE = RECODE_DATA_SURFACE             # <<<<<<<<<<<<<<
  * TREE_SURFACE = RECODE_TREE_SURFACE
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_DATA_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_symbol_type(RECODE_DATA_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__DATA_SURFACE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_DATA_SURFACE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":477
+  /* "Recode.pyx":478
  * CHARSET = RECODE_CHARSET
  * DATA_SURFACE = RECODE_DATA_SURFACE
  * TREE_SURFACE = RECODE_TREE_SURFACE             # <<<<<<<<<<<<<<
  * 
  * NO_CHARSET_DATA = RECODE_NO_CHARSET_DATA
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_TREE_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_symbol_type(RECODE_TREE_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__TREE_SURFACE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_TREE_SURFACE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":479
+  /* "Recode.pyx":480
  * TREE_SURFACE = RECODE_TREE_SURFACE
  * 
  * NO_CHARSET_DATA = RECODE_NO_CHARSET_DATA             # <<<<<<<<<<<<<<
  * STRIP_DATA = RECODE_STRIP_DATA
  * EXPLODE_DATA = RECODE_EXPLODE_DATA
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_NO_CHARSET_DATA); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_data_type(RECODE_NO_CHARSET_DATA); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NO_CHARSET_DATA, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NO_CHARSET_DATA, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":480
+  /* "Recode.pyx":481
  * 
  * NO_CHARSET_DATA = RECODE_NO_CHARSET_DATA
  * STRIP_DATA = RECODE_STRIP_DATA             # <<<<<<<<<<<<<<
  * EXPLODE_DATA = RECODE_EXPLODE_DATA
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_STRIP_DATA); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_data_type(RECODE_STRIP_DATA); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__STRIP_DATA, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_STRIP_DATA, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":481
+  /* "Recode.pyx":482
  * NO_CHARSET_DATA = RECODE_NO_CHARSET_DATA
  * STRIP_DATA = RECODE_STRIP_DATA
  * EXPLODE_DATA = RECODE_EXPLODE_DATA             # <<<<<<<<<<<<<<
  * 
  * SIZE_1 = RECODE_1
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_EXPLODE_DATA); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_data_type(RECODE_EXPLODE_DATA); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__EXPLODE_DATA, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_EXPLODE_DATA, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":483
+  /* "Recode.pyx":484
  * EXPLODE_DATA = RECODE_EXPLODE_DATA
  * 
  * SIZE_1 = RECODE_1             # <<<<<<<<<<<<<<
  * SIZE_2 = RECODE_2
  * SIZE_4 = RECODE_4
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_size(RECODE_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SIZE_1, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SIZE_1, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":484
+  /* "Recode.pyx":485
  * 
  * SIZE_1 = RECODE_1
  * SIZE_2 = RECODE_2             # <<<<<<<<<<<<<<
  * SIZE_4 = RECODE_4
  * SIZE_N = RECODE_N
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_size(RECODE_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SIZE_2, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SIZE_2, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":485
+  /* "Recode.pyx":486
  * SIZE_1 = RECODE_1
  * SIZE_2 = RECODE_2
  * SIZE_4 = RECODE_4             # <<<<<<<<<<<<<<
  * SIZE_N = RECODE_N
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_size(RECODE_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SIZE_4, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SIZE_4, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":486
+  /* "Recode.pyx":487
  * SIZE_2 = RECODE_2
  * SIZE_4 = RECODE_4
  * SIZE_N = RECODE_N             # <<<<<<<<<<<<<<
  * 
  * NO_STEP_TABLE = RECODE_NO_STEP_TABLE
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_size(RECODE_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SIZE_N, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SIZE_N, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":488
+  /* "Recode.pyx":489
  * SIZE_N = RECODE_N
  * 
  * NO_STEP_TABLE = RECODE_NO_STEP_TABLE             # <<<<<<<<<<<<<<
  * BYTE_TO_BYTE = RECODE_BYTE_TO_BYTE
  * BYTE_TO_STRING = RECODE_BYTE_TO_STRING
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_NO_STEP_TABLE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_step_type(RECODE_NO_STEP_TABLE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NO_STEP_TABLE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NO_STEP_TABLE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":489
+  /* "Recode.pyx":490
  * 
  * NO_STEP_TABLE = RECODE_NO_STEP_TABLE
  * BYTE_TO_BYTE = RECODE_BYTE_TO_BYTE             # <<<<<<<<<<<<<<
  * BYTE_TO_STRING = RECODE_BYTE_TO_STRING
  * UCS2_TO_BYTE = RECODE_UCS2_TO_BYTE
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_BYTE_TO_BYTE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_step_type(RECODE_BYTE_TO_BYTE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__BYTE_TO_BYTE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BYTE_TO_BYTE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":490
+  /* "Recode.pyx":491
  * NO_STEP_TABLE = RECODE_NO_STEP_TABLE
  * BYTE_TO_BYTE = RECODE_BYTE_TO_BYTE
  * BYTE_TO_STRING = RECODE_BYTE_TO_STRING             # <<<<<<<<<<<<<<
  * UCS2_TO_BYTE = RECODE_UCS2_TO_BYTE
  * UCS2_TO_STRING = RECODE_UCS2_TO_STRING
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_BYTE_TO_STRING); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_step_type(RECODE_BYTE_TO_STRING); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__BYTE_TO_STRING, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BYTE_TO_STRING, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":491
+  /* "Recode.pyx":492
  * BYTE_TO_BYTE = RECODE_BYTE_TO_BYTE
  * BYTE_TO_STRING = RECODE_BYTE_TO_STRING
  * UCS2_TO_BYTE = RECODE_UCS2_TO_BYTE             # <<<<<<<<<<<<<<
  * UCS2_TO_STRING = RECODE_UCS2_TO_STRING
  * STRING_TO_UCS2 = RECODE_STRING_TO_UCS2
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_UCS2_TO_BYTE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_step_type(RECODE_UCS2_TO_BYTE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__UCS2_TO_BYTE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_UCS2_TO_BYTE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":492
+  /* "Recode.pyx":493
  * BYTE_TO_STRING = RECODE_BYTE_TO_STRING
  * UCS2_TO_BYTE = RECODE_UCS2_TO_BYTE
  * UCS2_TO_STRING = RECODE_UCS2_TO_STRING             # <<<<<<<<<<<<<<
  * STRING_TO_UCS2 = RECODE_STRING_TO_UCS2
  * COMBINE_EXPLODE = RECODE_COMBINE_EXPLODE
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_UCS2_TO_STRING); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_step_type(RECODE_UCS2_TO_STRING); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__UCS2_TO_STRING, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_UCS2_TO_STRING, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":493
+  /* "Recode.pyx":494
  * UCS2_TO_BYTE = RECODE_UCS2_TO_BYTE
  * UCS2_TO_STRING = RECODE_UCS2_TO_STRING
  * STRING_TO_UCS2 = RECODE_STRING_TO_UCS2             # <<<<<<<<<<<<<<
  * COMBINE_EXPLODE = RECODE_COMBINE_EXPLODE
  * COMBINE_STEP = RECODE_COMBINE_STEP
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_STRING_TO_UCS2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_step_type(RECODE_STRING_TO_UCS2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__STRING_TO_UCS2, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_STRING_TO_UCS2, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":494
+  /* "Recode.pyx":495
  * UCS2_TO_STRING = RECODE_UCS2_TO_STRING
  * STRING_TO_UCS2 = RECODE_STRING_TO_UCS2
  * COMBINE_EXPLODE = RECODE_COMBINE_EXPLODE             # <<<<<<<<<<<<<<
  * COMBINE_STEP = RECODE_COMBINE_STEP
  * EXPLODE_STEP = RECODE_EXPLODE_STEP
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_COMBINE_EXPLODE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_step_type(RECODE_COMBINE_EXPLODE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__COMBINE_EXPLODE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_COMBINE_EXPLODE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":495
+  /* "Recode.pyx":496
  * STRING_TO_UCS2 = RECODE_STRING_TO_UCS2
  * COMBINE_EXPLODE = RECODE_COMBINE_EXPLODE
  * COMBINE_STEP = RECODE_COMBINE_STEP             # <<<<<<<<<<<<<<
  * EXPLODE_STEP = RECODE_EXPLODE_STEP
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_COMBINE_STEP); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_step_type(RECODE_COMBINE_STEP); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__COMBINE_STEP, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_COMBINE_STEP, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":496
+  /* "Recode.pyx":497
  * COMBINE_EXPLODE = RECODE_COMBINE_EXPLODE
  * COMBINE_STEP = RECODE_COMBINE_STEP
  * EXPLODE_STEP = RECODE_EXPLODE_STEP             # <<<<<<<<<<<<<<
  * 
  * STRATEGY_UNDECIDED = RECODE_STRATEGY_UNDECIDED
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_EXPLODE_STEP); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_step_type(RECODE_EXPLODE_STEP); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__EXPLODE_STEP, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_EXPLODE_STEP, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":498
+  /* "Recode.pyx":499
  * EXPLODE_STEP = RECODE_EXPLODE_STEP
  * 
  * STRATEGY_UNDECIDED = RECODE_STRATEGY_UNDECIDED             # <<<<<<<<<<<<<<
  * SEQUENCE_IN_MEMORY = RECODE_SEQUENCE_IN_MEMORY
  * SEQUENCE_WITH_FILES = RECODE_SEQUENCE_WITH_FILES
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_STRATEGY_UNDECIDED); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_sequence_strategy(RECODE_STRATEGY_UNDECIDED); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__STRATEGY_UNDECIDED, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_STRATEGY_UNDECIDED, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":499
+  /* "Recode.pyx":500
  * 
  * STRATEGY_UNDECIDED = RECODE_STRATEGY_UNDECIDED
  * SEQUENCE_IN_MEMORY = RECODE_SEQUENCE_IN_MEMORY             # <<<<<<<<<<<<<<
  * SEQUENCE_WITH_FILES = RECODE_SEQUENCE_WITH_FILES
  * SEQUENCE_WITH_PIPE = RECODE_SEQUENCE_WITH_PIPE
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_SEQUENCE_IN_MEMORY); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_sequence_strategy(RECODE_SEQUENCE_IN_MEMORY); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SEQUENCE_IN_MEMORY, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SEQUENCE_IN_MEMORY, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":500
+  /* "Recode.pyx":501
  * STRATEGY_UNDECIDED = RECODE_STRATEGY_UNDECIDED
  * SEQUENCE_IN_MEMORY = RECODE_SEQUENCE_IN_MEMORY
  * SEQUENCE_WITH_FILES = RECODE_SEQUENCE_WITH_FILES             # <<<<<<<<<<<<<<
  * SEQUENCE_WITH_PIPE = RECODE_SEQUENCE_WITH_PIPE
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_SEQUENCE_WITH_FILES); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_sequence_strategy(RECODE_SEQUENCE_WITH_FILES); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SEQUENCE_WITH_FILES, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SEQUENCE_WITH_FILES, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":501
+  /* "Recode.pyx":502
  * SEQUENCE_IN_MEMORY = RECODE_SEQUENCE_IN_MEMORY
  * SEQUENCE_WITH_FILES = RECODE_SEQUENCE_WITH_FILES
  * SEQUENCE_WITH_PIPE = RECODE_SEQUENCE_WITH_PIPE             # <<<<<<<<<<<<<<
  * 
  * SWAP_UNDECIDED = RECODE_SWAP_UNDECIDED
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_SEQUENCE_WITH_PIPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_sequence_strategy(RECODE_SEQUENCE_WITH_PIPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SEQUENCE_WITH_PIPE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SEQUENCE_WITH_PIPE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":503
+  /* "Recode.pyx":504
  * SEQUENCE_WITH_PIPE = RECODE_SEQUENCE_WITH_PIPE
  * 
  * SWAP_UNDECIDED = RECODE_SWAP_UNDECIDED             # <<<<<<<<<<<<<<
  * SWAP_NO = RECODE_SWAP_NO
  * SWAP_YES = RECODE_SWAP_YES
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_SWAP_UNDECIDED); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_swap_input(RECODE_SWAP_UNDECIDED); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SWAP_UNDECIDED, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SWAP_UNDECIDED, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":504
+  /* "Recode.pyx":505
  * 
  * SWAP_UNDECIDED = RECODE_SWAP_UNDECIDED
  * SWAP_NO = RECODE_SWAP_NO             # <<<<<<<<<<<<<<
  * SWAP_YES = RECODE_SWAP_YES
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_SWAP_NO); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_swap_input(RECODE_SWAP_NO); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SWAP_NO, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SWAP_NO, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":505
+  /* "Recode.pyx":506
  * SWAP_UNDECIDED = RECODE_SWAP_UNDECIDED
  * SWAP_NO = RECODE_SWAP_NO
  * SWAP_YES = RECODE_SWAP_YES             # <<<<<<<<<<<<<<
  * 
  * NO_ERROR = RECODE_NO_ERROR
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_SWAP_YES); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_swap_input(RECODE_SWAP_YES); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SWAP_YES, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SWAP_YES, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":507
+  /* "Recode.pyx":508
  * SWAP_YES = RECODE_SWAP_YES
  * 
  * NO_ERROR = RECODE_NO_ERROR             # <<<<<<<<<<<<<<
  * NOT_CANONICAL = RECODE_NOT_CANONICAL
  * AMBIGUOUS_OUTPUT = RECODE_AMBIGUOUS_OUTPUT
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_NO_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_error(RECODE_NO_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NO_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NO_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":508
+  /* "Recode.pyx":509
  * 
  * NO_ERROR = RECODE_NO_ERROR
  * NOT_CANONICAL = RECODE_NOT_CANONICAL             # <<<<<<<<<<<<<<
  * AMBIGUOUS_OUTPUT = RECODE_AMBIGUOUS_OUTPUT
  * UNTRANSLATABLE = RECODE_UNTRANSLATABLE
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_NOT_CANONICAL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_error(RECODE_NOT_CANONICAL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NOT_CANONICAL, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NOT_CANONICAL, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":509
+  /* "Recode.pyx":510
  * NO_ERROR = RECODE_NO_ERROR
  * NOT_CANONICAL = RECODE_NOT_CANONICAL
  * AMBIGUOUS_OUTPUT = RECODE_AMBIGUOUS_OUTPUT             # <<<<<<<<<<<<<<
  * UNTRANSLATABLE = RECODE_UNTRANSLATABLE
  * INVALID_INPUT = RECODE_INVALID_INPUT
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_AMBIGUOUS_OUTPUT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_error(RECODE_AMBIGUOUS_OUTPUT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__AMBIGUOUS_OUTPUT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_AMBIGUOUS_OUTPUT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":510
+  /* "Recode.pyx":511
  * NOT_CANONICAL = RECODE_NOT_CANONICAL
  * AMBIGUOUS_OUTPUT = RECODE_AMBIGUOUS_OUTPUT
  * UNTRANSLATABLE = RECODE_UNTRANSLATABLE             # <<<<<<<<<<<<<<
  * INVALID_INPUT = RECODE_INVALID_INPUT
  * SYSTEM_ERROR = RECODE_SYSTEM_ERROR
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_UNTRANSLATABLE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_error(RECODE_UNTRANSLATABLE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__UNTRANSLATABLE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_UNTRANSLATABLE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":511
+  /* "Recode.pyx":512
  * AMBIGUOUS_OUTPUT = RECODE_AMBIGUOUS_OUTPUT
  * UNTRANSLATABLE = RECODE_UNTRANSLATABLE
  * INVALID_INPUT = RECODE_INVALID_INPUT             # <<<<<<<<<<<<<<
  * SYSTEM_ERROR = RECODE_SYSTEM_ERROR
  * USER_ERROR = RECODE_USER_ERROR
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_INVALID_INPUT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_error(RECODE_INVALID_INPUT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__INVALID_INPUT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_INVALID_INPUT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":512
+  /* "Recode.pyx":513
  * UNTRANSLATABLE = RECODE_UNTRANSLATABLE
  * INVALID_INPUT = RECODE_INVALID_INPUT
  * SYSTEM_ERROR = RECODE_SYSTEM_ERROR             # <<<<<<<<<<<<<<
  * USER_ERROR = RECODE_USER_ERROR
  * INTERNAL_ERROR = RECODE_INTERNAL_ERROR
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_SYSTEM_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_error(RECODE_SYSTEM_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__SYSTEM_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SYSTEM_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":513
+  /* "Recode.pyx":514
  * INVALID_INPUT = RECODE_INVALID_INPUT
  * SYSTEM_ERROR = RECODE_SYSTEM_ERROR
  * USER_ERROR = RECODE_USER_ERROR             # <<<<<<<<<<<<<<
  * INTERNAL_ERROR = RECODE_INTERNAL_ERROR
  * MAXIMUM_ERROR = RECODE_MAXIMUM_ERROR
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_USER_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_error(RECODE_USER_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__USER_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_USER_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":514
+  /* "Recode.pyx":515
  * SYSTEM_ERROR = RECODE_SYSTEM_ERROR
  * USER_ERROR = RECODE_USER_ERROR
  * INTERNAL_ERROR = RECODE_INTERNAL_ERROR             # <<<<<<<<<<<<<<
  * MAXIMUM_ERROR = RECODE_MAXIMUM_ERROR
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_INTERNAL_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_error(RECODE_INTERNAL_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__INTERNAL_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_INTERNAL_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":515
+  /* "Recode.pyx":516
  * USER_ERROR = RECODE_USER_ERROR
  * INTERNAL_ERROR = RECODE_INTERNAL_ERROR
  * MAXIMUM_ERROR = RECODE_MAXIMUM_ERROR             # <<<<<<<<<<<<<<
  * 
  * NO_FORMAT = RECODE_NO_FORMAT
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_MAXIMUM_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_error(RECODE_MAXIMUM_ERROR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__MAXIMUM_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_MAXIMUM_ERROR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":517
+  /* "Recode.pyx":518
  * MAXIMUM_ERROR = RECODE_MAXIMUM_ERROR
  * 
  * NO_FORMAT = RECODE_NO_FORMAT             # <<<<<<<<<<<<<<
  * DECIMAL_FORMAT = RECODE_DECIMAL_FORMAT
  * OCTAL_FORMAT = RECODE_OCTAL_FORMAT
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_NO_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_list_format(RECODE_NO_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NO_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NO_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":518
+  /* "Recode.pyx":519
  * 
  * NO_FORMAT = RECODE_NO_FORMAT
  * DECIMAL_FORMAT = RECODE_DECIMAL_FORMAT             # <<<<<<<<<<<<<<
  * OCTAL_FORMAT = RECODE_OCTAL_FORMAT
  * HEXADECIMAL_FORMAT = RECODE_HEXADECIMAL_FORMAT
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_DECIMAL_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_list_format(RECODE_DECIMAL_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__DECIMAL_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_DECIMAL_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":519
+  /* "Recode.pyx":520
  * NO_FORMAT = RECODE_NO_FORMAT
  * DECIMAL_FORMAT = RECODE_DECIMAL_FORMAT
  * OCTAL_FORMAT = RECODE_OCTAL_FORMAT             # <<<<<<<<<<<<<<
  * HEXADECIMAL_FORMAT = RECODE_HEXADECIMAL_FORMAT
  * FULL_FORMAT = RECODE_FULL_FORMAT
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_OCTAL_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_list_format(RECODE_OCTAL_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__OCTAL_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_OCTAL_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":520
+  /* "Recode.pyx":521
  * DECIMAL_FORMAT = RECODE_DECIMAL_FORMAT
  * OCTAL_FORMAT = RECODE_OCTAL_FORMAT
  * HEXADECIMAL_FORMAT = RECODE_HEXADECIMAL_FORMAT             # <<<<<<<<<<<<<<
  * FULL_FORMAT = RECODE_FULL_FORMAT
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_HEXADECIMAL_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_list_format(RECODE_HEXADECIMAL_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__HEXADECIMAL_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_HEXADECIMAL_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":521
+  /* "Recode.pyx":522
  * OCTAL_FORMAT = RECODE_OCTAL_FORMAT
  * HEXADECIMAL_FORMAT = RECODE_HEXADECIMAL_FORMAT
  * FULL_FORMAT = RECODE_FULL_FORMAT             # <<<<<<<<<<<<<<
  * 
  * NO_LANGUAGE = RECODE_NO_LANGUAGE
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_FULL_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_list_format(RECODE_FULL_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__FULL_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_FULL_FORMAT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":523
+  /* "Recode.pyx":524
  * FULL_FORMAT = RECODE_FULL_FORMAT
  * 
  * NO_LANGUAGE = RECODE_NO_LANGUAGE             # <<<<<<<<<<<<<<
  * LANGUAGE_C = RECODE_LANGUAGE_C
  * LANGUAGE_PERL = RECODE_LANGUAGE_PERL
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_NO_LANGUAGE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_programming_language(RECODE_NO_LANGUAGE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NO_LANGUAGE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NO_LANGUAGE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":524
+  /* "Recode.pyx":525
  * 
  * NO_LANGUAGE = RECODE_NO_LANGUAGE
  * LANGUAGE_C = RECODE_LANGUAGE_C             # <<<<<<<<<<<<<<
  * LANGUAGE_PERL = RECODE_LANGUAGE_PERL
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_LANGUAGE_C); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_programming_language(RECODE_LANGUAGE_C); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__LANGUAGE_C, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_LANGUAGE_C, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":525
+  /* "Recode.pyx":526
  * NO_LANGUAGE = RECODE_NO_LANGUAGE
  * LANGUAGE_C = RECODE_LANGUAGE_C
  * LANGUAGE_PERL = RECODE_LANGUAGE_PERL             # <<<<<<<<<<<<<<
  * 
  * NUL = NUL_
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_LANGUAGE_PERL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__recode_programming_language(RECODE_LANGUAGE_PERL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__LANGUAGE_PERL, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_LANGUAGE_PERL, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":527
+  /* "Recode.pyx":528
  * LANGUAGE_PERL = RECODE_LANGUAGE_PERL
  * 
  * NUL = NUL_             # <<<<<<<<<<<<<<
  * STRIP_SIZE = STRIP_SIZE_
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(NUL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(NUL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NUL, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NUL, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":528
+  /* "Recode.pyx":529
  * 
  * NUL = NUL_
  * STRIP_SIZE = STRIP_SIZE_             # <<<<<<<<<<<<<<
  * 
  * SYMBOL_CREATE_CHARSET = SYMBOL_CREATE_CHARSET_
  */
-  __pyx_t_1 = PyInt_FromLong(STRIP_SIZE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(STRIP_SIZE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__STRIP_SIZE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_STRIP_SIZE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":530
+  /* "Recode.pyx":531
  * STRIP_SIZE = STRIP_SIZE_
  * 
  * SYMBOL_CREATE_CHARSET = SYMBOL_CREATE_CHARSET_             # <<<<<<<<<<<<<<
  * SYMBOL_CREATE_DATA_SURFACE = SYMBOL_CREATE_DATA_SURFACE_
  * SYMBOL_CREATE_TREE_SURFACE = SYMBOL_CREATE_TREE_SURFACE_
  */
-  __pyx_t_1 = PyInt_FromLong(SYMBOL_CREATE_CHARSET); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__alias_find_type(SYMBOL_CREATE_CHARSET); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_5, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SYMBOL_CREATE_CHARSET, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":531
+  /* "Recode.pyx":532
  * 
  * SYMBOL_CREATE_CHARSET = SYMBOL_CREATE_CHARSET_
  * SYMBOL_CREATE_DATA_SURFACE = SYMBOL_CREATE_DATA_SURFACE_             # <<<<<<<<<<<<<<
  * SYMBOL_CREATE_TREE_SURFACE = SYMBOL_CREATE_TREE_SURFACE_
  * ALIAS_FIND_AS_CHARSET = ALIAS_FIND_AS_CHARSET_
  */
-  __pyx_t_1 = PyInt_FromLong(SYMBOL_CREATE_DATA_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__alias_find_type(SYMBOL_CREATE_DATA_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_6, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SYMBOL_CREATE_DATA_SURFACE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":532
+  /* "Recode.pyx":533
  * SYMBOL_CREATE_CHARSET = SYMBOL_CREATE_CHARSET_
  * SYMBOL_CREATE_DATA_SURFACE = SYMBOL_CREATE_DATA_SURFACE_
  * SYMBOL_CREATE_TREE_SURFACE = SYMBOL_CREATE_TREE_SURFACE_             # <<<<<<<<<<<<<<
  * ALIAS_FIND_AS_CHARSET = ALIAS_FIND_AS_CHARSET_
  * ALIAS_FIND_AS_SURFACE = ALIAS_FIND_AS_SURFACE_
  */
-  __pyx_t_1 = PyInt_FromLong(SYMBOL_CREATE_TREE_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__alias_find_type(SYMBOL_CREATE_TREE_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_7, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_SYMBOL_CREATE_TREE_SURFACE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":533
+  /* "Recode.pyx":534
  * SYMBOL_CREATE_DATA_SURFACE = SYMBOL_CREATE_DATA_SURFACE_
  * SYMBOL_CREATE_TREE_SURFACE = SYMBOL_CREATE_TREE_SURFACE_
  * ALIAS_FIND_AS_CHARSET = ALIAS_FIND_AS_CHARSET_             # <<<<<<<<<<<<<<
  * ALIAS_FIND_AS_SURFACE = ALIAS_FIND_AS_SURFACE_
  * ALIAS_FIND_AS_EITHER = ALIAS_FIND_AS_EITHER_
  */
-  __pyx_t_1 = PyInt_FromLong(ALIAS_FIND_AS_CHARSET); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__alias_find_type(ALIAS_FIND_AS_CHARSET); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_8, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ALIAS_FIND_AS_CHARSET, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":534
+  /* "Recode.pyx":535
  * SYMBOL_CREATE_TREE_SURFACE = SYMBOL_CREATE_TREE_SURFACE_
  * ALIAS_FIND_AS_CHARSET = ALIAS_FIND_AS_CHARSET_
  * ALIAS_FIND_AS_SURFACE = ALIAS_FIND_AS_SURFACE_             # <<<<<<<<<<<<<<
  * ALIAS_FIND_AS_EITHER = ALIAS_FIND_AS_EITHER_
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(ALIAS_FIND_AS_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__alias_find_type(ALIAS_FIND_AS_SURFACE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_9, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ALIAS_FIND_AS_SURFACE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":535
+  /* "Recode.pyx":536
  * ALIAS_FIND_AS_CHARSET = ALIAS_FIND_AS_CHARSET_
  * ALIAS_FIND_AS_SURFACE = ALIAS_FIND_AS_SURFACE_
  * ALIAS_FIND_AS_EITHER = ALIAS_FIND_AS_EITHER_             # <<<<<<<<<<<<<<
  * 
  * xDONE = DONE
  */
-  __pyx_t_1 = PyInt_FromLong(ALIAS_FIND_AS_EITHER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_enum__alias_find_type(ALIAS_FIND_AS_EITHER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_10, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ALIAS_FIND_AS_EITHER, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":537
+  /* "Recode.pyx":538
  * ALIAS_FIND_AS_EITHER = ALIAS_FIND_AS_EITHER_
  * 
  * xDONE = DONE             # <<<<<<<<<<<<<<
  * xELSE = ELSE_
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(DONE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(DONE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__xDONE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_xDONE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":538
+  /* "Recode.pyx":539
  * 
  * xDONE = DONE
  * xELSE = ELSE_             # <<<<<<<<<<<<<<
  * 
  * REPLACEMENT_CHARACTER = REPLACEMENT_CHARACTER_
  */
-  __pyx_t_1 = PyInt_FromLong(ELSE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(ELSE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__xELSE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_xELSE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":540
+  /* "Recode.pyx":541
  * xELSE = ELSE_
  * 
  * REPLACEMENT_CHARACTER = REPLACEMENT_CHARACTER_             # <<<<<<<<<<<<<<
  * NOT_A_CHARACTER = NOT_A_CHARACTER_
  * BYTE_ORDER_MARK = BYTE_ORDER_MARK_
  */
-  __pyx_t_1 = PyInt_FromLong(REPLACEMENT_CHARACTER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(REPLACEMENT_CHARACTER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 541; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_11, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_REPLACEMENT_CHARACTER, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 541; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":541
+  /* "Recode.pyx":542
  * 
  * REPLACEMENT_CHARACTER = REPLACEMENT_CHARACTER_
  * NOT_A_CHARACTER = NOT_A_CHARACTER_             # <<<<<<<<<<<<<<
  * BYTE_ORDER_MARK = BYTE_ORDER_MARK_
  * BYTE_ORDER_MARK_SWAPPED = BYTE_ORDER_MARK_SWAPPED_
  */
-  __pyx_t_1 = PyInt_FromLong(NOT_A_CHARACTER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 541; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(NOT_A_CHARACTER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NOT_A_CHARACTER, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 541; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NOT_A_CHARACTER, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":542
+  /* "Recode.pyx":543
  * REPLACEMENT_CHARACTER = REPLACEMENT_CHARACTER_
  * NOT_A_CHARACTER = NOT_A_CHARACTER_
  * BYTE_ORDER_MARK = BYTE_ORDER_MARK_             # <<<<<<<<<<<<<<
  * BYTE_ORDER_MARK_SWAPPED = BYTE_ORDER_MARK_SWAPPED_
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(BYTE_ORDER_MARK); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(BYTE_ORDER_MARK); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__BYTE_ORDER_MARK, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BYTE_ORDER_MARK, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":543
+  /* "Recode.pyx":544
  * NOT_A_CHARACTER = NOT_A_CHARACTER_
  * BYTE_ORDER_MARK = BYTE_ORDER_MARK_
  * BYTE_ORDER_MARK_SWAPPED = BYTE_ORDER_MARK_SWAPPED_             # <<<<<<<<<<<<<<
  * 
  * AUTO_ABORT_FLAG = RECODE_AUTO_ABORT_FLAG
  */
-  __pyx_t_1 = PyInt_FromLong(BYTE_ORDER_MARK_SWAPPED); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(BYTE_ORDER_MARK_SWAPPED); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s_12, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BYTE_ORDER_MARK_SWAPPED, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":545
+  /* "Recode.pyx":546
  * BYTE_ORDER_MARK_SWAPPED = BYTE_ORDER_MARK_SWAPPED_
  * 
  * AUTO_ABORT_FLAG = RECODE_AUTO_ABORT_FLAG             # <<<<<<<<<<<<<<
  * NO_ICONV_FLAG = RECODE_NO_ICONV_FLAG
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_AUTO_ABORT_FLAG); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(RECODE_AUTO_ABORT_FLAG); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__AUTO_ABORT_FLAG, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_AUTO_ABORT_FLAG, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":546
+  /* "Recode.pyx":547
  * 
  * AUTO_ABORT_FLAG = RECODE_AUTO_ABORT_FLAG
  * NO_ICONV_FLAG = RECODE_NO_ICONV_FLAG             # <<<<<<<<<<<<<<
  * 
  * ## Recode library at OUTER level.
  */
-  __pyx_t_1 = PyInt_FromLong(RECODE_NO_ICONV_FLAG); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_From_int(RECODE_NO_ICONV_FLAG); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__NO_ICONV_FLAG, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NO_ICONV_FLAG, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "Recode.pyx":553
- *     cdef RECODE_OUTER outer
- * 
- *     def __init__(self, auto_abort=False, iconv=False, strict=False):             # <<<<<<<<<<<<<<
- *         cdef int flags
- *         cdef RECODE_SINGLE single
- */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_1 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_2 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_3 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-
-  /* "Recode.pyx":597
+  /* "Recode.pyx":598
  *         return list
  * 
  *     def concise_charset(self, format=NO_FORMAT):             # <<<<<<<<<<<<<<
  *         ok = list_concise_charset(self.outer, NULL, format)
  *         if not ok:
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s__NO_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_NO_FORMAT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_4 = __pyx_t_1;
+  __pyx_k_ = __pyx_t_1;
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "Recode.pyx":1
- * # Python interface to the Recode C library, for testing.             # <<<<<<<<<<<<<<
+ * # -*- coding: utf-8 -*-             # <<<<<<<<<<<<<<
+ * # Python interface to the Recode C library, for testing.
  * # Copyright  1996-2000, 2008 Free Software Foundation, Inc.
- * # Franois Pinard <pinard@iro.umontreal.ca>, 1988.
  */
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /*--- Wrapped vars code ---*/
+
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   if (__pyx_m) {
-    __Pyx_AddTraceback("init Recode", __pyx_clineno, __pyx_lineno, __pyx_filename);
+    if (__pyx_d) {
+      __Pyx_AddTraceback("init Recode", __pyx_clineno, __pyx_lineno, __pyx_filename);
+    }
     Py_DECREF(__pyx_m); __pyx_m = 0;
   } else if (!PyErr_Occurred()) {
     PyErr_SetString(PyExc_ImportError, "init Recode");
@@ -3745,7 +3984,7 @@ PyMODINIT_FUNC PyInit_Recode(void)
   #endif
 }
 
-/* Runtime support code */
+/* --- Runtime support code --- */
 #if CYTHON_REFNANNY
 static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
     PyObject *m = NULL, *p = NULL;
@@ -3760,7 +3999,7 @@ end:
     Py_XDECREF(m);
     return (__Pyx_RefNannyAPIStruct *)r;
 }
-#endif /* CYTHON_REFNANNY */
+#endif
 
 static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
     PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
@@ -3769,7 +4008,7 @@ static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
 #if PY_MAJOR_VERSION >= 3
             "name '%U' is not defined", name);
 #else
-            "name '%s' is not defined", PyString_AS_STRING(name));
+            "name '%.200s' is not defined", PyString_AS_STRING(name));
 #endif
     }
     return result;
@@ -3874,12 +4113,12 @@ arg_passed_twice:
     goto bad;
 invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
-        "%s() keywords must be strings", function_name);
+        "%.200s() keywords must be strings", function_name);
     goto bad;
 invalid_keyword:
     PyErr_Format(PyExc_TypeError,
     #if PY_MAJOR_VERSION < 3
-        "%s() got an unexpected keyword argument '%s'",
+        "%.200s() got an unexpected keyword argument '%.200s'",
         function_name, PyString_AsString(key));
     #else
         "%s() got an unexpected keyword argument '%U'",
@@ -3909,7 +4148,7 @@ static void __Pyx_RaiseArgtupleInvalid(
         more_or_less = "exactly";
     }
     PyErr_Format(PyExc_TypeError,
-                 "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                  func_name, more_or_less, num_expected,
                  (num_expected == 1) ? "" : "s", num_found);
 }
@@ -3918,7 +4157,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
     PyObject *result;
 #if CYTHON_COMPILING_IN_CPYTHON
     result = PyDict_GetItem(__pyx_d, name);
-    if (result) {
+    if (likely(result)) {
         Py_INCREF(result);
     } else {
 #else
@@ -3980,11 +4219,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
             goto raise_error;
         }
     }
-    #if PY_VERSION_HEX < 0x02050000
-    if (PyClass_Check(type)) {
-    #else
     if (PyType_Check(type)) {
-    #endif
 #if CYTHON_COMPILING_IN_PYPY
         if (!value) {
             Py_INCREF(Py_None);
@@ -3999,17 +4234,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
             goto raise_error;
         }
         value = type;
-        #if PY_VERSION_HEX < 0x02050000
-        if (PyInstance_Check(type)) {
-            type = (PyObject*) ((PyInstanceObject*)type)->in_class;
-            Py_INCREF(type);
-        } else {
-            type = 0;
-            PyErr_SetString(PyExc_TypeError,
-                "raise: exception must be an old-style class or instance");
-            goto raise_error;
-        }
-        #else
         type = (PyObject*) Py_TYPE(type);
         Py_INCREF(type);
         if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
@@ -4017,7 +4241,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
                 "raise: exception class must be a subclass of BaseException");
             goto raise_error;
         }
-        #endif
     }
     __Pyx_ErrRestore(type, value, tb);
     return;
@@ -4027,7 +4250,7 @@ raise_error:
     Py_XDECREF(tb);
     return;
 }
-#else /* Python 3+ */
+#else
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
     PyObject* owned_instance = NULL;
     if (tb == Py_None) {
@@ -4048,27 +4271,43 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
         value = type;
         type = (PyObject*) Py_TYPE(value);
     } else if (PyExceptionClass_Check(type)) {
-        PyObject *args;
-        if (!value)
-            args = PyTuple_New(0);
-        else if (PyTuple_Check(value)) {
-            Py_INCREF(value);
-            args = value;
-        } else
-            args = PyTuple_Pack(1, value);
-        if (!args)
-            goto bad;
-        owned_instance = PyEval_CallObject(type, args);
-        Py_DECREF(args);
-        if (!owned_instance)
-            goto bad;
-        value = owned_instance;
-        if (!PyExceptionInstance_Check(value)) {
-            PyErr_Format(PyExc_TypeError,
-                         "calling %R should have returned an instance of "
-                         "BaseException, not %R",
-                         type, Py_TYPE(value));
-            goto bad;
+        PyObject *instance_class = NULL;
+        if (value && PyExceptionInstance_Check(value)) {
+            instance_class = (PyObject*) Py_TYPE(value);
+            if (instance_class != type) {
+                int is_subclass = PyObject_IsSubclass(instance_class, type);
+                if (!is_subclass) {
+                    instance_class = NULL;
+                } else if (unlikely(is_subclass == -1)) {
+                    goto bad;
+                } else {
+                    type = instance_class;
+                }
+            }
+        }
+        if (!instance_class) {
+            PyObject *args;
+            if (!value)
+                args = PyTuple_New(0);
+            else if (PyTuple_Check(value)) {
+                Py_INCREF(value);
+                args = value;
+            } else
+                args = PyTuple_Pack(1, value);
+            if (!args)
+                goto bad;
+            owned_instance = PyObject_Call(type, args, NULL);
+            Py_DECREF(args);
+            if (!owned_instance)
+                goto bad;
+            value = owned_instance;
+            if (!PyExceptionInstance_Check(value)) {
+                PyErr_Format(PyExc_TypeError,
+                             "calling %R should have returned an instance of "
+                             "BaseException, not %R",
+                             type, Py_TYPE(value));
+                goto bad;
+            }
         }
     } else {
         PyErr_SetString(PyExc_TypeError,
@@ -4100,6 +4339,13 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     }
     PyErr_SetObject(type, value);
     if (tb) {
+#if CYTHON_COMPILING_IN_PYPY
+        PyObject *tmp_type, *tmp_value, *tmp_tb;
+        PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
+        Py_INCREF(tb);
+        PyErr_Restore(tmp_type, tmp_value, tb);
+        Py_XDECREF(tmp_tb);
+#else
         PyThreadState *tstate = PyThreadState_GET();
         PyObject* tmp_tb = tstate->curexc_traceback;
         if (tb != tmp_tb) {
@@ -4107,6 +4353,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             tstate->curexc_traceback = tb;
             Py_XDECREF(tmp_tb);
         }
+#endif
     }
 bad:
     Py_XDECREF(owned_instance);
@@ -4114,624 +4361,1438 @@ bad:
 }
 #endif
 
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyObject *result;
+    ternaryfunc call = func->ob_type->tp_call;
+    if (unlikely(!call))
+        return PyObject_Call(func, arg, kw);
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+        return NULL;
+    result = (*call)(func, arg, kw);
+    Py_LeaveRecursiveCall();
+    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+        PyErr_SetString(
+            PyExc_SystemError,
+            "NULL result without error in PyObject_Call");
+    }
+    return result;
+}
+#endif
+
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
+    PyObject *self, *result;
+    PyCFunction cfunc;
+    cfunc = PyCFunction_GET_FUNCTION(func);
+    self = PyCFunction_GET_SELF(func);
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+        return NULL;
+    result = cfunc(self, arg);
+    Py_LeaveRecursiveCall();
+    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+        PyErr_SetString(
+            PyExc_SystemError,
+            "NULL result without error in PyObject_Call");
+    }
+    return result;
+}
+#endif
+
+#if CYTHON_COMPILING_IN_CPYTHON
+static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+    PyObject *result;
+    PyObject *args = PyTuple_New(1);
+    if (unlikely(!args)) return NULL;
+    Py_INCREF(arg);
+    PyTuple_SET_ITEM(args, 0, arg);
+    result = __Pyx_PyObject_Call(func, args, NULL);
+    Py_DECREF(args);
+    return result;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+#ifdef __Pyx_CyFunction_USED
+    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
+#else
+    if (likely(PyCFunction_Check(func))) {
+#endif
+        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
+            return __Pyx_PyObject_CallMethO(func, arg);
+        }
+    }
+    return __Pyx__PyObject_CallOneArg(func, arg);
+}
+#else
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+    PyObject *result;
+    PyObject *args = PyTuple_Pack(1, arg);
+    if (unlikely(!args)) return NULL;
+    result = __Pyx_PyObject_Call(func, args, NULL);
+    Py_DECREF(args);
+    return result;
+}
+#endif
+
+static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) {
+    PyErr_Format(PyExc_TypeError,
+        "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)",
+        name, type->tp_name, Py_TYPE(obj)->tp_name);
+}
+static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact)
 {
-    if (!type) {
-        PyErr_Format(PyExc_SystemError, "Missing type object");
+    if (unlikely(!type)) {
+        PyErr_SetString(PyExc_SystemError, "Missing type object");
         return 0;
     }
     if (none_allowed && obj == Py_None) return 1;
     else if (exact) {
-        if (Py_TYPE(obj) == type) return 1;
+        if (likely(Py_TYPE(obj) == type)) return 1;
+        #if PY_MAJOR_VERSION == 2
+        else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1;
+        #endif
     }
     else {
-        if (PyObject_TypeCheck(obj, type)) return 1;
+        if (likely(PyObject_TypeCheck(obj, type))) return 1;
     }
-    PyErr_Format(PyExc_TypeError,
-        "Argument '%s' has incorrect type (expected %s, got %s)",
-        name, type->tp_name, Py_TYPE(obj)->tp_name);
+    __Pyx_RaiseArgumentTypeInvalid(name, obj, type);
     return 0;
 }
 
-static PyObject *__Pyx_FindPy2Metaclass(PyObject *bases) {
-    PyObject *metaclass;
+static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases) {
+    Py_ssize_t i, nbases = PyTuple_GET_SIZE(bases);
+    for (i=0; i < nbases; i++) {
+        PyTypeObject *tmptype;
+        PyObject *tmp = PyTuple_GET_ITEM(bases, i);
+        tmptype = Py_TYPE(tmp);
 #if PY_MAJOR_VERSION < 3
-    if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
-        PyObject *base = PyTuple_GET_ITEM(bases, 0);
-        metaclass = __Pyx_PyObject_GetAttrStr(base, __pyx_n_s____class__);
+        if (tmptype == &PyClass_Type)
+            continue;
+#endif
         if (!metaclass) {
-            PyErr_Clear();
-            metaclass = (PyObject*) Py_TYPE(base);
+            metaclass = tmptype;
+            continue;
         }
-    } else {
-        metaclass = (PyObject *) &PyClass_Type;
+        if (PyType_IsSubtype(metaclass, tmptype))
+            continue;
+        if (PyType_IsSubtype(tmptype, metaclass)) {
+            metaclass = tmptype;
+            continue;
+        }
+        PyErr_SetString(PyExc_TypeError,
+                        "metaclass conflict: "
+                        "the metaclass of a derived class "
+                        "must be a (non-strict) subclass "
+                        "of the metaclasses of all its bases");
+        return NULL;
     }
+    if (!metaclass) {
+#if PY_MAJOR_VERSION < 3
+        metaclass = &PyClass_Type;
 #else
-    if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
-        PyObject *base = PyTuple_GET_ITEM(bases, 0);
-        metaclass = (PyObject*) Py_TYPE(base);
-    } else {
-        metaclass = (PyObject *) &PyType_Type;
-    }
+        metaclass = &PyType_Type;
 #endif
-    Py_INCREF(metaclass);
-    return metaclass;
-}
-
-static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name,
-                                   PyObject *qualname, PyObject *modname) {
-    PyObject *result;
-    PyObject *metaclass;
-    if (PyDict_SetItem(dict, __pyx_n_s____module__, modname) < 0)
-        return NULL;
-    if (PyDict_SetItem(dict, __pyx_n_s____qualname__, qualname) < 0)
-        return NULL;
-    metaclass = PyDict_GetItem(dict, __pyx_n_s____metaclass__);
-    if (metaclass) {
-        Py_INCREF(metaclass);
-    } else {
-        metaclass = __Pyx_FindPy2Metaclass(bases);
     }
-    result = PyObject_CallFunctionObjArgs(metaclass, name, bases, dict, NULL);
-    Py_DECREF(metaclass);
-    return result;
+    Py_INCREF((PyObject*) metaclass);
+    return (PyObject*) metaclass;
 }
 
-static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
-    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(unsigned char) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(unsigned char)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to unsigned char" :
-                    "value too large to convert to unsigned char");
+static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name,
+                                           PyObject *qualname, PyObject *mkw, PyObject *modname, PyObject *doc) {
+    PyObject *ns;
+    if (metaclass) {
+        PyObject *prep = __Pyx_PyObject_GetAttrStr(metaclass, __pyx_n_s_prepare);
+        if (prep) {
+            PyObject *pargs = PyTuple_Pack(2, name, bases);
+            if (unlikely(!pargs)) {
+                Py_DECREF(prep);
+                return NULL;
             }
-            return (unsigned char)-1;
+            ns = PyObject_Call(prep, pargs, mkw);
+            Py_DECREF(prep);
+            Py_DECREF(pargs);
+        } else {
+            if (unlikely(!PyErr_ExceptionMatches(PyExc_AttributeError)))
+                return NULL;
+            PyErr_Clear();
+            ns = PyDict_New();
         }
-        return (unsigned char)val;
+    } else {
+        ns = PyDict_New();
     }
-    return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);
+    if (unlikely(!ns))
+        return NULL;
+    if (unlikely(PyObject_SetItem(ns, __pyx_n_s_module, modname) < 0)) goto bad;
+    if (unlikely(PyObject_SetItem(ns, __pyx_n_s_qualname, qualname) < 0)) goto bad;
+    if (unlikely(doc && PyObject_SetItem(ns, __pyx_n_s_doc, doc) < 0)) goto bad;
+    return ns;
+bad:
+    Py_DECREF(ns);
+    return NULL;
 }
-
-static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
-    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(unsigned short) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(unsigned short)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to unsigned short" :
-                    "value too large to convert to unsigned short");
-            }
-            return (unsigned short)-1;
+static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases,
+                                      PyObject *dict, PyObject *mkw,
+                                      int calculate_metaclass, int allow_py2_metaclass) {
+    PyObject *result, *margs;
+    PyObject *owned_metaclass = NULL;
+    if (allow_py2_metaclass) {
+        owned_metaclass = PyObject_GetItem(dict, __pyx_n_s_metaclass);
+        if (owned_metaclass) {
+            metaclass = owned_metaclass;
+        } else if (likely(PyErr_ExceptionMatches(PyExc_KeyError))) {
+            PyErr_Clear();
+        } else {
+            return NULL;
         }
-        return (unsigned short)val;
     }
-    return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);
-}
-
-static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
-    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(unsigned int) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(unsigned int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to unsigned int" :
-                    "value too large to convert to unsigned int");
-            }
-            return (unsigned int)-1;
-        }
-        return (unsigned int)val;
+    if (calculate_metaclass && (!metaclass || PyType_Check(metaclass))) {
+        metaclass = __Pyx_CalculateMetaclass((PyTypeObject*) metaclass, bases);
+        Py_XDECREF(owned_metaclass);
+        if (unlikely(!metaclass))
+            return NULL;
+        owned_metaclass = metaclass;
     }
-    return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);
-}
-
-static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
-    const char neg_one = (char)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(char) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(char)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to char" :
-                    "value too large to convert to char");
-            }
-            return (char)-1;
-        }
-        return (char)val;
+    margs = PyTuple_Pack(3, name, bases, dict);
+    if (unlikely(!margs)) {
+        result = NULL;
+    } else {
+        result = PyObject_Call(metaclass, margs, mkw);
+        Py_DECREF(margs);
     }
-    return (char)__Pyx_PyInt_AsLong(x);
+    Py_XDECREF(owned_metaclass);
+    return result;
 }
 
-static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
-    const short neg_one = (short)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(short) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(short)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to short" :
-                    "value too large to convert to short");
-            }
-            return (short)-1;
-        }
-        return (short)val;
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
+    int start = 0, mid = 0, end = count - 1;
+    if (end >= 0 && code_line > entries[end].code_line) {
+        return count;
     }
-    return (short)__Pyx_PyInt_AsLong(x);
-}
-
-static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
-    const int neg_one = (int)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(int) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to int" :
-                    "value too large to convert to int");
-            }
-            return (int)-1;
-        }
-        return (int)val;
+    while (start < end) {
+        mid = start + (end - start) / 2;
+        if (code_line < entries[mid].code_line) {
+            end = mid;
+        } else if (code_line > entries[mid].code_line) {
+             start = mid + 1;
+        } else {
+            return mid;
+        }
+    }
+    if (code_line <= entries[mid].code_line) {
+        return mid;
+    } else {
+        return mid + 1;
+    }
+}
+static PyCodeObject *__pyx_find_code_object(int code_line) {
+    PyCodeObject* code_object;
+    int pos;
+    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
+        return NULL;
+    }
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
+        return NULL;
+    }
+    code_object = __pyx_code_cache.entries[pos].code_object;
+    Py_INCREF(code_object);
+    return code_object;
+}
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
+    int pos, i;
+    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
+    if (unlikely(!code_line)) {
+        return;
+    }
+    if (unlikely(!entries)) {
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (likely(entries)) {
+            __pyx_code_cache.entries = entries;
+            __pyx_code_cache.max_count = 64;
+            __pyx_code_cache.count = 1;
+            entries[0].code_line = code_line;
+            entries[0].code_object = code_object;
+            Py_INCREF(code_object);
+        }
+        return;
+    }
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
+        PyCodeObject* tmp = entries[pos].code_object;
+        entries[pos].code_object = code_object;
+        Py_DECREF(tmp);
+        return;
+    }
+    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
+        int new_max = __pyx_code_cache.max_count + 64;
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
+            __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (unlikely(!entries)) {
+            return;
+        }
+        __pyx_code_cache.entries = entries;
+        __pyx_code_cache.max_count = new_max;
+    }
+    for (i=__pyx_code_cache.count; i>pos; i--) {
+        entries[i] = entries[i-1];
     }
-    return (int)__Pyx_PyInt_AsLong(x);
+    entries[pos].code_line = code_line;
+    entries[pos].code_object = code_object;
+    __pyx_code_cache.count++;
+    Py_INCREF(code_object);
 }
 
-static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
-    const signed char neg_one = (signed char)-1, const_zero = 0;
+#include "compile.h"
+#include "frameobject.h"
+#include "traceback.h"
+static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
+            const char *funcname, int c_line,
+            int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
+    PyObject *py_srcfile = 0;
+    PyObject *py_funcname = 0;
+    #if PY_MAJOR_VERSION < 3
+    py_srcfile = PyString_FromString(filename);
+    #else
+    py_srcfile = PyUnicode_FromString(filename);
+    #endif
+    if (!py_srcfile) goto bad;
+    if (c_line) {
+        #if PY_MAJOR_VERSION < 3
+        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        #else
+        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        #endif
+    }
+    else {
+        #if PY_MAJOR_VERSION < 3
+        py_funcname = PyString_FromString(funcname);
+        #else
+        py_funcname = PyUnicode_FromString(funcname);
+        #endif
+    }
+    if (!py_funcname) goto bad;
+    py_code = __Pyx_PyCode_New(
+        0,
+        0,
+        0,
+        0,
+        0,
+        __pyx_empty_bytes, /*PyObject *code,*/
+        __pyx_empty_tuple, /*PyObject *consts,*/
+        __pyx_empty_tuple, /*PyObject *names,*/
+        __pyx_empty_tuple, /*PyObject *varnames,*/
+        __pyx_empty_tuple, /*PyObject *freevars,*/
+        __pyx_empty_tuple, /*PyObject *cellvars,*/
+        py_srcfile,   /*PyObject *filename,*/
+        py_funcname,  /*PyObject *name,*/
+        py_line,
+        __pyx_empty_bytes  /*PyObject *lnotab*/
+    );
+    Py_DECREF(py_srcfile);
+    Py_DECREF(py_funcname);
+    return py_code;
+bad:
+    Py_XDECREF(py_srcfile);
+    Py_XDECREF(py_funcname);
+    return NULL;
+}
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
+    PyFrameObject *py_frame = 0;
+    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
+    if (!py_code) {
+        py_code = __Pyx_CreateCodeObjectForTraceback(
+            funcname, c_line, py_line, filename);
+        if (!py_code) goto bad;
+        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
+    }
+    py_frame = PyFrame_New(
+        PyThreadState_GET(), /*PyThreadState *tstate,*/
+        py_code,             /*PyCodeObject *code,*/
+        __pyx_d,      /*PyObject *globals,*/
+        0                    /*PyObject *locals*/
+    );
+    if (!py_frame) goto bad;
+    py_frame->f_lineno = py_line;
+    PyTraceBack_Here(py_frame);
+bad:
+    Py_XDECREF(py_code);
+    Py_XDECREF(py_frame);
+}
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_symbol_type(enum recode_symbol_type value) {
+    const enum recode_symbol_type neg_one = (enum recode_symbol_type) -1, const_zero = (enum recode_symbol_type) 0;
     const int is_unsigned = neg_one > const_zero;
-    if (sizeof(signed char) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(signed char)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to signed char" :
-                    "value too large to convert to signed char");
-            }
-            return (signed char)-1;
+    if (is_unsigned) {
+        if (sizeof(enum recode_symbol_type) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_symbol_type) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum recode_symbol_type) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+        }
+    } else {
+        if (sizeof(enum recode_symbol_type) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_symbol_type) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
         }
-        return (signed char)val;
     }
-    return (signed char)__Pyx_PyInt_AsSignedLong(x);
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum recode_symbol_type),
+                                     little, !is_unsigned);
+    }
 }
 
-static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
-    const signed short neg_one = (signed short)-1, const_zero = 0;
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_data_type(enum recode_data_type value) {
+    const enum recode_data_type neg_one = (enum recode_data_type) -1, const_zero = (enum recode_data_type) 0;
     const int is_unsigned = neg_one > const_zero;
-    if (sizeof(signed short) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(signed short)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to signed short" :
-                    "value too large to convert to signed short");
-            }
-            return (signed short)-1;
+    if (is_unsigned) {
+        if (sizeof(enum recode_data_type) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_data_type) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum recode_data_type) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+        }
+    } else {
+        if (sizeof(enum recode_data_type) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_data_type) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
         }
-        return (signed short)val;
     }
-    return (signed short)__Pyx_PyInt_AsSignedLong(x);
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum recode_data_type),
+                                     little, !is_unsigned);
+    }
 }
 
-static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
-    const signed int neg_one = (signed int)-1, const_zero = 0;
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_size(enum recode_size value) {
+    const enum recode_size neg_one = (enum recode_size) -1, const_zero = (enum recode_size) 0;
     const int is_unsigned = neg_one > const_zero;
-    if (sizeof(signed int) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(signed int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to signed int" :
-                    "value too large to convert to signed int");
-            }
-            return (signed int)-1;
+    if (is_unsigned) {
+        if (sizeof(enum recode_size) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_size) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum recode_size) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+        }
+    } else {
+        if (sizeof(enum recode_size) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_size) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
         }
-        return (signed int)val;
     }
-    return (signed int)__Pyx_PyInt_AsSignedLong(x);
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum recode_size),
+                                     little, !is_unsigned);
+    }
 }
 
-static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) {
-    const int neg_one = (int)-1, const_zero = 0;
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_step_type(enum recode_step_type value) {
+    const enum recode_step_type neg_one = (enum recode_step_type) -1, const_zero = (enum recode_step_type) 0;
     const int is_unsigned = neg_one > const_zero;
-    if (sizeof(int) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to int" :
-                    "value too large to convert to int");
-            }
-            return (int)-1;
+    if (is_unsigned) {
+        if (sizeof(enum recode_step_type) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_step_type) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum recode_step_type) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+        }
+    } else {
+        if (sizeof(enum recode_step_type) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_step_type) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
         }
-        return (int)val;
     }
-    return (int)__Pyx_PyInt_AsLong(x);
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum recode_step_type),
+                                     little, !is_unsigned);
+    }
 }
 
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
-    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_sequence_strategy(enum recode_sequence_strategy value) {
+    const enum recode_sequence_strategy neg_one = (enum recode_sequence_strategy) -1, const_zero = (enum recode_sequence_strategy) 0;
     const int is_unsigned = neg_one > const_zero;
-#if PY_MAJOR_VERSION < 3
-    if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to unsigned long");
-            return (unsigned long)-1;
+    if (is_unsigned) {
+        if (sizeof(enum recode_sequence_strategy) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_sequence_strategy) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum recode_sequence_strategy) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
         }
-        return (unsigned long)val;
-    } else
-#endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(unsigned long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (unsigned long) ((PyLongObject*)x)->ob_digit[0];
-                }
-            }
-#endif
-#endif
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to unsigned long");
-                return (unsigned long)-1;
-            }
-            return (unsigned long)PyLong_AsUnsignedLong(x);
-        } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(unsigned long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(unsigned long) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(unsigned long) ((PyLongObject*)x)->ob_digit[0];
-                }
-            }
-#endif
-#endif
-            return (unsigned long)PyLong_AsLong(x);
+    } else {
+        if (sizeof(enum recode_sequence_strategy) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_sequence_strategy) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum recode_sequence_strategy),
+                                     little, !is_unsigned);
+    }
+}
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_swap_input(enum recode_swap_input value) {
+    const enum recode_swap_input neg_one = (enum recode_swap_input) -1, const_zero = (enum recode_swap_input) 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(enum recode_swap_input) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_swap_input) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum recode_swap_input) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
         }
     } else {
-        unsigned long val;
-        PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (unsigned long)-1;
-        val = __Pyx_PyInt_AsUnsignedLong(tmp);
-        Py_DECREF(tmp);
-        return val;
+        if (sizeof(enum recode_swap_input) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_swap_input) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum recode_swap_input),
+                                     little, !is_unsigned);
     }
 }
 
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
-    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_error(enum recode_error value) {
+    const enum recode_error neg_one = (enum recode_error) -1, const_zero = (enum recode_error) 0;
     const int is_unsigned = neg_one > const_zero;
-#if PY_MAJOR_VERSION < 3
-    if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to unsigned PY_LONG_LONG");
-            return (unsigned PY_LONG_LONG)-1;
+    if (is_unsigned) {
+        if (sizeof(enum recode_error) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_error) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum recode_error) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
         }
-        return (unsigned PY_LONG_LONG)val;
-    } else
-#endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(unsigned PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (unsigned PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
-            }
-#endif
-#endif
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to unsigned PY_LONG_LONG");
-                return (unsigned PY_LONG_LONG)-1;
-            }
-            return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);
-        } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(unsigned PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(unsigned PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(unsigned PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
-            }
-#endif
-#endif
-            return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x);
+    } else {
+        if (sizeof(enum recode_error) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_error) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum recode_error),
+                                     little, !is_unsigned);
+    }
+}
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_list_format(enum recode_list_format value) {
+    const enum recode_list_format neg_one = (enum recode_list_format) -1, const_zero = (enum recode_list_format) 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(enum recode_list_format) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_list_format) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum recode_list_format) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
         }
     } else {
-        unsigned PY_LONG_LONG val;
-        PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (unsigned PY_LONG_LONG)-1;
-        val = __Pyx_PyInt_AsUnsignedLongLong(tmp);
-        Py_DECREF(tmp);
-        return val;
+        if (sizeof(enum recode_list_format) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_list_format) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum recode_list_format),
+                                     little, !is_unsigned);
     }
 }
 
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__recode_programming_language(enum recode_programming_language value) {
+    const enum recode_programming_language neg_one = (enum recode_programming_language) -1, const_zero = (enum recode_programming_language) 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(enum recode_programming_language) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_programming_language) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum recode_programming_language) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+        }
+    } else {
+        if (sizeof(enum recode_programming_language) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum recode_programming_language) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum recode_programming_language),
+                                     little, !is_unsigned);
+    }
+}
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
+    const int neg_one = (int) -1, const_zero = (int) 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(int) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(int) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+        }
+    } else {
+        if (sizeof(int) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(int),
+                                     little, !is_unsigned);
+    }
+}
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__alias_find_type(enum alias_find_type value) {
+    const enum alias_find_type neg_one = (enum alias_find_type) -1, const_zero = (enum alias_find_type) 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(enum alias_find_type) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum alias_find_type) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(enum alias_find_type) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+        }
+    } else {
+        if (sizeof(enum alias_find_type) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum alias_find_type) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(enum alias_find_type),
+                                     little, !is_unsigned);
+    }
+}
+
+#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\
+    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
+#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\
+    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
+#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\
+    {\
+        func_type value = func_value;\
+        if (sizeof(target_type) < sizeof(func_type)) {\
+            if (unlikely(value != (func_type) (target_type) value)) {\
+                func_type zero = 0;\
+                if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\
+                    return (target_type) -1;\
+                if (is_unsigned && unlikely(value < zero))\
+                    goto raise_neg_overflow;\
+                else\
+                    goto raise_overflow;\
+            }\
+        }\
+        return (target_type) value;\
+    }
+
 #if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
+  #include "longintrepr.h"
 #endif
-#endif
-static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
-    const long neg_one = (long)-1, const_zero = 0;
+
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
+    const int neg_one = (int) -1, const_zero = (int) 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to long");
-            return (long)-1;
+        if (sizeof(int) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (int) val;
         }
-        return (long)val;
     } else
 #endif
     if (likely(PyLong_Check(x))) {
         if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (long) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (int) 0;
+                case  1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0])
+                case 2:
+                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) {
+                            return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) {
+                            return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) {
+                            return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
+                        }
+                    }
+                    break;
             }
 #endif
-#endif
+#if CYTHON_COMPILING_IN_CPYTHON
             if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to long");
-                return (long)-1;
+                goto raise_neg_overflow;
+            }
+#else
+            {
+                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+                if (unlikely(result < 0))
+                    return (int) -1;
+                if (unlikely(result == 1))
+                    goto raise_neg_overflow;
+            }
+#endif
+            if (sizeof(int) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
             }
-            return (long)PyLong_AsUnsignedLong(x);
         } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(long) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(long) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (int) 0;
+                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) digits[0])
+                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +digits[0])
+                case -2:
+                    if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
+                            return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
+                            return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
+                            return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
+                            return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
+                            return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
+                            return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
             }
 #endif
+            if (sizeof(int) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x))
+            } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x))
+            }
+        }
+        {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+            PyErr_SetString(PyExc_RuntimeError,
+                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+            int val;
+            PyObject *v = __Pyx_PyNumber_Int(x);
+ #if PY_MAJOR_VERSION < 3
+            if (likely(v) && !PyLong_Check(v)) {
+                PyObject *tmp = v;
+                v = PyNumber_Long(tmp);
+                Py_DECREF(tmp);
+            }
+ #endif
+            if (likely(v)) {
+                int one = 1; int is_little = (int)*(unsigned char *)&one;
+                unsigned char *bytes = (unsigned char *)&val;
+                int ret = _PyLong_AsByteArray((PyLongObject *)v,
+                                              bytes, sizeof(val),
+                                              is_little, !is_unsigned);
+                Py_DECREF(v);
+                if (likely(!ret))
+                    return val;
+            }
 #endif
-            return (long)PyLong_AsLong(x);
+            return (int) -1;
         }
     } else {
-        long val;
+        int val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (long)-1;
-        val = __Pyx_PyInt_AsLong(tmp);
+        if (!tmp) return (int) -1;
+        val = __Pyx_PyInt_As_int(tmp);
         Py_DECREF(tmp);
         return val;
     }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to int");
+    return (int) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to int");
+    return (int) -1;
 }
 
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
-    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;
+static CYTHON_INLINE enum recode_list_format __Pyx_PyInt_As_enum__recode_list_format(PyObject *x) {
+    const enum recode_list_format neg_one = (enum recode_list_format) -1, const_zero = (enum recode_list_format) 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to PY_LONG_LONG");
-            return (PY_LONG_LONG)-1;
+        if (sizeof(enum recode_list_format) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(enum recode_list_format, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (enum recode_list_format) val;
         }
-        return (PY_LONG_LONG)val;
     } else
 #endif
     if (likely(PyLong_Check(x))) {
         if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (enum recode_list_format) 0;
+                case  1: __PYX_VERIFY_RETURN_INT(enum recode_list_format, digit, digits[0])
+                case 2:
+                    if (8 * sizeof(enum recode_list_format) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum recode_list_format, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum recode_list_format) >= 2 * PyLong_SHIFT) {
+                            return (enum recode_list_format) (((((enum recode_list_format)digits[1]) << PyLong_SHIFT) | (enum recode_list_format)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(enum recode_list_format) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum recode_list_format, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum recode_list_format) >= 3 * PyLong_SHIFT) {
+                            return (enum recode_list_format) (((((((enum recode_list_format)digits[2]) << PyLong_SHIFT) | (enum recode_list_format)digits[1]) << PyLong_SHIFT) | (enum recode_list_format)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(enum recode_list_format) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum recode_list_format, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum recode_list_format) >= 4 * PyLong_SHIFT) {
+                            return (enum recode_list_format) (((((((((enum recode_list_format)digits[3]) << PyLong_SHIFT) | (enum recode_list_format)digits[2]) << PyLong_SHIFT) | (enum recode_list_format)digits[1]) << PyLong_SHIFT) | (enum recode_list_format)digits[0]));
+                        }
+                    }
+                    break;
             }
 #endif
-#endif
+#if CYTHON_COMPILING_IN_CPYTHON
             if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to PY_LONG_LONG");
-                return (PY_LONG_LONG)-1;
+                goto raise_neg_overflow;
+            }
+#else
+            {
+                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+                if (unlikely(result < 0))
+                    return (enum recode_list_format) -1;
+                if (unlikely(result == 1))
+                    goto raise_neg_overflow;
+            }
+#endif
+            if (sizeof(enum recode_list_format) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(enum recode_list_format, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(enum recode_list_format) <= sizeof(unsigned PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(enum recode_list_format, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
             }
-            return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);
         } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (enum recode_list_format) 0;
+                case -1: __PYX_VERIFY_RETURN_INT(enum recode_list_format, sdigit, -(sdigit) digits[0])
+                case  1: __PYX_VERIFY_RETURN_INT(enum recode_list_format,  digit, +digits[0])
+                case -2:
+                    if (8 * sizeof(enum recode_list_format) - 1 > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum recode_list_format, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum recode_list_format) - 1 > 2 * PyLong_SHIFT) {
+                            return (enum recode_list_format) (((enum recode_list_format)-1)*(((((enum recode_list_format)digits[1]) << PyLong_SHIFT) | (enum recode_list_format)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if (8 * sizeof(enum recode_list_format) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum recode_list_format, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum recode_list_format) - 1 > 2 * PyLong_SHIFT) {
+                            return (enum recode_list_format) ((((((enum recode_list_format)digits[1]) << PyLong_SHIFT) | (enum recode_list_format)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if (8 * sizeof(enum recode_list_format) - 1 > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum recode_list_format, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum recode_list_format) - 1 > 3 * PyLong_SHIFT) {
+                            return (enum recode_list_format) (((enum recode_list_format)-1)*(((((((enum recode_list_format)digits[2]) << PyLong_SHIFT) | (enum recode_list_format)digits[1]) << PyLong_SHIFT) | (enum recode_list_format)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(enum recode_list_format) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum recode_list_format, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum recode_list_format) - 1 > 3 * PyLong_SHIFT) {
+                            return (enum recode_list_format) ((((((((enum recode_list_format)digits[2]) << PyLong_SHIFT) | (enum recode_list_format)digits[1]) << PyLong_SHIFT) | (enum recode_list_format)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if (8 * sizeof(enum recode_list_format) - 1 > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum recode_list_format, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum recode_list_format) - 1 > 4 * PyLong_SHIFT) {
+                            return (enum recode_list_format) (((enum recode_list_format)-1)*(((((((((enum recode_list_format)digits[3]) << PyLong_SHIFT) | (enum recode_list_format)digits[2]) << PyLong_SHIFT) | (enum recode_list_format)digits[1]) << PyLong_SHIFT) | (enum recode_list_format)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(enum recode_list_format) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum recode_list_format, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum recode_list_format) - 1 > 4 * PyLong_SHIFT) {
+                            return (enum recode_list_format) ((((((((((enum recode_list_format)digits[3]) << PyLong_SHIFT) | (enum recode_list_format)digits[2]) << PyLong_SHIFT) | (enum recode_list_format)digits[1]) << PyLong_SHIFT) | (enum recode_list_format)digits[0])));
+                        }
+                    }
+                    break;
             }
 #endif
+            if (sizeof(enum recode_list_format) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(enum recode_list_format, long, PyLong_AsLong(x))
+            } else if (sizeof(enum recode_list_format) <= sizeof(PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(enum recode_list_format, PY_LONG_LONG, PyLong_AsLongLong(x))
+            }
+        }
+        {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+            PyErr_SetString(PyExc_RuntimeError,
+                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+            enum recode_list_format val;
+            PyObject *v = __Pyx_PyNumber_Int(x);
+ #if PY_MAJOR_VERSION < 3
+            if (likely(v) && !PyLong_Check(v)) {
+                PyObject *tmp = v;
+                v = PyNumber_Long(tmp);
+                Py_DECREF(tmp);
+            }
+ #endif
+            if (likely(v)) {
+                int one = 1; int is_little = (int)*(unsigned char *)&one;
+                unsigned char *bytes = (unsigned char *)&val;
+                int ret = _PyLong_AsByteArray((PyLongObject *)v,
+                                              bytes, sizeof(val),
+                                              is_little, !is_unsigned);
+                Py_DECREF(v);
+                if (likely(!ret))
+                    return val;
+            }
 #endif
-            return (PY_LONG_LONG)PyLong_AsLongLong(x);
+            return (enum recode_list_format) -1;
         }
     } else {
-        PY_LONG_LONG val;
+        enum recode_list_format val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (PY_LONG_LONG)-1;
-        val = __Pyx_PyInt_AsLongLong(tmp);
+        if (!tmp) return (enum recode_list_format) -1;
+        val = __Pyx_PyInt_As_enum__recode_list_format(tmp);
         Py_DECREF(tmp);
         return val;
     }
-}
-
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
-    const signed long neg_one = (signed long)-1, const_zero = 0;
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to enum recode_list_format");
+    return (enum recode_list_format) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to enum recode_list_format");
+    return (enum recode_list_format) -1;
+}
+
+static CYTHON_INLINE enum __pyx_t_6Recode_bool __Pyx_PyInt_As_enum____pyx_t_6Recode_bool(PyObject *x) {
+    const enum __pyx_t_6Recode_bool neg_one = (enum __pyx_t_6Recode_bool) -1, const_zero = (enum __pyx_t_6Recode_bool) 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to signed long");
-            return (signed long)-1;
+        if (sizeof(enum __pyx_t_6Recode_bool) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (enum __pyx_t_6Recode_bool) val;
         }
-        return (signed long)val;
     } else
 #endif
     if (likely(PyLong_Check(x))) {
         if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(signed long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (signed long) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (enum __pyx_t_6Recode_bool) 0;
+                case  1: __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, digit, digits[0])
+                case 2:
+                    if (8 * sizeof(enum __pyx_t_6Recode_bool) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum __pyx_t_6Recode_bool) >= 2 * PyLong_SHIFT) {
+                            return (enum __pyx_t_6Recode_bool) (((((enum __pyx_t_6Recode_bool)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(enum __pyx_t_6Recode_bool) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum __pyx_t_6Recode_bool) >= 3 * PyLong_SHIFT) {
+                            return (enum __pyx_t_6Recode_bool) (((((((enum __pyx_t_6Recode_bool)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(enum __pyx_t_6Recode_bool) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum __pyx_t_6Recode_bool) >= 4 * PyLong_SHIFT) {
+                            return (enum __pyx_t_6Recode_bool) (((((((((enum __pyx_t_6Recode_bool)digits[3]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[0]));
+                        }
+                    }
+                    break;
             }
 #endif
-#endif
+#if CYTHON_COMPILING_IN_CPYTHON
             if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to signed long");
-                return (signed long)-1;
+                goto raise_neg_overflow;
+            }
+#else
+            {
+                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+                if (unlikely(result < 0))
+                    return (enum __pyx_t_6Recode_bool) -1;
+                if (unlikely(result == 1))
+                    goto raise_neg_overflow;
+            }
+#endif
+            if (sizeof(enum __pyx_t_6Recode_bool) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(enum __pyx_t_6Recode_bool, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(enum __pyx_t_6Recode_bool) <= sizeof(unsigned PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(enum __pyx_t_6Recode_bool, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
             }
-            return (signed long)PyLong_AsUnsignedLong(x);
         } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(signed long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(signed long) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(signed long) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (enum __pyx_t_6Recode_bool) 0;
+                case -1: __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, sdigit, -(sdigit) digits[0])
+                case  1: __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool,  digit, +digits[0])
+                case -2:
+                    if (8 * sizeof(enum __pyx_t_6Recode_bool) - 1 > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum __pyx_t_6Recode_bool) - 1 > 2 * PyLong_SHIFT) {
+                            return (enum __pyx_t_6Recode_bool) (((enum __pyx_t_6Recode_bool)-1)*(((((enum __pyx_t_6Recode_bool)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if (8 * sizeof(enum __pyx_t_6Recode_bool) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum __pyx_t_6Recode_bool) - 1 > 2 * PyLong_SHIFT) {
+                            return (enum __pyx_t_6Recode_bool) ((((((enum __pyx_t_6Recode_bool)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if (8 * sizeof(enum __pyx_t_6Recode_bool) - 1 > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum __pyx_t_6Recode_bool) - 1 > 3 * PyLong_SHIFT) {
+                            return (enum __pyx_t_6Recode_bool) (((enum __pyx_t_6Recode_bool)-1)*(((((((enum __pyx_t_6Recode_bool)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(enum __pyx_t_6Recode_bool) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum __pyx_t_6Recode_bool) - 1 > 3 * PyLong_SHIFT) {
+                            return (enum __pyx_t_6Recode_bool) ((((((((enum __pyx_t_6Recode_bool)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if (8 * sizeof(enum __pyx_t_6Recode_bool) - 1 > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum __pyx_t_6Recode_bool) - 1 > 4 * PyLong_SHIFT) {
+                            return (enum __pyx_t_6Recode_bool) (((enum __pyx_t_6Recode_bool)-1)*(((((((((enum __pyx_t_6Recode_bool)digits[3]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(enum __pyx_t_6Recode_bool) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_6Recode_bool, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(enum __pyx_t_6Recode_bool) - 1 > 4 * PyLong_SHIFT) {
+                            return (enum __pyx_t_6Recode_bool) ((((((((((enum __pyx_t_6Recode_bool)digits[3]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_6Recode_bool)digits[0])));
+                        }
+                    }
+                    break;
             }
 #endif
+            if (sizeof(enum __pyx_t_6Recode_bool) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(enum __pyx_t_6Recode_bool, long, PyLong_AsLong(x))
+            } else if (sizeof(enum __pyx_t_6Recode_bool) <= sizeof(PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(enum __pyx_t_6Recode_bool, PY_LONG_LONG, PyLong_AsLongLong(x))
+            }
+        }
+        {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+            PyErr_SetString(PyExc_RuntimeError,
+                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+            enum __pyx_t_6Recode_bool val;
+            PyObject *v = __Pyx_PyNumber_Int(x);
+ #if PY_MAJOR_VERSION < 3
+            if (likely(v) && !PyLong_Check(v)) {
+                PyObject *tmp = v;
+                v = PyNumber_Long(tmp);
+                Py_DECREF(tmp);
+            }
+ #endif
+            if (likely(v)) {
+                int one = 1; int is_little = (int)*(unsigned char *)&one;
+                unsigned char *bytes = (unsigned char *)&val;
+                int ret = _PyLong_AsByteArray((PyLongObject *)v,
+                                              bytes, sizeof(val),
+                                              is_little, !is_unsigned);
+                Py_DECREF(v);
+                if (likely(!ret))
+                    return val;
+            }
 #endif
-            return (signed long)PyLong_AsLong(x);
+            return (enum __pyx_t_6Recode_bool) -1;
         }
     } else {
-        signed long val;
+        enum __pyx_t_6Recode_bool val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (signed long)-1;
-        val = __Pyx_PyInt_AsSignedLong(tmp);
+        if (!tmp) return (enum __pyx_t_6Recode_bool) -1;
+        val = __Pyx_PyInt_As_enum____pyx_t_6Recode_bool(tmp);
         Py_DECREF(tmp);
         return val;
     }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to enum __pyx_t_6Recode_bool");
+    return (enum __pyx_t_6Recode_bool) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to enum __pyx_t_6Recode_bool");
+    return (enum __pyx_t_6Recode_bool) -1;
 }
 
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
-    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
+    const long neg_one = (long) -1, const_zero = (long) 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(long) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(long) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+        }
+    } else {
+        if (sizeof(long) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(long),
+                                     little, !is_unsigned);
+    }
+}
+
+static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
+    const long neg_one = (long) -1, const_zero = (long) 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to signed PY_LONG_LONG");
-            return (signed PY_LONG_LONG)-1;
+        if (sizeof(long) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (long) val;
         }
-        return (signed PY_LONG_LONG)val;
     } else
 #endif
     if (likely(PyLong_Check(x))) {
         if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(signed PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (signed PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (long) 0;
+                case  1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0])
+                case 2:
+                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) {
+                            return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) {
+                            return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) {
+                            return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
+                        }
+                    }
+                    break;
             }
 #endif
-#endif
+#if CYTHON_COMPILING_IN_CPYTHON
             if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to signed PY_LONG_LONG");
-                return (signed PY_LONG_LONG)-1;
+                goto raise_neg_overflow;
+            }
+#else
+            {
+                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+                if (unlikely(result < 0))
+                    return (long) -1;
+                if (unlikely(result == 1))
+                    goto raise_neg_overflow;
+            }
+#endif
+            if (sizeof(long) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
             }
-            return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);
         } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(signed PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(signed PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(signed PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (long) 0;
+                case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) digits[0])
+                case  1: __PYX_VERIFY_RETURN_INT(long,  digit, +digits[0])
+                case -2:
+                    if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                            return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                            return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                            return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                            return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+                            return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+                            return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
             }
 #endif
+            if (sizeof(long) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x))
+            } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x))
+            }
+        }
+        {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+            PyErr_SetString(PyExc_RuntimeError,
+                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+            long val;
+            PyObject *v = __Pyx_PyNumber_Int(x);
+ #if PY_MAJOR_VERSION < 3
+            if (likely(v) && !PyLong_Check(v)) {
+                PyObject *tmp = v;
+                v = PyNumber_Long(tmp);
+                Py_DECREF(tmp);
+            }
+ #endif
+            if (likely(v)) {
+                int one = 1; int is_little = (int)*(unsigned char *)&one;
+                unsigned char *bytes = (unsigned char *)&val;
+                int ret = _PyLong_AsByteArray((PyLongObject *)v,
+                                              bytes, sizeof(val),
+                                              is_little, !is_unsigned);
+                Py_DECREF(v);
+                if (likely(!ret))
+                    return val;
+            }
 #endif
-            return (signed PY_LONG_LONG)PyLong_AsLongLong(x);
+            return (long) -1;
         }
     } else {
-        signed PY_LONG_LONG val;
+        long val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (signed PY_LONG_LONG)-1;
-        val = __Pyx_PyInt_AsSignedLongLong(tmp);
+        if (!tmp) return (long) -1;
+        val = __Pyx_PyInt_As_long(tmp);
         Py_DECREF(tmp);
         return val;
     }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to long");
+    return (long) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to long");
+    return (long) -1;
 }
 
 static int __Pyx_check_binary_version(void) {
@@ -4744,177 +5805,11 @@ static int __Pyx_check_binary_version(void) {
                       "compiletime version %s of module '%.100s' "
                       "does not match runtime version %s",
                       ctversion, __Pyx_MODULE_NAME, rtversion);
-        #if PY_VERSION_HEX < 0x02050000
-        return PyErr_Warn(NULL, message);
-        #else
         return PyErr_WarnEx(NULL, message, 1);
-        #endif
     }
     return 0;
 }
 
-static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
-    int start = 0, mid = 0, end = count - 1;
-    if (end >= 0 && code_line > entries[end].code_line) {
-        return count;
-    }
-    while (start < end) {
-        mid = (start + end) / 2;
-        if (code_line < entries[mid].code_line) {
-            end = mid;
-        } else if (code_line > entries[mid].code_line) {
-             start = mid + 1;
-        } else {
-            return mid;
-        }
-    }
-    if (code_line <= entries[mid].code_line) {
-        return mid;
-    } else {
-        return mid + 1;
-    }
-}
-static PyCodeObject *__pyx_find_code_object(int code_line) {
-    PyCodeObject* code_object;
-    int pos;
-    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
-        return NULL;
-    }
-    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
-    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
-        return NULL;
-    }
-    code_object = __pyx_code_cache.entries[pos].code_object;
-    Py_INCREF(code_object);
-    return code_object;
-}
-static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
-    int pos, i;
-    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
-    if (unlikely(!code_line)) {
-        return;
-    }
-    if (unlikely(!entries)) {
-        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
-        if (likely(entries)) {
-            __pyx_code_cache.entries = entries;
-            __pyx_code_cache.max_count = 64;
-            __pyx_code_cache.count = 1;
-            entries[0].code_line = code_line;
-            entries[0].code_object = code_object;
-            Py_INCREF(code_object);
-        }
-        return;
-    }
-    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
-    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
-        PyCodeObject* tmp = entries[pos].code_object;
-        entries[pos].code_object = code_object;
-        Py_DECREF(tmp);
-        return;
-    }
-    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
-        int new_max = __pyx_code_cache.max_count + 64;
-        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
-            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));
-        if (unlikely(!entries)) {
-            return;
-        }
-        __pyx_code_cache.entries = entries;
-        __pyx_code_cache.max_count = new_max;
-    }
-    for (i=__pyx_code_cache.count; i>pos; i--) {
-        entries[i] = entries[i-1];
-    }
-    entries[pos].code_line = code_line;
-    entries[pos].code_object = code_object;
-    __pyx_code_cache.count++;
-    Py_INCREF(code_object);
-}
-
-#include "compile.h"
-#include "frameobject.h"
-#include "traceback.h"
-static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
-            const char *funcname, int c_line,
-            int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
-    PyObject *py_srcfile = 0;
-    PyObject *py_funcname = 0;
-    #if PY_MAJOR_VERSION < 3
-    py_srcfile = PyString_FromString(filename);
-    #else
-    py_srcfile = PyUnicode_FromString(filename);
-    #endif
-    if (!py_srcfile) goto bad;
-    if (c_line) {
-        #if PY_MAJOR_VERSION < 3
-        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
-        #else
-        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
-        #endif
-    }
-    else {
-        #if PY_MAJOR_VERSION < 3
-        py_funcname = PyString_FromString(funcname);
-        #else
-        py_funcname = PyUnicode_FromString(funcname);
-        #endif
-    }
-    if (!py_funcname) goto bad;
-    py_code = __Pyx_PyCode_New(
-        0,            /*int argcount,*/
-        0,            /*int kwonlyargcount,*/
-        0,            /*int nlocals,*/
-        0,            /*int stacksize,*/
-        0,            /*int flags,*/
-        __pyx_empty_bytes, /*PyObject *code,*/
-        __pyx_empty_tuple, /*PyObject *consts,*/
-        __pyx_empty_tuple, /*PyObject *names,*/
-        __pyx_empty_tuple, /*PyObject *varnames,*/
-        __pyx_empty_tuple, /*PyObject *freevars,*/
-        __pyx_empty_tuple, /*PyObject *cellvars,*/
-        py_srcfile,   /*PyObject *filename,*/
-        py_funcname,  /*PyObject *name,*/
-        py_line,      /*int firstlineno,*/
-        __pyx_empty_bytes  /*PyObject *lnotab*/
-    );
-    Py_DECREF(py_srcfile);
-    Py_DECREF(py_funcname);
-    return py_code;
-bad:
-    Py_XDECREF(py_srcfile);
-    Py_XDECREF(py_funcname);
-    return NULL;
-}
-static void __Pyx_AddTraceback(const char *funcname, int c_line,
-                               int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
-    PyObject *py_globals = 0;
-    PyFrameObject *py_frame = 0;
-    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
-    if (!py_code) {
-        py_code = __Pyx_CreateCodeObjectForTraceback(
-            funcname, c_line, py_line, filename);
-        if (!py_code) goto bad;
-        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
-    }
-    py_globals = PyModule_GetDict(__pyx_m);
-    if (!py_globals) goto bad;
-    py_frame = PyFrame_New(
-        PyThreadState_GET(), /*PyThreadState *tstate,*/
-        py_code,             /*PyCodeObject *code,*/
-        py_globals,          /*PyObject *globals,*/
-        0                    /*PyObject *locals*/
-    );
-    if (!py_frame) goto bad;
-    py_frame->f_lineno = py_line;
-    PyTraceBack_Here(py_frame);
-bad:
-    Py_XDECREF(py_code);
-    Py_XDECREF(py_frame);
-}
-
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     while (t->p) {
         #if PY_MAJOR_VERSION < 3
@@ -4925,7 +5820,7 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
         } else {
             *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
         }
-        #else  /* Python 3+ has unicode identifiers */
+        #else
         if (t->is_unicode | t->is_str) {
             if (t->intern) {
                 *t->p = PyUnicode_InternFromString(t->s);
@@ -4945,15 +5840,15 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     return 0;
 }
 
-static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char* c_str) {
-    return __Pyx_PyUnicode_FromStringAndSize(c_str, strlen(c_str));
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
+    return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str));
 }
 static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) {
     Py_ssize_t ignore;
     return __Pyx_PyObject_AsStringAndSize(o, &ignore);
 }
 static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
-#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
+#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
     if (
 #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
             __Pyx_sys_getdefaultencoding_not_ascii &&
@@ -4975,29 +5870,35 @@ static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_
                 }
             }
         }
-#endif /*__PYX_DEFAULT_STRING_ENCODING_IS_ASCII*/
+#endif
         *length = PyBytes_GET_SIZE(defenc);
         return defenc_c;
-#else /* PY_VERSION_HEX < 0x03030000 */
-        if (PyUnicode_READY(o) == -1) return NULL;
+#else
+        if (__Pyx_PyUnicode_READY(o) == -1) return NULL;
 #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
         if (PyUnicode_IS_ASCII(o)) {
-            *length = PyUnicode_GET_DATA_SIZE(o);
+            *length = PyUnicode_GET_LENGTH(o);
             return PyUnicode_AsUTF8(o);
         } else {
             PyUnicode_AsASCIIString(o);
             return NULL;
         }
-#else /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */
+#else
         return PyUnicode_AsUTF8AndSize(o, length);
-#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */
-#endif /* PY_VERSION_HEX < 0x03030000 */
+#endif
+#endif
+    } else
+#endif
+#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
+    if (PyByteArray_Check(o)) {
+        *length = PyByteArray_GET_SIZE(o);
+        return PyByteArray_AS_STRING(o);
     } else
-#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII  || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT */
+#endif
     {
         char* result;
         int r = PyBytes_AsStringAndSize(o, &result, length);
-        if (r < 0) {
+        if (unlikely(r < 0)) {
             return NULL;
         } else {
             return result;
@@ -5018,7 +5919,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
 #else
   if (PyLong_Check(x))
 #endif
-    return Py_INCREF(x), x;
+    return __Pyx_NewRef(x);
   m = Py_TYPE(x)->tp_as_number;
 #if PY_MAJOR_VERSION < 3
   if (m && m->nb_int) {
@@ -5042,7 +5943,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
     if (!PyLong_Check(res)) {
 #endif
       PyErr_Format(PyExc_TypeError,
-                   "__%s__ returned non-%s (type %.200s)",
+                   "__%.4s__ returned non-%.4s (type %.200s)",
                    name, name, Py_TYPE(res)->tp_name);
       Py_DECREF(res);
       return NULL;
@@ -5056,34 +5957,68 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
 }
 static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
   Py_ssize_t ival;
-  PyObject* x = PyNumber_Index(b);
+  PyObject *x;
+#if PY_MAJOR_VERSION < 3
+  if (likely(PyInt_CheckExact(b))) {
+    if (sizeof(Py_ssize_t) >= sizeof(long))
+        return PyInt_AS_LONG(b);
+    else
+        return PyInt_AsSsize_t(x);
+  }
+#endif
+  if (likely(PyLong_CheckExact(b))) {
+    #if CYTHON_USE_PYLONG_INTERNALS
+    const digit* digits = ((PyLongObject*)b)->ob_digit;
+    const Py_ssize_t size = Py_SIZE(b);
+    if (likely(__Pyx_sst_abs(size) <= 1)) {
+        ival = likely(size) ? digits[0] : 0;
+        if (size == -1) ival = -ival;
+        return ival;
+    } else {
+      switch (size) {
+         case 2:
+           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
+             return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case -2:
+           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
+             return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case 3:
+           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
+             return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case -3:
+           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
+             return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case 4:
+           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
+             return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case -4:
+           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
+             return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+      }
+    }
+    #endif
+    return PyLong_AsSsize_t(b);
+  }
+  x = PyNumber_Index(b);
   if (!x) return -1;
   ival = PyInt_AsSsize_t(x);
   Py_DECREF(x);
   return ival;
 }
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
-#if PY_VERSION_HEX < 0x02050000
-   if (ival <= LONG_MAX)
-       return PyInt_FromLong((long)ival);
-   else {
-       unsigned char *bytes = (unsigned char *) &ival;
-       int one = 1; int little = (int)*(unsigned char*)&one;
-       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);
-   }
-#else
-   return PyInt_FromSize_t(ival);
-#endif
-}
-static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
-   unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);
-   if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {
-       if ((val != (unsigned PY_LONG_LONG)-1) || !PyErr_Occurred())
-           PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to size_t");
-       return (size_t)-1;
-   }
-   return (size_t)val;
+    return PyInt_FromSize_t(ival);
 }
 
 
index 7c3d7ad237cf7c9453a4bd1ca4e25ea86aa9302b..114d6c858e1e4c1adb01dbe0c828a44badf8b1ee 100644 (file)
@@ -17,8 +17,11 @@ try:
 
     setup(ext_modules=[
         Extension('Recode', ['Recode.c'],
-                  include_dirs=[top_builddir, os.path.join(top_srcdir, 'src')],
-                  libraries=['recode'])
+                  include_dirs=[top_builddir, os.path.join(top_srcdir, 'src'),
+                                os.path.join(top_srcdir, 'lib')],
+                  library_dirs=[os.path.join(top_srcdir, 'src', '.libs'),
+                                os.path.join(top_srcdir, 'lib', '.libs')],
+                  libraries=['recode', 'gnu'])
         ])
 
 finally: