]> granicus.if.org Git - recode/commitdiff
Implement new_outer() flags
authorFrançois Pinard <pinard@iro.umontreal.ca>
Sat, 8 Mar 2008 23:43:25 +0000 (18:43 -0500)
committerFrançois Pinard <pinard@iro.umontreal.ca>
Sat, 8 Mar 2008 23:43:25 +0000 (18:43 -0500)
doc/ChangeLog
doc/recode.info
doc/recode.texi
src/ChangeLog
src/main.c
src/outer.c
src/recode.h
src/recodext.h
tests/ChangeLog
tests/Recode.c
tests/Recode.pyx

index b9bbc8ca77d80df1753b4cc42117d59578e7272b..c89ffc450a45b2ee9e653174873abd071eb0f0e8 100644 (file)
@@ -1,3 +1,7 @@
+2008-03-08  François Pinard  <pinard@iro.umontreal.ca>
+
+       * recode.texi: Better document iconv processing.
+
 2008-03-07  François Pinard  <pinard@iro.umontreal.ca>
 
        * tables.py: Moved to top level.
index 1e7ccf7f71260dd82101b1ce6163c6ed3ff7dc0c..cecb0550d4f57aa1c32db66402002ed1a043f4bc 100644 (file)
@@ -849,6 +849,18 @@ are not meant to accompany actual file recodings.  These options are:
 
           recode -l | grep -i greek
 
+     Within a collection of names for a single charset, the `recode'
+     library distinguishes one of them as being the genuine charset
+     name, while the others are said to be aliases.  The list normally
+     integrates all charsets from the external `iconv' library, unless
+     this is defeated through options like `--ignore=:iconv:' or `-x:'.
+     The portable `libiconv' library relates its own aliases of a same
+     charset, and for a given set of aliases, if none of them are known
+     to `recode' already, then `recode' will pick one as being the
+     genuine charset.  The `iconv' library within GNU `libc' makes all
+     aliases appear as different charsets, and each will be presented as
+     a charset by `recode', unless it is known otherwise.
+
      There might be one non-option argument, in which case it is
      interpreted as a charset name, possibly abbreviated to any non
      ambiguous prefix.  This particular usage of the `-l' option is
@@ -1467,7 +1479,7 @@ an example of a program which does not really make anything useful.
      main (int argc, char *const *argv)
      {
        program_name = argv[0];
-       RECODE_OUTER outer = recode_new_outer (true);
+       RECODE_OUTER outer = recode_new_outer (RECODE_AUTO_ABORT_FLAG);
 
        recode_delete_outer (outer);
        exit (0);
@@ -1524,7 +1536,7 @@ like:
      main (int argc, char *const *argv)
      {
        program_name = argv[0];
-       RECODE_OUTER outer = recode_new_outer (true);
+       RECODE_OUTER outer = recode_new_outer (RECODE_AUTO_ABORT_FLAG);
 
        recode_term_outer (outer);
        exit (EXIT_SUCCESS);
@@ -1534,28 +1546,43 @@ but we will not insist on such details in the examples to come.
 
    * Initialisation functions 
 
-          RECODE_OUTER recode_new_outer (AUTO_ABORT);
+          RECODE_OUTER recode_new_outer (FLAGS);
           bool recode_delete_outer (OUTER);
 
      The recoding library absolutely needs to be initialised before
      being used, and `recode_new_outer' has to be called once, first.
      Besides the OUTER it is meant to initialise, the function accepts
-     a Boolean argument whether or not the library should automatically
-     issue diagnostics on standard and abort the whole program on
-     errors.  When AUTO_ABORT is `true', the library later conveniently
-     issues diagnostics itself, and aborts the calling program on
-     errors.  This is merely a convenience, because if this parameter
-     was `false', the calling program should always take care of
-     checking the return value of all other calls to the recoding
-     library functions, and when any error is detected, issue a
-     diagnostic and abort processing itself.
-
-     Regardless of the setting of AUTO_ABORT, all recoding library
-     functions return a success status.  Most functions are geared for
-     returning `false' for an error, and `true' if everything went fine.
-     Functions returning structures or strings return `NULL' instead of
-     the result, when the result cannot be produced.  If AUTO_ABORT is
-     selected, functions either return `true', or do not return at all.
+     an integer value holding zero or more flags.  If no flags, use
+     `0'.  If more than one flag, they should be combined with the
+     bitwise-or (`|') operator.  The possible flags are:
+
+    `RECODE_AUTO_ABORT_FLAG'
+          When this flag is set, the library later issues diagnostics
+          itself, and aborts the calling program on errors.  This is
+          merely a convenience, because if this flag was not given, the
+          calling program should always take care of checking the
+          return value of all other calls to the recoding library
+          functions, and when any error is detected, issue a diagnostic
+          and abort processing itself.
+
+    `RECODE_NO_ICONV_FLAG'
+          When this flag is set, the library does not initialize nor
+          use the external `iconv' library.  This means that the
+          charsets and aliases provided by the `iconv' external library
+          and not by `recode' itself are not available.
+
+
+     In previous incatations of the `recode' library, FLAGS was a
+     Boolean instead of a collection of flags, meant to set
+     `RECODE_AUTO_ABORT_FLAG'.  This still works, but is deprecated.
+
+     Regardless of the setting of `RECODE_AUTO_ABORT', all recoding
+     library functions return a success status.  Most functions are
+     geared for returning `false' for an error, and `true' if
+     everything went fine.  Functions returning structures or strings
+     return `NULL' instead of the result, when the result cannot be
+     produced.  If RECODE_AUTO_ABORT is selected, functions either
+     return `true', or do not return at all.
 
      As in the example above, `recode_new_outer' is called only once in
      most cases.  Calling `recode_new_outer' implies some overhead, so
@@ -2549,10 +2576,10 @@ the issues related to this duplication, and other peculiarities
 specific to the `iconv' library.
 
    As implemented, if a recoding request can be satisfied by the
-`recode' library both with and without using the `iconv' library, it is
-likely that the external `iconv' library will be used.  To sort out if
-the `iconv' is indeed used or not, just use the `-v' or `--verbose'
-option, *note Recoding::.
+`recode' library both with and without using the `iconv' library, the
+external `iconv' library might be used.  To sort out if the `iconv' is
+indeed used or not, just use the `-v' or `--verbose' option, *note
+Recoding::, and check if `:iconv:' appears as an intermediate charset.
 
    The `:iconv:' charset represents a conceptual pivot charset within
 the external `iconv' library (in fact, this pivot exists, but is not
@@ -2570,38 +2597,35 @@ these two calls:
      recode -x: l1..1250 < INPUT > OUTPUT
 
 Both should transform INPUT from `ISO-8859-1' to `CP1250' on OUTPUT.
-The first call uses the external `iconv' library, while the second call
-avoids it.  Whatever the path used, the results should normally be
-identical.  However, there might be observable differences.  Most of
-them might result from reversibility issues, as the external `iconv'
-engine does not necessarily address reversibility.  Even if much less
-likely, some differences might result from slight errors in the tables
-used, such differences should then be reported as bugs.
-
-   Other irregularities might be seen in the area of error detection and
+The first call might use the external `iconv' library, while the second
+call surely avoids it.  Whatever the path used, the results should
+normally be identical.  However, there might be observable differences.
+Most of them might result from reversibility issues, as the external
+`iconv' engine does not likely address reversibility in the same way.
+Even if much less likely, some differences might result from slight
+errors in the tables used, such differences should then be reported as
+bugs.
+
+   Discrepancies might be seen in the area of error detection and
 recovery.  The `recode' library usually tries to detect canonicity
 errors in input, and production of ambiguous output, but the external
-`iconv' library does not necessarily.  Input is usually validated,
-however.  The `recode' library may not always react properly when the
+`iconv' library does not necessarily do it the same way.  Moreover, the
+`recode' library may not always recover as nicely as possible when the
 external `iconv' has no translation for a given character.
 
-   Within a collection of names for a single charset, the `recode'
-library distinguishes one of them as being the genuine charset name,
-while the others are said to be aliases.  When `recode' lists all
-charsets, for example with the `-l' or `--list' option, the list
-integrates all charsets from the external `iconv' library.  The
-selection of one of the aliases as the genuine charset name is an
-artifact added by `recode', it does not necessarily come from `iconv'
-(in fact, the portable `libiconv' library distinguishes a genuine
-charset names from its aliases, while GNU `libc' does not give access
-to such information).  Moreover, the `recode' library dynamically
-resolves some conflicts when it initialises itself at runtime.
-
    The external `iconv' libraries may offer different sets of charsets
-and aliases, from one library to another, and also between successive
-versions of a single library.  Best is to check the documentation of the
-`iconv' library, as of the time Recode was installed, to know what
-charsets and aliases are offered by that library
+and aliases from one library to another, and also between successive
+versions of a single library.  Best is to check the documentation of
+the external `iconv' library, as of the time `recode' was installed, to
+know which charsets and aliases are being provided.
+
+   The `--ignore=:iconv:' or `-x:' options might be useful when there
+is a need to make a recoding more exactly repeatable between machines
+or installations, the idea being here to remove the variance possibly
+introduced by the various implementations of an external `iconv'
+library.  These options might also help deciding whether if some
+recoding problem is genuine to `recode', or is induced by the external
+`iconv' library.
 
 \1f
 File: recode.info,  Node: Tabular,  Next: ASCII misc,  Prev: iconv,  Up: Top
@@ -5042,7 +5066,7 @@ Concept Index
 * file time stamps:                      Recoding.            (line  26)
 * filter operation:                      Synopsis.            (line  27)
 * force recoding:                        Reversibility.       (line  10)
-* French description of charsets:        Listings.            (line 198)
+* French description of charsets:        Listings.            (line 210)
 * guessing charsets:                     Listings.            (line  63)
 * Haible, Bruno:                         iconv.               (line   6)
 * handling errors:                       Errors.              (line   6)
@@ -5053,7 +5077,7 @@ Concept Index
 * IBM graphics characters:               Recoding.            (line  16)
 * iconv:                                 Design.              (line  98)
 * iconv library:                         iconv.               (line   6)
-* identifying subsets in charsets:       Listings.            (line 210)
+* identifying subsets in charsets:       Listings.            (line 222)
 * ignore charsets:                       Recoding.            (line  60)
 * implied surfaces:                      Requests.            (line  70)
 * impossible conversions:                Charset overview.    (line  33)
@@ -5100,7 +5124,7 @@ Concept Index
 * partial conversion:                    Mixed.               (line  20)
 * permutations of groups of bytes:       Permutations.        (line   6)
 * pipe sequencing:                       Sequencing.          (line  40)
-* program_name variable:                 Outer level.         (line 122)
+* program_name variable:                 Outer level.         (line 137)
 * programming language support:          Listings.            (line  26)
 * pseudo-charsets:                       Charset overview.    (line  33)
 * pure charset:                          Surface overview.    (line  17)
@@ -5135,7 +5159,7 @@ Concept Index
 * strict operation:                      Reversibility.       (line  49)
 * string and comments conversion:        Mixed.               (line  39)
 * structural surfaces:                   Surfaces.            (line  36)
-* subsets in charsets:                   Listings.            (line 210)
+* subsets in charsets:                   Listings.            (line 222)
 * super-charsets:                        Mule.                (line   6)
 * supported programming languages:       Listings.            (line  26)
 * suppressing diagnostic messages:       Reversibility.       (line  37)
@@ -5186,7 +5210,7 @@ This is an alphabetical list of all command-line options accepted by
 * --colons:                              Recoding.            (line  11)
 * --copyright:                           Listings.            (line  19)
 * --diacritics:                          Mixed.               (line  20)
-* --find-subsets:                        Listings.            (line 210)
+* --find-subsets:                        Listings.            (line 222)
 * --force:                               Reversibility.       (line  10)
 * --graphics:                            Recoding.            (line  16)
 * --header:                              Listings.            (line  26)
@@ -5216,7 +5240,7 @@ This is an alphabetical list of all command-line options accepted by
 * -S:                                    Mixed.               (line  39)
 * -s:                                    Reversibility.       (line  49)
 * -t:                                    Recoding.            (line  26)
-* -T:                                    Listings.            (line 210)
+* -T:                                    Listings.            (line 222)
 * -v:                                    Recoding.            (line  35)
 * -x:                                    Recoding.            (line  60)
 
@@ -5244,8 +5268,8 @@ and variables in the `recode' library.
 * file_one_to_many:                      New charsets.        (line  71)
 * file_one_to_one:                       New charsets.        (line  59)
 * find_charset:                          Charset level.       (line  15)
-* LANG, when listing charsets:           Listings.            (line 198)
-* LANGUAGE, when listing charsets:       Listings.            (line 198)
+* LANG, when listing charsets:           Listings.            (line 210)
+* LANGUAGE, when listing charsets:       Listings.            (line 210)
 * list_all_charsets:                     Charset level.       (line  15)
 * list_concise_charset:                  Charset level.       (line  15)
 * list_full_charset:                     Charset level.       (line  15)
@@ -6049,81 +6073,81 @@ Ref: Requests-Footnote-1\7f29322
 Ref: Requests-Footnote-2\7f29389
 Ref: Requests-Footnote-3\7f29567
 Node: Listings\7f30026
-Ref: Listings-Footnote-1\7f40444
-Node: Recoding\7f40771
-Node: Reversibility\7f43596
-Ref: Reversibility-Footnote-1\7f52099
-Node: Sequencing\7f52236
-Node: Mixed\7f54682
-Node: Emacs\7f58075
-Node: Debugging\7f59054
-Node: Library\7f63318
-Node: Outer level\7f64672
-Node: Request level\7f70158
-Node: Task level\7f80627
-Node: Charset level\7f91049
-Node: Errors\7f91891
-Ref: Errors-Footnote-1\7f96745
-Ref: Errors-Footnote-2\7f96859
-Node: Universal\7f97220
-Ref: Universal-Footnote-1\7f100345
-Ref: Universal-Footnote-2\7f100413
-Node: UCS-2\7f100626
-Node: UCS-4\7f103160
-Node: UTF-7\7f103702
-Node: UTF-8\7f104299
-Node: UTF-16\7f108606
-Node: count-characters\7f109756
-Node: dump-with-names\7f110429
-Node: iconv\7f112982
-Node: Tabular\7f116653
-Node: ASCII misc\7f138916
-Node: ASCII\7f139282
-Node: ISO 8859\7f140102
-Node: ASCII-BS\7f142400
-Node: flat\7f144239
-Node: IBM and MS\7f144912
-Node: EBCDIC\7f145485
-Node: IBM-PC\7f147599
-Ref: IBM-PC-Footnote-1\7f149721
-Node: Icon-QNX\7f149880
-Node: CDC\7f150307
-Node: Display Code\7f152011
-Ref: Display Code-Footnote-1\7f154295
-Node: CDC-NOS\7f154500
-Node: Bang-Bang\7f156464
-Node: Micros\7f158395
-Node: Apple-Mac\7f158780
-Node: AtariST\7f160836
-Node: Miscellaneous\7f161826
-Node: HTML\7f162563
-Node: LaTeX\7f168591
-Node: Texinfo\7f169367
-Node: Vietnamese\7f170147
-Node: African\7f171127
-Node: Others\7f172483
-Node: Texte\7f173941
-Ref: Texte-Footnote-1\7f178496
-Ref: Texte-Footnote-2\7f178576
-Ref: Texte-Footnote-3\7f179051
-Node: Mule\7f179148
-Ref: Mule-Footnote-1\7f180935
-Node: Surfaces\7f181454
-Ref: Surfaces-Footnote-1\7f184442
-Node: Permutations\7f184548
-Node: End lines\7f185393
-Node: MIME\7f187600
-Node: Dump\7f188791
-Node: Test\7f192985
-Node: Internals\7f195465
-Node: Main flow\7f196703
-Node: New charsets\7f199823
-Node: New surfaces\7f204366
-Node: Design\7f205094
-Ref: Design-Footnote-1\7f214309
-Node: Concept Index\7f214413
-Node: Option Index\7f229156
-Node: Library Index\7f232009
-Node: Charset and Surface Index\7f236586
+Ref: Listings-Footnote-1\7f41208
+Node: Recoding\7f41535
+Node: Reversibility\7f44360
+Ref: Reversibility-Footnote-1\7f52863
+Node: Sequencing\7f53000
+Node: Mixed\7f55446
+Node: Emacs\7f58839
+Node: Debugging\7f59818
+Node: Library\7f64082
+Node: Outer level\7f65436
+Node: Request level\7f71552
+Node: Task level\7f82021
+Node: Charset level\7f92443
+Node: Errors\7f93285
+Ref: Errors-Footnote-1\7f98139
+Ref: Errors-Footnote-2\7f98253
+Node: Universal\7f98614
+Ref: Universal-Footnote-1\7f101739
+Ref: Universal-Footnote-2\7f101807
+Node: UCS-2\7f102020
+Node: UCS-4\7f104554
+Node: UTF-7\7f105096
+Node: UTF-8\7f105693
+Node: UTF-16\7f110000
+Node: count-characters\7f111150
+Node: dump-with-names\7f111823
+Node: iconv\7f114376
+Node: Tabular\7f117808
+Node: ASCII misc\7f140071
+Node: ASCII\7f140437
+Node: ISO 8859\7f141257
+Node: ASCII-BS\7f143555
+Node: flat\7f145394
+Node: IBM and MS\7f146067
+Node: EBCDIC\7f146640
+Node: IBM-PC\7f148754
+Ref: IBM-PC-Footnote-1\7f150876
+Node: Icon-QNX\7f151035
+Node: CDC\7f151462
+Node: Display Code\7f153166
+Ref: Display Code-Footnote-1\7f155450
+Node: CDC-NOS\7f155655
+Node: Bang-Bang\7f157619
+Node: Micros\7f159550
+Node: Apple-Mac\7f159935
+Node: AtariST\7f161991
+Node: Miscellaneous\7f162981
+Node: HTML\7f163718
+Node: LaTeX\7f169746
+Node: Texinfo\7f170522
+Node: Vietnamese\7f171302
+Node: African\7f172282
+Node: Others\7f173638
+Node: Texte\7f175096
+Ref: Texte-Footnote-1\7f179651
+Ref: Texte-Footnote-2\7f179731
+Ref: Texte-Footnote-3\7f180206
+Node: Mule\7f180303
+Ref: Mule-Footnote-1\7f182090
+Node: Surfaces\7f182609
+Ref: Surfaces-Footnote-1\7f185597
+Node: Permutations\7f185703
+Node: End lines\7f186548
+Node: MIME\7f188755
+Node: Dump\7f189946
+Node: Test\7f194140
+Node: Internals\7f196620
+Node: Main flow\7f197858
+Node: New charsets\7f200978
+Node: New surfaces\7f205521
+Node: Design\7f206249
+Ref: Design-Footnote-1\7f215464
+Node: Concept Index\7f215568
+Node: Option Index\7f230311
+Node: Library Index\7f233164
+Node: Charset and Surface Index\7f237741
 \1f
 End Tag Table
index 6127b6420ba361dcfe8db986fc079de0f441d3b0..3c2ef616a4f04ae63955b0dfe226e018e67ed9a5 100644 (file)
@@ -987,6 +987,18 @@ is over two hundred lines.  It is best used with @samp{grep -i}, as in:
 recode -l | grep -i greek
 @end example
 
+Within a collection of names for a single charset, the @code{recode}
+library distinguishes one of them as being the genuine charset name,
+while the others are said to be aliases.  The list normally integrates
+all charsets from the external @code{iconv} library, unless this is
+defeated through options like @samp{--ignore=:iconv:} or @samp{-x:}.
+The portable @code{libiconv} library relates its own aliases of a same
+charset, and for a given set of aliases, if none of them are known to
+@code{recode} already, then @code{recode} will pick one as being the
+genuine charset.  The @code{iconv} library within GNU @code{libc} makes
+all aliases appear as different charsets, and each will be presented as
+a charset by @code{recode}, unless it is known otherwise.
+
 There might be one non-option argument, in which case it is interpreted
 as a charset name, possibly abbreviated to any non ambiguous prefix.
 This particular usage of the @samp{-l} option is obeyed @emph{only} for
@@ -1723,7 +1735,7 @@ int
 main (int argc, char *const *argv)
 @{
   program_name = argv[0];
-  RECODE_OUTER outer = recode_new_outer (true);
+  RECODE_OUTER outer = recode_new_outer (RECODE_AUTO_ABORT_FLAG);
 
   recode_delete_outer (outer);
   exit (0);
@@ -1788,7 +1800,7 @@ int
 main (int argc, char *const *argv)
 @{
   program_name = argv[0];
-  RECODE_OUTER outer = recode_new_outer (true);
+  RECODE_OUTER outer = recode_new_outer (RECODE_AUTO_ABORT_FLAG);
 
   recode_term_outer (outer);
   exit (EXIT_SUCCESS);
@@ -1804,7 +1816,7 @@ but we will not insist on such details in the examples to come.
 @cindex initialisation functions, outer
 
 @example
-RECODE_OUTER recode_new_outer (@var{auto_abort});
+RECODE_OUTER recode_new_outer (@var{flags});
 bool recode_delete_outer (@var{outer});
 @end example
 
@@ -1812,22 +1824,41 @@ bool recode_delete_outer (@var{outer});
 @findex recode_delete_outer
 The recoding library absolutely needs to be initialised before being used,
 and @code{recode_new_outer} has to be called once, first.  Besides the
-@var{outer} it is meant to initialise, the function accepts a Boolean
-argument whether or not the library should automatically issue diagnostics
-on standard and abort the whole program on errors.  When @var{auto_abort}
-is @code{true}, the library later conveniently issues diagnostics itself,
-and aborts the calling program on errors.  This is merely a convenience,
-because if this parameter was @code{false}, the calling program should always
-take care of checking the return value of all other calls to the recoding
-library functions, and when any error is detected, issue a diagnostic and
-abort processing itself.
-
-Regardless of the setting of @var{auto_abort}, all recoding library
-functions return a success status.  Most functions are geared for returning
-@code{false} for an error, and @code{true} if everything went fine.
-Functions returning structures or strings return @code{NULL} instead
-of the result, when the result cannot be produced.  If @var{auto_abort}
-is selected, functions either return @code{true}, or do not return at all.
+@var{outer} it is meant to initialise, the function accepts an integer value
+holding zero or more flags.  If no flags, use @samp{0}.  If more than one
+flag, they should be combined with the bitwise-or (@samp{|}) operator.
+The possible flags are:
+
+@table @code
+@item RECODE_AUTO_ABORT_FLAG
+
+When this flag is set, the library later issues diagnostics itself, and
+aborts the calling program on errors.  This is merely a convenience,
+because if this flag was not given, the calling program should always
+take care of checking the return value of all other calls to the
+recoding library functions, and when any error is detected, issue a
+diagnostic and abort processing itself.
+
+@item RECODE_NO_ICONV_FLAG
+
+When this flag is set, the library does not initialize nor use the
+external @code{iconv} library.  This means that the charsets and aliases
+provided by the @code{iconv} external library and not by @code{recode}
+itself are not available.
+
+@end table
+
+In previous incatations of the @code{recode} library, @var{flags}
+was a Boolean instead of a collection of flags, meant to set
+@code{RECODE_AUTO_ABORT_FLAG}.  This still works, but is deprecated.
+
+Regardless of the setting of @code{RECODE_AUTO_ABORT}, all recoding
+library functions return a success status.  Most functions are
+geared for returning @code{false} for an error, and @code{true} if
+everything went fine.  Functions returning structures or strings return
+@code{NULL} instead of the result, when the result cannot be produced.
+If @var{RECODE_AUTO_ABORT} is selected, functions either return
+@code{true}, or do not return at all.
 
 As in the example above, @code{recode_new_outer} is called only once in
 most cases.  Calling @code{recode_new_outer} implies some overhead, so
@@ -2958,9 +2989,10 @@ peculiarities specific to the @code{iconv} library.
 
 As implemented, if a recoding request can be satisfied by the
 @code{recode} library both with and without using the @code{iconv}
-library, it is likely that the external @code{iconv} library will be
-used.  To sort out if the @code{iconv} is indeed used or not, just use
-the @samp{-v} or @samp{--verbose} option, @pxref{Recoding}.
+library, the external @code{iconv} library might be used.  To sort out
+if the @code{iconv} is indeed used or not, just use the @samp{-v} or
+@samp{--verbose} option, @pxref{Recoding}, and check if @samp{:iconv:}
+appears as an intermediate charset.
 
 @tindex iconv
 The @code{:iconv:} charset represents a conceptual pivot charset
@@ -2983,40 +3015,35 @@ recode -x: l1..1250 < @var{input} > @var{output}
 
 @noindent
 Both should transform @var{input} from @code{ISO-8859-1} to
-@code{CP1250} on @var{output}.  The first call uses the external
-@code{iconv} library, while the second call avoids it.  Whatever the
-path used, the results should normally be identical.  However, there
-might be observable differences.  Most of them might result from
+@code{CP1250} on @var{output}.  The first call might use the external
+@code{iconv} library, while the second call surely avoids it.  Whatever
+the path used, the results should normally be identical.  However,
+there might be observable differences.  Most of them might result from
 reversibility issues, as the external @code{iconv} engine does not
-necessarily address reversibility.  Even if much less likely, some
-differences might result from slight errors in the tables used, such
-differences should then be reported as bugs.
-
-Other irregularities might be seen in the area of error detection and
-recovery.  The @code{recode} library usually tries to detect canonicity
-errors in input, and production of ambiguous output, but the external
-@code{iconv} library does not necessarily.  Input is usually validated,
-however.  The @code{recode} library may not always react properly when
+likely address reversibility in the same way.  Even if much less likely,
+some differences might result from slight errors in the tables used,
+such differences should then be reported as bugs.
+
+Discrepancies might be seen in the area of error detection and recovery.
+The @code{recode} library usually tries to detect canonicity errors in
+input, and production of ambiguous output, but the external @code{iconv}
+library does not necessarily do it the same way.  Moreover, the
+@code{recode} library may not always recover as nicely as possible when
 the external @code{iconv} has no translation for a given character.
 
-Within a collection of names for a single charset, the @code{recode}
-library distinguishes one of them as being the genuine charset name,
-while the others are said to be aliases.  When @code{recode} lists all
-charsets, for example with the @samp{-l} or @samp{--list} option, the
-list integrates all charsets from the external @code{iconv} library.
-The selection of one of the aliases as the genuine charset name is
-an artifact added by @code{recode}, it does not necessarily come
-from @code{iconv} (in fact, the portable @code{libiconv} library
-distinguishes a genuine charset names from its aliases, while GNU
-@code{libc} does not give access to such information).  Moreover, the
-@code{recode} library dynamically resolves some conflicts when it
-initialises itself at runtime.
-
 The external @code{iconv} libraries may offer different sets of charsets
-and aliases, from one library to another, and also between successive
-versions of a single library.  Best is to check the documentation of the
-@code{iconv} library, as of the time Recode was installed, to know what
-charsets and aliases are offered by that library
+and aliases from one library to another, and also between successive
+versions of a single library.  Best is to check the documentation of
+the external @code{iconv} library, as of the time @code{recode} was
+installed, to know which charsets and aliases are being provided.
+
+The @samp{--ignore=:iconv:} or @samp{-x:} options might be useful when
+there is a need to make a recoding more exactly repeatable between
+machines or installations, the idea being here to remove the variance
+possibly introduced by the various implementations of an external
+@code{iconv} library.  These options might also help deciding whether if
+some recoding problem is genuine to @code{recode}, or is induced by the
+external @code{iconv} library.
 
 @node Tabular, ASCII misc, iconv, Top
 @chapter Tabular sources (@w{RFC 1345})
index c7b20e90aa54a4534bb844b00c7c03590e1dc802..d09295aebe6d0a84c911420a7e15d2dbc619ac64 100644 (file)
@@ -1,3 +1,15 @@
+2008-03-08  François Pinard  <pinard@iro.umontreal.ca>
+
+       * recode.h (RECODE_AUTO_ABORT_FLAG, RECODE_NO_ICONV_FLAG): New.
+       * recodext.h (struct recode_outer): Add use_iconv field.
+       Also remove auto_reversibility, which was unused.
+       * outer.c (register_all_modules, unregister_all_modules):
+       Skip module_iconv or delmodule_iconv unless use_iconv is set.
+       (recode_new_outer): Change auto_abort argument to flags, and
+       initialize auto_abort and use_iconv from flags.
+       * main.c (main): Use them.
+       Add a few missing static specifiers.
+
 2008-03-07  François Pinard  <pinard@iro.umontreal.ca>
 
        * iconvdecl.h: Deleted.  Should be generated at installation time
index e167921d1972aeb7b2312d4d7ab69c9a5e8aae83..ea05a227e2d4ccbd651eddc9510e34c731bd6ef0 100644 (file)
@@ -102,10 +102,10 @@ static bool force_flag = false;
    recoding the most transparent possible to make, and other tools.
    However, selecting the following option inhibit the timestamps handling,
    thus effectively `touching' the file.  */
-bool touch_option = false;
+static bool touch_option = false;
 
 /* With strict mapping, all reversibility fallbacks get defeated.  */
-bool strict_mapping = false;
+static bool strict_mapping = false;
 
 /* The following charset name will be ignored, if given.  */
 static const char *ignored_name = NULL;
@@ -636,9 +636,14 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"),
 
   /* Register all modules and build internal tables.  */
 
-  outer = recode_new_outer (true);
-  if (!outer)
-    abort ();
+  {
+    unsigned flags = RECODE_AUTO_ABORT_FLAG;
+    if (ignored_name && *ignored_name == ':')
+      flags |= RECODE_NO_ICONV_FLAG;
+    outer = recode_new_outer (flags);
+    if (!outer)
+      abort ();
+  }
 
   if (freeze_tables)
     {
index ff88b27cb07e4a3ed94f759864a4444d9983f6ae..f041e38028ef3b0896f957cdbf1bbbb6c8928ad7 100644 (file)
@@ -426,16 +426,14 @@ estimate_single_cost (RECODE_OUTER outer, RECODE_SINGLE single)
   return;
 }
 
-/*------------------------------------------------------------------------.
-| Initialize all collected single steps.  If STRICT_MAPPING is true, many |
-| recodings loose their reversibility.                                    |
-`------------------------------------------------------------------------*/
+/*----------------------------------------.
+| Initialize all collected single steps.  |
+`----------------------------------------*/
 
 #include "decsteps.h"
 bool module_iconv PARAMS ((struct recode_outer *));
 void delmodule_iconv PARAMS ((struct recode_outer *));
 
-
 static bool
 register_all_modules (RECODE_OUTER outer)
 {
@@ -507,8 +505,9 @@ register_all_modules (RECODE_OUTER outer)
      confusing some other initialisations that would come after it.  */
   if (!make_argmatch_arrays (outer))
     return false;
-  if (!module_iconv (outer))
-    return false;
+  if (outer->use_iconv)
+    if (!module_iconv (outer))
+      return false;
 
   for (single = outer->single_list; single; single = single->next)
     estimate_single_cost (outer, single);
@@ -520,6 +519,7 @@ void static
 unregister_all_modules (RECODE_OUTER outer)
 {
 #include "tersteps.h"
+  if (outer->use_iconv)
     delmodule_iconv(outer);
 }
 \f
@@ -533,20 +533,21 @@ unregister_all_modules (RECODE_OUTER outer)
 `-------------------------*/
 
 RECODE_OUTER
-recode_new_outer (bool auto_abort)
+recode_new_outer (unsigned flags)
 {
   RECODE_OUTER outer = malloc (sizeof (struct recode_outer));
 
   if (!outer)
     {
       /* Diagnostic?  FIXME!  */
-      if (auto_abort)
+      if (flags & RECODE_AUTO_ABORT_FLAG)
        exit (1);
       return NULL;
     }
 
   memset (outer, 0, sizeof (struct recode_outer));
-  outer->auto_abort = auto_abort;
+  outer->auto_abort = (flags & RECODE_AUTO_ABORT_FLAG) != 0;
+  outer->use_iconv = (flags & RECODE_NO_ICONV_FLAG) == 0;
 
   if (!register_all_modules (outer) || !make_argmatch_arrays (outer))
     {
index 528269c5651bb72af46c84ce5ad89836798bd1d6..f24530e4f5693efda8647ede25619a74dafc8ac1 100644 (file)
@@ -62,7 +62,10 @@ extern "C" {
 | Recode library at OUTER level.  |
 `--------------------------------*/
 
-RECODE_OUTER recode_new_outer PARAMS ((bool));
+#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));
 
 bool list_all_symbols PARAMS ((RECODE_OUTER, RECODE_CONST_SYMBOL));
index cdf4b97f6988aee8a34e1170dd341688ff2a68f4..de6dd54e8d89a1d542560661bdfdad14ca4e1885 100644 (file)
@@ -118,8 +118,8 @@ struct recode_outer
     /* This flag asks the library to diagnose and abort itself if errors.  */
     bool auto_abort;
 
-    /* If new steps should automatically have reversibility for fallback.  */
-    bool auto_reversibility;
+    /* If the external `iconv' library should be initialized and used.  */
+    bool use_iconv;
 
     /* charset.c */
     /* --------- */
index 531fda9ee185bafae7a6b66ec1882a80544896ed..c65a4fb842a90e1a49a4e54931c20aa040741fbf 100644 (file)
@@ -1,3 +1,9 @@
+2008-03-08  François Pinard  <pinard@iro.umontreal.ca>
+
+       * Recode.pyx: Parallel changes in src/.
+       (Outer.__init__): Implement strictness setting.
+       (Outer.set_iconv): Deleted.
+
 2008-03-06  François Pinard  <pinard@iro.umontreal.ca>
 
        Increase Recode.so portability, by depending on distutils:
index cb056eb419a6520f31caa3176099cfbdf99247e2..d383774d577ed2b969cbf4ea709259aea89d7d46 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by Pyrex 0.9.6.4 on Fri Mar  7 00:14:53 2008 */
+/* Generated by Pyrex 0.9.6.4 on Sat Mar  8 18:28:26 2008 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -76,6 +76,8 @@ static PyTypeObject *__pyx_ptype_6Recode_Outer = 0;
 static PyTypeObject *__pyx_ptype_6Recode_Request = 0;
 static PyObject *__pyx_k2;
 static PyObject *__pyx_k3;
+static PyObject *__pyx_k4;
+static PyObject *__pyx_k5;
 
 
 /* Implementation of Recode */
@@ -147,15 +149,65 @@ static PyObject *__pyx_n_global_outer;
 static int __pyx_f_6Recode_5Outer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_6Recode_5Outer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_strict = 0;
+  PyObject *__pyx_v_auto_abort = 0;
+  PyObject *__pyx_v_no_iconv = 0;
+  int __pyx_v_flags;
+  RECODE_SINGLE __pyx_v_single;
   int __pyx_r;
-  enum __pyx_t_6Recode_bool __pyx_1;
-  static char *__pyx_argnames[] = {"strict",0};
+  int __pyx_1;
+  static char *__pyx_argnames[] = {"strict","auto_abort","no_iconv",0};
   __pyx_v_strict = __pyx_k2;
-  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "|O", __pyx_argnames, &__pyx_v_strict)) return -1;
+  __pyx_v_auto_abort = __pyx_k3;
+  __pyx_v_no_iconv = __pyx_k4;
+  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "|OOO", __pyx_argnames, &__pyx_v_strict, &__pyx_v_auto_abort, &__pyx_v_no_iconv)) return -1;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_strict);
-  __pyx_1 = ((enum __pyx_t_6Recode_bool)PyInt_AsLong(__pyx_v_strict)); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; goto __pyx_L1;}
-  ((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer = recode_new_outer(__pyx_1);
+  Py_INCREF(__pyx_v_auto_abort);
+  Py_INCREF(__pyx_v_no_iconv);
+
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":569 */
+  __pyx_v_flags = 0;
+
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":570 */
+  __pyx_1 = PyObject_IsTrue(__pyx_v_auto_abort); if (__pyx_1 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; goto __pyx_L1;}
+  if (__pyx_1) {
+    __pyx_v_flags = (__pyx_v_flags | RECODE_AUTO_ABORT_FLAG);
+    goto __pyx_L2;
+  }
+  __pyx_L2:;
+
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":572 */
+  __pyx_1 = PyObject_IsTrue(__pyx_v_no_iconv); if (__pyx_1 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; goto __pyx_L1;}
+  if (__pyx_1) {
+    __pyx_v_flags = (__pyx_v_flags | RECODE_NO_ICONV_FLAG);
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":574 */
+  ((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer = recode_new_outer(__pyx_v_flags);
+
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":575 */
+  __pyx_1 = PyObject_IsTrue(__pyx_v_strict); if (__pyx_1 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; goto __pyx_L1;}
+  if (__pyx_1) {
+
+    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":576 */
+    __pyx_v_single = ((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer->single_list;
+
+    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":577 */
+    while (1) {
+      __pyx_1 = (__pyx_v_single != NULL);
+      if (!__pyx_1) break;
+
+      /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":578 */
+      __pyx_v_single->fallback_routine = NULL;
+
+      /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":579 */
+      __pyx_v_single = __pyx_v_single->next;
+    }
+    goto __pyx_L4;
+  }
+  __pyx_L4:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -165,6 +217,8 @@ static int __pyx_f_6Recode_5Outer___init__(PyObject *__pyx_v_self, PyObject *__p
   __pyx_L0:;
   Py_DECREF(__pyx_v_self);
   Py_DECREF(__pyx_v_strict);
+  Py_DECREF(__pyx_v_auto_abort);
+  Py_DECREF(__pyx_v_no_iconv);
   return __pyx_r;
 }
 
@@ -192,21 +246,21 @@ static PyObject *__pyx_f_6Recode_5Outer_all_charsets(PyObject *__pyx_v_self, PyO
   Py_INCREF(__pyx_v_self);
   __pyx_v_list = Py_None; Py_INCREF(Py_None);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":569 */
-  __pyx_1 = PyList_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 569; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":585 */
+  __pyx_1 = PyList_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 585; goto __pyx_L1;}
   Py_DECREF(__pyx_v_list);
   __pyx_v_list = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":571 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":587 */
   __pyx_v_symbol = ((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer->symbol_list;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":572 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":588 */
   while (1) {
     __pyx_2 = (__pyx_v_symbol != NULL);
     if (!__pyx_2) break;
 
-    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":573 */
+    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":589 */
     __pyx_2 = (__pyx_v_symbol->type == RECODE_CHARSET);
     if (__pyx_2) {
       __pyx_2 = (__pyx_v_symbol != ((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer->iconv_pivot);
@@ -218,12 +272,12 @@ static PyObject *__pyx_f_6Recode_5Outer_all_charsets(PyObject *__pyx_v_self, PyO
       }
     }
     if (__pyx_2) {
-      __pyx_1 = PyObject_GetAttr(__pyx_v_list, __pyx_n_append); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; goto __pyx_L1;}
-      __pyx_3 = PyString_FromString(__pyx_v_symbol->name); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; goto __pyx_L1;}
-      __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; goto __pyx_L1;}
+      __pyx_1 = PyObject_GetAttr(__pyx_v_list, __pyx_n_append); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; goto __pyx_L1;}
+      __pyx_3 = PyString_FromString(__pyx_v_symbol->name); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; goto __pyx_L1;}
+      __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; goto __pyx_L1;}
       PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
       __pyx_3 = 0;
-      __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; goto __pyx_L1;}
+      __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; goto __pyx_L1;}
       Py_DECREF(__pyx_1); __pyx_1 = 0;
       Py_DECREF(__pyx_4); __pyx_4 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -231,11 +285,11 @@ static PyObject *__pyx_f_6Recode_5Outer_all_charsets(PyObject *__pyx_v_self, PyO
     }
     __pyx_L4:;
 
-    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":578 */
+    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":594 */
     __pyx_v_symbol = __pyx_v_symbol->next;
   }
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":579 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":595 */
   Py_INCREF(__pyx_v_list);
   __pyx_r = __pyx_v_list;
   goto __pyx_L0;
@@ -268,29 +322,29 @@ static PyObject *__pyx_f_6Recode_5Outer_all_surfaces(PyObject *__pyx_v_self, PyO
   Py_INCREF(__pyx_v_self);
   __pyx_v_list = Py_None; Py_INCREF(Py_None);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":582 */
-  __pyx_1 = PyList_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 582; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":598 */
+  __pyx_1 = PyList_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; goto __pyx_L1;}
   Py_DECREF(__pyx_v_list);
   __pyx_v_list = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":584 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":600 */
   __pyx_v_symbol = ((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer->symbol_list;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":585 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":601 */
   while (1) {
     __pyx_2 = (__pyx_v_symbol != NULL);
     if (!__pyx_2) break;
 
-    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":586 */
+    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":602 */
     __pyx_2 = (__pyx_v_symbol->type != RECODE_CHARSET);
     if (__pyx_2) {
-      __pyx_1 = PyObject_GetAttr(__pyx_v_list, __pyx_n_append); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 587; goto __pyx_L1;}
-      __pyx_3 = PyString_FromString(__pyx_v_symbol->name); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 587; goto __pyx_L1;}
-      __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 587; goto __pyx_L1;}
+      __pyx_1 = PyObject_GetAttr(__pyx_v_list, __pyx_n_append); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
+      __pyx_3 = PyString_FromString(__pyx_v_symbol->name); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
+      __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
       PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
       __pyx_3 = 0;
-      __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 587; goto __pyx_L1;}
+      __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
       Py_DECREF(__pyx_1); __pyx_1 = 0;
       Py_DECREF(__pyx_4); __pyx_4 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -298,11 +352,11 @@ static PyObject *__pyx_f_6Recode_5Outer_all_surfaces(PyObject *__pyx_v_self, PyO
     }
     __pyx_L4:;
 
-    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":588 */
+    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":604 */
     __pyx_v_symbol = __pyx_v_symbol->next;
   }
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":589 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":605 */
   Py_INCREF(__pyx_v_list);
   __pyx_r = __pyx_v_list;
   goto __pyx_L0;
@@ -331,27 +385,27 @@ static PyObject *__pyx_f_6Recode_5Outer_concise_charset(PyObject *__pyx_v_self,
   int __pyx_3;
   int __pyx_4;
   static char *__pyx_argnames[] = {"format",0};
-  __pyx_v_format = __pyx_k3;
+  __pyx_v_format = __pyx_k5;
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "|O", __pyx_argnames, &__pyx_v_format)) return 0;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_format);
   __pyx_v_ok = Py_None; Py_INCREF(Py_None);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":592 */
-  __pyx_1 = ((enum recode_list_format)PyInt_AsLong(__pyx_v_format)); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; goto __pyx_L1;}
-  __pyx_2 = PyInt_FromLong(librecode_list_concise_charset(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer,NULL,__pyx_1)); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":608 */
+  __pyx_1 = ((enum recode_list_format)PyInt_AsLong(__pyx_v_format)); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(librecode_list_concise_charset(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer,NULL,__pyx_1)); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; goto __pyx_L1;}
   Py_DECREF(__pyx_v_ok);
   __pyx_v_ok = __pyx_2;
   __pyx_2 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":593 */
-  __pyx_3 = PyObject_IsTrue(__pyx_v_ok); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":609 */
+  __pyx_3 = PyObject_IsTrue(__pyx_v_ok); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; goto __pyx_L1;}
   __pyx_4 = (!__pyx_3);
   if (__pyx_4) {
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; goto __pyx_L1;}
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; goto __pyx_L1;}
     __Pyx_Raise(__pyx_2, 0, 0);
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
@@ -381,20 +435,20 @@ static PyObject *__pyx_f_6Recode_5Outer_full_charset(PyObject *__pyx_v_self, PyO
   Py_INCREF(__pyx_v_self);
   __pyx_v_ok = Py_None; Py_INCREF(Py_None);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":597 */
-  __pyx_1 = PyInt_FromLong(librecode_list_full_charset(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer,NULL)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":613 */
+  __pyx_1 = PyInt_FromLong(librecode_list_full_charset(((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer,NULL)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; goto __pyx_L1;}
   Py_DECREF(__pyx_v_ok);
   __pyx_v_ok = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":598 */
-  __pyx_2 = PyObject_IsTrue(__pyx_v_ok); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":614 */
+  __pyx_2 = PyObject_IsTrue(__pyx_v_ok); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; goto __pyx_L1;}
   __pyx_3 = (!__pyx_2);
   if (__pyx_3) {
-    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; goto __pyx_L1;}
+    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; goto __pyx_L1;}
     __Pyx_Raise(__pyx_1, 0, 0);
     Py_DECREF(__pyx_1); __pyx_1 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
@@ -411,64 +465,6 @@ static PyObject *__pyx_f_6Recode_5Outer_full_charset(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-static PyObject *__pyx_n_int;
-
-static PyObject *__pyx_f_6Recode_5Outer_set_iconv(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_f_6Recode_5Outer_set_iconv(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_flag = 0;
-  PyObject *__pyx_v_previous;
-  PyObject *__pyx_r;
-  PyObject *__pyx_1 = 0;
-  int __pyx_2;
-  PyObject *__pyx_3 = 0;
-  PyObject *__pyx_4 = 0;
-  enum __pyx_t_6Recode_bool __pyx_5;
-  static char *__pyx_argnames[] = {"flag",0};
-  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "O", __pyx_argnames, &__pyx_v_flag)) return 0;
-  Py_INCREF(__pyx_v_self);
-  Py_INCREF(__pyx_v_flag);
-  __pyx_v_previous = Py_None; Py_INCREF(Py_None);
-
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":602 */
-  __pyx_1 = PyInt_FromLong((((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer->iconv_pivot->ignore == 0)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 602; goto __pyx_L1;}
-  Py_DECREF(__pyx_v_previous);
-  __pyx_v_previous = __pyx_1;
-  __pyx_1 = 0;
-
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":603 */
-  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_int); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
-  __pyx_2 = PyObject_IsTrue(__pyx_v_flag); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
-  __pyx_3 = PyInt_FromLong((!__pyx_2)); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
-  __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
-  PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
-  __pyx_3 = 0;
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  Py_DECREF(__pyx_4); __pyx_4 = 0;
-  __pyx_5 = ((enum __pyx_t_6Recode_bool)PyInt_AsLong(__pyx_3)); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; goto __pyx_L1;}
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
-  ((struct __pyx_obj_6Recode_Outer *)__pyx_v_self)->outer->iconv_pivot->ignore = __pyx_5;
-
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":604 */
-  Py_INCREF(__pyx_v_previous);
-  __pyx_r = __pyx_v_previous;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; Py_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_1);
-  Py_XDECREF(__pyx_3);
-  Py_XDECREF(__pyx_4);
-  __Pyx_AddTraceback("Recode.Outer.set_iconv");
-  __pyx_r = 0;
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_previous);
-  Py_DECREF(__pyx_v_self);
-  Py_DECREF(__pyx_v_flag);
-  return __pyx_r;
-}
-
 static int __pyx_f_6Recode_7Request___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_6Recode_7Request___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_6Recode_Outer *__pyx_v_outer = 0;
@@ -477,7 +473,7 @@ static int __pyx_f_6Recode_7Request___init__(PyObject *__pyx_v_self, PyObject *_
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "O", __pyx_argnames, &__pyx_v_outer)) return -1;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_outer);
-  if (!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_outer), __pyx_ptype_6Recode_Outer, 1, "outer")) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; goto __pyx_L1;}
+  if (!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_outer), __pyx_ptype_6Recode_Outer, 1, "outer")) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; goto __pyx_L1;}
   ((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request = recode_new_request(__pyx_v_outer->outer);
 
   __pyx_r = 0;
@@ -499,6 +495,8 @@ static void __pyx_f_6Recode_7Request___dealloc__(PyObject *__pyx_v_self) {
   Py_DECREF(__pyx_v_self);
 }
 
+static PyObject *__pyx_n_int;
+
 static PyObject *__pyx_f_6Recode_7Request_set_verbose(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static PyObject *__pyx_f_6Recode_7Request_set_verbose(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_flag = 0;
@@ -514,25 +512,25 @@ static PyObject *__pyx_f_6Recode_7Request_set_verbose(PyObject *__pyx_v_self, Py
   Py_INCREF(__pyx_v_flag);
   __pyx_v_previous = Py_None; Py_INCREF(Py_None);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":618 */
-  __pyx_1 = PyInt_FromLong((((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request->verbose_flag != 0)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":629 */
+  __pyx_1 = PyInt_FromLong((((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request->verbose_flag != 0)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; goto __pyx_L1;}
   Py_DECREF(__pyx_v_previous);
   __pyx_v_previous = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":619 */
-  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_int); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":630 */
+  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_int); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; goto __pyx_L1;}
   Py_INCREF(__pyx_v_flag);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_flag);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_4 = ((enum __pyx_t_6Recode_bool)PyInt_AsLong(__pyx_3)); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; goto __pyx_L1;}
+  __pyx_4 = ((enum __pyx_t_6Recode_bool)PyInt_AsLong(__pyx_3)); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 630; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   ((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request->verbose_flag = __pyx_4;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":620 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":631 */
   Py_INCREF(__pyx_v_previous);
   __pyx_r = __pyx_v_previous;
   goto __pyx_L0;
@@ -565,20 +563,20 @@ static PyObject *__pyx_f_6Recode_7Request_scan(PyObject *__pyx_v_self, PyObject
   Py_INCREF(__pyx_v_self);
   __pyx_v_ok = Py_None; Py_INCREF(Py_None);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":623 */
-  __pyx_1 = PyInt_FromLong(recode_scan_request(((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request,__pyx_v_text)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":634 */
+  __pyx_1 = PyInt_FromLong(recode_scan_request(((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request,__pyx_v_text)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; goto __pyx_L1;}
   Py_DECREF(__pyx_v_ok);
   __pyx_v_ok = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":624 */
-  __pyx_2 = PyObject_IsTrue(__pyx_v_ok); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":635 */
+  __pyx_2 = PyObject_IsTrue(__pyx_v_ok); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; goto __pyx_L1;}
   __pyx_3 = (!__pyx_2);
   if (__pyx_3) {
-    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; goto __pyx_L1;}
+    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; goto __pyx_L1;}
     __Pyx_Raise(__pyx_1, 0, 0);
     Py_DECREF(__pyx_1); __pyx_1 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
@@ -611,38 +609,38 @@ static PyObject *__pyx_f_6Recode_7Request_pair_sequence(PyObject *__pyx_v_self,
   Py_INCREF(__pyx_v_self);
   __pyx_v_list = Py_None; Py_INCREF(Py_None);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":628 */
-  __pyx_1 = PyList_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 628; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":639 */
+  __pyx_1 = PyList_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 639; goto __pyx_L1;}
   Py_DECREF(__pyx_v_list);
   __pyx_v_list = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":631 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":642 */
   __pyx_2 = ((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request->sequence_length;
   for (__pyx_v_counter = 0; __pyx_v_counter < __pyx_2; ++__pyx_v_counter) {
 
-    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":632 */
+    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":643 */
     __pyx_v_step = (((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request->sequence_array[__pyx_v_counter]);
 
-    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":633 */
-    __pyx_1 = PyObject_GetAttr(__pyx_v_list, __pyx_n_append); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; goto __pyx_L1;}
-    __pyx_3 = PyString_FromString(__pyx_v_step.before->name); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; goto __pyx_L1;}
-    __pyx_4 = PyString_FromString(__pyx_v_step.after->name); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; goto __pyx_L1;}
-    __pyx_5 = PyTuple_New(2); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; goto __pyx_L1;}
+    /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":644 */
+    __pyx_1 = PyObject_GetAttr(__pyx_v_list, __pyx_n_append); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; goto __pyx_L1;}
+    __pyx_3 = PyString_FromString(__pyx_v_step.before->name); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; goto __pyx_L1;}
+    __pyx_4 = PyString_FromString(__pyx_v_step.after->name); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; goto __pyx_L1;}
+    __pyx_5 = PyTuple_New(2); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; goto __pyx_L1;}
     PyTuple_SET_ITEM(__pyx_5, 0, __pyx_3);
     PyTuple_SET_ITEM(__pyx_5, 1, __pyx_4);
     __pyx_3 = 0;
     __pyx_4 = 0;
-    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; goto __pyx_L1;}
     PyTuple_SET_ITEM(__pyx_3, 0, __pyx_5);
     __pyx_5 = 0;
-    __pyx_4 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 633; goto __pyx_L1;}
+    __pyx_4 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; goto __pyx_L1;}
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     Py_DECREF(__pyx_4); __pyx_4 = 0;
   }
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":634 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":645 */
   Py_INCREF(__pyx_v_list);
   __pyx_r = __pyx_v_list;
   goto __pyx_L0;
@@ -678,32 +676,32 @@ static PyObject *__pyx_f_6Recode_7Request_format_table(PyObject *__pyx_v_self, P
   Py_INCREF(__pyx_v_self);
   __pyx_v_ok = Py_None; Py_INCREF(Py_None);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":639 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":650 */
   __pyx_v_outer = ((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request->outer;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":640 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":651 */
   __pyx_v_saved = __pyx_v_outer->iconv_pivot->ignore;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":641 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":652 */
   __pyx_v_outer->iconv_pivot->ignore = __pyx_e_6Recode_true;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":642 */
-  __pyx_1 = PyInt_FromLong(recode_format_table(((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request,((enum recode_programming_language)__pyx_v_language),__pyx_v_charset)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 642; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":653 */
+  __pyx_1 = PyInt_FromLong(recode_format_table(((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request,((enum recode_programming_language)__pyx_v_language),__pyx_v_charset)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; goto __pyx_L1;}
   Py_DECREF(__pyx_v_ok);
   __pyx_v_ok = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":644 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":655 */
   __pyx_v_outer->iconv_pivot->ignore = __pyx_v_saved;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":645 */
-  __pyx_2 = PyObject_IsTrue(__pyx_v_ok); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":656 */
+  __pyx_2 = PyObject_IsTrue(__pyx_v_ok); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; goto __pyx_L1;}
   __pyx_3 = (!__pyx_2);
   if (__pyx_3) {
-    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 646; goto __pyx_L1;}
+    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 657; goto __pyx_L1;}
     __Pyx_Raise(__pyx_1, 0, 0);
     Py_DECREF(__pyx_1); __pyx_1 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 646; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 657; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
@@ -731,22 +729,22 @@ static PyObject *__pyx_f_6Recode_7Request_string(PyObject *__pyx_v_self, PyObjec
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "s", __pyx_argnames, &__pyx_v_text)) return 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":650 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":661 */
   __pyx_v_result = recode_string(((struct __pyx_obj_6Recode_Request *)__pyx_v_self)->request,__pyx_v_text);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":651 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":662 */
   __pyx_1 = (__pyx_v_result == NULL);
   if (__pyx_1) {
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; goto __pyx_L1;}
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_error); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 663; goto __pyx_L1;}
     __Pyx_Raise(__pyx_2, 0, 0);
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 663; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":653 */
-  __pyx_2 = PyString_FromString(__pyx_v_result); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 653; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":664 */
+  __pyx_2 = PyString_FromString(__pyx_v_result); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 664; goto __pyx_L1;}
   __pyx_r = __pyx_2;
   __pyx_2 = 0;
   goto __pyx_L0;
@@ -778,35 +776,35 @@ static PyObject *__pyx_f_6Recode_recode(PyObject *__pyx_self, PyObject *__pyx_ar
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "ss", __pyx_argnames, &__pyx_v_text, &__pyx_v_string)) return 0;
   __pyx_v_request = Py_None; Py_INCREF(Py_None);
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":672 */
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_global_outer); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":683 */
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_global_outer); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; goto __pyx_L1;}
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_1);
   __pyx_1 = 0;
-  __pyx_1 = PyObject_CallObject(((PyObject*)__pyx_ptype_6Recode_Request), __pyx_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; goto __pyx_L1;}
+  __pyx_1 = PyObject_CallObject(((PyObject*)__pyx_ptype_6Recode_Request), __pyx_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_request);
   __pyx_v_request = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":673 */
-  __pyx_2 = PyObject_GetAttr(__pyx_v_request, __pyx_n_scan); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; goto __pyx_L1;}
-  __pyx_1 = PyString_FromString(__pyx_v_text); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; goto __pyx_L1;}
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":684 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_request, __pyx_n_scan); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; goto __pyx_L1;}
+  __pyx_1 = PyString_FromString(__pyx_v_text); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; goto __pyx_L1;}
   PyTuple_SET_ITEM(__pyx_3, 0, __pyx_1);
   __pyx_1 = 0;
-  __pyx_1 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; goto __pyx_L1;}
+  __pyx_1 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":674 */
-  __pyx_2 = PyObject_GetAttr(__pyx_v_request, __pyx_n_string); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; goto __pyx_L1;}
-  __pyx_3 = PyString_FromString(__pyx_v_string); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; goto __pyx_L1;}
-  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":685 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_request, __pyx_n_string); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; goto __pyx_L1;}
+  __pyx_3 = PyString_FromString(__pyx_v_string); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; goto __pyx_L1;}
+  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; goto __pyx_L1;}
   PyTuple_SET_ITEM(__pyx_1, 0, __pyx_3);
   __pyx_3 = 0;
-  __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 674; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   __pyx_r = __pyx_3;
@@ -928,7 +926,6 @@ static struct PyMethodDef __pyx_methods_6Recode_Outer[] = {
   {"all_surfaces", (PyCFunction)__pyx_f_6Recode_5Outer_all_surfaces, METH_VARARGS|METH_KEYWORDS, 0},
   {"concise_charset", (PyCFunction)__pyx_f_6Recode_5Outer_concise_charset, METH_VARARGS|METH_KEYWORDS, 0},
   {"full_charset", (PyCFunction)__pyx_f_6Recode_5Outer_full_charset, METH_VARARGS|METH_KEYWORDS, 0},
-  {"set_iconv", (PyCFunction)__pyx_f_6Recode_5Outer_set_iconv, METH_VARARGS|METH_KEYWORDS, 0},
   {0, 0, 0, 0}
 };
 
@@ -1218,6 +1215,8 @@ PyMODINIT_FUNC initRecode(void) {
   PyObject *__pyx_1 = 0;
   PyObject *__pyx_2 = 0;
   PyObject *__pyx_3 = 0;
+  PyObject *__pyx_4 = 0;
+  PyObject *__pyx_5 = 0;
   __pyx_init_filenames();
   __pyx_m = Py_InitModule4("Recode", __pyx_methods, 0, 0, PYTHON_API_VERSION);
   if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;};
@@ -1226,336 +1225,344 @@ PyMODINIT_FUNC initRecode(void) {
   if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;};
   if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;};
   if (__Pyx_InternStrings(__pyx_intern_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;};
-  if (PyType_Ready(&__pyx_type_6Recode_Outer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "Outer", (PyObject *)&__pyx_type_6Recode_Outer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; goto __pyx_L1;}
+  if (PyType_Ready(&__pyx_type_6Recode_Outer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "Outer", (PyObject *)&__pyx_type_6Recode_Outer) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; goto __pyx_L1;}
   __pyx_ptype_6Recode_Outer = &__pyx_type_6Recode_Outer;
-  if (PyType_Ready(&__pyx_type_6Recode_Request) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "Request", (PyObject *)&__pyx_type_6Recode_Request) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; goto __pyx_L1;}
+  if (PyType_Ready(&__pyx_type_6Recode_Request) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "Request", (PyObject *)&__pyx_type_6Recode_Request) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; goto __pyx_L1;}
   __pyx_ptype_6Recode_Request = &__pyx_type_6Recode_Request;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":481 */
-  __pyx_1 = PyDict_New(); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; goto __pyx_L1;}
-  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_Exception); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; goto __pyx_L1;}
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":485 */
+  __pyx_1 = PyDict_New(); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; goto __pyx_L1;}
+  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_Exception); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; goto __pyx_L1;}
   PyTuple_SET_ITEM(__pyx_3, 0, __pyx_2);
   __pyx_2 = 0;
-  __pyx_2 = __Pyx_CreateClass(__pyx_3, __pyx_1, __pyx_n_error, "Recode"); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; goto __pyx_L1;}
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_error, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; goto __pyx_L1;}
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":486 */
-  __pyx_3 = PyInt_FromLong(RECODE_NO_SYMBOL_TYPE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_SYMBOL_TYPE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; goto __pyx_L1;}
+  __pyx_2 = __Pyx_CreateClass(__pyx_3, __pyx_1, __pyx_n_error, "Recode"); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
-
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":487 */
-  __pyx_2 = PyInt_FromLong(RECODE_CHARSET); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_CHARSET, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_error, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":488 */
-  __pyx_1 = PyInt_FromLong(RECODE_DATA_SURFACE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_DATA_SURFACE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":489 */
-  __pyx_3 = PyInt_FromLong(RECODE_TREE_SURFACE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_TREE_SURFACE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":490 */
+  __pyx_3 = PyInt_FromLong(RECODE_NO_SYMBOL_TYPE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_SYMBOL_TYPE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":491 */
-  __pyx_2 = PyInt_FromLong(RECODE_NO_CHARSET_DATA); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_CHARSET_DATA, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(RECODE_CHARSET); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_CHARSET, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":492 */
-  __pyx_1 = PyInt_FromLong(RECODE_STRIP_DATA); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_STRIP_DATA, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(RECODE_DATA_SURFACE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_DATA_SURFACE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":493 */
-  __pyx_3 = PyInt_FromLong(RECODE_EXPLODE_DATA); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_EXPLODE_DATA, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(RECODE_TREE_SURFACE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_TREE_SURFACE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":495 */
-  __pyx_2 = PyInt_FromLong(RECODE_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SIZE_1, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(RECODE_NO_CHARSET_DATA); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_CHARSET_DATA, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":496 */
-  __pyx_1 = PyInt_FromLong(RECODE_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SIZE_2, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(RECODE_STRIP_DATA); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_STRIP_DATA, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":497 */
-  __pyx_3 = PyInt_FromLong(RECODE_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SIZE_4, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(RECODE_EXPLODE_DATA); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_EXPLODE_DATA, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":498 */
-  __pyx_2 = PyInt_FromLong(RECODE_N); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SIZE_N, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":499 */
+  __pyx_2 = PyInt_FromLong(RECODE_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SIZE_1, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":500 */
-  __pyx_1 = PyInt_FromLong(RECODE_NO_STEP_TABLE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_STEP_TABLE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(RECODE_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SIZE_2, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":501 */
-  __pyx_3 = PyInt_FromLong(RECODE_BYTE_TO_BYTE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_BYTE_TO_BYTE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(RECODE_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SIZE_4, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":502 */
-  __pyx_2 = PyInt_FromLong(RECODE_BYTE_TO_STRING); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_BYTE_TO_STRING, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(RECODE_N); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SIZE_N, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":503 */
-  __pyx_1 = PyInt_FromLong(RECODE_UCS2_TO_BYTE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_UCS2_TO_BYTE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":504 */
+  __pyx_1 = PyInt_FromLong(RECODE_NO_STEP_TABLE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_STEP_TABLE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":504 */
-  __pyx_3 = PyInt_FromLong(RECODE_UCS2_TO_STRING); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_UCS2_TO_STRING, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":505 */
+  __pyx_3 = PyInt_FromLong(RECODE_BYTE_TO_BYTE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_BYTE_TO_BYTE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":505 */
-  __pyx_2 = PyInt_FromLong(RECODE_STRING_TO_UCS2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_STRING_TO_UCS2, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":506 */
+  __pyx_2 = PyInt_FromLong(RECODE_BYTE_TO_STRING); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_BYTE_TO_STRING, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":506 */
-  __pyx_1 = PyInt_FromLong(RECODE_COMBINE_EXPLODE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_COMBINE_EXPLODE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":507 */
+  __pyx_1 = PyInt_FromLong(RECODE_UCS2_TO_BYTE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_UCS2_TO_BYTE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":507 */
-  __pyx_3 = PyInt_FromLong(RECODE_COMBINE_STEP); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_COMBINE_STEP, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":508 */
+  __pyx_3 = PyInt_FromLong(RECODE_UCS2_TO_STRING); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_UCS2_TO_STRING, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":508 */
-  __pyx_2 = PyInt_FromLong(RECODE_EXPLODE_STEP); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_EXPLODE_STEP, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":509 */
+  __pyx_2 = PyInt_FromLong(RECODE_STRING_TO_UCS2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_STRING_TO_UCS2, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":510 */
-  __pyx_1 = PyInt_FromLong(RECODE_STRATEGY_UNDECIDED); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_STRATEGY_UNDECIDED, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(RECODE_COMBINE_EXPLODE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_COMBINE_EXPLODE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":511 */
-  __pyx_3 = PyInt_FromLong(RECODE_SEQUENCE_IN_MEMORY); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SEQUENCE_IN_MEMORY, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(RECODE_COMBINE_STEP); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_COMBINE_STEP, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":512 */
-  __pyx_2 = PyInt_FromLong(RECODE_SEQUENCE_WITH_FILES); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SEQUENCE_WITH_FILES, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(RECODE_EXPLODE_STEP); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_EXPLODE_STEP, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":513 */
-  __pyx_1 = PyInt_FromLong(RECODE_SEQUENCE_WITH_PIPE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SEQUENCE_WITH_PIPE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":514 */
+  __pyx_1 = PyInt_FromLong(RECODE_STRATEGY_UNDECIDED); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_STRATEGY_UNDECIDED, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":515 */
-  __pyx_3 = PyInt_FromLong(RECODE_SWAP_UNDECIDED); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SWAP_UNDECIDED, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(RECODE_SEQUENCE_IN_MEMORY); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SEQUENCE_IN_MEMORY, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":516 */
-  __pyx_2 = PyInt_FromLong(RECODE_SWAP_NO); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SWAP_NO, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(RECODE_SEQUENCE_WITH_FILES); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SEQUENCE_WITH_FILES, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":517 */
-  __pyx_1 = PyInt_FromLong(RECODE_SWAP_YES); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SWAP_YES, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(RECODE_SEQUENCE_WITH_PIPE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SEQUENCE_WITH_PIPE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":519 */
-  __pyx_3 = PyInt_FromLong(RECODE_NO_ERROR); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_ERROR, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(RECODE_SWAP_UNDECIDED); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SWAP_UNDECIDED, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":520 */
-  __pyx_2 = PyInt_FromLong(RECODE_NOT_CANONICAL); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_NOT_CANONICAL, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(RECODE_SWAP_NO); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SWAP_NO, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":521 */
-  __pyx_1 = PyInt_FromLong(RECODE_AMBIGUOUS_OUTPUT); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_AMBIGUOUS_OUTPUT, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(RECODE_SWAP_YES); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SWAP_YES, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":522 */
-  __pyx_3 = PyInt_FromLong(RECODE_UNTRANSLATABLE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_UNTRANSLATABLE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":523 */
+  __pyx_3 = PyInt_FromLong(RECODE_NO_ERROR); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_ERROR, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":523 */
-  __pyx_2 = PyInt_FromLong(RECODE_INVALID_INPUT); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_INVALID_INPUT, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":524 */
+  __pyx_2 = PyInt_FromLong(RECODE_NOT_CANONICAL); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_NOT_CANONICAL, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":524 */
-  __pyx_1 = PyInt_FromLong(RECODE_SYSTEM_ERROR); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SYSTEM_ERROR, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":525 */
+  __pyx_1 = PyInt_FromLong(RECODE_AMBIGUOUS_OUTPUT); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_AMBIGUOUS_OUTPUT, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":525 */
-  __pyx_3 = PyInt_FromLong(RECODE_USER_ERROR); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_USER_ERROR, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":526 */
+  __pyx_3 = PyInt_FromLong(RECODE_UNTRANSLATABLE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_UNTRANSLATABLE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":526 */
-  __pyx_2 = PyInt_FromLong(RECODE_INTERNAL_ERROR); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_INTERNAL_ERROR, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":527 */
+  __pyx_2 = PyInt_FromLong(RECODE_INVALID_INPUT); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_INVALID_INPUT, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":527 */
-  __pyx_1 = PyInt_FromLong(RECODE_MAXIMUM_ERROR); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_MAXIMUM_ERROR, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":528 */
+  __pyx_1 = PyInt_FromLong(RECODE_SYSTEM_ERROR); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SYSTEM_ERROR, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":529 */
-  __pyx_3 = PyInt_FromLong(RECODE_NO_FORMAT); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_FORMAT, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(RECODE_USER_ERROR); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_USER_ERROR, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":530 */
-  __pyx_2 = PyInt_FromLong(RECODE_DECIMAL_FORMAT); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_DECIMAL_FORMAT, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(RECODE_INTERNAL_ERROR); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_INTERNAL_ERROR, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":531 */
-  __pyx_1 = PyInt_FromLong(RECODE_OCTAL_FORMAT); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_OCTAL_FORMAT, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(RECODE_MAXIMUM_ERROR); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_MAXIMUM_ERROR, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":532 */
-  __pyx_3 = PyInt_FromLong(RECODE_HEXADECIMAL_FORMAT); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_HEXADECIMAL_FORMAT, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":533 */
+  __pyx_3 = PyInt_FromLong(RECODE_NO_FORMAT); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_FORMAT, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":533 */
-  __pyx_2 = PyInt_FromLong(RECODE_FULL_FORMAT); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_FULL_FORMAT, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":534 */
+  __pyx_2 = PyInt_FromLong(RECODE_DECIMAL_FORMAT); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_DECIMAL_FORMAT, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":535 */
-  __pyx_1 = PyInt_FromLong(RECODE_NO_LANGUAGE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_LANGUAGE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(RECODE_OCTAL_FORMAT); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_OCTAL_FORMAT, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":536 */
-  __pyx_3 = PyInt_FromLong(RECODE_LANGUAGE_C); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_LANGUAGE_C, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(RECODE_HEXADECIMAL_FORMAT); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_HEXADECIMAL_FORMAT, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":537 */
-  __pyx_2 = PyInt_FromLong(RECODE_LANGUAGE_PERL); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_LANGUAGE_PERL, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(RECODE_FULL_FORMAT); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_FULL_FORMAT, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":539 */
-  __pyx_1 = PyInt_FromLong(NUL); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_NUL, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(RECODE_NO_LANGUAGE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_NO_LANGUAGE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":540 */
-  __pyx_3 = PyInt_FromLong(STRIP_SIZE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_STRIP_SIZE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(RECODE_LANGUAGE_C); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_LANGUAGE_C, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":542 */
-  __pyx_2 = PyInt_FromLong(SYMBOL_CREATE_CHARSET); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SYMBOL_CREATE_CHARSET, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":541 */
+  __pyx_2 = PyInt_FromLong(RECODE_LANGUAGE_PERL); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 541; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_LANGUAGE_PERL, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 541; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":543 */
-  __pyx_1 = PyInt_FromLong(SYMBOL_CREATE_DATA_SURFACE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SYMBOL_CREATE_DATA_SURFACE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(NUL); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_NUL, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":544 */
-  __pyx_3 = PyInt_FromLong(SYMBOL_CREATE_TREE_SURFACE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_SYMBOL_CREATE_TREE_SURFACE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(STRIP_SIZE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_STRIP_SIZE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":545 */
-  __pyx_2 = PyInt_FromLong(ALIAS_FIND_AS_CHARSET); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_ALIAS_FIND_AS_CHARSET, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":546 */
+  __pyx_2 = PyInt_FromLong(SYMBOL_CREATE_CHARSET); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SYMBOL_CREATE_CHARSET, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":546 */
-  __pyx_1 = PyInt_FromLong(ALIAS_FIND_AS_SURFACE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_ALIAS_FIND_AS_SURFACE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":547 */
+  __pyx_1 = PyInt_FromLong(SYMBOL_CREATE_DATA_SURFACE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SYMBOL_CREATE_DATA_SURFACE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":547 */
-  __pyx_3 = PyInt_FromLong(ALIAS_FIND_AS_EITHER); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_ALIAS_FIND_AS_EITHER, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":548 */
+  __pyx_3 = PyInt_FromLong(SYMBOL_CREATE_TREE_SURFACE); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SYMBOL_CREATE_TREE_SURFACE, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":549 */
-  __pyx_2 = PyInt_FromLong(DONE); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_xDONE, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(ALIAS_FIND_AS_CHARSET); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_ALIAS_FIND_AS_CHARSET, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":550 */
-  __pyx_1 = PyInt_FromLong(ELSE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_xELSE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(ALIAS_FIND_AS_SURFACE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_ALIAS_FIND_AS_SURFACE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":552 */
-  __pyx_3 = PyInt_FromLong(REPLACEMENT_CHARACTER); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_REPLACEMENT_CHARACTER, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":551 */
+  __pyx_3 = PyInt_FromLong(ALIAS_FIND_AS_EITHER); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_ALIAS_FIND_AS_EITHER, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 551; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":553 */
-  __pyx_2 = PyInt_FromLong(NOT_A_CHARACTER); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_NOT_A_CHARACTER, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(DONE); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_xDONE, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
   /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":554 */
-  __pyx_1 = PyInt_FromLong(BYTE_ORDER_MARK); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_BYTE_ORDER_MARK, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; goto __pyx_L1;}
+  __pyx_1 = PyInt_FromLong(ELSE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_xELSE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":556 */
+  __pyx_3 = PyInt_FromLong(REPLACEMENT_CHARACTER); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_REPLACEMENT_CHARACTER, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":557 */
+  __pyx_2 = PyInt_FromLong(NOT_A_CHARACTER); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_NOT_A_CHARACTER, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":558 */
+  __pyx_1 = PyInt_FromLong(BYTE_ORDER_MARK); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_BYTE_ORDER_MARK, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":555 */
-  __pyx_3 = PyInt_FromLong(BYTE_ORDER_MARK_SWAPPED); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_BYTE_ORDER_MARK_SWAPPED, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":559 */
+  __pyx_3 = PyInt_FromLong(BYTE_ORDER_MARK_SWAPPED); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_BYTE_ORDER_MARK_SWAPPED, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 559; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":562 */
-  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; goto __pyx_L1;}
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":566 */
+  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; goto __pyx_L1;}
   __pyx_k2 = __pyx_2;
   __pyx_2 = 0;
-
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":591 */
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_NO_FORMAT); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; goto __pyx_L1;}
+  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; goto __pyx_L1;}
   __pyx_k3 = __pyx_1;
   __pyx_1 = 0;
+  __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; goto __pyx_L1;}
+  __pyx_k4 = __pyx_3;
+  __pyx_3 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":669 */
-  __pyx_3 = PyObject_CallObject(((PyObject*)__pyx_ptype_6Recode_Outer), 0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 669; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_global_outer, __pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 669; goto __pyx_L1;}
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":607 */
+  __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_n_NO_FORMAT); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 607; goto __pyx_L1;}
+  __pyx_k5 = __pyx_4;
+  __pyx_4 = 0;
+
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":680 */
+  __pyx_5 = PyObject_CallObject(((PyObject*)__pyx_ptype_6Recode_Outer), 0); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 680; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_global_outer, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 680; goto __pyx_L1;}
+  Py_DECREF(__pyx_5); __pyx_5 = 0;
 
-  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":671 */
+  /* "/bpi/phenix/home/pinard/entretien/recode/tests/Recode.pyx":682 */
   return;
   __pyx_L1:;
   Py_XDECREF(__pyx_1);
   Py_XDECREF(__pyx_2);
   Py_XDECREF(__pyx_3);
+  Py_XDECREF(__pyx_4);
+  Py_XDECREF(__pyx_5);
   __Pyx_AddTraceback("Recode");
 }
 
index 22c6b5aac67e7416dd8c4a08f03008c883f4da5e..01f92d8c4090531291718f64f1f3e56b65576d96 100644 (file)
@@ -214,7 +214,7 @@ cdef extern from "common.h":
 
     struct recode_outer:
         bool auto_abort
-        bool auto_reversibility
+        bool use_iconv
         # charset.c:
         recode_known_pair *pair_restriction
         unsigned pair_restrictions
@@ -443,7 +443,11 @@ cdef extern from "common.h":
 
     ## Recode library at OUTER level.
 
-    RECODE_OUTER recode_new_outer(bool)
+    enum:
+        RECODE_AUTO_ABORT_FLAG
+        RECODE_NO_ICONV_FLAG
+
+    RECODE_OUTER recode_new_outer(unsigned)
     bool recode_delete_outer(RECODE_OUTER)
     bool list_all_symbols 'librecode_list_all_symbols' (
             RECODE_OUTER, RECODE_CONST_SYMBOL)
@@ -559,8 +563,20 @@ BYTE_ORDER_MARK_SWAPPED = BYTE_ORDER_MARK_SWAPPED_
 cdef class Outer:
     cdef RECODE_OUTER outer
 
-    def __init__(self, strict=False):
-        self.outer = recode_new_outer(strict)
+    def __init__(self, strict=False, auto_abort=False, no_iconv=False):
+        cdef int flags
+        cdef RECODE_SINGLE single
+        flags = 0
+        if auto_abort:
+            flags = flags | RECODE_AUTO_ABORT_FLAG
+        if no_iconv:
+            flags = flags | RECODE_NO_ICONV_FLAG
+        self.outer = recode_new_outer(flags)
+        if strict:
+            single = self.outer.single_list
+            while single is not NULL:
+                single.fallback_routine = NULL
+                single = single.next
 
     def __dealloc__(self):
         recode_delete_outer(self.outer)
@@ -598,11 +614,6 @@ cdef class Outer:
         if not ok:
             raise error
 
-    def set_iconv(self, flag):
-        previous = self.outer.iconv_pivot.ignore == 0
-        self.outer.iconv_pivot.ignore = int(not flag)
-        return previous
-
 # Recode library at REQUEST level.
 
 cdef class Request: